From 70dc85b699d0ae67ed9cdb5addfc053515288c1b Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Mon, 13 Aug 2007 21:02:23 +0000 Subject: [PATCH 01/85] *** empty log message *** --- .cvsignore | 1 + alliance-examples.patch | 594 +++++++++++++++++++++++++++++++++ alliance-log3.patch | 22 ++ alliance-perms.patch | 14 + alliance-run.patch | 21 ++ alliance-tutorials.patch | 690 +++++++++++++++++++++++++++++++++++++++ alliance.fedora | 44 +++ alliance.spec | 412 +++++++++++++++++++++++ dreal.desktop | 10 + dreal.png | Bin 0 -> 5967 bytes graal.desktop | 10 + graal.png | Bin 0 -> 6055 bytes sources | 1 + xfsm.desktop | 10 + xfsm.png | Bin 0 -> 5909 bytes xpat.desktop | 10 + xpat.png | Bin 0 -> 6079 bytes xsch.desktop | 10 + xsch.png | Bin 0 -> 3919 bytes xvpn.desktop | 10 + xvpn.png | Bin 0 -> 7998 bytes 21 files changed, 1859 insertions(+) create mode 100644 alliance-examples.patch create mode 100644 alliance-log3.patch create mode 100644 alliance-perms.patch create mode 100644 alliance-run.patch create mode 100644 alliance-tutorials.patch create mode 100644 alliance.fedora create mode 100644 alliance.spec create mode 100644 dreal.desktop create mode 100644 dreal.png create mode 100644 graal.desktop create mode 100644 graal.png create mode 100644 xfsm.desktop create mode 100644 xfsm.png create mode 100644 xpat.desktop create mode 100644 xpat.png create mode 100644 xsch.desktop create mode 100644 xsch.png create mode 100644 xvpn.desktop create mode 100644 xvpn.png diff --git a/.cvsignore b/.cvsignore index e69de29..e2837be 100644 --- a/.cvsignore +++ b/.cvsignore @@ -0,0 +1 @@ +alliance-5.0-20070718.tar.gz diff --git a/alliance-examples.patch b/alliance-examples.patch new file mode 100644 index 0000000..582c2fc --- /dev/null +++ b/alliance-examples.patch @@ -0,0 +1,594 @@ +diff -Naur documentation/alliance-examples/addaccu16/Makefile alliance-examples/addaccu16/Makefile +--- documentation/alliance-examples/addaccu16/Makefile 2004-05-24 00:15:16.000000000 +0200 ++++ alliance-examples/addaccu16/Makefile 2007-07-19 13:13:51.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,8 +41,8 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 2 + +diff -Naur documentation/alliance-examples/addaccu16/README alliance-examples/addaccu16/README +--- documentation/alliance-examples/addaccu16/README 2004-07-28 13:00:06.000000000 +0200 ++++ alliance-examples/addaccu16/README 2007-07-19 13:13:51.000000000 +0200 +@@ -10,11 +10,13 @@ + the associated stimuli file, and also a configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. ++ ++copy the folder "addaccu16" to any writable folder of your choice and type: ++$ make + + The main targets of the makefile are listed below (following the design flow). + +diff -Naur documentation/alliance-examples/adder4/adder4.ioc alliance-examples/adder4/adder4.ioc +--- documentation/alliance-examples/adder4/adder4.ioc 2004-05-23 19:27:03.000000000 +0200 ++++ alliance-examples/adder4/adder4.ioc 2007-07-19 13:13:51.000000000 +0200 +@@ -1,4 +1,4 @@ +-# Copyright (c) 1997 by Cadence. All rights reserved. ++# + ################################################################### + # In each of TOP()/BOTTOM()/LEFT()/RIGHT() section, there are # + # placed IOs. In the IGNORE() section, the IOs are ignored # +diff -Naur documentation/alliance-examples/adder4/Makefile alliance-examples/adder4/Makefile +--- documentation/alliance-examples/adder4/Makefile 2004-05-24 00:15:20.000000000 +0200 ++++ alliance-examples/adder4/Makefile 2007-07-19 13:13:51.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,8 +41,8 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 2 + +diff -Naur documentation/alliance-examples/adder4/README alliance-examples/adder4/README +--- documentation/alliance-examples/adder4/README 2004-07-28 13:00:06.000000000 +0200 ++++ alliance-examples/adder4/README 2007-07-19 13:13:51.000000000 +0200 +@@ -14,7 +14,9 @@ + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. ++ ++copy the folder "adder4" to any writable folder of your choice and type: ++$ make + + The main targets of the makefile are listed below (following the design flow). + +diff -Naur documentation/alliance-examples/amd2901/amd2901_core.ioc alliance-examples/amd2901/amd2901_core.ioc +--- documentation/alliance-examples/amd2901/amd2901_core.ioc 2004-05-23 20:55:16.000000000 +0200 ++++ alliance-examples/amd2901/amd2901_core.ioc 2007-07-19 13:13:52.000000000 +0200 +@@ -1,4 +1,4 @@ +-# Copyright (c) 1997 by Cadence. All rights reserved. ++# + ################################################################### + # In each of TOP()/BOTTOM()/LEFT()/RIGHT() section, there are # + # placed IOs. In the IGNORE() section, the IOs are ignored # + +diff -Naur documentation/alliance-examples/amd2901/Makefile alliance-examples/amd2901/Makefile +--- documentation/alliance-examples/amd2901/Makefile 2004-05-24 00:15:22.000000000 +0200 ++++ alliance-examples/amd2901/Makefile 2007-07-19 13:13:51.000000000 +0200 +@@ -11,7 +11,9 @@ + STANDART_PATH = PATH=$(STANDART_BIN); export PATH + + # Standart Alliance binary access paths. + ALLIANCE_BIN = $(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + # -------------------------------------------------------------------- + # Standarts binaries. +@@ -41,8 +43,8 @@ + CATA_LIB2 = $(ALLIANCE_TOP)/cells/padlib + CATA_LIB = .:$(CATA_LIB0):$(CATA_LIB1):$(CATA_LIB2) + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +- RDS_TECHNO = ../etc/techno-symb.rds +- REAL_RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + GRAAL_TECHNO = $(ALLIANCE_TOP)/etc/cmos.graal + + +diff -Naur documentation/alliance-examples/amd2901-vasy/amd2901.ioc alliance-examples/amd2901-vasy/amd2901.ioc +--- documentation/alliance-examples/amd2901-vasy/amd2901.ioc 2004-05-23 21:00:16.000000000 +0200 ++++ alliance-examples/amd2901-vasy/amd2901.ioc 2007-07-19 13:13:52.000000000 +0200 +@@ -1,4 +1,4 @@ +-# Copyright (c) 1997 by Cadence. All rights reserved. ++# + ################################################################### + # In each of TOP()/BOTTOM()/LEFT()/RIGHT() section, there are # + # placed IOs. In the IGNORE() section, the IOs are ignored # +diff -Naur documentation/alliance-examples/amd2901-vasy/Makefile alliance-examples/amd2901-vasy/Makefile +--- documentation/alliance-examples/amd2901-vasy/Makefile 2004-05-24 00:15:23.000000000 +0200 ++++ alliance-examples/amd2901-vasy/Makefile 2007-07-19 13:13:52.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN = $(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -40,8 +42,8 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 4 + +diff -Naur documentation/alliance-examples/digi/Makefile alliance-examples/digi/Makefile +--- documentation/alliance-examples/digi/Makefile 2004-09-09 22:03:49.000000000 +0200 ++++ alliance-examples/digi/Makefile 2007-07-19 13:13:52.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + SYF = $(ALLIANCE_BIN)/syf + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -40,14 +42,14 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + METAL_LEVEL = 2 + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + + # /*------------------------------------------------------------\ + # | | +-# | Environement | ++# | Environment | + # | | + # \------------------------------------------------------------*/ + +diff -Naur documentation/alliance-examples/divcas4/divcas4.ioc alliance-examples/divcas4/divcas4.ioc +--- documentation/alliance-examples/divcas4/divcas4.ioc 2004-05-23 19:52:10.000000000 +0200 ++++ alliance-examples/divcas4/divcas4.ioc 2007-07-19 13:13:52.000000000 +0200 +@@ -1,4 +1,4 @@ +-# Copyright (c) 1997 by Cadence. All rights reserved. ++# + ################################################################### + # In each of TOP()/BOTTOM()/LEFT()/RIGHT() section, there are # + # placed IOs. In the IGNORE() section, the IOs are ignored # +diff -Naur documentation/alliance-examples/divcas4/Makefile alliance-examples/divcas4/Makefile +--- documentation/alliance-examples/divcas4/Makefile 2004-05-23 21:11:26.000000000 +0200 ++++ alliance-examples/divcas4/Makefile 2007-07-19 13:13:52.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN = $(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,8 +41,8 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 2 + +diff -Naur documentation/alliance-examples/divcas4/README alliance-examples/divcas4/README +--- documentation/alliance-examples/divcas4/README 2004-07-28 13:00:06.000000000 +0200 ++++ alliance-examples/divcas4/README 2007-07-19 13:13:52.000000000 +0200 +@@ -14,5 +14,6 @@ + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. +- ++ ++copy the folder "divcas4" to any writable folder of your choice and type: ++$ make +diff -Naur documentation/alliance-examples/hadamard/Makefile alliance-examples/hadamard/Makefile +--- documentation/alliance-examples/hadamard/Makefile 2004-05-24 00:15:25.000000000 +0200 ++++ alliance-examples/hadamard/Makefile 2007-07-19 16:21:10.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN = $(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,14 +41,14 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 6 + + # /*------------------------------------------------------------\ + # | | +-# | Environement | ++# | Environment | + # | | + # \------------------------------------------------------------*/ + +@@ -163,11 +165,11 @@ + + res_vasy_1.pat : hadamard.vst calcul.vbe ram.vbe rom.vbe \ + compteur.vbe sequenceur.vbe hadamard_model.vbe +- $(ENV_ASIMUT_VASY); $(ASIMUT) hadamard hadamard_1 res_vasy_1 ++ $(ENV_ASIMUT_VASY); $(ASIMUT) hadamard hadamard_1 res_vasy_1 + + res_synth_1.pat : hadamard.vst calcul.vst ram.vst rom.vst \ + compteur.vst sequenceur.vst hadamard_model.vst +- $(ENV_ASIMUT_SYNTH); $(ASIMUT) -zd hadamard hadamard_1 res_synth_1 ++ $(ENV_ASIMUT_SYNTH); $(ASIMUT) -zd hadamard hadamard_1 res_synth_1 + + + # /*------------------------------------------------------------\ +@@ -299,7 +301,7 @@ + # | | + # \------------------------------------------------------------*/ + +-lvx.done : hadamard.vst hadamard_e.al ++lvx.done : hadamard.vst hadamard_e.al + $(ENV_LVX); $(LVX) vst al hadamard hadamard_e -f + $(TOUCH) lvx.done + +@@ -355,4 +357,4 @@ + $(RM) -f *.vst *.vbe *.boom *.done *.xsc *.al *.ap *.gpl *.gds \ + *.log *.drc *.cif *.fin *.dat *.out hadamard_e.spi res_synth_1.pat \ + res_vasy_1.pat +- ++ +diff -Naur documentation/alliance-examples/mipsR3000/sce/Makefile alliance-examples/mipsR3000/sce/Makefile +--- documentation/alliance-examples/mipsR3000/sce/Makefile 2004-07-30 02:40:09.000000000 +0200 ++++ alliance-examples/mipsR3000/sce/Makefile 2007-07-19 13:13:58.000000000 +0200 +@@ -5,7 +5,9 @@ + STANDART_PATH = PATH=$(STANDART_BIN); export PATH + + # Standart Alliance binary access paths. + ALLIANCE_BIN = $(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + # FitPath Alliance binary access paths. + # DEVEL_BIN = /users/soft5/newlabo/alliance-4.5.0/archi/Solaris/bin +diff -Naur documentation/alliance-examples/mipsR3000/sce/mips_core.ioc alliance-examples/mipsR3000/sce/mips_core.ioc +--- documentation/alliance-examples/mipsR3000/sce/mips_core.ioc 2004-05-24 00:23:35.000000000 +0200 ++++ alliance-examples/mipsR3000/sce/mips_core.ioc 2007-07-19 13:13:58.000000000 +0200 +@@ -1,4 +1,4 @@ +-# Copyright (c) 1997 by Cadence. All rights reserved. ++# + ################################################################### + # In each of TOP()/BOTTOM()/LEFT()/RIGHT() section, there are # + # placed IOs. In the IGNORE() section, the IOs are ignored # +diff -Naur documentation/alliance-examples/multi16b-reg/Makefile alliance-examples/multi16b-reg/Makefile +--- documentation/alliance-examples/multi16b-reg/Makefile 2004-05-24 00:15:29.000000000 +0200 ++++ alliance-examples/multi16b-reg/Makefile 2007-07-19 13:13:59.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN = $(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,14 +41,14 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 6 + + # /*------------------------------------------------------------\ + # | | +-# | Environement | ++# | Environment | + # | | + # \------------------------------------------------------------*/ + +diff -Naur documentation/alliance-examples/multi4b/Makefile alliance-examples/multi4b/Makefile +--- documentation/alliance-examples/multi4b/Makefile 2004-05-24 00:15:29.000000000 +0200 ++++ alliance-examples/multi4b/Makefile 2007-07-19 13:14:00.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,14 +41,14 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 2 + + # /*------------------------------------------------------------\ + # | | +-# | Environement | ++# | Environment | + # | | + # \------------------------------------------------------------*/ + +diff -Naur documentation/alliance-examples/multi4b/README alliance-examples/multi4b/README +--- documentation/alliance-examples/multi4b/README 2004-07-28 13:00:06.000000000 +0200 ++++ alliance-examples/multi4b/README 2007-07-19 13:14:00.000000000 +0200 +@@ -14,7 +14,9 @@ + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. ++ ++copy the folder "multi4b" to any writable folder of your choice and type: ++$ make + + The main targets of the makefile are listed below (following the design flow). + +diff -Naur documentation/alliance-examples/multi8/Makefile alliance-examples/multi8/Makefile +--- documentation/alliance-examples/multi8/Makefile 2004-05-24 00:15:30.000000000 +0200 ++++ alliance-examples/multi8/Makefile 2007-07-19 13:14:00.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,8 +41,8 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 2 + +diff -Naur documentation/alliance-examples/multi8/README alliance-examples/multi8/README +--- documentation/alliance-examples/multi8/README 2004-07-28 13:00:06.000000000 +0200 ++++ alliance-examples/multi8/README 2007-07-19 13:14:00.000000000 +0200 +@@ -15,4 +15,6 @@ + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. ++ ++copy the folder "multi8" to any writable folder of your choice and type: ++$ make +diff -Naur documentation/alliance-examples/multi8b/Makefile alliance-examples/multi8b/Makefile +--- documentation/alliance-examples/multi8b/Makefile 2004-05-24 00:15:30.000000000 +0200 ++++ alliance-examples/multi8b/Makefile 2007-07-19 13:14:00.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,8 +41,8 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 4 + +diff -Naur documentation/alliance-examples/multi8b/README alliance-examples/multi8b/README +--- documentation/alliance-examples/multi8b/README 2004-07-28 13:00:06.000000000 +0200 ++++ alliance-examples/multi8b/README 2007-07-19 13:14:00.000000000 +0200 +@@ -14,7 +14,9 @@ + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. ++ ++copy the folder "multi8b" to any writable folder of your choice and type: ++$ make + + The main targets of the makefile are listed below (following the design flow). + +diff -Naur documentation/alliance-examples/pgcd/Makefile alliance-examples/pgcd/Makefile +--- documentation/alliance-examples/pgcd/Makefile 2004-05-24 00:15:31.000000000 +0200 ++++ alliance-examples/pgcd/Makefile 2007-07-19 13:14:00.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,8 +41,8 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 2 + +diff -Naur documentation/alliance-examples/pgcd/README alliance-examples/pgcd/README +--- documentation/alliance-examples/pgcd/README 2004-07-28 13:00:06.000000000 +0200 ++++ alliance-examples/pgcd/README 2007-07-19 13:14:00.000000000 +0200 +@@ -15,5 +15,7 @@ + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. ++ ++copy the folder "pgcd" to any writable folder of your choice and type: ++$ make + +diff -Naur documentation/alliance-examples/sqrt32/Makefile alliance-examples/sqrt32/Makefile +--- documentation/alliance-examples/sqrt32/Makefile 2004-05-23 20:49:27.000000000 +0200 ++++ alliance-examples/sqrt32/Makefile 2007-07-19 13:14:00.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,8 +41,8 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 5 + +diff -Naur documentation/alliance-examples/sqrt32/README alliance-examples/sqrt32/README +--- documentation/alliance-examples/sqrt32/README 2004-07-28 13:00:06.000000000 +0200 ++++ alliance-examples/sqrt32/README 2007-07-19 13:14:00.000000000 +0200 +@@ -14,4 +14,6 @@ + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. ++ ++copy the folder "sqrt32" to any writable folder of your choice and type: ++$ make +diff -Naur documentation/alliance-examples/sqrt8/Makefile alliance-examples/sqrt8/Makefile +--- documentation/alliance-examples/sqrt8/Makefile 2004-05-23 20:51:00.000000000 +0200 ++++ alliance-examples/sqrt8/Makefile 2007-07-19 16:20:40.000000000 +0200 +@@ -16,7 +16,9 @@ + # | | + # \------------------------------------------------------------*/ + + ALLIANCE_BIN=$(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + VASY = $(ALLIANCE_BIN)/vasy + ASIMUT = $(ALLIANCE_BIN)/asimut +@@ -39,14 +41,14 @@ + TOUCH = touch + + TARGET_LIB = $(ALLIANCE_TOP)/cells/sxlib +-RDS_TECHNO_SYMB = ../etc/techno-symb.rds +-RDS_TECHNO = ../etc/techno-035.rds ++RDS_TECHNO_SYMB = $(ALLIANCE_EXAMPLES)/etc/techno-symb.rds ++RDS_TECHNO = $(ALLIANCE_EXAMPLES)/etc/techno-035.rds + SPI_MODEL = $(ALLIANCE_TOP)/etc/spimodel.cfg + METAL_LEVEL = 5 + + # /*------------------------------------------------------------\ + # | | +-# | Environement | ++# | Environment | + # | | + # \------------------------------------------------------------*/ + +@@ -161,9 +163,9 @@ + # \------------------------------------------------------------*/ + + res_vasy_1.pat : sqrt8.vst sm.vbe sqrt8_model.vbe +- $(ENV_ASIMUT_VASY); $(ASIMUT) sqrt8 sqrt8 res_vasy_1 ++ $(ENV_ASIMUT_VASY); $(ASIMUT) sqrt8 sqrt8 res_vasy_1 + +-res_synth_1.pat : sqrt8.vst sm.vst sqrt8_model.vst ++res_synth_1.pat : sqrt8.vst sm.vst sqrt8_model.vst + $(ENV_ASIMUT_SYNTH); $(ASIMUT) sqrt8 sqrt8 res_synth_1 + + +@@ -257,7 +259,7 @@ + # | | + # \------------------------------------------------------------*/ + +-lvx.done : sqrt8.vst sqrt8_e.al ++lvx.done : sqrt8.vst sqrt8_e.al + $(ENV_LVX); $(LVX) vst al sqrt8 sqrt8_e -f + $(TOUCH) lvx.done + +@@ -313,4 +315,4 @@ + $(RM) -f *.vst *.vbe *.boom *.done *.xsc *.al *.ap *.gpl *.gds \ + *.log *.drc *.cif *.fin *.dat *.out sqrt8_e.spi res_synth_1.pat \ + res_vasy_1.pat +- ++ + diff --git a/alliance-log3.patch b/alliance-log3.patch new file mode 100644 index 0000000..f320083 --- /dev/null +++ b/alliance-log3.patch @@ -0,0 +1,22 @@ +diff -Naur mbk/man3/Makefile.am man3/Makefile.am +--- mbk/man3/Makefile.am 2003-04-03 16:56:36.000000000 +0200 ++++ man3/Makefile.am 2007-07-25 01:33:26.000000000 +0200 +@@ -87,7 +87,6 @@ + locon.3 \ + lofig.3 \ + lofigchain.3 \ +- log.3 \ + loins.3 \ + losig.3 \ + lotrs.3 \ +diff -Naur mbk/man3/Makefile.in man3/Makefile.in +--- mbk/man3/Makefile.in 2007-07-18 19:04:43.000000000 +0200 ++++ man3/Makefile.in 2007-07-25 01:33:18.000000000 +0200 +@@ -422,7 +422,6 @@ + locon.3 \ + lofig.3 \ + lofigchain.3 \ +- log.3 \ + loins.3 \ + losig.3 \ + lotrs.3 \ diff --git a/alliance-perms.patch b/alliance-perms.patch new file mode 100644 index 0000000..32aa5cc --- /dev/null +++ b/alliance-perms.patch @@ -0,0 +1,14 @@ +--- configure 2006-05-09 12:10:10.000000000 +0200 ++++ configure_mod 2007-07-17 02:24:57.000000000 +0200 +@@ -26054,9 +26054,9 @@ + + + +-INSTALL_DATA='${INSTALL} -m 664' ++INSTALL_DATA='${INSTALL} -m 644' + +-INSTALL_PROGRAM='${INSTALL} -m 775' ++INSTALL_PROGRAM='${INSTALL} -m 755' + + + cat >>confdefs.h <<_ACEOF diff --git a/alliance-run.patch b/alliance-run.patch new file mode 100644 index 0000000..32e2009 --- /dev/null +++ b/alliance-run.patch @@ -0,0 +1,21 @@ +diff -Naur documentation/alliance-run/amd2901_core.ioc alliance-run/amd2901_core.ioc +--- documentation/alliance-run/amd2901_core.ioc 2003-10-09 14:31:00.000000000 +0200 ++++ alliance-run/amd2901_core.ioc 2007-07-13 15:42:11.000000000 +0200 +@@ -1,4 +1,3 @@ +-# Copyright (c) 1997 by Cadence. All rights reserved. + ################################################################### + # In each of TOP()/BOTTOM()/LEFT()/RIGHT() section, there are # + # placed IOs. In the IGNORE() section, the IOs are ignored # +diff -Naur documentation/alliance-run/Makefile alliance-run/Makefile +--- documentation/alliance-run/Makefile 2003-12-01 14:07:11.000000000 +0100 ++++ alliance-run/Makefile 2007-07-13 15:37:37.000000000 +0200 +@@ -12,7 +12,9 @@ + STANDART_PATH = PATH=$(STANDART_BIN); export PATH + + # Standart Alliance binary access paths. + ALLIANCE_BIN = $(ALLIANCE_TOP)/bin ++ ++ALLIANCE_EXAMPLES=/usr/share/doc/alliance-doc-5.0/alliance-examples + + # -------------------------------------------------------------------- + # Standarts binaries. diff --git a/alliance-tutorials.patch b/alliance-tutorials.patch new file mode 100644 index 0000000..4675c27 --- /dev/null +++ b/alliance-tutorials.patch @@ -0,0 +1,690 @@ +diff -Naur documentation/tutorials/place_and_route/tex/place_and_route.tex tutorials/place_and_route/tex/place_and_route.tex +--- documentation/tutorials/place_and_route/tex/place_and_route.tex 2004-10-16 14:51:56.000000000 +0200 ++++ tutorials/place_and_route/tex/place_and_route.tex 2007-08-02 18:37:05.000000000 +0200 +@@ -2,6 +2,7 @@ + % $Id: place_and_route.tex,v 1.5 2004/10/16 12:51:56 fred Exp $ + % $Log: place_and_route.tex,v $ + % Revision 1.5 2004/10/16 12:51:56 fred ++% Modified by Chitlesh GOORAH for Alliance release 5.0 (18/07/2007) + % Erasing the psfig include from the file, changed the font to 10 pt + % instead of 12 (sparing trees and not being payed by the thickness of + % my production) and changing font to charter since I got tired of +@@ -11,14 +12,14 @@ + \documentclass{article} + \usepackage[dvips]{graphics} + \usepackage[english]{babel} +-\usepackage{doublespace} ++\usepackage{setspace} + \usepackage{epsf} + \usepackage{fancybox} + \usepackage{fancyheadings} + \usepackage{float} + \usepackage{graphicx} + \usepackage{here} +-\usepackage{isolatin1} ++\usepackage[latin1]{inputenc} + \usepackage{charter} + \usepackage{picinpar} + \usepackage{rotate} +@@ -92,7 +93,8 @@ + \date{} + \author{ + Frederic AK\hspace{2cm} Kai-shing LAM\\ +-Modified by LJ ++Modified by LJ\\ ++Modified by Chitlesh GOORAH (18/07/2007) + } + + \maketitle +@@ -121,7 +123,7 @@ + + {2.2} inverter Diagram + +-{2.3} Buffer diagram ++{2.3} Buffer diagram + + {2.4} sxlib gauge + +@@ -149,8 +151,8 @@ + + {3.8} pads placement + \\ +-{4} {\bf Annexes} +- ++{4} {\bf Annexes} ++ + \newpage + {\huge + PART 3 : } +@@ -158,9 +160,9 @@ + {\huge + Place and route + } +- ++ + All the files used in this part are located under \\ +-\texttt{/tutorial/place\_and\_route/src} directory.\\ ++\texttt{/usr/share/doc/alliance-doc-5.0/tutorial/place\_and\_route/src} directory.\\ + This directory contents three subdirectories and one Makefile : + + \begin{itemize}\itemsep=-.8ex +@@ -169,7 +171,7 @@ + \item inv + \begin{itemize}\itemsep=-.8ex + \item Makefile +- \item inv.vbe : behavioral description ++ \item inv.vbe : behavioral description + \item inv\_x1.ap : inverter cell design using GRAAL + \end{itemize} + \item buffer +@@ -178,7 +180,7 @@ + \item buffer.vbe : behavioral description + \item buf\_x2.ap : buffer cell design using GRAAL + \end{itemize} +-\item amd2901 ++\item amd2901 + \begin{itemize}\itemsep=-.8ex + \item Makefile + \item amd2901\_ctl.vbe : behavioral description of control +@@ -212,9 +214,9 @@ + The predefined cells concepts, model and + hierarchy will be introduced .\\ + Then this tutorial contain the methodology used in Alliance to produce +-the amd2901 physical layout that you conceived in Alliance Tutorial ++the amd2901 physical layout that you conceived in Alliance Tutorial + PART 2 "Synthesis" (All the documents used will be provided to you). +- ++ + \newpage + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +@@ -225,7 +227,7 @@ + %------------------------ + The library can be enriched by new cells with {\bf GRAAL} editor .\\ + { \bf GRAAL } is an editor of \/{\underline{symbolic }} {\it +-layout} integrating the drawing rules checker {\bf DRUC} and also ++layout} integrating the drawing rules checker {\bf DRUC} and also + a net extractor. + The first part here aims to draw an inverter cell inv\_x1 in the shape + of a predefined cell of sxlib complyiant with provided +@@ -236,7 +238,7 @@ + Some tools of Alliance use a particular technological + environment. It is indicated by the environment variable {\bf + RDS\_TECHNO\_NAME} which must be set to +-{\bf/alliance/etc/cmos.rds} ++{\bf/etc/alliance/cmos.rds} + + \subsubsection{GRAAL} + %-------------------- +@@ -244,7 +246,7 @@ + with the menu { \bf CREATE }: + \begin{itemize}\itemsep=-.4ex + \item The ''instance'' (physical cells importation) +-\item The abutment boxes which define the cell limits ++\item The abutment boxes which define the cell limits + \item Segments: DiffN, DiffP, Poly, Alu1, Alu2... CAluX is used to specify + a possible rectangle area for the connectors. + \item VIAs or contacts: ContDiffN, ContDiffP, ContPoly and +@@ -254,10 +256,10 @@ + \end{itemize} + + {\bf GRAAL} uses the environment variable {\bf +-GRAAL\_TECHNO\_NAME}. It must be set to {\bf/alliance/etc/cmos.graal}. ++GRAAL\_TECHNO\_NAME}. It must be set to {\bf/etc/alliance/cmos.graal}. + + Steps to follow to create a sxlib cell by respecting the sxlib gauge : +-( cf 2.4 Sxlib gauge ) ++( cf 2.4 Sxlib gauge ) + \begin{itemize}\itemsep=-.4ex + \item place the supply Vdd and Vss using the menu CREATE->Segment + \item place the VIAs using the menu CREATE->VIA +@@ -267,7 +269,7 @@ + \item link the transistor P and the transistor N with the Poly segment using the menu CREATE->Segment + \item supply each transistor by linking them with Ndiff and Pdiff segments and VIAs contacts + \item define the cell limit with an abutment box using the menu CREATE->Abutment Box +-\end{itemize} ++\end{itemize} + + \subsubsection{COUGAR} + %-------------------- +@@ -276,7 +278,7 @@ + with the format { \bf ap }. + To extract a netlist at transistor level, use the following command : + \begin{commandline} +- > cougar -t file1 file2 ++ > cougar -t file1 file2 + \end{commandline} + + { \bf COUGAR } uses the environment variables { \bf MBK\_IN\_PH } +@@ -286,14 +288,14 @@ + the following environment variables: \\ + + \begin{commandline} +- > MBK_IN_PH = ap +- > export MBK_IN_PH +- > MBK_OUT_LO = spi ++ > MBK_IN_PH = ap ++ > export MBK_IN_PH ++ > MBK_OUT_LO = spi + > export MBK_OUT_LO + \end{commandline} + + \begin{commandline} +- > cougar -t circuit circuit ++ > cougar -t circuit circuit + \end{commandline} + + The resulting spice netlist can be then simulated using a SPICE simulator and a given +@@ -301,7 +303,7 @@ + + The schematic of the transistor neltlist can also be displayed using {\bf XSCH} : + \begin{commandline} +- > xsch -I spi -l circuit ++ > xsch -I spi -l circuit + \end{commandline} + + \subsection{inverter Diagram} +@@ -341,12 +343,12 @@ + + \begin{itemize}\itemsep=-.4ex + \item The sxlib cells have whole 50 lambdas height and a multiple of 5 lambdas width. +-\item The supply Vdd and Vss are carried out in Calu1; they have 6 lambdas width and are ++\item The supply Vdd and Vss are carried out in Calu1; they have 6 lambdas width and are + horizontally placed in top and bottom of the cell. + \item The transistors P are placed close to the Vdd while transistors N are placed close + to the Vss. + \item Box N must have 24 lambdas height . +-\item The special segments CAluX (CAlu1, Calu2, CAlu3...) form the cell interface (PORT\_MAP) ++\item The special segments CAluX (CAlu1, Calu2, CAlu3...) form the cell interface (PORT\_MAP) + and play the role of ''flat'' connectors. They must be placed on a 5x5 grid and can be anywhere in the cell. + \item The special segments TAlux (TAlu1, TAlu2...) are used to indicate the obstacles for the + router. When you want to protect AluX segment, it is necessary to cover them +@@ -356,7 +358,7 @@ + \item The boxes N and P must be polarized. { \bf It should be respectively connected to Vdd and Vss }. + \end{itemize} + +-You will find a summary of these constraints on the diagram ++You will find a summary of these constraints on the diagram + \ref{Fig:gabarit}: + + \begin{figure}[H]\centering +@@ -443,7 +445,7 @@ + \begin{itemize}\itemsep=-.4ex + \item The data-path contains the regular parts of Amd2901, the registers + and the arithmetic logic unit. +-\item The control part contains irregular logic, ++\item The control part contains irregular logic, + the instructions decoding and the `` flags '' computation. + \end{itemize} + +@@ -463,7 +465,7 @@ + The data-path and the control part will be placed and routed together and not separately. \\ + You will use also {\bf lvx}, the netlists comparator. When the + system is too complex it is difficult to use {\bf proof}, the +-formal comparator (calculations too long). A netlists comparison ++formal comparator (calculations too long). A netlists comparison + then is used. Test the two methods ({\bf proof} and {\bf + lvx}). + +@@ -499,7 +501,7 @@ + %--------------------------------- + + Generally, the file describing a netlist must have the same +-name as the one describing its physical layout ++name as the one describing its physical layout + (but of course the file extention is not the same). + The file amd2901\_dpt.vst (LOFIG) must correspond to the file + amd2901\_dpt.ap (PHFIG). The same applies to the file +@@ -517,7 +519,7 @@ + \noindent GENLIB\_SAVE\_LOFIG()\\ + + This permits to generate a structural description in a { \bf +-VST } file. At the same time, { \bf genlib } will generate ++VST } file. At the same time, { \bf genlib } will generate + physical descriptions of each column in { \bf AP } files. + It is up to you to place these columns explicitly. \\ + Edit again the file amd2901\_dpt.c and include the lines :\\ +@@ -526,7 +528,7 @@ + \noindent /* add here you placement directives !! */ \\ + \noindent GENLIB\_SAVE\_PHFIG()\\ + +-For this placement task, you have the following {\bf GENLIB} functions : ++For this placement task, you have the following {\bf GENLIB} functions : + + \begin{itemize}\itemsep=-.4ex + \item GENLIB\_PLACE() +@@ -540,12 +542,12 @@ + \end{itemize} + + Use {\bf GENLIB} manual. The placement of the data-path columns +-should not be done randomly. The routing feasibility and the quality ++should not be done randomly. The routing feasibility and the quality + of the resulting layout depends on it !\\ + + Use genlib to generate all: + \begin{commandline} +- >genlib amd2901_dpt ++ >genlib amd2901_dpt + \end{commandline} + + The figure \ref{Fig:preplacement} summarizes the followed process: +@@ -568,12 +570,12 @@ + %--------------------------------- + + In the same manner, edit agin the file amd2901\_core.c and insert +- data-path explicitly. You should not place the part controls. ++ data-path explicitly. You should not place the part controls. + This one exists only in the form of a structural description. +-It is the placer { \bf ocp } that will undertake some ++It is the placer { \bf ocp } that will undertake some + (during the placement of the heart { \bf ocp } detects which are the +-cells not placed and supplements the placement). +-Nevertheless you should reserve enough space for the cells placement ++cells not placed and supplements the placement). ++Nevertheless you should reserve enough space for the cells placement + { \bf to the top } of the data-path. + + Include the lines:\\ +@@ -583,28 +585,28 @@ + + Space necessary to the placer to place the cells of the control part + will be determined by successive approximations. You will have to +-adjust dimensions of the heart abutment box ++adjust dimensions of the heart abutment box + (GENLIB\_DEF\_AB()). + Use the command: + + \begin{commandline} +- > genlib amd2901_core ++ > genlib amd2901_core + \end{commandline} + + and + \begin{commandline} +- > ocp -partial amd2901_core -ioc amd2901_core amd2901_core amd2901_core_p ++ > ocp -partial amd2901_core -ioc amd2901_core amd2901_core amd2901_core_p + \end{commandline} + + The option {\bf -- partial} indicates that you give a partial +-placement of the data-path. ++placement of the data-path. + The option { \bf -- ioc } permits to specify a placement for external +-connectors described in a .ioc file. +-This file, amd2901\_core.ioc is provided to you (Modify it according ++connectors described in a .ioc file. ++This file, amd2901\_core.ioc is provided to you (Modify it according + to your predefined placement. + The connectors must be in the north and in the south of your circuit). + +-The third argument is the netlist heart filename, the fourth is the ++The third argument is the netlist heart filename, the fourth is the + name of the { \bf .ap } resulting file. + + The figure \ref{Fig:placement} summarize the followed process: +@@ -620,7 +622,7 @@ + Routing the heart by using { \bf NERO } in the following way: + + \begin{commandline} +- > nero -v -3 -p amd2901_core_p amd2901_core amd2901_core ++ > nero -v -3 -p amd2901_core_p amd2901_core amd2901_core + \end{commandline} + + %The option { \bf -- place } indicates that you transmit a placement, that of the heart. +@@ -639,10 +641,10 @@ + \subsection{pads placement} + %--------------------------------- + +-The core of the AMD2001 is completed. ++The core of the AMD2001 is completed. + We focus now on the chip with pads description, placement and routing. + Those pads allow the connection of the inputs/outputs of the core with +-the external nets of the chip. ++the external nets of the chip. + + The tool {\bf ring} instanciates pads that has been specified + in a {\bf vst} netlist, place them using a file { \bf .rin } +@@ -662,7 +664,7 @@ + Name it `` amd2902\_chip.rin '' and apply the command \\ + + \begin{commandline} +- > ring amd2901_chip amd2901_chip ++ > ring amd2901_chip amd2901_chip + \end{commandline} + + We will validate the work of {\bf ring} with the tools { \bf druc +@@ -682,7 +684,7 @@ + > cougar -f amd2901_chip + \end{commandline} + +-Compare two netlists : ++Compare two netlists : + \begin{commandline} + > lvx vst al amd2901_chip amd2901_chip -f + \end{commandline} +@@ -698,7 +700,7 @@ + the circuit on the level transistor: \\ + + \begin{commandline} +-> cougar -t amd2901_chip amd2901_chip ++> cougar -t amd2901_chip amd2901_chip + \end{commandline} + \\ + +@@ -706,7 +708,7 @@ + \begin{commandline} + > make view_ctl_logic + \end{commandline} +- ++ + If you want to see the data-path physical layout: + \begin{commandline} + > make view_dpt_physic +@@ -723,7 +725,7 @@ + \begin{commandline} + > make view_chip_simulation + \end{commandline} +- ++ + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %\newpage + +diff -Naur documentation/tutorials/simulation/tex/simulation.tex tutorials/simulation/tex/simulation.tex +--- documentation/tutorials/simulation/tex/simulation.tex 2004-10-16 14:52:05.000000000 +0200 ++++ tutorials/simulation/tex/simulation.tex 2007-07-18 15:47:13.000000000 +0200 +@@ -2,6 +2,7 @@ + % $Id: simulation.tex,v 1.5 2004/10/16 12:52:05 fred Exp $ + % $Log: simulation.tex,v $ + % Revision 1.5 2004/10/16 12:52:05 fred ++% Modified by Chitlesh GOORAH for Alliance release 5.0 (18/07/2007) + % Erasing the psfig include from the file, changed the font to 10 pt + % instead of 12 (sparing trees and not being payed by the thickness of + % my production) and changing font to charter since I got tired of +@@ -13,13 +14,13 @@ + \documentclass{article} + \usepackage[dvips]{graphics} + \usepackage[english]{babel} +-\usepackage{doublespace} ++\usepackage{setspace} + \usepackage{fancybox} + \usepackage{fancyheadings} + \usepackage{float} + \usepackage{graphicx} + \usepackage{here} +-\usepackage{isolatin1} ++\usepackage[latin1]{inputenc} + \usepackage{charter} + \usepackage{picinpar} + \usepackage{rotate} +@@ -96,7 +97,8 @@ + \date{} + + \author{Frederic AK \hspace{2cm} Kai-shing LAM\\ +-Modified by LJ ++Modified by LJ\\ ++Modified by Chitlesh GOORAH (18/07/2007) + } + + \maketitle +@@ -171,7 +173,7 @@ + } + + All the files used in this part are located in the \\ +-\texttt{/tutorial/simulation/src} directory.\\ ++\texttt{/usr/share/doc/alliance-doc-5.0/tutorial/simulation/src} directory.\\ + This directory contains two subdirectories and one Makefile : + \begin{itemize} + \item The Makefile allows you to validate automatically the entire simulation part +@@ -626,13 +628,13 @@ + \bf SXLIB }. For the functionality of the various cells and their + interface, the sxlib man is available. The behavioral + description of each cell is present in \\ +-{\bf /alliance/cells/sxlib }. ++{\bf \$ALLIANCE\_TOP/cells/sxlib }. + + You must set the environment variable { \bf MBK\_CATA\_LIB } + to be able to reach these cells. + + \begin{commandline} +- > MBK_CATA_LIB=/alliance/cells/sxlib ++ > MBK_CATA_LIB=$ALLIANCE_TOP/cells/sxlib + > export MBK_CATA_LIB + \end{commandline} + +diff -Naur documentation/tutorials/start/start.tex tutorials/start/start.tex +--- documentation/tutorials/start/start.tex 2004-10-16 14:52:13.000000000 +0200 ++++ tutorials/start/start.tex 2007-07-18 13:28:50.000000000 +0200 +@@ -4,12 +4,13 @@ + % Original Version 1.0 in text form by Francois Pecheux + % Version for Alliance releases 2.0 and up by Frederic Petrot + % Modified by czo for Alliance release 4.0 (01/2000) +-% TODO : no fully working, needs some adjustements ++% Modified by Chitlesh GOORAH for Alliance release 5.0 (18/07/2007) ++% TODO : no fully working, needs some adjustments + % $Id: start.tex,v 1.5 2004/10/16 12:52:13 fred Exp $ + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \documentclass{article} +-\usepackage{charter,doublespace,here,fancybox} ++\usepackage{charter,setspace,here,fancybox} + \textwidth 15cm + \textheight 23cm + \oddsidemargin +0.75cm +@@ -20,7 +21,7 @@ + % Since it is tt, any char is fine + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \newlength{\verbatimbox} +-\settowidth{\verbatimbox}{\scriptsize\tt ++\settowidth{\verbatimbox}{\scriptsize\tt + xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + } + \newenvironment{framedverbatim} +@@ -33,8 +34,8 @@ + \begin{Sbox}\begin{minipage}{.979\textwidth}\begin{Verbatim}}% + {\end{Verbatim}\end{minipage}\end{Sbox}\setlength{\shadowsize}{2pt}% + \shadowbox{\TheSbox}\normalsize\par\noindent} +- +- ++ ++ + + %%%%%%%%%%%%%%%%%%%%%%%% + % +@@ -56,9 +57,9 @@ + \begin{quote} + \em + These tutorials introduce the design flow to be used in the +-\textbf{Alliance} CAD framework for the design and verification of a ++\textbf{Alliance} CAD framework for the design and verification of a + standard cells circuit, including the pads. +-Each step of the desgin flow is supported by one or more specific ++Each step of the desgin flow is supported by one or more specific + tools, whose use is briefly explained in the tutorials. + + These texts are meant to be simple and comprehensive, and are to be used +@@ -77,7 +78,7 @@ + proceeding, as it describes the main steps of the design conceptually. + + \section{Before starting} +-In those tutorials you will learn the practical use of the following ++In those tutorials you will learn the practical use of the following + \textbf{Alliance} tools : + + In the first tutorial (simulation/ directory) : +@@ -103,30 +104,32 @@ + In the third tutorial (synthesis/ directory) : + \begin{itemize} + \item \textbf{syf} : Finite state machine synthesizer. +-\item \textbf{boom} : Boolean optimization of a logic level behavioral ++\item \textbf{boom} : Boolean optimization of a logic level behavioral + description (VHDL data flow). +-\item \textbf{boog} : Mapping of a behavioral descriptiononto a standard cell ++\item \textbf{boog} : Mapping of a behavioral descriptiononto a standard cell + library. +-\item \textbf{loon} : Fanout optimizer, global optimizer and timing analyser of ++\item \textbf{loon} : Fanout optimizer, global optimizer and timing analyser of + \item \textbf{scapin} : Scan Path insertion + \item \textbf{xsch} : Graphical schematic viewer. + \end{itemize} + +-If you run a \texttt{c-like} shell, like \texttt{csh} or \texttt{tcsh}, ++If you run a \texttt{c-like} shell, like \texttt{csh} or \texttt{tcsh}, + try to run the following command : + + \begin{phraseverbatim} +-~alp/addaccu %-) source /alliance/etc/alc_env.csh ++~alp/addaccu %-) source /etc/profile.d/alc_env.csh + \end{phraseverbatim} + +-Otherwise, if you run a \texttt{sh-like} shell, try to run the following ++Otherwise, if you run a \texttt{sh-like} shell, try to run the following + command : + \begin{phraseverbatim} +-~alp/addaccu %-) source /alliance/alc_env.sh ++~alp/addaccu %-) source /etc/profile.d/alc_env.sh + \end{phraseverbatim} + \\ ++When a user logs in, these environment variables are automatically set from various places. ++\\ + Before we proceed to the tutorial, you must make sure that the +-\textbf{Alliance} tools are readilly available when invoking them at the ++\textbf{Alliance} tools are readilly available when invoking them at the + prompt. + The prompt in represented in the following text by the symbol~: + \begin{phraseverbatim} +@@ -136,7 +139,7 @@ + directory, and \texttt{\%-)} is supposed to give us courage! + + \section{Execution environment set up} +-Later, before you will start examining alliance tools, you will probably want ++Later, before you will start examining alliance tools, you will probably want + to know the environment variables setup. + To see it, please enter the following command : + +@@ -147,18 +150,21 @@ + \begin{figure}[H]\center\leavevmode + \begin{framedverbatim} + ~alp/addaccu %-) env | grep MBK +-MBK_OUT_PH=ap +-MBK_CATAL_NAME=CATAL ++MBK_IN_PH=ap + MBK_SCALE_X=100 ++MBK_CATAL_NAME=CATAL ++MBK_OUT_PH=ap ++MBK_OUT_LO=vst + MBK_VSS=vss +-MBK_CATA_LIB=.:/alliance/cells/sxlib:/alliance/cells/padlib +-MBK_WORK_LIB=. +-MBK_VDD=vdd + MBK_C4_LIB=./cellsC4 ++MBK_VDD=vdd ++MBK_TARGET_LIB=\$ALLIANCE\_TOP/cells/sxlib + MBK_IN_LO=vst +-MBK_IN_PH=ap +-MBK_TARGET_LIB=/alliance/cells/sxlib +-MBK_OUT_LO=vst ++MBK_WORK_LIB=. ++MBK_CATA_LIB=.:/usr/lib/alliance/cells/sxlib:/usr/lib/alliance/cells/dp_sxlib: ++/usr/lib/alliance/cells/rflib:/usr/lib/alliance/cells/ramlib: ++/usr/lib/alliance/cells/romlib:/usr/lib/alliance/cells/pxlib: ++/usr/lib/alliance/cells/padlib + \end{framedverbatim} + \caption{\label{mbk} \texttt{MBK} environment variables.} + \end{figure} +@@ -167,12 +173,12 @@ + variables are documented in each tutorial. + + \section{File Formats} +-One of the interesting features of \textbf{Alliance} is that different ++One of the interesting features of \textbf{Alliance} is that different + file formats can be used for both netlist and layout view. +-However, +-in the design methodology we wish to promote, some formats are ++However, ++in the design methodology we wish to promote, some formats are + recommended. +-The \texttt{vst}, structural \textbf{VHDL}, is dedicated to netlist ++The \texttt{vst}, structural \textbf{VHDL}, is dedicated to netlist + specification. + The \texttt{al} format is dedicated to extracted layout representation. + The \texttt{ap} format is the usual layout format. +diff -Naur documentation/tutorials/synthesis/src/amd2901/Makefile tutorials/synthesis/src/amd2901/Makefile +--- documentation/tutorials/synthesis/src/amd2901/Makefile 2002-07-25 14:50:18.000000000 +0200 ++++ tutorials/synthesis/src/amd2901/Makefile 2007-07-18 19:34:53.000000000 +0200 +@@ -2,17 +2,17 @@ + all: EXAMPLE VAR CATAL02 res.pat + + +-VAR: ++VAR: + MBK_IN_LO=vst;export MBK_IN_LO ;\ +- MBK_CATA_LIB=/asim/alliance/cells/sxlib;export MBK_CATA_LIB ++ MBK_CATA_LIB=$ALLIANCE_TOP/cells/sxlib;export MBK_CATA_LIB + + CATAL01: +- echo amd2901_ctl C >CATAL ++ echo amd2901_ctl C >CATAL + echo amd2901_dpt C >>CATAL + + CATAL02: + echo amd2901_dpt C >CATAL +- ++ + EXAMPLE: + genlib circuit + +@@ -38,7 +38,7 @@ + + res2.pat: amd2901_chip.vst pattern.pat amd2901_core.vst CATAL + asimut amd2901_chip pattern res2 +- touch amd2901_chip.vst ++ touch amd2901_chip.vst + + clean : + rm -f Makefile-* \ +diff -Naur documentation/tutorials/synthesis/tex/synthesis.tex tutorials/synthesis/tex/synthesis.tex +--- documentation/tutorials/synthesis/tex/synthesis.tex 2004-10-16 14:52:17.000000000 +0200 ++++ tutorials/synthesis/tex/synthesis.tex 2007-07-18 15:46:54.000000000 +0200 +@@ -2,6 +2,7 @@ + % $Id: synthesis.tex,v 1.4 2004/10/16 12:52:17 fred Exp $ + % $Log: synthesis.tex,v $ + % Revision 1.4 2004/10/16 12:52:17 fred ++% Modified by Chitlesh GOORAH for Alliance release 5.0 (18/07/2007) + % Erasing the psfig include from the file, changed the font to 10 pt + % instead of 12 (sparing trees and not being payed by the thickness of + % my production) and changing font to charter since I got tired of +@@ -11,13 +12,13 @@ + \documentclass{article} + \usepackage[dvips]{graphics} + \usepackage[english]{babel} +-\usepackage{doublespace} ++\usepackage{setspace} + \usepackage{fancybox} + \usepackage{fancyheadings} + \usepackage{float} + \usepackage{graphicx} + \usepackage{here} +-\usepackage{isolatin1} ++\usepackage[latin1]{inputenc} + \usepackage{charter} + \usepackage{picinpar} + \usepackage{rotate} +@@ -89,7 +90,8 @@ + \date{} + \author{ + Ak Frederic\hspace{2cm} Lam Kai-shing\\ +-Modified by LJ ++Modified by LJ\\ ++Modified by Chitlesh GOORAH (18/07/2007) + } + + \maketitle +@@ -220,7 +222,7 @@ + } + + All the files used in this part are located under \\ +-\texttt{/tutorial/synthesis/src} directory.\\ ++\texttt{/usr/share/doc/alliance-doc-5.0/tutorial/synthesis/src} directory.\\ + This directory contents four subdirectories and one Makefile : + \begin{itemize}\itemsep=-.8ex + diff --git a/alliance.fedora b/alliance.fedora new file mode 100644 index 0000000..add52ad --- /dev/null +++ b/alliance.fedora @@ -0,0 +1,44 @@ + +=== License === +Alliance CAD system is distributed under the GNU license v2. +There is no more or less limitation than the ones defined by the GPL v2. + +You are kindly requested to mention +" Designed with alliance (c) LIP6, Université Pierre et Marie Curie" +so as to spread the word about "alliance CAD system" and its development team. + + +=== Proper Usage === + +It is recommended to source the alc_env.sh or alc_env.csh before using alliance. + +source /etc/profile.d/alc_env.sh +(for example) + +When a user logs in, environment variables on +/etc/profile.d/alc_env.sh +are set will be automatically sourced. + + +=== Overview === + +A general overview of Alliance CAD System can be found here: +/usr/share/doc/alliance-doc-5.0/design-flow/index.html +(available on the alliance-doc rpm) + +=== Tutorials === + +The tutorials can be found at /usr/share/doc/alliance-doc-5.0/tutorials/ +(available on the alliance-doc rpm) + +It is recommended to first read /usr/share/doc/alliance-doc-5.0/overview.pdf + 1. start.pdf + 2. simulation.pdf + 3. synthesis.pdf + 4. place_and_route.pdf + + +========================================================================================= +Chitlesh Goorah (chitlesh AT fedoraproject DOT org) +Alliance development team and other contributors (ASIM/LIP6/UPMC) +alliance-users AT asim DOT lip6 DOT fr diff --git a/alliance.spec b/alliance.spec new file mode 100644 index 0000000..992d486 --- /dev/null +++ b/alliance.spec @@ -0,0 +1,412 @@ +%define prefix %{_libdir}/%{name} +%define snapshot 20070718 + +Name: alliance +Version: 5.0 +Release: 7.%{snapshot}snap%{?dist} +Summary: Alliance VLSI CAD Sytem + +License: GPL +Group: Applications/Engineering + +Source: http://www-asim.lip6.fr/pub/alliance/distribution/5.0/%{name}-%{version}-%{snapshot}.tar.gz +URL: http://www-asim.lip6.fr/recherche/alliance/ + +Patch1: alliance-examples.patch +Patch2: alliance-run.patch +Patch3: alliance-perms.patch +Patch4: alliance-tutorials.patch +Patch5: alliance-log3.patch + +Source1: xsch.desktop +Source2: dreal.desktop +Source3: xpat.desktop +Source4: xfsm.desktop +Source5: xvpn.desktop +Source6: graal.desktop + +Source7: alliance.fedora + +# Chitlesh's donated pictures to alliance +Source8: graal.png +Source9: dreal.png +Source10: xvpn.png +Source11: xfsm.png +Source12: xpat.png +Source13: xsch.png + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildRequires: lesstif-devel libXt-devel byacc desktop-file-utils bison +BuildRequires: libXp-devel libXpm-devel libstdc++-devel flex m4 +BuildRequires: transfig ghostscript tetex-latex + + +%description +Alliance is a complete set of free CAD tools and portable libraries for +VLSI design. It includes a VHDL compiler and simulator, logic synthesis +tools, and automatic place and route tools. + +A complete set of portable CMOS libraries is provided, including a RAM +generator, a ROM generator and a data-path compiler. + +Alliance is the result of more than ten years effort spent at ASIM department +of LIP6 laboratory of the Pierre et Marie Curie University (Paris VI, France). + +Alliance has been used for research projects such as the 875 000 transistors +StaCS superscalar microprocessor and 400 000 transistors IEEE Gigabit HSL +Router. + +You are kindly requested to mention +" Designed with alliance (c) LIP6, Université Pierre et Marie Curie" +so as to spread the word about "alliance CAD system" and its development team. + +Alliance provides CAD tools covering most of all the digital design flow: + + * VHDL Compilation and Simulation + * Model checking and formal proof + * RTL and Logic synthesis + * Data-Path compilation + * Macro-cells generation + * Place and route + * Layout edition + * Netlist extraction and verification + * Design rules checking + + +%package doc +Summary: Alliance VLSI CAD Sytem - Documentations +Group: Applications/Engineering +Requires: %{name} = %{version}-%{release} +Requires: gnuplot + + +%description doc +Documentation and tutorials for the Alliance VLSI CAD Sytem. + + +%prep +%setup -q + +%{__cp} -p %{SOURCE7} . + +# using the formal %%{_sysconfdir} in favor of $${ALLIANCE_TOP}/etc +sed -i "s|sysconfdir='\${prefix}/etc'|sysconfdir=%{_sysconfdir}/%{name}|" configure + +sed -i "s|\${ALLIANCE_TOP}/etc|%{_sysconfdir}/%{name}|" {xfsm,xvpn,xpat,xsch}/src/Makefile* + +sed -i "s|etcdir=\$(prefix)/etc|etcdir=%{_sysconfdir}/%{name}|" \ + {attila,dreal,elp,graal,mbkspice,rds,scapin,sea,xfsm,xvpn,xpat,xsch}/etc/Makefile.am + +sed -i "s|etcdir = \$(prefix)/etc|etcdir = %{_sysconfdir}/%{name}|" \ + {attila,dreal,elp,graal,mbkspice,rds,scapin,sea,xfsm,xvpn,xpat,xsch}/etc/Makefile.in + +sed -i "s|etcdir=\$(prefix)/etc|etcdir=%{_sysconfdir}/profile.d|" distrib/etc/Makefile.am +sed -i "s|etcdir = \$(prefix)/etc|etcdir = %{_sysconfdir}/profile.d|" distrib/etc/Makefile.in + + +%patch1 -p0 -b .examples +%patch2 -p0 -b .run +# fixing permissions +%patch3 -p0 -b .perms + + +## Updating old tutorials +%patch4 -p0 -b .tutorials + +pushd documentation/tutorials + for folder in place_and_route/tex simulation/tex start synthesis/tex; do + pushd $folder + %{__make} + popd + done +popd + +#conflicts with man-pages and is a duplicate of log.1.gz +%patch5 -p0 -b .duplicate + + +# removing useless copyrighted (by Cadence) lines from the examples +# and even in alliance-run +# https://www-asim.lip6.fr/wws/arc/alliance-users/2007-07/msg00006.html +pushd documentation/alliance-examples + for cadence in adder4/adder4.ioc divcas4/divcas4.ioc mipsR3000/sce/mips_core.ioc \ + amd2901/amd2901_core.ioc amd2901-vasy/amd2901.ioc ; do + sed -i "s|# Copyright (c) 1997 by Cadence. All rights reserved.|#|" $cadence + done +popd + +# make sure the man pages are UTF-8... +for nonUTF8 in distrib/doc/alc_origin.1 alcban/man1/alcbanner.1 \ + loon/doc/loon.1 m2e/doc/man1/m2e.1 boog/doc/boog.1 ; do + %{_bindir}/iconv -f ISO-8859-1 -t utf-8 $nonUTF8 > $nonUTF8.conv + %{__mv} -f $nonUTF8.conv $nonUTF8 +done + +#wrong-file-end-of-line-encoding +sed -i 's/\r//' documentation/alliance-examples/mipsR3000/asm/* + + +%build + +export ALLIANCE_TOP=%{prefix} + +%configure --prefix=%{prefix} \ + --enable-alc-shared \ + --disable-static \ + --includedir=%{prefix}/include \ + --libdir=%{prefix}/lib \ + --bindir=%{prefix}/bin + +# disabling rpath +sed -i 's|^hardcode_libdir_flag_spec="\\${wl}--rpath \\${wl}\\$libdir"|hardcode_libdir_flag_spec=""|g' libtool +sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool + +# clean unused-direct-shlib-dependencies +sed -i -e 's! -shared ! -Wl,--as-needed\0!g' libtool + +# Is not parallel-build-safe +%{__make} + + +%install + +%{__rm} -rf %{buildroot} + +%{__make} INSTALL="install -p" DESTDIR=%{buildroot} install + + +# Set execution rights on the alc_env.* batchs and adjust ALLIANCE_TOP. +pushd %{buildroot}%{_sysconfdir}/profile.d + chmod 0644 alc_env.* + sed -i "s|@DATE@|`date`|" alc_env* + # fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. + echo "MBK_SPI_MODEL=\$ALLIANCE_TOP/etc/spimodel.cfg; export MBK_SPI_MODEL" >> alc_env.sh + echo "setenv MBK_SPI_MODEL \"\${ALLIANCE_TOP}/etc/spimodel.cfg\"" >> alc_env.csh + #don't override $MANPATH + sed -i "s|\$ALLIANCE_TOP/man|\$MANPATH|" alc_env* + sed "s|ALLIANCE_TOP *= *\([^;]*\)|ALLIANCE_TOP=%{prefix}|" alc_env.sh + sed "s|setenv *ALLIANCE_TOP *\([^;]*\)|setenv ALLIANCE_TOP %{prefix}|" alc_env.csh +popd + + +# documentation +%{__cp} -pr %{buildroot}%{prefix}/doc/ . +%{__cp} -pr %{buildroot}%{prefix}/tutorials/ . +%{__cp} -pr %{buildroot}%{prefix}/examples/alliance-examples/ . + +%{__rm} -rf %{buildroot}%{prefix}/doc/ +%{__rm} -rf %{buildroot}%{prefix}/tutorials/ +%{__rm} -rf %{buildroot}%{prefix}/examples/ + +# correcting minor documentation details +sed -i "s|/bin/zsh|/bin/sh|" doc/alliance-run/bench.zsh + + +find %{buildroot} -name '*.la' -exec rm -f {} ';' + + +# Adding icons for the menus +%{__mkdir} -p %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/ +%{__cp} -p %{SOURCE8} %{SOURCE9} %{SOURCE10} %{SOURCE11} %{SOURCE12} %{SOURCE13} \ + %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/ + +# desktop files +for desktopfile in %{SOURCE1} %{SOURCE2} %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE6}; do +desktop-file-install --vendor fedora \ + --add-category Engineering \ + --dir %{buildroot}%{_datadir}/applications/ \ + $desktopfile +done + + +## Makefiles and tex folder cleanups +pushd tutorials + for folder in place_and_route/tex simulation/tex start synthesis/tex; do + %{__rm} -rf $folder + done +popd + + +# Architecture independent files +%{__mkdir} -p %{buildroot}%{_datadir}/%{name}/ +%{__mv} %{buildroot}%{prefix}/cells %{buildroot}%{_datadir}/%{name}/ + + +# protecting hardcoded links +ln -sf ../../..%{_sysconfdir}/%{name} %{buildroot}%{prefix}/etc +ln -sf ../../..%{_datadir}/%{name}/cells %{buildroot}%{prefix}/cells + + +%{__mkdir} -p %{buildroot}%{_sysconfdir}/ld.so.conf.d/ +cat > %{buildroot}%{_sysconfdir}/ld.so.conf.d/%{name}.conf << EOF +# Alliance VLSI design system +%{prefix}/lib +EOF + + +# removing tools for compiling and installing Alliance tools +# These are for the packager (i.e me) and not for user +%{__rm} -f %{buildroot}%{_sysconfdir}/%{name}/attila.conf +%{__rm} -f %{buildroot}%{prefix}/bin/attila +%{__rm} -f %{buildroot}%{_datadir}/man/man1/attila* +%{__rm} -f doc/html/alliance/*attila.html +%{__rm} -f doc/pdf/attila.pdf + + + + +%post +/sbin/ldconfig +touch --no-create %{_datadir}/icons/hicolor || : +%{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : + + +%postun +/sbin/ldconfig +touch --no-create %{_datadir}/icons/hicolor || : +%{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : + + + +%clean +%{__rm} -rf %{buildroot} + +#These headers are useful for the _usage_ of the binaries +#without these headers some of the binaries will be broken by default + + +%files +%doc CHANGES LICENCE COPYING* FAQ alliance.fedora +%defattr(-,root,root,-) +%{prefix}/ +%{_datadir}/%{name} +%dir %{_sysconfdir}/%{name} +%config(noreplace) %{_sysconfdir}/%{name}/prol.elp +%config(noreplace) %{_sysconfdir}/%{name}/se_defaults.mac +%config(noreplace) %{_sysconfdir}/%{name}/spimodel.cfg +%config(noreplace) %{_sysconfdir}/%{name}/sxlib.scapin +%config %{_sysconfdir}/%{name}/cmos.* +%config %{_sysconfdir}/%{name}/*.par +%config %{_sysconfdir}/ld.so.conf.d/* +%{_datadir}/icons/hicolor/48x48/apps/* +%{_mandir}/man?/* +%{_datadir}/applications/fedora-*.desktop +%{_sysconfdir}/profile.d/alc_env.* + + + +%files doc +%doc doc/html/ +%doc doc/design-flow +%doc doc/pdf/*.pdf +%doc doc/overview/*.ps +%doc doc/overview/*.pdf +%doc tutorials/ +#Makefiles are present in alliance-examples/*. It is normal because +# * it gives the VLSI designer a template on how to create his own +# Makefile for alliance (VLSI designers normally don't know how to do so) +# * it is not part of the build, but part of the working environment of the user +%doc alliance-examples/ +%doc doc/alliance-run/ + + + +%changelog +* Sun Aug 12 2007 Chitlesh Goorah - 5.0-7.20070718snap +- moved Architecture independent files to %%{_datadir}/%%{name} +- Uses verbs in the comments line for desktop files + +* Thu Aug 02 2007 Chitlesh Goorah - 5.0-6.20070718snap +- chose libdir/alliance as prefix +- added new icons to the menus +- removed useless attila +- fixed MANPATH override + +* Sat Jul 28 2007 Chitlesh Goorah - 5.0-5.20070718snap +- fixed unused-direct-shlib-dependency and undefined-non-weak-symbol warnings + +* Tue Jul 24 2007 Chitlesh Goorah - 5.0-4.20070718snap +- removed X-Desktop-File-Install-Version=0.10 from desktop files +- moved the alc_env to /etc/profile.d +- updated to meet reviewer's statements - #248649 + +* Thu Jul 19 2007 Chitlesh Goorah - 5.0-3.20070718snap +- New upstream release which includes bug fixes + +* Wed Jul 18 2007 Chitlesh Goorah - 5.0-2.20060509snap +- minor fixes to the tutorials + added transfig ghostscript tetex-latex as BR +- corrected some hardcoded links in the scripts +- removed %%preun and updated alliance.fedora +- spec file updated to satisfy the review + +* Tue Jul 17 2007 Chitlesh Goorah - 5.0-1 +- prepared spec file for review and spec clean ups +- removed rm and ln from %%post and %%preun +- removed log.3.gz from mandir since it's a duplicate and conflicts with man-pages + +* Sat Jul 14 2007 Chitlesh Goorah - 5.0-0.7 +- since it is not parallel-build-safe, smp mflags are removed : (by wwoods) +- added missing BR : flex : (by wwoods) +- added missing BR : bison: (by rdieter) + +* Fri Jul 13 2007 Chitlesh Goorah - 5.0-0.6 +- removing useless copyrighted lines from .ioc files +- added alliance.fedora among the %%doc + +* Thu Jul 12 2007 Chitlesh Goorah - 5.0-0.5 +- removing copyrighted materials +- patching the remaining examples so that they will still be valid under another folder + +* Wed Jul 04 2007 Chitlesh Goorah - 5.0-0.4 +- removing unwanted debug duplicates + +* Wed May 02 2007 Chitlesh Goorah - 5.0-0.3 +- added desktop files + +* Wed Feb 14 2007 Chitlesh Goorah - 5.0-0.2 +- fixing documentations + +* Wed Dec 13 2006 Chitlesh Goorah - 5.0-0.1 +- Initial package + +* Thu Feb 17 2005 Jean-Paul.Chaput +- Synch with current version: bug & compliance with gcc 3.4.x. + +* Fri Jul 16 2004 Jean-Paul.Chaput +- Added Tutorial sub-package (now managed by autoconf/automake). +- Removed release tag, must be given at compile time using the + --define command line argument of rpmbuild (see mkdistrib). + +* Sat Nov 15 2003 Jean-Paul.Chaput +- assert is now in assert.h, patch mut.h to include it if + GCC_VERSION >= 3003 (gcc >= 3.3.x). + +* Sat Oct 18 2003 Jean-Paul.Chaput +- Synched with 2003/10/18 version. +- Missing depcomp : added "--add-missing --copy" to the individual + packages in autostuff, so the first who needs depcomp will add + it at top level. + +* Sun Oct 13 2002 Jean-Paul.Chaput +- autoconf m4 macros moved back in the Alliance source tree to avoid + re-declaration on our development computers (on which the macros + are in teh source tree). +- Adopt the versioning scheme from czo. +- Try to switch to dynamic libraries. + +* Wed Jul 17 2002 Jean-Paul.Chaput +- Moved autoconf m4 macros to /usr/share/aclocal. +- Synched with the current CVS version of Alliance. + +* Fri May 31 2002 Jean-Paul.Chaput +- GenPat added. +- GenLib docs added. +- seplace/seroute/sea bug fixes. + +* Thu May 16 2002 Jean-Paul.Chaput +- Corrected buggy substitution of ALLIANCE_TOP in alc_env.csh. +- Remove the alc_env.* scripts in "/etc/profile.d" only if this + is the last package to be removed. + +* Mon May 6 2002 Jean-Paul.Chaput +- Initial packaging for release 5.0 (alpha stage). diff --git a/dreal.desktop b/dreal.desktop new file mode 100644 index 0000000..6fc223c --- /dev/null +++ b/dreal.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Alliance: Dreal +Exec=dreal +Icon=dreal.png +Type=Application +Terminal=false +GenericName=Alliance +Categories=Education;Science; +Comment=View the Real layout \ No newline at end of file diff --git a/dreal.png b/dreal.png new file mode 100644 index 0000000000000000000000000000000000000000..50e608ab6c0d88cab066839b83e57ed0b8a06f24 GIT binary patch literal 5967 zcmV-V7qIAwP)&9rLlI&N*bQDWDMMJb|0DUv9O6i?6~aRUo1cCq(+`|kI9zy8tBe9-2P z{w#1TU8I7#9Ff{1dWiV1~~g@6*7 zQVkQ1iAx~jAYwsHI5-_}TW)7Z9qQUv6J>HdHMtiJOn^s#2p|%GfX4v`hA9OgoS`^E zf@~6J?)rQ0UisvcPve;Lgrv=`X1!4ft${3PpNWmrGW1e74DIo+vfM(o@Qi8avkUq2r^`v9Oo2(Nd7o&C*wSvfENsJI+ zBp?uh3z(?5-nN@|u(DyAIn05>`GOd8Y*W#fRVFD3rV*e3 za6&{1+@pe`k52a0cj}U6Bt%@<*qYgYU}$pB-D@AOSF8QKeLBZMvn6uQ;t=74L_WtH zAOVa>vx5<0ET9q&Fpn_dM2wN(C%~hS;8>Q#s8xqlgKgJ|shKniaR}HU2oazFC`fGA z_5+_oqEMp9l0k-WlFfE!GF=msd-qKra-1NQ$s$207E5;9Nt+o>RHHBiK#Hb`iVTDh zDo{xhh{!pI1W81o2@)9=kfb45;ffd{8Y9dJQC04{A&)p>O4bC3NaC{~NHF09afrjn zbDUPkZTLYujBJc!GTUF+C~gH|f{-{mwws8O&l1f@Z&z#0rbVfwsRkfQC{=Z%?YSZ6 zVZwc$gp7v?gbA>i3k*TPc!W?)u#dotQNV!#_yG&UAas4FlP=^yCLj?aNtC7u(l8K_ zU{wQE=c>jPH4$k{6(hZ|QOacL=Jrmpv|Z@!+uErbt=N5G23| zFppV`NPw|VfGGk8@O&>cO@;i?Z@ti47<}U5XT~NbD%EOXXfQ^|i%DPq$nx@fI+gjy ze|(<`f~0C(pjE5oV_ve_I~^+#rMl}D>ve2sO<=dymwibD!&uxd?f4#~&5Ccwny}qz zba-Gf2N|emtQU9(C@P%iHro;_M`w%-5n12dC4 zfAKTxr5a#q{x|cRn_CnCCZuUKZx!!KqS}f45CJ131aP9ri6Watb>{gZZFp|mcZsP- zB58&$lQF0QQiYYRm15OGn%_N`HOC5|ioWe6JfZ?46etFQFaio70tn^zKJ8JAK9vx)7{x8p1C+Q)SF;C5n{7j>lx}QRf>9A zrDBW(4iG^U`)=qv+;;$&N-tl2hfwAE%{xo03!~$sk|F3_-IZ2+=ia@xYssoaWg(R_ zo_O-Y=(A6){NmM%PoB%3I)3$sKRk2lc<+->e)M1d>yuAk%$}U>IIZ)?PiP}U5V!{q z?(aT(re5EA>Zzw7YgGTw{JrZNnIX9N?4vl7HCfAQ6_G#%K_plrSVmZpse*_`1e0_J z5Qp4Mn;az^F-aBDUAc#59cZmv+d9R&M+T+(_O+|;X%b1ci&w9_oz?WN zPUpQh-^^-i@$RkK`g&Zcbmo84*jVAN6>Y9=tt{$@hs8B$wcz(h$QCr76^M-gL2N{b;%XAKaEs2UFz?%R#3j1zD=gZXqJXE4ti z?CHWR@S4q;=_!e^=GNAcebbTGktmrSAL}AW3B!lRhI_ko#{E6xqmk=?-x=&L>>cSZ z6w-)0c5_o2%n1^fbXigrQB^2LQ5e{^ZP^yVi2Ub2{5ONcyG}oL`mytm-JQGbh8KpOrB8+l@jt<6G81zL$r-wNuS?cY`2U ztvZK9q9pMg9{X4m0a(D9Z0P0nb-k+#JQtDxAmW&%a$Rm1AtcIzrl=Ya0-+m50U}70 z6{}^DKfHKh>F!OtQWAY9Ckh2apPfEfskQyUpBNdQnVx?5(19p$?RtG=V8E1RkznQr zam=VBCm2OI;UWc!wX{KW4T%&e22nypj1#VCI^qddRgh)CgePL+6BV1?WA z1J{*w0}I;rR<)-vP8E^#b>|>qp<^AG+C4Em=wMv?zn3-}_43lvZ|3JO%pN>6F)jo_ z+v)_GAqt{q7@%t)P{14rQYZpK0TPH~q-8*);5#@8sipwpfH*(`oBp1-qD zQ(LO(vsg=F6G?d!lB8L)qSg{6k~})OyWMWDtS)i4bMw}%?Rvepkl!qqWKrnR)l(-< z9+{fD@~hYG&E3zdCN&^s0HOp40v-buK$k&Qz-q=(KouP%$@kg;i&BySiUdgvNesXs z#+>pP#j%GPm4+Yrk}fM+N)#kuBDikkvSMqS(*FLx{mcKpxU#r=YWJh3Pmx^OXAuY7 zac$3W48tho3#w`kkBmtXvMoO)>0ZE4t?nlgQ3WNf3lRY3oP`l*G>L#g$fJ-)36C+N zfMUQ55C=jq7Eux-CJy8VfiNYKAryHtLSTWR@7^`_@dr037-sk2U~X`re{2Y6Qnl^% z4?cXqS*b`emP8Xr5u(KC8`v}De{}f+rLRBf761vJ+X=u=nUWw2z*%gys3a+}1QY=! zdM2gt80#tk0|X2>AqX%A3^<_@lN4+;Hj5uWxVo^j+>zs>kDr*icwR1yQkWytM5;EL zQp&hCcl+jpds~g2EAPLjYeKnHDwRsTJ-tH%!-*5%7!;~hOO>=?nwm}s7GI z$l=hi3Bjta2T{;$HMnK@t%e{9>pz|epo3;Drb%~Yz*9fp`6`VoMvo0v+!^Si%a zuQm-e)hO4S)w*kSXu?N_M*`PX6bS*MKxm8wBylfP1O+o3IleAx%#S1xG*R^}PZtzf zO)<-(5m2f_NFV`7IAEmeS~{JQRf$8qusBbip5C{)xq%3Ge7n(Zq%vv1V0&I+V4zxW zsancvcc!Ng-nw@C#Obq%6D;1p->g=9^Lavv(cL5KM&$S+7EpqzqM?{$pt6?290^zw z6+Q8oDrlH0;4uLRK@usNf;{c)Ga5dRvN|4ZB;cF?=P>f6ip*rD>us9wQ9?D+xF7p(#q;;97Q}~p6?>W zPd@uJ`j-=Z2_{?+mMi6l&zxSXR;o^C;-Tr+FTW!S(l`F#8*l#ljX(I>@1=-TT`A6v zPhGqG&ep;b_x-K)^(6LFDMO+(v|23iiAek);0TB)gkd0xVgg(sbaQKSa%>l4Y;|pA zq<`26ya*BB_hpO=xzzALccDL>?op_TUU~gh+NA);LM)2XuCagq(pTlKTsvSOD<8b~ z>97C(((3B!hwpsQXt$(v?%Y!s#fT42?MM6NODb42a+WT`6s& zg!Xp#CQjfq+lDIl_xGkul?pt_s$zh+;|1^i!@IZV*YC_P>qcf_b=h*Au0pqwQU?b5 zOO^7WBQsa8ytj03!I0Ga*y#GkriSUMGiSypMz4MHz9iGx+1XF7e@w9O$nm2$ZrljN z@Z4i(tycSg|MgG))1Q2=)3pEWPyghb|N5IPtMlXk^~!hu^mqGJ^A~^hqfL(=JG8sY zq&GjhT5gnRb7yB{aI(}6lSE8dc{#3@tn>B^>4>As%6zTTmqzw!&ujn_A}wzjv%#&!{cK6?8f=5ODO93Q*h zTfe@PxURody7%ezsN+-?mwxd#uim_VLsyO0Uw@<4Xh@3ovsZqq2-I!uTzTj9)s4AY zr+n(-!88Bjh4e_OZ#aYf2!IM$pd2L_C5l9JLyl1#LWl$a8n^7)((1y>+H$Scs5ENd z`Qz^;6ekp?a@nQzWsc*4p@L{=d-qRoSIR-`504Bs8nw;MVxv({r_-9IOzxSG4aE*T zMo28sfnB@S*Vn4GvZ!D$arZy6=fZcs2`c>T$Nz14V-<_4W@fXhnF35*KWMeATBF`@ z8X*Zok+ox|71<8>6}xtK`QFA((E-2aHW#;6xJnv9yKL8D1^xZImp@*Z6S`6#&ENT8 z?xs1|yV0&yoc3C+{KnPy9Edk+m0OGR*pTYJb?NQ5Bt<^7|FG3|HcR#LcJt0(|NPY- zyxiYEF)%QRV}V+JSgF;ww#%h*wN`C48qG?r8YY1sdG)r92=5;(2ol`6cjHGt`QeQ_ z*MIAue4)2LhXrSQn_9K%om=!dh41MIhR3DbLS*U92*|#?dguaAg^Z(MIiuFh0&40p^?$?vuDpK zivIG;KbgC?eE9IGm?@=gi_BydpK(s8tn0d&RyBi4va0JCaSCr3tRrVku_c(y;^^WnSiEk9Uj zR%#o|D>M5KoIQEcX|*?(R+!^GdStec&oA7+U))&#`q#gH=&7ei@_93zB~zxz1yNKD zNzo7z{4jPLPZXud^94Wx=Y;d1<3^nztEEb7TRqwCZ~wb*?b$UhVSM5AV+y7ho_^-) zJ68(1ZX8Bm{`{9r!@U0P`{0H`3|^xxFisor?;yX|xw&-a5UjO&e-=XpGeoKA#TL=o{ie&B_e zlSZ{^w>vkk-&kH)oV$HzV}1Sox8M2PXP@iqDSYK?zby&kD=+^KtJ@98;l_=XmBqoqUID}OLwieGo7Gz7#QC$K)#@$ukX{0e17Jdl zNH8IU5-N$hmd@oUp@Kx>h&gVgC|Z(W0D&=BUE8>KZ@yBi$*S_{t((y0ngpJVO!0aLkCiZ`qt%3 z_aFQwiTwLZ^VzNp`lr*w2oZ`UiYVq7a~uPzhe6$L$6+8U)J*AuAh=E#1`H#4Vtmj2 z`%9`S3lasy3Wc8S(q`znxpd~>^#0-g0aMlej$=1ldna~p7mFLKYgaD6b?D&!v!_nW zviQnRe-?yp$7x{-FTVI<9LJ0&Lqh}K{p0VRK7H~l-~ATJM2^#OJ9fvm>~^!=ZZ&Id ztHW6{@MT@8TJ>Uir`c&$TWuv}R+_EVtxYV;HLKllJ5{T3`@vkuV?a=?SO5LDzqP(q zeDm$gM<0EpWm|vut6%Qh|Ipt3`>x--)<4v5q>ZlLuHJ#(>FIr|iw}nT`!rQKcxZa+ ziSsGM9M77W*`J1xj7lQG6d{BY1WCdfi-2#pTP??tWLl}&F@tQ*uxvMoBbM;--IKQC zmaCN@^cchgLw)UblZAn-D7`&Bqq}zfhd=*wjR;@+>Q}%0AHQv=`apl*-~9aNskD*r z>FRVWL8QwM?zd{yol@!O?2*mQwFlR(V$2U8KKO&b_`aFa$&i2uAe3;%;v|k4iy2Q+ zxttd`ibT3H@^jBT{^b{6AdnQ-)^Gxj?R45!#xzV_^s`Rr$)>ZwnYG@W^*#->+?zyE9!YE6c^=`m>*Xrtk0pF_+re zSgzG7WK5DM#sm=Jz=08rFd+mZ0k|$w3G=~xS3a9A7dMJ4tA%V&r_tm=An+vdoO~{0 z)!UGL=e0y?rlz{!5#y>x*;0xp3yOzD!rURvYc>fA@_yhI)FRx%ha-Gz5;0 zA3j#E)MCb7cLc$=HWq1l5EZeKrq z12tmM;BxZ1@sFay;J zs1gY1-+uX@-Me#N5Tq%yYj%8cRMid@3PXZO$~%W9C%$;{v>C=ur4nvc%H40Mx1paf;hwnar0CBEC$0Hkfr9+@rt z(RZItoRTbKq9RV`uj$gi-oBq{>69xI+6%a9+~^41pSWrd0u z%7Ks?Oe9oHX-tmDSO#jeTCF3VSB1d98Kj~~MNxV^C}J!^4mf?M*T)=Jj3&U+a&3Nb zBA%GYkAba**K6~|Jdbd#+0wf3_?dI*@v*gLce&o$9@x4lcQNm(q1)xX(ureICVgvh zaa(H@4<4ABoxOVX8t&-*O0(thSPTb~xne|?jppF=-Dd!n9=P~WPz`lDEecqzR+D8h zpa?ud@n~4GVU7 zP0SpfuQod_ojr5zd(S@?%4B9wpMLJu*HI{R*Qw7rfW7wiTeoh`;Xov4P)|@pCZhw7 z2pF{bgWQSJZh7zS3-<&9fz9nrRSkac`+rwntVY#fQ^!vI4X_t9UL>UNhyV>mMW;h&=MicW( zEAL&tGBiDnW%;K+e%92@nM1Shz5DLXxmzQp(Q>8o&O7f|wy9e-CLHS-I){aXsyaTL z-(Ej=;xrJ%mSF~iN;n!Mfc%eVpMCu9qrd-O{sSoH)wf<>++Ef=kPZqc7U))Y0;CAD!>PQtv!^?Yt5D{2$a%hyIIKObwh`M0mkrs58M+H#G98slKs!3D706u z#S>}AXZhh#iU=@_p6isRCz&Gje3Kx5?AW2%^Cu>!#-Snui~+|t)+$VMcdy)d|LX1O z%#c|(Jk4|kV>n&h->;myZ`v2ooytZmntuEXk7=D=zueS2T>*gppc9nCG%H6_mYY6cGJm5rG>4kIGXc$yjQJRg#Ojje;H0^%5BXy zP1d(~$UXDSGchGLu+7c#dM1%`nP=J-hKSR&c1vp!M(aIoZ?8NtHrZ;lpMU=O^_8`I z&)@shSAR>5gsb)1XN&Wr(-YFcNiZ=4!U}K=!d#$AAQ%E_5zrVAa!AQnI>e@GC_XGG z3Crb_P(ltx56&L_=AZmG4)f3a|5tq%_UAGdKU*b1!OI_iJDKdOVR>TDbG# zOV8cfT*#)Ngi|4;Kr)K_38sLqUm0C>T_-u|keZ+;jHa>f%Z?7{&~}_vYK^ z3R>7%x;TC@G%^B$81O!a1TG)}!~pXE_4=9{wM zCa-<+F|*m){MvS-_U6Y|x<)SCoe}za$=JQ8R9UYx0edn+KLhH3Je|Q=5 zD3MM^tBazU?=88+)iK)qf z<#q@5=`#;Vp%malikh}u*6I)BP((ywtqS+n`ddq#TDgH0&~esMQyvIwBxGEC{L#Pu zo4<|3^4G54YWG{mPEF-U(z#sbmDgUa)M}RHM&n`E_Xr`r@AF9Dc^*rm*xBlT@XKG3 zzVpyM5BCS{Xq3Nj_Be6v<;AP3%gYbnd%^SgfB47e!(cd>f(~(P&#-*~U`3Ffc5l=3 znJlEM71uOFp00;71qdppZTPs`)@pmz^32J5gYn#_H$GllSr$dFR@q%$-_51Mg-IEL3Gxs^-L!%VMduHV_(n$n2>D=oe0pPj@!Z)X09rThTyJ*Uw&&h=@!?=JeQSR6 z=AE5(7uDLJZ%H1A`&`^(k(TD{>{I}h23@EGVq!qttu9BhAUzyP4JX_B;MCps4UJ6h zS88AW%9HiR&e7vDU;5%xH?DnLtG0A~;CN0jBxkZ|%e5IG5J9}Ov@BSF*=Af)3WY*- zXMJsFgZhKb%6>GL9-5po7;RSS+w~3-i`BkQ2YQS`VEf&E6=2PGE#lI%=k6LEioW!- z*V6@62}P$47FHUUh6=Gpb8oj+ZgoC*|H?HrCO`7%7gDL<*$=ZK=5aX7iIcLfl}d>qB3 zh?>cy6Pa8|k-_qwC722#_s;)OaQk zjd=_LjAdELr}IYN%jQFsIx+0NNxCb$b8lYymxf*iA`=v8U=2*u2n3W)ryh-jqtRHi z(~)Hb2?%n4F(&hZ**ARCfkC&8Gu5k9uI1eN3cAqk}Tx&Ku6^acd20F&R1^PB{bXWJN zt42buZyScLhC-%giK6Hdj{yQ9;4ub-V!(xk5OqAPhGGKo)o5&Bn5lI7+=cVN1C;vT z{r($8B|KWn{`&IUAvNOwJ0jw5+4(vL?M$fJ}zz`JRQHv5!;CV(F=6FCE0E{t8ISL_QfB_0P%9)lK zgkkL1uBrrQ?mE)g+nL{5<6eDf&@Sr+ojQ>Cv+w*l@chNa_2KaYH|O^DtJ{QSBD^Xn z`A{s5L@ATWRUVIjd&hEcN@lOQWO7ROZs#Z$SVK96J2@3%~#J%g;*^2EKo1{!Xi- zBc4lUV!PFDjBk1*})ec%y*)zWy@q(v%pQ>nzg_uf6(pTR8`KySJ zJow1NAU8hlz+pAox-dLC zW;?E7+L4La!1SgLoKb_prG?wPu)u&L$kNd8xVc`g*4y!H3L@fxuH`p;pLihRxGm7PSJ$Y|4jn#{%@opV;U~|&Q0vx;hYlY;dQuu4uK(ln9m5!%nvetG z{pM!RrkukoqBC%Ut#*H`G`YD`E4MmVZ(Tuv=%5XOlN(E|ZY(xC&16>Q5MaKIAtrzj z*W(yt3_ykefRJ$j_zWQcxp-9d9Sf0i<4^zi+iRaKtS&A@gJEZ2es=A;Ao54=Kkr9^ zrQ=7reBtHiUud;E`FuK+j*K20nP0yHgWPU?*KmzSW6$wh_kRAw)wy>Kw{C!DmsWn~ z>rYJ{DgNM@zo*be2pI!2Bnb*uEZxKqDx&NY;ChfUot{W97ZQ`CGT**|ZZ>KHJ;=#q}FEKE674^QO%6+v_VMV?#p|L$zMhq@>zy zX+15LQ2*cG{qJx>c=@%TY;~7Uot}B(sYgOd;d?*$zXLfB&uD`}}?P|K1<|&bgCk+U>R~DS|~A7S?(lDWCO4 zH0X4_RzsmI04b$(z}OeQ{BPPW8ksoq!R5Kq@K`Pr|KP)4C)0^kCMpDkrHzFbU-}6a zkt`y|Hbq{5gi44PdC3~+j4_`OK~@;Rw&PO(lz=D;05BK%zHNFqC@ZUL%PwH`ZnJG@ z9`L6!V|~*WVK|mfc1_)~jZ`caMVt)5`qui$!Gn9X-E!Z3@y&N8Chlr2G!uJLA{*}X zD<8b^?&A6a03?}BXx%2q1qFeJ0Ah?0$8(I6c*!F~3L?w(9LJ@A<9VJDr{6O?$BTw| z*YnU{{=qlizjCQsEt{Sxg(Th3J53GpLNuRlbUT%5g$GO~v{$e0S9iYn_!Ac&|Bb%y zwhXiH+Q0p~zk7K0;N0zNue|YMvr|PP427jgB4k>F;!xiA9E`YseTrk45{98b0V5nS z9D@<6$dV**z;ig_$|7Js#Sq}Bv9V$%bN=+n>$k3lL_~ocMPb`9cEpr^5(g zmpGW?D5caPf`9>`9&-c^@&e`=p@v0VM+6{%Aw-N)fLG_|r%S_ns~UrxS8pc5alz>O zj)w08&c4fPgVV)bc%D4*@O`Qe^}j*R(93g8)yKN{#*9AAR(( z>iM4SBo!YMkdFjCTc?(pN@n80Pz1@QW(pQ1ef$0k4{qzdKmDKo>(J*;MIsSNlzAb< z2+<9K1q7gMnhnRMvV@7}0?Z)*F-C|%%u$3GV!qqAc?5aFA`qXRJ$nDSGf_2At5yEt zhyRq#<}hW&B79`PSR=s!o^7RjQwkwA-;IRqFb9!4w}5Wn%;|E{yW+b>rwQRB72(#A)osf)UMd}NvmB5qXnKKbBsK@fwK zd9Ig>NA#XXc}i^z2my}IaXvMX+tu$meTML2b8kNxjd`xUwYjDHCIC{gG@D7~hfCR^ zLb_2YE26^WP)HW2YeMED03n9}0KV_?2*=bg=el5ENG_Ei@>}ih&OW8I5K81@87UUy ze*XHa`@1_)RnuOP4M&#=iAOe;APP zSRwQEC!e}-@)&dNZl^KOG)d%n4l?T7rfC@l1Qaj^0l<)B)b~6O0HDY+W-t?p72*jA z07vU80E!Iq6b=uK_%7j6se~E{AqgKlePU^6BVNpPZM)GMbWPLaIFopdZl_~(DUX_c z%^_|;m8Yl1eW!o-iJ7ne+b6#HwXf*C+Spij=J2S1{QccE0nvC^A&v@o|o0_mX?{CtXhM;ZgYO+v$JQ9`({V$wEDJl_^z4KP(}%$>(?$zB8Q;M zn9C!`K}J2FQVId0gh7U64(-k_?5(aK*OMTO2ZIQ31Ko&c^MwNkx`d!)Uv~`c;M7DW zm-3;1dvVFMNi>ryPES!0t!{5`?^itn2o|G-p~8V_ON7;4LsI#R7tcw+@rgAtGrP94 zS>9it92?%eoQik$L%t7DxF+vc!gi#Cu!r1d& z-Lm7nm`NoQVbyN;c6+)cDYnS*smP_9pGJm;IoXAhj}#^1b&UOLr$@o@2hQI6#YYW} zo8K;9cUaETK1{{f#;Q5_oxACCY4002ovPDHLkV1kpR#RC8U literal 0 HcmV?d00001 diff --git a/sources b/sources index e69de29..5716e50 100644 --- a/sources +++ b/sources @@ -0,0 +1 @@ +917f4493c09f6f5c49d5a606a5e9bbd8 alliance-5.0-20070718.tar.gz diff --git a/xfsm.desktop b/xfsm.desktop new file mode 100644 index 0000000..45bd88f --- /dev/null +++ b/xfsm.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Alliance: Xfsm +Exec=xfsm +Icon=xfsm.png +Type=Application +Terminal=false +GenericName=Alliance +Categories=Education;Science; +Comment=View Finite State Machines \ No newline at end of file diff --git a/xfsm.png b/xfsm.png new file mode 100644 index 0000000000000000000000000000000000000000..414f15315c44dc0a18a511aa405cb1269fb50755 GIT binary patch literal 5909 zcmV+w7wYJVP)r)S@R87w3=0wh2NB)Et%MOg}M(~4D&q>5d6NLBLSvXqBZ zrILr_At_~Xm87y=iAoGb%9JTeB1MHOK!O0V&kUB?2h+3n-giIeS1H0Ex*>FZP<6&FT+?3CN_ zA^?yG006K=NFpo|LQxP%1cVT(DwI+#L=Xf~6j4H?loVk`DAjbrxsV{kAhcaO4ndVN zqiHFOX%w+YDgcrvx(b;T=r$gm9y@*ZvC)GQn&teTAO7^yPp&L32d;zCmE!(>yVmGN zaTj4ggi^*dT_FnPoO@o!^E^r^LWn3#(=q%f6;0A?}> zeT*S(YI)l-kmQ|4+=@^jPz)&zG8xoc$sRs3{>X`GHe3W<9da`n*P+zsJP|@*jG`p& zbUmgrOb}&QQ7Ba~fJj8dd2E|Dr3_QT7-Nk6eoY9WsVX6a5W)yW$HsMu(eHUp-3r@H z>V-Cfya7Yy+|k41(^ErH($WkHECvM?hf3zeAm~i&wY|;A$_>@-umA0je){o;i<*Jl zY|)PsKTZGuA%q#CL=gxgp2$Qv#FDXylSERC7?lY8C=A2U(hZTsNJ@f$W)003NsJ_x zINoU-9UM`;W?GX`chkg;m;drb5OskqsV0O1Fqtsn)76kLrAM>UDTw^cfx#3)&mBK} z>-I8qk!v|3s!=9X0+MqcM+s7}qFbt(=}H!%7*UR~1VvIJR9l!L34GJCOij@gN_*Yx z#@-HLSd%#II$u3?$|bRax)(3L{p9l}!Cwgs54%z*31J8rrdRSL(x8-rP>`S? zXs}mP60T8&ac&1ecYR*bP$Sw?)MV!5xQ|;}R;}|Ik^&{5as*PLfOG_$>t=Zj!c60% zOF28ewbL!7bLlM8QU)iXp@ORrgE5R45G_%3OcaPElE5hfN(jRkV~~PyPT~;!ScJYz zLYh@|*EAYkFKD;YDf`kVpSub~30!!o0u(bOA&E1Y3_t`42O$Aez?fh{gaJEEzTH}V zu-uz3l@)^#H^NLY)QERfEG$SENXa1)B*u&*T8q1h6e1L{j5+5riewbhICfN(h?pc? z@Q}8vTb+=bX|uP~E22g~K(U~hf+xh$e`%JYOOVAf!kjNf1wHoPgjDn@vMu zs>%{1Xx2&{of+gHw|6&PH}}ZIL|J1gCgo;`njMh_kN8$G6^jrj3BeRp0vZLC1BBqh z{@Siz@2s{K#U^U(2YwTfy$7g zndMS?Y&11KO4qiw+Raw8*$mo2(2Uer&h74c?b^{3M>2!?+ne_lF6iX+^Iv%(ZDk>W z`QLrCdVg6pEl1OuwM`OYuNjn6C2sJ&oh^XT-r(+bw#68A^oF+3B#6Uuta7Y zdwF?TMTw#)gpu9-z22db0Mqo~Fe_DHdYWFkcD>VVbsEjU3o$1qQIOX~z*|JBDwA0k z@~Kz9{m+S$zW(Oh+l#AOjQYnXx?b>beWj32rwjVxs^@on(=-(w>k8|LShdYo6lKzG zF7Ni1dlZeB1=lPWWxa-o7#(~B7`Z=p0{}9mKIB@Nbj}W>~1g2-3@m4X(UM^B}*jbQU%aLDPvG#fVCQR>NfA-DPB3Cf zP3gJ=(t~E>&it+I&4+Q~O$?0+&+AlInh)0~$5e1G1qT5bAnbwykXJOzatYS@E2T_- z|N6$ZrWqrn6Lu!8Qgx-e7Ii}cWNB@EVraBHG`O(5tdXkQ(_^_QC!4#!xMb@liMgT} z1W`BTGNQB^ZPU#*wrcKJFE~cD)1sC-adg5lb?DJkS@Q^!ep^zGFhxL^LaD@|A4sHP zmYq5n=5n)9aG<|Der)DQ!G*y4{MYXWch3{mTpIFIYYK zr=NRvb7#k}QVL-`y#t`pO1S_i5^c?QVCwpWeQ8dt)O`ncz6kTiK5J-L2gYW=%n>UO=5}JLcQ< z`hK_D2m?1?n7e&TRampJ=UBAs?SsxCtHW4DGKp=?&N_{-RT{2TYCGGr*RI{T zavhK|b@FWGz>#ugpjhf7c|u46sw9S{aul_r*rn)O-~8s>?48O$|H^K4V{bcG=y~t$ zU%&O*8|y38`TL8+N^N?6L~tC22;}n8%DHn-+Lpb%ygV@6ub?K z+h6;mm!JE}-TU`Gx%FjTmyu4d&D~yJTqPZ_D6~7EXrSiw6DN;OmNQE?Z~fc9_}7`y z13&&ZfBpE0M+Yip4t@mQPJOd0y8R;qsZ3VURIt+b?p&XE`DxhS01Ws4-}~?W!+TGj zn31*=`fKm4^* zDCTAcArbY}jfqE3KooSnCbZl4mllh?seGxtw6@VZIJUC7yWIpo1|UF+B1VbO2{v?P zujS`b4n=fndG+e-?Uod=sRar-cIJ%0__+%&ma^M8=0>h{X&$jC@aQ#8gL+qNw`+^v%^URhi#8>2=3OKDMc?7 zdLj1Ik@EiH{o3k!R?%q?71PDy(~rim+bSb*+?&>B#8V zV~?Nt#-IJ^(80;!nW^#V=~8dmYk5EW>1%tNyU$;E_VlUK4<0O>I&}E^-}$cTB~L&4 z*khB2noAo`Jo^r9CDOT5(ZhZW^$;VD@U%S~@ zt5(Jj)aMrbwVlkd)3v$PrG~hY#q#QJKU%$hJCz{7O1xX|T)DdV=FiSOdiW1s z{d(SIh7yy4zP>(t^Ujr(f4S{>^JYxl`RTd)?tf2PO|q-=3R)xV)+gGCnw* zww$@!ca|5HU5pBGWD0oU#7XFeveBLz9=LJ+;^fSbTh!ftXOGvAL(5}>ArkwYHjxZ9 zP(FqIN~G@tut&phKw-tSl^jvV;fi~pp${jk>FwF>s)_F_YZ zo)#>$S8zq?`@=Jp=Z@ebdHqyx`E+0DnMYf3RLED(Uw9#t%TrSsJTN@JdcSX?a{kq? zViSB0x+TfC^S#AfzPhx+5L#PX9e?7?JOB9eBd3qO@)zH^dimmqpWmybs1}Q?rsoXf z^pT?mMk$4PJ3C){_L-Oe@TJuoH&7T3^p;z-ohWMCIVEP{Q(u3E7Bomx=*vP_2NI)! za(i*@#>IOFCl4b_uWqg+gfDKan0cq?_z|%6oxN3T%4X1|u4UJ^cMADDAVgFR>NU^r zoPPYVdUfr>`6thv^vb!yTd%(nG@4I-<;Ag)QO&Y1fAHbI_{P`!`g=hn)ww$+)0v&p z0i0s7GFA*&r(LhvM~}vPi!!V$m7c(B%H@rnT2rJ+6P9-3a?-rVw<&prPwn z0<87qp-`Ay>8o$;KttQSb|tSW`LyfR_xlUETq&m+S~``YSqD0txqVN*NjxS#S^4aga z+R`ACv1m32s&Vxvf0xm%M<=HjmKMEs>)^R_SHAfC%EuRvkB=D5TCZ*9om4Fn!{t86 zXMlI3FowEle!eIzk}w2}Ixf^}&HV@dOW%EBd1uXI0!-X$G*a0z7flj3S;6Y7^yTz& zCRL(8{>9IRM~8ipD1-*L=)|#OR?KHzPFPxVG zFRUz<`pc0BwX6*|;Rdd5KO8tX29W_uam*SbUz?cN_L|5xVnQiasN=|d${p%k-m2#F z1>W-h@wGS396hcvC0{H|KXK+a@4S8V=+uStPh%0s{=Q}^fe^)^p@`5>NFSlwD=VMf z-mEsl5Rhq?H#fRFo55KBk!-Q=^ZCoFi%&g$mgFoPwP%HsO7zxdbNj|ZYj%x{ zHuggv>6Q^jQK#ccikEh)=byWf%V)G~=D+^Ce}Cu8`7_5KDdl@?*CAmvIW~Uu`~|02 z*}U@Q#_at=V`EVyi={rp%~IP&hTY-v@~yjvPfRbZZMVF5bmCCVajg|pn;UJiId-U$ zaSf{B(CcVDS&&IL@IVq%bIruS4MG0Pb5B)zvVZ!@*9q`+&ULaWzuT@ZEspp0E_`wI zhd=oHKY8WF!GVFw)D%m($cr?pi+d~AfBw$y?83N~aUw;-w#tk~J6fr3N<~lQd&)z- zK8Nx^|DofLwiB-~SUhs}=zR71p);k)BNb<20tlmo0RlmyK!nYpo6;RjbDN*d;XcPb zIWbjVT1#Pk;?bG+fBVk$OCR07`01=+dRp!v}|7dS>ay)&KaP{(H(* zHn*a*i%rc8+ug(CQ{DaAXitf^JI%FfN@W@VNy72I0+7UGKy%I}@9xIl*zuXE6G!Hj z9^6}7I`ib?>pSaBzkT?`BfE{gY(d9*+f3W4Q<2obh!Pbf^+FkRyeP+t$<@Y>zxM-b z+pgb^RBQ|%oM|uJPnXj_dgE{WM(6d{-@NqkXMgp*zslxHvR?nqoB#0O<}ID`$m?p9 zl}n|)?fU(lmHzQ!M+EDe4~I`4eEd&dg@V0#^K#u?c zyDqmUPaP!b^xZEnfAhQF-d^8{qlhJVe{spH?b#XEOxx{ly%h(k5|qYzr;i?xnoxS2 zow+MZm)`Jn-glt?{JEDv_@FDq?+9-PF{)+^4o$aI2t}M=ln{Y2LINZ(1WbTQfMNjM za0dE^NgrZvU;oJABP4IrqKZu7xBb4pp_QeFzkBb4cD*xr;*`?rK3rNZWSrPFb@jH+yrty4;X~R10qUlVG&xuqn!Wd6ztukW$l-xX4%_Kp z{I?(e&;Rg)?YWiC>h9{5*^xkA{rTH`r#75U_oZCY?L3^HZ*0`FX>H=@_|Sntb07;v z6D$DK1rkBxg`9IlDYFn(5lT^-Pe5hZ0tq0900T)KCpr=aMkxv|B^juN;Nx^BM!)*c z|3ejMx4QMkhrhXSe5Ad#JbPodz1L<5HL+55@`@0n<#J=UDx*%jUN%?5(CEY4cwe<&cH;4#xX=8XW zH#k(v4HhBn`qedkM1?SfMhC)hPwcl@K(nTnO=n93fCWMTh#*iT7=UaF2!TPQPk~E> r2{r&skQPYOa2()*fAPsDA7A?aBowgvp9TqE00000NkvXXu0mjfX%~S9 literal 0 HcmV?d00001 diff --git a/xpat.desktop b/xpat.desktop new file mode 100644 index 0000000..f60f580 --- /dev/null +++ b/xpat.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Alliance: Xpat +Exec=xpat +Icon=xpat.png +Type=Application +Terminal=false +GenericName=Alliance +Categories=Education;Science; +Comment=View the Patterns \ No newline at end of file diff --git a/xpat.png b/xpat.png new file mode 100644 index 0000000000000000000000000000000000000000..39579358a14cec92673695b12f1b894c90f55ae7 GIT binary patch literal 6079 zcmV;w7eMHVP)Q))_}@7UcdSlpZMb6V`U3rj&x2Qpt#$tP=bpp* z6;D0<5QAQa|NY6&UiuD)%L6W6eu(6R zr3w?G^L&@}(uTTf zc=p-HI9e^)9X;UU(+{J1U9P?HGrsVZFLSgv#5#wufzh37Eawy2{T}W0E>$&WW-IcI zz~+T*9(nu{A@-yvdW>#e<@VKYu`(5d3!8lG?|ud?8$^~M%Q?O}L>P(b#yByh81$)e zSShf|Bc(ui&C}GIsluH*b5jMAw-9S+&DiNqhBhH*V$Nuh+ z7himtGn+d+^O@(!hZEi(PS`oM!+bI2%~xKe-HW*L$VGNe4Vc>{3tLj&8S(z=fd0h| zKK$uVpw|$g4DpQENLgF@L@<$4kr=<3aJwGwB6?RojW}C*yBtl zb4Eu)7G=#~qf4VAR_zw=91Yn_+qB~rxk_ltfGcaF8s>XL)=pi9sK6uzS6})GelcOa ztr@fnK6HMY`}b~heKlh2mgx1Aho63wQ>QPX&##f5*#JL*G{V*;qFUfZMA17z5SnFW z$)l4jnh}Xf@i?4U1QfAM(TglcZfm(%0hQoJmGTuL=e>&&f z!`oy#U3xofs8e0&CE#WtYiJyeb6_P(wGq+)Igv^5GDoBFeu|(%ga|@Ha1r9Gzx_KQ z$#d@R-ea(~PLa2H|K@G_t%5UK+lb0i&6mvfZ}F>7on|?Ez>mN419q?9qZ74>y<(8} zIJve?H!_U&?_sF0t0jrCYz|WT-JJI2ZK4f{I@Ly=>A@g@yn)0Ll0b+R6%wgiDAPmg zK0@{hqQHd|Xi&`Xp`;Ru5F#R%qkH{LCi5wyqX~cOsb~0`Z+)9)w%`+=|0owup5_n! z!`Ja;#h_*Q_Wyj7(ZLb*bVe`AU|F%&>2qOgllj2`dy5&aoKa+oJd$jm*kJqICaDfM zTVa%hAfWUxv`j}6R#A!SCg^TKtG9_z9w9)W5X1yBglHoPND>4qvL{DNzBehm*sfE zYB@(K!DLq9moxgg=8?;%$TLY?NMs%e+T%ro$TL)Gz*Vp)vB6Sj6(MTSi6k+GEJ+Yj zgU}!hh=?Fk0{I6oLWCGZ1gr=+5C(nc&P_BPm1fwwCi0f&KJ{xn_Q-jD|4;r4ZSB}u z&oOH$i_s8Q)>MlU;~PRG>Ewo;^&b6PQ{xhaBx$qXWuH026kme~1{I;(Nr zKqJt`mNYWZGK#ZXTYTj=zrgM5 zZ*%YNHU81(pX1brt}wm&HsAhV-=v(*=_t+iMu${7I*H`WW}Bv*k@$v8NUC~;L|{ye zks1*ktLYr0B(*d+1hTD3q`)hUmMw&6f&ZZJkO6H1Ej%q;XyJo_pdbXir~&W@bO??} zLTo@O$C)!*y#B^3REGzgKYxPDm(Nk0SmV8K-lv}$HqtI_qZqU@v@KEff@r?P_=--N zVO&kslw_SQaT+tPN@QsWK^`w4X;6_s#}UMWMuCt8$O1x62suz7C_eZ=g2zA*NbdlP zQyvINK%ElN^BpZ|$C^$%Ld(F& z6^v#KqKwQ-ia0?C2wGx|fFgr9Vrnf_fTa}FnP!=QZ70yr2t|f#CCE-2-RdFZb-Y}| z%S}9M1kolC){`F9YKAqEkVe!-FpC9MQ=zj6xzLR3yEq+Sk=M0F35Fc*nrSQs00Nd79hqLwZJzup;ic$AXS8(HWl4i(ySV0!x>vW zc=GgFs`svQcCb!-VM&^&Y@OMmIoM^g_des%1B&(r*+#*BHATb%A44cKWk;}V$LRHf z_T~n(JM?;+bWZO;9H7V{N+Ea=7_-}lcgBQNb9o;ZfLuU1orCSnZ zG5yn9?7KM!YD#OcN$bK%)-Rpo+~q6KA3!6)2@nEWU62VlAUH&<(bA)xN81c#2H@7f z8E8DP1T+w+het@=V6-7rOR7qub*`yBbR$9B1h!gzF05^{+S}*)Yd@tp+2_RR4Q99B zqPLc@@yz2q*c`zF*4Hl2BwQSN=dYE7DUFw7fxdCJ>a>I zJyBIDek%l^<~BiKp0n*)IkEEy zdD^AdEhFOKDe(swvCK5qodGLo+_&;Anx4+kE8dXOSO2e}%_S zoI#Y9I7`VkyWAe`F|6lIRx>V~J&hQR$t^7BE3%WP8LujAlrjl0eB&3~xV_6~KKoff zKvh9mg7+kmLI}@tF=lwUhiew3#*@W>Sc08`n4+R3f-&>@7E8BF%)|`McpKKlw2~|M{z&I@u$UB^#ZHr!Jr4r{8;#FMaXv zz;r?rJo?lY%OJ=%PvSd$zW&vJ&F+z>cUto={>{Il^`VQ;E6}k&5CBW!043K!66}QXgzd^W*OLj^9_o01LO8t9a!$X`7V!M zI*Uj&WC}!$Z^lStFz33gZx`ssAlqA@b6AzIT0riBDbzERi3p($-l4@hi2kv7bH@fA zU1QcVifn|;1C$4-=0`6*KOPNnG~C!bur&)!+Rp zn;VirkyAvPRur+lw$Ay7uOQb>^7~)^19taUoGoIiX~m$I(asbqwrrm2apK`Eb{;)L zw$(v&5_BhrEJdOamB)@|SSvA^X2pb2wM*1p(%)%giUM>G^cfH*!4H5o=oY91M9eY2 zu3&YK)$k^I=jkWdfBP*6o*#by2b@09N4uK&WW}&_oI10`tzTRxY@FfdTQ76-!HRyQ z*xowJVYAD8ydYXgHo6JJ*Y{Z7ywBYiUPpB$`JhL8a}AMaINPw%idoGU2$Rz8w-GIi zGe;=rFufimD^Sg`A{7dcr3nSd94!hI#qkEG1ZPR(9KD=P7+iiBW@EMn8@y*Cs^x;s z!4^x~uo5wE?N!|T#&?)6JOt1t;o9|EXkW9XTjatM#x-X*Iz*vHOe>O>Dw53BO9pc3b3P^f2al0YxA0Si-t_BekB0;4ZYB49s6itD)1pbz;qujrDhkLubtQIQ<8(U14ORn7=(r7_@XNx!9+hbipmLB)>bg^X9WC&wu>XKY* z4)&+4CxIf<$VMRRie^4SL=o06$l8{)oe=qBQ{o*c6CuZrQY_F2LQf!?F`>vHjgea5 zsgEN@YP3iRwnnIg;q|-dZ~ULX;^puDUmo1Pfv#8d*VcLO)?E&lj&8rjjr|Gf-9uV& zgm5)gT)S_2>ZJdkg^;1W_Fbw!v9XghYo36WR!JgwlwqBP2@# zF)mVgYtTVpghC5NoPbxBzyd8if|5|zP(}RcJKsl-4v!F7OwlU%jo&E>dF|y_(2L=i<^7to zJ11$$ly`1lW3p(dY#?q$ti@pB7~uo4hfb@-!DvJg8(L9>Xe{d+eP&pqRz^7~dFbJD zoV{?KqkFe`@A`F&k@Wioq!FYBk%5RxkPRX@L~ZfQhM;O1QDe0tia{qDqAtjopgc1> z1uJOxPa?|(sU_N0mQ2S4FZsj&_@Ak(5-SXO(MD=T<^oxs5kg=woZ!5tou#a`TXd6z zdNyS?pCFaMq!F!biz^@hW!fM4Fr8O_%xFGBDZ$y(+xU8dj1}k_3n;IUE;V(*6*UWoqIl5%Xl$oZ|^>{<(y?>vB6W;H9lBe z@H|*lw6rAn1|ua0%M!OLiKXXoG^3kp#^WVv4BML<7#!1kcc_+Al2{X5O_pht1QEos zrwt&qN2owh4q}g$mXHWU9;37L1GBC{ShQ-0R1V`MqKUcp*88Y|bI%(ksa!)4fyy@2 z-cdJ}(mAB?L`GBBHSJj8s+!;(OD^mQ4iD%S zIYpi^n+|Cw1`!%?0T~2R3X~QI8L-mgq{W+nY8@{?*=`*R9w{JHDC*g$QNh3`xB?^zmqoqPigO(Z* z1TF+zaMc zKzM<|evm$Uf)s?9p%#b=s2nD?2o2S|CW#DaiFFM}qY)bCXzGTAonf>f z4W8+u;_~^6Ja*+0_piRq?HhM^>AT;QU zsE3q%UI@vFej8g_S_(FL>wM)Oe2!oFkDWPzvX(dg`mcHa_HBAan=Cf862)>cqgpP> z(gdRouC8c&Ac`ZZx&{GKDl~%Hfo&X1SK))h1C6ubJ;n%z6KdEMxauS zNh5R|p`=De8M5&hoe_xyTtyyhWGoQIb2wX&=56H4P|X~Z{W0R7tak!UMV3TdICq}M zu3Tn#_YOb%$!i$lNuvZQpvW_piwR0goO9T^A&nE-t&Gq(7LzIKoeoL}q5v9!wh){n zSO?zG@2}&1O%w%+c1)`k5yujxB^XKEUndBU8uak0Mr0mwvInsPzl8NRtQ;H$=v;(( zj$Tftv=dDc$9(ZiUqY|-_||{=LspBL&Q=F+k29N9uvjVa0)mowqo^g60i@Q@%9$e( z))8ulunuVj`UAevLeY#?5GvxxQ~QR}Nwfy30zyezl_x~z_#)(2n6}156}FlnMTNXG zMpyx^Lv!agGC76#XN3x})a0>YXRyV_dY^aRdW$4YNs@^B`}+(A8-(Dow!#OC)&{LL zRaLQEl;l~)T7QGX_aETu246O~$|8Iq5{gI~BBe;t1h+!ThBOJJDMT^EksyvWwO2%G zi}e#HS-O&>myom~_J+G`4SL8`Nh&gw?y`4Kqw*cJQi3ElXeoK{;6C&55a&IOYgkTJ zR5mbPE>KF4rU|P>g{v%Co}tqeiDbB}IJ|wAdRZN(4#x)+j!$)t$V*}iX{(Kt$I?dV z22?<4h*LwJx7aAw+1NQp-syAg+B<|M;2MQpLLm#%xIoSwqy0Hi9no#K(AHXNSgS;v1>UESwCx1HIw<5@egz3Ur}!2&rDk`Rn>BwmaZ@)(JW5CMrdgiypQE)p0z{m6O|ZS*UB~OS_cFV4IcMhF`cn1r@KsNr8BbhN>zwYc zs{XG3?^65@2*)lLFSBp~(gykEV{^M8Uk6#XRt$)Z&!4tV{sH8dNTf?5ox{sYH?C`g z+>;vl{2-OT1o;JHqzAGDvW$^$V8oq3-!WR7kpOLA4M>3i8~}T9b^vZ;=vXkK^Fi1V z*bm`wSAZL#q7UrgneyYu^-{P|mV6MnB8JJ~4wh>e{_K9k`p*Tbj-ezVAz%f9fy5eI z3YZ0!3Sb|wKnYaweLV_o2=93VM;u0#!TqZW=hFLmRkk=ME4U}SR|@0fI$H} zD~3P(Y(m)yB*9Q2eBfUKd;bTY|IsRMGh7f)Gn|c*x4;H421fBdiA>bP9Al;)U!)>X z0EUlJ@l66R2EM!2fyuH5KP`z{i1- z1l9lXA-Gz~NhEF%nMeSS!6CS~WeQ{`Y!es){{z6?3(s#<@TI@aF~AbA8u$1F@J--4 z63IF^VORa82kZ%wuZKH6xdhG`2m;#(E#NLxD|bZ(YJwzgVB`A|SO!*r(?AQjiJIhH zQ8>N$|7io)1YQAlBMpY5a`r&ZNrtn)fCKud)OUe(;Ed7xErChg^k)2UI}+WF&qG`< zs2p1;2%L_LGO->BT#0kr@k2#qCX0mT3sUOEPj1Kg^GIYn=zTx#o1)rU9GA{@_}s^G zLKYCJBkvLi?wQZ@nVB&-xJw{7%b*|d7H&;-)0Gz7os^|Vvi^)M^J7!^tP5<7$TAV8q76_xV#i5K;syJQ#3YQMSmzGVOzkvQEGkE#A@^^BQZH}ohF{x z`0OCQpGN@WwcYv zAaNX!P^OlSRn#g`Q(K9Ijes9Tsh_qg`RZ7hw7`rKITB8f4p*J*VIT;r)6a%^fe$gP{hDFkBkWLgo9^(v4{V4PudFz z0b>jzs$(M=t~g2us?mfFDQgG=3?+sPO9I?$=X^*~E=Vo24x0AWL4Jba6qX#1jWDWN zQ0$rxe5IPv9954nt2q_o&4lS-T;a}N*k241hXga+(4Dc}D;-h?v z5)C%asGVMm_ZGPIB5b?{=UTA0ta;5~3@roa{B@=dZY{z3f%?D?W|pUCuk#iDom0T6 zXlf%GMB9kZ5)_`F03Ko~R(>ZB_o>f0);H@c4@{Nu!j~po->R_0h$`v_c{G|FC}&_s z5fcjakNyy*8I)evUXq8afKx?M;LW26%0Sc*8n%Fv{fo;!mNIijpi(j#Pxn~HW zLW}{MbMLNag(efN?atBE$^i%!R0ezwrPZWPN`>IUD3iX>LdnmlNQ4M(- z}|3kdo9GU2xKf_L(xu6&LL`|Ajt#{V_KWbs*MwJtR_LSxJeF^Vn@a0$!`HA5ni zGny14h63_q5}yGNd_3oC&%(^K58wJARN_gUn)iE#iIS1{n?zzqaf=r4;Wn5jp}h>t ziAuabhpG)p88y&`!4w7#veyj$s!)2}qeqh;)x**RM+3Z^82(1ugcpT0tLwk|t*&q< zImisS2%JF!SKX<|X^Ih7!uCtL)y@FQ1X@FwXONbf#ok$gVhj@x!%{E-PNjy#7zzh> z*}%}~9-|6Un^1Yf%vMM+cnqKJ2Kv8N(Q13F(Ym5SeM}_9Eq7Bk+X)^YgMGrSy^?Ja zZUGOV$a9OPoD|@753&mP09jkRU+DlsrWyzqk`&Um7CoDDutV4{g%V*}DAE*hzdazw zAJ!KhVIScqUnuzf7ae;n0|sO2XprE<<5teKxPQrkv5Ex2F}SeD>*JDLG!+;`^-j=_ z4$vsMRe%(lM~Q{7uSK@6Vh?B?WCmpgPoa5_piI|=Oq~}cG!3=o$j}Cmi{qVH$=ipe z|4~zS-+yJyi^pDk7R&8uHY+6D0NQx=X!7~B3eG$WOY0z&mW7*Edxjw>B2`l@+?TsB z`aXp3f|mv+&j2eJ5`+>%f+0iLA)z3U5-4%+pH83T1KZrkgiXM6osvF*E&-3hlasT> zrF5GopMs6kP~;!k?b;q}_v~aUI zcS3de(x5S*&V6cT>O||20CuizZhrvtRPmlU*a~cH=7zbJlrIepzcN*K9P2c8Xrj7_ z5+9)GR2M$4ygX;?<+?-LNS|mQZd8=)6(#q_jjL!j%fLf4C1RbYq>-Vs4(0<04$_tq zJg|_r)CU9zJ&-Y23t7|>(&RlZYGG|brv3QM+fi8S2wR6ej~T~@i!FLip{2YIZvHLMF=m-I2&s3(}uPjSu5B zi^4pq>2QRB-oniX&{A^4z>0xxTL}pjv?|5$dR+Ff)Yg`u#CKw2mTEPSm4%vENZ_n! zakJP#Oh;D(HO{i~MEaY$svb zYLR=WLP}x`KB#~~2$(m%hFo3Jc6Tp>ECYf@xFDJq)T8U5zi-$@7+p({M?7g;PudJ> zYU^_twIc%piKsyG($Kn`z#|pCT^RLYA~A=G=Uhdl>#PUCaON$;_)$F*s|1QdQ}qy( zww0E}eDUtKeErNa=P&QUq#!Zs3#DkTJr|YoRP^~d;NPsa;I9h&e6qoXWE|Daes%G{68P2T3;sc#~8j4ZTS>1 ztu&Ys?fn5OOlkV2b?>Q*_EZxB9ReRT(2XIf?nH!G%qPI;of21hTw}*D2bCj8Pfk%Mdm_2I#uE(Lr&kq9zOACiE#ju31C4o5-J9Pc!prG2yF_6LAcLYY#IomAWvq@%F`5N zxI>+)(OLEpt~Tj(Mq`s*V8g;@fU5?EQa4&*fbeeoKf}}Gy(6OpE+5|4$F{ZlYk@7c z66zScD{!sQwBn3`o1(5;+kLgLPoITIyboNUsf<=aT@f`0cow)5KUSx{1t%YVFCK~u zN4pJmusUfJ=wTwjo6>Z?E7X^kskLtyBYMnQOJEp@JctChQM1`aHPl6&y>@OmdW5t% zEX{Efacv!8H&Ca1Z)S6JBn!VTuGe~5YvwuNe)=)PXC5`|{s-J+T6k;l-ZR5+Wmt0N z{2HsNo}FbPtW_nCr`mLp+>>0|J+bxokrhj_q`+r`kV=Yp!L|Yq`#{=)k+Fmj2nGCb z3wFxJm+EXdrAeX_j<)nq-`mCg@2kS!y(+O!GdrT%p8@h4cep7{q`mCHCHr^-o25eL z@eZ*7+e5fBtPWd-h5|!I!1IGRPdgz1j*qa)_efbH!PCJb++@TuLWd>P)M0= z{Z*aQ-CtGzsu}><@kCBiDr^8i5-*MK=VH$c4hdyq#{dpMfCyxOdITpm+0Mtu69}`? z3;reVMuok?+|&K{*Z*UP+$0_s00<}Kcy3fGN62YHj^!qCSL)*{oSBv^tig^#rt^gd z6mswiM}FhP6^{AFJHPh$`#A`?3;-M{<|`A9u5jd6rk+}1PAoqO0NE~KzuLEbzeZeh zmfElm^ zw!jIv18?9DLcm7A0kI$n@IfZX0lPpxC4lF?sgoVfu4U&PBAazIwGJ@EUHRJ?&LVi#P6b{8eJSZK?fp$ZMP$^Ue z)j>_rFVH#YGIRqPf*wK>&@A*f^btm25=@5`U=3IwX2W){2kZ}TfMehkI1A2$_rVo# zJ$wr8fG@+h;1O5=zl0YMfDjP|qKxPwY{UWaMnaKjgpX`T3XpQ79%)6ok$&VJB0%Pl z4=4Tf&Ru)$ta1Z#);j z6<>^Rz<1;C;HU6Q1PKC*U`6mJ#1nQADhREFtAugF8zPaYLNq7(661(Fi50}t#OuTf z;s+9yq)l=lg^|)p`$#89mq-suZ^&e_2HBPzN=_s1BR7$+ke`y@i_ygN#N5QVVmrjD z#X7`>#a>bH6m^OnWg{hvQcgKbxkH%~$BS!-JBUY!Zx^o?KPNsWz92!9FqH6?NRlX$ zXqLDkF+;^tHKsLEJ{{e)>k%D_K56N**Q77oTVH`u0ZaL+#`8dUR&NzK3o2n z{DAy|f}(3fkDNd7vpLrX(1OD*=uYS{^gQ))^*Z%l>8t67>hIU@*Z*Q* zVvuOiVDQ+GYUpm5YuIi0w~@9H$Ee!q{%Z1S=hZt_cddSHtYaKye8l*H3C+aIWRFR& z$!AkDQ@&}d>8zQWS-4q^*%+J7_F)&XubZRI?ag-cHp(^;HuW~oY*lT!wvD#ac3O7vcBkxK*&EpN z?c41a9V{HSIb3o?9990#4KP619;PEVaxoMW6@oabFkT(Vs*xuRV?T=%<H4t zP6+<3q)%j6XH;jr&kW2wyG3FPZ_B_|?X7#aPG>o19nVH( zbFzDLlyi3FOl-5;R<|A69=W}Dhw6^J9aB49cAnft*p;yBcCJBgY3|$ILA$&26!LcF zP5$8WLrcC`K0kkKkL8})A5lNX{W!RH_1?<8UkbPdHwz64%L_jhaf)vKWcX9XPs{tF z_YD@C79T0Wl<-PM_uK40St?PQRXTaV>p({tv#g-(?ZHh4Z1Bky8E-^&t0v$t#xgT zw!+ikbo%KRzl8rXddA~S?^*WQ)?d|st!byV7j!@!TRY}EV><<1Azee~+|TuPTXwhq zruW;4^UCL|FGyY}?jiK#^(jvq*PO3i z>9^~@c-`vy`5P8D&fR3+?7U@qt7E`qp#8SV?e;;_!Hzp-ce?JH-|Ze+Gt@I|Gkp1; zEHv9xr$z{-pe={L}j1wSI3C zmaTlehoBxmyFAE|$Qn#y}leqKJUG~F~~G;@B|dG_v$^)IGgCcj*o%l}j2 z&ze`7uYUc@_OF5Y;Q6W7{MXBW7rl{rbK+ujAAg{SY5-YqQ_yq9@@@&o%r|Hq(@ z(@UA3u%9YEYklti;_+pCIca%Wxq!$8L@pq5 z0g(&*AG^TUe>cJ)E6cGl0Q|E7@VpH`WfcG#(Ew1w{s9d3127=2KdAr!03Ui(Sae}^ zbZBpK004N}bI!;t$w@8FP;mG64|4PX04rk!6^APElmGw~Oi4sRR9M3ucv*~G=XK`4 z-My-AE!|z+?2TlTqDV?sti@U^SzhEN$z)~%2Tl-V;+H{|7mtCw46?i=h>_$WKrom| zFv&{{D{-I%a5gBmv)FN@v22CXNMcKDvYWkkb#1rm?)P7FF3CbS*>(Hg^PlsbZz=rD zcmA;=cr>4DL<~koX-3dwFmxDw?B1?p@0O>`!6Dz9B5xt=bmk{}i!0YhqsXDy#=;+khEf3350@69_Znq7VLM_&2r*Lo{mMyX)9vvJjLgvm5Y z#xuuhG?|l)@cHi92k-9SiWH|&=i<%Ho1gZCGu%CY?eD%NwPo^ByA9$j7@@_iqNWuO zr#7NY8>WcX#t_673)$~1F^h4@ZHF=2Rz_r1v9r5_&j)&j<5)Qc+nvtA{rmm3?z7K6 zeQd!iD(mP8(Gw%6fvz-Vl-eQf1aA|Xz#s`Bl<1nY;H~Sa=_12-^T>8kTURc{&o%5t3 zYM4bQlktp;PJdM(hk1S}*!i%S&a!0tjE}TBO7ua5h9$}@R5ExFu9SncmZ=hvmQ$mr z*u)eU2w4g>33eT$Fy@?QESjE&jaH`@e*e}RpZN4kRx|kSH-4~ta`;RC<4eSKhN*bz zzdq7g?Afhm#B=03llgRaaNby4TnU=gZN|CExIQ}_o!vh#B&N&}N+WELOHh}!I-$p1 zH7n&TPNQ>JS!0kv%Ag9P+?WI|)u=SclLlj>6v^50+RC+uu64SdhaSD@bvpt&xV-H1 zYV+nJQI^@t;XykUIu#tw4@Z!M`QajSn$2+Ge3IYYJ(@-ECPu(tQmeE?&)g(g~-d&Xo(EG1Tq|(0;BA~iyK_QPZ07jqVO);*tjHt=87B^o)h-!KYi!D z5B7fLXMR4B^mv?!NfC6quwPE#3Swcd=b1PjM^I3l={PR6Vh#mVVv!3|Xv_78>#~M# z=Qf>T94Udg(3PwoSvLlm5@~==4%JYUBFqiqsBRmyk72DDoWN=Nmd2@2`-8z(|NNEB zt?R4nSO4N0uO7W~yLI#WOaJ9FZmTg@@@zCOG@Y0F;5@P1W=X8vXvg+6oJ&+f0}QCw zY5<08E#R;^fqNUGq|~V~DIyO_!8t++Mkzrl#VNr8VVD{w#)g_;s0_oZX;cZM6g@Z? zJoe~Q&cfo}-s$%C{rGfp@P;plGcR&MfzRE1KC6nV;keor z80(tiv{2m0iUU+&i;RvDyfBP5Lnt;Veo#(@_4*|f@Mn#+cV!p1nw3*Qu3f-OS0F}$*?dMpiQ z`;KjCAX{V$Ba5=k3snkQfx0EsWKz$Fj5*qj1ko1}RWQ=q}_kt_b2(kITsMnoMY1aCmUDGLGfQ zoa@O{DURcU4|7=>1@t~EWTIuPRl=E?Gde?htnmopnNj5f)C9=1g$jseV^Aywh~%tg zIkQSzp4IF&2N8PfaNoJIwLctJyMB=sgM(vhaV=cA(C#e7$tWMieWztALn?%0>CTOx zRB{|A=OdKNqv(8ocwAFVoFNWy0Z7=mGL!>JE6V~OajMj@MlsN#L6*cmjL318h|{oX zA$e2*!>)NDNWb>oGlg;=?G(|}Av>c{L2Z%d-}|d?EkAFBmnVuewnwvMGNj`ex-KCYz6CZt2 zX1q9>Uc}8_WqWh6{jYECy#7O!6*aqHcsj8iBqgUUPy#M^ig*b~#e@NGVrU)B5EGa| z%^E2Q)C`U=D=WY!u}~`jp3}@wct5|hdm>hsUVZJ&^U?6yGoKhHxzePNwAEft<{8{` zymNHgTSh!PdH42}=U!a3n=gO$56`!E(PV~Phq{*SdrrUEZU@zT9)N;n=Y!*2S>}i_ z1_UOx6eSD}<62ity;F|obgjk;?JZT6u>;)=oj5sTCt3X3+qeGL*Z%CKFMe@0n_EG< z8}{O;3R~Tox(9lP5cLRauB?^QFkXZhbsv5B^5)vNzWL31 zZyg7@E-Y)w6}UYg4zsXAt)LJjulL$Vtc6TVao?bJ!@lU#HHR$PC?v??QYDjke0DrM zy$42Xd7*_d2E&1${Qci~^2v{U=tEB&okUw9|2=Aj7AEp&;A4}W zpOE?VOJDh|wH}EMh--L8Y~;N75FPJkC2H(#Tz;zy0lhXoGxWd+Wl&zkK(t z*I#?%rJwz8>sy!OJSnjDsL6*1FTC*NkN?zvdj7>Hwk|aWvnnlRXQ@9HDhF3u0imi| z9HB5NLAZ=4Kqc!@x-I1Qz4k@Rzeq?=p#U+jE`k_D)dNy6^{?T2_=dwR91<+x^WU-{jyoR9P{&SEZ8&d(;}y*sz{^P}kW z&fxg{gM2VI^HR<;lozng#v!cJWK4@(g4T4LH9qsF$BBqx10p03kU2qQ2oj5Aia=;U zMrtPTkhkh}FR|k{-|k<(0j&D`$6h!*ol06my6e)TgTcjzxA5rT(v7DtEqPO}&IbDn z)>@+-@Ia4dW%sca|I+gMbC0Q+&W2HPJ^?>OnKeo)uMt3>l4)X6Mnw-Yg@__ldO+8; z;MYsfEDQ^nNfRp|Zs2s}LL4fpjQP!QxP1pT+k@fgir|hPoDT;+xII(dSaB|W?o*9` zKv#i9u5MkF#2&~rGX%HoeZW7qP0K+ZD?B#|Tp(wQHKgzpO;tIs0uP>5Ms}50xW8x= zJko}KfCX}tWt#@pg+#Grv7*2VmZ=GWv#S@k-hS`><<*VVwKXsBhND5~`&ZYymNd!n z;L$59V~~_WDj`~de=c(HK9=ofQZDve;}XYt9RM}hkVeOF&Pb3atVl{uYV`zX0a(^; z>Y4z|B94r)+VDH5sK7oEWY>Wjq#g_;vq42WAHafr4+YkjYkgC7?{frrMxL8P`=*l-(TW>H2s(h_rl6N56N zq-jxHg3YKXSA+@B3sL`6RVDaT0Dl05fv3i{4czq6PkoGa7J4SH;xzuNKmTLVYJK_3 zUpCt6wE`Ew?^;}GP->toV~k5#%WZ(sFN&%igy&HfP|pX7Avn)*%n2Ai&`0pM6nqL2 zg-Su=;7P_c%Hkw|Vu93^u`o0Tjsj9_VFzm)6Kz3o3-#kqKgEJ>+h4Z#k55uvT-&@F z2A0EcmGVi21ZWI_oQ~#cy4dN&m4MYV78{SIO~iPbyPAlS!Xt5i;Lp22W%&CQ@niM@IC`qJh@ z%ywpR23D-MurkXNU|I@xpVXF70V!LUI;6&s0Qf^!WG#P~BI?3d0pw(S47KXXJ3Dt+ z8mC6UMVi9AY?kMc>A*<=bvf|EQ3f8Jm8HnJcx)>#_83@H>Tr3xGzIL;u-?(Oe{o!-()7o1FMp}(?qjoIGmC;^-h8!Nb; zSE|m}9a#2Rk^?Nk_z3_RR0MVms)3Y4nY1PK;RHV77>1|gf|M{&QWU1O(w?OiY4x=g zfl&fwx6-6y;4~oaY3;b4kU$zFn$7?D-@d>7+V^jK{1czO{K=J#&4-@-Xt>me#61Dq zYPm)2geh3<6jEy?pn{rCpbrL61ple?7GRnZ*b3w{ZJSvRP?Z;wmM{=4(#n*EWxCaC z%;d4XU_DqkZ~#IyMJj~TXlk&$5H4*;5~_ho z92f3jOr>fhTZ|bn%0P9hzB8blVErJx!}u(1BnH5M-WUg@or;P9s3CEbTp(C@YV|rD zhF~9TD_~7g6F6xF&i3BD_ipbj-@LwgdE=Rnzep$?%pc8Sn7r2tVImR=a;yr%gv~%F zOK=^ic2F>&GB1I<34;R}1MULq0Q@Sc%X-CSA|O43%;OnH6RzQw(y=&$wIWiE_pP0`Zar`PwAJl4dp*}{6hIULVlshBAmjk?Lo@*3!y~2U zH9&0wm((Rva68H)AR$i4AX0PSI>5Xl!tyCiOX6Zk*~o!J4v7O0?Z|N+gl&f{#?!NC zl(4~k4qF=K`LHO1PV2pcQ^nY$pZ)BG&CMuIa$x6D`9ah1{k$jvGj*INm{;5ZxIhcE z0-~`2w-!LwA@zO&5i(E)z*Jc&QB+`{xL<<33_6P>(fKfEJ*!39^=C3E!gEex&n>F` z)2(Y8Y?NfJcH8ZAPlrP|(ZcHLkFH$6zMB@1^ypI9%L_Ol9F^D6*K??C0|j6usG$HN zq7()ALhlHJ2{MKYa76@sG=_pyA%W0k1(FD@%(X=Xq;3Ouc7U~XWsD#T&7jBBm{_2O(g9!s6OiQI$!WV~Yl1YdoJr z)Zk#1z`Fv_VV@Wbj83OxLTnB(KdI7`R~7V7!4(efk%E(F^SPU=CypVamhcMKusN29guX)?gICUPzQ? z4WL^fWShcQU9XF&T{Y->$3xhuI05VL()wDUBcpT*^W>ubRE~Hek>CZH6Kdn=jkbY} zq;qRyQv*o^Hy%Vi{Gb$rIFJE&Qs5e_yUh^1btxzZN(9D*oWleqeE$cpqg!thSc}V7n#~5V zZqT3*MQ?og=I-Et^Vu+&HrfrArVwfrn94YgfheJsXZLn4KeSb))77=^Jc@3=b!)M+ zu(jTA_`YM+{Q!Fd?96JU)-MnWQh&aRnI^#25CJ3r4=e_FS0HXMzeU1W#UQ Date: Thu, 16 Aug 2007 12:19:36 +0000 Subject: [PATCH 02/85] *** empty log message *** --- alliance.spec | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/alliance.spec b/alliance.spec index 992d486..5505b45 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,10 +3,10 @@ Name: alliance Version: 5.0 -Release: 7.%{snapshot}snap%{?dist} +Release: 8.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem -License: GPL +License: GPLv2 Group: Applications/Engineering Source: http://www-asim.lip6.fr/pub/alliance/distribution/5.0/%{name}-%{version}-%{snapshot}.tar.gz @@ -122,7 +122,7 @@ pushd documentation/tutorials popd #conflicts with man-pages and is a duplicate of log.1.gz -%patch5 -p0 -b .duplicate +#%patch5 -p0 -b .duplicate # removing useless copyrighted (by Cadence) lines from the examples @@ -155,7 +155,8 @@ export ALLIANCE_TOP=%{prefix} --disable-static \ --includedir=%{prefix}/include \ --libdir=%{prefix}/lib \ - --bindir=%{prefix}/bin + --bindir=%{prefix}/bin \ + --mandir=%{prefix}/man #252941 # disabling rpath sed -i 's|^hardcode_libdir_flag_spec="\\${wl}--rpath \\${wl}\\$libdir"|hardcode_libdir_flag_spec=""|g' libtool @@ -253,8 +254,6 @@ EOF %{__rm} -f doc/pdf/attila.pdf - - %post /sbin/ldconfig touch --no-create %{_datadir}/icons/hicolor || : @@ -289,7 +288,7 @@ touch --no-create %{_datadir}/icons/hicolor || : %config %{_sysconfdir}/%{name}/*.par %config %{_sysconfdir}/ld.so.conf.d/* %{_datadir}/icons/hicolor/48x48/apps/* -%{_mandir}/man?/* +#%{_mandir}/man?/* %{_datadir}/applications/fedora-*.desktop %{_sysconfdir}/profile.d/alc_env.* @@ -312,6 +311,10 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Thu Aug 16 2007 Chitlesh Goorah - 5.0-8.20070718snap +- fixing conflicts with QuantLib-doc package (#252941) +- update license macro to comply with new guidelines) + * Sun Aug 12 2007 Chitlesh Goorah - 5.0-7.20070718snap - moved Architecture independent files to %%{_datadir}/%%{name} - Uses verbs in the comments line for desktop files From c0267d8b8ecc760889fb850c52a18715ec5ce419 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Sun, 19 Aug 2007 15:13:28 +0000 Subject: [PATCH 03/85] *** empty log message *** --- alliance-env.patch | 151 ++++++++++++++++++++++++++++++++++++++++++++ alliance-log3.patch | 22 ------- alliance.spec | 108 ++++++++++++------------------- dreal.desktop | 2 +- graal.desktop | 2 +- xfsm.desktop | 2 +- xpat.desktop | 2 +- xsch.desktop | 2 +- xvpn.desktop | 2 +- 9 files changed, 198 insertions(+), 95 deletions(-) create mode 100644 alliance-env.patch delete mode 100644 alliance-log3.patch diff --git a/alliance-env.patch b/alliance-env.patch new file mode 100644 index 0000000..601ed54 --- /dev/null +++ b/alliance-env.patch @@ -0,0 +1,151 @@ +diff -Naur distrib/etc/alc_env.csh.in etc/alc_env.csh.in +--- distrib/etc/alc_env.csh.in 2006-10-05 12:09:24.000000000 +0200 ++++ etc/alc_env.csh.in 2007-08-18 13:48:55.000000000 +0200 +@@ -1,4 +1,4 @@ +-# -*- Mode: Shell-script -*- ++# -*- Mode: Shell-script -*- + # -*- vim: set filetype=csh: -*- + # ,,, + # (o o) +@@ -28,17 +28,17 @@ + setenv MBK_OUT_LO vst + setenv MBK_IN_PH ap + setenv MBK_OUT_PH ap +- ++ + setenv MBK_WORK_LIB . + setenv MBK_CATAL_NAME CATAL +- ++ + setenv MBK_SCALE_X 100 +- ++ + setenv VH_MAXERR 10 + setenv VH_BEHSFX vbe + setenv VH_PATSFX pat + setenv VH_DLYSFX dly +- ++ + setenv MBK_CATA_LIB ".:${ALLIANCE_TOP}/cells/sxlib" + setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${ALLIANCE_TOP}/cells/dp_sxlib" + setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${ALLIANCE_TOP}/cells/rflib" +@@ -48,42 +48,29 @@ + setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${ALLIANCE_TOP}/cells/pxlib" + setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${ALLIANCE_TOP}/cells/padlib" + setenv MBK_TARGET_LIB "${ALLIANCE_TOP}/cells/sxlib" +- setenv MBK_C4_LIB ./cellsC4 +- ++ setenv MBK_C4_LIB ./cellsC4 ++ + setenv MBK_VDD vdd + setenv MBK_VSS vss +- ++ + setenv XPAT_PARAM_NAME "${ALLIANCE_TOP}/etc/xpat.par" + setenv XFSM_PARAM_NAME "${ALLIANCE_TOP}/etc/xfsm.par" + setenv XSCH_PARAM_NAME "${ALLIANCE_TOP}/etc/xsch.par" +- ++ + setenv RDS_IN cif + setenv RDS_OUT cif +- ++ + setenv DREAL_TECHNO_NAME "${ALLIANCE_TOP}/etc/cmos.dreal" + setenv GRAAL_TECHNO_NAME "${ALLIANCE_TOP}/etc/cmos.graal" + setenv GENVIEW_TECHNO_NAME "${ALLIANCE_TOP}/etc/cmos.genview" +- ++ + setenv RDS_TECHNO_NAME "${ALLIANCE_TOP}/etc/cmos.rds" + setenv ELP_TECHNO_NAME "${ALLIANCE_TOP}/etc/prol.elp" + + + # System environment variables. +- if ( $?PATH ) then +- setenv PATH "${ALLIANCE_TOP}/bin:$PATH" +- else +- setenv PATH "${ALLIANCE_TOP}/bin" +- endif +- +-# Only needed on Solaris (included in /etc/ld.so.conf under Linux). +- if ( $?LD_LIBRARY_PATH ) then +- setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib:$LD_LIBRARY_PATH" +- else +- setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib" +- endif +- +- if ( $?MANPATH ) then +- setenv MANPATH "${ALLIANCE_TOP}/man:${MANPATH}" +- else +- setenv MANPATH "${ALLIANCE_TOP}/man" +- endif ++ setenv PATH "$PATH:${ALLIANCE_TOP}/bin" ++ setenv MANPATH "${MANPATH}:${ALLIANCE_TOP}/man" ++ ++# fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. ++ setenv MBK_SPI_MODEL "${ALLIANCE_TOP}/etc/spimodel.cfg" +diff -Naur distrib/etc/alc_env.sh.in etc/alc_env.sh.in +--- distrib/etc/alc_env.sh.in 2006-10-05 12:09:24.000000000 +0200 ++++ etc/alc_env.sh.in 2007-08-18 13:47:04.000000000 +0200 +@@ -1,4 +1,4 @@ +-# -*- Mode: Shell-script -*- ++# -*- Mode: Shell-script -*- + # -*- vim: set filetype=sh: -*- + # ,,, + # (o o) +@@ -24,7 +24,7 @@ + + # Alliance environment variables. + MBK_IN_LO=vst; export MBK_IN_LO +- MBK_OUT_LO=vst; export MBK_OUT_LO ++ MBK_OUT_LO=vst; export MBK_OUT_LO + MBK_IN_PH=ap; export MBK_IN_PH + MBK_OUT_PH=ap; export MBK_OUT_PH + +@@ -70,20 +70,8 @@ + + + # System environment variables. +- PATH=$ALLIANCE_TOP/bin:$PATH +- export PATH ++ export PATH=$PATH:$ALLIANCE_TOP/bin ++ export MANPATH=$MANPATH:$ALLIANCE_TOP/man + +-# Only needed on Solaris (included in /etc/ld.so.conf under Linux). +- if [ -z "${LD_LIBRARY_PATH}" ]; then +- LD_LIBRARY_PATH=$ALLIANCE_TOP/lib +- else +- LD_LIBRARY_PATH=$ALLIANCE_TOP/lib:$LD_LIBRARY_PATH +- fi +- export LD_LIBRARY_PATH +- +- if [ -z "${MANPATH}" ]; then +- MANPATH=$ALLIANCE_TOP/man +- else +- MANPATH=$ALLIANCE_TOP/man:$MANPATH +- fi +- export MANPATH ++# fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. ++ MBK_SPI_MODEL=$ALLIANCE_TOP/etc/spimodel.cfg; export MBK_SPI_MODEL +diff -Naur distrib/etc/Makefile.am etc/Makefile.am +--- distrib/etc/Makefile.am 2002-06-25 16:09:38.000000000 +0200 ++++ etc/Makefile.am 2007-08-18 13:58:38.000000000 +0200 +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.4 2002/06/25 14:09:38 czo Exp $ + +-etcdir=$(prefix)/etc ++etcdir=/etc/profile.d + + etc_SCRIPTS=alc_env.csh alc_env.sh + +diff -Naur distrib/etc/Makefile.in etc/Makefile.in +--- distrib/etc/Makefile.in 2007-07-18 19:04:22.000000000 +0200 ++++ etc/Makefile.in 2007-08-18 13:59:28.000000000 +0200 +@@ -336,7 +336,7 @@ + sharedstatedir = @sharedstatedir@ + sysconfdir = @sysconfdir@ + target_alias = @target_alias@ +-etcdir = $(prefix)/etc ++etcdir = /etc/profile.d + etc_SCRIPTS = alc_env.csh alc_env.sh + EXTRA_DIST = alc_env.csh.in alc_env.sh.in + all: all-am diff --git a/alliance-log3.patch b/alliance-log3.patch deleted file mode 100644 index f320083..0000000 --- a/alliance-log3.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff -Naur mbk/man3/Makefile.am man3/Makefile.am ---- mbk/man3/Makefile.am 2003-04-03 16:56:36.000000000 +0200 -+++ man3/Makefile.am 2007-07-25 01:33:26.000000000 +0200 -@@ -87,7 +87,6 @@ - locon.3 \ - lofig.3 \ - lofigchain.3 \ -- log.3 \ - loins.3 \ - losig.3 \ - lotrs.3 \ -diff -Naur mbk/man3/Makefile.in man3/Makefile.in ---- mbk/man3/Makefile.in 2007-07-18 19:04:43.000000000 +0200 -+++ man3/Makefile.in 2007-07-25 01:33:18.000000000 +0200 -@@ -422,7 +422,6 @@ - locon.3 \ - lofig.3 \ - lofigchain.3 \ -- log.3 \ - loins.3 \ - losig.3 \ - lotrs.3 \ diff --git a/alliance.spec b/alliance.spec index 5505b45..b4acd84 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 8.%{snapshot}snap%{?dist} +Release: 9.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -12,11 +12,11 @@ Group: Applications/Engineering Source: http://www-asim.lip6.fr/pub/alliance/distribution/5.0/%{name}-%{version}-%{snapshot}.tar.gz URL: http://www-asim.lip6.fr/recherche/alliance/ +Patch0: alliance-env.patch Patch1: alliance-examples.patch Patch2: alliance-run.patch Patch3: alliance-perms.patch Patch4: alliance-tutorials.patch -Patch5: alliance-log3.patch Source1: xsch.desktop Source2: dreal.desktop @@ -87,23 +87,14 @@ Documentation and tutorials for the Alliance VLSI CAD Sytem. %prep %setup -q -%{__cp} -p %{SOURCE7} . - -# using the formal %%{_sysconfdir} in favor of $${ALLIANCE_TOP}/etc -sed -i "s|sysconfdir='\${prefix}/etc'|sysconfdir=%{_sysconfdir}/%{name}|" configure - -sed -i "s|\${ALLIANCE_TOP}/etc|%{_sysconfdir}/%{name}|" {xfsm,xvpn,xpat,xsch}/src/Makefile* - -sed -i "s|etcdir=\$(prefix)/etc|etcdir=%{_sysconfdir}/%{name}|" \ - {attila,dreal,elp,graal,mbkspice,rds,scapin,sea,xfsm,xvpn,xpat,xsch}/etc/Makefile.am - -sed -i "s|etcdir = \$(prefix)/etc|etcdir = %{_sysconfdir}/%{name}|" \ - {attila,dreal,elp,graal,mbkspice,rds,scapin,sea,xfsm,xvpn,xpat,xsch}/etc/Makefile.in - -sed -i "s|etcdir=\$(prefix)/etc|etcdir=%{_sysconfdir}/profile.d|" distrib/etc/Makefile.am -sed -i "s|etcdir = \$(prefix)/etc|etcdir = %{_sysconfdir}/profile.d|" distrib/etc/Makefile.in +%{__cp} -p %{SOURCE1} %{SOURCE2} %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE6} %{SOURCE7} . +sed -i "s|ALLIANCE_TOP|%{prefix}|" *.desktop +%patch0 -p0 -b .env +# removing useless copyrighted (by Cadence) lines from the examples +# and even in alliance-run +# https://www-asim.lip6.fr/wws/arc/alliance-users/2007-07/msg00006.html %patch1 -p0 -b .examples %patch2 -p0 -b .run # fixing permissions @@ -114,32 +105,19 @@ sed -i "s|etcdir = \$(prefix)/etc|etcdir = %{_sysconfdir}/profile.d|" distrib/et %patch4 -p0 -b .tutorials pushd documentation/tutorials - for folder in place_and_route/tex simulation/tex start synthesis/tex; do - pushd $folder - %{__make} - popd - done + for folder in place_and_route/tex simulation/tex start synthesis/tex; do + pushd $folder + %{__make} + popd + done popd -#conflicts with man-pages and is a duplicate of log.1.gz -#%patch5 -p0 -b .duplicate - - -# removing useless copyrighted (by Cadence) lines from the examples -# and even in alliance-run -# https://www-asim.lip6.fr/wws/arc/alliance-users/2007-07/msg00006.html -pushd documentation/alliance-examples - for cadence in adder4/adder4.ioc divcas4/divcas4.ioc mipsR3000/sce/mips_core.ioc \ - amd2901/amd2901_core.ioc amd2901-vasy/amd2901.ioc ; do - sed -i "s|# Copyright (c) 1997 by Cadence. All rights reserved.|#|" $cadence - done -popd # make sure the man pages are UTF-8... for nonUTF8 in distrib/doc/alc_origin.1 alcban/man1/alcbanner.1 \ loon/doc/loon.1 m2e/doc/man1/m2e.1 boog/doc/boog.1 ; do - %{_bindir}/iconv -f ISO-8859-1 -t utf-8 $nonUTF8 > $nonUTF8.conv - %{__mv} -f $nonUTF8.conv $nonUTF8 + %{_bindir}/iconv -f ISO-8859-1 -t utf-8 $nonUTF8 > $nonUTF8.conv + %{__mv} -f $nonUTF8.conv $nonUTF8 done #wrong-file-end-of-line-encoding @@ -156,7 +134,7 @@ export ALLIANCE_TOP=%{prefix} --includedir=%{prefix}/include \ --libdir=%{prefix}/lib \ --bindir=%{prefix}/bin \ - --mandir=%{prefix}/man #252941 + --mandir=%{_datadir}/%{name}/man #252941 # disabling rpath sed -i 's|^hardcode_libdir_flag_spec="\\${wl}--rpath \\${wl}\\$libdir"|hardcode_libdir_flag_spec=""|g' libtool @@ -178,15 +156,10 @@ sed -i -e 's! -shared ! -Wl,--as-needed\0!g' libtool # Set execution rights on the alc_env.* batchs and adjust ALLIANCE_TOP. pushd %{buildroot}%{_sysconfdir}/profile.d - chmod 0644 alc_env.* - sed -i "s|@DATE@|`date`|" alc_env* - # fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. - echo "MBK_SPI_MODEL=\$ALLIANCE_TOP/etc/spimodel.cfg; export MBK_SPI_MODEL" >> alc_env.sh - echo "setenv MBK_SPI_MODEL \"\${ALLIANCE_TOP}/etc/spimodel.cfg\"" >> alc_env.csh - #don't override $MANPATH - sed -i "s|\$ALLIANCE_TOP/man|\$MANPATH|" alc_env* - sed "s|ALLIANCE_TOP *= *\([^;]*\)|ALLIANCE_TOP=%{prefix}|" alc_env.sh - sed "s|setenv *ALLIANCE_TOP *\([^;]*\)|setenv ALLIANCE_TOP %{prefix}|" alc_env.csh + chmod 0644 alc_env.* + sed -i "s|@DATE@|`date`|" alc_env* + sed "s|ALLIANCE_TOP *= *\([^;]*\)|ALLIANCE_TOP=%{prefix}|" alc_env.sh + sed "s|setenv *ALLIANCE_TOP *\([^;]*\)|setenv ALLIANCE_TOP %{prefix}|" alc_env.csh popd @@ -202,7 +175,6 @@ popd # correcting minor documentation details sed -i "s|/bin/zsh|/bin/sh|" doc/alliance-run/bench.zsh - find %{buildroot} -name '*.la' -exec rm -f {} ';' @@ -212,30 +184,35 @@ find %{buildroot} -name '*.la' -exec rm -f {} ';' %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/ # desktop files -for desktopfile in %{SOURCE1} %{SOURCE2} %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE6}; do -desktop-file-install --vendor fedora \ - --add-category Engineering \ - --dir %{buildroot}%{_datadir}/applications/ \ - $desktopfile +for desktopfile in *.desktop; do +desktop-file-install --vendor fedora \ + --add-category Engineering \ + --dir %{buildroot}%{_datadir}/applications/ \ + $desktopfile done ## Makefiles and tex folder cleanups pushd tutorials - for folder in place_and_route/tex simulation/tex start synthesis/tex; do - %{__rm} -rf $folder - done + for folder in place_and_route/tex simulation/tex start synthesis/tex; do + %{__rm} -rf $folder + done popd # Architecture independent files -%{__mkdir} -p %{buildroot}%{_datadir}/%{name}/ %{__mv} %{buildroot}%{prefix}/cells %{buildroot}%{_datadir}/%{name}/ +%{__mv} %{buildroot}%{prefix}/etc %{buildroot}%{_datadir}/%{name}/ # protecting hardcoded links -ln -sf ../../..%{_sysconfdir}/%{name} %{buildroot}%{prefix}/etc ln -sf ../../..%{_datadir}/%{name}/cells %{buildroot}%{prefix}/cells +ln -sf ../../..%{_datadir}/%{name}/etc %{buildroot}%{prefix}/etc +ln -sf ../../..%{_datadir}/%{name}/man %{buildroot}%{prefix}/man + + +# manpage-not-gzipped +find %{prefix}/man -type f -not -name '*.gz' -print | xargs gzip -9f %{__mkdir} -p %{buildroot}%{_sysconfdir}/ld.so.conf.d/ @@ -256,6 +233,7 @@ EOF %post /sbin/ldconfig +source %{_sysconfdir}/profile.d/alc_env.sh touch --no-create %{_datadir}/icons/hicolor || : %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : @@ -278,17 +256,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %doc CHANGES LICENCE COPYING* FAQ alliance.fedora %defattr(-,root,root,-) %{prefix}/ -%{_datadir}/%{name} -%dir %{_sysconfdir}/%{name} -%config(noreplace) %{_sysconfdir}/%{name}/prol.elp -%config(noreplace) %{_sysconfdir}/%{name}/se_defaults.mac -%config(noreplace) %{_sysconfdir}/%{name}/spimodel.cfg -%config(noreplace) %{_sysconfdir}/%{name}/sxlib.scapin -%config %{_sysconfdir}/%{name}/cmos.* -%config %{_sysconfdir}/%{name}/*.par +%{_datadir}/%{name}/ %config %{_sysconfdir}/ld.so.conf.d/* %{_datadir}/icons/hicolor/48x48/apps/* -#%{_mandir}/man?/* %{_datadir}/applications/fedora-*.desktop %{_sysconfdir}/profile.d/alc_env.* @@ -311,6 +281,10 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Sat Aug 18 2007 Chitlesh Goorah - 5.0-9.20070718snap +- fixing desktop files +- fixing MANPATH and PATH for proper priority + * Thu Aug 16 2007 Chitlesh Goorah - 5.0-8.20070718snap - fixing conflicts with QuantLib-doc package (#252941) - update license macro to comply with new guidelines) diff --git a/dreal.desktop b/dreal.desktop index 6fc223c..e543a85 100644 --- a/dreal.desktop +++ b/dreal.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Encoding=UTF-8 Name=Alliance: Dreal -Exec=dreal +Exec=ALLIANCE_TOP/bin/dreal Icon=dreal.png Type=Application Terminal=false diff --git a/graal.desktop b/graal.desktop index 5f4b562..11431fa 100644 --- a/graal.desktop +++ b/graal.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Encoding=UTF-8 Name=Alliance: Graal -Exec=graal +Exec=ALLIANCE_TOP/bin/graal Icon=graal.png Type=Application Terminal=false diff --git a/xfsm.desktop b/xfsm.desktop index 45bd88f..4c7a9b8 100644 --- a/xfsm.desktop +++ b/xfsm.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Encoding=UTF-8 Name=Alliance: Xfsm -Exec=xfsm +Exec=ALLIANCE_TOP/bin/xfsm Icon=xfsm.png Type=Application Terminal=false diff --git a/xpat.desktop b/xpat.desktop index f60f580..1427297 100644 --- a/xpat.desktop +++ b/xpat.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Encoding=UTF-8 Name=Alliance: Xpat -Exec=xpat +Exec=ALLIANCE_TOP/bin/xpat Icon=xpat.png Type=Application Terminal=false diff --git a/xsch.desktop b/xsch.desktop index f722f45..39740c2 100644 --- a/xsch.desktop +++ b/xsch.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Encoding=UTF-8 Name=Alliance: Xsch -Exec=xsch +Exec=ALLIANCE_TOP/bin/xsch Icon=xsch.png Type=Application Terminal=false diff --git a/xvpn.desktop b/xvpn.desktop index e0a651e..11e0b65 100644 --- a/xvpn.desktop +++ b/xvpn.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Encoding=UTF-8 Name=Alliance: Xvpn -Exec=xvpn +Exec=ALLIANCE_TOP/bin/xvpn Icon=xvpn.png Type=Application Terminal=false From 940d5f24394a1150416ec8838d1cc672ea67c8e5 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Thu, 23 Aug 2007 12:16:54 +0000 Subject: [PATCH 04/85] *** empty log message *** --- alliance-env.patch | 2 +- alliance.spec | 5 ++++- dreal.desktop | 6 +++--- graal.desktop | 6 +++--- xfsm.desktop | 6 +++--- xpat.desktop | 6 +++--- xsch.desktop | 6 +++--- xvpn.desktop | 6 +++--- 8 files changed, 23 insertions(+), 20 deletions(-) diff --git a/alliance-env.patch b/alliance-env.patch index 601ed54..2ddf663 100644 --- a/alliance-env.patch +++ b/alliance-env.patch @@ -78,7 +78,7 @@ diff -Naur distrib/etc/alc_env.csh.in etc/alc_env.csh.in - else - setenv MANPATH "${ALLIANCE_TOP}/man" - endif -+ setenv PATH "$PATH:${ALLIANCE_TOP}/bin" ++ setenv PATH "${PATH}:${ALLIANCE_TOP}/bin" + setenv MANPATH "${MANPATH}:${ALLIANCE_TOP}/man" + +# fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. diff --git a/alliance.spec b/alliance.spec index b4acd84..7e00661 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 9.%{snapshot}snap%{?dist} +Release: 10.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -281,6 +281,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Thu Aug 23 2007 Chitlesh Goorah - 5.0-10.20070718snap +- complying to freedesktop policies - categories + * Sat Aug 18 2007 Chitlesh Goorah - 5.0-9.20070718snap - fixing desktop files - fixing MANPATH and PATH for proper priority diff --git a/dreal.desktop b/dreal.desktop index e543a85..20f8da8 100644 --- a/dreal.desktop +++ b/dreal.desktop @@ -1,10 +1,10 @@ [Desktop Entry] Encoding=UTF-8 -Name=Alliance: Dreal +Name=Alliance: Layout Viewer Exec=ALLIANCE_TOP/bin/dreal Icon=dreal.png Type=Application Terminal=false -GenericName=Alliance -Categories=Education;Science; +GenericName=dreal +Categories=Science; Comment=View the Real layout \ No newline at end of file diff --git a/graal.desktop b/graal.desktop index 11431fa..b858527 100644 --- a/graal.desktop +++ b/graal.desktop @@ -1,10 +1,10 @@ [Desktop Entry] Encoding=UTF-8 -Name=Alliance: Graal +Name=Alliance: Layout Editor Exec=ALLIANCE_TOP/bin/graal Icon=graal.png Type=Application Terminal=false -GenericName=Alliance -Categories=Education;Science; +GenericName=graal +Categories=Science; Comment=Edits physical layouts \ No newline at end of file diff --git a/xfsm.desktop b/xfsm.desktop index 4c7a9b8..4e8ec39 100644 --- a/xfsm.desktop +++ b/xfsm.desktop @@ -1,10 +1,10 @@ [Desktop Entry] Encoding=UTF-8 -Name=Alliance: Xfsm +Name=Alliance: FSM Viewer Exec=ALLIANCE_TOP/bin/xfsm Icon=xfsm.png Type=Application Terminal=false -GenericName=Alliance -Categories=Education;Science; +GenericName=xfsm +Categories=Science; Comment=View Finite State Machines \ No newline at end of file diff --git a/xpat.desktop b/xpat.desktop index 1427297..4648c45 100644 --- a/xpat.desktop +++ b/xpat.desktop @@ -1,10 +1,10 @@ [Desktop Entry] Encoding=UTF-8 -Name=Alliance: Xpat +Name=Alliance: Patterns Viewer Exec=ALLIANCE_TOP/bin/xpat Icon=xpat.png Type=Application Terminal=false -GenericName=Alliance -Categories=Education;Science; +GenericName=xpat +Categories=Science; Comment=View the Patterns \ No newline at end of file diff --git a/xsch.desktop b/xsch.desktop index 39740c2..42a3472 100644 --- a/xsch.desktop +++ b/xsch.desktop @@ -1,10 +1,10 @@ [Desktop Entry] Encoding=UTF-8 -Name=Alliance: Xsch +Name=Alliance: Schematic Viewer Exec=ALLIANCE_TOP/bin/xsch Icon=xsch.png Type=Application Terminal=false -GenericName=Alliance -Categories=Education;Science; +GenericName=Xsch +Categories=Science; Comment=View the Schematic \ No newline at end of file diff --git a/xvpn.desktop b/xvpn.desktop index 11e0b65..8180588 100644 --- a/xvpn.desktop +++ b/xvpn.desktop @@ -1,10 +1,10 @@ [Desktop Entry] Encoding=UTF-8 -Name=Alliance: Xvpn +Name=Alliance: Petri Nets Viewer Exec=ALLIANCE_TOP/bin/xvpn Icon=xvpn.png Type=Application Terminal=false -GenericName=Alliance -Categories=Education;Science; +GenericName=xpvn +Categories=Science; Comment=View the Petri Nets \ No newline at end of file From badefa5b6ada6bb41947bbbae916dbdd4456ef91 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Sun, 10 Feb 2008 10:07:14 +0000 Subject: [PATCH 05/85] *** empty log message *** --- alliance.spec | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/alliance.spec b/alliance.spec index 7e00661..ada80ca 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 10.%{snapshot}snap%{?dist} +Release: 11.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -40,6 +40,7 @@ BuildRequires: lesstif-devel libXt-devel byacc desktop-file-utils bison BuildRequires: libXp-devel libXpm-devel libstdc++-devel flex m4 BuildRequires: transfig ghostscript tetex-latex +Obsoletes: %{name} < 5.0-11.20070718 %description Alliance is a complete set of free CAD tools and portable libraries for @@ -83,6 +84,14 @@ Requires: gnuplot %description doc Documentation and tutorials for the Alliance VLSI CAD Sytem. +%package libs +Summary: Alliance VLSI CAD Sytem - libraries for multilibs +Group: Applications/Engineering +Requires: %{name} = %{version}-%{release} + + +%description libs +libraries for the Alliance VLSI CAD Sytem. %prep %setup -q @@ -257,10 +266,7 @@ touch --no-create %{_datadir}/icons/hicolor || : %defattr(-,root,root,-) %{prefix}/ %{_datadir}/%{name}/ -%config %{_sysconfdir}/ld.so.conf.d/* %{_datadir}/icons/hicolor/48x48/apps/* -%{_datadir}/applications/fedora-*.desktop -%{_sysconfdir}/profile.d/alc_env.* @@ -278,9 +284,17 @@ touch --no-create %{_datadir}/icons/hicolor || : %doc alliance-examples/ %doc doc/alliance-run/ +%files libs +%{_datadir}/applications/fedora-*.desktop +%{_sysconfdir}/profile.d/alc_env.* +%config %{_sysconfdir}/ld.so.conf.d/* %changelog +* Sun Feb 10 2008 Chitlesh Goorah - 5.0-11.20070718snap +- mass rebuild for gcc43 on rawhide +- ensuring multilibs (#340621) + * Thu Aug 23 2007 Chitlesh Goorah - 5.0-10.20070718snap - complying to freedesktop policies - categories From ad32380cf6259a94eeb7aa8741ea24b6de3fef2a Mon Sep 17 00:00:00 2001 From: Jesse Keating Date: Mon, 18 Feb 2008 22:36:24 +0000 Subject: [PATCH 06/85] - Autorebuild for GCC 4.3 --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index ada80ca..95dc233 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 11.%{snapshot}snap%{?dist} +Release: 12.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -291,6 +291,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon Feb 18 2008 Fedora Release Engineering - 5.0-12.20070718snap +- Autorebuild for GCC 4.3 + * Sun Feb 10 2008 Chitlesh Goorah - 5.0-11.20070718snap - mass rebuild for gcc43 on rawhide - ensuring multilibs (#340621) From 160a7cfc128267947a9fe363c9c39c3f91c2d730 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Fri, 21 Mar 2008 17:11:17 +0000 Subject: [PATCH 07/85] *** empty log message *** --- alliance.spec | 94 +++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/alliance.spec b/alliance.spec index 95dc233..ece4906 100644 --- a/alliance.spec +++ b/alliance.spec @@ -16,7 +16,7 @@ Patch0: alliance-env.patch Patch1: alliance-examples.patch Patch2: alliance-run.patch Patch3: alliance-perms.patch -Patch4: alliance-tutorials.patch +Patch4: alliance-gcc43.patch Source1: xsch.desktop Source2: dreal.desktop @@ -35,12 +35,15 @@ Source11: xfsm.png Source12: xpat.png Source13: xsch.png +Source14: %{name}-5.0-tutorials.tar.bz2 + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: lesstif-devel libXt-devel byacc desktop-file-utils bison BuildRequires: libXp-devel libXpm-devel libstdc++-devel flex m4 -BuildRequires: transfig ghostscript tetex-latex +BuildRequires: transfig ghostscript + +Requires: %{name}-libs = %{version}-%{release} -Obsoletes: %{name} < 5.0-11.20070718 %description Alliance is a complete set of free CAD tools and portable libraries for @@ -73,6 +76,20 @@ Alliance provides CAD tools covering most of all the digital design flow: * Netlist extraction and verification * Design rules checking +%{name} is listed among Fedora Electronic Lab (FEL) packages. + + +%package libs +Summary: Alliance VLSI CAD Sytem - multilibs +Group: Applications/Engineering +Requires: %{name} = %{version}-%{release} +Requires: electronics-menu +Obsoletes: %{name} < 5.0-12 + + +%description libs +Architecture dependent files for the Alliance VLSI CAD Sytem. + %package doc Summary: Alliance VLSI CAD Sytem - Documentations @@ -84,14 +101,6 @@ Requires: gnuplot %description doc Documentation and tutorials for the Alliance VLSI CAD Sytem. -%package libs -Summary: Alliance VLSI CAD Sytem - libraries for multilibs -Group: Applications/Engineering -Requires: %{name} = %{version}-%{release} - - -%description libs -libraries for the Alliance VLSI CAD Sytem. %prep %setup -q @@ -110,17 +119,12 @@ sed -i "s|ALLIANCE_TOP|%{prefix}|" *.desktop %patch3 -p0 -b .perms -## Updating old tutorials -%patch4 -p0 -b .tutorials +### 2008 March: TexLive introduction to Rawhide +sed -i "s|tutorials||" documentation/Makefile.in +tar -xvf %{SOURCE14} -pushd documentation/tutorials - for folder in place_and_route/tex simulation/tex start synthesis/tex; do - pushd $folder - %{__make} - popd - done -popd +%patch4 -p1 -b .include # make sure the man pages are UTF-8... for nonUTF8 in distrib/doc/alc_origin.1 alcban/man1/alcbanner.1 \ @@ -174,11 +178,9 @@ popd # documentation %{__cp} -pr %{buildroot}%{prefix}/doc/ . -%{__cp} -pr %{buildroot}%{prefix}/tutorials/ . %{__cp} -pr %{buildroot}%{prefix}/examples/alliance-examples/ . %{__rm} -rf %{buildroot}%{prefix}/doc/ -%{__rm} -rf %{buildroot}%{prefix}/tutorials/ %{__rm} -rf %{buildroot}%{prefix}/examples/ # correcting minor documentation details @@ -192,32 +194,27 @@ find %{buildroot} -name '*.la' -exec rm -f {} ';' %{__cp} -p %{SOURCE8} %{SOURCE9} %{SOURCE10} %{SOURCE11} %{SOURCE12} %{SOURCE13} \ %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/ -# desktop files + +# desktop files with enhanced menu from electronics-menu now on Fedora +# thanks Peter Brett for desktopfile in *.desktop; do desktop-file-install --vendor fedora \ --add-category Engineering \ + --remove-category Science \ --dir %{buildroot}%{_datadir}/applications/ \ $desktopfile done -## Makefiles and tex folder cleanups -pushd tutorials - for folder in place_and_route/tex simulation/tex start synthesis/tex; do - %{__rm} -rf $folder - done -popd - - # Architecture independent files %{__mv} %{buildroot}%{prefix}/cells %{buildroot}%{_datadir}/%{name}/ -%{__mv} %{buildroot}%{prefix}/etc %{buildroot}%{_datadir}/%{name}/ +%{__mv} %{buildroot}%{prefix}/etc %{buildroot}%{_datadir}/%{name}/ # protecting hardcoded links -ln -sf ../../..%{_datadir}/%{name}/cells %{buildroot}%{prefix}/cells -ln -sf ../../..%{_datadir}/%{name}/etc %{buildroot}%{prefix}/etc -ln -sf ../../..%{_datadir}/%{name}/man %{buildroot}%{prefix}/man +ln -sf ../../..%{_datadir}/%{name}/cells %{buildroot}%{prefix}/cells +ln -sf ../../..%{_datadir}/%{name}/etc %{buildroot}%{prefix}/etc +ln -sf ../../..%{_datadir}/%{name}/man %{buildroot}%{prefix}/man # manpage-not-gzipped @@ -269,6 +266,11 @@ touch --no-create %{_datadir}/icons/hicolor || : %{_datadir}/icons/hicolor/48x48/apps/* +%files libs +%config %{_sysconfdir}/ld.so.conf.d/* +%{_datadir}/applications/fedora-*.desktop +%{_sysconfdir}/profile.d/alc_env.* + %files doc %doc doc/html/ @@ -284,19 +286,23 @@ touch --no-create %{_datadir}/icons/hicolor || : %doc alliance-examples/ %doc doc/alliance-run/ -%files libs -%{_datadir}/applications/fedora-*.desktop -%{_sysconfdir}/profile.d/alc_env.* -%config %{_sysconfdir}/ld.so.conf.d/* %changelog -* Mon Feb 18 2008 Fedora Release Engineering - 5.0-12.20070718snap -- Autorebuild for GCC 4.3 +* Fri Mar 21 2008 Chitlesh Goorah - 5.0-12.20070718snap +- Requiring new FEL menu structure +- Fixing previous desktop files +- closing unconfirmed bug #427691 +- fixing multilibs issues #340621 -* Sun Feb 10 2008 Chitlesh Goorah - 5.0-11.20070718snap -- mass rebuild for gcc43 on rawhide -- ensuring multilibs (#340621) +* Tue Mar 18 2008 Thibault North < tnorth [AT] fedoraproject DOT org> - 5.0-11.20070718snap +- dropped patch4: alliance-tutorials.patch +- fixed TexLive related issues for documentation +- commenting previous make in directory tutorials +- attached tutorials made in F8 Werewolf +- dropped BR :tetex-latex +- added patch4: including more useful includes to C files +- fixed bug #434020 : alliance failed massrebuild attempt for GCC4.3 * Thu Aug 23 2007 Chitlesh Goorah - 5.0-10.20070718snap - complying to freedesktop policies - categories From a064cfe96ee3a24a0ba213565be5e5d844c45112 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Fri, 21 Mar 2008 17:14:31 +0000 Subject: [PATCH 08/85] *** empty log message *** --- .cvsignore | 1 + alliance-gcc43.patch | 47 +++ alliance-tutorials.patch | 690 --------------------------------------- alliance.spec | 13 +- sources | 1 + 5 files changed, 59 insertions(+), 693 deletions(-) create mode 100755 alliance-gcc43.patch delete mode 100644 alliance-tutorials.patch diff --git a/.cvsignore b/.cvsignore index e2837be..013d539 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1 +1,2 @@ alliance-5.0-20070718.tar.gz +alliance-5.0-tutorials.tar.bz2 diff --git a/alliance-gcc43.patch b/alliance-gcc43.patch new file mode 100755 index 0000000..6c63b72 --- /dev/null +++ b/alliance-gcc43.patch @@ -0,0 +1,47 @@ +diff -Nur alliance-5.0.old/nero/src/ADefs.h alliance-5.0/nero/src/ADefs.h +--- alliance-5.0.old/nero/src/ADefs.h 2002-10-29 19:46:03.000000000 +0100 ++++ alliance-5.0/nero/src/ADefs.h 2008-03-19 03:16:12.000000000 +0100 +@@ -138,7 +138,7 @@ + + // Allocators. + private: static void *operator new (size_t size); +- private: static void operator delete (void *zone); ++ public: static void operator delete (void *zone); + public: static void *operator new (size_t size, CNodeASSet &NS); + + // Modifiers. +diff -Nur alliance-5.0.old/nero/src/MDefs.h alliance-5.0/nero/src/MDefs.h +--- alliance-5.0.old/nero/src/MDefs.h 2005-10-10 17:34:05.000000000 +0200 ++++ alliance-5.0/nero/src/MDefs.h 2008-03-19 01:08:24.000000000 +0100 +@@ -25,6 +25,8 @@ + + + # include "UDefs.h" ++# include ++# include + + + +diff -Nur alliance-5.0.old/ocp/src/placer/PPlacement.h alliance-5.0/ocp/src/placer/PPlacement.h +--- alliance-5.0.old/ocp/src/placer/PPlacement.h 2006-03-30 21:07:47.000000000 +0200 ++++ alliance-5.0/ocp/src/placer/PPlacement.h 2008-03-19 01:10:41.000000000 +0100 +@@ -43,6 +43,7 @@ + #include + #include + #include ++#include + using namespace std; + + #include "mut.h" +diff -Nur alliance-5.0.old/sea/src/DEF_grammar_lex.l alliance-5.0/sea/src/DEF_grammar_lex.l +--- alliance-5.0.old/sea/src/DEF_grammar_lex.l 2002-04-25 18:16:20.000000000 +0200 ++++ alliance-5.0/sea/src/DEF_grammar_lex.l 2008-03-19 01:11:28.000000000 +0100 +@@ -18,7 +18,7 @@ + # define yylineno DEF_grammarlineno + + +- int yylineno = 1; ++ // int yylineno = 1; + + + static int yywrap(void); diff --git a/alliance-tutorials.patch b/alliance-tutorials.patch deleted file mode 100644 index 4675c27..0000000 --- a/alliance-tutorials.patch +++ /dev/null @@ -1,690 +0,0 @@ -diff -Naur documentation/tutorials/place_and_route/tex/place_and_route.tex tutorials/place_and_route/tex/place_and_route.tex ---- documentation/tutorials/place_and_route/tex/place_and_route.tex 2004-10-16 14:51:56.000000000 +0200 -+++ tutorials/place_and_route/tex/place_and_route.tex 2007-08-02 18:37:05.000000000 +0200 -@@ -2,6 +2,7 @@ - % $Id: place_and_route.tex,v 1.5 2004/10/16 12:51:56 fred Exp $ - % $Log: place_and_route.tex,v $ - % Revision 1.5 2004/10/16 12:51:56 fred -+% Modified by Chitlesh GOORAH for Alliance release 5.0 (18/07/2007) - % Erasing the psfig include from the file, changed the font to 10 pt - % instead of 12 (sparing trees and not being payed by the thickness of - % my production) and changing font to charter since I got tired of -@@ -11,14 +12,14 @@ - \documentclass{article} - \usepackage[dvips]{graphics} - \usepackage[english]{babel} --\usepackage{doublespace} -+\usepackage{setspace} - \usepackage{epsf} - \usepackage{fancybox} - \usepackage{fancyheadings} - \usepackage{float} - \usepackage{graphicx} - \usepackage{here} --\usepackage{isolatin1} -+\usepackage[latin1]{inputenc} - \usepackage{charter} - \usepackage{picinpar} - \usepackage{rotate} -@@ -92,7 +93,8 @@ - \date{} - \author{ - Frederic AK\hspace{2cm} Kai-shing LAM\\ --Modified by LJ -+Modified by LJ\\ -+Modified by Chitlesh GOORAH (18/07/2007) - } - - \maketitle -@@ -121,7 +123,7 @@ - - {2.2} inverter Diagram - --{2.3} Buffer diagram -+{2.3} Buffer diagram - - {2.4} sxlib gauge - -@@ -149,8 +151,8 @@ - - {3.8} pads placement - \\ --{4} {\bf Annexes} -- -+{4} {\bf Annexes} -+ - \newpage - {\huge - PART 3 : } -@@ -158,9 +160,9 @@ - {\huge - Place and route - } -- -+ - All the files used in this part are located under \\ --\texttt{/tutorial/place\_and\_route/src} directory.\\ -+\texttt{/usr/share/doc/alliance-doc-5.0/tutorial/place\_and\_route/src} directory.\\ - This directory contents three subdirectories and one Makefile : - - \begin{itemize}\itemsep=-.8ex -@@ -169,7 +171,7 @@ - \item inv - \begin{itemize}\itemsep=-.8ex - \item Makefile -- \item inv.vbe : behavioral description -+ \item inv.vbe : behavioral description - \item inv\_x1.ap : inverter cell design using GRAAL - \end{itemize} - \item buffer -@@ -178,7 +180,7 @@ - \item buffer.vbe : behavioral description - \item buf\_x2.ap : buffer cell design using GRAAL - \end{itemize} --\item amd2901 -+\item amd2901 - \begin{itemize}\itemsep=-.8ex - \item Makefile - \item amd2901\_ctl.vbe : behavioral description of control -@@ -212,9 +214,9 @@ - The predefined cells concepts, model and - hierarchy will be introduced .\\ - Then this tutorial contain the methodology used in Alliance to produce --the amd2901 physical layout that you conceived in Alliance Tutorial -+the amd2901 physical layout that you conceived in Alliance Tutorial - PART 2 "Synthesis" (All the documents used will be provided to you). -- -+ - \newpage - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -@@ -225,7 +227,7 @@ - %------------------------ - The library can be enriched by new cells with {\bf GRAAL} editor .\\ - { \bf GRAAL } is an editor of \/{\underline{symbolic }} {\it --layout} integrating the drawing rules checker {\bf DRUC} and also -+layout} integrating the drawing rules checker {\bf DRUC} and also - a net extractor. - The first part here aims to draw an inverter cell inv\_x1 in the shape - of a predefined cell of sxlib complyiant with provided -@@ -236,7 +238,7 @@ - Some tools of Alliance use a particular technological - environment. It is indicated by the environment variable {\bf - RDS\_TECHNO\_NAME} which must be set to --{\bf/alliance/etc/cmos.rds} -+{\bf/etc/alliance/cmos.rds} - - \subsubsection{GRAAL} - %-------------------- -@@ -244,7 +246,7 @@ - with the menu { \bf CREATE }: - \begin{itemize}\itemsep=-.4ex - \item The ''instance'' (physical cells importation) --\item The abutment boxes which define the cell limits -+\item The abutment boxes which define the cell limits - \item Segments: DiffN, DiffP, Poly, Alu1, Alu2... CAluX is used to specify - a possible rectangle area for the connectors. - \item VIAs or contacts: ContDiffN, ContDiffP, ContPoly and -@@ -254,10 +256,10 @@ - \end{itemize} - - {\bf GRAAL} uses the environment variable {\bf --GRAAL\_TECHNO\_NAME}. It must be set to {\bf/alliance/etc/cmos.graal}. -+GRAAL\_TECHNO\_NAME}. It must be set to {\bf/etc/alliance/cmos.graal}. - - Steps to follow to create a sxlib cell by respecting the sxlib gauge : --( cf 2.4 Sxlib gauge ) -+( cf 2.4 Sxlib gauge ) - \begin{itemize}\itemsep=-.4ex - \item place the supply Vdd and Vss using the menu CREATE->Segment - \item place the VIAs using the menu CREATE->VIA -@@ -267,7 +269,7 @@ - \item link the transistor P and the transistor N with the Poly segment using the menu CREATE->Segment - \item supply each transistor by linking them with Ndiff and Pdiff segments and VIAs contacts - \item define the cell limit with an abutment box using the menu CREATE->Abutment Box --\end{itemize} -+\end{itemize} - - \subsubsection{COUGAR} - %-------------------- -@@ -276,7 +278,7 @@ - with the format { \bf ap }. - To extract a netlist at transistor level, use the following command : - \begin{commandline} -- > cougar -t file1 file2 -+ > cougar -t file1 file2 - \end{commandline} - - { \bf COUGAR } uses the environment variables { \bf MBK\_IN\_PH } -@@ -286,14 +288,14 @@ - the following environment variables: \\ - - \begin{commandline} -- > MBK_IN_PH = ap -- > export MBK_IN_PH -- > MBK_OUT_LO = spi -+ > MBK_IN_PH = ap -+ > export MBK_IN_PH -+ > MBK_OUT_LO = spi - > export MBK_OUT_LO - \end{commandline} - - \begin{commandline} -- > cougar -t circuit circuit -+ > cougar -t circuit circuit - \end{commandline} - - The resulting spice netlist can be then simulated using a SPICE simulator and a given -@@ -301,7 +303,7 @@ - - The schematic of the transistor neltlist can also be displayed using {\bf XSCH} : - \begin{commandline} -- > xsch -I spi -l circuit -+ > xsch -I spi -l circuit - \end{commandline} - - \subsection{inverter Diagram} -@@ -341,12 +343,12 @@ - - \begin{itemize}\itemsep=-.4ex - \item The sxlib cells have whole 50 lambdas height and a multiple of 5 lambdas width. --\item The supply Vdd and Vss are carried out in Calu1; they have 6 lambdas width and are -+\item The supply Vdd and Vss are carried out in Calu1; they have 6 lambdas width and are - horizontally placed in top and bottom of the cell. - \item The transistors P are placed close to the Vdd while transistors N are placed close - to the Vss. - \item Box N must have 24 lambdas height . --\item The special segments CAluX (CAlu1, Calu2, CAlu3...) form the cell interface (PORT\_MAP) -+\item The special segments CAluX (CAlu1, Calu2, CAlu3...) form the cell interface (PORT\_MAP) - and play the role of ''flat'' connectors. They must be placed on a 5x5 grid and can be anywhere in the cell. - \item The special segments TAlux (TAlu1, TAlu2...) are used to indicate the obstacles for the - router. When you want to protect AluX segment, it is necessary to cover them -@@ -356,7 +358,7 @@ - \item The boxes N and P must be polarized. { \bf It should be respectively connected to Vdd and Vss }. - \end{itemize} - --You will find a summary of these constraints on the diagram -+You will find a summary of these constraints on the diagram - \ref{Fig:gabarit}: - - \begin{figure}[H]\centering -@@ -443,7 +445,7 @@ - \begin{itemize}\itemsep=-.4ex - \item The data-path contains the regular parts of Amd2901, the registers - and the arithmetic logic unit. --\item The control part contains irregular logic, -+\item The control part contains irregular logic, - the instructions decoding and the `` flags '' computation. - \end{itemize} - -@@ -463,7 +465,7 @@ - The data-path and the control part will be placed and routed together and not separately. \\ - You will use also {\bf lvx}, the netlists comparator. When the - system is too complex it is difficult to use {\bf proof}, the --formal comparator (calculations too long). A netlists comparison -+formal comparator (calculations too long). A netlists comparison - then is used. Test the two methods ({\bf proof} and {\bf - lvx}). - -@@ -499,7 +501,7 @@ - %--------------------------------- - - Generally, the file describing a netlist must have the same --name as the one describing its physical layout -+name as the one describing its physical layout - (but of course the file extention is not the same). - The file amd2901\_dpt.vst (LOFIG) must correspond to the file - amd2901\_dpt.ap (PHFIG). The same applies to the file -@@ -517,7 +519,7 @@ - \noindent GENLIB\_SAVE\_LOFIG()\\ - - This permits to generate a structural description in a { \bf --VST } file. At the same time, { \bf genlib } will generate -+VST } file. At the same time, { \bf genlib } will generate - physical descriptions of each column in { \bf AP } files. - It is up to you to place these columns explicitly. \\ - Edit again the file amd2901\_dpt.c and include the lines :\\ -@@ -526,7 +528,7 @@ - \noindent /* add here you placement directives !! */ \\ - \noindent GENLIB\_SAVE\_PHFIG()\\ - --For this placement task, you have the following {\bf GENLIB} functions : -+For this placement task, you have the following {\bf GENLIB} functions : - - \begin{itemize}\itemsep=-.4ex - \item GENLIB\_PLACE() -@@ -540,12 +542,12 @@ - \end{itemize} - - Use {\bf GENLIB} manual. The placement of the data-path columns --should not be done randomly. The routing feasibility and the quality -+should not be done randomly. The routing feasibility and the quality - of the resulting layout depends on it !\\ - - Use genlib to generate all: - \begin{commandline} -- >genlib amd2901_dpt -+ >genlib amd2901_dpt - \end{commandline} - - The figure \ref{Fig:preplacement} summarizes the followed process: -@@ -568,12 +570,12 @@ - %--------------------------------- - - In the same manner, edit agin the file amd2901\_core.c and insert -- data-path explicitly. You should not place the part controls. -+ data-path explicitly. You should not place the part controls. - This one exists only in the form of a structural description. --It is the placer { \bf ocp } that will undertake some -+It is the placer { \bf ocp } that will undertake some - (during the placement of the heart { \bf ocp } detects which are the --cells not placed and supplements the placement). --Nevertheless you should reserve enough space for the cells placement -+cells not placed and supplements the placement). -+Nevertheless you should reserve enough space for the cells placement - { \bf to the top } of the data-path. - - Include the lines:\\ -@@ -583,28 +585,28 @@ - - Space necessary to the placer to place the cells of the control part - will be determined by successive approximations. You will have to --adjust dimensions of the heart abutment box -+adjust dimensions of the heart abutment box - (GENLIB\_DEF\_AB()). - Use the command: - - \begin{commandline} -- > genlib amd2901_core -+ > genlib amd2901_core - \end{commandline} - - and - \begin{commandline} -- > ocp -partial amd2901_core -ioc amd2901_core amd2901_core amd2901_core_p -+ > ocp -partial amd2901_core -ioc amd2901_core amd2901_core amd2901_core_p - \end{commandline} - - The option {\bf -- partial} indicates that you give a partial --placement of the data-path. -+placement of the data-path. - The option { \bf -- ioc } permits to specify a placement for external --connectors described in a .ioc file. --This file, amd2901\_core.ioc is provided to you (Modify it according -+connectors described in a .ioc file. -+This file, amd2901\_core.ioc is provided to you (Modify it according - to your predefined placement. - The connectors must be in the north and in the south of your circuit). - --The third argument is the netlist heart filename, the fourth is the -+The third argument is the netlist heart filename, the fourth is the - name of the { \bf .ap } resulting file. - - The figure \ref{Fig:placement} summarize the followed process: -@@ -620,7 +622,7 @@ - Routing the heart by using { \bf NERO } in the following way: - - \begin{commandline} -- > nero -v -3 -p amd2901_core_p amd2901_core amd2901_core -+ > nero -v -3 -p amd2901_core_p amd2901_core amd2901_core - \end{commandline} - - %The option { \bf -- place } indicates that you transmit a placement, that of the heart. -@@ -639,10 +641,10 @@ - \subsection{pads placement} - %--------------------------------- - --The core of the AMD2001 is completed. -+The core of the AMD2001 is completed. - We focus now on the chip with pads description, placement and routing. - Those pads allow the connection of the inputs/outputs of the core with --the external nets of the chip. -+the external nets of the chip. - - The tool {\bf ring} instanciates pads that has been specified - in a {\bf vst} netlist, place them using a file { \bf .rin } -@@ -662,7 +664,7 @@ - Name it `` amd2902\_chip.rin '' and apply the command \\ - - \begin{commandline} -- > ring amd2901_chip amd2901_chip -+ > ring amd2901_chip amd2901_chip - \end{commandline} - - We will validate the work of {\bf ring} with the tools { \bf druc -@@ -682,7 +684,7 @@ - > cougar -f amd2901_chip - \end{commandline} - --Compare two netlists : -+Compare two netlists : - \begin{commandline} - > lvx vst al amd2901_chip amd2901_chip -f - \end{commandline} -@@ -698,7 +700,7 @@ - the circuit on the level transistor: \\ - - \begin{commandline} --> cougar -t amd2901_chip amd2901_chip -+> cougar -t amd2901_chip amd2901_chip - \end{commandline} - \\ - -@@ -706,7 +708,7 @@ - \begin{commandline} - > make view_ctl_logic - \end{commandline} -- -+ - If you want to see the data-path physical layout: - \begin{commandline} - > make view_dpt_physic -@@ -723,7 +725,7 @@ - \begin{commandline} - > make view_chip_simulation - \end{commandline} -- -+ - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - %\newpage - -diff -Naur documentation/tutorials/simulation/tex/simulation.tex tutorials/simulation/tex/simulation.tex ---- documentation/tutorials/simulation/tex/simulation.tex 2004-10-16 14:52:05.000000000 +0200 -+++ tutorials/simulation/tex/simulation.tex 2007-07-18 15:47:13.000000000 +0200 -@@ -2,6 +2,7 @@ - % $Id: simulation.tex,v 1.5 2004/10/16 12:52:05 fred Exp $ - % $Log: simulation.tex,v $ - % Revision 1.5 2004/10/16 12:52:05 fred -+% Modified by Chitlesh GOORAH for Alliance release 5.0 (18/07/2007) - % Erasing the psfig include from the file, changed the font to 10 pt - % instead of 12 (sparing trees and not being payed by the thickness of - % my production) and changing font to charter since I got tired of -@@ -13,13 +14,13 @@ - \documentclass{article} - \usepackage[dvips]{graphics} - \usepackage[english]{babel} --\usepackage{doublespace} -+\usepackage{setspace} - \usepackage{fancybox} - \usepackage{fancyheadings} - \usepackage{float} - \usepackage{graphicx} - \usepackage{here} --\usepackage{isolatin1} -+\usepackage[latin1]{inputenc} - \usepackage{charter} - \usepackage{picinpar} - \usepackage{rotate} -@@ -96,7 +97,8 @@ - \date{} - - \author{Frederic AK \hspace{2cm} Kai-shing LAM\\ --Modified by LJ -+Modified by LJ\\ -+Modified by Chitlesh GOORAH (18/07/2007) - } - - \maketitle -@@ -171,7 +173,7 @@ - } - - All the files used in this part are located in the \\ --\texttt{/tutorial/simulation/src} directory.\\ -+\texttt{/usr/share/doc/alliance-doc-5.0/tutorial/simulation/src} directory.\\ - This directory contains two subdirectories and one Makefile : - \begin{itemize} - \item The Makefile allows you to validate automatically the entire simulation part -@@ -626,13 +628,13 @@ - \bf SXLIB }. For the functionality of the various cells and their - interface, the sxlib man is available. The behavioral - description of each cell is present in \\ --{\bf /alliance/cells/sxlib }. -+{\bf \$ALLIANCE\_TOP/cells/sxlib }. - - You must set the environment variable { \bf MBK\_CATA\_LIB } - to be able to reach these cells. - - \begin{commandline} -- > MBK_CATA_LIB=/alliance/cells/sxlib -+ > MBK_CATA_LIB=$ALLIANCE_TOP/cells/sxlib - > export MBK_CATA_LIB - \end{commandline} - -diff -Naur documentation/tutorials/start/start.tex tutorials/start/start.tex ---- documentation/tutorials/start/start.tex 2004-10-16 14:52:13.000000000 +0200 -+++ tutorials/start/start.tex 2007-07-18 13:28:50.000000000 +0200 -@@ -4,12 +4,13 @@ - % Original Version 1.0 in text form by Francois Pecheux - % Version for Alliance releases 2.0 and up by Frederic Petrot - % Modified by czo for Alliance release 4.0 (01/2000) --% TODO : no fully working, needs some adjustements -+% Modified by Chitlesh GOORAH for Alliance release 5.0 (18/07/2007) -+% TODO : no fully working, needs some adjustments - % $Id: start.tex,v 1.5 2004/10/16 12:52:13 fred Exp $ - % - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \documentclass{article} --\usepackage{charter,doublespace,here,fancybox} -+\usepackage{charter,setspace,here,fancybox} - \textwidth 15cm - \textheight 23cm - \oddsidemargin +0.75cm -@@ -20,7 +21,7 @@ - % Since it is tt, any char is fine - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \newlength{\verbatimbox} --\settowidth{\verbatimbox}{\scriptsize\tt -+\settowidth{\verbatimbox}{\scriptsize\tt - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - } - \newenvironment{framedverbatim} -@@ -33,8 +34,8 @@ - \begin{Sbox}\begin{minipage}{.979\textwidth}\begin{Verbatim}}% - {\end{Verbatim}\end{minipage}\end{Sbox}\setlength{\shadowsize}{2pt}% - \shadowbox{\TheSbox}\normalsize\par\noindent} -- -- -+ -+ - - %%%%%%%%%%%%%%%%%%%%%%%% - % -@@ -56,9 +57,9 @@ - \begin{quote} - \em - These tutorials introduce the design flow to be used in the --\textbf{Alliance} CAD framework for the design and verification of a -+\textbf{Alliance} CAD framework for the design and verification of a - standard cells circuit, including the pads. --Each step of the desgin flow is supported by one or more specific -+Each step of the desgin flow is supported by one or more specific - tools, whose use is briefly explained in the tutorials. - - These texts are meant to be simple and comprehensive, and are to be used -@@ -77,7 +78,7 @@ - proceeding, as it describes the main steps of the design conceptually. - - \section{Before starting} --In those tutorials you will learn the practical use of the following -+In those tutorials you will learn the practical use of the following - \textbf{Alliance} tools : - - In the first tutorial (simulation/ directory) : -@@ -103,30 +104,32 @@ - In the third tutorial (synthesis/ directory) : - \begin{itemize} - \item \textbf{syf} : Finite state machine synthesizer. --\item \textbf{boom} : Boolean optimization of a logic level behavioral -+\item \textbf{boom} : Boolean optimization of a logic level behavioral - description (VHDL data flow). --\item \textbf{boog} : Mapping of a behavioral descriptiononto a standard cell -+\item \textbf{boog} : Mapping of a behavioral descriptiononto a standard cell - library. --\item \textbf{loon} : Fanout optimizer, global optimizer and timing analyser of -+\item \textbf{loon} : Fanout optimizer, global optimizer and timing analyser of - \item \textbf{scapin} : Scan Path insertion - \item \textbf{xsch} : Graphical schematic viewer. - \end{itemize} - --If you run a \texttt{c-like} shell, like \texttt{csh} or \texttt{tcsh}, -+If you run a \texttt{c-like} shell, like \texttt{csh} or \texttt{tcsh}, - try to run the following command : - - \begin{phraseverbatim} --~alp/addaccu %-) source /alliance/etc/alc_env.csh -+~alp/addaccu %-) source /etc/profile.d/alc_env.csh - \end{phraseverbatim} - --Otherwise, if you run a \texttt{sh-like} shell, try to run the following -+Otherwise, if you run a \texttt{sh-like} shell, try to run the following - command : - \begin{phraseverbatim} --~alp/addaccu %-) source /alliance/alc_env.sh -+~alp/addaccu %-) source /etc/profile.d/alc_env.sh - \end{phraseverbatim} - \\ -+When a user logs in, these environment variables are automatically set from various places. -+\\ - Before we proceed to the tutorial, you must make sure that the --\textbf{Alliance} tools are readilly available when invoking them at the -+\textbf{Alliance} tools are readilly available when invoking them at the - prompt. - The prompt in represented in the following text by the symbol~: - \begin{phraseverbatim} -@@ -136,7 +139,7 @@ - directory, and \texttt{\%-)} is supposed to give us courage! - - \section{Execution environment set up} --Later, before you will start examining alliance tools, you will probably want -+Later, before you will start examining alliance tools, you will probably want - to know the environment variables setup. - To see it, please enter the following command : - -@@ -147,18 +150,21 @@ - \begin{figure}[H]\center\leavevmode - \begin{framedverbatim} - ~alp/addaccu %-) env | grep MBK --MBK_OUT_PH=ap --MBK_CATAL_NAME=CATAL -+MBK_IN_PH=ap - MBK_SCALE_X=100 -+MBK_CATAL_NAME=CATAL -+MBK_OUT_PH=ap -+MBK_OUT_LO=vst - MBK_VSS=vss --MBK_CATA_LIB=.:/alliance/cells/sxlib:/alliance/cells/padlib --MBK_WORK_LIB=. --MBK_VDD=vdd - MBK_C4_LIB=./cellsC4 -+MBK_VDD=vdd -+MBK_TARGET_LIB=\$ALLIANCE\_TOP/cells/sxlib - MBK_IN_LO=vst --MBK_IN_PH=ap --MBK_TARGET_LIB=/alliance/cells/sxlib --MBK_OUT_LO=vst -+MBK_WORK_LIB=. -+MBK_CATA_LIB=.:/usr/lib/alliance/cells/sxlib:/usr/lib/alliance/cells/dp_sxlib: -+/usr/lib/alliance/cells/rflib:/usr/lib/alliance/cells/ramlib: -+/usr/lib/alliance/cells/romlib:/usr/lib/alliance/cells/pxlib: -+/usr/lib/alliance/cells/padlib - \end{framedverbatim} - \caption{\label{mbk} \texttt{MBK} environment variables.} - \end{figure} -@@ -167,12 +173,12 @@ - variables are documented in each tutorial. - - \section{File Formats} --One of the interesting features of \textbf{Alliance} is that different -+One of the interesting features of \textbf{Alliance} is that different - file formats can be used for both netlist and layout view. --However, --in the design methodology we wish to promote, some formats are -+However, -+in the design methodology we wish to promote, some formats are - recommended. --The \texttt{vst}, structural \textbf{VHDL}, is dedicated to netlist -+The \texttt{vst}, structural \textbf{VHDL}, is dedicated to netlist - specification. - The \texttt{al} format is dedicated to extracted layout representation. - The \texttt{ap} format is the usual layout format. -diff -Naur documentation/tutorials/synthesis/src/amd2901/Makefile tutorials/synthesis/src/amd2901/Makefile ---- documentation/tutorials/synthesis/src/amd2901/Makefile 2002-07-25 14:50:18.000000000 +0200 -+++ tutorials/synthesis/src/amd2901/Makefile 2007-07-18 19:34:53.000000000 +0200 -@@ -2,17 +2,17 @@ - all: EXAMPLE VAR CATAL02 res.pat - - --VAR: -+VAR: - MBK_IN_LO=vst;export MBK_IN_LO ;\ -- MBK_CATA_LIB=/asim/alliance/cells/sxlib;export MBK_CATA_LIB -+ MBK_CATA_LIB=$ALLIANCE_TOP/cells/sxlib;export MBK_CATA_LIB - - CATAL01: -- echo amd2901_ctl C >CATAL -+ echo amd2901_ctl C >CATAL - echo amd2901_dpt C >>CATAL - - CATAL02: - echo amd2901_dpt C >CATAL -- -+ - EXAMPLE: - genlib circuit - -@@ -38,7 +38,7 @@ - - res2.pat: amd2901_chip.vst pattern.pat amd2901_core.vst CATAL - asimut amd2901_chip pattern res2 -- touch amd2901_chip.vst -+ touch amd2901_chip.vst - - clean : - rm -f Makefile-* \ -diff -Naur documentation/tutorials/synthesis/tex/synthesis.tex tutorials/synthesis/tex/synthesis.tex ---- documentation/tutorials/synthesis/tex/synthesis.tex 2004-10-16 14:52:17.000000000 +0200 -+++ tutorials/synthesis/tex/synthesis.tex 2007-07-18 15:46:54.000000000 +0200 -@@ -2,6 +2,7 @@ - % $Id: synthesis.tex,v 1.4 2004/10/16 12:52:17 fred Exp $ - % $Log: synthesis.tex,v $ - % Revision 1.4 2004/10/16 12:52:17 fred -+% Modified by Chitlesh GOORAH for Alliance release 5.0 (18/07/2007) - % Erasing the psfig include from the file, changed the font to 10 pt - % instead of 12 (sparing trees and not being payed by the thickness of - % my production) and changing font to charter since I got tired of -@@ -11,13 +12,13 @@ - \documentclass{article} - \usepackage[dvips]{graphics} - \usepackage[english]{babel} --\usepackage{doublespace} -+\usepackage{setspace} - \usepackage{fancybox} - \usepackage{fancyheadings} - \usepackage{float} - \usepackage{graphicx} - \usepackage{here} --\usepackage{isolatin1} -+\usepackage[latin1]{inputenc} - \usepackage{charter} - \usepackage{picinpar} - \usepackage{rotate} -@@ -89,7 +90,8 @@ - \date{} - \author{ - Ak Frederic\hspace{2cm} Lam Kai-shing\\ --Modified by LJ -+Modified by LJ\\ -+Modified by Chitlesh GOORAH (18/07/2007) - } - - \maketitle -@@ -220,7 +222,7 @@ - } - - All the files used in this part are located under \\ --\texttt{/tutorial/synthesis/src} directory.\\ -+\texttt{/usr/share/doc/alliance-doc-5.0/tutorial/synthesis/src} directory.\\ - This directory contents four subdirectories and one Makefile : - \begin{itemize}\itemsep=-.8ex - diff --git a/alliance.spec b/alliance.spec index ece4906..3c81939 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 12.%{snapshot}snap%{?dist} +Release: 13.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -289,13 +289,13 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog -* Fri Mar 21 2008 Chitlesh Goorah - 5.0-12.20070718snap +* Fri Mar 21 2008 Chitlesh Goorah - 5.0-13.20070718snap - Requiring new FEL menu structure - Fixing previous desktop files - closing unconfirmed bug #427691 - fixing multilibs issues #340621 -* Tue Mar 18 2008 Thibault North < tnorth [AT] fedoraproject DOT org> - 5.0-11.20070718snap +* Tue Mar 18 2008 Thibault North < tnorth [AT] fedoraproject DOT org> - 5.0-13.20070718snap - dropped patch4: alliance-tutorials.patch - fixed TexLive related issues for documentation - commenting previous make in directory tutorials @@ -304,6 +304,13 @@ touch --no-create %{_datadir}/icons/hicolor || : - added patch4: including more useful includes to C files - fixed bug #434020 : alliance failed massrebuild attempt for GCC4.3 +* Mon Feb 18 2008 Fedora Release Engineering - 5.0-12.20070718snap +- Autorebuild for GCC 4.3 + +* Sun Feb 10 2008 Chitlesh Goorah - 5.0-11.20070718snap +- mass rebuild for gcc43 on rawhide +- ensuring multilibs (#340621) + * Thu Aug 23 2007 Chitlesh Goorah - 5.0-10.20070718snap - complying to freedesktop policies - categories diff --git a/sources b/sources index 5716e50..6d91a0b 100644 --- a/sources +++ b/sources @@ -1 +1,2 @@ 917f4493c09f6f5c49d5a606a5e9bbd8 alliance-5.0-20070718.tar.gz +32cac3116f85713aec2e1e18379811eb alliance-5.0-tutorials.tar.bz2 From 18df3b1e8f5ccbd8e13d5e217813887d50d20c54 Mon Sep 17 00:00:00 2001 From: Thibault North Date: Mon, 26 May 2008 12:44:22 +0000 Subject: [PATCH 09/85] Adds alliance into the Electronics category --- alliance.spec | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 3c81939..c5c4c6e 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 13.%{snapshot}snap%{?dist} +Release: 14.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -200,6 +200,7 @@ find %{buildroot} -name '*.la' -exec rm -f {} ';' for desktopfile in *.desktop; do desktop-file-install --vendor fedora \ --add-category Engineering \ + --add-category Electronics \ --remove-category Science \ --dir %{buildroot}%{_datadir}/applications/ \ $desktopfile @@ -289,6 +290,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Tue May 20 2008 Thibault North < tnorth [AT] fedoraproject DOT org> - 5.0-14.20070718snap +- Add to Electronics Menu + * Fri Mar 21 2008 Chitlesh Goorah - 5.0-13.20070718snap - Requiring new FEL menu structure - Fixing previous desktop files From ff15efa9b2103ee230889bcd4767976e1e328dcb Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Mon, 26 May 2008 21:04:55 +0000 Subject: [PATCH 10/85] bugfix --- alliance-env.patch | 159 +++++++++++++-------------------------------- alliance.spec | 11 +++- 2 files changed, 54 insertions(+), 116 deletions(-) diff --git a/alliance-env.patch b/alliance-env.patch index 2ddf663..5573c9e 100644 --- a/alliance-env.patch +++ b/alliance-env.patch @@ -1,131 +1,64 @@ -diff -Naur distrib/etc/alc_env.csh.in etc/alc_env.csh.in ---- distrib/etc/alc_env.csh.in 2006-10-05 12:09:24.000000000 +0200 -+++ etc/alc_env.csh.in 2007-08-18 13:48:55.000000000 +0200 -@@ -1,4 +1,4 @@ --# -*- Mode: Shell-script -*- -+# -*- Mode: Shell-script -*- - # -*- vim: set filetype=csh: -*- - # ,,, - # (o o) -@@ -28,17 +28,17 @@ - setenv MBK_OUT_LO vst - setenv MBK_IN_PH ap - setenv MBK_OUT_PH ap -- -+ - setenv MBK_WORK_LIB . - setenv MBK_CATAL_NAME CATAL -- -+ - setenv MBK_SCALE_X 100 -- -+ - setenv VH_MAXERR 10 - setenv VH_BEHSFX vbe - setenv VH_PATSFX pat - setenv VH_DLYSFX dly -- -+ - setenv MBK_CATA_LIB ".:${ALLIANCE_TOP}/cells/sxlib" - setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${ALLIANCE_TOP}/cells/dp_sxlib" - setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${ALLIANCE_TOP}/cells/rflib" -@@ -48,42 +48,29 @@ - setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${ALLIANCE_TOP}/cells/pxlib" - setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${ALLIANCE_TOP}/cells/padlib" - setenv MBK_TARGET_LIB "${ALLIANCE_TOP}/cells/sxlib" -- setenv MBK_C4_LIB ./cellsC4 -- -+ setenv MBK_C4_LIB ./cellsC4 -+ - setenv MBK_VDD vdd - setenv MBK_VSS vss -- -+ - setenv XPAT_PARAM_NAME "${ALLIANCE_TOP}/etc/xpat.par" - setenv XFSM_PARAM_NAME "${ALLIANCE_TOP}/etc/xfsm.par" - setenv XSCH_PARAM_NAME "${ALLIANCE_TOP}/etc/xsch.par" -- -+ - setenv RDS_IN cif - setenv RDS_OUT cif -- -+ - setenv DREAL_TECHNO_NAME "${ALLIANCE_TOP}/etc/cmos.dreal" - setenv GRAAL_TECHNO_NAME "${ALLIANCE_TOP}/etc/cmos.graal" - setenv GENVIEW_TECHNO_NAME "${ALLIANCE_TOP}/etc/cmos.genview" -- -+ - setenv RDS_TECHNO_NAME "${ALLIANCE_TOP}/etc/cmos.rds" - setenv ELP_TECHNO_NAME "${ALLIANCE_TOP}/etc/prol.elp" - - +--- distrib/etc/alc_env.csh.in 2006-10-05 12:09:25.000000000 +0200 ++++ etc/alc_env.csh.in 2008-05-26 22:37:15.000000000 +0200 +@@ -70,20 +70,23 @@ + # System environment variables. -- if ( $?PATH ) then + if ( $?PATH ) then - setenv PATH "${ALLIANCE_TOP}/bin:$PATH" -- else -- setenv PATH "${ALLIANCE_TOP}/bin" -- endif -- --# Only needed on Solaris (included in /etc/ld.so.conf under Linux). -- if ( $?LD_LIBRARY_PATH ) then ++ setenv PATH "$PATH:${ALLIANCE_TOP}/bin:" + else + setenv PATH "${ALLIANCE_TOP}/bin" + endif + + # Only needed on Solaris (included in /etc/ld.so.conf under Linux). + if ( $?LD_LIBRARY_PATH ) then - setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib:$LD_LIBRARY_PATH" -- else -- setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib" -- endif -- ++ setenv LD_LIBRARY_PATH "$LD_LIBRARY_PATH:${ALLIANCE_TOP}/lib:" + else + setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib" + endif + - if ( $?MANPATH ) then - setenv MANPATH "${ALLIANCE_TOP}/man:${MANPATH}" -- else -- setenv MANPATH "${ALLIANCE_TOP}/man" -- endif -+ setenv PATH "${PATH}:${ALLIANCE_TOP}/bin" ++ if ($?MANPATH) then + setenv MANPATH "${MANPATH}:${ALLIANCE_TOP}/man" + else +- setenv MANPATH "${ALLIANCE_TOP}/man" ++ setenv MANPATH "${ALLIANCE_TOP}/man" + endif + +# fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. + setenv MBK_SPI_MODEL "${ALLIANCE_TOP}/etc/spimodel.cfg" -diff -Naur distrib/etc/alc_env.sh.in etc/alc_env.sh.in ---- distrib/etc/alc_env.sh.in 2006-10-05 12:09:24.000000000 +0200 -+++ etc/alc_env.sh.in 2007-08-18 13:47:04.000000000 +0200 -@@ -1,4 +1,4 @@ --# -*- Mode: Shell-script -*- -+# -*- Mode: Shell-script -*- - # -*- vim: set filetype=sh: -*- - # ,,, - # (o o) -@@ -24,7 +24,7 @@ - - # Alliance environment variables. - MBK_IN_LO=vst; export MBK_IN_LO -- MBK_OUT_LO=vst; export MBK_OUT_LO -+ MBK_OUT_LO=vst; export MBK_OUT_LO - MBK_IN_PH=ap; export MBK_IN_PH - MBK_OUT_PH=ap; export MBK_OUT_PH - -@@ -70,20 +70,8 @@ - - +--- distrib/etc/alc_env.sh.in 2006-10-05 12:09:25.000000000 +0200 ++++ etc/alc_env.sh.in 2008-05-26 22:41:30.000000000 +0200 +@@ -70,20 +70,23 @@ + + # System environment variables. - PATH=$ALLIANCE_TOP/bin:$PATH -- export PATH -+ export PATH=$PATH:$ALLIANCE_TOP/bin -+ export MANPATH=$MANPATH:$ALLIANCE_TOP/man - --# Only needed on Solaris (included in /etc/ld.so.conf under Linux). -- if [ -z "${LD_LIBRARY_PATH}" ]; then -- LD_LIBRARY_PATH=$ALLIANCE_TOP/lib -- else ++ PATH=$PATH:$ALLIANCE_TOP/bin: + export PATH + + # Only needed on Solaris (included in /etc/ld.so.conf under Linux). + if [ -z "${LD_LIBRARY_PATH}" ]; then + LD_LIBRARY_PATH=$ALLIANCE_TOP/lib + else - LD_LIBRARY_PATH=$ALLIANCE_TOP/lib:$LD_LIBRARY_PATH -- fi -- export LD_LIBRARY_PATH -- -- if [ -z "${MANPATH}" ]; then -- MANPATH=$ALLIANCE_TOP/man -- else ++ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ALLIANCE_TOP/lib: + fi + export LD_LIBRARY_PATH + + if [ -z "${MANPATH}" ]; then + MANPATH=$ALLIANCE_TOP/man + else - MANPATH=$ALLIANCE_TOP/man:$MANPATH -- fi -- export MANPATH ++ MANPATH=$MANPATH:$ALLIANCE_TOP/man: + fi + export MANPATH ++ +# fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. + MBK_SPI_MODEL=$ALLIANCE_TOP/etc/spimodel.cfg; export MBK_SPI_MODEL + diff -Naur distrib/etc/Makefile.am etc/Makefile.am --- distrib/etc/Makefile.am 2002-06-25 16:09:38.000000000 +0200 +++ etc/Makefile.am 2007-08-18 13:58:38.000000000 +0200 diff --git a/alliance.spec b/alliance.spec index c5c4c6e..8a88285 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 14.%{snapshot}snap%{?dist} +Release: 15.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -43,7 +43,8 @@ BuildRequires: libXp-devel libXpm-devel libstdc++-devel flex m4 BuildRequires: transfig ghostscript Requires: %{name}-libs = %{version}-%{release} - +# 442379 +Requires(post): %{name}-libs = %{version}-%{release} %description Alliance is a complete set of free CAD tools and portable libraries for @@ -200,7 +201,7 @@ find %{buildroot} -name '*.la' -exec rm -f {} ';' for desktopfile in *.desktop; do desktop-file-install --vendor fedora \ --add-category Engineering \ - --add-category Electronics \ + --add-category Electronics \ --remove-category Science \ --dir %{buildroot}%{_datadir}/applications/ \ $desktopfile @@ -290,6 +291,10 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon May 26 2008 Chitlesh Goorah - 5.0-15.20070718snap +- Bugfix: error in postinstall scriptlet: /etc/profile.d/alc_env.sh not found #442379 +- Bugfix: /etc/profile.d/alc_env.csh assumes MANPATH is preset #440083 + * Tue May 20 2008 Thibault North < tnorth [AT] fedoraproject DOT org> - 5.0-14.20070718snap - Add to Electronics Menu From 7b21d9326a35435b2e31271fd8c8a59d299a147d Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Mon, 2 Jun 2008 19:52:32 +0000 Subject: [PATCH 11/85] bugfix path --- alliance-env.patch | 4 ++-- alliance.spec | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/alliance-env.patch b/alliance-env.patch index 5573c9e..e71751b 100644 --- a/alliance-env.patch +++ b/alliance-env.patch @@ -5,7 +5,7 @@ # System environment variables. if ( $?PATH ) then - setenv PATH "${ALLIANCE_TOP}/bin:$PATH" -+ setenv PATH "$PATH:${ALLIANCE_TOP}/bin:" ++ setenv PATH "${PATH}:${ALLIANCE_TOP}/bin:" else setenv PATH "${ALLIANCE_TOP}/bin" endif @@ -13,7 +13,7 @@ # Only needed on Solaris (included in /etc/ld.so.conf under Linux). if ( $?LD_LIBRARY_PATH ) then - setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib:$LD_LIBRARY_PATH" -+ setenv LD_LIBRARY_PATH "$LD_LIBRARY_PATH:${ALLIANCE_TOP}/lib:" ++ setenv LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:${ALLIANCE_TOP}/lib:" else setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib" endif diff --git a/alliance.spec b/alliance.spec index 8a88285..e3ec7d8 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 15.%{snapshot}snap%{?dist} +Release: 16.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -291,6 +291,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Fri May 30 2008 Chitlesh Goorah - 5.0-16.20070718snap +- Bugfix /etc/profile.d/alc_env.csh problem #449062 #448480 + * Mon May 26 2008 Chitlesh Goorah - 5.0-15.20070718snap - Bugfix: error in postinstall scriptlet: /etc/profile.d/alc_env.sh not found #442379 - Bugfix: /etc/profile.d/alc_env.csh assumes MANPATH is preset #440083 From c668645d7ef04671b06344f2345cc7f20d058f03 Mon Sep 17 00:00:00 2001 From: Aanjhan Ranganathan Date: Fri, 1 Aug 2008 14:21:51 +0000 Subject: [PATCH 12/85] Rebuilt with updated lesstif package for verifying bug #368441 --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index e3ec7d8..520eb1a 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 16.%{snapshot}snap%{?dist} +Release: 17.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -291,6 +291,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Fri Aug 01 2008 Aanjhan Ranganathan - 5.0-16.20070718snap +- Rebuild using latest lesstif-devel. For #368441 + * Fri May 30 2008 Chitlesh Goorah - 5.0-16.20070718snap - Bugfix /etc/profile.d/alc_env.csh problem #449062 #448480 From 7bcb57e1a043d7122b086a502be665f976a9a7d1 Mon Sep 17 00:00:00 2001 From: Aanjhan Ranganathan Date: Fri, 1 Aug 2008 14:42:25 +0000 Subject: [PATCH 13/85] Release name corrected. --- alliance.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 520eb1a..fdd46d0 100644 --- a/alliance.spec +++ b/alliance.spec @@ -3,7 +3,7 @@ Name: alliance Version: 5.0 -Release: 17.%{snapshot}snap%{?dist} +Release: 18.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 From f3eeece93598df1969c9f95c0d0c2a8ac69feed0 Mon Sep 17 00:00:00 2001 From: Aanjhan Ranganathan Date: Fri, 1 Aug 2008 19:31:50 +0000 Subject: [PATCH 14/85] Set patch fuzz parameter to 2 by default in spec file --- alliance.spec | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index fdd46d0..6435ea0 100644 --- a/alliance.spec +++ b/alliance.spec @@ -1,9 +1,10 @@ %define prefix %{_libdir}/%{name} %define snapshot 20070718 +%define _default_patch_fuzz 2 Name: alliance Version: 5.0 -Release: 18.%{snapshot}snap%{?dist} +Release: 19.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -293,6 +294,7 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog * Fri Aug 01 2008 Aanjhan Ranganathan - 5.0-16.20070718snap - Rebuild using latest lesstif-devel. For #368441 +- Temporarily set fuzz parameter of patch system to be 2 * Fri May 30 2008 Chitlesh Goorah - 5.0-16.20070718snap - Bugfix /etc/profile.d/alc_env.csh problem #449062 #448480 From 290950e5fd35d9c570a50df7e19e3c1b6b0278bc Mon Sep 17 00:00:00 2001 From: Aanjhan Ranganathan Date: Sun, 3 Aug 2008 19:42:43 +0000 Subject: [PATCH 15/85] Bumped release name to 20 to match changelog versions --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 6435ea0..0c86418 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 19.%{snapshot}snap%{?dist} +Release: 20.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -292,6 +292,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon Aug 04 2008 Aanjhan Ranganathan - 5.0-20.20070718snap +- Bumped release version to match changelog + * Fri Aug 01 2008 Aanjhan Ranganathan - 5.0-16.20070718snap - Rebuild using latest lesstif-devel. For #368441 - Temporarily set fuzz parameter of patch system to be 2 From 67cde3898bd3fa5f87db436f4262c5742882de83 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Mon, 15 Sep 2008 16:30:04 +0000 Subject: [PATCH 16/85] bug fix 2 --- alliance-env.patch | 15 ++++++++------- alliance.spec | 8 ++++++-- import.log | 1 + 3 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 import.log diff --git a/alliance-env.patch b/alliance-env.patch index e71751b..2281a58 100644 --- a/alliance-env.patch +++ b/alliance-env.patch @@ -5,7 +5,7 @@ # System environment variables. if ( $?PATH ) then - setenv PATH "${ALLIANCE_TOP}/bin:$PATH" -+ setenv PATH "${PATH}:${ALLIANCE_TOP}/bin:" ++ setenv PATH "${PATH}:${ALLIANCE_TOP}/bin" else setenv PATH "${ALLIANCE_TOP}/bin" endif @@ -13,7 +13,7 @@ # Only needed on Solaris (included in /etc/ld.so.conf under Linux). if ( $?LD_LIBRARY_PATH ) then - setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib:$LD_LIBRARY_PATH" -+ setenv LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:${ALLIANCE_TOP}/lib:" ++ setenv LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:${ALLIANCE_TOP}/lib" else setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib" endif @@ -24,7 +24,7 @@ + setenv MANPATH "${MANPATH}:${ALLIANCE_TOP}/man" else - setenv MANPATH "${ALLIANCE_TOP}/man" -+ setenv MANPATH "${ALLIANCE_TOP}/man" ++ setenv MANPATH ":${ALLIANCE_TOP}/man" endif + +# fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. @@ -36,7 +36,7 @@ # System environment variables. - PATH=$ALLIANCE_TOP/bin:$PATH -+ PATH=$PATH:$ALLIANCE_TOP/bin: ++ PATH=$PATH:$ALLIANCE_TOP/bin export PATH # Only needed on Solaris (included in /etc/ld.so.conf under Linux). @@ -44,15 +44,16 @@ LD_LIBRARY_PATH=$ALLIANCE_TOP/lib else - LD_LIBRARY_PATH=$ALLIANCE_TOP/lib:$LD_LIBRARY_PATH -+ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ALLIANCE_TOP/lib: ++ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ALLIANCE_TOP/lib fi export LD_LIBRARY_PATH if [ -z "${MANPATH}" ]; then - MANPATH=$ALLIANCE_TOP/man +- MANPATH=$ALLIANCE_TOP/man ++ MANPATH=:$ALLIANCE_TOP/man else - MANPATH=$ALLIANCE_TOP/man:$MANPATH -+ MANPATH=$MANPATH:$ALLIANCE_TOP/man: ++ MANPATH=$MANPATH:$ALLIANCE_TOP/man fi export MANPATH + diff --git a/alliance.spec b/alliance.spec index 0c86418..c8975c2 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 20.%{snapshot}snap%{?dist} +Release: 21.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -43,7 +43,7 @@ BuildRequires: lesstif-devel libXt-devel byacc desktop-file-utils bison BuildRequires: libXp-devel libXpm-devel libstdc++-devel flex m4 BuildRequires: transfig ghostscript -Requires: %{name}-libs = %{version}-%{release} +Requires: %{name}-libs = %{version}-%{release} # 442379 Requires(post): %{name}-libs = %{version}-%{release} @@ -292,6 +292,10 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon Sep 15 2008 Chitlesh Goorah - 5.0-21.20070718snap +- Bugfix : Alliance incorrectly mungs your path and adds the cwd to the path #459336 +- Bugfix : Latest alc_env fixes broken system man path #452645 + * Mon Aug 04 2008 Aanjhan Ranganathan - 5.0-20.20070718snap - Bumped release version to match changelog diff --git a/import.log b/import.log new file mode 100644 index 0000000..7ceab48 --- /dev/null +++ b/import.log @@ -0,0 +1 @@ +alliance-5_0-21_20070718snap_fc9:HEAD:alliance-5.0-21.20070718snap.fc9.src.rpm:1221496180 From d7271ec3af4a940213236b1b4f420040d9b4bdfe Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Sun, 2 Nov 2008 23:35:29 +0000 Subject: [PATCH 17/85] segment fault fix --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index c8975c2..da37517 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 21.%{snapshot}snap%{?dist} +Release: 22.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -292,6 +292,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon Nov 3 2008 Chitlesh Goorah - 5.0-22.20070718snap +- rebuild for F10 + * Mon Sep 15 2008 Chitlesh Goorah - 5.0-21.20070718snap - Bugfix : Alliance incorrectly mungs your path and adds the cwd to the path #459336 - Bugfix : Latest alc_env fixes broken system man path #452645 From 0f6f689e41cc57484aeaf9f680f1a58e6658a427 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Mon, 10 Nov 2008 15:03:14 +0000 Subject: [PATCH 18/85] *** empty log message *** --- alliance.spec | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/alliance.spec b/alliance.spec index da37517..2433fbd 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 22.%{snapshot}snap%{?dist} +Release: 23.%{snapshot}snap%{?dist} Summary: Alliance VLSI CAD Sytem License: GPLv2 @@ -43,7 +43,7 @@ BuildRequires: lesstif-devel libXt-devel byacc desktop-file-utils bison BuildRequires: libXp-devel libXpm-devel libstdc++-devel flex m4 BuildRequires: transfig ghostscript -Requires: %{name}-libs = %{version}-%{release} +Requires: xorg-x11-fonts-misc # 442379 Requires(post): %{name}-libs = %{version}-%{release} @@ -292,6 +292,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon Nov 10 2008 Chitlesh Goorah - 5.0-23.20070718snap +- Added Requires xorg-x11-fonts-misc to fix launch crash + * Mon Nov 3 2008 Chitlesh Goorah - 5.0-22.20070718snap - rebuild for F10 From fe8d860159e11bd19d5e3222f01b2a68cbb07e15 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Sun, 1 Feb 2009 19:25:17 +0000 Subject: [PATCH 19/85] generic bug fix --- alliance-generic.patch | 20 ++++++++++++++++++++ alliance.spec | 9 +++++++-- import.log | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 alliance-generic.patch diff --git a/alliance-generic.patch b/alliance-generic.patch new file mode 100644 index 0000000..24591b9 --- /dev/null +++ b/alliance-generic.patch @@ -0,0 +1,20 @@ +--- vbl/src/vbl_bcomp_y.y 2004-09-03 21:11:18.000000000 +0200 ++++ vbl_bcomp_y.y 2009-02-01 15:39:12.000000000 +0100 +@@ -4645,7 +4645,7 @@ + + if ( ! $1.DYNAMIC ) + { +- VexTarget = vbl_dynamicvexatom( $1.NAME, $1.LEFT, $1.RIGHT, Dynamic ); ++ VexTarget = vbl_dynamicvexatom( $1.NAME, $1.LEFT, $1.RIGHT, 0 ); + } + else + { +@@ -4903,7 +4903,7 @@ + + if ( ! $5.DYNAMIC ) + { +- VexTarget = vbl_dynamicvexatom( $5.NAME, $5.LEFT, $5.RIGHT, Dynamic ); ++ VexTarget = vbl_dynamicvexatom( $5.NAME, $5.LEFT, $5.RIGHT, 0 ); + } + else + { diff --git a/alliance.spec b/alliance.spec index 2433fbd..994b2bc 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,8 +4,8 @@ Name: alliance Version: 5.0 -Release: 23.%{snapshot}snap%{?dist} -Summary: Alliance VLSI CAD Sytem +Release: 24.%{snapshot}snap%{?dist} +Summary: VLSI EDA System License: GPLv2 Group: Applications/Engineering @@ -18,6 +18,7 @@ Patch1: alliance-examples.patch Patch2: alliance-run.patch Patch3: alliance-perms.patch Patch4: alliance-gcc43.patch +Patch5: alliance-generic.patch Source1: xsch.desktop Source2: dreal.desktop @@ -127,6 +128,7 @@ tar -xvf %{SOURCE14} %patch4 -p1 -b .include +%patch5 -p0 -b .generic # make sure the man pages are UTF-8... for nonUTF8 in distrib/doc/alc_origin.1 alcban/man1/alcbanner.1 \ @@ -292,6 +294,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Sun Feb 01 2009 Chitlesh Goorah - 5.0-24.20070718snap +- Improved VHDL generic implementation + * Mon Nov 10 2008 Chitlesh Goorah - 5.0-23.20070718snap - Added Requires xorg-x11-fonts-misc to fix launch crash diff --git a/import.log b/import.log index 7ceab48..d8a606e 100644 --- a/import.log +++ b/import.log @@ -1 +1,2 @@ alliance-5_0-21_20070718snap_fc9:HEAD:alliance-5.0-21.20070718snap.fc9.src.rpm:1221496180 +alliance-5_0-24_20070718snap_fc10:HEAD:alliance-5.0-24.20070718snap.fc10.src.rpm:1233516213 From 1972d7e1b60b897dff1348fb5e5ae4bbc3dc1582 Mon Sep 17 00:00:00 2001 From: Jesse Keating Date: Tue, 24 Feb 2009 00:39:40 +0000 Subject: [PATCH 20/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 994b2bc..a246106 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 24.%{snapshot}snap%{?dist} +Release: 25.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -294,6 +294,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon Feb 23 2009 Fedora Release Engineering - 5.0-25.20070718snap +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + * Sun Feb 01 2009 Chitlesh Goorah - 5.0-24.20070718snap - Improved VHDL generic implementation From eb8cae3f54511f64e50f4834690036174117cbeb Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Tue, 24 Feb 2009 21:02:21 +0000 Subject: [PATCH 21/85] fixed build due to bison update --- alliance.spec | 12 ++++++++---- import.log | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/alliance.spec b/alliance.spec index a246106..995600d 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 25.%{snapshot}snap%{?dist} +Release: 26.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -140,6 +140,8 @@ done #wrong-file-end-of-line-encoding sed -i 's/\r//' documentation/alliance-examples/mipsR3000/asm/* +# fixing flex and bison update on rawhide +sed -i '18i\#include \"bvl_bcomp_y.h\"' bvl/src/bvl_bcomp_y.y %build @@ -272,7 +274,7 @@ touch --no-create %{_datadir}/icons/hicolor || : %files libs -%config %{_sysconfdir}/ld.so.conf.d/* +%config(noreplace) %{_sysconfdir}/ld.so.conf.d/* %{_datadir}/applications/fedora-*.desktop %{_sysconfdir}/profile.d/alc_env.* @@ -294,8 +296,10 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog -* Mon Feb 23 2009 Fedora Release Engineering - 5.0-25.20070718snap -- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild +* Tue Feb 24 2009 Chitlesh Goorah - 5.0-26.20070718snap +- fixed build due to new releases of flex and bison + +* Mon Feb 23 2009 Fedora Release Engineering - 5.0-25.20070718snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild * Sun Feb 01 2009 Chitlesh Goorah - 5.0-24.20070718snap - Improved VHDL generic implementation diff --git a/import.log b/import.log index d8a606e..3340a02 100644 --- a/import.log +++ b/import.log @@ -1,2 +1,3 @@ alliance-5_0-21_20070718snap_fc9:HEAD:alliance-5.0-21.20070718snap.fc9.src.rpm:1221496180 alliance-5_0-24_20070718snap_fc10:HEAD:alliance-5.0-24.20070718snap.fc10.src.rpm:1233516213 +alliance-5_0-26_20070718snap_fc10:HEAD:alliance-5.0-26.20070718snap.fc10.src.rpm:1235508896 From cba87817756cfe089fea6fccdebd458789a79344 Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Sat, 4 Jul 2009 11:46:52 +0000 Subject: [PATCH 22/85] fixed documentation and broken examples --- .cvsignore | 1 - alliance-examples-adm2901.patch | 60 +++++ alliance-examples-go-all-clean.sh | 11 + alliance-examples-go-all.sh | 11 + alliance-examples-mipsR3000.patch | 12 + alliance-tutorials-amd2901.patch | 35 +++ alliance-tutorials-go-all-clean.sh | 9 + alliance-tutorials-go-all.sh | 9 + alliance-tutorials-place_n_route.patch | 94 ++++++++ alliance-tutorials-simulation.patch | 90 ++++++++ alliance-tutorials-start.patch | 55 +++++ alliance-tutorials-synthesis.patch | 295 +++++++++++++++++++++++++ alliance.spec | 84 +++++-- import.log | 1 + sources | 1 - 15 files changed, 753 insertions(+), 15 deletions(-) create mode 100644 alliance-examples-adm2901.patch create mode 100755 alliance-examples-go-all-clean.sh create mode 100755 alliance-examples-go-all.sh create mode 100644 alliance-examples-mipsR3000.patch create mode 100644 alliance-tutorials-amd2901.patch create mode 100755 alliance-tutorials-go-all-clean.sh create mode 100755 alliance-tutorials-go-all.sh create mode 100644 alliance-tutorials-place_n_route.patch create mode 100644 alliance-tutorials-simulation.patch create mode 100644 alliance-tutorials-start.patch create mode 100644 alliance-tutorials-synthesis.patch diff --git a/.cvsignore b/.cvsignore index 013d539..e2837be 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,2 +1 @@ alliance-5.0-20070718.tar.gz -alliance-5.0-tutorials.tar.bz2 diff --git a/alliance-examples-adm2901.patch b/alliance-examples-adm2901.patch new file mode 100644 index 0000000..dd18a4b --- /dev/null +++ b/alliance-examples-adm2901.patch @@ -0,0 +1,60 @@ +diff -Naur alliance-5.0/documentation/alliance-examples/amd2901/amd2901_chip.c test-64/alliance-examples/amd2901/amd2901_chip.c +--- alliance-5.0/documentation/alliance-examples/amd2901/amd2901_chip.c 2004-05-23 20:55:16.000000000 +0200 ++++ test-64/alliance-examples/amd2901/amd2901_chip.c 2009-06-14 02:35:45.000000000 +0200 +@@ -1,5 +1,5 @@ + #include +-#define POWER "vdde","vdd","vsse","vss",0 ++#define POWER "vdde","vdd","vsse","vss",NULL + + int main () + { +@@ -78,7 +78,7 @@ + + "vdd => vdd", + "vss => vss", +- 0); ++ NULL); + + GENLIB_LOINS("pck_sp","p_ck","ck","cki", POWER); + +@@ -119,13 +119,13 @@ + GENLIB_LOINS ("piot_sp","p_r3", + "ram_o_up","sh_left","ram_i_up","r3","cki", POWER ); + +- GENLIB_LOINS("pvddick_sp","p_vddick0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvssick_sp","p_vssick0","ckc","cki","vdde","vdd","vsse","vss",0); ++ GENLIB_LOINS("pvddick_sp","p_vddick0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvssick_sp","p_vssick0","ckc","cki","vdde","vdd","vsse","vss",NULL); + +- GENLIB_LOINS("pvddeck_sp","p_vddeck0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvddeck_sp","p_vddeck1","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvsseck_sp","p_vsseck0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvsseck_sp","p_vsseck1","ckc","cki","vdde","vdd","vsse","vss",0); ++ GENLIB_LOINS("pvddeck_sp","p_vddeck0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvddeck_sp","p_vddeck1","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvsseck_sp","p_vsseck0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvsseck_sp","p_vsseck1","ckc","cki","vdde","vdd","vsse","vss",NULL); + + GENLIB_SAVE_LOFIG(); + +diff -Naur alliance-5.0/documentation/alliance-examples/amd2901/amd2901_core.c test-64/alliance-examples/amd2901/amd2901_core.c +--- alliance-5.0/documentation/alliance-examples/amd2901/amd2901_core.c 2004-05-23 20:55:16.000000000 +0200 ++++ test-64/alliance-examples/amd2901/amd2901_core.c 2009-06-14 02:36:07.000000000 +0200 +@@ -109,7 +109,7 @@ + "out_x[3:0] => y[3:0]", + + "vdd => vdd", +- "vss => vss", 0); ++ "vss => vss", NULL); + + + /* ***************** Control Instanciation ****************** */ +@@ -161,7 +161,7 @@ + "oe => oe", + + "vdd => vdd", +- "vss => vss", 0); ++ "vss => vss", NULL); + + GENLIB_PLACE ("amd2901_dpt", "amd2901_dpt", NOSYM, 0, 0); + GENLIB_DEF_AB (0, 0, 0, 100); diff --git a/alliance-examples-go-all-clean.sh b/alliance-examples-go-all-clean.sh new file mode 100755 index 0000000..328e7db --- /dev/null +++ b/alliance-examples-go-all-clean.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +for B in addaccu16 adder4 amd2901 amd2901-vasy digi divcas4 \ + multi16b-reg multi4b multi8 multi8b pgcd sqrt32 sqrt8 \ + mipsR3000 hadamard +do + if [ -d $B ] + then echo "----- BENCH $B ----- " + (cd $B && make clean) + fi +done diff --git a/alliance-examples-go-all.sh b/alliance-examples-go-all.sh new file mode 100755 index 0000000..731c40c --- /dev/null +++ b/alliance-examples-go-all.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +for B in addaccu16 adder4 amd2901 amd2901-vasy digi divcas4 \ + multi16b-reg multi4b multi8 multi8b pgcd sqrt32 sqrt8 \ + mipsR3000 hadamard +do + if [ -d $B ] + then echo "----- BENCH $B ----- " + (cd $B && make clean && make) + fi +done diff --git a/alliance-examples-mipsR3000.patch b/alliance-examples-mipsR3000.patch new file mode 100644 index 0000000..5e1bdf0 --- /dev/null +++ b/alliance-examples-mipsR3000.patch @@ -0,0 +1,12 @@ +diff -Naur alliance-5.0/documentation/alliance-examples/mipsR3000/sce/Makefile test-64/alliance-examples/mipsR3000/sce/Makefile +--- alliance-5.0/documentation/alliance-examples/mipsR3000/sce/Makefile 2004-07-30 02:40:09.000000000 +0200 ++++ test-64/alliance-examples/mipsR3000/sce/Makefile 2009-06-14 03:12:56.000000000 +0200 +@@ -119,7 +119,7 @@ + LVX = $(MBK_EXTRACT_ENV); $(ALLIANCE_BIN)/lvx + PROOF = $(MBK_EXTRACT_ENV); $(ALLIANCE_BIN)/proof + RING = $(MBK_GENERAT_ENV); $(ALLIANCE_BIN)/ring +- DPGEN = $(MBK_GENERAT_ENV); $(ALLIANCE_BIN)/genlib ++ DPGEN = $(MBK_GENERAT_ENV); $(ALLIANCE_BIN)/genlib --keep-exec --verbose + OCP = $(MBK_GENERAT_ENV); $(ALLIANCE_BIN)/ocp -v -gnuplot + OCR = $(MBK_GENERAT_ENV); $(ALLIANCE_BIN)/ocr + NERO = $(MBK_GENERAT_ENV); $(ALLIANCE_BIN)/nero -V diff --git a/alliance-tutorials-amd2901.patch b/alliance-tutorials-amd2901.patch new file mode 100644 index 0000000..2cf6a4f --- /dev/null +++ b/alliance-tutorials-amd2901.patch @@ -0,0 +1,35 @@ +diff -Naur documentation/tutorials/synthesis/src/amd2901/Makefile tutorials/synthesis/src/amd2901/Makefile +--- documentation/tutorials/synthesis/src/amd2901/Makefile 2002-07-25 14:50:18.000000000 +0200 ++++ tutorials/synthesis/src/amd2901/Makefile 2007-07-18 19:34:53.000000000 +0200 +@@ -2,17 +2,17 @@ + all: EXAMPLE VAR CATAL02 res.pat + + +-VAR: ++VAR: + MBK_IN_LO=vst;export MBK_IN_LO ;\ +- MBK_CATA_LIB=/asim/alliance/cells/sxlib;export MBK_CATA_LIB ++ MBK_CATA_LIB=$ALLIANCE_TOP/cells/sxlib;export MBK_CATA_LIB + + CATAL01: +- echo amd2901_ctl C >CATAL ++ echo amd2901_ctl C >CATAL + echo amd2901_dpt C >>CATAL + + CATAL02: + echo amd2901_dpt C >CATAL +- ++ + EXAMPLE: + genlib circuit + +@@ -38,7 +38,7 @@ + + res2.pat: amd2901_chip.vst pattern.pat amd2901_core.vst CATAL + asimut amd2901_chip pattern res2 +- touch amd2901_chip.vst ++ touch amd2901_chip.vst + + clean : + rm -f Makefile-* \ + diff --git a/alliance-tutorials-go-all-clean.sh b/alliance-tutorials-go-all-clean.sh new file mode 100755 index 0000000..1261775 --- /dev/null +++ b/alliance-tutorials-go-all-clean.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +for B in place_and_route simulation synthesis +do + if [ -d $B/src ] + then echo "--- BENCH $B ----" + (cd $B/src && make clean) + fi +done diff --git a/alliance-tutorials-go-all.sh b/alliance-tutorials-go-all.sh new file mode 100755 index 0000000..489368e --- /dev/null +++ b/alliance-tutorials-go-all.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +for B in place_and_route simulation synthesis +do + if [ -d $B/src ] + then echo "--- BENCH $B ----" + (cd $B/src && make clean && make) + fi +done diff --git a/alliance-tutorials-place_n_route.patch b/alliance-tutorials-place_n_route.patch new file mode 100644 index 0000000..bb0c3d5 --- /dev/null +++ b/alliance-tutorials-place_n_route.patch @@ -0,0 +1,94 @@ +diff -Naur alliance-5.0/documentation/tutorials/place_and_route/src/amd2901/amd2901_chip.c test-64/tutorials/place_and_route/src/amd2901/amd2901_chip.c +--- alliance-5.0/documentation/tutorials/place_and_route/src/amd2901/amd2901_chip.c 2002-07-25 14:50:19.000000000 +0200 ++++ test-64/tutorials/place_and_route/src/amd2901/amd2901_chip.c 2009-06-14 02:27:03.000000000 +0200 +@@ -1,5 +1,5 @@ + #include +-#define POWER "vdde","vdd","vsse","vss",0 ++#define POWER "vdde","vdd","vsse","vss",NULL + + int main () + { +@@ -78,7 +78,7 @@ + + "vdd => vdd", + "vss => vss", +- 0); ++ NULL); + + GENLIB_LOINS("pck_sp","p_ck","ck","cki", POWER); + +@@ -119,13 +119,13 @@ + GENLIB_LOINS ("piot_sp","p_r3", + "ram_o_up","sh_left","ram_i_up","r3","cki", POWER ); + +- GENLIB_LOINS("pvddick_sp","p_vddick0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvssick_sp","p_vssick0","ckc","cki","vdde","vdd","vsse","vss",0); ++ GENLIB_LOINS("pvddick_sp","p_vddick0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvssick_sp","p_vssick0","ckc","cki","vdde","vdd","vsse","vss",NULL); + +- GENLIB_LOINS("pvddeck_sp","p_vddeck0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvddeck_sp","p_vddeck1","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvsseck_sp","p_vsseck0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvsseck_sp","p_vsseck1","ckc","cki","vdde","vdd","vsse","vss",0); ++ GENLIB_LOINS("pvddeck_sp","p_vddeck0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvddeck_sp","p_vddeck1","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvsseck_sp","p_vsseck0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvsseck_sp","p_vsseck1","ckc","cki","vdde","vdd","vsse","vss",NULL); + + GENLIB_SAVE_LOFIG(); + +diff -Naur alliance-5.0/documentation/tutorials/place_and_route/tex/place_and_route.tex test-64/tutorials/place_and_route/tex/place_and_route.tex +--- alliance-5.0/documentation/tutorials/place_and_route/tex/place_and_route.tex 2004-10-16 14:51:56.000000000 +0200 ++++ test-64/tutorials/place_and_route/tex/place_and_route.tex 2009-07-04 12:02:23.689711020 +0200 +@@ -1,26 +1,17 @@ +-%%%%%%%%%%%%%%%% +-% $Id: place_and_route.tex,v 1.5 2004/10/16 12:51:56 fred Exp $ +-% $Log: place_and_route.tex,v $ +-% Revision 1.5 2004/10/16 12:51:56 fred +-% Erasing the psfig include from the file, changed the font to 10 pt +-% instead of 12 (sparing trees and not being payed by the thickness of +-% my production) and changing font to charter since I got tired of +-% Palatino, sorry Herman! +-% +-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-\documentclass{article} ++\documentclass[10pt]{article} + \usepackage[dvips]{graphics} + \usepackage[english]{babel} +-\usepackage{doublespace} ++\usepackage{setspace} + \usepackage{epsf} + \usepackage{fancybox} +-\usepackage{fancyheadings} ++\usepackage{fancyhdr} + \usepackage{float} + \usepackage{graphicx} +-\usepackage{here} +-\usepackage{isolatin1} +-\usepackage{charter} ++%\usepackage{here} ++%\usepackage{isolatin1} ++\usepackage{palatino} + \usepackage{picinpar} ++%\usepackage{psfig} + \usepackage{rotate} + \usepackage{subfigure} + \usepackage{sverb} +@@ -37,7 +28,7 @@ + \setlength{\columnsep}{0.125in} + \setlength{\columnseprule}{0.5pt} + \setlength{\footskip}{1cm} +-\setstretch{1.2} ++%\setstretch{1.2} + + + %--------------------------------- styles +@@ -67,7 +58,7 @@ + %--------------------------------- page style -------------------------------- + \pagestyle{fancy} \rhead{Place and route} + \lhead{PART 3} \rfoot{\thepage} \lfoot{ALLIANCE TUTORIAL} \cfoot{} +-\setlength{\footrulewidth}{0.6pt} ++ + % + %\begin{figure}[H]\centering + % \includegraphics[width=8cm,height=8cm]{.eps} diff --git a/alliance-tutorials-simulation.patch b/alliance-tutorials-simulation.patch new file mode 100644 index 0000000..f0afb9f --- /dev/null +++ b/alliance-tutorials-simulation.patch @@ -0,0 +1,90 @@ +diff -Naur alliance-5.0/documentation/tutorials/simulation/tex/simulation.tex test-64/tutorials/simulation/tex/simulation.tex +--- alliance-5.0/documentation/tutorials/simulation/tex/simulation.tex 2004-10-16 14:52:05.000000000 +0200 ++++ test-64/tutorials/simulation/tex/simulation.tex 2009-07-04 12:18:54.867711418 +0200 +@@ -1,27 +1,18 @@ +-%%%%%%%%%%%%%%%% +-% $Id: simulation.tex,v 1.5 2004/10/16 12:52:05 fred Exp $ +-% $Log: simulation.tex,v $ +-% Revision 1.5 2004/10/16 12:52:05 fred +-% Erasing the psfig include from the file, changed the font to 10 pt +-% instead of 12 (sparing trees and not being payed by the thickness of +-% my production) and changing font to charter since I got tired of +-% Palatino, sorry Herman! +-% +-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %--------------------------------- page style -------------------------------- +-\documentclass{article} ++\documentclass[10pt]{article} + \usepackage[dvips]{graphics} + \usepackage[english]{babel} +-\usepackage{doublespace} ++\usepackage{setspace} ++\usepackage{epsf} + \usepackage{fancybox} +-\usepackage{fancyheadings} ++\usepackage{fancyhdr} + \usepackage{float} + \usepackage{graphicx} +-\usepackage{here} +-\usepackage{isolatin1} +-\usepackage{charter} ++\usepackage[latin1]{inputenc} ++\usepackage{palatino} + \usepackage{picinpar} ++%\usepackage{psfig} + \usepackage{rotate} + \usepackage{subfigure} + \usepackage{sverb} +@@ -38,7 +29,7 @@ + \setlength{\columnsep}{0.125in} + \setlength{\columnseprule}{0.5pt} + \setlength{\footskip}{1cm} +-\setstretch{1} ++%\setstretch{1} + + %--------------------------------- styles-------------------------------- + % +@@ -66,7 +57,7 @@ + \rfoot{\thepage} + \lfoot{ALLIANCE TUTORIAL} + \cfoot{} +-\setlength{\footrulewidth}{0.6pt} ++%\setlength{\footrulewidth}{0.6pt} + + %--------------------------------- page style -------------------------------- + \pagestyle{fancy} +@@ -75,7 +66,7 @@ + \rfoot{\thepage} + \lfoot{ALLIANCE TUTORIAL} + \cfoot{} +-\setlength{\footrulewidth}{0.6pt} ++%\setlength{\footrulewidth}{0.6pt} + + %---------------------------------- document --------------------------------- + +@@ -171,7 +162,7 @@ + } + + All the files used in this part are located in the \\ +-\texttt{/tutorial/simulation/src} directory.\\ ++\texttt{/usr/share/doc/alliance-doc-5.0//tutorial/simulation/src} directory.\\ + This directory contains two subdirectories and one Makefile : + \begin{itemize} + \item The Makefile allows you to validate automatically the entire simulation part +@@ -626,13 +617,13 @@ + \bf SXLIB }. For the functionality of the various cells and their + interface, the sxlib man is available. The behavioral + description of each cell is present in \\ +-{\bf /alliance/cells/sxlib }. ++{\bf \$ALLIANCE\_TOP/cells/sxlib }. + + You must set the environment variable { \bf MBK\_CATA\_LIB } + to be able to reach these cells. + + \begin{commandline} +- > MBK_CATA_LIB=/alliance/cells/sxlib ++ > MBK_CATA_LIB=\$ALLIANCE\_TOP/cells/sxlib + > export MBK_CATA_LIB + \end{commandline} + diff --git a/alliance-tutorials-start.patch b/alliance-tutorials-start.patch new file mode 100644 index 0000000..bc65783 --- /dev/null +++ b/alliance-tutorials-start.patch @@ -0,0 +1,55 @@ +diff -Naur alliance-5.0/documentation/tutorials/start/start.tex test-64/tutorials/start/start.tex +--- alliance-5.0/documentation/tutorials/start/start.tex 2004-10-16 14:52:13.000000000 +0200 ++++ test-64/tutorials/start/start.tex 2009-07-04 12:17:35.389714653 +0200 +@@ -5,16 +5,16 @@ + % Version for Alliance releases 2.0 and up by Frederic Petrot + % Modified by czo for Alliance release 4.0 (01/2000) + % TODO : no fully working, needs some adjustements +-% $Id: start.tex,v 1.5 2004/10/16 12:52:13 fred Exp $ ++% $Id: start.tex,v 1.4 2004/07/15 21:40:02 ludo Exp $ + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \documentclass{article} +-\usepackage{charter,doublespace,here,fancybox} ++\usepackage{palatino,setspace,fancybox} + \textwidth 15cm + \textheight 23cm + \oddsidemargin +0.75cm + \evensidemargin -0.75cm +-\setstretch{1.2} ++%\setstretch{1.2} + %%%%%%%%%%%%%%% + % Setting the width of the verbatim parts according to 80 tt chars + % Since it is tt, any char is fine +@@ -116,13 +116,13 @@ + try to run the following command : + + \begin{phraseverbatim} +-~alp/addaccu %-) source /alliance/etc/alc_env.csh ++~alp/addaccu %-) source /etc/profile.d/alc_env.csh + \end{phraseverbatim} + + Otherwise, if you run a \texttt{sh-like} shell, try to run the following + command : + \begin{phraseverbatim} +-~alp/addaccu %-) source /alliance/alc_env.sh ++~alp/addaccu %-) source /etc/profile.d/alc_env.sh + \end{phraseverbatim} + \\ + Before we proceed to the tutorial, you must make sure that the +@@ -151,13 +151,13 @@ + MBK_CATAL_NAME=CATAL + MBK_SCALE_X=100 + MBK_VSS=vss +-MBK_CATA_LIB=.:/alliance/cells/sxlib:/alliance/cells/padlib ++MBK_CATA_LIB=.:\$ALLIANCE\_TOP/cells/sxlib:\$ALLIANCE\_TOP/cells/padlib + MBK_WORK_LIB=. + MBK_VDD=vdd + MBK_C4_LIB=./cellsC4 + MBK_IN_LO=vst + MBK_IN_PH=ap +-MBK_TARGET_LIB=/alliance/cells/sxlib ++MBK_TARGET_LIB=\$ALLIANCE\_TOP/cells/sxlib + MBK_OUT_LO=vst + \end{framedverbatim} + \caption{\label{mbk} \texttt{MBK} environment variables.} diff --git a/alliance-tutorials-synthesis.patch b/alliance-tutorials-synthesis.patch new file mode 100644 index 0000000..e8bc9db --- /dev/null +++ b/alliance-tutorials-synthesis.patch @@ -0,0 +1,295 @@ +diff -Naur alliance-5.0/documentation/tutorials/synthesis/src/amd2901/amd2901_chip.c test-64/tutorials/synthesis/src/amd2901/amd2901_chip.c +--- alliance-5.0/documentation/tutorials/synthesis/src/amd2901/amd2901_chip.c 2002-07-25 14:50:18.000000000 +0200 ++++ test-64/tutorials/synthesis/src/amd2901/amd2901_chip.c 2009-06-14 00:31:18.000000000 +0200 +@@ -78,7 +78,7 @@ + + "vdd => vdd", + "vss => vss", +- 0); ++ NULL); + + GENLIB_LOINS("pck_sp","p_ck","ck","cki", POWER); + +@@ -119,13 +119,13 @@ + GENLIB_LOINS ("piot_sp","p_r3", + "ram_o_up","sh_left","ram_i_up","r3","cki", POWER ); + +- GENLIB_LOINS("pvddick_sp","p_vddick0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvssick_sp","p_vssick0","ckc","cki","vdde","vdd","vsse","vss",0); ++ GENLIB_LOINS("pvddick_sp","p_vddick0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvssick_sp","p_vssick0","ckc","cki","vdde","vdd","vsse","vss",NULL); + +- GENLIB_LOINS("pvddeck_sp","p_vddeck0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvddeck_sp","p_vddeck1","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvsseck_sp","p_vsseck0","ckc","cki","vdde","vdd","vsse","vss",0); +- GENLIB_LOINS("pvsseck_sp","p_vsseck1","ckc","cki","vdde","vdd","vsse","vss",0); ++ GENLIB_LOINS("pvddeck_sp","p_vddeck0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvddeck_sp","p_vddeck1","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvsseck_sp","p_vsseck0","ckc","cki","vdde","vdd","vsse","vss",NULL); ++ GENLIB_LOINS("pvsseck_sp","p_vsseck1","ckc","cki","vdde","vdd","vsse","vss",NULL); + + GENLIB_SAVE_LOFIG(); + +diff -Naur alliance-5.0/documentation/tutorials/synthesis/src/digicode/log test-64/tutorials/synthesis/src/digicode/log +--- alliance-5.0/documentation/tutorials/synthesis/src/digicode/log 1970-01-01 01:00:00.000000000 +0100 ++++ test-64/tutorials/synthesis/src/digicode/log 2009-06-14 12:57:45.000000000 +0200 +@@ -0,0 +1,91 @@ ++==32653== Memcheck, a memory error detector. ++==32653== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al. ++==32653== Using LibVEX rev 1658, a library for dynamic binary translation. ++==32653== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP. ++==32653== Using valgrind-3.2.1, a dynamic binary instrumentation framework. ++==32653== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al. ++==32653== For more details, rerun with: -v ++==32653== ++Mapping Warning: Cell 'halfadder_x4' isn't supported ++Mapping Warning: Cell 'halfadder_x2' isn't supported ++Mapping Warning: Cell 'fulladder_x4' isn't supported ++Mapping Warning: Cell 'fulladder_x2' isn't supported ++ ++ @@@@@@@ @@@@ @ ++ @@ @@ @@ @@ ++ @@ @@ @@ @ ++ @@ @@ @@@ @@@ @@ ++ @@ @@ @@ @@ @@ @@ @@ ++ @@@@@@ @@ @@ @@ @@ @@ @@@@@ ++ @@ @@ @@ @@ @@ @@ @@ @ @@ ++ @@ @@ @@ @@ @@ @@ @@ @ @@ ++ @@ @@ @@ @@ @@ @@ @@ @@ ++ @@ @@ @@ @@ @@ @@ @@ @@ ++ @@@@@@@@ @@@ @@@ @@@@ ++ ++ Binding and Optimizing On Gates ++ ++ Alliance CAD System 5.0, boog 5.0 [2003/01/09] ++ Copyright (c) 2000-2009, ASIM/LIP6/UPMC ++ Author(s): Franois Donnet ++ E-mail : alliance-users@asim.lip6.fr ++ ++ MBK_VDD : vdd ++ MBK_VSS : vss ++ MBK_IN_LO : vst ++ MBK_OUT_LO : vst ++ MBK_WORK_LIB : . ++ MBK_TARGET_LIB : /users/cao/ludo/chaos/alliance/distrib-64/cells/sxlib ++ ++Reading default parameter... ++50% area - 50% delay optimization ++Reading file 'digicoder_b.vbe'... ++Controlling file 'digicoder_b.vbe'... ++Reading lib '/users/cao/ludo/chaos/alliance/distrib-64/cells/sxlib'... ++Controlling lib '/users/cao/ludo/chaos/alliance/distrib-64/cells/sxlib'... ++Preparing file 'digicoder_b.vbe'... ++Capacitances on file 'digicoder_b.vbe'... ++Unflattening file 'digicoder_b.vbe'... ++Mapping file 'digicoder_b.vbe'... ++Saving file 'digicoder_b.vst'... ++Quick estimated critical path (no warranty)...1866 ps from 'i 3' to 'digicode_ep 2' ++Quick estimated area (with over-cell routing)...93500 lambda ++Details... ++ inv_x2: 12 ++ a2_x2: 7 ++ na2_x1: 7 ++ o2_x2: 6 ++ na3_x1: 5 ++ no2_x1: 5 ++ on12_x1: 4 ++ sff1_x4: 3 ++ an12_x1: 3 ++ nao22_x1: 3 ++ no4_x1: 3 ++ noa22_x1: 2 ++ no3_x1: 2 ++ a3_x2: 2 ++ o3_x2: 2 ++ zero_x0: 1 ++ buf_x2: 1 ++ oa22_x2: 1 ++ xr2_x1: 1 ++ a4_x2: 1 ++ Total: 71 ++Saving critical path in xsch color file 'digicoder_b.xsc'... ++End of boog... ++ ++==32653== ++==32653== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 5 from 1) ++==32653== malloc/free: in use at exit: 9,263,779 bytes in 17,753 blocks. ++==32653== malloc/free: 18,632 allocs, 879 frees, 9,622,816 bytes allocated. ++==32653== For counts of detected errors, rerun with: -v ++==32653== searching for pointers to 17,753 not-freed blocks. ++==32653== checked 4,796,752 bytes. ++==32653== ++==32653== LEAK SUMMARY: ++==32653== definitely lost: 230,722 bytes in 5,658 blocks. ++==32653== possibly lost: 329,120 bytes in 18 blocks. ++==32653== still reachable: 8,703,937 bytes in 12,077 blocks. ++==32653== suppressed: 0 bytes in 0 blocks. ++==32653== Use --leak-check=full to see details of leaked memory. +diff -Naur alliance-5.0/documentation/tutorials/synthesis/tex/synthesis.tex test-64/tutorials/synthesis/tex/synthesis.tex +--- alliance-5.0/documentation/tutorials/synthesis/tex/synthesis.tex 2004-10-16 14:52:17.000000000 +0200 ++++ test-64/tutorials/synthesis/tex/synthesis.tex 2009-07-04 12:26:03.345711622 +0200 +@@ -1,25 +1,16 @@ +-%%%%%%%%%%%%%%%% +-% $Id: synthesis.tex,v 1.4 2004/10/16 12:52:17 fred Exp $ +-% $Log: synthesis.tex,v $ +-% Revision 1.4 2004/10/16 12:52:17 fred +-% Erasing the psfig include from the file, changed the font to 10 pt +-% instead of 12 (sparing trees and not being payed by the thickness of +-% my production) and changing font to charter since I got tired of +-% Palatino, sorry Herman! +-% +-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-\documentclass{article} ++\documentclass[10pt]{article} + \usepackage[dvips]{graphics} + \usepackage[english]{babel} +-\usepackage{doublespace} ++\usepackage{setspace} ++\usepackage{epsf} + \usepackage{fancybox} +-\usepackage{fancyheadings} ++\usepackage{fancyhdr} + \usepackage{float} + \usepackage{graphicx} +-\usepackage{here} +-\usepackage{isolatin1} +-\usepackage{charter} ++\usepackage[latin1]{inputenc} ++\usepackage{palatino} + \usepackage{picinpar} ++%\usepackage{psfig} + \usepackage{rotate} + \usepackage{subfigure} + \usepackage{sverb} +@@ -36,7 +27,7 @@ + \setlength{\columnsep}{0.125in} + \setlength{\columnseprule}{0.5pt} + \setlength{\footskip}{1cm} +-\setstretch{1} ++%\setstretch{1} + + + %--------------------------------- styles +@@ -69,7 +60,7 @@ + \rfoot{\thepage} + \lfoot{ALLIANCE TUTORIAL} + \cfoot{} +-\setlength{\footrulewidth}{0.6pt} ++%\setlength{\footrulewidth}{0.6pt} + + %---------------------------------- document --------------------------------- + \begin{document} +@@ -220,7 +211,7 @@ + } + + All the files used in this part are located under \\ +-\texttt{/tutorial/synthesis/src} directory.\\ ++\texttt{/usr/share/doc/alliance-doc-5.0/tutorials/synthesis/src} directory.\\ + This directory contents four subdirectories and one Makefile : + \begin{itemize}\itemsep=-.8ex + +@@ -802,9 +793,8 @@ + + We break up Amd2901 into 2 blocks: %la partie cont\^ole qui regroupe la ``glu'' logique et la partie op\'erative (chemin de donn\'ees).% + \begin{figure}[H]\center +-\leavevmode +-\includegraphics[width=10cm]{bloc} +-\caption{Amd2901 Organization \label{bloc}} ++\leavevmode \epsfxsize=10cm \epsffile{bloc.eps} \caption{Amd2901 ++Organization \label{bloc}} + \end{figure} + + +@@ -819,7 +809,8 @@ + We will use the following hierarchical description: + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=10cm]{hier} ++\epsfxsize=10cm ++\epsffile{hier.eps} + \caption{Hierarchy \label{hier}} + \end{figure} + +@@ -862,7 +853,8 @@ + + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=10cm]{exemple1} ++\epsfxsize=10cm ++\epsffile{exemple1.eps} + \end{figure} + + The equivalent { \bf genlib } file is as follows: +@@ -998,12 +990,13 @@ + + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=10cm]{exemple2} ++\epsfxsize=10cm ++\epsffile{exemple2.eps} + \end{figure} + + Here the corresponding data-path structure : +-\begin{figure}[H]\center \leavevmode +-\includegraphics[width=10cm]{datap} ++\begin{figure}[H]\center \leavevmode \epsfxsize=10cm ++\epsffile{datap.eps} + \end{figure} + + Each gate occupies a column, a column making it possible to treat +@@ -1232,39 +1225,47 @@ + + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=12cm]{ctl-mrs-1} ++\epsfxsize=12cm ++\epsffile{ctl-mrs-1.eps} + \end{figure} + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=12cm]{ctl-alu-1} ++\epsfxsize=12cm ++\epsffile{ctl-alu-1.eps} + \end{figure} + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=12cm]{ctl-wen-1} ++\epsfxsize=12cm ++\epsffile{ctl-wen-1.eps} + \end{figure} + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=10cm]{dpt-all-1} ++\epsfxsize=10cm ++\epsffile{dpt-all-1.eps} + \end{figure} + + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=12cm]{dpt-alu-1} ++\epsfxsize=12cm ++\epsffile{dpt-alu-1.eps} + \end{figure} + + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=12cm]{ctldecode} ++\epsfxsize=12cm ++\epsffile{ctldecode.eps} + \end{figure} + + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=12cm]{ctldecodebw} ++\epsfxsize=12cm ++\epsffile{ctldecodebw.eps} + \end{figure} + + \begin{figure}[H]\center + \leavevmode +-\includegraphics[width=12cm]{dptbanc} ++\epsfxsize=12cm ++\epsffile{dptbanc.eps} + \end{figure} + + \end{document} diff --git a/alliance.spec b/alliance.spec index 995600d..fa7bd0a 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,8 +4,8 @@ Name: alliance Version: 5.0 -Release: 26.%{snapshot}snap%{?dist} -Summary: VLSI EDA System +Release: 27.%{snapshot}snap%{?dist} +Summary: EDA platform for ASIC design License: GPLv2 Group: Applications/Engineering @@ -14,12 +14,23 @@ Source: http://www-asim.lip6.fr/pub/alliance/distribution/5.0/%{name}-%{v URL: http://www-asim.lip6.fr/recherche/alliance/ Patch0: alliance-env.patch -Patch1: alliance-examples.patch Patch2: alliance-run.patch Patch3: alliance-perms.patch Patch4: alliance-gcc43.patch Patch5: alliance-generic.patch +# Improving autogeneration of documentation +Patch6: alliance-tutorials-place_n_route.patch +Patch7: alliance-tutorials-simulation.patch +Patch8: alliance-tutorials-start.patch +Patch9: alliance-tutorials-synthesis.patch + +# Improving robustness of the examples +Patch10: alliance-tutorials-amd2901.patch +Patch11: alliance-examples.patch +Patch12: alliance-examples-adm2901.patch +Patch13: alliance-examples-mipsR3000.patch + Source1: xsch.desktop Source2: dreal.desktop Source3: xpat.desktop @@ -37,7 +48,10 @@ Source11: xfsm.png Source12: xpat.png Source13: xsch.png -Source14: %{name}-5.0-tutorials.tar.bz2 +Source14: alliance-tutorials-go-all.sh +Source15: alliance-tutorials-go-all-clean.sh +Source16: alliance-examples-go-all.sh +Source17: alliance-examples-go-all-clean.sh BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: lesstif-devel libXt-devel byacc desktop-file-utils bison @@ -98,7 +112,9 @@ Architecture dependent files for the Alliance VLSI CAD Sytem. Summary: Alliance VLSI CAD Sytem - Documentations Group: Applications/Engineering Requires: %{name} = %{version}-%{release} -Requires: gnuplot +Requires: gnuplot +BuildRequires:tetex-latex + %description doc @@ -116,20 +132,47 @@ sed -i "s|ALLIANCE_TOP|%{prefix}|" *.desktop # removing useless copyrighted (by Cadence) lines from the examples # and even in alliance-run # https://www-asim.lip6.fr/wws/arc/alliance-users/2007-07/msg00006.html -%patch1 -p0 -b .examples + %patch2 -p0 -b .run # fixing permissions %patch3 -p0 -b .perms - -### 2008 March: TexLive introduction to Rawhide -sed -i "s|tutorials||" documentation/Makefile.in -tar -xvf %{SOURCE14} - - %patch4 -p1 -b .include %patch5 -p0 -b .generic +# ------------------------------------------------------------------------------ +# Description : 2008 March : TexLive introduction to Rawhide +sed -i "s|tutorials||" documentation/Makefile.in +%patch6 -p1 -b .doc +%patch7 -p1 -b .doc +%patch8 -p1 -b .doc +%patch9 -p1 -b .doc +%patch10 -p0 -b .doc +pushd documentation/tutorials + # clean unneccessary files + %{__rm} *.pdf + # build documentation + for folder in place_and_route/tex start simulation/tex synthesis/tex; do + pushd $folder + %{__make} + popd + # remove useless directories before %%doc + %{__rm} -rf $folder + done + # Add automated scripts to tutorials + %{__install} -pm 755 %{SOURCE14} go-all.sh + %{__install} -pm 755 %{SOURCE15} go-all-clean.sh + # FEL self test for alliance + ./go-all.sh 2>&1 | tee self-test-tutorials.log + # clean temporary files + ./go-all-clean.sh +popd +# ------------------------------------------------------------------------------ + +%patch11 -p0 -b .examples +%patch12 -p1 -b .examples +%patch13 -p1 -b .examples + # make sure the man pages are UTF-8... for nonUTF8 in distrib/doc/alc_origin.1 alcban/man1/alcbanner.1 \ loon/doc/loon.1 m2e/doc/man1/m2e.1 boog/doc/boog.1 ; do @@ -189,6 +232,17 @@ popd %{__rm} -rf %{buildroot}%{prefix}/doc/ %{__rm} -rf %{buildroot}%{prefix}/examples/ +# Add automated scripts to examples +%{__install} -pm 755 %{SOURCE16} alliance-examples/go-all.sh +%{__install} -pm 755 %{SOURCE17} alliance-examples/go-all-clean.sh + +pushd alliance-examples/ + # FEL self test for alliance + ./go-all.sh 2>&1 | tee self-test-examples.log + # clean temporary files + ./go-all-clean.sh +popd + # correcting minor documentation details sed -i "s|/bin/zsh|/bin/sh|" doc/alliance-run/bench.zsh @@ -296,10 +350,14 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Sat Jul 4 2009 Chitlesh Goorah - 5.0-27.20070718snap +- improved autogeneration of documentation and fixed the examples + * Tue Feb 24 2009 Chitlesh Goorah - 5.0-26.20070718snap - fixed build due to new releases of flex and bison -* Mon Feb 23 2009 Fedora Release Engineering - 5.0-25.20070718snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild +* Mon Feb 23 2009 Fedora Release Engineering - 5.0-25.20070718snap + - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild * Sun Feb 01 2009 Chitlesh Goorah - 5.0-24.20070718snap - Improved VHDL generic implementation diff --git a/import.log b/import.log index 3340a02..5394acc 100644 --- a/import.log +++ b/import.log @@ -1,3 +1,4 @@ alliance-5_0-21_20070718snap_fc9:HEAD:alliance-5.0-21.20070718snap.fc9.src.rpm:1221496180 alliance-5_0-24_20070718snap_fc10:HEAD:alliance-5.0-24.20070718snap.fc10.src.rpm:1233516213 alliance-5_0-26_20070718snap_fc10:HEAD:alliance-5.0-26.20070718snap.fc10.src.rpm:1235508896 +alliance-5_0-27_20070718snap_fc11:HEAD:alliance-5.0-27.20070718snap.fc11.src.rpm:1246707806 diff --git a/sources b/sources index 6d91a0b..5716e50 100644 --- a/sources +++ b/sources @@ -1,2 +1 @@ 917f4493c09f6f5c49d5a606a5e9bbd8 alliance-5.0-20070718.tar.gz -32cac3116f85713aec2e1e18379811eb alliance-5.0-tutorials.tar.bz2 From f7567ec79455c84db5d2c4893bafce9d3f708f5f Mon Sep 17 00:00:00 2001 From: Chitlesh GOORAH Date: Thu, 9 Jul 2009 15:13:04 +0000 Subject: [PATCH 23/85] Patches (14 to 100) added --- alliance-abe.patch | 517 + alliance-abl.patch | 585 + alliance-alcban.patch | 329 + alliance-asimut.patch | 608 + alliance-attila.patch | Bin 0 -> 49084 bytes alliance-aut.patch | 641 + alliance-bdd.patch | 487 + alliance-beh.patch | 491 + alliance-bhl.patch | 542 + alliance-boog.patch | 706 + alliance-boom.patch | 16736 +++ alliance-btr.patch | 804 + alliance-bvl.patch | 855 + alliance-cells.patch | 982 + alliance-ctl.patch | 344 + alliance-ctp.patch | 463 + alliance-distrib.patch | Bin 0 -> 116460 bytes alliance-dreal.patch | 647 + alliance-druc.patch | 587 + alliance-elp.patch | 1090 + alliance-exp.patch | 478 + alliance-files.patch | 16258 +++ alliance-fks.patch | 302 + alliance-flatbeh.patch | 398 + alliance-flatlo.patch | 397 + alliance-flatph.patch | 317 + alliance-fmi.patch | 332 + alliance-fsm.patch | 606 + alliance-fsp.patch | 332 + alliance-ftl.patch | 298 + alliance-fvh.patch | 904 + alliance-gcc43.patch | 47 - alliance-gcp.patch | 36890 +++++++ alliance-genlib.patch | 1364 + alliance-genpat.patch | 1276 + alliance-genview.patch | 201935 +++++++++++++++++++++++++++++++++++++ alliance-graal.patch | 812 + alliance-grog.patch | 29354 ++++++ alliance-growstk.patch | 2212 + alliance-k2f.patch | 332 + alliance-l2p.patch | 833 + alliance-log.patch | 2288 + alliance-loon.patch | 432 + alliance-lvx.patch | 330 + alliance-lynx.patch | 413 + alliance-m2e.patch | 544 + alliance-mbk.patch | 1178 + alliance-mbkal.patch | 416 + alliance-mbkap.patch | 270 + alliance-mbkedif.patch | 272 + alliance-mbkhilo.patch | 270 + alliance-mbkvti.patch | 369 + alliance-mips_asm.patch | 263 + alliance-mocha.patch | 330 + alliance-nero.patch | 3105 + alliance-ocp.patch | 729 + alliance-ocr.patch | 18514 ++++ alliance-pat.patch | 343 + alliance-pat2spi.patch | 332 + alliance-pcbs.patch | 21799 ++++ alliance-phl.patch | 509 + alliance-ppt.patch | 535 + alliance-proof.patch | 365 + alliance-rds.patch | 922 + alliance-rdscif.patch | 281 + alliance-rdsgds.patch | 269 + alliance-ring.patch | 787 + alliance-rtd.patch | 281 + alliance-rtn.patch | 466 + alliance-s2r.patch | 527 + alliance-scapin.patch | 407 + alliance-scl.patch | 493 + alliance-sea.patch | 361 + alliance-syf.patch | 361 + alliance-vasy.patch | 418 + alliance-vbh.patch | 269 + alliance-vbl.patch | 4396 + alliance-vex.patch | 456 + alliance-vpd.patch | 298 + alliance-vpn.patch | 833 + alliance-vst2xnf.patch | 2095 + alliance-vtl.patch | 298 + alliance-vvh.patch | 281 + alliance-x2y.patch | 316 + alliance-xfsm.patch | 544 + alliance-xgra.patch | 26885 +++++ alliance-xpat.patch | 619 + alliance-xsch.patch | 1468 + alliance-xvpn.patch | 538 + alliance.spec | 202 +- import.log | 1 + 91 files changed, 421714 insertions(+), 55 deletions(-) create mode 100644 alliance-abe.patch create mode 100644 alliance-abl.patch create mode 100644 alliance-alcban.patch create mode 100644 alliance-asimut.patch create mode 100644 alliance-attila.patch create mode 100644 alliance-aut.patch create mode 100644 alliance-bdd.patch create mode 100644 alliance-beh.patch create mode 100644 alliance-bhl.patch create mode 100644 alliance-boog.patch create mode 100644 alliance-boom.patch create mode 100644 alliance-btr.patch create mode 100644 alliance-bvl.patch create mode 100644 alliance-cells.patch create mode 100644 alliance-ctl.patch create mode 100644 alliance-ctp.patch create mode 100644 alliance-distrib.patch create mode 100644 alliance-dreal.patch create mode 100644 alliance-druc.patch create mode 100644 alliance-elp.patch create mode 100644 alliance-exp.patch create mode 100644 alliance-files.patch create mode 100644 alliance-fks.patch create mode 100644 alliance-flatbeh.patch create mode 100644 alliance-flatlo.patch create mode 100644 alliance-flatph.patch create mode 100644 alliance-fmi.patch create mode 100644 alliance-fsm.patch create mode 100644 alliance-fsp.patch create mode 100644 alliance-ftl.patch create mode 100644 alliance-fvh.patch delete mode 100755 alliance-gcc43.patch create mode 100644 alliance-gcp.patch create mode 100644 alliance-genlib.patch create mode 100644 alliance-genpat.patch create mode 100644 alliance-genview.patch create mode 100644 alliance-graal.patch create mode 100644 alliance-grog.patch create mode 100644 alliance-growstk.patch create mode 100644 alliance-k2f.patch create mode 100644 alliance-l2p.patch create mode 100644 alliance-log.patch create mode 100644 alliance-loon.patch create mode 100644 alliance-lvx.patch create mode 100644 alliance-lynx.patch create mode 100644 alliance-m2e.patch create mode 100644 alliance-mbk.patch create mode 100644 alliance-mbkal.patch create mode 100644 alliance-mbkap.patch create mode 100644 alliance-mbkedif.patch create mode 100644 alliance-mbkhilo.patch create mode 100644 alliance-mbkvti.patch create mode 100644 alliance-mips_asm.patch create mode 100644 alliance-mocha.patch create mode 100644 alliance-nero.patch create mode 100644 alliance-ocp.patch create mode 100644 alliance-ocr.patch create mode 100644 alliance-pat.patch create mode 100644 alliance-pat2spi.patch create mode 100644 alliance-pcbs.patch create mode 100644 alliance-phl.patch create mode 100644 alliance-ppt.patch create mode 100644 alliance-proof.patch create mode 100644 alliance-rds.patch create mode 100644 alliance-rdscif.patch create mode 100644 alliance-rdsgds.patch create mode 100644 alliance-ring.patch create mode 100644 alliance-rtd.patch create mode 100644 alliance-rtn.patch create mode 100644 alliance-s2r.patch create mode 100644 alliance-scapin.patch create mode 100644 alliance-scl.patch create mode 100644 alliance-sea.patch create mode 100644 alliance-syf.patch create mode 100644 alliance-vasy.patch create mode 100644 alliance-vbh.patch create mode 100644 alliance-vbl.patch create mode 100644 alliance-vex.patch create mode 100644 alliance-vpd.patch create mode 100644 alliance-vpn.patch create mode 100644 alliance-vst2xnf.patch create mode 100644 alliance-vtl.patch create mode 100644 alliance-vvh.patch create mode 100644 alliance-x2y.patch create mode 100644 alliance-xfsm.patch create mode 100644 alliance-xgra.patch create mode 100644 alliance-xpat.patch create mode 100644 alliance-xsch.patch create mode 100644 alliance-xvpn.patch diff --git a/alliance-abe.patch b/alliance-abe.patch new file mode 100644 index 0000000..ef63d86 --- /dev/null +++ b/alliance-abe.patch @@ -0,0 +1,517 @@ +diff -Naur alliance-5.0/abe/configure.in alliance/src/abe/configure.in +--- alliance-5.0/abe/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/abe/configure.in 2002-10-16 20:04:19.000000000 +0200 +@@ -0,0 +1,46 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.3 2002/10/16 18:04:19 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/abe.h) ++ABE_DLL_VERSION=2:1:0 ++AC_SUBST(ABE_DLL_VERSION) ++AM_INIT_AUTOMAKE(abe, 2.1) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/abe/Makefile.in alliance/src/abe/Makefile.in +--- alliance-5.0/abe/Makefile.in 2007-07-18 19:04:04.000000000 +0200 ++++ alliance/src/abe/Makefile.in 2009-06-13 22:27:05.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/abe/src/beh_dict.c alliance/src/abe/src/beh_dict.c +--- alliance-5.0/abe/src/beh_dict.c 2002-09-30 18:19:35.000000000 +0200 ++++ alliance/src/abe/src/beh_dict.c 2009-06-13 23:20:09.000000000 +0200 +@@ -164,8 +164,8 @@ + struct beden **head; + char *key_str; + char *ctx_str; +-int field; +-int valu; ++long field; ++long valu; + + { + int found = 0; +diff -Naur alliance-5.0/abe/src/main.c alliance/src/abe/src/main.c +--- alliance-5.0/abe/src/main.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/abe/src/main.c 2002-09-30 18:19:36.000000000 +0200 +@@ -0,0 +1,230 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : Beh | ++| | ++| File : main.c | ++| | ++| Date : 08.02.95 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Usage | ++| | ++\------------------------------------------------------------*/ ++ ++void BehUsage() ++{ ++ fprintf( stderr, "\t\tabetest [Options] Input_name [Output_name]\n\n" ); ++ fprintf( stdout, "\t\tOptions : -V Sets Verbose mode on\n" ); ++ fprintf( stdout, "\t\tOptions : -E Erases auxialiry signals\n" ); ++ fprintf( stdout, "\t\tOptions : -D Displays beh figure\n" ); ++ fprintf( stdout, "\t\tOptions : -B Makes BDD nodes\n" ); ++ fprintf( stdout, "\t\tOptions : -S Saves beh figure \n" ); ++ fprintf( stdout, "\n" ); ++ ++ exit( 1 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| main | ++| | ++\------------------------------------------------------------*/ ++ ++int main( argc, argv ) ++ ++ int argc; ++ char *argv[]; ++{ ++ befig_list *BehFigure; ++ char *InputFileName; ++ char *OutputFileName; ++ int Number; ++ int Index; ++ char Option; ++ ++ int FlagVerbose = 0; ++ int FlagSave = 0; ++ int FlagDisplay = 0; ++ int FlagErase = 0; ++ int FlagBdd = 0; ++ ++ mbkenv(); ++ autenv(); ++ ablenv(); ++ bddenv(); ++ ++ InputFileName = (char *)0; ++ OutputFileName = (char *)0; ++ ++ if ( argc < 2 ) BehUsage(); ++ ++ for ( Number = 1; Number < argc; Number++ ) ++ { ++ if ( argv[ Number ][ 0 ] == '-' ) ++ { ++ for ( Index = 1; argv[ Number ][ Index ] != '\0'; Index++ ) ++ { ++ Option = argv[ Number ][ Index ]; ++ ++ switch ( Option ) ++ { ++ case 'E' : FlagErase = 1; ++ break; ++ case 'B' : FlagBdd = 1; ++ break; ++ case 'D' : FlagDisplay = 1; ++ break; ++ case 'V' : FlagVerbose = 1; ++ break; ++ case 'S' : FlagSave = 1; ++ break; ++ default : BehUsage(); ++ } ++ } ++ } ++ else ++ if ( InputFileName == (char *)0 ) InputFileName = argv[ Number ]; ++ else ++ if ( OutputFileName == (char *)0 ) OutputFileName = argv[ Number ]; ++ else ++ BehUsage(); ++ } ++ ++ if ( InputFileName == (char *)0 ) BehUsage(); ++ if ( OutputFileName == (char *)0 ) OutputFileName = InputFileName; ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "vhdlloadbefig %s\n", InputFileName ); ++ } ++ ++ BehFigure = vhdlloadbefig( (befig_list *)0, InputFileName, 3 ); ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "Figure %s loaded\n", BehFigure->NAME ); ++ } ++ ++/*\ ++ if ( FlagBdd ) ++ { ++ BddSystem = createbddsystem( 100, 1000, 100, 5000000 ); ++ reorderbddsystemdynamic( BddSystem, reorderbddsystemsimple, 100000, 100 ); ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "Makes BDD for %s\n", BehFigure->NAME ); ++ } ++ ++ BehFigure->BEDLY = (beaux_list *)0; ++ beh_makbdd( BehFigure, ! FlagErase, 0 ); ++ ++ testbddcircuit( (bddcircuit *)0 ); ++ ++ destroybddcircuit( BehFigure->CIRCUI ); ++ destroybddsystem( BddSystem ); ++ } ++ else ++ if ( FlagErase ) ++ { ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "Erases auxialiary signals in %s\n", BehFigure->NAME ); ++ } ++ ++ beh_delauxabl( BehFigure ); ++ } ++\*/ ++ ++ if ( FlagSave ) ++ { ++ BehFigure->NAME = namealloc( OutputFileName ); ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "vhdlsavebefig %s\n", BehFigure->NAME ); ++ } ++ vhdlsavebefig ( BehFigure, 0 ); ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "Figure %s saved\n", BehFigure->NAME ); ++ } ++ } ++ ++ if ( FlagDisplay ) ++ { ++ beh_viewbefig( BehFigure ); ++ } ++ ++ beh_frebefig( BehFigure ); ++ ++ return( 0 ); ++} +diff -Naur alliance-5.0/abe/src/Makefile.in alliance/src/abe/src/Makefile.in +--- alliance-5.0/abe/src/Makefile.in 2007-07-18 19:04:04.000000000 +0200 ++++ alliance/src/abe/src/Makefile.in 2009-06-13 22:27:06.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libAbe_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -68,11 +66,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libAbe_la_SOURCES) + DIST_SOURCES = $(libAbe_la_SOURCES) +@@ -147,6 +145,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -169,6 +170,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -235,6 +239,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -246,6 +253,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -295,6 +305,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -302,6 +315,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-abl.patch b/alliance-abl.patch new file mode 100644 index 0000000..5c53e7d --- /dev/null +++ b/alliance-abl.patch @@ -0,0 +1,585 @@ +diff -Naur alliance-5.0/abl/configure.in alliance/src/abl/configure.in +--- alliance-5.0/abl/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/abl/configure.in 2002-10-16 20:04:19.000000000 +0200 +@@ -0,0 +1,48 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.4 2002/10/16 18:04:19 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/abl.h) ++ABL_DLL_VERSION=1:3:0 ++AC_SUBST(ABL_DLL_VERSION) ++AM_INIT_AUTOMAKE(abl, 1.3) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man1/Makefile ++man3/Makefile ++]) +diff -Naur alliance-5.0/abl/Makefile.in alliance/src/abl/Makefile.in +--- alliance-5.0/abl/Makefile.in 2007-07-18 19:04:05.000000000 +0200 ++++ alliance/src/abl/Makefile.in 2009-06-13 22:27:06.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/abl/man1/Makefile.in alliance/src/abl/man1/Makefile.in +--- alliance-5.0/abl/man1/Makefile.in 2007-07-18 19:04:05.000000000 +0200 ++++ alliance/src/abl/man1/Makefile.in 2009-06-13 22:27:06.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/abl/man3/Makefile.in alliance/src/abl/man3/Makefile.in +--- alliance-5.0/abl/man3/Makefile.in 2007-07-18 19:04:05.000000000 +0200 ++++ alliance/src/abl/man3/Makefile.in 2009-06-13 22:27:06.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/abl/src/abl.h alliance/src/abl/src/abl.h +--- alliance-5.0/abl/src/abl.h 2006-03-29 19:10:00.000000000 +0200 ++++ alliance/src/abl/src/abl.h 2009-06-13 22:22:16.000000000 +0200 +@@ -60,14 +60,14 @@ + | | + \------------------------------------------------------*/ + +-# define ABL_OR 0 +-# define ABL_AND 1 +-# define ABL_XOR 2 +-# define ABL_NOT 3 +-# define ABL_NOR 4 +-# define ABL_NAND 5 +-# define ABL_NXOR 6 +-# define ABL_STABLE 7 ++# define ABL_OR 0L ++# define ABL_AND 1L ++# define ABL_XOR 2L ++# define ABL_NOT 3L ++# define ABL_NOR 4L ++# define ABL_NAND 5L ++# define ABL_NXOR 6L ++# define ABL_STABLE 7L + + /*------------------------------------------------------\ + | | +diff -Naur alliance-5.0/abl/src/main.c alliance/src/abl/src/main.c +--- alliance-5.0/abl/src/main.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/abl/src/main.c 2002-09-30 18:19:38.000000000 +0200 +@@ -0,0 +1,136 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++ ++static char Buffer[ 512 ]; ++ ++ablexpr *bitstring2abl( Variable, Left, Right, BitString ) ++ ++ char *Variable; ++ int Left; ++ int Right; ++ char *BitString; ++{ ++ ablexpr *Equation; ++ ablexpr *Expr; ++ int Reverse; ++ int BitIndex; ++ int Index; ++ ++ if ( Left > Right ) ++ { ++ Reverse = Right; ++ Right = Left; ++ Left = Reverse; ++ ++ Reverse = 1; ++ BitIndex = Right - Left; ++ } ++ else ++ { ++ Reverse = 0; ++ BitIndex = 0; ++ } ++ ++ Equation = createabloper( ABL_AND ); ++ ++ for ( Index = Left; Index <= Right; Index++ ) ++ { ++ sprintf( Buffer, "%s %d", Variable, Index ); ++ ++ if ( BitString[ BitIndex ] == '0' ) ++ { ++ addablhexpr( Equation, createablnotexpr( createablatom( Buffer ) ) ); ++ } ++ else ++ if ( BitString[ BitIndex ] == '1' ) ++ { ++ addablhexpr( Equation, createablatom( Buffer ) ); ++ } ++ else break; ++ ++ if ( Reverse ) BitIndex--; ++ else BitIndex++; ++ } ++ ++ if ( ABL_CDR( Equation ) == (ablexpr *)0 ) ++ { ++ delablexpr( Equation ); ++ Expr = createablatom( "'1'" ); ++ } ++ else ++ if ( ABL_CDDR( Equation ) == (ablexpr *)0 ) ++ { ++ Expr = dupablexpr( ABL_CADR( Equation ) ); ++ delablexpr( Equation ); ++ } ++ else ++ { ++ Expr = Equation; ++ } ++ ++ return( Expr ); ++} ++ ++int main( argc, argv ) ++ ++ int argc; ++ char **argv; ++{ ++ ablexpr *Expr1; ++ ablexpr *Expr2; ++ ++ mbkenv(); ++ autenv(); ++ ablenv(); ++ ++ Expr1 = createablbinexpr( ABL_XOR, ++ createablatom( "'1'" ), ++ createablatom( "a" ) ); ++ Expr1 = simpablexpr( Expr1 ); ++ viewablexpr( Expr1, ABL_VIEW_VHDL ); ++ ++ return( 0 ); ++ ++/*\ ++ if ( argc < 5 ) ++ { ++ fprintf( stdout, "%s Variable Left Right BitString\n", argv[0] ); ++ } ++ else ++ { ++ Expr = bitstring2abl( argv[1], atoi( argv[2] ), atoi( argv[3] ), argv[4] ); ++ viewablexpr( Expr, ABL_VIEW_VHDL ); ++ fprintf( stdout, "\n" ); ++ delablexpr( Expr ); ++ } ++\*/ ++} +diff -Naur alliance-5.0/abl/src/Makefile.in alliance/src/abl/src/Makefile.in +--- alliance-5.0/abl/src/Makefile.in 2007-07-18 19:04:05.000000000 +0200 ++++ alliance/src/abl/src/Makefile.in 2009-06-13 22:27:06.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libAbl_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -70,11 +68,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libAbl_la_SOURCES) + DIST_SOURCES = $(libAbl_la_SOURCES) +@@ -149,6 +147,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -171,6 +172,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -237,6 +241,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -248,6 +255,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -297,6 +307,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -304,6 +317,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-alcban.patch b/alliance-alcban.patch new file mode 100644 index 0000000..167e0dc --- /dev/null +++ b/alliance-alcban.patch @@ -0,0 +1,329 @@ +diff -Naur alliance-5.0/alcban/configure.in alliance/src/alcban/configure.in +--- alliance-5.0/alcban/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/alcban/configure.in 2002-04-04 15:43:26.000000000 +0200 +@@ -0,0 +1,32 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/alcbanner.c) ++ ++ALCBANNER_MAJOR_VERSION=1 ++ALCBANNER_MINOR_VERSION=1 ++ALCBANNER_VERSION=$ALCBANNER_MAJOR_VERSION.$ALCBANNER_MINOR_VERSION ++ ++AC_SUBST(ALCBANNER_MAJOR_VERSION) ++AC_SUBST(ALCBANNER_MINOR_VERSION) ++AC_SUBST(ALCBANNER_VERSION) ++ ++# For automake. ++VERSION=$ALCBANNER_VERSION ++PACKAGE=alcbanner ++ ++dnl Initialize automake stuff ++AM_INIT_AUTOMAKE($PACKAGE, $VERSION) ++ ++dnl Checks for programs. ++AC_PROG_CC ++AC_PROG_MAKE_SET ++ ++dnl Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++man1/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/alcban/Makefile.in alliance/src/alcban/Makefile.in +--- alliance-5.0/alcban/Makefile.in 2007-07-18 19:04:07.000000000 +0200 ++++ alliance/src/alcban/Makefile.in 2009-06-13 22:27:08.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/alcban/man1/Makefile.in alliance/src/alcban/man1/Makefile.in +--- alliance-5.0/alcban/man1/Makefile.in 2007-07-18 19:04:07.000000000 +0200 ++++ alliance/src/alcban/man1/Makefile.in 2009-06-13 22:27:08.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/alcban/src/Makefile.in alliance/src/alcban/src/Makefile.in +--- alliance-5.0/alcban/src/Makefile.in 2007-07-18 19:04:07.000000000 +0200 ++++ alliance/src/alcban/src/Makefile.in 2009-06-13 22:27:08.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,8 +14,6 @@ + + @SET_MAKE@ + +-SOURCES = $(alcbanner_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -59,11 +57,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(alcbanner_SOURCES) + DIST_SOURCES = $(alcbanner_SOURCES) +@@ -136,6 +134,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -158,6 +159,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -224,6 +228,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -235,6 +242,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -284,6 +294,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -291,6 +304,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-asimut.patch b/alliance-asimut.patch new file mode 100644 index 0000000..9e0d709 --- /dev/null +++ b/alliance-asimut.patch @@ -0,0 +1,608 @@ +diff -Naur alliance-5.0/asimut/configure.in alliance/src/asimut/configure.in +--- alliance-5.0/asimut/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/asimut/configure.in 2002-10-16 20:04:20.000000000 +0200 +@@ -0,0 +1,53 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.5 2002/10/16 18:04:20 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/vh_simulad.c) ++CST_DLL_VERSION=3:2:0 ++SCH_DLL_VERSION=3:2:0 ++AC_SUBST(CST_DLL_VERSION) ++AC_SUBST(SCH_DLL_VERSION) ++AM_INIT_AUTOMAKE(asimut, 3.2) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_YACC ++AM_PROG_LEX ++AC_HEADER_STDC ++AC_CHECK_HEADERS(strings.h unistd.h) ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man1/Makefile ++]) +diff -Naur alliance-5.0/asimut/Makefile.in alliance/src/asimut/Makefile.in +--- alliance-5.0/asimut/Makefile.in 2007-07-18 19:04:08.000000000 +0200 ++++ alliance/src/asimut/Makefile.in 2009-06-13 22:27:08.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/asimut/man1/Makefile.in alliance/src/asimut/man1/Makefile.in +--- alliance-5.0/asimut/man1/Makefile.in 2007-07-18 19:04:08.000000000 +0200 ++++ alliance/src/asimut/man1/Makefile.in 2009-06-13 22:27:08.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/asimut/src/c_hada_repondeur.c alliance/src/asimut/src/c_hada_repondeur.c +--- alliance-5.0/asimut/src/c_hada_repondeur.c 2002-04-04 17:44:23.000000000 +0200 ++++ alliance/src/asimut/src/c_hada_repondeur.c 2009-06-13 22:16:11.000000000 +0200 +@@ -8,6 +8,7 @@ + /* ###--------------------------------------------------------------### */ + + #include ++#include + #include "mut.h" + #include "log.h" + #include "beh.h" +diff -Naur alliance-5.0/asimut/src/c_sr1k_8b.c alliance/src/asimut/src/c_sr1k_8b.c +--- alliance-5.0/asimut/src/c_sr1k_8b.c 2005-05-11 10:05:19.000000000 +0200 ++++ alliance/src/asimut/src/c_sr1k_8b.c 2009-06-13 22:18:05.000000000 +0200 +@@ -38,6 +38,7 @@ + #include "vh_ltype.h" + #include "vh_lspec.h" + #include "vh_xspec.h" ++#include "vh_xcomm.h" + + + /* ###--------------------------------------------------------------### */ +diff -Naur alliance-5.0/asimut/src/Makefile.am alliance/src/asimut/src/Makefile.am +--- alliance-5.0/asimut/src/Makefile.am 2005-01-19 16:13:48.000000000 +0100 ++++ alliance/src/asimut/src/Makefile.am 2009-06-13 22:12:26.000000000 +0200 +@@ -26,23 +26,23 @@ + + asimut_LDADD = \ + -L. libCst.la libSch.la \ +--L$(top_srcdir)/mbkvti/src \ +--L$(top_srcdir)/mbkedif/src \ +--L$(top_srcdir)/mbkhilo/src \ +--L$(top_srcdir)/mbkvrlog/src \ +--L$(top_srcdir)/mbkspice/src \ +--L$(top_srcdir)/mbkvhdlg/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/bvl/src \ +--L$(top_srcdir)/bhl/src \ +--L$(top_srcdir)/beh/src \ +--L$(top_srcdir)/ppt/src \ +--L$(top_srcdir)/phl/src \ +--L$(top_srcdir)/pat/src \ +--L$(top_srcdir)/log/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbkal/src \ ++-L$(top_builddir)/mbkvti/src \ ++-L$(top_builddir)/mbkedif/src \ ++-L$(top_builddir)/mbkhilo/src \ ++-L$(top_builddir)/mbkvrlog/src \ ++-L$(top_builddir)/mbkspice/src \ ++-L$(top_builddir)/mbkvhdlg/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/bvl/src \ ++-L$(top_builddir)/bhl/src \ ++-L$(top_builddir)/beh/src \ ++-L$(top_builddir)/ppt/src \ ++-L$(top_builddir)/phl/src \ ++-L$(top_builddir)/pat/src \ ++-L$(top_builddir)/log/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbkal/src \ + -lMlu \ + -lMal \ + -lMcl -lMel -lMhl -lMgl -lMsl \ +diff -Naur alliance-5.0/asimut/src/Makefile.in alliance/src/asimut/src/Makefile.in +--- alliance-5.0/asimut/src/Makefile.in 2007-07-18 19:04:08.000000000 +0200 ++++ alliance/src/asimut/src/Makefile.in 2009-06-13 22:27:09.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -16,8 +16,6 @@ + + + +-SOURCES = $(libCst_la_SOURCES) $(libSch_la_SOURCES) $(asimut_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -94,11 +92,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libCst_la_SOURCES) $(libSch_la_SOURCES) $(asimut_SOURCES) + DIST_SOURCES = $(libCst_la_SOURCES) $(libSch_la_SOURCES) \ +@@ -174,6 +172,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -196,6 +197,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -262,6 +266,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -273,6 +280,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -322,6 +332,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -329,6 +342,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -413,23 +429,23 @@ + libSch_la_LDFLAGS = -version-info @SCH_DLL_VERSION@ + asimut_LDADD = \ + -L. libCst.la libSch.la \ +--L$(top_srcdir)/mbkvti/src \ +--L$(top_srcdir)/mbkedif/src \ +--L$(top_srcdir)/mbkhilo/src \ +--L$(top_srcdir)/mbkvrlog/src \ +--L$(top_srcdir)/mbkspice/src \ +--L$(top_srcdir)/mbkvhdlg/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/bvl/src \ +--L$(top_srcdir)/bhl/src \ +--L$(top_srcdir)/beh/src \ +--L$(top_srcdir)/ppt/src \ +--L$(top_srcdir)/phl/src \ +--L$(top_srcdir)/pat/src \ +--L$(top_srcdir)/log/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbkal/src \ ++-L$(top_builddir)/mbkvti/src \ ++-L$(top_builddir)/mbkedif/src \ ++-L$(top_builddir)/mbkhilo/src \ ++-L$(top_builddir)/mbkvrlog/src \ ++-L$(top_builddir)/mbkspice/src \ ++-L$(top_builddir)/mbkvhdlg/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/bvl/src \ ++-L$(top_builddir)/bhl/src \ ++-L$(top_builddir)/beh/src \ ++-L$(top_builddir)/ppt/src \ ++-L$(top_builddir)/phl/src \ ++-L$(top_builddir)/pat/src \ ++-L$(top_builddir)/log/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbkal/src \ + -lMlu \ + -lMal \ + -lMcl -lMel -lMhl -lMgl -lMsl \ +diff -Naur alliance-5.0/asimut/src/sch_debug.c alliance/src/asimut/src/sch_debug.c +--- alliance-5.0/asimut/src/sch_debug.c 2005-05-11 10:05:19.000000000 +0200 ++++ alliance/src/asimut/src/sch_debug.c 2009-06-13 22:42:25.000000000 +0200 +@@ -794,7 +794,7 @@ + { + size = siz [(typ [idx] & TYPE_DFN)]; + pntr = (void *) +- (((unsigned int) pnt [idx].dat) + (size * nmbrs [1])); ++ (((unsigned long) pnt [idx].dat) + (size * nmbrs [1])); + push (stk, &stkpnt, pntr, pshtype); + readflg = 1; + } +@@ -811,7 +811,7 @@ + { + size = sizeof (void *); + pntr = * (void **) +- (((unsigned int) pnt [idx].dat) + (size * nmbrs [1])); ++ (((unsigned long) pnt [idx].dat) + (size * nmbrs [1])); + push (stk, &stkpnt, pntr, pshtype); + readflg = 1; + } +diff -Naur alliance-5.0/asimut/src/sch.h alliance/src/asimut/src/sch.h +--- alliance-5.0/asimut/src/sch.h 2002-04-04 17:44:24.000000000 +0200 ++++ alliance/src/asimut/src/sch.h 2009-06-13 22:13:24.000000000 +0200 +@@ -10,6 +10,8 @@ + #ifndef SCH_SCHDEF + #define SCH_SCHDEF + ++#include "mut.h" ++ + /* ###------------------------------------------------------### */ + /* basic defines */ + /* ###------------------------------------------------------### */ +diff -Naur alliance-5.0/asimut/src/sch_hash.c alliance/src/asimut/src/sch_hash.c +--- alliance-5.0/asimut/src/sch_hash.c 2002-04-04 17:44:24.000000000 +0200 ++++ alliance/src/asimut/src/sch_hash.c 2009-06-13 22:12:52.000000000 +0200 +@@ -21,7 +21,7 @@ + { + unsigned int index; + +- index = (unsigned int) ident; ++ index = (unsigned long) ident; + index = (((index >> 2) ^ (index >> 10)) + (index >> 12) + (index >> 20)); + index &= index & 0x000000ff; + +diff -Naur alliance-5.0/asimut/src/vh_debug.c alliance/src/asimut/src/vh_debug.c +--- alliance-5.0/asimut/src/vh_debug.c 2005-05-11 10:05:19.000000000 +0200 ++++ alliance/src/asimut/src/vh_debug.c 2009-06-13 22:14:52.000000000 +0200 +@@ -36,7 +36,7 @@ + int i; + struct chain *ptr_abl; + static char *buffer = NULL; +- static int buffer_size = 0; ++ static long buffer_size = 0; + static struct circuit *circuit_pnt = NULL; + + struct chain *chain_pnt; +@@ -1902,7 +1902,7 @@ + { + size = siz [(typ [idx] & TYPE_DFN)]; + pntr = (void *) +- (((unsigned int) pnt [idx].dat) + (size * nmbrs [1])); ++ (((unsigned long) pnt [idx].dat) + (size * nmbrs [1])); + push (stk, &stkpnt, pntr, pshtype); + readflg = 1; + } +@@ -1919,7 +1919,7 @@ + { + size = sizeof (void *); + pntr = * (void **) +- (((unsigned int) pnt [idx].dat) + (size * nmbrs [1])); ++ (((unsigned long) pnt [idx].dat) + (size * nmbrs [1])); + push (stk, &stkpnt, pntr, pshtype); + readflg = 1; + } +diff -Naur alliance-5.0/asimut/src/vh_xcomm.c alliance/src/asimut/src/vh_xcomm.c +--- alliance-5.0/asimut/src/vh_xcomm.c 2005-05-11 10:05:20.000000000 +0200 ++++ alliance/src/asimut/src/vh_xcomm.c 2009-06-13 22:42:56.000000000 +0200 +@@ -51,7 +51,7 @@ + /* called funct : mbkalloc, addht, gethtitem, addhtitem, */ + /* ###--------------------------------------------------------------### */ + +-unsigned int vhx_getvalu (pt_lkdins, pt_ptmem, size, pt_func) ++unsigned long vhx_getvalu (pt_lkdins, pt_ptmem, size, pt_func) + + struct lkdins *pt_lkdins ; + char **pt_ptmem ; +@@ -71,17 +71,17 @@ + + pt_mem = (char *) gethtitem (mem_tabl, pt_lkdins); + +- if (((int) pt_mem) == EMPTYHT) ++ if (((long) pt_mem) == EMPTYHT) + { + pt_mem = mbkalloc (size); +- addhtitem (mem_tabl, pt_lkdins, (int) pt_mem); ++ addhtitem (mem_tabl, pt_lkdins, (long) pt_mem); + addhtitem (siz_tabl, pt_lkdins, size ); + + if (pt_func != NULL) + (* pt_func) (pt_lkdins, pt_mem); + } + +- size = (unsigned int) gethtitem (siz_tabl, pt_lkdins); ++ size = (unsigned long) gethtitem (siz_tabl, pt_lkdins); + *pt_ptmem = pt_mem; + + return (size); +@@ -93,7 +93,7 @@ + /* called func. : vhx_getvalu */ + /* ###--------------------------------------------------------------### */ + +-unsigned int vhx_getsize (pt_lkdfig) ++unsigned long vhx_getsize (pt_lkdfig) + + struct lkdfig *pt_lkdfig; + +diff -Naur alliance-5.0/asimut/src/vh_xcomm.h alliance/src/asimut/src/vh_xcomm.h +--- alliance-5.0/asimut/src/vh_xcomm.h 2002-04-04 17:44:23.000000000 +0200 ++++ alliance/src/asimut/src/vh_xcomm.h 2009-06-13 22:42:52.000000000 +0200 +@@ -8,8 +8,8 @@ + /* the simulation funciotns */ + /* ###--------------------------------------------------------------### */ + +-extern unsigned int vhx_getvalu (); +-extern unsigned int vhx_getsize (); ++extern unsigned long vhx_getvalu (); ++extern unsigned long vhx_getsize (); + extern char vhx_gexeval (); + extern char vhx_muxbit (); + extern char vhx_worbit (); +diff -Naur alliance-5.0/asimut/src/vh_xspec.c alliance/src/asimut/src/vh_xspec.c +--- alliance-5.0/asimut/src/vh_xspec.c 2005-05-11 10:05:20.000000000 +0200 ++++ alliance/src/asimut/src/vh_xspec.c 2009-06-13 22:16:56.000000000 +0200 +@@ -14,6 +14,7 @@ + #include + #include + #include "mut.h" ++#include "mlo.h" + #include "beh.h" + #include "log.h" + #include "pat.h" +@@ -1153,7 +1154,7 @@ + unsigned int l_tim = 0; /* Statistics last_time access */ + unsigned int res = 0; + +- switch((unsigned int)ctx) ++ switch((unsigned long)ctx) + { + case CTXPRB : + if (value == '1') diff --git a/alliance-attila.patch b/alliance-attila.patch new file mode 100644 index 0000000000000000000000000000000000000000..9268bf399b76637ce7cd15387a23215f8bd8f326 GIT binary patch literal 49084 zcmeHwd3=*a{{PbhXd_1`$QDJMrU9DfXr3fJ(ppTK-lPXffC|+#O`f))xy+M5vAC8} z1feQwRaUElS{KpoqHYzBDj-|%>Y}b)U0oK}qaM40?h3lA@_o%bN1hxl(9+-jUT)@( z95e6v%*Pz~XS&EiNk|&6LSAEIyyzVac$%T@Cg|zn75N zT`VAj^jaeUcv7j91&u@{5m#r+rE**<$AKKrmCJMGa+#b7KrF}Qa-LW$W(kc{TB1TO zS4ib*sX`4D@?51l7gq%lQpn{zjRr{N5;+j#5|t8YG(54*rRmJZWd%l4TBK|uRL|ga zE`bQ?bTv>*QbDoXi&)~cG!rtOIJA!Rf1bEnt6QQiDaxmY46GOAahc2Rvs)bY>j;(z zAbtLZ2A)`3f!Jr(E;ChCXqObF3271%Ammm7lF>C0)@BkkxV^AT8od@LNp*m(v`Dwa zTy3Z-Ni!A|N&rdN&z*<22u*xmqq1nC3P z>wwT$R0#5buZeK+!~g)o+T;cToyFyH`#^);WrGEPCc;akfTe!B&+clJ0GUiCpwKOL zAHaFy277Qht0Y%bB{5v#G{?8jL)eH0QUXYy*KhUty#y%%7MBfJ-A<3)L3n|+$>OzG zeT3Ie`s`NNaKt>VUSFoI)D@w>I&;-BQ}r@a+A5y7!qQB@;mi{gK5Itc9~`HFe>QjM zKc~fohXCmLAINpJh-VvJRzSKT*+!BYk)b2XkH~N+0J5d>Y$=`taCNR+l`B_=34oC# z$;c$tQhAmXR|171SCJiwB$O$*BnQfr94JzxseoY(==x*?>wRj0o?Do5C7N6bil7KRo z6*VM)MtL&Nng^r;6BNN*_CbjZOCsr#(3~8xa7d!jzJ?%y-{r77?U3yr!t1n?q}}a; zg52u%tb?;E!|eq&JL&V<>-|0g*nJY17s-9M7k#_^KHzlQ>Q`AI>!u?&>MQ3PUp5LA~`hSe-M3Rb^V9|j7Jf}rZ41|dEK zN6}2qrp9azBXO5k7lu*~iPG@E^6Id9hD1S-A)Hchl!hl>ZZs)sDvQI%ZNvm_1} zJfVKVio!`3^oWOQ5*Eusxn%~R+*r+dY_3V)ItM{E5rj`_cUl?=GQ(=|!=0F{(cTd8 zv6-{k9X0d0Y`{k)Fs_IDbFC%!!5>%WW@hGQD#P~uoCkmExxb{WI49eZj3r~IF&GjO zFg_nkPR3GFFdWAU3b2(cF{>48ZpKIwYi-3kI?AuoJG;8Dt}e2xtF^lu z>+UAIyIZ@vySlr(dwQ^*9&1lecTZ1GUmw=jx3aI#+Sk|D-;ee8TL%ZR!NI|yA#7-9 zaA;`g*fH$bG5pvu^|50G!^7C{Fg`r29v&V(aRNJW;>79G*y+>!)2EY9pTUed-^3)pE)$`;P?C6Ff5N(3o6~fMXYt$T?DZB0O7I$cLUM~j!POh zxt+w=L@|?dY;u^%J#j*qErFwYJqHPl^sbcrO~qzF`OEL*r*x)>xKxfxrSI=Ni-?6@dV*`W3gF`2VhEEKiIDO)RPJw8MhW}bX@)ynpEa3>Y zfRVqm(rb_G-KE>WPgZ%r0d3r5{(OZBXzJo)rl=H!nmP~@A9q>x?9V`ZdE(3|#dZ7- zLD?N?3-~pA>#*0cNqkJ>(O|DmiN9p(ks7`hi?4p5ysl2ObHk+ExutEneILj4CL|@l zAUgT+Pv$}2+fWylv~a@|eu8cG&TloP zlP|k8VGE|!9@sKVe9h|#DcbhV8L~kKW_hY(a>CxNwQoGv_vMW-F%u|J?M{!|>$A9g zV-u@E*~cbZgGfxAfDJC@{G{xN``iRRpP!tZEE0*-YIQ*YUQkd_US4i67*?(nS*^)d ztHEluHa8bEH#d`{p|!QOqobpjaKi9#%J8rV?V48(4_k+a zTbaEx|HKLW#EAm5iDq}u>eHvonSFEu+DfPV*JgY){5Jw;pZgQ`Ov1cU&rRBm@w3uD zc=FJVTc!#G1&1s|idL+YtjFGZ*jh4op5*x6Bl3-#g)0nuOpod|ZrPgHYuoast>=xd z3jMw<>bDop;)(g|KlorT32sTsTw%a4jn;5y#T8R$?i0qB-#cx`9L#Gh;fXioRDbY- zV1qq&kyR~uPart*?o9nJY;(889!{EBwc(i$+?{1EpoZw9NZ2@4Wt? zVB@sgdy7mO?Zf%ET{He14Z z%4$XUo*3(huq`(98mzt6=Dud`&bW7|H@Z2FhM!sB?1>-6#KC*wm)rUC_58Gyza84l z6EEN=c$RL6y)jXcW74#>?VrL=d*q6mx&^vPv*Lxj`A;0&7&jw9pTpl78#{Sg{Jf^4 zC#@aW^y=kDuiDjC8asc|)AK|}wb*1)Op6I@SlD)_aohAOPWH98{U$E|9>*7k598xx ziC662d0ew;YuVkhrahXE4<^i+RJre6O-x53UjXh(J|G`ByghZv{k17zBBiF=H%2`I zlXHwxlP-4xr6yCtc}mSpj?@fja${m*Vq;_D;^N}t<0nm;Ga=Oorca+fW5x_VpFeZv%%r5GS+i!%o;~~Gi!YutXU;Ev@r&f-<0^XFfF`Q-qBl#~>KK#-c6DijJAELgB`;lf3W7Nw=7iA19G z^mMUUERjg0QmITP%gD%(%jGzZD-;T)QmIm@GBY!?va+(XvvYEC)M|BZZf;&)-W69| zk)NNxc=6&Zue?&D(P*{Wf`S5_PFGl1SX5M0TwGjIQc_x4T2@w8US7Ur$r8O@Ur|v} zSy@?CRaISGy>#hPgTY`l8cinCvSrJbFJHc5#fqAmnyaq5YURq6t5&V5t*yQK>Z`B0 z<{GovTvu0Tu~_Qs>#bI+&1NGAqM@Oov9YnKsmX4)uU@^nxw+Zla5$Y#m&@gLyFDJy zwbx$j^?FH?^!a>#zkkh|HEY+dZE0y)w{G2a*In1z+PZ%I`s=U1{+GY}87n)w{F|Et+TW9=9_Q6<(6A+z4g}Z z+qd6#+ikbse)}DF+|kw5b?2RT-gVbqci(;YjvYIG^{ZdqbI(2Z-g|F%clUkw-FN@} z_doE!13P!_+_h`hgAYFV&_fSB{P4p)Jw1;+^2o1${p;PkcR%{*qkH!3dF-*r9)JAt z-rnBd{N^{m{q1k}?%n&u6Hh$(6`Q?`n9Xj;;-~WDKVBqlK!$*!BdF7Q? zUVZh|*Is+=_19m2x88pH?LYqUkMF$m&d|`%pZ@fx zci(;Yz4zYx^Pm6x{`>EL@WBUv`O9C99Xs~dzy9_3@#7zU_~GCF_P38d`sm}2KmO#C zPd@$h)8XOa&p!L?^Upv3;)^f7{PN4c|NZa(_{TrK`s%9_Cr+F^dGhP8zy9W%Z~pnu zfBx%V|N8dZZ%>^%b^7$_@4ox)`|rR1_rL%Bpa1;lhaZ0U@y8#3`st@LXM#7mXAvp{L(%M_64CQ}$^V0f$(sb(JzU@MyytVw=+NTab_C&sB*8M-OcNaeXRj)_CHw5$Dw0t)B;cwSX|MBqd@AhBQ zwbS^+>idA>;C(O6e)-VWrC+Jtd3{-%Z<;SG{ov12CdW^pi1v7iHDl9BFgeF2qM6(i zC!*OB&QnC6$Hum~uQ^2J+dI@7RryB4&n$2@ws&Hp;EkSCGc~Ten_jv;u5ggb%pyiF|moUN!_abx9y6J;fbeqK8&@s$0x?c zPu_WSKlb+hi?vCT@}%AEyJCb>zfJRlW!;lz&6B@(QlL%5u1jjt+@4yqdFJI0&rZ-j zs7btNcIghyik`o|)E1XFHDLlJq|fddn}DPG6jT7$5GE9WN|jIb6Hb_ z=ms{rf&HJ~z{2T(C43RIfo&PA5ta7{3VdtamV>SR3-5panI}>fln+W29iLS^tlTo^ z#L_R8E&ccN8f9{ZN|+%<}Z4G$7`>2CC|-oNfJ1>4R5`nbNvry z%|zND_}o@$y~E;a9;5K(W*?&n=8~8|K^#=f`H5pz7^^Kaute-BWEa+kVOSg1hQ8X+ zul@V?x3#sM!7vOOWWld9=oj$(N)=7BqR`x<6WpB#G+v)RYq!z_u3?cqQ%b(nuHRjay?o=0nOUmj+aAQQWIXqS9o5GV-ORsodHmcYfwp~CTp1 zc3H+ym{?K9mJ*d@(GU$|4;)FR43%WM7>u9gYmq;AU~^JT(;rLmU57W%5oN`TuKl?1 zwu=&zx+m1!!9PZo2bFJZ0*uN#aiWW+KSrUI%^3cM8##oSH$)8^qTy#8IJ)2)uvD%t z*mHd2q^Xw_HtnyA>9{d@+EjkRhPJrQm$9h=dG+=?_HT?c-RIS}fz_3939DCE z93dYsm@;Mhdev)BI}c9i35c~8ugmUg9NUvAC-c}uA&0=k$wO`-V-||E4MPHk@!@eC zECs_v7=~k50fv=hm;u99VpubVkr>trMJLvYVO<#3)!N!^Fm$h6+1=XOgJC^tbx(PD zPe(^jS65F@PcMe`;&^XYS09G;i9~&!oqgTieeiHvUq6QR_xASp^$lRy0G~gQoD9ux zF>H{}A52aj6p4l~Y)B-6=C>FIO>Qx4I3)$z*kag;gal|^i($~B7V1EvAsQ}BKtho^ zjrJ3^E@9pg-Q>=V2{Zo&j(F;}Cd|(&?A~XI+q`Mol&yO`shbbqdim1Y*SDk=ZMp>* zKh<0tlX_rwQuQAFO@fU}<_jwK{QczqP33nb8$Bjr^LkaPkyhA z@0_M2oA~_wn$BNkgZ(GBzjFw~61uOO+M3zi85=XlMl4zLX=hx_yw@+@mMLz>W}mv{ zjeB$(uxai88JzcK+n)00u4g`|!Hrv%a%m~#aussjqXu|Zt};6p z$45KDi^Fp;8lE^cC8OT%${?F4!!Ce=zN#c&z!G=38!4Ym0GO((^!WnHB@v7>mQ?7? zg;lzIfe4#Ec9 zF0jt+_X2Vq=_8!yRalVwD{y@fJGq=Rnhg1Zy0uMqYZDOSK(QEP*oZY5F2BQ3hdKcO zU~d4cpf4_g&}cFUz}1vHuAsgV2ysCkfNr)ptVeKOp!C85MTNF9zmDouU~^mR-R@?E z)8eY*iD7DWVR0a}Ug5Dd&(&`(QWcNfwTb#^;IQw1mz+O7EJvDzzskF zoP2gyBdE|;0uMZ$Pdf<{Qndm?W)y;v%bt|%CAea+E6uMx43LT2Ba>FlK{1_HBzF5uu@HFy&lx&i6Eaz z!Uu#b0iGDFZGtZNRsmrukT&{&9QM4;jXGFgR#}uEI&FkFY!5wN=u9{}T&OHU_ysFY zjTY9U8;TEUF92kdy}`#51Do4LjLwy!8k0e5E-W)b|1h<}G=@u}5Sq?43_}rfSVw9y zi}Rd@4;+c~$f2f%4IrV#G!roZ76K(%hHkkL$l#|G{SQtI_t+4C8v{A$Nd?C#ESx(~ zgGXvmePpZsu4blEXpVTPI-vx1s-D|uhSQBZnhUFRVWZjRwuX*o3Kr6DA(5WuMo8Ue z_fq}l@e&R877=nf0TVJ9Uq2eEBO_;L94)aEf`zf;nVJx&8^UJTE{ZbVojk~6i!w8A2zsj$o-suhmXoj?j5 zErJHH9<*4zjU=!(Io&qUC|(;(90^@Gp{SbD6N@895r7%{oXN%verD2fli1lAoXE^N zIz8e9<%#JT85q~>ui%xYy0DnD##9#;k2rNX1V&$0Y;G%HmK2H~K}$-YCe(5g(z(WE z1%+h>xNxBMBLNu9Y8jP%$VBF<8etzjfQGc8eZG6Y1+RY<)eW)B;?Hj11GO>!vu zSSp-39=g<#jn1%neF4_G3$)U)EjX7+eGXne*;z4yQ()-Hhl3gQ34?=!PX*(0=ovyQ z>d6zjsKO60r`enmZb1{|S7vGZ@R37nx03LrIazD9YtY6E#pr*Whw{Z9pi5*C-V0 zwI#+pU~x9&3x$e2P|Fi1YM{2<>UQQYqOLz!L`B1^8XADz1zLjh+T17?09L4y777st z(t(Ug&rb*IfmFIGrTOY~Q65DJB{Zjt09z3Jk-v^07qJL}v{)%L)ZM{fAkpUbnMs0h z<-6QegwNt_Bz*aGNLwM)fc5Ay2QowIC9HlgX>+iG!`>4F79A@xf@6#_tmo%sdTr$Ql3 zf8jzPOoRLu0b!aJ`q-seFM{QANQyu$PYMfKznG|m*Ky^u89$*;= z`3C=U(gMswgorg32kaQCTd4{LxXN6XArJ}~1`9ww5V+g|T2T*q4@PVN%LJ*#DS-8+ ztH`iXMa`J3EM~^=fYVL-9P6wO!r}^a6$t%rvy;BixLO`?TI?>L#qJ`!(vZ}j;Rr`_ zN+8sr0YLRbfGu!pg>fTY1emc7wb}5Z7^t)nEdpq6At9EfL?c@bzkZe@8%{Xp1{eV~ z@&!ELvow-{@s`U2=P4D=L4y)>2iqd>MW zcc{SoQt106@GMG6l^NBlOq^CFiyE`pjKmF5p}?*QiHd4f#;8@vrtbU6VOSlmKY`p1 zkBw?os7q70>LbJ{bd?G>_N@1#zzYv4OFtR9!jrkolzV$<2xi2sbO;XaqBEtqTq;)q zJSP|4HJTG%nW4+p$W4|fy@kDiYygx)N55OELoeI$;M3$rWlk$ z*A!XAF$qSuF0;j)rDCaC-Cn!fVJ8tPzy@Og$(BGF)iRW{kQAiEDJKL%6-H?f^93%8 zpR`*o$ljI-3^58BQWDEKBVAZ{Nh|>_qgeh^6-I$62;#zv2~H01EkJ?FAF-D?r7(no zx|*9FAQPz+Dm83;h7&*#x*1Bg=K>6)(gPzEj(>1A5o`1!R`zyFxO+lY8QcrVqZhFvwMg_LRz@SidCrMm z#2S1zD|O3i^di>iMXaormc8ngGi{<5v2qs}^vwQ0auF+M!y9q)%t;?{Y)DL{kQ?F@h| zP8n1uaLOMgb5?}RAQfn!p2ptj_Y!8i%j5TH;Nwdw(78S9y!OT>A4t=Q0IpW6B=9p6 zeP*H0Z1kCfKGo=LoE&}P(KmBrcr!;`Rt~?SZ{}E;e|~S~RFu85iqZc@cm+poLA6?a z@Ws*5H*@2BGlx^Qqj=Qb`GVLxD=2$sWz^nz0^iJKQ)4!Vk+>nR;h?ApiHg3N8|#}n zWOfoTEf0SOhxV?;MrdnU9?+vi-^_)-gF~E(@MaF~DwR2EWGX1nW~?`(_Rc?7duKV0 zx>}L>bF~VkET1RZ-dRq~7^RY#F;RPGbQmCDlpe4>XAI6+i~fnRcUH>L$j*XaQG4fe zJ_T_WduP(inr4jPktzr=qShn`6)?(BLR$xwDpwWmL24wUj4(<$$QM;6G|5n9<|@K9 zFz02GK{g?S422?Kkf8*)imK$u1{qAYOqeYv16pKcqPD>rffk>;VM0tXGNj`UwNP=h zo_YsAp0J+cGyOCz!O?X&h;;fm16WU2aT)Lc8?XQ$AOJary3%xndUqphf`d8^+1IQG z24an!w7XpZmnkwq#GXW53Dsxo;UOZI+Xvt|Fr(XH@!CmXajkQ@y#z|9KwOflP?Abj zu3W_>$rxY&>0(fC_l!VCiRc8|{3vk1YBV|7v^E=I1Ek;MaeIB}FcfVz0@9QUun=Ua zK)u~ZijYQ-W)HW@3RDzjm&BO{a2}vOp*ki~DOy#Fj2aPYw5=2?;P#TzQt<$2^b;g$ zc9YP}7yzxvPKR0->Y!;30i>k24jzc1ZGVvYP`W~GrIgEGoyjpj&dX%vmak z4?~-?R7{%y+lN^)JS)9e2N@ccArwtG7{0SiWvY%Wl0xy+@TOZEOg$nV(x>VlR(;Ci zDZBvz=7dxUCIspeGHe21&d{OQ9x`+S$iVQSfPqeA1J%TkA%rN97Ap^c>v;gpLa1a@ z;y|oWDkLg&c@8rN8?9Dm62g4+<_zb|J?=acA)78|B1O+->FjN;A*gHjZ*tSQnS3ivjfm&MZN%9j=+5^b?Sm%WZ2m}3Wj=|5RE`5WTa7a8bb;T z>BHc{s16HW^{9p69Dww!9hD+S4vz+8d4a+x6oaHiWMBwaI22jd(9I5E4F}2akcwj; ztEfXpxzG(cr~7LK(0@48T+nI(!X^Q3mt!4$L}wwR%@EM^IOB~97B7K@7u2g|sxu`@ z1rTQ`loFL3DPB=F-EyPZXwn)?%c{-L^`?r%N{eKvvV=*5fdgY(!mcznM$Dc@eE}z!JPC7N)92)&B@f4Ig|tdU}PUd zw88IcX325^kZgvZ^kyJ0GRTX5qcw0ui9-sN5(*V_3k9^GVhZ(GuJsdSP_Yaoq%|lo zVlHq3C%^&bftjWK|L){cz1_n-WWz9?*^HvIVjKXIPMwhAG=^OhSOn*I7dxD|3kMg- zGK>QVN)K?21ECObo5J)-#DW+;Q~R0F7Qql86tN&G8EqVxg5bR4)RiGYZ!VY)q4ek&;3x_<6G{S@HzzkHTrOYr7p~~VSbsY*}10J2!N(JNA zyGy0;xFjfZ`3SGe;s9&H4nuN+RSXn`4B znpVZh$tjl!I$eIF73z~h1MH4Qu{bn^Xh8~Roel!fLXoY`k>GM5&QYo)xB@K{0Dz*( zq{&V(E*A!cq+gB^8IXwzf>oznAo z-3@jJkq1U=su+M&Zc{mr%5({#)XzdKh;aayL5viR|9|J%*NCHmVR8Zyj0e1tS{pq<~GMNm`XXGzmAS^6eUZh9f;?@P8 zozCI4G1tI6(uscfBA0_1_0=&47jASP;dJR}FONfL1smQ+pcOT|_Yxp_QZ@LbYSbmx zxKFA^U1Cv(S_9`6$|`mGWraoNiYilCF|^nWiqP;tS*6hgcXH!3ypOuX0*q&?3*l%y z>JkgO3M;8JPo&{})Fl==Nnp}*xeOT}5(SSN1bY=npx`KIB9G%{eOUp#=|{u-rd_;6 hU1C9=R3P?1P9eK_?g;~w9u~_&xz4WwP;RV-_kX4goo)aC literal 0 HcmV?d00001 diff --git a/alliance-aut.patch b/alliance-aut.patch new file mode 100644 index 0000000..faba844 --- /dev/null +++ b/alliance-aut.patch @@ -0,0 +1,641 @@ +diff -Naur alliance-5.0/aut/configure.in alliance/src/aut/configure.in +--- alliance-5.0/aut/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/aut/configure.in 2002-10-16 20:04:20.000000000 +0200 +@@ -0,0 +1,48 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.7 2002/10/16 18:04:20 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/aut.h) ++AUT_DLL_VERSION=1:3:0 ++AC_SUBST(AUT_DLL_VERSION) ++AM_INIT_AUTOMAKE(aut, 1.3) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man1/Makefile ++man3/Makefile ++]) +diff -Naur alliance-5.0/aut/Makefile.in alliance/src/aut/Makefile.in +--- alliance-5.0/aut/Makefile.in 2007-07-18 19:04:10.000000000 +0200 ++++ alliance/src/aut/Makefile.in 2009-06-13 22:27:10.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/aut/man1/Makefile.in alliance/src/aut/man1/Makefile.in +--- alliance-5.0/aut/man1/Makefile.in 2007-07-18 19:04:10.000000000 +0200 ++++ alliance/src/aut/man1/Makefile.in 2009-06-13 22:27:10.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/aut/man3/Makefile.in alliance/src/aut/man3/Makefile.in +--- alliance-5.0/aut/man3/Makefile.in 2007-07-18 19:04:10.000000000 +0200 ++++ alliance/src/aut/man3/Makefile.in 2009-06-13 22:27:10.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/aut/src/autenv.c alliance/src/aut/src/autenv.c +--- alliance-5.0/aut/src/autenv.c 2002-10-14 14:41:48.000000000 +0200 ++++ alliance/src/aut/src/autenv.c 2009-06-13 19:15:59.000000000 +0200 +@@ -43,8 +43,10 @@ + + # include + # include ++# include + # include + # include ++# include + + # include + # include "aut.h" +diff -Naur alliance-5.0/aut/src/autexit.c alliance/src/aut/src/autexit.c +--- alliance-5.0/aut/src/autexit.c 2002-09-30 18:19:44.000000000 +0200 ++++ alliance/src/aut/src/autexit.c 2009-06-13 19:13:41.000000000 +0200 +@@ -86,7 +86,7 @@ + + void autexit( Value ) + +- int Value; ++ long Value; + { + long *Core = (long *)1; + +diff -Naur alliance-5.0/aut/src/aut.h alliance/src/aut/src/aut.h +--- alliance-5.0/aut/src/aut.h 2002-09-30 18:19:44.000000000 +0200 ++++ alliance/src/aut/src/aut.h 2009-06-13 19:14:15.000000000 +0200 +@@ -268,7 +268,7 @@ + | | + \------------------------------------------------------*/ + +- extern void autexit __P((int Value)); ++ extern void autexit __P((long Value)); + + /*------------------------------------------------------\ + | | +diff -Naur alliance-5.0/aut/src/autresize.c alliance/src/aut/src/autresize.c +--- alliance-5.0/aut/src/autresize.c 2002-09-30 18:19:45.000000000 +0200 ++++ alliance/src/aut/src/autresize.c 2009-06-13 21:49:54.000000000 +0200 +@@ -42,6 +42,7 @@ + \------------------------------------------------------------*/ + + # include ++# include + # include + # include + +diff -Naur alliance-5.0/aut/src/main.c alliance/src/aut/src/main.c +--- alliance-5.0/aut/src/main.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/aut/src/main.c 2002-09-30 18:19:45.000000000 +0200 +@@ -0,0 +1,120 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++# include ++# include ++# include ++ ++# include ++# include "aut.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Aut Sort Compare | ++| | ++\------------------------------------------------------------*/ ++ ++long SortCompare( ValueArray, Index1, Index2 ) ++ ++ long *ValueArray; ++ long Index1; ++ long Index2; ++{ ++ return( ValueArray[ Index2 ] - ValueArray[ Index1 ] ); ++} ++ ++int main( argc, argv ) ++ ++ int argc; ++ char **argv; ++{ ++ FILE *File; ++ long Value; ++ char *Buffer; ++ char *ScanName; ++ long *ValueArray; ++ long *IndexArray; ++ long SizeArray; ++ long Index; ++ ++ if ( argc < 2 ) return( 0 ); ++ ++ autenv(); ++ ++ if ( !strcmp( argv[1], "-sort" ) ) ++ { ++ File = fopen( argv[2], "r" ); ++ ++ if ( File != (FILE *)0 ) ++ { ++ Buffer = autallocblock( 1024 ); ++ Value = 0; ++ Index = -1; ++ ++ while ( fgets( Buffer, 1024, File ) != (char *)0 ) ++ { ++ Value = atoi( Buffer ); ++ ++ if ( Index == -1 ) ++ { ++ SizeArray = Value; ++ ValueArray = (long *)autallocblock( sizeof( long ) * SizeArray ); ++ IndexArray = (long *)autallocblock( sizeof( long ) * SizeArray ); ++ Index = 0; ++ } ++ else ++ { ++ ValueArray[ Index++ ] = Value; ++ } ++ } ++ ++ fclose( File ); ++ ++ sortautarray( ValueArray, IndexArray, SizeArray, 0 ); ++ ++ for ( Index = 0; Index < SizeArray; Index++ ) ++ { ++ fprintf( stdout, "%ld\n", ValueArray[ IndexArray[ Index ] ] ); ++ } ++ } ++ } ++ else ++ if ( !strcmp( argv[1], "-namealloc" ) ) ++ { ++ Buffer = autallocblock( 1024 ); ++ ++ while ( fgets( Buffer, 1024, stdin ) != (char *)0 ) ++ { ++ ScanName = strchr( Buffer, '\n' ); ++ if ( ScanName != (char *)0 ) *ScanName = '\0'; ++ ++ ScanName = autnamealloc( Buffer ); ++ fprintf( stdout, "%s %lx\n", ScanName, (long)ScanName ); ++ } ++ } ++ ++ return( 0 ); ++} +diff -Naur alliance-5.0/aut/src/Makefile.in alliance/src/aut/src/Makefile.in +--- alliance-5.0/aut/src/Makefile.in 2007-07-18 19:04:11.000000000 +0200 ++++ alliance/src/aut/src/Makefile.in 2009-06-13 22:27:11.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libAut_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -68,11 +66,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libAut_la_SOURCES) + DIST_SOURCES = $(libAut_la_SOURCES) +@@ -147,6 +145,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -169,6 +170,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -235,6 +239,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -246,6 +253,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -295,6 +305,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -302,6 +315,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/aut/src/testhash.c alliance/src/aut/src/testhash.c +--- alliance-5.0/aut/src/testhash.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/src/aut/src/testhash.c 2002-09-30 18:19:45.000000000 +0200 +@@ -0,0 +1,45 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++# include ++ ++ ++# include ++# include "aut.h" ++ ++int main( argc, argv ) ++ ++ int argc; ++ char **argv; ++{ ++ authtable *HashTable; ++ ++ HashTable = createauthtable( 10 ); ++ ++ testauthtable( HashTable ); ++ ++ destroyauthtable( HashTable ); ++} diff --git a/alliance-bdd.patch b/alliance-bdd.patch new file mode 100644 index 0000000..4f0a74f --- /dev/null +++ b/alliance-bdd.patch @@ -0,0 +1,487 @@ +diff -Naur alliance-5.0/bdd/configure.in alliance/bdd/configure.in +--- alliance-5.0/bdd/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/bdd/configure.in 2002-10-16 20:04:20.000000000 +0200 +@@ -0,0 +1,48 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.4 2002/10/16 18:04:20 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/bdd.h) ++BDD_DLL_VERSION=1:5:0 ++AC_SUBST(BDD_DLL_VERSION) ++AM_INIT_AUTOMAKE(bdd, 1.5) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man1/Makefile ++man3/Makefile ++]) +diff -Naur alliance-5.0/bdd/Makefile.in alliance/bdd/Makefile.in +--- alliance-5.0/bdd/Makefile.in 2007-07-18 19:04:11.000000000 +0200 ++++ alliance/bdd/Makefile.in 2009-06-13 22:27:11.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/bdd/man1/Makefile.in alliance/bdd/man1/Makefile.in +--- alliance-5.0/bdd/man1/Makefile.in 2007-07-18 19:04:12.000000000 +0200 ++++ alliance/bdd/man1/Makefile.in 2009-06-13 22:27:12.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/bdd/man3/Makefile.in alliance/bdd/man3/Makefile.in +--- alliance-5.0/bdd/man3/Makefile.in 2007-07-18 19:04:12.000000000 +0200 ++++ alliance/bdd/man3/Makefile.in 2009-06-13 22:27:12.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/bdd/src/main.c alliance/bdd/src/main.c +--- alliance-5.0/bdd/src/main.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/bdd/src/main.c 2002-09-30 18:19:50.000000000 +0200 +@@ -0,0 +1,64 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++ ++int main( argc, argv ) ++ ++ int argc; ++ char **argv; ++{ ++ bddcircuit *BddCircuit; ++ bddsystem *BddSystem; ++ ++ mbkenv(); ++ autenv(); ++ ablenv(); ++ bddenv(); ++ ++ BddSystem = createbddsystem( 10, 1000, 3, 100000 ); ++ ++ if ( argc > 1 ) ++ { ++ BddCircuit = (bddcircuit *)undumpbddcircuit( BddSystem, argv[1] ); ++ } ++ else ++ { ++ BddCircuit = createbddcircuit( "Hello", 3, 3, BddSystem ); ++ } ++ ++ testbddcircuit( BddCircuit ); ++ ++ destroybddcircuit( BddCircuit ); ++ destroybddsystem( BddSystem ); ++ ++ return( 0 ); ++} +diff -Naur alliance-5.0/bdd/src/Makefile.in alliance/bdd/src/Makefile.in +--- alliance-5.0/bdd/src/Makefile.in 2007-07-18 19:04:12.000000000 +0200 ++++ alliance/bdd/src/Makefile.in 2009-06-13 22:27:12.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libBdd_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -74,11 +72,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libBdd_la_SOURCES) + DIST_SOURCES = $(libBdd_la_SOURCES) +@@ -153,6 +151,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -175,6 +176,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -241,6 +245,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -252,6 +259,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -301,6 +311,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -308,6 +321,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-beh.patch b/alliance-beh.patch new file mode 100644 index 0000000..591db36 --- /dev/null +++ b/alliance-beh.patch @@ -0,0 +1,491 @@ +diff -Naur alliance-5.0/beh/configure.in alliance/beh/configure.in +--- alliance-5.0/beh/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/beh/configure.in 2002-10-16 20:04:20.000000000 +0200 +@@ -0,0 +1,47 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.3 2002/10/16 18:04:20 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/beh.h) ++BEH_DLL_VERSION=1:11:0 ++AC_SUBST(BEH_DLL_VERSION) ++AM_INIT_AUTOMAKE(beh, 1.11) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man3/Makefile ++]) +diff -Naur alliance-5.0/beh/Makefile.in alliance/beh/Makefile.in +--- alliance-5.0/beh/Makefile.in 2007-07-18 19:04:13.000000000 +0200 ++++ alliance/beh/Makefile.in 2009-06-13 22:27:12.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/beh/man3/Makefile.in alliance/beh/man3/Makefile.in +--- alliance-5.0/beh/man3/Makefile.in 2007-07-18 19:04:13.000000000 +0200 ++++ alliance/beh/man3/Makefile.in 2009-06-13 22:27:12.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/beh/src/beh_dict.c alliance/beh/src/beh_dict.c +--- alliance-5.0/beh/src/beh_dict.c 2002-09-30 18:19:52.000000000 +0200 ++++ alliance/beh/src/beh_dict.c 2009-06-13 20:05:37.000000000 +0200 +@@ -52,7 +52,7 @@ + + { + struct beden *entry; +- int i ; ++ long i ; + + if (BEH_DCEHED == NULL) + { +@@ -91,7 +91,7 @@ + + { + struct bedrd *recrd; +- int i ; ++ long i ; + + if (BEH_DCRHED == NULL) + { +@@ -134,7 +134,7 @@ + + { + struct beden **head; +- int i; ++ long i; + + head = (struct beden **) + mbkalloc (sizeof(struct beden *) * BEH_HSZDFN); +@@ -156,17 +156,17 @@ + struct beden **head; + char *key_str; + char *ctx_str; +-int field; +-int valu; ++long field; ++long valu; + + { +- int found = 0; +- unsigned int key ; +- unsigned int index ; ++ long found = 0; ++ unsigned long key ; ++ unsigned long index ; + struct beden *entry_pnt ; + struct bedrd *recrd_pnt ; + +- key = ((unsigned int) key_str) + ((unsigned int) ctx_str); ++ key = ((unsigned long) key_str) + ((unsigned long) ctx_str); + + index = key % BEH_HSZDFN; + entry_pnt = head [index]; +@@ -238,17 +238,17 @@ + struct beden **head ; + char *key_str; + char *ctx_str; +-int field ; ++long field ; + + { +- int found = 0; ++ long found = 0; + long valu = 0; +- unsigned int key ; +- unsigned int index ; ++ unsigned long key ; ++ unsigned long index ; + struct beden *entry_pnt; + struct bedrd *recrd_pnt; + +- key = ((unsigned int) key_str) + ((unsigned int) ctx_str); ++ key = ((unsigned long) key_str) + ((unsigned long) ctx_str); + + index = key % BEH_HSZDFN; + entry_pnt = head [index]; +@@ -317,7 +317,7 @@ + struct beden *pt_entry ; + struct beden *pt_nxtentry; + struct bedrd *pt_record ; +- int i ; ++ long i ; + + if (pt_hash != NULL) + { +diff -Naur alliance-5.0/beh/src/beh.h alliance/beh/src/beh.h +--- alliance-5.0/beh/src/beh.h 2002-09-30 18:19:51.000000000 +0200 ++++ alliance/beh/src/beh.h 2009-06-13 22:01:33.000000000 +0200 +@@ -277,6 +277,7 @@ + /* ###------------------------------------------------------### */ + + extern struct beaux *beh_addbeaux (); ++extern struct bequad *beh_addbequad (); + extern struct bebux *beh_addbebux (); + extern struct bebus *beh_addbebus (); + extern struct befig *beh_addbefig (); +diff -Naur alliance-5.0/beh/src/beh_rplstable.c alliance/beh/src/beh_rplstable.c +--- alliance-5.0/beh/src/beh_rplstable.c 2002-09-30 18:19:53.000000000 +0200 ++++ alliance/beh/src/beh_rplstable.c 2009-06-13 20:06:28.000000000 +0200 +@@ -48,11 +48,11 @@ + struct chain *opr_lst; + char *sig_nam; + struct chain *new_abl; +- unsigned int opera ; ++ unsigned long opera ; + + if (pt_abl->NEXT != NULL) + { +- opera = (unsigned int) ((struct chain *) pt_abl->DATA)->DATA; ++ opera = (unsigned long) ((struct chain *) pt_abl->DATA)->DATA; + if (opera == STABLE) + { + sig_nam = (char *) ((struct chain *) pt_abl->NEXT->DATA)->DATA; +diff -Naur alliance-5.0/beh/src/beh_toolbug.c alliance/beh/src/beh_toolbug.c +--- alliance-5.0/beh/src/beh_toolbug.c 2002-09-30 18:19:53.000000000 +0200 ++++ alliance/beh/src/beh_toolbug.c 2009-06-14 00:36:03.000000000 +0200 +@@ -68,7 +68,7 @@ + fprintf (stderr,"cannot drive empty or erroneous description\n"); + break; + case 15 : +- fprintf (stderr,"illegal bit string value : `%c`\n",nbr1); ++ fprintf (stderr,"illegal bit string value : `%c`\n",(char)nbr1); + break; + case 16 : + fprintf (stderr,"the same expression cannot be used twice\n"); +diff -Naur alliance-5.0/beh/src/beh_vhvector.c alliance/beh/src/beh_vhvector.c +--- alliance-5.0/beh/src/beh_vhvector.c 2002-09-30 18:19:53.000000000 +0200 ++++ alliance/beh/src/beh_vhvector.c 2009-06-13 20:06:43.000000000 +0200 +@@ -30,6 +30,7 @@ + /* ###--------------------------------------------------------------### */ + + #include ++#include + #include "mut.h" + #include "log.h" + #include "beh.h" +@@ -46,7 +47,7 @@ + { + char *new_name ; + char tmp1 [256] ; +- int i = 0 ; ++ long i = 0 ; + static struct beden **tab = NULL; + + /* ###------------------------------------------------------### */ + +diff -Naur alliance-5.0/beh/src/Makefile.in alliance/beh/src/Makefile.in +--- alliance-5.0/beh/src/Makefile.in 2007-07-18 19:04:13.000000000 +0200 ++++ alliance/beh/src/Makefile.in 2009-06-13 22:27:13.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libBeh_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -87,11 +85,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libBeh_la_SOURCES) + DIST_SOURCES = $(libBeh_la_SOURCES) +@@ -166,6 +164,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -188,6 +189,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -254,6 +258,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -265,6 +272,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -314,6 +324,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -321,6 +334,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-bhl.patch b/alliance-bhl.patch new file mode 100644 index 0000000..b9dc4d9 --- /dev/null +++ b/alliance-bhl.patch @@ -0,0 +1,542 @@ +diff -Naur alliance-5.0/bhl/configure.in alliance/bhl/configure.in +--- alliance-5.0/bhl/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/bhl/configure.in 2002-10-16 20:04:20.000000000 +0200 +@@ -0,0 +1,46 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.3 2002/10/16 18:04:20 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/bhl.h) ++BHL_DLL_VERSION=1:11:0 ++AC_SUBST(BHL_DLL_VERSION) ++AM_INIT_AUTOMAKE(bhl, 1.11) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/bhl/Makefile.in alliance/bhl/Makefile.in +--- alliance-5.0/bhl/Makefile.in 2007-07-18 19:04:13.000000000 +0200 ++++ alliance/bhl/Makefile.in 2009-06-13 22:27:13.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/bhl/src/beh_debug.c alliance/bhl/src/beh_debug.c +--- alliance-5.0/bhl/src/beh_debug.c 2005-05-11 10:05:29.000000000 +0200 ++++ alliance/bhl/src/beh_debug.c 2009-06-13 20:07:37.000000000 +0200 +@@ -36,7 +36,7 @@ + #include "beh_debug.h" + + static char *buffer = NULL; +-static unsigned int buff_size = 0; ++static unsigned long buff_size = 0; + static struct circuit *circuit_pnt = NULL; + + +@@ -55,7 +55,7 @@ + + { + +- int i; ++ long i; + struct chain *ptr_abl; + + struct chain *chain_pnt; +@@ -79,7 +79,7 @@ + + char **string_pnt; + char *character_pnt; +- int *int_pnt; ++ long *int_pnt; + + /* ###------------------------------------------------------### */ + /* initialization */ +@@ -516,7 +516,7 @@ + + case integer_DFN : + +- int_pnt = (int *) curpnt.data; ++ int_pnt = (long *) curpnt.data; + + typ [integer_DFN] = IMMEDIATE_DFN | d_DFN | integer_DFN; + pnt [integer_DFN].imd = *int_pnt; +@@ -641,17 +641,17 @@ + /* called func. : none */ + /* ###--------------------------------------------------------------### */ + +-static int splitline (words, line) ++static long splitline (words, line) + + char **words; + char *line ; + { + + char *heap = *words; +- int new = 1; +- int wrdcnt = 0; +- int i = 0; +- int j = 0; ++ long new = 1; ++ long wrdcnt = 0; ++ long i = 0; ++ long j = 0; + + /* ###------------------------------------------------------### */ + /* copy the line read from input into the words until a */ +@@ -692,12 +692,12 @@ + static void push (stk, stkpnt, data, type) + + struct stack *stk; +-int *stkpnt; ++long *stkpnt; + void *data; + short type; + + { +- int stkidx = *stkpnt; ++ long stkidx = *stkpnt; + + if (stkidx == STKSIZ_DFN) + fprintf (stdout, "beh_debug :\tSTACK OVERFLOW !!\tSTACK OVERFLOW !!\n"); +@@ -724,11 +724,11 @@ + + static void pop (stkpnt, count) + +-int *stkpnt; +-int count; ++long *stkpnt; ++long count; + + { +- int stkidx = *stkpnt; ++ long stkidx = *stkpnt; + + if (stkidx <= count) + stkidx = 0; +@@ -748,7 +748,7 @@ + static struct chain *goforward (pnt, count) + + struct chain *pnt; +-int count; ++long count; + + { + while ((count > 0) && (pnt != NULL) && (pnt->NEXT != NULL)) +@@ -767,17 +767,17 @@ + /* called func. : none */ + /* ###--------------------------------------------------------------### */ + +-static int translate (words, wrdcnt, strgs, nmbrs, flags, indxs) ++static long translate (words, wrdcnt, strgs, nmbrs, flags, indxs) + + char **words; /* list of words */ +-int wrdcnt; /* number of words */ ++long wrdcnt; /* number of words */ + char **strgs; /* list of recognized strings */ +-int *nmbrs; /* words translated to numbers */ ++long *nmbrs; /* words translated to numbers */ + char *flags; /* set if word is a number */ +-int *indxs; /* words' index in strgs table */ ++long *indxs; /* words' index in strgs table */ + + { +- int i , j; ++ long i , j; + + /* ###------------------------------------------------------### */ + /* initialize flags and indxs */ +@@ -813,10 +813,10 @@ + + static void getsize (siz) + +-unsigned int siz []; ++unsigned long siz []; + + { +- int i; ++ long i; + + for (i=0 ; i ++#include ++#include + #include "mut.h" + #include "log.h" + #include "beh.h" +@@ -57,7 +59,7 @@ + struct chain *del_chain = NULL; + struct chain *tmp_chain = NULL; + struct chain *mem_chain = NULL; +- int value ; ++ long value ; + + if (pt_fig->ERRFLG == 0) + { +@@ -97,7 +99,7 @@ + exit( pt_fig->ERRFLG ); + } + else +- tmp_chain->DATA = (void *) value; ++ tmp_chain->DATA = (chain_list *) value; + + tmp_chain = tmp_chain->NEXT; + } +@@ -129,7 +131,7 @@ + struct beout *pt_out ; + struct bebus *pt_bus ; + struct biabl *pt_biabl ; +- unsigned int count = 0; ++ unsigned long count = 0; + + /* ###------------------------------------------------------### */ + /* if there is no error in the current figure ... */ +@@ -155,7 +157,7 @@ + + while (pt_rin != NULL) + { +- addhtitem (rin_list, pt_rin->NAME, (int) pt_rin); ++ addhtitem (rin_list, pt_rin->NAME, (long) pt_rin); + pt_rin = pt_rin->NEXT; + } + +diff -Naur alliance-5.0/bhl/src/beh_makquad.c alliance/bhl/src/beh_makquad.c +--- alliance-5.0/bhl/src/beh_makquad.c 2002-09-30 18:19:54.000000000 +0200 ++++ alliance/bhl/src/beh_makquad.c 2009-06-13 22:40:26.000000000 +0200 +@@ -41,9 +41,7 @@ + /* called func. : beh_addbequad */ + /* ###--------------------------------------------------------------### */ + +-void beh_makquad (pt_befig) +- +-struct befig *pt_befig; ++void beh_makquad ( struct befig *pt_befig ) + + { + struct beaux *pt_beaux; +diff -Naur alliance-5.0/bhl/src/beh_namelist.c alliance/bhl/src/beh_namelist.c +--- alliance-5.0/bhl/src/beh_namelist.c 2002-09-30 18:19:54.000000000 +0200 ++++ alliance/bhl/src/beh_namelist.c 2009-06-13 20:06:50.000000000 +0200 +@@ -88,7 +88,7 @@ + /* variable list. */ + /* ###------------------------------------------------------### */ + +- if (((int) ((struct chain *) pt_exp->DATA)->DATA) == STABLE) ++ if (((long) ((struct chain *) pt_exp->DATA)->DATA) == STABLE) + { + name = ((struct chain *) pt_exp->NEXT->DATA)->DATA; + res_chain = addchain (NULL, name); +diff -Naur alliance-5.0/bhl/src/Makefile.in alliance/bhl/src/Makefile.in +--- alliance-5.0/bhl/src/Makefile.in 2007-07-18 19:04:14.000000000 +0200 ++++ alliance/bhl/src/Makefile.in 2009-06-13 22:27:13.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libBhl_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -70,11 +68,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libBhl_la_SOURCES) + DIST_SOURCES = $(libBhl_la_SOURCES) +@@ -149,6 +147,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -171,6 +172,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -237,6 +241,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -248,6 +255,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -297,6 +307,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -304,6 +317,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-boog.patch b/alliance-boog.patch new file mode 100644 index 0000000..ae8209b --- /dev/null +++ b/alliance-boog.patch @@ -0,0 +1,706 @@ +diff -Naur alliance-5.0/boog/configure.in alliance/boog/configure.in +--- alliance-5.0/boog/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boog/configure.in 2003-01-09 18:17:06.000000000 +0100 +@@ -0,0 +1,33 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/bog_main.c) ++ ++BOOG_MAJOR_VERSION=1 ++BOOG_MINOR_VERSION=7 ++BOOG_VERSION=$BOOG_MAJOR_VERSION.$BOOG_MINOR_VERSION ++ ++AC_SUBST(BOOG_MAJOR_VERSION) ++AC_SUBST(BOOG_MINOR_VERSION) ++AC_SUBST(BOOG_VERSION) ++ ++# For automake. ++VERSION=$BOOG_VERSION ++PACKAGE=boog ++ ++dnl Initialize automake stuff ++AM_INIT_AUTOMAKE($PACKAGE, $VERSION) ++ ++dnl Checks for programs. ++AC_PROG_CC ++AC_PROG_MAKE_SET ++ ++dnl Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++ ++dnl path for libs and includes ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++doc/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/boog/doc/Makefile.in alliance/boog/doc/Makefile.in +--- alliance-5.0/boog/doc/Makefile.in 2007-07-18 19:04:14.000000000 +0200 ++++ alliance/boog/doc/Makefile.in 2009-06-13 22:27:14.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -118,6 +118,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -140,6 +143,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -206,6 +212,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -217,6 +226,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -266,6 +278,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -273,6 +288,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/boog/Makefile.in alliance/boog/Makefile.in +--- alliance-5.0/boog/Makefile.in 2007-07-18 19:04:14.000000000 +0200 ++++ alliance/boog/Makefile.in 2009-06-13 22:27:13.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/boog/src/bog_map_befig.c alliance/boog/src/bog_map_befig.c +--- alliance-5.0/boog/src/bog_map_befig.c 2002-09-30 18:19:57.000000000 +0200 ++++ alliance/boog/src/bog_map_befig.c 2009-06-13 23:01:27.000000000 +0200 +@@ -54,7 +54,7 @@ + /*befig in mapping*/ + static befig_list* befig; + /*index of losig*/ +-static long index; ++static long loc_index; + + + +@@ -63,7 +63,7 @@ + /****************************************************************************/ + extern void setindex(long new_index) + { +- index = new_index; ++ loc_index = new_index; + } + + +@@ -73,8 +73,8 @@ + extern long getindex() + { + long ret; +- ret=index; +- index++; ++ ret=loc_index; ++ loc_index++; + return ret; + } + +@@ -128,7 +128,7 @@ + for (namechain=losig_dest->NAMECHAIN; namechain; namechain=namechain->NEXT) { + name=(char*) namechain->DATA; + losig_dest->NAMECHAIN=addchain(losig_dest->NAMECHAIN,name); +- addauthelem(HTABLE,name,(int)losig_dest); ++ addauthelem(HTABLE,name,(long)losig_dest); + } + + losig_dest->TYPE=losig_sce->TYPE; +@@ -210,9 +210,9 @@ + addlocon(lofig,bepor->NAME,losig,bepor->DIRECTION); + + /*seek fast*/ +- if (isvss(bepor->NAME)) addauthelem(HTABLE,VSS,(int) losig); +- else if (isvdd(bepor->NAME)) addauthelem(HTABLE,VDD,(int) losig); +- else addauthelem(HTABLE,bepor->NAME,(int) losig); ++ if (isvss(bepor->NAME)) addauthelem(HTABLE,VSS,(long) losig); ++ else if (isvdd(bepor->NAME)) addauthelem(HTABLE,VDD,(long) losig); ++ else addauthelem(HTABLE,bepor->NAME,(long) losig); + } + + /*copy of INTERNAL signals*/ +@@ -221,21 +221,21 @@ + index=getindex(); + losig=addlosig(lofig,index,namechain,INTERNAL/*no more capa parameter*/); + /*seek fast*/ +- addauthelem(HTABLE,beaux->NAME,(int) losig); ++ addauthelem(HTABLE,beaux->NAME,(long) losig); + } + + for (bereg=befig->BEREG; bereg; bereg=bereg->NEXT) { + namechain=addchain(NULL,bereg->NAME); + index=getindex(); + losig=addlosig(lofig,index,namechain,INTERNAL/*no more capa parameter*/); +- addauthelem(HTABLE,bereg->NAME,(int) losig); ++ addauthelem(HTABLE,bereg->NAME,(long) losig); + } + + for (bebux=befig->BEBUX; bebux; bebux=bebux->NEXT) { + namechain=addchain(NULL,bebux->NAME); + index=getindex(); + losig=addlosig(lofig,index,namechain,INTERNAL/*no more capa parameter*/); +- addauthelem(HTABLE,bebux->NAME,(int) losig); ++ addauthelem(HTABLE,bebux->NAME,(long) losig); + } + + } +@@ -259,7 +259,7 @@ + namechain=addchain(NULL,name); + index=getindex(); + one=addlosig(lofig,index,namechain,INTERNAL/*no more capa parameter*/); +- addauthelem(HTABLE,getablatomone(),(int) one); ++ addauthelem(HTABLE,getablatomone(),(long) one); + + name=getautoname("zero"); + /*report same properties*/ +@@ -268,7 +268,7 @@ + namechain=addchain(NULL,name); + index=getindex(); + zero=addlosig(lofig,index,namechain,INTERNAL/*no more capa parameter*/); +- addauthelem(HTABLE,getablatomzero(),(int) zero); ++ addauthelem(HTABLE,getablatomzero(),(long) zero); + } + + +@@ -317,7 +317,7 @@ + + befig=befig_param; + HTABLE= createauthtable (BLOCK); +- index=0; ++ loc_index=0; + begin_count_area(); + + /*header of lofig created*/ +@@ -342,7 +342,7 @@ + + destroyauthtable(HTABLE); + HTABLE=NULL; +- index=0; ++ loc_index=0; + + return lofig; + } +diff -Naur alliance-5.0/boog/src/bog_map_delay.c alliance/boog/src/bog_map_delay.c +--- alliance-5.0/boog/src/bog_map_delay.c 2002-09-30 18:19:57.000000000 +0200 ++++ alliance/boog/src/bog_map_delay.c 2009-06-13 22:19:02.000000000 +0200 +@@ -29,6 +29,7 @@ + + + #include ++#include + #include + #include + #include +diff -Naur alliance-5.0/boog/src/bog_normalize_ARITY.h alliance/boog/src/bog_normalize_ARITY.h +--- alliance-5.0/boog/src/bog_normalize_ARITY.h 2006-03-29 19:10:06.000000000 +0200 ++++ alliance/boog/src/bog_normalize_ARITY.h 2009-06-13 22:19:25.000000000 +0200 +@@ -44,7 +44,7 @@ + + /*head operator arity*/ + /* Warning: simpablexpr() do not work anymore after pulling arity */ +-#define ABL_ARITY(abl) ((int)ABL_CDR((chain_list*)ABL_CAR(abl))) ++#define ABL_ARITY(abl) ((long)ABL_CDR((chain_list*)ABL_CAR(abl))) + #define ABL_ARITY_L(abl) (ABL_CDR((chain_list*)ABL_CAR(abl))) + + /***************************************************************************/ +diff -Naur alliance-5.0/boog/src/bog_normalize_DAG.c alliance/boog/src/bog_normalize_DAG.c +--- alliance-5.0/boog/src/bog_normalize_DAG.c 2006-03-29 19:10:06.000000000 +0200 ++++ alliance/boog/src/bog_normalize_DAG.c 2009-06-13 23:30:15.000000000 +0200 +@@ -42,11 +42,11 @@ + + + #define USING(node) {node=-mark;} +-#define USED(node) {node=(int)((((int)node<0)?0:(int)node)+1);} +-#define IS_USING(node) ((int)node==-mark) +-#define IS_USED(node) ((int)node!=0) +-#define IS_UNUSED(node) ((int)node==0) +-#define IS_ONE(node) ((int)node==1) ++#define USED(node) {node=(long)((((long)node<0)?0L:(long)node)+1L);} ++#define IS_USING(node) ((long)node==-mark) ++#define IS_USED(node) ((long)node!=0) ++#define IS_UNUSED(node) ((long)node==0) ++#define IS_ONE(node) ((long)node==1) + + + typedef struct equi { +@@ -330,7 +330,7 @@ + /* mark and follow the tree of abl */ + /* return 1 if correct abl */ + /******************************************************************************/ +-static int abl_dispatching(chain_list *abl, int mark) ++static long abl_dispatching(chain_list *abl, long mark) + { + bebux_list *bebux; + beaux_list *beaux; +@@ -502,12 +502,12 @@ + /* mark each output */ + /* return 1 if correct */ + /***************************************************************************/ +-static int mark_output() ++static long mark_output() + { + bebus_list *bebus; + beout_list *beout; + biabl_list *biabl; +- int mark=1; ++ long mark=1; + + /*create new internal signals and mark the path from output to input*/ + for (beout=befig->BEOUT; beout; beout=beout->NEXT) { +@@ -549,7 +549,7 @@ + /* control cycles in befig and erase unused internal signal */ + /* return 1 if correct befig */ + /******************************************************************************/ +-extern int DAG_control(befig_list *befig_param) ++extern long DAG_control(befig_list *befig_param) + { + equi_list* equi, *equi2; + bereg_list *bereg; +diff -Naur alliance-5.0/boog/src/bog_normalize_DAG.h alliance/boog/src/bog_normalize_DAG.h +--- alliance-5.0/boog/src/bog_normalize_DAG.h 2002-09-30 18:19:58.000000000 +0200 ++++ alliance/boog/src/bog_normalize_DAG.h 2009-06-13 23:41:19.000000000 +0200 +@@ -46,7 +46,7 @@ + /* control cycles in befig and erase unused internal signal */ + /* return 1 if correct befig */ + /******************************************************************************/ +-extern int DAG_control __P ((befig_list *befig)); ++extern long DAG_control __P ((befig_list *befig)); + + + #endif +diff -Naur alliance-5.0/boog/src/bog_normalize_DC.c alliance/boog/src/bog_normalize_DC.c +--- alliance-5.0/boog/src/bog_normalize_DC.c 2006-03-29 19:10:06.000000000 +0200 ++++ alliance/boog/src/bog_normalize_DC.c 2009-06-14 12:56:44.000000000 +0200 +@@ -42,7 +42,7 @@ + /***************************************************************************/ + /* choose '1' or '0' to simplify the expression as well as we can */ + /***************************************************************************/ +-static void find_d_z_abl(chain_list* abl, int value) ++static void find_d_z_abl(chain_list* abl, long value) + { + + if (ABL_ATOM(abl)) { +@@ -56,6 +56,7 @@ + /* a pull-up is done for better conductance*/ + ABL_CAR_L(abl)=getablatomone()/* = namealloc("'1'")*/; + } ++ return; + } + + /*the first operator influences the most*/ +diff -Naur alliance-5.0/boog/src/bog_normalize_nameindex.c alliance/boog/src/bog_normalize_nameindex.c +--- alliance-5.0/boog/src/bog_normalize_nameindex.c 2006-03-29 19:10:06.000000000 +0200 ++++ alliance/boog/src/bog_normalize_nameindex.c 2009-06-13 22:21:26.000000000 +0200 +@@ -85,7 +85,7 @@ + name=nameindex((char*) ptype->DATA,ptype->TYPE); + SEPAR='_'; + /*build a bit from a vector*/ +- addauthelem(HTABLE,name,(int)nameindex(ptype->DATA,ptype->TYPE)); ++ addauthelem(HTABLE,name,(long)nameindex(ptype->DATA,ptype->TYPE)); + } + } + else { +@@ -349,21 +349,21 @@ + if (!forbid_radical(beaux->NAME)) continue; + name=beaux->NAME; /*name begins by MBK_NOT_..... */ + beaux->NAME=getautoname(beaux->NAME); +- addauthelem(HTABLE,name,(int)beaux->NAME); ++ addauthelem(HTABLE,name,(long)beaux->NAME); + } + + for (bereg=befig->BEREG; bereg; bereg=bereg->NEXT) { + if (!forbid_radical(bereg->NAME)) continue; + name=bereg->NAME; + bereg->NAME=getautoname(bereg->NAME); +- addauthelem(HTABLE,name,(int)bereg->NAME); ++ addauthelem(HTABLE,name,(long)bereg->NAME); + } + + for (bebux=befig->BEBUX; bebux; bebux=bebux->NEXT) { + if (!forbid_radical(bebux->NAME)) continue; + name=bebux->NAME; + bebux->NAME=getautoname(bebux->NAME); +- addauthelem(HTABLE,name,(int)bebux->NAME); ++ addauthelem(HTABLE,name,(long)bebux->NAME); + } + + for (beaux=befig->BEAUX; beaux; beaux=beaux->NEXT) { +diff -Naur alliance-5.0/boog/src/bog_signal_utils.c alliance/boog/src/bog_signal_utils.c +--- alliance-5.0/boog/src/bog_signal_utils.c 2005-05-11 10:05:30.000000000 +0200 ++++ alliance/boog/src/bog_signal_utils.c 2009-06-13 22:20:11.000000000 +0200 +@@ -133,7 +133,7 @@ + /*if doesn't exist hash table, init*/ + if (!HTABLE) init_signals(); + +- addauthelem(HTABLE,name,(int)signal); ++ addauthelem(HTABLE,name,(long)signal); + } + + +diff -Naur alliance-5.0/boog/src/cvslog.27045 alliance/boog/src/cvslog.27045 +--- alliance-5.0/boog/src/cvslog.27045 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boog/src/cvslog.27045 2009-06-14 15:51:30.000000000 +0200 +@@ -0,0 +1,15 @@ ++=================================================================== ++Modification le : Sun Jun 14 15:51:30 CEST 2009 ++Par : ludo ++=================================================================== ++ ++Update of /users/outil/alliance/cvsroot/alliance/src/boog/src ++In directory do:/users/cao/ludo/alliance/src/boog/src ++ ++Modified Files: ++ bog_map_befig.c bog_map_delay.c bog_normalize_ARITY.h ++ bog_normalize_DAG.c bog_normalize_DAG.h bog_normalize_DC.c ++ bog_normalize_nameindex.c bog_signal_utils.c ++Log Message: ++- port 64 bits ++ +diff -Naur alliance-5.0/boog/src/Makefile.am alliance/boog/src/Makefile.am +--- alliance-5.0/boog/src/Makefile.am 2006-03-29 19:10:05.000000000 +0200 ++++ alliance/boog/src/Makefile.am 2008-10-08 14:21:08.000000000 +0200 +@@ -11,23 +11,23 @@ + bin_PROGRAMS = boog + + boog_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_srcdir)/abv/src \ +--L$(top_srcdir)/abe/src \ +--L$(top_srcdir)/abt/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbkvti/src \ +--L$(top_srcdir)/mbkal/src \ +--L$(top_srcdir)/mbkspice/src \ +--L$(top_srcdir)/mbkhilo/src \ +--L$(top_srcdir)/mbkedif/src \ +--L$(top_srcdir)/mbkvhdlg/src \ +--L$(top_srcdir)/mbkvrlog/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/bdd/src \ +--L$(top_srcdir)/abl/src \ +--L$(top_srcdir)/aut/src \ +--L$(top_srcdir)/mbk/src \ ++-L$(top_builddir)/abv/src \ ++-L$(top_builddir)/abe/src \ ++-L$(top_builddir)/abt/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbkvti/src \ ++-L$(top_builddir)/mbkal/src \ ++-L$(top_builddir)/mbkspice/src \ ++-L$(top_builddir)/mbkhilo/src \ ++-L$(top_builddir)/mbkedif/src \ ++-L$(top_builddir)/mbkvhdlg/src \ ++-L$(top_builddir)/mbkvrlog/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/bdd/src \ ++-L$(top_builddir)/abl/src \ ++-L$(top_builddir)/aut/src \ ++-L$(top_builddir)/mbk/src \ + -lAbv -lAbe -lAbt -lMlu -lMcl -lMal -lMsl -lMhl -lMel -lMvg -lMgl -lRcn -lMlo -lBdd -lAbl -lAut -lMut + + boog_SOURCES = \ +diff -Naur alliance-5.0/boog/src/Makefile.in alliance/boog/src/Makefile.in +--- alliance-5.0/boog/src/Makefile.in 2007-07-18 19:04:15.000000000 +0200 ++++ alliance/boog/src/Makefile.in 2009-06-13 22:27:14.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,8 +14,6 @@ + + @SET_MAKE@ + +-SOURCES = $(boog_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -77,11 +75,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(boog_SOURCES) + DIST_SOURCES = $(boog_SOURCES) +@@ -154,6 +152,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -176,6 +177,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -242,6 +246,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -253,6 +260,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -302,6 +312,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -309,6 +322,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -379,23 +395,23 @@ + @ALLIANCE_CFLAGS@ + + boog_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_srcdir)/abv/src \ +--L$(top_srcdir)/abe/src \ +--L$(top_srcdir)/abt/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbkvti/src \ +--L$(top_srcdir)/mbkal/src \ +--L$(top_srcdir)/mbkspice/src \ +--L$(top_srcdir)/mbkhilo/src \ +--L$(top_srcdir)/mbkedif/src \ +--L$(top_srcdir)/mbkvhdlg/src \ +--L$(top_srcdir)/mbkvrlog/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/bdd/src \ +--L$(top_srcdir)/abl/src \ +--L$(top_srcdir)/aut/src \ +--L$(top_srcdir)/mbk/src \ ++-L$(top_builddir)/abv/src \ ++-L$(top_builddir)/abe/src \ ++-L$(top_builddir)/abt/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbkvti/src \ ++-L$(top_builddir)/mbkal/src \ ++-L$(top_builddir)/mbkspice/src \ ++-L$(top_builddir)/mbkhilo/src \ ++-L$(top_builddir)/mbkedif/src \ ++-L$(top_builddir)/mbkvhdlg/src \ ++-L$(top_builddir)/mbkvrlog/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/bdd/src \ ++-L$(top_builddir)/abl/src \ ++-L$(top_builddir)/aut/src \ ++-L$(top_builddir)/mbk/src \ + -lAbv -lAbe -lAbt -lMlu -lMcl -lMal -lMsl -lMhl -lMel -lMvg -lMgl -lRcn -lMlo -lBdd -lAbl -lAut -lMut + + boog_SOURCES = \ diff --git a/alliance-boom.patch b/alliance-boom.patch new file mode 100644 index 0000000..b814cd9 --- /dev/null +++ b/alliance-boom.patch @@ -0,0 +1,16736 @@ +diff -Naur alliance-5.0/boo/configure.in alliance/boom/configure.in +--- alliance-5.0/boo/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/configure.in 2002-10-16 20:04:21.000000000 +0200 +@@ -0,0 +1,37 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/boom_main.c) ++ ++BOOM_MAJOR_VERSION=1 ++BOOM_MINOR_VERSION=2 ++BOOM_VERSION=$BOOM_MAJOR_VERSION.$BOOM_MINOR_VERSION ++ ++AC_SUBST(BOOM_MAJOR_VERSION) ++AC_SUBST(BOOM_MINOR_VERSION) ++AC_SUBST(BOOM_VERSION) ++ ++# For automake. ++VERSION=$BOOM_VERSION ++PACKAGE=boom ++ ++dnl Initialize automake stuff ++AM_INIT_AUTOMAKE($PACKAGE, $VERSION) ++ ++dnl Checks for programs. ++AC_PROG_CC ++AM_PROG_LEX ++AC_PROG_YACC ++AM_PROG_LIBTOOL ++AC_PROG_MAKE_SET ++ ++dnl Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++ ++AC_CHECK_LIB(m, exp) ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++man1/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/boo/Makefile.in alliance/boom/Makefile.in +--- alliance-5.0/boo/Makefile.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/Makefile.in 2009-06-13 22:27:14.000000000 +0200 +@@ -0,0 +1,670 @@ ++# Makefile.in generated by automake 1.9.6 from Makefile.am. ++# @configure_input@ ++ ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, ++# 2003, 2004, 2005 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++@SET_MAKE@ ++srcdir = @srcdir@ ++top_srcdir = @top_srcdir@ ++VPATH = @srcdir@ ++pkgdatadir = $(datadir)/@PACKAGE@ ++pkglibdir = $(libdir)/@PACKAGE@ ++pkgincludedir = $(includedir)/@PACKAGE@ ++top_builddir = .. ++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd ++INSTALL = @INSTALL@ ++install_sh_DATA = $(install_sh) -c -m 644 ++install_sh_PROGRAM = $(install_sh) -c ++install_sh_SCRIPT = $(install_sh) -c ++INSTALL_HEADER = $(INSTALL_DATA) ++transform = $(program_transform_name) ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++build_triplet = @build@ ++host_triplet = @host@ ++subdir = boom ++DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/alliance.m4 $(top_srcdir)/motif.m4 \ ++ $(top_srcdir)/xpm.m4 $(top_srcdir)/configure.in ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++mkinstalldirs = $(install_sh) -d ++CONFIG_CLEAN_FILES = ++SOURCES = ++DIST_SOURCES = ++RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ ++ html-recursive info-recursive install-data-recursive \ ++ install-exec-recursive install-info-recursive \ ++ install-recursive installcheck-recursive installdirs-recursive \ ++ pdf-recursive ps-recursive uninstall-info-recursive \ ++ uninstall-recursive ++ETAGS = etags ++CTAGS = ctags ++DIST_SUBDIRS = $(SUBDIRS) ++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ++ABE_DLL_VERSION = @ABE_DLL_VERSION@ ++ABL_DLL_VERSION = @ABL_DLL_VERSION@ ++ABT_DLL_VERSION = @ABT_DLL_VERSION@ ++ABV_DLL_VERSION = @ABV_DLL_VERSION@ ++ACLOCAL = @ACLOCAL@ ++ALCBANNER_MAJOR_VERSION = @ALCBANNER_MAJOR_VERSION@ ++ALCBANNER_MINOR_VERSION = @ALCBANNER_MINOR_VERSION@ ++ALCBANNER_VERSION = @ALCBANNER_VERSION@ ++ALLIANCE_BUILD_FALSE = @ALLIANCE_BUILD_FALSE@ ++ALLIANCE_BUILD_TRUE = @ALLIANCE_BUILD_TRUE@ ++ALLIANCE_CFLAGS = @ALLIANCE_CFLAGS@ ++ALLIANCE_LIBS = @ALLIANCE_LIBS@ ++ALLIANCE_TOP = @ALLIANCE_TOP@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ ++AMTAR = @AMTAR@ ++AR = @AR@ ++ATTILA_MAJOR_VERSION = @ATTILA_MAJOR_VERSION@ ++ATTILA_MINOR_VERSION = @ATTILA_MINOR_VERSION@ ++ATTILA_VERSION = @ATTILA_VERSION@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ ++AUT_DLL_VERSION = @AUT_DLL_VERSION@ ++AWK = @AWK@ ++B2F_MAJOR_VERSION = @B2F_MAJOR_VERSION@ ++B2F_MINOR_VERSION = @B2F_MINOR_VERSION@ ++B2F_VERSION = @B2F_VERSION@ ++BDD_DLL_VERSION = @BDD_DLL_VERSION@ ++BEH_DLL_VERSION = @BEH_DLL_VERSION@ ++BHL_DLL_VERSION = @BHL_DLL_VERSION@ ++BOOG_MAJOR_VERSION = @BOOG_MAJOR_VERSION@ ++BOOG_MINOR_VERSION = @BOOG_MINOR_VERSION@ ++BOOG_VERSION = @BOOG_VERSION@ ++BOOM_MAJOR_VERSION = @BOOM_MAJOR_VERSION@ ++BOOM_MINOR_VERSION = @BOOM_MINOR_VERSION@ ++BOOM_VERSION = @BOOM_VERSION@ ++BTR_DLL_VERSION = @BTR_DLL_VERSION@ ++BVL_DLL_VERSION = @BVL_DLL_VERSION@ ++CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ ++CST_DLL_VERSION = @CST_DLL_VERSION@ ++CTL_DLL_VERSION = @CTL_DLL_VERSION@ ++CTP_DLL_VERSION = @CTP_DLL_VERSION@ ++CXX = @CXX@ ++CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ ++DEPDIR = @DEPDIR@ ++DOC_MAJOR_VERSION = @DOC_MAJOR_VERSION@ ++DOC_MINOR_VERSION = @DOC_MINOR_VERSION@ ++DOC_VERSION = @DOC_VERSION@ ++DREAL_MAJOR_VERSION = @DREAL_MAJOR_VERSION@ ++DREAL_MINOR_VERSION = @DREAL_MINOR_VERSION@ ++DREAL_VERSION = @DREAL_VERSION@ ++ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ ++EXEEXT = @EXEEXT@ ++EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ ++EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ ++EXP_VERSION = @EXP_VERSION@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ ++FKS_DLL_VERSION = @FKS_DLL_VERSION@ ++FLATBEH_MAJOR_VERSION = @FLATBEH_MAJOR_VERSION@ ++FLATBEH_MINOR_VERSION = @FLATBEH_MINOR_VERSION@ ++FLATBEH_VERSION = @FLATBEH_VERSION@ ++FMI_MAJOR_VERSION = @FMI_MAJOR_VERSION@ ++FMI_MINOR_VERSION = @FMI_MINOR_VERSION@ ++FMI_VERSION = @FMI_VERSION@ ++FSM_DLL_VERSION = @FSM_DLL_VERSION@ ++FSP_MAJOR_VERSION = @FSP_MAJOR_VERSION@ ++FSP_MINOR_VERSION = @FSP_MINOR_VERSION@ ++FSP_VERSION = @FSP_VERSION@ ++FTL_DLL_VERSION = @FTL_DLL_VERSION@ ++FVH_DLL_VERSION = @FVH_DLL_VERSION@ ++GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ ++GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ ++GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ ++INCLUDE_MOTIF = @INCLUDE_MOTIF@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ ++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++K2F_MAJOR_VERSION = @K2F_MAJOR_VERSION@ ++K2F_MINOR_VERSION = @K2F_MINOR_VERSION@ ++K2F_VERSION = @K2F_VERSION@ ++L2P_MAJOR_VERSION = @L2P_MAJOR_VERSION@ ++L2P_MINOR_VERSION = @L2P_MINOR_VERSION@ ++L2P_VERSION = @L2P_VERSION@ ++LDFLAGS = @LDFLAGS@ ++LEX = @LEX@ ++LEXLIB = @LEXLIB@ ++LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ ++LIBOBJS = @LIBOBJS@ ++LIBS = @LIBS@ ++LIBTOOL = @LIBTOOL@ ++LINK_MOTIF = @LINK_MOTIF@ ++LINK_XPM = @LINK_XPM@ ++LN_S = @LN_S@ ++LOG_DLL_VERSION = @LOG_DLL_VERSION@ ++LOON_MAJOR_VERSION = @LOON_MAJOR_VERSION@ ++LOON_MINOR_VERSION = @LOON_MINOR_VERSION@ ++LOON_VERSION = @LOON_VERSION@ ++LTLIBOBJS = @LTLIBOBJS@ ++LVX_MAJOR_VERSION = @LVX_MAJOR_VERSION@ ++LVX_MINOR_VERSION = @LVX_MINOR_VERSION@ ++LVX_VERSION = @LVX_VERSION@ ++LYNX_MAJOR_VERSION = @LYNX_MAJOR_VERSION@ ++LYNX_MINOR_VERSION = @LYNX_MINOR_VERSION@ ++LYNX_VERSION = @LYNX_VERSION@ ++M2E_MAJOR_VERSION = @M2E_MAJOR_VERSION@ ++M2E_MINOR_VERSION = @M2E_MINOR_VERSION@ ++M2E_VERSION = @M2E_VERSION@ ++MAKEINFO = @MAKEINFO@ ++MAL_DLL_VERSION = @MAL_DLL_VERSION@ ++MAP_DLL_VERSION = @MAP_DLL_VERSION@ ++MBK_CUR = @MBK_CUR@ ++MBK_DLL_VERSION = @MBK_DLL_VERSION@ ++MBK_REL = @MBK_REL@ ++MBK_REV = @MBK_REV@ ++MBK_VERSION = @MBK_VERSION@ ++MCL_DLL_VERSION = @MCL_DLL_VERSION@ ++MCP_DLL_VERSION = @MCP_DLL_VERSION@ ++MEL_DLL_VERSION = @MEL_DLL_VERSION@ ++MGL_DLL_VERSION = @MGL_DLL_VERSION@ ++MGN_DLL_VERSION = @MGN_DLL_VERSION@ ++MHL_DLL_VERSION = @MHL_DLL_VERSION@ ++MIPS_ASM_MAJOR_VERSION = @MIPS_ASM_MAJOR_VERSION@ ++MIPS_ASM_MINOR_VERSION = @MIPS_ASM_MINOR_VERSION@ ++MIPS_ASM_VERSION = @MIPS_ASM_VERSION@ ++MMG_DLL_VERSION = @MMG_DLL_VERSION@ ++MOCHA_MAJOR_VERSION = @MOCHA_MAJOR_VERSION@ ++MOCHA_MINOR_VERSION = @MOCHA_MINOR_VERSION@ ++MOCHA_VERSION = @MOCHA_VERSION@ ++MSL_DLL_VERSION = @MSL_DLL_VERSION@ ++MVG_DLL_VERSION = @MVG_DLL_VERSION@ ++MVL_DLL_VERSION = @MVL_DLL_VERSION@ ++NERO_MAJOR_VERSION = @NERO_MAJOR_VERSION@ ++NERO_MINOR_VERSION = @NERO_MINOR_VERSION@ ++NERO_VERSION = @NERO_VERSION@ ++OBJEXT = @OBJEXT@ ++OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ ++OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ ++OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ ++PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PAT2SPI_MAJOR_VERSION = @PAT2SPI_MAJOR_VERSION@ ++PAT2SPI_MINOR_VERSION = @PAT2SPI_MINOR_VERSION@ ++PAT2SPI_VERSION = @PAT2SPI_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ ++PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ ++PGN_DLL_VERSION = @PGN_DLL_VERSION@ ++PHL_DLL_VERSION = @PHL_DLL_VERSION@ ++PPT_DLL_VERSION = @PPT_DLL_VERSION@ ++PROOF_MAJOR_VERSION = @PROOF_MAJOR_VERSION@ ++PROOF_MINOR_VERSION = @PROOF_MINOR_VERSION@ ++PROOF_VERSION = @PROOF_VERSION@ ++RANLIB = @RANLIB@ ++RCF_DLL_VERSION = @RCF_DLL_VERSION@ ++RDS_DLL_VERSION = @RDS_DLL_VERSION@ ++RFM_DLL_VERSION = @RFM_DLL_VERSION@ ++RGS_DLL_VERSION = @RGS_DLL_VERSION@ ++RING_MAJOR_VERSION = @RING_MAJOR_VERSION@ ++RING_MINOR_VERSION = @RING_MINOR_VERSION@ ++RING_VERSION = @RING_VERSION@ ++RPR_DLL_VERSION = @RPR_DLL_VERSION@ ++RTD_DLL_VERSION = @RTD_DLL_VERSION@ ++RTL_DLL_VERSION = @RTL_DLL_VERSION@ ++RTN_DLL_VERSION = @RTN_DLL_VERSION@ ++RUT_DLL_VERSION = @RUT_DLL_VERSION@ ++RWI_DLL_VERSION = @RWI_DLL_VERSION@ ++S2R_MAJOR_VERSION = @S2R_MAJOR_VERSION@ ++S2R_MINOR_VERSION = @S2R_MINOR_VERSION@ ++S2R_VERSION = @S2R_VERSION@ ++SCAPIN_MAJOR_VERSION = @SCAPIN_MAJOR_VERSION@ ++SCAPIN_MINOR_VERSION = @SCAPIN_MINOR_VERSION@ ++SCAPIN_VERSION = @SCAPIN_VERSION@ ++SCH_DLL_VERSION = @SCH_DLL_VERSION@ ++SCL_DLL_VERSION = @SCL_DLL_VERSION@ ++SEA_MAJOR_VERSION = @SEA_MAJOR_VERSION@ ++SEA_MINOR_VERSION = @SEA_MINOR_VERSION@ ++SEA_VERSION = @SEA_VERSION@ ++SED = @SED@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ ++STRIP = @STRIP@ ++SYF_MAJOR_VERSION = @SYF_MAJOR_VERSION@ ++SYF_MINOR_VERSION = @SYF_MINOR_VERSION@ ++SYF_VERSION = @SYF_VERSION@ ++TOOLSDIRS = @TOOLSDIRS@ ++VASY_MAJOR_VERSION = @VASY_MAJOR_VERSION@ ++VASY_MINOR_VERSION = @VASY_MINOR_VERSION@ ++VASY_VERSION = @VASY_VERSION@ ++VBH_DLL_VERSION = @VBH_DLL_VERSION@ ++VBL_DLL_VERSION = @VBL_DLL_VERSION@ ++VERSION = @VERSION@ ++VEX_DLL_VERSION = @VEX_DLL_VERSION@ ++VPD_DLL_VERSION = @VPD_DLL_VERSION@ ++VPN_DLL_VERSION = @VPN_DLL_VERSION@ ++VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ ++VTL_DLL_VERSION = @VTL_DLL_VERSION@ ++VVH_DLL_VERSION = @VVH_DLL_VERSION@ ++X11_LIBS = @X11_LIBS@ ++XEXT_LIBS = @XEXT_LIBS@ ++XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ ++XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ ++XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ ++XM_LIBS = @XM_LIBS@ ++XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ ++XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ ++XPAT_VERSION = @XPAT_VERSION@ ++XPM_LIBS = @XPM_LIBS@ ++XP_LIBS = @XP_LIBS@ ++XSCH_MAJOR_VERSION = @XSCH_MAJOR_VERSION@ ++XSCH_MINOR_VERSION = @XSCH_MINOR_VERSION@ ++XSCH_VERSION = @XSCH_VERSION@ ++XT_LIBS = @XT_LIBS@ ++XVPN_MAJOR_VERSION = @XVPN_MAJOR_VERSION@ ++XVPN_MINOR_VERSION = @XVPN_MINOR_VERSION@ ++XVPN_VERSION = @XVPN_VERSION@ ++X_CFLAGS = @X_CFLAGS@ ++X_EXTRA_LIBS = @X_EXTRA_LIBS@ ++X_LIBS = @X_LIBS@ ++X_PRE_LIBS = @X_PRE_LIBS@ ++YACC = @YACC@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ ++am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ ++am__quote = @am__quote@ ++am__tar = @am__tar@ ++am__untar = @am__untar@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ ++datadir = @datadir@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ ++install_sh = @install_sh@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++mkdir_p = @mkdir_p@ ++oldincludedir = @oldincludedir@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ ++SUBDIRS = src man1 ++all: all-recursive ++ ++.SUFFIXES: ++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) ++ @for dep in $?; do \ ++ case '$(am__configure_deps)' in \ ++ *$$dep*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ ++ && exit 0; \ ++ exit 1;; \ ++ esac; \ ++ done; \ ++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign boom/Makefile'; \ ++ cd $(top_srcdir) && \ ++ $(AUTOMAKE) --foreign boom/Makefile ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ ++ esac; ++ ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++$(top_srcdir)/configure: $(am__configure_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++$(ACLOCAL_M4): $(am__aclocal_m4_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++mostlyclean-libtool: ++ -rm -f *.lo ++ ++clean-libtool: ++ -rm -rf .libs _libs ++ ++distclean-libtool: ++ -rm -f libtool ++uninstall-info-am: ++ ++# This directory's subdirectories are mostly independent; you can cd ++# into them and run `make' without going through this Makefile. ++# To change the values of `make' variables: instead of editing Makefiles, ++# (1) if the variable is set in `config.status', edit `config.status' ++# (which will cause the Makefiles to be regenerated when you run `make'); ++# (2) otherwise, pass the desired values on the `make' command line. ++$(RECURSIVE_TARGETS): ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ ++ dot_seen=no; \ ++ target=`echo $@ | sed s/-recursive//`; \ ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ echo "Making $$target in $$subdir"; \ ++ if test "$$subdir" = "."; then \ ++ dot_seen=yes; \ ++ local_target="$$target-am"; \ ++ else \ ++ local_target="$$target"; \ ++ fi; \ ++ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ ++ || eval $$failcom; \ ++ done; \ ++ if test "$$dot_seen" = "no"; then \ ++ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ ++ fi; test -z "$$fail" ++ ++mostlyclean-recursive clean-recursive distclean-recursive \ ++maintainer-clean-recursive: ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ ++ dot_seen=no; \ ++ case "$@" in \ ++ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ ++ *) list='$(SUBDIRS)' ;; \ ++ esac; \ ++ rev=''; for subdir in $$list; do \ ++ if test "$$subdir" = "."; then :; else \ ++ rev="$$subdir $$rev"; \ ++ fi; \ ++ done; \ ++ rev="$$rev ."; \ ++ target=`echo $@ | sed s/-recursive//`; \ ++ for subdir in $$rev; do \ ++ echo "Making $$target in $$subdir"; \ ++ if test "$$subdir" = "."; then \ ++ local_target="$$target-am"; \ ++ else \ ++ local_target="$$target"; \ ++ fi; \ ++ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ ++ || eval $$failcom; \ ++ done && test -z "$$fail" ++tags-recursive: ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ ++ done ++ctags-recursive: ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ ++ done ++ ++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ mkid -fID $$unique ++tags: TAGS ++ ++TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ ++ include_option=--etags-include; \ ++ empty_fix=.; \ ++ else \ ++ include_option=--include; \ ++ empty_fix=; \ ++ fi; \ ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ if test "$$subdir" = .; then :; else \ ++ test ! -f $$subdir/TAGS || \ ++ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ ++ fi; \ ++ done; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ ++ test -n "$$unique" || unique=$$empty_fix; \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ $$tags $$unique; \ ++ fi ++ctags: CTAGS ++CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ ++GTAGS: ++ here=`$(am__cd) $(top_builddir) && pwd` \ ++ && cd $(top_srcdir) \ ++ && gtags -i $(GTAGS_ARGS) $$here ++ ++distclean-tags: ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags ++ ++distdir: $(DISTFILES) ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ ++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ ++ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ ++ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ ++ dir="/$$dir"; \ ++ $(mkdir_p) "$(distdir)$$dir"; \ ++ else \ ++ dir=''; \ ++ fi; \ ++ if test -d $$d/$$file; then \ ++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ ++ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ ++ fi; \ ++ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ ++ else \ ++ test -f $(distdir)/$$file \ ++ || cp -p $$d/$$file $(distdir)/$$file \ ++ || exit 1; \ ++ fi; \ ++ done ++ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ ++ if test "$$subdir" = .; then :; else \ ++ test -d "$(distdir)/$$subdir" \ ++ || $(mkdir_p) "$(distdir)/$$subdir" \ ++ || exit 1; \ ++ distdir=`$(am__cd) $(distdir) && pwd`; \ ++ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ ++ (cd $$subdir && \ ++ $(MAKE) $(AM_MAKEFLAGS) \ ++ top_distdir="$$top_distdir" \ ++ distdir="$$distdir/$$subdir" \ ++ distdir) \ ++ || exit 1; \ ++ fi; \ ++ done ++check-am: all-am ++check: check-recursive ++all-am: Makefile ++installdirs: installdirs-recursive ++installdirs-am: ++install: install-recursive ++install-exec: install-exec-recursive ++install-data: install-data-recursive ++uninstall: uninstall-recursive ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++ ++installcheck: installcheck-recursive ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ `test -z '$(STRIP)' || \ ++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++mostlyclean-generic: ++ ++clean-generic: ++ ++distclean-generic: ++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) ++ ++maintainer-clean-generic: ++ @echo "This command is intended for maintainers to use" ++ @echo "it deletes files that may require special tools to rebuild." ++clean: clean-recursive ++ ++clean-am: clean-generic clean-libtool mostlyclean-am ++ ++distclean: distclean-recursive ++ -rm -f Makefile ++distclean-am: clean-am distclean-generic distclean-libtool \ ++ distclean-tags ++ ++dvi: dvi-recursive ++ ++dvi-am: ++ ++html: html-recursive ++ ++info: info-recursive ++ ++info-am: ++ ++install-data-am: ++ ++install-exec-am: ++ ++install-info: install-info-recursive ++ ++install-man: ++ ++installcheck-am: ++ ++maintainer-clean: maintainer-clean-recursive ++ -rm -f Makefile ++maintainer-clean-am: distclean-am maintainer-clean-generic ++ ++mostlyclean: mostlyclean-recursive ++ ++mostlyclean-am: mostlyclean-generic mostlyclean-libtool ++ ++pdf: pdf-recursive ++ ++pdf-am: ++ ++ps: ps-recursive ++ ++ps-am: ++ ++uninstall-am: uninstall-info-am ++ ++uninstall-info: uninstall-info-recursive ++ ++.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ ++ clean clean-generic clean-libtool clean-recursive ctags \ ++ ctags-recursive distclean distclean-generic distclean-libtool \ ++ distclean-recursive distclean-tags distdir dvi dvi-am html \ ++ html-am info info-am install install-am install-data \ ++ install-data-am install-exec install-exec-am install-info \ ++ install-info-am install-man install-strip installcheck \ ++ installcheck-am installdirs installdirs-am maintainer-clean \ ++ maintainer-clean-generic maintainer-clean-recursive \ ++ mostlyclean mostlyclean-generic mostlyclean-libtool \ ++ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ ++ uninstall uninstall-am uninstall-info-am ++ ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: +diff -Naur alliance-5.0/boo/man1/Makefile.am alliance/boom/man1/Makefile.am +--- alliance-5.0/boo/man1/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/man1/Makefile.am 2002-03-26 13:37:22.000000000 +0100 +@@ -0,0 +1,2 @@ ++man_MANS = boom.1 ++EXTRA_DIST = $(man_MANS) +diff -Naur alliance-5.0/boo/man1/Makefile.in alliance/boom/man1/Makefile.in +--- alliance-5.0/boo/man1/Makefile.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/man1/Makefile.in 2009-06-13 22:27:14.000000000 +0200 +@@ -0,0 +1,569 @@ ++# Makefile.in generated by automake 1.9.6 from Makefile.am. ++# @configure_input@ ++ ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, ++# 2003, 2004, 2005 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++@SET_MAKE@ ++srcdir = @srcdir@ ++top_srcdir = @top_srcdir@ ++VPATH = @srcdir@ ++pkgdatadir = $(datadir)/@PACKAGE@ ++pkglibdir = $(libdir)/@PACKAGE@ ++pkgincludedir = $(includedir)/@PACKAGE@ ++top_builddir = ../.. ++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd ++INSTALL = @INSTALL@ ++install_sh_DATA = $(install_sh) -c -m 644 ++install_sh_PROGRAM = $(install_sh) -c ++install_sh_SCRIPT = $(install_sh) -c ++INSTALL_HEADER = $(INSTALL_DATA) ++transform = $(program_transform_name) ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++build_triplet = @build@ ++host_triplet = @host@ ++subdir = boom/man1 ++DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/alliance.m4 $(top_srcdir)/motif.m4 \ ++ $(top_srcdir)/xpm.m4 $(top_srcdir)/configure.in ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++mkinstalldirs = $(install_sh) -d ++CONFIG_CLEAN_FILES = ++SOURCES = ++DIST_SOURCES = ++man1dir = $(mandir)/man1 ++am__installdirs = "$(DESTDIR)$(man1dir)" ++NROFF = nroff ++MANS = $(man_MANS) ++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ++ABE_DLL_VERSION = @ABE_DLL_VERSION@ ++ABL_DLL_VERSION = @ABL_DLL_VERSION@ ++ABT_DLL_VERSION = @ABT_DLL_VERSION@ ++ABV_DLL_VERSION = @ABV_DLL_VERSION@ ++ACLOCAL = @ACLOCAL@ ++ALCBANNER_MAJOR_VERSION = @ALCBANNER_MAJOR_VERSION@ ++ALCBANNER_MINOR_VERSION = @ALCBANNER_MINOR_VERSION@ ++ALCBANNER_VERSION = @ALCBANNER_VERSION@ ++ALLIANCE_BUILD_FALSE = @ALLIANCE_BUILD_FALSE@ ++ALLIANCE_BUILD_TRUE = @ALLIANCE_BUILD_TRUE@ ++ALLIANCE_CFLAGS = @ALLIANCE_CFLAGS@ ++ALLIANCE_LIBS = @ALLIANCE_LIBS@ ++ALLIANCE_TOP = @ALLIANCE_TOP@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ ++AMTAR = @AMTAR@ ++AR = @AR@ ++ATTILA_MAJOR_VERSION = @ATTILA_MAJOR_VERSION@ ++ATTILA_MINOR_VERSION = @ATTILA_MINOR_VERSION@ ++ATTILA_VERSION = @ATTILA_VERSION@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ ++AUT_DLL_VERSION = @AUT_DLL_VERSION@ ++AWK = @AWK@ ++B2F_MAJOR_VERSION = @B2F_MAJOR_VERSION@ ++B2F_MINOR_VERSION = @B2F_MINOR_VERSION@ ++B2F_VERSION = @B2F_VERSION@ ++BDD_DLL_VERSION = @BDD_DLL_VERSION@ ++BEH_DLL_VERSION = @BEH_DLL_VERSION@ ++BHL_DLL_VERSION = @BHL_DLL_VERSION@ ++BOOG_MAJOR_VERSION = @BOOG_MAJOR_VERSION@ ++BOOG_MINOR_VERSION = @BOOG_MINOR_VERSION@ ++BOOG_VERSION = @BOOG_VERSION@ ++BOOM_MAJOR_VERSION = @BOOM_MAJOR_VERSION@ ++BOOM_MINOR_VERSION = @BOOM_MINOR_VERSION@ ++BOOM_VERSION = @BOOM_VERSION@ ++BTR_DLL_VERSION = @BTR_DLL_VERSION@ ++BVL_DLL_VERSION = @BVL_DLL_VERSION@ ++CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ ++CST_DLL_VERSION = @CST_DLL_VERSION@ ++CTL_DLL_VERSION = @CTL_DLL_VERSION@ ++CTP_DLL_VERSION = @CTP_DLL_VERSION@ ++CXX = @CXX@ ++CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ ++DEPDIR = @DEPDIR@ ++DOC_MAJOR_VERSION = @DOC_MAJOR_VERSION@ ++DOC_MINOR_VERSION = @DOC_MINOR_VERSION@ ++DOC_VERSION = @DOC_VERSION@ ++DREAL_MAJOR_VERSION = @DREAL_MAJOR_VERSION@ ++DREAL_MINOR_VERSION = @DREAL_MINOR_VERSION@ ++DREAL_VERSION = @DREAL_VERSION@ ++ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ ++EXEEXT = @EXEEXT@ ++EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ ++EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ ++EXP_VERSION = @EXP_VERSION@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ ++FKS_DLL_VERSION = @FKS_DLL_VERSION@ ++FLATBEH_MAJOR_VERSION = @FLATBEH_MAJOR_VERSION@ ++FLATBEH_MINOR_VERSION = @FLATBEH_MINOR_VERSION@ ++FLATBEH_VERSION = @FLATBEH_VERSION@ ++FMI_MAJOR_VERSION = @FMI_MAJOR_VERSION@ ++FMI_MINOR_VERSION = @FMI_MINOR_VERSION@ ++FMI_VERSION = @FMI_VERSION@ ++FSM_DLL_VERSION = @FSM_DLL_VERSION@ ++FSP_MAJOR_VERSION = @FSP_MAJOR_VERSION@ ++FSP_MINOR_VERSION = @FSP_MINOR_VERSION@ ++FSP_VERSION = @FSP_VERSION@ ++FTL_DLL_VERSION = @FTL_DLL_VERSION@ ++FVH_DLL_VERSION = @FVH_DLL_VERSION@ ++GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ ++GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ ++GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ ++INCLUDE_MOTIF = @INCLUDE_MOTIF@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ ++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++K2F_MAJOR_VERSION = @K2F_MAJOR_VERSION@ ++K2F_MINOR_VERSION = @K2F_MINOR_VERSION@ ++K2F_VERSION = @K2F_VERSION@ ++L2P_MAJOR_VERSION = @L2P_MAJOR_VERSION@ ++L2P_MINOR_VERSION = @L2P_MINOR_VERSION@ ++L2P_VERSION = @L2P_VERSION@ ++LDFLAGS = @LDFLAGS@ ++LEX = @LEX@ ++LEXLIB = @LEXLIB@ ++LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ ++LIBOBJS = @LIBOBJS@ ++LIBS = @LIBS@ ++LIBTOOL = @LIBTOOL@ ++LINK_MOTIF = @LINK_MOTIF@ ++LINK_XPM = @LINK_XPM@ ++LN_S = @LN_S@ ++LOG_DLL_VERSION = @LOG_DLL_VERSION@ ++LOON_MAJOR_VERSION = @LOON_MAJOR_VERSION@ ++LOON_MINOR_VERSION = @LOON_MINOR_VERSION@ ++LOON_VERSION = @LOON_VERSION@ ++LTLIBOBJS = @LTLIBOBJS@ ++LVX_MAJOR_VERSION = @LVX_MAJOR_VERSION@ ++LVX_MINOR_VERSION = @LVX_MINOR_VERSION@ ++LVX_VERSION = @LVX_VERSION@ ++LYNX_MAJOR_VERSION = @LYNX_MAJOR_VERSION@ ++LYNX_MINOR_VERSION = @LYNX_MINOR_VERSION@ ++LYNX_VERSION = @LYNX_VERSION@ ++M2E_MAJOR_VERSION = @M2E_MAJOR_VERSION@ ++M2E_MINOR_VERSION = @M2E_MINOR_VERSION@ ++M2E_VERSION = @M2E_VERSION@ ++MAKEINFO = @MAKEINFO@ ++MAL_DLL_VERSION = @MAL_DLL_VERSION@ ++MAP_DLL_VERSION = @MAP_DLL_VERSION@ ++MBK_CUR = @MBK_CUR@ ++MBK_DLL_VERSION = @MBK_DLL_VERSION@ ++MBK_REL = @MBK_REL@ ++MBK_REV = @MBK_REV@ ++MBK_VERSION = @MBK_VERSION@ ++MCL_DLL_VERSION = @MCL_DLL_VERSION@ ++MCP_DLL_VERSION = @MCP_DLL_VERSION@ ++MEL_DLL_VERSION = @MEL_DLL_VERSION@ ++MGL_DLL_VERSION = @MGL_DLL_VERSION@ ++MGN_DLL_VERSION = @MGN_DLL_VERSION@ ++MHL_DLL_VERSION = @MHL_DLL_VERSION@ ++MIPS_ASM_MAJOR_VERSION = @MIPS_ASM_MAJOR_VERSION@ ++MIPS_ASM_MINOR_VERSION = @MIPS_ASM_MINOR_VERSION@ ++MIPS_ASM_VERSION = @MIPS_ASM_VERSION@ ++MMG_DLL_VERSION = @MMG_DLL_VERSION@ ++MOCHA_MAJOR_VERSION = @MOCHA_MAJOR_VERSION@ ++MOCHA_MINOR_VERSION = @MOCHA_MINOR_VERSION@ ++MOCHA_VERSION = @MOCHA_VERSION@ ++MSL_DLL_VERSION = @MSL_DLL_VERSION@ ++MVG_DLL_VERSION = @MVG_DLL_VERSION@ ++MVL_DLL_VERSION = @MVL_DLL_VERSION@ ++NERO_MAJOR_VERSION = @NERO_MAJOR_VERSION@ ++NERO_MINOR_VERSION = @NERO_MINOR_VERSION@ ++NERO_VERSION = @NERO_VERSION@ ++OBJEXT = @OBJEXT@ ++OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ ++OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ ++OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ ++PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PAT2SPI_MAJOR_VERSION = @PAT2SPI_MAJOR_VERSION@ ++PAT2SPI_MINOR_VERSION = @PAT2SPI_MINOR_VERSION@ ++PAT2SPI_VERSION = @PAT2SPI_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ ++PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ ++PGN_DLL_VERSION = @PGN_DLL_VERSION@ ++PHL_DLL_VERSION = @PHL_DLL_VERSION@ ++PPT_DLL_VERSION = @PPT_DLL_VERSION@ ++PROOF_MAJOR_VERSION = @PROOF_MAJOR_VERSION@ ++PROOF_MINOR_VERSION = @PROOF_MINOR_VERSION@ ++PROOF_VERSION = @PROOF_VERSION@ ++RANLIB = @RANLIB@ ++RCF_DLL_VERSION = @RCF_DLL_VERSION@ ++RDS_DLL_VERSION = @RDS_DLL_VERSION@ ++RFM_DLL_VERSION = @RFM_DLL_VERSION@ ++RGS_DLL_VERSION = @RGS_DLL_VERSION@ ++RING_MAJOR_VERSION = @RING_MAJOR_VERSION@ ++RING_MINOR_VERSION = @RING_MINOR_VERSION@ ++RING_VERSION = @RING_VERSION@ ++RPR_DLL_VERSION = @RPR_DLL_VERSION@ ++RTD_DLL_VERSION = @RTD_DLL_VERSION@ ++RTL_DLL_VERSION = @RTL_DLL_VERSION@ ++RTN_DLL_VERSION = @RTN_DLL_VERSION@ ++RUT_DLL_VERSION = @RUT_DLL_VERSION@ ++RWI_DLL_VERSION = @RWI_DLL_VERSION@ ++S2R_MAJOR_VERSION = @S2R_MAJOR_VERSION@ ++S2R_MINOR_VERSION = @S2R_MINOR_VERSION@ ++S2R_VERSION = @S2R_VERSION@ ++SCAPIN_MAJOR_VERSION = @SCAPIN_MAJOR_VERSION@ ++SCAPIN_MINOR_VERSION = @SCAPIN_MINOR_VERSION@ ++SCAPIN_VERSION = @SCAPIN_VERSION@ ++SCH_DLL_VERSION = @SCH_DLL_VERSION@ ++SCL_DLL_VERSION = @SCL_DLL_VERSION@ ++SEA_MAJOR_VERSION = @SEA_MAJOR_VERSION@ ++SEA_MINOR_VERSION = @SEA_MINOR_VERSION@ ++SEA_VERSION = @SEA_VERSION@ ++SED = @SED@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ ++STRIP = @STRIP@ ++SYF_MAJOR_VERSION = @SYF_MAJOR_VERSION@ ++SYF_MINOR_VERSION = @SYF_MINOR_VERSION@ ++SYF_VERSION = @SYF_VERSION@ ++TOOLSDIRS = @TOOLSDIRS@ ++VASY_MAJOR_VERSION = @VASY_MAJOR_VERSION@ ++VASY_MINOR_VERSION = @VASY_MINOR_VERSION@ ++VASY_VERSION = @VASY_VERSION@ ++VBH_DLL_VERSION = @VBH_DLL_VERSION@ ++VBL_DLL_VERSION = @VBL_DLL_VERSION@ ++VERSION = @VERSION@ ++VEX_DLL_VERSION = @VEX_DLL_VERSION@ ++VPD_DLL_VERSION = @VPD_DLL_VERSION@ ++VPN_DLL_VERSION = @VPN_DLL_VERSION@ ++VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ ++VTL_DLL_VERSION = @VTL_DLL_VERSION@ ++VVH_DLL_VERSION = @VVH_DLL_VERSION@ ++X11_LIBS = @X11_LIBS@ ++XEXT_LIBS = @XEXT_LIBS@ ++XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ ++XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ ++XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ ++XM_LIBS = @XM_LIBS@ ++XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ ++XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ ++XPAT_VERSION = @XPAT_VERSION@ ++XPM_LIBS = @XPM_LIBS@ ++XP_LIBS = @XP_LIBS@ ++XSCH_MAJOR_VERSION = @XSCH_MAJOR_VERSION@ ++XSCH_MINOR_VERSION = @XSCH_MINOR_VERSION@ ++XSCH_VERSION = @XSCH_VERSION@ ++XT_LIBS = @XT_LIBS@ ++XVPN_MAJOR_VERSION = @XVPN_MAJOR_VERSION@ ++XVPN_MINOR_VERSION = @XVPN_MINOR_VERSION@ ++XVPN_VERSION = @XVPN_VERSION@ ++X_CFLAGS = @X_CFLAGS@ ++X_EXTRA_LIBS = @X_EXTRA_LIBS@ ++X_LIBS = @X_LIBS@ ++X_PRE_LIBS = @X_PRE_LIBS@ ++YACC = @YACC@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ ++am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ ++am__quote = @am__quote@ ++am__tar = @am__tar@ ++am__untar = @am__untar@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ ++datadir = @datadir@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ ++install_sh = @install_sh@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++mkdir_p = @mkdir_p@ ++oldincludedir = @oldincludedir@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ ++man_MANS = boom.1 ++EXTRA_DIST = $(man_MANS) ++all: all-am ++ ++.SUFFIXES: ++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) ++ @for dep in $?; do \ ++ case '$(am__configure_deps)' in \ ++ *$$dep*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ ++ && exit 0; \ ++ exit 1;; \ ++ esac; \ ++ done; \ ++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign boom/man1/Makefile'; \ ++ cd $(top_srcdir) && \ ++ $(AUTOMAKE) --foreign boom/man1/Makefile ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ ++ esac; ++ ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++$(top_srcdir)/configure: $(am__configure_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++$(ACLOCAL_M4): $(am__aclocal_m4_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++mostlyclean-libtool: ++ -rm -f *.lo ++ ++clean-libtool: ++ -rm -rf .libs _libs ++ ++distclean-libtool: ++ -rm -f libtool ++uninstall-info-am: ++install-man1: $(man1_MANS) $(man_MANS) ++ @$(NORMAL_INSTALL) ++ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" ++ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ ++ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ ++ for i in $$l2; do \ ++ case "$$i" in \ ++ *.1*) list="$$list $$i" ;; \ ++ esac; \ ++ done; \ ++ for i in $$list; do \ ++ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ ++ else file=$$i; fi; \ ++ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ ++ case "$$ext" in \ ++ 1*) ;; \ ++ *) ext='1' ;; \ ++ esac; \ ++ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ ++ inst=`echo $$inst | sed -e 's/^.*\///'`; \ ++ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ ++ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ ++ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ ++ done ++uninstall-man1: ++ @$(NORMAL_UNINSTALL) ++ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ ++ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ ++ for i in $$l2; do \ ++ case "$$i" in \ ++ *.1*) list="$$list $$i" ;; \ ++ esac; \ ++ done; \ ++ for i in $$list; do \ ++ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ ++ case "$$ext" in \ ++ 1*) ;; \ ++ *) ext='1' ;; \ ++ esac; \ ++ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ ++ inst=`echo $$inst | sed -e 's/^.*\///'`; \ ++ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ ++ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ ++ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ ++ done ++tags: TAGS ++TAGS: ++ ++ctags: CTAGS ++CTAGS: ++ ++ ++distdir: $(DISTFILES) ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ ++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ ++ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ ++ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ ++ dir="/$$dir"; \ ++ $(mkdir_p) "$(distdir)$$dir"; \ ++ else \ ++ dir=''; \ ++ fi; \ ++ if test -d $$d/$$file; then \ ++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ ++ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ ++ fi; \ ++ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ ++ else \ ++ test -f $(distdir)/$$file \ ++ || cp -p $$d/$$file $(distdir)/$$file \ ++ || exit 1; \ ++ fi; \ ++ done ++check-am: all-am ++check: check-am ++all-am: Makefile $(MANS) ++installdirs: ++ for dir in "$(DESTDIR)$(man1dir)"; do \ ++ test -z "$$dir" || $(mkdir_p) "$$dir"; \ ++ done ++install: install-am ++install-exec: install-exec-am ++install-data: install-data-am ++uninstall: uninstall-am ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++ ++installcheck: installcheck-am ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ `test -z '$(STRIP)' || \ ++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++mostlyclean-generic: ++ ++clean-generic: ++ ++distclean-generic: ++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) ++ ++maintainer-clean-generic: ++ @echo "This command is intended for maintainers to use" ++ @echo "it deletes files that may require special tools to rebuild." ++clean: clean-am ++ ++clean-am: clean-generic clean-libtool mostlyclean-am ++ ++distclean: distclean-am ++ -rm -f Makefile ++distclean-am: clean-am distclean-generic distclean-libtool ++ ++dvi: dvi-am ++ ++dvi-am: ++ ++html: html-am ++ ++info: info-am ++ ++info-am: ++ ++install-data-am: install-man ++ ++install-exec-am: ++ ++install-info: install-info-am ++ ++install-man: install-man1 ++ ++installcheck-am: ++ ++maintainer-clean: maintainer-clean-am ++ -rm -f Makefile ++maintainer-clean-am: distclean-am maintainer-clean-generic ++ ++mostlyclean: mostlyclean-am ++ ++mostlyclean-am: mostlyclean-generic mostlyclean-libtool ++ ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ ++uninstall-am: uninstall-info-am uninstall-man ++ ++uninstall-man: uninstall-man1 ++ ++.PHONY: all all-am check check-am clean clean-generic clean-libtool \ ++ distclean distclean-generic distclean-libtool distdir dvi \ ++ dvi-am html html-am info info-am install install-am \ ++ install-data install-data-am install-exec install-exec-am \ ++ install-info install-info-am install-man install-man1 \ ++ install-strip installcheck installcheck-am installdirs \ ++ maintainer-clean maintainer-clean-generic mostlyclean \ ++ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ ++ uninstall uninstall-am uninstall-info-am uninstall-man \ ++ uninstall-man1 ++ ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: +diff -Naur alliance-5.0/boo/src/boom_abl.c alliance/boom/src/boom_abl.c +--- alliance-5.0/boo/src/boom_abl.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_abl.c 2006-03-29 19:10:07.000000000 +0200 +@@ -0,0 +1,1571 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_abl.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_shared.h" ++# include "boom_error.h" ++# include "boom_abl.h" ++# include "boom_hash.h" ++# include "boom_debug.h" ++# include "boom_error.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static boomhabltable *BoomHashAblTable = (boomhabltable *)0; ++ static char **BoomAblNameArray = (char **)0; ++ static bddindex *BoomAblIndexArray = (bddindex *)0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern bddnode *loc_applybdd(); ++ extern bddnode *loc_simpbdddcon(); ++ extern bddnode *loc_simpbdddcoff(); ++ extern bddnode *loc_applybddnot(); ++ ++/*------------------------------------------------------------\ ++| | ++| BoomGiveBestExpr | ++| | ++\------------------------------------------------------------*/ ++ ++static chain_list *BoomGiveBestExpr( Expr1, Expr2 ) ++ ++ chain_list *Expr1; ++ chain_list *Expr2; ++{ ++ if ( getablexprnumatom( Expr1 ) > ++ getablexprnumatom( Expr2 ) ) ++ { ++ freeablexpr( Expr1 ); ++ ++ return( Expr2 ); ++ } ++ ++ freeablexpr( Expr2 ); ++ ++ return( Expr1 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Bdd Index 2 Abl | ++| | ++\------------------------------------------------------------*/ ++ ++static chain_list *BoomBddIndex2Abl( Index ) ++ ++ bddindex Index; ++{ ++ ablexpr *Atom; ++ char *Name; ++ ++ if ( Index < BDD_INDEX_MIN ) ++ { ++ if ( Index == BDD_INDEX_ZERO ) ++ { ++ return( createablatom( "'0'" ) ); ++ } ++ ++ return( createablatom( "'1'" ) ); ++ } ++ ++ Index = Index - BDD_INDEX_MIN; ++ ++ if ( BoomAblIndexArray != (bddindex *)0 ) ++ { ++ Index = BoomAblIndexArray[ Index ]; ++ } ++ ++ Name = BoomAblNameArray[ Index ]; ++ Atom = createablatom( Name ); ++ ++ Name = isbddstablename( Name ); ++ ++ if ( Name != (char *)0 ) ++ { ++ ABL_CAR_L( Atom ) = addchain( (chain_list *)0, (void *)ABL_STABLE ); ++ addablhexpr( Atom, createablatom( Name ) ); ++ } ++ ++ return( Atom ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Bdd Node 2 Mux | ++| | ++\------------------------------------------------------------*/ ++ ++static chain_list *BoomBddNode2Mux( Equation, BddHigh, BddLow ) ++ ++ chain_list *Equation; ++ bddnode *BddHigh; ++ bddnode *BddLow; ++{ ++ bddnode *NodeAnd; ++ bddnode *NodeAux1; ++ bddnode *NodeAux2; ++ chain_list *Equation1; ++ chain_list *Equation2; ++ chain_list *Equation3; ++ short IndexHigh; ++ short IndexLow; ++ ++ IndexHigh = BddHigh->INDEX; ++ IndexLow = BddLow->INDEX; ++ ++/* ++** Terminal multiplexor ++*/ ++ if ( ( IndexLow < BDD_INDEX_MIN ) || ++ ( IndexHigh < BDD_INDEX_MIN ) ) ++ { ++ if ( ( IndexLow < BDD_INDEX_MIN ) && ++ ( IndexHigh < BDD_INDEX_MIN ) ) ++ { ++/* ++** F = a' ++*/ ++ if ( IndexLow == BDD_INDEX_ONE ) ++ { ++ Equation = createablnotexpr( Equation ); ++ } ++/* ++** F = a ++*/ ++ return( Equation ); ++ } ++/* ++** F = a' + H ++*/ ++ if ( IndexLow == BDD_INDEX_ONE ) ++ { ++ Equation = createablbinexpr( ABL_OR, ++ createablnotexpr( Equation ), ++ BoomBddNode2Abl( BddHigh ) ); ++ } ++ else ++/* ++** F = a.H ++*/ ++ if ( IndexLow == BDD_INDEX_ZERO ) ++ { ++ Equation = createablbinexpr( ABL_AND, ++ Equation, ++ BoomBddNode2Abl( BddHigh ) ); ++ } ++ else ++/* ++** F = a + L ++*/ ++ if ( IndexHigh == BDD_INDEX_ONE ) ++ { ++ Equation = createablbinexpr( ABL_OR, ++ Equation, ++ BoomBddNode2Abl( BddLow ) ); ++ } ++ else ++/* ++** F = a'.L ++*/ ++ { ++ Equation = createablbinexpr( ABL_AND, ++ createablnotexpr( Equation ), ++ BoomBddNode2Abl( BddLow ) ); ++ } ++ ++ return( Equation ); ++ } ++ ++ NodeAnd = decbddrefext( loc_applybdd( ABL_AND, BddHigh, BddLow ) ); ++ ++ if ( NodeAnd->INDEX == BDD_INDEX_ZERO ) ++ { ++ NodeAux1 = decbddrefext( loc_applybdd( ABL_OR, BddHigh, BddLow ) ); ++/* ++** F = a ^ L ++*/ ++ if ( NodeAux1->INDEX == BDD_INDEX_ONE ) ++ { ++ Equation = createablbinexpr( ABL_XOR, ++ Equation, ++ BoomBddNode2Abl( BddLow ) ); ++ return( Equation ); ++ } ++ } ++/* ++** F = H + a'.L(H=*) ++*/ ++ if ( NodeAnd == BddHigh ) ++ { ++ NodeAux1 = decbddrefext( loc_simpbdddcon( BddLow, BddHigh ) ); ++ ++ Equation1 = BoomBddNode2Abl( BddHigh ); ++ Equation2 = createablbinexpr( ABL_AND, ++ createablnotexpr( dupablexpr( Equation ) ), ++ BoomBddNode2Abl( NodeAux1 ) ); ++ ++ Equation3 = createablbinexpr( ABL_OR, Equation1, Equation2 ); ++ ++ NodeAux2 = decbddrefext( loc_applybddnot( BddLow ) ); ++ NodeAux2 = decbddrefext( loc_simpbdddcoff( BddHigh, NodeAux2 ) ); ++ ++ Equation1 = BoomBddNode2Abl( BddLow ); ++ Equation2 = createablbinexpr( ABL_OR, ++ createablnotexpr( Equation ), ++ BoomBddNode2Abl( NodeAux2 ) ); ++ ++ Equation = createablbinexpr( ABL_AND, Equation1, Equation2 ); ++ ++ Equation = BoomGiveBestExpr( Equation, Equation3 ); ++ ++ return( Equation ); ++ } ++/* ++** F = L + a.H(L=*) ++*/ ++ if ( NodeAnd == BddLow ) ++ { ++ NodeAux1 = decbddrefext( loc_simpbdddcon( BddHigh, BddLow ) ); ++ ++ Equation1 = BoomBddNode2Abl( BddLow ); ++ Equation2 = createablbinexpr( ABL_AND, ++ dupablexpr( Equation ), ++ BoomBddNode2Abl( NodeAux1 ) ); ++ ++ Equation3 = createablbinexpr( ABL_OR, Equation1, Equation2 ); ++ ++ NodeAux2 = decbddrefext( loc_applybddnot( BddHigh ) ); ++ NodeAux2 = decbddrefext( loc_simpbdddcoff( BddLow, NodeAux2 ) ); ++ ++ Equation1 = BoomBddNode2Abl( BddHigh ); ++ Equation2 = createablbinexpr( ABL_OR, ++ Equation, ++ BoomBddNode2Abl( NodeAux2 ) ); ++ ++ Equation = createablbinexpr( ABL_AND, Equation1, Equation2 ); ++ ++ Equation = BoomGiveBestExpr( Equation, Equation3 ); ++ ++ return( Equation ); ++ } ++/* ++** F = a'.L(H.L=*) + a.H(H.L=*) + H.L(PHL=*), PHL = L(H.L=*).H(H.L=*) ++*/ ++ NodeAux1 = decbddrefext( loc_simpbdddcon( BddLow , NodeAnd ) ); ++ NodeAux2 = decbddrefext( loc_simpbdddcon( BddHigh, NodeAnd ) ); ++ ++ if ( ( NodeAux1 != BddLow ) && ++ ( NodeAux2 != BddHigh ) ) ++ { ++ Equation1 = createablbinexpr( ABL_AND, ++ createablnotexpr( dupablexpr( Equation ) ), ++ BoomBddNode2Abl( NodeAux1 ) ); ++ ++ Equation2 = createablbinexpr( ABL_AND, ++ dupablexpr( Equation ), ++ BoomBddNode2Abl( NodeAux2 ) ); ++ ++ NodeAux1 = decbddrefext( loc_applybdd( ABL_AND, NodeAux1, NodeAux2 ) ); ++ NodeAux1 = decbddrefext( loc_simpbdddcon( NodeAnd, NodeAux1 ) ); ++ ++ Equation1 = createablbinexpr( ABL_OR, Equation1, Equation2 ); ++ ++ Equation3 = createablbinexpr( ABL_OR, ++ Equation1, ++ BoomBddNode2Abl( NodeAux1 ) ); ++ ++ Equation1 = createablbinexpr( ABL_AND, ++ createablnotexpr( dupablexpr( Equation ) ), ++ BoomBddNode2Abl( BddLow ) ); ++ ++ Equation2 = createablbinexpr( ABL_AND, ++ Equation, ++ BoomBddNode2Abl( BddHigh ) ); ++ ++ Equation = createablbinexpr( ABL_OR, Equation1, Equation2 ); ++ ++ Equation = BoomGiveBestExpr( Equation, Equation3 ); ++ } ++ else ++ { ++ Equation1 = createablbinexpr( ABL_AND, ++ createablnotexpr( dupablexpr( Equation ) ), ++ BoomBddNode2Abl( BddLow ) ); ++ ++ Equation2 = createablbinexpr( ABL_AND, ++ Equation, ++ BoomBddNode2Abl( BddHigh ) ); ++ ++ Equation = createablbinexpr( ABL_OR, Equation1, Equation2 ); ++ } ++ ++ return( Equation ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBddNode2Abl | ++| | ++\------------------------------------------------------------*/ ++ ++chain_list *BoomBddNode2Abl( BddNode ) ++ ++ bddnode *BddNode; ++{ ++ boomhabl *HashAbl; ++ chain_list *Equation; ++ chain_list *Atom; ++ chain_list *Cumul; ++ bddnode *ScanNode; ++ bddnode *BddHigh; ++ bddnode *BddLow; ++/* ++** F = '1' ++*/ ++ if ( BddNode->INDEX == BDD_INDEX_ONE ) ++ { ++ return( createablatom( "'1'" ) ); ++ } ++/* ++** F = '0' ++*/ ++ if ( BddNode->INDEX == BDD_INDEX_ZERO ) ++ { ++ return( createablatom( "'0'" ) ); ++ } ++ ++ BddHigh = BddNode->HIGH; ++ BddLow = BddNode->LOW; ++ ++/* ++** Terminal Variable ++*/ ++ if ( ( BddLow->INDEX < BDD_INDEX_MIN ) || ++ ( BddHigh->INDEX < BDD_INDEX_MIN ) ) ++ { ++ Atom = BoomBddIndex2Abl( BddNode->INDEX ); ++ ++ if ( ( BddLow->INDEX < BDD_INDEX_MIN ) && ++ ( BddHigh->INDEX < BDD_INDEX_MIN ) ) ++ { ++ if ( BddLow->INDEX == BDD_INDEX_ONE ) ++ { ++/* ++** F = a ++*/ ++ Atom = createablnotexpr( Atom ); ++ } ++/* ++** F = a' ++*/ ++ return( Atom ); ++ } ++/* ++** F = a' + H ++*/ ++ if ( BddLow->INDEX == BDD_INDEX_ONE ) ++ { ++ Equation = createablbinexpr( ABL_OR, ++ createablnotexpr( Atom ), ++ BoomBddNode2Abl( BddHigh ) ); ++ } ++ else ++/* ++** F = a.H ++*/ ++ if ( BddLow->INDEX == BDD_INDEX_ZERO ) ++ { ++ Equation = createablbinexpr( ABL_AND, ++ Atom, ++ BoomBddNode2Abl( BddHigh ) ); ++ } ++ else ++/* ++** F = a + L ++*/ ++ if ( BddHigh->INDEX == BDD_INDEX_ONE ) ++ { ++ Equation = createablbinexpr( ABL_OR, ++ Atom, ++ BoomBddNode2Abl( BddLow ) ); ++ } ++/* ++** F = a'.L ++*/ ++ else ++ { ++ Equation = createablbinexpr( ABL_AND, ++ createablnotexpr( Atom ), ++ BoomBddNode2Abl( BddLow ) ); ++ } ++ ++ BoomAddHashAbl( BoomHashAblTable, BddNode, Equation ); ++ ++ return( Equation ); ++ } ++ ++ HashAbl = BoomSearchHashAbl( BoomHashAblTable, BddNode ); ++ ++ if ( HashAbl != (boomhabl *)0 ) ++ { ++ return( dupablexpr( HashAbl->ABL ) ); ++ } ++/* ++** Simplify First Level ++*/ ++ Equation = BoomBddIndex2Abl( BddNode->INDEX ); ++ ScanNode = (bddnode *)0; ++ ++ do ++ { ++ Cumul = (chain_list *)0; ++/* ++** Kernel OR ++*/ ++ if ( ( BddHigh == BddLow->HIGH ) || ++ ( BddHigh == BddLow->LOW ) ) ++ { ++ Cumul = createabloper( ABL_OR ); ++ addablhexpr( Cumul, Equation ); ++ ++ ScanNode = BddLow; ++ ++ do ++ { ++ Atom = BoomBddIndex2Abl( ScanNode->INDEX ); ++ ++ if ( ScanNode->HIGH == BddHigh ) ++ { ++ ScanNode = ScanNode->LOW; ++ } ++ else ++ { ++ ScanNode = ScanNode->HIGH; ++ Atom = createablnotexpr( Atom ); ++ } ++ ++ addablqexpr( Cumul, Atom ); ++ } ++ while ( ( ScanNode->HIGH == BddHigh ) || ++ ( ScanNode->LOW == BddHigh ) ); ++ ++ BddLow = ScanNode; ++ Equation = Cumul; ++ } ++/* ++** Kernel AND ++*/ ++ if ( ( BddLow == BddHigh->HIGH ) || ++ ( BddLow == BddHigh->LOW ) ) ++ { ++ Cumul = createabloper( ABL_AND ); ++ addablhexpr( Cumul, Equation ); ++ ++ ScanNode = BddHigh; ++ ++ do ++ { ++ Atom = BoomBddIndex2Abl( ScanNode->INDEX ); ++ ++ if ( ScanNode->LOW == BddLow ) ++ { ++ ScanNode = ScanNode->HIGH; ++ } ++ else ++ { ++ ScanNode = ScanNode->LOW; ++ Atom = createablnotexpr( Atom ); ++ } ++ ++ addablqexpr( Cumul, Atom ); ++ } ++ while ( ( ScanNode->HIGH == BddLow ) || ++ ( ScanNode->LOW == BddLow ) ); ++ ++ BddHigh = ScanNode; ++ Equation = Cumul; ++ } ++/* ++** Kernel XOR ++*/ ++ if ( ( BddLow->INDEX == BddHigh->INDEX ) && ++ ( BddHigh->HIGH == BddLow->LOW ) && ++ ( BddHigh->LOW == BddLow->HIGH ) ) ++ { ++ Cumul = createabloper( ABL_XOR ); ++ addablhexpr( Cumul, Equation ); ++ ++ ScanNode = BddLow; ++ ++ Atom = BoomBddIndex2Abl( ScanNode->INDEX ); ++ addablqexpr( Cumul, Atom ); ++ ++ BddHigh = BddHigh->LOW; ++ BddLow = BddLow->LOW; ++ ++ Equation = Cumul; ++ } ++ ++ if ( Cumul == (chain_list *)0 ) break; ++ } ++ while ( ( BddHigh->INDEX >= BDD_INDEX_MIN ) && ++ ( BddLow->INDEX >= BDD_INDEX_MIN ) ); ++ ++/* ++** Simplify Second Level ++*/ ++ if ( BddHigh->INDEX == BddLow->INDEX ) ++ { ++ if ( ( BddHigh->LOW == BddLow->HIGH ) && ++ ( BddHigh->LOW->INDEX >= BDD_INDEX_MIN ) ) ++ { ++/* ++** Carry ++*/ ++ if ( ( BddHigh->HIGH->INDEX == BDD_INDEX_ONE ) && ++ ( BddLow->LOW->INDEX == BDD_INDEX_ZERO ) ) ++ { ++ Atom = BoomBddIndex2Abl( BddHigh->INDEX ); ++ Cumul = createablbinexpr( ABL_AND, ++ dupablexpr( Atom ), ++ dupablexpr( Equation ) ); ++ ++ Atom = createablbinexpr( ABL_OR, Atom, Equation ); ++ ++ Equation = BoomBddNode2Abl( BddHigh->LOW ); ++/* ++** ( A.B + HL ).( A + B ) ++*/ ++ if ( ( ! ABL_ATOM( Equation ) ) && ++ ( ABL_OPER( Equation ) == ABL_OR ) ) ++ { ++ Cumul = createablbinexpr( ABL_OR , Cumul, Equation ); ++ Equation = createablbinexpr( ABL_AND, Cumul, Atom ); ++ } ++/* ++** A.B + HL.( A + B ) ++*/ ++ else ++ { ++ Atom = createablbinexpr( ABL_AND, Atom , Equation ); ++ Equation = createablbinexpr( ABL_OR , Cumul, Atom ); ++ } ++ ++ BoomAddHashAbl( BoomHashAblTable, BddNode, Equation ); ++ ++ return( Equation ); ++ } ++ ++ if ( ( BddHigh->HIGH->INDEX == BDD_INDEX_ZERO ) && ++ ( BddLow->LOW->INDEX == BDD_INDEX_ONE ) ) ++ { ++ Equation = createablnotexpr( Equation ); ++ Atom = createablnotexpr( BoomBddIndex2Abl( BddHigh->INDEX ) ); ++ ++ Cumul = createablbinexpr( ABL_AND, ++ dupablexpr( Atom ), ++ dupablexpr( Equation ) ); ++ ++ Atom = createablbinexpr( ABL_OR, Atom, Equation ); ++ ++ Equation = BoomBddNode2Abl( BddHigh->LOW ); ++/* ++** ( A'.B' + HL ).( A' + B' ) ++*/ ++ if ( ( ! ABL_ATOM( Equation ) ) && ++ ( ABL_OPER( Equation ) == ABL_OR ) ) ++ { ++ Cumul = createablbinexpr( ABL_OR , Cumul, Equation ); ++ Equation = createablbinexpr( ABL_AND, Cumul, Atom ); ++ } ++/* ++** A'.B' + HL.( A' + B' ) ++*/ ++ else ++ { ++ Atom = createablbinexpr( ABL_AND, Atom , Equation ); ++ Equation = createablbinexpr( ABL_OR , Cumul, Atom ); ++ } ++ ++ BoomAddHashAbl( BoomHashAblTable, BddNode, Equation ); ++ ++ return( Equation ); ++ } ++ } ++ ++ if ( ( BddHigh->HIGH == BddLow->LOW ) && ++ ( BddHigh->HIGH->INDEX >= BDD_INDEX_MIN ) ) ++ { ++/* ++** Carry ++*/ ++ if ( ( BddHigh->LOW->INDEX == BDD_INDEX_ONE ) && ++ ( BddLow->HIGH->INDEX == BDD_INDEX_ZERO ) ) ++ { ++ Atom = createablnotexpr( BoomBddIndex2Abl( BddHigh->INDEX ) ); ++ Cumul = createablbinexpr( ABL_AND, ++ dupablexpr( Atom ), ++ dupablexpr( Equation ) ); ++ ++ Atom = createablbinexpr( ABL_OR, Atom, Equation ); ++ ++ Equation = BoomBddNode2Abl( BddHigh->HIGH ); ++/* ++** ( A.B' + HH ).( A + B' ) ++*/ ++ if ( ( ! ABL_ATOM( Equation ) ) && ++ ( ABL_OPER( Equation ) == ABL_OR ) ) ++ { ++ Cumul = createablbinexpr( ABL_OR , Cumul, Equation ); ++ Equation = createablbinexpr( ABL_AND, Cumul, Atom ); ++ } ++/* ++** A.B' + HH.( A + B' ) ++*/ ++ else ++ { ++ Atom = createablbinexpr( ABL_AND, Atom , Equation ); ++ Equation = createablbinexpr( ABL_OR , Cumul, Atom ); ++ } ++ ++ BoomAddHashAbl( BoomHashAblTable, BddNode, Equation ); ++ ++ return( Equation ); ++ } ++ ++ if ( ( BddHigh->LOW->INDEX == BDD_INDEX_ZERO ) && ++ ( BddLow->HIGH->INDEX == BDD_INDEX_ONE ) ) ++ { ++ Equation = createablnotexpr( Equation ); ++ Atom = BoomBddIndex2Abl( BddHigh->INDEX ); ++ ++ Cumul = createablbinexpr( ABL_AND, ++ dupablexpr( Atom ), ++ dupablexpr( Equation ) ); ++ ++ Atom = createablbinexpr( ABL_OR, Atom, Equation ); ++ ++ Equation = BoomBddNode2Abl( BddHigh->HIGH ); ++/* ++** ( A'.B + HL ).( A' + B ) ++*/ ++ if ( ( ! ABL_ATOM( Equation ) ) && ++ ( ABL_OPER( Equation ) == ABL_OR ) ) ++ { ++ Cumul = createablbinexpr( ABL_OR , Cumul, Equation ); ++ Equation = createablbinexpr( ABL_AND, Cumul, Atom ); ++ } ++/* ++** A'.B + HL.( A' + B ) ++*/ ++ else ++ { ++ Atom = createablbinexpr( ABL_AND, Atom , Equation ); ++ Equation = createablbinexpr( ABL_OR , Cumul, Atom ); ++ } ++ ++ BoomAddHashAbl( BoomHashAblTable, BddNode, Equation ); ++ ++ return( Equation ); ++ } ++ } ++ } ++ ++ Equation = BoomBddNode2Mux( Equation, BddHigh, BddLow ); ++ ++ BoomAddHashAbl( BoomHashAblTable, BddNode, Equation ); ++ ++ return( Equation ); ++} ++ ++ ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehBddNode2Abl | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehBddNode2Abl( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ bddcircuit *BddCircuit; ++ bddsystem *BddSystem; ++ beout_list *BehOut; ++ beaux_list *BehAux; ++ bebux_list *BehBux; ++ bebus_list *BehBus; ++ bereg_list *BehReg; ++ bddnode *BddNode; ++ binode_list *BiNode; ++ biabl_list *BiAbl; ++ chain_list *Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "--> BoomBehBddNode2Abl !\n" ); ++ } ++ ++ BddCircuit = BehFigure->CIRCUI; ++ BddSystem = BddCircuit->BDD_SYSTEM; ++ ++ setbddlocalcircuit( BddCircuit ); ++ setbddlocalsystem( BddSystem ); ++ ++ BoomAblNameArray = BddCircuit->NAME_IN; ++ BoomAblIndexArray = BddCircuit->INDEX_IN; ++ ++ if ( BoomHashAblTable == (boomhabltable *)0 ) ++ { ++ BoomHashAblTable = BoomCreateHashAblTable( 10000 ); ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehAux %s !\n", BehAux->NAME ); ++ } ++ ++ if ( IsBoomBehAuxDontTouch( BehAux ) ) continue; ++ ++ BddNode = BehAux->NODE; ++ Equation = polarablexpr( BoomBddNode2Abl( BddNode ), 1 ); ++ ++ freeablexpr( BehAux->ABL ); ++ BehAux->ABL = Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( BehAux->ABL, ABL_VIEW_VHDL ); ++ } ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehOut %s !\n", BehOut->NAME ); ++ } ++ if ( IsBoomBehAuxDontTouch( BehOut ) ) continue; ++ ++ BddNode = BehOut->NODE; ++ Equation = polarablexpr( BoomBddNode2Abl( BddNode ), 1 ); ++ ++ freeablexpr( BehOut->ABL ); ++ BehOut->ABL = Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( Equation, ABL_VIEW_VHDL ); ++ } ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehBus %s !\n", BehBus->NAME ); ++ } ++ ++ if ( IsBoomBehAuxDontTouch( BehBus ) ) continue; ++ ++ BiAbl = BehBus->BIABL; ++ ++ for ( BiNode = BehBus->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != (bddnode *)0 ) ++ { ++ BddNode = BiNode->VALNODE; ++ Equation = polarablexpr( BoomBddNode2Abl( BddNode ), 1 ); ++ ++ freeablexpr( BiAbl->VALABL ); ++ BiAbl->VALABL = Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( Equation, ABL_VIEW_VHDL ); ++ } ++ } ++ ++ if ( BiNode->CNDNODE != (bddnode *)0 ) ++ { ++ BddNode = BiNode->CNDNODE; ++ Equation = polarablexpr( BoomBddNode2Abl( BddNode ), 1 ); ++ ++ freeablexpr( BiAbl->CNDABL ); ++ BiAbl->CNDABL = Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( Equation, ABL_VIEW_VHDL ); ++ } ++ } ++ ++ BiAbl = BiAbl->NEXT; ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehBux %s !\n", BehBux->NAME ); ++ } ++ ++ if ( IsBoomBehAuxDontTouch( BehBux ) ) continue; ++ ++ BiAbl = BehBux->BIABL; ++ ++ for ( BiNode = BehBux->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != (bddnode *)0 ) ++ { ++ BddNode = BiNode->VALNODE; ++ Equation = polarablexpr( BoomBddNode2Abl( BddNode ), 1 ); ++ ++ freeablexpr( BiAbl->VALABL ); ++ BiAbl->VALABL = Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( Equation, ABL_VIEW_VHDL ); ++ } ++ } ++ ++ if ( BiNode->CNDNODE != (bddnode *)0 ) ++ { ++ BddNode = BiNode->CNDNODE; ++ Equation = polarablexpr( BoomBddNode2Abl( BddNode ), 1 ); ++ ++ freeablexpr( BiAbl->CNDABL ); ++ BiAbl->CNDABL = Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( Equation, ABL_VIEW_VHDL ); ++ } ++ } ++ ++ BiAbl = BiAbl->NEXT; ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehReg %s !\n", BehReg->NAME ); ++ } ++ ++ if ( IsBoomBehAuxDontTouch( BehReg ) ) continue; ++ ++ BiAbl = BehReg->BIABL; ++ ++ for ( BiNode = BehReg->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != (bddnode *)0 ) ++ { ++ BddNode = BiNode->VALNODE; ++ Equation = polarablexpr( BoomBddNode2Abl( BddNode ), 1 ); ++ ++ freeablexpr( BiAbl->VALABL ); ++ BiAbl->VALABL = Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( Equation, ABL_VIEW_VHDL ); ++ } ++ } ++ ++ if ( BiNode->CNDNODE != (bddnode *)0 ) ++ { ++ BddNode = BiNode->CNDNODE; ++ Equation = polarablexpr( BoomBddNode2Abl( BddNode ), 1 ); ++ ++ freeablexpr( BiAbl->CNDABL ); ++ BiAbl->CNDABL = Equation; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( Equation, ABL_VIEW_VHDL ); ++ } ++ } ++ ++ BiAbl = BiAbl->NEXT; ++ } ++ } ++ ++ BoomResetHashAblTable( BoomHashAblTable ); ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "<-- BoomBehBddNode2Abl !\n" ); ++ } ++ ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehMapAbl | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehMapAbl( BehFigure, Function, All ) ++ ++ befig_list *BehFigure; ++ chain_list *(*Function)(); ++ int All; ++{ ++ beout_list *BehOut; ++ beaux_list *BehAux; ++ bebux_list *BehBux; ++ bebus_list *BehBus; ++ bereg_list *BehReg; ++ biabl_list *BiAbl; ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehOut ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehOut %s\n", BehOut->NAME ); ++ } ++ ++ BehOut->ABL = Function( BehOut->ABL ); ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehBus ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehBus %s\n", BehBus->NAME ); ++ } ++ ++ BiAbl = BehBus->BIABL; ++ ++ for ( BiAbl = BehBus->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ BiAbl->VALABL = Function( BiAbl->VALABL ); ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ BiAbl->CNDABL = Function( BiAbl->CNDABL ); ++ } ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehBux ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehBux %s\n", BehBux->NAME ); ++ } ++ ++ BiAbl = BehBux->BIABL; ++ ++ for ( BiAbl = BehBux->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ BiAbl->VALABL = Function( BiAbl->VALABL ); ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ BiAbl->CNDABL = Function( BiAbl->CNDABL ); ++ } ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehReg ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehReg %s\n", BehReg->NAME ); ++ } ++ ++ BiAbl = BehReg->BIABL; ++ ++ for ( BiAbl = BehReg->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ BiAbl->VALABL = Function( BiAbl->VALABL ); ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ BiAbl->CNDABL = Function( BiAbl->CNDABL ); ++ } ++ } ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehAux ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehAux %s\n", BehAux->NAME ); ++ } ++ ++ BehAux->ABL = Function( BehAux->ABL ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehScanAbl | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehScanAbl( BehFigure, Function, All ) ++ ++ befig_list *BehFigure; ++ void (*Function)(); ++ int All; ++{ ++ beout_list *BehOut; ++ beaux_list *BehAux; ++ bebux_list *BehBux; ++ bebus_list *BehBus; ++ bereg_list *BehReg; ++ biabl_list *BiAbl; ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehOut ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehOut %s\n", BehOut->NAME ); ++ } ++ ++ Function( BehOut->ABL ); ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehBus ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehBus %s\n", BehBus->NAME ); ++ } ++ ++ BiAbl = BehBus->BIABL; ++ ++ for ( BiAbl = BehBus->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ Function( BiAbl->VALABL ); ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ Function( BiAbl->CNDABL ); ++ } ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehBux ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehBux %s\n", BehBux->NAME ); ++ } ++ ++ BiAbl = BehBux->BIABL; ++ ++ for ( BiAbl = BehBux->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ Function( BiAbl->VALABL ); ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ Function( BiAbl->CNDABL ); ++ } ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehReg ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehReg %s\n", BehReg->NAME ); ++ } ++ ++ BiAbl = BehReg->BIABL; ++ ++ for ( BiAbl = BehReg->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ Function( BiAbl->VALABL ); ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ Function( BiAbl->CNDABL ); ++ } ++ } ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( ( ! All ) && ( IsBoomBehAuxDontTouch( BehAux ) ) ) continue; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehAux %s\n", BehAux->NAME ); ++ } ++ ++ Function( BehAux->ABL ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehMapAblWithName | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehMapAblWithName( BehFigure, Function ) ++ ++ befig_list *BehFigure; ++ chain_list *(*Function)(); ++{ ++ beout_list *BehOut; ++ beaux_list *BehAux; ++ bebux_list *BehBux; ++ bebus_list *BehBus; ++ bereg_list *BehReg; ++ biabl_list *BiAbl; ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehOut %s\n", BehOut->NAME ); ++ } ++ ++ BehOut->ABL = Function( BehOut->NAME, BehOut->ABL ); ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehBus %s\n", BehBus->NAME ); ++ } ++ ++ BiAbl = BehBus->BIABL; ++ ++ for ( BiAbl = BehBus->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ BiAbl->VALABL = Function( BehBus->NAME, BiAbl->VALABL ); ++ } ++ ++ /* ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ BiAbl->CNDABL = Function( BiAbl->CNDABL ); ++ } ++ */ ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehBux %s\n", BehBux->NAME ); ++ } ++ ++ BiAbl = BehBux->BIABL; ++ ++ for ( BiAbl = BehBux->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ BiAbl->VALABL = Function( BehBux->NAME, BiAbl->VALABL ); ++ } ++ ++ /* ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ BiAbl->CNDABL = Function( BiAbl->CNDABL ); ++ } ++ */ ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehReg %s\n", BehReg->NAME ); ++ } ++ ++ BiAbl = BehReg->BIABL; ++ ++ for ( BiAbl = BehReg->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ BiAbl->VALABL = Function( BehReg->NAME, BiAbl->VALABL ); ++ } ++ ++ /* ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ BiAbl->CNDABL = Function( BiAbl->CNDABL ); ++ } ++ */ ++ } ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BehAux %s\n", BehAux->NAME ); ++ } ++ ++ BehAux->ABL = Function( BehAux->NAME, BehAux->ABL ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomNormalizeAbl | ++| | ++\------------------------------------------------------------*/ ++ ++# if 0 ++static void BoomSortAbl( expr, func, direction) ++ ++ chain_list *expr; ++ long (*func) (); ++ int direction; ++{ ++ chain_list *expr1; ++ int okPermu = 1; ++ ++ if (!ABL_ATOM (expr)) /* ce n'est pas un atome */ ++ { ++ while (okPermu) ++ { ++ expr1 = ABL_CDR (expr); ++ okPermu = 0; ++ while (ABL_CDR (expr1)) ++ { ++ if ((direction == 1 && ++ ((*func) ABL_CAR (expr1) > (*func) ABL_CADR (expr1))) || ++ (direction == 0 && ++ ((*func) ABL_CAR (expr1) < (*func) ABL_CADR (expr1)))) ++ { ++ chain_list *permu; ++ ++ permu = ABL_CAR (expr1); ++ expr1->DATA = (void *) ABL_CADR (expr1); ++ (expr1->NEXT)->DATA = (void *) permu; ++ okPermu = 1; ++ } ++ expr1 = ABL_CDR (expr1); ++ } ++ } ++ } ++} ++ ++static int LocalBoomNormalizeAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ return ( (int)ABL_ATOM_VALUE( Expr ) ); ++ } ++ ++ if ( ABL_OPER (Expr) == ABL_NOT) ++ { ++ if (ABL_ATOM(ABL_CADR(Expr))) ++ { ++ return ( ABL_NOT * 100 + 10); ++ } ++ else ++ { ++ return (ABL_NOT * 100 + ABL_OPER(ABL_CADR (Expr))); ++ } ++ } ++ ++ return ABL_OPER(Expr) * 100 + getablexprlength(Expr); ++} ++ ++static void BoomNormalizeAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ if ( ! ABL_ATOM( Expr ) ) ++ { ++ BoomSortAbl( Expr, LocalBoomNormalizeAbl, 1 ); ++ ++ while ( ( Expr = ABL_CDR( Expr ) ) != (chain_list *)0 ) ++ { ++ BoomNormalizeAbl( ABL_CAR( Expr ) ); ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehNormalizeAbl | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehNormalizeAbl( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ BoomBehMapAbl( BehFigure, BoomNormalizeAbl, 0 ); ++} ++# endif ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehUnflatAbl | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehUnflatAbl( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ BoomBehMapAbl( BehFigure, unflatablexpr, 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehFlatAbl | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehFlatAbl( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ BoomBehScanAbl( BehFigure, flatablexpr, 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehSimplifyAbl | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehSimplifyAbl( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ BoomBehMapAbl( BehFigure, simpablexpr, 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomReverseAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static chain_list *BoomReverseAbl( Expr ) ++ ++ chain_list *Expr; ++{ ++ chain_list *ScanExpr; ++ ++ if ( ! ABL_ATOM( Expr ) ) ++ { ++ if ( ABL_CDDR( Expr ) != (chain_list *)0 ) ++ { ++ ABL_CDR( Expr ) = reverse( ABL_CDR( Expr ) ); ++ } ++ ++ ScanExpr = Expr; ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (chain_list *)0 ) ++ { ++ ABL_CAR_L( ScanExpr ) = BoomReverseAbl( ABL_CAR( ScanExpr ) ); ++ } ++ } ++ ++ return( Expr ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehReverseAbl | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehReverseAbl( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ BoomBehMapAbl( BehFigure, BoomReverseAbl, 0 ); ++} +diff -Naur alliance-5.0/boo/src/boom_abl.h alliance/boom/src/boom_abl.h +--- alliance-5.0/boo/src/boom_abl.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_abl.h 2002-09-30 18:19:59.000000000 +0200 +@@ -0,0 +1,80 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_abl.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_ABL_H ++# define BOOM_ABL_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehBddNode2Abl(); ++ extern chain_list *BoomBddNode2Abl(); ++ extern void BoomBehMapAbl(); ++ extern void BoomBehScanAbl(); ++ extern void BoomBehMapAblWithName(); ++ ++ extern void BoomBehReverseAbl(); ++ extern void BoomBehFlatAbl(); ++ extern void BoomBehSimplifyAbl(); ++ extern void BoomBehUnflatAbl(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_anneal.c alliance/boom/src/boom_anneal.c +--- alliance-5.0/boo/src/boom_anneal.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_anneal.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,317 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_anneal.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 08.08.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++ ++# include "boom_gradient.h" ++# include "boom_anneal.h" ++ ++ ++#ifndef AUTO_HAS_DRAND48 ++/* The drand48() function return non-negative double-precision ++ * floating-point values uniformly distributed between [0.0, 1.0). ++ */ ++#ifndef RAND_MAX ++# define RAND_MAX (unsigned long)( (1L<<31) - 1) ++# endif ++#define drand48() ((double) rand() / (double) (RAND_MAX + 1.0)) ++#endif ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomDupBddOrder | ++| | ++\------------------------------------------------------------*/ ++ ++static chain_list *BoomDupBddOrder( BddOrder ) ++ ++ chain_list *BddOrder; ++{ ++ chain_list *DupBddOrder; ++ chain_list *ScanChain; ++ chain_list *DupChain; ++ chain_list **PrevBddOrder; ++ ++ DupBddOrder = (chain_list *)0; ++ PrevBddOrder = &DupBddOrder; ++ ++ for ( ScanChain = BddOrder; ++ ScanChain != (chain_list *)0; ++ ScanChain = ScanChain->NEXT ) ++ { ++ DupChain = addchain( (chain_list *)0, ScanChain->DATA ); ++ *PrevBddOrder = DupChain; ++ PrevBddOrder = &DupChain->NEXT; ++ } ++ ++ return( DupBddOrder ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeAnneal | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeAnneal( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ boombefiginfo *FigInfo; ++ long Cost; ++ double Proba; ++ double MaxProba; ++ long NewCost; ++ long BestCost; ++ long Iteration; ++ long Amplitude; ++ long MaxIteration; ++ long MaxAmplitude; ++ chain_list *AnnealOrder; ++ chain_list *NewOrder; ++ chain_list *BestOrder; ++ int Level; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ MaxAmplitude = FigInfo->AMPLITUDE; ++ Level = FigInfo->OPTIM_LEVEL; ++ ++ if ( MaxIteration <= 0 ) MaxIteration = 100; ++ /* ++ if ( MaxAmplitude <= 0 ) MaxAmplitude = 1 + (BddLocalSystem->NUMBER_VAR / 8); ++ */ ++ /* ++ if ( MaxAmplitude <= 0 ) MaxAmplitude = 1 + (BddLocalSystem->NUMBER_VAR / 2); ++ */ ++ if ( MaxAmplitude <= 0 ) MaxAmplitude = 5; ++ ++ MaxIteration = MaxIteration * (Level + 1); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Compute initial cost !\n" ); ++ } ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ /* ++ AnnealOrder = BoomBehGetBddOrder( BehFigure ); ++ */ ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Compute initial order\n" ); ++ } ++ ++ if ( Level >= 1 ) ++ { ++ AnnealOrder = BoomBehGradientBddOrder( BehFigure ); ++ } ++ else ++ { ++ AnnealOrder = BoomBehGetBddOrder( BehFigure ); ++ } ++ ++ BestCost = Cost; ++ BestOrder = (chain_list *)0; ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "done\n" ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ Amplitude = MaxAmplitude; ++ /* ++ Amplitude = 1 + (long)( (double)MaxAmplitude * ++ exp( - ( (double)Iteration * 8.0 ) / (double)MaxIteration ) ); ++ */ ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Iteration %ld, Amplitude %ld\n", Iteration, Amplitude ); ++ } ++ ++ BoomBehRandomBddOrder( BehFigure, Amplitude ); ++ ++ NewOrder = BoomBehGetBddOrder( BehFigure ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ MaxProba = exp( - (double)Iteration / 5.0 ); ++ Proba = drand48(); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Proba : %g %g\n", Proba, MaxProba ); ++ } ++ ++ if ( NewCost < BestCost ) ++ { ++ BestCost = NewCost; ++ ++ freechain( BestOrder ); ++ BestOrder = BoomDupBddOrder( AnnealOrder ); ++ } ++ ++ if ( ( Proba < MaxProba ) || ++ ( NewCost < Cost ) ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Accept new solution %ld (gain %ld)\n", NewCost, Cost - NewCost ); ++ } ++ ++ Cost = NewCost; ++ ++ freechain( AnnealOrder ); ++ AnnealOrder = NewOrder; ++ } ++ else ++ { ++ BoomBehRebuildBddNode( BehFigure, AnnealOrder ); ++ freechain( NewOrder ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-3ld\b\b\b", ( ( Iteration + 1 ) * 100 ) / MaxIteration ); ++ fflush( stdout ); ++ } ++ } ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Anneal cost : %ld\n", Cost ); ++ } ++ ++ if ( ( BestCost < Cost ) && ++ ( BestOrder != (chain_list *)0 ) ) ++ { ++ freechain( AnnealOrder ); ++ AnnealOrder = BestOrder; ++ BestOrder = (chain_list *)0; ++ } ++ else ++ { ++ freechain( BestOrder ); ++ BestOrder = (chain_list *)0; ++ } ++ ++ BoomBehRebuildBddNode( BehFigure, AnnealOrder ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_anneal.h alliance/boom/src/boom_anneal.h +--- alliance-5.0/boo/src/boom_anneal.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_anneal.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,74 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_anneal.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_ANNEAL_H ++# define BOOM_ANNEAL_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_ANNEAL_EXPLOSION_LIMIT 10000 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeAnneal(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_aux.c alliance/boom/src/boom_aux.c +--- alliance-5.0/boo/src/boom_aux.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_aux.c 2006-03-29 19:10:07.000000000 +0200 +@@ -0,0 +1,682 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_aux.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_bdd.h" ++# include "boom_abl.h" ++# include "boom_cost.h" ++# include "boom_aux.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static befig_list *BoomBehFigure = (befig_list *)0; ++ static char *BoomCurrentName = (char *)0; ++ static long BoomAuxNumber = 0; ++ ++ static char BoomAuxName[ 128 ]; ++ static authtable *BoomAuxHashTable = (authtable *)0; ++ static authtable *BoomNotAuxHashTable = (authtable *)0; ++ static authtable *BoomAuxNameHashTable = (authtable *)0; ++ ++ static authtable *BoomUselessAuxHashTable = (authtable *)0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern bddnode *loc_applybddnot(); ++ ++/*------------------------------------------------------------\ ++| | ++| BoomGetAblDepth | ++| | ++\------------------------------------------------------------*/ ++ ++static long BoomGetAblDepth( Expr ) ++ ++ ablexpr *Expr; ++{ ++ long NumberOper; ++ long MaxDepth; ++ long CarDepth; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ return( 0 ); ++ } ++ ++ /* ++ if ( ( ABL_ATOM( Expr ) ) || ++ ( ( ABL_OPER( Expr ) == ABL_NOT ) && ++ ( ABL_ATOM( ABL_CADR( Expr ) ) ) ) ) ++ { ++ return( 0 ); ++ } ++ */ ++ ++ MaxDepth = 0; ++ NumberOper = 0; ++ ++ while ( ( Expr = ABL_CDR( Expr ) ) != (chain_list *)0 ) ++ { ++ CarDepth = BoomGetAblDepth( ABL_CAR( Expr ) ); ++ ++ if ( CarDepth > MaxDepth ) MaxDepth = CarDepth; ++ ++ /* NumberOper++; */ ++ } ++ ++ NumberOper++; ++ ++ if ( NumberOper > 1 ) NumberOper--; ++ ++ return( MaxDepth + NumberOper ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomCheckIfGoodAuxAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static int BoomCheckIfGoodAuxAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ if ( ( ABL_ATOM( Expr ) ) || ++ ( ( ABL_OPER( Expr ) == ABL_NOT ) && ++ ( ABL_ATOM( ABL_CADR( Expr ) ) ) ) ) ++ { ++ return( 0 ); ++ } ++ ++ return( 1 ); ++ /* ++ long MaxDepth; ++ ++ MaxDepth = BoomGetAblDepth( Expr ); ++ ++ return ( MaxDepth >= BOOM_AUX_MIN_DEPTH ); ++ */ ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomCreateAuxAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static ablexpr *BoomCreateAuxAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ bddnode *BddNode; ++ bddnode *BddNot; ++ chain_list *ScanExpr; ++ authelem *Element; ++ char *Name; ++ long Polar; ++ ++ if ( ! ABL_ATOM( Expr ) ) ++ { ++ ScanExpr = Expr; ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (chain_list *)0 ) ++ { ++ ABL_CAR_L( ScanExpr ) = BoomCreateAuxAbl( ABL_CAR( ScanExpr ) ); ++ } ++ ++ BddNode = BoomGetBddMarkAbl( Expr ); ++ ++ if ( BddNode == NULL ) ++ { ++ return( Expr ); ++ } ++ ++ BddNot = decbddrefext( loc_applybddnot( BddNode ) ); ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ viewablexprln( ScanExpr, ABL_VIEW_VHDL ); ++ ++ fprintf( stdout, "BddNode->MARK %d\n", BddNode->MARK ); ++ fprintf( stdout, "BddNot->MARK %d\n", BddNot->MARK ); ++ } ++ ++ Polar = 1; ++ Element = searchauthelem( BoomAuxHashTable, (char *)BddNode ); ++ ++ if ( Element == (authelem *)0 ) ++ { ++ Element = searchauthelem( BoomNotAuxHashTable, (char *)BddNode ); ++ Polar = 0; ++ } ++ ++ if ( Element == (authelem *)0 ) ++ { ++ if ( ( (BddNode->MARK + BddNot->MARK ) < 2 ) || ++ ( ! BoomCheckIfGoodAuxAbl( Expr ) ) ) ++ { ++ return( Expr ); ++ } ++ ++ sprintf( BoomAuxName, "aux%ld", BoomAuxNumber++ ); ++ ++ Name = namealloc( BoomAuxName ); ++ ++ if ( BddNot->MARK < BddNode->MARK ) ++ { ++ addauthelem( BoomAuxHashTable , (char *)BddNode, (long)Name ); ++ addauthelem( BoomNotAuxHashTable, (char *)BddNot , (long)Name ); ++ } ++ else ++ { ++ addauthelem( BoomAuxHashTable , (char *)BddNot , (long)Name ); ++ addauthelem( BoomNotAuxHashTable, (char *)BddNode, (long)Name ); ++ ++ BoomUnmarkBddNode( Expr ); ++ Expr = createablnotexpr( Expr ); ++ } ++ ++ BoomBehFigure->BEAUX = beh_addbeaux( BoomBehFigure->BEAUX, Name, Expr, (void *)0 ); ++ BoomAddBehAuxInfo( BoomBehFigure->BEAUX ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Add auxiliary signal %s P %d N %d\n", ++ Name, BddNode->MARK, BddNot->MARK ); ++ viewablexprln( Expr, ABL_VIEW_VHDL ); ++ } ++ ++ if ( BddNot->MARK < BddNode->MARK ) ++ { ++ Expr = createablatom( Name ); ++ } ++ else ++ { ++ Expr = createablnotexpr( createablatom( Name ) ); ++ } ++ } ++ else ++ { ++ Name = (char *)Element->VALUE; ++ ++ if ( Name != BoomCurrentName ) ++ { ++ /* BIG BUG !! */ ++ Element = searchauthelem( BoomAuxNameHashTable, Name ); ++ ++ if ( Element == (authelem *)0 ) ++ { ++ BoomUnmarkBddNode( Expr ); ++ freeablexpr( Expr ); ++ ++ Expr = createablatom( Name ); ++ ++ if ( ! Polar ) Expr = createablnotexpr( Expr ); ++ } ++ } ++ ++ return( Expr ); ++ } ++ } ++ ++ return( Expr ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomCreateAuxAblWithName | ++| | ++\------------------------------------------------------------*/ ++ ++static ablexpr *BoomCreateAuxAblWithName( Name, Expr ) ++ ++ char *Name; ++ ablexpr *Expr; ++{ ++ BoomCurrentName = Name; ++ ++ Expr = BoomCreateAuxAbl( Expr ); ++ ++ return ( Expr ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehInitializeAux | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehInitializeAux( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ bddnode *BddNode; ++ bddnode *BddNot; ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( IsBoomBehAuxDontTouch( BehAux ) ) continue; ++ ++ BddNode = BehAux->NODE; ++ BddNot = decbddrefext( loc_applybddnot( BddNode ) ); ++ ++ addauthelem( BoomAuxHashTable , (char *)BddNode, (long)BehAux->NAME ); ++ addauthelem( BoomNotAuxHashTable , (char *)BddNot , (long)BehAux->NAME ); ++ addauthelem( BoomAuxNameHashTable, BehAux->NAME , 0 ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomCountAuxOccurAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomCountAuxOccurAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ ablexpr *ScanExpr; ++ authelem *Element; ++ char *Value; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Value = ABL_ATOM_VALUE( Expr ); ++ Element = searchauthelem( BoomUselessAuxHashTable, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ Element->VALUE++; ++ } ++ } ++ else ++ { ++ ScanExpr = Expr; ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (chain_list *)0 ) ++ { ++ BoomCountAuxOccurAbl( ABL_CAR( ScanExpr ) ); ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomReplaceUselessAuxAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static ablexpr *BoomReplaceUselessAuxAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ ablexpr *ScanExpr; ++ authelem *Element; ++ char *Value; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Value = ABL_ATOM_VALUE( Expr ); ++ Element = searchauthelem( BoomUselessAuxHashTable, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Replace %s by ", Value ); ++ viewablexprln( (ablexpr *)Element->VALUE, ABL_VIEW_VHDL ); ++ } ++ ++ freeablexpr( Expr ); ++ Expr = BoomReplaceUselessAuxAbl( dupablexpr( (ablexpr *)Element->VALUE ) ); ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ viewablexprln( Expr, ABL_VIEW_VHDL ); ++ } ++ } ++ } ++ else ++ { ++ ScanExpr = Expr; ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (chain_list *)0 ) ++ { ++ ABL_CAR_L( ScanExpr ) = BoomReplaceUselessAuxAbl( ABL_CAR( ScanExpr ) ); ++ } ++ } ++ ++ return( Expr ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehDeleteUselessAux | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehDeleteUselessAux( BehFigure, InitialAux, RemoveBerin ) ++ ++ befig_list *BehFigure; ++ beaux_list *InitialAux; ++{ ++ boombeauxinfo *AuxInfo; ++ beaux_list *BehAux; ++ beaux_list *DelBehAux; ++ beaux_list *HeadBehAux; ++ beaux_list **PrevBehAux; ++ authelem *Element; ++ ++ if ( BoomUselessAuxHashTable == (authtable *)0 ) ++ { ++ BoomUselessAuxHashTable = createauthtable( 10000 ); ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( BehAux == InitialAux ) break; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Add '%s'\n", BehAux->NAME ); ++ } ++ ++ addauthelem( BoomUselessAuxHashTable, BehAux->NAME, 0 ); ++ } ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Count Occurences\n" ); ++ } ++ ++ BoomBehScanAbl( BehFigure, BoomCountAuxOccurAbl, 0 ); ++ ++ BoomBehGiveCost( BehFigure ); ++ ++ HeadBehAux = (beaux_list *)0; ++ PrevBehAux = &BehFigure->BEAUX; ++ BehAux = BehFigure->BEAUX; ++ ++ while ( BehAux != (beaux_list *)0 ) ++ { ++ if ( BehAux == InitialAux ) break; ++ ++ AuxInfo = GetBoomBehAuxInfo( BehAux ); ++ Element = searchauthelem( BoomUselessAuxHashTable, BehAux->NAME ); ++ ++ if ( ( ! IsBoomBehAuxKeep( BehAux ) ) && ++ ( ( Element->VALUE <= 1 ) || ++ ( AuxInfo->LITERAL_COST <= 1 ) || ++ ( ( AuxInfo->LITERAL_COST < BOOM_AUX_MIN_LITERAL_COST ) && ++ ( Element->VALUE < BOOM_AUX_MIN_OCCUR ) ) ) ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Should delete %s %ld %ld\n", ++ BehAux->NAME, Element->VALUE, AuxInfo->LITERAL_COST ); ++ } ++ ++ Element->VALUE = (long)BehAux->ABL; ++ ++ DelBehAux = BehAux; ++ BehAux = BehAux->NEXT; ++ *PrevBehAux = BehAux; ++ ++ DelBehAux->NEXT = HeadBehAux; ++ HeadBehAux = DelBehAux; ++ ++ if ( RemoveBerin ) ++ { ++ BehFigure->BERIN = beh_rmvberin( BehFigure->BERIN, DelBehAux->NAME ); ++ } ++ } ++ else ++ { ++ delauthelem( BoomUselessAuxHashTable, BehAux->NAME ); ++ ++ PrevBehAux = &BehAux->NEXT; ++ BehAux = BehAux->NEXT; ++ } ++ } ++ ++ BoomBehMapAbl( BehFigure, BoomReplaceUselessAuxAbl, 1 ); ++ ++ BoomBehFreeBehAux( HeadBehAux ); ++ ++ resetauthtable( BoomUselessAuxHashTable ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehCreateAux | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehCreateAux( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *InitialAux; ++ bddcircuit *BddCircuit; ++ bddsystem *BddSystem; ++ long Reverse; ++ ++ BddCircuit = BehFigure->CIRCUI; ++ BddSystem = BddCircuit->BDD_SYSTEM; ++ ++ setbddlocalcircuit( BddCircuit ); ++ setbddlocalsystem( BddSystem ); ++ ++ BoomBehFigure = BehFigure; ++ ++# ifdef DEBUG ++fprintf( stdout, "Before BoomBehMakeBddNode\n" ); ++testbddcircuit( (bddcircuit *)0 ); ++# endif ++ ++ InitialAux = BehFigure->BEAUX; ++ BoomAuxNumber = 0; ++ ++ if ( BoomAuxHashTable == (authtable *)0 ) ++ { ++ BoomAuxHashTable = createauthtable( 1000 ); ++ BoomNotAuxHashTable = createauthtable( 1000 ); ++ BoomAuxNameHashTable = createauthtable( 1000 ); ++ } ++ ++ for ( Reverse = 0; Reverse < 4; Reverse++ ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BoomBehCreateAux Reverse %ld\n", Reverse ); ++ } ++ ++ if ( Reverse != 0 ) ++ { ++ BoomBehReverseAbl( BehFigure ); ++ } ++ ++ /* ++ garbagebddsystem( (bddsystem *)0 ); ++ fprintf( stdout, "Before %ld ", BddLocalSystem->NUMBER_NODE ); ++ */ ++ ++ BoomBehUnflatAbl( BehFigure ); ++ BoomBehMakeBddNode( BehFigure, 1 ); ++ ++ BoomBehInitializeAux( BehFigure ); ++ BoomBehMapAblWithName( BehFigure, BoomCreateAuxAblWithName ); ++ BoomBehUnmarkBddNode( BehFigure ); ++ ++ /* ++ garbagebddsystem( (bddsystem *)0 ); ++ fprintf( stdout, "After %ld\n", BddLocalSystem->NUMBER_NODE ); ++ */ ++ ++ resetauthtable( BoomAuxHashTable ); ++ resetauthtable( BoomNotAuxHashTable ); ++ resetauthtable( BoomAuxNameHashTable ); ++ ++ BoomBehFlatAbl( BehFigure ); ++ BoomBehSimplifyAbl( BehFigure ); ++ ++ /* ++ BoomBehDeleteUselessAux( BehFigure, InitialAux, 0 ); ++ */ ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Reverse %ld Aux %ld\n", Reverse, BoomAuxNumber ); ++ } ++ } ++ ++ /* ++ for ( BoomAuxMinDepth = 15; BoomAuxMinDepth >= 2; BoomAuxMinDepth-- ) ++ BoomAuxMinDepth = 2; ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Check Depth %ld\n", BoomAuxMinDepth ); ++ } ++ } ++ */ ++ ++# ifdef DEBUG ++fprintf( stdout, "After BoomCreateAuxAbl\n" ); ++testbddcircuit( (bddcircuit *)0 ); ++# endif ++ ++# ifdef DEBUG ++fprintf( stdout, "After UnmarkAbl\n" ); ++testbddcircuit( (bddcircuit *)0 ); ++ ++ BoomBehResetBddNode( BehFigure ); ++# endif ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehComputeAux | ++| | ++\------------------------------------------------------------*/ ++ ++beaux_list *BoomBehComputeAux( BehFigure, BehAux ) ++ ++ befig_list *BehFigure; ++ beaux_list *BehAux; ++{ ++ beaux_list *ScanAux; ++ beaux_list **PrevAux; ++ ++ PrevAux = &BehFigure->BEAUX; ++ ++ for ( ScanAux = BehFigure->BEAUX; ++ ScanAux != (beaux_list *)0; ++ ScanAux = ScanAux->NEXT ) ++ { ++ if ( ScanAux == BehAux ) ++ { ++ *PrevAux = (beaux_list *)0; break; ++ } ++ ++ PrevAux = &ScanAux->NEXT; ++ } ++ ++ BoomBehFreeBehAux( BehFigure->BEAUX ); ++ ++ BehFigure->BEAUX = ScanAux; ++ BehAux = ScanAux; ++ ++ BoomBehBddNode2Abl( BehFigure ); ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomDebugSaveBehFigure( BehFigure, NULL ); ++ } ++ ++ BoomBehCreateAux( BehFigure ); ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomDebugSaveBehFigure( BehFigure, NULL ); ++ } ++ ++ return( BehAux ); ++} +diff -Naur alliance-5.0/boo/src/boom_aux.h alliance/boom/src/boom_aux.h +--- alliance-5.0/boo/src/boom_aux.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_aux.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,78 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_aux.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_AUX_H ++# define BOOM_AUX_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_AUX_MIN_DEPTH 2 ++# define BOOM_AUX_MIN_OCCUR 2 ++# define BOOM_AUX_MIN_LITERAL_COST 2 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehCreateAux(); ++ extern beaux_list *BoomBehComputeAux(); ++ extern void BoomBehDeleteUselessAux(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_auxinit.c alliance/boom/src/boom_auxinit.c +--- alliance-5.0/boo/src/boom_auxinit.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_auxinit.c 2006-03-29 19:10:07.000000000 +0200 +@@ -0,0 +1,352 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_auxinit.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_abl.h" ++# include "boom_cost.h" ++# include "boom_aux.h" ++# include "boom_auxinit.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static befig_list *BoomBehFigure = (befig_list *)0; ++ static boombefiginfo *BoomFigInfo = (boombefiginfo *)0; ++ static authtable *BoomHashAux = (authtable *)0; ++ static long BoomAuxNumber = 0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomGetNumberAtomicXorAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static long BoomGetNumberAtomicXorAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ ablexpr *ScanExpr; ++ long Oper; ++ long Count; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ return( 0 ); ++ } ++ else ++ { ++ Oper = ABL_OPER( Expr ); ++ Count = 0; ++ ++ if ( ( Oper == ABL_XOR ) || ++ ( Oper == ABL_NXOR ) ) ++ { ++ Count = 1; ++ ScanExpr = Expr; ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (ablexpr *)0 ) ++ { ++ if ( ! ABL_ATOM( ABL_CAR( ScanExpr ) ) ) ++ { ++ Count = 0; break; ++ } ++ } ++ } ++ ++ while ( ( Expr = ABL_CDR( Expr ) ) != (ablexpr *)0 ) ++ { ++ Count += BoomGetNumberAtomicXorAbl( ABL_CAR( Expr ) ); ++ } ++ } ++ ++ return( Count ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomGetNewAuxInitName | ++| | ++\------------------------------------------------------------*/ ++ ++static char *BoomGetNewAuxInitName() ++{ ++ authelem *Element; ++ char *Name; ++ char Buffer[ 32 ]; ++ ++ do ++ { ++ sprintf( Buffer, "boom_init_%ld", BoomAuxNumber++ ); ++ Name = namealloc( Buffer ); ++ Element = searchauthelem( BoomHashAux, Name ); ++ } ++ while ( Element != (authelem *)0 ); ++ ++ return( Name ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomCreateAuxInitComparatorAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static ablexpr *BoomCreateAuxInitComparatorAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ ablexpr *ScanExpr; ++ long Oper; ++ ablexpr *Operand1; ++ ablexpr *Operand2; ++ ablexpr *AuxExpr; ++ char *AuxName; ++ ++ if ( ! ABL_ATOM( Expr ) ) ++ { ++ Oper = ABL_OPER( Expr ); ++ ++ if ( ( Oper == ABL_XOR ) || ++ ( Oper == ABL_NXOR ) ) ++ { ++ ScanExpr = Expr; ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (ablexpr *)0 ) ++ { ++ if ( ! ABL_ATOM( ABL_CAR( ScanExpr ) ) ) break; ++ } ++ ++ if ( ScanExpr == (ablexpr *)0 ) ++ { ++/* ++** Create auxiliary variables for each xor couple ++*/ ++ ScanExpr = Expr; ++ Operand1 = (ablexpr *)0; ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (ablexpr *)0 ) ++ { ++ if ( Operand1 == (ablexpr *)0 ) ++ { ++ Operand1 = ABL_CAR( ScanExpr ); ++ ABL_CAR_L( ScanExpr ) = (ablexpr *)0; ++ ++ continue; ++ } ++ ++ Operand2 = ABL_CAR( ScanExpr ); ++ ABL_CAR_L( ScanExpr ) = (ablexpr *)0; ++ ++ AuxExpr = createablbinexpr( ABL_XOR, Operand1, Operand2 ); ++ AuxName = BoomGetNewAuxInitName(); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Found a comparator, add aux init %s\n", AuxName ); ++ } ++ ++ BoomBehFigure->BEAUX = beh_addbeaux( BoomBehFigure->BEAUX, AuxName, AuxExpr, (void *)0 ); ++ BoomBehFigure->BERIN = beh_addberin( BoomBehFigure->BERIN, AuxName ); ++ BoomAddBehAuxInfo( BoomBehFigure->BEAUX ); ++ SetBoomBehAuxKeep( BoomBehFigure->BEAUX ); ++ ++ Operand1 = createablatom( AuxName ); ++ } ++ ++ freeablexpr( Expr ); ++ ++ Expr = Operand1; ++ ++ if ( Oper == ABL_NXOR ) Expr = optimablnotexpr( Expr ); ++ ++ return( Expr ); ++ } ++ } ++ ++ ScanExpr = Expr; ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (ablexpr *)0 ) ++ { ++ ABL_CAR_L( ScanExpr ) = BoomCreateAuxInitComparatorAbl( ABL_CAR( ScanExpr ) ); ++ } ++ } ++ ++ return( Expr ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomIdentifiyComparatorAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static ablexpr *BoomIdentifiyComparatorAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ long Number; ++ ++ Number = BoomGetNumberAtomicXorAbl( Expr ); ++ ++ if ( Number > BOOM_AUX_INIT_MAX_XOR ) ++ { ++ Expr = BoomCreateAuxInitComparatorAbl( Expr ); ++ } ++ ++ return( Expr ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomKeepStableAuxAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomKeepStableAuxAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ authelem *Element; ++ char *Value; ++ beaux_list *BehAux; ++ long Oper; ++ ++ if ( ABL_ATOM( Expr ) ) return; ++ ++ Oper = ABL_OPER( Expr ); ++ ++ if ( Oper == ABL_STABLE ) ++ { ++ Expr = ABL_CADR( Expr ); ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Value = ABL_ATOM_VALUE( Expr ); ++ Element = searchauthelem( BoomHashAux, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ BehAux = (beaux_list *)Element->VALUE; ++ SetBoomBehAuxKeep( BehAux ); ++ } ++ } ++ } ++ else ++ { ++ while ( ( Expr = ABL_CDR( Expr ) ) != (chain_list *)0 ) ++ { ++ BoomKeepStableAuxAbl( ABL_CAR( Expr ) ); ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehCreateAuxInit | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehCreateAuxInit( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ ++ BoomBehFigure = BehFigure; ++ BoomFigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ BoomHashAux = createauthtable( 100 ); ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ addauthelem( BoomHashAux, BehAux->NAME, (long)BehAux ); ++ ++ if ( BoomFigInfo->KEEP_AUX ) ++ { ++ SetBoomBehAuxKeep( BehAux ); ++ } ++ } ++ ++ BoomBehScanAbl( BehFigure, BoomKeepStableAuxAbl, 1 ); ++ ++ BoomBehDeleteUselessAux( BehFigure, (beaux_list *)0, 1 ); ++ ++ BoomBehMapAbl( BehFigure, simpablexpr, 1 ); ++ ++ BoomBehMapAbl( BehFigure, BoomIdentifiyComparatorAbl, 0 ); ++ ++ destroyauthtable( BoomHashAux ); ++} +diff -Naur alliance-5.0/boo/src/boom_auxinit.h alliance/boom/src/boom_auxinit.h +--- alliance-5.0/boo/src/boom_auxinit.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_auxinit.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,74 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_auxinit.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_AUX_INIT_H ++# define BOOM_AUX_INIT_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_AUX_INIT_MAX_XOR 5 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehCreateAuxInit(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_bdd.c alliance/boom/src/boom_bdd.c +--- alliance-5.0/boo/src/boom_bdd.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_bdd.c 2006-03-29 19:10:07.000000000 +0200 +@@ -0,0 +1,1841 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : Boom | ++| | ++| File : boom_bdd.c | ++| | ++| Date : 06.06.00 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++ ++# include ++# include ++ ++# include "boom_bdd.h" ++# include "boom_abl.h" ++# include "boom_order.h" ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static chain_list *BoomBddHeadName = (chain_list *)0; ++ static befig_list *BoomBddBehFigure = (befig_list *)0; ++ static char BoomBddMarkAbl = 0; ++ ++ static long BoomBddNumberNode = 0; ++ ++ static authtable *BoomBddHashAux = (authtable *)0; ++ static authtable *BoomBddHashKeepAux = (authtable *)0; ++ static authtable *BoomBddHashRenameAux = (authtable *)0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Abl 2 Bdd | ++| | ++\------------------------------------------------------------*/ ++ ++static bddnode *BoomExpr2BddNode( Expr ) ++ ++ chain_list *Expr; ++{ ++ bddnode *BddNode; ++ bddnode *BddFirst; ++ char *AtomValue; ++ beaux_list *ScanAux; ++ chain_list *ScanChain; ++ chain_list *ScanExpr; ++ long Oper; ++ int Negative; ++ ++ if ( Expr == (chain_list *)0 ) ++ { ++ BoomError( BOOM_EXPR_NULL_ERROR, (char *)0 ); ++ } ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ AtomValue = ABL_ATOM_VALUE( Expr ); ++ ++ if ( AtomValue == ABL_ATOM_NAME_ONE ) ++ { ++ return( BddLocalSystem->ONE ); ++ } ++ ++ if ( AtomValue == ABL_ATOM_NAME_ZERO ) ++ { ++ return( BddLocalSystem->ZERO ); ++ } ++ ++ BddNode = searchbddcircuitin( (bddcircuit *)0, AtomValue ); ++ ++ if ( BddNode != (bddnode *)0 ) ++ { ++ return( incbddrefext( BddNode ) ); ++ } ++ ++ for ( ScanAux = BoomBddBehFigure->BEAUX; ++ ScanAux != (beaux_list *)0; ++ ScanAux = ScanAux->NEXT ) ++ { ++ if ( ScanAux->NAME == AtomValue ) break; ++ } ++ ++ if ( ScanAux == (beaux_list *)0 ) ++ { ++ BoomError( BOOM_UNKNOWN_ATOM_ERROR, AtomValue ); ++ } ++ ++ for ( ScanChain = BoomBddHeadName; ++ ScanChain != (chain_list *)0; ++ ScanChain = ScanChain->NEXT ) ++ { ++ if ( ScanChain->DATA == AtomValue ) ++ { ++ BoomError( BOOM_EXPR_LOOP_ERROR, AtomValue ); ++ } ++ } ++ ++ if ( ScanAux->NODE == (void *)0 ) ++ { ++ BoomBddHeadName = addchain( BoomBddHeadName, AtomValue ); ++ ScanAux->NODE = (void *)BoomExpr2BddNode( ScanAux->ABL ); ++ BoomBddHeadName = delchain( BoomBddHeadName, BoomBddHeadName ); ++ } ++ ++ BddNode = ScanAux->NODE; ++ ++ return( incbddrefext( BddNode ) ); ++ } ++ ++ Oper = ABL_OPER( Expr ); ++ ScanExpr = ABL_CDR( Expr ); ++ ++ if ( Oper == ABL_NOT ) ++ { ++ if ( ABL_CDR( ScanExpr ) != (chain_list *)0 ) ++ { ++ BoomError( BOOM_OPERATOR_ERROR, Oper ); ++ } ++ ++ BddFirst = BoomExpr2BddNode( ABL_CAR( ScanExpr ) ); ++ ++ BddNode = applybddnodenot( (bddsystem *)0, ++ decbddrefext( BddFirst ) ); ++ ++ if ( BoomBddMarkAbl ) BoomSetBddMarkAbl( Expr, BddNode ); ++ ++ return( BddNode ); ++ } ++ ++ if ( Oper == ABL_STABLE ) ++ { ++ ScanExpr = ABL_CAR( ScanExpr ); ++ ++ if ( ! ABL_ATOM( ScanExpr ) ) ++ { ++ BoomError( BOOM_ILLEGAL_STABLE_ERROR, (char *)0 ); ++ } ++ ++ AtomValue = ABL_ATOM_VALUE( ScanExpr ); ++ BddFirst = searchbddcircuitin( (bddcircuit *)0, AtomValue ); ++ ++ if ( BddFirst == (bddnode *)0 ) ++ { ++ BoomError( BOOM_UNKNOWN_ATOM_ERROR, AtomValue ); ++ } ++ ++ AtomValue = getbddstablename( AtomValue ); ++ BddNode = searchbddcircuitin( (bddcircuit *)0, AtomValue ); ++ ++ if ( BddNode == (bddnode *)0 ) ++ { ++ BddNode = addbddcircuitin( (bddcircuit *)0, AtomValue, ++ (bddindex )0, BDD_IN_MODE_LAST ); ++ } ++ ++ if ( BoomBddMarkAbl ) BoomSetBddMarkAbl( Expr, BddNode ); ++ ++ return( BddNode ); ++ } ++ ++ if ( ( isablunaryoper( Oper ) ) || ++ ( ABL_CDR( ScanExpr ) == (chain_list *)0 ) ) ++ { ++ BoomError( BOOM_OPERATOR_ERROR, Oper ); ++ } ++ ++ if ( ( getabloperpolar( Oper ) == ABL_POLAR_POSITIVE ) || ++ ( ABL_CDDR( ScanExpr ) == (chain_list *)0 ) ) ++ { ++ Negative = 0; ++ } ++ else ++ { ++ Negative = 1; ++ Oper = getablopernot( Oper ); ++ } ++ ++ BddFirst = BoomExpr2BddNode( ABL_CAR( ScanExpr ) ); ++ ++ while ( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (chain_list *)0 ) ++ { ++ BddNode = BoomExpr2BddNode( ABL_CAR( ScanExpr ) ); ++ ++ BddFirst = applybddnode( (bddsystem *)0, Oper, ++ decbddrefext( BddFirst ), ++ decbddrefext( BddNode ) ); ++ } ++ ++ if ( Negative ) ++ { ++ BddFirst = applybddnodenot( (bddsystem *)0, ++ decbddrefext( BddFirst ) ); ++ } ++ ++ if ( BoomBddMarkAbl ) BoomSetBddMarkAbl( Expr, BddFirst ); ++ ++ return( BddFirst ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Abl 2 Bdd | ++| | ++\------------------------------------------------------------*/ ++ ++static bddnode *BoomAbl2BddNode( Name, Expr ) ++ ++ char *Name; ++ chain_list *Expr; ++{ ++ bddnode *BddNode; ++ ++ if ( Name != (char *)0 ) ++ { ++ BoomBddHeadName = addchain( BoomBddHeadName, Name ); ++ } ++ ++ BddNode = BoomExpr2BddNode( Expr ); ++ ++ if ( Name != (char *)0 ) ++ { ++ BoomBddHeadName = delchain( BoomBddHeadName, BoomBddHeadName ); ++ } ++ ++ if ( IsBddSystemExplosion( BddLocalSystem ) ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion !!! %ld\n", BddLocalSystem->NUMBER_NODE ); ++ } ++ ++ garbagebddsystem( BddLocalSystem ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion !!! %ld\n", BddLocalSystem->NUMBER_NODE ); ++ } ++ ++ explosionbddsystemrestart( BddLocalSystem ); ++ ++ explosionbddsystemdynamic( BddLocalSystem, NULL, BOOM_BDD_EXPLOSION_LIMIT ); ++ ++ BddNode = (bddnode *)0; ++ } ++ else ++ if ( Name != (char *)0 ) ++ { ++ BddNode = addbddcircuitout( (bddcircuit *)0, Name, BddNode ); ++ } ++ ++ return( BddNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Make Bdd | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehMakeBddNode( BehFigure, MarkAbl ) ++ ++ befig_list *BehFigure; ++ int MarkAbl; ++{ ++ beaux_list *BehAux; ++ beout_list *BehOut; ++ bebus_list *BehBus; ++ bebux_list *BehBux; ++ bereg_list *BehReg; ++ biabl_list *BiAbl; ++ binode_list *BiNode; ++ ++ BoomBddBehFigure = BehFigure; ++ BoomBddHeadName = (chain_list *)0; ++ BoomBddMarkAbl = MarkAbl; ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( BehAux->NODE != (void *)0 ) decbddrefext( BehAux->NODE ); ++ ++ if ( ! IsBoomBehAuxDontTouch( BehAux ) ) ++ { ++ BehAux->NODE = (void *)BoomAbl2BddNode( BehAux->NAME, BehAux->ABL ); ++ } ++ else ++ { ++ BehAux->NODE = (void *)0; ++ } ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ BiNode = BehBus->BINODE; ++ ++ for ( BiAbl = BehBus->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) decbddrefext( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != (void *)0 ) decbddrefext( BiNode->CNDNODE ); ++ ++ if ( ! IsBoomBehAuxDontTouch( BehBus ) ) ++ { ++ BiNode->VALNODE = (void *)BoomAbl2BddNode( BehBus->NAME, BiAbl->VALABL ); ++ BiNode->CNDNODE = (void *)BoomAbl2BddNode( (char *)0, BiAbl->CNDABL ); ++ } ++ else ++ { ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ } ++ ++ BiNode = BiNode->NEXT; ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ BiNode = BehBux->BINODE; ++ ++ for ( BiAbl = BehBux->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) decbddrefext( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != (void *)0 ) decbddrefext( BiNode->CNDNODE ); ++ ++ if ( ! IsBoomBehAuxDontTouch( BehBux ) ) ++ { ++ BiNode->VALNODE = (void *)BoomAbl2BddNode( BehBux->NAME, BiAbl->VALABL ); ++ BiNode->CNDNODE = (void *)BoomAbl2BddNode( (char *)0, BiAbl->CNDABL ); ++ } ++ else ++ { ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ } ++ ++ BiNode = BiNode->NEXT; ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ BiNode = BehReg->BINODE; ++ ++ for ( BiAbl = BehReg->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) decbddrefext( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != (void *)0 ) decbddrefext( BiNode->CNDNODE ); ++ ++ if ( ! IsBoomBehAuxDontTouch( BehReg ) ) ++ { ++ BiNode->VALNODE = (void *)BoomAbl2BddNode( BehReg->NAME, BiAbl->VALABL ); ++ BiNode->CNDNODE = (void *)BoomAbl2BddNode( (char *)0, BiAbl->CNDABL ); ++ } ++ else ++ { ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ } ++ ++ BiNode = BiNode->NEXT; ++ } ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ if ( BehOut->NODE != (void *)0 ) decbddrefext( BehOut->NODE ); ++ ++ if ( ! IsBoomBehAuxDontTouch( BehOut ) ) ++ { ++ BehOut->NODE = (void *)BoomAbl2BddNode( BehOut->NAME, BehOut->ABL ); ++ } ++ else ++ { ++ BehOut->NODE = (void *)0; ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBddSetExprKeepAux | ++| | ++\------------------------------------------------------------*/ ++ ++static long BoomBddSetExprKeepAux( Expr ) ++ ++ ablexpr *Expr; ++{ ++ char *Value; ++ char *Name; ++ char *Vector; ++ beaux_list *BehAux; ++ bddnode *BddNode; ++ authelem *Element; ++ long Index; ++ long Number; ++ ++ Number = 0; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Value = ABL_ATOM_VALUE( Expr ); ++ ++ if ( ( Value != ABL_ATOM_NAME_ONE ) && ++ ( Value != ABL_ATOM_NAME_ZERO ) && ++ ( Value != ABL_ATOM_NAME_DC ) && ++ ( Value != ABL_ATOM_NAME_TRISTATE ) ) ++ { ++ Element = searchauthelem( BoomBddHashAux, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ BehAux = (beaux_list *)Element->VALUE; ++ Element = searchauthelem( BoomBddHashKeepAux, Value ); ++ ++ if ( Element == (authelem *)0 ) ++ { ++ boombefiginfo *FigInfo; ++ ++ FigInfo = GetBoomBehFigInfo( BoomBddBehFigure ); ++ ++ Name = vhdlablvector( BehAux->NAME, &Index ); ++ ++ if ( Name != (char *)0 ) ++ { ++ for ( BehAux = BoomBddBehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ Vector = vhdlablvector( BehAux->NAME, &Index ); ++ ++ if ( Vector == Name ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Keep %s\n", BehAux->NAME ); ++ } ++ ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep signal %s\n", BehAux->NAME ); ++ } ++ ++ addauthelem( BoomBddHashKeepAux, BehAux->NAME, 0 ); ++ SetBoomBehAuxKeep( BehAux ); ++ BddNode = addbddcircuitin( (bddcircuit *)0, BehAux->NAME, ++ 0, BDD_IN_MODE_LAST ); ++ ++ Number++; ++ } ++ } ++ } ++ else ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Keep %s\n", BehAux->NAME ); ++ } ++ ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep signal %s\n", BehAux->NAME ); ++ } ++ ++ addauthelem( BoomBddHashKeepAux, BehAux->NAME, 0 ); ++ SetBoomBehAuxKeep( BehAux ); ++ BddNode = addbddcircuitin( (bddcircuit *)0, BehAux->NAME, 0, BDD_IN_MODE_LAST ); ++ ++ Number++; ++ } ++ } ++ else ++ { ++ Number++; ++ } ++ } ++ } ++ } ++ else ++ { ++ while ( ( Expr = ABL_CDR( Expr ) ) != (ablexpr *)0 ) ++ { ++ Number += BoomBddSetExprKeepAux( ABL_CAR( Expr ) ); ++ } ++ } ++ ++ return( Number ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Make Bdd No Explosion | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehMakeBddNodeNoExplosion( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ beout_list *BehOut; ++ bebus_list *BehBus; ++ bebux_list *BehBux; ++ bereg_list *BehReg; ++ biabl_list *BiAbl; ++ binode_list *BiNode; ++ bddnode *BddNode; ++ char *Name; ++ char *Vector; ++ long Index; ++ int Retry; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ BoomBddBehFigure = BehFigure; ++ BoomBddHeadName = (chain_list *)0; ++ BoomBddMarkAbl = 0; ++ ++ explosionbddsystemdynamic( (bddsystem *)0, NULL, BOOM_BDD_EXPLOSION_LIMIT ); ++ ++ if ( BoomBddHashAux == (authtable *)0 ) ++ { ++ BoomBddHashAux = createauthtable( 100 ); ++ BoomBddHashKeepAux = createauthtable( 100 ); ++ BoomBddHashRenameAux = createauthtable( 100 ); ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ addauthelem( BoomBddHashAux, BehAux->NAME, (long)BehAux ); ++ } ++ ++ Retry = 1; ++ ++ while ( Retry ) ++ { ++ Retry = 0; ++ ++ for ( BehAux = BehFigure->BEAUX; ++ ( BehAux != (beaux_list *)0 ) && ( ! Retry ); ++ BehAux = BehAux->NEXT ) ++ { ++ if ( BehAux->NODE != (void *)0 ) decbddrefext( BehAux->NODE ); ++ ++ if ( ! IsBoomBehAuxDontTouch( BehAux ) ) ++ { ++ BehAux->NODE = (void *)BoomAbl2BddNode( BehAux->NAME, BehAux->ABL ); ++/* ++** Explosion ! ++*/ ++ if ( BehAux->NODE == (void *)0 ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion while building %s\n", BehAux->NAME ); ++ } ++ ++ Retry = 1; ++ ++ Name = vhdlablvector( BehAux->NAME, &Index ); ++ ++ if ( Name != (char *)0 ) ++ { ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ Vector = vhdlablvector( BehAux->NAME, &Index ); ++ ++ if ( Vector == Name ) ++ { ++ BddNode = addbddcircuitin( (bddcircuit *)0, BehAux->NAME, ++ 0, BDD_IN_MODE_LAST ); ++ ++ if ( IsBoomBehAuxKeep( BehAux ) ) ++ { ++ SetBoomBehAuxDontTouch( BehAux ); ++ ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Don't touch signal %s\n", BehAux->NAME ); ++ } ++ } ++ else ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep signal %s\n", BehAux->NAME ); ++ } ++ ++ SetBoomBehAuxKeep( BehAux ); ++ ++ if ( BoomBddSetExprKeepAux( BehAux->ABL ) == 0 ) ++ { ++ SetBoomBehAuxDontTouch( BehAux ); ++ } ++ } ++ } ++ } ++ else ++ { ++ BddNode = addbddcircuitin( (bddcircuit *)0, BehAux->NAME, 0, BDD_IN_MODE_LAST ); ++ ++ if ( IsBoomBehAuxKeep( BehAux ) ) ++ { ++ SetBoomBehAuxDontTouch( BehAux ); ++ } ++ ++ SetBoomBehAuxKeep( BehAux ); ++ BoomBddSetExprKeepAux( BehAux->ABL ); ++ } ++ ++ break; ++ } ++ } ++ else ++ { ++ BehAux->NODE = (void *)0; ++ } ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ ( BehBus != (bebus_list *)0 ) && ( ! Retry ); ++ BehBus = BehBus->NEXT ) ++ { ++ BiNode = BehBus->BINODE; ++ ++ for ( BiAbl = BehBus->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) decbddrefext( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != (void *)0 ) decbddrefext( BiNode->CNDNODE ); ++ ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ ++ if ( ! IsBoomBehAuxDontTouch( BehBus ) ) ++ { ++ BiNode->VALNODE = (void *)BoomAbl2BddNode( BehBus->NAME, BiAbl->VALABL ); ++ ++ if ( BiNode->VALNODE == (void *)0 ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion while building %s\n", BehBus->NAME ); ++ } ++ ++ Retry = 1; ++ ++ if ( IsBoomBehAuxKeep( BehBus ) ) ++ { ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Don't touch bus signal %s\n", BehBus->NAME ); ++ } ++ ++ SetBoomBehAuxDontTouch( BehBus ); ++ } ++ else ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep bus signal %s\n", BehBus->NAME ); ++ } ++ ++ SetBoomBehAuxKeep( BehBus ); ++ ++ if ( BoomBddSetExprKeepAux( BiAbl->VALABL ) == 0 ) ++ { ++ SetBoomBehAuxDontTouch( BehBus ); ++ } ++ ++ break; ++ } ++ ++ BiNode->CNDNODE = (void *)BoomAbl2BddNode( (char *)0, BiAbl->CNDABL ); ++ ++ if ( BiNode->CNDNODE == (void *)0 ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion while building %s\n", BehBus->NAME ); ++ } ++ ++ Retry = 1; ++ ++ if ( IsBoomBehAuxKeep( BehBus ) ) ++ { ++ SetBoomBehAuxDontTouch( BehBus ); ++ ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Don't touch bus signal %s\n", BehBus->NAME ); ++ } ++ } ++ else ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep bus signal %s\n", BehBus->NAME ); ++ } ++ ++ SetBoomBehAuxKeep( BehBus ); ++ ++ if ( BoomBddSetExprKeepAux( BiAbl->CNDABL ) == 0 ) ++ { ++ SetBoomBehAuxDontTouch( BehBus ); ++ } ++ ++ break; ++ } ++ } ++ else ++ { ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ } ++ ++ BiNode = BiNode->NEXT; ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ ( BehBux != (bebux_list *)0 ) && ( ! Retry ); ++ BehBux = BehBux->NEXT ) ++ { ++ BiNode = BehBux->BINODE; ++ ++ for ( BiAbl = BehBux->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) decbddrefext( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != (void *)0 ) decbddrefext( BiNode->CNDNODE ); ++ ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ ++ if ( ! IsBoomBehAuxDontTouch( BehBux ) ) ++ { ++ BiNode->VALNODE = (void *)BoomAbl2BddNode( BehBux->NAME, BiAbl->VALABL ); ++ ++ if ( BiNode->VALNODE == (void *)0 ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion while building %s\n", BehBux->NAME ); ++ } ++ ++ Retry = 1; ++ ++ if ( IsBoomBehAuxKeep( BehBux ) ) ++ { ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Don't touch bus signal %s\n", BehBux->NAME ); ++ } ++ ++ SetBoomBehAuxDontTouch( BehBux ); ++ } ++ else ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep bux signal %s\n", BehBux->NAME ); ++ } ++ ++ SetBoomBehAuxKeep( BehBux ); ++ ++ if ( BoomBddSetExprKeepAux( BiAbl->VALABL ) == 0 ) ++ { ++ SetBoomBehAuxDontTouch( BehBux ); ++ } ++ ++ break; ++ } ++ ++ BiNode->CNDNODE = (void *)BoomAbl2BddNode( (char *)0, BiAbl->CNDABL ); ++ ++ if ( BiNode->CNDNODE == (void *)0 ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion while building %s\n", BehBux->NAME ); ++ } ++ ++ Retry = 1; ++ ++ if ( IsBoomBehAuxKeep( BehBux ) ) ++ { ++ SetBoomBehAuxDontTouch( BehBux ); ++ ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Don't touch bus signal %s\n", BehBux->NAME ); ++ } ++ } ++ else ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep bus signal %s\n", BehBux->NAME ); ++ } ++ ++ SetBoomBehAuxKeep( BehBux ); ++ ++ if ( BoomBddSetExprKeepAux( BiAbl->CNDABL ) == 0 ) ++ { ++ SetBoomBehAuxDontTouch( BehBux ); ++ } ++ ++ break; ++ } ++ } ++ else ++ { ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ } ++ ++ BiNode = BiNode->NEXT; ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ ( BehReg != (bereg_list *)0 ) && ( ! Retry ); ++ BehReg = BehReg->NEXT ) ++ { ++ BiNode = BehReg->BINODE; ++ ++ for ( BiAbl = BehReg->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) decbddrefext( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != (void *)0 ) decbddrefext( BiNode->CNDNODE ); ++ ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ ++ if ( ! IsBoomBehAuxDontTouch( BehReg ) ) ++ { ++ BiNode->VALNODE = (void *)BoomAbl2BddNode( BehReg->NAME, BiAbl->VALABL ); ++ ++ if ( BiNode->VALNODE == (void *)0 ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion while building %s\n", BehReg->NAME ); ++ } ++ ++ Retry = 1; ++ ++ if ( IsBoomBehAuxKeep( BehReg ) ) ++ { ++ SetBoomBehAuxDontTouch( BehReg ); ++ ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Don't touch register signal %s\n", BehReg->NAME ); ++ } ++ } ++ else ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep register signal %s\n", BehReg->NAME ); ++ } ++ ++ SetBoomBehAuxKeep( BehReg ); ++ ++ if ( BoomBddSetExprKeepAux( BiAbl->VALABL ) == 0 ) ++ { ++ SetBoomBehAuxDontTouch( BehReg ); ++ } ++ ++ break; ++ } ++ ++ BiNode->CNDNODE = (void *)BoomAbl2BddNode( (char *)0, BiAbl->CNDABL ); ++ ++ if ( BiNode->CNDNODE == (void *)0 ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion while building %s\n", BehReg->NAME ); ++ } ++ ++ Retry = 1; ++ ++ if ( IsBoomBehAuxKeep( BehReg ) ) ++ { ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Don't touch register signal %s\n", BehReg->NAME ); ++ } ++ ++ SetBoomBehAuxDontTouch( BehReg ); ++ } ++ else ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep register signal %s\n", BehReg->NAME ); ++ } ++ ++ SetBoomBehAuxKeep( BehReg ); ++ ++ if ( BoomBddSetExprKeepAux( BiAbl->CNDABL ) == 0 ) ++ { ++ SetBoomBehAuxDontTouch( BehReg ); ++ } ++ ++ break; ++ } ++ } ++ else ++ { ++ BiNode->VALNODE = (void *)0; ++ BiNode->CNDNODE = (void *)0; ++ } ++ ++ BiNode = BiNode->NEXT; ++ } ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ ( BehOut != (beout_list *)0 ) && ( ! Retry ); ++ BehOut = BehOut->NEXT ) ++ { ++ if ( BehOut->NODE != (void *)0 ) decbddrefext( BehOut->NODE ); ++ ++ if ( ! IsBoomBehAuxDontTouch( BehOut ) ) ++ { ++ BehOut->NODE = (void *)BoomAbl2BddNode( BehOut->NAME, BehOut->ABL ); ++ ++ if ( BehOut->NODE == (void *)0 ) ++ { ++/* ++** Explosion ! ++*/ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Explosion while building %s\n", BehOut->NAME ); ++ } ++ ++ Retry = 1; ++ ++ if ( IsBoomBehAuxKeep( BehOut ) ) ++ { ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Don't touch output signal %s\n", BehOut->NAME ); ++ } ++ ++ SetBoomBehAuxDontTouch( BehOut ); ++ } ++ else ++ if ( FigInfo->TRACE ) ++ { ++ fprintf( stdout, "\t Keep output signal %s\n", BehOut->NAME ); ++ } ++ ++ SetBoomBehAuxKeep( BehOut ); ++ ++ if ( BoomBddSetExprKeepAux( BehOut->ABL ) == 0 ) ++ { ++ SetBoomBehAuxDontTouch( BehOut ); ++ } ++ } ++ } ++ else ++ { ++ BehOut->NODE = (void *)0; ++ } ++ } ++ } ++ ++ resetauthtable( BoomBddHashAux ); ++ resetauthtable( BoomBddHashKeepAux ); ++ ++ reorderbddsystemwindow( (bddsystem *)0 ); ++ ++ explosionbddsystemdynamic( (bddsystem *)0, NULL, 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Delete Useless Aux | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomBddReplaceKeepAuxAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ authelem *Element; ++ char *Value; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Value = ABL_ATOM_VALUE( Expr ); ++ ++ if ( ( Value != ABL_ATOM_NAME_ONE ) && ++ ( Value != ABL_ATOM_NAME_ZERO ) && ++ ( Value != ABL_ATOM_NAME_DC ) && ++ ( Value != ABL_ATOM_NAME_TRISTATE ) ) ++ { ++ Element = searchauthelem( BoomBddHashRenameAux, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ ABL_CAR_L( Expr ) = (char *)Element->VALUE; ++ } ++ } ++ } ++ else ++ { ++ while ( ( Expr = ABL_CDR( Expr ) ) != (chain_list *)0 ) ++ { ++ BoomBddReplaceKeepAuxAbl( ABL_CAR( Expr ) ); ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Delete Useless Keep Aux | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomBehDeleteDuplicateKeepAux( BehFigure, OrderFlag, DontCareFlag ) ++ ++ befig_list *BehFigure; ++ int OrderFlag; ++ int DontCareFlag; ++{ ++ beaux_list *BehAux; ++ beaux_list *BehAuxDup; ++ beaux_list **PrevAux; ++ beaux_list *BehAuxDel; ++ authelem *Element; ++ int Found; ++ ++ if ( BoomBddHashAux == (authtable *)0 ) ++ { ++ BoomBddHashAux = createauthtable( 100 ); ++ BoomBddHashKeepAux = createauthtable( 100 ); ++ BoomBddHashRenameAux = createauthtable( 100 ); ++ } ++/* ++** Should identify duplicate/useless auxiliar variables ++*/ ++ Found = 0; ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( ( BehAux->NODE == NULL ) || ++ ( ! IsBoomBehAuxKeep( BehAux ) ) ) continue; ++ ++ Element = searchauthelem( BoomBddHashAux, (char *)BehAux->NODE ); ++ ++ if ( Element == (authelem *)0 ) ++ { ++ addauthelem( BoomBddHashAux, (char *)BehAux->NODE, (long)BehAux ); ++ } ++ else ++ { ++ BehAuxDup = (beaux_list *)Element->VALUE; ++ addauthelem( BoomBddHashRenameAux, BehAux->NAME, (long)BehAuxDup->NAME ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Should replace %s by %s\n", BehAux->NAME, BehAuxDup->NAME ); ++ } ++ ++ SetBoomBehAuxTag( BehAux ); ++ ++ Found = 1; ++ } ++ } ++ ++ if ( Found ) ++ { ++ BoomBehScanAbl( BehFigure, BoomBddReplaceKeepAuxAbl, 1 ); ++ ++ PrevAux = &BehFigure->BEAUX; ++ BehAux = BehFigure->BEAUX; ++ ++ while ( BehAux != (beaux_list *)0 ) ++ { ++ if ( IsBoomBehAuxTag( BehAux ) ) ++ { ++ *PrevAux = BehAux->NEXT; ++ BehAuxDel = BehAux; ++ BehAux = BehAux->NEXT; ++ ++ BehFigure->BERIN = beh_rmvberin( BehFigure->BERIN, BehAuxDel->NAME ); ++ ++ BehAuxDel->NEXT = (beaux_list *)0; ++ BoomBehFreeBehAux( BehAuxDel ); ++ } ++ else ++ { ++ PrevAux = &BehAux->NEXT; ++ BehAux = BehAux->NEXT; ++ } ++ } ++ ++ BoomBehResetBddNode( BehFigure ); ++ ++ resetbddcircuit( (bddcircuit *)0 ); ++ resetbddsystem( (bddsystem *)0 ); ++ ++ if ( ! BoomDebugFlag ) ++ { ++ SetBddSystemNoWarning( BddLocalSystem ); ++ } ++ ++ BoomBehMakeBddOrder( BehFigure, OrderFlag, DontCareFlag ); ++ ++ BoomBehMakeBddNode( BehFigure, 0 ); ++ } ++ ++ resetauthtable( BoomBddHashAux ); ++ resetauthtable( BoomBddHashRenameAux ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Make Bdd | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehAbl2BddNode( BehFigure, OrderFlag, DontCareFlag ) ++ ++ befig_list *BehFigure; ++ int OrderFlag; ++ int DontCareFlag; ++{ ++ berin_list *BehRin; ++ beaux_list *BehAux; ++ beaux_list *DelAux; ++ beaux_list **PrevAux; ++ beout_list *BehOut; ++ bebus_list *BehBus; ++ ++ long NumberIn = 1; ++ long NumberOut = 1; ++ ++ if ( BehFigure->BEDLY == (beaux_list *)0 ) ++ { ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( ! IsBoomBehAuxKeep( BehAux ) ) ++ { ++ BehFigure->BERIN = beh_rmvberin( BehFigure->BERIN, BehAux->NAME ); ++ NumberOut++; ++ } ++ else ++ { ++ NumberIn++; ++ } ++ } ++ } ++ else ++ { ++ BoomError( BOOM_SIMPLIFY_ERROR, (char *)0 ); ++ } ++ ++ for ( BehRin = BehFigure->BERIN; ++ BehRin != (berin_list *)0; ++ BehRin = BehRin->NEXT ) ++ { ++ NumberIn++; ++ } ++ ++ if ( DontCareFlag ) NumberIn++; ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ NumberOut++; ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ NumberOut++; ++ } ++ ++ BehFigure->CIRCUI = ++ ++ (void *)createbddcircuit( BehFigure->NAME, NumberIn, NumberOut, (bddsystem *)0 ); ++ ++ BoomBehMakeBddOrder( BehFigure, OrderFlag, DontCareFlag ); ++ ++ BoomBehMakeBddNodeNoExplosion( BehFigure, 0 ); ++ ++ BoomBehDeleteDuplicateKeepAux( BehFigure, OrderFlag, DontCareFlag ); ++ ++ PrevAux = &BehFigure->BEAUX; ++ BehAux = BehFigure->BEAUX; ++ ++ while ( BehAux != (beaux_list *)0 ) ++ { ++ if ( ! IsBoomBehAuxKeep( BehAux ) ) ++ { ++ decbddrefext( BehAux->NODE ); ++ delbddcircuitout( (bddcircuit *)0, BehAux->NAME ); ++ ++ *PrevAux = BehAux->NEXT; ++ DelAux = BehAux; ++ BehAux = BehAux->NEXT; ++ ++ DelAux->NEXT = (beaux_list *)0; ++ BoomBehFreeBehAux( DelAux ); ++ } ++ else ++ { ++ PrevAux = &BehAux->NEXT; ++ BehAux = BehAux->NEXT; ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomUnmarkBddNode | ++| | ++\------------------------------------------------------------*/ ++ ++chain_list *BoomUnmarkBddNode( Expr ) ++ ++ chain_list *Expr; ++{ ++ chain_list *ScanExpr; ++ bddnode *BddNode; ++ ++ if ( ! ABL_ATOM( Expr ) ) ++ { ++ BddNode = (bddnode *)ABL_CDR( ABL_CAR( Expr ) ); ++ ++ if ( BddNode != (bddnode *)0 ) ++ { ++ if ( BddNode->MARK > 0 ) ++ { ++ BddNode->MARK = 0; decbddrefext( BddNode ); ++ } ++ ++ ABL_CDR( ABL_CAR( Expr ) ) = (chain_list *)0; ++ } ++ ++ ScanExpr = Expr; ++ ++ while( ( ScanExpr = ABL_CDR( ScanExpr ) ) != (chain_list *)0 ) ++ { ++ BoomUnmarkBddNode( ABL_CAR( ScanExpr ) ); ++ } ++ } ++ ++ return( Expr ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehUnmarkBddNode | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehUnmarkBddNode( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ BoomBehMapAbl( BehFigure, BoomUnmarkBddNode, 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Boom Beh Reset Bdd Node | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehResetBddNode( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ bddcircuit *BddCircuit; ++ bddsystem *BddSystem; ++ beaux_list *BehAux; ++ beout_list *BehOut; ++ bebus_list *BehBus; ++ bebux_list *BehBux; ++ bereg_list *BehReg; ++ binode_list *BiNode; ++ ++ BddCircuit = BehFigure->CIRCUI; ++ BddSystem = BddCircuit->BDD_SYSTEM; ++ ++ setbddlocalcircuit( BddCircuit ); ++ setbddlocalsystem( BddSystem ); ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( BehAux->NODE != (void *)0 ) ++ { ++ decbddrefext( BehAux->NODE ); ++ delbddcircuitout( (bddcircuit *)0, BehAux->NAME ); ++ } ++ ++ BehAux->NODE = (void *)0; ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ if ( BehOut->NODE != (void *)0 ) ++ { ++ decbddrefext( BehOut->NODE ); ++ delbddcircuitout( (bddcircuit *)0, BehOut->NAME ); ++ } ++ ++ BehOut->NODE = (void *)0; ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ delbddcircuitout( (bddcircuit *)0, BehBus->NAME ); ++ ++ for ( BiNode = BehBus->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) ++ { ++ decbddrefext( BiNode->VALNODE ); ++ BiNode->VALNODE = (void *)0; ++ } ++ ++ if ( BiNode->CNDNODE != (void *)0 ) ++ { ++ decbddrefext( BiNode->CNDNODE ); ++ BiNode->CNDNODE = (void *)0; ++ } ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ delbddcircuitout( (bddcircuit *)0, BehBux->NAME ); ++ ++ for ( BiNode = BehBux->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) ++ { ++ decbddrefext( BiNode->VALNODE ); ++ BiNode->VALNODE = (void *)0; ++ } ++ ++ if ( BiNode->CNDNODE != (void *)0 ) ++ { ++ decbddrefext( BiNode->CNDNODE ); ++ BiNode->CNDNODE = (void *)0; ++ } ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ delbddcircuitout( (bddcircuit *)0, BehReg->NAME ); ++ ++ for ( BiNode = BehReg->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != (void *)0 ) ++ { ++ decbddrefext( BiNode->VALNODE ); ++ BiNode->VALNODE = (void *)0; ++ } ++ ++ if ( BiNode->CNDNODE != (void *)0 ) ++ { ++ decbddrefext( BiNode->CNDNODE ); ++ BiNode->CNDNODE = (void *)0; ++ } ++ } ++ } ++ ++ garbagebddsystem( (bddsystem *)0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehMapBdd | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehMapBdd( BehFigure, Function ) ++ ++ befig_list *BehFigure; ++ bddnode *(*Function)(); ++{ ++ bddcircuit *BddCircuit; ++ bddsystem *BddSystem; ++ beaux_list *BehAux; ++ beout_list *BehOut; ++ bebus_list *BehBus; ++ bebux_list *BehBux; ++ bereg_list *BehReg; ++ binode_list *BiNode; ++ ++ BddCircuit = BehFigure->CIRCUI; ++ BddSystem = BddCircuit->BDD_SYSTEM; ++ ++ setbddlocalcircuit( BddCircuit ); ++ setbddlocalsystem( BddSystem ); ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( BehAux->NODE != NULL ) ++ { ++ BehAux->NODE = Function( BehAux->NODE ); ++ addbddcircuitout( (bddcircuit *)0, BehAux->NAME, BehAux->NODE ); ++ } ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ if ( BehOut->NODE != NULL ) ++ { ++ BehOut->NODE = Function( BehOut->NODE ); ++ addbddcircuitout( (bddcircuit *)0, BehOut->NAME, BehOut->NODE ); ++ } ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ for ( BiNode = BehBus->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != NULL ) ++ { ++ BiNode->VALNODE = Function( BiNode->VALNODE ); ++ addbddcircuitout( (bddcircuit *)0, BehBus->NAME, BiNode->VALNODE ); ++ } ++ ++ if ( BiNode->CNDNODE != NULL ) ++ { ++ BiNode->CNDNODE = Function( BiNode->CNDNODE ); ++ } ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ for ( BiNode = BehBux->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != NULL ) ++ { ++ BiNode->VALNODE = Function( BiNode->VALNODE ); ++ addbddcircuitout( (bddcircuit *)0, BehBux->NAME, BiNode->VALNODE ); ++ } ++ ++ if ( BiNode->CNDNODE != NULL ) ++ { ++ BiNode->CNDNODE = Function( BiNode->CNDNODE ); ++ } ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ for ( BiNode = BehReg->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != NULL ) ++ { ++ BiNode->VALNODE = Function( BiNode->VALNODE ); ++ addbddcircuitout( (bddcircuit *)0, BehReg->NAME, BiNode->VALNODE ); ++ } ++ ++ if ( BiNode->CNDNODE != NULL ) ++ { ++ BiNode->CNDNODE = Function( BiNode->CNDNODE ); ++ } ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehScanBdd | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehScanBdd( BehFigure, Function ) ++ ++ befig_list *BehFigure; ++ void (*Function)(); ++{ ++ bddcircuit *BddCircuit; ++ bddsystem *BddSystem; ++ beaux_list *BehAux; ++ beout_list *BehOut; ++ bebus_list *BehBus; ++ bebux_list *BehBux; ++ bereg_list *BehReg; ++ binode_list *BiNode; ++ ++ BddCircuit = BehFigure->CIRCUI; ++ BddSystem = BddCircuit->BDD_SYSTEM; ++ ++ setbddlocalcircuit( BddCircuit ); ++ setbddlocalsystem( BddSystem ); ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( BehAux->NODE != NULL ) Function( BehAux->NODE ); ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ if ( BehOut->NODE != NULL ) Function( BehOut->NODE ); ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ for ( BiNode = BehBus->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != NULL ) Function( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != NULL ) Function( BiNode->CNDNODE ); ++ } ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ for ( BiNode = BehBux->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != NULL ) Function( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != NULL ) Function( BiNode->CNDNODE ); ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ for ( BiNode = BehReg->BINODE; ++ BiNode != (binode_list *)0; ++ BiNode = BiNode->NEXT ) ++ { ++ if ( BiNode->VALNODE != NULL ) Function( BiNode->VALNODE ); ++ if ( BiNode->CNDNODE != NULL ) Function( BiNode->CNDNODE ); ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomGetNumberBddNode | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomGetNumberBigBddNode( BddNode ) ++ ++ bddnode *BddNode; ++{ ++ long Number; ++ ++ Number = getbddnodenum( (bddsystem *)0, BddNode ); ++ ++ if ( Number >= BOOM_BDD_NODE_BIG_SIZE ) BoomBddNumberNode += Number; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehGetNumberBddNode | ++| | ++\------------------------------------------------------------*/ ++ ++long BoomBehGetNumberBigBddNode( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ BoomBddNumberNode = 0; ++ ++ BoomBehScanBdd( BehFigure, BoomGetNumberBigBddNode ); ++ ++ return( BoomBddNumberNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehGetBddOrder | ++| | ++\------------------------------------------------------------*/ ++ ++chain_list *BoomBehGetBddOrder( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ chain_list *OrderList; ++ long BddVar; ++ long NumberVar; ++ long BddIndex; ++ char *Name; ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ OrderList = (chain_list *)0; ++ ++ for ( BddVar = NumberVar - 1; BddVar >= 0; BddVar-- ) ++ { ++ BddIndex = getbddvarindex( (bddsystem *)0, BddVar ); ++ Name = getbddcircuitinname( (bddcircuit *)0, BddIndex ); ++ ++ OrderList = addchain( OrderList, (void *)Name ); ++ } ++ ++ return( OrderList ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehRebuildBddNode | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehRebuildBddNode( BehFigure, OrderList ) ++ ++ befig_list *BehFigure; ++ chain_list *OrderList; ++{ ++ chain_list *ScanList; ++ ++ BoomBehResetBddNode( BehFigure ); ++ ++ resetbddcircuit( (bddcircuit *)0 ); ++ resetbddsystem( (bddsystem *)0 ); ++ ++ if ( ! BoomDebugFlag ) ++ { ++ SetBddSystemNoWarning( BddLocalSystem ); ++ } ++ ++ for ( ScanList = OrderList; ++ ScanList != (chain_list *)0; ++ ScanList = ScanList->NEXT ) ++ { ++ addbddcircuitin( (bddcircuit *)0, (char *)ScanList->DATA, 0, BDD_IN_MODE_LAST ); ++ } ++ ++ BoomBehMakeBddNode( BehFigure, 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehRandomBddOrder | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehRandomBddOrder( BehFigure, Amplitude ) ++ ++ befig_list *BehFigure; ++ long Amplitude; ++{ ++ boombefiginfo *FigInfo; ++ long NumberVar; ++ long MaxNode; ++ long BddVar; ++ long BddSwapVar; ++ unsigned long MoveTo; ++ unsigned long MoveIndex; ++ ++ static unsigned char InitRandom = 1; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ if ( InitRandom ) ++ { ++ srand( getpid() ); ++ InitRandom = 0; ++ } ++ ++ if ( Amplitude <= 0 ) return; ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ for ( BddVar = 0; BddVar < NumberVar; BddVar++ ) ++ { ++ MoveTo = (rand() >> 8) % Amplitude; ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomPrintf( stdout, "Move %ld amplitude %ld\n", BddVar, MoveTo ); ++ } ++ ++ MaxNode = BddLocalSystem->NUMBER_NODE + BOOM_BDD_SWAP_LIMIT; ++ ++ for ( MoveIndex = 0; MoveIndex < MoveTo; MoveIndex++ ) ++ { ++ BddSwapVar = BddVar - MoveIndex; ++ ++ if ( ( BddSwapVar >= ( NumberVar - 1 ) ) || ++ ( BddSwapVar <= 0 ) ) break; ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomPrintf( stdout, "> Swap %ld with %ld\n", BddSwapVar, BddSwapVar - 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, BddSwapVar ); ++ ++ if ( BddLocalSystem->NUMBER_NODE > MaxNode ) ++ { ++ garbagebddsystem( (bddsystem *)0 ); ++ } ++ ++ if ( BddLocalSystem->NUMBER_NODE > MaxNode ) ++ { ++ break; ++ } ++ } ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_bdd.h alliance/boom/src/boom_bdd.h +--- alliance-5.0/boo/src/boom_bdd.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_bdd.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,109 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_bdd.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_BDD_H ++# define BOOM_BDD_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_BDD_NODE_BIG_SIZE 8 ++# define BOOM_BDD_EXPLOSION_LIMIT 200000 ++# define BOOM_BDD_SWAP_LIMIT 10000 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++ ++/* ++# define BoomSetBddMarkAbl( E, N ) \ ++ \ ++ do { ABL_CDR( ABL_CAR( E ) ) = (chain_list *)(N); \ ++ if ( (N)->MARK == 0 ) (N)->MARK = 1; \ ++ else (N)->MARK = 2; \ ++ incbddrefext( (N) ); \ ++ } while (0) ++*/ ++ ++# define BoomSetBddMarkAbl( E, N ) \ ++ \ ++ do { ABL_CDR( ABL_CAR( E ) ) = (chain_list *)(N); \ ++ if ( (N)->MARK == 0 ) incbddrefext( (N) ); \ ++ (N)->MARK++; \ ++ } while (0) ++ ++# define BoomGetBddMarkAbl( E ) \ ++ \ ++ ( (bddnode *)( ABL_CDR( ABL_CAR( E ) ) ) ) ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Varibddes | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehAbl2BddNode(); ++ extern void BoomBehMakeBddNode(); ++ extern void BoomBehResetBddNode(); ++ extern void BoomBehUnmarkBddNode(); ++ extern void BoomBehScanBdd(); ++ extern void BoomBehMapBdd(); ++ extern long BoomBehGetNumberBigBddNode(); ++ ++ extern chain_list *BoomUnmarkBddNode(); ++ extern chain_list *BoomBehGetBddOrder(); ++ extern void BoomBehRandomBddOrder(); ++ extern void BoomBehRebuildBddNode(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_burgun.c alliance/boom/src/boom_burgun.c +--- alliance-5.0/boo/src/boom_burgun.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_burgun.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,442 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_burgun.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 08.08.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++ ++# include "boom_burgun.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static bddnode *BoomBddTopVarNode = (bddnode *)0; ++ static long BoomCurrentVar = (long )0; ++ static long BoomBurgunVar = (long )0; ++ static long BoomCurrentCost = 0; ++ ++ static int BoomExplosionFlag = 0; ++ ++ static char *BoomIndexArray = (char *)0; ++ static long BoomIndexArraySize = 0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomBurgunTopBurgunVar | ++| | ++\------------------------------------------------------------*/ ++ ++static bddnode *BoomBurgunTopBurgunVar( BddNode ) ++ ++ bddnode *BddNode; ++{ ++ bddnode *NewBddNode; ++ ++ NewBddNode = composebddnode( BddLocalSystem, BddNode, ++ BoomBurgunVar , BoomBddTopVarNode ); ++ ++ return( NewBddNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBurgunTopBddNode | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomBurgunTopBddNode( BddNode ) ++ ++ bddnode *BddNode; ++{ ++ bddnode *NewBddNode; ++ long Number; ++ ++ if ( ! BoomExplosionFlag ) ++ { ++ Number = getbddnodenum( (bddsystem *)0, BddNode ); ++ ++ if ( Number < BOOM_BDD_NODE_BIG_SIZE ) return; ++ ++ NewBddNode = composebddnode( BddLocalSystem, BddNode, ++ BoomCurrentVar, BoomBddTopVarNode ); ++ ++ if ( IsBddSystemExplosion( BddLocalSystem ) ) ++ { ++ BoomPrintf( stdout, "Explosion !!! %ld\n", BddLocalSystem->NUMBER_NODE ); ++ ++ garbagebddsystem( BddLocalSystem ); ++ explosionbddsystemrestart( BddLocalSystem ); ++ ++ BoomExplosionFlag = 1; ++ } ++ else ++ { ++ BoomCurrentCost += getbddnodenum( (bddsystem *)0, NewBddNode ); ++ /* ++ Number = getbddnodenum( (bddsystem *)0, NewBddNode ); ++ ++ if ( Number >= BOOM_BDD_NODE_BIG_SIZE ) BoomCurrentCost += Number; ++ */ ++ ++ decbddrefext( NewBddNode ); ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehBurgunBddOrder | ++| | ++\------------------------------------------------------------*/ ++ ++chain_list *BoomBehBurgunBddOrder( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ chain_list *OrderList; ++ long NumberIndex; ++ long NumberVar; ++ long VarIndex; ++ long TopVar; ++ long FirstVar; ++ long LastVar; ++ long ExplosionLimit; ++ long MaxNode; ++ long BurgunCost; ++ char *Name; ++ char Buffer[ 32 ]; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ NumberIndex = BddLocalSystem->NUMBER_INDEX; ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ if ( BoomIndexArray == (char *)0 ) ++ { ++ BoomIndexArray = (char *)autallocblock( sizeof( char ) * NumberIndex ); ++ BoomIndexArraySize = NumberIndex; ++ } ++ else ++ if ( NumberIndex > BoomIndexArraySize ) ++ { ++ BoomIndexArray = (char *)autresizeblock( (char *)BoomIndexArray, ++ sizeof( long ) * BoomIndexArraySize, ++ sizeof( long ) * NumberIndex ); ++ BoomIndexArraySize = NumberIndex; ++ } ++ ++ memset( BoomIndexArray, 0, BoomIndexArraySize ); ++ ++ OrderList = (chain_list *)0; ++ ++ for ( TopVar = 0; TopVar < NumberVar; TopVar++ ) ++ { ++ VarIndex = getbddvarindex( BddLocalSystem, TopVar ); ++ sprintf( Buffer, "_top_%ld", TopVar ); ++ BoomBddTopVarNode = addbddcircuitin( BddLocalCircuit, Buffer, ++ VarIndex, BDD_IN_MODE_BEFORE ); ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "TopVar %ld %s\n", TopVar, Buffer ); ++ } ++ ++ MaxNode = BddLocalSystem->NUMBER_NODE * 2; ++ FirstVar = TopVar + 1; ++ LastVar = TopVar + NumberVar; ++ ++ BoomBurgunVar = -1; ++ BurgunCost = 0; ++ ++ for ( BoomCurrentVar = FirstVar; BoomCurrentVar <= LastVar; BoomCurrentVar++ ) ++ { ++ VarIndex = getbddvarindex( (bddsystem *)0, BoomCurrentVar ); ++ ++ if ( BoomIndexArray[ VarIndex ] != 0 ) continue; ++ ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Sweep !\n" ); ++ } ++ ++ sweepbddvar( BddLocalSystem, TopVar, 1 ); ++ ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Garbage !\n" ); ++ } ++ ++ garbagebddsystem( BddLocalSystem ); ++ MaxNode = BddLocalSystem->NUMBER_NODE * 4; ++ } ++ } ++ ++ ExplosionLimit = BddLocalSystem->NUMBER_NODE * 2; ++ ++ if ( ExplosionLimit < BOOM_BURGUN_EXPLOSION_LIMIT ) ++ { ++ ExplosionLimit = BOOM_BURGUN_EXPLOSION_LIMIT; ++ } ++ ++ BoomExplosionFlag = 0; ++ ++ explosionbddsystemdynamic( (bddsystem *)0, NULL, ExplosionLimit ); ++ ++ BoomCurrentCost = 0; ++ ++ BoomBehScanBdd( BehFigure, BoomBurgunTopBddNode ); ++ ++ if ( ! BoomExplosionFlag ) ++ { ++ if ( ( BoomBurgunVar == -1 ) || ++ ( BoomCurrentCost < BurgunCost ) ) ++ { ++ BoomBurgunVar = BoomCurrentVar; ++ BurgunCost = BoomCurrentCost; ++ } ++ } ++ else ++ { ++ BoomExplosionFlag = 0; ++ } ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ Name = getbddcircuitinname( (bddcircuit *)0, VarIndex ); ++ BoomPrintf( stdout, "%ld %ld %s\n", BoomCurrentVar, BoomCurrentCost, Name ); ++ } ++ } ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "BurgunCost %ld BoomBurgunVar %ld\n", BurgunCost, BoomBurgunVar ); ++ } ++ ++ explosionbddsystemdynamic( (bddsystem *)0, NULL, 0 ); ++ ++ VarIndex = getbddvarindex( (bddsystem *)0, BoomBurgunVar ); ++ Name = getbddcircuitinname( (bddcircuit *)0, VarIndex ); ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Var %s\n", Name ); ++ } ++ ++ OrderList = addchain( OrderList, (void *)Name ); ++ ++ BoomIndexArray[ VarIndex ] = 1; ++ ++ BoomBehMapBdd( BehFigure, BoomBurgunTopBurgunVar ); ++ } ++ ++ OrderList = reverse( OrderList ); ++ ++ BoomBehRebuildBddNode( BehFigure, OrderList ); ++ ++ return( OrderList ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeBurgun | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeBurgun( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ boombefiginfo *FigInfo; ++ long Cost; ++ long NewCost; ++ long Iteration; ++ long Amplitude; ++ long MaxIteration; ++ long MaxAmplitude; ++ chain_list *BurgunOrder; ++ chain_list *NewOrder; ++ int Level; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ MaxAmplitude = FigInfo->AMPLITUDE; ++ Level = FigInfo->OPTIM_LEVEL; ++ ++ if ( MaxIteration <= 0 ) MaxIteration = 2; ++ if ( MaxAmplitude <= 0 ) MaxAmplitude = 5; ++ ++ MaxIteration = MaxIteration * (Level + 1); ++ MaxAmplitude = MaxAmplitude + Level; ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ BurgunOrder = BoomBehGetBddOrder( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Iteration %ld\n", Iteration ); ++ } ++ ++ Amplitude = MaxAmplitude + 1; ++ ++ do ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Amplitude %ld\n", Amplitude ); ++ } ++ ++ if ( Amplitude <= MaxAmplitude ) ++ { ++ BoomBehRandomBddOrder( BehFigure, Amplitude ); ++ } ++ ++ NewOrder = BoomBehBurgunBddOrder( BehFigure ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ ++ freechain( BurgunOrder ); ++ BurgunOrder = NewOrder; ++ } ++ else ++ { ++ freechain( NewOrder ); ++ } ++ ++ Amplitude--; ++ } ++ while ( Amplitude >= 0 ); ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-3ld\b\b\b", ( ( Iteration + 1 ) * 100 ) / MaxIteration ); ++ fflush( stdout ); ++ } ++ } ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Burgun cost : %ld\n", Cost ); ++ } ++ ++ BoomBehRebuildBddNode( BehFigure, BurgunOrder ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_burgun.h alliance/boom/src/boom_burgun.h +--- alliance-5.0/boo/src/boom_burgun.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_burgun.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,75 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_burgun.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_BURGUN_H ++# define BOOM_BURGUN_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_BURGUN_EXPLOSION_LIMIT 10000 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeBurgun(); ++ extern chain_list *BoomBehBurgunBddOrder(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_check.c alliance/boom/src/boom_check.c +--- alliance-5.0/boo/src/boom_check.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_check.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,132 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_check.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_check.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_abl.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++static int BoomFoundDontCare = 0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomCheckBehAblDontCare | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomCheckBehAblDontCare( Expr ) ++ ++ ablexpr *Expr; ++{ ++ if ( Expr != (ablexpr *)0 ) ++ { ++ if ( ! BoomFoundDontCare ) ++ { ++ BoomFoundDontCare = isablnameinexpr( Expr, ABL_ATOM_NAME_DC ); ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomCheckBehFigure | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomCheckBehFigure( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ BoomFoundDontCare = 0; ++ ++ BoomBehScanAbl( BehFigure, BoomCheckBehAblDontCare, 1 ) ; ++ ++ FigInfo->DONT_CARE = BoomFoundDontCare; ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Dont care %d\n", BoomFoundDontCare ); ++ } ++ ++ ++ /* Check combinatory loop etc ... */ ++ /* TO BE DONE */ ++} +diff -Naur alliance-5.0/boo/src/boom_check.h alliance/boom/src/boom_check.h +--- alliance-5.0/boo/src/boom_check.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_check.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,71 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_check.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_CHECK_H ++# define BOOM_CHECK_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomCheckBehFigure(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_cost.c alliance/boom/src/boom_cost.c +--- alliance-5.0/boo/src/boom_cost.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_cost.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,848 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_cost.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_cost.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static long BoomOperSurfaceCost[ ABL_MAX_OPERATOR ][ 3 ] = ++ { ++ { 1250, 1500, 1750 }, /* ABL_OR */ ++ { 1250, 1500, 1750 }, /* ABL_AND */ ++ { 2250, 4500, 6750 }, /* ABL_XOR */ ++ { 750, 0, 0 }, /* ABL_NOT */ ++ { 1000, 1250, 1500 }, /* ABL_NOR */ ++ { 1000, 1250, 1500 }, /* ABL_NAND */ ++ { 2250, 4500, 6750 }, /* ABL_NXOR */ ++ { 0, 0, 0 } /* ABL_STABLE */ ++ }; ++ ++ static int BoomFlagDepth = 0; ++ static int BoomFlagSurface = 0; ++ ++ static authtable *BoomHashAux = (authtable *)0; ++ static authtable *BoomHashBux = (authtable *)0; ++ static authtable *BoomHashBus = (authtable *)0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomGiveAblSurfaceCost | ++| | ++\------------------------------------------------------------*/ ++ ++static long LocalBoomGiveAblSurfaceCost( Expr ) ++ ++ ablexpr *Expr; ++{ ++ long Oper; ++ long Cost; ++ long NumOper; ++ long NextStep; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ return( 0 ); ++ } ++ ++ Oper = ABL_OPER( Expr ); ++ Cost = 0; ++ NumOper = 0; ++ ++ while ( ( Expr = ABL_CDR( Expr ) ) != (ablexpr *)0 ) ++ { ++ Cost += LocalBoomGiveAblSurfaceCost( ABL_CAR( Expr ) ); ++ ++ NumOper++; ++ } ++ ++ while ( NumOper ) ++ { ++ NextStep = NumOper / 4; ++ ++ if ( NextStep ) ++ { ++ Cost += NextStep * BoomOperSurfaceCost[ Oper ][ BOOM_OPER_ARITY_4 ]; ++ } ++ ++ NumOper %= 4; ++ ++ if ( NumOper == 3 ) ++ { ++ if ( NextStep >= 1 ) NextStep += 3; ++ else Cost += BoomOperSurfaceCost[ Oper ][ BOOM_OPER_ARITY_3 ]; ++ } ++ else ++ if ( NumOper == 2 ) ++ { ++ if ( ( NextStep <= 2 ) && ++ ( NextStep != 0 ) ) ++ { ++ NextStep += 2; ++ } ++ else ++ { ++ Cost += BoomOperSurfaceCost[ Oper ][ BOOM_OPER_ARITY_2 ]; ++ } ++ } ++ else ++ if ( NumOper == 1 ) ++ { ++ if ( Oper == ABL_NOT ) ++ { ++ Cost += BoomOperSurfaceCost[ Oper ][ BOOM_OPER_ARITY_1 ]; ++ } ++ else ++ if ( NextStep != 0 ) NextStep++; ++ } ++ ++ NumOper = NextStep; ++ NextStep = 0; ++ } ++ ++ return( Cost ); ++} ++ ++static long BoomGiveAblSurfaceCost( Expr ) ++ ++ ablexpr *Expr; ++{ ++ long Cost; ++ ++ if ( ! BoomFlagSurface ) ++ { ++ return( 0 ); ++ } ++ ++ Cost = LocalBoomGiveAblSurfaceCost( Expr ); ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ fprintf( stdout, "BoomGiveAblSurfaceCost\n" ); ++ viewablexprln( Expr, ABL_VIEW_VHDL ); ++ fprintf( stdout, "%ld\n", Cost ); ++ } ++ ++ return( Cost ); ++} ++ ++ ++/*------------------------------------------------------------\ ++| | ++| BoomGiveAblLiteralCost | ++| | ++\------------------------------------------------------------*/ ++ ++static long LocalBoomGiveAblLiteralCost( Expr ) ++ ++ ablexpr *Expr; ++{ ++ long Oper; ++ long Cost; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ return( 1 ); ++ } ++ ++ Cost = 0; ++ Oper = ABL_OPER( Expr ); ++ ++ if ( Oper != ABL_STABLE ) ++ { ++ while ( ( Expr = ABL_CDR( Expr ) ) != (ablexpr *)0 ) ++ { ++ Cost += LocalBoomGiveAblLiteralCost( ABL_CAR( Expr ) ); ++ } ++ } ++ ++ return( Cost ); ++} ++ ++long BoomGiveAblLiteralCost( Expr ) ++ ++ ablexpr *Expr; ++{ ++ long Cost; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Cost = 0; ++ } ++ else ++ { ++ Cost = LocalBoomGiveAblLiteralCost( Expr ); ++ } ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ fprintf( stdout, "BoomGiveAblLiteralCost\n" ); ++ viewablexprln( Expr, ABL_VIEW_VHDL ); ++ fprintf( stdout, "%ld\n", Cost ); ++ } ++ ++ return( Cost ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomGiveAblDepthCost | ++| | ++\------------------------------------------------------------*/ ++ ++static long BoomGiveAblDepthCost(); ++ ++static long LocalBoomGiveAblDepthCost( Expr ) ++ ++ ablexpr *Expr; ++{ ++ boombeauxinfo *AuxInfo; ++ boombebuxinfo *BuxInfo; ++ boombebusinfo *BusInfo; ++ bebus_list *BehBus; ++ bebux_list *BehBux; ++ beaux_list *BehAux; ++ char *Value; ++ authelem *Element; ++ biabl_list *BiAbl; ++ long Oper; ++ long Cost; ++ long Arity; ++ long NewCost; ++ ++ Cost = 0; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Value = ABL_ATOM_VALUE( Expr ); ++ ++ if ( ( Value != ABL_ATOM_NAME_ONE ) && ++ ( Value != ABL_ATOM_NAME_ZERO ) && ++ ( Value != ABL_ATOM_NAME_DC ) && ++ ( Value != ABL_ATOM_NAME_TRISTATE ) ) ++ { ++ Element = searchauthelem( BoomHashAux, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ BehAux = (beaux_list *)Element->VALUE; ++ AuxInfo = GetBoomBehAuxInfo( BehAux ); ++ ++ if ( ! IsBoomBehAuxTag( BehAux ) ) ++ { ++ SetBoomBehAuxTag( BehAux ); ++ AuxInfo->DEPTH_COST = BoomGiveAblDepthCost( BehAux->ABL ); ++ } ++ ++ return( AuxInfo->DEPTH_COST ); ++ } ++ ++ Element = searchauthelem( BoomHashBus, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ BehBus = (bebus_list *)Element->VALUE; ++ BusInfo = GetBoomBehBusInfo( BehBus ); ++ ++ if ( ! IsBoomBehAuxTag( BehBus ) ) ++ { ++ SetBoomBehAuxTag( BehBus ); ++ ++ BusInfo->DEPTH_COST = 0; ++ ++ for ( BiAbl = BehBus->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ NewCost = BoomGiveAblDepthCost( BiAbl->VALABL ); ++ ++ if ( NewCost > BusInfo->DEPTH_COST ) ++ { ++ BusInfo->DEPTH_COST = NewCost; ++ } ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ NewCost = BoomGiveAblDepthCost( BiAbl->CNDABL ); ++ ++ if ( NewCost > BusInfo->DEPTH_COST ) ++ { ++ BusInfo->DEPTH_COST = NewCost; ++ } ++ } ++ } ++ } ++ ++ return( BusInfo->DEPTH_COST ); ++ } ++ ++ Element = searchauthelem( BoomHashBux, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ BehBux = (bebux_list *)Element->VALUE; ++ BuxInfo = GetBoomBehBuxInfo( BehBux ); ++ ++ if ( ! IsBoomBehAuxTag( BehBux ) ) ++ { ++ BuxInfo->DEPTH_COST = 0; ++ ++ for ( BiAbl = BehBux->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ NewCost = BoomGiveAblDepthCost( BiAbl->VALABL ); ++ ++ if ( NewCost > BuxInfo->DEPTH_COST ) ++ { ++ BuxInfo->DEPTH_COST = NewCost; ++ } ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ NewCost = BoomGiveAblDepthCost( BiAbl->CNDABL ); ++ ++ if ( NewCost > BuxInfo->DEPTH_COST ) ++ { ++ BuxInfo->DEPTH_COST = NewCost; ++ } ++ } ++ } ++ ++ SetBoomBehAuxTag( BehBux ); ++ } ++ ++ return( BuxInfo->DEPTH_COST ); ++ } ++ } ++ } ++ else ++ { ++ Oper = ABL_OPER( Expr ); ++ ++ if ( Oper != ABL_STABLE ) ++ { ++ Arity = 0; ++ ++ while ( ( Expr = ABL_CDR( Expr ) ) != (ablexpr *)0 ) ++ { ++ Arity++; ++ ++ NewCost = LocalBoomGiveAblDepthCost( ABL_CAR( Expr ) ); ++ ++ if ( NewCost > Cost ) Cost = NewCost; ++ } ++ ++ if ( Oper != ABL_NOT ) ++ { ++ Cost += BoomComputeLog2( Arity ); ++ } ++ } ++ } ++ ++ return( Cost ); ++} ++ ++static long BoomGiveAblDepthCost( Expr ) ++ ++ ablexpr *Expr; ++{ ++ long Cost; ++ ++ if ( ! BoomFlagDepth ) ++ { ++ return( 0 ); ++ } ++ ++ Cost = LocalBoomGiveAblDepthCost( Expr ); ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ fprintf( stdout, "BoomGiveAblDepthCost\n" ); ++ viewablexprln( Expr, ABL_VIEW_VHDL ); ++ fprintf( stdout, "%ld\n", Cost ); ++ } ++ ++ return( Cost ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehPrintCost | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehPrintCost( Text, BehFigure ) ++ ++ char *Text; ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ fprintf( stdout, "\t--> %s cost\n", Text ); ++ fprintf( stdout, "\t Surface : %ld\n" , FigInfo->SURFACE_COST ); ++ fprintf( stdout, "\t Depth : %ld\n" , FigInfo->DEPTH_COST ); ++ fprintf( stdout, "\t Literals : %ld\n" , FigInfo->LITERAL_COST ); ++ /* ++ fprintf( stdout, "\t Delay : %.3f ns\n", FigInfo->DEPTH_COST * 0.200 ); ++ */ ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehGiveFullCost | ++| | ++\------------------------------------------------------------*/ ++ ++long BoomBehGiveFullCost( BehFigure, Quick ) ++ ++ befig_list *BehFigure; ++ int Quick; ++{ ++ boombefiginfo *FigInfo; ++ beout_list *BehOut; ++ beaux_list *BehAux; ++ bereg_list *BehReg; ++ bebus_list *BehBus; ++ bebux_list *BehBux; ++ biabl_list *BiAbl; ++ boombeauxinfo *AuxInfo; ++ boombeoutinfo *OutInfo; ++ boombereginfo *RegInfo; ++ boombebusinfo *BusInfo; ++ boombebuxinfo *BuxInfo; ++ long LiteralCost; ++ long SurfaceCost; ++ long DepthCost; ++ long GlobalCost; ++ long NewCost; ++ long PerCent; ++ char Buffer[ 32 ]; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ if ( BoomHashAux == (authtable *)0 ) ++ { ++ BoomHashAux = createauthtable( 100 ); ++ BoomHashBux = createauthtable( 100 ); ++ BoomHashBus = createauthtable( 100 ); ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ addauthelem( BoomHashAux, BehAux->NAME, (long)BehAux ); ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ addauthelem( BoomHashBux, BehBux->NAME, (long)BehBux ); ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ addauthelem( BoomHashBus, BehBus->NAME, (long)BehBus ); ++ } ++ ++ LiteralCost = 0; ++ SurfaceCost = 0; ++ DepthCost = 0; ++ ++ BoomFlagDepth = 1; ++ BoomFlagSurface = 1; ++ ++ if ( Quick ) ++ { ++ if ( FigInfo->OPTIM_DELAY_PERCENT == 0 ) BoomFlagDepth = 0; ++ if ( FigInfo->USE_LITERAL ) BoomFlagSurface = 0; ++ ++ if ( FigInfo->OPTIM_DELAY_PERCENT == 100 ) BoomFlagSurface = 0; ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ AuxInfo = GetBoomBehAuxInfo( BehAux ); ++ ++ AuxInfo->LITERAL_COST = BoomGiveAblLiteralCost( BehAux->ABL ); ++ LiteralCost += AuxInfo->LITERAL_COST; ++ ++ AuxInfo->SURFACE_COST = BoomGiveAblSurfaceCost( BehAux->ABL ); ++ SurfaceCost += AuxInfo->SURFACE_COST; ++ ++ if ( ! IsBoomBehAuxTag( BehAux ) ) ++ { ++ AuxInfo->DEPTH_COST = BoomGiveAblDepthCost( BehAux->ABL ); ++ SetBoomBehAuxTag( BehAux ); ++ } ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ OutInfo = GetBoomBehOutInfo( BehOut ); ++ ++ OutInfo->LITERAL_COST = BoomGiveAblLiteralCost( BehOut->ABL ); ++ LiteralCost += OutInfo->LITERAL_COST; ++ ++ OutInfo->SURFACE_COST = BoomGiveAblSurfaceCost( BehOut->ABL ); ++ SurfaceCost += OutInfo->SURFACE_COST; ++ ++ OutInfo->DEPTH_COST = BoomGiveAblDepthCost( BehOut->ABL ); ++ ++ if ( OutInfo->DEPTH_COST > DepthCost ) ++ { ++ DepthCost = OutInfo->DEPTH_COST; ++ } ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ BusInfo = GetBoomBehBusInfo( BehBus ); ++ BusInfo->LITERAL_COST = 0; ++ BusInfo->SURFACE_COST = 0; ++ ++ if ( ! IsBoomBehAuxTag( BehBus ) ) ++ { ++ BusInfo->DEPTH_COST = 0; ++ } ++ ++ for ( BiAbl = BehBus->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ BusInfo->LITERAL_COST += BoomGiveAblLiteralCost( BiAbl->VALABL ); ++ BusInfo->SURFACE_COST += BoomGiveAblSurfaceCost( BiAbl->VALABL ); ++ ++ if ( ! IsBoomBehAuxTag( BehBus ) ) ++ { ++ NewCost = BoomGiveAblDepthCost( BiAbl->VALABL ); ++ ++ if ( NewCost > BusInfo->DEPTH_COST ) ++ { ++ BusInfo->DEPTH_COST = NewCost; ++ } ++ } ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ BusInfo->LITERAL_COST += BoomGiveAblLiteralCost( BiAbl->CNDABL ); ++ BusInfo->SURFACE_COST += BoomGiveAblSurfaceCost( BiAbl->CNDABL ); ++ ++ if ( ! IsBoomBehAuxTag( BehBus ) ) ++ { ++ NewCost = BoomGiveAblDepthCost( BiAbl->CNDABL ); ++ ++ if ( NewCost > BusInfo->DEPTH_COST ) ++ { ++ BusInfo->DEPTH_COST = NewCost; ++ } ++ } ++ } ++ } ++ ++ SetBoomBehAuxTag( BehBus ); ++ ++ LiteralCost += BusInfo->LITERAL_COST; ++ SurfaceCost += BusInfo->SURFACE_COST; ++ ++ if ( BusInfo->DEPTH_COST > DepthCost ) ++ { ++ DepthCost = BusInfo->DEPTH_COST; ++ } ++ } ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ BuxInfo = GetBoomBehBuxInfo( BehBux ); ++ BuxInfo->LITERAL_COST = 0; ++ BuxInfo->SURFACE_COST = 0; ++ ++ if ( ! IsBoomBehAuxTag( BehBux ) ) ++ { ++ BuxInfo->DEPTH_COST = 0; ++ } ++ ++ for ( BiAbl = BehBux->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ BuxInfo->LITERAL_COST += BoomGiveAblLiteralCost( BiAbl->VALABL ); ++ BuxInfo->SURFACE_COST += BoomGiveAblSurfaceCost( BiAbl->VALABL ); ++ ++ if ( ! IsBoomBehAuxTag( BehBux ) ) ++ { ++ NewCost = BoomGiveAblDepthCost( BiAbl->VALABL ); ++ ++ if ( NewCost > BuxInfo->DEPTH_COST ) ++ { ++ BuxInfo->DEPTH_COST = NewCost; ++ } ++ } ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ BuxInfo->LITERAL_COST += BoomGiveAblLiteralCost( BiAbl->CNDABL ); ++ BuxInfo->SURFACE_COST += BoomGiveAblSurfaceCost( BiAbl->CNDABL ); ++ ++ if ( ! IsBoomBehAuxTag( BehBux ) ) ++ { ++ NewCost = BoomGiveAblDepthCost( BiAbl->CNDABL ); ++ ++ if ( NewCost > BuxInfo->DEPTH_COST ) ++ { ++ BuxInfo->DEPTH_COST = NewCost; ++ } ++ } ++ } ++ } ++ ++ SetBoomBehAuxTag( BehBux ); ++ ++ LiteralCost += BuxInfo->LITERAL_COST; ++ SurfaceCost += BuxInfo->SURFACE_COST; ++ ++ if ( BuxInfo->DEPTH_COST > DepthCost ) ++ { ++ DepthCost = BuxInfo->DEPTH_COST; ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ RegInfo = GetBoomBehRegInfo( BehReg ); ++ RegInfo->LITERAL_COST = 0; ++ RegInfo->SURFACE_COST = 0; ++ RegInfo->DEPTH_COST = 0; ++ ++ for ( BiAbl = BehReg->BIABL; ++ BiAbl != (biabl_list *)0; ++ BiAbl = BiAbl->NEXT ) ++ { ++ if ( BiAbl->VALABL != (chain_list *)0 ) ++ { ++ RegInfo->LITERAL_COST += BoomGiveAblLiteralCost( BiAbl->VALABL ); ++ RegInfo->SURFACE_COST += BoomGiveAblSurfaceCost( BiAbl->VALABL ); ++ ++ NewCost = BoomGiveAblDepthCost( BiAbl->VALABL ); ++ ++ if ( NewCost > RegInfo->DEPTH_COST ) ++ { ++ RegInfo->DEPTH_COST = NewCost; ++ } ++ } ++ ++ if ( BiAbl->CNDABL != (chain_list *)0 ) ++ { ++ RegInfo->LITERAL_COST += BoomGiveAblLiteralCost( BiAbl->CNDABL ); ++ RegInfo->SURFACE_COST += BoomGiveAblSurfaceCost( BiAbl->CNDABL ); ++ ++ NewCost = BoomGiveAblDepthCost( BiAbl->CNDABL ); ++ ++ if ( NewCost > RegInfo->DEPTH_COST ) ++ { ++ RegInfo->DEPTH_COST = NewCost; ++ } ++ } ++ } ++ ++ LiteralCost += RegInfo->LITERAL_COST; ++ SurfaceCost += RegInfo->SURFACE_COST; ++ ++ if ( RegInfo->DEPTH_COST > DepthCost ) ++ { ++ DepthCost = RegInfo->DEPTH_COST; ++ } ++ } ++ ++ resetauthtable( BoomHashAux ); ++ resetauthtable( BoomHashBus ); ++ resetauthtable( BoomHashBux ); ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ ClearBoomBehAuxTag( BehAux ); ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ ClearBoomBehAuxTag( BehBux ); ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ ClearBoomBehAuxTag( BehBus ); ++ } ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ if ( FigInfo->USE_LITERAL ) ++ { ++ sprintf( Buffer, "%ld", LiteralCost ); ++ } ++ else ++ { ++ sprintf( Buffer, "%ld", SurfaceCost ); ++ } ++ ++ BoomDebugSaveBehFigure( BehFigure, Buffer ); ++ } ++ ++ FigInfo->LITERAL_COST = LiteralCost; ++ FigInfo->SURFACE_COST = SurfaceCost; ++ FigInfo->DEPTH_COST = DepthCost; ++ ++ ++ if ( FigInfo->INITIAL_DEPTH_COST == 0 ) ++ { ++ FigInfo->INITIAL_DEPTH_COST = DepthCost + 1; ++ } ++ ++ if ( FigInfo->INITIAL_LITERAL_COST == 0 ) ++ { ++ FigInfo->INITIAL_LITERAL_COST = LiteralCost + 1; ++ } ++ ++ if ( FigInfo->INITIAL_SURFACE_COST == 0 ) ++ { ++ FigInfo->INITIAL_SURFACE_COST = SurfaceCost + 1; ++ } ++ ++ SurfaceCost = ( (double) SurfaceCost * 1000.0 / (double) FigInfo->INITIAL_SURFACE_COST ); ++ LiteralCost = ( (double) LiteralCost * 1000.0 / (double) FigInfo->INITIAL_LITERAL_COST ); ++ DepthCost = ( (double) DepthCost * 1000.0 / (double) FigInfo->INITIAL_DEPTH_COST ); ++ ++ PerCent = FigInfo->OPTIM_DELAY_PERCENT; ++ ++ if ( FigInfo->USE_LITERAL ) ++ { ++ GlobalCost = ( ( LiteralCost * ( 100 - PerCent ) ) + ++ ( DepthCost * PerCent ) ) / 100; ++ } ++ else ++ { ++ GlobalCost = ( ( SurfaceCost * ( 100 - PerCent ) ) + ++ ( DepthCost * PerCent ) ) / 100; ++ } ++ ++ FigInfo->GLOBAL_COST = GlobalCost; ++ ++ return( GlobalCost ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehGiveCost | ++| | ++\------------------------------------------------------------*/ ++ ++long BoomBehGiveCost( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ return ( BoomBehGiveFullCost( BehFigure, 1 ) ); ++} +diff -Naur alliance-5.0/boo/src/boom_cost.h alliance/boom/src/boom_cost.h +--- alliance-5.0/boo/src/boom_cost.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_cost.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,83 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_cost.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_COST_H ++# define BOOM_COST_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_OPER_ARITY_1 0 ++# define BOOM_OPER_ARITY_2 0 ++# define BOOM_OPER_ARITY_3 1 ++# define BOOM_OPER_ARITY_4 2 ++ ++# define BOOM_OPER_MAX_ARITY 3 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern long BoomBehGiveCost(); ++ extern long BoomBehGiveFullCost(); ++ extern void BoomBehPrintCost(); ++ ++ extern long BoomGiveAblLiteralCost(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_dc.c alliance/boom/src/boom_dc.c +--- alliance-5.0/boo/src/boom_dc.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_dc.c 2006-03-29 19:10:07.000000000 +0200 +@@ -0,0 +1,235 @@ ++/*-----------------------------------------------------------\ ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_dc.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 02.11.01 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++#include "mut.h" ++#include "aut.h" ++#include "abl.h" ++#include "bdd.h" ++#include "abe.h" ++#include "abv.h" ++#include "abt.h" ++ ++#include ++#include ++#include ++ ++#include "boom_error.h" ++#include "boom_debug.h" ++#include "boom_shared.h" ++#include "boom_aux.h" ++#include "boom_abl.h" ++#include "boom_bdd.h" ++#include "boom_cost.h" ++#include "boom_optim.h" ++#include "boom_auxinit.h" ++#include "boom_dc.h" ++ ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static bddnode *BoomBddDontCare = (bddnode *)0; ++ static int BoomFoundAblDc = 0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomReplaceDontCareAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomReplaceDontCareAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ if ( ABL_ATOM_VALUE( Expr ) == ABL_ATOM_NAME_DC ) ++ { ++ BoomFoundAblDc = 1; ++ ABL_CAR_L( Expr ) = ABL_ATOM_NAME_ZERO; ++ } ++ } ++ ++ while ( ( Expr = ABL_CDR( Expr ) ) ) ++ { ++ BoomReplaceDontCareAbl( ABL_CAR( Expr ) ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomOptimDontCareAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static ablexpr *BoomOptimDontCareAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ BoomFoundAblDc = 0; ++ BoomReplaceDontCareAbl( Expr ); ++ ++ if ( BoomFoundAblDc ) ++ { ++ Expr = simpablexpr( Expr ); ++ } ++ ++ return( Expr ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomOptimDontCareBdd | ++| | ++\------------------------------------------------------------*/ ++ ++static bddnode *BoomOptimDontCareBdd( BddNode ) ++ ++ bddnode *BddNode; ++{ ++ bddnode *BddOnSet; ++ bddnode *BddOffSet; ++ bddnode *BddDcSet; ++ bddnode *BddOptim; ++ bddnode *BddOptimOn; ++ bddnode *BddOptimOff; ++ bddvar VarDontCare; ++ int OnSize; ++ int OptimSize; ++ int OptimSizeOn; ++ int OptimSizeOff; ++ ++ VarDontCare = getbddvarbyindex( (bddsystem *)0, BoomBddDontCare->INDEX ); ++ ++ BddOnSet = restrictbddnode( (bddsystem *)0, BddNode, VarDontCare, ++ BddLocalSystem->ZERO ); ++ ++ if ( BddOnSet == BddNode ) ++ { ++ decbddrefext( BddOnSet ); ++ ++ return ( BddNode ); ++ } ++ ++ BddOffSet = applybddnodenot( (bddsystem *)0, BddOnSet ); ++ ++ BddDcSet = restrictbddnode( (bddsystem *)0, BddNode, VarDontCare, ++ BddLocalSystem->ONE ); ++ BddDcSet = applybddnode( (bddsystem *)0, ABL_AND, decbddrefext( BddDcSet ), BddOffSet ); ++ ++ BddOptimOn = simpbddnodedcon( (bddsystem *)0, BddOnSet, BddDcSet ); ++ BddOptimOff = simpbddnodedcoff( (bddsystem *)0, BddOnSet, BddDcSet ); ++ ++ decbddrefext( BddOnSet ); ++ decbddrefext( BddOffSet ); ++ decbddrefext( BddDcSet ); ++ decbddrefext( BddOptimOn ); ++ decbddrefext( BddOptimOff ); ++ decbddrefext( BddNode ); ++ ++ OnSize = getbddnodenum( (bddsystem *)0, BddOnSet ); ++ OptimSizeOn = getbddnodenum( (bddsystem *)0, BddOptimOn ); ++ OptimSizeOff = getbddnodenum( (bddsystem *)0, BddOptimOff ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "OnSize %d, OptimSizeOn %d, OptimSizeOff %d\n", ++ OnSize, OptimSizeOn, OptimSizeOff ); ++ } ++ ++ if ( OptimSizeOn > OptimSizeOff ) ++ { ++ BddOptim = BddOptimOff; ++ OptimSize = OptimSizeOff; ++ } ++ else ++ { ++ BddOptim = BddOptimOn; ++ OptimSize = OptimSizeOn; ++ } ++ ++ if ( OptimSize < OnSize ) BddNode = incbddrefext( BddOptim ); ++ else BddNode = incbddrefext( BddOnSet ); ++ ++ return( BddNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomOptimDontCare | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomOptimDontCare( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ BoomBddDontCare = FigInfo->BDD_DONT_CARE; ++ ++ BoomBehMapBdd( BehFigure, BoomOptimDontCareBdd ); ++ ++ garbagebddsystem( (bddsystem *)0 ); ++ ++ BoomBehMapAbl( BehFigure, BoomOptimDontCareAbl, 1 ); ++} +diff -Naur alliance-5.0/boo/src/boom_dc.h alliance/boom/src/boom_dc.h +--- alliance-5.0/boo/src/boom_dc.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_dc.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,70 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_dc.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 02.11.01 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_DC_H ++# define BOOM_DC_H ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomOptimDontCare(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_debug.c alliance/boom/src/boom_debug.c +--- alliance-5.0/boo/src/boom_debug.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_debug.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,396 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_debug.c | ++| | ++| Authors : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ int BoomDebugFlag = 0; ++ int BoomDebugOption = 0; ++ time_t BoomDebugChrono[ BOOM_DEBUG_MAX_CHRONO ]; ++ ++/*------------------------------------------------------------\ ++| | ++| Private variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static char *BoomDebugItemName[ ] = ++ { ++ "boom_abl.c", ++ "boom_anneal.c", ++ "boom_aux.c", ++ "boom_auxinit.c", ++ "boom_bdd.c", ++ "boom_burgun.c", ++ "boom_check.c", ++ "boom_cost.c", ++ "boom_dc.c", ++ "boom_debug.c", ++ "boom_drive.c", ++ "boom_error.c", ++ "boom_gradient.c", ++ "boom_hash.c", ++ "boom_main.c", ++ "boom_one.c", ++ "boom_optim.c", ++ "boom_order.c", ++ "boom_param.c", ++ "boom_parse.c", ++ "boom_procrast.c", ++ "boom_random.c", ++ "boom_shared.c", ++ "boom_simple.c", ++ "boom_simul.c", ++ "boom_top.c", ++ "boom_window.c", ++ (char *)0 ++ }; ++ ++ static char *BoomDebugItemFlag = (char *)0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomDebugSetOption | ++| | ++\------------------------------------------------------------*/ ++ ++int BoomDebugSetOption( Name ) ++ ++ char *Name; ++{ ++ /* ++ if ( ! strcmp( Name, "no_redinst" ) ) ++ { ++ SetBoomDebugNoRedInst(); return( 1 ); ++ } ++ else ++ if ( ! strcmp( Name, "stat" ) ) ++ { ++ SetBoomDebugStatistics(); return( 1 ); ++ } ++ else ++ if ( ! strcmp( Name, "stdout" ) ) ++ { ++ SetBoomDebugDriveStdout(); return( 1 ); ++ } ++ */ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDebugAddItem | ++| | ++\------------------------------------------------------------*/ ++ ++int BoomDebugAddItem( Name, Mode ) ++ ++ char *Name; ++ int Mode; ++{ ++ char Buffer[ 64 ]; ++ char *Item; ++ int Index; ++ ++ if ( BoomDebugItemFlag == (char *)0 ) ++ { ++ Index = 0; ++ ++ while ( BoomDebugItemName[ Index ] != (char *)0 ) ++ { ++ BoomDebugItemName[ Index ] = namealloc( BoomDebugItemName[ Index ] ); ++ ++ Index++; ++ } ++ ++ BoomDebugItemFlag = autallocblock( Index ); ++ } ++ ++ if ( ! strcmp( Name, "all" ) ) ++ { ++ BoomDebugFlag |= Mode; ++ ++ Index = 0; ++ ++ while ( BoomDebugItemName[ Index ] != (char *)0 ) ++ { ++ BoomDebugItemFlag[ Index ] |= Mode; ++ ++ Index++; ++ } ++ ++ return( 1 ); ++ } ++ else ++ { ++ sprintf( Buffer, "boom_%s.c", Name ); ++ Item = namealloc( Buffer ); ++ Index = 0; ++ ++ while ( BoomDebugItemName[ Index ] != (char *)0 ) ++ { ++ if ( Item == BoomDebugItemName[ Index ] ) ++ { ++ BoomDebugItemFlag[ Index ] |= Mode; ++ BoomDebugFlag |= Mode; ++ ++ return( 1 ); ++ } ++ ++ Index++; ++ } ++ } ++ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDebugSearchItem | ++| | ++\------------------------------------------------------------*/ ++ ++int BoomDebugSearchItem( Item, Mode ) ++ ++ char *Item; ++ int Mode; ++{ ++ int Index; ++ ++ if ( ( Mode & BoomDebugFlag ) == Mode ) ++ { ++ Item = namealloc( Item ); ++ Index = 0; ++ ++ while ( BoomDebugItemName[ Index ] != (char *)0 ) ++ { ++ if ( Item == BoomDebugItemName[ Index ] ) ++ { ++ return( ( BoomDebugItemFlag[ Index ] & Mode ) == Mode ); ++ } ++ ++ Index++; ++ } ++ } ++ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDebugLocSaveBehCost | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomDebugLocSaveBehCost( BehFigure, FileName ) ++ ++ befig_list *BehFigure; ++ char *FileName; ++{ ++ FILE *XscFile; ++ beaux_list *BehAux; ++ beout_list *BehOut; ++ bereg_list *BehReg; ++ boombeauxinfo *AuxInfo; ++ boombeoutinfo *OutInfo; ++ boombereginfo *RegInfo; ++ long Layer; ++ ++ XscFile = mbkfopen( BehFigure->NAME, "xsc", "w" ); ++ ++ if ( XscFile != (FILE *)0 ) ++ { ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ AuxInfo = GetBoomBehAuxInfo( BehAux ); ++ ++ if ( AuxInfo != (boombeauxinfo *)0 ) ++ { ++ Layer = AuxInfo->LITERAL_COST; ++ if ( Layer > 31 ) Layer = 32; ++ ++ fprintf( XscFile, "B:beaux_%s:%ld:LITERAL %ld DELAY %ld\n", ++ BehAux->NAME, Layer, AuxInfo->LITERAL_COST, AuxInfo->DELAY_COST ); ++ } ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ OutInfo = GetBoomBehOutInfo( BehOut ); ++ ++ if ( OutInfo != (boombeoutinfo *)0 ) ++ { ++ Layer = OutInfo->LITERAL_COST; ++ if ( Layer > 31 ) Layer = 32; ++ ++ fprintf( XscFile, "B:beout_%s:%ld:LITERAL %ld DELAY %ld\n", ++ BehOut->NAME, Layer, OutInfo->LITERAL_COST, OutInfo->DELAY_COST ); ++ } ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ RegInfo = GetBoomBehRegInfo( BehReg ); ++ ++ if ( RegInfo != (boombereginfo *)0 ) ++ { ++ Layer = RegInfo->LITERAL_COST; ++ if ( Layer > 31 ) Layer = 32; ++ ++ fprintf( XscFile, "B:bereg_%s:%ld:LITERAL %ld DELAY %ld\n", ++ BehReg->NAME, Layer, RegInfo->LITERAL_COST, RegInfo->DELAY_COST ); ++ } ++ } ++ ++ fclose( XscFile ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDebugLocSaveBehFigure | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDebugLocSaveBehFigure( BehFigure, Text, FileName, Line ) ++ ++ befig_list *BehFigure; ++ char *Text; ++ char *FileName; ++ int Line; ++{ ++ static char Buffer[ 128 ]; ++ static int Number = 0; ++ ++ char *Name; ++ int Length; ++ ++ Name = BehFigure->NAME; ++ ++ sprintf( Buffer, "beh%03d_%04d", Number++, Line ); ++ Length = strlen( Buffer ); ++ ++ FileName = FileName + 4; ++ strcpy( Buffer + Length, FileName ); ++ Length += strlen( FileName ); ++ ++ if ( Text != (char *)0 ) ++ { ++ strcpy( &Buffer[ Length - 2 ], Text ); ++ } ++ else ++ { ++ Buffer[ Length - 2 ] = '\0'; ++ } ++ ++ BehFigure->NAME = namealloc( Buffer ); ++ ++ fprintf( stdout, " +++ BoomDebugSaveBehFigure %s.vbe\n", BehFigure->NAME ); ++ vhdlsavebefig( BehFigure, 0 ); ++ ++ BoomDebugLocSaveBehCost( BehFigure, BehFigure->NAME ); ++ ++ BehFigure->NAME = Name; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDebugPrint | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDebugPrint( FileName, Line ) ++ ++ char *FileName; ++ int Line; ++{ ++ char Buffer[ 32 ]; ++ int Length; ++ ++ FileName = FileName + 5; ++ Length = strlen( FileName ); ++ strcpy( Buffer, FileName ); ++ Buffer[ Length - 2 ] = '\0'; ++ ++ fprintf( stdout, "%-8s%4d ", Buffer, Line ); ++} +diff -Naur alliance-5.0/boo/src/boom_debug.h alliance/boom/src/boom_debug.h +--- alliance-5.0/boo/src/boom_debug.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_debug.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,167 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_debug.h | ++| | ++| Authors : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_DEBUG_H ++# define BOOM_DEBUG_H ++ ++# include ++ ++/*------------------------------------------------------------\ ++| | ++| Debug Mode | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_DEBUG_LEVEL0 0x01 ++# define BOOM_DEBUG_LEVEL1 0x03 ++# define BOOM_DEBUG_LEVEL2 0x07 ++ ++/*------------------------------------------------------------\ ++| | ++| Debug Option | ++| | ++\------------------------------------------------------------*/ ++ ++/* ++# define BOOM_DEBUG_NO_RED_INST 0x01 ++# define BOOM_DEBUG_STATISTICS 0x02 ++# define BOOM_DEBUG_DRIVE_STDOUT 0x04 ++*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Chrono | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_DEBUG_MAX_CHRONO 10 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Save Macro | ++| | ++\------------------------------------------------------------*/ ++ ++# define BoomDebugSaveBehFigure( F, T ) \ ++ \ ++ (BoomDebugLocSaveBehFigure( (F), (T), basename(__FILE__), __LINE__ )) ++ ++/*------------------------------------------------------------\ ++| | ++| Debug Macro | ++| | ++\------------------------------------------------------------*/ ++ ++# define IsBoomDebugLevel0() (BoomDebugSearchItem( basename(__FILE__), BOOM_DEBUG_LEVEL0)) ++# define IsBoomDebugLevel1() (BoomDebugSearchItem( basename(__FILE__), BOOM_DEBUG_LEVEL1)) ++# define IsBoomDebugLevel2() (BoomDebugSearchItem( basename(__FILE__), BOOM_DEBUG_LEVEL2)) ++ ++/*------------------------------------------------------------\ ++| | ++| Print Macro | ++| | ++\------------------------------------------------------------*/ ++ ++# define BoomPrintf BoomDebugPrint( basename(__FILE__), __LINE__ ); fprintf ++ ++/*------------------------------------------------------------\ ++| | ++| Debug Option Macro | ++| | ++\------------------------------------------------------------*/ ++ ++/* ++# define IsBoomDebugNoRedInst() (BoomDebugOption & BOOM_DEBUG_NO_RED_INST) ++# define SetBoomDebugNoRedInst() (BoomDebugOption |= BOOM_DEBUG_NO_RED_INST) ++# define IsBoomDebugStatistics() (BoomDebugOption & BOOM_DEBUG_STATISTICS) ++# define SetBoomDebugStatistics() (BoomDebugOption |= BOOM_DEBUG_STATISTICS) ++# define IsBoomDebugDriveStdout() (BoomDebugOption & BOOM_DEBUG_DRIVE_STDOUT) ++# define SetBoomDebugDriveStdout() (BoomDebugOption |= BOOM_DEBUG_DRIVE_STDOUT) ++*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Time Macro | ++| | ++\------------------------------------------------------------*/ ++ ++# define BoomDebugStartChrono(N) (void)time(&BoomDebugChrono[(N)]) ++# define BoomDebugReadChrono(N) (time((void *)0) - BoomDebugChrono[(N)]) ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern int BoomDebugFlag; ++ extern int BoomDebugOption; ++ extern time_t BoomDebugChrono[ BOOM_DEBUG_MAX_CHRONO ]; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern int BoomDebugSearchItem(); ++ extern int BoomDebugAddItem(); ++ ++ extern int BoomDebugSetOption(); ++ ++ extern void BoomDebugLocSaveBehFigure(); ++ extern void BoomDebugPrint(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_drive.c alliance/boom/src/boom_drive.c +--- alliance-5.0/boo/src/boom_drive.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_drive.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,98 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_parse.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_abl.h" ++# include "boom_parse.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomDriveBehFigure | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDriveBehFigure( BehFigure, FileName ) ++ ++ befig_list *BehFigure; ++ char *FileName; ++{ ++ char *SaveName; ++ ++ SaveName = BehFigure->NAME; ++ BehFigure->NAME = FileName; ++ ++ vhdlsavebefig( BehFigure, 0 ); ++ BehFigure->NAME = SaveName; ++} +diff -Naur alliance-5.0/boo/src/boom_drive.h alliance/boom/src/boom_drive.h +--- alliance-5.0/boo/src/boom_drive.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_drive.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,71 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_drive.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_DRIVE_H ++# define BOOM_DRIVE_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomDriveBehFigure(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_error.c alliance/boom/src/boom_error.c +--- alliance-5.0/boo/src/boom_error.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_error.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,164 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_error.c | ++| | ++| Authors : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++# include "mut.h" ++# include "aut.h" ++# include "boom_error.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Private variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomDisplayError | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDisplayError( File, Line, Error, Text ) ++ ++ char *File; ++ int Line; ++ int Error; ++ char *Text; ++{ ++ char *Name; ++ ++ Name = mbkstrdup( File ); ++ Name[ strlen( File ) - 1 ] = '\0'; ++ ++ fprintf( stderr, "%s%d ", Name, Line ); ++ ++ switch( Error ) ++ { ++ case BOOM_EXPR_NULL_ERROR : ++ ++ fprintf( stderr, "null expression !\n" ); ++ ++ break; ++ ++ case BOOM_EXPR_LOOP_ERROR : ++ ++ fprintf( stderr, "combinatory loop on %s !\n", Text ); ++ ++ break; ++ ++ case BOOM_UNKNOWN_ATOM_ERROR : ++ ++ fprintf( stderr, "unknown atom %s !\n", Text ); ++ ++ break; ++ ++ case BOOM_SIMPLIFY_ERROR : ++ ++ fprintf( stderr, "cannot simplify internal signals\n" ); ++ ++ break; ++ ++ case BOOM_ILLEGAL_STABLE_ERROR : ++ ++ fprintf( stderr, "illegal use of STABLE operator\n" ); ++ ++ break; ++ ++ case BOOM_OPERATOR_ERROR : ++ ++ fprintf( stderr, "illegal use of operator %ld\n", (long)Text ); ++ ++ break; ++ ++ default : fprintf( stderr, "Internal error number %d\n", Error ); ++ } ++ ++ autexit( 1 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDisplayWarning | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDisplayWarning( File, Line, Warning, Text ) ++ ++ char *File; ++ int Line; ++ int Warning; ++ char *Text; ++{ ++ char *Name; ++ ++ Name = mbkstrdup( File ); ++ Name[ strlen( File ) - 1 ] = '\0'; ++ ++ fprintf( stderr, "%s%d ", Name, Line ); ++ ++ switch ( Warning ) ++ { ++ default : fprintf( stderr, "Internal warning number %d\n", Warning ); ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_error.h alliance/boom/src/boom_error.h +--- alliance-5.0/boo/src/boom_error.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_error.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,99 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_error.h | ++| | ++| Authors : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_ERROR_H ++# define BOOM_ERROR_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_EXPR_NULL_ERROR 0 ++# define BOOM_EXPR_LOOP_ERROR 1 ++# define BOOM_UNKNOWN_ATOM_ERROR 2 ++# define BOOM_SIMPLIFY_ERROR 3 ++# define BOOM_ILLEGAL_STABLE_ERROR 4 ++# define BOOM_OPERATOR_ERROR 5 ++ ++/*------------------------------------------------------------\ ++| | ++| Errors | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Warnings | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++ ++# define BoomError( ERROR, TEXT ) \ ++ \ ++ BoomDisplayError( basename(__FILE__), __LINE__, (ERROR), (TEXT) ) ++ ++# define BoomWarning( WARNING, TEXT ) \ ++ \ ++ BoomDisplayWarning( basename(__FILE__), __LINE__, (WARNING), (TEXT) ) ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomDisplayError(); ++ extern void BoomDisplayWarning(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_gradient.c alliance/boom/src/boom_gradient.c +--- alliance-5.0/boo/src/boom_gradient.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_gradient.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,415 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_gradient.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++ ++# include "boom_gradient.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static bddnode *BoomBddTopVarNode = (bddnode *)0; ++ static long BoomCurrentVar = (long )0; ++ static long BoomCurrentCost = 0; ++ ++ static int BoomExplosionFlag = 0; ++ ++ ++ static long *BoomVarCostArray = (long *)0; ++ static long *BoomVarSortArray = (long *)0; ++ static long BoomVarArraySize = 0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomGradientTopBddNode | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomGradientTopBddNode( BddNode ) ++ ++ bddnode *BddNode; ++{ ++ bddnode *NewBddNode; ++ long Number; ++ ++ if ( ! BoomExplosionFlag ) ++ { ++ Number = getbddnodenum( (bddsystem *)0, BddNode ); ++ ++ if ( Number < BOOM_BDD_NODE_BIG_SIZE ) return; ++ ++ NewBddNode = composebddnode( BddLocalSystem, BddNode, ++ BoomCurrentVar, BoomBddTopVarNode ); ++ ++ if ( IsBddSystemExplosion( BddLocalSystem ) ) ++ { ++ BoomPrintf( stdout, "Explosion !!! %ld\n", BddLocalSystem->NUMBER_NODE ); ++ ++ garbagebddsystem( BddLocalSystem ); ++ explosionbddsystemrestart( BddLocalSystem ); ++ ++ BoomExplosionFlag = 1; ++ } ++ else ++ { ++ BoomCurrentCost += getbddnodenum( (bddsystem *)0, NewBddNode ); ++ /* ++ Number = getbddnodenum( (bddsystem *)0, NewBddNode ); ++ ++ if ( Number >= BOOM_BDD_NODE_BIG_SIZE ) BoomCurrentCost += Number; ++ */ ++ ++ decbddrefext( NewBddNode ); ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomGradientCompareCost | ++| | ++\------------------------------------------------------------*/ ++ ++static long BoomGradientCompareCost( CostArray, Index1, Index2 ) ++ ++ long *CostArray; ++ long Index1; ++ long Index2; ++{ ++ return( CostArray[ Index2 ] - CostArray[ Index1 ] ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehGradientBddOrder | ++| | ++\------------------------------------------------------------*/ ++ ++chain_list *BoomBehGradientBddOrder( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ chain_list *OrderList; ++ long NumberVar; ++ long VarIndex; ++ long Index; ++ long ExplosionLimit; ++ long MaxNode; ++ char *Name; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ VarIndex = getbddvarindex( BddLocalSystem, 0 ); ++ BoomBddTopVarNode = addbddcircuitin( BddLocalCircuit, "_top_", VarIndex, ++ BDD_IN_MODE_BEFORE ); ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ if ( BoomVarCostArray == (long *)0 ) ++ { ++ BoomVarCostArray = (long *)autallocblock( sizeof( long ) * NumberVar ); ++ BoomVarSortArray = (long *)autallocblock( sizeof( long ) * NumberVar ); ++ ++ BoomVarArraySize = NumberVar; ++ } ++ else ++ if ( NumberVar > BoomVarArraySize ) ++ { ++ BoomVarCostArray = (long *)autresizeblock( (char *)BoomVarCostArray, ++ sizeof( long ) * BoomVarArraySize, ++ sizeof( long ) * NumberVar ); ++ BoomVarSortArray = (long *)autresizeblock( (char *)BoomVarSortArray, ++ sizeof( long ) * BoomVarArraySize, ++ sizeof( long ) * NumberVar ); ++ BoomVarArraySize = NumberVar; ++ } ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Compute Cost for each variables\n" ); ++ } ++ ++ MaxNode = BddLocalSystem->NUMBER_NODE * 2; ++ ++ for ( BoomCurrentVar = 1; BoomCurrentVar < NumberVar; BoomCurrentVar++ ) ++ { ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Sweep !\n" ); ++ } ++ ++ sweepbddvar( BddLocalSystem, 0, 1 ); ++ ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Garbage !\n" ); ++ } ++ ++ garbagebddsystem( BddLocalSystem ); ++ MaxNode = BddLocalSystem->NUMBER_NODE * 4; ++ } ++ } ++ ++ ExplosionLimit = BddLocalSystem->NUMBER_NODE * 2; ++ ++ if ( ExplosionLimit < BOOM_GRADIENT_EXPLOSION_LIMIT ) ++ { ++ ExplosionLimit = BOOM_GRADIENT_EXPLOSION_LIMIT; ++ } ++ ++ explosionbddsystemdynamic( (bddsystem *)0, NULL, ExplosionLimit ); ++ ++ BoomCurrentCost = 0; ++ ++ BoomBehScanBdd( BehFigure, BoomGradientTopBddNode ); ++ ++ if ( BoomExplosionFlag ) ++ { ++ BoomExplosionFlag = 0; ++ BoomVarCostArray[ BoomCurrentVar - 1 ] = - BoomCurrentVar; ++ } ++ else ++ { ++ BoomVarCostArray[ BoomCurrentVar - 1 ] = BoomCurrentCost; ++ } ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ VarIndex = getbddvarindex( (bddsystem *)0, BoomCurrentVar ); ++ Name = getbddcircuitinname( (bddcircuit *)0, VarIndex ); ++ ++ BoomPrintf( stdout, "%ld %ld %s\n", BoomCurrentVar, BoomCurrentCost, Name ); ++ } ++ } ++ ++ explosionbddsystemdynamic( (bddsystem *)0, NULL, 0 ); ++ ++ sortautarray( BoomVarCostArray, BoomVarSortArray, NumberVar - 1, BoomGradientCompareCost ); ++ ++ OrderList = (chain_list *)0; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "New variable order (reverse)\n" ); ++ } ++ ++ for ( Index = NumberVar - 2; Index >= 0; Index-- ) ++ { ++ VarIndex = getbddvarindex( (bddsystem *)0, BoomVarSortArray[ Index ] + 1 ); ++ Name = getbddcircuitinname( (bddcircuit *)0, VarIndex ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "%ld %ld %s\n", BoomVarSortArray[ Index ] + 1, VarIndex, Name ); ++ } ++ ++ OrderList = addchain( OrderList, (void *)Name ); ++ } ++ ++ BoomBehRebuildBddNode( BehFigure, OrderList ); ++ ++ return( OrderList ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeGradient | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeGradient( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ boombefiginfo *FigInfo; ++ long Cost; ++ long NewCost; ++ long Iteration; ++ long Amplitude; ++ long MaxIteration; ++ long MaxAmplitude; ++ chain_list *BestOrder; ++ chain_list *NewOrder; ++ int Level; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ MaxAmplitude = FigInfo->AMPLITUDE; ++ Level = FigInfo->OPTIM_LEVEL; ++ ++ if ( MaxIteration <= 0 ) MaxIteration = 2; ++ if ( MaxAmplitude <= 0 ) MaxAmplitude = 5; ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ BestOrder = BoomBehGetBddOrder( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ MaxIteration = MaxIteration * (Level + 1); ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Iteration %ld\n", Iteration ); ++ } ++ ++ Amplitude = MaxAmplitude; ++ ++ do ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Amplitude %ld\n", Amplitude ); ++ } ++ ++ BoomBehRandomBddOrder( BehFigure, Amplitude ); ++ ++ NewOrder = BoomBehGradientBddOrder( BehFigure ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ ++ freechain( BestOrder ); ++ BestOrder = NewOrder; ++ } ++ else ++ { ++ freechain( NewOrder ); ++ } ++ ++ Amplitude--; ++ } ++ while ( Amplitude > 0 ); ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-3ld\b\b\b", ( ( Iteration + 1 ) * 100 ) / MaxIteration ); ++ fflush( stdout ); ++ } ++ } ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Best cost : %ld\n", Cost ); ++ } ++ ++ BoomBehRebuildBddNode( BehFigure, BestOrder ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_gradient.h alliance/boom/src/boom_gradient.h +--- alliance-5.0/boo/src/boom_gradient.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_gradient.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,74 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_gradient.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_GRADIENT_H ++# define BOOM_GRADIENT_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_GRADIENT_EXPLOSION_LIMIT 10000 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeGradient(); ++ extern chain_list *BoomBehGradientBddOrder(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_hash.c alliance/boom/src/boom_hash.c +--- alliance-5.0/boo/src/boom_hash.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_hash.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,313 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_hash.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++# include "boom_error.h" ++# include "boom_hash.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Get Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Get Hash Size | ++| | ++\------------------------------------------------------------*/ ++ ++static long BoomGetHashAblSize( Size ) ++ ++ long Size; ++{ ++ int Index; ++ ++ for ( Index = 0; Index < AUT_MAX_PRIME_NUMBER; Index++ ) ++ { ++ if ( AUT_HASH_PRIME_NUMBER[ Index ] > Size ) ++ { ++ return( AUT_HASH_PRIME_NUMBER[ Index ] ); ++ } ++ } ++ ++ if ( ( Size & 1 ) == 0 ) Size++; ++ ++ return( Size ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Boom Get Hash Key | ++| | ++\------------------------------------------------------------*/ ++ ++static long BoomGetHashAblKey( Table, BddNode ) ++ ++ boomhabltable *Table; ++ bddnode *BddNode; ++{ ++ return( ((unsigned long)BddNode >> 2 ) % Table->TABLE_SIZE ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Create Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Create Hash Abl Table | ++| | ++\------------------------------------------------------------*/ ++ ++boomhabltable *BoomCreateHashAblTable( Length ) ++ ++ long Length; ++{ ++ boomhabltable *HashTable; ++ boomhabl *Table; ++ ++ Length = BoomGetHashAblSize( Length ); ++ ++ HashTable = (boomhabltable *)autallocblock( sizeof( boomhabltable ) ); ++ Table = (boomhabl *)autallocblock( sizeof( boomhabl ) * Length ); ++ ++ HashTable->TABLE = Table; ++ HashTable->TABLE_SIZE = Length; ++ ++ return( HashTable ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Reset Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Reset Hash Abl Table | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomResetHashAblTable( HashTable ) ++ ++ boomhabltable *HashTable; ++{ ++ boomhabl *HashAbl; ++ long HashIndex; ++ ++ if ( HashTable->NUMBER_ABL > 0 ) ++ { ++ for ( HashIndex = 0; HashIndex < HashTable->TABLE_SIZE; HashIndex++ ) ++ { ++ HashAbl = &HashTable->TABLE[ HashIndex ]; ++ ++ if ( HashAbl->NODE != (bddnode *)0 ) ++ { ++ freeablexpr( HashAbl->ABL ); ++ ++ HashAbl->ABL = (chain_list *)0; ++ HashAbl->NODE = (bddnode *)0; ++ } ++ } ++ ++ HashTable->NUMBER_ABL = 0; ++ HashTable->NUMBER_RESET++; ++ } ++ ++ HashTable->NUMBER_ADD = 0; ++ HashTable->NUMBER_HIT = 0; ++ HashTable->NUMBER_MISS = 0; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Destroy Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Destroy Hash Abl Table | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDestroyHashAblTable( HashTable ) ++ ++ boomhabltable *HashTable; ++{ ++ BoomResetHashAblTable( HashTable ); ++ ++ autfreeblock( HashTable->TABLE ); ++ autfreeblock( HashTable ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Add Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Add Hash Element | ++| | ++\------------------------------------------------------------*/ ++ ++boomhabl *BoomAddHashAbl( HashTable, BddNode, Equation ) ++ ++ boomhabltable *HashTable; ++ bddnode *BddNode; ++ chain_list *Equation; ++{ ++ boomhabl *HashAbl; ++ long HashIndex; ++ ++ HashIndex = BoomGetHashAblKey( HashTable, BddNode, Equation ); ++ HashAbl = &HashTable->TABLE[ HashIndex ]; ++ ++ HashTable->NUMBER_ADD++; ++ ++ if ( HashAbl->NODE == (bddnode *)0 ) ++ { ++ HashTable->NUMBER_ABL++; ++ } ++ else ++ { ++ freeablexpr( HashAbl->ABL ); ++ } ++ ++ HashAbl->NODE = BddNode; ++ HashAbl->ABL = dupablexpr( Equation ); ++ ++ return( HashAbl ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Search Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Search Hash Abl | ++| | ++\------------------------------------------------------------*/ ++ ++boomhabl *BoomSearchHashAbl( HashTable, BddNode ) ++ ++ boomhabltable *HashTable; ++ bddnode *BddNode; ++{ ++ boomhabl *HashAbl; ++ long HashIndex; ++ ++ HashIndex = BoomGetHashAblKey( HashTable, BddNode ); ++ HashAbl = &HashTable->TABLE[ HashIndex ]; ++ ++ if ( HashAbl->NODE == BddNode ) ++ { ++ HashTable->NUMBER_HIT++; ++ ++ return( HashAbl ); ++ } ++ ++ HashTable->NUMBER_MISS++; ++ ++ return( (boomhabl *)0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Boom View Hash Abl Table | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomViewHashAblTable( HashTable ) ++ ++ boomhabltable *HashTable; ++{ ++ fprintf( stdout, "--> HashAblTable\n" ); ++ fprintf( stdout, " SIZE : %ld\n", HashTable->TABLE_SIZE ); ++ fprintf( stdout, " ABL : %ld\n", HashTable->NUMBER_ABL ); ++ fprintf( stdout, " ADD : %ld\n", HashTable->NUMBER_ADD ); ++ fprintf( stdout, " HIT : %ld\n", HashTable->NUMBER_HIT ); ++ fprintf( stdout, " MISS : %ld\n", HashTable->NUMBER_MISS ); ++ fprintf( stdout, " RESET : %ld\n", HashTable->NUMBER_RESET ); ++ ++ fprintf( stdout, "<-- HashAblTable\n" ); ++} +diff -Naur alliance-5.0/boo/src/boom_hash.h alliance/boom/src/boom_hash.h +--- alliance-5.0/boo/src/boom_hash.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_hash.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,107 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_hash.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_HASH_H ++# define BOOM_HASH_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Hash Abl | ++| | ++\------------------------------------------------------------*/ ++ ++ typedef struct boomhabl ++ { ++ bddnode *NODE; ++ chain_list *ABL; ++ ++ } boomhabl; ++ ++/*-----------------------------------------------------------\ ++| | ++| Boom Hash Abl Table | ++| | ++\-----------------------------------------------------------*/ ++ ++ typedef struct boomhabltable ++ { ++ boomhabl *TABLE; ++ long TABLE_SIZE; ++ long NUMBER_ABL; ++ long NUMBER_ADD; ++ long NUMBER_HIT; ++ long NUMBER_MISS; ++ long NUMBER_RESET; ++ ++ } boomhabltable; ++ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern boomhabltable *BoomCreateHashAblTable(); ++ extern void BoomDestroyHashAblTable(); ++ extern void BoomResetHashAblTable(); ++ ++ extern boomhabl *BoomAddHashAbl(); ++ extern boomhabl *BoomSearchHashAbl(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_logic.c alliance/boom/src/boom_logic.c +--- alliance-5.0/boo/src/boom_logic.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_logic.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,1070 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_logic.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_logic.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicComputeAux | ++| | ++\------------------------------------------------------------*/ ++ ++beaux_list *BoomLogicComputeAux( BehFigure, BehAux ) ++ ++ befig_list *BehFigure; ++ beaux_list *BehAux; ++{ ++ beaux_list *ScanAux; ++ beaux_list **PrevAux; ++ ++ PrevAux = &BehFigure->BEAUX; ++ ++ for ( ScanAux = BehFigure->BEAUX; ++ ScanAux != (beaux_list *)0; ++ ScanAux = ScanAux->NEXT ) ++ { ++ if ( ScanAux == BehAux ) ++ { ++ *PrevAux = (beaux_list *)0; break; ++ } ++ ++ PrevAux = &ScanAux->NEXT; ++ } ++ ++ BoomBehFreeBehAux( BehFigure->BEAUX ); ++ ++ BehFigure->BEAUX = ScanAux; ++ BehAux = ScanAux; ++ ++ BoomBehBddNode2Abl( BehFigure ); ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomDebugSaveBehFigure( BehFigure, NULL ); ++ } ++ ++ BoomBehCreateAux( BehFigure ); ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomDebugSaveBehFigure( BehFigure, NULL ); ++ } ++ ++ return( BehAux ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Boom Logic Reorder Window 2 | ++| | ++\------------------------------------------------------------*/ ++ ++int BoomLogicReorderWindow2( BehFigure, BehAux, BddVar, PCost ) ++ ++ befig_list *BehFigure; ++ beaux_list *BehAux; ++ bddvar BddVar; ++ long *PCost; ++{ ++ long NewCost; ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( NewCost < *PCost ) ++ { ++ *PCost = NewCost; ++ ++ return( 1 ); ++ } ++ else ++ if ( NewCost == *PCost ) ++ { ++ return( 0 ); ++ } ++ ++ swapbddvar( BddLocalSystem, BddVar ); ++ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Boom Logic Reorder Window 3 | ++| | ++\------------------------------------------------------------*/ ++ ++int BoomLogicReorderWindow3( BehFigure, BehAux, BddVar, PCost ) ++ ++ befig_list *BehFigure; ++ beaux_list *BehAux; ++ bddvar BddVar; ++ long *PCost; ++{ ++ long Cost; ++ long NewCost; ++ int BestOrder; ++ ++ BestOrder = BOOM_LOGIC_REORDER_123; ++ Cost = *PCost; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: Initial cost %ld\n", Cost ); ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_LOGIC_REORDER_213; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 213 new cost %ld\n", Cost ); ++ } ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_LOGIC_REORDER_231; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 231 new cost %ld\n", Cost ); ++ } ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_LOGIC_REORDER_321; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 321 new cost %ld\n", Cost ); ++ } ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_LOGIC_REORDER_312; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 312 new cost %ld\n", Cost ); ++ } ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_LOGIC_REORDER_132; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 132 new cost %ld\n", Cost ); ++ } ++ } ++ ++ switch ( BestOrder ) ++ { ++ case BOOM_LOGIC_REORDER_123 : swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ ++ case BOOM_LOGIC_REORDER_213 : swapbddvar( (bddsystem *)0, BddVar ); ++ swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ ++ case BOOM_LOGIC_REORDER_231 : swapbddvar( (bddsystem *)0, BddVar ); ++ swapbddvar( (bddsystem *)0, BddVar ); ++ swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ ++ case BOOM_LOGIC_REORDER_321 : swapbddvar( (bddsystem *)0, BddVar ); ++ swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ ++ case BOOM_LOGIC_REORDER_312 : swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ } ++ ++ *PCost = Cost; ++ ++ return( BestOrder != BOOM_LOGIC_REORDER_123 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicOptimizeWindow | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomLogicOptimizeWindow( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ short *ReorderLevel; ++ bddvar NumberChild; ++ bddvar BestChild; ++ bddvar ChildCount; ++ bddvar ChildTo; ++ bddvar ChildFrom; ++ int SwapReorder; ++ int AnySwap; ++ int Moved; ++ long Cost; ++ long NewCost; ++ ++ NumberChild = BddLocalSystem->NUMBER_VAR; ++ ReorderLevel = (short *)autallocblock( sizeof( short ) * NumberChild ); ++ ++ for ( ChildFrom = 0; ChildFrom < ( NumberChild - 1 ); ChildFrom++ ) ++ { ++ ReorderLevel[ ChildFrom ] = 1; ++ } ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ do ++ { ++ AnySwap = 0; ++ ++ for ( ChildCount = 0; ChildCount < NumberChild - 1; ChildCount++ ) ++ { ++ if ( ReorderLevel[ ChildCount ] ) ++ { ++ if ( ChildCount < NumberChild - 2 ) ++ { ++ Moved = BoomLogicReorderWindow3( BehFigure, BehAux, ChildCount, &Cost ); ++ } ++ else ++ { ++ Moved = BoomLogicReorderWindow2( BehFigure, BehAux, ChildCount, &Cost ); ++ } ++ ++ if ( Moved ) ++ { ++ AnySwap = 1; ++ ++ if ( ChildCount > 0 ) ReorderLevel[ ChildCount - 1 ] = 1; ++ if ( ChildCount > 1 ) ReorderLevel[ ChildCount - 2 ] = 1; ++ ++ ReorderLevel[ ChildCount + 1 ] = 1; ++ ++ if ( ChildCount < NumberChild - 2 ) ReorderLevel[ ChildCount + 2 ] = 1; ++ if ( ChildCount < NumberChild - 3 ) ReorderLevel[ ChildCount + 3 ] = 1; ++ if ( ChildCount < NumberChild - 4 ) ReorderLevel[ ChildCount + 4 ] = 1; ++ } ++ else ++ { ++ ReorderLevel[ ChildCount ] = 0; ++ } ++ } ++ } ++ } ++ while ( AnySwap ); ++ ++ autfreeblock( ReorderLevel ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicOptimizeTop | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomLogicOptimizeTop( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ char *ReorderLevel; ++ bddvar NumberChild; ++ bddvar BestChild; ++ bddvar ChildCount; ++ bddvar ChildTo; ++ bddvar ChildFrom; ++ char SwapReorder; ++ long Cost; ++ long NewCost; ++ ++ NumberChild = BddLocalSystem->NUMBER_VAR; ++ ReorderLevel = (char *)autallocblock( sizeof( char ) * NumberChild ); ++ ++ for ( ChildFrom = 0; ChildFrom < ( NumberChild - 1 ); ChildFrom++ ) ++ { ++ ReorderLevel[ ChildFrom ] = 1; ++ } ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ ChildCount = ( NumberChild - 1 ); ++ ChildFrom = 0; ++ ++ while ( ChildCount > 0 ) ++ { ++ /* ++ fprintf( stdout, "%-4d\b\b\b\b", ChildCount ); ++ fflush( stdout ); ++ */ ++ ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomPrintf( stdout, "-> ChildFrom %d\n", ChildFrom ); ++ } ++ ++ ReorderLevel[ ChildFrom ] = 0; ++ ++ BestChild = ChildFrom; ++ ++ for ( ChildTo = ChildFrom; ChildTo < ( NumberChild - 1 ); ChildTo++ ) ++ { ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomPrintf( stdout, "-> Swap %d and %d\n", ChildTo, ChildTo + 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, ChildTo ); ++ ++ SwapReorder = ReorderLevel[ ChildTo ]; ++ ReorderLevel[ ChildTo ] = ReorderLevel[ ChildTo + 1 ]; ++ ReorderLevel[ ChildTo + 1 ] = SwapReorder; ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ BestChild = ChildTo + 1; Cost = NewCost; ++ } ++ } ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "--> Best child %d\n", BestChild ); ++ BoomPrintf( stdout, "--> Best cost %ld\n", Cost ); ++ } ++ ++ for ( ChildTo = ( NumberChild - 1 ); ChildTo > BestChild; ChildTo-- ) ++ { ++# ifdef BDD_DEBUG ++ if ( IsBoomDebugLevel1() ) ++ { ++fprintf( stdout, "-> UnSwap %d and %d\n", ChildTo - 1, ChildTo ); ++ } ++# endif ++ ++ SwapReorder = ReorderLevel[ ChildTo - 1 ]; ++ ReorderLevel[ ChildTo - 1 ] = ReorderLevel[ ChildTo ]; ++ ReorderLevel[ ChildTo ] = SwapReorder; ++ ++ swapbddvar( (bddsystem *)0, ChildTo - 1 ); ++ } ++ ++ while ( ! ReorderLevel[ ChildFrom ] ) ++ { ++ ChildFrom = ChildFrom + 1; ++ } ++ ++ ChildCount = ChildCount - 1; ++ } ++ ++ autfreeblock( ReorderLevel ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicOptimizeProcrast | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomLogicOptimizeProcrast( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ boombefiginfo *FigInfo; ++ bddvar NumberChild; ++ bddvar ChildTo; ++ bddvar ChildFrom; ++ char SwapReorder; ++ long Cost; ++ long NumberNode; ++ long NewCost; ++ long Iteration; ++ int MaxIteration; ++ long MaxNode; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ ++ if ( MaxIteration <= 0 ) MaxIteration = 2; ++ ++ NumberChild = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ MaxNode = ( BddLocalSystem->NUMBER_NODE * 120 ) / 100; ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ ChildFrom = 0; ++ ++ for ( ChildFrom = 0; ChildFrom < (NumberChild - 1); ChildFrom++ ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> ChildFrom %d\n", ChildFrom ); ++ } ++ ++ for ( ChildTo = ChildFrom; ChildTo < ( NumberChild - 1 ); ChildTo++ ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> Swap %d and %d\n", ChildTo, ChildTo + 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, ChildTo ); ++ ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ garbagebddsystem( BddLocalSystem ); ++ } ++ ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ BoomPrintf( stdout, "@@@@ Max nodes %ld reached %ld\n", ++ MaxNode, BddLocalSystem->NUMBER_NODE ); ++ break; ++ } ++ } ++ ++ NumberNode = BoomBehGetNumberBddNode( BehFigure ); ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld %ld\n", NewCost, NumberNode ); ++ } ++ ++ if ( NewCost > Cost ) ++ { ++ while ( ChildTo > ChildFrom ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> UnSwap %d and %d\n", ChildTo, ChildTo - 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, ChildTo - 1 ); ++ ++ ChildTo = ChildTo - 1; ++ } ++ } ++ else ++ { ++ Cost = NewCost; ++ } ++ } ++ } ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicOptimizeBest | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomLogicOptimizeBest( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ boombefiginfo *FigInfo; ++ bddvar NumberChild; ++ bddvar ChildTo; ++ bddvar ChildFrom; ++ char SwapReorder; ++ long Cost; ++ long NewCost; ++ long Iteration; ++ int MaxIteration; ++ long MaxNode; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ ++ if ( MaxIteration <= 0 ) MaxIteration = 2; ++ ++ NumberChild = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ MaxNode = BddLocalSystem->NUMBER_NODE << 1; ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ ChildFrom = 0; ++ ++ for ( ChildFrom = 0; ChildFrom < (NumberChild - 1); ChildFrom++ ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> ChildFrom %d\n", ChildFrom ); ++ } ++ ++ for ( ChildTo = ChildFrom; ChildTo < ( NumberChild - 1 ); ChildTo++ ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> Swap %d and %d\n", ChildTo, ChildTo + 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, ChildTo ); ++ ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ BoomPrintf( stdout, "@@@@ Max nodes %ld reached %ld\n", ++ MaxNode, BddLocalSystem->NUMBER_NODE ); ++ break; ++ } ++ } ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost > Cost ) ++ { ++ while ( ChildTo > ChildFrom ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> UnSwap %d and %d\n", ChildTo, ChildTo - 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, ChildTo - 1 ); ++ ++ ChildTo = ChildTo - 1; ++ } ++ } ++ else ++ { ++ Cost = NewCost; ++ } ++ } ++ } ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicOptimizeSimple | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomLogicOptimizeSimple( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ bddvar NumberVar; ++ bddvar BddVar; ++ long Cost; ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ for ( BddVar = 0; BddVar < NumberVar - 1; BddVar++ ) ++ { ++ /* ++ fprintf( stdout, "%-4d\b\b\b\b", NumberVar - BddVar ); ++ fflush( stdout ); ++ */ ++ ++ if ( BddVar < NumberVar - 2 ) ++ { ++ BoomLogicReorderWindow3( BehFigure, BehAux, BddVar, &Cost ); ++ } ++ else ++ { ++ BoomLogicReorderWindow2( BehFigure, BehAux, BddVar, &Cost ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "New cost %ld\n", Cost ); ++ } ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicOptimizeRandom | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomLogicOptimizeRandom( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ long MaxIteration; ++ bddvar NumberVar; ++ bddvar BddVar; ++ int Iteration; ++ long Cost; ++ ++ static unsigned char InitOptimizeRandom = 1; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ ++ if ( InitOptimizeRandom ) ++ { ++ srand( getpid() ); ++ InitOptimizeRandom = 0; ++ } ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld, NumberVar %d\n", Cost, NumberVar ); ++ } ++ ++ if ( MaxIteration <= 0 ) MaxIteration = NumberVar; ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ BddVar = (rand() >> 8) % (NumberVar - 1); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Swap %d\n", BddVar ); ++ } ++ ++ BoomLogicReorderWindow2( BehFigure, BehAux, BddVar, &Cost ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "New cost %ld\n", Cost ); ++ } ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ ++# if 0 ++void BoomLogicOptimizeRandom( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ long MaxIteration; ++ bddvar NumberVar; ++ bddvar BddVar; ++ int Iteration; ++ int Amplitude; ++ int Swap; ++ long Cost; ++ ++ static unsigned char InitOptimizeRandom = 1; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ ++ if ( InitOptimizeRandom ) ++ { ++ srand( getpid() ); ++ InitOptimizeRandom = 0; ++ } ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ /* ++ BehAux = BoomLogicComputeAux( BehFigure, BehFigure->BEAUX ); ++ */ ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld, NumberVar %d\n", Cost, NumberVar ); ++ } ++ ++ /* ++ if ( MaxIteration <= 0 ) MaxIteration = NumberVar; ++ */ ++ MaxIteration = 1 + ( ( NumberVar + 2 ) / 2 ); ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ if ( Iteration != 0 ) ++ { ++ BoomBehMakeBddNode( BehFigure, 0 ); ++ } ++ ++ for ( BddVar = 0; BddVar < ( NumberVar - 1 ); BddVar++ ) ++ { ++ Amplitude = (rand() >> 8) % 8; ++ ++ for ( Swap = 0; Swap < Amplitude; Swap++ ) ++ { ++ if ( ( BddVar + Swap ) >= ( NumberVar - 1 ) ) break; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> Swap %d and %d\n", BddVar + Swap, BddVar + Swap + 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar + Swap ); ++ } ++ } ++ ++ BoomLogicOptimizeProcrast( BehFigure ); ++ } ++ ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++# endif ++ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicOptimizeOne | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomLogicOptimizeOne( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ bddvar NumberVar; ++ bddvar BddVar; ++ long Cost; ++ ++ reorderbddsystemwindow( BddLocalSystem ); ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomLogicComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomLogicOptimization | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomLogicOptimization( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ bddsystem *BddSystem; ++ bddcircuit *BddCircuit; ++ beaux_list *BehAux; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ BoomBehCreateAuxInit( BehFigure ); ++ ++ if ( FigInfo->LOGIC_METHOD == BOOM_LOGIC_METHOD_NOTHING ) ++ { ++ return; ++ } ++ ++ BddSystem = createbddsystem( 1000, 200000, 100, 3000000 ); ++ reorderbddsystemdynamic( BddSystem, reorderbddsystemwindow, 200000, 50 ); ++ /* ++ explosionbddsystemdynamic( BddSystem, NULL, 50 ); ++ */ ++ ++ BoomBehAbl2BddNode( BehFigure, FigInfo->KEEP_AUX, FigInfo->INIT_BDD_ORDER ); ++ reorderbddsystemdynamic( BddSystem, garbagebddsystem, 200000, 50 ); ++ ++ BehAux = BehFigure->BEAUX; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ testbddcircuit( (bddcircuit *)0 ); ++ } ++/*\ ++ while ( testbddcircuit( (bddcircuit *)0 ) ) ++ { ++ BehAux = BoomLogicComputeAux( BehFigure, BehAux ); ++ ++ Cost = BoomBehGiveCost( BehFigure ); ++ fprintf( stdout, "New cost %d\n", Cost ); ++ } ++\*/ ++ ++ switch ( FigInfo->LOGIC_METHOD ) ++ { ++ case BOOM_LOGIC_METHOD_SIMPLE : BoomLogicOptimizeSimple( BehFigure ); ++ break; ++ ++ case BOOM_LOGIC_METHOD_WINDOW : BoomLogicOptimizeWindow( BehFigure ); ++ break; ++ ++ case BOOM_LOGIC_METHOD_TOP : BoomLogicOptimizeTop( BehFigure ); ++ break; ++ ++ case BOOM_LOGIC_METHOD_ONE : BoomLogicOptimizeOne( BehFigure ); ++ break; ++ ++ case BOOM_LOGIC_METHOD_PROCRAST : BoomLogicOptimizeProcrast( BehFigure ); ++ break; ++ ++ case BOOM_LOGIC_METHOD_BEST : BoomLogicOptimizeBest( BehFigure ); ++ break; ++ ++ case BOOM_LOGIC_METHOD_RANDOM : BoomLogicOptimizeRandom( BehFigure ); ++ break; ++ } ++/*\ ++ BoomBehResetBddNode( BehFigure ); ++\*/ ++ ++ BddCircuit = BehFigure->CIRCUI; ++ BehFigure->CIRCUI = (bddcircuit *)0; ++ ++ destroybddcircuit( BddCircuit ); ++ destroybddsystem( BddSystem ); ++ ++ /* ++ BoomBehDeleteUselessAux( BehFigure, (beaux_list *)0 ); ++ */ ++} +diff -Naur alliance-5.0/boo/src/boom_logic.h alliance/boom/src/boom_logic.h +--- alliance-5.0/boo/src/boom_logic.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_logic.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,79 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_logic.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_LOGIC_H ++# define BOOM_LOGIC_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_LOGIC_REORDER_123 0 ++# define BOOM_LOGIC_REORDER_213 1 ++# define BOOM_LOGIC_REORDER_231 2 ++# define BOOM_LOGIC_REORDER_321 3 ++# define BOOM_LOGIC_REORDER_312 4 ++# define BOOM_LOGIC_REORDER_132 5 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomLogicOptimization(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_main.c alliance/boom/src/boom_main.c +--- alliance-5.0/boo/src/boom_main.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_main.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,383 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_main.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_shared.h" ++# include "boom_parse.h" ++# include "boom_check.h" ++# include "boom_optim.h" ++# include "boom_cost.h" ++# include "boom_drive.h" ++# include "boom_post.h" ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_param.h" ++# include "boom_main.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Usage | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomUsage() ++{ ++ fprintf( stderr, " boom [Options] [Algorithm] Input_file_name [Output_file_name]\n\n" ); ++ ++ fprintf( stdout, " Options : -V Sets verbose mode on\n" ); ++ fprintf( stdout, " -T Sets trace and verbose modes on\n" ); ++ fprintf( stdout, " -O Reverses initial Bdd variables order\n" ); ++ fprintf( stdout, " -A Keeps all auxiliary variables\n" ); ++ fprintf( stdout, " -P Uses a parameter file (Input_file_name.boom)\n" ); ++ fprintf( stdout, " -L Uses literal's number for surface estimation\n" ); ++ fprintf( stdout, " -l num Optimization level [0-3] (default 0, low level)\n" ); ++ fprintf( stdout, " -d num Delay optimization percent (default 0 %%)\n" ); ++ fprintf( stdout, " -i num Iteration count\n" ); ++ fprintf( stdout, " -a num Amplitude\n" ); ++ fprintf( stdout, "\n" ); ++ fprintf( stdout, " Algorithms : -s Simulated annealing (default)\n" ); ++ fprintf( stdout, " -j Just do it algorithm\n" ); ++ fprintf( stdout, " -b Burgun algorithm\n" ); ++ fprintf( stdout, " -g Gradient algorithm\n" ); ++ fprintf( stdout, " -p Procrastination algorithm\n" ); ++ fprintf( stdout, " -w Window bdd reorder\n" ); ++ fprintf( stdout, " -t Top bdd reorder\n" ); ++ fprintf( stdout, " -m Simple bdd reorder\n" ); ++ fprintf( stdout, " -o One pass (faster algorithm)\n" ); ++ fprintf( stdout, " -r Random bdd reorder\n" ); ++ fprintf( stdout, " -n No optimization algorithm\n" ); ++ fprintf( stdout, "\n" ); ++ ++ exit( 1 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Main | ++| | ++\------------------------------------------------------------*/ ++ ++int main( argc, argv ) ++ ++ int argc; ++ char *argv[]; ++{ ++ befig_list *BehFigure; ++ boombefiginfo *FigInfo; ++ char *InputFileName; ++ char *OutputFileName; ++ int Number; ++ int Index; ++ char Option; ++ ++ int FlagParamFile = 0; ++ int FlagVerbose = 0; ++ int FlagTrace = 0; ++ int FlagInitBddOrder = 0; ++ int FlagKeepAux = 0; ++ int FlagUseLiteral = 0; ++ int OptimAlgorithm = BOOM_OPTIM_ALGORITHM_ANNEAL; ++ int OptimLevel = 0; ++ int OptimDelayPerCent = 0; ++ int Iteration = 0; ++ int Amplitude = 0; ++ ++ alliancebanner_with_authors( "BooM", VERSION, "BOOlean Minimization", ++ "2000", ALLIANCE_VERSION, "Ludovic Jacomme" ); ++ mbkenv(); ++ autenv(); ++ ablenv(); ++ bddenv(); ++ ++ if ( argc < 2 ) BoomUsage(); ++ ++ InputFileName = (char *)0; ++ OutputFileName = (char *)0; ++ ++ for ( Number = 1; Number < argc; Number++ ) ++ { ++ if ( argv[ Number ][ 0 ] == '-' ) ++ { ++ for ( Index = 1; argv[ Number ][ Index ] != '\0'; Index++ ) ++ { ++ Option = argv[ Number ][ Index ]; ++ ++ if ( BoomFlagDebug ) ++ { ++ if ( BoomDebugAddItem( &argv[ Number ][ Index ], BoomFlagDebug ) ) break; ++ } ++ ++ if ( BoomFlagOption ) ++ { ++ if ( BoomDebugSetOption( &argv[ Number ][ Index ] ) ) break; ++ } ++ ++ if ( Option == 'i' ) ++ { ++ Number = Number + 1; ++ if ( Number >= argc ) BoomUsage(); ++ ++ Iteration = atoi( argv[ Number ] ); ++ ++ break; ++ } ++ else ++ if ( Option == 'a' ) ++ { ++ Number = Number + 1; ++ if ( Number >= argc ) BoomUsage(); ++ ++ Amplitude = atoi( argv[ Number ] ); ++ ++ break; ++ } ++ else ++ if ( Option == 'l' ) ++ { ++ Number = Number + 1; ++ if ( Number >= argc ) BoomUsage(); ++ ++ OptimLevel = atoi( argv[ Number ] ); ++ ++ if ( ( OptimLevel < 0 ) || ++ ( OptimLevel > 3 ) ) BoomUsage(); ++ ++ break; ++ } ++ else ++ if ( Option == 'd' ) ++ { ++ Number = Number + 1; ++ if ( Number >= argc ) BoomUsage(); ++ ++ OptimDelayPerCent = atoi( argv[ Number ] ); ++ ++ if ( ( OptimDelayPerCent < 0 ) || ++ ( OptimDelayPerCent > 100 ) ) BoomUsage(); ++ ++ break; ++ } ++ ++ switch ( Option ) ++ { ++ case 'V' : FlagVerbose = 1; ++ break; ++ case 'T' : FlagTrace = 1; ++ break; ++ case 'O' : FlagInitBddOrder = 1; ++ break; ++ case 'P' : FlagParamFile = 1; ++ break; ++ case 'L' : FlagUseLiteral = 1; ++ break; ++ case 'A' : FlagKeepAux = 1; ++ break; ++ case 'j' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_SIMUL; ++ break; ++ case 'm' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_SIMPLE; ++ break; ++ case 't' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_TOP; ++ break; ++ case 'w' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_WINDOW; ++ break; ++ case 'o' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_ONE; ++ break; ++ case 'r' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_RANDOM; ++ break; ++ case 'p' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_PROCRAST; ++ break; ++ case 'b' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_BURGUN; ++ break; ++ case 'g' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_GRADIENT; ++ break; ++ case 'n' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_NOTHING; ++ break; ++ case 's' : OptimAlgorithm = BOOM_OPTIM_ALGORITHM_ANNEAL; ++ break; ++ case 'D' : ++ ++ Index = Index + 1; ++ Option = argv[ Number ][ Index ]; ++ ++ if ( Option == '0' ) BoomFlagDebug = BOOM_DEBUG_LEVEL0; ++ else ++ if ( Option == '1' ) BoomFlagDebug = BOOM_DEBUG_LEVEL1; ++ else ++ if ( Option == '2' ) BoomFlagDebug = BOOM_DEBUG_LEVEL2; ++ else ++ BoomUsage(); ++ break; ++ default : BoomUsage(); ++ } ++ ++ if ( Option == 'r' ) break; ++ } ++ } ++ else ++ if ( InputFileName == (char *)0 ) InputFileName = argv[ Number ]; ++ else ++ if ( OutputFileName == (char *)0 ) OutputFileName = argv[ Number ]; ++ else ++ BoomUsage(); ++ } ++ ++ if ( InputFileName == (char *)0 ) BoomUsage(); ++ ++ InputFileName = autbasename( InputFileName, "vbe" ); ++ ++ if ( OutputFileName == (char *)0 ) ++ { ++ OutputFileName = autallocblock( strlen( InputFileName ) + 5 ); ++ sprintf( OutputFileName, "%s_o", InputFileName ); ++ } ++ else ++ { ++ OutputFileName = autbasename( OutputFileName, "vbe" ); ++ } ++ ++ fprintf( stdout, "\t--> Parse BEH file %s.vbe\n", InputFileName ); ++ ++ BehFigure = BoomParseBehFigure( InputFileName ); ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "\n\t--> Check figure %s\n", BehFigure->NAME ); ++ } ++ ++ BoomCheckBehFigure( BehFigure ); ++ ++ if ( FlagParamFile ) ++ { ++ fprintf( stdout, "\n\t--> Parse parameter file %s.boom\n", InputFileName ); ++ BoomParseParamFile( BehFigure, InputFileName ); ++ } ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ if ( FlagKeepAux ) FigInfo->KEEP_AUX = 1; ++ if ( FlagInitBddOrder ) FigInfo->INIT_BDD_ORDER = 1; ++ ++ if ( FlagTrace ) FlagVerbose = 1; ++ ++ FigInfo->OPTIM_ALGORITHM = OptimAlgorithm; ++ FigInfo->OPTIM_LEVEL = OptimLevel; ++ FigInfo->OPTIM_DELAY_PERCENT = OptimDelayPerCent; ++ FigInfo->ITERATION = Iteration; ++ FigInfo->AMPLITUDE = Amplitude; ++ FigInfo->VERBOSE = FlagVerbose; ++ FigInfo->TRACE = FlagTrace; ++ FigInfo->USE_LITERAL = FlagUseLiteral; ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "\n\t--> Optimization parameters\n" ); ++ fprintf( stdout, "\t Algorithm : %s\n", BoomOptimAlgorithmName[ OptimAlgorithm ] ); ++ fprintf( stdout, "\t Keep aux : %s\n", FlagKeepAux ? "yes" : "no" ); ++ fprintf( stdout, "\t Area : %3d %%\n", 100 - OptimDelayPerCent ); ++ fprintf( stdout, "\t Delay : %3d %%\n", OptimDelayPerCent ); ++ fprintf( stdout, "\t Level : %3d\n", OptimLevel ); ++ fprintf( stdout, "\n" ); ++ } ++ ++ if ( FlagVerbose ) ++ { ++ BoomBehGiveFullCost( BehFigure, 0 ); ++ BoomBehPrintCost( "Initial", BehFigure ); ++ fprintf( stdout, "\n" ); ++ } ++ ++ BoomBehOptimize( BehFigure ); ++ ++ if ( FlagVerbose ) ++ { ++ BoomBehGiveFullCost( BehFigure, 0 ); ++ BoomBehPrintCost( "Final", BehFigure ); ++ fprintf( stdout, "\n" ); ++ } ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "\t--> Post treat figure %s\n\n", BehFigure->NAME ); ++ ++ BoomPostTreatBehFigure( BehFigure, OutputFileName ); ++ } ++ ++ fprintf( stdout, "\t--> Drive BEH file %s\n\n", OutputFileName ); ++ ++ BoomDriveBehFigure( BehFigure, OutputFileName ); ++ ++ BoomBehFreeBehFig( BehFigure ); ++ ++ return( 0 ); ++} +diff -Naur alliance-5.0/boo/src/boom_main.h alliance/boom/src/boom_main.h +--- alliance-5.0/boo/src/boom_main.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_main.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,70 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BFP | ++| | ++| File : bfp_main.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BFP_MAIN_H ++# define BFP_MAIN_H ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_one.c alliance/boom/src/boom_one.c +--- alliance-5.0/boo/src/boom_one.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_one.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,113 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_one.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++ ++# include "boom_one.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeOne | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeOne( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ bddvar NumberVar; ++ long Cost; ++ ++ reorderbddsystemwindow( BddLocalSystem ); ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ +diff -Naur alliance-5.0/boo/src/boom_one.h alliance/boom/src/boom_one.h +--- alliance-5.0/boo/src/boom_one.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_one.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,70 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_one.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_ONE_H ++# define BOOM_ONE_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeOne(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_optim.c alliance/boom/src/boom_optim.c +--- alliance-5.0/boo/src/boom_optim.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_optim.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,226 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_optim.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++# include "boom_dc.h" ++# include "boom_auxinit.h" ++ ++# include "boom_window.h" ++# include "boom_top.h" ++# include "boom_simple.h" ++# include "boom_one.h" ++# include "boom_random.h" ++# include "boom_procrast.h" ++# include "boom_burgun.h" ++# include "boom_gradient.h" ++# include "boom_simul.h" ++# include "boom_anneal.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimize | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimize( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ bddsystem *BddSystem; ++ bddcircuit *BddCircuit; ++ beaux_list *BehAux; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ BoomBehCreateAuxInit( BehFigure ); ++ ++ if ( FigInfo->OPTIM_ALGORITHM == BOOM_OPTIM_ALGORITHM_NOTHING ) ++ { ++ return; ++ } ++ ++ BddSystem = createbddsystem( 1000, 20000, 100, 10000000 ); ++ ++ if ( ! BoomDebugFlag ) ++ { ++ SetBddSystemNoWarning( BddSystem ); ++ } ++ ++ reorderbddsystemdynamic( BddSystem, reorderbddsystemwindow, 100000, 50 ); ++ /* ++ explosionbddsystemdynamic( BddSystem, NULL, 50 ); ++ */ ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\t--> Translate Abl to Bdd\n" ); ++ } ++ ++ BoomBehAbl2BddNode( BehFigure, FigInfo->INIT_BDD_ORDER, FigInfo->DONT_CARE ); ++ reorderbddsystemdynamic( BddSystem, garbagebddsystem, 100000, 50 ); ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\t Total Bdd nodes %ld\n\n", BddSystem->NUMBER_NODE ); ++ } ++ ++ if ( FigInfo->DONT_CARE ) ++ { ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\t Optimize don't care\n" ); ++ } ++ ++ BoomOptimDontCare( BehFigure ); ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\t Total Bdd nodes %ld\n\n", BddSystem->NUMBER_NODE ); ++ } ++ } ++ ++ BehAux = BehFigure->BEAUX; ++ ++/*\ ++ while ( testbddcircuit( (bddcircuit *)0 ) ) ++ { ++ BehAux = BoomOptimComputeAux( BehFigure, BehAux ); ++ ++ Cost = BoomBehGiveCost( BehFigure ); ++ fprintf( stdout, "New cost %d\n", Cost ); ++ } ++\*/ ++ ++ switch ( FigInfo->OPTIM_ALGORITHM ) ++ { ++ case BOOM_OPTIM_ALGORITHM_SIMPLE : BoomBehOptimizeSimple( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_WINDOW : BoomBehOptimizeWindow( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_TOP : BoomBehOptimizeTop( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_ONE : BoomBehOptimizeOne( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_PROCRAST : BoomBehOptimizeProcrast( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_BURGUN : BoomBehOptimizeBurgun( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_RANDOM : BoomBehOptimizeRandom( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_GRADIENT : BoomBehOptimizeGradient( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_SIMUL : BoomBehOptimizeSimul( BehFigure ); ++ break; ++ ++ case BOOM_OPTIM_ALGORITHM_ANNEAL : BoomBehOptimizeAnneal( BehFigure ); ++ break; ++ } ++ ++ BoomBehResetBddNode( BehFigure ); ++ ++ BddCircuit = BehFigure->CIRCUI; ++ BehFigure->CIRCUI = (bddcircuit *)0; ++ ++ destroybddcircuit( BddCircuit ); ++ destroybddsystem( BddSystem ); ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ ClearBoomBehAuxKeep( BehAux ); ++ ClearBoomBehAuxDontTouch( BehAux ); ++ } ++ ++ BoomBehDeleteUselessAux( BehFigure, (beaux_list *)0, 1 ); ++ ++ BoomBehMapAbl( BehFigure, simpablexpr, 1 ); ++} +diff -Naur alliance-5.0/boo/src/boom_optim.h alliance/boom/src/boom_optim.h +--- alliance-5.0/boo/src/boom_optim.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_optim.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,79 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_optim.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_OPTIM_H ++# define BOOM_OPTIM_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_OPTIM_REORDER_123 0 ++# define BOOM_OPTIM_REORDER_213 1 ++# define BOOM_OPTIM_REORDER_231 2 ++# define BOOM_OPTIM_REORDER_321 3 ++# define BOOM_OPTIM_REORDER_312 4 ++# define BOOM_OPTIM_REORDER_132 5 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimize(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_order.c alliance/boom/src/boom_order.c +--- alliance-5.0/boo/src/boom_order.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_order.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,155 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : Boom | ++| | ++| File : boom_order.c | ++| | ++| Date : 06.06.00 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abt.h" ++ ++# include ++# include "boom_error.h" ++# include "boom_shared.h" ++# include "boom_order.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Beh Make Bdd Order | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehMakeBddOrder( BehFigure, OrderFlag, DontCareFlag ) ++ ++ befig_list *BehFigure; ++ int OrderFlag; ++ int DontCareFlag; ++{ ++ berin_list *BehRin; ++ boombefiginfo *FigInfo; ++ chain_list *ScanOrder; ++ bddindex BddIndex; ++ authtable *HahsRin; ++ authelem *Element; ++ /* ++ beaux_list *BehAux; ++ beout_list *BehOut; ++ bebus_list *BehBus; ++ bebux_list *BehBux; ++ bereg_list *BehReg; ++ biabl_list *BiAbl; ++ */ ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ HahsRin = createauthtable( 100 ); ++ ++ for ( BehRin = BehFigure->BERIN; ++ BehRin != (berin_list *)0; ++ BehRin = BehRin->NEXT ) ++ { ++ addauthelem( HahsRin, BehRin->NAME, (long)BehRin ); ++ } ++ ++ for ( ScanOrder = FigInfo->BDD_ORDER_LIST; ++ ScanOrder != (chain_list *)0; ++ ScanOrder = ScanOrder->NEXT ) ++ { ++ Element = searchauthelem( HahsRin, (char *)ScanOrder->DATA ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ BehRin = (berin_list *)Element->VALUE; ++ SetBoomBehRinOrder( BehRin ); ++ ++ BddIndex = BddLocalCircuit->NUMBER_NAME_IN + BDD_INDEX_MIN; ++ addbddcircuitin( (bddcircuit *)0, BehRin->NAME, BddIndex, ++ BDD_IN_MODE_IMPOSE | BDD_IN_MODE_LAST ); ++ } ++ } ++ ++ destroyauthtable( HahsRin ); ++ ++ if ( OrderFlag ) ++ { ++ BehFigure->BERIN = (berin_list *)reverse( (chain_list *)BehFigure->BERIN ); ++ } ++ ++ for ( BehRin = BehFigure->BERIN; ++ BehRin != (berin_list *)0; ++ BehRin = BehRin->NEXT ) ++ { ++ if ( IsBoomBehRinOrder( BehRin ) ) continue; ++ ++ BddIndex = BddLocalCircuit->NUMBER_NAME_IN + BDD_INDEX_MIN; ++ addbddcircuitin( (bddcircuit *)0, BehRin->NAME, BddIndex, ++ BDD_IN_MODE_IMPOSE | BDD_IN_MODE_LAST ); ++ } ++ ++ if ( OrderFlag ) ++ { ++ BehFigure->BERIN = (berin_list *)reverse( (chain_list *)BehFigure->BERIN ); ++ } ++ ++ if ( DontCareFlag ) ++ { ++ FigInfo->BDD_DONT_CARE = addbddcircuitin( (bddcircuit *)0, ++ ABL_ATOM_NAME_DC, 0, BDD_IN_MODE_LAST ); ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_order.h alliance/boom/src/boom_order.h +--- alliance-5.0/boo/src/boom_order.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_order.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,71 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_order.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_ORDER_H ++# define BOOM_ORDER_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehMakeBddOrder(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_param.c alliance/boom/src/boom_param.c +--- alliance-5.0/boo/src/boom_param.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_param.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,592 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_param.c | ++| | ++| Author : Ludovic Jacomme | ++| | ++| Date : 03/07/2000 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_shared.h" ++# include "boom_debug.h" ++# include "boom_param.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static authtable *BoomHashAux = (authtable *)0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomParseSetExprKeepAux | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomParseSetExprKeepAux( Expr ) ++ ++ ablexpr *Expr; ++{ ++ char *Value; ++ beaux_list *BehAux; ++ authelem *Element; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Value = ABL_ATOM_VALUE( Expr ); ++ ++ if ( ( Value != ABL_ATOM_NAME_ONE ) && ++ ( Value != ABL_ATOM_NAME_ZERO ) && ++ ( Value != ABL_ATOM_NAME_DC ) && ++ ( Value != ABL_ATOM_NAME_TRISTATE ) ) ++ { ++ Element = searchauthelem( BoomHashAux, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ BehAux = (beaux_list *)Element->VALUE; ++ SetBoomBehAuxKeep( BehAux ); ++ } ++ } ++ } ++ ++ while ( ( Expr = ABL_CDR( Expr ) ) != (ablexpr *)0 ) ++ { ++ BoomParseSetExprKeepAux( ABL_CAR( Expr ) ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomParseSetBiAblKeepAux | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomParseSetBiAblKeepAux( BiAbl ) ++ ++ biabl_list *BiAbl; ++{ ++ while ( BiAbl != (biabl_list *)0 ) ++ { ++ if ( BiAbl->CNDABL != (ablexpr *)0 ) ++ { ++ BoomParseSetExprKeepAux( BiAbl->CNDABL ); ++ } ++ ++ if ( BiAbl->VALABL != (ablexpr *)0 ) ++ { ++ BoomParseSetExprKeepAux( BiAbl->VALABL ); ++ } ++ ++ BiAbl = BiAbl->NEXT; ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomParseCheckParam | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomParseCheckParam( BehFigure, FileName ) ++ ++ befig_list *BehFigure; ++ char *FileName; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ bereg_list *BehReg; ++ beout_list *BehOut; ++ bebux_list *BehBux; ++ bebus_list *BehBus; ++ berin_list *BehRin; ++ chain_list **PrevChain; ++ chain_list *ScanChain; ++ chain_list *DelChain; ++ authtable *HashOut; ++ authtable *HashReg; ++ authtable *HashBux; ++ authtable *HashBus; ++ authtable *HashRin; ++ authelem *Element; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ BoomHashAux = createauthtable( 100 ); ++ ++ HashOut = createauthtable( 100 ); ++ HashReg = createauthtable( 100 ); ++ HashBux = createauthtable( 100 ); ++ HashBus = createauthtable( 100 ); ++ HashRin = createauthtable( 100 ); ++ ++ for ( BehRin = BehFigure->BERIN; ++ BehRin != (berin_list *)0; ++ BehRin = BehRin->NEXT ) ++ { ++ addauthelem( HashRin, BehRin->NAME, (long)BehRin ); ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ addauthelem( BoomHashAux, BehAux->NAME, (long)BehAux ); ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ addauthelem( HashOut, BehOut->NAME, (long)BehOut ); ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ addauthelem( HashReg, BehReg->NAME, (long)BehReg ); ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ addauthelem( HashBux, BehBux->NAME, (long)BehBux ); ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ addauthelem( HashBus, BehBus->NAME, (long)BehBus ); ++ } ++ ++ PrevChain = &FigInfo->KEEP_LIST; ++ ScanChain = FigInfo->KEEP_LIST; ++ ++ while ( ScanChain != (chain_list *)0 ) ++ { ++ Element = searchauthelem( BoomHashAux, (char *)ScanChain->DATA ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ PrevChain = &ScanChain->NEXT; ++ ScanChain = ScanChain->NEXT; ++ ++ BehAux = (beaux_list *)Element->VALUE; ++ SetBoomBehAuxKeep( BehAux ); ++ ++ fprintf( stderr, "\t keep signal '%s'\n", BehAux->NAME ); ++ } ++ else ++ { ++ fprintf( stderr, "\t### unknown signal '%s' in parameter file %s.boom\n", ++ (char *)ScanChain->DATA, FileName ); ++ ++ *PrevChain = ScanChain->NEXT; ++ DelChain = ScanChain; ++ ScanChain = ScanChain->NEXT; ++ ++ DelChain->NEXT = (chain_list *)0; ++ freechain( DelChain ); ++ } ++ } ++ ++ PrevChain = &FigInfo->DONT_TOUCH_LIST; ++ ScanChain = FigInfo->DONT_TOUCH_LIST; ++ ++ while ( ScanChain != (chain_list *)0 ) ++ { ++ Element = searchauthelem( BoomHashAux, (char *)ScanChain->DATA ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ PrevChain = &ScanChain->NEXT; ++ ScanChain = ScanChain->NEXT; ++ ++ BehAux = (beaux_list *)Element->VALUE; ++ SetBoomBehAuxDontTouch( BehAux ); ++ SetBoomBehAuxKeep( BehAux ); ++ ++ BoomParseSetExprKeepAux( BehAux->ABL ); ++ ++ continue; ++ } ++ ++ Element = searchauthelem( HashOut, (char *)ScanChain->DATA ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ PrevChain = &ScanChain->NEXT; ++ ScanChain = ScanChain->NEXT; ++ ++ BehOut = (beout_list *)Element->VALUE; ++ SetBoomBehAuxDontTouch( BehOut ); ++ ++ BoomParseSetExprKeepAux( BehOut->ABL ); ++ ++ continue; ++ } ++ ++ Element = searchauthelem( HashReg, (char *)ScanChain->DATA ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ PrevChain = &ScanChain->NEXT; ++ ScanChain = ScanChain->NEXT; ++ ++ BehReg = (bereg_list *)Element->VALUE; ++ SetBoomBehAuxDontTouch( BehReg ); ++ ++ BoomParseSetBiAblKeepAux( BehReg->BIABL ); ++ ++ continue; ++ } ++ ++ Element = searchauthelem( HashBus, (char *)ScanChain->DATA ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ PrevChain = &ScanChain->NEXT; ++ ScanChain = ScanChain->NEXT; ++ ++ BehBus = (bebus_list *)Element->VALUE; ++ SetBoomBehAuxDontTouch( BehBus ); ++ ++ BoomParseSetBiAblKeepAux( BehBus->BIABL ); ++ ++ continue; ++ } ++ ++ Element = searchauthelem( HashBux, (char *)ScanChain->DATA ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ PrevChain = &ScanChain->NEXT; ++ ScanChain = ScanChain->NEXT; ++ ++ BehBux = (bebux_list *)Element->VALUE; ++ SetBoomBehAuxDontTouch( BehBux ); ++ ++ BoomParseSetBiAblKeepAux( BehBux->BIABL ); ++ ++ continue; ++ } ++ ++ if ( Element == (authelem *)0 ) ++ { ++ fprintf( stderr, "\t### unknown signal '%s' in parameter file %s.boom\n", ++ (char *)ScanChain->DATA, FileName ); ++ ++ *PrevChain = ScanChain->NEXT; ++ DelChain = ScanChain; ++ ScanChain = ScanChain->NEXT; ++ ++ DelChain->NEXT = (chain_list *)0; ++ freechain( DelChain ); ++ } ++ } ++ ++ FigInfo->BDD_ORDER_LIST = reverse( FigInfo->BDD_ORDER_LIST ); ++ ++ PrevChain = &FigInfo->BDD_ORDER_LIST; ++ ScanChain = FigInfo->BDD_ORDER_LIST; ++ ++ while ( ScanChain != (chain_list *)0 ) ++ { ++ Element = searchauthelem( HashRin, (char *)ScanChain->DATA ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ PrevChain = &ScanChain->NEXT; ++ ScanChain = ScanChain->NEXT; ++ ++ BehRin = (berin_list *)Element->VALUE; ++ SetBoomBehRinOrder( BehRin ); ++ ++ fprintf( stderr, "\t order input/signal/register '%s'\n", BehRin->NAME ); ++ } ++ else ++ { ++ fprintf( stderr, "\t### unknown signal '%s' in parameter file %s.boom\n", ++ (char *)ScanChain->DATA, FileName ); ++ ++ *PrevChain = ScanChain->NEXT; ++ DelChain = ScanChain; ++ ScanChain = ScanChain->NEXT; ++ ++ DelChain->NEXT = (chain_list *)0; ++ freechain( DelChain ); ++ } ++ } ++ ++ destroyauthtable( HashReg ); ++ destroyauthtable( HashOut ); ++ destroyauthtable( HashBus ); ++ destroyauthtable( HashBux ); ++ destroyauthtable( HashRin ); ++ ++ destroyauthtable( BoomHashAux ); ++ BoomHashAux = (authtable *)0; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomParseParamFile | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomParseGetWord | ++| | ++\------------------------------------------------------------*/ ++ ++static char *BoomParseGetWord( Buffer ) ++ ++ char *Buffer; ++{ ++ char *String; ++ ++ if ( ( String = (char *)strtok( Buffer, " =,\t\n" ) ) != (char *)0 ) ++ { ++ String = namealloc( String ); ++ } ++ ++ return( String ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomParseParamFile | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomParseParamFile( BehFigure, FileName ) ++ ++ befig_list *BehFigure; ++ char *FileName; ++{ ++ boombefiginfo *FigInfo; ++ chain_list **PrevChain; ++ char *FirstWord; ++ char *Scan; ++ char *Pointer; ++ char *RegisterName; ++ int Left; ++ int Right; ++ int Step; ++ int Index; ++ int CurrentDef; ++ long LineNumber; ++ FILE *ParamFile; ++ char ParamBuffer[ 512 ]; ++ char Buffer[ 128 ]; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ FileName = autbasename( FileName, "boom" ); ++ ParamFile = mbkfopen( FileName, "boom", "r" ); ++ ++ if ( ParamFile == (FILE *)0 ) ++ { ++ fprintf( stderr, "\t### Unable to parse parameter file %s.boom\n", FileName ); ++ autexit( 1 ); ++ } ++ ++ LineNumber = 0; ++ CurrentDef = BOOM_PARAM_NONE; ++ ++ while ( fgets( ParamBuffer, 512, ParamFile ) != (char *)0 ) ++ { ++ LineNumber++; ++ ++ if ( ParamBuffer[ 0 ] == '#' ) continue; ++ ++ FirstWord = BoomParseGetWord( ParamBuffer ); ++ ++ if ( FirstWord == (char *)0 ) continue; ++ ++ if ( ! strncmp( FirstWord, "end", 3 ) ) CurrentDef = BOOM_PARAM_NONE; ++ else ++ if ( CurrentDef != BOOM_PARAM_NONE ) ++ { ++ /* ++ if ( CurrentDef == BOOM_PARAM_CLOCK ) ++ { ++ SecondWord = BoomParseGetWord( (char *)0 ); ++ ++ if ( SecondWord == (char *)0 ) ++ { ++ fprintf( stderr, "Syntax error line %ld in parameter file %s.boom\n", ++ LineNumber, FileName ); ++ autexit( 1 ); ++ } ++ } ++ else ++ */ ++ if ( ( CurrentDef == BOOM_PARAM_KEEP_AUX ) || ++ ( CurrentDef == BOOM_PARAM_DONT_TOUCH_AUX ) || ++ ( CurrentDef == BOOM_PARAM_BDD_ORDER ) ) ++ { ++ if ( CurrentDef == BOOM_PARAM_KEEP_AUX ) PrevChain = &FigInfo->KEEP_LIST; ++ else ++ if ( CurrentDef == BOOM_PARAM_BDD_ORDER ) PrevChain = &FigInfo->BDD_ORDER_LIST; ++ else ++ PrevChain = &FigInfo->DONT_TOUCH_LIST; ++ do ++ { ++ Scan = strchr( FirstWord, '[' ); ++ if ( Scan == NULL ) Scan = strchr( FirstWord, '(' ); ++ ++ if ( Scan != NULL ) ++ { ++ strcpy( Buffer, FirstWord ); ++ Scan = Buffer; ++ ++ Pointer = strchr( Scan, '[' ); ++ if ( Pointer == NULL ) Pointer = strchr( Scan, '(' ); ++ *Pointer = '\0'; ++ ++ RegisterName = namealloc( Buffer ); ++ Scan = Pointer + 1; ++ ++ Pointer = strchr( Scan, ':' ); ++ ++ if ( Pointer != (char *)0 ) ++ { ++ *Pointer = '\0'; ++ Left = atoi( Scan ); ++ Scan = Pointer + 1; ++ ++ Pointer = strchr( Scan, ']' ); ++ if ( Pointer == (char *)0 ) Pointer = strchr( Scan, ')' ); ++ ++ if ( Pointer == (char *)0 ) ++ { ++ fprintf( stderr, "\t### Syntax error line %ld in parameter file %s.boom\n", ++ LineNumber, FileName ); ++ autexit(1); ++ } ++ ++ *Pointer = '\0'; ++ Right = atoi( Scan ); ++ } ++ else ++ { ++ Left = atoi( Scan ); ++ Right = Left; ++ } ++ ++ if ( Left < Right ) Step = -1; ++ else Step = 1; ++ ++ for ( Index = Right; Index != (Left + Step) ; Index += Step ) ++ { ++ sprintf( Buffer, "%s %d", RegisterName, Index ); ++ *PrevChain = addchain( *PrevChain, namealloc( Buffer ) ); ++ } ++ } ++ else ++ { ++ *PrevChain = addchain( *PrevChain, FirstWord ); ++ } ++ } while ( ( FirstWord = BoomParseGetWord( NULL ) ) != NULL ); ++ } ++ else ++ { ++ fprintf( stderr, "Syntax error line %ld in parameter file %s.boom\n", ++ LineNumber, FileName ); ++ autexit( 1 ); ++ } ++ } ++ else ++ if ( ! strcmp( FirstWord, "begin_keep" ) ) ++ { ++ CurrentDef = BOOM_PARAM_KEEP_AUX; ++ } ++ else ++ if ( ! strcmp( FirstWord, "begin_dont_touch" ) ) ++ { ++ CurrentDef = BOOM_PARAM_DONT_TOUCH_AUX; ++ } ++ else ++ if ( ! strcmp( FirstWord, "begin_bdd_order" ) ) ++ { ++ CurrentDef = BOOM_PARAM_BDD_ORDER; ++ } ++ else ++ { ++ fprintf( stderr, "Syntax error line %ld in parameter file %s.boom\n", ++ LineNumber, FileName ); ++ autexit( 1 ); ++ } ++ } ++ ++ fclose( ParamFile ); ++ ++ BoomParseCheckParam( BehFigure, FileName ); ++} +diff -Naur alliance-5.0/boo/src/boom_param.h alliance/boom/src/boom_param.h +--- alliance-5.0/boo/src/boom_param.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_param.h 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,76 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_param.h | ++| | ++| Author : Ludovic Jacomme | ++| | ++| Date : 03/07/2000 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_PARAM_H ++# define BOOM_PARAM_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_PARAM_NONE 0 ++# define BOOM_PARAM_KEEP_AUX 1 ++# define BOOM_PARAM_DONT_TOUCH_AUX 2 ++# define BOOM_PARAM_BDD_ORDER 3 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomParseParamFile(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_parse.c alliance/boom/src/boom_parse.c +--- alliance-5.0/boo/src/boom_parse.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_parse.c 2002-09-30 18:20:00.000000000 +0200 +@@ -0,0 +1,150 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_parse.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_parse.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_abl.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomParseBehFigure | ++| | ++\------------------------------------------------------------*/ ++ ++befig_list *BoomParseBehFigure( FileName ) ++ ++ char *FileName; ++{ ++ befig_list *BehFigure; ++ beaux_list *BehAux; ++ beout_list *BehOut; ++ bereg_list *BehReg; ++ bebux_list *BehBux; ++ bebus_list *BehBus; ++ ++ BehFigure = vhdlloadbefig( (befig_list *)0, FileName, 2 ); ++ ++ if ( BehFigure->ERRFLG ) ++ { ++ fprintf( stderr, "\t### Unable to compile file %s.vbe\n", FileName ); ++ autexit( 1 ); ++ } ++ ++ BoomAddBehFigInfo( BehFigure ); ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ BoomAddBehAuxInfo( BehAux ); ++ } ++ ++ for ( BehBux = BehFigure->BEBUX; ++ BehBux != (bebux_list *)0; ++ BehBux = BehBux->NEXT ) ++ { ++ BoomAddBehBuxInfo( BehBux ); ++ } ++ ++ for ( BehBus = BehFigure->BEBUS; ++ BehBus != (bebus_list *)0; ++ BehBus = BehBus->NEXT ) ++ { ++ BoomAddBehBusInfo( BehBus ); ++ } ++ ++ for ( BehOut = BehFigure->BEOUT; ++ BehOut != (beout_list *)0; ++ BehOut = BehOut->NEXT ) ++ { ++ BoomAddBehOutInfo( BehOut ); ++ } ++ ++ for ( BehReg = BehFigure->BEREG; ++ BehReg != (bereg_list *)0; ++ BehReg = BehReg->NEXT ) ++ { ++ BoomAddBehRegInfo( BehReg ); ++ } ++ ++ beh_frebeaux( BehFigure->BEDLY ); ++ BehFigure->BEDLY = (beaux_list *)0; ++ ++ BoomBehMapAbl( BehFigure, simpablexpr, 1 ); ++ ++ return( BehFigure ); ++} +diff -Naur alliance-5.0/boo/src/boom_parse.h alliance/boom/src/boom_parse.h +--- alliance-5.0/boo/src/boom_parse.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_parse.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,71 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_parse.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_PARSE_H ++# define BOOM_PARSE_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern befig_list *BoomParseBehFigure(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_post.c alliance/boom/src/boom_post.c +--- alliance-5.0/boo/src/boom_post.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_post.c 2006-03-29 19:10:07.000000000 +0200 +@@ -0,0 +1,160 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_post.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_abl.h" ++# include "boom_post.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static authtable *BoomHashRename = (authtable *)0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomRenameAuxVectorAbl | ++| | ++\------------------------------------------------------------*/ ++ ++static void BoomRenameAuxVectorAbl( Expr ) ++ ++ ablexpr *Expr; ++{ ++ authelem *Element; ++ char *Value; ++ ++ if ( ABL_ATOM( Expr ) ) ++ { ++ Value = ABL_ATOM_VALUE( Expr ); ++ ++ if ( ( Value != ABL_ATOM_NAME_ONE ) && ++ ( Value != ABL_ATOM_NAME_ZERO ) && ++ ( Value != ABL_ATOM_NAME_DC ) && ++ ( Value != ABL_ATOM_NAME_TRISTATE ) ) ++ { ++ Element = searchauthelem( BoomHashRename, Value ); ++ ++ if ( Element != (authelem *)0 ) ++ { ++ ABL_CAR_L( Expr ) = (char *)Element->VALUE; ++ } ++ } ++ ++ return; ++ } ++ ++ while ( ( Expr = ABL_CDR( Expr ) ) != (ablexpr *)0 ) ++ { ++ BoomRenameAuxVectorAbl( ABL_CAR( Expr ) ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomPostTreatBehFigure | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomPostTreatBehFigure( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ char Buffer[ 512 ]; ++ char *Scan; ++ ++ if ( BoomHashRename == (authtable *)0 ) ++ { ++ BoomHashRename = createauthtable( 100 ); ++ } ++ ++ for ( BehAux = BehFigure->BEAUX; ++ BehAux != (beaux_list *)0; ++ BehAux = BehAux->NEXT ) ++ { ++ if ( strchr( BehAux->NAME, ' ' ) != (char *)0 ) ++ { ++ strcpy( Buffer, BehAux->NAME ); ++ Scan = strchr( Buffer, ' ' ); ++ *Scan = '_'; ++ ++ Scan = namealloc( Buffer ); ++ addauthelem( BoomHashRename, BehAux->NAME, (long)Scan ); ++ BehAux->NAME = Scan; ++ } ++ } ++ ++ BoomBehScanAbl( BehFigure, BoomRenameAuxVectorAbl, 1 ); ++ ++ resetauthtable( BoomHashRename ); ++} +diff -Naur alliance-5.0/boo/src/boom_post.h alliance/boom/src/boom_post.h +--- alliance-5.0/boo/src/boom_post.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_post.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,71 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_post.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_POST_H ++# define BOOM_POST_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomPostTreatBehFigure(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_procrast.c alliance/boom/src/boom_procrast.c +--- alliance-5.0/boo/src/boom_procrast.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_procrast.c 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,258 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_procrast.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++ ++# include "boom_window.h" ++# include "boom_procrast.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeProcrast | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeProcrast( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ boombefiginfo *FigInfo; ++ bddvar NumberChild; ++ bddvar ChildTo; ++ bddvar ChildFrom; ++ long Cost; ++ long NewCost; ++ long NumberNode; ++ long NewNumberNode; ++ long LastNewNumberNode; ++ long Iteration; ++ long MaxIteration; ++ int Level; ++ long MaxNode; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ Level = FigInfo->OPTIM_LEVEL; ++ ++ if ( MaxIteration <= 0 ) MaxIteration = 2; ++ ++ MaxIteration = MaxIteration * (Level + 1); ++ ++ NumberChild = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ NumberNode = BoomBehGetNumberBigBddNode( BehFigure ); ++ ++ MaxNode = ( BddLocalSystem->NUMBER_NODE * 120 ) / 100; ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld %ld\n", Cost, NumberNode ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Iteration %ld\n", Iteration ); ++ } ++ ++ ChildFrom = 0; ++ ++ for ( ChildFrom = 0; ChildFrom < (NumberChild - 1); ChildFrom++ ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> ChildFrom %d\n", ChildFrom ); ++ } ++ ++ for ( ChildTo = ChildFrom; ChildTo < ( NumberChild - 1 ); ChildTo++ ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> Swap %d and %d\n", ChildTo, ChildTo + 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, ChildTo ); ++ ++ /* ++ NewNumberNode = BoomBehGetNumberBigBddNode( BehFigure ); ++ ++ BoomPrintf( stdout, "NewNumberNode: %ld\n", NewNumberNode ); ++ */ ++ ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ garbagebddsystem( BddLocalSystem ); ++ } ++ ++ if ( BddLocalSystem->NUMBER_NODE >= MaxNode ) ++ { ++ BoomPrintf( stdout, "@@@@ Max nodes %ld reached %ld\n", ++ MaxNode, BddLocalSystem->NUMBER_NODE ); ++ break; ++ } ++ } ++ ++ NewNumberNode = BoomBehGetNumberBigBddNode( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewNumberNode: %ld\n", NewNumberNode ); ++ } ++ ++ /* ++ if ( NewNumberNode <= NumberNode ) ++ */ ++ if ( ( NewNumberNode != NumberNode ) && ++ ( NewNumberNode != LastNewNumberNode ) && ++ ( NewNumberNode <= ( NumberNode * 105 ) / 100 ) ) ++ { ++ if ( NewNumberNode < NumberNode ) NumberNode = NewNumberNode; ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld %ld\n", NewCost, NumberNode ); ++ } ++ } ++ else ++ { ++ NewCost = Cost + 1; ++ } ++ ++ LastNewNumberNode = NewNumberNode; ++ ++ if ( NewCost > Cost ) ++ { ++ while ( ChildTo > ChildFrom ) ++ { ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> UnSwap %d and %d\n", ChildTo, ChildTo - 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, ChildTo - 1 ); ++ ++ ChildTo = ChildTo - 1; ++ } ++ } ++ else ++ { ++ Cost = NewCost; ++ } ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-3ld\b\b\b", ( ( Iteration + 1 ) * 100 ) / MaxIteration ); ++ fflush( stdout ); ++ } ++ } ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ +diff -Naur alliance-5.0/boo/src/boom_procrast.h alliance/boom/src/boom_procrast.h +--- alliance-5.0/boo/src/boom_procrast.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_procrast.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,71 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_procrast.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_PROCRAST_H ++# define BOOM_PROCRAST_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeProcrast(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_random.c alliance/boom/src/boom_random.c +--- alliance-5.0/boo/src/boom_random.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_random.c 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,249 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_random.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++ ++# include "boom_window.h" ++# include "boom_random.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeRandom | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeRandom( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ long MaxIteration; ++ bddvar NumberVar; ++ bddvar BddVar; ++ int Iteration; ++ long Cost; ++ ++ static unsigned char InitOptimizeRandom = 1; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ ++ if ( InitOptimizeRandom ) ++ { ++ srand( getpid() ); ++ InitOptimizeRandom = 0; ++ } ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld, NumberVar %d\n", Cost, NumberVar ); ++ } ++ ++ if ( MaxIteration <= 0 ) MaxIteration = NumberVar; ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ BddVar = (rand() >> 8) % (NumberVar - 1); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Swap %d\n", BddVar ); ++ } ++ ++ BoomBehReorderWindow2( BehFigure, BehAux, BddVar, &Cost ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "New cost %ld\n", Cost ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-3ld\b\b\b", ( ( Iteration + 1 ) * 100 ) / MaxIteration ); ++ fflush( stdout ); ++ } ++ } ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ ++# if 0 ++void BoomBehOptimizeRandom( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ long MaxIteration; ++ bddvar NumberVar; ++ bddvar BddVar; ++ int Iteration; ++ int Amplitude; ++ int Swap; ++ long Cost; ++ ++ static unsigned char InitOptimizeRandom = 1; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ ++ if ( InitOptimizeRandom ) ++ { ++ srand( getpid() ); ++ InitOptimizeRandom = 0; ++ } ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ /* ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ */ ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld, NumberVar %d\n", Cost, NumberVar ); ++ } ++ ++ /* ++ if ( MaxIteration <= 0 ) MaxIteration = NumberVar; ++ */ ++ MaxIteration = 1 + ( ( NumberVar + 2 ) / 2 ); ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ if ( Iteration != 0 ) ++ { ++ BoomBehMakeBddNode( BehFigure, 0 ); ++ } ++ ++ for ( BddVar = 0; BddVar < ( NumberVar - 1 ); BddVar++ ) ++ { ++ Amplitude = (rand() >> 8) % 8; ++ ++ for ( Swap = 0; Swap < Amplitude; Swap++ ) ++ { ++ if ( ( BddVar + Swap ) >= ( NumberVar - 1 ) ) break; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "-> Swap %d and %d\n", BddVar + Swap, BddVar + Swap + 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar + Swap ); ++ } ++ } ++ ++ BoomOptimizeProcrast( BehFigure ); ++ } ++ ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++# endif ++ +diff -Naur alliance-5.0/boo/src/boom_random.h alliance/boom/src/boom_random.h +--- alliance-5.0/boo/src/boom_random.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_random.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,70 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_random.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_RANDOM_H ++# define BOOM_RANDOM_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeRandom(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_shared.c alliance/boom/src/boom_shared.c +--- alliance-5.0/boo/src/boom_shared.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_shared.c 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,509 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_shared.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include "boom_error.h" ++# include "boom_shared.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ int BoomFlagDebug = 0; ++ int BoomFlagOption = 0; ++ ++ char *BoomOptimAlgorithmName[ BOOM_MAX_OPTIM_ALGORITHM ] = ++ { ++ "top bdd reorder", ++ "window bdd reorder", ++ "simple bdd reorder", ++ "one pass", ++ "random bdd reorder", ++ "procrastination", ++ "Luc Burgun", ++ "no optimization algorithm", ++ "gradient", ++ "just do it", ++ "simulated annealing" ++ }; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomAddBehAuxInfo | ++| | ++\------------------------------------------------------------*/ ++ ++boombeauxinfo *BoomAddBehAuxInfo( BehAux ) ++ ++ beaux_list *BehAux; ++{ ++ boombeauxinfo *AuxInfo; ++ ++ AuxInfo = (boombeauxinfo *)autallocheap( sizeof( boombeauxinfo ) ); ++ ++ SetBoomBehAuxInfo( BehAux, AuxInfo ); ++ ++ return( AuxInfo ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDelBehAuxInfo | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDelBehAuxInfo( BehAux ) ++ ++ beaux_list *BehAux; ++{ ++ boombeauxinfo *AuxInfo; ++ ++ AuxInfo = GetBoomBehAuxInfo( BehAux ); ++ ++ if ( AuxInfo != (boombeauxinfo *)0 ) ++ { ++ autfreeheap( AuxInfo, sizeof( boombeauxinfo ) ); ++ SetBoomBehAuxInfo( BehAux, NULL ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehFreeBehAux | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehFreeBehAux( BehAux ) ++ ++ beaux_list *BehAux; ++{ ++ beaux_list *ScanBehAux; ++ ++ for ( ScanBehAux = BehAux; ++ ScanBehAux != (beaux_list *)0; ++ ScanBehAux = ScanBehAux->NEXT ) ++ { ++ BoomDelBehAuxInfo( ScanBehAux ); ++ } ++ ++ beh_frebeaux( BehAux ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomAddBehOutInfo | ++| | ++\------------------------------------------------------------*/ ++ ++boombeoutinfo *BoomAddBehOutInfo( BehOut ) ++ ++ beout_list *BehOut; ++{ ++ boombeoutinfo *OutInfo; ++ ++ OutInfo = (boombeoutinfo *)autallocheap( sizeof( boombeoutinfo ) ); ++ ++ SetBoomBehOutInfo( BehOut, OutInfo ); ++ ++ return( OutInfo ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDelBehOutInfo | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDelBehOutInfo( BehOut ) ++ ++ beout_list *BehOut; ++{ ++ boombeoutinfo *OutInfo; ++ ++ OutInfo = GetBoomBehOutInfo( BehOut ); ++ ++ if ( OutInfo != (boombeoutinfo *)0 ) ++ { ++ autfreeheap( OutInfo, sizeof( boombeoutinfo ) ); ++ SetBoomBehOutInfo( BehOut, NULL ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehFreeBehOut | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehFreeBehOut( BehOut ) ++ ++ beout_list *BehOut; ++{ ++ beout_list *ScanBehOut; ++ ++ for ( ScanBehOut = BehOut; ++ ScanBehOut != (beout_list *)0; ++ ScanBehOut = ScanBehOut->NEXT ) ++ { ++ BoomDelBehOutInfo( ScanBehOut ); ++ } ++ ++ beh_frebeout( BehOut ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomAddBehRegInfo | ++| | ++\------------------------------------------------------------*/ ++ ++boombereginfo *BoomAddBehRegInfo( BehReg ) ++ ++ bereg_list *BehReg; ++{ ++ boombereginfo *RegInfo; ++ ++ RegInfo = (boombereginfo *)autallocheap( sizeof( boombereginfo ) ); ++ ++ SetBoomBehRegInfo( BehReg, RegInfo ); ++ ++ return( RegInfo ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDelBehRegInfo | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDelBehRegInfo( BehReg ) ++ ++ bereg_list *BehReg; ++{ ++ boombereginfo *RegInfo; ++ ++ RegInfo = GetBoomBehRegInfo( BehReg ); ++ ++ if ( RegInfo != (boombereginfo *)0 ) ++ { ++ autfreeheap( RegInfo, sizeof( boombereginfo ) ); ++ SetBoomBehRegInfo( BehReg, NULL ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehFreeBehReg | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehFreeBehReg( BehReg ) ++ ++ bereg_list *BehReg; ++{ ++ bereg_list *ScanBehReg; ++ ++ for ( ScanBehReg = BehReg; ++ ScanBehReg != (bereg_list *)0; ++ ScanBehReg = ScanBehReg->NEXT ) ++ { ++ BoomDelBehRegInfo( ScanBehReg ); ++ } ++ ++ beh_frebereg( BehReg ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomAddBehBusInfo | ++| | ++\------------------------------------------------------------*/ ++ ++boombebusinfo *BoomAddBehBusInfo( BehBus ) ++ ++ bebus_list *BehBus; ++{ ++ boombebusinfo *BusInfo; ++ ++ BusInfo = (boombebusinfo *)autallocheap( sizeof( boombebusinfo ) ); ++ ++ SetBoomBehBusInfo( BehBus, BusInfo ); ++ ++ return( BusInfo ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDelBehBusInfo | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDelBehBusInfo( BehBus ) ++ ++ bebus_list *BehBus; ++{ ++ boombebusinfo *BusInfo; ++ ++ BusInfo = GetBoomBehBusInfo( BehBus ); ++ ++ if ( BusInfo != (boombebusinfo *)0 ) ++ { ++ autfreeheap( BusInfo, sizeof( boombebusinfo ) ); ++ SetBoomBehBusInfo( BehBus, NULL ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehFreeBehBus | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehFreeBehBus( BehBus ) ++ ++ bebus_list *BehBus; ++{ ++ bebus_list *ScanBehBus; ++ ++ for ( ScanBehBus = BehBus; ++ ScanBehBus != (bebus_list *)0; ++ ScanBehBus = ScanBehBus->NEXT ) ++ { ++ BoomDelBehBusInfo( ScanBehBus ); ++ } ++ ++ beh_frebebus( BehBus ); ++} ++ ++ ++/*------------------------------------------------------------\ ++| | ++| BoomAddBehBuxInfo | ++| | ++\------------------------------------------------------------*/ ++ ++boombebuxinfo *BoomAddBehBuxInfo( BehBux ) ++ ++ bebux_list *BehBux; ++{ ++ boombebuxinfo *BuxInfo; ++ ++ BuxInfo = (boombebuxinfo *)autallocheap( sizeof( boombebuxinfo ) ); ++ ++ SetBoomBehBuxInfo( BehBux, BuxInfo ); ++ ++ return( BuxInfo ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDelBehBuxInfo | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDelBehBuxInfo( BehBux ) ++ ++ bebux_list *BehBux; ++{ ++ boombebuxinfo *BuxInfo; ++ ++ BuxInfo = GetBoomBehBuxInfo( BehBux ); ++ ++ if ( BuxInfo != (boombebuxinfo *)0 ) ++ { ++ autfreeheap( BuxInfo, sizeof( boombebuxinfo ) ); ++ SetBoomBehBuxInfo( BehBux, NULL ); ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehFreeBehBux | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehFreeBehBux( BehBux ) ++ ++ bebux_list *BehBux; ++{ ++ bebux_list *ScanBehBux; ++ ++ for ( ScanBehBux = BehBux; ++ ScanBehBux != (bebux_list *)0; ++ ScanBehBux = ScanBehBux->NEXT ) ++ { ++ BoomDelBehBuxInfo( ScanBehBux ); ++ } ++ ++ beh_frebebux( BehBux ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomAddBehFigInfo | ++| | ++\------------------------------------------------------------*/ ++ ++boombefiginfo *BoomAddBehFigInfo( BehFig ) ++ ++ befig_list *BehFig; ++{ ++ boombefiginfo *FigInfo; ++ ++ FigInfo = (boombefiginfo *)autallocheap( sizeof( boombefiginfo ) ); ++ ++ SetBoomBehFigInfo( BehFig, FigInfo ); ++ ++ return( FigInfo ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomDelBehFigInfo | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomDelBehFigInfo( BehFig ) ++ ++ befig_list *BehFig; ++{ ++ boombefiginfo *FigInfo; ++ ++ FigInfo = GetBoomBehFigInfo( BehFig ); ++ ++ if ( FigInfo != (boombefiginfo *)0 ) ++ { ++ freechain( FigInfo->KEEP_LIST ); ++ freechain( FigInfo->DONT_TOUCH_LIST ); ++ freechain( FigInfo->BDD_ORDER_LIST ); ++ ++ autfreeheap( FigInfo, sizeof( boombefiginfo ) ); ++ SetBoomBehFigInfo( BehFig, NULL ); ++ } ++} ++ ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehFreeBehFig | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehFreeBehFig( BehFig ) ++ ++ befig_list *BehFig; ++{ ++ BoomBehFreeBehReg( BehFig->BEREG ); ++ BoomBehFreeBehOut( BehFig->BEOUT ); ++ BoomBehFreeBehAux( BehFig->BEAUX ); ++ BoomBehFreeBehBus( BehFig->BEBUS ); ++ BoomBehFreeBehBux( BehFig->BEBUX ); ++ ++ BehFig->BEOUT = (beout_list *)0; ++ BehFig->BEREG = (bereg_list *)0; ++ BehFig->BEAUX = (beaux_list *)0; ++ BehFig->BEBUS = (bebus_list *)0; ++ BehFig->BEBUX = (bebux_list *)0; ++ ++ BoomDelBehFigInfo( BehFig ); ++ ++ BehFig->NEXT = (befig_list *)0; ++ beh_frebefig( BehFig ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomComputeLog2 | ++| | ++\------------------------------------------------------------*/ ++ ++long BoomComputeLog2( Value ) ++ ++ unsigned long Value; ++{ ++ unsigned long Mask; ++ unsigned long Log2; ++ ++ Mask = 1; ++ Log2 = 0; ++ ++ while ( Value != 0 ) ++ { ++ Value = Value >> 1; ++ ++ Log2++; ++ } ++ ++ if ( Log2 > 0 ) Log2--; ++ ++ return( Log2 ); ++} +diff -Naur alliance-5.0/boo/src/boom_shared.h alliance/boom/src/boom_shared.h +--- alliance-5.0/boo/src/boom_shared.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_shared.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,293 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : vasy_shared.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_SHARED_H ++# define BOOM_SHARED_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Aux Flags | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_AUX_KEEP_MASK 0x01 ++# define BOOM_AUX_DONT_TOUCH_MASK 0x02 ++# define BOOM_AUX_TAG_MASK 0x04 ++ ++/*------------------------------------------------------------\ ++| | ++| Rin Flags | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_RIN_ORDER_MASK 0x01 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Aux Flags | ++| | ++\------------------------------------------------------------*/ ++ ++# define IsBoomBehAuxTag( A ) ((A)->FLAGS & BOOM_AUX_TAG_MASK) ++# define SetBoomBehAuxTag( A ) ((A)->FLAGS |= BOOM_AUX_TAG_MASK) ++# define ClearBoomBehAuxTag( A ) ((A)->FLAGS &= ~BOOM_AUX_TAG_MASK) ++ ++# define IsBoomBehAuxKeep( A ) ((A)->FLAGS & BOOM_AUX_KEEP_MASK) ++# define SetBoomBehAuxKeep( A ) ((A)->FLAGS |= BOOM_AUX_KEEP_MASK) ++# define ClearBoomBehAuxKeep( A ) ((A)->FLAGS &= ~BOOM_AUX_KEEP_MASK) ++ ++# define IsBoomBehAuxDontTouch( A ) ((A)->FLAGS & BOOM_AUX_DONT_TOUCH_MASK) ++# define SetBoomBehAuxDontTouch( A ) ((A)->FLAGS |= BOOM_AUX_DONT_TOUCH_MASK) ++# define ClearBoomBehAuxDontTouch( A ) ((A)->FLAGS &= ~BOOM_AUX_DONT_TOUCH_MASK) ++ ++/*------------------------------------------------------------\ ++| | ++| Rin Flags | ++| | ++\------------------------------------------------------------*/ ++ ++# define IsBoomBehRinOrder( R ) ((R)->FLAGS & BOOM_RIN_ORDER_MASK) ++# define SetBoomBehRinOrder( R ) ((R)->FLAGS |= BOOM_RIN_ORDER_MASK) ++# define ClearBoomBehRinOrder( R ) ((R)->FLAGS &= ~BOOM_RIN_ORDER_MASK) ++ ++/*------------------------------------------------------------\ ++| | ++| Optimization Algorithm | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_OPTIM_ALGORITHM_TOP 0 ++# define BOOM_OPTIM_ALGORITHM_WINDOW 1 ++# define BOOM_OPTIM_ALGORITHM_SIMPLE 2 ++# define BOOM_OPTIM_ALGORITHM_ONE 3 ++# define BOOM_OPTIM_ALGORITHM_RANDOM 4 ++# define BOOM_OPTIM_ALGORITHM_PROCRAST 5 ++# define BOOM_OPTIM_ALGORITHM_BURGUN 6 ++# define BOOM_OPTIM_ALGORITHM_NOTHING 7 ++# define BOOM_OPTIM_ALGORITHM_GRADIENT 8 ++# define BOOM_OPTIM_ALGORITHM_SIMUL 9 ++# define BOOM_OPTIM_ALGORITHM_ANNEAL 10 ++ ++# define BOOM_MAX_OPTIM_ALGORITHM 11 ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Fig Info | ++| | ++\------------------------------------------------------------*/ ++ ++# define SetBoomBehFigInfo( F, I ) ((F)->USER = (void *)(I)) ++# define GetBoomBehFigInfo( F ) ((boombefiginfo *)(F)->USER) ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Aux Info | ++| | ++\------------------------------------------------------------*/ ++ ++# define SetBoomBehAuxInfo( A, I ) ((A)->USER = (void *)(I)) ++# define GetBoomBehAuxInfo( A ) ((boombeauxinfo *)(A)->USER) ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Out Info | ++| | ++\------------------------------------------------------------*/ ++ ++# define SetBoomBehOutInfo( A, I ) ((A)->USER = (void *)(I)) ++# define GetBoomBehOutInfo( A ) ((boombeoutinfo *)(A)->USER) ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Reg Info | ++| | ++\------------------------------------------------------------*/ ++ ++# define SetBoomBehRegInfo( A, I ) ((A)->USER = (void *)(I)) ++# define GetBoomBehRegInfo( A ) ((boombereginfo *)(A)->USER) ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Bus Info | ++| | ++\------------------------------------------------------------*/ ++ ++# define SetBoomBehBusInfo( A, I ) ((A)->USER = (void *)(I)) ++# define GetBoomBehBusInfo( A ) ((boombebusinfo *)(A)->USER) ++ ++/*------------------------------------------------------------\ ++| | ++| Beh Bux Info | ++| | ++\------------------------------------------------------------*/ ++ ++# define SetBoomBehBuxInfo( A, I ) ((A)->USER = (void *)(I)) ++# define GetBoomBehBuxInfo( A ) ((boombebuxinfo *)(A)->USER) ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++ ++ typedef struct boombeauxinfo ++ { ++ long DELAY_COST; ++ long DEPTH_COST; ++ long SURFACE_COST; ++ long LITERAL_COST; ++ ++ } boombeauxinfo; ++ ++ typedef struct boombeoutinfo ++ { ++ long DELAY_COST; ++ long DEPTH_COST; ++ long SURFACE_COST; ++ long LITERAL_COST; ++ ++ } boombeoutinfo; ++ ++ typedef struct boombereginfo ++ { ++ long DELAY_COST; ++ long DEPTH_COST; ++ long SURFACE_COST; ++ long LITERAL_COST; ++ ++ } boombereginfo; ++ ++ typedef struct boombebusinfo ++ { ++ long DELAY_COST; ++ long DEPTH_COST; ++ long SURFACE_COST; ++ long LITERAL_COST; ++ ++ } boombebusinfo; ++ ++ typedef struct boombebuxinfo ++ { ++ long DELAY_COST; ++ long DEPTH_COST; ++ long SURFACE_COST; ++ long LITERAL_COST; ++ ++ } boombebuxinfo; ++ ++ typedef struct boombefiginfo ++ { ++ chain_list *KEEP_LIST; ++ chain_list *DONT_TOUCH_LIST; ++ chain_list *BDD_ORDER_LIST; ++ long SURFACE_COST; ++ long DEPTH_COST; ++ long LITERAL_COST; ++ long GLOBAL_COST; ++ long INITIAL_SURFACE_COST; ++ long INITIAL_LITERAL_COST; ++ long INITIAL_DEPTH_COST; ++ unsigned char OPTIM_ALGORITHM; ++ unsigned char OPTIM_LEVEL; ++ unsigned char OPTIM_DELAY_PERCENT; ++ unsigned char KEEP_AUX; ++ unsigned char INIT_BDD_ORDER; ++ unsigned char VERBOSE; ++ unsigned char TRACE; ++ unsigned char USE_LITERAL; ++ unsigned char DONT_CARE; ++ bddnode *BDD_DONT_CARE; ++ int ITERATION; ++ int AMPLITUDE; ++ ++ } boombefiginfo; ++ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern int BoomFlagOption; ++ extern int BoomFlagDebug; ++ extern char *BoomOptimAlgorithmName[ BOOM_MAX_OPTIM_ALGORITHM ]; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern boombeauxinfo *BoomAddBehAuxInfo(); ++ extern void BoomDelBehAuxInfo(); ++ extern void BoomBehFreeBehAux(); ++ ++ extern boombebuxinfo *BoomAddBehBuxInfo(); ++ extern void BoomDelBehBuxInfo(); ++ extern void BoomBehFreeBehBux(); ++ ++ extern boombebusinfo *BoomAddBehBusInfo(); ++ extern void BoomDelBehBusInfo(); ++ extern void BoomBehFreeBehBus(); ++ ++ extern boombeoutinfo *BoomAddBehOutInfo(); ++ extern void BoomDelBehOutInfo(); ++ extern void BoomBehFreeBehOut(); ++ ++ extern boombereginfo *BoomAddBehRegInfo(); ++ extern void BoomDelBehRegInfo(); ++ extern void BoomBehFreeBehReg(); ++ ++ extern boombefiginfo *BoomAddBehFigInfo(); ++ extern void BoomDelBehFigInfo(); ++ extern void BoomBehFreeBehFig(); ++ ++ extern long BoomComputeLog2(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_simple.c alliance/boom/src/boom_simple.c +--- alliance-5.0/boo/src/boom_simple.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_simple.c 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,156 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_simple.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++ ++# include "boom_window.h" ++# include "boom_simple.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeSimple | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeSimple( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ bddvar NumberVar; ++ bddvar BddVar; ++ long Cost; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ NumberVar = BddLocalSystem->NUMBER_VAR; ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ for ( BddVar = 0; BddVar < NumberVar - 1; BddVar++ ) ++ { ++ if ( BddVar < NumberVar - 2 ) ++ { ++ BoomBehReorderWindow3( BehFigure, BehAux, BddVar, &Cost ); ++ } ++ else ++ { ++ BoomBehReorderWindow2( BehFigure, BehAux, BddVar, &Cost ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "New cost %ld\n", Cost ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-3d\b\b\b", ( ( BddVar + 1 ) * 100 ) / ( NumberVar - 1 ) ); ++ fflush( stdout ); ++ } ++ } ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_simple.h alliance/boom/src/boom_simple.h +--- alliance-5.0/boo/src/boom_simple.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_simple.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,70 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_simple.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_SIMPLE_H ++# define BOOM_SIMPLE_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeSimple(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_simul.c alliance/boom/src/boom_simul.c +--- alliance-5.0/boo/src/boom_simul.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_simul.c 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,224 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_simul.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 08.08.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_optim.h" ++ ++# include "boom_gradient.h" ++# include "boom_simul.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeSimul | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeSimul( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ beaux_list *BehAux; ++ boombefiginfo *FigInfo; ++ long Cost; ++ long NewCost; ++ long Iteration; ++ long Amplitude; ++ long MaxIteration; ++ long MaxAmplitude; ++ chain_list *SimulOrder; ++ chain_list *NewOrder; ++ int Level; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ MaxIteration = FigInfo->ITERATION; ++ MaxAmplitude = FigInfo->AMPLITUDE; ++ Level = FigInfo->OPTIM_LEVEL; ++ ++ if ( MaxIteration <= 0 ) MaxIteration = 50; ++ if ( MaxAmplitude <= 0 ) MaxAmplitude = 1 + (BddLocalSystem->NUMBER_VAR / 4); ++ ++ MaxIteration = MaxIteration * (Level + 1); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Compute initial cost !\n" ); ++ } ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ /* ++ SimulOrder = BoomBehGetBddOrder( BehFigure ); ++ */ ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Compute initial order\n" ); ++ } ++ ++ if ( Level >= 1 ) ++ { ++ SimulOrder = BoomBehGradientBddOrder( BehFigure ); ++ } ++ else ++ { ++ SimulOrder = BoomBehGetBddOrder( BehFigure ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "done\n" ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ for ( Iteration = 0; Iteration < MaxIteration; Iteration++ ) ++ { ++ Amplitude = 1 + (long)( (double)MaxAmplitude * exp( - (double)Iteration / 5.0 ) ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Iteration %ld, Amplitude %ld\n", Iteration, Amplitude ); ++ } ++ ++ BoomBehRandomBddOrder( BehFigure, Amplitude ); ++ ++ NewOrder = BoomBehGetBddOrder( BehFigure ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ ++ freechain( SimulOrder ); ++ SimulOrder = NewOrder; ++ } ++ else ++ { ++ BoomBehRebuildBddNode( BehFigure, SimulOrder ); ++ freechain( NewOrder ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-3ld\b\b\b", ( ( Iteration + 1 ) * 100 ) / MaxIteration ); ++ fflush( stdout ); ++ } ++ } ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Simul cost : %ld\n", Cost ); ++ } ++ ++ BoomBehRebuildBddNode( BehFigure, SimulOrder ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_simul.h alliance/boom/src/boom_simul.h +--- alliance-5.0/boo/src/boom_simul.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_simul.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,74 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_simul.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_SIMUL_H ++# define BOOM_SIMUL_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_SIMUL_EXPLOSION_LIMIT 10000 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeSimul(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_top.c alliance/boom/src/boom_top.c +--- alliance-5.0/boo/src/boom_top.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_top.c 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,226 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_top.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_top.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeTop | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeTop( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ char *ReorderLevel; ++ bddvar NumberChild; ++ bddvar BestChild; ++ bddvar ChildCount; ++ bddvar ChildTo; ++ bddvar ChildFrom; ++ char SwapReorder; ++ long Cost; ++ long NewCost; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ NumberChild = BddLocalSystem->NUMBER_VAR; ++ ReorderLevel = (char *)autallocblock( sizeof( char ) * NumberChild ); ++ ++ for ( ChildFrom = 0; ChildFrom < ( NumberChild - 1 ); ChildFrom++ ) ++ { ++ ReorderLevel[ ChildFrom ] = 1; ++ } ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ ChildCount = ( NumberChild - 1 ); ++ ChildFrom = 0; ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ while ( ChildCount > 0 ) ++ { ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomPrintf( stdout, "-> ChildFrom %d\n", ChildFrom ); ++ } ++ ++ ReorderLevel[ ChildFrom ] = 0; ++ ++ BestChild = ChildFrom; ++ ++ for ( ChildTo = ChildFrom; ChildTo < ( NumberChild - 1 ); ChildTo++ ) ++ { ++ if ( IsBoomDebugLevel2() ) ++ { ++ BoomPrintf( stdout, "-> Swap %d and %d\n", ChildTo, ChildTo + 1 ); ++ } ++ ++ swapbddvar( (bddsystem *)0, ChildTo ); ++ ++ SwapReorder = ReorderLevel[ ChildTo ]; ++ ReorderLevel[ ChildTo ] = ReorderLevel[ ChildTo + 1 ]; ++ ReorderLevel[ ChildTo + 1 ] = SwapReorder; ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ BestChild = ChildTo + 1; Cost = NewCost; ++ } ++ } ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "--> Best child %d\n", BestChild ); ++ BoomPrintf( stdout, "--> Best cost %ld\n", Cost ); ++ } ++ ++ for ( ChildTo = ( NumberChild - 1 ); ChildTo > BestChild; ChildTo-- ) ++ { ++# ifdef BDD_DEBUG ++ if ( IsBoomDebugLevel1() ) ++ { ++fprintf( stdout, "-> UnSwap %d and %d\n", ChildTo - 1, ChildTo ); ++ } ++# endif ++ ++ SwapReorder = ReorderLevel[ ChildTo - 1 ]; ++ ReorderLevel[ ChildTo - 1 ] = ReorderLevel[ ChildTo ]; ++ ReorderLevel[ ChildTo ] = SwapReorder; ++ ++ swapbddvar( (bddsystem *)0, ChildTo - 1 ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-4d\b\b\b\b", ++ ( ( NumberChild - ChildCount ) * 100 ) / ( NumberChild - 1 ) ); ++ fflush( stdout ); ++ } ++ ++ while ( ! ReorderLevel[ ChildFrom ] ) ++ { ++ ChildFrom = ChildFrom + 1; ++ } ++ ++ ChildCount = ChildCount - 1; ++ } ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ autfreeblock( ReorderLevel ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} ++ +diff -Naur alliance-5.0/boo/src/boom_top.h alliance/boom/src/boom_top.h +--- alliance-5.0/boo/src/boom_top.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_top.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,70 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_top.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_TOP_H ++# define BOOM_TOP_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeTop(); ++ ++# endif +diff -Naur alliance-5.0/boo/src/boom_window.c alliance/boom/src/boom_window.c +--- alliance-5.0/boo/src/boom_window.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_window.c 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,385 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_window.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "abe.h" ++# include "abv.h" ++# include "abt.h" ++ ++# include ++# include ++# include ++ ++# include "boom_error.h" ++# include "boom_debug.h" ++# include "boom_shared.h" ++# include "boom_aux.h" ++# include "boom_abl.h" ++# include "boom_bdd.h" ++# include "boom_cost.h" ++# include "boom_window.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Boom Beh Reorder Window 2 | ++| | ++\------------------------------------------------------------*/ ++ ++int BoomBehReorderWindow2( BehFigure, BehAux, BddVar, PCost ) ++ ++ befig_list *BehFigure; ++ beaux_list *BehAux; ++ bddvar BddVar; ++ long *PCost; ++{ ++ long NewCost; ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( NewCost < *PCost ) ++ { ++ *PCost = NewCost; ++ ++ return( 1 ); ++ } ++ else ++ if ( NewCost == *PCost ) ++ { ++ return( 0 ); ++ } ++ ++ swapbddvar( BddLocalSystem, BddVar ); ++ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Boom Beh Reorder Window 3 | ++| | ++\------------------------------------------------------------*/ ++ ++int BoomBehReorderWindow3( BehFigure, BehAux, BddVar, PCost ) ++ ++ befig_list *BehFigure; ++ beaux_list *BehAux; ++ bddvar BddVar; ++ long *PCost; ++{ ++ long Cost; ++ long NewCost; ++ int BestOrder; ++ ++ BestOrder = BOOM_WINDOW_REORDER_123; ++ Cost = *PCost; ++ NewCost = Cost; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: Initial cost %ld\n", Cost ); ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_WINDOW_REORDER_213; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 213 new cost %ld\n", Cost ); ++ } ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_WINDOW_REORDER_231; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 231 new cost %ld\n", Cost ); ++ } ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_WINDOW_REORDER_321; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 321 new cost %ld\n", Cost ); ++ } ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_WINDOW_REORDER_312; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 312 new cost %ld\n", Cost ); ++ } ++ } ++ ++ swapbddvar( (bddsystem *)0, BddVar ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ NewCost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel0() ) ++ { ++ BoomPrintf( stdout, "NewCost: %ld\n", NewCost ); ++ } ++ ++ if ( NewCost < Cost ) ++ { ++ Cost = NewCost; ++ BestOrder = BOOM_WINDOW_REORDER_132; ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Window3: 132 new cost %ld\n", Cost ); ++ } ++ } ++ ++ switch ( BestOrder ) ++ { ++ case BOOM_WINDOW_REORDER_123 : swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ ++ case BOOM_WINDOW_REORDER_213 : swapbddvar( (bddsystem *)0, BddVar ); ++ swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ ++ case BOOM_WINDOW_REORDER_231 : swapbddvar( (bddsystem *)0, BddVar ); ++ swapbddvar( (bddsystem *)0, BddVar ); ++ swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ ++ case BOOM_WINDOW_REORDER_321 : swapbddvar( (bddsystem *)0, BddVar ); ++ swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ ++ case BOOM_WINDOW_REORDER_312 : swapbddvar( (bddsystem *)0, BddVar ); ++ break; ++ } ++ ++ *PCost = Cost; ++ ++ return( BestOrder != BOOM_WINDOW_REORDER_123 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BoomBehOptimizeWindow | ++| | ++\------------------------------------------------------------*/ ++ ++void BoomBehOptimizeWindow( BehFigure ) ++ ++ befig_list *BehFigure; ++{ ++ boombefiginfo *FigInfo; ++ beaux_list *BehAux; ++ short *ReorderLevel; ++ bddvar NumberChild; ++ bddvar ChildCount; ++ bddvar ChildFrom; ++ int AnySwap; ++ int Moved; ++ long Cost; ++ ++ FigInfo = GetBoomBehFigInfo( BehFigure ); ++ ++ NumberChild = BddLocalSystem->NUMBER_VAR; ++ ReorderLevel = (short *)autallocblock( sizeof( short ) * NumberChild ); ++ ++ for ( ChildFrom = 0; ChildFrom < ( NumberChild - 1 ); ChildFrom++ ) ++ { ++ ReorderLevel[ ChildFrom ] = 1; ++ } ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehFigure->BEAUX ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Initial cost %ld\n", Cost ); ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "\t--> Optimization %% 0\b" ); ++ fflush( stdout ); ++ } ++ ++ do ++ { ++ AnySwap = 0; ++ ++ for ( ChildCount = 0; ChildCount < NumberChild - 1; ChildCount++ ) ++ { ++ if ( ReorderLevel[ ChildCount ] ) ++ { ++ if ( ChildCount < NumberChild - 2 ) ++ { ++ Moved = BoomBehReorderWindow3( BehFigure, BehAux, ChildCount, &Cost ); ++ } ++ else ++ { ++ Moved = BoomBehReorderWindow2( BehFigure, BehAux, ChildCount, &Cost ); ++ } ++ ++ if ( Moved ) ++ { ++ AnySwap = 1; ++ ++ if ( ChildCount > 0 ) ReorderLevel[ ChildCount - 1 ] = 1; ++ if ( ChildCount > 1 ) ReorderLevel[ ChildCount - 2 ] = 1; ++ ++ ReorderLevel[ ChildCount + 1 ] = 1; ++ ++ if ( ChildCount < NumberChild - 2 ) ReorderLevel[ ChildCount + 2 ] = 1; ++ if ( ChildCount < NumberChild - 3 ) ReorderLevel[ ChildCount + 3 ] = 1; ++ if ( ChildCount < NumberChild - 4 ) ReorderLevel[ ChildCount + 4 ] = 1; ++ } ++ else ++ { ++ ReorderLevel[ ChildCount ] = 0; ++ } ++ } ++ ++ if ( ( FigInfo->VERBOSE ) && ++ ( ! BoomDebugFlag ) ) ++ { ++ fprintf( stdout, "%-3d\b\b\b", ( ( ChildCount + 1 ) * 100 ) / ( NumberChild - 1 ) ); ++ fflush( stdout ); ++ } ++ } ++ } ++ while ( AnySwap ); ++ ++ if ( FigInfo->VERBOSE ) ++ { ++ fprintf( stdout, "\n\n" ); ++ } ++ ++ autfreeblock( ReorderLevel ); ++ ++ BehAux = BoomBehComputeAux( BehFigure, BehAux ); ++ Cost = BoomBehGiveCost( BehFigure ); ++ ++ if ( IsBoomDebugLevel1() ) ++ { ++ BoomPrintf( stdout, "Final cost %ld\n", Cost ); ++ } ++} +diff -Naur alliance-5.0/boo/src/boom_window.h alliance/boom/src/boom_window.h +--- alliance-5.0/boo/src/boom_window.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/boom/src/boom_window.h 2002-09-30 18:20:01.000000000 +0200 +@@ -0,0 +1,81 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU General Public | ++| License as published by the Free Software Foundation; | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++ ++/*------------------------------------------------------------\ ++| | ++| Tool : BOOM | ++| | ++| File : boom_window.h | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 06.06.00 | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef BOOM_WINDOW_H ++# define BOOM_WINDOW_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define BOOM_WINDOW_REORDER_123 0 ++# define BOOM_WINDOW_REORDER_213 1 ++# define BOOM_WINDOW_REORDER_231 2 ++# define BOOM_WINDOW_REORDER_321 3 ++# define BOOM_WINDOW_REORDER_312 4 ++# define BOOM_WINDOW_REORDER_132 5 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void BoomBehOptimizeWindow(); ++ extern int BoomBehReorderWindow3(); ++ extern int BoomBehReorderWindow2(); ++ ++# endif diff --git a/alliance-btr.patch b/alliance-btr.patch new file mode 100644 index 0000000..0c81d77 --- /dev/null +++ b/alliance-btr.patch @@ -0,0 +1,804 @@ +diff -Naur alliance-5.0/btr/configure.in alliance/btr/configure.in +--- alliance-5.0/btr/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/btr/configure.in 2002-10-16 20:04:21.000000000 +0200 +@@ -0,0 +1,46 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.3 2002/10/16 18:04:21 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/btr.h) ++BTR_DLL_VERSION=1:3:0 ++AC_SUBST(BTR_DLL_VERSION) ++AM_INIT_AUTOMAKE(btr, 1.3) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/btr/Makefile.in alliance/btr/Makefile.in +--- alliance-5.0/btr/Makefile.in 2007-07-18 19:04:16.000000000 +0200 ++++ alliance/btr/Makefile.in 2009-06-13 22:27:15.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/btr/src/btrerror.h alliance/btr/src/btrerror.h +--- alliance-5.0/btr/src/btrerror.h 2002-09-30 18:20:02.000000000 +0200 ++++ alliance/btr/src/btrerror.h 2009-06-13 21:52:11.000000000 +0200 +@@ -46,6 +46,8 @@ + # ifndef BTR_ERROR_H + # define BTR_ERROR_H + ++# include ++ + /*------------------------------------------------------------\ + | | + | Constants | +diff -Naur alliance-5.0/btr/src/btrfunc.c alliance/btr/src/btrfunc.c +--- alliance-5.0/btr/src/btrfunc.c 2002-09-30 18:20:02.000000000 +0200 ++++ alliance/btr/src/btrfunc.c 2009-06-13 19:29:37.000000000 +0200 +@@ -43,6 +43,7 @@ + + # include + # include ++# include + # include + # include "mut.h" + # include "aut.h" +diff -Naur alliance-5.0/btr/src/main.c alliance/btr/src/main.c +--- alliance-5.0/btr/src/main.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/btr/src/main.c 2002-09-30 18:20:02.000000000 +0200 +@@ -0,0 +1,508 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : Btr | ++| | ++| File : main.c | ++| | ++| Date : 03.12.96 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "log.h" ++# include "beh.h" ++# include "bvl.h" ++# include "bhl.h" ++# include "btr.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static char *BtrStateArray = (char *)0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Btr Usage | ++| | ++\------------------------------------------------------------*/ ++ ++void BtrUsage() ++{ ++ fprintf( stderr, "Usage: btrtest [-tfip] filename\n" ); ++ ++ exit( 1 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BtrViewBddState | ++| | ++\------------------------------------------------------------*/ ++ ++void BtrViewBddState( BddNode ) ++ ++ bddnode *BddNode; ++{ ++ bddindex BddIndex; ++ ++ if ( BddNode->INDEX < BDD_INDEX_MIN ) ++ { ++ if ( BddNode->INDEX == BDD_INDEX_ONE ) ++ { ++ fprintf( stdout, "%s\n", BtrStateArray ); ++ } ++ } ++ else ++ { ++ BddIndex = BddNode->INDEX - BDD_INDEX_MIN; ++ ++ BtrStateArray[ BddIndex ] = '1'; ++ BtrViewBddState( BddNode->HIGH ); ++ ++ BtrStateArray[ BddIndex ] = '0'; ++ BtrViewBddState( BddNode->LOW ); ++ ++ BtrStateArray[ BddIndex ] = '*'; ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BtrViewBddNode | ++| | ++\------------------------------------------------------------*/ ++ ++void BtrViewBddNode( BddNode ) ++ ++ bddnode *BddNode; ++{ ++ chain_list *Expr; ++ ++ Expr = convertbddcircuitabl( (bddcircuit *)0, BddNode ); ++ viewablexpr( Expr, ABL_VIEW_VHDL ); ++ delablexpr( Expr ); ++ ++ fprintf( stdout, "\n" ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BtrViewFunc | ++| | ++\------------------------------------------------------------*/ ++ ++void BtrViewFunc( VarFunc ) ++ ++ btrvarfunc *VarFunc; ++{ ++ fprintf( stdout, "\nVAR : " ); ++ BtrViewBddNode( VarFunc->VAR ); ++ fprintf( stdout, "FUNC: " ); ++ BtrViewBddNode( VarFunc->FUNC ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| BtrViewRel | ++| | ++\------------------------------------------------------------*/ ++ ++void BtrViewRel( VarRel ) ++ ++ btrvarrel *VarRel; ++{ ++ fprintf( stdout, "\nVAR : " ); ++ BtrViewBddNode( VarRel->VAR ); ++ fprintf( stdout, "PRIME: " ); ++ BtrViewBddNode( VarRel->PRIME ); ++ fprintf( stdout, "REL: " ); ++ BtrViewBddNode( VarRel->REL ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| PreImage | ++| | ++\------------------------------------------------------------*/ ++ ++void BtrPreImageFunc( BtrTransFunc, BddInitial, BddAssoc ) ++ ++ btrtransfunc *BtrTransFunc; ++ bddnode *BddInitial; ++ bddassoc *BddAssoc; ++{ ++ bddnode *BddCurrent; ++ bddnode *BddReached; ++ bddnode *BddNew; ++ bddnode *BddPreImage; ++ ++ BddCurrent = BddInitial; ++ ++ fprintf( stdout, "Initial:\n" ); ++/*\ ++ BtrViewBddState( BddCurrent ); ++\*/ ++ ++ BddReached = incbddrefext( BddCurrent ); ++ ++ do ++ { ++ BddPreImage = (bddnode *)preimagebtrtransfunc( BtrTransFunc, BddCurrent ); ++ decbddrefext( BddCurrent ); ++ ++ BddCurrent = missbddnodeassocon( (bddsystem *)0, BddPreImage, BddAssoc ); ++ decbddrefext( BddPreImage ); ++ ++ fprintf( stdout, "PreImage:\n" ); ++/*\ ++ BtrViewBddState( BddCurrent ); ++\*/ ++ BddNew = applybddnodenot( (bddsystem *)0, BddReached ); ++ BddNew = applybddnode( (bddsystem *)0, ABL_AND, BddCurrent, decbddrefext( BddNew ) ); ++ ++ BddReached = applybddnode( (bddsystem *)0, ABL_OR, ++ decbddrefext( BddReached ), ++ decbddrefext( BddCurrent ) ); ++ ++ BddCurrent = BddNew; ++ } ++ while ( BddNew != BddLocalSystem->ZERO ); ++ ++ decbddrefext( BddReached ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Image | ++| | ++\------------------------------------------------------------*/ ++ ++void BtrImageFunc( BtrTransFunc, BddInitial ) ++ ++ btrtransfunc *BtrTransFunc; ++ bddnode *BddInitial; ++{ ++ bddnode *BddCurrent; ++ bddnode *BddReached; ++ bddnode *BddNew; ++ bddnode *BddImage; ++ ++ BddCurrent = BddInitial; ++ ++ fprintf( stdout, "Initial:\n" ); ++ BtrViewBddState( BddCurrent ); ++ ++ BddReached = incbddrefext( BddCurrent ); ++ ++ do ++ { ++ BddImage = (bddnode *)imagebtrtransfunc( BtrTransFunc, BddCurrent ); ++ ++ decbddrefext( BddCurrent ); ++ BddCurrent = BddImage; ++ ++ fprintf( stdout, "Image:\n" ); ++ BtrViewBddState( BddImage ); ++ ++ BddNew = applybddnodenot( (bddsystem *)0, BddReached ); ++ BddNew = applybddnode( (bddsystem *)0, ABL_AND, BddCurrent, decbddrefext( BddNew ) ); ++ ++ BddReached = applybddnode( (bddsystem *)0, ABL_OR, ++ decbddrefext( BddReached ), ++ decbddrefext( BddCurrent ) ); ++ ++ BddCurrent = BddNew; ++ } ++ while ( BddNew != BddLocalSystem->ZERO ); ++ ++ decbddrefext( BddReached ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Image | ++| | ++\------------------------------------------------------------*/ ++ ++void BtrImageRel( BtrTransRel, BddInitial, BddAssoc ) ++ ++ btrtransrel *BtrTransRel; ++ bddnode *BddInitial; ++ bddassoc *BddAssoc; ++{ ++ bddnode *BddCurrent; ++ bddnode *BddReached; ++ bddnode *BddNew; ++ bddnode *BddImage; ++ ++ BddCurrent = BddInitial; ++ ++ fprintf( stdout, "Initial:\n" ); ++ BtrViewBddState( BddCurrent ); ++ ++ BddReached = incbddrefext( BddCurrent ); ++ ++ do ++ { ++ BddImage = (bddnode *)imagebtrtransrel( BtrTransRel, BddCurrent ); ++ BddImage = missbddnodeassocon( (bddsystem *)0, ++ decbddrefext( BddImage ), BddAssoc ); ++ ++ decbddrefext( BddCurrent ); ++ BddCurrent = BddImage; ++ ++ fprintf( stdout, "Image:\n" ); ++ BtrViewBddState( BddImage ); ++ ++ BddNew = applybddnodenot( (bddsystem *)0, BddReached ); ++ BddNew = applybddnode( (bddsystem *)0, ABL_AND, BddCurrent, decbddrefext( BddNew ) ); ++ ++ BddReached = applybddnode( (bddsystem *)0, ABL_OR, ++ decbddrefext( BddReached ), ++ decbddrefext( BddCurrent ) ); ++ ++ BddCurrent = BddNew; ++ } ++ while ( BddNew != BddLocalSystem->ZERO ); ++ ++ decbddrefext( BddReached ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++int main( argc, argv ) ++ ++ int argc; ++ char *argv[]; ++{ ++ befig_list *BehFigure; ++ bereg_list *BehReg; ++ binode_list *BiNode; ++ bddnode *BddNode; ++ bddnode *BddPrime; ++ ++ bddassoc *BddAssoc; ++ ++ bddnode *BddInitial; ++ bddsystem *BddSystem; ++ bddcircuit *BddCircuit; ++ ++ long BtrNumReg; ++ ++ btrtransfunc *BtrTransFunc; ++ btrtransrel *BtrTransRel; ++ char Buffer[ 512 ]; ++ ++ char *InputFileName; ++ int FlagImage; ++ int FlagFunc; ++ int FlagDebug; ++ ++ int Number; ++ int Index; ++ char Option; ++ ++ mbkenv(); ++ ++ InputFileName = (char *)0; ++ FlagImage = 1; ++ FlagFunc = 1; ++ FlagDebug = 0; ++ ++ for ( Number = 1; Number < argc; Number++ ) ++ { ++ if ( argv[ Number ][ 0 ] == '-' ) ++ { ++ for ( Index = 1; argv[ Number ][ Index ] != '\0'; Index++ ) ++ { ++ Option = argv[ Number ][ Index ]; ++ ++ switch ( Option ) ++ { ++ case 'f' : FlagFunc = 1; ++ break; ++ case 't' : FlagFunc = 0; ++ break; ++ case 'i' : FlagImage = 1; ++ break; ++ case 'p' : FlagImage = 0; ++ break; ++ case 'd' : FlagDebug = 1; ++ break; ++ default : BtrUsage(); ++ } ++ } ++ } ++ else ++ { ++ InputFileName = argv[ Number ]; ++ } ++ } ++ ++ if ( ( argc < 2 ) || ++ ( InputFileName == (char *)0 ) ) ++ { ++ BtrUsage(); ++ } ++ ++ fprintf( stdout, "vhdlloadbefig %s\n", InputFileName ); ++ BehFigure = vhdlloadbefig( (befig_list *)0, InputFileName, 3 ); ++ fprintf( stdout, "file %s loaded\n", InputFileName ); ++ ++ BddSystem = createbddsystem( 100, 1000, 100, 500000 ); ++ reorderbddsystemdynamic( BddSystem, reorderbddsystemsimple, 30000, 100 ); ++ ++ BehFigure->BEDLY = (beaux_list *)0; ++ ++ fprintf( stdout, "beh_makbdd\n" ); ++ beh_makbdd( BehFigure, 0, 0 ); ++ ++ if ( FlagFunc ) ++ { ++ BtrTransFunc = createbtrtransfunc( (bddsystem *)0, 100 ); ++ } ++ else ++ { ++ BtrTransRel = createbtrtransrel( (bddsystem *)0, 100 ); ++ } ++ ++ BddAssoc = addbddassoc( (bddsystem *)0 ); ++ ++ BehReg = BehFigure->BEREG; ++ ++ while ( BehReg != (bereg_list *)0 ) ++ { ++ BiNode = BehReg->BINODE; ++ ++ BddNode = searchbddcircuitin( (bddcircuit *)0, BehReg->NAME ); ++ ++ if ( FlagFunc ) ++ { ++ addbtrtransfunc( BtrTransFunc, BddNode, BiNode->VALNODE ); ++ } ++ else ++ { ++ sprintf( Buffer, "'%s", BehReg->NAME ); ++ BddPrime = addbddcircuitin( (bddcircuit *)0, Buffer, ++ BddNode->INDEX, BDD_IN_MODE_AFTER ); ++ ++ addbtrtransrel( BtrTransRel, BddNode, BddPrime, BiNode->VALNODE ); ++ } ++ ++ addbddnodeassoc( (bddsystem *)0, BddAssoc, ++ getbddvarbyindex( (bddsystem *)0, BddNode->INDEX ), ++ BddLocalSystem->ONE ); ++ ++ BehReg = BehReg->NEXT; ++ } ++ ++ BtrStateArray = autallocblock( BddLocalCircuit->NUMBER_NAME_IN + 1 ); ++ memset( BtrStateArray, '*', BddLocalCircuit->NUMBER_NAME_IN ); ++ ++ fprintf( stdout, "Node: %ld\n", BddSystem->NUMBER_NODE ); ++ ++ testbddcircuit( (bddcircuit *)0 ); ++ ++ BddInitial = searchbddcircuitout( (bddcircuit *)0, "initial" ); ++ ++ if ( BddInitial == (bddnode *)0 ) ++ { ++ fprintf( stdout, "Missing output 'initial'\n" ); ++ EXIT( 1 ); ++ } ++ ++ if ( FlagFunc ) ++ { ++ if ( FlagDebug ) ++ { ++ viewbtrtransfunc( BtrTransFunc, BtrViewFunc ); ++ } ++ ++ if ( FlagImage ) BtrImageFunc ( BtrTransFunc, BddInitial ); ++ else BtrPreImageFunc( BtrTransFunc, BddInitial, BddAssoc ); ++ ++ destroybtrtransfunc( BtrTransFunc ); ++ } ++ else ++ { ++ if ( FlagDebug ) ++ { ++ viewbtrtransrel( BtrTransRel, BtrViewRel ); ++ } ++ ++ if ( FlagImage ) BtrImageRel( BtrTransRel, BddInitial, BddAssoc ); ++ ++ destroybtrtransrel( BtrTransRel ); ++ } ++ ++ delbddassoc( (bddsystem *)0, BddAssoc ); ++ ++ testbddcircuit( (bddcircuit *)0 ); ++ ++ destroybddcircuit( BehFigure->CIRCUI ); ++ destroybddsystem( BddSystem ); ++ ++ beh_frebefig( BehFigure ); ++ ++ return( 0 ); ++} +diff -Naur alliance-5.0/btr/src/Makefile.in alliance/btr/src/Makefile.in +--- alliance-5.0/btr/src/Makefile.in 2007-07-18 19:04:16.000000000 +0200 ++++ alliance/btr/src/Makefile.in 2009-06-13 22:27:15.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libBtr_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -67,11 +65,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libBtr_la_SOURCES) + DIST_SOURCES = $(libBtr_la_SOURCES) +@@ -146,6 +144,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -168,6 +169,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -234,6 +238,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -245,6 +252,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -294,6 +304,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -301,6 +314,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-bvl.patch b/alliance-bvl.patch new file mode 100644 index 0000000..e1304d2 --- /dev/null +++ b/alliance-bvl.patch @@ -0,0 +1,855 @@ +diff -Naur alliance-5.0/bvl/configure.in alliance/bvl/configure.in +--- alliance-5.0/bvl/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/bvl/configure.in 2002-10-16 20:04:21.000000000 +0200 +@@ -0,0 +1,48 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.3 2002/10/16 18:04:21 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/bvl.h) ++BVL_DLL_VERSION=1:14:0 ++AC_SUBST(BVL_DLL_VERSION) ++AM_INIT_AUTOMAKE(bvl, 1.14) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_YACC ++AM_PROG_LEX ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/bvl/Makefile.in alliance/bvl/Makefile.in +--- alliance-5.0/bvl/Makefile.in 2007-07-18 19:04:16.000000000 +0200 ++++ alliance/bvl/Makefile.in 2009-06-13 22:27:15.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/bvl/src/bvl_bcomp_l.l alliance/bvl/src/bvl_bcomp_l.l +--- alliance-5.0/bvl/src/bvl_bcomp_l.l 2005-05-11 10:05:31.000000000 +0200 ++++ alliance/bvl/src/bvl_bcomp_l.l 2009-06-13 20:10:04.000000000 +0200 +@@ -13,7 +13,7 @@ + /* called func. : addht, addhtitem, gethtitem, namealloc */ + /* ###--------------------------------------------------------------### */ + +-static int search (key) ++static long search (key) + + char *key; + +@@ -198,7 +198,7 @@ + \/ { return (Slash ); } + + {letter}(_?{letter_or_digit})* { +- int itoken; ++ long itoken; + + itoken = search (yytext); + if (itoken == EMPTYHT) +@@ -213,7 +213,7 @@ + } + ({decimal_literal})|({base}#{based_integer}(\.{based_integer})?#({exponent})?)|({base}:{based_integer}(\.{based_integer})?:({exponent})?) { + +- yylval.text = mbkalloc ((unsigned int)strlen(yytext)+1); ++ yylval.text = mbkalloc ((unsigned long)strlen(yytext)+1); + strcpy (yylval.text, yytext); + return (AbstractLit); + } +diff -Naur alliance-5.0/bvl/src/bvl_bcomp_y.y alliance/bvl/src/bvl_bcomp_y.y +--- alliance-5.0/bvl/src/bvl_bcomp_y.y 2004-07-14 08:29:04.000000000 +0200 ++++ alliance/bvl/src/bvl_bcomp_y.y 2009-06-14 00:55:51.000000000 +0200 +@@ -38,18 +38,18 @@ + /* in a string of '0' and '1's */ + /* ###--------------------------------------------------------------### */ + +-static int tobin (trg, src, left, right) ++static long tobin ( + +-char *trg ; +-char *src ; +-int left ; +-int right; ++char *trg , ++char *src , ++long left , ++long right ) + +- { ++{ + char base ; +- int indx ; +- int j = 0; +- int errflg = 0; ++ long indx ; ++ long j = 0; ++ long errflg = 0; + char lcl_trg [256]; + + lcl_trg [0] = '\0'; +@@ -216,25 +216,25 @@ + } + + return (errflg); +- } ++} + + /* ###--------------------------------------------------------------### */ + /* function : chkdcl */ + /* ###--------------------------------------------------------------### */ + +-static int chkdcl (object, mode, type, flag, kind, constraint, conf) ++static long chkdcl (object, mode, type, flag, kind, constraint, conf) + + char object ; +-int mode ; +-int type ; ++long mode ; ++long type ; + char flag ; +-int kind ; ++long kind ; + char constraint; +-int *conf ; ++long *conf ; + + { +- int errflg = 0; +- int lclcnf = 0; ++ long errflg = 0; ++ long lclcnf = 0; + + if (flag != constraint) + { +@@ -404,8 +404,8 @@ + + struct befig *ptfig ; + char object; +-int mode ; +-int type ; ++long mode ; ++long type ; + char flag ; + char *name ; + short left ; +@@ -580,8 +580,8 @@ + struct begen *ptgen ; + struct chain *ptauxnam ; + struct chain *ptauxnat ; +- int i ; +- int inc = 1; ++ long i ; ++ long inc = 1; + + ptgen = last_gen; + ptauxnam = nam_lst ; +@@ -697,13 +697,13 @@ + /* bvl_error , addchain , freechain */ + /* ###--------------------------------------------------------------### */ + +-static bvl_ablstr crtabl (oper, expr1, expr2, left, right) ++static bvl_ablstr crtabl ( + +-short oper ; +-bvl_ablstr expr1; +-bvl_ablstr expr2; +-int left ; +-int right; ++short oper , ++bvl_ablstr expr1, ++bvl_ablstr expr2, ++long left , ++long right ) + + { + char name [256] ; +@@ -1247,7 +1247,7 @@ + + { + char binstr[256]; +- int i; ++ long i; + struct chain *pt_auxabl; + pNode pt_bddres; + pNode pt_bddnew; +@@ -1256,8 +1256,8 @@ + char nomvar[10]; + struct chain *pt_newabl; + struct chain *pt_newabl2; +- static int oth_flg=0; +- static int last_width=0; ++ static long oth_flg=0; ++ static long last_width=0; + static pCircuit pC = NULL; + + result->LIST_ABL = NULL; +@@ -1871,7 +1871,7 @@ + .signal_kind. + { + char *signame; +- int sigconf; ++ long sigconf; + void *pnt; + + /* ###----------------------------------------------### */ +@@ -1895,7 +1895,7 @@ + beh_addtab (dic, signame, BVL_MODNAM, BVL_SIGDFN, sigconf); + beh_addtab (dic, signame, BVL_MODNAM, BVL_WMNDFN, $6.LEFT); + beh_addtab (dic, signame, BVL_MODNAM, BVL_WMXDFN, $6.RIGHT); +- beh_addtab (dic, signame, BVL_MODNAM, BVL_PNTDFN, (int)pnt); ++ beh_addtab (dic, signame, BVL_MODNAM, BVL_PNTDFN, (long)pnt); + + BVL_NM1LST = delchain (BVL_NM1LST, BVL_NM1LST); + } +@@ -1984,7 +1984,7 @@ + constant_VarAsgn__expression + Semicolon_ERR + { +- int sigconf; ++ long sigconf; + + if (chkdcl ('C', 0, $4.VALU, $4.FLAG, 0, $5.FLAG, &sigconf)==0) + { +@@ -2012,9 +2012,9 @@ + Semicolon_ERR + { + char *signame; +- int sigconf; ++ long sigconf; + void *pnt; +- int errflg; ++ long errflg; + + errflg = chkdcl ('S',0,$4.VALU,$4.FLAG,$6,$5.FLAG,&sigconf); + +@@ -2037,7 +2037,7 @@ + beh_addtab (dic, signame, BVL_MODNAM, BVL_SIGDFN, sigconf); + beh_addtab (dic, signame, BVL_MODNAM, BVL_WMNDFN, $5.LEFT); + beh_addtab (dic, signame, BVL_MODNAM, BVL_WMXDFN, $5.RIGHT); +- beh_addtab (dic, signame, BVL_MODNAM, BVL_PNTDFN, (int)pnt); ++ beh_addtab (dic, signame, BVL_MODNAM, BVL_PNTDFN, (long)pnt); + + BVL_NM1LST = delchain (BVL_NM1LST, BVL_NM1LST); + } +@@ -2163,7 +2163,7 @@ + waveform + Semicolon_ERR + { +- int i ; ++ long i ; + struct beout *beout_pnt; + struct bebus *bebus_pnt; + struct bereg *bereg_pnt; +@@ -2178,15 +2178,15 @@ + struct bvl_expr expr4 ; + struct bvl_expr expr5 ; + struct bvl_expr expr6 ; +- int rev_flg = 0; +- int left_bnd ; +- int right_bnd; +- int left ; +- int right ; +- int in_bound ; +- int out_bound; +- int sig_width; +- int sig_conf ; ++ long rev_flg = 0; ++ long left_bnd ; ++ long right_bnd; ++ long left ; ++ long right ; ++ long in_bound ; ++ long out_bound; ++ long sig_width; ++ long sig_conf ; + + delay = $6.TIME; + expr4 = $6 ; +@@ -2468,7 +2468,7 @@ + ...waveform__WHEN__choices.. + Semicolon_ERR + { +- int i; ++ long i; + struct beout *beout_pnt; + struct bebus *bebus_pnt; + struct bereg *bereg_pnt; +@@ -2477,15 +2477,15 @@ + struct chain *abl_pnt ; + unsigned long delay ; + struct bvl_expr expr1 ; +- int rev_flg = 0; +- int left_bnd; +- int right_bnd; +- int left; +- int right; +- int in_bound; +- int out_bound; +- int sig_width; +- int sig_conf; ++ long rev_flg = 0; ++ long left_bnd; ++ long right_bnd; ++ long left; ++ long right; ++ long in_bound; ++ long out_bound; ++ long sig_width; ++ long sig_conf; + + /* ###----------------------------------------------### */ + /* $10 est une structure, pas un pointeur... */ +@@ -2791,7 +2791,7 @@ + : abstractlit + time_unit + { +- unsigned int dly; ++ unsigned long dly; + + /* ###----------------------------------------------### */ + /* if the delay is not null unset the 'zero delay' */ +@@ -2847,13 +2847,13 @@ + { + char *val; + char val2[256]; +- int left; +- int right; +- int in_bound; +- int out_bound; +- int left_bnd; +- int right_bnd; +- int sig_conf; ++ long left; ++ long right; ++ long in_bound; ++ long out_bound; ++ long left_bnd; ++ long right_bnd; ++ long sig_conf; + + strcpy (val2, "B\""); + sig_conf = beh_chktab (dic, $1.NAME, BVL_MODNAM, BVL_SIGDFN); +@@ -3048,13 +3048,13 @@ + | name + { + struct bvl_expr expr1; +- int left; +- int right; +- int left_bnd; +- int right_bnd; +- int in_bound; +- int out_bound; +- int sig_conf; ++ long left; ++ long right; ++ long left_bnd; ++ long right_bnd; ++ long in_bound; ++ long out_bound; ++ long sig_conf; + + sig_conf = beh_chktab (dic, $1.NAME, BVL_MODNAM, BVL_SIGDFN); + switch (sig_conf) +@@ -3214,7 +3214,7 @@ + { + char extname [100]; + char *lclname ; +- int sig_conf ; ++ long sig_conf ; + struct bvl_expr expr1 ; + struct bvl_expr expr2 ; + struct chain *ptabl ; +diff -Naur alliance-5.0/bvl/src/bvl_drive.c alliance/bvl/src/bvl_drive.c +--- alliance-5.0/bvl/src/bvl_drive.c 2002-04-04 17:44:53.000000000 +0200 ++++ alliance/bvl/src/bvl_drive.c 2009-06-13 20:10:12.000000000 +0200 +@@ -27,10 +27,10 @@ + /* bvl_getvers */ + /* ###--------------------------------------------------------------### */ + +-int vhdlsavebefig (pt_fig, trace_mode) ++long vhdlsavebefig (pt_fig, trace_mode) + + struct befig *pt_fig ; +-int trace_mode; ++long trace_mode; + + { + struct begen *pt_gen = NULL; /* current ptype pnt (generic) */ +@@ -49,17 +49,17 @@ + char *kind ; + char *direct ; + char *transp ; +- int nrlabel = 0; +- int buff_size = 128; ++ long nrlabel = 0; ++ long buff_size = 128; + char *buffer ; + FILE *fp ; + time_t clock ; +- int left ; +- int right ; ++ long left ; ++ long right ; + char name [256]; + char *time_unit ; +- unsigned int time_step ; +- int err_flg = 0; ++ unsigned long time_step ; ++ long err_flg = 0; + + if ((pt_fig == NULL) || (pt_fig->ERRFLG != 0)) + beh_toolbug (10, "vhdlsavebefig", NULL, 0); +diff -Naur alliance-5.0/bvl/src/bvl_globals.c alliance/bvl/src/bvl_globals.c +--- alliance-5.0/bvl/src/bvl_globals.c 2002-04-04 17:44:53.000000000 +0200 ++++ alliance/bvl/src/bvl_globals.c 2009-06-13 20:10:14.000000000 +0200 +@@ -12,7 +12,7 @@ + #include "log.h" + #include "beh.h" + +-int BVL_AUXMOD ; /* don't keep internal sig (=1) */ ++long BVL_AUXMOD ; /* don't keep internal sig (=1) */ + char BVL_ERRFLG = 0 ; /* error flag */ + char BVL_CURFIL [256]; /* current file name */ + struct befig *BVL_HEDFIG = NULL; /* list of descriptions */ +diff -Naur alliance-5.0/bvl/src/bvl.h alliance/bvl/src/bvl.h +--- alliance-5.0/bvl/src/bvl.h 2002-04-04 17:44:53.000000000 +0200 ++++ alliance/bvl/src/bvl.h 2009-06-13 20:10:20.000000000 +0200 +@@ -25,7 +25,7 @@ + typedef struct bvl_expr /* a signal's expression */ + { + char *IDENT ; /* identifier or constant name */ +- unsigned int TIME ; /* waveform's delay */ ++ unsigned long TIME ; /* waveform's delay */ + struct chain *LIST_ABL; /* pointer on a list of ABL */ + short WIDTH ; /* width of bit vector */ + } +@@ -42,7 +42,7 @@ + + struct g_type + { +- int VALU; ++ long VALU; + char FLAG; + }; + +@@ -51,7 +51,7 @@ + /* global variables */ + /* ###------------------------------------------------------### */ + +-extern int BVL_AUXMOD ; /* don't keep internal sig (=1) */ ++extern long BVL_AUXMOD ; /* don't keep internal sig (=1) */ + extern char BVL_ERRFLG ; /* error flag */ + extern char BVL_CURFIL []; /* current file name */ + extern struct befig *BVL_HEDFIG ; /* list of descriptions */ +@@ -72,6 +72,6 @@ + extern void bvl_message (); + + extern struct befig *vhdlloadbefig (); +-extern int vhdlsavebefig (); ++extern long vhdlsavebefig (); + + #endif +diff -Naur alliance-5.0/bvl/src/bvl_parse.c alliance/bvl/src/bvl_parse.c +--- alliance-5.0/bvl/src/bvl_parse.c 2002-04-04 17:44:53.000000000 +0200 ++++ alliance/bvl/src/bvl_parse.c 2009-06-13 20:10:25.000000000 +0200 +@@ -28,17 +28,17 @@ + + struct befig *pt_befig ; + char *figname ; +-unsigned int trace_mode; ++unsigned long trace_mode; + + { + extern FILE *bvl_y_in ; +- extern int bvl_y_parse (); ++ extern long bvl_y_parse (); + char *tok ; + char *str ; +- unsigned int check_mode ; ++ unsigned long check_mode ; + struct chain *behsfx_lst = NULL; + struct chain *suffix = NULL; +- static unsigned int call_nbr = 0 ; ++ static unsigned long call_nbr = 0 ; + + /* ###------------------------------------------------------### */ + /* read the environment variable VH_BEHSFX to create a list */ +diff -Naur alliance-5.0/bvl/src/bvl_util.c alliance/bvl/src/bvl_util.c +--- alliance-5.0/bvl/src/bvl_util.c 2002-04-04 17:44:53.000000000 +0200 ++++ alliance/bvl/src/bvl_util.c 2009-06-13 20:09:37.000000000 +0200 +@@ -37,7 +37,7 @@ + + void bvl_error (code, str1) + +-int code; ++long code; + char *str1; + + { +@@ -188,15 +188,15 @@ + struct bepor *bvl_vpor (pt_por, pt_lft, pt_rit, name) + + struct bepor *pt_por ; +-int *pt_lft ; +-int *pt_rit ; ++long *pt_lft ; ++long *pt_rit ; + char *name ; + + { + struct bepor *prv_por = NULL; +- int left = -1 ; +- int right = -1 ; +- int index = -1 ; ++ long left = -1 ; ++ long right = -1 ; ++ long index = -1 ; + char tmp_nam [256] ; + + prv_por = pt_por; +@@ -241,15 +241,15 @@ + struct beaux *bvl_vaux (pt_aux, pt_lft, pt_rit, name) + + struct beaux *pt_aux ; +-int *pt_lft ; +-int *pt_rit ; ++long *pt_lft ; ++long *pt_rit ; + char *name ; + + { + struct beaux *prv_aux = NULL; +- int left = -1 ; +- int right = -1 ; +- int index = -1 ; ++ long left = -1 ; ++ long right = -1 ; ++ long index = -1 ; + char tmp_nam [256] ; + + prv_aux = pt_aux; +@@ -294,15 +294,15 @@ + struct bebux *bvl_vbux (pt_bux, pt_lft, pt_rit, name) + + struct bebux *pt_bux ; +-int *pt_lft ; +-int *pt_rit ; ++long *pt_lft ; ++long *pt_rit ; + char *name ; + + { + struct bebux *prv_bux = NULL; +- int left = -1 ; +- int right = -1 ; +- int index = -1 ; ++ long left = -1 ; ++ long right = -1 ; ++ long index = -1 ; + char tmp_nam [256] ; + + prv_bux = pt_bux; +@@ -347,15 +347,15 @@ + struct bereg *bvl_vreg (pt_reg, pt_lft, pt_rit, name) + + struct bereg *pt_reg ; +-int *pt_lft ; +-int *pt_rit ; ++long *pt_lft ; ++long *pt_rit ; + char *name ; + + { + struct bereg *prv_reg = NULL; +- int left = -1 ; +- int right = -1 ; +- int index = -1 ; ++ long left = -1 ; ++ long right = -1 ; ++ long index = -1 ; + char tmp_nam [256] ; + + prv_reg = pt_reg; +@@ -427,10 +427,10 @@ + + struct chain *expr ; /* expression */ + char *chaine ; /* target string */ +-int *size_pnt; /* size of available space */ ++long *size_pnt; /* size of available space */ + + { +- int operator; ++ long operator; + char *oper ; + struct chain *operand ; + static char *str_z = NULL; +@@ -480,7 +480,7 @@ + /* "(operand operator operand operator operand ...)" */ + /* ###------------------------------------------------------### */ + +- operator = (int) ((struct chain *) expr->DATA)->DATA; ++ operator = (long) ((struct chain *) expr->DATA)->DATA; + operand = (struct chain *) expr->NEXT->DATA; + + if (operator == STABLE) +diff -Naur alliance-5.0/bvl/src/cvslog.27105 alliance/bvl/src/cvslog.27105 +--- alliance-5.0/bvl/src/cvslog.27105 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/bvl/src/cvslog.27105 2009-06-14 15:51:33.000000000 +0200 +@@ -0,0 +1,14 @@ ++=================================================================== ++Modification le : Sun Jun 14 15:51:33 CEST 2009 ++Par : ludo ++=================================================================== ++ ++Update of /users/outil/alliance/cvsroot/alliance/src/bvl/src ++In directory do:/users/cao/ludo/alliance/src/bvl/src ++ ++Modified Files: ++ bvl.h bvl_bcomp_l.l bvl_bcomp_y.y bvl_drive.c bvl_globals.c ++ bvl_parse.c bvl_util.c ++Log Message: ++- port 64 bits ++ +diff -Naur alliance-5.0/bvl/src/Makefile.in alliance/bvl/src/Makefile.in +--- alliance-5.0/bvl/src/Makefile.in 2007-07-18 19:04:17.000000000 +0200 ++++ alliance/bvl/src/Makefile.in 2009-06-13 22:27:15.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libBvl_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -67,11 +65,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) + LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +@@ -151,6 +149,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -173,6 +174,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -239,6 +243,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -250,6 +257,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -299,6 +309,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -306,6 +319,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-cells.patch b/alliance-cells.patch new file mode 100644 index 0000000..bfbcc3e --- /dev/null +++ b/alliance-cells.patch @@ -0,0 +1,982 @@ +diff -Naur alliance-5.0/cells/configure.in alliance/cells/configure.in +--- alliance-5.0/cells/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/cells/configure.in 2005-10-04 17:46:19.000000000 +0200 +@@ -0,0 +1,22 @@ ++dnl $Id: configure.in,v 1.5 2005/10/04 15:46:19 jpc Exp $ ++ ++AC_INIT(doc/sxlib.5) ++AM_INIT_AUTOMAKE(cells, 1.1) ++ ++AC_PROG_INSTALL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++doc/Makefile ++src/Makefile ++src/dp_sxlib/Makefile ++src/padlib/Makefile ++src/pxlib/Makefile ++src/rflib/Makefile ++src/rf2lib/Makefile ++src/sxlib/Makefile ++src/ramlib/Makefile ++src/romlib/Makefile ++]) +diff -Naur alliance-5.0/cells/doc/Makefile.in alliance/cells/doc/Makefile.in +--- alliance-5.0/cells/doc/Makefile.in 2007-07-18 19:04:17.000000000 +0200 ++++ alliance/cells/doc/Makefile.in 2009-06-13 22:27:16.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -119,6 +119,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -141,6 +144,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -207,6 +213,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -218,6 +227,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -267,6 +279,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -274,6 +289,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/cells/Makefile.in alliance/cells/Makefile.in +--- alliance-5.0/cells/Makefile.in 2007-07-18 19:04:17.000000000 +0200 ++++ alliance/cells/Makefile.in 2009-06-13 22:27:16.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -124,6 +124,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -146,6 +149,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -212,6 +218,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -223,6 +232,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -272,6 +284,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -279,6 +294,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -391,7 +409,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -403,7 +427,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -411,7 +435,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -432,7 +462,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/cells/src/dp_sxlib/Makefile.in alliance/cells/src/dp_sxlib/Makefile.in +--- alliance-5.0/cells/src/dp_sxlib/Makefile.in 2007-07-18 19:04:18.000000000 +0200 ++++ alliance/cells/src/dp_sxlib/Makefile.in 2009-06-13 22:27:16.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/cells/src/Makefile.in alliance/cells/src/Makefile.in +--- alliance-5.0/cells/src/Makefile.in 2007-07-18 19:04:17.000000000 +0200 ++++ alliance/cells/src/Makefile.in 2009-06-13 22:27:16.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -124,6 +124,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -146,6 +149,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -212,6 +218,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -223,6 +232,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -272,6 +284,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -279,6 +294,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -391,7 +409,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -403,7 +427,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -411,7 +435,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -432,7 +462,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/cells/src/padlib/Makefile.in alliance/cells/src/padlib/Makefile.in +--- alliance-5.0/cells/src/padlib/Makefile.in 2007-07-18 19:04:18.000000000 +0200 ++++ alliance/cells/src/padlib/Makefile.in 2009-06-13 22:27:16.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/cells/src/pxlib/Makefile.in alliance/cells/src/pxlib/Makefile.in +--- alliance-5.0/cells/src/pxlib/Makefile.in 2007-07-18 19:04:18.000000000 +0200 ++++ alliance/cells/src/pxlib/Makefile.in 2009-06-13 22:27:17.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/cells/src/ramlib/Makefile.in alliance/cells/src/ramlib/Makefile.in +--- alliance-5.0/cells/src/ramlib/Makefile.in 2007-07-18 19:04:18.000000000 +0200 ++++ alliance/cells/src/ramlib/Makefile.in 2009-06-13 22:27:17.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/cells/src/rf2lib/Makefile.in alliance/cells/src/rf2lib/Makefile.in +--- alliance-5.0/cells/src/rf2lib/Makefile.in 2007-07-18 19:04:19.000000000 +0200 ++++ alliance/cells/src/rf2lib/Makefile.in 2009-06-13 22:27:17.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/cells/src/rflib/Makefile.in alliance/cells/src/rflib/Makefile.in +--- alliance-5.0/cells/src/rflib/Makefile.in 2007-07-18 19:04:19.000000000 +0200 ++++ alliance/cells/src/rflib/Makefile.in 2009-06-13 22:27:17.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -342,7 +360,25 @@ + sysconfdir = @sysconfdir@ + target_alias = @target_alias@ + rflibdir = $(prefix)/cells/rflib +-rflib_DATA = CATAL rf_dec_bufad0.ap rf_dec_bufad0.vbe rf_dec_bufad1.ap rf_dec_bufad1.vbe rf_dec_bufad2.ap rf_dec_bufad2.vbe rf_dec_nand2.ap rf_dec_nand2.vbe rf_dec_nand3.ap rf_dec_nand3.vbe rf_dec_nand4.ap rf_dec_nand4.vbe rf_dec_nao3.ap rf_dec_nao3.vbe rf_dec_nbuf.ap rf_dec_nbuf.vbe rf_dec_nor3.ap rf_dec_nor3.vbe rf_fifo_buf.ap rf_fifo_buf.vbe rf_fifo_clock.ap rf_fifo_clock.vbe rf_fifo_empty.ap rf_fifo_empty.vbe rf_fifo_full.ap rf_fifo_full.vbe rf_fifo_inc.ap rf_fifo_inc.vbe rf_fifo_nop.ap rf_fifo_nop.vbe rf_fifo_ok.ap rf_fifo_ok.vbe rf_fifo_orand4.ap rf_fifo_orand4.vbe rf_fifo_orand5.ap rf_fifo_orand5.vbe rf_fifo_ptreset.ap rf_fifo_ptreset.vbe rf_fifo_ptset.ap rf_fifo_ptset.vbe rf_inmux_buf_2.ap rf_inmux_buf_2.vbe rf_inmux_buf_4.ap rf_inmux_buf_4.vbe rf_inmux_mem.ap rf_inmux_mem.vbe rf_mid_buf_2.ap rf_mid_buf_2.vbe rf_mid_buf_4.ap rf_mid_buf_4.vbe rf_mid_mem.ap rf_mid_mem.vbe rf_mid_mem_r0.ap rf_mid_mem_r0.vbe rf_out_buf_2.ap rf_out_buf_2.vbe rf_out_buf_4.ap rf_out_buf_4.vbe rf_out_mem.ap rf_out_mem.vbe rflib.lef ++rflib_DATA = CATAL rf_dec_bufad0.ap rf_dec_bufad0.vbe rf_dec_bufad1.ap \ ++ rf_dec_bufad1.vbe rf_dec_bufad2.ap rf_dec_bufad2.vbe \ ++ rf_dec_nand2.ap rf_dec_nand2.vbe rf_dec_nand3.ap \ ++ rf_dec_nand3.vbe rf_dec_nand4.ap rf_dec_nand4.vbe \ ++ rf_dec_nao3.ap rf_dec_nao3.vbe rf_dec_nbuf.ap rf_dec_nbuf.vbe \ ++ rf_dec_nor3.ap rf_dec_nor3.vbe rf_fifo_buf.ap rf_fifo_buf.vbe \ ++ rf_fifo_clock.ap rf_fifo_clock.vbe rf_fifo_empty.ap \ ++ rf_fifo_empty.vbe rf_fifo_full.ap rf_fifo_full.vbe \ ++ rf_fifo_inc.ap rf_fifo_inc.vbe rf_fifo_nop.ap rf_fifo_nop.vbe \ ++ rf_fifo_ok.ap rf_fifo_ok.vbe rf_fifo_orand4.ap \ ++ rf_fifo_orand4.vbe rf_fifo_orand5.ap rf_fifo_orand5.vbe \ ++ rf_fifo_ptreset.ap rf_fifo_ptreset.vbe rf_fifo_ptset.ap \ ++ rf_fifo_ptset.vbe rf_inmux_buf_2.ap rf_inmux_buf_2.vbe \ ++ rf_inmux_buf_4.ap rf_inmux_buf_4.vbe rf_inmux_mem.ap \ ++ rf_inmux_mem.vbe rf_mid_buf_2.ap rf_mid_buf_2.vbe \ ++ rf_mid_buf_4.ap rf_mid_buf_4.vbe rf_mid_mem.ap rf_mid_mem.vbe \ ++ rf_mid_mem_r0.ap rf_mid_mem_r0.vbe rf_out_buf_2.ap \ ++ rf_out_buf_2.vbe rf_out_buf_4.ap rf_out_buf_4.vbe \ ++ rf_out_mem.ap rf_out_mem.vbe rflib.lef + EXTRA_DIST = $(rflib_DATA) + all: all-am + +diff -Naur alliance-5.0/cells/src/romlib/Makefile.in alliance/cells/src/romlib/Makefile.in +--- alliance-5.0/cells/src/romlib/Makefile.in 2007-07-18 19:04:19.000000000 +0200 ++++ alliance/cells/src/romlib/Makefile.in 2009-06-13 22:27:17.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/cells/src/sxlib/Makefile.in alliance/cells/src/sxlib/Makefile.in +--- alliance-5.0/cells/src/sxlib/Makefile.in 2007-07-18 19:04:19.000000000 +0200 ++++ alliance/cells/src/sxlib/Makefile.in 2009-06-13 22:27:18.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -136,6 +136,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -158,6 +161,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -224,6 +230,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -235,6 +244,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -284,6 +296,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -291,6 +306,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/cells/src/sxlib/Makefile.liban alliance/cells/src/sxlib/Makefile.liban +--- alliance-5.0/cells/src/sxlib/Makefile.liban 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/cells/src/sxlib/Makefile.liban 2002-04-29 17:51:57.000000000 +0200 +@@ -0,0 +1,2 @@ ++sxlib.log : sxlib.db sxlib.sdb ++ liban -arch FTGS sxlib.db > sxlib.log +diff -Naur alliance-5.0/cells/src/sxlib/powmid_x0.al alliance/cells/src/sxlib/powmid_x0.al +--- alliance-5.0/cells/src/sxlib/powmid_x0.al 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/cells/src/sxlib/powmid_x0.al 2004-08-02 15:46:06.000000000 +0200 +@@ -0,0 +1,9 @@ ++V ALLIANCE : 6 ++H powmid_x0,L,02/08/2004 ++C vdd,UNKNOWN,EXTERNAL,2 ++C vss,UNKNOWN,EXTERNAL,1 ++S 2,EXTERNAL,vdd ++Q 0.0026439 ++S 1,EXTERNAL,vss ++Q 0.00371008 ++EOF diff --git a/alliance-ctl.patch b/alliance-ctl.patch new file mode 100644 index 0000000..54ebead --- /dev/null +++ b/alliance-ctl.patch @@ -0,0 +1,344 @@ +diff -Naur alliance-5.0/ctl/configure.in alliance/ctl/configure.in +--- alliance-5.0/ctl/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/ctl/configure.in 2002-10-16 20:04:21.000000000 +0200 +@@ -0,0 +1,47 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.4 2002/10/16 18:04:21 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/ctl.h) ++CTL_DLL_VERSION=1:1:0 ++AC_SUBST(CTL_DLL_VERSION) ++AM_INIT_AUTOMAKE(ctl, 1.1) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++man5/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/ctl/Makefile.in alliance/ctl/Makefile.in +--- alliance-5.0/ctl/Makefile.in 2007-07-18 19:04:20.000000000 +0200 ++++ alliance/ctl/Makefile.in 2009-06-13 22:27:18.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/ctl/man5/Makefile.in alliance/ctl/man5/Makefile.in +--- alliance-5.0/ctl/man5/Makefile.in 2007-07-18 19:04:20.000000000 +0200 ++++ alliance/ctl/man5/Makefile.in 2009-06-13 22:27:18.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/ctl/src/Makefile.in alliance/ctl/src/Makefile.in +--- alliance-5.0/ctl/src/Makefile.in 2007-07-18 19:04:20.000000000 +0200 ++++ alliance/ctl/src/Makefile.in 2009-06-13 22:27:18.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libCtl_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -67,11 +65,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libCtl_la_SOURCES) + DIST_SOURCES = $(libCtl_la_SOURCES) +@@ -146,6 +144,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -168,6 +169,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -234,6 +238,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -245,6 +252,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -294,6 +304,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -301,6 +314,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-ctp.patch b/alliance-ctp.patch new file mode 100644 index 0000000..bcdbe1b --- /dev/null +++ b/alliance-ctp.patch @@ -0,0 +1,463 @@ +diff -Naur alliance-5.0/ctp/configure.in alliance/ctp/configure.in +--- alliance-5.0/ctp/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/ctp/configure.in 2002-10-16 20:04:21.000000000 +0200 +@@ -0,0 +1,49 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.5 2002/10/16 18:04:21 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/ctp.h) ++CTP_DLL_VERSION=1:1:0 ++AC_SUBST(CTP_DLL_VERSION) ++AM_INIT_AUTOMAKE(ctp, 1.1) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_YACC ++AM_PROG_LEX ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/ctp/Makefile.in alliance/ctp/Makefile.in +--- alliance-5.0/ctp/Makefile.in 2007-07-18 19:04:20.000000000 +0200 ++++ alliance/ctp/Makefile.in 2009-06-13 22:27:19.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/ctp/src/ctp_byacc.h alliance/ctp/src/ctp_byacc.h +--- alliance-5.0/ctp/src/ctp_byacc.h 2002-09-30 18:20:05.000000000 +0200 ++++ alliance/ctp/src/ctp_byacc.h 2009-06-13 19:33:11.000000000 +0200 +@@ -40,7 +40,7 @@ + static struct dct_recrd *addrcd (); + static struct dct_entry **initab (); + static void addtab (); +-static int chktab (); ++static long chktab (); + static void fretab (); + static void *ctp_addstr (); + static ctltype_list *val_type(); +@@ -50,7 +50,7 @@ + extern char CTP_ERRFLG; /* set to 1 in case of error */ + extern ctlfig_list *CTP_HEADFIG; /* head of vbfigs */ + extern long CTP_LINNUM; +-extern int CTP_NUMPTP; ++extern long CTP_NUMPTP; + extern char *CTP_MODNAM; + + /*\ +@@ -60,7 +60,7 @@ + ctp_vexstr CTP_SLCEXP; /* structure filled with the */ + ctp_vexstr CTP_EMPSTR; /* empty structure used with NOT*/ + +-static int CTP_NUMTYP = 0; /* nombre de type */ ++static long CTP_NUMTYP = 0; /* nombre de type */ + static struct chain *CTP_NM1LST = NULL; /* 1-st name liste */ + static struct chain *CTP_NM2LST = NULL; /* 2-st name liste */ + static struct chain *CTP_INSLST = NULL; /* 3-st name liste */ +diff -Naur alliance-5.0/ctp/src/ctp_y.y alliance/ctp/src/ctp_y.y +--- alliance-5.0/ctp/src/ctp_y.y 2004-07-13 23:25:37.000000000 +0200 ++++ alliance/ctp/src/ctp_y.y 2009-06-13 19:32:32.000000000 +0200 +@@ -60,7 +60,7 @@ + %} + + %union { +- int valu; ++ long valu; + char *text; + chain_list *pcha; + ctp_name name; +@@ -700,7 +700,7 @@ + .constraint. + { + ctltype_list *ctltype_pnt; +- int mode; ++ long mode; + + mode = chktab(hshtab,$1,CTP_MODNAM,CTP_SYMDFN); + +@@ -754,9 +754,9 @@ + { + char *enumname; + char *enumval; +- int size; +- int indice; +- int numbit; ++ long size; ++ long indice; ++ long numbit; + char **pnt; + chain_list *nm1lst; + +@@ -961,8 +961,8 @@ + { + long Left; + long Right; +- int ErrorL; +- int ErrorR; ++ long ErrorL; ++ long ErrorR; + + ErrorL = ctp_vextonum( $1.VEX, &Left ); + ErrorR = ctp_vextonum( $3.VEX, &Right ); +@@ -1003,7 +1003,7 @@ + : + simple_name + { +- int type; ++ long type; + $$.NAME = $1; + $$.LEFT = -1; + $$.RIGHT = -1; +@@ -1339,8 +1339,8 @@ + long right_bnd; + long in_bound; + long out_bound; +- int mode; +- int flag; ++ long mode; ++ long flag; + + flag = $1.FLAG; + +@@ -1393,7 +1393,7 @@ + right = $1.RIGHT; + + { +- int type; ++ long type; + + expr1.IDENT = $1.NAME; + type = chktab(hshtab,$1.NAME,LocalName,CTP_TYPDFN); +@@ -1610,7 +1610,7 @@ + vexexpr *VexExpr; + vexexpr *VexRet; + long Index; +- int Error; ++ long Error; + long Def; + + ScanChain = $2; +@@ -1686,8 +1686,8 @@ + char *LocalName; + long Left; + long Right; +- int ErrorL; +- int ErrorR; ++ long ErrorL; ++ long ErrorR; + + LocalName = CTP_MODNAM; + +@@ -1721,9 +1721,9 @@ + attribute_designator + { + char *LocalName; +- int type; +- int flag; +- int mode; ++ long type; ++ long flag; ++ long mode; + long AttrLeft; + long AttrRight; + long AttrLow; +@@ -1850,7 +1850,7 @@ + + { + struct dct_entry *entry = NULL; +- int i; ++ long i; + + if (CTP_DCEHED == NULL) + { +@@ -1883,7 +1883,7 @@ + + { + struct dct_recrd *recrd = NULL; +- int i; ++ long i; + + if (CTP_DCRHED == NULL) + { +@@ -1912,7 +1912,7 @@ + + { + struct dct_entry **head = NULL; +- int i; ++ long i; + + head = (struct dct_entry **) + autallocblock (sizeof(struct dct_entry *) * CTP_HSZDFN); +@@ -2009,7 +2009,7 @@ + } + } + +-static int chktab (head,key_str,ctx_str,field) ++static long chktab (head,key_str,ctx_str,field) + + struct dct_entry **head; + char *key_str; +@@ -2127,7 +2127,7 @@ + static void *ctp_addstr(object,mode,prtype,type,flag,name,left,right,exp) + + char object; +-int mode; ++long mode; + ctltype_list *prtype; + unsigned char type; + char flag; +@@ -2141,7 +2141,7 @@ + ctldecl_list *CtlDeclar; + void *pnt = NULL; + vexexpr *vex_pnt; +- int bitsize; ++ long bitsize; + + if ( object == 'F' ) + { +diff -Naur alliance-5.0/ctp/src/Makefile.in alliance/ctp/src/Makefile.in +--- alliance-5.0/ctp/src/Makefile.in 2007-07-18 19:04:21.000000000 +0200 ++++ alliance/ctp/src/Makefile.in 2009-06-13 22:27:19.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libCtp_la_SOURCES) $(ctptest_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -71,11 +69,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) + LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +@@ -155,6 +153,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -177,6 +178,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -243,6 +247,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -254,6 +261,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -303,6 +313,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -310,6 +323,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-distrib.patch b/alliance-distrib.patch new file mode 100644 index 0000000000000000000000000000000000000000..a0cf59f81fd9948cfb81cfd4fef563ae79b5ae74 GIT binary patch literal 116460 zcmeFa30PA{*8n_WCu~6h5w}YK1wumDR1h#>-$Zr+MYu_BHnNd>!y?+E;tIA@aYqX% zE+|S>tW{}o!=;wuhPCyz?n^hZw$)k-|1&oU1hw1uz2E=*&-3@R*PG0oIdjgLnKK(X zM<5Xj5oR)~Q6s2KCP5W^j2XmY`wApDp_cG`^@%K8h4BYa-keQkGMNJ?e@w;FpUs}c zWKUxHO-B5JL)bwffx#@c9uNlGpUtK+7>of@Z?4VKFL)B0$@XKi{SdZa2%8{n4# zYD_389mMigs)zv%LWRKEsmx?lj)e?hd6YvA=24mH8o3-*m+5l2y4FCllG5XmNNyC8 zUPfSYDl-dH;}WGphvrdUjH%~QnQ52|LvcM>k8-v4`#dT$Ny5hz139rNNmOR6TB%VD zaKKfmWD-6~NR$fP7uH5)rYkjSzMhz#L#DPa7J;f+qB&G%W?Iq!4FnMrget_>x1^+m ziQ*DDOD0iGWC_&+;`>sWDJZ`X6=7;^sRRsFFjG*C42cw@Dh+{z4y3TODI6V*a4IuG zBasQxluCju>rtLh$WBwNL1#4CJ_mapa@?nSIIB} zLvV~hltM(P#xPR9gi8T5JaU^6DUuHA&5-EQ=@7Lh9ihjsirc?<`7`GM5JIL z@dP4K@MRhS1}SI7MI|95eTfWq7LpP!k!xfqp;Y@Ih)gMx@DT(rQxIYdm*7+;S*H() ziE0R?93>=tL?uJ{7@4M4Y6uL`a>hasu9iBD{73P~{>2Sgd-nS!b%IFc3bgT$zz{qizk zP>kXT55p9Q2FC=j0U@Uts^*Iks2eH9CvYkg*YL#%ij$R2o)mTD!GE|MoC499~rB?DW99OEzwhCmkVL>X>uw;C6bTkqx5urQ@fyAXJ zA!)Eh)ht~0@t_T&G7*UonTaq3h(|e@0u9hSByS4Tlmb!95vF=b z))Yi2ffU@3bg@z+6CgYc5hxWHB2kdaorV@-LWvC1vV+JA1rjyFR1KlwQLdd@=J{d- zUrUUOBPAH@)&>I}_HV5fBg7~H^GOc%HQ{ikQ)?7HFh`6QV+f&ydkbIhllKP==e76wghLjLy%Po)R`d94bSnGmr9oB|cBzK&}W=i13vPp+uxnWBT@? zG7$t}`9fQZ6B?nA$|PF{;lt+C6=$)02g@;;TFnpEh%lL$0?rLgRK{oGVpNU6ULi*d zF(fKFJtHbUEzD3JM5k7gQ@#L!oo=9;Xsd)-9s_7@NTduywVgxT%@IP4VJs@s&66)c za5aC5p$G^cVtZ+OMWj+yMmDByeCV5AM_fMf#z6LHQwEW_TQrkYL zjGvDwido(W4<-0wTsxBsq#B$U(qW-!NQPK~!zojtB(#l2V#6tlP(rI9R~BOfgH=B@ zNC+I033crVsR%WMMh$g^@Wpba06`h*(jk%zwhTt_eFr$CG7&fj(s3Wdk%V}MA>Ok* zXU?9I=RM17NY-GN_n|{|!U1cju{YO)i;?hug3a=SgQxg!QD*u56Uu`E;~0S{iV^Rj zf)7d!*HRE+NdAC$|3rHJKNFvi{{#6+OJZN1EDOarYw zIa#~=Axx|Y($>z>WM76eweS@Q21X0i9fJHhj!wY{qLrCh{5QmYO#+qzDQquO#w?qSq5usQUFpoR6v`ir3R&KYKk@j`Ckmlwm_K`ItJ zf^PLRG*ON!;4^h-szAy26%%sV>!~V%5GKO^v<)=4$~WYCVCip|h?Syn$2=qr)}$=P z)Ws6meFt?6)3uvprckDQElYp4!c@b-X~50Ea(<8$xdw52eOmVQX2}C}h52GsA;M%z z5tZqUWQa9L48}wJCL#W8cF^DfgYG!tPY)QFNP3xqFD6&L2w$UC!>uW~#e_#KJdFq$ zuRS>+kI1xWB0e7pU2=G)W zOAtA#Kt-4U;gt=nrO1UWTzPu2s7xl3hG~}&y2BrYKt(=?9Ii!p7$TAsV+yzdhX)`M z8HNxNIov?NBLPB;LEFG&>Q2V^O1T_v|7Gx)3{{KB9U|Ofsa10AmckRqFme@19uvaq zVH2dI1d^;QM*M=H1_J)622dQw)P#14R05Yg+60!^2T{T06(ZLVEHPXy=>`QNArJ{^ z_F^L=^RuGU(&MKmBjI640Ib~;HW2*63SgBQvN)YjAbykoM=X-P1QTdG0F=?!kL~L> zS>IL2W|#(zw?YIDIiRkQ5CkQgmd<3N0s)h>?FtdXWb&1&GCC9oZn7l`fuvX>&_MHs z=$C)wGI?OP;)CE?T%kmb6G(|zi6}5kfDhDEB9X~pWsrh|JZ&MADny1AV={dUX%t%V z10eVQ|G0$)7V&}lb-cFA@lbxDezP&K9rzXvYCppi~hgzHS6Vb>n<7 zCdUw=S}8~PbChIDWvI&_V|a-K_AWw+2+9V=>sn@oF5t@dUApw5c2L7j<#$t*Tl+gBAl8;zS zktE?E0wo_eNX0R7%jSz?7a!aY8>JVT187M6I>7I-O5bDo8;Q((wOtLE{w?LW0V4b->Q5J*gy*^x;JV;)%*s zVids%R0R9D;4f}%_yQ(ebPde6ED2vZuoE7*PI(j7AK&4;3Hxu|!MyP*=Z(~$MPjl8 znf}3u-^38Vpb-CwLvD27#SpyFfmb;UKOes!c%j1pfC7vGjRr^%n*uNq0DvIc?>j62 z*lY>_o2~n93qXu50GN>7d-3z9{l+I zL(u!+HhBE#F8JZzE%5#AufR9gFM~(d&Vff)&w_`SPlLNXUEuzuQ{Z;j$Kd9f55d>x z+QCg?fYWtvgA=PX;OMF{aA0{6XkRV`N0$h}{v|T7zmgC3E>VNs z3q+u4z7!m+$Op}Dpy{S zpsg|w?1lQ7D*#8{ng#aHoe4gelLdCqoe6f$f%?e>yYY0et$Y?}DoY2Acn;V?WPshJ z(?LDtQ;`N5f5XM)YDWUx`13f75I!5UEt*jShZ)=Q$ndMpvF6UBnn zk_1pAjRCcSM6gm24c-+;gLipJ;9Xu6ST#Eute71M7R`zPs{~WQ3c*ycIzJdJ&kY01 zvxC6$tPrpyI}}uAPXY_mCWA$3lYmGp0R=ohK=TVg&dgaLGdmMxW@druNr@mPE*3;Z zMt~_(rhwq!Nx(m7BJlAK1U|lgfWhzqzT**KV>b*~S=$(P_kY0v`uqDq-)mrLJ|qz^ zIjj*DgGrX*VVv-A)(BHwLFe$%4)jT(&{B~pz-J20%G%B`G}x%m$PDxuPw}?4wzhH% zo8;;}d9rce@F}CMtgWoag@pz9`}^DW(L>xEtgUSPrgDP=Ll{nd&g{@Bfr!f#&IDv^ zurJcr2dIou%#e^!?s$)}Y=3VGtOZy)PY&_+^k7W(wb1eb#!L*JG$mxR?=T%-j$T2& zUY=td&2-|GW zk2wH+Z);60G_xE7Q(IwTpl2QQy?hB?{Q3*{_2;MH+0!TB`P0YXmnYwYpMUrkJpJw- zcyjk9_~HI7@Z-I&!FRX61V4Oz4LthK6>$H{OW?uPZms$4IR_qI>I4tII1BFgoCEhR zo&4uCI@?*(6e(h9D8yboMEyaQZ1x(i(S zs0my;uoax&*9cDUt_K$nYz7y1tp=Zeunv6MvJsqbUJX9qRs&A#*$hr?TM5o>Sq{!M zEC#2xR)aH}D#5AEOTo#yO3=PxAvnBxJ~&Xj5S-aC51d**7o1!@2b^3*fD`Yk!Le!? z_+c*5DwRm2QgQag zk@`tO2WA|JB+12voj6-0m53lA*C8ZqQzfEsCwnIs_rSyg$cc1lzAH~8q}$VI4)%`D zbasJMT3|(%*GU6{grZz$8jWV}NV6a2k|&i!8o|lJdZZ1BW?aDMhuhQahdI({v|;0U zB8+J}$|s@#6XZZffuoS0>qWDt!T)KF{vweiKWBFCjEwa3T&upmJ|l0wFx7=dv$waW z+0$H-L?V%JW?FJga&q#F(V(x-Jd!7z>ZH$i%Mpr1v(nSjX3WfrNn;xI^*LqpcmX3} z-89;8`#_#hBo#?Te4cPtbn;ZQzCJG=k6)0;c6GF;InbOFc|w^&j;3&9g}mhCc&olX zW)6=p6bff21-gy2A6LK=$x}HjZ@+*7VOmV)h`v6H5$q(Pkk8}sa+3nWg*;JVTyRL# zWbaH~T2z`lYyx27=oOb;z~k|Fd_GU6h+_qZOr8+S%Zf=3C+F2ZK(Tc4j)fRPOeRZY zO$y~Q!g#qc$#MF5w671CIk<&qV!WB6oPepJQ=%s4&WcZ-ZfDSvfMPx(J|k0<8=e^& z5FAy&%bb?xVvrAsc!nnPgo#t*3WOqwXl6{BH*Bgw0AoU93PeJYNXVNtBP}f^Ccu0! z6M}tkXcm9wjP&G~n5d|zkO2B1gCtNHzM(P6F;StRp)n!eE;K6R)gEo+HYGG9#CO72 z$Du18JpgBx_gF_OQ_4`z2LMn^wMzTj(656h{r&yDZ}<1#H16-e3Htjxz_|VnVAtOP zjP=jw6~NrQ0swQMeT)Hk{pkRJ(hC5k9{|wb0YLwA-SZLv-7~fSCFt*eIhCv#ZVKT( zvA}Sp0(Y3N!pj%W!Sm<6;CU~69)ahN9)Vu+xdnP}!RH$2y>$^hx^)dag70e=!L4iX zeGWXj2%qEN*2UxC(YfQ`7Wo_ox6bVcw~ikMw~p@z*UlXV*N($yKe!0LAKwM89fnUM zxVFC$Ts*uBTs+(eF7Dq2F2e8oH-d}%SAmPWHiC=0R)LF+Rp8wIjo{oa_^blw8drhi zjjO=9T~**5%xhc-jyG0;|Y2U z9@w?85bRnA({sUo_>}X&uJS^#tDFZK%L_qcIS(8zhw1Q11G~y|!7lj5bHOe=4K$X+ zog#eFKqH<28Vl3Fu0r@u02|ABU?ZLjHsWbuV__OtRS4e+U?VR9tSW@NMfh+)6)yo) z!FMhPEQC+mxP!$zPl3|gdEDQnQ zB_G6B!9o&jk_(mbhqV|_f=Kz(q-wGXvZ^9k=0y8HC}BNYrBKOy9UR6d=F3znMUhIO z6-dTRZ*$sDb^NY=w$>nk_eo^9^W?D+1LZMP5IoR3S+1Wd|xcbLth~=ch zioD-MpUOy9C=_yEJ6mg8TU%Q@nuCkGf0P)CAs+sw0wZ~Hxq>$uB5T2p<}fC?sHjL0 zJFwa?SV;rFLb+U#2D$RWLa8s!8Zu)K z3s~FI7-EG&k?#N~REEu{pnRoDQIw=_MQgddP+BlX%fAjBf}{$CYPPrc3-c5G+#Kv|tzoxtjD;$|aa<)%j|uXP63Ydt3E6o;5Z@c_Sqfpb(%FeY zZZ3AV)^}BI6j;08y*rKK4E;AR9cXbkdVzB?BKx6*(Wvw%B~e( zs>0P-Y~O$>Q{#Nc`--In3EY&lXnmg}0hl{5V)MxYa=A=VRFog&>l?vM2$jz|7t)ra)SdEtN}S zebW-Agmbff!=;6J2?^QR$e;v+0DyI9_KXCnLOMNic6>OS5fqmzmrAE4q~!X&3BRuo zxQ25R@)YudKwoxDF6>3BBGt@l89%jJf16S%={!!3;s?AEJb9l#BTWW&RQ1160A zBeH{FHX$TDJT!pi?qK`3W>3lphR2xU7Jp*`)B-Rz`>UDn{|L1EH2~K{a9Q-)yN}#g z0r1jXoBtBLP2xQVcDgr3_l6nd@v)umZLE6(_`V4@aBqH7;1M(2=sh1tz5y_J!y{?< zoqXH9{wBdrx72&}4Y!sM4Bqf~8*VeRWr+p9AGj$e{4F3qEMEjRI1cE69@M;|X5#B$( zC6*~gN|s0>{Og-yJ?7uPE!LO#@7)*=Q2d9t#uEd`TjSXHn90FtI3*H1BU=RakP1*i zzADI19UUDV*E_bI>y5~*^-CxZPAd;is|?Pq49=~NNGpuUEsw~pjL5By$gPdwS4Z$` zBlvX@g>?!1>I8mm0>3Vyur{HvE}^g~p|B+ZZ%HexO)IQR!|T%UrZl`I4R1>;Z%Hd} z%f;(*@uuAJrrh$D-14^E%C_9fc7Ayszr2ZG-omeJ;a9ftE87bzn+hvi3M<R>#S_*s;;iCu4}JuYOikUtZwS6t*x%Dt*vcpuWjnAZR)CR>8fq%sjIE5 ztF5l9tFEi7t*fi6Yih4+>8xw%s%z<~YwN0O>uIX1ZK|tlYN~E(s%>hjYieq0YH4q3 z>1=B2Y-;OjYU^og?`dhOZE31&X=-X|scUIzYH4X{Y3poh>uPE5YH9CjX}{6dQrXs0 z-PTgu)>7Bj($dz})YjJ0*4Eb6-r3gP)z;qA*4fk6d856hvc0XYy{)Oet);!Kt-Zai z9YR-oXIFb?PkZN$_O1t=ZRMS9m7Q(1o$YmFVj}>bcR?^Pua-;xe+=Q-<7dyFb^1N)jCj_S_UzfS{!Utdrz<(G|1aUU-un8j6&3If5ALF1_^=K$&TGex%! zynAWGG6%~a`NvjzrZ>+zJM8Y6wV$OF*TwJOHf`fu#6yD8c+A9VOy~hl>XzsWPBDeu z-M1oQZ8l|W&a}Q(y>55%${!C{;`hJ@d-G$@xlAd(LWwNNGhzP<$;jP;&+zyS zN8=Cw#1XaL1s@eOXuh>zw{7t~&^^EL)S}4_J6{}L{>#{_ znWh`I*%w#i0}hvnALW?DwC?xqYIJ}={nI=kI;Q`9b>_r7+#?)cM~ z(%WURH#s+c=YBCF%VAs0TlXCoS5-XY8o&S6m0ND(!xsliXnwpoqRm+<*QNiVm}wTQ z$(uK(Ks2Ge?Y$-Lo6h)O6%RMdO<}h-S=5e3R_@r*xYs9P`8Y->veVc$qv%t5c5gk! z*y`nFibZ{HeMHPA?)a)4@dxY8H?8c&X5{wCzd0*ymR!?p-z900F5Ohzv%0WlF{knT z+)vl3&v_kn4;U9%*Lv>ToKIXXdT%~--&?+SXD5}hw(aWekEo2zA0O9z9wyKI^ufZn zUrZ3ke17m-#S!Csy%ok!Ln;=It9t(AB$eTkbQ8$;Utma#O@^QEu)t|Q{czm+ldrCx zpvC$;Iq5J%R&?rZtgdk5mzL|sd^E@Cx2vbzBkP`=8UEDc$=Tg8*Ly!@pZ38|j5IwF zVdf=xa?bDDU%m_AI_0jbp}U>;SZvxNUcAV3Zs61S!nCJT9j@ zGSiR!#Ia{x^!Pyg)G;cMP;WRg*+Bu`@$rbxB+VF*@jNfhqQS4n6TqMpN7R;!`8(g%(*6C z`12Quo0kzQ-!02D8y;uWcJI@RbJ#uWeAZL)i@*K=7fws4o3QugkLM>np34okX;_s$ z-KJ>qxV;X1m+!Z|b>u4L29;qqT(~{tA;QPjzx^>^!0dE>^2yr0AOHGz$@oi8pFh}} zGA_jN-ZA5;=={-}fvNkMdgGA`K0E5t3!IQ9lM%FNb%fE#4EenftM!+5T@Q3$aCrii zq4HjO+TDKS=hcO?N>iMIiszdjx_--6)|>78MTPZoam36|miO#&*zz%QVfoCyOX~cb zU((i&Q(Mh_c-y-Erx~ke*4;ACVbnG(aH=!zI~i0*WpIZruCHuBqAjr_U#)7T37jZP*^J8GUBm89`0hn)vv{Gp6Vsu=qIJC^3g_jdTq+ zjY*PN?qkO}uR+H10wq&TC6V*?berYh^kU99^Z6*Nl}kM5KAMRbcGhiqqxQ|GWr`)X@G@LS6DoLg@+{rLjN zRRw*~{0XBjU+r4pTs?-u5X>~muP!jD?KSnty_1tO>)`N-trZqOwNe@5N}cT8>gAr< zei?V}{e1X~&-N65xbf=wqGw0yrgYL@aHx#$ySY_j| zeR7=Na!WDWk;>TY%@}b$GGZ^d5eDJwl$U@?3}wye>A4+7OwVIRRK_7-`Oa;M3*t-X8`xn@u-F5<^%2U-`oA2N##@=T^O7BqA= zj}Er$`e?yQEA^r=QOA(Qhup><2^jxYgx55)=^8i7$R+G`jqHY#E7!E%jgu0nz)Nh4;I-o1K=r_I8xXJ@vRMa0n(ZZC{ah&WVg z62HQ8$FYQ^yC(-7Qg8mr!fon%?n`}6Mw!rSUw)g&KGXRLzIB@a%5UvlJDY7=m#;Z8 z7dh>`WziX0>N1vhcJ%T+Ij+a=AO|G^VZ>a3d-yQ2{+3STryXS7rs(2ZA5>eN93eGo;I>vu3uz~6Q!OITY^Ut1`ORot z)blwr_N`o#@_6U;MncISDgbrq(b9Ija5~=Iw4RX?@#xGRvaTviE@1 zt~8Ai*ZPZw36^3T^L0)uX=>A3Rz6SJA1~3Er!XGep5Wdv&x~st@C^7@;O@gxZ;KM| zerOsO?d!s!GA!(^-{P2t)|jp>ws-wm=;smjX=->>#srlUZ&YVxIT!sQU6k?#I`=&) z<9w_2$>Y{Ly8Wm1M1DP76uDJ6#5Fg~)vcz}RRL5+;3(5{cAwy8K>dCmBX!C<+4=8?N51<|_~VxFZJBxRc`oy9 z;C-hFNw~|~bZDe!%o58YE2q|s{>F?Qhfv-^;zk znRM!swHwX2sADPfiTxg0ma8k3vFM6*SOF!=ZJ6-qAUCdc^&KjsQJnu-uNCtbdyyNJ z;d`*!qQQdCHXBoK)S#-`vSWqyHMvs-ExbExF2}mTG~;91dn?^cC*HK0Q$T6xHFHv# zoMcu2jC7JEyM$2ARG|`P?_1l^3Fja6i zjmpR|Huozqwg@&&?sneIHd^iWxTp~ne|6&jQwm5KX8D1kZF#D-(SA^lf{K*~5>tCs}?N_KNbG&vGDKjOp&iiuSbls*;ChfrAH9qKLzkMo>^00Hsiphb!u@{ zo7=K^ZuzsGuJ`KM(0_H9`7O7$4l1LDJJP*#8I|ER+?%rD=(UX>|GKebWZm)Lx|6|m z57yBhtgAaBp`Bay_Nia%n&xlVd}i3Y*_*ChTl(|54IX`Fn~3LBMm#%gI%2+sW}W8f zd40>;ZB4UXv9zZ_t5&U_9d>1NX>gkK?4~Q*Oq01`*iQ~Gy-ZRN^SvpX1KyKxRxY-^ zzkbECN>m&^c5zhZ!!VgsXxa|hwDG*#IPdJQ<4*5vXqCM0P-Jxi<$H7+oy~9p`|& zzG^n3lMB{*k9oehIMw0-_ZA#w`f*ClNFcB`2CKN zM}_O~Zi)|LGy;qY`Nfxg8#t+q>Gb2yoC{FX3r?& zSoAvBZ0wK?`@+m2&e>@PLt5(pK)pr$a75RzaC%dHhc`1WcY`#f=`=9?VTr@O3oe|S z#$&o2;#*Axh)LJod4X&P9~Gs;LKCytF<`m7m8;e6ZH`^3Qu_&WU*0dd<{J6MF{?vV z#)t(R;pL9SsN1q)3<;6mVIOS|e-R(Bt zHIt%!5U-X7m-tqPkQx(a0VRVSGh9XS;TQ*|82NOYY@VYWLG;;~-P&i0S~T1rpWfqM z5KG&3*Zl=Cc3-T`q)PK%cWVMz^hP<0IdKQpjGM5-kv`cbE@uC;0t+!RxnZkI8wWg-4l#?M(? z(Ya#R5)hR#_vHlSu1j(LjJdNvH1SwFu8`w=lxC($ajqiV7dSE_wsxytCebD~QFy3zPil(u`aVw4+A2*$!km*! zG!(U6{a4oZ59Th-n0wL53Ev^wQe*1VeYiFOcWN{WNilObTKItJv5Y|V_6xn)S~6n28i15=X~5n0kmDIT&r9YTl)uw(A;eKap#Ih~iR!s|zfH z*LrSkwV0%eZoNgf=NNG~W>~i(zI)!(RHL(%Mq@cfXI+PJ76|V8+skXF<)Ql*PZ`UP zb1R~C6>H^AGWm{xl2!Gfv+SLX%B z>Q;*_-JW+uiRuo@REpyEeLDL%XR$hZ!p(#H%F$NmJ4ExHLaJ%@lMdx=A3ySZ$@Zfr zdC2MB3@RggWnp#I7)71s&qWLNwYp=~$L~GS6#CPC+2;70aGGYsJl^O-bB<5&S@*Hu zVw1(zCPz+se*RtQmR^&`Q$|(%LP1)S+;37mFS@wp8h^Ug=-RpuiC>uY8{hUm;XUTz z@v9AU&deNJvUN_^k!w!THT2pL^X}1~t@zRPpulp(sHEU+Z+&{wXhTBdSGl7-Zc=gz-p**~3o$RS3Pp?^;&uVtFcRPG?j;NL!i0>K9m4QRMYhhL8A{wB;1J&3Wk*_cL1)mw#`i@cPkY?wK=3 zqZT^0TW~7))?cD4zKC;_VsSE;O50v-z?tS$Y}U|G52m*$BXMX z`_%qN>6SZMu~L`mAJBGJ%F(qe7Dc=NC%h6n|9yRA1~WKnLS;!qc8h2Ydnc7~fbv%N znV@wS-m0gV@IPC&gJzU){lWV1Z=Y^XT)LivEsJPcJH?~H>_+&s9gA7R7nhbTK5=-h z{9)RR$?5pS2FJr~k8XEA|Jg(+AGNmi%!)~=Rcv!njY&W^zT~;DOMS=v9PckJn|{c= zQ{nPXc;=mL{td;&qQ}ebq;44T{k4z}m(6BmrZ1r~Hk@J`CH)MB0aLfPEGK+y8pk#s z1=x#9mzqTimVeQ(_gY=Sjk+C?>Gi2RGNW&yA)T;WF$)y5oHzaG}4cfs1%JSYv7C}_T=z^unE->Jre&F@rKYmBeO4?B3% z_}rOc^OwET>)AJqa5K$~&U(1V{%XvlC${#szt)&Np)wk~CU>~5txmOat2fH${!krh zc@puC?Y3^{&R*L3Zb$F1Pc$o?IC&pyj3;HT^5cYjtTIm7JJLPaXm!P8*D~X*r&fOT zMxuqLCnBx))U0wUuqu5TwCu$9NvhzOZtEZkWreGE`#r0mGUK&w-+H&2JHPm`E8wxE zy}5U{Q-x_pa>}aJ9Lw<5(I2g=LYvI*I8SO=w62!2l8ChA7g;!|ESw%Wd)FKB(e>M! z%=3N?+Jk%(^Z8`&ZpxVY+%Y-1`#PwMi8rZ??xts=Ek>~_V{hw|I$qtjr@0xD@92I$r4w=3y zcrRksf^!$ShvD2?_Tw-_nw&faW*De(3bc-d@nP_#3^T2 z))@5S*;|o|?7bYfKKyiqAMdjb)AsjVxD#9B8vTxY&c(a&wO*Nf1lLyH4P5845#3sr znq)nWKiBcV7yGwG^QK^VCnpczlCs=!UXM>U;dWl)^7gQxgaFUX^)s+jaknInrBQWK^bN>WgnQ0V%a_yu=_#3xPTEzdtC6kWO zKfGJ=pG4j*xw(>l9dI#~;YMY+AzYn++TWg%KkiJ!1V|i8AW0I1rWE2p&rMoiNS=Hz z#4k8FSdZg_#4GqLDuc=>6ksZeAgn;^!b2qyD1}I&0(vtlE1)t8m5L$_rdF!M3do-n zL)Q}8UrrC?6d?YFepeWBQ3Il=e ztp+ow450*aO%|cMYni7bVF;aWSjG+h#>A5G$L2x1R|3ZVzM$H z($SfYTUZfE(-on+>(X8)iy-C;R7W9+>X<@PfY6FUTBfWv#zoH1` z#$-4)gwui2|2x_S-2NA2hnxx}fB&Xf+mTrk#h+ag4>rNYKyu*D z)bXBYLuE`)iB1kH!3k7NAO=0ghRTSKoSqz}cVz;9TJ6KOp)zd#wid}@^XC`s11Nv3 z!2#6&z5WJC{X^|dHn>uM0hqcgbqfm%8ja@c?Ck35>gDC-=LfA?L_|bFLPASCxtUiX99@ zpp2TV`l6Lv1RXWpg^Q^S4(0ht)ve)inQ=Djd$#M& z`BcWtg`-YQ>pAhmyGMfD4|T69oMAc9F2664m@|8G=?dvpR+hA@E=1F}Q1*`MYg4p#762H1eQ)tGV`FDC zKpAm&n@gEl5z<|yk-&lC6lXTuyyH8Xs z(q#K~THaVvbK}aTrdz8QxpE)9hpo-~;@-VYdDELk%|+X9k9dE}?t?EbHuvr6^!|4D zfu4|inTOQUZ}%L{b*H?yxG8J&tQ4;5<~*NcFDT~u9*a6m%r_jC?7e)r#~nDIIe5v; zX(|9hcaBuY3j%CLVe#ullFpZ4AKN8sZ zXejmZSg zFW(AjU4K02THx%jw>`?+5EOak>9KX265UfBJ>%w^EXk?h5~l2X{=n?++3kI(?RAT` z%jq93pLGSe-{ctO+tm=6mqzEp6cDgK-7#Xm3Z$V$pgIcVf_VlKOJ>WS-D z>hP6g+2_{3bGqnezw3xc#V4knJ9O}?MJ*2((RYsU+VEDn1$*xD))b z?UALMTtu$z?q~P3$SzO1J4OAA*ZcDl&&F7OJoodd?=y05pK!t+-}~@!-*3IAefwYj zbXD2UeTt5L>-mT$Z}<0$gL92!>I$nJ+h>}_aZCbL%};^_#vt*^0U(}g=hFhVQYwu7 zn<#G=#rZWgo;BZnpy80uJF|yxt^du87;Ynw8wZAfL*HF=H>zQKbvHVcQyDAgpZMvd zQ6DY4V!^PU!%ue5-kO@a@?dYo2IGz-?=T1J8N@`-=zBX5+p3zQI~Gz7%|E5wpuS;W zxafe*kBP?fj1o1~{_K&(_x!NmoZi{`%X?dWI)a_!wn+MT(V34D<~|+C-?GoY;fPpd z{Mq3<--K8=g%&RgbU@A>&B#3MV$)<4{^NQ9i(O%qQ(%1YTm^4;TBO7@t)}k@$7Nj2 zrdv@v0AAL(yyEtVZ;z@q%cUdDFJ5Y~d`~F$UvO>q#M=4S-7Ue+oG+Jo|8n;6GW*qj zPdYlPJw{(YFl>3!%=Ov351g{LUZp(jH44yohJ0hOB6(NrBVQ8Pm?Au@lN0I6iqh-COgJm1{O;n4Mo;L1m0?4#}dYWgiW8wfbo% zaO_2ZL-%Uon8iktlN+an{`8^4?ey{E;@4ZY)$aT@^`4jYhN{%4^a`HQ-eUd{hv~BW z7r0}rjU3V*nIg0Xi&?s86jrc*?uP4OA`0DMl7ZUjA{X z>Fi}E0&;#}O^Iii|8o2z3s6Pz88r;pBJ(4{?h}rxj`zPCf6_AaeoFWe>qAc1mAMJ; z8jU=9F?74=ecPpY@PVga{j}!l{Oy4SEag#-aXmf$lIbtYjul?O7I=;R)c%+Ci<&Id z2TcQN3+Av7*SDvs4Y(1+3c`9H__q4cb+b*4;q{6;j!~>>Y`>O;rm=~&9pnK zPbGRb{^y64g-+MxiPJusvK2=Q-|tLYb7Wh_o-(59qqLk!EeEaKauL)2c=YXW8nJ7- z@#hP2pBz6~awd2B&z@g}F3xzCaU^GK?Y7lxUVQmsXuI*O&aK$R%HF+m9!q-Xe?6n1 z?fK^)Qz-wXeY?S`_>cGQ21tLsmNh{B->+s3iD}of!OQ?Q;x{?OpB=*fQ_n)dTF*kE zaElmDuI(A2Vhk0)&!KXRK*?|iOsq&FDGsAYDis8#Aeb3tDvS<&PQ!0ubOI|SNOz1= z5WW~y;}{WEB2fsGB{V`FI`en;)~;wLEly|kF3^}$+V#|JR`jf4paPsgC~z8SeL?PPi9YM(-BnnJthVgA?1eDwZSTQO0@t}htaj^ zq=$7Kgc54VlK!h6LJ0xFSITe|stBX|(~%O1fDnh#{rrRI;h_?_=nX}1HGi-L^?!p+ z4-fSv$kCyv3?bC_^;-Xg5q;&8gXrPo6+B!uKz%ygyAy=!c9OYnFMrf7|IKW{uY%yOpW;a z`@pW_7wXFkXN77Bkn%uXy+U{}9X7d05k`kT#U;WrdUz)zdf z;$KBaf$jr!u~C#l1SJEbka1D8VNno$R1^b}f7-nCa2P&?Y{#J?R9-DrQc^Myf`=Xs zZ67RTP|fS%R^CJc706W+SyBy-OE3)#=R*(I1!chqZAcaal4NWaWH2-f$>tlvv%J>z zU+d!f;jbHGujLz#IXK^<5(NyvLxu)GpjTC>ZK(SJnc%FUpLgCkHjo(@&p;ME;1WVR zY&=5^+g%UZ3GGh@B0c<1v!Rl_Y^V%4&=eS|mX*P^)KKPygbKF2J|dKmQ2kFi6_P=k zhFA=hW-!W^FFpLPFi3t`uQbqKHkb{Sks*eCMTQa>4qXWgC4A`eQtzr*fgh5(T1D4e4JQx1ln~7%tGwE$r4hoFNivpcZ(t0f(Mi(dgm&^w-4FHCv8S zV?$-|QF!BqD-oGeSqS|?4;e2|V|qH!QNP|ZFFoAg3xX?96)sj1q>xG>>Bd*rHoAC1 zgf_TSi5OF3r0}p>p+q4-aHSlEyih}zsxa`D_NofX3*%$J@KE|etmk8hJaEd<8Io7$ z&d}Elh7FaGqtuX<^VG@`TS|GxIVz1;XECs^`=d>BdJnU0sG&Z>xZt^hZHts9G3QCX(Nv4rL>_kh6)E) z0*_8(lMf|EUh@{}54pcw~@0$kohV-SK2vEEv% zty}x+X9cDP$J98-&^FS;2QqaP4atT&U?CaMA+Uj!KucgB*3CbUlPA}w;B$R)LYn56lQloPDpYZ-iC}bCdT97CVSNbvuPQb2%;g~*`OvA~+ z31g>8V4ND1coTbnI@jsyV!|5mA)WVsRE*UB|9&wMDpV?`;( zO1xqi;B-9@EkPGl4B9OohG0XwV!B`_9}s8E(DV5~Ww43leB7!v9Ws|?qhFAaId zfFPkViGGFlhQU&Xie%cTfCQ?gV`wJ_x)rJ@gGN<5+n{RLGhy(6!7)D6r0En7my2jI zrY0~xi?5XX3X~-ZnGzM~HxSya!9lN$nh19Ra!k&He%j&kmX8WB=sg`y0Xje3I4jgw zFV>&Smrl+Hr~*-;BJEItr!R<5sey3_VQ15g+aXpMT0s~LLqAaSwVMJz9pn1sSpp@0 zmK;^g(un|#4IHK=YNbLnU@p{{5Q7oaNaGFTkHDAM6UXF|HEYy`F9|22Ogeb7=15YXY2?Jm9s*9B?BGE7alIa zt`kb0H--QGt7z^0HVZ4o{`drM5a+KC@CI@J_vd#8wEp3BwBJNB)GK3JZVmiVK7hVv z;jiZpk-zlTI->n6_yPc6JMOS8IAHmi>mf?gXRhR?LuX6jN;a@IE6iC$cbVRNc zU@RMWZlt3=dgHKPvtP_@)<3QHikp*P%x(VazPdT}#oXqQd&=f~GJjrk(Tlmwt@lcr zXTF%*eDmd;=A0LEo6{tGF)aHkvnkO4BvDMjnyg(@^m#Xd9mR@brgdOP`a1xi6?!;_ z4|Kf?|IvNdJKxp6q5lM!claj&j7WksE$+Zu_f-cDQ2?aC&jkQH%+jXJt!oTn@{0slW|BH}X zmElgCQT1Zs+5Uiz(^2l^hWE!k&o0F0Yh0up@y!$t5ND)tKuW*kRt^U&Jky_ZoCc&6 zDUgCRaZ(BgNI}129n5;}IxjP;-_eA_0ad+Hup-LcLJCr(AWI6wzz=|a#|#b!Eb5Tb z#FJAvK;s~0>xx6lRh_dT<*Foi>r_b6AT6K+=F~vQtolycFK*>A)9FX#GL0^CWvgrDhhpPbqRngy7SyWjro3<_`^66> z^>>SDuyHL?IN)Iy06=U4zXJI66IkU*+6mam{e-*qLq{^f8YWQ41lUg&p8S8ll;Ez_y7O(U(Pbj z+;h)8_uO;e=ia#^?<%U0l*BJTP{4p~BG0O5K2(E=<3l5`MC?$>!N}dI3UMyqU%)`? zj6F!WtivG4Foz4uUduqC>j#4geb&jGzaW?6GL^6hNoxPTp*#$Q3PGV3VxAP2D-kgr z5mO1G<^6TGV2s*H#NbIXOS%d?m+vX6_wO6J3b;!~-bVK0ixtgE z2>`c-Zh2qP94Y~DeC=nGJMN;PLbB#!5J5;3&DSxLf__@SfHQ~Ya^z0(%%xL~FKI=~ zYs9xaj{z>UGLHe-nZkrO8be*N8R|2x*k2DA7;xMHj#KhXTR#WfA~uhK<$D3#Hu-5k zbT|N@w`Tc%AJi^HtzZ5_A5=4u8aqMjVmnhbC`gD$Go&~pqm(C0WAmT=WZSI|Ab{+j2DJ@j14po_ZKP*~J6 zg@hV(oD4~KE~+eGpk%|*@&X3dy^ex$IbmE%h_TQy8#r5V5!Wa`O{C^h=oX%(ol6|2 zDQBbH9yiCPZ!<_3`&V<=1H7!MFy!%Z!*F75%0EOM)BNx*B!o0{My1=XQndtuaxY#=CkZL`&Z*^-OXohvh-fM zXR#{)+xq=X0dOC&1+|a#mkGs=GG0DCC zC{o1rE{QE%$HzB@u|f8F$sCtKVxzcMdS%W=nroEn&c+vnDGt2iEC@T(%bm+=Im=E+ zMnO*b-nU2OVum!47mX-Fe#<5EsjWn=PE!WwpK56t96eK7|;iEwr z!%KJxb8!vN^CX#fKq@b}I0c;DLm%70sUmfZ&Ig?u+}dr5}(eTChDzxN4IN z;T6rV0Dw7uCU=URz%b_cFx!{H?Z4HhxaE3=finX}BV#lg3XMjmUKPu~%k?DmvM~ic z)5i;SMz0EH=NgR#2A)-^3XMko-4?fP0?(>~d(L5J?7UMI%-yL9F62WQ6tAn-=opaN zvJ<|>#>gWvyDV-NcbW}UGjU#+a4q&F567L}t;dbWvSTdv#airagd26(>Mxrixd;ItpJmLcEk zbKQ%i34OKG>}Coa6Zli9eu3%^Byyah{m`@buP(hRSR5Ca9XnJ>plE&-E1O=WZ*eP{ ze~Zr=S2^`Oeq%ME&ow=2hm`A!Uxbk~=D(~j#!eX}`dn-V;~atj&Hz^{iNCWp%zhUI z4w^s3_ywvtg~Ltn>Ljs$;y6tStahB}_2&pv9p7^Oo>Wfe7~t8(Z8>ngQ^H1F@1$+x z4SXm~MriCz?lkvy=YXH%qgfo)f(dd_uW{p@bXyLzrc-GtjxH);XvcBg`$B4$o#$P# z=WRJH@1IJgcG>(YuCM70RC8VF{pW9YJKX;;@S#8on1kopDMj9RD(JR@&(de4HQOX3+D3VT)sR$kGA;{*}9B*Cz|sZ=nYhhPh1Y|%%Yvi zlykGZc-<=$baxjf$7t3hYcvJiCC4Qi(>}5$5 z$%9<2oZC)g5=ve2t&Sc0C}2|x3tXFn`PKWV^&7bL^6_p~SHFzgP8)k38{&D#Ny@c3 zxX{@1A#uvr{72Sl=3{!QTv?9a(?wbn%jkV@eVhgxO{#-13Ru1a#uP( zl_lJVUW%6K67WW*XzsyY#BB=_BUCiM3jn*m!dMl}R{+4(a_11wlMdW~(;Do-TimwE zBK|-!P6g)r;m}q<6&YMFVvwGD`~jF^$H20!3j`lS&t`uBZa{E3dJ-yRvVrpb$qW?r zd^CxS*j+7m@jPG760X0aFnUB38G7FFI?8K^@5>Yb|JjwtE9!<9n2NPr43@QZssM4=7*;)-iRr4H4FnAUhk@)#A$9XnJsuoD!&p;DF_8JMeA(by2TxNQkbcGZq$My==wI=_^iH1Vs!u zZM34fLV|sC!c|3cAwHdbUX#y2yoR+p+?u52N+af)E2YO!$cM6IW-3v%s3ZUtjLu#B zvT_Xrj>aB|lQ6vc#N*Bxs$vEd_kMv#oHt$uMe_;FxtuTBCN`f{G(Uxz`CKBecDF6M%b@jcCi02xB3M;<>L9PS=HS z1%qur!m>s0M|Cg>r?>tiG0`3mw%_w9gN`oR(Ktw1JGm74wBPh1p^r8k#nktlLcyMk z&1c}{;35Wo{`2CaDErTQ3lbCU4Lm4X(s`b*kgO3Tq?zSd)U8(vd-h;yC&a@{d;Og= zFan*MaC_p3Cwhb8XFOWS06U>)FV>M~a5UuZl{sGHOE#=~y^GVUC`UL_fMa0D7JS+d zpRtAH!`Bd1e=`zUPmqH)MaMgZ*mru!38%=1WB}|OM-RnLar6YS@^n_Fb9X&YQ2<@f zPa^**8lNZPb5R9TtaFq6yZXfAqR>PyM==#7aZfz)M2S$RL;L_-DVGWjJjrLDqHr4) z8uv>mc5AcWr6HbY5>8pKwWa*`sTOo8o89aZW09-is^Ymowc36BABZU+&Ei)#4aPv`%#ltgQ?2@OsVO zscdZ}oMt%&O0AO}1Ka8*c-XyWzo_iJ;9-_<%KFlV*S&MRNfqDpMBv2ev>#5)u&@Zz z^OozZs<5XG+mRM`AseVR^gKpd!VO&&;OVr>u}$gf7NCgRp`v>$Tn~{ABpi?3bWwjN zcF3%vO_JE`W)lRb?FuJ3&JPXUBYVfu$Ln5kbW)FjM6!$R;SvX%-R#`vPuOXX;Zg7G zgvYS>veMq)xf=N1AXmdsFYRjhrdQ@_7({cF$bV|v#Kh*a?8eq9X<`(Yd;OeK9H%J~ z4<`|0;wF0I`l$IV8{2%Ho!9>giD?qvNmQquQ*c00(q$GNPNhk~>nQ1J6@B?d7YZ3P z!O%UJMjWK>P*E4^<`Cn~bkg}0+it^A5Q|0-s;6cmnJn8r)VW0)$RcbH>&6%M)CUM& z(_60FWEGMPj#CQ9r+tOPs@~zNY64^!B&at;P%qLBHR5{{E`~}>lqC(Cl=W>F%Mw;v7&d5$B3~i+o1{6*85`g~Gs1{pD z=S8XGuQJD%v~|JNpYy7poDXM!JAE8I9TzF9+;KrBdyQAM^r;x&Rj!_J2KMtRS0&yd zoPmgN1`Od0%stcQ-x|=CDrrrVw53WrFG^d}q>fWE$7#a6+soXQF-%LSB#u*3$7v~w z@UWL^zrZiG^P)5jefD^LTp93oI0G+)Gw`c$27VFFz(e5-913UPKsW{UG^vNy#cBs#JK_gL z{i}xcAN0-DpAYh?pVZ7_faClB#H(D&c?_o4lOJCS`Ju-AsK0~c2NLgZy@P>A?_l7a zI~Zt7mCZfVnkHM-c~P2+ntRTNEy^YO59iTkspAWx{XIUE`+ewI)1+;wp1is&b9{k0 zs%Tov^Sn<8R|cr&F%U72f!KKrEStxGejWqa^B7n?kAY2?D*fK+PW`^=oPKYZQ@<~a z)9(#&>i30k`n|zU{k~vMzgOj!#6v7qA zxg6S9$R!4I|E>OkoLf8ScxAAt^Rj|_i`zD6d7Y91WH}oLU3(;Y34n9`HD^vAC!c)1 zQ{v1Su>W?*hsN2|Tn;@uzE|bwydZjWIdYNWg{M#Ahpxxj{E?`E;<6{x+>XhVlRQ$~j>)ua z{eZK9cCNq1ecj1Zxek8iR$0Z$5-w-Z@sY%tb4k&11OU_pgIvxakX-XuJfraq*3EMY9tv2|0Z(`IjC_e0FBi z&OD0Cq?~y)mq{gL(zdd;>;THaD_e6EL!GVJ0aR_cy-@+S2{`Jtb8nyP<#On8Q@t*i z{%QTVu-*lPDA<*If%phi#gr@8qkdO2k$YSmxBeQJ(&wD!ymRs(Pb*r!!s!dEEXVzU#ytLA!Jh;Xl{3yj6Q>xG33fcxidifWaZK<~ zda^)}9&B$&2HQBtUDOc4IO=KMR%xsNzDCZ!OHh1G@NoUW0R}1bTqr5>l)dwUlzWX3 zs$X+uPrQ`pN)O31^sFQ%p%mJ2QqBiqElKdhL~WHhdP2A$4C@TS+SH2`_b7Tf7hyWd zz*(p(KJgd}U6j4ZwXBItp|NtLPjP(I=gjHr{F2IWe5q`l;CPEaciE9Mz&mZ%dV?LE z7aXtgy6fk9oVIJulz|S6i94V07w3Aqb}E-eaS3yC2IdZpf7>?R(G`-ge$cs|wtkkd ze$dvyy_awv$wEhv`8m2mdOuA#Z!1n%KUh1_v7H7R?dS?|uBUtdj^Xa`gbN~mg#L2E zdE11ZI4J;kzU6)AdYTO}_Pi$rDCV+)of0lN*b&Fu0(9<+3Mqhd29Yv3m-X)xXs?pCa7?^9j<}eL{D_uYSkDTqAZ3_28T=n2n2Im$GI65hA zXm0%YciD?v!65gBju%=NPs@^XjmzGzpZk_ANQ|aJIX7pZq~-M;erG;P>+R=qu5qis zq_{w}I;W4j;>;Q79HLe^hF0Dqt5~@qppfyMDRuD5MzyyVph0~{9Myl$x&G4J zJ6rY6J6rWb3R@hvp5}5c%^u&Y^{p9%*0qO}(f)I@rw%Ec>o3{Hi^N$}uM8hEX>J?k zXdD1+moh1C8|`eM70m}oO}@tMxI($)SDf3ZQ7ZAqwrqdOF{EtG8Q-{IsMFp!9$K^g zDcg9`7IJT$`(j*z_mRsP9JixY-y7{i801>zskq~|Q<%CJh_tR%7hWRm)#Y(ZxSWBO z*V*yTK(#Y_;$W`~8zNhu?2K!bgy3QZIomaELd)x}28nZpZCb(%EcLcYT+Uzusp7T( zvA^MR2A#Aki6V7Ds0BgT=M)y{_=HZI#-(=}Ixk2K{35JJMV`TbGs8f_X|~iMbWo%d z6GJ0i`N>3p3fe{4g#fPDT|DXU5>7i)gV}`@R5==I%dy)k;zR9(n=@5z3*om0dn3UH zKei z)Bq%WRkzHQ7VJnL;2o`(6ac)dbx;9tni=d<061w^>);nW?@Xso+j|rMi1fpb+m+sz z@W$5DxS*3O_Zz?gfTYBkPB{~4SEk&VPCFAR$HoWr;C$f$tbc8($!)Ix_vX3J`_Ilc&|DYEE3zW>3zAc|r1B4v(T=)DTq|HVaf@1UDgGU_LGgcV zaUVrW)==&i5aqwX`_ZRy4)e#Ozba&)1D{*m>}~uz*nqGTIuP69X8nwa;aOFf=Q8r4 z$W5?;_6`UWlJ0JtlgNu&UT3!z8o57ltSY4c6pr(`9jahkK<7oNt-5!1n}2F+Kw1VH z-t1-<2>!NSGG({rIX;%LK>|Uun~l!0T}35{5{jZ+Z?CFspf~xXW5A6>+DQ%`X?8rf3{Q3DZOF4{)%s0 zIH&YZ*!5Rp1fSAN>CO_KI(G&esMfii0glsDhHb#{vCP)u5mMLz(U*LS9T3xn9S}M` ze))NXCL6_Rzv@=M7K5Q|4)5g!^thJ-BboPjjGbBcmXZr~L~yqA34dXKRcPdGpAe~sMQd@hhvFNj7Zus4 zqM}}ZL6|~gxe|>)s4ZM*CO zJJmY_{R)MWWaLAG#gc@ZODd#mjv@~%Eh;W$dP0}YufvV)0x45MnK1}qE*|z28te$; z*N1rvO_EjmwhxMog*{)$ z$ogOJcuyX@ue*+UkZ_ek!nYwSt^^Q-3hD?EG z82+6WcQH$096Gnhc;$irsZrz6#iJWF+>6L0`uW9zQDYh2-&w@K;35W;i@&E)1DSuf zQ3I()H)@FC4=-k5&te9e7c;P9F$3&k1}YabuyHX1ccT3N5~Bvu1dj=JFJ_>7F#{Kn zw`cPFzh=~6;=D$Uz9qLbYNRhA`GLgy*DPV6ehC9dmVAp*11Z0sQG@XOKQd~Fyss@` zU~mZoR2&2HI0i!E7?>W%fGUoGC77yziBSV1<9I_H18d?KD34=c2Vy+=^3NDGJe8-r zyE|_=8S!MRXlux>i})Og|5_vjUwcXY8h5fq!hOWi977qpy1CUVIT{sP&a!Dbcbi^C z7ja)YzM`y={eNUZ7>2cng+wa&I{PD(k!`W&N){(Q=mcZw*Mx zw0$LX{n)s6@!^%s*b8lAFa~2V24nF57kDNWU``6aE2#kQqyoH>2JlQ8z}6IiwiJLv zDF9EU0KAX_@J0&2hbaL6odPf+6+o2=up$*;O)5ZDD!{#|07p^*f>Quu(*S;-2Jm4j zz@=1xuTla0(*P!=0nAJTSeORDqyc270o<7eP>}|(BMo3r8o+~Tf_B%Y2zN%jBj91= zyC*X6vxy8?ZB?vgi%Ds+TC1%}fFQKluFlRi8U++_gE3=Ony(x5xjBg$t9(%Ti#0KE zcv7X(Rz*(!A%|*NSW9W8Wt&M^ZYsqi#xQoITtX=EyaQ8JwQWbFYb&i(nr&5Otfjh2Syoz!-(e7? zi@kLmCDm1?dJ7v}%HmB)PRkmWP8&}`4r`#g##Dvp$<T678 zcpevO$w#L|S6V?=wqdF*wo2B*mXpK7Dyz#j-xT6obR-7DQwmUQJSOh$Dm-$j(t8jE zYqD;!RNbI=jgYcYbIeq=)ncu#+G480QwK4BHA2cpr7pE@BFACjfn-7oH8DhM=E~|) z)>5@eSyOGPVo6{;Fvf%jR$;jrK7zK;Qj58ltX3=Y#p0W7x!YQ5Z9qEwLJWY%BL&O# zY{cQwwARusOO<%sLsS$j^PIear`{@URh#i#ofQCSCN{gYmQ5^UEn7{7>Ka=O!3pjn za^5cFm}+ZFH<^;E>k|P_dD6v1ZLF-s*ag5E_EZc5&%`j~`EDHpW}Wc-X)FVu$1<={ z@1X{W!P?0H&_1D=tI4P`S0}<7nB&RSTeg%|ZOpb*nG%6TnnIJc)>2&s&>`E;H5E!UNLP zV*N0AP|!~}*sNAlm6z^GX+c#viF9L1eVM5So0(KgC2O(*sD|ZAwN#o`m2N@Fo`F=W z$&@l&nT)K}Qnjfz5uUw;PZ6Az7Fjl$lFLi2tE+RcSx9PNP2i9GZ)ODa==dUlEmEV2 z6?BwbZL4Ad@{!iaZWNFJq3A|w@l0yCUy^Prtsi_eM41^_L_n46M=&+UXuVr6A@ z8JzI&7o6}Q@yj;}&J`F6b0%@)Mk{6*yduf2F5M_L5QzYvNW7X_UF}gHye!F1&MB=C zbe;&{_H`El7zKS`j-Un-0SZTAiiT_R7>vOfjKLU;!5ECeNLV%J76W)65N0g^!ij}T zl{mZ=rZNCHr$kc0Pq|eXrz*8knka2VP@o#W`&nr+v-mv<fevbkVcnk_u z7vNN8DLHUfZzdqY?n%KA&fN4VxBe@bzxbGro)MdB%6VJ_J>#`oYy04~@olNo%W5UwRLFb)7-OJW2L4!5?>c+|g93Apo!lRl z0dyXH?m=!5ECe7>vOfjKLU;!M_X0$W(PcfPDha8v*P% zL46)PhwXbnPF?|j2f&UK)gAylnI=iVj#KI|3E1)7VvPjsc>GGb1nfBdy-NaioJ7`3 zz>X8z{SvT~De5yCip z1KQ&P2-^#QZ^e3Gjjurl{eKGJ_6dLfVGv562y31Mp;U_Sd>g=8j|0oxGb7z`&jLK{ z6Mvu@GC&U*Py!i{47sohG@u!r8g#g|@$7hif3UVQ3B zc=4$x;mMbtgeRYR5uU{7rw+lB4?GD^K5z&QJ#`2U-G|p6*mK_j*t2&J?Acojdn|jP zxwH(nH`GFHDPCnzX4wp7rDafCoC(`AGNBf)#7rp5%ZJT*Nl=!U51TVGVRJ?jY);IC z&521+mVx*rSeuaqYZH?o32}+>ur@Cq^2w!zwHfiSHZdOZGw{+vK0YUEAu~@4nHgHh zOw>YB23`vwDRBX8j!S~FxFpEeBten}pW|UIUYdBwkHbp~`S`5SLjHU$WX5SBQ-jw6 zNQzqkNty+aIbRD&N-bp0UjRvXDHlL|aXiEqFM#;G1rVQz*KE*c%!c^51rV>nYc^=- zYaxFA0*F^G0IhO1%vR0@ZSZWE9gLj^05rS^(C}-3A3O=P<>wGqdH}$32xv<)K=A?C zZmWgumNKZdltG!P3^rTV!uH~P*q)aUwHf&%^t!ott)SbC{9)aC^_nT_Hk0T#v!D!; z^2#7TFCX&rGKsD;^YS4xBNH+c@j|^1>pC+r9yZ5iin`1s`Yh8V!CKU7ToPoWjy2z= z*Z7gT9ZjF5+abQ73>M_oLVQXl1n1QP}B}?%km*UE*|1z zwV>6AI-Wn9=s6yBJRkKf=zPI^Ei9P7fard~{4iLc41@Tv1+XA23}%OgL6~wj!2Eas zr50%A0)Q~QW`g(-2J40Ks7ZbTH5~4d?{14*tIZLaX-OfbHGT(3Ck| zm^L&tG!%fls&4#Q(PwCA+O(P0#(A}bZfI!E>;uOex#Mn=JEm=DXvjZc+_*rse8Qwj zp;N3grwtAHH`dnHT5AQEHZ&xCqsVA98jFgGR#eND6+@8LQjPXW=f1o+<+H5ptew_bjoM73DYMOLZQLt*Pn(G_^|vQa znrF^x+;{xs8)weFVK&`8o8T>$sT{X=@4o%}_U+%V)oL>la&vP}9zX7OA9tUzSY-YI z0c4bf<14vb9)w8=MR}%LLxW~oOOV7LNpL7dNEAT|g+OxLY`y*V;}(n5&wttk5#(~u z(}W3fIW=vXoA{qAE4!<-%xE;0loS=+Wh^QyLr1QB>a-Gz1!OYxFEJX8`6c;A<6Sr+ zGa3wrT=~?gxfTmZW#`I_`T6J~>u zM?^&Hqa(t@!xu(i`N$Lr5|=E|&DTXOkBW?lh>nhq2v_+KNTg?Sla^_t7V6ZCqoX4u z_0iFhA_s*+BXBU}=Pp?irHhJ>LkZIL`pEF`h{!;75FsFX$XyYqTN1xCJx!mMo}R8x zj*N`d2dXDbLJlH9div6(D~W} zR3hGGGCx0|5F(E@63MVHp_0jD{{H@Sz_@^MjTXzz^(_F)IhNu;^|;XCnsp1nu|yw$ z!gJwx2FEi0+hZ8yk8$I89X}9?-|F;?*YSW24~R2x5&o6qbuR=6L+fD>4MIKx`VrtW zuopn|y(J#g=>r2EZe-*+48%Hypr|LZtX{o3A0LM0=x=RpO>b>&)dMxZ)k_YbXq~Ub zd4K_cS-r-?epI+Au}w{_t*vWr5*{sVb*&@j6$th9t*!L#oAGr>OCx?~-Aqfyhfr7skz3;%@m(MNnJ`;@*^#44*4&@((PksI9_`3f~@v4oj`qYgn zp6S!DoaPkIlncR&SBZ)g!Hd5E{)hOR%Y&e|TjFno0D;~Y`um0Ai}~UUJB8|Z6J88( zGhU$gRQc}@o=C|azMcGc-pON;cdu~Fg9Txn=p?}nE#WF^Zz55G>usFXU~~4XSVR0J$ufq*|TTQnmua0y)!_z1B4ll0#K%DYGM9|E{76n~RLZVR0}$@^1Go-|nzJV|MqeFOav z_|Kd^ZQ9J~)27dv6O)panw6TBQalfFQ>QBLzKMKj2qw)|&Q{Kzm!-UY`t8bjFfmRLZ*aH!7vu3Qa*j= zbWc3~^f+3G$2Y18!HQtTB+LpiDvQN3?e=N6FCg*w`TOHb7vBZbrU|k5`TO}>$~;h1 zWV|asAFUTf#v-(Flp!iVHxs6c{3$gFztoTNvy_z;8I2`IV}8CNH$R_POUOSAPsnp& z%G9az2!E+eWous<>s%?&CNF$@{NYPJcGfIgQk+qObDAI&`YIKKMNsWpPRcO zH!~|&Fu0(}#gLPQ<^lwm5;jHPFOf+tMnhhHZc=8}x`dT+2~0XNM7E+`0BsNuHYIE> z$|IFYr51xBH#ci#dcwN66>$kG($htzXw47-rc4p}OJx#^AvbGT`U<^vdGv}Uaq)3z zztI!R2AXith!YLBg^K*8QkexU61o-I=ta?sG@9t>I9$LJfLL@QA|fGVO6aisS(%w} z(a|fSq86@2dM&Z;==J(Ykvt*-CWqcO!z+JQ=E@b((Tk&^7A}g4T@;1%5z%^mbOaiN z!WSZa$Za7W{YxxanMo_6qZg^?hsQ?6E{}>P^k^O;^cVmpPZIf~{8^bvj7YywvpkAO zA=0Z<0{x`PB7fAsAuB0K8y&A+7#_PYYB^yaiS&^X;o&0vWX0rR`3;7o4e8O*>hM^# zI%>HVZBZzGbadn$m;jW2(xgdBvHVCdzmhWJmPbd%Mnx@(6V*vFD>CAaJ0c3`6^2%I^NsL=T2t~k5j>ggfL2{8l z$}iBPT`W4Vy+BXQuviO-l~J!xPs0OJf@XOOP#Ic3 z2}7-x7~v2|MMNeTCCKIS;RIj>76Qb@p;ay`Co=~tdX6{ouKVw?X%&11s~*7llF4oQJ&tY0zhSO49d<1|yn2G&JNl8gCKjhs~@{ zmk}`8(_Q`VfiSlM5azPqeHZ4k0K!}rK$yz{2ykKy?XHI+jAcV z3HXzpFK9W{NYH|cTb3k1lbwuGP%49oAMRt6fl?{>;VwoBG#bGV_b~c_MkDy)4n~jp zb+o+{WGm~a@GrK_(!1+U;A!9@(7WsEwjY1QyAF@L8%`X5wEdCGp9yYyHxit9-+6Md)&Ks@7~=CU`HuD{`Ed?#NX(~O~%Lv>37%F-BV`=n%}*9HzsL! zUEOEf9&O#-KOp$ibr<0A-rv;i+_@V+y$$qbfC;_7sjKTBz-^HLdjkab&Yglrb}IyT zU4I|(r;mv4o#+ezXnShHiQkCQf&%xH5VxQm1e!kao4Qu7eud4K#OHq<_yGmaU%(AN zuoL%C3<1m<6xJbdJt6?FKKz;xUK01nOT>HVFx&+Ig&Sa2C&0>1JM8@Ef`tF(nu7o4 zG|zvto971ucz$pe&kye8dHlNBtrCdkpS<7fvo_(Yppo!Tm48vwt##Y*i!XFt-L@y5 z2H00ux9!AbfZhFd+g|z%=(?SCU%gaUL)X;}(4W=S&^3YTBYk!F06jF8#5(A$>#wVU zK=p+abvx?-CfHBZ)%63=cqf^CLfmfD>YLYtvvxvXz)rXz+X-%oaM@w!hznpRfMh4w z(OhmyGn+wYZU^=aeC9#d4xnq-fv(*Qy7qR^ zwReNAod;dF4s_k^phMo>Jm`3yNMhCjm~}cZ>&#%*wS!s5gV_vVHtWD_HiOyR4rX&V znA-u&?K&{Go59@P4(4{m@nG)Ofw{XK%-!9P{T2^qUI%8r8`|3e+I8*FuG2xg8KB*) zgLa)6+Rg3IZbp9{w6~j~y}cdU+tJNKdpAHk;b(^S?sjPJ?uPbm#G9d=Z-;iChi+(x zZk-Ogb!O<+wL`ZVpc{Fc&CqQ|cQ>;8TEuXGjw)#LP<#pZZ3y= z@4Xl9yYD`D^UXKmnP;AXci(*%{`}`Z!^ahu(X3h=r}kE#leH6r5^u|!#7bJy1$`8 z^zT48Jd(vBs}=nT1N5dw5*)HxtyUj@s)MTc;qVB069yd=2B(Oe!vyPzKVg9Wf;UBZ zMCfR2BortCRo_wHLDkn|Iz0?J>M4Pu;Sp5OBZun+f002)15zW!BL`I~mFnOlhmR0F zi3~a#8XC~uD0m}*;4L!fpc;^(p8Ab`1G9Hu{G5_z%n1*eFnV_^VVZilUBq($~;{1dWXz1(0N; zUIqPF8$<$8!5s$=9aO1Ewo(*TO0tSj9OQYGO2zXB4bx1B{Jd#>OvWy$Zx3$Q4BgDbX z5Qh$4@RE}VM$ikHcSC@V#ztY#M*{fL3*yed&GBNPi6TD|LfA%w;=b7)vp9u7`W5;eJzm+_M zUIbt9ed)#g6~UVU$HZYV0iWcKr0?kPlm}s$EONP-o(Lh#cCfr*Z5GGX2qWlGATkzK zk#Q*I2ac0H0UB>4_n}vjDUXL-5A6DwRn6z3DyR zW$~@>e?~3L=)R{Y1d#u?3UC8_Z)%*t;W+35G2x?a7GH6Waw@uM`FP*W$^`E3_b+utF*DzbwevPlO|KlEhrDtH*Th+lgrr zb7ps4-Q~KvZJ4h9eheTkwe7CE0I==x-qzN-ojWmrNRMlx5U75t_e5P?9SI@u2bw74 zGQpD&A|7_rb`bFxz`K;!hO3JLJqGZW6#7Vw7hl)k?_mRgpJl#$0^_Z#8zu*!AHVFy zd$OIZ?6nQ!J>1En8NJs-?>PeiTPfrOy@bCP?S)pv`>x%20ACgIJpac5|NmVFBz82C z0ilDD4SxIGLnnmub~u=0z8&2Ek2;{?C3Mk%>T?K|2S~3rwg5b~06ew;{2#ZNj37)q zh{05NB$gmtNA<4Zl9gMWk4`e2e6GdV!xL=r<jfTa*5`d7n7ut6EHJ~`njBT9$_ zhr`}j3T{;fgnfoar~wm{frX^XS1$azr34Czjy9CCaa^Y^MCF5!n z8Fj9}pGG;7F%^97$M(9562lAJ6YKtD{CUW(BTa$o-)WkpFKC*i;nLvDsb}N%G!;+( z`TE+D(Dff2)dYDZmQa46+4X>SmS%>(tbhtsPrj|tWVIMAo2rznt+rZLxyr=WRa-Y} zr)WZvV*KO@9)bvEMpapqHbS#d@R;lIP_DLYF)58~>6RM&n7q+s-D)W_Df6qVS#7K) zMxa)&%2j4(Bqn8KXRIz(CMGAR7*?m~Bb4*Y7Q`=6dRPf@Xl70cieI8xq>a%KSUV+1 z6RXi`mc-~5#V?9q`)`nfU59{*^ZV=L*2P}ExPNGz{GIo2U;EqNeRjR|m-oAOhxazF39hZEfAa^S z-<(==eZdoJHrz*j6M6TGs6nHMi7%z3h~{hrx} zD(`h?ru|pNuO43fhrw}?=YAFcGpS4h5?}Es6mJ)l7ED;N{q&C}-7_(G@0{-6KRa2y zu1EjL`1%JPy65U60oIv+E&igr`D5pS?Dtode(~%>U#BiN#Ew5)Q+R#v!ktsz`dit{ z4VHk~sHcB2zwIA?fBdnt>wg!hej|9?zPFw|Hvhhp4GWro^Z|c-Q&RfF`-4Auxpd%= z@ozsqQ@e8DoBMN{e^GGen~7y*nkGuBX_9R|BEvK9g6VBr?ySE1$GOK(ev|xBNZ9>1 zi2QF*3T93T(r7g?F>xcy@nUZ|KH{lof$Ezonpj82-?EA(XyS#s6|>r8-BPQpHY;tl zCS@tBEN9u8+NIIab#--7TTNC=tz}bHR9W?wXlqR=);Nt;J5Ljifn}3tdg|Wj)mYOc znd7T?EXqw11!$Tifof@!L;~(@rMr8dc|=xryLwvbhxXru&N#yDUw&fVkD5c`dt2UG z@FRb7`a`l@S5NLEeaAMOiJp4;hgW|6!1f=`e(NIt@v6STV?SB*d|BkDd#^7D`(4dm zL)YK$JHfpFQg}~N!5^=;{I~yST>EtGRhi=V*@sjMKe+w&eN9)N{^F6Gk3$~0uy7^O*Jb1Df>QKSfuUDgWerqiOpqSuf0gbyxXkpEfbSNL_m5%ax0NmwjS&(%NmN z?L*CmFS>M|*fu=$Ew}Gn+U{{duZ1d&|CAhNz!pEv)x%W|#kPUqqUgRHvi6p4aU9wTAJh z)&3GczW|AZiq*tuG#zRV9KR4e0 z+Tx}0Cc3uvp_sGBe(~~Yzh!*NrLLa$RA=5QdurSxU;p*?kH1L_R9D=mX`*DBCRvTx z7BHC)GtbS*IhOI-CA$1)zkEhB&fiZxK_;Dn{n^9X@kDQw|72-uKIw>M1ysOfKSN@E zhEW?tQj1lL%FZw>_PEDSrV@=AIa;-50g}^`=ZG0pT5H)7RcWbN9A&mfmsf8wMVD=> zjxIA<*=X%;nh>Gd1c~4GRT?eU>PoFjGsoM>j+5LLI_lSdNqeBt#^|&$q-Vo^Esi*~ zV!!rplag=i-#!lbd+)Ve^&3k+ExV$+&l(=_)bxAbyzP!T;Z2WTkNr*cFHH-N%B>N1 zjX(D54|-00%s!d?q~D~COLn|kGx_A?I~E;C{p|6c*psV{Y|C*hTk)!?JR!sX)g`}p zdd6QC7bbo^^c!w*N96Qh*Jmfs*FN~bKXO}YR_bTPmPWY#>zez(E%?$_~*ah z_wg@p)1H~|3j1mKz${x`;=6gW4}NIR{^j)criTrSa=!@A_|t=vQWYovamD@jc{A(z zm^0MV_V5F=s!96AsXb>Rulz*%bboxq{y*l;cqzVm>bjyqD(c>!E}8uF{*(7k4^*H0 zZQmvNtNv@FAN@_w14oB`vf?kFG_BG$QTduCYL!$X(d;_$@1t4i&6*uCLpZYQpl0fD zt0B|MeWwSMX1cF)JZaW^W)z{CS;Ju|?IbGr-~+a>U-rdajcR^3=~KT?|EyWzOE1@I zG*L$;*yT_(ye82x-9Bx!R_`8c@sz$DgTxQ0UG}}t|JS-FCM@0X>9be#*PEW|4A{5w z$@JtI2RE+RQL*U!-yhmrlYesj!7s~-FJ>RIE>BT~{^R_tN4{C!I&S>$Kdu}oG5zpG z*JE|uz7N0Lknr$M_3;A|$-{&1(^=Q=9-Q=x%CZpYpWl0^=#7f>Z{FN`Z^k_@-sax) zW!sG~`mt!a{`52xH;+a!(GG)Whc((&y7{e!|$#jPuhfaCE8FXqRYpx|kT<+M5c*k92chIsD)+KRoG}_h(Jr{GZ;K zpG^{|KN+Y#yXuwSMc?^@zkYW5Z+0jsdGxu$yQJrTvA-_%fxG6|w@cq#|JXposi;A7 zUuDr7ylh~j@`pbv2&hP}cfZvtlxeRbn*2|Z@iHd@%o$o+?xC= zQ|3hfL;cav=C3S{A70Xxl<)X2cTmTqzc%?V>niDTXG?bfYF4yndu!eUcYXTklx^|{ zz6pOb=}V~Dpyr2t4wv3mMSuYHdSrJ0kzpu zX$stEF`JcWfe=iqb3)LmTpQ(@HW{8CNG}XA^b=f#fB|l+}bNrz9~uJ0o#b za*7xxw_vrQVDW$T9(ZenjXV~S*!>HOCQ&}MK9F}#YyR5c6P`#cA z_noD{H_A~9!VLtsE(78AQF(WRved>_ZzMA8$tt_jqX;79{ZH%tAD#iL_V@*m68-Zc#ENr>5+Dh)#HdeW% zdZWc`DI*E1jZl`>Dl4n2HsPH`L941+G~8Kgl{HpVt;xF8v@uF358C*M#Y#2a;;~F9 zQ;QjNDbkYb1&ZRHx(=WG5L*auPFh z^G8sQg7+cMST#DiFMgQZR|0{rh(RgWq@=77QbL{x$}oyRHzGZRzEP4iBB3vm5mXqf zB`S=K6;+s)pO~0^b3CJo(JVpL$7pq;>T{Dv$>5uiOrSvMn>37r5c(oTLZ7rEi8r0<+~oY5ReckZ z5ea=c3(@7@Se^*S5z%?;4il&}BqnDirlnw5@o^Ygl2m}TGdG`2|VC?-&C zNFJ@ZxEbpuy-}Y6sV~+;>Z4IY6`03d<5sgG4kzquFh#p3w{-5@q zb*pV8>EEMQ*grLjnP7}8Y_5TI7Gg-k4h;Tml4VbrLxkMM+Q^bt7bfKLJo}p8sp^Yb zk_}EsX3oyiIVTp~)z#J2U9IY>>Xu;g2A{K=a>ae!+b?4;W$ha9x>upIl!ZY3DyCxA zuF-fsIBlQ(^1M24rxxfHbk1V;R0X|2tDtdRg652WeOlpZDGNLF`elVR#jITe&RVUD zqr+zdBuPFCR&TD+eBP3*K6^emu6Dedi&zO%?-}8*AJhf32U zfIYE&gznxxBsWRQCcuJgFAjr%O<0f;)T_j~VzB51(6y2=^Zhz(!&6AYEOr^ly$bG4 z5T{UqH=+9>1h6dl>r~_OQ`C6*&Q8P7^!VOx3)R~VyR~8?dsc97*Iw86cDK}hf^|3T zR?9|qtZ{Zg5N7d>*cl?3FVx0?wh2WVAPiu4fA17uRR~>^TfB>t0jjrJ#_359P(??* zISl+8xOQUCx%62AH(>_9dA`qC|Acst|0DCk8^I#f{&uvFQ@+2~|K~+-@AM_q5m8_O z03+RsUwj2gpNSJjm#-jzl+E{3$r+2y4*F@WWBeA;*Uu*WN;~0zSsU zq-Rf@fP`gc>2_^V$VOdCBZ~Dc@S?~77h6;)>@lbxVHXa-$8R9 z*=K$)`wllqw4`aRV#>jBt7JadcaSa8288w=Y2P7ZZ@azqVBb;J>u+!0;d6FNuDB&* z4h~Hz>%qR0I}*OkzOzpDohOpjRZ9+XyP7MFHU(2g4q7yDaI6}M5B441MXqV7RmE8= zoUJr#KvNXvIUS-UBt>QU!5RAC44uar+NSjce;%Bnxh=V(7voA<$&|`6c{f_?a!H=z z^~CB^vXy_cu>NYmrDeI``^>=<-T!mW(AFxw4V5duq8B5RDwz+;GO}fgvfSp*qgCl! zE_ptAt%84)dpaMSpu4}vYppJ~R;7Co02Y56d+wOrSl~K%o(mmaQg2N#=IfF{%nZP2-l9Eu>^eqn9FN| z8%`$ZaKkv*rUA9Z{z3Oue{lHv;NooLzBg)xl43*ddR?l7cU0IriTsMQDt@gQH8 zI!o{gEbGmW?|xmX?{G|1@NTINsv&&n+_2=af?$c`a_C_gFnod^hGBY<{XXcK|z-WS2uP z#$MHG2(rVwgG0TxLT=!-)t2x@65W32I{t-d*sRs~lgS%FhlG4ubdkpb|4%1H+x98GHSSJKQk4M?4lxp;tO(9-psqraE^lRy!N#cQ55Wx@}njy)Q_U=lO&-YCd zPiq7Io&|hKm@)FVCW!~&*!fo&LlzC4l;Me#@`P#5iRXTa=sCalvSHb@df~CAN2p(0 z@8!ca=J9`z;QsAc7A`D@LCWI5@$(3}CT{|c4u5%dcF}*i*%C^B#~e94R1NgPZntAz zx$dec(yDdO&N}8*qk%;jwZn^^ciReKgu#ryFR^M60;?>^t4gE-CoX&^M|i|vAsuDG zJ6TUFMvQir#5QTj^p?7ERRcL1YM>0*(Aon4)P?$osQY(pT3GBbOFiF~tBni?qF5yW z6*|~IIXRtPLqPJ>eLa{BX}i}+9EPbFCXtSR#(NAddWZYCk1%m)dD08o8(UlLoN+Sk z^}8 z9(_w-pN+i04A^OofqsgOE9AG)AbEi8=L8iI%`q03BqdWwf!(=ixCO)R%w818mW}VK$tb#o zIehITF*EV`v%Z*pAAv_>rxJLwe0~pspUImqNV5h=@Gr-t9*L)7u#w+0QHZ&%=A%L( zD$BXEdnXEoLkzV1I~Sj?K_Po2k{ew>JZ}hh}f;Ui;x$t8LR^-7AUO{s7%|X9^(*ISpg!&g7$_6ErXp&|t zLJ0MX%>Jqs${cyW%WLE9RmPHJFLuX^^~YRUR5?03xr3?&9zT%+AU06A8#3#1cTm&z z!+cL9I#@}#E6}04XJ@lOahFg4?M{W<*%8_K*3PV}eTzVlZ^x(Nz%5Bm7y{2n7eU@d zmfT#{u^G;tPOZ3|zm+HndKXCw?hb;Mh!B~$u5#BbE+$?F;8l=h5gvYGLvUhu?4`_2 zvzWnl2hPp6S>Q|p@QFbpmb(R!=o#CozrtBOqECWC1!oV-IhG8A2L{ zJ{tF^n@wen!CH0`O)|W*EcU^QJlYE<|Jmza>>oTo{N>={)i3||>g4obzqzDL93s4= zxikfAu?)2g=Vna?q@2I0^$(5?_67&%zn+`*|CohNDB7BnwE|a;op(3_$=Jcr1-y7D zNwd)?=gF{uC-19-G#WU-&8FRyR!(%=qa2Xao~&9%1BM|zsPUzY$jV=Hni&wKF&DE3W zvsozk3#HqYCN&fUKBKLuFnw)73$Y?e#$W}qw-}^B4Vpy}vQa4H^q2L~ozJ0*2D1WF zcBJ)7O{LS5o>o)#O2Ku{&h+ALr`GM}gz3oY7N6A`Mxqbo^!n*1{&JDG z2VA(}B=UT^#_8hZXA_|P^rself|TKsLt#3?ib|};F};deGz-D3I&zuH7saU~N>US` z85SsKaGiylX$;E&p`hNg}OLRDaM~?XzJh+4mQt%*z005pr1|Ik@oaV02 zeWdqG63?B!dH^WgiCt<|;`y)f)r&cKm%Co{>z=Oq2VZ^m;H#gJZuiww%HOurUCi=T zMe4xw(_R(ccjBwCZI9B(j~t)4Hd_EUDawO5S#u^5;?JJCEUMk zwVO{gtiWB+9dC7O!}8HDZMB;l%?;Y30381;XfOJ^OW9Mr-CQjibj&otEw~3FRzNz- zbAUXEprA^XJlV>LtEfZ-6gHuE~WJy}VCppsZVa#;5e=_KpwU;Ny2X-@# zCKJbvLkx7_9Yvti6N)G(1R=!HgmXk(Zu8)p|Kfy``N1_`PSV>V68GP5XO8xBr+-X2 z_>@;nI;eO9^I#C^t1(F0bB~m4d@dTKGf6s-I60!~To^Pi5EhQ2_%jD5DG@ovs`Jty z5J)`uTSWBWn#V=?!8I?Em?`|1W{R9Mvs|!pLdh9fo~W|?!8I>AL@c_Cojm1|pNp`1 znhS-3&c^{`V+j4%c=xF$cd8?f+3^;fbkUBehQGWn7N{rPD2&g)OJL4}YyMB}n*Z~< z5$T1+J&0l>H-{6^D0v^h+MBq9CwEh833&AK62#HOCijZXpE1&!KMhV^^}7cHdrA5j zjfS%3^IhD7(~*D3hrBg%b6IveKEptDbUR7_wRvu)PTaiu0B`8?CpZ~?o$ZR8?Tkcs zv2q_vPgx-|-zy6&=wj10+N4FvT{3wW?J!DJj}*aqK)DWVG@#q-(b?^eb*MXSWRJi3f6%c9K!>*4XxA?(nKG2)>OGPlmx4PspC#9+O@ z{!k_ZyI?fPz0M72n+=#Z#s1%Mpv~8K|dwjqBNh#q=}+~!s?F04Yq{7GND=pLyF`zAh{KpZz)Am zBF2*jW)FG?-N77ST)88_Td^DC5M*o}MVR3Xj3%U{gLUbE#jh6u%NpW&ItFIUd`5TN2#=2m zH1tKJMxzveU5dWOuo)G8O{|_LYE?$5ehUh@`9OuMR^qlPY8w}yQs5nB5oe2PjhHAX zoCP0cVK8_VtFV+{%{i(RmlLy6MQ8Bi?^>}w30bM`w0`39^ygy-K97De^$5fjDh^Dmul(C2vC7%#Lk{kxXp!ji2vURHy_vb|%HJo?Nl zj|UaoLM+7(>+tVJ;+J*a6oOlRMF4Bbf@^QGjbDx-6zNUGI>?D_EJF~SB)A6H*G^3P zbNsL}?%Ssd{3CF#nG0pdBy1xp?cG&Dhvodr6JiL(QMHlyw!N}JpXFKMYytN}C?lwh z#)4RofMU`y$xVz_#={o@Ksy*e1?-x|^ifJU{wMZLMhI(&9f&z&GD+Tg^!}8&qkxq*HNuZwDH+!@aSn(BoSJ9eQQC1D-C0iO(sr!qpHdI zunZ3WaOdlz!6ALUX+U3ZG8(U9UqNHaZ>gd4W9lSs;@>$AAD8dnNw&C}#C<>jv=7gssF!&XG?=p5`k0mI4 zMuV7(*VA1EO*l+Jm=_Q&yneZVM94j##e^mCCYkS~VZ01}c;&f}+yv>EC0=4QsI6rJ z;~%L_Jr^MI9sGb+FoZb7&!qCWc-YH{mQ+g$jYjwQWT4UMB>+(zUVB3}Y^v#j*?5Uw z%#zHfGY$@8oFWjKZ-7@SV#r#!lT3^AKsz zV{yy?SPI9;EThrQVvpfT6OUvey#ZM4;av>?uMd~;!?gH~>UvZA;24aZ1mKdf03gH5 z?KsErJFleEVWk|g8SuNMOhhW{Wn5P@8Vkz&@(A`4_>E!rwE;zyozKj4?4(%E zH8+o6iANy;Mn(5|Rx5*nUQy^|&sGScak+6y1~ z8vEI32m_T4i(F_<+u~}~3RWo{x7@7~E29wYOQaqrBT&^#UjYN4j3^HAQ`$}BJu1{Q zYq-g{Qp2FJ%up@mT5Ag|_V1Fqii0*PRV{pp8{l>r`Z_mhnMPxQuJDuXea$?<-X{EY z<)mr6Xf5L$qyOqgLvaf^iOr3j;EMU-mC;y&(~R*8jn?U%d;0=yLChQ<_{M?0g;&0` z=rLZ($(H%&n{fi7b{}MuOBT}^7Vj9AADBMM*si- literal 0 HcmV?d00001 diff --git a/alliance-dreal.patch b/alliance-dreal.patch new file mode 100644 index 0000000..1a35e16 --- /dev/null +++ b/alliance-dreal.patch @@ -0,0 +1,647 @@ +diff -Naur alliance-5.0/dreal/configure.in alliance/dreal/configure.in +--- alliance-5.0/dreal/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/dreal/configure.in 2002-10-16 20:04:21.000000000 +0200 +@@ -0,0 +1,207 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/dreal.c) ++ ++DREAL_MAJOR_VERSION=1 ++DREAL_MINOR_VERSION=14 ++DREAL_VERSION=$DREAL_MAJOR_VERSION.$DREAL_MINOR_VERSION ++ ++AC_SUBST(DREAL_MAJOR_VERSION) ++AC_SUBST(DREAL_MINOR_VERSION) ++AC_SUBST(DREAL_VERSION) ++ ++# For automake. ++VERSION=$DREAL_VERSION ++PACKAGE=dreal ++ ++ ++dnl Initialize automake stuff ++AM_INIT_AUTOMAKE($PACKAGE, $VERSION) ++ ++dnl Checks for programs. ++AC_PROG_CC ++AM_PROG_LEX ++AC_PROG_YACC ++AM_PROG_LIBTOOL ++AC_PROG_MAKE_SET ++ ++AC_CHECK_LIB(m, sqrt) ++ ++AC_CHECK_PROGS(SED, gsed sed) ++AC_PATH_XTRA ++ ++dnl ++dnl Check for X stuff ++dnl ++dnl ++dnl Check X options ++dnl ++if test "$with_x" = no; then ++AC_MSG_ERROR([requires the X window system to compile and run. ++ Please do not use the configure option '--without-x'.]) ++fi ++if test "$with_motif" = no; then ++AC_MSG_ERROR([requires Motif to compile and run. ++ Please do not use the configure option '--without-motif'.]) ++fi ++dnl ++dnl ++dnl Check for X libraries ++dnl ++if test "$with_x" != no; then ++ice_save_LIBS="$LIBS" ++ice_save_CFLAGS="$CFLAGS" ++ice_save_CXXFLAGS="$CXXFLAGS" ++ice_save_CPPFLAGS="$CPPFLAGS" ++ice_save_LDFLAGS="$LDFLAGS" ++ ++dnl ++dnl ++ ++AC_FIND_MOTIF ++AC_FIND_XPM ++ ++dnl ++dnl ++dnl ++LIBS="$LIBS $X_EXTRA_LIBS" ++CFLAGS="$CFLAGS $X_CFLAGS" ++CPPFLAGS="$CPPFLAGS $X_CFLAGS" ++LDFLAGS="$LDFLAGS $X_LIBS" ++dnl ++dnl Check for X library ++ ++dnl ++X11_LIBS="" ++AC_CHECK_LIB(X11, XOpenDisplay, X11_LIBS="-lX11",,${X_PRE_LIBS} ${X_EXTRA_LIBS}) ++if test "$X11_LIBS" = ""; then ++dnl Not having X is fatal. Let the user fix this. ++AC_MSG_ERROR([The X11 library '-lX11' could not be found. ++ Please use the configure options '--x-includes=DIR' ++ and '--x-libraries=DIR' to specify the X location.]) ++fi ++AC_SUBST(X_LIBS) ++AC_SUBST(X11_LIBS) ++AC_SUBST(X_PRE_LIBS) ++dnl ++dnl ++dnl Check for -lXintl library. Lutz Kittler says ++dnl that DLD-Linux with CDE wants `-lXintl' to refine `Xlcmbcurmax'. ++dnl Guenther Roehrich says that ++dnl we must check for `_Xlcmbcurmax' instead of `Xlcmbcurmax'. ++dnl ++AC_CHECK_LIB(Xintl, _Xlcmbcurmax, X11_LIBS="${X11_LIBS} -lXintl",, ++ ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++dnl ++dnl ++dnl Check for -lipc library. SCO unix is said to want that. ++dnl ++AC_CHECK_LIB(ipc, shmap, X11_LIBS="${X11_LIBS} -lipc",, ++ ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++dnl ++dnl ++dnl Check for X toolkit libraries ++dnl ++XT_LIBS="" ++AC_CHECK_LIB(Xt, XtToolkitInitialize, XT_LIBS="-lXt",, ++ ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++if test "$XT_LIBS" = ""; then ++dnl Not having Xt is fatal. Let the user fix this. ++AC_MSG_ERROR([The X toolkit library '-lXt' could not be found. ++ Please use the configure options '--x-includes=DIR' ++ and '--x-libraries=DIR' to specify the X location. ++ See the files 'config.log' and 'ddd/config.log' ++ for further diagnostics.]) ++fi ++AC_SUBST(XT_LIBS) ++dnl ++dnl ++dnl Check for X extension libraries ++dnl ++dnl ++XEXT_LIBS="" ++AC_CHECK_LIB(Xext, XShapeQueryVersion, XEXT_LIBS="-lXext",, ++ ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++AC_SUBST(XEXT_LIBS) ++dnl ++dnl ++dnl ++dnl Check for Xpm library and headers ++dnl ++XPM_LIBS="" ++if test "$xpm_includes" != "no" && test "$xpm_libraries" != "no" ++then ++AC_CHECK_LIB(Xpm, XpmCreatePixmapFromXpmImage, ++ XPM_LIBS="-lXpm" ++ AC_DEFINE(HAVE_XPM),,${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++if test "$XPM_LIBS" != ""; then ++AC_CHECK_HEADERS(X11/xpm.h xpm.h) ++fi ++fi ++AC_SUBST(XPM_LIBS) ++ ++ ++ ++dnl Check for Motif widget libraries ++dnl ++ ++XM_LIBS="" ++XP_LIBS="" ++if test "$motif_includes" != "no" && test "$motif_libraries" != "no" ++then ++dnl Motif 2.1 wants `-lXp' (X11R6.3 print server) ++AC_CHECK_LIB(Xp, XpSelectInput, ++ XP_LIBS="-lXp" ++ AC_DEFINE(HAVE_XP),, ++ ${XPM_LIBS} ${XEXT_LIBS} ${XT_LIBS} ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++dnl ++AC_CHECK_LIB(Xm, XmCreateOptionMenu, ++ XM_LIBS="-lXm" ++ AC_DEFINE(HAVE_MOTIF),, ++ ${XP_LIBS} ${XPM_LIBS} ${XEXT_LIBS} ${XT_LIBS} ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++dnl ++AC_CHECK_LIB(Xm, xmUseVersion, ++ AC_DEFINE(HAVE_XMUSEVERSION),, ++ ${XP_LIBS} ${XPM_LIBS} ${XEXT_LIBS} ${XT_LIBS} ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++dnl ++AC_CHECK_LIB(Xm, XmInstallImage, ++ AC_DEFINE(HAVE_XMINSTALLIMAGE),, ++ ${XP_LIBS} ${XPM_LIBS} ${XEXT_LIBS} ${XT_LIBS} ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++dnl ++AC_CHECK_LIB(Xm, Xm21InstallImage, ++ AC_DEFINE(HAVE_XM21INSTALLIMAGE),, ++ ${XP_LIBS} ${XPM_LIBS} ${XEXT_LIBS} ${XT_LIBS} ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}) ++fi ++if test "$XM_LIBS" = ""; then ++dnl Without Motif, we won't get far. Let the user fix this. ++AC_MSG_ERROR([The Motif library '-lXm' could not be found. ++ Please use the configure options '--with-motif-includes=DIR' ++ and '--with-motif-libraries=DIR' to specify the Xm location. ++ See the files 'config.log' ++ for further diagnostics.]) ++fi ++ ++AC_SUBST(XP_LIBS) ++AC_SUBST(XM_LIBS) ++ ++LIBS="$LIBS ${XM_LIBS} ${XP_LIBS} ${XPM_LIBS} ${XEXT_LIBS} ${XT_LIBS} ${X_PRE_LIBS} ${X11_LIBS} ${X_EXTRA_LIBS}" ++ ++dnl ++dnl ++LIBS="$ice_save_LIBS" ++CFLAGS="$ice_save_CFLAGS" ++CXXFLAGS="$ice_save_CXXFLAGS" ++CPPFLAGS="$ice_save_CPPFLAGS" ++LDFLAGS="$ice_save_LDFLAGS" ++fi ++ ++dnl Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man1/Makefile ++etc/Makefile ++]) +diff -Naur alliance-5.0/dreal/etc/Makefile.in alliance/dreal/etc/Makefile.in +--- alliance-5.0/dreal/etc/Makefile.in 2007-07-18 19:04:23.000000000 +0200 ++++ alliance/dreal/etc/Makefile.in 2009-06-13 22:27:20.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/dreal/Makefile.in alliance/dreal/Makefile.in +--- alliance-5.0/dreal/Makefile.in 2007-07-18 19:04:22.000000000 +0200 ++++ alliance/dreal/Makefile.in 2009-06-13 22:27:20.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/dreal/man1/Makefile.in alliance/dreal/man1/Makefile.in +--- alliance-5.0/dreal/man1/Makefile.in 2007-07-18 19:04:23.000000000 +0200 ++++ alliance/dreal/man1/Makefile.in 2009-06-13 22:27:21.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/dreal/src/GMC_panel.c alliance/dreal/src/GMC_panel.c +--- alliance-5.0/dreal/src/GMC_panel.c 2002-09-30 18:20:07.000000000 +0200 ++++ alliance/dreal/src/GMC_panel.c 2009-06-13 23:30:25.000000000 +0200 +@@ -1091,7 +1091,7 @@ + { + rdsbegin(); + +- DrealRectangleLayer = (int)ClientData; ++ DrealRectangleLayer = (long)ClientData; + + DrealChangeEditMode( DREAL_CREATE_RECTANGLE, + DrealPromptCreateRectangle ); +diff -Naur alliance-5.0/dreal/src/GME_panel.c alliance/dreal/src/GME_panel.c +--- alliance-5.0/dreal/src/GME_panel.c 2002-09-30 18:20:07.000000000 +0200 ++++ alliance/dreal/src/GME_panel.c 2009-06-13 23:12:43.000000000 +0200 +@@ -2116,7 +2116,7 @@ + { + rdsbegin(); + +- DrealRectangleMLayer = (int)ClientData; ++ DrealRectangleMLayer = (long)ClientData; + + DrealPromptModifyRectangle(); + +diff -Naur alliance-5.0/dreal/src/Makefile.am alliance/dreal/src/Makefile.am +--- alliance-5.0/dreal/src/Makefile.am 2005-01-19 16:13:50.000000000 +0100 ++++ alliance/dreal/src/Makefile.am 2008-10-08 14:21:11.000000000 +0200 +@@ -48,13 +48,13 @@ + + + dreal_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbkap/src \ +--L$(top_srcdir)/mbkmg/src \ +--L$(top_srcdir)/mbkvti/src \ +--L$(top_srcdir)/rds/src \ +--L$(top_srcdir)/rdscif/src \ +--L$(top_srcdir)/rdsgds/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbkap/src \ ++-L$(top_builddir)/mbkmg/src \ ++-L$(top_builddir)/mbkvti/src \ ++-L$(top_builddir)/rds/src \ ++-L$(top_builddir)/rdscif/src \ ++-L$(top_builddir)/rdsgds/src \ + -lRtl -lRgs -lRcf -lRut -lRfm -lRpr -lRds -lMpu -lMap -lMmg -lMcp -lMph -lMut + + +diff -Naur alliance-5.0/dreal/src/Makefile.in alliance/dreal/src/Makefile.in +--- alliance-5.0/dreal/src/Makefile.in 2007-07-18 19:04:23.000000000 +0200 ++++ alliance/dreal/src/Makefile.in 2009-06-13 22:27:21.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,8 +14,6 @@ + + @SET_MAKE@ + +-SOURCES = $(dreal_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -85,11 +83,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(dreal_SOURCES) + DIST_SOURCES = $(dreal_SOURCES) +@@ -162,6 +160,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -184,6 +185,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -250,6 +254,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -261,6 +268,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -310,6 +320,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -317,6 +330,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -424,13 +440,13 @@ + $(LIBXP) $(LIBXEXT) $(LIBX11) + + dreal_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbkap/src \ +--L$(top_srcdir)/mbkmg/src \ +--L$(top_srcdir)/mbkvti/src \ +--L$(top_srcdir)/rds/src \ +--L$(top_srcdir)/rdscif/src \ +--L$(top_srcdir)/rdsgds/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbkap/src \ ++-L$(top_builddir)/mbkmg/src \ ++-L$(top_builddir)/mbkvti/src \ ++-L$(top_builddir)/rds/src \ ++-L$(top_builddir)/rdscif/src \ ++-L$(top_builddir)/rdsgds/src \ + -lRtl -lRgs -lRcf -lRut -lRfm -lRpr -lRds -lMpu -lMap -lMmg -lMcp -lMph -lMut + + dreal_SOURCES = \ diff --git a/alliance-druc.patch b/alliance-druc.patch new file mode 100644 index 0000000..41b583d --- /dev/null +++ b/alliance-druc.patch @@ -0,0 +1,587 @@ +diff -Naur alliance-5.0/druc/configure.in alliance/druc/configure.in +--- alliance-5.0/druc/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/druc/configure.in 2002-10-16 20:04:22.000000000 +0200 +@@ -0,0 +1,50 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.6 2002/10/16 18:04:22 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/vrd.h) ++VRD_DLL_VERSION=3:4:0 ++AC_SUBST(VRD_DLL_VERSION) ++AM_INIT_AUTOMAKE(vrd, 3.4) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_YACC ++AM_PROG_LEX ++AC_CHECK_LIB(m, sqrt) ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man1/Makefile ++]) +diff -Naur alliance-5.0/druc/Makefile.in alliance/druc/Makefile.in +--- alliance-5.0/druc/Makefile.in 2007-07-18 19:04:23.000000000 +0200 ++++ alliance/druc/Makefile.in 2009-06-13 22:27:21.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/druc/man1/Makefile.in alliance/druc/man1/Makefile.in +--- alliance-5.0/druc/man1/Makefile.in 2007-07-18 19:04:24.000000000 +0200 ++++ alliance/druc/man1/Makefile.in 2009-06-13 22:27:21.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/druc/src/drucgral_test.c alliance/druc/src/drucgral_test.c +--- alliance-5.0/druc/src/drucgral_test.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/druc/src/drucgral_test.c 2002-03-29 18:39:32.000000000 +0100 +@@ -0,0 +1,191 @@ ++/*------------------------------------------------------------\ ++| | ++| Tool : DRUC | ++| | ++| File : DRUCGRAL_TEST.C | ++| | ++| Authors : Renaud Patrick | ++| | ++| Date : 11/01/94 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++#include ++#include ++#include ++#include ++#include "mph.h" ++#include "mut.h" ++#include "rds.h" ++#include "rut.h" ++#include "rtl.h" ++#include "rwi.h" ++#include "rfm.h" ++#include "rpr.h" ++ ++#include "drucutil.h" ++#include "vmctools.h" ++#include "vmcerror.h" ++#include "druchier.h" ++#include "vmcasmld.h" ++#include "vmcaract.h" ++#include "defdefin.h" ++#include "vmcrelat.h" ++#include "drucmin.h" ++#include "vmcunify.h" ++#include "drucring.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++extern rdsfig_list *DrucFigureRdsErreur; ++ ++/*------------------------------------------------------------\ ++| | ++| Main | ++| | ++\------------------------------------------------------------*/ ++void main (argc , argv ) ++ int argc; ++ char *argv[]; ++{ ++phfig_list *DrucFigureMbk; ++rdsfig_list *DrucFigureRds; ++rdswindow *DrucRdsWindow; ++char *Name; ++char *DrucFigureName; ++char *DrucErrorName = (char *)NULL; ++char *DrucCouronneRdsName; ++char *DrucNetworkName; ++DrucTypeStructInstruction *DrucTabInstruction = ( DrucTypeStructInstruction *)NULL; ++int DrucNombreInstructions; ++int IndexLayer; ++int Resultat; ++ ++/*\ ++ * lecture des parametres d'entree ++\*/ ++ if ( argc != 2 ++ ) ++ { ++ printf ( "Usage : %s figure_name (without extention)\n",argv [0] ++ ); ++ exit ( 1 ++ ); ++ } ++ ++/*\ ++ * affichage de la banniere standard ++\*/ ++ alliancebanner ( "DRCGraL", ++ VERSION, ++ "Design Rule Checker", ++ "1993", ++ ALLIANCE_VERSION ++ ); ++ DrucStatInit ( DRUC_FLATTEN, ++ DRUC_SILENT, ++ DRUC_SILENT, ++ DRUC_NO_ERROR_FILE ++ ); ++ ++ Name = argv [ 1 ]; ++ ++ DrucFigureName = namealloc ( Name ++ ); ++ ++ Name = malloc ( strlen ( DrucFigureName ) + ++ strlen ( DRUC_ERROR_EXTEND) + ++ 1 ++ ); ++ ++ strcpy ( Name , ++ DrucFigureName ++ ); ++ strcat ( Name, ++ DRUC_ERROR_EXTEND ++ ); ++ ++ DrucErrorName = namealloc ( Name ++ ); ++ ++ free ( Name ++ ); ++ mbkenv ( ++ ); ++ rdsenv ( ++ ); ++ loadrdsparam ( ++ ); ++ DrucFigureMbk = getphfig ( DrucFigureName, ++ 'A' ++ ); ++ ++ DrucViewString ( "Flatten DRC on: " ++ ); ++ DrucViewString ( DrucFigureName ++ ); ++ DrucViewString ( "\n" ++ ); ++ rflattenphfig ( DrucFigureMbk, ++ YES, ++ NO ++ ); ++ DrucFigureRds = figmbkrds ( DrucFigureMbk, ++ MACRO_PLUS_TAILLE, ++ 0 ++ ); ++ ++ DrucViewString ( "Delete MBK figure : " ++ ); ++ DrucViewString ( DrucFigureName ++ ); ++ DrucViewString ( "\n" ++ ); ++ ++ delphfig ( DrucFigureName ++ ); ++ ++ DrucViewString ( "Load Flatten Rules : " ++ ); ++ DrucViewString ( RDS_TECHNO_NAME ++ ); ++ DrucViewString ( "\n" ++ ); ++ ++ DrucOpenErrorFile ( DrucErrorName, ++ "w" ++ ); ++ DrucFigureRdsErreur = drucrdsfig ( DrucFigureRds, ++ DrucErrorName ++ ); ++ ++ DrucStatInit ( DRUC_FLATTEN, ++ DRUC_VERBOSE, ++ DRUC_NO_ERROR_FILE ++ ); ++ viewrdsfig ( DrucFigureRdsErreur ++ ); ++ DrucViewString ( "\n" ++ ); ++ DrucViewRuleComment ( ++ ); ++ DrucViewString ( "\nnombre d'erreurs rencontrees = valeur de sortie: " ++ ); ++ DrucViewNumber ( DrucStructStat.ERROR_NUMBER ++ ); ++ DrucViewString ( "\n" ++ ); ++ exit ( DrucStructStat.ERROR_NUMBER ++ ); ++} ++ ++ ++ +diff -Naur alliance-5.0/druc/src/Makefile.am alliance/druc/src/Makefile.am +--- alliance-5.0/druc/src/Makefile.am 2005-01-19 16:13:50.000000000 +0100 ++++ alliance/druc/src/Makefile.am 2007-11-05 17:52:24.000000000 +0100 +@@ -23,13 +23,13 @@ + AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/rds/src + + druc_LDADD = -L. -lVrd \ +--L$(top_srcdir)/rds/src -lRtl -lRgs \ +--L$(top_srcdir)/rdscif/src -lRcf -lRfm -lRpr -lRwi -lRut \ +--L$(top_srcdir)/rdsgds/src -lRds \ +--L$(top_srcdir)/mbk/src -lMpu \ +--L$(top_srcdir)/mbkvti/src -lMcp \ +--L$(top_srcdir)/mbkap/src -lMap \ +--L$(top_srcdir)/mbkmg/src -lMmg -lMph \ ++-L$(top_builddir)/rds/src -lRtl -lRgs \ ++-L$(top_builddir)/rdscif/src -lRcf -lRfm -lRpr -lRwi -lRut \ ++-L$(top_builddir)/rdsgds/src -lRds \ ++-L$(top_builddir)/mbk/src -lMpu \ ++-L$(top_builddir)/mbkvti/src -lMcp \ ++-L$(top_builddir)/mbkap/src -lMap \ ++-L$(top_builddir)/mbkmg/src -lMmg -lMph \ + -lMut + + druc_SOURCES = \ +diff -Naur alliance-5.0/druc/src/Makefile.in alliance/druc/src/Makefile.in +--- alliance-5.0/druc/src/Makefile.in 2007-07-18 19:04:24.000000000 +0200 ++++ alliance/druc/src/Makefile.in 2009-06-13 22:27:22.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -16,8 +16,6 @@ + + + +-SOURCES = $(libVrd_la_SOURCES) $(druc_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -78,11 +76,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) + LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +@@ -162,6 +160,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -184,6 +185,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -250,6 +254,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -261,6 +268,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -310,6 +320,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -317,6 +330,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -392,13 +408,13 @@ + CLEANFILES = drucompi_l.c drucompi_y.h drucompi_y.c + AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/rds/src + druc_LDADD = -L. -lVrd \ +--L$(top_srcdir)/rds/src -lRtl -lRgs \ +--L$(top_srcdir)/rdscif/src -lRcf -lRfm -lRpr -lRwi -lRut \ +--L$(top_srcdir)/rdsgds/src -lRds \ +--L$(top_srcdir)/mbk/src -lMpu \ +--L$(top_srcdir)/mbkvti/src -lMcp \ +--L$(top_srcdir)/mbkap/src -lMap \ +--L$(top_srcdir)/mbkmg/src -lMmg -lMph \ ++-L$(top_builddir)/rds/src -lRtl -lRgs \ ++-L$(top_builddir)/rdscif/src -lRcf -lRfm -lRpr -lRwi -lRut \ ++-L$(top_builddir)/rdsgds/src -lRds \ ++-L$(top_builddir)/mbk/src -lMpu \ ++-L$(top_builddir)/mbkvti/src -lMcp \ ++-L$(top_builddir)/mbkap/src -lMap \ ++-L$(top_builddir)/mbkmg/src -lMmg -lMph \ + -lMut + + druc_SOURCES = \ diff --git a/alliance-elp.patch b/alliance-elp.patch new file mode 100644 index 0000000..9d06348 --- /dev/null +++ b/alliance-elp.patch @@ -0,0 +1,1090 @@ +diff -Naur alliance-5.0/elp/configure.in alliance/elp/configure.in +--- alliance-5.0/elp/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/elp/configure.in 2002-10-16 20:04:22.000000000 +0200 +@@ -0,0 +1,49 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.3 2002/10/16 18:04:22 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/elp.h) ++ELP_DLL_VERSION=1:5:0 ++AC_SUBST(ELP_DLL_VERSION) ++AM_INIT_AUTOMAKE(elp, 1.5) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_YACC ++AM_PROG_LEX ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++etc/Makefile ++]) +diff -Naur alliance-5.0/elp/etc/Makefile.in alliance/elp/etc/Makefile.in +--- alliance-5.0/elp/etc/Makefile.in 2007-07-18 19:04:25.000000000 +0200 ++++ alliance/elp/etc/Makefile.in 2009-06-13 22:27:22.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -125,6 +125,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -147,6 +150,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -213,6 +219,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -224,6 +233,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -273,6 +285,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -280,6 +295,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/elp/Makefile.in alliance/elp/Makefile.in +--- alliance-5.0/elp/Makefile.in 2007-07-18 19:04:24.000000000 +0200 ++++ alliance/elp/Makefile.in 2009-06-13 22:27:22.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/elp/src/elp.h alliance/elp/src/elp.h +--- alliance-5.0/elp/src/elp.h 2003-09-11 17:08:44.000000000 +0200 ++++ alliance/elp/src/elp.h 2009-06-13 19:20:57.000000000 +0200 +@@ -15,6 +15,7 @@ + + /* les inclusions */ + #include ++#include + #include + #include "mut.h" + #include "mlo.h" +diff -Naur alliance-5.0/elp/src/elp_l.l alliance/elp/src/elp_l.l +--- alliance-5.0/elp/src/elp_l.l 2002-04-18 15:59:12.000000000 +0200 ++++ alliance/elp/src/elp_l.l 2009-06-13 21:51:32.000000000 +0200 +@@ -1,5 +1,6 @@ + %{ + #include ++#include + #include "elp_y.h" + #undef ECHO + #define ECHO +diff -Naur alliance-5.0/elp/src/Makefile alliance/elp/src/Makefile +--- alliance-5.0/elp/src/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/elp/src/Makefile 2005-05-11 10:05:32.000000000 +0200 +@@ -0,0 +1,719 @@ ++# Makefile.in generated by automake 1.8.5 from Makefile.am. ++# elp/src/Makefile. Generated from Makefile.in by configure. ++ ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, ++# 2003, 2004 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++ ++ ++ ++SOURCES = $(libElp_la_SOURCES) ++ ++srcdir = . ++top_srcdir = ../.. ++ ++pkgdatadir = $(datadir)/alliance ++pkglibdir = $(libdir)/alliance ++pkgincludedir = $(includedir)/alliance ++top_builddir = ../.. ++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd ++INSTALL = /usr/bin/install -c ++install_sh_DATA = $(install_sh) -c -m 644 ++install_sh_PROGRAM = $(install_sh) -c ++install_sh_SCRIPT = $(install_sh) -c ++INSTALL_HEADER = $(INSTALL_DATA) ++transform = $(program_transform_name) ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++host_triplet = i686-pc-linux-gnu ++subdir = elp/src ++DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ ++ $(srcdir)/Makefile.in elp_l.c elp_y.c ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/./alliance.m4 \ ++ $(top_srcdir)/./motif.m4 $(top_srcdir)/./xpm.m4 \ ++ $(top_srcdir)/configure.in ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++mkinstalldirs = $(mkdir_p) ++CONFIG_CLEAN_FILES = ++am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" ++libLTLIBRARIES_INSTALL = $(INSTALL) ++LTLIBRARIES = $(lib_LTLIBRARIES) ++libElp_la_LIBADD = ++am_libElp_la_OBJECTS = elp_y.lo elp_l.lo elp.lo elperror.lo ++libElp_la_OBJECTS = $(am_libElp_la_OBJECTS) ++DEFAULT_INCLUDES = -I. -I$(srcdir) ++depcomp = $(SHELL) $(top_srcdir)/depcomp ++am__depfiles_maybe = depfiles ++DEP_FILES = ./$(DEPDIR)/elp.Plo ./$(DEPDIR)/elp_l.Plo \ ++ ./$(DEPDIR)/elp_y.Plo ./$(DEPDIR)/elperror.Plo ++COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ ++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) ++LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ ++ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ ++ $(AM_CFLAGS) $(CFLAGS) ++CCLD = $(CC) ++LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++ $(AM_LDFLAGS) $(LDFLAGS) -o $@ ++LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) ++LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) ++YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) ++LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ ++ $(AM_YFLAGS) ++SOURCES = $(libElp_la_SOURCES) ++DIST_SOURCES = $(libElp_la_SOURCES) ++includeHEADERS_INSTALL = $(INSTALL_HEADER) ++HEADERS = $(include_HEADERS) ++ETAGS = etags ++CTAGS = ctags ++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ++ABE_DLL_VERSION = 2:1:0 ++ABL_DLL_VERSION = 1:3:0 ++ABT_DLL_VERSION = 2:1:0 ++ABV_DLL_VERSION = 2:1:0 ++ACLOCAL = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run aclocal-1.8 ++ALCBANNER_MAJOR_VERSION = 1 ++ALCBANNER_MINOR_VERSION = 1 ++ALCBANNER_VERSION = 1.1 ++ALLIANCE_BUILD_FALSE = # ++ALLIANCE_BUILD_TRUE = ++ALLIANCE_CFLAGS = -I/users/outil/alliance/Linux.FC2/include ++ALLIANCE_LIBS = -L/users/outil/alliance/Linux.FC2/lib ++ALLIANCE_TOP = /users/outil/alliance/Linux.FC2 ++AMDEP_FALSE = # ++AMDEP_TRUE = ++AMTAR = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run tar ++AR = ar ++ATTILA_MAJOR_VERSION = 0 ++ATTILA_MINOR_VERSION = 1 ++ATTILA_VERSION = 0.1 ++AUTOCONF = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run autoconf ++AUTOHEADER = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run autoheader ++AUTOMAKE = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run automake-1.8 ++AUT_DLL_VERSION = 1:3:0 ++AWK = gawk ++B2F_MAJOR_VERSION = 1 ++B2F_MINOR_VERSION = 2 ++B2F_VERSION = 1.2 ++BDD_DLL_VERSION = 1:5:0 ++BEH_DLL_VERSION = 1:11:0 ++BHL_DLL_VERSION = 1:11:0 ++BOOG_MAJOR_VERSION = 1 ++BOOG_MINOR_VERSION = 7 ++BOOG_VERSION = 1.7 ++BOOM_MAJOR_VERSION = 1 ++BOOM_MINOR_VERSION = 2 ++BOOM_VERSION = 1.2 ++BTR_DLL_VERSION = 1:3:0 ++BVL_DLL_VERSION = 1:14:0 ++CC = gcc ++CCDEPMODE = depmode=gcc3 ++CFLAGS = -I/users/outil/alliance/Linux.FC2/include -g -O2 ++CPP = gcc -E ++CPPFLAGS = ++CST_DLL_VERSION = 3:2:0 ++CTL_DLL_VERSION = 1:1:0 ++CTP_DLL_VERSION = 1:1:0 ++CXX = g++ ++CXXCPP = g++ -E ++CXXDEPMODE = depmode=gcc3 ++CXXFLAGS = -g -O2 ++CYGPATH_W = echo ++DEFS = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"alliance\" -DVERSION=\"5.0\" -DYYTEXT_POINTER=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FCNTL_H=1 -DHAVE_MALLOC_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRINGS_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBIBERTY=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_UNISTD_H=1 -DHAVE_FORK=1 -DHAVE_VFORK=1 -DHAVE_WORKING_VFORK=1 -DHAVE_WORKING_FORK=1 -DSTDC_HEADERS=1 -DHAVE_SYS_WAIT_H=1 -DRETSIGTYPE=void -DHAVE_MOTIF=1 -DHAVE_XPM=1 -DHAVE_XPM=1 -DHAVE_X11_XPM_H=1 -DHAVE_XP=1 -DHAVE_MOTIF=1 -DHAVE_XMUSEVERSION=1 -DHAVE_XMINSTALLIMAGE=1 -DALLIANCE_VERSION=\"5.0\" -DALLIANCE_TOP=\"/users/outil/alliance/Linux.FC2\" -DHAVE_LIBIBERTY=1 ++DEPDIR = .deps ++DOC_MAJOR_VERSION = 1 ++DOC_MINOR_VERSION = 0 ++DOC_VERSION = 1.0 ++DREAL_MAJOR_VERSION = 1 ++DREAL_MINOR_VERSION = 14 ++DREAL_VERSION = 1.14 ++ECHO = echo ++ECHO_C = ++ECHO_N = -n ++ECHO_T = ++EGREP = grep -E ++ELP_DLL_VERSION = 1:5:0 ++EMULBS_MAJOR_VERSION = 3 ++EMULBS_MINOR_VERSION = 2 ++EMULBS_VERSION = 3.2 ++EXEEXT = ++EXP_MAJOR_VERSION = 1 ++EXP_MINOR_VERSION = 0 ++EXP_VERSION = 1.0 ++F77 = g77 ++FFLAGS = -g -O2 ++FKS_DLL_VERSION = 1:4:0 ++FLATBEH_MAJOR_VERSION = 1 ++FLATBEH_MINOR_VERSION = 1 ++FLATBEH_VERSION = 1.1 ++FMI_MAJOR_VERSION = 1 ++FMI_MINOR_VERSION = 1 ++FMI_VERSION = 1.1 ++FSM_DLL_VERSION = 1:4:0 ++FSP_MAJOR_VERSION = 1 ++FSP_MINOR_VERSION = 1 ++FSP_VERSION = 1.1 ++FTL_DLL_VERSION = 1:4:0 ++FVH_DLL_VERSION = 1:4:0 ++GRAAL_MAJOR_VERSION = 1 ++GRAAL_MINOR_VERSION = 27 ++GRAAL_VERSION = 1.27 ++GROWSTK_MAJOR_VERSION = 1 ++GROWSTK_MINOR_VERSION = 5 ++GROWSTK_VERSION = 1.5 ++INCLUDE_MOTIF = ++INSTALL_DATA = ${INSTALL} -m 664 ++INSTALL_PROGRAM = ${INSTALL} -m 775 ++INSTALL_SCRIPT = ${INSTALL} ++INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s ++K2F_MAJOR_VERSION = 1 ++K2F_MINOR_VERSION = 1 ++K2F_VERSION = 1.1 ++L2P_MAJOR_VERSION = 1 ++L2P_MINOR_VERSION = 12 ++L2P_VERSION = 1.12 ++LDFLAGS = -static -L/users/outil/alliance/Linux.FC2/lib ++LEX = flex ++LEXLIB = -lfl ++LEX_OUTPUT_ROOT = lex.yy ++LIBOBJS = ++LIBS = -liberty -lm -lm -lm -lm -liberty ++LIBTOOL = $(SHELL) $(top_builddir)/libtool ++LINK_MOTIF = -lXm ++LINK_XPM = -lXpm ++LN_S = ln -s ++LOG_DLL_VERSION = 2:1:0 ++LOON_MAJOR_VERSION = 1 ++LOON_MINOR_VERSION = 7 ++LOON_VERSION = 1.7 ++LTLIBOBJS = ++LVX_MAJOR_VERSION = 1 ++LVX_MINOR_VERSION = 2 ++LVX_VERSION = 1.2 ++LYNX_MAJOR_VERSION = 1 ++LYNX_MINOR_VERSION = 21 ++LYNX_VERSION = 1.21 ++M2E_MAJOR_VERSION = 1 ++M2E_MINOR_VERSION = 0 ++M2E_VERSION = 1.0 ++MAKEINFO = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run makeinfo ++MAL_DLL_VERSION = 6:0:0 ++MAP_DLL_VERSION = 6:0:0 ++MBK_CUR = 4 ++MBK_DLL_VERSION = 4:2:0 ++MBK_REL = 0 ++MBK_REV = 2 ++MBK_VERSION = 4.2 ++MCL_DLL_VERSION = 4:9:0 ++MCP_DLL_VERSION = 4:9:0 ++MEL_DLL_VERSION = 4:9:0 ++MGL_DLL_VERSION = 0:8:0 ++MGN_DLL_VERSION = 3:3:0 ++MHL_DLL_VERSION = 2:1:0 ++MIPS_ASM_MAJOR_VERSION = 1 ++MIPS_ASM_MINOR_VERSION = 0 ++MIPS_ASM_VERSION = 1.0 ++MMG_DLL_VERSION = 1:0:0 ++MOCHA_MAJOR_VERSION = 1 ++MOCHA_MINOR_VERSION = 1 ++MOCHA_VERSION = 1.1 ++MSL_DLL_VERSION = 7:0:0 ++MVG_DLL_VERSION = 4:1:0 ++MVL_DLL_VERSION = 4:1:0 ++NERO_MAJOR_VERSION = 1 ++NERO_MINOR_VERSION = 0 ++NERO_VERSION = 1.0 ++OBJEXT = o ++OCP_MAJOR_VERSION = 1 ++OCP_MINOR_VERSION = 0 ++OCP_VERSION = 1.0 ++OCR_MAJOR_VERSION = 1 ++OCR_MINOR_VERSION = 0 ++OCR_VERSION = 1.0 ++PACKAGE = alliance ++PACKAGE_BUGREPORT = ++PACKAGE_NAME = ++PACKAGE_STRING = ++PACKAGE_TARNAME = ++PACKAGE_VERSION = ++PAT2SPI_MAJOR_VERSION = 1 ++PAT2SPI_MINOR_VERSION = 1 ++PAT2SPI_VERSION = 1.1 ++PATH_SEPARATOR = : ++PAT_DLL_VERSION = 1:9:0 ++PCBS_MAJOR_VERSION = 2 ++PCBS_MINOR_VERSION = 1 ++PCBS_VERSION = 2.1 ++PGN_DLL_VERSION = 3:3:0 ++PHL_DLL_VERSION = 1:9:0 ++PPT_DLL_VERSION = 1:9:0 ++PROOF_MAJOR_VERSION = 4 ++PROOF_MINOR_VERSION = 9 ++PROOF_VERSION = 4.9 ++RANLIB = ranlib ++RCF_DLL_VERSION = 2:1:0 ++RDS_DLL_VERSION = 2:1:0 ++RFM_DLL_VERSION = 2:1:0 ++RGS_DLL_VERSION = 2:1:0 ++RING_MAJOR_VERSION = 3 ++RING_MINOR_VERSION = 0 ++RING_VERSION = 3.0 ++RPR_DLL_VERSION = 2:1:0 ++RTD_DLL_VERSION = 1:1:0 ++RTL_DLL_VERSION = 2:1:0 ++RTN_DLL_VERSION = 1:1:0 ++RUT_DLL_VERSION = 2:1:0 ++RWI_DLL_VERSION = 2:1:0 ++S2R_MAJOR_VERSION = 4 ++S2R_MINOR_VERSION = 4 ++S2R_VERSION = 4.4 ++SCAPIN_MAJOR_VERSION = 1 ++SCAPIN_MINOR_VERSION = 1 ++SCAPIN_VERSION = 1.1 ++SCH_DLL_VERSION = 3:2:0 ++SCL_DLL_VERSION = 1:5:0 ++SEA_MAJOR_VERSION = 1 ++SEA_MINOR_VERSION = 0 ++SEA_VERSION = 1.0 ++SED = /bin/sed ++SET_MAKE = ++SHELL = /bin/sh ++STRIP = strip ++SYF_MAJOR_VERSION = 3 ++SYF_MINOR_VERSION = 6 ++SYF_VERSION = 3.6 ++TOOLSDIRS = mbk mbkal mbkap mbkedif mbkhilo mbkmg mbkspice mbkvhdl mbkvrlog mbkvti mbkvhdlg aut rds rdscif rdsgds elp abl bdd log btr vex ctl ctp abe abt abv fsm fks fvh ftl rtn rtd scl vbh vbl vpn vpd vvh vtl pat ppt phl gcp druc beh bhl bvl alcban asimut attila b2f boog boom cells distrib dreal exp flatbeh flatlo flatph fmi fsp genlib genpat graal k2f l2p loon lvx lynx m2e mips_asm mocha nero ocp pat2spi proof ring s2r scapin sea syf vasy vst2xnf x2y xfsm xpat xsch xvpn documentation ++VASY_MAJOR_VERSION = 1 ++VASY_MINOR_VERSION = 5 ++VASY_VERSION = 1.5 ++VBH_DLL_VERSION = 1:4:0 ++VBL_DLL_VERSION = 1:4:0 ++VERSION = 5.0 ++VEX_DLL_VERSION = 1:3:0 ++VPD_DLL_VERSION = 1:5:0 ++VPN_DLL_VERSION = 1:5:0 ++VRD_DLL_VERSION = 3:4:0 ++VST2XNF_MAJOR_VERSION = 1 ++VST2XNF_MINOR_VERSION = 0 ++VST2XNF_VERSION = 1.0 ++VTL_DLL_VERSION = 1:5:0 ++VVH_DLL_VERSION = 1:5:0 ++X11_LIBS = -lX11 ++XEXT_LIBS = -lXext ++XFSM_MAJOR_VERSION = 1 ++XFSM_MINOR_VERSION = 4 ++XFSM_VERSION = 1.4 ++XM_LIBS = -lXm ++XPAT_MAJOR_VERSION = 1 ++XPAT_MINOR_VERSION = 4 ++XPAT_VERSION = 1.4 ++XPM_LIBS = -lXpm ++XP_LIBS = -lXp ++XSCH_MAJOR_VERSION = 1 ++XSCH_MINOR_VERSION = 4 ++XSCH_VERSION = 1.4 ++XT_LIBS = -lXt ++XVPN_MAJOR_VERSION = 1 ++XVPN_MINOR_VERSION = 5 ++XVPN_VERSION = 1.5 ++X_CFLAGS = -I/usr/X11R6/include ++X_EXTRA_LIBS = ++X_LIBS = -L/usr/X11R6/lib ++X_PRE_LIBS = -lSM -lICE ++YACC = bison -y ++ac_ct_AR = ar ++ac_ct_CC = gcc ++ac_ct_CXX = g++ ++ac_ct_F77 = g77 ++ac_ct_RANLIB = ranlib ++ac_ct_STRIP = strip ++am__fastdepCC_FALSE = # ++am__fastdepCC_TRUE = ++am__fastdepCXX_FALSE = # ++am__fastdepCXX_TRUE = ++am__include = include ++am__leading_dot = . ++am__quote = ++bindir = ${exec_prefix}/bin ++build = i686-pc-linux-gnu ++build_alias = ++build_cpu = i686 ++build_os = linux-gnu ++build_vendor = pc ++datadir = ${prefix}/share ++exec_prefix = ${prefix} ++host = i686-pc-linux-gnu ++host_alias = ++host_cpu = i686 ++host_os = linux-gnu ++host_vendor = pc ++includedir = ${prefix}/include ++infodir = ${prefix}/info ++install_sh = /dsk/l1/misc/hcl/alliance/src/install-sh ++libdir = ${exec_prefix}/lib ++libexecdir = ${exec_prefix}/libexec ++localstatedir = ${prefix}/var ++mandir = ${prefix}/man ++mkdir_p = mkdir -p -- . ++oldincludedir = /usr/include ++prefix = /dsk/l1/misc/hcl/altest ++program_transform_name = s,x,x, ++sbindir = ${exec_prefix}/sbin ++sharedstatedir = ${prefix}/com ++sysconfdir = ${prefix}/etc ++target_alias = ++AM_CFLAGS = -DTECHNOLOGY=\"etc/prol.elp\" -I$(top_srcdir)/mbk/src ++lib_LTLIBRARIES = libElp.la ++include_HEADERS = elp.h ++libElp_la_SOURCES = elp_y.y elp_l.l \ ++elp.c elperror.c elp.h ++ ++libElp_la_LDFLAGS = -version-info 1:5:0 ++CLEANFILES = elp_y.c elp_y.h elp_l.c ++all: all-am ++ ++.SUFFIXES: ++.SUFFIXES: .c .l .lo .o .obj .y ++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) ++ @for dep in $?; do \ ++ case '$(am__configure_deps)' in \ ++ *$$dep*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ ++ && exit 0; \ ++ exit 1;; \ ++ esac; \ ++ done; \ ++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign elp/src/Makefile'; \ ++ cd $(top_srcdir) && \ ++ $(AUTOMAKE) --foreign elp/src/Makefile ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ ++ esac; ++ ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++$(top_srcdir)/configure: $(am__configure_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++$(ACLOCAL_M4): $(am__aclocal_m4_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++install-libLTLIBRARIES: $(lib_LTLIBRARIES) ++ @$(NORMAL_INSTALL) ++ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" ++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ if test -f $$p; then \ ++ f="`echo $$p | sed -e 's|^.*/||'`"; \ ++ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ ++ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ ++ else :; fi; \ ++ done ++ ++uninstall-libLTLIBRARIES: ++ @$(NORMAL_UNINSTALL) ++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ p="`echo $$p | sed -e 's|^.*/||'`"; \ ++ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ ++ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ ++ done ++ ++clean-libLTLIBRARIES: ++ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) ++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ ++ test "$$dir" != "$$p" || dir=.; \ ++ echo "rm -f \"$${dir}/so_locations\""; \ ++ rm -f "$${dir}/so_locations"; \ ++ done ++libElp.la: $(libElp_la_OBJECTS) $(libElp_la_DEPENDENCIES) ++ $(LINK) -rpath $(libdir) $(libElp_la_LDFLAGS) $(libElp_la_OBJECTS) $(libElp_la_LIBADD) $(LIBS) ++ ++mostlyclean-compile: ++ -rm -f *.$(OBJEXT) ++ ++distclean-compile: ++ -rm -f *.tab.c ++ ++include ./$(DEPDIR)/elp.Plo ++include ./$(DEPDIR)/elp_l.Plo ++include ./$(DEPDIR)/elp_y.Plo ++include ./$(DEPDIR)/elperror.Plo ++ ++.c.o: ++ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ ++ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++# source='$<' object='$@' libtool=no \ ++# depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ ++# $(CCDEPMODE) $(depcomp) \ ++# $(COMPILE) -c $< ++ ++.c.obj: ++ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ ++ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++# source='$<' object='$@' libtool=no \ ++# depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ ++# $(CCDEPMODE) $(depcomp) \ ++# $(COMPILE) -c `$(CYGPATH_W) '$<'` ++ ++.c.lo: ++ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ ++ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++# source='$<' object='$@' libtool=yes \ ++# depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ ++# $(CCDEPMODE) $(depcomp) \ ++# $(LTCOMPILE) -c -o $@ $< ++ ++.l.c: ++ $(LEXCOMPILE) $< ++ sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@ ++ rm -f $(LEX_OUTPUT_ROOT).c ++ ++.y.c: ++ $(YACCCOMPILE) $< ++ if test -f y.tab.h; then \ ++ to=`echo "$*_H" | sed \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ ++ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \ ++ sed "/^#/ s/Y_TAB_H/$$to/g" y.tab.h >$*.ht; \ ++ rm -f y.tab.h; \ ++ if cmp -s $*.ht $*.h; then \ ++ rm -f $*.ht ;\ ++ else \ ++ mv $*.ht $*.h; \ ++ fi; \ ++ fi ++ if test -f y.output; then \ ++ mv y.output $*.output; \ ++ fi ++ sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@ ++ rm -f y.tab.c ++ ++mostlyclean-libtool: ++ -rm -f *.lo ++ ++clean-libtool: ++ -rm -rf .libs _libs ++ ++distclean-libtool: ++ -rm -f libtool ++uninstall-info-am: ++install-includeHEADERS: $(include_HEADERS) ++ @$(NORMAL_INSTALL) ++ test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" ++ @list='$(include_HEADERS)'; for p in $$list; do \ ++ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ ++ f="`echo $$p | sed -e 's|^.*/||'`"; \ ++ echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ ++ $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ ++ done ++ ++uninstall-includeHEADERS: ++ @$(NORMAL_UNINSTALL) ++ @list='$(include_HEADERS)'; for p in $$list; do \ ++ f="`echo $$p | sed -e 's|^.*/||'`"; \ ++ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ ++ rm -f "$(DESTDIR)$(includedir)/$$f"; \ ++ done ++ ++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ mkid -fID $$unique ++tags: TAGS ++ ++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ ++ test -n "$$unique" || unique=$$empty_fix; \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ $$tags $$unique; \ ++ fi ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ ++GTAGS: ++ here=`$(am__cd) $(top_builddir) && pwd` \ ++ && cd $(top_srcdir) \ ++ && gtags -i $(GTAGS_ARGS) $$here ++ ++distclean-tags: ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags ++ ++distdir: $(DISTFILES) ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ ++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ ++ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ ++ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ ++ dir="/$$dir"; \ ++ $(mkdir_p) "$(distdir)$$dir"; \ ++ else \ ++ dir=''; \ ++ fi; \ ++ if test -d $$d/$$file; then \ ++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ ++ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ ++ fi; \ ++ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ ++ else \ ++ test -f $(distdir)/$$file \ ++ || cp -p $$d/$$file $(distdir)/$$file \ ++ || exit 1; \ ++ fi; \ ++ done ++check-am: all-am ++check: check-am ++all-am: Makefile $(LTLIBRARIES) $(HEADERS) ++installdirs: ++ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ ++ test -z "$$dir" || $(mkdir_p) "$$dir"; \ ++ done ++install: install-am ++install-exec: install-exec-am ++install-data: install-data-am ++uninstall: uninstall-am ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++ ++installcheck: installcheck-am ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ `test -z '$(STRIP)' || \ ++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++mostlyclean-generic: ++ ++clean-generic: ++ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) ++ ++distclean-generic: ++ -rm -f $(CONFIG_CLEAN_FILES) ++ ++maintainer-clean-generic: ++ @echo "This command is intended for maintainers to use" ++ @echo "it deletes files that may require special tools to rebuild." ++ -rm -f elp_l.c ++ -rm -f elp_y.c ++clean: clean-am ++ ++clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ ++ mostlyclean-am ++ ++distclean: distclean-am ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-libtool distclean-tags ++ ++dvi: dvi-am ++ ++dvi-am: ++ ++html: html-am ++ ++info: info-am ++ ++info-am: ++ ++install-data-am: install-includeHEADERS ++ ++install-exec-am: install-libLTLIBRARIES ++ ++install-info: install-info-am ++ ++install-man: ++ ++installcheck-am: ++ ++maintainer-clean: maintainer-clean-am ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++maintainer-clean-am: distclean-am maintainer-clean-generic ++ ++mostlyclean: mostlyclean-am ++ ++mostlyclean-am: mostlyclean-compile mostlyclean-generic \ ++ mostlyclean-libtool ++ ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ ++uninstall-am: uninstall-includeHEADERS uninstall-info-am \ ++ uninstall-libLTLIBRARIES ++ ++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ++ clean-libLTLIBRARIES clean-libtool ctags distclean \ ++ distclean-compile distclean-generic distclean-libtool \ ++ distclean-tags distdir dvi dvi-am html html-am info info-am \ ++ install install-am install-data install-data-am install-exec \ ++ install-exec-am install-includeHEADERS install-info \ ++ install-info-am install-libLTLIBRARIES install-man \ ++ install-strip installcheck installcheck-am installdirs \ ++ maintainer-clean maintainer-clean-generic mostlyclean \ ++ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ ++ pdf pdf-am ps ps-am tags uninstall uninstall-am \ ++ uninstall-includeHEADERS uninstall-info-am \ ++ uninstall-libLTLIBRARIES ++ ++ ++elp_y.c elp_y.h : $(srcdir)/elp_y.y ++ $(YACC) -d $(YFLAGS) $(srcdir)/elp_y.y && sed -e "s/yy/elpyy/g" -e "s/YY/elpYY/g" y.tab.c > elp_y.c && sed -e "s/yy/elpyy/g" -e "s/YY/elpYY/g" y.tab.h > elp_y.h ++ ++elp_l.c : $(srcdir)/elp_l.l elp_y.h ++ $(LEX) -t $(srcdir)/elp_l.l | sed -e "s/yy/elpyy/g" -e "s/YY/elpYY/g" > elp_l.c ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: +diff -Naur alliance-5.0/elp/src/Makefile.in alliance/elp/src/Makefile.in +--- alliance-5.0/elp/src/Makefile.in 2007-07-18 19:04:25.000000000 +0200 ++++ alliance/elp/src/Makefile.in 2009-06-13 22:27:22.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libElp_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -66,11 +64,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) + LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +@@ -150,6 +148,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -172,6 +173,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -238,6 +242,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -249,6 +256,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -298,6 +308,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -305,6 +318,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-exp.patch b/alliance-exp.patch new file mode 100644 index 0000000..f7f361a --- /dev/null +++ b/alliance-exp.patch @@ -0,0 +1,478 @@ +diff -Naur alliance-5.0/exp/configure.in alliance/exp/configure.in +--- alliance-5.0/exp/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/exp/configure.in 2002-10-16 20:04:22.000000000 +0200 +@@ -0,0 +1,36 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/expy.y) ++ ++EXP_MAJOR_VERSION=1 ++EXP_MINOR_VERSION=0 ++EXP_VERSION=$EXP_MAJOR_VERSION.$EXP_MINOR_VERSION ++ ++AC_SUBST(EXP_MAJOR_VERSION) ++AC_SUBST(EXP_MINOR_VERSION) ++AC_SUBST(EXP_VERSION) ++ ++# For automake. ++VERSION=$EXP_VERSION ++PACKAGE=exp ++ ++dnl Initialize automake stuff ++AM_INIT_AUTOMAKE($PACKAGE, $VERSION) ++ ++dnl Checks for programs. ++AC_PROG_CC ++AM_PROG_LIBTOOL ++AM_PROG_LEX ++AC_PROG_YACC ++AC_PROG_MAKE_SET ++ ++dnl Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++AC_CHECK_LIB(m, floor) ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++doc/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/exp/doc/Makefile.in alliance/exp/doc/Makefile.in +--- alliance-5.0/exp/doc/Makefile.in 2007-07-18 19:04:25.000000000 +0200 ++++ alliance/exp/doc/Makefile.in 2009-06-13 22:27:23.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/exp/Makefile.in alliance/exp/Makefile.in +--- alliance-5.0/exp/Makefile.in 2007-07-18 19:04:25.000000000 +0200 ++++ alliance/exp/Makefile.in 2009-06-13 22:27:23.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/exp/src/ht.c alliance/exp/src/ht.c +--- alliance-5.0/exp/src/ht.c 2002-04-09 14:33:07.000000000 +0200 ++++ alliance/exp/src/ht.c 2009-06-13 23:13:49.000000000 +0200 +@@ -68,8 +68,8 @@ + */ + void htremove (ht_t * ht) + { +- int i; +- for (i = 1; i < (int) ht[0]; i++) ++ long i; ++ for (i = 1; i < (long) ht[0]; i++) + eltremove (ht[i]); + free (ht); + } +@@ -79,12 +79,12 @@ + */ + void htstat (ht_t * ht) + { +- int i; ++ long i; + htelt_t *elt; + if (ht) + { +- static int start=1; +- for (i = 1; i < (int) ht[0]; i++) ++ static long start=1; ++ for (i = 1; i < (long) ht[0]; i++) + for (elt = ht[i]; elt; elt = elt->NEXT) + if (elt->USED == 0) + { +@@ -113,9 +113,9 @@ + /* creation d'un dictionnaire + ** -------------------------- + */ +-ht_t *htinit (int size) ++ht_t *htinit (long size) + { +- int i; ++ long i; + ht_t *ht; + + /* prend le premier nombre premier au dela de size */ +@@ -138,12 +138,12 @@ + /* calcul de la valeur de hachage primaire + ** --------------------------------------- + */ +-static int hash (ht_t * ht, char *key) ++static long hash (ht_t * ht, char *key) + { +- int alveole = 0; +- int length = strlen (key); +- int segment; +- int l; ++ long alveole = 0; ++ long length = strlen (key); ++ long segment; ++ long l; + + if (ht == NULL) + { +@@ -160,7 +160,7 @@ + segment = 0xFFFF & ((key[l] << 8) | key[l + 1]); + alveole = alveole ^ ((segment << 1) | (segment >> 15)); + } +- alveole %= (int) ht[0]; /* ht[0] == la taille de la table */ ++ alveole %= (long) ht[0]; /* ht[0] == la taille de la table */ + return (alveole + 1); /* +1 car on ne doit rien mettre dans case 0 */ + } + +@@ -174,7 +174,7 @@ + */ + htelt_t *htget (ht_t * ht, char *key) + { +- int alveole = hash (ht, key); ++ long alveole = hash (ht, key); + htelt_t *p; + + for (p = ht[alveole]; p && strcmp (p->KEY, key); p = p->NEXT); +@@ -187,7 +187,7 @@ + */ + htelt_t *htadd (ht_t * ht, char *key) + { +- int alveole = hash (ht, key); ++ long alveole = hash (ht, key); + + return ht[alveole] = eltadd (ht[alveole], key); + } +@@ -197,7 +197,7 @@ + */ + htelt_t *htset (ht_t * ht, char *key) + { +- int alveole = hash (ht, key); ++ long alveole = hash (ht, key); + htelt_t *p; + + for (p = ht[alveole]; p && strcmp (p->KEY, key); p = p->NEXT); +@@ -215,12 +215,12 @@ + { + regex_t preg; + htelt_t *elt, *res = NULL; +- int i; ++ long i; + + if (regcomp(&preg, key, REG_EXTENDED | REG_NOSUB) != 0) + return NULL; + if (ht) +- for (i = 1; i < (int) ht[0]; i++) ++ for (i = 1; i < (long) ht[0]; i++) + for (elt = ht[i]; elt; elt = elt->NEXT) + if (regexec (&preg, elt->KEY, (size_t) 0, NULL, 0) == 0) + { +diff -Naur alliance-5.0/exp/src/ht.h alliance/exp/src/ht.h +--- alliance-5.0/exp/src/ht.h 2002-04-09 14:33:07.000000000 +0200 ++++ alliance/exp/src/ht.h 2009-06-13 23:14:14.000000000 +0200 +@@ -11,7 +11,7 @@ + { + struct htelt_st *e; + double f; +- int i; ++ long i; + char *s; + } + elt_t; +@@ -20,9 +20,9 @@ + { + struct htelt_st * NEXT; + char *KEY; +- int TYPE; +- int USED; +- int FLINE; ++ long TYPE; ++ long USED; ++ long FLINE; + char * FNAME; + elt_t VAL; + } +@@ -62,7 +62,7 @@ + /* creation du dictionnaire + ** ------------------------ + */ +-extern ht_t *htinit (int size); ++extern ht_t *htinit (long size); + + /* recherche d'une entree dans la table + ** rend un pointeur sur l'element +diff -Naur alliance-5.0/exp/src/Makefile.in alliance/exp/src/Makefile.in +--- alliance-5.0/exp/src/Makefile.in 2007-07-18 19:04:26.000000000 +0200 ++++ alliance/exp/src/Makefile.in 2009-06-13 22:27:23.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,8 +14,6 @@ + + @SET_MAKE@ + +-SOURCES = $(exp_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -61,11 +59,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) + LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +@@ -143,6 +141,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -165,6 +166,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -231,6 +235,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -242,6 +249,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -291,6 +301,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -298,6 +311,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-files.patch b/alliance-files.patch new file mode 100644 index 0000000..61434e3 --- /dev/null +++ b/alliance-files.patch @@ -0,0 +1,16258 @@ +diff -Naur alliance-5.0/aclocal.m4 alliance/aclocal.m4 +--- alliance-5.0/aclocal.m4 2007-07-18 19:03:58.000000000 +0200 ++++ alliance/aclocal.m4 2009-06-13 22:27:01.000000000 +0200 +@@ -1,7 +1,7 @@ +-# generated automatically by aclocal 1.9.2 -*- Autoconf -*- ++# generated automatically by aclocal 1.9.6 -*- Autoconf -*- + +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +-# Free Software Foundation, Inc. ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, ++# 2005 Free Software Foundation, Inc. + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -13,7 +13,7 @@ + + # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +-# serial 47 AC_PROG_LIBTOOL ++# serial 48 AC_PROG_LIBTOOL + + + # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +@@ -123,7 +123,7 @@ + + # Sed substitution that helps us do robust quoting. It backslashifies + # metacharacters that are still active within double-quoted strings. +-Xsed='sed -e s/^X//' ++Xsed='sed -e 1s/^X//' + [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + + # Same as above, but do not quote variable references. +@@ -143,7 +143,7 @@ + default_ofile=libtool + can_build_shared=yes + +-# All known linkers require a `.a' archive for static linking (except M$VC, ++# All known linkers require a `.a' archive for static linking (except MSVC, + # which needs '.lib'). + libext=a + ltmain="$ac_aux_dir/ltmain.sh" +@@ -163,6 +163,7 @@ + test -z "$AS" && AS=as + test -z "$CC" && CC=cc + test -z "$LTCC" && LTCC=$CC ++test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS + test -z "$DLLTOOL" && DLLTOOL=dlltool + test -z "$LD" && LD=ld + test -z "$LN_S" && LN_S="ln -s" +@@ -182,15 +183,17 @@ + if test -n "$RANLIB"; then + case $host_os in + openbsd*) +- old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) +- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + fi + ++_LT_CC_BASENAME([$compiler]) ++ + # Only perform the check for file, if the check method requires it + case $deplibs_check_method in + file_magic*) +@@ -231,11 +234,56 @@ + # If no C compiler was specified, use CC. + LTCC=${LTCC-"$CC"} + ++# If no C compiler flags were specified, use CFLAGS. ++LTCFLAGS=${LTCFLAGS-"$CFLAGS"} ++ + # Allow CC to be a program name with arguments. + compiler=$CC + ])# _LT_AC_SYS_COMPILER + + ++# _LT_CC_BASENAME(CC) ++# ------------------- ++# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. ++AC_DEFUN([_LT_CC_BASENAME], ++[for cc_temp in $1""; do ++ case $cc_temp in ++ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; ++ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ++]) ++ ++ ++# _LT_COMPILER_BOILERPLATE ++# ------------------------ ++# Check for compiler boilerplate output or warnings with ++# the simple compiler test code. ++AC_DEFUN([_LT_COMPILER_BOILERPLATE], ++[ac_outfile=conftest.$ac_objext ++printf "$lt_simple_compile_test_code" >conftest.$ac_ext ++eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_compiler_boilerplate=`cat conftest.err` ++$rm conftest* ++])# _LT_COMPILER_BOILERPLATE ++ ++ ++# _LT_LINKER_BOILERPLATE ++# ---------------------- ++# Check for linker boilerplate output or warnings with ++# the simple link test code. ++AC_DEFUN([_LT_LINKER_BOILERPLATE], ++[ac_outfile=conftest.$ac_objext ++printf "$lt_simple_link_test_code" >conftest.$ac_ext ++eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_linker_boilerplate=`cat conftest.err` ++$rm conftest* ++])# _LT_LINKER_BOILERPLATE ++ ++ + # _LT_AC_SYS_LIBPATH_AIX + # ---------------------- + # Links a minimal program and checks the executable +@@ -308,15 +356,15 @@ + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. +-if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + if test -z "$ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... +- if (echo_test_string="`eval $cmd`") 2>/dev/null && +- echo_test_string="`eval $cmd`" && ++ if (echo_test_string=`eval $cmd`) 2>/dev/null && ++ echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break +@@ -485,7 +533,7 @@ + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then +- case "`/usr/bin/file conftest.o`" in ++ case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*linux*) +@@ -536,6 +584,22 @@ + CFLAGS="$SAVE_CFLAGS" + fi + ;; ++sparc*-*solaris*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if AC_TRY_EVAL(ac_compile); then ++ case `/usr/bin/file conftest.o` in ++ *64-bit*) ++ case $lt_cv_prog_gnu_ld in ++ yes*) LD="${LD-ld} -m elf64_sparc" ;; ++ *) LD="${LD-ld} -64" ;; ++ esac ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ + AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], + [*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) +@@ -567,7 +631,7 @@ + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) +@@ -577,8 +641,10 @@ + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test ! -s conftest.err; then ++ # So say no if there are warnings other than the usual output. ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi +@@ -604,11 +670,16 @@ + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The compiler can only warn and ignore the option if not recognized ++ # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD ++ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if diff conftest.exp conftest.er2 >/dev/null; then ++ $2=yes ++ fi + else + $2=yes + fi +@@ -667,11 +738,55 @@ + lt_cv_sys_max_cmd_len=8192; + ;; + +- *) ++ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) ++ # This has been around since 386BSD, at least. Likely further. ++ if test -x /sbin/sysctl; then ++ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` ++ elif test -x /usr/sbin/sysctl; then ++ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` ++ else ++ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs ++ fi ++ # And add a safety zone ++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ++ ;; ++ ++ interix*) ++ # We know the value 262144 and hardcode it with a safety zone (like BSD) ++ lt_cv_sys_max_cmd_len=196608 ++ ;; ++ ++ osf*) ++ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure ++ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not ++ # nice to cause kernel panics so lets avoid the loop below. ++ # First set a reasonable default. ++ lt_cv_sys_max_cmd_len=16384 ++ # ++ if test -x /sbin/sysconfig; then ++ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in ++ *1*) lt_cv_sys_max_cmd_len=-1 ;; ++ esac ++ fi ++ ;; ++ sco3.2v5*) ++ lt_cv_sys_max_cmd_len=102400 ++ ;; ++ sysv5* | sco5v6* | sysv4.2uw2*) ++ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` ++ if test -n "$kargmax"; then ++ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` ++ else ++ lt_cv_sys_max_cmd_len=32768 ++ fi ++ ;; ++ *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. +- while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ ++ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} ++ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && +@@ -697,7 +812,7 @@ + + + # _LT_AC_CHECK_DLFCN +-# -------------------- ++# ------------------ + AC_DEFUN([_LT_AC_CHECK_DLFCN], + [AC_CHECK_HEADERS(dlfcn.h)dnl + ])# _LT_AC_CHECK_DLFCN +@@ -705,7 +820,7 @@ + + # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, + # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +-# ------------------------------------------------------------------ ++# --------------------------------------------------------------------- + AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], + [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + if test "$cross_compiling" = yes; then : +@@ -771,17 +886,19 @@ + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } ++ else ++ puts (dlerror ()); + + exit (status); + }] + EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) 2>/dev/null ++ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; +- x$lt_unknown|x*) $3 ;; ++ x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed +@@ -793,7 +910,7 @@ + + + # AC_LIBTOOL_DLOPEN_SELF +-# ------------------- ++# ---------------------- + AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], + [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + if test "x$enable_dlopen" != xyes; then +@@ -864,7 +981,7 @@ + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" +- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" ++ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" +@@ -877,7 +994,7 @@ + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then +- LDFLAGS="$LDFLAGS $link_static_flag" ++ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( +@@ -925,7 +1042,7 @@ + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) +@@ -937,11 +1054,13 @@ + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings +- if test ! -s out/conftest.err; then ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp ++ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 ++ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi +- chmod u+w . ++ chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation +@@ -1005,8 +1124,8 @@ + [AC_MSG_CHECKING([how to hardcode library paths into programs]) + _LT_AC_TAGVAR(hardcode_action, $1)= + if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ +- test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ +- test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then ++ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ ++ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && +@@ -1173,7 +1292,7 @@ + shlibpath_var=LIBRARY_PATH + ;; + +-bsdi4*) ++bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +@@ -1201,7 +1320,8 @@ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' ++ $install_prog $dir/$dlname \$dldir/$dlname~ ++ chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' +@@ -1231,7 +1351,7 @@ + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; +@@ -1254,7 +1374,7 @@ + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` +@@ -1289,8 +1409,17 @@ + dynamic_linker='GNU ld.so' + ;; + +-freebsd*) +- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` ++freebsd* | dragonfly*) ++ # DragonFly does not have aout. When/if they implement a new ++ # versioning mechanism, adjust this. ++ if test -x /usr/bin/objformat; then ++ objformat=`/usr/bin/objformat` ++ else ++ case $host_os in ++ freebsd[[123]]*) objformat=aout ;; ++ *) objformat=elf ;; ++ esac ++ fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) +@@ -1308,14 +1437,19 @@ + freebsd2*) + shlibpath_overrides_runpath=yes + ;; +- freebsd3.[01]* | freebsdelf3.[01]*) ++ freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; +- *) # from 3.2 on ++ freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ ++ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; ++ freebsd*) # from 4.6 on ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; + esac + ;; + +@@ -1335,7 +1469,7 @@ + version_type=sunos + need_lib_prefix=no + need_version=no +- case "$host_cpu" in ++ case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes +@@ -1375,6 +1509,18 @@ + postinstall_cmds='chmod 555 $lib' + ;; + ++interix3*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ + irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; +@@ -1451,7 +1597,7 @@ + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then +- lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` ++ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + +@@ -1513,8 +1659,13 @@ + + openbsd*) + version_type=sunos ++ sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no +- need_version=yes ++ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. ++ case $host_os in ++ openbsd3.3 | openbsd3.3.*) need_version=yes ;; ++ *) need_version=no ;; ++ esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH +@@ -1552,13 +1703,6 @@ + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +-sco3.2v5*) +- version_type=osf +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- + solaris*) + version_type=linux + need_lib_prefix=no +@@ -1584,7 +1728,7 @@ + need_version=yes + ;; + +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' +@@ -1617,6 +1761,29 @@ + fi + ;; + ++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) ++ version_type=freebsd-elf ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ if test "$with_gnu_ld" = yes; then ++ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' ++ shlibpath_overrides_runpath=no ++ else ++ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' ++ shlibpath_overrides_runpath=yes ++ case $host_os in ++ sco3.2v5*) ++ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ++ ;; ++ esac ++ fi ++ sys_lib_dlsearch_path_spec='/usr/lib' ++ ;; ++ + uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +@@ -1630,6 +1797,11 @@ + esac + AC_MSG_RESULT([$dynamic_linker]) + test "$dynamic_linker" = no && can_build_shared=no ++ ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++fi + ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +@@ -1654,6 +1826,9 @@ + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi ++ if test -z "$LTCFLAGS"; then ++ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" ++ fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. +@@ -1680,7 +1855,9 @@ + + case $tagname in + CXX) +- if test -n "$CXX" && test "X$CXX" != "Xno"; then ++ if test -n "$CXX" && ( test "X$CXX" != "Xno" && ++ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || ++ (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" +@@ -1742,7 +1919,7 @@ + + # AC_LIBTOOL_WIN32_DLL + # -------------------- +-# declare package support for building win32 dll's ++# declare package support for building win32 DLLs + AC_DEFUN([AC_LIBTOOL_WIN32_DLL], + [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) + ])# AC_LIBTOOL_WIN32_DLL +@@ -1780,7 +1957,7 @@ + + # AC_DISABLE_SHARED + # ----------------- +-#- set the default shared flag to --disable-shared ++# set the default shared flag to --disable-shared + AC_DEFUN([AC_DISABLE_SHARED], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_ENABLE_SHARED(no) +@@ -1916,7 +2093,7 @@ + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) +- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" ++ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then +@@ -2026,7 +2203,7 @@ + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some GNU ld's only accept -v. ++ # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. +- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' ++ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; +@@ -2163,7 +2349,7 @@ + + hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file +- case "$host_cpu" in ++ case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so +@@ -2179,6 +2365,11 @@ + esac + ;; + ++interix3*) ++ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here ++ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ++ ;; ++ + irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; +@@ -2191,15 +2382,6 @@ + + # This must be Linux ELF. + linux*) +- case $host_cpu in +- alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) +- lt_cv_deplibs_check_method=pass_all ;; +- *) +- # glibc up to 2.1.1 does not perform some relocations on ARM +- # this will be overridden with pass_all, but let us keep it just in case +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; +- esac +- lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +@@ -2222,12 +2404,10 @@ + ;; + + openbsd*) +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' ++ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else +- lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' ++ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +@@ -2235,15 +2415,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + +-sco3.2v5*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- + solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' +@@ -2264,10 +2440,13 @@ + siemens) + lt_cv_deplibs_check_method=pass_all + ;; ++ pc) ++ lt_cv_deplibs_check_method=pass_all ++ ;; + esac + ;; + +-sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) ++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + esac +@@ -2287,36 +2466,43 @@ + # Let the user override the test. + lt_cv_path_NM="$NM" + else +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- tmp_nm="$ac_dir/${ac_tool_prefix}nm" +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- # Tru64's nm complains that /dev/null is an invalid object file +- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in +- */dev/null* | *'Invalid file or object type'*) +- lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in +- */dev/null*) +- lt_cv_path_NM="$tmp_nm -p" ++ lt_nm_to_check="${ac_tool_prefix}nm" ++ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then ++ lt_nm_to_check="$lt_nm_to_check nm" ++ fi ++ for lt_tmp_nm in $lt_nm_to_check; do ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ tmp_nm="$ac_dir/$lt_tmp_nm" ++ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then ++ # Check to see if the nm accepts a BSD-compat flag. ++ # Adding the `sed 1q' prevents false positives on HP-UX, which says: ++ # nm: unknown option "B" ignored ++ # Tru64's nm complains that /dev/null is an invalid object file ++ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in ++ */dev/null* | *'Invalid file or object type'*) ++ lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags ++ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in ++ */dev/null*) ++ lt_cv_path_NM="$tmp_nm -p" ++ break ++ ;; ++ *) ++ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but ++ continue # so that we can try to find one that supports BSD flags ++ ;; ++ esac + ;; + esac +- esac +- fi ++ fi ++ done ++ IFS="$lt_save_ifs" + done +- IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm + fi]) + NM="$lt_cv_path_NM" +@@ -2348,13 +2534,13 @@ + # ----------------------------------- + # sets LIBLTDL to the link flags for the libltdl convenience library and + # LTDLINCL to the include flags for the libltdl header and adds +-# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +-# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +-# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +-# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +-# '${top_srcdir}/' (note the single quotes!). If your package is not +-# flat and you're not using automake, define top_builddir and +-# top_srcdir appropriately in the Makefiles. ++# --enable-ltdl-convenience to the configure arguments. Note that ++# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, ++# it is assumed to be `libltdl'. LIBLTDL will be prefixed with ++# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' ++# (note the single quotes!). If your package is not flat and you're not ++# using automake, define top_builddir and top_srcdir appropriately in ++# the Makefiles. + AC_DEFUN([AC_LIBLTDL_CONVENIENCE], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in +@@ -2373,13 +2559,13 @@ + # ----------------------------------- + # sets LIBLTDL to the link flags for the libltdl installable library and + # LTDLINCL to the include flags for the libltdl header and adds +-# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +-# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +-# DIRECTORY is not provided and an installed libltdl is not found, it is +-# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +-# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +-# quotes!). If your package is not flat and you're not using automake, +-# define top_builddir and top_srcdir appropriately in the Makefiles. ++# --enable-ltdl-install to the configure arguments. Note that ++# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, ++# and an installed libltdl is not found, it is assumed to be `libltdl'. ++# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with ++# '${top_srcdir}/' (note the single quotes!). If your package is not ++# flat and you're not using automake, define top_builddir and top_srcdir ++# appropriately in the Makefiles. + # In the future, this macro may have to be called after AC_PROG_LIBTOOL. + AC_DEFUN([AC_LIBLTDL_INSTALLABLE], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +@@ -2417,10 +2603,21 @@ + # --------------- + AC_DEFUN([_LT_AC_LANG_CXX], + [AC_REQUIRE([AC_PROG_CXX]) +-AC_REQUIRE([AC_PROG_CXXCPP]) ++AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) + ])# _LT_AC_LANG_CXX + ++# _LT_AC_PROG_CXXCPP ++# ------------------ ++AC_DEFUN([_LT_AC_PROG_CXXCPP], ++[ ++AC_REQUIRE([AC_PROG_CXX]) ++if test -n "$CXX" && ( test "X$CXX" != "Xno" && ++ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || ++ (test "X$CXX" != "Xg++"))) ; then ++ AC_PROG_CXXCPP ++fi ++])# _LT_AC_PROG_CXXCPP + + # AC_LIBTOOL_F77 + # -------------- +@@ -2460,7 +2657,7 @@ + + + # AC_LIBTOOL_RC +-# -------------- ++# ------------- + # enable support for Windows resource files + AC_DEFUN([AC_LIBTOOL_RC], + [AC_REQUIRE([LT_AC_PROG_RC]) +@@ -2493,36 +2690,9 @@ + + _LT_AC_SYS_COMPILER + +-# +-# Check for any special shared library compilation flags. +-# +-_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +-if test "$GCC" = no; then +- case $host_os in +- sco3.2v5*) +- _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' +- ;; +- esac +-fi +-if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then +- AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) +- if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : +- else +- AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) +- _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no +- fi +-fi +- +- +-# +-# Check to make sure the static flag actually works. +-# +-AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], +- _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), +- $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), +- [], +- [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +- ++# save warnings/boilerplate of simple test code ++_LT_COMPILER_BOILERPLATE ++_LT_LINKER_BOILERPLATE + + AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) + AC_LIBTOOL_PROG_COMPILER_PIC($1) +@@ -2532,9 +2702,9 @@ + AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) + AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + AC_LIBTOOL_SYS_LIB_STRIP +-AC_LIBTOOL_DLOPEN_SELF($1) ++AC_LIBTOOL_DLOPEN_SELF + +-# Report which librarie types wil actually be built ++# Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + +@@ -2543,7 +2713,7 @@ + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. +-case "$host_os" in ++case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then +@@ -2556,43 +2726,6 @@ + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi +- ;; +- darwin* | rhapsody*) +- if test "$GCC" = yes; then +- _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +- case "$host_os" in +- rhapsody* | darwin1.[[012]]) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' +- else +- case ${MACOSX_DEPLOYMENT_TARGET} in +- 10.[[012]]) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' +- ;; +- 10.*) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' +- ;; +- esac +- fi +- ;; +- esac +- output_verbose_link_cmd='echo' +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' +- _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' +- # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- _LT_AC_TAGVAR(hardcode_direct, $1)=no +- _LT_AC_TAGVAR(hardcode_automatic, $1)=yes +- _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' +- _LT_AC_TAGVAR(link_all_deplibs, $1)=yes +- else +- _LT_AC_TAGVAR(ld_shlibs, $1)=no +- fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) +@@ -2618,7 +2751,7 @@ + AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], + [AC_LANG_PUSH(C++) + AC_REQUIRE([AC_PROG_CXX]) +-AC_REQUIRE([AC_PROG_CXXCPP]) ++AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(allow_undefined_flag, $1)= +@@ -2630,6 +2763,7 @@ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no ++_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= +@@ -2647,7 +2781,7 @@ + _LT_AC_TAGVAR(compiler_lib_search_path, $1)= + + # Source file extension for C++ test sources. +-ac_ext=cc ++ac_ext=cpp + + # Object file extension for compiled C++ test sources. + objext=o +@@ -2657,11 +2791,15 @@ + lt_simple_compile_test_code="int some_variable = 0;\n" + + # Code to be used in simple link tests +-lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' ++lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_AC_SYS_COMPILER + ++# save warnings/boilerplate of simple test code ++_LT_COMPILER_BOILERPLATE ++_LT_LINKER_BOILERPLATE ++ + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD +@@ -2672,18 +2810,18 @@ + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else +- unset lt_cv_prog_gnu_ld ++ $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else +- unset lt_cv_path_LD ++ $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_AC_TAGVAR(compiler, $1)=$CC +-cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` ++_LT_CC_BASENAME([$compiler]) + + # We don't want -fno-exception wen compiling C++ code, so set the + # no_builtin_flag separately +@@ -2772,6 +2910,7 @@ + ;; + esac + done ++ ;; + esac + + exp_sym_flag='-bexport' +@@ -2790,7 +2929,7 @@ + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then +- case $host_os in aix4.[012]|aix4.[012].*) ++ case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` +@@ -2809,8 +2948,12 @@ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi ++ ;; + esac + shared_flag='-shared' ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag="$shared_flag "'${wl}-G' ++ fi + else + # not using gcc + if test "$host_cpu" = ia64; then +@@ -2837,12 +2980,12 @@ + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX +@@ -2851,16 +2994,26 @@ + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' +- # -bexpall does not export symbols beginning with underscore (_) +- _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes +- # This is similar to how AIX traditionally builds it's shared libraries. +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ # This is similar to how AIX traditionally builds its shared libraries. ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; ++ ++ beos*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported ++ # Joseph Beckenbach says some releases of gcc ++ # support --undefined. This deserves some investigation. FIXME ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ else ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ + chorus*) + case $cc_basename in + *) +@@ -2879,7 +3032,7 @@ + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +@@ -2888,70 +3041,81 @@ + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ +- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; ++ darwin* | rhapsody*) ++ case $host_os in ++ rhapsody* | darwin1.[[012]]) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[[012]]) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; ++ esac ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + +- darwin* | rhapsody*) +- if test "$GXX" = yes; then +- _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +- case "$host_os" in +- rhapsody* | darwin1.[[012]]) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' ++ if test "$GXX" = yes ; then ++ lt_int_apple_cc_single_mod=no ++ output_verbose_link_cmd='echo' ++ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then ++ lt_int_apple_cc_single_mod=yes ++ fi ++ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else +- case ${MACOSX_DEPLOYMENT_TARGET} in +- 10.[[012]]) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' +- ;; +- 10.*) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' +- ;; +- esac ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ fi ++ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ fi ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ case $cc_basename in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac + fi +- ;; +- esac +- lt_int_apple_cc_single_mod=no +- output_verbose_link_cmd='echo' +- if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then +- lt_int_apple_cc_single_mod=yes +- fi +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- else +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- fi +- _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' +- +- # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- else +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- _LT_AC_TAGVAR(hardcode_direct, $1)=no +- _LT_AC_TAGVAR(hardcode_automatic, $1)=yes +- _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' +- _LT_AC_TAGVAR(link_all_deplibs, $1)=yes +- else +- _LT_AC_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; ++ ;; + + dgux*) + case $cc_basename in +- ec++) ++ ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +- ghcx) ++ ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no +@@ -2962,14 +3126,14 @@ + ;; + esac + ;; +- freebsd[12]*) ++ freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; +- freebsd* | kfreebsd*-gnu) ++ freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes +@@ -2986,11 +3150,11 @@ + # location of the library. + + case $cc_basename in +- CC) ++ CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +- aCC) ++ aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when +@@ -3000,7 +3164,7 @@ + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then +@@ -3014,33 +3178,22 @@ + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then +- case "$host_cpu" in +- hppa*64*) +- _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ case $host_cpu in ++ hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' +- _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: +- ;; +- ia64*) +- _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) +- _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' +- _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi +- case "$host_cpu" in +- hppa*64*) +- _LT_AC_TAGVAR(hardcode_direct, $1)=no +- _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no +- ;; +- ia64*) ++ case $host_cpu in ++ hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, +- # but as the default +- # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes +@@ -3051,14 +3204,17 @@ + esac + + case $cc_basename in +- CC) ++ CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +- aCC) +- case "$host_cpu" in +- hppa*64*|ia64*) +- _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ++ aCC*) ++ case $host_cpu in ++ hppa*64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ ;; ++ ia64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +@@ -3077,9 +3233,12 @@ + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then +- case "$host_cpu" in +- ia64*|hppa*64*) +- _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ++ case $host_cpu in ++ hppa*64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ ;; ++ ia64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +@@ -3093,11 +3252,25 @@ + ;; + esac + ;; ++ interix3*) ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. ++ # Instead, shared libraries are loaded at an image base (0x10000000 by ++ # default) and relocated if they conflict, which is a slow very memory ++ # consuming and fragmenting process. To avoid this, we pick a random, ++ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link ++ # time. Moving up from 0x10000000 also allows more sbrk(2) space. ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ ;; + irix5* | irix6*) + case $cc_basename in +- CC) ++ CC*) + # SGI C++ +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is +@@ -3108,7 +3281,7 @@ + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi +@@ -3121,7 +3294,7 @@ + ;; + linux*) + case $cc_basename in +- KCC) ++ KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file +@@ -3146,17 +3319,41 @@ + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; +- icpc) ++ icpc*) + # Intel C++ + with_gnu_ld=yes ++ # version 8.0 and above of icpc choke on multiply defined symbols ++ # if we add $predep_objects and $postdep_objects, however 7.1 and ++ # earlier do not add the objects themselves. ++ case `$CC -V 2>&1` in ++ *"Version 7."*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ *) # Version 8.0 or newer ++ tmp_idyn= ++ case $host_cpu in ++ ia64*) tmp_idyn=' -i_dynamic';; ++ esac ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; +- cxx) ++ pgCC*) ++ # Portland Group C++ compiler ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ++ ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ ;; ++ cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' +@@ -3187,7 +3384,7 @@ + ;; + mvs*) + case $cc_basename in +- cxx) ++ cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +@@ -3208,9 +3405,25 @@ + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; ++ openbsd2*) ++ # C++ shared libraries are fairly broken ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ openbsd*) ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ fi ++ output_verbose_link_cmd='echo' ++ ;; + osf3*) + case $cc_basename in +- KCC) ++ KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file +@@ -3226,14 +3439,14 @@ + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; +- RCC) ++ RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +- cxx) ++ cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: +@@ -3251,7 +3464,7 @@ + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: +@@ -3270,7 +3483,7 @@ + ;; + osf4* | osf5*) + case $cc_basename in +- KCC) ++ KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file +@@ -3285,17 +3498,17 @@ + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; +- RCC) ++ RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +- cxx) ++ cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ +- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ ++ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' +@@ -3314,7 +3527,7 @@ + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: +@@ -3335,27 +3548,14 @@ + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +- sco*) +- _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +- case $cc_basename in +- CC) +- # FIXME: insert proper C++ library support +- _LT_AC_TAGVAR(ld_shlibs, $1)=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- _LT_AC_TAGVAR(ld_shlibs, $1)=no +- ;; +- esac +- ;; + sunos4*) + case $cc_basename in +- CC) ++ CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +- lcc) ++ lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no +@@ -3368,36 +3568,33 @@ + ;; + solaris*) + case $cc_basename in +- CC) ++ CC*) + # Sun C++ 4.2, 5.x and Centerline C++ ++ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' ++ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in +- solaris2.[0-5] | solaris2.[0-5].*) ;; ++ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system +- # linker. ++ # linker. We must also pass each convience library through ++ # to the system linker between allextract/defaultextract. ++ # The C++ compiler will combine linker options so we ++ # cannot just pass the convience library names through ++ # without $wl. + # Supported since Solaris 2.6 (maybe 2.5.1?) +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is +@@ -3405,7 +3602,7 @@ + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; +- gcx) ++ gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + +@@ -3443,12 +3640,63 @@ + ;; + esac + ;; +- sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) ++ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) ++ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ runpath_var='LD_RUN_PATH' ++ ++ case $cc_basename in ++ CC*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ *) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ esac ++ ;; ++ sysv5* | sco3.2v5* | sco5v6*) ++ # Note: We can NOT use -z defs as we might desire, because we do not ++ # link with -lc, and that would cause any symbols used from libc to ++ # always be unresolved, which means just about no library would ++ # ever link correctly. If we're not using GNU ld we use -z text ++ # though, which does catch some bad symbols but isn't as heavy-handed ++ # as -z defs. ++ # For security reasons, it is highly recommended that you always ++ # use absolute paths for naming shared libraries, and exclude the ++ # DT_RUNPATH tag from executables and libraries. But doing so ++ # requires that you compile everything twice, which is a pain. ++ # So that behaviour is only enabled if SCOABSPATH is set to a ++ # non-empty value in the environment. Most likely only useful for ++ # creating official distributions of packages. ++ # This is a hack until libtool officially supports absolute path ++ # names for shared libraries. ++ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' ++ runpath_var='LD_RUN_PATH' ++ ++ case $cc_basename in ++ CC*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ *) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ esac + ;; + tandem*) + case $cc_basename in +- NCC) ++ NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no +@@ -3481,8 +3729,6 @@ + AC_LIBTOOL_PROG_LD_SHLIBS($1) + AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) + AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +-AC_LIBTOOL_SYS_LIB_STRIP +-AC_LIBTOOL_DLOPEN_SELF($1) + + AC_LIBTOOL_CONFIG($1) + +@@ -3500,7 +3746,7 @@ + ])# AC_LIBTOOL_LANG_CXX_CONFIG + + # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +-# ------------------------ ++# ------------------------------------ + # Figure out "hidden" library dependencies from verbose + # compiler output when linking a shared library. + # Parse the compiler output and extract the necessary +@@ -3554,7 +3800,7 @@ + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. +- output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" ++ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + + for p in `eval $output_verbose_link_cmd`; do + case $p in +@@ -3630,13 +3876,37 @@ + + $rm -f confest.$objext + ++# PORTME: override above test on systems where it is broken ++ifelse([$1],[CXX], ++[case $host_os in ++interix3*) ++ # Interix 3.5 installs completely hosed .la files for C++, so rather than ++ # hack all around it, let's just trust "g++" to DTRT. ++ _LT_AC_TAGVAR(predep_objects,$1)= ++ _LT_AC_TAGVAR(postdep_objects,$1)= ++ _LT_AC_TAGVAR(postdeps,$1)= ++ ;; ++ ++solaris*) ++ case $cc_basename in ++ CC*) ++ # Adding this requires a known-good setup of shared libraries for ++ # Sun compiler versions before 5.6, else PIC objects from an old ++ # archive will be linked into the output, leading to subtle bugs. ++ _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun' ++ ;; ++ esac ++ ;; ++esac ++]) ++ + case " $_LT_AC_TAGVAR(postdeps, $1) " in + *" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; + esac + ])# AC_LIBTOOL_POSTDEP_PREDEP + + # AC_LIBTOOL_LANG_F77_CONFIG +-# ------------------------ ++# -------------------------- + # Ensure that the configuration vars for the C compiler are + # suitably defined. Those variables are subsequently used by + # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +@@ -3680,12 +3950,16 @@ + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_AC_SYS_COMPILER + ++# save warnings/boilerplate of simple test code ++_LT_COMPILER_BOILERPLATE ++_LT_LINKER_BOILERPLATE ++ + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + CC=${F77-"f77"} + compiler=$CC + _LT_AC_TAGVAR(compiler, $1)=$CC +-cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` ++_LT_CC_BASENAME([$compiler]) + + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) +@@ -3695,7 +3969,7 @@ + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. +-case "$host_os" in ++case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then +@@ -3704,7 +3978,9 @@ + fi + ;; + aix4* | aix5*) +- test "$enable_shared" = yes && enable_static=no ++ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then ++ test "$enable_shared" = yes && enable_static=no ++ fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) +@@ -3714,8 +3990,6 @@ + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + +-test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no +- + _LT_AC_TAGVAR(GCC, $1)="$G77" + _LT_AC_TAGVAR(LD, $1)="$LD" + +@@ -3725,8 +3999,6 @@ + AC_LIBTOOL_PROG_LD_SHLIBS($1) + AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) + AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +-AC_LIBTOOL_SYS_LIB_STRIP +- + + AC_LIBTOOL_CONFIG($1) + +@@ -3755,20 +4027,27 @@ + lt_simple_compile_test_code="class foo {}\n" + + # Code to be used in simple link tests +-lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' ++lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_AC_SYS_COMPILER + ++# save warnings/boilerplate of simple test code ++_LT_COMPILER_BOILERPLATE ++_LT_LINKER_BOILERPLATE ++ + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + CC=${GCJ-"gcj"} + compiler=$CC + _LT_AC_TAGVAR(compiler, $1)=$CC ++_LT_CC_BASENAME([$compiler]) + + # GCJ did not exist at the time GCC didn't implicitly link libc in. + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ++_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ++ + AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) + AC_LIBTOOL_PROG_COMPILER_PIC($1) + AC_LIBTOOL_PROG_CC_C_O($1) +@@ -3776,8 +4055,6 @@ + AC_LIBTOOL_PROG_LD_SHLIBS($1) + AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) + AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +-AC_LIBTOOL_SYS_LIB_STRIP +-AC_LIBTOOL_DLOPEN_SELF($1) + + AC_LIBTOOL_CONFIG($1) + +@@ -3787,7 +4064,7 @@ + + + # AC_LIBTOOL_LANG_RC_CONFIG +-# -------------------------- ++# ------------------------- + # Ensure that the configuration vars for the Windows resource compiler are + # suitably defined. Those variables are subsequently used by + # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +@@ -3811,11 +4088,16 @@ + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_AC_SYS_COMPILER + ++# save warnings/boilerplate of simple test code ++_LT_COMPILER_BOILERPLATE ++_LT_LINKER_BOILERPLATE ++ + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + CC=${RC-"windres"} + compiler=$CC + _LT_AC_TAGVAR(compiler, $1)=$CC ++_LT_CC_BASENAME([$compiler]) + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + + AC_LIBTOOL_CONFIG($1) +@@ -3845,7 +4127,7 @@ + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. +- for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ +@@ -3951,7 +4233,7 @@ + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a +@@ -3962,11 +4244,11 @@ + SED=$lt_SED + + # Sed that helps us avoid accidentally triggering echo(1) options like -n. +-Xsed="$SED -e s/^X//" ++Xsed="$SED -e 1s/^X//" + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. +-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + # The names of the tagged configurations supported by this script. + available_tags= +@@ -3997,6 +4279,12 @@ + # The host system. + host_alias=$host_alias + host=$host ++host_os=$host_os ++ ++# The build system. ++build_alias=$build_alias ++build=$build ++build_os=$build_os + + # An echo program that does not interpret backslashes. + echo=$lt_echo +@@ -4008,12 +4296,18 @@ + # A C compiler. + LTCC=$lt_LTCC + ++# LTCC compiler flags. ++LTCFLAGS=$lt_LTCFLAGS ++ + # A language-specific compiler. + CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + + # Is the compiler the GNU C compiler? + with_gcc=$_LT_AC_TAGVAR(GCC, $1) + ++gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` ++gcc_ver=\`gcc -dumpversion\` ++ + # An ERE matcher. + EGREP=$lt_EGREP + +@@ -4073,7 +4367,7 @@ + # Does compiler simultaneously support -c and -o options? + compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +-# Must we lock files when doing compilation ? ++# Must we lock files when doing compilation? + need_locks=$lt_need_locks + + # Do we need the lib prefix for modules? +@@ -4147,11 +4441,11 @@ + + # Dependencies to place before the objects being linked to create a + # shared library. +-predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) ++predep_objects=\`echo $lt_[]_LT_AC_TAGVAR(predep_objects, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place after the objects being linked to create a + # shared library. +-postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) ++postdep_objects=\`echo $lt_[]_LT_AC_TAGVAR(postdep_objects, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place before the objects being linked to create a + # shared library. +@@ -4163,7 +4457,7 @@ + + # The library search path used internally by the compiler when linking + # a shared library. +-compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) ++compiler_lib_search_path=\`echo $lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$lt_deplibs_check_method +@@ -4243,7 +4537,7 @@ + link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + + # Compile-time system search path for libraries +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Run-time system search path for libraries + sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +@@ -4347,9 +4641,6 @@ + # Regexp to match symbols that can be accessed directly from C. + sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +-# Transform the above into a raw symbol and a C symbol. +-symxfrm='\1 \2\3 \3' +- + # Transform an extracted symbol line into a proper C declaration + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +@@ -4371,15 +4662,31 @@ + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; ++linux*) ++ if test "$host_cpu" = ia64; then ++ symcode='[[ABCDGIRSTW]]' ++ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" ++ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++ fi ++ ;; + irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; + osf*) + symcode='[[BCDEGQRST]]' + ;; +-solaris* | sysv5*) ++solaris*) + symcode='[[BDRT]]' + ;; ++sco3.2v5*) ++ symcode='[[DT]]' ++ ;; ++sysv4.2uw2*) ++ symcode='[[DT]]' ++ ;; ++sysv5* | sco5v6* | unixware* | OpenUNIX*) ++ symcode='[[ABDT]]' ++ ;; + sysv4) + symcode='[[DFNSTU]]' + ;; +@@ -4402,8 +4709,11 @@ + # Try without a prefix undercore, then with it. + for ac_symprfx in "" "_"; do + ++ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. ++ symxfrm="\\1 $ac_symprfx\\2 \\2" ++ + # Write the raw and C identifiers. +- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" ++ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no +@@ -4559,6 +4869,10 @@ + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; ++ interix3*) ++ # Interix 3.x gcc -fpic/-fPIC options generate broken code. ++ # Instead, we relocate shared libraries at runtime. ++ ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic +@@ -4567,7 +4881,7 @@ + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + ;; + *) +@@ -4592,18 +4906,28 @@ + ;; + chorus*) + case $cc_basename in +- cxch68) ++ cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case $cc_basename in ++ xlc*) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ ;; ++ esac ++ ;; + dgux*) + case $cc_basename in +- ec++) ++ ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; +- ghcx) ++ ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; +@@ -4611,22 +4935,22 @@ + ;; + esac + ;; +- freebsd* | kfreebsd*-gnu) ++ freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in +- CC) ++ CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; +- aCC) ++ aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' +- _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" +- case "$host_cpu" in ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -4639,9 +4963,13 @@ + ;; + esac + ;; ++ interix*) ++ # This is c89, which is MS Visual C++ (no shared libs) ++ # Anyone wants to do a port? ++ ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in +- CC) ++ CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. +@@ -4652,18 +4980,24 @@ + ;; + linux*) + case $cc_basename in +- KCC) ++ KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; +- icpc) ++ icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; +- cxx) ++ pgCC*) ++ # Portland Group C++ compiler. ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; ++ cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. +@@ -4680,7 +5014,7 @@ + ;; + mvs*) + case $cc_basename in +- cxx) ++ cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) +@@ -4691,14 +5025,14 @@ + ;; + osf3* | osf4* | osf5*) + case $cc_basename in +- KCC) ++ KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; +- RCC) ++ RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; +- cxx) ++ cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha +@@ -4712,24 +5046,15 @@ + ;; + psos*) + ;; +- sco*) +- case $cc_basename in +- CC) +- _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' +- ;; +- *) +- ;; +- esac +- ;; + solaris*) + case $cc_basename in +- CC) ++ CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; +- gcx) ++ gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; +@@ -4739,12 +5064,12 @@ + ;; + sunos4*) + case $cc_basename in +- CC) ++ CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; +- lcc) ++ lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; +@@ -4754,7 +5079,7 @@ + ;; + tandem*) + case $cc_basename in +- NCC) ++ NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; +@@ -4762,7 +5087,14 @@ + ;; + esac + ;; +- unixware*) ++ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) ++ case $cc_basename in ++ CC*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; ++ esac + ;; + vxworks*) + ;; +@@ -4809,6 +5141,11 @@ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + ++ interix3*) ++ # Interix 3.x gcc -fpic/-fPIC options generate broken code. ++ # Instead, we relocate shared libraries at runtime. ++ ;; ++ + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. +@@ -4825,7 +5162,7 @@ + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -4851,6 +5188,16 @@ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case $cc_basename in ++ xlc*) ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ ;; ++ esac ++ ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being +@@ -4862,7 +5209,7 @@ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -4886,12 +5233,19 @@ + ;; + + linux*) +- case $CC in ++ case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; ++ pgcc* | pgf77* | pgf90* | pgf95*) ++ # Portland Group compilers (*not* the Pentium gcc compiler, ++ # which looks to be a dead project) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. +@@ -4906,15 +5260,15 @@ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + +- sco3.2v5*) +- _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' +- _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' +- ;; +- + solaris*) +- _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ case $cc_basename in ++ f77* | f90* | f95*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; ++ *) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; ++ esac + ;; + + sunos4*) +@@ -4923,7 +5277,7 @@ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +@@ -4936,6 +5290,17 @@ + fi + ;; + ++ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ++ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ++ ;; ++ ++ unicos*) ++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ++ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ++ ;; ++ + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' +@@ -4963,7 +5328,7 @@ + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) + fi +-case "$host_os" in ++case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +@@ -4972,6 +5337,16 @@ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; + esac ++ ++# ++# Check to make sure the static flag actually works. ++# ++wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" ++AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], ++ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), ++ $lt_tmp_static_flag, ++ [], ++ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + ]) + + +@@ -4996,7 +5371,7 @@ + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) +- _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +@@ -5039,7 +5414,8 @@ + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= +- ++ # Just being paranoid about ensuring that cc_basename is set. ++ _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time +@@ -5049,6 +5425,10 @@ + with_gnu_ld=no + fi + ;; ++ interix*) ++ # we just hope/assume this is gcc and not c89 (= MSVC++) ++ with_gnu_ld=yes ++ ;; + openbsd*) + with_gnu_ld=no + ;; +@@ -5059,6 +5439,27 @@ + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + ++ # Set some defaults for GNU ld with shared library support. These ++ # are reset later if shared libraries are not supported. Putting them ++ # here allows them to be overridden if necessary. ++ runpath_var=LD_RUN_PATH ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= ++ fi ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) +@@ -5109,10 +5510,10 @@ + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes +- _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ++ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +@@ -5121,9 +5522,55 @@ + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ +- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' ++ else ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ ++ interix3*) ++ _LT_AC_TAGVAR(hardcode_direct, $1)=no ++ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. ++ # Instead, shared libraries are loaded at an image base (0x10000000 by ++ # default) and relocated if they conflict, which is a slow very memory ++ # consuming and fragmenting process. To avoid this, we pick a random, ++ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link ++ # time. Moving up from 0x10000000 also allows more sbrk(2) space. ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ tmp_addflag= ++ case $cc_basename,$host_cpu in ++ pgcc*) # Portland Group C compiler ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ tmp_addflag=' $pic_flag' ++ ;; ++ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ tmp_addflag=' $pic_flag -Mnomain' ;; ++ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 ++ tmp_addflag=' -i_dynamic' ;; ++ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 ++ tmp_addflag=' -i_dynamic -nofor_main' ;; ++ ifc* | ifort*) # Intel Fortran compiler ++ tmp_addflag=' -nofor_main' ;; ++ esac ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ ++ if test $supports_anon_versioning = yes; then ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ ++ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++ $echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ fi + else +- ld_shlibs=no ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + +@@ -5137,7 +5584,7 @@ + fi + ;; + +- solaris* | sysv5*) ++ solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 +@@ -5158,6 +5605,33 @@ + fi + ;; + ++ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) ++ case `$LD -v 2>&1` in ++ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ cat <<_LT_EOF 1>&2 ++ ++*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not ++*** reliably create shared libraries on SCO systems. Therefore, libtool ++*** is disabling shared libraries support. We urge you to upgrade GNU ++*** binutils to release 2.16.91.0.3 or newer. Another option is to modify ++*** your PATH or compiler configuration so that the native linker is ++*** used, and then restart. ++ ++_LT_EOF ++ ;; ++ *) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' ++ else ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ fi ++ ;; ++ esac ++ ;; ++ + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= +@@ -5165,31 +5639,6 @@ + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + +- linux*) +- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" +- supports_anon_versioning=no +- case `$LD -v 2>/dev/null` in +- *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 +- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... +- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... +- *\ 2.11.*) ;; # other 2.11 versions +- *) supports_anon_versioning=yes ;; +- esac +- if test $supports_anon_versioning = yes; then +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +-cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +-$echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- else +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" +- fi +- else +- _LT_AC_TAGVAR(ld_shlibs, $1)=no +- fi +- ;; +- + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +@@ -5200,16 +5649,11 @@ + ;; + esac + +- if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then +- runpath_var=LD_RUN_PATH +- _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' +- _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +- fi ++ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then ++ runpath_var= ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) +@@ -5221,7 +5665,7 @@ + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes +- if test "$GCC" = yes && test -z "$link_static_flag"; then ++ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported +@@ -5255,6 +5699,7 @@ + break + fi + done ++ ;; + esac + + exp_sym_flag='-bexport' +@@ -5273,7 +5718,7 @@ + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then +- case $host_os in aix4.[012]|aix4.[012].*) ++ case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` +@@ -5292,8 +5737,12 @@ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi ++ ;; + esac + shared_flag='-shared' ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag="$shared_flag "'${wl}-G' ++ fi + else + # not using gcc + if test "$host_cpu" = ia64; then +@@ -5301,11 +5750,11 @@ + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else +- if test "$aix_use_runtimelinking" = yes; then ++ if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' +- fi ++ fi + fi + fi + +@@ -5319,12 +5768,12 @@ + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX +@@ -5333,13 +5782,11 @@ + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' +- # -bexpall does not export symbols beginning with underscore (_) +- _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes +- # This is similar to how AIX traditionally builds it's shared libraries. +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ # This is similar to how AIX traditionally builds its shared libraries. ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; +@@ -5352,7 +5799,7 @@ + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + +- bsdi4*) ++ bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + +@@ -5373,57 +5820,57 @@ + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' +- fix_srcfile_path='`cygpath -w "$srcfile"`' ++ _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) +- if test "$GXX" = yes ; then +- _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +- case "$host_os" in +- rhapsody* | darwin1.[[012]]) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' +- else +- case ${MACOSX_DEPLOYMENT_TARGET} in +- 10.[[012]]) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' +- ;; +- 10.*) +- _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' +- ;; +- esac +- fi +- ;; ++ case $host_os in ++ rhapsody* | darwin1.[[012]]) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[[012]]) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; + esac +- lt_int_apple_cc_single_mod=no +- output_verbose_link_cmd='echo' +- if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then +- lt_int_apple_cc_single_mod=yes +- fi +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- else +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- fi +- _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' +- # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- else +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ if test "$GCC" = yes ; then ++ output_verbose_link_cmd='echo' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else +- _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ case $cc_basename in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ _LT_AC_TAGVAR(ld_shlibs, $1)=no ++ ;; ++ esac + fi + ;; + +@@ -5457,7 +5904,7 @@ + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd* | kfreebsd*-gnu) ++ freebsd* | kfreebsd*-gnu | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes +@@ -5480,47 +5927,62 @@ + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + +- hpux10* | hpux11*) ++ hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then +- case "$host_cpu" in +- hppa*64*|ia64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ fi ++ if test "$with_gnu_ld" = no; then ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ _LT_AC_TAGVAR(hardcode_direct, $1)=yes ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ++ fi ++ ;; ++ ++ hpux11*) ++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ case $host_cpu in ++ hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; ++ ia64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ++ ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else +- case "$host_cpu" in +- hppa*64*|ia64*) +- _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ++ case $host_cpu in ++ hppa*64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ ia64*) ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) +- _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then +- case "$host_cpu" in +- hppa*64*) +- _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ++ ++ case $host_cpu in ++ hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' +- _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; +- ia64*) +- _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' +- _LT_AC_TAGVAR(hardcode_direct, $1)=no +- _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no +- +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes +- ;; + *) +- _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' +- _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + +@@ -5568,6 +6030,7 @@ + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else +@@ -5613,7 +6076,7 @@ + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ +- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' ++ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' +@@ -5621,21 +6084,15 @@ + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + +- sco3.2v5*) +- _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no +- _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ;; +- + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then ++ wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else ++ wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +@@ -5644,8 +6101,18 @@ + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; +- *) # Supported since Solaris 2.6 (maybe 2.5.1?) +- _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; ++ *) ++ # The compiler driver will combine linker options so we ++ # cannot just pass the convience library names through ++ # without $wl, iff we do not link with $LD. ++ # Luckily, gcc supports the same syntax we need for Sun Studio. ++ # Supported since Solaris 2.6 (maybe 2.5.1?) ++ case $wlarc in ++ '') ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; ++ *) ++ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; ++ esac ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; +@@ -5702,36 +6169,45 @@ + fi + ;; + +- sysv4.2uw2*) +- _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- _LT_AC_TAGVAR(hardcode_direct, $1)=yes +- _LT_AC_TAGVAR(hardcode_minus_L, $1)=no ++ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) ++ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no +- hardcode_runpath_var=yes +- runpath_var=LD_RUN_PATH +- ;; ++ runpath_var='LD_RUN_PATH' + +- sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) +- _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else +- _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi +- runpath_var='LD_RUN_PATH' +- _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + +- sysv5*) +- _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +- _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= ++ sysv5* | sco3.2v5* | sco5v6*) ++ # Note: We can NOT use -z defs as we might desire, because we do not ++ # link with -lc, and that would cause any symbols used from libc to ++ # always be unresolved, which means just about no library would ++ # ever link correctly. If we're not using GNU ld we use -z text ++ # though, which does catch some bad symbols but isn't as heavy-handed ++ # as -z defs. ++ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' ++ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' ++ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ++ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' ++ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' ++ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ++ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' ++ ++ if test "$GCC" = yes; then ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ fi + ;; + + uts4*) +@@ -5749,11 +6225,6 @@ + AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) + test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- + # + # Do we need to explicitly link libc? + # +@@ -5781,6 +6252,7 @@ + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) ++ pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= +@@ -5901,12 +6373,13 @@ + done + done + done ++IFS=$as_save_IFS + lt_ac_max=0 + lt_ac_count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do +- test ! -f $lt_ac_sed && break ++ test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in +@@ -5931,28 +6404,17 @@ + fi + done + done +-SED=$lt_cv_path_SED + ]) ++SED=$lt_cv_path_SED ++AC_SUBST([SED]) + AC_MSG_RESULT([$SED]) + ]) + +-# -*- Autoconf -*- +-# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +-# Generated from amversion.in; do not edit by hand. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ++# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + + # AM_AUTOMAKE_VERSION(VERSION) + # ---------------------------- +@@ -5965,26 +6427,15 @@ + # Call AM_AUTOMAKE_VERSION so it can be traced. + # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. + AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +- [AM_AUTOMAKE_VERSION([1.9.2])]) +- +-# AM_AUX_DIR_EXPAND +- +-# Copyright (C) 2001, 2003 Free Software Foundation, Inc. ++ [AM_AUTOMAKE_VERSION([1.9.6])]) + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + + # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets + # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +@@ -6031,26 +6482,16 @@ + am_aux_dir=`cd $ac_aux_dir && pwd` + ]) + +-# AM_CONDITIONAL -*- Autoconf -*- +- +-# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# AM_CONDITIONAL -*- Autoconf -*- + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# serial 6 ++# serial 7 + + # AM_CONDITIONAL(NAME, SHELL-CONDITION) + # ------------------------------------- +@@ -6074,26 +6515,15 @@ + Usually this means the macro was only invoked conditionally.]]) + fi])]) + +-# serial 7 -*- Autoconf -*- + +-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 ++# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 + # Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- ++# serial 8 + + # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be + # written in clear, in which case automake, when reading aclocal.m4, +@@ -6102,7 +6532,6 @@ + # CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +- + # _AM_DEPENDENCIES(NAME) + # ---------------------- + # See how the compiler implements dependency checking. +@@ -6242,27 +6671,16 @@ + AC_SUBST([AMDEPBACKSLASH]) + ]) + +-# Generate code to set up dependency tracking. -*- Autoconf -*- ++# Generate code to set up dependency tracking. -*- Autoconf -*- + +-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +-# Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-#serial 2 ++#serial 3 + + # _AM_OUTPUT_DEPENDENCY_COMMANDS + # ------------------------------ +@@ -6321,30 +6739,19 @@ + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) + ]) + +-# Do all the work for Automake. -*- Autoconf -*- +- +-# This macro actually does too much some checks are only needed if +-# your package does certain things. But this isn't really a big deal. ++# Do all the work for Automake. -*- Autoconf -*- + +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 + # Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# serial 12 + +-# serial 11 ++# This macro actually does too much. Some checks are only needed if ++# your package does certain things. But this isn't really a big deal. + + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) + # AM_INIT_AUTOMAKE([OPTIONS]) +@@ -6446,51 +6853,27 @@ + done + echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + ++# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ + # AM_PROG_INSTALL_SH + # ------------------ + # Define $install_sh. +- +-# Copyright (C) 2001, 2003 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- + AC_DEFUN([AM_PROG_INSTALL_SH], + [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl + install_sh=${install_sh-"$am_aux_dir/install-sh"} + AC_SUBST(install_sh)]) + +-# -*- Autoconf -*- +-# Copyright (C) 2003 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# serial 1 ++# serial 2 + + # Check whether the underlying file-system supports filenames + # with a leading dot. For instance MS-DOS doesn't. +@@ -6505,26 +6888,14 @@ + rmdir .tst 2>/dev/null + AC_SUBST([am__leading_dot])]) + +- +-# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ++# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005 + # Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- +-# serial 4 ++# serial 5 + + # AM_PROG_LEX + # ----------- +@@ -6538,26 +6909,15 @@ + LEX=${am_missing_run}flex + fi]) + +-# Check to see how 'make' treats includes. -*- Autoconf -*- +- +-# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# Check to see how 'make' treats includes. -*- Autoconf -*- + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# serial 2 ++# serial 3 + + # AM_MAKE_INCLUDE() + # ----------------- +@@ -6601,27 +6961,16 @@ + rm -f confinc confmf + ]) + +-# -*- Autoconf -*- +- +- +-# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# serial 3 ++# serial 4 + + # AM_MISSING_PROG(NAME, PROGRAM) + # ------------------------------ +@@ -6647,27 +6996,16 @@ + fi + ]) + ++# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ + # AM_PROG_MKDIR_P + # --------------- + # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. +- +-# Copyright (C) 2003, 2004 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- ++# + # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories + # created by `make install' are always world readable, even if the + # installer happens to have an overly restrictive umask (e.g. 077). +@@ -6721,26 +7059,15 @@ + fi + AC_SUBST([mkdir_p])]) + +-# Helper functions for option handling. -*- Autoconf -*- +- +-# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# Helper functions for option handling. -*- Autoconf -*- + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# serial 2 ++# serial 3 + + # _AM_MANGLE_OPTION(NAME) + # ----------------------- +@@ -6765,28 +7092,16 @@ + AC_DEFUN([_AM_IF_OPTION], + [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +-# +-# Check to make sure that the build environment is sane. +-# +- +-# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# Check to make sure that the build environment is sane. -*- Autoconf -*- + +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 ++# Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + +-# serial 3 ++# serial 4 + + # AM_SANITY_CHECK + # --------------- +@@ -6829,25 +7144,14 @@ + fi + AC_MSG_RESULT(yes)]) + +-# AM_PROG_INSTALL_STRIP +- +-# Copyright (C) 2001, 2003 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + ++# AM_PROG_INSTALL_STRIP ++# --------------------- + # One issue with vendor `install' (even GNU) is that you can't + # specify the program used to strip binaries. This is especially + # annoying in cross-compiling environments, where the build's strip +@@ -6870,25 +7174,13 @@ + + # Check how to create a tarball. -*- Autoconf -*- + +-# Copyright (C) 2004 Free Software Foundation, Inc. +- +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2, or (at your option) +-# any later version. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +- +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- +-# serial 1 ++# Copyright (C) 2004, 2005 Free Software Foundation, Inc. ++# ++# This file is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. + ++# serial 2 + + # _AM_PROG_TAR(FORMAT) + # -------------------- +diff -Naur alliance-5.0/alliance.m4 alliance/alliance.m4 +--- alliance-5.0/alliance.m4 2007-07-18 19:03:44.000000000 +0200 ++++ alliance/alliance.m4 2006-03-29 19:09:56.000000000 +0200 +@@ -103,7 +103,7 @@ + INSTALL_PROGRAM='${INSTALL} -m 775' + AC_SUBST(INSTALL_PROGRAM) + +-AC_DEFINE_UNQUOTED(ALLIANCE_VERSION, "5.0 [20070718]") ++AC_DEFINE_UNQUOTED(ALLIANCE_VERSION, "5.0") + AC_DEFINE_UNQUOTED(ALLIANCE_TOP, "$ALLIANCE_TOP") + + AC_CHECK_LIB(gen, basename) +diff -Naur alliance-5.0/config.sub alliance/config.sub +--- alliance-5.0/config.sub 2007-07-18 19:03:58.000000000 +0200 ++++ alliance/config.sub 2007-04-06 21:44:56.000000000 +0200 +@@ -260,7 +260,7 @@ + | s390 | s390x \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ +- | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ ++ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ +@@ -334,7 +334,7 @@ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ +- | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ ++ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ +@@ -1051,7 +1051,7 @@ + sh64) + basic_machine=sh64-unknown + ;; +- sparc | sparcv9 | sparcv9b) ++ sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) +diff -Naur alliance-5.0/configure alliance/configure +--- alliance-5.0/configure 2007-07-18 19:05:18.000000000 +0200 ++++ alliance/configure 2009-06-13 22:28:11.000000000 +0200 +@@ -278,15 +278,15 @@ + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. +-if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + if test -z "$ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... +- if (echo_test_string="`eval $cmd`") 2>/dev/null && +- echo_test_string="`eval $cmd`" && ++ if (echo_test_string=`eval $cmd`) 2>/dev/null && ++ echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break +@@ -463,7 +463,7 @@ + # include + #endif" + +-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar LEX CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE LEXLIB LEX_OUTPUT_ROOT build build_cpu build_vendor build_os host host_cpu host_vendor host_os EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL SED X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS YACC LINK_MOTIF INCLUDE_MOTIF LINK_XPM X11_LIBS XT_LIBS XEXT_LIBS XPM_LIBS XP_LIBS XM_LIBS ALLIANCE_CFLAGS ALLIANCE_LIBS ALLIANCE_TOP ALLIANCE_BUILD_TRUE ALLIANCE_BUILD_FALSE MBK_CUR MBK_REV MBK_REL MBK_DLL_VERSION MBK_VERSION MAL_DLL_VERSION MAP_DLL_VERSION MEL_DLL_VERSION MHL_DLL_VERSION MMG_DLL_VERSION MSL_DLL_VERSION MVL_DLL_VERSION MGL_DLL_VERSION MCP_DLL_VERSION MCL_DLL_VERSION MVG_DLL_VERSION AUT_DLL_VERSION RDS_DLL_VERSION RUT_DLL_VERSION RFM_DLL_VERSION RPR_DLL_VERSION RWI_DLL_VERSION RTL_DLL_VERSION RCF_DLL_VERSION RGS_DLL_VERSION ELP_DLL_VERSION ABL_DLL_VERSION BDD_DLL_VERSION LOG_DLL_VERSION BTR_DLL_VERSION VEX_DLL_VERSION CTL_DLL_VERSION CTP_DLL_VERSION ABE_DLL_VERSION ABT_DLL_VERSION ABV_DLL_VERSION FSM_DLL_VERSION FKS_DLL_VERSION FVH_DLL_VERSION FTL_DLL_VERSION RTN_DLL_VERSION RTD_DLL_VERSION SCL_DLL_VERSION VBH_DLL_VERSION VBL_DLL_VERSION VPN_DLL_VERSION VPD_DLL_VERSION VVH_DLL_VERSION VTL_DLL_VERSION PAT_DLL_VERSION PPT_DLL_VERSION PHL_DLL_VERSION VRD_DLL_VERSION BEH_DLL_VERSION BHL_DLL_VERSION BVL_DLL_VERSION ALCBANNER_MAJOR_VERSION ALCBANNER_MINOR_VERSION ALCBANNER_VERSION CST_DLL_VERSION SCH_DLL_VERSION ATTILA_MAJOR_VERSION ATTILA_MINOR_VERSION ATTILA_VERSION B2F_MAJOR_VERSION B2F_MINOR_VERSION B2F_VERSION BOOG_MAJOR_VERSION BOOG_MINOR_VERSION BOOG_VERSION BOOM_MAJOR_VERSION BOOM_MINOR_VERSION BOOM_VERSION DREAL_MAJOR_VERSION DREAL_MINOR_VERSION DREAL_VERSION EXP_MAJOR_VERSION EXP_MINOR_VERSION EXP_VERSION FLATBEH_MAJOR_VERSION FLATBEH_MINOR_VERSION FLATBEH_VERSION FMI_MAJOR_VERSION FMI_MINOR_VERSION FMI_VERSION FSP_MAJOR_VERSION FSP_MINOR_VERSION FSP_VERSION MGN_DLL_VERSION PGN_DLL_VERSION GRAAL_MAJOR_VERSION GRAAL_MINOR_VERSION GRAAL_VERSION K2F_MAJOR_VERSION K2F_MINOR_VERSION K2F_VERSION L2P_MAJOR_VERSION L2P_MINOR_VERSION L2P_VERSION LOON_MAJOR_VERSION LOON_MINOR_VERSION LOON_VERSION LVX_MAJOR_VERSION LVX_MINOR_VERSION LVX_VERSION LYNX_MAJOR_VERSION LYNX_MINOR_VERSION LYNX_VERSION M2E_MAJOR_VERSION M2E_MINOR_VERSION M2E_VERSION MIPS_ASM_MAJOR_VERSION MIPS_ASM_MINOR_VERSION MIPS_ASM_VERSION MOCHA_MAJOR_VERSION MOCHA_MINOR_VERSION MOCHA_VERSION NERO_MAJOR_VERSION NERO_MINOR_VERSION NERO_VERSION OCP_MAJOR_VERSION OCP_MINOR_VERSION OCP_VERSION PAT2SPI_MAJOR_VERSION PAT2SPI_MINOR_VERSION PAT2SPI_VERSION PROOF_MAJOR_VERSION PROOF_MINOR_VERSION PROOF_VERSION RING_MAJOR_VERSION RING_MINOR_VERSION RING_VERSION S2R_MAJOR_VERSION S2R_MINOR_VERSION S2R_VERSION SCAPIN_MAJOR_VERSION SCAPIN_MINOR_VERSION SCAPIN_VERSION SEA_MAJOR_VERSION SEA_MINOR_VERSION SEA_VERSION SYF_MAJOR_VERSION SYF_MINOR_VERSION SYF_VERSION VASY_MAJOR_VERSION VASY_MINOR_VERSION VASY_VERSION XFSM_MAJOR_VERSION XFSM_MINOR_VERSION XFSM_VERSION XPAT_MAJOR_VERSION XPAT_MINOR_VERSION XPAT_VERSION XSCH_MAJOR_VERSION XSCH_MINOR_VERSION XSCH_VERSION XVPN_MAJOR_VERSION XVPN_MINOR_VERSION XVPN_VERSION DOC_MAJOR_VERSION DOC_MINOR_VERSION DOC_VERSION TOOLSDIRS LIBOBJS LTLIBOBJS' ++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar LEX CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE LEXLIB LEX_OUTPUT_ROOT build build_cpu build_vendor build_os host host_cpu host_vendor host_os SED EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS YACC LINK_MOTIF INCLUDE_MOTIF LINK_XPM X11_LIBS XT_LIBS XEXT_LIBS XPM_LIBS XP_LIBS XM_LIBS ALLIANCE_CFLAGS ALLIANCE_LIBS ALLIANCE_TOP ALLIANCE_BUILD_TRUE ALLIANCE_BUILD_FALSE MBK_CUR MBK_REV MBK_REL MBK_DLL_VERSION MBK_VERSION MAL_DLL_VERSION MAP_DLL_VERSION MEL_DLL_VERSION MHL_DLL_VERSION MMG_DLL_VERSION MSL_DLL_VERSION MVL_DLL_VERSION MGL_DLL_VERSION MCP_DLL_VERSION MCL_DLL_VERSION MVG_DLL_VERSION AUT_DLL_VERSION RDS_DLL_VERSION RUT_DLL_VERSION RFM_DLL_VERSION RPR_DLL_VERSION RWI_DLL_VERSION RTL_DLL_VERSION RCF_DLL_VERSION RGS_DLL_VERSION ELP_DLL_VERSION ABL_DLL_VERSION BDD_DLL_VERSION LOG_DLL_VERSION BTR_DLL_VERSION VEX_DLL_VERSION CTL_DLL_VERSION CTP_DLL_VERSION ABE_DLL_VERSION ABT_DLL_VERSION ABV_DLL_VERSION FSM_DLL_VERSION FKS_DLL_VERSION FVH_DLL_VERSION FTL_DLL_VERSION RTN_DLL_VERSION RTD_DLL_VERSION SCL_DLL_VERSION VBH_DLL_VERSION VBL_DLL_VERSION VPN_DLL_VERSION VPD_DLL_VERSION VVH_DLL_VERSION VTL_DLL_VERSION PAT_DLL_VERSION PPT_DLL_VERSION PHL_DLL_VERSION VRD_DLL_VERSION BEH_DLL_VERSION BHL_DLL_VERSION BVL_DLL_VERSION ALCBANNER_MAJOR_VERSION ALCBANNER_MINOR_VERSION ALCBANNER_VERSION CST_DLL_VERSION SCH_DLL_VERSION ATTILA_MAJOR_VERSION ATTILA_MINOR_VERSION ATTILA_VERSION B2F_MAJOR_VERSION B2F_MINOR_VERSION B2F_VERSION BOOG_MAJOR_VERSION BOOG_MINOR_VERSION BOOG_VERSION BOOM_MAJOR_VERSION BOOM_MINOR_VERSION BOOM_VERSION DREAL_MAJOR_VERSION DREAL_MINOR_VERSION DREAL_VERSION EXP_MAJOR_VERSION EXP_MINOR_VERSION EXP_VERSION FLATBEH_MAJOR_VERSION FLATBEH_MINOR_VERSION FLATBEH_VERSION FMI_MAJOR_VERSION FMI_MINOR_VERSION FMI_VERSION FSP_MAJOR_VERSION FSP_MINOR_VERSION FSP_VERSION MGN_DLL_VERSION PGN_DLL_VERSION GRAAL_MAJOR_VERSION GRAAL_MINOR_VERSION GRAAL_VERSION GROWSTK_MAJOR_VERSION GROWSTK_MINOR_VERSION GROWSTK_VERSION K2F_MAJOR_VERSION K2F_MINOR_VERSION K2F_VERSION L2P_MAJOR_VERSION L2P_MINOR_VERSION L2P_VERSION LOON_MAJOR_VERSION LOON_MINOR_VERSION LOON_VERSION LVX_MAJOR_VERSION LVX_MINOR_VERSION LVX_VERSION LYNX_MAJOR_VERSION LYNX_MINOR_VERSION LYNX_VERSION M2E_MAJOR_VERSION M2E_MINOR_VERSION M2E_VERSION MIPS_ASM_MAJOR_VERSION MIPS_ASM_MINOR_VERSION MIPS_ASM_VERSION MOCHA_MAJOR_VERSION MOCHA_MINOR_VERSION MOCHA_VERSION NERO_MAJOR_VERSION NERO_MINOR_VERSION NERO_VERSION OCP_MAJOR_VERSION OCP_MINOR_VERSION OCP_VERSION OCR_MAJOR_VERSION OCR_MINOR_VERSION OCR_VERSION PAT2SPI_MAJOR_VERSION PAT2SPI_MINOR_VERSION PAT2SPI_VERSION EMULBS_MAJOR_VERSION EMULBS_MINOR_VERSION EMULBS_VERSION PCBS_MAJOR_VERSION PCBS_MINOR_VERSION PCBS_VERSION PROOF_MAJOR_VERSION PROOF_MINOR_VERSION PROOF_VERSION RING_MAJOR_VERSION RING_MINOR_VERSION RING_VERSION S2R_MAJOR_VERSION S2R_MINOR_VERSION S2R_VERSION SCAPIN_MAJOR_VERSION SCAPIN_MINOR_VERSION SCAPIN_VERSION SEA_MAJOR_VERSION SEA_MINOR_VERSION SEA_VERSION SYF_MAJOR_VERSION SYF_MINOR_VERSION SYF_VERSION VASY_MAJOR_VERSION VASY_MINOR_VERSION VASY_VERSION VST2XNF_MAJOR_VERSION VST2XNF_MINOR_VERSION VST2XNF_VERSION XFSM_MAJOR_VERSION XFSM_MINOR_VERSION XFSM_VERSION XGRA_MAJOR_VERSION XGRA_MINOR_VERSION XGRA_VERSION XPAT_MAJOR_VERSION XPAT_MINOR_VERSION XPAT_VERSION XSCH_MAJOR_VERSION XSCH_MINOR_VERSION XSCH_VERSION XVPN_MAJOR_VERSION XVPN_MINOR_VERSION XVPN_VERSION DOC_MAJOR_VERSION DOC_MINOR_VERSION DOC_VERSION TOOLSDIRS LIBOBJS LTLIBOBJS' + ac_subst_files='' + + # Initialize some variables set by options. +@@ -3475,12 +3475,13 @@ + done + done + done ++IFS=$as_save_IFS + lt_ac_max=0 + lt_ac_count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do +- test ! -f $lt_ac_sed && break ++ test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in +@@ -3505,10 +3506,11 @@ + fi + done + done +-SED=$lt_cv_path_SED + + fi + ++SED=$lt_cv_path_SED ++ + echo "$as_me:$LINENO: result: $SED" >&5 + echo "${ECHO_T}$SED" >&6 + +@@ -3585,7 +3587,7 @@ + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some GNU ld's only accept -v. ++ # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &6 + else +- # I'd rather use --version here, but apparently some GNU ld's only accept -v. ++ # I'd rather use --version here, but apparently some GNU lds only accept -v. + case `$LD -v 2>&1 &5 + echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 +@@ -3659,36 +3670,43 @@ + # Let the user override the test. + lt_cv_path_NM="$NM" + else +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- tmp_nm="$ac_dir/${ac_tool_prefix}nm" +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- # Tru64's nm complains that /dev/null is an invalid object file +- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in +- */dev/null* | *'Invalid file or object type'*) +- lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in +- */dev/null*) +- lt_cv_path_NM="$tmp_nm -p" ++ lt_nm_to_check="${ac_tool_prefix}nm" ++ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then ++ lt_nm_to_check="$lt_nm_to_check nm" ++ fi ++ for lt_tmp_nm in $lt_nm_to_check; do ++ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ++ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do ++ IFS="$lt_save_ifs" ++ test -z "$ac_dir" && ac_dir=. ++ tmp_nm="$ac_dir/$lt_tmp_nm" ++ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then ++ # Check to see if the nm accepts a BSD-compat flag. ++ # Adding the `sed 1q' prevents false positives on HP-UX, which says: ++ # nm: unknown option "B" ignored ++ # Tru64's nm complains that /dev/null is an invalid object file ++ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in ++ */dev/null* | *'Invalid file or object type'*) ++ lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags ++ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in ++ */dev/null*) ++ lt_cv_path_NM="$tmp_nm -p" ++ break ++ ;; ++ *) ++ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but ++ continue # so that we can try to find one that supports BSD flags ++ ;; ++ esac + ;; + esac +- esac +- fi ++ fi ++ done ++ IFS="$lt_save_ifs" + done +- IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm + fi + fi +@@ -3735,7 +3753,7 @@ + lt_cv_deplibs_check_method=pass_all + ;; + +-bsdi4*) ++bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so +@@ -3758,13 +3776,13 @@ + lt_cv_deplibs_check_method=pass_all + ;; + +-freebsd* | kfreebsd*-gnu) ++freebsd* | kfreebsd*-gnu | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. +- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' ++ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; +@@ -3780,7 +3798,7 @@ + + hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file +- case "$host_cpu" in ++ case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so +@@ -3796,6 +3814,11 @@ + esac + ;; + ++interix3*) ++ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here ++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ++ ;; ++ + irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; +@@ -3808,15 +3831,6 @@ + + # This must be Linux ELF. + linux*) +- case $host_cpu in +- alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) +- lt_cv_deplibs_check_method=pass_all ;; +- *) +- # glibc up to 2.1.1 does not perform some relocations on ARM +- # this will be overridden with pass_all, but let us keep it just in case +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; +- esac +- lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +@@ -3839,12 +3853,10 @@ + ;; + + openbsd*) +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' ++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else +- lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' ++ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +@@ -3852,15 +3864,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + +-sco3.2v5*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- + solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' +@@ -3881,10 +3889,13 @@ + siemens) + lt_cv_deplibs_check_method=pass_all + ;; ++ pc) ++ lt_cv_deplibs_check_method=pass_all ++ ;; + esac + ;; + +-sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) ++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + esac +@@ -3902,6 +3913,9 @@ + # If no C compiler was specified, use CC. + LTCC=${LTCC-"$CC"} + ++# If no C compiler flags were specified, use CFLAGS. ++LTCFLAGS=${LTCFLAGS-"$CFLAGS"} ++ + # Allow CC to be a program name with arguments. + compiler=$CC + +@@ -3936,7 +3950,7 @@ + ;; + *-*-irix6*) + # Find out which ABI we are using. +- echo '#line 3939 "configure"' > conftest.$ac_ext ++ echo '#line 3953 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? +@@ -3979,7 +3993,7 @@ + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then +- case "`/usr/bin/file conftest.o`" in ++ case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*linux*) +@@ -4092,6 +4106,26 @@ + CFLAGS="$SAVE_CFLAGS" + fi + ;; ++sparc*-*solaris*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.o` in ++ *64-bit*) ++ case $lt_cv_prog_gnu_ld in ++ yes*) LD="${LD-ld} -m elf64_sparc" ;; ++ *) LD="${LD-ld} -64" ;; ++ esac ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ + + esac + +@@ -5185,7 +5219,12 @@ + fi + + +-ac_ext=cc ++ ++ ++if test -n "$CXX" && ( test "X$CXX" != "Xno" && ++ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || ++ (test "X$CXX" != "Xg++"))) ; then ++ ac_ext=cc + ac_cpp='$CXXCPP $CPPFLAGS' + ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +@@ -5415,6 +5454,8 @@ + ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + ++fi ++ + + ac_ext=f + ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +@@ -5508,7 +5549,7 @@ + + + # Provide some information about the compiler. +-echo "$as_me:5511:" \ ++echo "$as_me:5552:" \ + "checking for Fortran 77 compiler version" >&5 + ac_compiler=`set X $ac_compile; echo $2` + { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 +@@ -5698,11 +5739,55 @@ + lt_cv_sys_max_cmd_len=8192; + ;; + +- *) ++ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) ++ # This has been around since 386BSD, at least. Likely further. ++ if test -x /sbin/sysctl; then ++ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` ++ elif test -x /usr/sbin/sysctl; then ++ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` ++ else ++ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs ++ fi ++ # And add a safety zone ++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ++ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ++ ;; ++ ++ interix*) ++ # We know the value 262144 and hardcode it with a safety zone (like BSD) ++ lt_cv_sys_max_cmd_len=196608 ++ ;; ++ ++ osf*) ++ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure ++ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not ++ # nice to cause kernel panics so lets avoid the loop below. ++ # First set a reasonable default. ++ lt_cv_sys_max_cmd_len=16384 ++ # ++ if test -x /sbin/sysconfig; then ++ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in ++ *1*) lt_cv_sys_max_cmd_len=-1 ;; ++ esac ++ fi ++ ;; ++ sco3.2v5*) ++ lt_cv_sys_max_cmd_len=102400 ++ ;; ++ sysv5* | sco5v6* | sysv4.2uw2*) ++ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` ++ if test -n "$kargmax"; then ++ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` ++ else ++ lt_cv_sys_max_cmd_len=32768 ++ fi ++ ;; ++ *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. +- while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ ++ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} ++ while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && +@@ -5748,9 +5833,6 @@ + # Regexp to match symbols that can be accessed directly from C. + sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +-# Transform the above into a raw symbol and a C symbol. +-symxfrm='\1 \2\3 \3' +- + # Transform an extracted symbol line into a proper C declaration + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +@@ -5772,15 +5854,31 @@ + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; ++linux*) ++ if test "$host_cpu" = ia64; then ++ symcode='[ABCDGIRSTW]' ++ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" ++ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ++ fi ++ ;; + irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; + osf*) + symcode='[BCDEGQRST]' + ;; +-solaris* | sysv5*) ++solaris*) + symcode='[BDRT]' + ;; ++sco3.2v5*) ++ symcode='[DT]' ++ ;; ++sysv4.2uw2*) ++ symcode='[DT]' ++ ;; ++sysv5* | sco5v6* | unixware* | OpenUNIX*) ++ symcode='[ABDT]' ++ ;; + sysv4) + symcode='[DFNSTU]' + ;; +@@ -5803,8 +5901,11 @@ + # Try without a prefix undercore, then with it. + for ac_symprfx in "" "_"; do + ++ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. ++ symxfrm="\\1 $ac_symprfx\\2 \\2" ++ + # Write the raw and C identifiers. +- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" ++ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no +@@ -5966,7 +6067,7 @@ + + # Sed substitution that helps us do robust quoting. It backslashifies + # metacharacters that are still active within double-quoted strings. +-Xsed='sed -e s/^X//' ++Xsed='sed -e 1s/^X//' + sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + + # Same as above, but do not quote variable references. +@@ -5986,7 +6087,7 @@ + default_ofile=libtool + can_build_shared=yes + +-# All known linkers require a `.a' archive for static linking (except M$VC, ++# All known linkers require a `.a' archive for static linking (except MSVC, + # which needs '.lib'). + libext=a + ltmain="$ac_aux_dir/ltmain.sh" +@@ -6243,6 +6344,7 @@ + test -z "$AS" && AS=as + test -z "$CC" && CC=cc + test -z "$LTCC" && LTCC=$CC ++test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS + test -z "$DLLTOOL" && DLLTOOL=dlltool + test -z "$LD" && LD=ld + test -z "$LN_S" && LN_S="ln -s" +@@ -6262,15 +6364,26 @@ + if test -n "$RANLIB"; then + case $host_os in + openbsd*) +- old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) +- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ++ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + fi + ++for cc_temp in $compiler""; do ++ case $cc_temp in ++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; ++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ++ ++ + # Only perform the check for file, if the check method requires it + case $deplibs_check_method in + file_magic*) +@@ -6296,7 +6409,7 @@ + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) +- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" ++ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then +@@ -6358,7 +6471,7 @@ + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) +- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" ++ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then +@@ -6453,68 +6566,25 @@ + # If no C compiler was specified, use CC. + LTCC=${LTCC-"$CC"} + ++# If no C compiler flags were specified, use CFLAGS. ++LTCFLAGS=${LTCFLAGS-"$CFLAGS"} ++ + # Allow CC to be a program name with arguments. + compiler=$CC + + +-# +-# Check for any special shared library compilation flags. +-# +-lt_prog_cc_shlib= +-if test "$GCC" = no; then +- case $host_os in +- sco3.2v5*) +- lt_prog_cc_shlib='-belf' +- ;; +- esac +-fi +-if test -n "$lt_prog_cc_shlib"; then +- { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +-echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} +- if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : +- else +- { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +-echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} +- lt_cv_prog_cc_can_build_shared=no +- fi +-fi +- +- +-# +-# Check to make sure the static flag actually works. +-# +-echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +-echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 +-if test "${lt_prog_compiler_static_works+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- lt_prog_compiler_static_works=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $lt_prog_compiler_static" +- printf "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- else +- lt_prog_compiler_static_works=yes +- fi +- fi +- $rm conftest* +- LDFLAGS="$save_LDFLAGS" +- +-fi +-echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +-echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 +- +-if test x"$lt_prog_compiler_static_works" = xyes; then +- : +-else +- lt_prog_compiler_static= +-fi +- ++# save warnings/boilerplate of simple test code ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_compile_test_code" >conftest.$ac_ext ++eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_compiler_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_link_test_code" >conftest.$ac_ext ++eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_linker_boilerplate=`cat conftest.err` ++$rm conftest* + + + +@@ -6539,18 +6609,20 @@ + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:6545: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:6615: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:6549: \$? = $ac_status" >&5 ++ echo "$as_me:6619: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test ! -s conftest.err; then ++ # So say no if there are warnings other than the usual output. ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi +@@ -6611,6 +6683,11 @@ + lt_prog_compiler_pic='-fno-common' + ;; + ++ interix3*) ++ # Interix 3.x gcc -fpic/-fPIC options generate broken code. ++ # Instead, we relocate shared libraries at runtime. ++ ;; ++ + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. +@@ -6627,7 +6704,7 @@ + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -6653,6 +6730,16 @@ + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case $cc_basename in ++ xlc*) ++ lt_prog_compiler_pic='-qnocommon' ++ lt_prog_compiler_wl='-Wl,' ++ ;; ++ esac ++ ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being +@@ -6664,7 +6751,7 @@ + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -6688,12 +6775,19 @@ + ;; + + linux*) +- case $CC in ++ case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; ++ pgcc* | pgf77* | pgf90* | pgf95*) ++ # Portland Group compilers (*not* the Pentium gcc compiler, ++ # which looks to be a dead project) ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_pic='-fpic' ++ lt_prog_compiler_static='-Bstatic' ++ ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. +@@ -6708,15 +6802,15 @@ + lt_prog_compiler_static='-non_shared' + ;; + +- sco3.2v5*) +- lt_prog_compiler_pic='-Kpic' +- lt_prog_compiler_static='-dn' +- ;; +- + solaris*) +- lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' ++ case $cc_basename in ++ f77* | f90* | f95*) ++ lt_prog_compiler_wl='-Qoption ld ';; ++ *) ++ lt_prog_compiler_wl='-Wl,';; ++ esac + ;; + + sunos4*) +@@ -6725,7 +6819,7 @@ + lt_prog_compiler_static='-Bstatic' + ;; + +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' +@@ -6738,6 +6832,17 @@ + fi + ;; + ++ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_pic='-KPIC' ++ lt_prog_compiler_static='-Bstatic' ++ ;; ++ ++ unicos*) ++ lt_prog_compiler_wl='-Wl,' ++ lt_prog_compiler_can_build_shared=no ++ ;; ++ + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' +@@ -6772,18 +6877,20 @@ + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:6778: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:6883: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:6782: \$? = $ac_status" >&5 ++ echo "$as_me:6887: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test ! -s conftest.err; then ++ # So say no if there are warnings other than the usual output. ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works=yes + fi + fi +@@ -6804,7 +6911,7 @@ + fi + + fi +-case "$host_os" in ++case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= +@@ -6814,6 +6921,48 @@ + ;; + esac + ++# ++# Check to make sure the static flag actually works. ++# ++wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" ++echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 ++echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_static_works+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_static_works=no ++ save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS $lt_tmp_static_flag" ++ printf "$lt_simple_link_test_code" > conftest.$ac_ext ++ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then ++ # The linker can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test -s conftest.err; then ++ # Append any errors to the config.log. ++ cat conftest.err 1>&5 ++ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if diff conftest.exp conftest.er2 >/dev/null; then ++ lt_prog_compiler_static_works=yes ++ fi ++ else ++ lt_prog_compiler_static_works=yes ++ fi ++ fi ++ $rm conftest* ++ LDFLAGS="$save_LDFLAGS" ++ ++fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 ++echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 ++ ++if test x"$lt_prog_compiler_static_works" = xyes; then ++ : ++else ++ lt_prog_compiler_static= ++fi ++ ++ + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 + if test "${lt_cv_prog_compiler_c_o+set}" = set; then +@@ -6832,23 +6981,25 @@ + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:6838: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:6987: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 +- echo "$as_me:6842: \$? = $ac_status" >&5 ++ echo "$as_me:6991: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings +- if test ! -s out/conftest.err; then ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp ++ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 ++ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi +- chmod u+w . ++ chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation +@@ -6924,6 +7075,16 @@ + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= ++ # Just being paranoid about ensuring that cc_basename is set. ++ for cc_temp in $compiler""; do ++ case $cc_temp in ++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; ++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) +@@ -6934,6 +7095,10 @@ + with_gnu_ld=no + fi + ;; ++ interix*) ++ # we just hope/assume this is gcc and not c89 (= MSVC++) ++ with_gnu_ld=yes ++ ;; + openbsd*) + with_gnu_ld=no + ;; +@@ -6944,6 +7109,27 @@ + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + ++ # Set some defaults for GNU ld with shared library support. These ++ # are reset later if shared libraries are not supported. Putting them ++ # here allows them to be overridden if necessary. ++ runpath_var=LD_RUN_PATH ++ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' ++ export_dynamic_flag_spec='${wl}--export-dynamic' ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then ++ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ whole_archive_flag_spec= ++ fi ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) +@@ -6994,10 +7180,10 @@ + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes +- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ++ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +@@ -7006,7 +7192,53 @@ + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ +- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ ++ interix3*) ++ hardcode_direct=no ++ hardcode_shlibpath_var=no ++ hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ++ export_dynamic_flag_spec='${wl}-E' ++ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. ++ # Instead, shared libraries are loaded at an image base (0x10000000 by ++ # default) and relocated if they conflict, which is a slow very memory ++ # consuming and fragmenting process. To avoid this, we pick a random, ++ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link ++ # time. Moving up from 0x10000000 also allows more sbrk(2) space. ++ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ tmp_addflag= ++ case $cc_basename,$host_cpu in ++ pgcc*) # Portland Group C compiler ++ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ tmp_addflag=' $pic_flag' ++ ;; ++ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers ++ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ tmp_addflag=' $pic_flag -Mnomain' ;; ++ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 ++ tmp_addflag=' -i_dynamic' ;; ++ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 ++ tmp_addflag=' -i_dynamic -nofor_main' ;; ++ ifc* | ifort*) # Intel Fortran compiler ++ tmp_addflag=' -nofor_main' ;; ++ esac ++ archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ ++ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++ $echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ fi + else + ld_shlibs=no + fi +@@ -7022,7 +7254,7 @@ + fi + ;; + +- solaris* | sysv5*) ++ solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 +@@ -7043,6 +7275,33 @@ + fi + ;; + ++ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) ++ case `$LD -v 2>&1` in ++ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ++ ld_shlibs=no ++ cat <<_LT_EOF 1>&2 ++ ++*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not ++*** reliably create shared libraries on SCO systems. Therefore, libtool ++*** is disabling shared libraries support. We urge you to upgrade GNU ++*** binutils to release 2.16.91.0.3 or newer. Another option is to modify ++*** your PATH or compiler configuration so that the native linker is ++*** used, and then restart. ++ ++_LT_EOF ++ ;; ++ *) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' ++ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' ++ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' ++ else ++ ld_shlibs=no ++ fi ++ ;; ++ esac ++ ;; ++ + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= +@@ -7050,31 +7309,6 @@ + hardcode_shlibpath_var=no + ;; + +- linux*) +- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_cmds="$tmp_archive_cmds" +- supports_anon_versioning=no +- case `$LD -v 2>/dev/null` in +- *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 +- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... +- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... +- *\ 2.11.*) ;; # other 2.11 versions +- *) supports_anon_versioning=yes ;; +- esac +- if test $supports_anon_versioning = yes; then +- archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +-cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +-$echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- else +- archive_expsym_cmds="$tmp_archive_cmds" +- fi +- else +- ld_shlibs=no +- fi +- ;; +- + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +@@ -7085,16 +7319,11 @@ + ;; + esac + +- if test "$ld_shlibs" = yes; then +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' +- export_dynamic_flag_spec='${wl}--export-dynamic' +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec= +- fi ++ if test "$ld_shlibs" = no; then ++ runpath_var= ++ hardcode_libdir_flag_spec= ++ export_dynamic_flag_spec= ++ whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) +@@ -7106,7 +7335,7 @@ + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes +- if test "$GCC" = yes && test -z "$link_static_flag"; then ++ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported +@@ -7140,6 +7369,7 @@ + break + fi + done ++ ;; + esac + + exp_sym_flag='-bexport' +@@ -7158,7 +7388,7 @@ + link_all_deplibs=yes + + if test "$GCC" = yes; then +- case $host_os in aix4.012|aix4.012.*) ++ case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` +@@ -7177,8 +7407,12 @@ + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi ++ ;; + esac + shared_flag='-shared' ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag="$shared_flag "'${wl}-G' ++ fi + else + # not using gcc + if test "$host_cpu" = ia64; then +@@ -7186,11 +7420,11 @@ + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else +- if test "$aix_use_runtimelinking" = yes; then ++ if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' +- fi ++ fi + fi + fi + +@@ -7255,12 +7489,12 @@ + if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" +- archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +@@ -7320,13 +7554,11 @@ + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' +- # -bexpall does not export symbols beginning with underscore (_) +- always_export_symbols=yes + # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec=' ' ++ whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes +- # This is similar to how AIX traditionally builds it's shared libraries. +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ # This is similar to how AIX traditionally builds its shared libraries. ++ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; +@@ -7339,7 +7571,7 @@ + ld_shlibs=no + ;; + +- bsdi4*) ++ bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + +@@ -7365,52 +7597,52 @@ + ;; + + darwin* | rhapsody*) +- if test "$GXX" = yes ; then ++ case $host_os in ++ rhapsody* | darwin1.[012]) ++ allow_undefined_flag='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[012]) ++ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; ++ esac + archive_cmds_need_lc=no +- case "$host_os" in +- rhapsody* | darwin1.[012]) +- allow_undefined_flag='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then +- allow_undefined_flag='-flat_namespace -undefined suppress' +- else +- case ${MACOSX_DEPLOYMENT_TARGET} in +- 10.[012]) +- allow_undefined_flag='-flat_namespace -undefined suppress' +- ;; +- 10.*) +- allow_undefined_flag='-undefined dynamic_lookup' +- ;; +- esac +- fi +- ;; +- esac +- lt_int_apple_cc_single_mod=no +- output_verbose_link_cmd='echo' +- if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then +- lt_int_apple_cc_single_mod=yes +- fi +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- else +- archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- fi +- module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' +- # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- else +- archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported +- whole_archive_flag_spec='-all_load $convenience' ++ whole_archive_flag_spec='' + link_all_deplibs=yes ++ if test "$GCC" = yes ; then ++ output_verbose_link_cmd='echo' ++ archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else +- ld_shlibs=no ++ case $cc_basename in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ ld_shlibs=no ++ ;; ++ esac + fi + ;; + +@@ -7444,7 +7676,7 @@ + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd* | kfreebsd*-gnu) ++ freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes +@@ -7467,47 +7699,62 @@ + export_dynamic_flag_spec='${wl}-E' + ;; + +- hpux10* | hpux11*) ++ hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then +- case "$host_cpu" in +- hppa*64*|ia64*) ++ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ fi ++ if test "$with_gnu_ld" = no; then ++ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator=: ++ ++ hardcode_direct=yes ++ export_dynamic_flag_spec='${wl}-E' ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L=yes ++ fi ++ ;; ++ ++ hpux11*) ++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ case $host_cpu in ++ hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; ++ ia64*) ++ archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ++ ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else +- case "$host_cpu" in +- hppa*64*|ia64*) +- archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ++ case $host_cpu in ++ hppa*64*) ++ archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ ia64*) ++ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) +- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then +- case "$host_cpu" in +- hppa*64*) +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' ++ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator=: ++ ++ case $host_cpu in ++ hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld='+b $libdir' +- hardcode_libdir_separator=: +- hardcode_direct=no +- hardcode_shlibpath_var=no +- ;; +- ia64*) +- hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + hardcode_shlibpath_var=no +- +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- hardcode_minus_L=yes + ;; + *) +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + +@@ -7555,6 +7802,7 @@ + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else +@@ -7600,7 +7848,7 @@ + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ +- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' ++ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' +@@ -7608,21 +7856,15 @@ + hardcode_libdir_separator=: + ;; + +- sco3.2v5*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- export_dynamic_flag_spec='${wl}-Bexport' +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ;; +- + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then ++ wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else ++ wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +@@ -7631,8 +7873,18 @@ + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; ++ *) ++ # The compiler driver will combine linker options so we ++ # cannot just pass the convience library names through ++ # without $wl, iff we do not link with $LD. ++ # Luckily, gcc supports the same syntax we need for Sun Studio. ++ # Supported since Solaris 2.6 (maybe 2.5.1?) ++ case $wlarc in ++ '') ++ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; ++ *) ++ whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; ++ esac ;; + esac + link_all_deplibs=yes + ;; +@@ -7689,36 +7941,45 @@ + fi + ;; + +- sysv4.2uw2*) +- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_minus_L=no ++ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) ++ no_undefined_flag='${wl}-z,text' ++ archive_cmds_need_lc=no + hardcode_shlibpath_var=no +- hardcode_runpath_var=yes +- runpath_var=LD_RUN_PATH +- ;; ++ runpath_var='LD_RUN_PATH' + +- sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) +- no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then +- archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else +- archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no + ;; + +- sysv5*) +- no_undefined_flag=' -z text' +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +- hardcode_libdir_flag_spec= ++ sysv5* | sco3.2v5* | sco5v6*) ++ # Note: We can NOT use -z defs as we might desire, because we do not ++ # link with -lc, and that would cause any symbols used from libc to ++ # always be unresolved, which means just about no library would ++ # ever link correctly. If we're not using GNU ld we use -z text ++ # though, which does catch some bad symbols but isn't as heavy-handed ++ # as -z defs. ++ no_undefined_flag='${wl}-z,text' ++ allow_undefined_flag='${wl}-z,nodefs' ++ archive_cmds_need_lc=no + hardcode_shlibpath_var=no ++ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' ++ hardcode_libdir_separator=':' ++ link_all_deplibs=yes ++ export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' ++ ++ if test "$GCC" = yes; then ++ archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ fi + ;; + + uts4*) +@@ -7737,11 +7998,6 @@ + echo "${ECHO_T}$ld_shlibs" >&6 + test "$ld_shlibs" = no && can_build_shared=no + +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- + # + # Do we need to explicitly link libc? + # +@@ -7774,6 +8030,7 @@ + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl ++ pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= +@@ -7906,7 +8163,7 @@ + shlibpath_var=LIBRARY_PATH + ;; + +-bsdi4*) ++bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +@@ -7934,7 +8191,8 @@ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' ++ $install_prog $dir/$dlname \$dldir/$dlname~ ++ chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' +@@ -7964,7 +8222,7 @@ + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; +@@ -7987,7 +8245,7 @@ + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` +@@ -8022,8 +8280,17 @@ + dynamic_linker='GNU ld.so' + ;; + +-freebsd*) +- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` ++freebsd* | dragonfly*) ++ # DragonFly does not have aout. When/if they implement a new ++ # versioning mechanism, adjust this. ++ if test -x /usr/bin/objformat; then ++ objformat=`/usr/bin/objformat` ++ else ++ case $host_os in ++ freebsd[123]*) objformat=aout ;; ++ *) objformat=elf ;; ++ esac ++ fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) +@@ -8041,14 +8308,19 @@ + freebsd2*) + shlibpath_overrides_runpath=yes + ;; +- freebsd3.01* | freebsdelf3.01*) ++ freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; +- *) # from 3.2 on ++ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ ++ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; ++ freebsd*) # from 4.6 on ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; + esac + ;; + +@@ -8068,7 +8340,7 @@ + version_type=sunos + need_lib_prefix=no + need_version=no +- case "$host_cpu" in ++ case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes +@@ -8108,6 +8380,18 @@ + postinstall_cmds='chmod 555 $lib' + ;; + ++interix3*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ + irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; +@@ -8169,7 +8453,7 @@ + libsuff= + case "$host_cpu" in + x86_64*|s390x*|powerpc64*) +- echo '#line 8172 "configure"' > conftest.$ac_ext ++ echo '#line 8456 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? +@@ -8188,7 +8472,7 @@ + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then +- lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` ++ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + +@@ -8250,8 +8534,13 @@ + + openbsd*) + version_type=sunos ++ sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no +- need_version=yes ++ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. ++ case $host_os in ++ openbsd3.3 | openbsd3.3.*) need_version=yes ;; ++ *) need_version=no ;; ++ esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH +@@ -8289,13 +8578,6 @@ + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +-sco3.2v5*) +- version_type=osf +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- + solaris*) + version_type=linux + need_lib_prefix=no +@@ -8321,7 +8603,7 @@ + need_version=yes + ;; + +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' +@@ -8354,6 +8636,29 @@ + fi + ;; + ++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) ++ version_type=freebsd-elf ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ if test "$with_gnu_ld" = yes; then ++ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' ++ shlibpath_overrides_runpath=no ++ else ++ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' ++ shlibpath_overrides_runpath=yes ++ case $host_os in ++ sco3.2v5*) ++ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ++ ;; ++ esac ++ fi ++ sys_lib_dlsearch_path_spec='/usr/lib' ++ ;; ++ + uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +@@ -8369,12 +8674,17 @@ + echo "${ECHO_T}$dynamic_linker" >&6 + test "$dynamic_linker" = no && can_build_shared=no + ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++fi ++ + echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 + echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 + hardcode_action= + if test -n "$hardcode_libdir_flag_spec" || \ +- test -n "$runpath_var " || \ +- test "X$hardcode_automatic"="Xyes" ; then ++ test -n "$runpath_var" || \ ++ test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && +@@ -9024,7 +9334,7 @@ + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" +- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" ++ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" +@@ -9040,7 +9350,7 @@ + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) 2>/dev/null ++ (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_unknown|x*) lt_cv_dlopen_self=no ;; ++ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed +@@ -9126,7 +9438,7 @@ + echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then +- LDFLAGS="$LDFLAGS $link_static_flag" ++ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 + echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 + if test "${lt_cv_dlopen_self_static+set}" = set; then +@@ -9138,7 +9450,7 @@ + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) 2>/dev/null ++ (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; ++ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed +@@ -9242,7 +9556,7 @@ + fi + + +-# Report which librarie types wil actually be built ++# Report which library types will actually be built + echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 + echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $can_build_shared" >&5 +@@ -9254,7 +9568,7 @@ + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. +-case "$host_os" in ++case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then +@@ -9267,43 +9581,6 @@ + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi +- ;; +- darwin* | rhapsody*) +- if test "$GCC" = yes; then +- archive_cmds_need_lc=no +- case "$host_os" in +- rhapsody* | darwin1.[012]) +- allow_undefined_flag='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then +- allow_undefined_flag='-flat_namespace -undefined suppress' +- else +- case ${MACOSX_DEPLOYMENT_TARGET} in +- 10.[012]) +- allow_undefined_flag='-flat_namespace -undefined suppress' +- ;; +- 10.*) +- allow_undefined_flag='-undefined dynamic_lookup' +- ;; +- esac +- fi +- ;; +- esac +- output_verbose_link_cmd='echo' +- archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' +- module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' +- # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's +- archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- hardcode_direct=no +- hardcode_automatic=yes +- hardcode_shlibpath_var=unsupported +- whole_archive_flag_spec='-all_load $convenience' +- link_all_deplibs=yes +- else +- ld_shlibs=no +- fi + ;; + esac + echo "$as_me:$LINENO: result: $enable_shared" >&5 +@@ -9329,7 +9606,7 @@ + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. +- for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ +@@ -9433,7 +9710,7 @@ + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a +@@ -9444,11 +9721,11 @@ + SED=$lt_SED + + # Sed that helps us avoid accidentally triggering echo(1) options like -n. +-Xsed="$SED -e s/^X//" ++Xsed="$SED -e 1s/^X//" + + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. +-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + # The names of the tagged configurations supported by this script. + available_tags= +@@ -9478,6 +9755,12 @@ + # The host system. + host_alias=$host_alias + host=$host ++host_os=$host_os ++ ++# The build system. ++build_alias=$build_alias ++build=$build ++build_os=$build_os + + # An echo program that does not interpret backslashes. + echo=$lt_echo +@@ -9489,12 +9772,18 @@ + # A C compiler. + LTCC=$lt_LTCC + ++# LTCC compiler flags. ++LTCFLAGS=$lt_LTCFLAGS ++ + # A language-specific compiler. + CC=$lt_compiler + + # Is the compiler the GNU C compiler? + with_gcc=$GCC + ++gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` ++gcc_ver=\`gcc -dumpversion\` ++ + # An ERE matcher. + EGREP=$lt_EGREP + +@@ -9554,7 +9843,7 @@ + # Does compiler simultaneously support -c and -o options? + compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +-# Must we lock files when doing compilation ? ++# Must we lock files when doing compilation? + need_locks=$lt_need_locks + + # Do we need the lib prefix for modules? +@@ -9628,11 +9917,11 @@ + + # Dependencies to place before the objects being linked to create a + # shared library. +-predep_objects=$lt_predep_objects ++predep_objects=\`echo $lt_predep_objects | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place after the objects being linked to create a + # shared library. +-postdep_objects=$lt_postdep_objects ++postdep_objects=\`echo $lt_postdep_objects | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place before the objects being linked to create a + # shared library. +@@ -9644,7 +9933,7 @@ + + # The library search path used internally by the compiler when linking + # a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path ++compiler_lib_search_path=\`echo $lt_compiler_lib_search_path | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$lt_deplibs_check_method +@@ -9724,7 +10013,7 @@ + link_all_deplibs=$link_all_deplibs + + # Compile-time system search path for libraries +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Run-time system search path for libraries + sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +@@ -9819,6 +10108,9 @@ + echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi ++ if test -z "$LTCFLAGS"; then ++ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" ++ fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. +@@ -9849,7 +10141,9 @@ + + case $tagname in + CXX) +- if test -n "$CXX" && test "X$CXX" != "Xno"; then ++ if test -n "$CXX" && ( test "X$CXX" != "Xno" && ++ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || ++ (test "X$CXX" != "Xg++"))) ; then + ac_ext=cc + ac_cpp='$CXXCPP $CPPFLAGS' + ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -9869,6 +10163,7 @@ + hardcode_libdir_flag_spec_ld_CXX= + hardcode_libdir_separator_CXX= + hardcode_minus_L_CXX=no ++hardcode_shlibpath_var_CXX=unsupported + hardcode_automatic_CXX=no + module_cmds_CXX= + module_expsym_cmds_CXX= +@@ -9886,7 +10181,7 @@ + compiler_lib_search_path_CXX= + + # Source file extension for C++ test sources. +-ac_ext=cc ++ac_ext=cpp + + # Object file extension for compiled C++ test sources. + objext=o +@@ -9896,17 +10191,34 @@ + lt_simple_compile_test_code="int some_variable = 0;\n" + + # Code to be used in simple link tests +-lt_simple_link_test_code='int main(int, char *) { return(0); }\n' ++lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + # If no C compiler was specified, use CC. + LTCC=${LTCC-"$CC"} + ++# If no C compiler flags were specified, use CFLAGS. ++LTCFLAGS=${LTCFLAGS-"$CFLAGS"} ++ + # Allow CC to be a program name with arguments. + compiler=$CC + + ++# save warnings/boilerplate of simple test code ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_compile_test_code" >conftest.$ac_ext ++eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_compiler_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_link_test_code" >conftest.$ac_ext ++eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_linker_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD +@@ -9917,18 +10229,27 @@ + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else +- unset lt_cv_prog_gnu_ld ++ $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else +- unset lt_cv_path_LD ++ $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + compiler_CXX=$CC +-cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` ++for cc_temp in $compiler""; do ++ case $cc_temp in ++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; ++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ++ + + # We don't want -fno-exception wen compiling C++ code, so set the + # no_builtin_flag separately +@@ -9999,7 +10320,7 @@ + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some GNU ld's only accept -v. ++ # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &6 + else +- # I'd rather use --version here, but apparently some GNU ld's only accept -v. ++ # I'd rather use --version here, but apparently some GNU lds only accept -v. + case `$LD -v 2>&1 conftest.$ac_ext <<_ACEOF +@@ -10305,16 +10631,26 @@ + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' +- # -bexpall does not export symbols beginning with underscore (_) +- always_export_symbols_CXX=yes + # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec_CXX=' ' ++ whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes +- # This is similar to how AIX traditionally builds it's shared libraries. +- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ # This is similar to how AIX traditionally builds its shared libraries. ++ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; ++ ++ beos*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ allow_undefined_flag_CXX=unsupported ++ # Joseph Beckenbach says some releases of gcc ++ # support --undefined. This deserves some investigation. FIXME ++ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ else ++ ld_shlibs_CXX=no ++ fi ++ ;; ++ + chorus*) + case $cc_basename in + *) +@@ -10333,7 +10669,7 @@ + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then +- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +@@ -10342,70 +10678,81 @@ + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ +- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; +- +- darwin* | rhapsody*) +- if test "$GXX" = yes; then +- archive_cmds_need_lc_CXX=no +- case "$host_os" in +- rhapsody* | darwin1.[012]) +- allow_undefined_flag_CXX='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then +- allow_undefined_flag_CXX='-flat_namespace -undefined suppress' +- else +- case ${MACOSX_DEPLOYMENT_TARGET} in +- 10.[012]) +- allow_undefined_flag_CXX='-flat_namespace -undefined suppress' +- ;; +- 10.*) +- allow_undefined_flag_CXX='-undefined dynamic_lookup' +- ;; ++ darwin* | rhapsody*) ++ case $host_os in ++ rhapsody* | darwin1.[012]) ++ allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[012]) ++ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; + esac +- fi +- ;; +- esac +- lt_int_apple_cc_single_mod=no +- output_verbose_link_cmd='echo' +- if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then +- lt_int_apple_cc_single_mod=yes +- fi +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- else +- archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- fi +- module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ archive_cmds_need_lc_CXX=no ++ hardcode_direct_CXX=no ++ hardcode_automatic_CXX=yes ++ hardcode_shlibpath_var_CXX=unsupported ++ whole_archive_flag_spec_CXX='' ++ link_all_deplibs_CXX=yes + +- # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- else +- archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- hardcode_direct_CXX=no +- hardcode_automatic_CXX=yes +- hardcode_shlibpath_var_CXX=unsupported +- whole_archive_flag_spec_CXX='-all_load $convenience' +- link_all_deplibs_CXX=yes +- else +- ld_shlibs_CXX=no +- fi +- ;; ++ if test "$GXX" = yes ; then ++ lt_int_apple_cc_single_mod=no ++ output_verbose_link_cmd='echo' ++ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then ++ lt_int_apple_cc_single_mod=yes ++ fi ++ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then ++ archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ else ++ archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ fi ++ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then ++ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ fi ++ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ else ++ case $cc_basename in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ ld_shlibs_CXX=no ++ ;; ++ esac ++ fi ++ ;; + + dgux*) + case $cc_basename in +- ec++) ++ ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +- ghcx) ++ ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no +@@ -10416,14 +10763,14 @@ + ;; + esac + ;; +- freebsd12*) ++ freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; +- freebsd* | kfreebsd*-gnu) ++ freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes +@@ -10440,11 +10787,11 @@ + # location of the library. + + case $cc_basename in +- CC) ++ CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +- aCC) ++ aCC*) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when +@@ -10454,7 +10801,7 @@ + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then +@@ -10468,33 +10815,22 @@ + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then +- case "$host_cpu" in +- hppa*64*) +- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' ++ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_CXX=: ++ ++ case $host_cpu in ++ hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' +- hardcode_libdir_separator_CXX=: +- ;; +- ia64*) +- hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + *) +- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi +- case "$host_cpu" in +- hppa*64*) +- hardcode_direct_CXX=no +- hardcode_shlibpath_var_CXX=no +- ;; +- ia64*) ++ case $host_cpu in ++ hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no +- hardcode_minus_L_CXX=yes # Not in the search PATH, +- # but as the default +- # location of the library. + ;; + *) + hardcode_direct_CXX=yes +@@ -10505,14 +10841,17 @@ + esac + + case $cc_basename in +- CC) ++ CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +- aCC) +- case "$host_cpu" in +- hppa*64*|ia64*) +- archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ++ aCC*) ++ case $host_cpu in ++ hppa*64*) ++ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ ;; ++ ia64*) ++ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +@@ -10531,9 +10870,12 @@ + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then +- case "$host_cpu" in +- ia64*|hppa*64*) +- archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ++ case $host_cpu in ++ hppa*64*) ++ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ ;; ++ ia64*) ++ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +@@ -10547,11 +10889,25 @@ + ;; + esac + ;; ++ interix3*) ++ hardcode_direct_CXX=no ++ hardcode_shlibpath_var_CXX=no ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' ++ export_dynamic_flag_spec_CXX='${wl}-E' ++ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. ++ # Instead, shared libraries are loaded at an image base (0x10000000 by ++ # default) and relocated if they conflict, which is a slow very memory ++ # consuming and fragmenting process. To avoid this, we pick a random, ++ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link ++ # time. Moving up from 0x10000000 also allows more sbrk(2) space. ++ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ ;; + irix5* | irix6*) + case $cc_basename in +- CC) ++ CC*) + # SGI C++ +- archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is +@@ -10562,7 +10918,7 @@ + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then +- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi +@@ -10575,7 +10931,7 @@ + ;; + linux*) + case $cc_basename in +- KCC) ++ KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file +@@ -10600,17 +10956,41 @@ + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; +- icpc) ++ icpc*) + # Intel C++ + with_gnu_ld=yes ++ # version 8.0 and above of icpc choke on multiply defined symbols ++ # if we add $predep_objects and $postdep_objects, however 7.1 and ++ # earlier do not add the objects themselves. ++ case `$CC -V 2>&1` in ++ *"Version 7."*) ++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ *) # Version 8.0 or newer ++ tmp_idyn= ++ case $host_cpu in ++ ia64*) tmp_idyn=' -i_dynamic';; ++ esac ++ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ++ ;; ++ esac + archive_cmds_need_lc_CXX=no +- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; +- cxx) ++ pgCC*) ++ # Portland Group C++ compiler ++ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' ++ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ++ ++ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' ++ export_dynamic_flag_spec_CXX='${wl}--export-dynamic' ++ whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ ;; ++ cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' +@@ -10641,7 +11021,7 @@ + ;; + mvs*) + case $cc_basename in +- cxx) ++ cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +@@ -10662,9 +11042,25 @@ + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; ++ openbsd2*) ++ # C++ shared libraries are fairly broken ++ ld_shlibs_CXX=no ++ ;; ++ openbsd*) ++ hardcode_direct_CXX=yes ++ hardcode_shlibpath_var_CXX=no ++ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' ++ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' ++ export_dynamic_flag_spec_CXX='${wl}-E' ++ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ fi ++ output_verbose_link_cmd='echo' ++ ;; + osf3*) + case $cc_basename in +- KCC) ++ KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file +@@ -10680,14 +11076,14 @@ + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; +- RCC) ++ RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +- cxx) ++ cxx*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: +@@ -10705,7 +11101,7 @@ + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: +@@ -10724,7 +11120,7 @@ + ;; + osf4* | osf5*) + case $cc_basename in +- KCC) ++ KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file +@@ -10739,17 +11135,17 @@ + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; +- RCC) ++ RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +- cxx) ++ cxx*) + allow_undefined_flag_CXX=' -expect_unresolved \*' +- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' ++ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ +- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ ++ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' +@@ -10768,7 +11164,7 @@ + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' ++ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: +@@ -10789,27 +11185,14 @@ + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +- sco*) +- archive_cmds_need_lc_CXX=no +- case $cc_basename in +- CC) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; + sunos4*) + case $cc_basename in +- CC) ++ CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +- lcc) ++ lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no +@@ -10822,36 +11205,33 @@ + ;; + solaris*) + case $cc_basename in +- CC) ++ CC*) + # Sun C++ 4.2, 5.x and Centerline C++ ++ archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' +- archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ++ archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' ++ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in +- solaris2.0-5 | solaris2.0-5.*) ;; ++ solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system +- # linker. ++ # linker. We must also pass each convience library through ++ # to the system linker between allextract/defaultextract. ++ # The C++ compiler will combine linker options so we ++ # cannot just pass the convience library names through ++ # without $wl. + # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ++ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ++ output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is +@@ -10859,7 +11239,7 @@ + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; +- gcx) ++ gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + +@@ -10897,12 +11277,63 @@ + ;; + esac + ;; +- sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ++ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ++ no_undefined_flag_CXX='${wl}-z,text' ++ archive_cmds_need_lc_CXX=no ++ hardcode_shlibpath_var_CXX=no ++ runpath_var='LD_RUN_PATH' ++ ++ case $cc_basename in ++ CC*) ++ archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ *) ++ archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ esac ++ ;; ++ sysv5* | sco3.2v5* | sco5v6*) ++ # Note: We can NOT use -z defs as we might desire, because we do not ++ # link with -lc, and that would cause any symbols used from libc to ++ # always be unresolved, which means just about no library would ++ # ever link correctly. If we're not using GNU ld we use -z text ++ # though, which does catch some bad symbols but isn't as heavy-handed ++ # as -z defs. ++ # For security reasons, it is highly recommended that you always ++ # use absolute paths for naming shared libraries, and exclude the ++ # DT_RUNPATH tag from executables and libraries. But doing so ++ # requires that you compile everything twice, which is a pain. ++ # So that behaviour is only enabled if SCOABSPATH is set to a ++ # non-empty value in the environment. Most likely only useful for ++ # creating official distributions of packages. ++ # This is a hack until libtool officially supports absolute path ++ # names for shared libraries. ++ no_undefined_flag_CXX='${wl}-z,text' ++ allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no ++ hardcode_shlibpath_var_CXX=no ++ hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' ++ hardcode_libdir_separator_CXX=':' ++ link_all_deplibs_CXX=yes ++ export_dynamic_flag_spec_CXX='${wl}-Bexport' ++ runpath_var='LD_RUN_PATH' ++ ++ case $cc_basename in ++ CC*) ++ archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ *) ++ archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ esac + ;; + tandem*) + case $cc_basename in +- NCC) ++ NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no +@@ -10955,7 +11386,7 @@ + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. +- output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" ++ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + + for p in `eval $output_verbose_link_cmd`; do + case $p in +@@ -11031,7 +11462,30 @@ + + $rm -f confest.$objext + +-case " $postdeps_CXX " in ++# PORTME: override above test on systems where it is broken ++case $host_os in ++interix3*) ++ # Interix 3.5 installs completely hosed .la files for C++, so rather than ++ # hack all around it, let's just trust "g++" to DTRT. ++ predep_objects_CXX= ++ postdep_objects_CXX= ++ postdeps_CXX= ++ ;; ++ ++solaris*) ++ case $cc_basename in ++ CC*) ++ # Adding this requires a known-good setup of shared libraries for ++ # Sun compiler versions before 5.6, else PIC objects from an old ++ # archive will be linked into the output, leading to subtle bugs. ++ postdeps_CXX='-lCstd -lCrun' ++ ;; ++ esac ++ ;; ++esac ++ ++ ++case " $postdeps_CXX " in + *" -lc "*) archive_cmds_need_lc_CXX=no ;; + esac + +@@ -11078,6 +11532,10 @@ + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; ++ interix3*) ++ # Interix 3.x gcc -fpic/-fPIC options generate broken code. ++ # Instead, we relocate shared libraries at runtime. ++ ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic +@@ -11086,7 +11544,7 @@ + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + ;; + *) +@@ -11111,18 +11569,28 @@ + ;; + chorus*) + case $cc_basename in +- cxch68) ++ cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case $cc_basename in ++ xlc*) ++ lt_prog_compiler_pic_CXX='-qnocommon' ++ lt_prog_compiler_wl_CXX='-Wl,' ++ ;; ++ esac ++ ;; + dgux*) + case $cc_basename in +- ec++) ++ ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; +- ghcx) ++ ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; +@@ -11130,22 +11598,22 @@ + ;; + esac + ;; +- freebsd* | kfreebsd*-gnu) ++ freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in +- CC) ++ CC*) + lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" ++ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; +- aCC) ++ aCC*) + lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" +- case "$host_cpu" in ++ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -11158,9 +11626,13 @@ + ;; + esac + ;; ++ interix*) ++ # This is c89, which is MS Visual C++ (no shared libs) ++ # Anyone wants to do a port? ++ ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in +- CC) ++ CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. +@@ -11171,18 +11643,24 @@ + ;; + linux*) + case $cc_basename in +- KCC) ++ KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; +- icpc) ++ icpc* | ecpc*) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; +- cxx) ++ pgCC*) ++ # Portland Group C++ compiler. ++ lt_prog_compiler_wl_CXX='-Wl,' ++ lt_prog_compiler_pic_CXX='-fpic' ++ lt_prog_compiler_static_CXX='-Bstatic' ++ ;; ++ cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. +@@ -11199,7 +11677,7 @@ + ;; + mvs*) + case $cc_basename in +- cxx) ++ cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) +@@ -11210,14 +11688,14 @@ + ;; + osf3* | osf4* | osf5*) + case $cc_basename in +- KCC) ++ KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; +- RCC) ++ RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; +- cxx) ++ cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha +@@ -11231,24 +11709,15 @@ + ;; + psos*) + ;; +- sco*) +- case $cc_basename in +- CC) +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- *) +- ;; +- esac +- ;; + solaris*) + case $cc_basename in +- CC) ++ CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; +- gcx) ++ gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; +@@ -11258,12 +11727,12 @@ + ;; + sunos4*) + case $cc_basename in +- CC) ++ CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; +- lcc) ++ lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; +@@ -11273,7 +11742,7 @@ + ;; + tandem*) + case $cc_basename in +- NCC) ++ NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; +@@ -11281,7 +11750,14 @@ + ;; + esac + ;; +- unixware*) ++ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) ++ case $cc_basename in ++ CC*) ++ lt_prog_compiler_wl_CXX='-Wl,' ++ lt_prog_compiler_pic_CXX='-KPIC' ++ lt_prog_compiler_static_CXX='-Bstatic' ++ ;; ++ esac + ;; + vxworks*) + ;; +@@ -11314,18 +11790,20 @@ + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:11320: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:11796: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:11324: \$? = $ac_status" >&5 ++ echo "$as_me:11800: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test ! -s conftest.err; then ++ # So say no if there are warnings other than the usual output. ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi +@@ -11346,7 +11824,7 @@ + fi + + fi +-case "$host_os" in ++case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= +@@ -11356,6 +11834,48 @@ + ;; + esac + ++# ++# Check to make sure the static flag actually works. ++# ++wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" ++echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 ++echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_static_works_CXX+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_static_works_CXX=no ++ save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS $lt_tmp_static_flag" ++ printf "$lt_simple_link_test_code" > conftest.$ac_ext ++ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then ++ # The linker can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test -s conftest.err; then ++ # Append any errors to the config.log. ++ cat conftest.err 1>&5 ++ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if diff conftest.exp conftest.er2 >/dev/null; then ++ lt_prog_compiler_static_works_CXX=yes ++ fi ++ else ++ lt_prog_compiler_static_works_CXX=yes ++ fi ++ fi ++ $rm conftest* ++ LDFLAGS="$save_LDFLAGS" ++ ++fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 ++echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6 ++ ++if test x"$lt_prog_compiler_static_works_CXX" = xyes; then ++ : ++else ++ lt_prog_compiler_static_CXX= ++fi ++ ++ + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 + if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then +@@ -11374,23 +11894,25 @@ + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:11380: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:11900: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 +- echo "$as_me:11384: \$? = $ac_status" >&5 ++ echo "$as_me:11904: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings +- if test ! -s out/conftest.err; then ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp ++ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 ++ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi +- chmod u+w . ++ chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation +@@ -11445,7 +11967,7 @@ + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) +- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ++ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +@@ -11456,11 +11978,6 @@ + echo "${ECHO_T}$ld_shlibs_CXX" >&6 + test "$ld_shlibs_CXX" = no && can_build_shared=no + +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- + # + # Do we need to explicitly link libc? + # +@@ -11493,6 +12010,7 @@ + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX ++ pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= +@@ -11625,7 +12143,7 @@ + shlibpath_var=LIBRARY_PATH + ;; + +-bsdi4*) ++bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +@@ -11653,7 +12171,8 @@ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' ++ $install_prog $dir/$dlname \$dldir/$dlname~ ++ chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' +@@ -11683,7 +12202,7 @@ + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; +@@ -11706,7 +12225,7 @@ + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` +@@ -11741,8 +12260,17 @@ + dynamic_linker='GNU ld.so' + ;; + +-freebsd*) +- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` ++freebsd* | dragonfly*) ++ # DragonFly does not have aout. When/if they implement a new ++ # versioning mechanism, adjust this. ++ if test -x /usr/bin/objformat; then ++ objformat=`/usr/bin/objformat` ++ else ++ case $host_os in ++ freebsd[123]*) objformat=aout ;; ++ *) objformat=elf ;; ++ esac ++ fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) +@@ -11760,14 +12288,19 @@ + freebsd2*) + shlibpath_overrides_runpath=yes + ;; +- freebsd3.01* | freebsdelf3.01*) ++ freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; +- *) # from 3.2 on ++ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ ++ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; ++ freebsd*) # from 4.6 on ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; + esac + ;; + +@@ -11787,7 +12320,7 @@ + version_type=sunos + need_lib_prefix=no + need_version=no +- case "$host_cpu" in ++ case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes +@@ -11827,6 +12360,18 @@ + postinstall_cmds='chmod 555 $lib' + ;; + ++interix3*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ + irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; +@@ -11888,7 +12433,7 @@ + libsuff= + case "$host_cpu" in + x86_64*|s390x*|powerpc64*) +- echo '#line 11891 "configure"' > conftest.$ac_ext ++ echo '#line 12436 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? +@@ -11907,7 +12452,7 @@ + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then +- lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` ++ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + +@@ -11969,8 +12514,13 @@ + + openbsd*) + version_type=sunos ++ sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no +- need_version=yes ++ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. ++ case $host_os in ++ openbsd3.3 | openbsd3.3.*) need_version=yes ;; ++ *) need_version=no ;; ++ esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH +@@ -12008,13 +12558,6 @@ + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +-sco3.2v5*) +- version_type=osf +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- + solaris*) + version_type=linux + need_lib_prefix=no +@@ -12040,7 +12583,7 @@ + need_version=yes + ;; + +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' +@@ -12073,6 +12616,29 @@ + fi + ;; + ++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) ++ version_type=freebsd-elf ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ if test "$with_gnu_ld" = yes; then ++ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' ++ shlibpath_overrides_runpath=no ++ else ++ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' ++ shlibpath_overrides_runpath=yes ++ case $host_os in ++ sco3.2v5*) ++ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ++ ;; ++ esac ++ fi ++ sys_lib_dlsearch_path_spec='/usr/lib' ++ ;; ++ + uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +@@ -12088,12 +12654,17 @@ + echo "${ECHO_T}$dynamic_linker" >&6 + test "$dynamic_linker" = no && can_build_shared=no + ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++fi ++ + echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 + echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 + hardcode_action_CXX= + if test -n "$hardcode_libdir_flag_spec_CXX" || \ +- test -n "$runpath_var CXX" || \ +- test "X$hardcode_automatic_CXX"="Xyes" ; then ++ test -n "$runpath_var_CXX" || \ ++ test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && +@@ -12125,1226 +12696,403 @@ + enable_fast_install=needless + fi + +-striplib= +-old_striplib= +-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then +- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" +- test -z "$striplib" && striplib="$STRIP --strip-unneeded" +- echo "$as_me:$LINENO: result: yes" >&5 +-echo "${ECHO_T}yes" >&6 +-else +-# FIXME - insert some real tests, host_os isn't really good enough +- case $host_os in +- darwin*) +- if test -n "$STRIP" ; then +- striplib="$STRIP -x" +- echo "$as_me:$LINENO: result: yes" >&5 +-echo "${ECHO_T}yes" >&6 +- else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- ;; +- *) +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 ++ ++# The else clause should only fire when bootstrapping the ++# libtool distribution, otherwise you forgot to ship ltmain.sh ++# with your package, and you will get complaints that there are ++# no rules to generate ltmain.sh. ++if test -f "$ltmain"; then ++ # See if we are running on zsh, and set the options which allow our commands through ++ # without removal of \ escapes. ++ if test -n "${ZSH_VERSION+set}" ; then ++ setopt NO_GLOB_SUBST ++ fi ++ # Now quote all the things that may contain metacharacters while being ++ # careful not to overquote the AC_SUBSTed values. We take copies of the ++ # variables and quote the copies for generation of the libtool script. ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ ++ SED SHELL STRIP \ ++ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ ++ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ ++ deplibs_check_method reload_flag reload_cmds need_locks \ ++ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ ++ lt_cv_sys_global_symbol_to_c_name_address \ ++ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ ++ old_postinstall_cmds old_postuninstall_cmds \ ++ compiler_CXX \ ++ CC_CXX \ ++ LD_CXX \ ++ lt_prog_compiler_wl_CXX \ ++ lt_prog_compiler_pic_CXX \ ++ lt_prog_compiler_static_CXX \ ++ lt_prog_compiler_no_builtin_flag_CXX \ ++ export_dynamic_flag_spec_CXX \ ++ thread_safe_flag_spec_CXX \ ++ whole_archive_flag_spec_CXX \ ++ enable_shared_with_static_runtimes_CXX \ ++ old_archive_cmds_CXX \ ++ old_archive_from_new_cmds_CXX \ ++ predep_objects_CXX \ ++ postdep_objects_CXX \ ++ predeps_CXX \ ++ postdeps_CXX \ ++ compiler_lib_search_path_CXX \ ++ archive_cmds_CXX \ ++ archive_expsym_cmds_CXX \ ++ postinstall_cmds_CXX \ ++ postuninstall_cmds_CXX \ ++ old_archive_from_expsyms_cmds_CXX \ ++ allow_undefined_flag_CXX \ ++ no_undefined_flag_CXX \ ++ export_symbols_cmds_CXX \ ++ hardcode_libdir_flag_spec_CXX \ ++ hardcode_libdir_flag_spec_ld_CXX \ ++ hardcode_libdir_separator_CXX \ ++ hardcode_automatic_CXX \ ++ module_cmds_CXX \ ++ module_expsym_cmds_CXX \ ++ lt_cv_prog_compiler_c_o_CXX \ ++ exclude_expsyms_CXX \ ++ include_expsyms_CXX; do ++ ++ case $var in ++ old_archive_cmds_CXX | \ ++ old_archive_from_new_cmds_CXX | \ ++ archive_cmds_CXX | \ ++ archive_expsym_cmds_CXX | \ ++ module_cmds_CXX | \ ++ module_expsym_cmds_CXX | \ ++ old_archive_from_expsyms_cmds_CXX | \ ++ export_symbols_cmds_CXX | \ ++ extract_expsyms_cmds | reload_cmds | finish_cmds | \ ++ postinstall_cmds | postuninstall_cmds | \ ++ old_postinstall_cmds | old_postuninstall_cmds | \ ++ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) ++ # Double-quote double-evaled strings. ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ++ ;; ++ *) ++ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ++ ;; ++ esac ++ done ++ ++ case $lt_echo in ++ *'\$0 --fallback-echo"') ++ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac +-fi + +-if test "x$enable_dlopen" != xyes; then +- enable_dlopen=unknown +- enable_dlopen_self=unknown +- enable_dlopen_self_static=unknown +-else +- lt_cv_dlopen=no +- lt_cv_dlopen_libs= ++cfgfile="$ofile" + +- case $host_os in +- beos*) +- lt_cv_dlopen="load_add_on" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ;; ++ cat <<__EOF__ >> "$cfgfile" ++# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +- mingw* | pw32*) +- lt_cv_dlopen="LoadLibrary" +- lt_cv_dlopen_libs= +- ;; ++# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +- cygwin*) +- lt_cv_dlopen="dlopen" +- lt_cv_dlopen_libs= +- ;; ++# Shell to use when invoking shell scripts. ++SHELL=$lt_SHELL + +- darwin*) +- # if libdl is installed we need to link against it +- echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +-if test "${ac_cv_lib_dl_dlopen+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldl $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +- +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dlopen (); +-int +-main () +-{ +-dlopen (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_cxx_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_dl_dlopen=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 ++# Whether or not to build shared libraries. ++build_libtool_libs=$enable_shared + +-ac_cv_lib_dl_dlopen=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +-if test $ac_cv_lib_dl_dlopen = yes; then +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else ++# Whether or not to build static libraries. ++build_old_libs=$enable_static + +- lt_cv_dlopen="dyld" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes ++# Whether or not to add -lc for building shared libraries. ++build_libtool_need_lc=$archive_cmds_need_lc_CXX + +-fi ++# Whether or not to disallow shared libs when runtime libs are static ++allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +- ;; ++# Whether or not to optimize for fast installation. ++fast_install=$enable_fast_install + +- *) +- echo "$as_me:$LINENO: checking for shl_load" >&5 +-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +-if test "${ac_cv_func_shl_load+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +-/* Define shl_load to an innocuous variant, in case declares shl_load. +- For example, HP-UX 11i declares gettimeofday. */ +-#define shl_load innocuous_shl_load ++# The host system. ++host_alias=$host_alias ++host=$host ++host_os=$host_os + +-/* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char shl_load (); below. +- Prefer to if __STDC__ is defined, since +- exists even on freestanding compilers. */ ++# The build system. ++build_alias=$build_alias ++build=$build ++build_os=$build_os + +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif ++# An echo program that does not interpret backslashes. ++echo=$lt_echo + +-#undef shl_load ++# The archiver. ++AR=$lt_AR ++AR_FLAGS=$lt_AR_FLAGS + +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-{ +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char shl_load (); +-/* The GNU C library defines this for functions which it implements +- to always fail with ENOSYS. Some functions are actually named +- something starting with __ and the normal name is an alias. */ +-#if defined (__stub_shl_load) || defined (__stub___shl_load) +-choke me +-#else +-char (*f) () = shl_load; +-#endif +-#ifdef __cplusplus +-} +-#endif ++# A C compiler. ++LTCC=$lt_LTCC + +-int +-main () +-{ +-return f != shl_load; +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_cxx_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_func_shl_load=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 ++# LTCC compiler flags. ++LTCFLAGS=$lt_LTCFLAGS + +-ac_cv_func_shl_load=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +-echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +-if test $ac_cv_func_shl_load = yes; then +- lt_cv_dlopen="shl_load" +-else +- echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +-if test "${ac_cv_lib_dld_shl_load+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldld $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ ++# A language-specific compiler. ++CC=$lt_compiler_CXX + +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char shl_load (); +-int +-main () +-{ +-shl_load (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_cxx_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_dld_shl_load=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 ++# Is the compiler the GNU C compiler? ++with_gcc=$GCC_CXX + +-ac_cv_lib_dld_shl_load=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +-if test $ac_cv_lib_dld_shl_load = yes; then +- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +-else +- echo "$as_me:$LINENO: checking for dlopen" >&5 +-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +-if test "${ac_cv_func_dlopen+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +-/* Define dlopen to an innocuous variant, in case declares dlopen. +- For example, HP-UX 11i declares gettimeofday. */ +-#define dlopen innocuous_dlopen ++gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` ++gcc_ver=\`gcc -dumpversion\` + +-/* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char dlopen (); below. +- Prefer to if __STDC__ is defined, since +- exists even on freestanding compilers. */ ++# An ERE matcher. ++EGREP=$lt_EGREP + +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif ++# The linker used to build libraries. ++LD=$lt_LD_CXX + +-#undef dlopen ++# Whether we need hard or soft links. ++LN_S=$lt_LN_S + +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-{ +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dlopen (); +-/* The GNU C library defines this for functions which it implements +- to always fail with ENOSYS. Some functions are actually named +- something starting with __ and the normal name is an alias. */ +-#if defined (__stub_dlopen) || defined (__stub___dlopen) +-choke me +-#else +-char (*f) () = dlopen; +-#endif +-#ifdef __cplusplus +-} +-#endif ++# A BSD-compatible nm program. ++NM=$lt_NM + +-int +-main () +-{ +-return f != dlopen; +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_cxx_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_func_dlopen=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 ++# A symbol stripping program ++STRIP=$lt_STRIP + +-ac_cv_func_dlopen=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +-echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +-if test $ac_cv_func_dlopen = yes; then +- lt_cv_dlopen="dlopen" +-else +- echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +-if test "${ac_cv_lib_dl_dlopen+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldl $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ ++# Used to examine libraries when file_magic_cmd begins "file" ++MAGIC_CMD=$MAGIC_CMD + +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dlopen (); +-int +-main () +-{ +-dlopen (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_cxx_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_dl_dlopen=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 ++# Used on cygwin: DLL creation program. ++DLLTOOL="$DLLTOOL" + +-ac_cv_lib_dl_dlopen=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +-if test $ac_cv_lib_dl_dlopen = yes; then +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else +- echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +-if test "${ac_cv_lib_svld_dlopen+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lsvld $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ ++# Used on cygwin: object dumper. ++OBJDUMP="$OBJDUMP" + +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dlopen (); +-int +-main () +-{ +-dlopen (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_cxx_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_svld_dlopen=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 ++# Used on cygwin: assembler. ++AS="$AS" + +-ac_cv_lib_svld_dlopen=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +-if test $ac_cv_lib_svld_dlopen = yes; then +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +-else +- echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +-if test "${ac_cv_lib_dld_dld_link+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldld $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ ++# The name of the directory that contains temporary libtool files. ++objdir=$objdir + +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dld_link (); +-int +-main () +-{ +-dld_link (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_cxx_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_dld_dld_link=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-ac_cv_lib_dld_dld_link=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +-if test $ac_cv_lib_dld_dld_link = yes; then +- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +-fi ++# How to create reloadable object files. ++reload_flag=$lt_reload_flag ++reload_cmds=$lt_reload_cmds + ++# How to pass a linker flag through the compiler. ++wl=$lt_lt_prog_compiler_wl_CXX + +-fi ++# Object file suffix (normally "o"). ++objext="$ac_objext" + ++# Old archive suffix (normally "a"). ++libext="$libext" + +-fi ++# Shared library suffix (normally ".so"). ++shrext_cmds='$shrext_cmds' + ++# Executable file suffix (normally ""). ++exeext="$exeext" + +-fi ++# Additional compiler flags for building library objects. ++pic_flag=$lt_lt_prog_compiler_pic_CXX ++pic_mode=$pic_mode + ++# What is the maximum length of a command? ++max_cmd_len=$lt_cv_sys_max_cmd_len + +-fi ++# Does compiler simultaneously support -c and -o options? ++compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + ++# Must we lock files when doing compilation? ++need_locks=$lt_need_locks + +-fi ++# Do we need the lib prefix for modules? ++need_lib_prefix=$need_lib_prefix + +- ;; +- esac ++# Do we need a version for libraries? ++need_version=$need_version + +- if test "x$lt_cv_dlopen" != xno; then +- enable_dlopen=yes +- else +- enable_dlopen=no +- fi ++# Whether dlopen is supported. ++dlopen_support=$enable_dlopen + +- case $lt_cv_dlopen in +- dlopen) +- save_CPPFLAGS="$CPPFLAGS" +- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" ++# Whether dlopen of programs is supported. ++dlopen_self=$enable_dlopen_self + +- save_LDFLAGS="$LDFLAGS" +- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" ++# Whether dlopen of statically linked programs is supported. ++dlopen_self_static=$enable_dlopen_self_static + +- save_LIBS="$LIBS" +- LIBS="$lt_cv_dlopen_libs $LIBS" ++# Compiler flag to prevent dynamic linking. ++link_static_flag=$lt_lt_prog_compiler_static_CXX + +- echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +-if test "${lt_cv_dlopen_self+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self=cross +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext < +-#endif ++# Compiler flag to allow reflexive dlopens. ++export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +-#include ++# Compiler flag to generate shared objects directly from archives. ++whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif ++# Compiler flag to generate thread-safe objects. ++thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif ++# Library versioning type. ++version_type=$version_type + +-#ifdef __cplusplus +-extern "C" void exit (int); +-#endif ++# Format of library name prefix. ++libname_spec=$lt_libname_spec + +-void fnord() { int i=42;} +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; ++# List of archive names. First name is the real one, the rest are links. ++# The last name is the one that the linker finds with -lNAME. ++library_names_spec=$lt_library_names_spec + +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- /* dlclose (self); */ +- } ++# The coded name of the library, if different from the real name. ++soname_spec=$lt_soname_spec + +- exit (status); +-} +-EOF +- if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_unknown|x*) lt_cv_dlopen_self=no ;; +- esac +- else : +- # compilation failed +- lt_cv_dlopen_self=no +- fi +-fi +-rm -fr conftest* ++# Commands used to build and install an old-style archive. ++RANLIB=$lt_RANLIB ++old_archive_cmds=$lt_old_archive_cmds_CXX ++old_postinstall_cmds=$lt_old_postinstall_cmds ++old_postuninstall_cmds=$lt_old_postuninstall_cmds + ++# Create an old-style archive from a shared archive. ++old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +-fi +-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +-echo "${ECHO_T}$lt_cv_dlopen_self" >&6 ++# Create a temporary old-style archive to link instead of a shared archive. ++old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +- if test "x$lt_cv_dlopen_self" = xyes; then +- LDFLAGS="$LDFLAGS $link_static_flag" +- echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +-if test "${lt_cv_dlopen_self_static+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self_static=cross +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext < +-#endif ++# Commands used to build a loadable module (assumed same as above if empty) ++module_cmds=$lt_module_cmds_CXX ++module_expsym_cmds=$lt_module_expsym_cmds_CXX + +-#include ++# Commands to strip libraries. ++old_striplib=$lt_old_striplib ++striplib=$lt_striplib + +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predep_objects=\`echo $lt_predep_objects_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdep_objects=\`echo $lt_postdep_objects_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + +-#ifdef __cplusplus +-extern "C" void exit (int); +-#endif ++# Dependencies to place before the objects being linked to create a ++# shared library. ++predeps=$lt_predeps_CXX + +-void fnord() { int i=42;} +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; ++# Dependencies to place after the objects being linked to create a ++# shared library. ++postdeps=$lt_postdeps_CXX + +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- /* dlclose (self); */ +- } ++# The library search path used internally by the compiler when linking ++# a shared library. ++compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + +- exit (status); +-} +-EOF +- if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; +- esac +- else : +- # compilation failed +- lt_cv_dlopen_self_static=no +- fi +-fi +-rm -fr conftest* ++# Method to check whether dependent libraries are shared objects. ++deplibs_check_method=$lt_deplibs_check_method + ++# Command to use when deplibs_check_method == file_magic. ++file_magic_cmd=$lt_file_magic_cmd + +-fi +-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +- fi ++# Flag that allows shared libraries with undefined symbols to be built. ++allow_undefined_flag=$lt_allow_undefined_flag_CXX + +- CPPFLAGS="$save_CPPFLAGS" +- LDFLAGS="$save_LDFLAGS" +- LIBS="$save_LIBS" +- ;; +- esac ++# Flag that forces no undefined symbols. ++no_undefined_flag=$lt_no_undefined_flag_CXX + +- case $lt_cv_dlopen_self in +- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; +- *) enable_dlopen_self=unknown ;; +- esac ++# Commands used to finish a libtool library installation in a directory. ++finish_cmds=$lt_finish_cmds + +- case $lt_cv_dlopen_self_static in +- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; +- *) enable_dlopen_self_static=unknown ;; +- esac +-fi ++# Same as above, but a single script fragment to be evaled but not shown. ++finish_eval=$lt_finish_eval + ++# Take the output of nm and produce a listing of raw symbols and C names. ++global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +-# The else clause should only fire when bootstrapping the +-# libtool distribution, otherwise you forgot to ship ltmain.sh +-# with your package, and you will get complaints that there are +-# no rules to generate ltmain.sh. +-if test -f "$ltmain"; then +- # See if we are running on zsh, and set the options which allow our commands through +- # without removal of \ escapes. +- if test -n "${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +- fi +- # Now quote all the things that may contain metacharacters while being +- # careful not to overquote the AC_SUBSTed values. We take copies of the +- # variables and quote the copies for generation of the libtool script. +- for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ +- SED SHELL STRIP \ +- libname_spec library_names_spec soname_spec extract_expsyms_cmds \ +- old_striplib striplib file_magic_cmd finish_cmds finish_eval \ +- deplibs_check_method reload_flag reload_cmds need_locks \ +- lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ +- lt_cv_sys_global_symbol_to_c_name_address \ +- sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ +- old_postinstall_cmds old_postuninstall_cmds \ +- compiler_CXX \ +- CC_CXX \ +- LD_CXX \ +- lt_prog_compiler_wl_CXX \ +- lt_prog_compiler_pic_CXX \ +- lt_prog_compiler_static_CXX \ +- lt_prog_compiler_no_builtin_flag_CXX \ +- export_dynamic_flag_spec_CXX \ +- thread_safe_flag_spec_CXX \ +- whole_archive_flag_spec_CXX \ +- enable_shared_with_static_runtimes_CXX \ +- old_archive_cmds_CXX \ +- old_archive_from_new_cmds_CXX \ +- predep_objects_CXX \ +- postdep_objects_CXX \ +- predeps_CXX \ +- postdeps_CXX \ +- compiler_lib_search_path_CXX \ +- archive_cmds_CXX \ +- archive_expsym_cmds_CXX \ +- postinstall_cmds_CXX \ +- postuninstall_cmds_CXX \ +- old_archive_from_expsyms_cmds_CXX \ +- allow_undefined_flag_CXX \ +- no_undefined_flag_CXX \ +- export_symbols_cmds_CXX \ +- hardcode_libdir_flag_spec_CXX \ +- hardcode_libdir_flag_spec_ld_CXX \ +- hardcode_libdir_separator_CXX \ +- hardcode_automatic_CXX \ +- module_cmds_CXX \ +- module_expsym_cmds_CXX \ +- lt_cv_prog_compiler_c_o_CXX \ +- exclude_expsyms_CXX \ +- include_expsyms_CXX; do ++# Transform the output of nm in a proper C declaration ++global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +- case $var in +- old_archive_cmds_CXX | \ +- old_archive_from_new_cmds_CXX | \ +- archive_cmds_CXX | \ +- archive_expsym_cmds_CXX | \ +- module_cmds_CXX | \ +- module_expsym_cmds_CXX | \ +- old_archive_from_expsyms_cmds_CXX | \ +- export_symbols_cmds_CXX | \ +- extract_expsyms_cmds | reload_cmds | finish_cmds | \ +- postinstall_cmds | postuninstall_cmds | \ +- old_postinstall_cmds | old_postuninstall_cmds | \ +- sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) +- # Double-quote double-evaled strings. +- eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" +- ;; +- *) +- eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" +- ;; +- esac +- done ++# Transform the output of nm in a C name address pair ++global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +- case $lt_echo in +- *'\$0 --fallback-echo"') +- lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` +- ;; +- esac ++# This is the shared library runtime path variable. ++runpath_var=$runpath_var + +-cfgfile="$ofile" ++# This is the shared library path variable. ++shlibpath_var=$shlibpath_var + +- cat <<__EOF__ >> "$cfgfile" +-# ### BEGIN LIBTOOL TAG CONFIG: $tagname ++# Is shlibpath searched before the hard-coded library search path? ++shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: ++# How to hardcode a shared library path into an executable. ++hardcode_action=$hardcode_action_CXX + +-# Shell to use when invoking shell scripts. +-SHELL=$lt_SHELL ++# Whether we should hardcode library paths into libraries. ++hardcode_into_libs=$hardcode_into_libs + +-# Whether or not to build shared libraries. +-build_libtool_libs=$enable_shared ++# Flag to hardcode \$libdir into a binary during linking. ++# This must work even if \$libdir does not exist. ++hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +-# Whether or not to build static libraries. +-build_old_libs=$enable_static ++# If ld is used when linking, flag to hardcode \$libdir into ++# a binary during linking. This must work even if \$libdir does ++# not exist. ++hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +-# Whether or not to add -lc for building shared libraries. +-build_libtool_need_lc=$archive_cmds_need_lc_CXX ++# Whether we need a single -rpath flag with a separated argument. ++hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +-# Whether or not to disallow shared libs when runtime libs are static +-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX ++# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the ++# resulting binary. ++hardcode_direct=$hardcode_direct_CXX + +-# Whether or not to optimize for fast installation. +-fast_install=$enable_fast_install ++# Set to yes if using the -LDIR flag during linking hardcodes DIR into the ++# resulting binary. ++hardcode_minus_L=$hardcode_minus_L_CXX + +-# The host system. +-host_alias=$host_alias +-host=$host ++# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into ++# the resulting binary. ++hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +-# An echo program that does not interpret backslashes. +-echo=$lt_echo ++# Set to yes if building a shared library automatically hardcodes DIR into the library ++# and all subsequent libraries and executables linked against it. ++hardcode_automatic=$hardcode_automatic_CXX + +-# The archiver. +-AR=$lt_AR +-AR_FLAGS=$lt_AR_FLAGS ++# Variables whose values should be saved in libtool wrapper scripts and ++# restored at relink time. ++variables_saved_for_relink="$variables_saved_for_relink" + +-# A C compiler. +-LTCC=$lt_LTCC ++# Whether libtool must link a program against all its dependency libraries. ++link_all_deplibs=$link_all_deplibs_CXX + +-# A language-specific compiler. +-CC=$lt_compiler_CXX ++# Compile-time system search path for libraries ++sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + +-# Is the compiler the GNU C compiler? +-with_gcc=$GCC_CXX ++# Run-time system search path for libraries ++sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +-# An ERE matcher. +-EGREP=$lt_EGREP ++# Fix the shell variable \$srcfile for the compiler. ++fix_srcfile_path="$fix_srcfile_path_CXX" + +-# The linker used to build libraries. +-LD=$lt_LD_CXX ++# Set to yes if exported symbols are required. ++always_export_symbols=$always_export_symbols_CXX + +-# Whether we need hard or soft links. +-LN_S=$lt_LN_S ++# The commands to list exported symbols. ++export_symbols_cmds=$lt_export_symbols_cmds_CXX + +-# A BSD-compatible nm program. +-NM=$lt_NM ++# The commands to extract the exported symbol list from a shared archive. ++extract_expsyms_cmds=$lt_extract_expsyms_cmds + +-# A symbol stripping program +-STRIP=$lt_STRIP ++# Symbols that should not be listed in the preloaded symbols. ++exclude_expsyms=$lt_exclude_expsyms_CXX + +-# Used to examine libraries when file_magic_cmd begins "file" +-MAGIC_CMD=$MAGIC_CMD ++# Symbols that must always be exported. ++include_expsyms=$lt_include_expsyms_CXX + +-# Used on cygwin: DLL creation program. +-DLLTOOL="$DLLTOOL" +- +-# Used on cygwin: object dumper. +-OBJDUMP="$OBJDUMP" +- +-# Used on cygwin: assembler. +-AS="$AS" +- +-# The name of the directory that contains temporary libtool files. +-objdir=$objdir +- +-# How to create reloadable object files. +-reload_flag=$lt_reload_flag +-reload_cmds=$lt_reload_cmds +- +-# How to pass a linker flag through the compiler. +-wl=$lt_lt_prog_compiler_wl_CXX +- +-# Object file suffix (normally "o"). +-objext="$ac_objext" +- +-# Old archive suffix (normally "a"). +-libext="$libext" +- +-# Shared library suffix (normally ".so"). +-shrext_cmds='$shrext_cmds' +- +-# Executable file suffix (normally ""). +-exeext="$exeext" +- +-# Additional compiler flags for building library objects. +-pic_flag=$lt_lt_prog_compiler_pic_CXX +-pic_mode=$pic_mode +- +-# What is the maximum length of a command? +-max_cmd_len=$lt_cv_sys_max_cmd_len +- +-# Does compiler simultaneously support -c and -o options? +-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX +- +-# Must we lock files when doing compilation ? +-need_locks=$lt_need_locks +- +-# Do we need the lib prefix for modules? +-need_lib_prefix=$need_lib_prefix +- +-# Do we need a version for libraries? +-need_version=$need_version +- +-# Whether dlopen is supported. +-dlopen_support=$enable_dlopen +- +-# Whether dlopen of programs is supported. +-dlopen_self=$enable_dlopen_self +- +-# Whether dlopen of statically linked programs is supported. +-dlopen_self_static=$enable_dlopen_self_static +- +-# Compiler flag to prevent dynamic linking. +-link_static_flag=$lt_lt_prog_compiler_static_CXX +- +-# Compiler flag to turn off builtin functions. +-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX +- +-# Compiler flag to allow reflexive dlopens. +-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX +- +-# Compiler flag to generate shared objects directly from archives. +-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX +- +-# Compiler flag to generate thread-safe objects. +-thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX +- +-# Library versioning type. +-version_type=$version_type +- +-# Format of library name prefix. +-libname_spec=$lt_libname_spec +- +-# List of archive names. First name is the real one, the rest are links. +-# The last name is the one that the linker finds with -lNAME. +-library_names_spec=$lt_library_names_spec +- +-# The coded name of the library, if different from the real name. +-soname_spec=$lt_soname_spec +- +-# Commands used to build and install an old-style archive. +-RANLIB=$lt_RANLIB +-old_archive_cmds=$lt_old_archive_cmds_CXX +-old_postinstall_cmds=$lt_old_postinstall_cmds +-old_postuninstall_cmds=$lt_old_postuninstall_cmds +- +-# Create an old-style archive from a shared archive. +-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX +- +-# Create a temporary old-style archive to link instead of a shared archive. +-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX +- +-# Commands used to build and install a shared archive. +-archive_cmds=$lt_archive_cmds_CXX +-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +-postinstall_cmds=$lt_postinstall_cmds +-postuninstall_cmds=$lt_postuninstall_cmds +- +-# Commands used to build a loadable module (assumed same as above if empty) +-module_cmds=$lt_module_cmds_CXX +-module_expsym_cmds=$lt_module_expsym_cmds_CXX +- +-# Commands to strip libraries. +-old_striplib=$lt_old_striplib +-striplib=$lt_striplib +- +-# Dependencies to place before the objects being linked to create a +-# shared library. +-predep_objects=$lt_predep_objects_CXX +- +-# Dependencies to place after the objects being linked to create a +-# shared library. +-postdep_objects=$lt_postdep_objects_CXX +- +-# Dependencies to place before the objects being linked to create a +-# shared library. +-predeps=$lt_predeps_CXX +- +-# Dependencies to place after the objects being linked to create a +-# shared library. +-postdeps=$lt_postdeps_CXX +- +-# The library search path used internally by the compiler when linking +-# a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX +- +-# Method to check whether dependent libraries are shared objects. +-deplibs_check_method=$lt_deplibs_check_method +- +-# Command to use when deplibs_check_method == file_magic. +-file_magic_cmd=$lt_file_magic_cmd +- +-# Flag that allows shared libraries with undefined symbols to be built. +-allow_undefined_flag=$lt_allow_undefined_flag_CXX +- +-# Flag that forces no undefined symbols. +-no_undefined_flag=$lt_no_undefined_flag_CXX +- +-# Commands used to finish a libtool library installation in a directory. +-finish_cmds=$lt_finish_cmds +- +-# Same as above, but a single script fragment to be evaled but not shown. +-finish_eval=$lt_finish_eval +- +-# Take the output of nm and produce a listing of raw symbols and C names. +-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe +- +-# Transform the output of nm in a proper C declaration +-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl +- +-# Transform the output of nm in a C name address pair +-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address +- +-# This is the shared library runtime path variable. +-runpath_var=$runpath_var +- +-# This is the shared library path variable. +-shlibpath_var=$shlibpath_var +- +-# Is shlibpath searched before the hard-coded library search path? +-shlibpath_overrides_runpath=$shlibpath_overrides_runpath +- +-# How to hardcode a shared library path into an executable. +-hardcode_action=$hardcode_action_CXX +- +-# Whether we should hardcode library paths into libraries. +-hardcode_into_libs=$hardcode_into_libs +- +-# Flag to hardcode \$libdir into a binary during linking. +-# This must work even if \$libdir does not exist. +-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX +- +-# If ld is used when linking, flag to hardcode \$libdir into +-# a binary during linking. This must work even if \$libdir does +-# not exist. +-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX +- +-# Whether we need a single -rpath flag with a separated argument. +-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX +- +-# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +-# resulting binary. +-hardcode_direct=$hardcode_direct_CXX +- +-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +-# resulting binary. +-hardcode_minus_L=$hardcode_minus_L_CXX +- +-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +-# the resulting binary. +-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX +- +-# Set to yes if building a shared library automatically hardcodes DIR into the library +-# and all subsequent libraries and executables linked against it. +-hardcode_automatic=$hardcode_automatic_CXX +- +-# Variables whose values should be saved in libtool wrapper scripts and +-# restored at relink time. +-variables_saved_for_relink="$variables_saved_for_relink" +- +-# Whether libtool must link a program against all its dependency libraries. +-link_all_deplibs=$link_all_deplibs_CXX +- +-# Compile-time system search path for libraries +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec +- +-# Run-time system search path for libraries +-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +- +-# Fix the shell variable \$srcfile for the compiler. +-fix_srcfile_path="$fix_srcfile_path_CXX" +- +-# Set to yes if exported symbols are required. +-always_export_symbols=$always_export_symbols_CXX +- +-# The commands to list exported symbols. +-export_symbols_cmds=$lt_export_symbols_cmds_CXX +- +-# The commands to extract the exported symbol list from a shared archive. +-extract_expsyms_cmds=$lt_extract_expsyms_cmds +- +-# Symbols that should not be listed in the preloaded symbols. +-exclude_expsyms=$lt_exclude_expsyms_CXX +- +-# Symbols that must always be exported. +-include_expsyms=$lt_include_expsyms_CXX +- +-# ### END LIBTOOL TAG CONFIG: $tagname ++# ### END LIBTOOL TAG CONFIG: $tagname + + __EOF__ + +@@ -13428,16 +13176,42 @@ + # If no C compiler was specified, use CC. + LTCC=${LTCC-"$CC"} + ++# If no C compiler flags were specified, use CFLAGS. ++LTCFLAGS=${LTCFLAGS-"$CFLAGS"} ++ + # Allow CC to be a program name with arguments. + compiler=$CC + + ++# save warnings/boilerplate of simple test code ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_compile_test_code" >conftest.$ac_ext ++eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_compiler_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_link_test_code" >conftest.$ac_ext ++eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_linker_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + CC=${F77-"f77"} + compiler=$CC + compiler_F77=$CC +-cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` ++for cc_temp in $compiler""; do ++ case $cc_temp in ++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; ++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ++ + + echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 + echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +@@ -13450,7 +13224,7 @@ + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. +-case "$host_os" in ++case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then +@@ -13459,7 +13233,9 @@ + fi + ;; + aix4* | aix5*) +- test "$enable_shared" = yes && enable_static=no ++ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then ++ test "$enable_shared" = yes && enable_static=no ++ fi + ;; + esac + echo "$as_me:$LINENO: result: $enable_shared" >&5 +@@ -13472,8 +13248,6 @@ + echo "$as_me:$LINENO: result: $enable_static" >&5 + echo "${ECHO_T}$enable_static" >&6 + +-test "$ld_shlibs_F77" = no && can_build_shared=no +- + GCC_F77="$G77" + LD_F77="$LD" + +@@ -13520,6 +13294,11 @@ + lt_prog_compiler_pic_F77='-fno-common' + ;; + ++ interix3*) ++ # Interix 3.x gcc -fpic/-fPIC options generate broken code. ++ # Instead, we relocate shared libraries at runtime. ++ ;; ++ + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. +@@ -13536,7 +13315,7 @@ + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -13562,6 +13341,16 @@ + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case $cc_basename in ++ xlc*) ++ lt_prog_compiler_pic_F77='-qnocommon' ++ lt_prog_compiler_wl_F77='-Wl,' ++ ;; ++ esac ++ ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being +@@ -13573,7 +13362,7 @@ + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -13597,12 +13386,19 @@ + ;; + + linux*) +- case $CC in ++ case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; ++ pgcc* | pgf77* | pgf90* | pgf95*) ++ # Portland Group compilers (*not* the Pentium gcc compiler, ++ # which looks to be a dead project) ++ lt_prog_compiler_wl_F77='-Wl,' ++ lt_prog_compiler_pic_F77='-fpic' ++ lt_prog_compiler_static_F77='-Bstatic' ++ ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. +@@ -13617,15 +13413,15 @@ + lt_prog_compiler_static_F77='-non_shared' + ;; + +- sco3.2v5*) +- lt_prog_compiler_pic_F77='-Kpic' +- lt_prog_compiler_static_F77='-dn' +- ;; +- + solaris*) +- lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' ++ case $cc_basename in ++ f77* | f90* | f95*) ++ lt_prog_compiler_wl_F77='-Qoption ld ';; ++ *) ++ lt_prog_compiler_wl_F77='-Wl,';; ++ esac + ;; + + sunos4*) +@@ -13634,7 +13430,7 @@ + lt_prog_compiler_static_F77='-Bstatic' + ;; + +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' +@@ -13647,12 +13443,23 @@ + fi + ;; + +- uts4*) +- lt_prog_compiler_pic_F77='-pic' ++ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + +- *) ++ unicos*) ++ lt_prog_compiler_wl_F77='-Wl,' ++ lt_prog_compiler_can_build_shared_F77=no ++ ;; ++ ++ uts4*) ++ lt_prog_compiler_pic_F77='-pic' ++ lt_prog_compiler_static_F77='-Bstatic' ++ ;; ++ ++ *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac +@@ -13681,18 +13488,20 @@ + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:13687: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:13494: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:13691: \$? = $ac_status" >&5 ++ echo "$as_me:13498: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test ! -s conftest.err; then ++ # So say no if there are warnings other than the usual output. ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_F77=yes + fi + fi +@@ -13713,7 +13522,7 @@ + fi + + fi +-case "$host_os" in ++case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= +@@ -13723,6 +13532,48 @@ + ;; + esac + ++# ++# Check to make sure the static flag actually works. ++# ++wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" ++echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 ++echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_static_works_F77+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_static_works_F77=no ++ save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS $lt_tmp_static_flag" ++ printf "$lt_simple_link_test_code" > conftest.$ac_ext ++ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then ++ # The linker can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test -s conftest.err; then ++ # Append any errors to the config.log. ++ cat conftest.err 1>&5 ++ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if diff conftest.exp conftest.er2 >/dev/null; then ++ lt_prog_compiler_static_works_F77=yes ++ fi ++ else ++ lt_prog_compiler_static_works_F77=yes ++ fi ++ fi ++ $rm conftest* ++ LDFLAGS="$save_LDFLAGS" ++ ++fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 ++echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6 ++ ++if test x"$lt_prog_compiler_static_works_F77" = xyes; then ++ : ++else ++ lt_prog_compiler_static_F77= ++fi ++ ++ + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 + if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then +@@ -13741,23 +13592,25 @@ + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:13747: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:13598: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 +- echo "$as_me:13751: \$? = $ac_status" >&5 ++ echo "$as_me:13602: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings +- if test ! -s out/conftest.err; then ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp ++ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 ++ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi +- chmod u+w . ++ chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation +@@ -13833,6 +13686,16 @@ + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= ++ # Just being paranoid about ensuring that cc_basename is set. ++ for cc_temp in $compiler""; do ++ case $cc_temp in ++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; ++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) +@@ -13843,6 +13706,10 @@ + with_gnu_ld=no + fi + ;; ++ interix*) ++ # we just hope/assume this is gcc and not c89 (= MSVC++) ++ with_gnu_ld=yes ++ ;; + openbsd*) + with_gnu_ld=no + ;; +@@ -13853,6 +13720,27 @@ + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + ++ # Set some defaults for GNU ld with shared library support. These ++ # are reset later if shared libraries are not supported. Putting them ++ # here allows them to be overridden if necessary. ++ runpath_var=LD_RUN_PATH ++ hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' ++ export_dynamic_flag_spec_F77='${wl}--export-dynamic' ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then ++ whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ whole_archive_flag_spec_F77= ++ fi ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) +@@ -13903,10 +13791,10 @@ + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes +- export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ++ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then +- archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +@@ -13915,9 +13803,55 @@ + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ +- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else +- ld_shlibs=no ++ ld_shlibs_F77=no ++ fi ++ ;; ++ ++ interix3*) ++ hardcode_direct_F77=no ++ hardcode_shlibpath_var_F77=no ++ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ++ export_dynamic_flag_spec_F77='${wl}-E' ++ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. ++ # Instead, shared libraries are loaded at an image base (0x10000000 by ++ # default) and relocated if they conflict, which is a slow very memory ++ # consuming and fragmenting process. To avoid this, we pick a random, ++ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link ++ # time. Moving up from 0x10000000 also allows more sbrk(2) space. ++ archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ tmp_addflag= ++ case $cc_basename,$host_cpu in ++ pgcc*) # Portland Group C compiler ++ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ tmp_addflag=' $pic_flag' ++ ;; ++ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers ++ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ tmp_addflag=' $pic_flag -Mnomain' ;; ++ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 ++ tmp_addflag=' -i_dynamic' ;; ++ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 ++ tmp_addflag=' -i_dynamic -nofor_main' ;; ++ ifc* | ifort*) # Intel Fortran compiler ++ tmp_addflag=' -nofor_main' ;; ++ esac ++ archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ ++ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++ $echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ fi ++ else ++ ld_shlibs_F77=no + fi + ;; + +@@ -13931,7 +13865,7 @@ + fi + ;; + +- solaris* | sysv5*) ++ solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 +@@ -13952,6 +13886,33 @@ + fi + ;; + ++ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) ++ case `$LD -v 2>&1` in ++ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ++ ld_shlibs_F77=no ++ cat <<_LT_EOF 1>&2 ++ ++*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not ++*** reliably create shared libraries on SCO systems. Therefore, libtool ++*** is disabling shared libraries support. We urge you to upgrade GNU ++*** binutils to release 2.16.91.0.3 or newer. Another option is to modify ++*** your PATH or compiler configuration so that the native linker is ++*** used, and then restart. ++ ++_LT_EOF ++ ;; ++ *) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' ++ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' ++ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' ++ else ++ ld_shlibs_F77=no ++ fi ++ ;; ++ esac ++ ;; ++ + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= +@@ -13959,31 +13920,6 @@ + hardcode_shlibpath_var_F77=no + ;; + +- linux*) +- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_cmds_F77="$tmp_archive_cmds" +- supports_anon_versioning=no +- case `$LD -v 2>/dev/null` in +- *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 +- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... +- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... +- *\ 2.11.*) ;; # other 2.11 versions +- *) supports_anon_versioning=yes ;; +- esac +- if test $supports_anon_versioning = yes; then +- archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ +-cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +-$echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- else +- archive_expsym_cmds_F77="$tmp_archive_cmds" +- fi +- else +- ld_shlibs_F77=no +- fi +- ;; +- + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +@@ -13994,16 +13930,11 @@ + ;; + esac + +- if test "$ld_shlibs_F77" = yes; then +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' +- export_dynamic_flag_spec_F77='${wl}--export-dynamic' +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec_F77= +- fi ++ if test "$ld_shlibs_F77" = no; then ++ runpath_var= ++ hardcode_libdir_flag_spec_F77= ++ export_dynamic_flag_spec_F77= ++ whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) +@@ -14015,7 +13946,7 @@ + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes +- if test "$GCC" = yes && test -z "$link_static_flag"; then ++ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported +@@ -14049,6 +13980,7 @@ + break + fi + done ++ ;; + esac + + exp_sym_flag='-bexport' +@@ -14067,7 +13999,7 @@ + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then +- case $host_os in aix4.012|aix4.012.*) ++ case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` +@@ -14086,8 +14018,12 @@ + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi ++ ;; + esac + shared_flag='-shared' ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag="$shared_flag "'${wl}-G' ++ fi + else + # not using gcc + if test "$host_cpu" = ia64; then +@@ -14095,11 +14031,11 @@ + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else +- if test "$aix_use_runtimelinking" = yes; then ++ if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' +- fi ++ fi + fi + fi + +@@ -14154,12 +14090,12 @@ + if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" +- archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" +- archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +@@ -14209,13 +14145,11 @@ + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' +- # -bexpall does not export symbols beginning with underscore (_) +- always_export_symbols_F77=yes + # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec_F77=' ' ++ whole_archive_flag_spec_F77='$convenience' + archive_cmds_need_lc_F77=yes +- # This is similar to how AIX traditionally builds it's shared libraries. +- archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ # This is similar to how AIX traditionally builds its shared libraries. ++ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; +@@ -14228,7 +14162,7 @@ + ld_shlibs_F77=no + ;; + +- bsdi4*) ++ bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + +@@ -14249,57 +14183,57 @@ + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' +- fix_srcfile_path='`cygpath -w "$srcfile"`' ++ fix_srcfile_path_F77='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) +- if test "$GXX" = yes ; then +- archive_cmds_need_lc_F77=no +- case "$host_os" in +- rhapsody* | darwin1.[012]) +- allow_undefined_flag_F77='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then +- allow_undefined_flag_F77='-flat_namespace -undefined suppress' +- else +- case ${MACOSX_DEPLOYMENT_TARGET} in +- 10.[012]) +- allow_undefined_flag_F77='-flat_namespace -undefined suppress' +- ;; +- 10.*) +- allow_undefined_flag_F77='-undefined dynamic_lookup' +- ;; +- esac +- fi +- ;; ++ case $host_os in ++ rhapsody* | darwin1.[012]) ++ allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[012]) ++ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; + esac +- lt_int_apple_cc_single_mod=no +- output_verbose_link_cmd='echo' +- if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then +- lt_int_apple_cc_single_mod=yes +- fi +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- else +- archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- fi +- module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' +- # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- else +- archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported +- whole_archive_flag_spec_F77='-all_load $convenience' ++ whole_archive_flag_spec_F77='' + link_all_deplibs_F77=yes ++ if test "$GCC" = yes ; then ++ output_verbose_link_cmd='echo' ++ archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else +- ld_shlibs_F77=no ++ case $cc_basename in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ ld_shlibs_F77=no ++ ;; ++ esac + fi + ;; + +@@ -14333,7 +14267,7 @@ + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd* | kfreebsd*-gnu) ++ freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes +@@ -14356,47 +14290,62 @@ + export_dynamic_flag_spec_F77='${wl}-E' + ;; + +- hpux10* | hpux11*) ++ hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then +- case "$host_cpu" in +- hppa*64*|ia64*) ++ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ fi ++ if test "$with_gnu_ld" = no; then ++ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_F77=: ++ ++ hardcode_direct_F77=yes ++ export_dynamic_flag_spec_F77='${wl}-E' ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L_F77=yes ++ fi ++ ;; ++ ++ hpux11*) ++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ case $host_cpu in ++ hppa*64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; ++ ia64*) ++ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ++ ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else +- case "$host_cpu" in +- hppa*64*|ia64*) +- archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ++ case $host_cpu in ++ hppa*64*) ++ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ ia64*) ++ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) +- archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then +- case "$host_cpu" in +- hppa*64*) +- hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' ++ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_F77=: ++ ++ case $host_cpu in ++ hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_F77='+b $libdir' +- hardcode_libdir_separator_F77=: +- hardcode_direct_F77=no +- hardcode_shlibpath_var_F77=no +- ;; +- ia64*) +- hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no +- +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- hardcode_minus_L_F77=yes + ;; + *) +- hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + +@@ -14444,6 +14393,7 @@ + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else +@@ -14489,7 +14439,7 @@ + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ +- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' ++ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' +@@ -14497,21 +14447,15 @@ + hardcode_libdir_separator_F77=: + ;; + +- sco3.2v5*) +- archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var_F77=no +- export_dynamic_flag_spec_F77='${wl}-Bexport' +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ;; +- + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then ++ wlarc='${wl}' + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else ++ wlarc='' + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +@@ -14520,8 +14464,18 @@ + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; ++ *) ++ # The compiler driver will combine linker options so we ++ # cannot just pass the convience library names through ++ # without $wl, iff we do not link with $LD. ++ # Luckily, gcc supports the same syntax we need for Sun Studio. ++ # Supported since Solaris 2.6 (maybe 2.5.1?) ++ case $wlarc in ++ '') ++ whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; ++ *) ++ whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; ++ esac ;; + esac + link_all_deplibs_F77=yes + ;; +@@ -14578,36 +14532,45 @@ + fi + ;; + +- sysv4.2uw2*) +- archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct_F77=yes +- hardcode_minus_L_F77=no ++ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) ++ no_undefined_flag_F77='${wl}-z,text' ++ archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no +- hardcode_runpath_var=yes +- runpath_var=LD_RUN_PATH +- ;; ++ runpath_var='LD_RUN_PATH' + +- sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) +- no_undefined_flag_F77='${wl}-z ${wl}text' + if test "$GCC" = yes; then +- archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else +- archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var_F77=no + ;; + +- sysv5*) +- no_undefined_flag_F77=' -z text' +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +- hardcode_libdir_flag_spec_F77= ++ sysv5* | sco3.2v5* | sco5v6*) ++ # Note: We can NOT use -z defs as we might desire, because we do not ++ # link with -lc, and that would cause any symbols used from libc to ++ # always be unresolved, which means just about no library would ++ # ever link correctly. If we're not using GNU ld we use -z text ++ # though, which does catch some bad symbols but isn't as heavy-handed ++ # as -z defs. ++ no_undefined_flag_F77='${wl}-z,text' ++ allow_undefined_flag_F77='${wl}-z,nodefs' ++ archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no ++ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' ++ hardcode_libdir_separator_F77=':' ++ link_all_deplibs_F77=yes ++ export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var='LD_RUN_PATH' ++ ++ if test "$GCC" = yes; then ++ archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ fi + ;; + + uts4*) +@@ -14626,11 +14589,6 @@ + echo "${ECHO_T}$ld_shlibs_F77" >&6 + test "$ld_shlibs_F77" = no && can_build_shared=no + +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- + # + # Do we need to explicitly link libc? + # +@@ -14663,6 +14621,7 @@ + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 ++ pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= +@@ -14795,7 +14754,7 @@ + shlibpath_var=LIBRARY_PATH + ;; + +-bsdi4*) ++bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +@@ -14823,7 +14782,8 @@ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' ++ $install_prog $dir/$dlname \$dldir/$dlname~ ++ chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' +@@ -14853,7 +14813,7 @@ + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; +@@ -14876,7 +14836,7 @@ + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' ++ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` +@@ -14911,8 +14871,17 @@ + dynamic_linker='GNU ld.so' + ;; + +-freebsd*) +- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` ++freebsd* | dragonfly*) ++ # DragonFly does not have aout. When/if they implement a new ++ # versioning mechanism, adjust this. ++ if test -x /usr/bin/objformat; then ++ objformat=`/usr/bin/objformat` ++ else ++ case $host_os in ++ freebsd[123]*) objformat=aout ;; ++ *) objformat=elf ;; ++ esac ++ fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) +@@ -14930,14 +14899,19 @@ + freebsd2*) + shlibpath_overrides_runpath=yes + ;; +- freebsd3.01* | freebsdelf3.01*) ++ freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; +- *) # from 3.2 on ++ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ ++ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; ++ freebsd*) # from 4.6 on ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; + esac + ;; + +@@ -14957,7 +14931,7 @@ + version_type=sunos + need_lib_prefix=no + need_version=no +- case "$host_cpu" in ++ case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes +@@ -14997,6 +14971,18 @@ + postinstall_cmds='chmod 555 $lib' + ;; + ++interix3*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ + irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; +@@ -15058,7 +15044,7 @@ + libsuff= + case "$host_cpu" in + x86_64*|s390x*|powerpc64*) +- echo '#line 15061 "configure"' > conftest.$ac_ext ++ echo '#line 15047 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? +@@ -15077,7 +15063,7 @@ + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then +- lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` ++ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" + fi + +@@ -15139,8 +15125,13 @@ + + openbsd*) + version_type=sunos ++ sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no +- need_version=yes ++ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. ++ case $host_os in ++ openbsd3.3 | openbsd3.3.*) need_version=yes ;; ++ *) need_version=no ;; ++ esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH +@@ -15178,13 +15169,6 @@ + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +-sco3.2v5*) +- version_type=osf +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- + solaris*) + version_type=linux + need_lib_prefix=no +@@ -15210,7 +15194,7 @@ + need_version=yes + ;; + +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' +@@ -15243,6 +15227,29 @@ + fi + ;; + ++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) ++ version_type=freebsd-elf ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ if test "$with_gnu_ld" = yes; then ++ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' ++ shlibpath_overrides_runpath=no ++ else ++ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' ++ shlibpath_overrides_runpath=yes ++ case $host_os in ++ sco3.2v5*) ++ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ++ ;; ++ esac ++ fi ++ sys_lib_dlsearch_path_spec='/usr/lib' ++ ;; ++ + uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +@@ -15258,12 +15265,17 @@ + echo "${ECHO_T}$dynamic_linker" >&6 + test "$dynamic_linker" = no && can_build_shared=no + ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" ++fi ++ + echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 + echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 + hardcode_action_F77= + if test -n "$hardcode_libdir_flag_spec_F77" || \ +- test -n "$runpath_var F77" || \ +- test "X$hardcode_automatic_F77"="Xyes" ; then ++ test -n "$runpath_var_F77" || \ ++ test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && +@@ -15295,36 +15307,6 @@ + enable_fast_install=needless + fi + +-striplib= +-old_striplib= +-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then +- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" +- test -z "$striplib" && striplib="$STRIP --strip-unneeded" +- echo "$as_me:$LINENO: result: yes" >&5 +-echo "${ECHO_T}yes" >&6 +-else +-# FIXME - insert some real tests, host_os isn't really good enough +- case $host_os in +- darwin*) +- if test -n "$STRIP" ; then +- striplib="$STRIP -x" +- echo "$as_me:$LINENO: result: yes" >&5 +-echo "${ECHO_T}yes" >&6 +- else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- ;; +- *) +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +- ;; +- esac +-fi +- +- + + # The else clause should only fire when bootstrapping the + # libtool distribution, otherwise you forgot to ship ltmain.sh +@@ -15339,7 +15321,7 @@ + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. +- for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ +@@ -15440,6 +15422,12 @@ + # The host system. + host_alias=$host_alias + host=$host ++host_os=$host_os ++ ++# The build system. ++build_alias=$build_alias ++build=$build ++build_os=$build_os + + # An echo program that does not interpret backslashes. + echo=$lt_echo +@@ -15451,12 +15439,18 @@ + # A C compiler. + LTCC=$lt_LTCC + ++# LTCC compiler flags. ++LTCFLAGS=$lt_LTCFLAGS ++ + # A language-specific compiler. + CC=$lt_compiler_F77 + + # Is the compiler the GNU C compiler? + with_gcc=$GCC_F77 + ++gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` ++gcc_ver=\`gcc -dumpversion\` ++ + # An ERE matcher. + EGREP=$lt_EGREP + +@@ -15516,7 +15510,7 @@ + # Does compiler simultaneously support -c and -o options? + compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +-# Must we lock files when doing compilation ? ++# Must we lock files when doing compilation? + need_locks=$lt_need_locks + + # Do we need the lib prefix for modules? +@@ -15590,11 +15584,11 @@ + + # Dependencies to place before the objects being linked to create a + # shared library. +-predep_objects=$lt_predep_objects_F77 ++predep_objects=\`echo $lt_predep_objects_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place after the objects being linked to create a + # shared library. +-postdep_objects=$lt_postdep_objects_F77 ++postdep_objects=\`echo $lt_postdep_objects_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place before the objects being linked to create a + # shared library. +@@ -15606,7 +15600,7 @@ + + # The library search path used internally by the compiler when linking + # a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path_F77 ++compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$lt_deplibs_check_method +@@ -15686,7 +15680,7 @@ + link_all_deplibs=$link_all_deplibs_F77 + + # Compile-time system search path for libraries +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Run-time system search path for libraries + sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +@@ -15754,26 +15748,55 @@ + lt_simple_compile_test_code="class foo {}\n" + + # Code to be used in simple link tests +-lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' ++lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + # If no C compiler was specified, use CC. + LTCC=${LTCC-"$CC"} + ++# If no C compiler flags were specified, use CFLAGS. ++LTCFLAGS=${LTCFLAGS-"$CFLAGS"} ++ + # Allow CC to be a program name with arguments. + compiler=$CC + + ++# save warnings/boilerplate of simple test code ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_compile_test_code" >conftest.$ac_ext ++eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_compiler_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_link_test_code" >conftest.$ac_ext ++eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_linker_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + CC=${GCJ-"gcj"} + compiler=$CC + compiler_GCJ=$CC ++for cc_temp in $compiler""; do ++ case $cc_temp in ++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; ++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ++ + + # GCJ did not exist at the time GCC didn't implicitly link libc in. + archive_cmds_need_lc_GCJ=no + ++old_archive_cmds_GCJ=$old_archive_cmds ++ + + lt_prog_compiler_no_builtin_flag_GCJ= + +@@ -15796,18 +15819,20 @@ + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:15802: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:15825: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:15806: \$? = $ac_status" >&5 ++ echo "$as_me:15829: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test ! -s conftest.err; then ++ # So say no if there are warnings other than the usual output. ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi +@@ -15868,6 +15893,11 @@ + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + ++ interix3*) ++ # Interix 3.x gcc -fpic/-fPIC options generate broken code. ++ # Instead, we relocate shared libraries at runtime. ++ ;; ++ + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. +@@ -15884,7 +15914,7 @@ + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -15910,6 +15940,16 @@ + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; ++ darwin*) ++ # PIC is the default on this platform ++ # Common symbols not allowed in MH_DYLIB files ++ case $cc_basename in ++ xlc*) ++ lt_prog_compiler_pic_GCJ='-qnocommon' ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ ;; ++ esac ++ ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being +@@ -15921,7 +15961,7 @@ + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. +- case "$host_cpu" in ++ case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; +@@ -15945,12 +15985,19 @@ + ;; + + linux*) +- case $CC in ++ case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; ++ pgcc* | pgf77* | pgf90* | pgf95*) ++ # Portland Group compilers (*not* the Pentium gcc compiler, ++ # which looks to be a dead project) ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ lt_prog_compiler_pic_GCJ='-fpic' ++ lt_prog_compiler_static_GCJ='-Bstatic' ++ ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. +@@ -15965,15 +16012,15 @@ + lt_prog_compiler_static_GCJ='-non_shared' + ;; + +- sco3.2v5*) +- lt_prog_compiler_pic_GCJ='-Kpic' +- lt_prog_compiler_static_GCJ='-dn' +- ;; +- + solaris*) +- lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' ++ case $cc_basename in ++ f77* | f90* | f95*) ++ lt_prog_compiler_wl_GCJ='-Qoption ld ';; ++ *) ++ lt_prog_compiler_wl_GCJ='-Wl,';; ++ esac + ;; + + sunos4*) +@@ -15982,7 +16029,7 @@ + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ++ sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' +@@ -15995,6 +16042,17 @@ + fi + ;; + ++ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ lt_prog_compiler_pic_GCJ='-KPIC' ++ lt_prog_compiler_static_GCJ='-Bstatic' ++ ;; ++ ++ unicos*) ++ lt_prog_compiler_wl_GCJ='-Wl,' ++ lt_prog_compiler_can_build_shared_GCJ=no ++ ;; ++ + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' +@@ -16029,18 +16087,20 @@ + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:16035: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:16093: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 +- echo "$as_me:16039: \$? = $ac_status" >&5 ++ echo "$as_me:16097: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test ! -s conftest.err; then ++ # So say no if there are warnings other than the usual output. ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi +@@ -16061,7 +16121,7 @@ + fi + + fi +-case "$host_os" in ++case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= +@@ -16071,6 +16131,48 @@ + ;; + esac + ++# ++# Check to make sure the static flag actually works. ++# ++wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" ++echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 ++echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 ++if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ lt_prog_compiler_static_works_GCJ=no ++ save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS $lt_tmp_static_flag" ++ printf "$lt_simple_link_test_code" > conftest.$ac_ext ++ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then ++ # The linker can only warn and ignore the option if not recognized ++ # So say no if there are warnings ++ if test -s conftest.err; then ++ # Append any errors to the config.log. ++ cat conftest.err 1>&5 ++ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp ++ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 ++ if diff conftest.exp conftest.er2 >/dev/null; then ++ lt_prog_compiler_static_works_GCJ=yes ++ fi ++ else ++ lt_prog_compiler_static_works_GCJ=yes ++ fi ++ fi ++ $rm conftest* ++ LDFLAGS="$save_LDFLAGS" ++ ++fi ++echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 ++echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6 ++ ++if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then ++ : ++else ++ lt_prog_compiler_static_GCJ= ++fi ++ ++ + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 + echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 + if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then +@@ -16089,23 +16191,25 @@ + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ ++ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:16095: $lt_compile\"" >&5) ++ (eval echo "\"\$as_me:16197: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 +- echo "$as_me:16099: \$? = $ac_status" >&5 ++ echo "$as_me:16201: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings +- if test ! -s out/conftest.err; then ++ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp ++ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 ++ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi +- chmod u+w . ++ chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation +@@ -16181,6 +16285,16 @@ + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= ++ # Just being paranoid about ensuring that cc_basename is set. ++ for cc_temp in $compiler""; do ++ case $cc_temp in ++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; ++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) +@@ -16191,6 +16305,10 @@ + with_gnu_ld=no + fi + ;; ++ interix*) ++ # we just hope/assume this is gcc and not c89 (= MSVC++) ++ with_gnu_ld=yes ++ ;; + openbsd*) + with_gnu_ld=no + ;; +@@ -16201,6 +16319,27 @@ + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + ++ # Set some defaults for GNU ld with shared library support. These ++ # are reset later if shared libraries are not supported. Putting them ++ # here allows them to be overridden if necessary. ++ runpath_var=LD_RUN_PATH ++ hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' ++ export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' ++ # ancient GNU ld didn't support --whole-archive et. al. ++ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then ++ whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' ++ else ++ whole_archive_flag_spec_GCJ= ++ fi ++ supports_anon_versioning=no ++ case `$LD -v 2>/dev/null` in ++ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 ++ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... ++ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... ++ *\ 2.11.*) ;; # other 2.11 versions ++ *) supports_anon_versioning=yes ;; ++ esac ++ + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) +@@ -16251,10 +16390,10 @@ + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes +- export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ++ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then +- archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +@@ -16263,9 +16402,55 @@ + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ +- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' ++ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else +- ld_shlibs=no ++ ld_shlibs_GCJ=no ++ fi ++ ;; ++ ++ interix3*) ++ hardcode_direct_GCJ=no ++ hardcode_shlibpath_var_GCJ=no ++ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ++ export_dynamic_flag_spec_GCJ='${wl}-E' ++ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. ++ # Instead, shared libraries are loaded at an image base (0x10000000 by ++ # default) and relocated if they conflict, which is a slow very memory ++ # consuming and fragmenting process. To avoid this, we pick a random, ++ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link ++ # time. Moving up from 0x10000000 also allows more sbrk(2) space. ++ archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ++ ;; ++ ++ linux*) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ tmp_addflag= ++ case $cc_basename,$host_cpu in ++ pgcc*) # Portland Group C compiler ++ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ tmp_addflag=' $pic_flag' ++ ;; ++ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers ++ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ++ tmp_addflag=' $pic_flag -Mnomain' ;; ++ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 ++ tmp_addflag=' -i_dynamic' ;; ++ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 ++ tmp_addflag=' -i_dynamic -nofor_main' ;; ++ ifc* | ifort*) # Intel Fortran compiler ++ tmp_addflag=' -nofor_main' ;; ++ esac ++ archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' ++ ++ if test $supports_anon_versioning = yes; then ++ archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ ++ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ ++ $echo "local: *; };" >> $output_objdir/$libname.ver~ ++ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' ++ fi ++ else ++ ld_shlibs_GCJ=no + fi + ;; + +@@ -16279,7 +16464,7 @@ + fi + ;; + +- solaris* | sysv5*) ++ solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 +@@ -16300,6 +16485,33 @@ + fi + ;; + ++ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) ++ case `$LD -v 2>&1` in ++ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ++ ld_shlibs_GCJ=no ++ cat <<_LT_EOF 1>&2 ++ ++*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not ++*** reliably create shared libraries on SCO systems. Therefore, libtool ++*** is disabling shared libraries support. We urge you to upgrade GNU ++*** binutils to release 2.16.91.0.3 or newer. Another option is to modify ++*** your PATH or compiler configuration so that the native linker is ++*** used, and then restart. ++ ++_LT_EOF ++ ;; ++ *) ++ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then ++ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' ++ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' ++ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' ++ else ++ ld_shlibs_GCJ=no ++ fi ++ ;; ++ esac ++ ;; ++ + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= +@@ -16307,31 +16519,6 @@ + hardcode_shlibpath_var_GCJ=no + ;; + +- linux*) +- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then +- tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_cmds_GCJ="$tmp_archive_cmds" +- supports_anon_versioning=no +- case `$LD -v 2>/dev/null` in +- *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 +- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... +- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... +- *\ 2.11.*) ;; # other 2.11 versions +- *) supports_anon_versioning=yes ;; +- esac +- if test $supports_anon_versioning = yes; then +- archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ +-cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +-$echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- else +- archive_expsym_cmds_GCJ="$tmp_archive_cmds" +- fi +- else +- ld_shlibs_GCJ=no +- fi +- ;; +- + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +@@ -16342,16 +16529,11 @@ + ;; + esac + +- if test "$ld_shlibs_GCJ" = yes; then +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' +- export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec_GCJ= +- fi ++ if test "$ld_shlibs_GCJ" = no; then ++ runpath_var= ++ hardcode_libdir_flag_spec_GCJ= ++ export_dynamic_flag_spec_GCJ= ++ whole_archive_flag_spec_GCJ= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) +@@ -16363,7 +16545,7 @@ + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes +- if test "$GCC" = yes && test -z "$link_static_flag"; then ++ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported +@@ -16397,6 +16579,7 @@ + break + fi + done ++ ;; + esac + + exp_sym_flag='-bexport' +@@ -16415,7 +16598,7 @@ + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then +- case $host_os in aix4.012|aix4.012.*) ++ case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` +@@ -16434,8 +16617,12 @@ + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi ++ ;; + esac + shared_flag='-shared' ++ if test "$aix_use_runtimelinking" = yes; then ++ shared_flag="$shared_flag "'${wl}-G' ++ fi + else + # not using gcc + if test "$host_cpu" = ia64; then +@@ -16443,11 +16630,11 @@ + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else +- if test "$aix_use_runtimelinking" = yes; then ++ if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' +- fi ++ fi + fi + fi + +@@ -16512,12 +16699,12 @@ + if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" +- archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" ++ archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" +- archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" ++ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +@@ -16577,13 +16764,11 @@ + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' +- # -bexpall does not export symbols beginning with underscore (_) +- always_export_symbols_GCJ=yes + # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec_GCJ=' ' ++ whole_archive_flag_spec_GCJ='$convenience' + archive_cmds_need_lc_GCJ=yes +- # This is similar to how AIX traditionally builds it's shared libraries. +- archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' ++ # This is similar to how AIX traditionally builds its shared libraries. ++ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; +@@ -16596,7 +16781,7 @@ + ld_shlibs_GCJ=no + ;; + +- bsdi4*) ++ bsdi[45]*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + +@@ -16617,57 +16802,57 @@ + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' +- fix_srcfile_path='`cygpath -w "$srcfile"`' ++ fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) +- if test "$GXX" = yes ; then +- archive_cmds_need_lc_GCJ=no +- case "$host_os" in +- rhapsody* | darwin1.[012]) +- allow_undefined_flag_GCJ='-undefined suppress' +- ;; +- *) # Darwin 1.3 on +- if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then +- allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' +- else +- case ${MACOSX_DEPLOYMENT_TARGET} in +- 10.[012]) +- allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' +- ;; +- 10.*) +- allow_undefined_flag_GCJ='-undefined dynamic_lookup' +- ;; +- esac +- fi +- ;; ++ case $host_os in ++ rhapsody* | darwin1.[012]) ++ allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ++ ;; ++ *) # Darwin 1.3 on ++ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then ++ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ else ++ case ${MACOSX_DEPLOYMENT_TARGET} in ++ 10.[012]) ++ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ++ ;; ++ 10.*) ++ allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ++ ;; ++ esac ++ fi ++ ;; + esac +- lt_int_apple_cc_single_mod=no +- output_verbose_link_cmd='echo' +- if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then +- lt_int_apple_cc_single_mod=yes +- fi +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- else +- archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' +- fi +- module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' +- # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's +- if test "X$lt_int_apple_cc_single_mod" = Xyes ; then +- archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- else +- archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ archive_cmds_need_lc_GCJ=no + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported +- whole_archive_flag_spec_GCJ='-all_load $convenience' ++ whole_archive_flag_spec_GCJ='' + link_all_deplibs_GCJ=yes ++ if test "$GCC" = yes ; then ++ output_verbose_link_cmd='echo' ++ archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' ++ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else +- ld_shlibs_GCJ=no ++ case $cc_basename in ++ xlc*) ++ output_verbose_link_cmd='echo' ++ archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' ++ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' ++ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds ++ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ++ ;; ++ *) ++ ld_shlibs_GCJ=no ++ ;; ++ esac + fi + ;; + +@@ -16701,7 +16886,7 @@ + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd* | kfreebsd*-gnu) ++ freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes +@@ -16724,47 +16909,62 @@ + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + +- hpux10* | hpux11*) ++ hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then +- case "$host_cpu" in +- hppa*64*|ia64*) ++ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ fi ++ if test "$with_gnu_ld" = no; then ++ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_GCJ=: ++ ++ hardcode_direct_GCJ=yes ++ export_dynamic_flag_spec_GCJ='${wl}-E' ++ ++ # hardcode_minus_L: Not really in the search PATH, ++ # but as the default location of the library. ++ hardcode_minus_L_GCJ=yes ++ fi ++ ;; ++ ++ hpux11*) ++ if test "$GCC" = yes -a "$with_gnu_ld" = no; then ++ case $host_cpu in ++ hppa*64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; ++ ia64*) ++ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ++ ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else +- case "$host_cpu" in +- hppa*64*|ia64*) +- archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ++ case $host_cpu in ++ hppa*64*) ++ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ ;; ++ ia64*) ++ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) +- archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ++ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then +- case "$host_cpu" in +- hppa*64*) +- hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' ++ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' ++ hardcode_libdir_separator_GCJ=: ++ ++ case $host_cpu in ++ hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' +- hardcode_libdir_separator_GCJ=: +- hardcode_direct_GCJ=no +- hardcode_shlibpath_var_GCJ=no +- ;; +- ia64*) +- hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no +- +- # hardcode_minus_L: Not really in the search PATH, +- # but as the default location of the library. +- hardcode_minus_L_GCJ=yes + ;; + *) +- hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + +@@ -16812,6 +17012,7 @@ + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else +@@ -16857,7 +17058,7 @@ + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ +- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' ++ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' +@@ -16865,21 +17066,15 @@ + hardcode_libdir_separator_GCJ=: + ;; + +- sco3.2v5*) +- archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var_GCJ=no +- export_dynamic_flag_spec_GCJ='${wl}-Bexport' +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ;; +- + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then ++ wlarc='${wl}' + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else ++ wlarc='' + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +@@ -16888,8 +17083,18 @@ + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; ++ *) ++ # The compiler driver will combine linker options so we ++ # cannot just pass the convience library names through ++ # without $wl, iff we do not link with $LD. ++ # Luckily, gcc supports the same syntax we need for Sun Studio. ++ # Supported since Solaris 2.6 (maybe 2.5.1?) ++ case $wlarc in ++ '') ++ whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; ++ *) ++ whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; ++ esac ;; + esac + link_all_deplibs_GCJ=yes + ;; +@@ -16946,36 +17151,45 @@ + fi + ;; + +- sysv4.2uw2*) +- archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct_GCJ=yes +- hardcode_minus_L_GCJ=no ++ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) ++ no_undefined_flag_GCJ='${wl}-z,text' ++ archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no +- hardcode_runpath_var=yes +- runpath_var=LD_RUN_PATH +- ;; ++ runpath_var='LD_RUN_PATH' + +- sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) +- no_undefined_flag_GCJ='${wl}-z ${wl}text' + if test "$GCC" = yes; then +- archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else +- archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var_GCJ=no + ;; + +- sysv5*) +- no_undefined_flag_GCJ=' -z text' +- # $CC -shared without GNU ld will not create a library from C++ +- # object files and a static libstdc++, better avoid it by now +- archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' +- hardcode_libdir_flag_spec_GCJ= ++ sysv5* | sco3.2v5* | sco5v6*) ++ # Note: We can NOT use -z defs as we might desire, because we do not ++ # link with -lc, and that would cause any symbols used from libc to ++ # always be unresolved, which means just about no library would ++ # ever link correctly. If we're not using GNU ld we use -z text ++ # though, which does catch some bad symbols but isn't as heavy-handed ++ # as -z defs. ++ no_undefined_flag_GCJ='${wl}-z,text' ++ allow_undefined_flag_GCJ='${wl}-z,nodefs' ++ archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no ++ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' ++ hardcode_libdir_separator_GCJ=':' ++ link_all_deplibs_GCJ=yes ++ export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var='LD_RUN_PATH' ++ ++ if test "$GCC" = yes; then ++ archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ else ++ archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ++ fi + ;; + + uts4*) +@@ -16994,11 +17208,6 @@ + echo "${ECHO_T}$ld_shlibs_GCJ" >&6 + test "$ld_shlibs_GCJ" = no && can_build_shared=no + +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- + # + # Do we need to explicitly link libc? + # +@@ -17031,6 +17240,7 @@ + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ ++ pic_flag=$lt_prog_compiler_pic_GCJ + compiler_flags=-v + linker_flags=-v + verstring= +@@ -17161,1341 +17371,559 @@ + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH +- ;; +- +-bsdi4*) +- version_type=linux +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" +- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- # the default ld.so.conf also contains /usr/contrib/lib and +- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow +- # libtool to hard-code these into programs +- ;; +- +-cygwin* | mingw* | pw32*) +- version_type=windows +- shrext_cmds=".dll" +- need_version=no +- need_lib_prefix=no +- +- case $GCC,$host_os in +- yes,cygwin* | yes,mingw* | yes,pw32*) +- library_names_spec='$libname.dll.a' +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $rm \$dlpath' +- shlibpath_overrides_runpath=yes +- +- case $host_os in +- cygwin*) +- # Cygwin DLLs use 'cyg' prefix rather than 'lib' +- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" +- ;; +- mingw*) +- # MinGW DLLs use traditional 'lib' prefix +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` +- if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then +- # It is most probably a Windows format PATH printed by +- # mingw gcc, but we are running on Cygwin. Gcc prints its search +- # path with ; separators, and with drive letters. We can handle the +- # drive letters (cygwin fileutils understands them), so leave them, +- # especially as we might pass files found there to a mingw objdump, +- # which wouldn't understand a cygwinified path. Ahh. +- sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` +- else +- sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi +- ;; +- pw32*) +- # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' +- ;; +- esac +- ;; +- +- *) +- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' +- ;; +- esac +- dynamic_linker='Win32 ld.exe' +- # FIXME: first we should search . and the directory the executable is in +- shlibpath_var=PATH +- ;; +- +-darwin* | rhapsody*) +- dynamic_linker="$host_os dyld" +- version_type=darwin +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' +- soname_spec='${libname}${release}${major}$shared_ext' +- shlibpath_overrides_runpath=yes +- shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' +- # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. +- if test "$GCC" = yes; then +- sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` +- else +- sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' +- fi +- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' +- ;; +- +-dgux*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-freebsd1*) +- dynamic_linker=no +- ;; +- +-kfreebsd*-gnu) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='GNU ld.so' +- ;; +- +-freebsd*) +- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` +- version_type=freebsd-$objformat +- case $version_type in +- freebsd-elf*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- need_version=no +- need_lib_prefix=no +- ;; +- freebsd-*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' +- need_version=yes +- ;; +- esac +- shlibpath_var=LD_LIBRARY_PATH +- case $host_os in +- freebsd2*) +- shlibpath_overrides_runpath=yes +- ;; +- freebsd3.01* | freebsdelf3.01*) +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- *) # from 3.2 on +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- esac +- ;; +- +-gnu*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- hardcode_into_libs=yes +- ;; +- +-hpux9* | hpux10* | hpux11*) +- # Give a soname corresponding to the major version so that dld.sl refuses to +- # link against other versions. +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- case "$host_cpu" in +- ia64*) +- shrext_cmds='.so' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.so" +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- if test "X$HPUX_IA64_MODE" = X32; then +- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" +- else +- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" +- fi +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- hppa*64*) +- shrext_cmds='.sl' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- *) +- shrext_cmds='.sl' +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- esac +- # HP-UX runs *really* slowly unless shared libraries are mode 555. +- postinstall_cmds='chmod 555 $lib' +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $host_os in +- nonstopux*) version_type=nonstopux ;; +- *) +- if test "$lt_cv_prog_gnu_ld" = yes; then +- version_type=linux +- else +- version_type=irix +- fi ;; +- esac +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' +- case $host_os in +- irix5* | nonstopux*) +- libsuff= shlibsuff= +- ;; +- *) +- case $LD in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") +- libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") +- libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") +- libsuff=64 shlibsuff=64 libmagic=64-bit;; +- *) libsuff= shlibsuff= libmagic=never-match;; +- esac +- ;; +- esac +- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" +- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" +- hardcode_into_libs=yes +- ;; +- +-# No shared lib support for Linux oldld, aout, or coff. +-linux*oldld* | linux*aout* | linux*coff*) +- dynamic_linker=no +- ;; +- +-# This must be Linux ELF. +-linux*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- # This implies no fast_install, which is unacceptable. +- # Some rework will be needed to allow for fast_install +- # before this can be enabled. +- hardcode_into_libs=yes +- +- # find out which ABI we are using +- libsuff= +- case "$host_cpu" in +- x86_64*|s390x*|powerpc64*) +- echo '#line 17429 "configure"' > conftest.$ac_ext +- if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; then +- case `/usr/bin/file conftest.$ac_objext` in +- *64-bit*) +- libsuff=64 +- sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +- esac +- +- # Append ld.so.conf contents to the search path +- if test -f /etc/ld.so.conf; then +- lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" +- fi +- +- # We used to test for /lib/ld.so.1 and disable shared libraries on +- # powerpc, because MkLinux only supported shared libraries with the +- # GNU dynamic linker. Since this was broken with cross compilers, +- # most powerpc-linux boxes support dynamic linking these days and +- # people can always --disable-shared, the test was removed, and we +- # assume the GNU/Linux dynamic linker is in use. +- dynamic_linker='GNU/Linux ld.so' +- ;; +- +-knetbsd*-gnu) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='GNU ld.so' +- ;; +- +-netbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- dynamic_linker='NetBSD (a.out) ld.so' +- else +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='NetBSD ld.elf_so' +- fi +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- +-newsos6) +- version_type=linux +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- ;; +- +-nto-qnx*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- ;; +- +-openbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=yes +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- case $host_os in +- openbsd2.[89] | openbsd2.[89].*) +- shlibpath_overrides_runpath=no +- ;; +- *) +- shlibpath_overrides_runpath=yes +- ;; +- esac +- else +- shlibpath_overrides_runpath=yes +- fi +- ;; +- +-os2*) +- libname_spec='$name' +- shrext_cmds=".dll" +- need_lib_prefix=no +- library_names_spec='$libname${shared_ext} $libname.a' +- dynamic_linker='OS/2 ld.exe' +- shlibpath_var=LIBPATH +- ;; +- +-osf3* | osf4* | osf5*) +- version_type=osf +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" +- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +- ;; +- +-sco3.2v5*) +- version_type=osf +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-solaris*) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- # ldd complains unless libraries are executable +- postinstall_cmds='chmod +x $lib' +- ;; +- +-sunos4*) +- version_type=sunos +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- if test "$with_gnu_ld" = yes; then +- need_lib_prefix=no +- fi +- need_version=yes +- ;; +- +-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- version_type=linux +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- case $host_vendor in +- sni) +- shlibpath_overrides_runpath=no +- need_lib_prefix=no +- export_dynamic_flag_spec='${wl}-Blargedynsym' +- runpath_var=LD_RUN_PATH +- ;; +- siemens) +- need_lib_prefix=no +- ;; +- motorola) +- need_lib_prefix=no +- need_version=no +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' +- ;; +- esac +- ;; +- +-sysv4*MP*) +- if test -d /usr/nec ;then +- version_type=linux +- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' +- soname_spec='$libname${shared_ext}.$major' +- shlibpath_var=LD_LIBRARY_PATH +- fi +- ;; +- +-uts4*) +- version_type=linux +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-*) +- dynamic_linker=no +- ;; +-esac +-echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +-echo "${ECHO_T}$dynamic_linker" >&6 +-test "$dynamic_linker" = no && can_build_shared=no +- +-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +-hardcode_action_GCJ= +-if test -n "$hardcode_libdir_flag_spec_GCJ" || \ +- test -n "$runpath_var GCJ" || \ +- test "X$hardcode_automatic_GCJ"="Xyes" ; then +- +- # We can hardcode non-existant directories. +- if test "$hardcode_direct_GCJ" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && +- test "$hardcode_minus_L_GCJ" != no; then +- # Linking always hardcodes the temporary library directory. +- hardcode_action_GCJ=relink +- else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- hardcode_action_GCJ=immediate +- fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- hardcode_action_GCJ=unsupported +-fi +-echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +-echo "${ECHO_T}$hardcode_action_GCJ" >&6 +- +-if test "$hardcode_action_GCJ" = relink; then +- # Fast installation is not supported +- enable_fast_install=no +-elif test "$shlibpath_overrides_runpath" = yes || +- test "$enable_shared" = no; then +- # Fast installation is not necessary +- enable_fast_install=needless +-fi +- +-striplib= +-old_striplib= +-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then +- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" +- test -z "$striplib" && striplib="$STRIP --strip-unneeded" +- echo "$as_me:$LINENO: result: yes" >&5 +-echo "${ECHO_T}yes" >&6 +-else +-# FIXME - insert some real tests, host_os isn't really good enough +- case $host_os in +- darwin*) +- if test -n "$STRIP" ; then +- striplib="$STRIP -x" +- echo "$as_me:$LINENO: result: yes" >&5 +-echo "${ECHO_T}yes" >&6 +- else +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +-fi +- ;; +- *) +- echo "$as_me:$LINENO: result: no" >&5 +-echo "${ECHO_T}no" >&6 +- ;; +- esac +-fi +- +-if test "x$enable_dlopen" != xyes; then +- enable_dlopen=unknown +- enable_dlopen_self=unknown +- enable_dlopen_self_static=unknown +-else +- lt_cv_dlopen=no +- lt_cv_dlopen_libs= +- +- case $host_os in +- beos*) +- lt_cv_dlopen="load_add_on" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ;; +- +- mingw* | pw32*) +- lt_cv_dlopen="LoadLibrary" +- lt_cv_dlopen_libs= +- ;; +- +- cygwin*) +- lt_cv_dlopen="dlopen" +- lt_cv_dlopen_libs= +- ;; +- +- darwin*) +- # if libdl is installed we need to link against it +- echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +-if test "${ac_cv_lib_dl_dlopen+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldl $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +- +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dlopen (); +-int +-main () +-{ +-dlopen (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_c_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_dl_dlopen=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-ac_cv_lib_dl_dlopen=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +-if test $ac_cv_lib_dl_dlopen = yes; then +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else +- +- lt_cv_dlopen="dyld" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- +-fi +- +- ;; +- +- *) +- echo "$as_me:$LINENO: checking for shl_load" >&5 +-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +-if test "${ac_cv_func_shl_load+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +-/* Define shl_load to an innocuous variant, in case declares shl_load. +- For example, HP-UX 11i declares gettimeofday. */ +-#define shl_load innocuous_shl_load +- +-/* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char shl_load (); below. +- Prefer to if __STDC__ is defined, since +- exists even on freestanding compilers. */ +- +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif +- +-#undef shl_load +- +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-{ +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char shl_load (); +-/* The GNU C library defines this for functions which it implements +- to always fail with ENOSYS. Some functions are actually named +- something starting with __ and the normal name is an alias. */ +-#if defined (__stub_shl_load) || defined (__stub___shl_load) +-choke me +-#else +-char (*f) () = shl_load; +-#endif +-#ifdef __cplusplus +-} +-#endif +- +-int +-main () +-{ +-return f != shl_load; +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_c_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_func_shl_load=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-ac_cv_func_shl_load=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +-echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +-if test $ac_cv_func_shl_load = yes; then +- lt_cv_dlopen="shl_load" +-else +- echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +-if test "${ac_cv_lib_dld_shl_load+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldld $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +- +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char shl_load (); +-int +-main () +-{ +-shl_load (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_c_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_dld_shl_load=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-ac_cv_lib_dld_shl_load=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +-if test $ac_cv_lib_dld_shl_load = yes; then +- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +-else +- echo "$as_me:$LINENO: checking for dlopen" >&5 +-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +-if test "${ac_cv_func_dlopen+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +-/* Define dlopen to an innocuous variant, in case declares dlopen. +- For example, HP-UX 11i declares gettimeofday. */ +-#define dlopen innocuous_dlopen +- +-/* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char dlopen (); below. +- Prefer to if __STDC__ is defined, since +- exists even on freestanding compilers. */ +- +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif +- +-#undef dlopen +- +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-{ +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dlopen (); +-/* The GNU C library defines this for functions which it implements +- to always fail with ENOSYS. Some functions are actually named +- something starting with __ and the normal name is an alias. */ +-#if defined (__stub_dlopen) || defined (__stub___dlopen) +-choke me +-#else +-char (*f) () = dlopen; +-#endif +-#ifdef __cplusplus +-} +-#endif +- +-int +-main () +-{ +-return f != dlopen; +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_c_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_func_dlopen=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-ac_cv_func_dlopen=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +-echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +-if test $ac_cv_func_dlopen = yes; then +- lt_cv_dlopen="dlopen" +-else +- echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +-if test "${ac_cv_lib_dl_dlopen+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldl $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +- +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dlopen (); +-int +-main () +-{ +-dlopen (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_c_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_dl_dlopen=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-ac_cv_lib_dl_dlopen=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +-if test $ac_cv_lib_dl_dlopen = yes; then +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else +- echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +-if test "${ac_cv_lib_svld_dlopen+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lsvld $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ +- +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dlopen (); +-int +-main () +-{ +-dlopen (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_c_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_svld_dlopen=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-ac_cv_lib_svld_dlopen=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +-if test $ac_cv_lib_svld_dlopen = yes; then +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +-else +- echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +-if test "${ac_cv_lib_dld_dld_link+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldld $LIBS" +-cat >conftest.$ac_ext <<_ACEOF +-/* confdefs.h. */ +-_ACEOF +-cat confdefs.h >>conftest.$ac_ext +-cat >>conftest.$ac_ext <<_ACEOF +-/* end confdefs.h. */ ++ ;; + +-/* Override any gcc2 internal prototype to avoid an error. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-/* We use char because int might match the return type of a gcc2 +- builtin and then its argument prototype would still apply. */ +-char dld_link (); +-int +-main () +-{ +-dld_link (); +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.$ac_objext conftest$ac_exeext +-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>conftest.er1 +- ac_status=$? +- grep -v '^ *+' conftest.er1 >conftest.err +- rm -f conftest.er1 +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && +- { ac_try='test -z "$ac_c_werror_flag" +- || test ! -s conftest.err' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; } && +- { ac_try='test -s conftest$ac_exeext' +- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then +- ac_cv_lib_dld_dld_link=yes +-else +- echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 ++bsdi[45]*) ++ version_type=linux ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" ++ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" ++ # the default ld.so.conf also contains /usr/contrib/lib and ++ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow ++ # libtool to hard-code these into programs ++ ;; + +-ac_cv_lib_dld_dld_link=no +-fi +-rm -f conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +-if test $ac_cv_lib_dld_dld_link = yes; then +- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +-fi ++cygwin* | mingw* | pw32*) ++ version_type=windows ++ shrext_cmds=".dll" ++ need_version=no ++ need_lib_prefix=no + ++ case $GCC,$host_os in ++ yes,cygwin* | yes,mingw* | yes,pw32*) ++ library_names_spec='$libname.dll.a' ++ # DLL is installed to $(libdir)/../bin by postinstall_cmds ++ postinstall_cmds='base_file=`basename \${file}`~ ++ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ ++ dldir=$destdir/`dirname \$dlpath`~ ++ test -d \$dldir || mkdir -p \$dldir~ ++ $install_prog $dir/$dlname \$dldir/$dlname~ ++ chmod a+x \$dldir/$dlname' ++ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ ++ dlpath=$dir/\$dldll~ ++ $rm \$dlpath' ++ shlibpath_overrides_runpath=yes + +-fi ++ case $host_os in ++ cygwin*) ++ # Cygwin DLLs use 'cyg' prefix rather than 'lib' ++ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ++ ;; ++ mingw*) ++ # MinGW DLLs use traditional 'lib' prefix ++ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` ++ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then ++ # It is most probably a Windows format PATH printed by ++ # mingw gcc, but we are running on Cygwin. Gcc prints its search ++ # path with ; separators, and with drive letters. We can handle the ++ # drive letters (cygwin fileutils understands them), so leave them, ++ # especially as we might pass files found there to a mingw objdump, ++ # which wouldn't understand a cygwinified path. Ahh. ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` ++ else ++ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ++ fi ++ ;; ++ pw32*) ++ # pw32 DLLs use 'pw' prefix rather than 'lib' ++ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ++ ;; ++ esac ++ ;; + ++ *) ++ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ++ ;; ++ esac ++ dynamic_linker='Win32 ld.exe' ++ # FIXME: first we should search . and the directory the executable is in ++ shlibpath_var=PATH ++ ;; + +-fi ++darwin* | rhapsody*) ++ dynamic_linker="$host_os dyld" ++ version_type=darwin ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' ++ soname_spec='${libname}${release}${major}$shared_ext' ++ shlibpath_overrides_runpath=yes ++ shlibpath_var=DYLD_LIBRARY_PATH ++ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' ++ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. ++ if test "$GCC" = yes; then ++ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` ++ else ++ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' ++ fi ++ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ++ ;; + ++dgux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; + +-fi ++freebsd1*) ++ dynamic_linker=no ++ ;; + ++kfreebsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; + +-fi ++freebsd* | dragonfly*) ++ # DragonFly does not have aout. When/if they implement a new ++ # versioning mechanism, adjust this. ++ if test -x /usr/bin/objformat; then ++ objformat=`/usr/bin/objformat` ++ else ++ case $host_os in ++ freebsd[123]*) objformat=aout ;; ++ *) objformat=elf ;; ++ esac ++ fi ++ version_type=freebsd-$objformat ++ case $version_type in ++ freebsd-elf*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ need_version=no ++ need_lib_prefix=no ++ ;; ++ freebsd-*) ++ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' ++ need_version=yes ++ ;; ++ esac ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_os in ++ freebsd2*) ++ shlibpath_overrides_runpath=yes ++ ;; ++ freebsd3.[01]* | freebsdelf3.[01]*) ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ ++ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; ++ freebsd*) # from 4.6 on ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; ++ esac ++ ;; + ++gnu*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ ;; + +-fi ++hpux9* | hpux10* | hpux11*) ++ # Give a soname corresponding to the major version so that dld.sl refuses to ++ # link against other versions. ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ case $host_cpu in ++ ia64*) ++ shrext_cmds='.so' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.so" ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ if test "X$HPUX_IA64_MODE" = X32; then ++ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" ++ else ++ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" ++ fi ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ hppa*64*) ++ shrext_cmds='.sl' ++ hardcode_into_libs=yes ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH ++ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" ++ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ++ ;; ++ *) ++ shrext_cmds='.sl' ++ dynamic_linker="$host_os dld.sl" ++ shlibpath_var=SHLIB_PATH ++ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ ;; ++ esac ++ # HP-UX runs *really* slowly unless shared libraries are mode 555. ++ postinstall_cmds='chmod 555 $lib' ++ ;; ++ ++interix3*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ ;; + ++irix5* | irix6* | nonstopux*) ++ case $host_os in ++ nonstopux*) version_type=nonstopux ;; ++ *) ++ if test "$lt_cv_prog_gnu_ld" = yes; then ++ version_type=linux ++ else ++ version_type=irix ++ fi ;; ++ esac ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' ++ case $host_os in ++ irix5* | nonstopux*) ++ libsuff= shlibsuff= ++ ;; ++ *) ++ case $LD in # libtool.m4 will add one of these switches to LD ++ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") ++ libsuff= shlibsuff= libmagic=32-bit;; ++ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") ++ libsuff=32 shlibsuff=N32 libmagic=N32;; ++ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") ++ libsuff=64 shlibsuff=64 libmagic=64-bit;; ++ *) libsuff= shlibsuff= libmagic=never-match;; ++ esac + ;; + esac ++ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" ++ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" ++ hardcode_into_libs=yes ++ ;; + +- if test "x$lt_cv_dlopen" != xno; then +- enable_dlopen=yes +- else +- enable_dlopen=no +- fi +- +- case $lt_cv_dlopen in +- dlopen) +- save_CPPFLAGS="$CPPFLAGS" +- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" +- +- save_LDFLAGS="$LDFLAGS" +- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +- +- save_LIBS="$LIBS" +- LIBS="$lt_cv_dlopen_libs $LIBS" +- +- echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +-if test "${lt_cv_dlopen_self+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self=cross +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext < +-#endif +- +-#include ++# No shared lib support for Linux oldld, aout, or coff. ++linux*oldld* | linux*aout* | linux*coff*) ++ dynamic_linker=no ++ ;; + +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif ++# This must be Linux ELF. ++linux*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes + +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif ++ # find out which ABI we are using ++ libsuff= ++ case "$host_cpu" in ++ x86_64*|s390x*|powerpc64*) ++ echo '#line 17666 "configure"' > conftest.$ac_ext ++ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; then ++ case `/usr/bin/file conftest.$ac_objext` in ++ *64-bit*) ++ libsuff=64 ++ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ esac + +-#ifdef __cplusplus +-extern "C" void exit (int); +-#endif ++ # Append ld.so.conf contents to the search path ++ if test -f /etc/ld.so.conf; then ++ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` ++ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra" ++ fi + +-void fnord() { int i=42;} +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; ++ # We used to test for /lib/ld.so.1 and disable shared libraries on ++ # powerpc, because MkLinux only supported shared libraries with the ++ # GNU dynamic linker. Since this was broken with cross compilers, ++ # most powerpc-linux boxes support dynamic linking these days and ++ # people can always --disable-shared, the test was removed, and we ++ # assume the GNU/Linux dynamic linker is in use. ++ dynamic_linker='GNU/Linux ld.so' ++ ;; + +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- /* dlclose (self); */ +- } ++knetbsd*-gnu) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ hardcode_into_libs=yes ++ dynamic_linker='GNU ld.so' ++ ;; + +- exit (status); +-} +-EOF +- if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_unknown|x*) lt_cv_dlopen_self=no ;; +- esac +- else : +- # compilation failed +- lt_cv_dlopen_self=no ++netbsd*) ++ version_type=sunos ++ need_lib_prefix=no ++ need_version=no ++ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ dynamic_linker='NetBSD (a.out) ld.so' ++ else ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ dynamic_linker='NetBSD ld.elf_so' + fi +-fi +-rm -fr conftest* +- ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ ;; + +-fi +-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +-echo "${ECHO_T}$lt_cv_dlopen_self" >&6 ++newsos6) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ ;; + +- if test "x$lt_cv_dlopen_self" = xyes; then +- LDFLAGS="$LDFLAGS $link_static_flag" +- echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +-if test "${lt_cv_dlopen_self_static+set}" = set; then +- echo $ECHO_N "(cached) $ECHO_C" >&6 +-else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self_static=cross +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext < +-#endif ++openbsd*) ++ version_type=sunos ++ sys_lib_dlsearch_path_spec="/usr/lib" ++ need_lib_prefix=no ++ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. ++ case $host_os in ++ openbsd3.3 | openbsd3.3.*) need_version=yes ;; ++ *) need_version=no ;; ++ esac ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then ++ case $host_os in ++ openbsd2.[89] | openbsd2.[89].*) ++ shlibpath_overrides_runpath=no ++ ;; ++ *) ++ shlibpath_overrides_runpath=yes ++ ;; ++ esac ++ else ++ shlibpath_overrides_runpath=yes ++ fi ++ ;; + +-#include ++os2*) ++ libname_spec='$name' ++ shrext_cmds=".dll" ++ need_lib_prefix=no ++ library_names_spec='$libname${shared_ext} $libname.a' ++ dynamic_linker='OS/2 ld.exe' ++ shlibpath_var=LIBPATH ++ ;; + +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif ++osf3* | osf4* | osf5*) ++ version_type=osf ++ need_lib_prefix=no ++ need_version=no ++ soname_spec='${libname}${release}${shared_ext}$major' ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ shlibpath_var=LD_LIBRARY_PATH ++ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" ++ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ++ ;; + +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif ++solaris*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ hardcode_into_libs=yes ++ # ldd complains unless libraries are executable ++ postinstall_cmds='chmod +x $lib' ++ ;; + +-#ifdef __cplusplus +-extern "C" void exit (int); +-#endif ++sunos4*) ++ version_type=sunos ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' ++ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=yes ++ if test "$with_gnu_ld" = yes; then ++ need_lib_prefix=no ++ fi ++ need_version=yes ++ ;; + +-void fnord() { int i=42;} +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; ++sysv4 | sysv4.3*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ case $host_vendor in ++ sni) ++ shlibpath_overrides_runpath=no ++ need_lib_prefix=no ++ export_dynamic_flag_spec='${wl}-Blargedynsym' ++ runpath_var=LD_RUN_PATH ++ ;; ++ siemens) ++ need_lib_prefix=no ++ ;; ++ motorola) ++ need_lib_prefix=no ++ need_version=no ++ shlibpath_overrides_runpath=no ++ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ++ ;; ++ esac ++ ;; + +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- /* dlclose (self); */ +- } ++sysv4*MP*) ++ if test -d /usr/nec ;then ++ version_type=linux ++ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' ++ soname_spec='$libname${shared_ext}.$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ fi ++ ;; + +- exit (status); +-} +-EOF +- if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; ++sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) ++ version_type=freebsd-elf ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ hardcode_into_libs=yes ++ if test "$with_gnu_ld" = yes; then ++ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' ++ shlibpath_overrides_runpath=no ++ else ++ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' ++ shlibpath_overrides_runpath=yes ++ case $host_os in ++ sco3.2v5*) ++ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ++ ;; + esac +- else : +- # compilation failed +- lt_cv_dlopen_self_static=no + fi +-fi +-rm -fr conftest* ++ sys_lib_dlsearch_path_spec='/usr/lib' ++ ;; + ++uts4*) ++ version_type=linux ++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ++ soname_spec='${libname}${release}${shared_ext}$major' ++ shlibpath_var=LD_LIBRARY_PATH ++ ;; ++ ++*) ++ dynamic_linker=no ++ ;; ++esac ++echo "$as_me:$LINENO: result: $dynamic_linker" >&5 ++echo "${ECHO_T}$dynamic_linker" >&6 ++test "$dynamic_linker" = no && can_build_shared=no + ++variables_saved_for_relink="PATH $shlibpath_var $runpath_var" ++if test "$GCC" = yes; then ++ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + fi +-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 +- fi + +- CPPFLAGS="$save_CPPFLAGS" +- LDFLAGS="$save_LDFLAGS" +- LIBS="$save_LIBS" +- ;; +- esac ++echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 ++echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 ++hardcode_action_GCJ= ++if test -n "$hardcode_libdir_flag_spec_GCJ" || \ ++ test -n "$runpath_var_GCJ" || \ ++ test "X$hardcode_automatic_GCJ" = "Xyes" ; then + +- case $lt_cv_dlopen_self in +- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; +- *) enable_dlopen_self=unknown ;; +- esac ++ # We can hardcode non-existant directories. ++ if test "$hardcode_direct_GCJ" != no && ++ # If the only mechanism to avoid hardcoding is shlibpath_var, we ++ # have to relink, otherwise we might link with an installed library ++ # when we should be linking with a yet-to-be-installed one ++ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && ++ test "$hardcode_minus_L_GCJ" != no; then ++ # Linking always hardcodes the temporary library directory. ++ hardcode_action_GCJ=relink ++ else ++ # We can link without hardcoding, and we can hardcode nonexisting dirs. ++ hardcode_action_GCJ=immediate ++ fi ++else ++ # We cannot hardcode anything, or else we can only hardcode existing ++ # directories. ++ hardcode_action_GCJ=unsupported ++fi ++echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 ++echo "${ECHO_T}$hardcode_action_GCJ" >&6 + +- case $lt_cv_dlopen_self_static in +- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; +- *) enable_dlopen_self_static=unknown ;; +- esac ++if test "$hardcode_action_GCJ" = relink; then ++ # Fast installation is not supported ++ enable_fast_install=no ++elif test "$shlibpath_overrides_runpath" = yes || ++ test "$enable_shared" = no; then ++ # Fast installation is not necessary ++ enable_fast_install=needless + fi + + +@@ -18512,7 +17940,7 @@ + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. +- for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ +@@ -18613,6 +18041,12 @@ + # The host system. + host_alias=$host_alias + host=$host ++host_os=$host_os ++ ++# The build system. ++build_alias=$build_alias ++build=$build ++build_os=$build_os + + # An echo program that does not interpret backslashes. + echo=$lt_echo +@@ -18624,12 +18058,18 @@ + # A C compiler. + LTCC=$lt_LTCC + ++# LTCC compiler flags. ++LTCFLAGS=$lt_LTCFLAGS ++ + # A language-specific compiler. + CC=$lt_compiler_GCJ + + # Is the compiler the GNU C compiler? + with_gcc=$GCC_GCJ + ++gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` ++gcc_ver=\`gcc -dumpversion\` ++ + # An ERE matcher. + EGREP=$lt_EGREP + +@@ -18689,7 +18129,7 @@ + # Does compiler simultaneously support -c and -o options? + compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +-# Must we lock files when doing compilation ? ++# Must we lock files when doing compilation? + need_locks=$lt_need_locks + + # Do we need the lib prefix for modules? +@@ -18763,11 +18203,11 @@ + + # Dependencies to place before the objects being linked to create a + # shared library. +-predep_objects=$lt_predep_objects_GCJ ++predep_objects=\`echo $lt_predep_objects_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place after the objects being linked to create a + # shared library. +-postdep_objects=$lt_postdep_objects_GCJ ++postdep_objects=\`echo $lt_postdep_objects_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place before the objects being linked to create a + # shared library. +@@ -18779,7 +18219,7 @@ + + # The library search path used internally by the compiler when linking + # a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ ++compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$lt_deplibs_check_method +@@ -18859,7 +18299,7 @@ + link_all_deplibs=$link_all_deplibs_GCJ + + # Compile-time system search path for libraries +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Run-time system search path for libraries + sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +@@ -18933,15 +18373,42 @@ + # If no C compiler was specified, use CC. + LTCC=${LTCC-"$CC"} + ++# If no C compiler flags were specified, use CFLAGS. ++LTCFLAGS=${LTCFLAGS-"$CFLAGS"} ++ + # Allow CC to be a program name with arguments. + compiler=$CC + + ++# save warnings/boilerplate of simple test code ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_compile_test_code" >conftest.$ac_ext ++eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_compiler_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ac_outfile=conftest.$ac_objext ++printf "$lt_simple_link_test_code" >conftest.$ac_ext ++eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err ++_lt_linker_boilerplate=`cat conftest.err` ++$rm conftest* ++ ++ + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + CC=${RC-"windres"} + compiler=$CC + compiler_RC=$CC ++for cc_temp in $compiler""; do ++ case $cc_temp in ++ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; ++ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; ++ \-*) ;; ++ *) break;; ++ esac ++done ++cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ++ + lt_cv_prog_compiler_c_o_RC=yes + + # The else clause should only fire when bootstrapping the +@@ -18957,7 +18424,7 @@ + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. +- for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ ++ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ +@@ -19058,6 +18525,12 @@ + # The host system. + host_alias=$host_alias + host=$host ++host_os=$host_os ++ ++# The build system. ++build_alias=$build_alias ++build=$build ++build_os=$build_os + + # An echo program that does not interpret backslashes. + echo=$lt_echo +@@ -19069,12 +18542,18 @@ + # A C compiler. + LTCC=$lt_LTCC + ++# LTCC compiler flags. ++LTCFLAGS=$lt_LTCFLAGS ++ + # A language-specific compiler. + CC=$lt_compiler_RC + + # Is the compiler the GNU C compiler? + with_gcc=$GCC_RC + ++gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\` ++gcc_ver=\`gcc -dumpversion\` ++ + # An ERE matcher. + EGREP=$lt_EGREP + +@@ -19134,7 +18613,7 @@ + # Does compiler simultaneously support -c and -o options? + compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +-# Must we lock files when doing compilation ? ++# Must we lock files when doing compilation? + need_locks=$lt_need_locks + + # Do we need the lib prefix for modules? +@@ -19208,11 +18687,11 @@ + + # Dependencies to place before the objects being linked to create a + # shared library. +-predep_objects=$lt_predep_objects_RC ++predep_objects=\`echo $lt_predep_objects_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place after the objects being linked to create a + # shared library. +-postdep_objects=$lt_postdep_objects_RC ++postdep_objects=\`echo $lt_postdep_objects_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Dependencies to place before the objects being linked to create a + # shared library. +@@ -19224,7 +18703,7 @@ + + # The library search path used internally by the compiler when linking + # a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path_RC ++compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Method to check whether dependent libraries are shared objects. + deplibs_check_method=$lt_deplibs_check_method +@@ -19304,7 +18783,7 @@ + link_all_deplibs=$link_all_deplibs_RC + + # Compile-time system search path for libraries +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec ++sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\` + + # Run-time system search path for libraries + sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +@@ -21223,7 +20702,7 @@ + /usr/openwin/share/include' + + if test "$ac_x_includes" = no; then +- # Guess where to find include files, by looking for Intrinsic.h. ++ # Guess where to find include files, by looking for Xlib.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF + /* confdefs.h. */ +@@ -21231,7 +20710,7 @@ + cat confdefs.h >>conftest.$ac_ext + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ +-#include ++#include + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +@@ -21258,7 +20737,7 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do +- if test -r "$ac_dir/X11/Intrinsic.h"; then ++ if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir + break + fi +@@ -21272,18 +20751,18 @@ + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS +- LIBS="-lXt $LIBS" ++ LIBS="-lX11 $LIBS" + cat >conftest.$ac_ext <<_ACEOF + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ +-#include ++#include + int + main () + { +-XtMalloc (0) ++XrmInitialize () + ; + return 0; + } +@@ -26060,7 +25539,7 @@ + + + cat >>confdefs.h <<_ACEOF +-#define ALLIANCE_VERSION "5.0 20070718" ++#define ALLIANCE_VERSION "5.0" + _ACEOF + + cat >>confdefs.h <<_ACEOF +@@ -26375,6 +25854,7 @@ + PHL_DLL_VERSION=1:9:0 + + ++ + VRD_DLL_VERSION=3:4:0 + + +@@ -26479,6 +25959,13 @@ + GRAAL_VERSION=$GRAAL_MAJOR_VERSION.$GRAAL_MINOR_VERSION + + ++GROWSTK_MAJOR_VERSION=1 ++ ++GROWSTK_MINOR_VERSION=5 ++ ++GROWSTK_VERSION=$GROWSTK_MAJOR_VERSION.$GROWSTK_MINOR_VERSION ++ ++ + K2F_MAJOR_VERSION=1 + + K2F_MINOR_VERSION=1 +@@ -26549,6 +26036,13 @@ + OCP_VERSION=$OCP_MAJOR_VERSION.$OCP_MINOR_VERSION + + ++OCR_MAJOR_VERSION=1 ++ ++OCR_MINOR_VERSION=0 ++ ++OCR_VERSION=$OCR_MAJOR_VERSION.$OCR_MINOR_VERSION ++ ++ + PAT2SPI_MAJOR_VERSION=1 + + PAT2SPI_MINOR_VERSION=1 +@@ -26556,6 +26050,19 @@ + PAT2SPI_VERSION=$PAT2SPI_MAJOR_VERSION.$PAT2SPI_MINOR_VERSION + + ++EMULBS_MAJOR_VERSION=3 ++ ++EMULBS_MINOR_VERSION=2 ++ ++EMULBS_VERSION=$EMULBS_MAJOR_VERSION.$EMULBS_MINOR_VERSION ++ ++PCBS_MAJOR_VERSION=2 ++ ++PCBS_MINOR_VERSION=1 ++ ++PCBS_VERSION=$PCBS_MAJOR_VERSION.$PCBS_MINOR_VERSION ++ ++ + PROOF_MAJOR_VERSION=4 + + PROOF_MINOR_VERSION=9 +@@ -26605,6 +26112,13 @@ + VASY_VERSION=$VASY_MAJOR_VERSION.$VASY_MINOR_VERSION + + ++VST2XNF_MAJOR_VERSION=1 ++ ++VST2XNF_MINOR_VERSION=0 ++ ++VST2XNF_VERSION=$VST2XNF_MAJOR_VERSION.$VST2XNF_MINOR_VERSION ++ ++ + + XFSM_MAJOR_VERSION=1 + +@@ -26613,6 +26127,13 @@ + XFSM_VERSION=$XFSM_MAJOR_VERSION.$XFSM_MINOR_VERSION + + ++XGRA_MAJOR_VERSION=1 ++ ++XGRA_MINOR_VERSION=5 ++ ++XGRA_VERSION=$XGRA_MAJOR_VERSION.$XGRA_MINOR_VERSION ++ ++ + XPAT_MAJOR_VERSION=1 + + XPAT_MINOR_VERSION=4 +@@ -26641,10 +26162,10 @@ + DOC_VERSION=$DOC_MAJOR_VERSION.$DOC_MINOR_VERSION + + +-TOOLSDIRS="mbk mbkal mbkap mbkedif mbkhilo mbkmg mbkspice mbkvhdl mbkvrlog mbkvti mbkvhdlg aut rds rdscif rdsgds elp abl bdd log btr vex ctl ctp abe abt abv fsm fks fvh ftl rtn rtd scl vbh vbl vpn vpd vvh vtl pat ppt phl druc beh bhl bvl alcban asimut attila b2f boog boom cells distrib dreal exp flatbeh flatlo flatph fmi fsp genlib genpat graal k2f l2p loon lvx lynx m2e mips_asm mocha nero ocp pat2spi proof ring s2r scapin sea syf vasy x2y xfsm xpat xsch xvpn documentation" ++TOOLSDIRS="mbk mbkal mbkap mbkedif mbkhilo mbkmg mbkspice mbkvhdl mbkvrlog mbkvti mbkvhdlg aut rds rdscif rdsgds elp abl bdd log btr vex ctl ctp abe abt abv fsm fks fvh ftl rtn rtd scl vbh vbl vpn vpd vvh vtl pat ppt phl gcp druc beh bhl bvl alcban asimut attila b2f boog boom cells distrib dreal exp flatbeh flatlo flatph fmi fsp genlib genpat graal growstk k2f l2p loon lvx lynx m2e mips_asm mocha nero ocp ocr pat2spi pcbs proof ring s2r scapin sea syf vasy vst2xnf x2y xfsm xgra xpat xsch xvpn documentation" + + +- ac_config_files="$ac_config_files Makefile distrib/alliance.spec distrib/etc/alc_env.sh distrib/etc/alc_env.csh mbk/Makefile mbk/man1/Makefile mbk/man3/Makefile mbk/man5/Makefile mbk/src/Makefile mbkal/Makefile mbkal/doc/Makefile mbkal/src/Makefile mbkap/Makefile mbkap/src/Makefile mbkedif/Makefile mbkedif/src/Makefile mbkhilo/Makefile mbkhilo/src/Makefile mbkmg/Makefile mbkmg/src/Makefile mbkspice/Makefile mbkspice/doc/Makefile mbkspice/etc/Makefile mbkspice/src/Makefile mbkvhdl/Makefile mbkvhdl/src/Makefile mbkvrlog/Makefile mbkvrlog/src/Makefile mbkvti/Makefile mbkvti/src/Makefile mbkvhdlg/Makefile mbkvhdlg/src/Makefile aut/Makefile aut/man1/Makefile aut/man3/Makefile aut/src/Makefile rds/Makefile rds/etc/Makefile rds/man3/Makefile rds/src/Makefile rdscif/Makefile rdscif/src/Makefile rdsgds/Makefile rdsgds/src/Makefile elp/Makefile elp/etc/Makefile elp/src/Makefile abl/Makefile abl/man1/Makefile abl/man3/Makefile abl/src/Makefile bdd/Makefile bdd/man1/Makefile bdd/man3/Makefile bdd/src/Makefile log/Makefile log/man1/Makefile log/man3/Makefile log/src/Makefile btr/Makefile btr/src/Makefile vex/Makefile vex/src/Makefile ctl/Makefile ctl/man5/Makefile ctl/src/Makefile ctp/Makefile ctp/src/Makefile abe/Makefile abe/src/Makefile abt/Makefile abt/src/Makefile abv/Makefile abv/src/Makefile fsm/Makefile fsm/man1/Makefile fsm/man5/Makefile fsm/src/Makefile fks/Makefile fks/src/Makefile fvh/Makefile fvh/src/Makefile ftl/Makefile ftl/src/Makefile rtn/Makefile rtn/src/Makefile rtd/Makefile rtd/src/Makefile scl/Makefile scl/src/Makefile vbh/Makefile vbh/src/Makefile vbl/Makefile vbl/src/Makefile vpn/Makefile vpn/src/Makefile vpd/Makefile vpd/src/Makefile vvh/Makefile vvh/src/Makefile vtl/Makefile vtl/src/Makefile pat/Makefile pat/doc/Makefile pat/src/Makefile ppt/Makefile ppt/src/Makefile phl/Makefile phl/src/Makefile druc/Makefile druc/man1/Makefile druc/src/Makefile beh/Makefile beh/man3/Makefile beh/src/Makefile bhl/Makefile bhl/src/Makefile bvl/Makefile bvl/src/Makefile alcban/Makefile alcban/man1/Makefile alcban/src/Makefile asimut/Makefile asimut/man1/Makefile asimut/src/Makefile attila/Makefile attila/doc/Makefile attila/doc/attila/Makefile attila/doc/man1/Makefile attila/etc/Makefile attila/src/Makefile b2f/Makefile b2f/src/Makefile boog/Makefile boog/doc/Makefile boog/src/Makefile boom/Makefile boom/man1/Makefile boom/src/Makefile cells/Makefile cells/doc/Makefile cells/src/Makefile cells/src/dp_sxlib/Makefile cells/src/padlib/Makefile cells/src/pxlib/Makefile cells/src/ramlib/Makefile cells/src/rf2lib/Makefile cells/src/rflib/Makefile cells/src/romlib/Makefile cells/src/sxlib/Makefile distrib/Makefile distrib/doc/Makefile distrib/etc/Makefile dreal/Makefile dreal/etc/Makefile dreal/man1/Makefile dreal/src/Makefile exp/Makefile exp/doc/Makefile exp/src/Makefile flatbeh/Makefile flatbeh/doc/Makefile flatbeh/src/Makefile flatlo/Makefile flatlo/doc/Makefile flatlo/src/Makefile flatph/Makefile flatph/doc/Makefile flatph/src/Makefile fmi/Makefile fmi/man1/Makefile fmi/src/Makefile fsp/Makefile fsp/man1/Makefile fsp/src/Makefile genlib/Makefile genlib/doc/Makefile genlib/doc/genlib/Makefile genlib/man1/Makefile genlib/man3/Makefile genlib/src/Makefile genpat/Makefile genpat/doc/Makefile genpat/doc/man1/Makefile genpat/doc/man3/Makefile genpat/src/Makefile graal/Makefile graal/etc/Makefile graal/man1/Makefile graal/src/Makefile k2f/Makefile k2f/man1/Makefile k2f/src/Makefile l2p/Makefile l2p/man1/Makefile l2p/src/Makefile loon/Makefile loon/doc/Makefile loon/src/Makefile lvx/Makefile lvx/doc/Makefile lvx/src/Makefile lynx/Makefile lynx/man1/Makefile lynx/src/Makefile m2e/Makefile m2e/doc/Makefile m2e/doc/man1/Makefile m2e/src/Makefile mips_asm/Makefile mips_asm/src/Makefile mocha/Makefile mocha/man1/Makefile mocha/src/Makefile nero/Makefile nero/doc/Makefile nero/doc/man1/Makefile nero/doc/nero/Makefile nero/src/Makefile ocp/Makefile ocp/doc/Makefile ocp/src/Makefile ocp/src/common/Makefile ocp/src/placer/Makefile pat2spi/Makefile pat2spi/man1/Makefile pat2spi/src/Makefile proof/Makefile proof/man1/Makefile proof/src/Makefile ring/Makefile ring/doc/Makefile ring/src/Makefile s2r/Makefile s2r/doc/Makefile s2r/src/Makefile scapin/Makefile scapin/etc/Makefile scapin/man1/Makefile scapin/src/Makefile sea/Makefile sea/etc/Makefile sea/src/Makefile syf/Makefile syf/man1/Makefile syf/src/Makefile vasy/Makefile vasy/man1/Makefile vasy/man5/Makefile vasy/src/Makefile x2y/Makefile x2y/doc/Makefile x2y/src/Makefile xfsm/Makefile xfsm/etc/Makefile xfsm/src/Makefile xpat/Makefile xpat/etc/Makefile xpat/man1/Makefile xpat/src/Makefile xsch/Makefile xsch/etc/Makefile xsch/man1/Makefile xsch/src/Makefile xvpn/Makefile xvpn/etc/Makefile xvpn/src/Makefile documentation/Makefile documentation/tutorials/Makefile" ++ ac_config_files="$ac_config_files Makefile distrib/alliance.spec distrib/etc/alc_env.sh distrib/etc/alc_env.csh mbk/Makefile mbk/man1/Makefile mbk/man3/Makefile mbk/man5/Makefile mbk/src/Makefile mbkal/Makefile mbkal/doc/Makefile mbkal/src/Makefile mbkap/Makefile mbkap/src/Makefile mbkedif/Makefile mbkedif/src/Makefile mbkhilo/Makefile mbkhilo/src/Makefile mbkmg/Makefile mbkmg/src/Makefile mbkspice/Makefile mbkspice/doc/Makefile mbkspice/etc/Makefile mbkspice/src/Makefile mbkvhdl/Makefile mbkvhdl/src/Makefile mbkvrlog/Makefile mbkvrlog/src/Makefile mbkvti/Makefile mbkvti/src/Makefile mbkvhdlg/Makefile mbkvhdlg/src/Makefile aut/Makefile aut/man1/Makefile aut/man3/Makefile aut/src/Makefile rds/Makefile rds/etc/Makefile rds/man3/Makefile rds/src/Makefile rdscif/Makefile rdscif/src/Makefile rdsgds/Makefile rdsgds/src/Makefile elp/Makefile elp/etc/Makefile elp/src/Makefile abl/Makefile abl/man1/Makefile abl/man3/Makefile abl/src/Makefile bdd/Makefile bdd/man1/Makefile bdd/man3/Makefile bdd/src/Makefile log/Makefile log/man1/Makefile log/man3/Makefile log/src/Makefile btr/Makefile btr/src/Makefile vex/Makefile vex/src/Makefile ctl/Makefile ctl/man5/Makefile ctl/src/Makefile ctp/Makefile ctp/src/Makefile abe/Makefile abe/src/Makefile abt/Makefile abt/src/Makefile abv/Makefile abv/src/Makefile fsm/Makefile fsm/man1/Makefile fsm/man5/Makefile fsm/src/Makefile fks/Makefile fks/src/Makefile fvh/Makefile fvh/src/Makefile ftl/Makefile ftl/src/Makefile rtn/Makefile rtn/src/Makefile rtd/Makefile rtd/src/Makefile scl/Makefile scl/src/Makefile vbh/Makefile vbh/src/Makefile vbl/Makefile vbl/src/Makefile vpn/Makefile vpn/src/Makefile vpd/Makefile vpd/src/Makefile vvh/Makefile vvh/src/Makefile vtl/Makefile vtl/src/Makefile pat/Makefile pat/doc/Makefile pat/src/Makefile ppt/Makefile ppt/src/Makefile phl/Makefile phl/src/Makefile gcp/Makefile gcp/src/Makefile druc/Makefile druc/man1/Makefile druc/src/Makefile beh/Makefile beh/man3/Makefile beh/src/Makefile bhl/Makefile bhl/src/Makefile bvl/Makefile bvl/src/Makefile alcban/Makefile alcban/man1/Makefile alcban/src/Makefile asimut/Makefile asimut/man1/Makefile asimut/src/Makefile attila/Makefile attila/doc/Makefile attila/doc/attila/Makefile attila/doc/man1/Makefile attila/etc/Makefile attila/src/Makefile b2f/Makefile b2f/src/Makefile boog/Makefile boog/doc/Makefile boog/src/Makefile boom/Makefile boom/man1/Makefile boom/src/Makefile cells/Makefile cells/doc/Makefile cells/src/Makefile cells/src/dp_sxlib/Makefile cells/src/padlib/Makefile cells/src/pxlib/Makefile cells/src/ramlib/Makefile cells/src/rf2lib/Makefile cells/src/rflib/Makefile cells/src/romlib/Makefile cells/src/sxlib/Makefile distrib/Makefile distrib/doc/Makefile distrib/etc/Makefile dreal/Makefile dreal/etc/Makefile dreal/man1/Makefile dreal/src/Makefile exp/Makefile exp/doc/Makefile exp/src/Makefile flatbeh/Makefile flatbeh/doc/Makefile flatbeh/src/Makefile flatlo/Makefile flatlo/doc/Makefile flatlo/src/Makefile flatph/Makefile flatph/doc/Makefile flatph/src/Makefile fmi/Makefile fmi/man1/Makefile fmi/src/Makefile fsp/Makefile fsp/man1/Makefile fsp/src/Makefile genlib/Makefile genlib/doc/Makefile genlib/doc/genlib/Makefile genlib/man1/Makefile genlib/man3/Makefile genlib/src/Makefile genpat/Makefile genpat/doc/Makefile genpat/doc/man1/Makefile genpat/doc/man3/Makefile genpat/src/Makefile graal/Makefile graal/etc/Makefile graal/man1/Makefile graal/src/Makefile growstk/Makefile growstk/src/Makefile k2f/Makefile k2f/man1/Makefile k2f/src/Makefile l2p/Makefile l2p/man1/Makefile l2p/src/Makefile loon/Makefile loon/doc/Makefile loon/src/Makefile lvx/Makefile lvx/doc/Makefile lvx/src/Makefile lynx/Makefile lynx/man1/Makefile lynx/src/Makefile m2e/Makefile m2e/doc/Makefile m2e/doc/man1/Makefile m2e/src/Makefile mips_asm/Makefile mips_asm/src/Makefile mocha/Makefile mocha/man1/Makefile mocha/src/Makefile nero/Makefile nero/doc/Makefile nero/doc/man1/Makefile nero/doc/nero/Makefile nero/src/Makefile ocp/Makefile ocp/doc/Makefile ocp/src/Makefile ocp/src/common/Makefile ocp/src/placer/Makefile ocr/Makefile ocr/doc/Makefile ocr/src/Makefile ocr/src/include/Makefile ocr/src/rout/Makefile ocr/src/seg/Makefile ocr/src/util/Makefile pat2spi/Makefile pat2spi/man1/Makefile pat2spi/src/Makefile pcbs/Makefile pcbs/doc/Makefile pcbs/src/Makefile pcbs/src/bvl/Makefile pcbs/src/emulbs/Makefile pcbs/src/pcbs/Makefile proof/Makefile proof/man1/Makefile proof/src/Makefile ring/Makefile ring/doc/Makefile ring/src/Makefile s2r/Makefile s2r/doc/Makefile s2r/src/Makefile scapin/Makefile scapin/etc/Makefile scapin/man1/Makefile scapin/src/Makefile sea/Makefile sea/etc/Makefile sea/src/Makefile syf/Makefile syf/man1/Makefile syf/src/Makefile vasy/Makefile vasy/man1/Makefile vasy/man5/Makefile vasy/src/Makefile vst2xnf/Makefile vst2xnf/src/Makefile x2y/Makefile x2y/doc/Makefile x2y/src/Makefile xfsm/Makefile xfsm/etc/Makefile xfsm/src/Makefile xgra/Makefile xgra/etc/Makefile xgra/src/Makefile xpat/Makefile xpat/etc/Makefile xpat/man1/Makefile xpat/src/Makefile xsch/Makefile xsch/etc/Makefile xsch/man1/Makefile xsch/src/Makefile xvpn/Makefile xvpn/etc/Makefile xvpn/src/Makefile documentation/Makefile documentation/tutorials/Makefile" + cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure + # tests run on this system so they can be shared between configure +@@ -27357,6 +26878,8 @@ + "ppt/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES ppt/src/Makefile" ;; + "phl/Makefile" ) CONFIG_FILES="$CONFIG_FILES phl/Makefile" ;; + "phl/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES phl/src/Makefile" ;; ++ "gcp/Makefile" ) CONFIG_FILES="$CONFIG_FILES gcp/Makefile" ;; ++ "gcp/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES gcp/src/Makefile" ;; + "druc/Makefile" ) CONFIG_FILES="$CONFIG_FILES druc/Makefile" ;; + "druc/man1/Makefile" ) CONFIG_FILES="$CONFIG_FILES druc/man1/Makefile" ;; + "druc/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES druc/src/Makefile" ;; +@@ -27438,6 +26961,8 @@ + "graal/etc/Makefile" ) CONFIG_FILES="$CONFIG_FILES graal/etc/Makefile" ;; + "graal/man1/Makefile" ) CONFIG_FILES="$CONFIG_FILES graal/man1/Makefile" ;; + "graal/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES graal/src/Makefile" ;; ++ "growstk/Makefile" ) CONFIG_FILES="$CONFIG_FILES growstk/Makefile" ;; ++ "growstk/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES growstk/src/Makefile" ;; + "k2f/Makefile" ) CONFIG_FILES="$CONFIG_FILES k2f/Makefile" ;; + "k2f/man1/Makefile" ) CONFIG_FILES="$CONFIG_FILES k2f/man1/Makefile" ;; + "k2f/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES k2f/src/Makefile" ;; +@@ -27472,9 +26997,22 @@ + "ocp/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocp/src/Makefile" ;; + "ocp/src/common/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocp/src/common/Makefile" ;; + "ocp/src/placer/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocp/src/placer/Makefile" ;; ++ "ocr/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocr/Makefile" ;; ++ "ocr/doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocr/doc/Makefile" ;; ++ "ocr/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocr/src/Makefile" ;; ++ "ocr/src/include/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocr/src/include/Makefile" ;; ++ "ocr/src/rout/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocr/src/rout/Makefile" ;; ++ "ocr/src/seg/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocr/src/seg/Makefile" ;; ++ "ocr/src/util/Makefile" ) CONFIG_FILES="$CONFIG_FILES ocr/src/util/Makefile" ;; + "pat2spi/Makefile" ) CONFIG_FILES="$CONFIG_FILES pat2spi/Makefile" ;; + "pat2spi/man1/Makefile" ) CONFIG_FILES="$CONFIG_FILES pat2spi/man1/Makefile" ;; + "pat2spi/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES pat2spi/src/Makefile" ;; ++ "pcbs/Makefile" ) CONFIG_FILES="$CONFIG_FILES pcbs/Makefile" ;; ++ "pcbs/doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES pcbs/doc/Makefile" ;; ++ "pcbs/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES pcbs/src/Makefile" ;; ++ "pcbs/src/bvl/Makefile" ) CONFIG_FILES="$CONFIG_FILES pcbs/src/bvl/Makefile" ;; ++ "pcbs/src/emulbs/Makefile" ) CONFIG_FILES="$CONFIG_FILES pcbs/src/emulbs/Makefile" ;; ++ "pcbs/src/pcbs/Makefile" ) CONFIG_FILES="$CONFIG_FILES pcbs/src/pcbs/Makefile" ;; + "proof/Makefile" ) CONFIG_FILES="$CONFIG_FILES proof/Makefile" ;; + "proof/man1/Makefile" ) CONFIG_FILES="$CONFIG_FILES proof/man1/Makefile" ;; + "proof/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES proof/src/Makefile" ;; +@@ -27498,12 +27036,17 @@ + "vasy/man1/Makefile" ) CONFIG_FILES="$CONFIG_FILES vasy/man1/Makefile" ;; + "vasy/man5/Makefile" ) CONFIG_FILES="$CONFIG_FILES vasy/man5/Makefile" ;; + "vasy/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES vasy/src/Makefile" ;; ++ "vst2xnf/Makefile" ) CONFIG_FILES="$CONFIG_FILES vst2xnf/Makefile" ;; ++ "vst2xnf/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES vst2xnf/src/Makefile" ;; + "x2y/Makefile" ) CONFIG_FILES="$CONFIG_FILES x2y/Makefile" ;; + "x2y/doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES x2y/doc/Makefile" ;; + "x2y/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES x2y/src/Makefile" ;; + "xfsm/Makefile" ) CONFIG_FILES="$CONFIG_FILES xfsm/Makefile" ;; + "xfsm/etc/Makefile" ) CONFIG_FILES="$CONFIG_FILES xfsm/etc/Makefile" ;; + "xfsm/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES xfsm/src/Makefile" ;; ++ "xgra/Makefile" ) CONFIG_FILES="$CONFIG_FILES xgra/Makefile" ;; ++ "xgra/etc/Makefile" ) CONFIG_FILES="$CONFIG_FILES xgra/etc/Makefile" ;; ++ "xgra/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES xgra/src/Makefile" ;; + "xpat/Makefile" ) CONFIG_FILES="$CONFIG_FILES xpat/Makefile" ;; + "xpat/etc/Makefile" ) CONFIG_FILES="$CONFIG_FILES xpat/etc/Makefile" ;; + "xpat/man1/Makefile" ) CONFIG_FILES="$CONFIG_FILES xpat/man1/Makefile" ;; +@@ -27651,6 +27194,7 @@ + s,@host_cpu@,$host_cpu,;t t + s,@host_vendor@,$host_vendor,;t t + s,@host_os@,$host_os,;t t ++s,@SED@,$SED,;t t + s,@EGREP@,$EGREP,;t t + s,@LN_S@,$LN_S,;t t + s,@ECHO@,$ECHO,;t t +@@ -27670,7 +27214,6 @@ + s,@FFLAGS@,$FFLAGS,;t t + s,@ac_ct_F77@,$ac_ct_F77,;t t + s,@LIBTOOL@,$LIBTOOL,;t t +-s,@SED@,$SED,;t t + s,@X_CFLAGS@,$X_CFLAGS,;t t + s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t + s,@X_LIBS@,$X_LIBS,;t t +@@ -27783,6 +27326,9 @@ + s,@GRAAL_MAJOR_VERSION@,$GRAAL_MAJOR_VERSION,;t t + s,@GRAAL_MINOR_VERSION@,$GRAAL_MINOR_VERSION,;t t + s,@GRAAL_VERSION@,$GRAAL_VERSION,;t t ++s,@GROWSTK_MAJOR_VERSION@,$GROWSTK_MAJOR_VERSION,;t t ++s,@GROWSTK_MINOR_VERSION@,$GROWSTK_MINOR_VERSION,;t t ++s,@GROWSTK_VERSION@,$GROWSTK_VERSION,;t t + s,@K2F_MAJOR_VERSION@,$K2F_MAJOR_VERSION,;t t + s,@K2F_MINOR_VERSION@,$K2F_MINOR_VERSION,;t t + s,@K2F_VERSION@,$K2F_VERSION,;t t +@@ -27813,9 +27359,18 @@ + s,@OCP_MAJOR_VERSION@,$OCP_MAJOR_VERSION,;t t + s,@OCP_MINOR_VERSION@,$OCP_MINOR_VERSION,;t t + s,@OCP_VERSION@,$OCP_VERSION,;t t ++s,@OCR_MAJOR_VERSION@,$OCR_MAJOR_VERSION,;t t ++s,@OCR_MINOR_VERSION@,$OCR_MINOR_VERSION,;t t ++s,@OCR_VERSION@,$OCR_VERSION,;t t + s,@PAT2SPI_MAJOR_VERSION@,$PAT2SPI_MAJOR_VERSION,;t t + s,@PAT2SPI_MINOR_VERSION@,$PAT2SPI_MINOR_VERSION,;t t + s,@PAT2SPI_VERSION@,$PAT2SPI_VERSION,;t t ++s,@EMULBS_MAJOR_VERSION@,$EMULBS_MAJOR_VERSION,;t t ++s,@EMULBS_MINOR_VERSION@,$EMULBS_MINOR_VERSION,;t t ++s,@EMULBS_VERSION@,$EMULBS_VERSION,;t t ++s,@PCBS_MAJOR_VERSION@,$PCBS_MAJOR_VERSION,;t t ++s,@PCBS_MINOR_VERSION@,$PCBS_MINOR_VERSION,;t t ++s,@PCBS_VERSION@,$PCBS_VERSION,;t t + s,@PROOF_MAJOR_VERSION@,$PROOF_MAJOR_VERSION,;t t + s,@PROOF_MINOR_VERSION@,$PROOF_MINOR_VERSION,;t t + s,@PROOF_VERSION@,$PROOF_VERSION,;t t +@@ -27837,9 +27392,15 @@ + s,@VASY_MAJOR_VERSION@,$VASY_MAJOR_VERSION,;t t + s,@VASY_MINOR_VERSION@,$VASY_MINOR_VERSION,;t t + s,@VASY_VERSION@,$VASY_VERSION,;t t ++s,@VST2XNF_MAJOR_VERSION@,$VST2XNF_MAJOR_VERSION,;t t ++s,@VST2XNF_MINOR_VERSION@,$VST2XNF_MINOR_VERSION,;t t ++s,@VST2XNF_VERSION@,$VST2XNF_VERSION,;t t + s,@XFSM_MAJOR_VERSION@,$XFSM_MAJOR_VERSION,;t t + s,@XFSM_MINOR_VERSION@,$XFSM_MINOR_VERSION,;t t + s,@XFSM_VERSION@,$XFSM_VERSION,;t t ++s,@XGRA_MAJOR_VERSION@,$XGRA_MAJOR_VERSION,;t t ++s,@XGRA_MINOR_VERSION@,$XGRA_MINOR_VERSION,;t t ++s,@XGRA_VERSION@,$XGRA_VERSION,;t t + s,@XPAT_MAJOR_VERSION@,$XPAT_MAJOR_VERSION,;t t + s,@XPAT_MINOR_VERSION@,$XPAT_MINOR_VERSION,;t t + s,@XPAT_VERSION@,$XPAT_VERSION,;t t +diff -Naur alliance-5.0/configure.in alliance/configure.in +--- alliance-5.0/configure.in 2007-07-18 19:03:52.000000000 +0200 ++++ alliance/configure.in 2009-06-13 22:26:56.000000000 +0200 +@@ -378,6 +378,8 @@ + PHL_DLL_VERSION=1:9:0 + AC_SUBST(PHL_DLL_VERSION) + ++dnl Infos extracted from gcp/configure.in ++ + dnl Infos extracted from druc/configure.in + VRD_DLL_VERSION=3:4:0 + AC_SUBST(VRD_DLL_VERSION) +@@ -504,6 +506,14 @@ + GRAAL_VERSION=$GRAAL_MAJOR_VERSION.$GRAAL_MINOR_VERSION + AC_SUBST(GRAAL_VERSION) + ++dnl Infos extracted from growstk/configure.in ++GROWSTK_MAJOR_VERSION=1 ++AC_SUBST(GROWSTK_MAJOR_VERSION) ++GROWSTK_MINOR_VERSION=5 ++AC_SUBST(GROWSTK_MINOR_VERSION) ++GROWSTK_VERSION=$GROWSTK_MAJOR_VERSION.$GROWSTK_MINOR_VERSION ++AC_SUBST(GROWSTK_VERSION) ++ + dnl Infos extracted from k2f/configure.in + K2F_MAJOR_VERSION=1 + AC_SUBST(K2F_MAJOR_VERSION) +@@ -584,6 +594,14 @@ + OCP_VERSION=$OCP_MAJOR_VERSION.$OCP_MINOR_VERSION + AC_SUBST(OCP_VERSION) + ++dnl Infos extracted from ocr/configure.in ++OCR_MAJOR_VERSION=1 ++AC_SUBST(OCR_MAJOR_VERSION) ++OCR_MINOR_VERSION=0 ++AC_SUBST(OCR_MINOR_VERSION) ++OCR_VERSION=$OCR_MAJOR_VERSION.$OCR_MINOR_VERSION ++AC_SUBST(OCR_VERSION) ++ + dnl Infos extracted from pat2spi/configure.in + PAT2SPI_MAJOR_VERSION=1 + AC_SUBST(PAT2SPI_MAJOR_VERSION) +@@ -592,6 +610,20 @@ + PAT2SPI_VERSION=$PAT2SPI_MAJOR_VERSION.$PAT2SPI_MINOR_VERSION + AC_SUBST(PAT2SPI_VERSION) + ++dnl Infos extracted from pcbs/configure.in ++EMULBS_MAJOR_VERSION=3 ++AC_SUBST(EMULBS_MAJOR_VERSION) ++EMULBS_MINOR_VERSION=2 ++AC_SUBST(EMULBS_MINOR_VERSION) ++EMULBS_VERSION=$EMULBS_MAJOR_VERSION.$EMULBS_MINOR_VERSION ++AC_SUBST(EMULBS_VERSION) ++PCBS_MAJOR_VERSION=2 ++AC_SUBST(PCBS_MAJOR_VERSION) ++PCBS_MINOR_VERSION=1 ++AC_SUBST(PCBS_MINOR_VERSION) ++PCBS_VERSION=$PCBS_MAJOR_VERSION.$PCBS_MINOR_VERSION ++AC_SUBST(PCBS_VERSION) ++ + dnl Infos extracted from proof/configure.in + PROOF_MAJOR_VERSION=4 + AC_SUBST(PROOF_MAJOR_VERSION) +@@ -648,6 +680,14 @@ + VASY_VERSION=$VASY_MAJOR_VERSION.$VASY_MINOR_VERSION + AC_SUBST(VASY_VERSION) + ++dnl Infos extracted from vst2xnf/configure.in ++VST2XNF_MAJOR_VERSION=1 ++AC_SUBST(VST2XNF_MAJOR_VERSION) ++VST2XNF_MINOR_VERSION=0 ++AC_SUBST(VST2XNF_MINOR_VERSION) ++VST2XNF_VERSION=$VST2XNF_MAJOR_VERSION.$VST2XNF_MINOR_VERSION ++AC_SUBST(VST2XNF_VERSION) ++ + dnl Infos extracted from x2y/configure.in + + dnl Infos extracted from xfsm/configure.in +@@ -658,6 +698,14 @@ + XFSM_VERSION=$XFSM_MAJOR_VERSION.$XFSM_MINOR_VERSION + AC_SUBST(XFSM_VERSION) + ++dnl Infos extracted from xgra/configure.in ++XGRA_MAJOR_VERSION=1 ++AC_SUBST(XGRA_MAJOR_VERSION) ++XGRA_MINOR_VERSION=5 ++AC_SUBST(XGRA_MINOR_VERSION) ++XGRA_VERSION=$XGRA_MAJOR_VERSION.$XGRA_MINOR_VERSION ++AC_SUBST(XGRA_VERSION) ++ + dnl Infos extracted from xpat/configure.in + XPAT_MAJOR_VERSION=1 + AC_SUBST(XPAT_MAJOR_VERSION) +@@ -690,7 +738,7 @@ + DOC_VERSION=$DOC_MAJOR_VERSION.$DOC_MINOR_VERSION + AC_SUBST(DOC_VERSION) + +-TOOLSDIRS="mbk mbkal mbkap mbkedif mbkhilo mbkmg mbkspice mbkvhdl mbkvrlog mbkvti mbkvhdlg aut rds rdscif rdsgds elp abl bdd log btr vex ctl ctp abe abt abv fsm fks fvh ftl rtn rtd scl vbh vbl vpn vpd vvh vtl pat ppt phl druc beh bhl bvl alcban asimut attila b2f boog boom cells distrib dreal exp flatbeh flatlo flatph fmi fsp genlib genpat graal k2f l2p loon lvx lynx m2e mips_asm mocha nero ocp pat2spi proof ring s2r scapin sea syf vasy x2y xfsm xpat xsch xvpn documentation" ++TOOLSDIRS="mbk mbkal mbkap mbkedif mbkhilo mbkmg mbkspice mbkvhdl mbkvrlog mbkvti mbkvhdlg aut rds rdscif rdsgds elp abl bdd log btr vex ctl ctp abe abt abv fsm fks fvh ftl rtn rtd scl vbh vbl vpn vpd vvh vtl pat ppt phl gcp druc beh bhl bvl alcban asimut attila b2f boog boom cells distrib dreal exp flatbeh flatlo flatph fmi fsp genlib genpat graal growstk k2f l2p loon lvx lynx m2e mips_asm mocha nero ocp ocr pat2spi pcbs proof ring s2r scapin sea syf vasy vst2xnf x2y xfsm xgra xpat xsch xvpn documentation" + AC_SUBST(TOOLSDIRS) + + AC_OUTPUT([ +@@ -803,6 +851,8 @@ + ppt/src/Makefile + phl/Makefile + phl/src/Makefile ++gcp/Makefile ++gcp/src/Makefile + druc/Makefile + druc/man1/Makefile + druc/src/Makefile +@@ -884,6 +934,8 @@ + graal/etc/Makefile + graal/man1/Makefile + graal/src/Makefile ++growstk/Makefile ++growstk/src/Makefile + k2f/Makefile + k2f/man1/Makefile + k2f/src/Makefile +@@ -918,9 +970,22 @@ + ocp/src/Makefile + ocp/src/common/Makefile + ocp/src/placer/Makefile ++ocr/Makefile ++ocr/doc/Makefile ++ocr/src/Makefile ++ocr/src/include/Makefile ++ocr/src/rout/Makefile ++ocr/src/seg/Makefile ++ocr/src/util/Makefile + pat2spi/Makefile + pat2spi/man1/Makefile + pat2spi/src/Makefile ++pcbs/Makefile ++pcbs/doc/Makefile ++pcbs/src/Makefile ++pcbs/src/bvl/Makefile ++pcbs/src/emulbs/Makefile ++pcbs/src/pcbs/Makefile + proof/Makefile + proof/man1/Makefile + proof/src/Makefile +@@ -944,12 +1009,17 @@ + vasy/man1/Makefile + vasy/man5/Makefile + vasy/src/Makefile ++vst2xnf/Makefile ++vst2xnf/src/Makefile + x2y/Makefile + x2y/doc/Makefile + x2y/src/Makefile + xfsm/Makefile + xfsm/etc/Makefile + xfsm/src/Makefile ++xgra/Makefile ++xgra/etc/Makefile ++xgra/src/Makefile + xpat/Makefile + xpat/etc/Makefile + xpat/man1/Makefile +diff -Naur alliance-5.0/install-sh alliance/install-sh +--- alliance-5.0/install-sh 2007-07-18 19:04:04.000000000 +0200 ++++ alliance/install-sh 2009-06-13 18:20:47.000000000 +0200 +@@ -1,7 +1,7 @@ + #!/bin/sh + # install - install a program, script, or datafile + +-scriptversion=2004-09-10.20 ++scriptversion=2005-05-14.22 + + # This originates from X11R5 (mit/util/scripts/install.sh), which was + # later released in X11R6 (xc/config/util/install.sh) with the +@@ -109,7 +109,7 @@ + shift + continue;; + +- --help) echo "$usage"; exit 0;; ++ --help) echo "$usage"; exit $?;; + + -m) chmodcmd="$chmodprog $2" + shift +@@ -134,7 +134,7 @@ + shift + continue;; + +- --version) echo "$0 $scriptversion"; exit 0;; ++ --version) echo "$0 $scriptversion"; exit $?;; + + *) # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. +@@ -213,7 +213,7 @@ + fi + + # This sed command emulates the dirname command. +- dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` ++ dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + +@@ -226,7 +226,8 @@ + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' +- set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` ++ set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` ++ shift + IFS=$oIFS + + pathcomp= +@@ -295,7 +296,7 @@ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 +- (exit 1); exit ++ (exit 1); exit 1 + } + else + : +@@ -306,12 +307,12 @@ + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } +- fi || { (exit 1); exit; } ++ fi || { (exit 1); exit 1; } + done + + # The final little trick to "correctly" pass the exit status to the exit trap. + { +- (exit 0); exit ++ (exit 0); exit 0 + } + + # Local variables: +diff -Naur alliance-5.0/ltmain.sh alliance/ltmain.sh +--- alliance-5.0/ltmain.sh 2007-07-18 19:03:58.000000000 +0200 ++++ alliance/ltmain.sh 2007-04-06 21:44:56.000000000 +0200 +@@ -1,7 +1,7 @@ + # ltmain.sh - Provide generalized library-building support services. + # NOTE: Changing this file will not affect anything until you rerun configure. + # +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 + # Free Software Foundation, Inc. + # Originally by Gordon Matzigkeit , 1996 + # +@@ -17,7 +17,7 @@ + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a +@@ -33,9 +33,6 @@ + # function. + progpath="$0" + +-# RH: define SED for historic ltconfig's generated by Libtool 1.3 +-[ -z "$SED" ] && SED=sed +- + # The name of this program: + progname=`echo "$progpath" | $SED $basename` + modename="$progname" +@@ -46,9 +43,20 @@ + + PROGRAM=ltmain.sh + PACKAGE=libtool +-VERSION=1.5.6 +-TIMESTAMP=" (1.1220.2.95 2004/04/11 05:50:42)" ++VERSION=1.5.22 ++TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" + ++# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). ++if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '${1+"$@"}'='"$@"' ++ setopt NO_GLOB_SUBST ++else ++ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac ++fi + + # Check that we have a working $echo. + if test "X$1" = X--no-reexec; then +@@ -86,14 +94,15 @@ + Xsed="${SED}"' -e 1s/^X//' + sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' + # test EBCDIC or ASCII +-case `echo A|tr A '\301'` in +- A) # EBCDIC based system +- SP2NL="tr '\100' '\n'" +- NL2SP="tr '\r\n' '\100\100'" ++case `echo X|tr X '\101'` in ++ A) # ASCII based system ++ # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr ++ SP2NL='tr \040 \012' ++ NL2SP='tr \015\012 \040\040' + ;; +- *) # Assume ASCII based system +- SP2NL="tr '\040' '\012'" +- NL2SP="tr '\015\012' '\040\040'" ++ *) # EBCDIC based system ++ SP2NL='tr \100 \n' ++ NL2SP='tr \r\n \100\100' + ;; + esac + +@@ -102,16 +111,19 @@ + # These must not be set unconditionally because not all systems understand + # e.g. LANG=C (notably SCO). + # We save the old values to restore during execute mode. +-if test "${LC_ALL+set}" = set; then +- save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL +-fi +-if test "${LANG+set}" = set; then +- save_LANG="$LANG"; LANG=C; export LANG +-fi ++for lt_var in LANG LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES ++do ++ eval "if test \"\${$lt_var+set}\" = set; then ++ save_$lt_var=\$$lt_var ++ $lt_var=C ++ export $lt_var ++ fi" ++done + + # Make sure IFS has a sensible default +-: ${IFS=" +-"} ++lt_nl=' ++' ++IFS=" $lt_nl" + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + $echo "$modename: not configured to build any kind of library" 1>&2 +@@ -128,20 +140,62 @@ + show="$echo" + show_help= + execute_dlfiles= ++duplicate_deps=no ++preserve_args= + lo2o="s/\\.lo\$/.${objext}/" + o2lo="s/\\.${objext}\$/.lo/" ++extracted_archives= ++extracted_serial=0 + + ##################################### + # Shell function definitions: + # This seems to be the best place for them + ++# func_mktempdir [string] ++# Make a temporary directory that won't clash with other running ++# libtool processes, and avoids race conditions if possible. If ++# given, STRING is the basename for that directory. ++func_mktempdir () ++{ ++ my_template="${TMPDIR-/tmp}/${1-$progname}" ++ ++ if test "$run" = ":"; then ++ # Return a directory name, but don't create it in dry-run mode ++ my_tmpdir="${my_template}-$$" ++ else ++ ++ # If mktemp works, use that first and foremost ++ my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` ++ ++ if test ! -d "$my_tmpdir"; then ++ # Failing that, at least try and use $RANDOM to avoid a race ++ my_tmpdir="${my_template}-${RANDOM-0}$$" ++ ++ save_mktempdir_umask=`umask` ++ umask 0077 ++ $mkdir "$my_tmpdir" ++ umask $save_mktempdir_umask ++ fi ++ ++ # If we're not in dry-run mode, bomb out on failure ++ test -d "$my_tmpdir" || { ++ $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 ++ exit $EXIT_FAILURE ++ } ++ fi ++ ++ $echo "X$my_tmpdir" | $Xsed ++} ++ ++ + # func_win32_libid arg + # return the library type of file 'arg' + # + # Need a lot of goo to handle *both* DLLs and import libs + # Has to be a shell function in order to 'eat' the argument + # that is supplied when $file_magic_command is called. +-func_win32_libid () { ++func_win32_libid () ++{ + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in +@@ -152,12 +206,11 @@ + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ +- sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` +- if test "X$win32_nmres" = "Ximport" ; then +- win32_libid_type="x86 archive import" +- else +- win32_libid_type="x86 archive static" +- fi ++ $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'` ++ case $win32_nmres in ++ import*) win32_libid_type="x86 archive import";; ++ *) win32_libid_type="x86 archive static";; ++ esac + fi + ;; + *DLL*) +@@ -181,7 +234,8 @@ + # Only attempt this if the compiler in the base compile + # command doesn't match the default compiler. + # arg is usually of the form 'gcc ...' +-func_infer_tag () { ++func_infer_tag () ++{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do +@@ -238,12 +292,126 @@ + esac + fi + } ++ ++ ++# func_extract_an_archive dir oldlib ++func_extract_an_archive () ++{ ++ f_ex_an_ar_dir="$1"; shift ++ f_ex_an_ar_oldlib="$1" ++ ++ $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" ++ $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? ++ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then ++ : ++ else ++ $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 ++ exit $EXIT_FAILURE ++ fi ++} ++ ++# func_extract_archives gentop oldlib ... ++func_extract_archives () ++{ ++ my_gentop="$1"; shift ++ my_oldlibs=${1+"$@"} ++ my_oldobjs="" ++ my_xlib="" ++ my_xabs="" ++ my_xdir="" ++ my_status="" ++ ++ $show "${rm}r $my_gentop" ++ $run ${rm}r "$my_gentop" ++ $show "$mkdir $my_gentop" ++ $run $mkdir "$my_gentop" ++ my_status=$? ++ if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then ++ exit $my_status ++ fi ++ ++ for my_xlib in $my_oldlibs; do ++ # Extract the objects. ++ case $my_xlib in ++ [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; ++ *) my_xabs=`pwd`"/$my_xlib" ;; ++ esac ++ my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` ++ my_xlib_u=$my_xlib ++ while :; do ++ case " $extracted_archives " in ++ *" $my_xlib_u "*) ++ extracted_serial=`expr $extracted_serial + 1` ++ my_xlib_u=lt$extracted_serial-$my_xlib ;; ++ *) break ;; ++ esac ++ done ++ extracted_archives="$extracted_archives $my_xlib_u" ++ my_xdir="$my_gentop/$my_xlib_u" ++ ++ $show "${rm}r $my_xdir" ++ $run ${rm}r "$my_xdir" ++ $show "$mkdir $my_xdir" ++ $run $mkdir "$my_xdir" ++ exit_status=$? ++ if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then ++ exit $exit_status ++ fi ++ case $host in ++ *-darwin*) ++ $show "Extracting $my_xabs" ++ # Do not bother doing anything if just a dry run ++ if test -z "$run"; then ++ darwin_orig_dir=`pwd` ++ cd $my_xdir || exit $? ++ darwin_archive=$my_xabs ++ darwin_curdir=`pwd` ++ darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` ++ darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` ++ if test -n "$darwin_arches"; then ++ darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` ++ darwin_arch= ++ $show "$darwin_base_archive has multiple architectures $darwin_arches" ++ for darwin_arch in $darwin_arches ; do ++ mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" ++ lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" ++ cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" ++ func_extract_an_archive "`pwd`" "${darwin_base_archive}" ++ cd "$darwin_curdir" ++ $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" ++ done # $darwin_arches ++ ## Okay now we have a bunch of thin objects, gotta fatten them up :) ++ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` ++ darwin_file= ++ darwin_files= ++ for darwin_file in $darwin_filelist; do ++ darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` ++ lipo -create -output "$darwin_file" $darwin_files ++ done # $darwin_filelist ++ ${rm}r unfat-$$ ++ cd "$darwin_orig_dir" ++ else ++ cd "$darwin_orig_dir" ++ func_extract_an_archive "$my_xdir" "$my_xabs" ++ fi # $darwin_arches ++ fi # $run ++ ;; ++ *) ++ func_extract_an_archive "$my_xdir" "$my_xabs" ++ ;; ++ esac ++ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` ++ done ++ func_extract_archives_result="$my_oldobjs" ++} + # End of Shell function definitions + ##################################### + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + ++disable_libs=no ++ + # Parse our command line options once, thoroughly. + while test "$#" -gt 0 + do +@@ -308,10 +476,10 @@ + --version) + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo +- $echo "Copyright (C) 2003 Free Software Foundation, Inc." ++ $echo "Copyright (C) 2005 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +- exit $EXIT_SUCCESS ++ exit $? + ;; + + --config) +@@ -320,7 +488,7 @@ + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done +- exit $EXIT_SUCCESS ++ exit $? + ;; + + --debug) +@@ -345,7 +513,7 @@ + else + $echo "disable static libraries" + fi +- exit $EXIT_SUCCESS ++ exit $? + ;; + + --finish) mode="finish" ;; +@@ -360,7 +528,11 @@ + preserve_args="$preserve_args $arg" + ;; + +- --tag) prevopt="--tag" prev=tag ;; ++ --tag) ++ prevopt="--tag" ++ prev=tag ++ preserve_args="$preserve_args --tag" ++ ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift +@@ -392,6 +564,18 @@ + exit $EXIT_FAILURE + fi + ++case $disable_libs in ++no) ++ ;; ++shared) ++ build_libtool_libs=no ++ build_old_libs=yes ++ ;; ++static) ++ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` ++ ;; ++esac ++ + # If this variable is set in any of the actions, the command in it + # will be execed at the end. This prevents here-documents from being + # left over by shells. +@@ -402,7 +586,7 @@ + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 +- $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 ++ $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link +@@ -468,7 +652,7 @@ + + for arg + do +- case "$arg_mode" in ++ case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" +@@ -550,7 +734,10 @@ + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly +- # in scan sets, so we specify it separately. ++ # in scan sets, and some SunOS ksh mistreat backslash-escaping ++ # in scan sets (worked around with variable expansion), ++ # and furthermore cannot handle '|' '&' '(' ')' in scan sets ++ # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; +@@ -591,6 +778,7 @@ + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; ++ *.obj) xform=obj ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` +@@ -624,6 +812,14 @@ + esac + done + ++ qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` ++ case $qlibobj in ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") ++ qlibobj="\"$qlibobj\"" ;; ++ esac ++ test "X$libobj" != "X$qlibobj" \ ++ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ ++ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then +@@ -696,12 +892,17 @@ + $run $rm $removelist + exit $EXIT_FAILURE + fi +- $echo $srcfile > "$lockfile" ++ $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi ++ qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` ++ case $qsrcfile in ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") ++ qsrcfile="\"$qsrcfile\"" ;; ++ esac + + $run $rm "$libobj" "${libobj}T" + +@@ -723,18 +924,18 @@ + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then +- command="$base_compile $srcfile $pic_flag" ++ command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code +- command="$base_compile $srcfile" ++ command="$base_compile $qsrcfile" + fi + + if test ! -d "${xdir}$objdir"; then + $show "$mkdir ${xdir}$objdir" + $run $mkdir ${xdir}$objdir +- status=$? +- if test "$status" -ne 0 && test ! -d "${xdir}$objdir"; then +- exit $status ++ exit_status=$? ++ if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then ++ exit $exit_status + fi + fi + +@@ -806,9 +1007,9 @@ + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code +- command="$base_compile $srcfile" ++ command="$base_compile $qsrcfile" + else +- command="$base_compile $srcfile $pic_flag" ++ command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" +@@ -937,6 +1138,7 @@ + no_install=no + objs= + non_pic_objects= ++ notinst_path= # paths that contain not-installed libtool libraries + precious_files_regex= + prefer_static_libs=no + preload=no +@@ -957,22 +1159,32 @@ + for arg + do + case $arg in +- -all-static | -static) +- if test "X$arg" = "X-all-static"; then ++ -all-static | -static | -static-libtool-libs) ++ case $arg in ++ -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi +- else ++ prefer_static_libs=yes ++ ;; ++ -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi +- fi ++ prefer_static_libs=built ++ ;; ++ -static-libtool-libs) ++ if test -z "$pic_flag" && test -n "$link_static_flag"; then ++ dlopen_self=$dlopen_self_static ++ fi ++ prefer_static_libs=yes ++ ;; ++ esac + build_libtool_libs=no + build_old_libs=yes +- prefer_static_libs=yes + break + ;; + esac +@@ -1147,6 +1359,11 @@ + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi ++ else ++ # If the PIC object exists, use it instead. ++ # $xdir was prepended to $pic_object above. ++ non_pic_object="$pic_object" ++ non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. +@@ -1230,6 +1447,13 @@ + prev= + continue + ;; ++ darwin_framework|darwin_framework_skip) ++ test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" ++ compile_command="$compile_command $arg" ++ finalize_command="$finalize_command $arg" ++ prev= ++ continue ++ ;; + *) + eval "$prev=\"\$arg\"" + prev= +@@ -1288,6 +1512,18 @@ + continue + ;; + ++ -framework|-arch|-isysroot) ++ case " $CC " in ++ *" ${arg} ${1} "* | *" ${arg} ${1} "*) ++ prev=darwin_framework_skip ;; ++ *) compiler_flags="$compiler_flags $arg" ++ prev=darwin_framework ;; ++ esac ++ compile_command="$compile_command $arg" ++ finalize_command="$finalize_command $arg" ++ continue ++ ;; ++ + -inst-prefix-dir) + prev=inst_prefix + continue +@@ -1314,7 +1550,8 @@ + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 +- exit $EXIT_FAILURE ++ absdir="$dir" ++ notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; +@@ -1328,10 +1565,15 @@ + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) ++ testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac ++ case :$dllsearchpath: in ++ *":$testbindir:"*) ;; ++ *) dllsearchpath="$dllsearchpath:$testbindir";; ++ esac + ;; + esac + continue +@@ -1340,15 +1582,15 @@ + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in +- *-*-cygwin* | *-*-pw32* | *-*-beos*) ++ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; +- *-*-mingw* | *-*-os2*) ++ *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; +- *-*-openbsd* | *-*-freebsd*) ++ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; +@@ -1356,10 +1598,19 @@ + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue ++ ;; ++ *-*-sco3.2v5* | *-*-sco5v6*) ++ # Causes problems with __ctype ++ test "X$arg" = "X-lc" && continue ++ ;; ++ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) ++ # Compiler inserts libc in the correct place for threads to work ++ test "X$arg" = "X-lc" && continue ++ ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in +- *-*-openbsd* | *-*-freebsd*) ++ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; +@@ -1369,8 +1620,20 @@ + continue + ;; + ++ # Tru64 UNIX uses -model [arg] to determine the layout of C++ ++ # classes, name mangling, and exception handling. ++ -model) ++ compile_command="$compile_command $arg" ++ compiler_flags="$compiler_flags $arg" ++ finalize_command="$finalize_command $arg" ++ prev=xcompiler ++ continue ++ ;; ++ + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) +- deplibs="$deplibs $arg" ++ compiler_flags="$compiler_flags $arg" ++ compile_command="$compile_command $arg" ++ finalize_command="$finalize_command $arg" + continue + ;; + +@@ -1379,13 +1642,19 @@ + continue + ;; + +- # gcc -m* arguments should be passed to the linker via $compiler_flags +- # in order to pass architecture information to the linker +- # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo +- # but this is not reliable with gcc because gcc may use -mfoo to +- # select a different linker, different libraries, etc, while +- # -Wl,-mfoo simply passes -mfoo to the linker. +- -m*) ++ # -64, -mips[0-9] enable 64-bit mode on the SGI compiler ++ # -r[0-9][0-9]* specifies the processor on the SGI compiler ++ # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler ++ # +DA*, +DD* enable 64-bit mode on the HP compiler ++ # -q* pass through compiler args for the IBM compiler ++ # -m* pass through architecture-specific compiler args for GCC ++ # -m*, -t[45]*, -txscale* pass through architecture-specific ++ # compiler args for GCC ++ # -pg pass through profiling flag for GCC ++ # @file GCC response files ++ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ ++ -t[45]*|-txscale*|@*) ++ + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` +@@ -1396,9 +1665,7 @@ + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" +- if test "$with_gcc" = "yes" ; then +- compiler_flags="$compiler_flags $arg" +- fi ++ compiler_flags="$compiler_flags $arg" + continue + ;; + +@@ -1475,7 +1742,7 @@ + continue + ;; + +- -static) ++ -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects +@@ -1636,6 +1903,11 @@ + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi ++ else ++ # If the PIC object exists, use it instead. ++ # $xdir was prepended to $pic_object above. ++ non_pic_object="$pic_object" ++ non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. +@@ -1741,9 +2013,9 @@ + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir +- status=$? +- if test "$status" -ne 0 && test ! -d "$output_objdir"; then +- exit $status ++ exit_status=$? ++ if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then ++ exit $exit_status + fi + fi + +@@ -1806,7 +2078,6 @@ + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries +- notinst_path= # paths that contain not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" +@@ -1858,7 +2129,7 @@ + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else +- deplibs="$deplib $deplibs" ++ compiler_flags="$compiler_flags $deplib" + fi + continue + ;; +@@ -1867,10 +2138,6 @@ + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi +- if test "$pass" = conv; then +- deplibs="$deplib $deplibs" +- continue +- fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do +@@ -1981,7 +2248,22 @@ + fi + case $linkmode in + lib) +- if test "$deplibs_check_method" != pass_all; then ++ valid_a_lib=no ++ case $deplibs_check_method in ++ match_pattern*) ++ set dummy $deplibs_check_method ++ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` ++ if eval $echo \"$deplib\" 2>/dev/null \ ++ | $SED 10q \ ++ | $EGREP "$match_pattern_regex" > /dev/null; then ++ valid_a_lib=yes ++ fi ++ ;; ++ pass_all) ++ valid_a_lib=yes ++ ;; ++ esac ++ if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" +@@ -2031,7 +2313,7 @@ + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else +- $echo "$modename: cannot find the library \`$lib'" 1>&2 ++ $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + +@@ -2055,6 +2337,8 @@ + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no ++ avoidtemprpath= ++ + + # Read the .la file + case $lib in +@@ -2153,11 +2437,19 @@ + dir="$libdir" + absdir="$libdir" + fi ++ test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else +- dir="$ladir/$objdir" +- absdir="$abs_ladir/$objdir" +- # Remove this search path later +- notinst_path="$notinst_path $abs_ladir" ++ if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then ++ dir="$ladir" ++ absdir="$abs_ladir" ++ # Remove this search path later ++ notinst_path="$notinst_path $abs_ladir" ++ else ++ dir="$ladir/$objdir" ++ absdir="$abs_ladir/$objdir" ++ # Remove this search path later ++ notinst_path="$notinst_path $abs_ladir" ++ fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + +@@ -2228,14 +2520,16 @@ + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && +- { test "$prefer_static_libs" = no || test -z "$old_library"; }; then ++ { { test "$prefer_static_libs" = no || ++ test "$prefer_static_libs,$installed" = "built,yes"; } || ++ test -z "$old_library"; }; then + # We need to hardcode the library path +- if test -n "$shlibpath_var"; then ++ if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. +- case "$temp_rpath $rpath " in ++ case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; +- *) temp_rpath="$temp_rpath $dir" ;; ++ *) temp_rpath="$temp_rpath $absdir" ;; + esac + fi + +@@ -2245,7 +2539,7 @@ + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) +- case "$compile_rpath $rpath " in ++ case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac +@@ -2254,7 +2548,7 @@ + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) +- case "$finalize_rpath $rpath " in ++ case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac +@@ -2272,8 +2566,12 @@ + fi + + link_static=no # Whether the deplib will be linked statically ++ use_static_libs=$prefer_static_libs ++ if test "$use_static_libs" = built && test "$installed" = yes ; then ++ use_static_libs=no ++ fi + if test -n "$library_names" && +- { test "$prefer_static_libs" = no || test -z "$old_library"; }; then ++ { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes +@@ -2386,11 +2684,15 @@ + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in +- *-*-sco3.2v5* ) add_dir="-L$dir" ;; ++ *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; ++ *-*-sysv4*uw2*) add_dir="-L$dir" ;; ++ *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ ++ *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added +- if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then ++ if /usr/bin/file -L $add 2> /dev/null | ++ $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo +@@ -2421,7 +2723,7 @@ + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then +- case "$libdir" in ++ case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; +@@ -2494,7 +2796,7 @@ + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then +- case "$libdir" in ++ case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; +@@ -2555,8 +2857,6 @@ + fi + fi + else +- convenience="$convenience $dir/$old_library" +- old_convenience="$old_convenience $dir/$old_library" + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi +@@ -2674,12 +2974,12 @@ + *) continue ;; + esac + case " $deplibs " in +- *" $depdepl "*) ;; +- *) deplibs="$depdepl $deplibs" ;; ++ *" $path "*) ;; ++ *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in +- *" $path "*) ;; +- *) deplibs="$deplibs $path" ;; ++ *" $depdepl "*) ;; ++ *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no +@@ -2918,7 +3218,7 @@ + # which has an extra 1 added just for fun + # + case $version_type in +- darwin|linux|osf|windows) ++ darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" +@@ -2944,27 +3244,27 @@ + + # Check that each of the things are valid numbers. + case $current in +- [0-9]*) ;; ++ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) +- $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 ++ $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in +- [0-9]*) ;; ++ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) +- $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 ++ $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in +- [0-9]*) ;; ++ 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) +- $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 ++ $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; +@@ -2990,7 +3290,7 @@ + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` +- verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ++ verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + ;; + + freebsd-aout) +@@ -3142,11 +3442,11 @@ + fi + + # Eliminate all temporary directories. +- for path in $notinst_path; do +- lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` +- deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` +- dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` +- done ++# for path in $notinst_path; do ++# lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` ++# deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` ++# dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` ++# done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. +@@ -3155,7 +3455,7 @@ + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; +- *) finalize_rpath="$libdir $finalize_rpath" ;; ++ *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then +@@ -3196,9 +3496,14 @@ + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; +- *-*-openbsd* | *-*-freebsd*) ++ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. +- test "X$arg" = "X-lc" && continue ++ ;; ++ *-*-sco3.2v5* | *-*-sco5v6*) ++ # Causes problems with __ctype ++ ;; ++ *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) ++ # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. +@@ -3242,13 +3547,12 @@ + int main() { return 0; } + EOF + $rm conftest +- $LTCC -o conftest conftest.c $deplibs +- if test "$?" -eq 0 ; then ++ if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then + ldd_output=`ldd conftest` + for i in $deplibs; do +- name="`expr $i : '-l\(.*\)'`" ++ name=`expr $i : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. +- if test "$name" != "" && test "$name" -ne "0"; then ++ if test "$name" != "" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) +@@ -3283,13 +3587,11 @@ + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do +- name="`expr $i : '-l\(.*\)'`" ++ name=`expr $i : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test "$name" != "" && test "$name" != "0"; then + $rm conftest +- $LTCC -o conftest conftest.c $i +- # Did it work? +- if test "$?" -eq 0 ; then ++ if $LTCC $LTCFLAGS -o conftest conftest.c $i; then + ldd_output=`ldd conftest` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in +@@ -3321,7 +3623,7 @@ + droppeddeps=yes + $echo + $echo "*** Warning! Library $i is needed by this library but I was not able to" +- $echo "*** make it link in! You will probably need to install it or some" ++ $echo "*** make it link in! You will probably need to install it or some" + $echo "*** library that it depends on before this library will be fully" + $echo "*** functional. Installing it before continuing would be even better." + fi +@@ -3335,7 +3637,7 @@ + set dummy $deplibs_check_method + file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do +- name="`expr $a_deplib : '-l\(.*\)'`" ++ name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test "$name" != "" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then +@@ -3404,7 +3706,7 @@ + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do +- name="`expr $a_deplib : '-l\(.*\)'`" ++ name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then +@@ -3534,6 +3836,35 @@ + deplibs=$newdeplibs + fi + ++ ++ # move library search paths that coincide with paths to not yet ++ # installed libraries to the beginning of the library search list ++ new_libs= ++ for path in $notinst_path; do ++ case " $new_libs " in ++ *" -L$path/$objdir "*) ;; ++ *) ++ case " $deplibs " in ++ *" -L$path/$objdir "*) ++ new_libs="$new_libs -L$path/$objdir" ;; ++ esac ++ ;; ++ esac ++ done ++ for deplib in $deplibs; do ++ case $deplib in ++ -L*) ++ case " $new_libs " in ++ *" $deplib "*) ;; ++ *) new_libs="$new_libs $deplib" ;; ++ esac ++ ;; ++ *) new_libs="$new_libs $deplib" ;; ++ esac ++ done ++ deplibs="$new_libs" ++ ++ + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= +@@ -3617,6 +3948,7 @@ + fi + + lib="$output_objdir/$realname" ++ linknames= + for link + do + linknames="$linknames $link" +@@ -3645,6 +3977,9 @@ + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: ++ # Break out early, otherwise skipped_export may be ++ # set to false by a later but shorter cmd. ++ break + fi + done + IFS="$save_ifs" +@@ -3678,67 +4013,13 @@ + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" +- $show "${rm}r $gentop" +- $run ${rm}r "$gentop" +- $show "$mkdir $gentop" +- $run $mkdir "$gentop" +- status=$? +- if test "$status" -ne 0 && test ! -d "$gentop"; then +- exit $status +- fi + generated="$generated $gentop" + +- for xlib in $convenience; do +- # Extract the objects. +- case $xlib in +- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; +- *) xabs=`pwd`"/$xlib" ;; +- esac +- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` +- xdir="$gentop/$xlib" +- +- $show "${rm}r $xdir" +- $run ${rm}r "$xdir" +- $show "$mkdir $xdir" +- $run $mkdir "$xdir" +- status=$? +- if test "$status" -ne 0 && test ! -d "$xdir"; then +- exit $status +- fi +- # We will extract separately just the conflicting names and we will no +- # longer touch any unique names. It is faster to leave these extract +- # automatically by $AR in one run. +- $show "(cd $xdir && $AR x $xabs)" +- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? +- if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then +- : +- else +- $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 +- $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 +- $AR t "$xabs" | sort | uniq -cd | while read -r count name +- do +- i=1 +- while test "$i" -le "$count" +- do +- # Put our $i before any first dot (extension) +- # Never overwrite any file +- name_to="$name" +- while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" +- do +- name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` +- done +- $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" +- $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? +- i=`expr $i + 1` +- done +- done +- fi +- +- libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` +- done ++ func_extract_archives $gentop $convenience ++ libobjs="$libobjs $func_extract_archives_result" + fi + fi +- ++ + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" +@@ -3768,7 +4049,8 @@ + fi + fi + +- if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && ++ if test "X$skipped_export" != "X:" && ++ len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else +@@ -3787,6 +4069,7 @@ + save_libobjs=$libobjs + fi + save_output=$output ++ output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. +@@ -3796,13 +4079,13 @@ + delfiles= + last_robj= + k=1 +- output=$output_objdir/$save_output-${k}.$objext ++ output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || +- { len=`expr "X$test_cmds" : ".*"` && ++ { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else +@@ -3816,9 +4099,9 @@ + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi +- last_robj=$output_objdir/$save_output-${k}.$objext ++ last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` +- output=$output_objdir/$save_output-${k}.$objext ++ output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + fi +@@ -3838,13 +4121,13 @@ + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + +- # Set up a command to remove the reloadale object files ++ # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` +- delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" ++ delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" +@@ -3892,13 +4175,30 @@ + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" +- $run eval "$cmd" || exit $? ++ $run eval "$cmd" || { ++ lt_exit=$? ++ ++ # Restore the uninstalled library and exit ++ if test "$mode" = relink; then ++ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' ++ fi ++ ++ exit $lt_exit ++ } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? ++ ++ if test -n "$convenience"; then ++ if test -z "$whole_archive_flag_spec"; then ++ $show "${rm}r $gentop" ++ $run ${rm}r "$gentop" ++ fi ++ fi ++ + exit $EXIT_SUCCESS + fi + +@@ -3968,72 +4268,20 @@ + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of +- # -Wl from whole_archive_flag_spec ++ # -Wl from whole_archive_flag_spec and hope we can get by with ++ # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then +- eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" ++ eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" ++ reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" +- $show "${rm}r $gentop" +- $run ${rm}r "$gentop" +- $show "$mkdir $gentop" +- $run $mkdir "$gentop" +- status=$? +- if test "$status" -ne 0 && test ! -d "$gentop"; then +- exit $status +- fi + generated="$generated $gentop" + +- for xlib in $convenience; do +- # Extract the objects. +- case $xlib in +- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; +- *) xabs=`pwd`"/$xlib" ;; +- esac +- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` +- xdir="$gentop/$xlib" +- +- $show "${rm}r $xdir" +- $run ${rm}r "$xdir" +- $show "$mkdir $xdir" +- $run $mkdir "$xdir" +- status=$? +- if test "$status" -ne 0 && test ! -d "$xdir"; then +- exit $status +- fi +- # We will extract separately just the conflicting names and we will no +- # longer touch any unique names. It is faster to leave these extract +- # automatically by $AR in one run. +- $show "(cd $xdir && $AR x $xabs)" +- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? +- if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then +- : +- else +- $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 +- $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 +- $AR t "$xabs" | sort | uniq -cd | while read -r count name +- do +- i=1 +- while test "$i" -le "$count" +- do +- # Put our $i before any first dot (extension) +- # Never overwrite any file +- name_to="$name" +- while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" +- do +- name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` +- done +- $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" +- $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? +- i=`expr $i + 1` +- done +- done +- fi +- +- reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` +- done ++ func_extract_archives $gentop $convenience ++ reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + +@@ -4134,6 +4382,35 @@ + ;; + esac + ++ ++ # move library search paths that coincide with paths to not yet ++ # installed libraries to the beginning of the library search list ++ new_libs= ++ for path in $notinst_path; do ++ case " $new_libs " in ++ *" -L$path/$objdir "*) ;; ++ *) ++ case " $compile_deplibs " in ++ *" -L$path/$objdir "*) ++ new_libs="$new_libs -L$path/$objdir" ;; ++ esac ++ ;; ++ esac ++ done ++ for deplib in $compile_deplibs; do ++ case $deplib in ++ -L*) ++ case " $new_libs " in ++ *" $deplib "*) ;; ++ *) new_libs="$new_libs $deplib" ;; ++ esac ++ ;; ++ *) new_libs="$new_libs $deplib" ;; ++ esac ++ done ++ compile_deplibs="$new_libs" ++ ++ + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + +@@ -4143,7 +4420,7 @@ + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; +- *) finalize_rpath="$libdir $finalize_rpath" ;; ++ *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi +@@ -4151,7 +4428,7 @@ + # Now hardcode the library paths + rpath= + hardcode_libdirs= +- for libdir in $finalize_rpath $compile_rpath; do ++ for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then +@@ -4178,10 +4455,15 @@ + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) ++ testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac ++ case :$dllsearchpath: in ++ *":$testbindir:"*) ;; ++ *) dllsearchpath="$dllsearchpath:$testbindir";; ++ esac + ;; + esac + done +@@ -4295,13 +4577,25 @@ + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then +- export_symbols="$output_objdir/$output.exp" ++ export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols +- $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' ++ $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' ++ case $host in ++ *cygwin* | *mingw* ) ++ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' ++ $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ++ ;; ++ esac + else +- $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' +- $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' ++ $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' ++ $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' ++ case $host in ++ *cygwin* | *mingw* ) ++ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' ++ $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ++ ;; ++ esac + fi + fi + +@@ -4352,7 +4646,26 @@ + #endif + + /* The mapping between symbol names and symbols. */ ++" ++ ++ case $host in ++ *cygwin* | *mingw* ) ++ $echo >> "$output_objdir/$dlsyms" "\ ++/* DATA imports from DLLs on WIN32 can't be const, because ++ runtime relocations are performed -- see ld's documentation ++ on pseudo-relocs */ ++struct { ++" ++ ;; ++ * ) ++ $echo >> "$output_objdir/$dlsyms" "\ + const struct { ++" ++ ;; ++ esac ++ ++ ++ $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; + } +@@ -4399,16 +4712,29 @@ + esac + + # Now compile the dynamic symbol file. +- $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" +- $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? ++ $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" ++ $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. +- compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` +- finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` ++ case $host in ++ *cygwin* | *mingw* ) ++ if test -f "$output_objdir/${outputname}.def" ; then ++ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` ++ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` ++ else ++ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` ++ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` ++ fi ++ ;; ++ * ) ++ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` ++ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` ++ ;; ++ esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 +@@ -4421,19 +4747,19 @@ + # really was required. + + # Nullify the symbol file. +- compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` +- finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` ++ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` ++ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. +- compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` ++ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" +- status=$? ++ exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then +@@ -4441,7 +4767,7 @@ + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + +- exit $status ++ exit $exit_status + fi + + if test -n "$shlibpath_var"; then +@@ -4514,7 +4840,7 @@ + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then +- relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` ++ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= +@@ -4551,7 +4877,7 @@ + fi + done + relink_command="(cd `pwd`; $relink_command)" +- relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` ++ relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. +@@ -4581,10 +4907,12 @@ + esac + case $host in + *cygwin* | *mingw* ) +- cwrappersource=`$echo ${objdir}/lt-${output}.c` +- cwrapper=`$echo ${output}.exe` +- $rm $cwrappersource $cwrapper +- trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 ++ output_name=`basename $output` ++ output_path=`dirname $output` ++ cwrappersource="$output_path/$objdir/lt-$output_name.c" ++ cwrapper="$output_path/$output_name.exe" ++ $rm $cwrappersource $cwrapper ++ trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource < + #include + #include ++#include ++#include ++#include + + #if defined(PATH_MAX) + # define LT_PATHMAX PATH_MAX +@@ -4619,15 +4950,19 @@ + #endif + + #ifndef DIR_SEPARATOR +-#define DIR_SEPARATOR '/' ++# define DIR_SEPARATOR '/' ++# define PATH_SEPARATOR ':' + #endif + + #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +-#define HAVE_DOS_BASED_FILE_SYSTEM +-#ifndef DIR_SEPARATOR_2 +-#define DIR_SEPARATOR_2 '\\' +-#endif ++# define HAVE_DOS_BASED_FILE_SYSTEM ++# ifndef DIR_SEPARATOR_2 ++# define DIR_SEPARATOR_2 '\\' ++# endif ++# ifndef PATH_SEPARATOR_2 ++# define PATH_SEPARATOR_2 ';' ++# endif + #endif + + #ifndef DIR_SEPARATOR_2 +@@ -4637,17 +4972,32 @@ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) + #endif /* DIR_SEPARATOR_2 */ + ++#ifndef PATH_SEPARATOR_2 ++# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) ++#else /* PATH_SEPARATOR_2 */ ++# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) ++#endif /* PATH_SEPARATOR_2 */ ++ + #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) + #define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ + } while (0) + ++/* -DDEBUG is fairly common in CFLAGS. */ ++#undef DEBUG ++#if defined DEBUGWRAPPER ++# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) ++#else ++# define DEBUG(format, ...) ++#endif ++ + const char *program_name = NULL; + + void * xmalloc (size_t num); + char * xstrdup (const char *string); +-char * basename (const char *name); +-char * fnqualify(const char *path); ++const char * base_name (const char *name); ++char * find_executable(const char *wrapper); ++int check_executable(const char *path); + char * strendzap(char *str, const char *pat); + void lt_fatal (const char *message, ...); + +@@ -4657,29 +5007,51 @@ + char **newargz; + int i; + +- program_name = (char *) xstrdup ((char *) basename (argv[0])); ++ program_name = (char *) xstrdup (base_name (argv[0])); ++ DEBUG("(main) argv[0] : %s\n",argv[0]); ++ DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); + EOF + +- cat >> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" +- newargz[1] = fnqualify(argv[0]); ++ cat >> $cwrappersource <<"EOF" ++ newargz[1] = find_executable(argv[0]); ++ if (newargz[1] == NULL) ++ lt_fatal("Couldn't find %s", argv[0]); ++ DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; ++ ++ for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" ++ cat >> $cwrappersource <<"EOF" ++ return 127; + } + + void * +@@ -4699,48 +5071,148 @@ + ; + } + +-char * +-basename (const char *name) ++const char * ++base_name (const char *name) + { + const char *base; + + #if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ +- if (isalpha (name[0]) && name[1] == ':') ++ if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; + #endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; +- return (char *) base; ++ return base; ++} ++ ++int ++check_executable(const char * path) ++{ ++ struct stat st; ++ ++ DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); ++ if ((!path) || (!*path)) ++ return 0; ++ ++ if ((stat (path, &st) >= 0) && ++ ( ++ /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ ++#if defined (S_IXOTH) ++ ((st.st_mode & S_IXOTH) == S_IXOTH) || ++#endif ++#if defined (S_IXGRP) ++ ((st.st_mode & S_IXGRP) == S_IXGRP) || ++#endif ++ ((st.st_mode & S_IXUSR) == S_IXUSR)) ++ ) ++ return 1; ++ else ++ return 0; + } + ++/* Searches for the full path of the wrapper. Returns ++ newly allocated full path name if found, NULL otherwise */ + char * +-fnqualify(const char *path) ++find_executable (const char* wrapper) + { +- size_t size; +- char *p; ++ int has_slash = 0; ++ const char* p; ++ const char* p_next; ++ /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; ++ int tmp_len; ++ char* concat_name; + +- assert(path != NULL); ++ DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + +- /* Is it qualified already? */ ++ if ((wrapper == NULL) || (*wrapper == '\0')) ++ return NULL; ++ ++ /* Absolute path? */ ++#if defined (HAVE_DOS_BASED_FILE_SYSTEM) ++ if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') ++ { ++ concat_name = xstrdup (wrapper); ++ if (check_executable(concat_name)) ++ return concat_name; ++ XFREE(concat_name); ++ } ++ else ++ { ++#endif ++ if (IS_DIR_SEPARATOR (wrapper[0])) ++ { ++ concat_name = xstrdup (wrapper); ++ if (check_executable(concat_name)) ++ return concat_name; ++ XFREE(concat_name); ++ } + #if defined (HAVE_DOS_BASED_FILE_SYSTEM) +- if (isalpha (path[0]) && path[1] == ':') +- return xstrdup (path); ++ } + #endif +- if (IS_DIR_SEPARATOR (path[0])) +- return xstrdup (path); + +- /* prepend the current directory */ +- /* doesn't handle '~' */ ++ for (p = wrapper; *p; p++) ++ if (*p == '/') ++ { ++ has_slash = 1; ++ break; ++ } ++ if (!has_slash) ++ { ++ /* no slashes; search PATH */ ++ const char* path = getenv ("PATH"); ++ if (path != NULL) ++ { ++ for (p = path; *p; p = p_next) ++ { ++ const char* q; ++ size_t p_len; ++ for (q = p; *q; q++) ++ if (IS_PATH_SEPARATOR(*q)) ++ break; ++ p_len = q - p; ++ p_next = (*q == '\0' ? q : q + 1); ++ if (p_len == 0) ++ { ++ /* empty path: current directory */ ++ if (getcwd (tmp, LT_PATHMAX) == NULL) ++ lt_fatal ("getcwd failed"); ++ tmp_len = strlen(tmp); ++ concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); ++ memcpy (concat_name, tmp, tmp_len); ++ concat_name[tmp_len] = '/'; ++ strcpy (concat_name + tmp_len + 1, wrapper); ++ } ++ else ++ { ++ concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); ++ memcpy (concat_name, p, p_len); ++ concat_name[p_len] = '/'; ++ strcpy (concat_name + p_len + 1, wrapper); ++ } ++ if (check_executable(concat_name)) ++ return concat_name; ++ XFREE(concat_name); ++ } ++ } ++ /* not found in PATH; assume curdir */ ++ } ++ /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); +- size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ +- p = XMALLOC(char, size); +- sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); +- return p; ++ tmp_len = strlen(tmp); ++ concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); ++ memcpy (concat_name, tmp, tmp_len); ++ concat_name[tmp_len] = '/'; ++ strcpy (concat_name + tmp_len + 1, wrapper); ++ ++ if (check_executable(concat_name)) ++ return concat_name; ++ XFREE(concat_name); ++ return NULL; + } + + char * +@@ -4784,16 +5256,16 @@ + va_end (ap); + } + EOF +- # we should really use a build-platform specific compiler +- # here, but OTOH, the wrappers (shell script and this C one) +- # are only useful if you want to execute the "real" binary. +- # Since the "real" binary is built for $host, then this +- # wrapper might as well be built for $host, too. +- $run $LTCC -s -o $cwrapper $cwrappersource +- ;; +- esac +- $rm $output +- trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 ++ # we should really use a build-platform specific compiler ++ # here, but OTOH, the wrappers (shell script and this C one) ++ # are only useful if you want to execute the "real" binary. ++ # Since the "real" binary is built for $host, then this ++ # wrapper might as well be built for $host, too. ++ $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource ++ ;; ++ esac ++ $rm $output ++ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ + #! $SHELL +@@ -4812,9 +5284,21 @@ + Xsed='${SED} -e 1s/^X//' + sed_quote_subst='$sed_quote_subst' + ++# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). ++if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then ++ emulate sh ++ NULLCMD=: ++ # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which ++ # is contrary to our usage. Disable this feature. ++ alias -g '\${1+\"\$@\"}'='\"\$@\"' ++ setopt NO_GLOB_SUBST ++else ++ case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac ++fi ++ + # The HP-UX ksh and POSIX shell print the target directory to stdout + # if CDPATH is set. +-if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi ++(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + relink_command=\"$relink_command\" + +@@ -4943,23 +5427,23 @@ + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ +- exec \$progdir\\\\\$program \${1+\"\$@\"} ++ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} + " + ;; + + *) + $echo >> $output "\ +- exec \$progdir/\$program \${1+\"\$@\"} ++ exec \"\$progdir/\$program\" \${1+\"\$@\"} + " + ;; + esac + $echo >> $output "\ +- \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" ++ \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. +- \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 ++ \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE +@@ -4991,71 +5475,73 @@ + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" +- $show "${rm}r $gentop" +- $run ${rm}r "$gentop" +- $show "$mkdir $gentop" +- $run $mkdir "$gentop" +- status=$? +- if test "$status" -ne 0 && test ! -d "$gentop"; then +- exit $status +- fi + generated="$generated $gentop" + +- # Add in members from convenience archives. +- for xlib in $addlibs; do +- # Extract the objects. +- case $xlib in +- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; +- *) xabs=`pwd`"/$xlib" ;; +- esac +- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` +- xdir="$gentop/$xlib" +- +- $show "${rm}r $xdir" +- $run ${rm}r "$xdir" +- $show "$mkdir $xdir" +- $run $mkdir "$xdir" +- status=$? +- if test "$status" -ne 0 && test ! -d "$xdir"; then +- exit $status +- fi +- # We will extract separately just the conflicting names and we will no +- # longer touch any unique names. It is faster to leave these extract +- # automatically by $AR in one run. +- $show "(cd $xdir && $AR x $xabs)" +- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? +- if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then +- : +- else +- $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 +- $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 +- $AR t "$xabs" | sort | uniq -cd | while read -r count name +- do +- i=1 +- while test "$i" -le "$count" +- do +- # Put our $i before any first dot (extension) +- # Never overwrite any file +- name_to="$name" +- while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" +- do +- name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` +- done +- $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" +- $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? +- i=`expr $i + 1` +- done +- done +- fi +- +- oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` +- done ++ func_extract_archives $gentop $addlibs ++ oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else ++ # POSIX demands no paths to be encoded in archives. We have ++ # to avoid creating archives with duplicate basenames if we ++ # might have to extract them afterwards, e.g., when creating a ++ # static archive out of a convenience library, or when linking ++ # the entirety of a libtool archive into another (currently ++ # not supported by libtool). ++ if (for obj in $oldobjs ++ do ++ $echo "X$obj" | $Xsed -e 's%^.*/%%' ++ done | sort | sort -uc >/dev/null 2>&1); then ++ : ++ else ++ $echo "copying selected object files to avoid basename conflicts..." ++ ++ if test -z "$gentop"; then ++ gentop="$output_objdir/${outputname}x" ++ generated="$generated $gentop" ++ ++ $show "${rm}r $gentop" ++ $run ${rm}r "$gentop" ++ $show "$mkdir $gentop" ++ $run $mkdir "$gentop" ++ exit_status=$? ++ if test "$exit_status" -ne 0 && test ! -d "$gentop"; then ++ exit $exit_status ++ fi ++ fi ++ ++ save_oldobjs=$oldobjs ++ oldobjs= ++ counter=1 ++ for obj in $save_oldobjs ++ do ++ objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` ++ case " $oldobjs " in ++ " ") oldobjs=$obj ;; ++ *[\ /]"$objbase "*) ++ while :; do ++ # Make sure we don't pick an alternate name that also ++ # overlaps. ++ newobj=lt$counter-$objbase ++ counter=`expr $counter + 1` ++ case " $oldobjs " in ++ *[\ /]"$newobj "*) ;; ++ *) if test ! -f "$gentop/$newobj"; then break; fi ;; ++ esac ++ done ++ $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" ++ $run ln "$obj" "$gentop/$newobj" || ++ $run cp "$obj" "$gentop/$newobj" ++ oldobjs="$oldobjs $gentop/$newobj" ++ ;; ++ *) oldobjs="$oldobjs $obj" ;; ++ esac ++ done ++ fi ++ + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && +@@ -5069,20 +5555,7 @@ + objlist= + concat_cmds= + save_oldobjs=$oldobjs +- # GNU ar 2.10+ was changed to match POSIX; thus no paths are +- # encoded into archives. This makes 'ar r' malfunction in +- # this piecewise linking case whenever conflicting object +- # names appear in distinct ar calls; check, warn and compensate. +- if (for obj in $save_oldobjs +- do +- $echo "X$obj" | $Xsed -e 's%^.*/%%' +- done | sort | sort -uc >/dev/null 2>&1); then +- : +- else +- $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 +- $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 +- AR_FLAGS=cq +- fi ++ + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do +@@ -5093,7 +5566,7 @@ + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" +- if len=`expr "X$test_cmds" : ".*"` && ++ if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; then + : + else +@@ -5151,7 +5624,7 @@ + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" +- relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` ++ relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi +@@ -5290,11 +5763,11 @@ + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. +- $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then ++ $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in +- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac +@@ -5303,14 +5776,14 @@ + shift + else + install_prog= +- arg="$nonopt" ++ arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in +- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac +@@ -5328,28 +5801,31 @@ + do + if test -n "$dest"; then + files="$files $dest" +- dest="$arg" ++ dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; +- -f) prev="-f" ;; +- -g) prev="-g" ;; +- -m) prev="-m" ;; +- -o) prev="-o" ;; ++ -f) ++ case " $install_prog " in ++ *[\\\ /]cp\ *) ;; ++ *) prev=$arg ;; ++ esac ++ ;; ++ -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; +- -*) ;; +- ++ -*) ++ ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else +- dest="$arg" ++ dest=$arg + continue + fi + ;; +@@ -5358,7 +5834,7 @@ + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in +- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) ++ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac +@@ -5493,9 +5969,9 @@ + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. +- relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` ++ relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else +- relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` ++ relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 +@@ -5527,11 +6003,14 @@ + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. ++ # Try `ln -sf' first, because the `ln' binary might depend on ++ # the symlink we replace! Solaris /bin/ln does not understand -f, ++ # so we also need to try rm && ln -s. + for linkname + do + if test "$linkname" != "$realname"; then +- $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" +- $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" ++ $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" ++ $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi +@@ -5544,7 +6023,16 @@ + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" +- $run eval "$cmd" || exit $? ++ $run eval "$cmd" || { ++ lt_exit=$? ++ ++ # Restore the uninstalled library and exit ++ if test "$mode" = relink; then ++ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' ++ fi ++ ++ exit $lt_exit ++ } + done + IFS="$save_ifs" + fi +@@ -5638,17 +6126,15 @@ + notinst_deplibs= + relink_command= + +- # To insure that "foo" is sourced, and not "foo.exe", +- # finese the cygwin/MSYS system by explicitly sourcing "foo." +- # which disallows the automatic-append-.exe behavior. +- case $build in +- *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; +- *) wrapperdot=${wrapper} ;; +- esac ++ # Note that it is not necessary on cygwin/mingw to append a dot to ++ # foo even if both foo and FILE.exe exist: automatic-append-.exe ++ # behavior happens only for exec(3), not for open(2)! Also, sourcing ++ # `FILE.' does not work on cygwin managed mounts. ++ # + # If there is no directory component, then add one. +- case $file in +- */* | *\\*) . ${wrapperdot} ;; +- *) . ./${wrapperdot} ;; ++ case $wrapper in ++ */* | *\\*) . ${wrapper} ;; ++ *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. +@@ -5676,38 +6162,25 @@ + done + + relink_command= +- # To insure that "foo" is sourced, and not "foo.exe", +- # finese the cygwin/MSYS system by explicitly sourcing "foo." +- # which disallows the automatic-append-.exe behavior. +- case $build in +- *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; +- *) wrapperdot=${wrapper} ;; +- esac ++ # Note that it is not necessary on cygwin/mingw to append a dot to ++ # foo even if both foo and FILE.exe exist: automatic-append-.exe ++ # behavior happens only for exec(3), not for open(2)! Also, sourcing ++ # `FILE.' does not work on cygwin managed mounts. ++ # + # If there is no directory component, then add one. +- case $file in +- */* | *\\*) . ${wrapperdot} ;; +- *) . ./${wrapperdot} ;; ++ case $wrapper in ++ */* | *\\*) . ${wrapper} ;; ++ *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then +- tmpdir="/tmp" +- test -n "$TMPDIR" && tmpdir="$TMPDIR" +- tmpdir="$tmpdir/libtool-$$" +- save_umask=`umask` +- umask 0077 +- if $mkdir "$tmpdir"; then +- umask $save_umask +- else +- umask $save_umask +- $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 +- continue +- fi ++ tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. +- relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` ++ relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : +@@ -5727,7 +6200,7 @@ + fi + + # remove .exe since cygwin /usr/bin/install will append another +- # one anyways ++ # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in +@@ -5827,7 +6300,7 @@ + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + +- $echo "----------------------------------------------------------------------" ++ $echo "X----------------------------------------------------------------------" | $Xsed + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" +@@ -5860,7 +6333,7 @@ + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." +- $echo "----------------------------------------------------------------------" ++ $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + +@@ -5983,12 +6456,15 @@ + fi + + # Restore saved environment variables +- if test "${save_LC_ALL+set}" = set; then +- LC_ALL="$save_LC_ALL"; export LC_ALL +- fi +- if test "${save_LANG+set}" = set; then +- LANG="$save_LANG"; export LANG +- fi ++ for lt_var in LANG LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES ++ do ++ eval "if test \"\${save_$lt_var+set}\" = set; then ++ $lt_var=\$save_$lt_var; export $lt_var ++ else ++ $lt_unset $lt_var ++ fi" ++ done ++ + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" +@@ -6077,9 +6553,17 @@ + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" +- test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + +- if test "$mode" = uninstall; then ++ case "$mode" in ++ clean) ++ case " $library_names " in ++ # " " in the beginning catches empty $dlname ++ *" $dlname "*) ;; ++ *) rmfiles="$rmfiles $objdir/$dlname" ;; ++ esac ++ test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ++ ;; ++ uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds +@@ -6112,7 +6596,8 @@ + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. +- fi ++ ;; ++ esac + fi + ;; + +@@ -6336,9 +6821,9 @@ + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE +- try to export only the symbols listed in SYMFILE ++ try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX +- try to export only the symbols matching REGEX ++ try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened +@@ -6352,9 +6837,11 @@ + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries +- -static do not do any dynamic linking of libtool libraries ++ -static do not do any dynamic linking of uninstalled libtool libraries ++ -static-libtool-libs ++ do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] +- specify library version info [each variable defaults to 0] ++ specify library version info [each variable defaults to 0] + + All other options (arguments beginning with \`-') are ignored. + +@@ -6397,7 +6884,7 @@ + $echo + $echo "Try \`$modename --help' for more information about other modes." + +-exit $EXIT_SUCCESS ++exit $? + + # The TAGs below are defined such that we never get into a situation + # in which we disable both kinds of libraries. Given conflicting +@@ -6411,12 +6898,11 @@ + # configuration. But we'll never go from static-only to shared-only. + + # ### BEGIN LIBTOOL TAG CONFIG: disable-shared +-build_libtool_libs=no +-build_old_libs=yes ++disable_libs=shared + # ### END LIBTOOL TAG CONFIG: disable-shared + + # ### BEGIN LIBTOOL TAG CONFIG: disable-static +-build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` ++disable_libs=static + # ### END LIBTOOL TAG CONFIG: disable-static + + # Local Variables: +diff -Naur alliance-5.0/Makefile.in alliance/Makefile.in +--- alliance-5.0/Makefile.in 2007-07-18 19:05:17.000000000 +0200 ++++ alliance/Makefile.in 2009-06-13 22:28:09.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -136,6 +136,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -158,6 +161,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -224,6 +230,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -235,6 +244,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -284,6 +296,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -291,6 +306,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -412,7 +430,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -424,7 +448,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -432,7 +456,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -453,7 +483,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/missing alliance/missing +--- alliance-5.0/missing 2007-07-18 19:04:04.000000000 +0200 ++++ alliance/missing 2009-06-13 18:20:47.000000000 +0200 +@@ -1,9 +1,9 @@ + #! /bin/sh + # Common stub for a few missing GNU programs while installing. + +-scriptversion=2004-09-07.08 ++scriptversion=2005-06-08.21 + +-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004 ++# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 + # Free Software Foundation, Inc. + # Originally by Fran,cois Pinard , 1996. + +@@ -19,8 +19,8 @@ + + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++# 02110-1301, USA. + + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a +@@ -87,12 +87,12 @@ + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + + Send bug reports to ." +- exit 0 ++ exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" +- exit 0 ++ exit $? + ;; + + -*) +@@ -288,11 +288,18 @@ + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." ++ # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then +- file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` +- file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` +- fi ++ # ... or it is the one specified with @setfilename ... ++ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` ++ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` ++ # ... or it is derived from the source name (dir/f.texi becomes f.info) ++ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info ++ fi ++ # If the file does not exist, the user really needs makeinfo; ++ # let's fail without touching anything. ++ test -f $file || exit 1 + touch $file + ;; + diff --git a/alliance-fks.patch b/alliance-fks.patch new file mode 100644 index 0000000..c995ceb --- /dev/null +++ b/alliance-fks.patch @@ -0,0 +1,302 @@ +diff -Naur alliance-5.0/fks/configure.in alliance/fks/configure.in +--- alliance-5.0/fks/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/fks/configure.in 2002-10-16 20:04:22.000000000 +0200 +@@ -0,0 +1,46 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.3 2002/10/16 18:04:22 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/fks.h) ++FKS_DLL_VERSION=1:4:0 ++AC_SUBST(FKS_DLL_VERSION) ++AM_INIT_AUTOMAKE(fks, 1.4) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/fks/Makefile.in alliance/fks/Makefile.in +--- alliance-5.0/fks/Makefile.in 2007-07-18 19:04:26.000000000 +0200 ++++ alliance/fks/Makefile.in 2009-06-13 22:27:23.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/fks/src/fkserror.h alliance/fks/src/fkserror.h +--- alliance-5.0/fks/src/fkserror.h 2002-09-30 18:20:12.000000000 +0200 ++++ alliance/fks/src/fkserror.h 2009-06-13 19:44:54.000000000 +0200 +@@ -46,6 +46,8 @@ + # ifndef FKS_ERROR_H + # define FKS_ERROR_H + ++# include ++ + /*------------------------------------------------------------\ + | | + | Constants | +@@ -69,7 +71,7 @@ + | | + \------------------------------------------------------------*/ + +-# define fkserror( E, V ) (fks_error( (int)(E), (char *)(V), autbasename(__FILE__,NULL), __LINE__ )) ++# define fkserror( E, V ) (fks_error( (long)(E), (char *)(V), autbasename(__FILE__,NULL), __LINE__ )) + + /*------------------------------------------------------------\ + | | +diff -Naur alliance-5.0/fks/src/fksparse.c alliance/fks/src/fksparse.c +--- alliance-5.0/fks/src/fksparse.c 2002-09-30 18:20:12.000000000 +0200 ++++ alliance/fks/src/fksparse.c 2009-06-13 19:45:23.000000000 +0200 +@@ -76,7 +76,7 @@ + | | + \------------------------------------------------------------*/ + +- static int KissLineNumber = 0; ++ static long KissLineNumber = 0; + static char KissBuffer[ KISS_BUFFER_SIZE ]; + static char *KissScanBuffer; + static FILE *KissFile; +diff -Naur alliance-5.0/fks/src/Makefile.in alliance/fks/src/Makefile.in +--- alliance-5.0/fks/src/Makefile.in 2007-07-18 19:04:26.000000000 +0200 ++++ alliance/fks/src/Makefile.in 2009-06-13 22:27:23.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libFks_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -66,11 +64,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libFks_la_SOURCES) + DIST_SOURCES = $(libFks_la_SOURCES) +@@ -145,6 +143,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -167,6 +168,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -233,6 +237,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -244,6 +251,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -293,6 +303,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -300,6 +313,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-flatbeh.patch b/alliance-flatbeh.patch new file mode 100644 index 0000000..aa268a4 --- /dev/null +++ b/alliance-flatbeh.patch @@ -0,0 +1,398 @@ +diff -Naur alliance-5.0/flatbeh/configure.in alliance/flatbeh/configure.in +--- alliance-5.0/flatbeh/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/flatbeh/configure.in 2002-10-16 20:04:22.000000000 +0200 +@@ -0,0 +1,33 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/main.c) ++ ++FLATBEH_MAJOR_VERSION=1 ++FLATBEH_MINOR_VERSION=1 ++FLATBEH_VERSION=$FLATBEH_MAJOR_VERSION.$FLATBEH_MINOR_VERSION ++ ++AC_SUBST(FLATBEH_MAJOR_VERSION) ++AC_SUBST(FLATBEH_MINOR_VERSION) ++AC_SUBST(FLATBEH_VERSION) ++ ++# For automake. ++VERSION=$FLATBEH_VERSION ++PACKAGE=flatbeh ++ ++dnl Initialize automake stuff ++AM_INIT_AUTOMAKE($PACKAGE, $VERSION) ++ ++dnl Checks for programs. ++AC_PROG_CC ++AC_PROG_MAKE_SET ++ ++dnl Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++ ++dnl For alliance path lib and includes ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++doc/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/flatbeh/doc/abstract.1 alliance/flatbeh/doc/abstract.1 +--- alliance-5.0/flatbeh/doc/abstract.1 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/flatbeh/doc/abstract.1 2002-03-21 14:41:58.000000000 +0100 +@@ -0,0 +1,64 @@ ++.\" @(#)abstract.1 1.0 15 mars 1995 UPMC; DICTUS Nathalie ++.TH ABSTRACT 1 "15 mars 1995" "Release 1.0" "ALLIANCE USER COMMANDS" ++ ++.SH NAME ++.PP ++\fBabstract\fP \- Synthetizes a behavioral description from a structural description ++ ++.SH ORIGIN ++This software belongs to the ++.B ALLIANCE ++CAD system from the ++.br ++CAO-VLSI team at MASI laboratory, University P. et M. Curie ++.br ++4, place Jussieu ; 75252 PARIS Cedex 05 ; FRANCE ++.br ++Fax: (33-1) 44.27.62.86 ; E-mail: cao-vlsi@masi.ibp.fr ++ ++.SH SYNOPSIS ++.PP ++abstract \fIroot_structural_file\fP \fI[behavioral_file]\fP ++ ++.SH DESCRIPTION ++.PP ++\fBabstract\fP synthetizes a VHDL behavioral data-flow description from a multilevel structural description. It flattens the structural description (it can be ++a hierarchy of macro block) until the cells which have a behavioral ++description. The output is a VHDL data-flow description. ++ ++.SH PARAMETERS ++.PP ++\fBroot_structural_file\fP is the filename of the root of the structural ++description file. ++ ++\fBbehavioral_file\fP is the optional filename of the generated behavioral description file. ++ ++.SH ENVIRONMENT VARIABLES ++.TP 20 ++\fIMBK_WORK_LIB\fP ++Path of the directory that contains the structural description and where is generated the behavioral description. ++.TP 20 ++\fIMBK_CATA_LIB\fP ++List of directories containing leaf cell descriptions. ++The default path is the current directory (see mbk(1)). ++.TP 20 ++\fIMBK_CATAL_NAME\fP ++Indicates the file where the behavioral description files are given. This serves ++to abstract to stop the flatten of the structural root circuit (see mbk(1)). ++.TP 20 ++\fIMBK_IN_LO\fP ++file extension for structural entity (see mbk(1)). ++ ++.SH EXAMPLES ++.PP ++abstract adder32 ++.PP ++abstract adder32 add32 ++ ++.SH SEE ALSO ++.PP ++vhdl(5), mbk(1), MBK_WORK_LIB(8), MBK_CATA_LIB(8), MBK_CATAL_NAME(8), MBK_IN_LO(8). ++ ++.SH BUGS ++.PP ++Please e-mail to \fIcao-vlsi@masi.ibp.fr\fP for bug report and suggestions. +diff -Naur alliance-5.0/flatbeh/doc/Makefile.in alliance/flatbeh/doc/Makefile.in +--- alliance-5.0/flatbeh/doc/Makefile.in 2007-07-18 19:04:27.000000000 +0200 ++++ alliance/flatbeh/doc/Makefile.in 2009-06-13 22:27:24.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/flatbeh/Makefile.in alliance/flatbeh/Makefile.in +--- alliance-5.0/flatbeh/Makefile.in 2007-07-18 19:04:27.000000000 +0200 ++++ alliance/flatbeh/Makefile.in 2009-06-13 22:27:24.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/flatbeh/src/Makefile.in alliance/flatbeh/src/Makefile.in +--- alliance-5.0/flatbeh/src/Makefile.in 2007-07-18 19:04:27.000000000 +0200 ++++ alliance/flatbeh/src/Makefile.in 2009-06-13 22:27:24.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,8 +14,6 @@ + + @SET_MAKE@ + +-SOURCES = $(flatbeh_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -59,11 +57,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(flatbeh_SOURCES) + DIST_SOURCES = $(flatbeh_SOURCES) +@@ -136,6 +134,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -158,6 +159,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -224,6 +228,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -235,6 +242,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -284,6 +294,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -291,6 +304,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-flatlo.patch b/alliance-flatlo.patch new file mode 100644 index 0000000..a9c24b5 --- /dev/null +++ b/alliance-flatlo.patch @@ -0,0 +1,397 @@ +diff -Naur alliance-5.0/flatlo/configure.in alliance/flatlo/configure.in +--- alliance-5.0/flatlo/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/flatlo/configure.in 2002-10-16 20:04:22.000000000 +0200 +@@ -0,0 +1,20 @@ ++dnl $Id: configure.in,v 1.4 2002/10/16 18:04:22 jpc Exp $ ++ ++AC_INIT(src/flatlo.c) ++AM_INIT_AUTOMAKE(flatlo, 1.4) ++ ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_CPP ++AC_PROG_MAKE_SET ++AC_HEADER_STDC ++AC_C_CONST ++ ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++doc/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/flatlo/doc/Makefile.in alliance/flatlo/doc/Makefile.in +--- alliance-5.0/flatlo/doc/Makefile.in 2007-07-18 19:04:28.000000000 +0200 ++++ alliance/flatlo/doc/Makefile.in 2009-06-13 22:27:24.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -119,6 +119,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -141,6 +144,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -207,6 +213,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -218,6 +227,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -267,6 +279,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -274,6 +289,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/flatlo/Makefile.in alliance/flatlo/Makefile.in +--- alliance-5.0/flatlo/Makefile.in 2007-07-18 19:04:27.000000000 +0200 ++++ alliance/flatlo/Makefile.in 2009-06-13 22:27:24.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -124,6 +124,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -146,6 +149,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -212,6 +218,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -223,6 +232,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -272,6 +284,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -279,6 +294,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -391,7 +409,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -403,7 +427,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -411,7 +435,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -432,7 +462,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/flatlo/src/Makefile.am alliance/flatlo/src/Makefile.am +--- alliance-5.0/flatlo/src/Makefile.am 2005-01-19 16:13:50.000000000 +0100 ++++ alliance/flatlo/src/Makefile.am 2007-12-26 11:02:38.000000000 +0100 +@@ -1,24 +1,24 @@ +-# $Id: Makefile.am,v 1.5 2005/01/19 15:13:50 hcl Exp $ ++# $Id: Makefile.am,v 1.6 2007/12/26 10:02:38 xtof Exp $ + + AM_CFLAGS = -I$(top_srcdir)/mbk/src + + bin_PROGRAMS = flatlo + + flatlo_LDADD = \ +--L$(top_srcdir)/abe/src \ +--L$(top_srcdir)/abl/src \ +--L$(top_srcdir)/abt/src \ +--L$(top_srcdir)/abv/src \ +--L$(top_srcdir)/aut/src \ +--L$(top_srcdir)/bdd/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbkal/src \ +--L$(top_srcdir)/mbkedif/src \ +--L$(top_srcdir)/mbkhilo/src \ +--L$(top_srcdir)/mbkspice/src \ +--L$(top_srcdir)/mbkvhdlg/src \ +--L$(top_srcdir)/mbkvrlog/src \ +--L$(top_srcdir)/mbkvti/src \ ++-L$(top_builddir)/abe/src \ ++-L$(top_builddir)/abl/src \ ++-L$(top_builddir)/abt/src \ ++-L$(top_builddir)/abv/src \ ++-L$(top_builddir)/aut/src \ ++-L$(top_builddir)/bdd/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbkal/src \ ++-L$(top_builddir)/mbkedif/src \ ++-L$(top_builddir)/mbkhilo/src \ ++-L$(top_builddir)/mbkspice/src \ ++-L$(top_builddir)/mbkvhdlg/src \ ++-L$(top_builddir)/mbkvrlog/src \ ++-L$(top_builddir)/mbkvti/src \ + -lAbv \ + -lAbe \ + -lAbt \ +diff -Naur alliance-5.0/flatlo/src/Makefile.in alliance/flatlo/src/Makefile.in +--- alliance-5.0/flatlo/src/Makefile.in 2007-07-18 19:04:28.000000000 +0200 ++++ alliance/flatlo/src/Makefile.in 2009-06-13 22:27:25.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,9 +14,7 @@ + + @SET_MAKE@ + +-# $Id: Makefile.am,v 1.5 2005/01/19 15:13:50 hcl Exp $ +- +-SOURCES = $(flatlo_SOURCES) ++# $Id: Makefile.am,v 1.6 2007/12/26 10:02:38 xtof Exp $ + + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ +@@ -61,11 +59,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(flatlo_SOURCES) + DIST_SOURCES = $(flatlo_SOURCES) +@@ -138,6 +136,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -160,6 +161,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -226,6 +230,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -237,6 +244,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -286,6 +296,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -293,6 +306,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -356,20 +372,20 @@ + target_alias = @target_alias@ + AM_CFLAGS = -I$(top_srcdir)/mbk/src + flatlo_LDADD = \ +--L$(top_srcdir)/abe/src \ +--L$(top_srcdir)/abl/src \ +--L$(top_srcdir)/abt/src \ +--L$(top_srcdir)/abv/src \ +--L$(top_srcdir)/aut/src \ +--L$(top_srcdir)/bdd/src \ +--L$(top_srcdir)/mbk/src \ +--L$(top_srcdir)/mbkal/src \ +--L$(top_srcdir)/mbkedif/src \ +--L$(top_srcdir)/mbkhilo/src \ +--L$(top_srcdir)/mbkspice/src \ +--L$(top_srcdir)/mbkvhdlg/src \ +--L$(top_srcdir)/mbkvrlog/src \ +--L$(top_srcdir)/mbkvti/src \ ++-L$(top_builddir)/abe/src \ ++-L$(top_builddir)/abl/src \ ++-L$(top_builddir)/abt/src \ ++-L$(top_builddir)/abv/src \ ++-L$(top_builddir)/aut/src \ ++-L$(top_builddir)/bdd/src \ ++-L$(top_builddir)/mbk/src \ ++-L$(top_builddir)/mbkal/src \ ++-L$(top_builddir)/mbkedif/src \ ++-L$(top_builddir)/mbkhilo/src \ ++-L$(top_builddir)/mbkspice/src \ ++-L$(top_builddir)/mbkvhdlg/src \ ++-L$(top_builddir)/mbkvrlog/src \ ++-L$(top_builddir)/mbkvti/src \ + -lAbv \ + -lAbe \ + -lAbt \ diff --git a/alliance-flatph.patch b/alliance-flatph.patch new file mode 100644 index 0000000..01e5b67 --- /dev/null +++ b/alliance-flatph.patch @@ -0,0 +1,317 @@ +diff -Naur alliance-5.0/flatph/configure.in alliance/flatph/configure.in +--- alliance-5.0/flatph/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/flatph/configure.in 2002-10-16 20:04:23.000000000 +0200 +@@ -0,0 +1,20 @@ ++dnl $Id: configure.in,v 1.4 2002/10/16 18:04:23 jpc Exp $ ++ ++AC_INIT(src/flatph.c) ++AM_INIT_AUTOMAKE(flatph, 1.4) ++ ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_CPP ++AC_PROG_MAKE_SET ++AC_HEADER_STDC ++AC_C_CONST ++ ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++doc/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/flatph/doc/Makefile.in alliance/flatph/doc/Makefile.in +--- alliance-5.0/flatph/doc/Makefile.in 2007-07-18 19:04:28.000000000 +0200 ++++ alliance/flatph/doc/Makefile.in 2009-06-13 22:27:25.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -119,6 +119,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -141,6 +144,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -207,6 +213,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -218,6 +227,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -267,6 +279,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -274,6 +289,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/flatph/Makefile.in alliance/flatph/Makefile.in +--- alliance-5.0/flatph/Makefile.in 2007-07-18 19:04:28.000000000 +0200 ++++ alliance/flatph/Makefile.in 2009-06-13 22:27:25.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -124,6 +124,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -146,6 +149,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -212,6 +218,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -223,6 +232,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -272,6 +284,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -279,6 +294,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -391,7 +409,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -403,7 +427,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -411,7 +435,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -432,7 +462,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/flatph/src/Makefile.in alliance/flatph/src/Makefile.in +--- alliance-5.0/flatph/src/Makefile.in 2007-07-18 19:04:29.000000000 +0200 ++++ alliance/flatph/src/Makefile.in 2009-06-13 22:27:25.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -16,8 +16,6 @@ + + # $Id: Makefile.am,v 1.5 2005/01/19 15:13:50 hcl Exp $ + +-SOURCES = $(flatph_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -61,11 +59,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(flatph_SOURCES) + DIST_SOURCES = $(flatph_SOURCES) +@@ -138,6 +136,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -160,6 +161,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -226,6 +230,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -237,6 +244,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -286,6 +296,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -293,6 +306,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-fmi.patch b/alliance-fmi.patch new file mode 100644 index 0000000..737fb8e --- /dev/null +++ b/alliance-fmi.patch @@ -0,0 +1,332 @@ +diff -Naur alliance-5.0/fmi/configure.in alliance/fmi/configure.in +--- alliance-5.0/fmi/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/fmi/configure.in 2002-10-16 20:04:23.000000000 +0200 +@@ -0,0 +1,35 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/fmi_main.c) ++ ++FMI_MAJOR_VERSION=1 ++FMI_MINOR_VERSION=1 ++FMI_VERSION=$FMI_MAJOR_VERSION.$FMI_MINOR_VERSION ++ ++AC_SUBST(FMI_MAJOR_VERSION) ++AC_SUBST(FMI_MINOR_VERSION) ++AC_SUBST(FMI_VERSION) ++ ++# For automake. ++VERSION=$FMI_VERSION ++PACKAGE=fmi ++ ++dnl Initialize automake stuff ++AM_INIT_AUTOMAKE($PACKAGE, $VERSION) ++ ++dnl Checks for programs. ++AC_PROG_CC ++AM_PROG_LEX ++AC_PROG_YACC ++AM_PROG_LIBTOOL ++AC_PROG_MAKE_SET ++ ++dnl Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++man1/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/fmi/Makefile.in alliance/fmi/Makefile.in +--- alliance-5.0/fmi/Makefile.in 2007-07-18 19:04:29.000000000 +0200 ++++ alliance/fmi/Makefile.in 2009-06-13 22:27:26.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/fmi/man1/Makefile.in alliance/fmi/man1/Makefile.in +--- alliance-5.0/fmi/man1/Makefile.in 2007-07-18 19:04:29.000000000 +0200 ++++ alliance/fmi/man1/Makefile.in 2009-06-13 22:27:26.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/fmi/src/Makefile.in alliance/fmi/src/Makefile.in +--- alliance-5.0/fmi/src/Makefile.in 2007-07-18 19:04:29.000000000 +0200 ++++ alliance/fmi/src/Makefile.in 2009-06-13 22:27:26.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,8 +14,6 @@ + + @SET_MAKE@ + +-SOURCES = $(fmi_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -60,11 +58,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(fmi_SOURCES) + DIST_SOURCES = $(fmi_SOURCES) +@@ -137,6 +135,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -159,6 +160,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -225,6 +229,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -236,6 +243,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -285,6 +295,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -292,6 +305,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-fsm.patch b/alliance-fsm.patch new file mode 100644 index 0000000..95971c1 --- /dev/null +++ b/alliance-fsm.patch @@ -0,0 +1,606 @@ +diff -Naur alliance-5.0/fsm/configure.in alliance/fsm/configure.in +--- alliance-5.0/fsm/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/fsm/configure.in 2002-10-16 20:04:23.000000000 +0200 +@@ -0,0 +1,48 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.4 2002/10/16 18:04:23 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/fsm.h) ++FSM_DLL_VERSION=1:4:0 ++AC_SUBST(FSM_DLL_VERSION) ++AM_INIT_AUTOMAKE(fsm, 1.4) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man1/Makefile ++man5/Makefile ++]) +diff -Naur alliance-5.0/fsm/Makefile.in alliance/fsm/Makefile.in +--- alliance-5.0/fsm/Makefile.in 2007-07-18 19:04:30.000000000 +0200 ++++ alliance/fsm/Makefile.in 2009-06-13 22:27:26.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/fsm/man1/Makefile.in alliance/fsm/man1/Makefile.in +--- alliance-5.0/fsm/man1/Makefile.in 2007-07-18 19:04:30.000000000 +0200 ++++ alliance/fsm/man1/Makefile.in 2009-06-13 22:27:26.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/fsm/man5/Makefile.in alliance/fsm/man5/Makefile.in +--- alliance-5.0/fsm/man5/Makefile.in 2007-07-18 19:04:30.000000000 +0200 ++++ alliance/fsm/man5/Makefile.in 2009-06-13 22:27:27.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/fsm/src/main.c alliance/fsm/src/main.c +--- alliance-5.0/fsm/src/main.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/fsm/src/main.c 2002-09-30 18:20:15.000000000 +0200 +@@ -0,0 +1,183 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : Fsm | ++| | ++| File : main.c | ++| | ++| Date : 08.02.95 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "abl.h" ++# include "bdd.h" ++# include "fsm.h" ++# include "ftl.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Usage | ++| | ++\------------------------------------------------------------*/ ++ ++void FsmUsage() ++{ ++ fprintf( stderr, "\t\tfsmtest [Options] Input_name [Output_name]\n\n" ); ++ fprintf( stdout, "\t\tOptions : -V Sets Verbose mode on\n" ); ++ fprintf( stdout, "\t\t -S Saves Fsm figure\n" ); ++ fprintf( stdout, "\t\t -I Fsm Input format\n" ); ++ fprintf( stdout, "\t\t -O Fsm Output format\n" ); ++ fprintf( stdout, "\n" ); ++ ++ exit( 1 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++int main( argc, argv ) ++ ++ int argc; ++ char *argv[]; ++{ ++ fsmfig_list *FsmFigure; ++ char *InputFileName; ++ char *OutputFileName; ++ int Number; ++ int Index; ++ char Option; ++ ++ int FlagVerbose = 0; ++ int FlagSave = 0; ++ ++ mbkenv(); ++ autenv(); ++ ablenv(); ++ fsmenv(); ++ ++ InputFileName = (char *)0; ++ ++ if ( argc < 2 ) FsmUsage(); ++ ++ InputFileName = (char *)0; ++ ++ for ( Number = 1; Number < argc; Number++ ) ++ { ++ if ( argv[ Number ][ 0 ] == '-' ) ++ { ++ for ( Index = 1; argv[ Number ][ Index ] != '\0'; Index++ ) ++ { ++ Option = argv[ Number ][ Index ]; ++ ++ if ( Option == 'I' ) ++ { ++ Number = Number + 1; ++ FSM_IN = namealloc( argv[ Number ] ); ++ break; ++ } ++ else ++ if ( Option == 'O' ) ++ { ++ Number = Number + 1; ++ FSM_OUT = namealloc( argv[ Number ] ); ++ break; ++ } ++ ++ switch ( Option ) ++ { ++ case 'V' : FlagVerbose = 1; ++ break; ++ case 'S' : FlagSave = 1; ++ break; ++ default : FsmUsage(); ++ } ++ } ++ } ++ else ++ if ( InputFileName == (char *)0 ) InputFileName = argv[ Number ]; ++ else ++ if ( OutputFileName == (char *)0 ) OutputFileName = argv[ Number ]; ++ else ++ FsmUsage(); ++ } ++ ++ if ( InputFileName == (char *)0 ) FsmUsage(); ++ if ( OutputFileName == (char *)0 ) OutputFileName = InputFileName; ++ ++ if ( ( FlagSave ) && ( InputFileName == OutputFileName ) ) ++ { ++ FsmUsage(); ++ } ++ ++ fprintf( stdout, "FSM_IN : %s\n", FSM_IN ); ++ fprintf( stdout, "FSM_OUT : %s\n", FSM_OUT ); ++ ++ FsmFigure = getfsmfig( InputFileName ); ++ ++ if ( FlagVerbose ) viewfsmfig( FsmFigure ); ++ ++ if ( FlagSave ) ++ { ++ FsmFigure->NAME = namealloc( OutputFileName ); ++ savefsmfig( FsmFigure ); ++ } ++ ++ delfsmfig( FsmFigure->NAME ); ++ ++ return( 0 ); ++} +diff -Naur alliance-5.0/fsm/src/Makefile.in alliance/fsm/src/Makefile.in +--- alliance-5.0/fsm/src/Makefile.in 2007-07-18 19:04:31.000000000 +0200 ++++ alliance/fsm/src/Makefile.in 2009-06-13 22:27:27.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libFsm_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -68,11 +66,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libFsm_la_SOURCES) + DIST_SOURCES = $(libFsm_la_SOURCES) +@@ -147,6 +145,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -169,6 +170,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -235,6 +239,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -246,6 +253,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -295,6 +305,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -302,6 +315,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-fsp.patch b/alliance-fsp.patch new file mode 100644 index 0000000..fdd9a4a --- /dev/null +++ b/alliance-fsp.patch @@ -0,0 +1,332 @@ +diff -Naur alliance-5.0/fsp/configure.in alliance/fsp/configure.in +--- alliance-5.0/fsp/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/fsp/configure.in 2002-10-16 20:04:23.000000000 +0200 +@@ -0,0 +1,35 @@ ++dnl Process this file with autoconf to produce a configure script. ++AC_INIT(src/fsp_main.c) ++ ++FSP_MAJOR_VERSION=1 ++FSP_MINOR_VERSION=1 ++FSP_VERSION=$FSP_MAJOR_VERSION.$FSP_MINOR_VERSION ++ ++AC_SUBST(FSP_MAJOR_VERSION) ++AC_SUBST(FSP_MINOR_VERSION) ++AC_SUBST(FSP_VERSION) ++ ++# For automake. ++VERSION=$FSP_VERSION ++PACKAGE=fsp ++ ++dnl Initialize automake stuff ++AM_INIT_AUTOMAKE($PACKAGE, $VERSION) ++ ++dnl Checks for programs. ++AC_PROG_CC ++AM_PROG_LEX ++AC_PROG_YACC ++AM_PROG_LIBTOOL ++AC_PROG_MAKE_SET ++ ++dnl Checks for typedefs, structures, and compiler characteristics. ++AC_C_CONST ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++man1/Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/fsp/Makefile.in alliance/fsp/Makefile.in +--- alliance-5.0/fsp/Makefile.in 2007-07-18 19:04:31.000000000 +0200 ++++ alliance/fsp/Makefile.in 2009-06-13 22:27:27.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/fsp/man1/Makefile.in alliance/fsp/man1/Makefile.in +--- alliance-5.0/fsp/man1/Makefile.in 2007-07-18 19:04:31.000000000 +0200 ++++ alliance/fsp/man1/Makefile.in 2009-06-13 22:27:27.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/fsp/src/Makefile.in alliance/fsp/src/Makefile.in +--- alliance-5.0/fsp/src/Makefile.in 2007-07-18 19:04:31.000000000 +0200 ++++ alliance/fsp/src/Makefile.in 2009-06-13 22:27:27.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,8 +14,6 @@ + + @SET_MAKE@ + +-SOURCES = $(fsp_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -60,11 +58,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(fsp_SOURCES) + DIST_SOURCES = $(fsp_SOURCES) +@@ -137,6 +135,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -159,6 +160,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -225,6 +229,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -236,6 +243,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -285,6 +295,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -292,6 +305,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-ftl.patch b/alliance-ftl.patch new file mode 100644 index 0000000..51b7e85 --- /dev/null +++ b/alliance-ftl.patch @@ -0,0 +1,298 @@ +diff -Naur alliance-5.0/ftl/configure.in alliance/ftl/configure.in +--- alliance-5.0/ftl/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/ftl/configure.in 2002-10-16 20:04:23.000000000 +0200 +@@ -0,0 +1,46 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.6 2002/10/16 18:04:23 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/ftl.h) ++FTL_DLL_VERSION=1:4:0 ++AC_SUBST(FTL_DLL_VERSION) ++AM_INIT_AUTOMAKE(ftl, 1.4) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/ftl/Makefile.in alliance/ftl/Makefile.in +--- alliance-5.0/ftl/Makefile.in 2007-07-18 19:04:32.000000000 +0200 ++++ alliance/ftl/Makefile.in 2009-06-13 22:27:28.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/ftl/src/cvslog.27285 alliance/ftl/src/cvslog.27285 +--- alliance-5.0/ftl/src/cvslog.27285 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/ftl/src/cvslog.27285 2009-06-14 15:51:40.000000000 +0200 +@@ -0,0 +1,13 @@ ++=================================================================== ++Modification le : Sun Jun 14 15:51:40 CEST 2009 ++Par : ludo ++=================================================================== ++ ++Update of /users/outil/alliance/cvsroot/alliance/src/ftl/src ++In directory do:/users/cao/ludo/alliance/src/ftl/src ++ ++Modified Files: ++ ftlerror.h ++Log Message: ++- port 64 bits ++ +diff -Naur alliance-5.0/ftl/src/ftlerror.h alliance/ftl/src/ftlerror.h +--- alliance-5.0/ftl/src/ftlerror.h 2002-09-30 18:20:16.000000000 +0200 ++++ alliance/ftl/src/ftlerror.h 2009-06-13 19:48:17.000000000 +0200 +@@ -46,6 +46,8 @@ + # ifndef FTL_ERROR_H + # define FTL_ERROR_H + ++# include ++ + /*------------------------------------------------------------\ + | | + | Constants | +diff -Naur alliance-5.0/ftl/src/Makefile.in alliance/ftl/src/Makefile.in +--- alliance-5.0/ftl/src/Makefile.in 2007-07-18 19:04:32.000000000 +0200 ++++ alliance/ftl/src/Makefile.in 2009-06-13 22:27:28.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libFtl_la_SOURCES) $(fsmtest_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -70,11 +68,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libFtl_la_SOURCES) $(fsmtest_SOURCES) + DIST_SOURCES = $(libFtl_la_SOURCES) $(fsmtest_SOURCES) +@@ -149,6 +147,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -171,6 +172,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -237,6 +241,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -248,6 +255,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -297,6 +307,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -304,6 +317,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-fvh.patch b/alliance-fvh.patch new file mode 100644 index 0000000..961cd91 --- /dev/null +++ b/alliance-fvh.patch @@ -0,0 +1,904 @@ +diff -Naur alliance-5.0/fvh/configure.in alliance/fvh/configure.in +--- alliance-5.0/fvh/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/fvh/configure.in 2002-10-16 20:04:23.000000000 +0200 +@@ -0,0 +1,48 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.3 2002/10/16 18:04:23 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/fvh.h) ++FVH_DLL_VERSION=1:4:0 ++AC_SUBST(FVH_DLL_VERSION) ++AM_INIT_AUTOMAKE(fvh, 1.4) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_YACC ++AM_PROG_LEX ++AC_HEADER_STDC ++AC_C_CONST ++AM_PROG_LIBTOOL ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/fvh/Makefile.in alliance/fvh/Makefile.in +--- alliance-5.0/fvh/Makefile.in 2007-07-18 19:04:32.000000000 +0200 ++++ alliance/fvh/Makefile.in 2009-06-13 22:27:28.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/fvh/src/fbl_bcomp_y.y alliance/fvh/src/fbl_bcomp_y.y +--- alliance-5.0/fvh/src/fbl_bcomp_y.y 2004-07-13 23:56:13.000000000 +0200 ++++ alliance/fvh/src/fbl_bcomp_y.y 2009-06-13 19:46:26.000000000 +0200 +@@ -58,13 +58,13 @@ + static long chktab (); + static void fretab (); + void *fbl_addstr (); +-int fbl_chkdcl (); ++long fbl_chkdcl (); + struct ptype *reversetype(); + struct choice_chain *order_choice(); + %} + + %union { +- int valu; ++ long valu; + char *text; + struct ptype *ptyp; + struct fbpcs proc; +@@ -522,7 +522,7 @@ + simple_name + IS + { +- int type,size=0; ++ long type,size=0; + struct fbtyp *fbtyp_pnt; + char *name; + char *name_bit; +@@ -687,7 +687,7 @@ + .signal_kind. + { + char *signame; +- int sigconf; ++ long sigconf; + void *pnt; + + /* ###----------------------------------------------### */ +@@ -715,7 +715,7 @@ + addtab (hshtab,signame,FBL_MODNAM,FBL_WMNDFN,$6.LEFT); + addtab (hshtab,signame,FBL_MODNAM,FBL_WMXDFN,$6.RIGHT); + addtab (hshtab,signame,FBL_MODNAM,FBL_LBLDFN,$7); +- addtab (hshtab,signame,FBL_MODNAM,FBL_PNTDFN,(int)pnt); ++ addtab (hshtab,signame,FBL_MODNAM,FBL_PNTDFN,(long)pnt); + + FBL_NM1LST = delchain (FBL_NM1LST, FBL_NM1LST); + } +@@ -828,7 +828,7 @@ + char name[128]; + char value[128]; + char *pt; +- int field; ++ long field; + + field = sscanf((char *)$1,"-- %s %s %s %s", pragma,type,name,value); + +@@ -854,7 +854,7 @@ + constant_VarAsgn__expression + Semicolon_ERR + { +- int sigconf; ++ long sigconf; + + if (fbl_chkdcl ('C',0,val_type($4.NAME),$4.FLAG,0,$5.FLAG,&sigconf) == 0) + { +@@ -883,9 +883,9 @@ + Semicolon_ERR + { + char *signame; +- int sigconf; ++ long sigconf; + void *pnt; +- int errflg; ++ long errflg; + + errflg = fbl_chkdcl ('S',0,val_type($4.NAME),$4.FLAG,$6,$5.FLAG,&sigconf); + +@@ -917,7 +917,7 @@ + addtab (hshtab,signame,FBL_MODNAM,FBL_WMNDFN,$5.LEFT); + addtab (hshtab,signame,FBL_MODNAM,FBL_WMXDFN,$5.RIGHT); + addtab (hshtab,signame,FBL_MODNAM,FBL_LBLDFN,$6); +- addtab (hshtab,signame,FBL_MODNAM,FBL_PNTDFN,(int)pnt); ++ addtab (hshtab,signame,FBL_MODNAM,FBL_PNTDFN,(long)pnt); + + FBL_NM1LST = delchain (FBL_NM1LST,FBL_NM1LST); + +@@ -942,7 +942,7 @@ + addtab(hshtab,$2,FBL_MODNAM,FBL_SIGDFN,FBL_TPEDFN); + addtab(hshtab,$2,FBL_MODNAM,FBL_LBLDFN,$4.CLASS); + addtab(hshtab,$2,FBL_MODNAM,FBL_TYPDFN,FBL_NUMTYP); +- addtab (hshtab,$2,FBL_MODNAM,FBL_PNTDFN,(int)FBL_BEFPNT->BETYP); ++ addtab (hshtab,$2,FBL_MODNAM,FBL_PNTDFN,(long)FBL_BEFPNT->BETYP); + FBL_NUMTYP++; + } + Semicolon_ERR +@@ -969,7 +969,7 @@ + addtab(hshtab,$2,FBL_MODNAM,FBL_SIGDFN,FBL_TPEDFN); + addtab(hshtab,$2,FBL_MODNAM,FBL_LBLDFN,$4.CLASS); + addtab(hshtab,$2,FBL_MODNAM,FBL_TYPDFN,FBL_NUMTYP); +- addtab (hshtab,$2,FBL_MODNAM,FBL_PNTDFN,(int)FBL_BEFPNT->BETYP); ++ addtab (hshtab,$2,FBL_MODNAM,FBL_PNTDFN,(long)FBL_BEFPNT->BETYP); + FBL_NUMTYP++; + } + Semicolon_ERR +@@ -1004,8 +1004,8 @@ + RightParen_ERR + { + char *enumname; +- int size=0; +- int indice=0; ++ long size=0; ++ long indice=0; + char **pnt; + chain_list *nm1lst; + +@@ -1034,7 +1034,7 @@ + addtab (hshtab,enumname,FBL_MODNAM,FBL_WMNDFN,-1); + addtab (hshtab,enumname,FBL_MODNAM,FBL_WMXDFN,-1); + addtab (hshtab,enumname,FBL_MODNAM,FBL_LBLDFN,indice); +- addtab (hshtab,enumname,FBL_MODNAM,FBL_PNTDFN,(int)pnt); ++ addtab (hshtab,enumname,FBL_MODNAM,FBL_PNTDFN,(long)pnt); + + pnt[indice++] = enumname; + FBL_NM1LST = delchain (FBL_NM1LST, FBL_NM1LST); +@@ -1147,7 +1147,7 @@ + type_mark + : simple_name + { +- int type; ++ long type; + $$.NAME = $1; + $$.LEFT = -1; + $$.RIGHT = -1; +@@ -1280,7 +1280,7 @@ + waveform + Semicolon_ERR + { +- int i; ++ long i; + struct fbout *fbout_pnt; + struct fbbus *fbbus_pnt; + struct fbreg *fbreg_pnt; +@@ -1294,15 +1294,15 @@ + struct fbl_expr expr4; + struct fbl_expr expr5; + struct fbl_expr expr6; +- int rev_flg = 0; +- int left_bnd; +- int right_bnd; +- int left; +- int right; +- int in_bound; +- int out_bound; +- int sig_width; +- int sig_conf; ++ long rev_flg = 0; ++ long left_bnd; ++ long right_bnd; ++ long left; ++ long right; ++ long in_bound; ++ long out_bound; ++ long sig_width; ++ long sig_conf; + + expr4 = $5; + +@@ -1587,7 +1587,7 @@ + ...waveform__WHEN__choices.. + Semicolon_ERR + { +- int i; ++ long i; + struct fbout *fbout_pnt; + struct fbbus *fbbus_pnt; + struct fbreg *fbreg_pnt; +@@ -1595,15 +1595,15 @@ + struct fbbux *fbbux_pnt; + struct chain *abl_pnt; + struct fbl_expr expr1; +- int rev_flg = 0; +- int left_bnd; +- int right_bnd; +- int left; +- int right; +- int in_bound; +- int out_bound; +- int sig_width; +- int sig_conf; ++ long rev_flg = 0; ++ long left_bnd; ++ long right_bnd; ++ long left; ++ long right; ++ long in_bound; ++ long out_bound; ++ long sig_width; ++ long sig_conf; + + expr1 = fbl_crtabl (ABL_OR ,$8 ,$9,-1,-1); + if (FBL_BDDPNT != getlogbddnodeone()) +@@ -1979,13 +1979,13 @@ + _LESym + waveform + Semicolon_ERR +- { unsigned int type; +- int sig_conf,i; +- int left_bnd,right_bnd; +- int in_bound,out_bound; +- int left ,right; +- int rev_flg, debut; +- int sig_width; ++ { unsigned long type; ++ long sig_conf,i; ++ long left_bnd,right_bnd; ++ long in_bound,out_bound; ++ long left ,right; ++ long rev_flg, debut; ++ long sig_width; + struct chain *abl_pnt; + char extname[100]; + struct fbl_expr expr; +@@ -2225,9 +2225,9 @@ + CASE + Semicolon_ERR + { +- unsigned int size=1; +- unsigned int *size1; +- int indice=0; ++ unsigned long size=1; ++ unsigned long *size1; ++ long indice=0; + struct choice_chain *ch; + struct fbcho **pnt; + struct fbcho *tab; +@@ -2257,7 +2257,7 @@ + tab[indice].SIZE = -1; + tab[indice++].VALUE = namealloc("others"); + (*pnt) = tab; +- size1 = (unsigned int*) FBL_NM1LST->DATA; ++ size1 = (unsigned long*) FBL_NM1LST->DATA; + *size1 = size; + FBL_NM1LST = delchain(FBL_NM1LST,FBL_NM1LST); + FBL_OTHPNT = 0; +@@ -2414,13 +2414,13 @@ + { + char *val; + char val2[256]; +- int left; +- int right; +- int in_bound; +- int out_bound; +- int left_bnd; +- int right_bnd; +- int sig_conf; ++ long left; ++ long right; ++ long in_bound; ++ long out_bound; ++ long left_bnd; ++ long right_bnd; ++ long sig_conf; + + strcpy (val2,"B\""); + sig_conf = chktab (hshtab,$1.NAME,FBL_MODNAM,FBL_SIGDFN); +@@ -2646,15 +2646,15 @@ + | name + { + struct fbl_expr expr1; +- int left; +- int right; +- int left_bnd; +- int right_bnd; +- int in_bound; +- int out_bound; +- int mode; +- int prtype; +- int type; ++ long left; ++ long right; ++ long left_bnd; ++ long right_bnd; ++ long in_bound; ++ long out_bound; ++ long mode; ++ long prtype; ++ long type; + + mode = chktab (hshtab,$1.NAME,FBL_MODNAM,FBL_SIGDFN); + type = chktab(hshtab,$1.NAME,FBL_MODNAM,FBL_TYPDFN); +@@ -2769,7 +2769,7 @@ + else + { + expr1.IDENT = (char *)chktab(hshtab,$1.NAME,0,FBL_PNTDFN); +- expr1.TYPE =(int)-1;/*dec, cast int */ ++ expr1.TYPE =(long)-1;/*dec, cast long */ + $$ = fbl_crtabl (NOPS,expr1,FBL_EMPSTR,in_bound,out_bound); + } + } +@@ -2864,9 +2864,9 @@ + { + char extname[100]; + char *lclname; +- int sig_conf; +- int type; +- int kind; ++ long sig_conf; ++ long type; ++ long kind; + struct fbl_expr expr1; + struct fbl_expr expr2; + struct chain *ptabl; +@@ -3035,7 +3035,7 @@ + + { + struct dct_entry *entry; +- int i; ++ long i; + + if (FBL_DCEHED == 0) + { +@@ -3068,7 +3068,7 @@ + + { + struct dct_recrd *recrd; +- int i; ++ long i; + + if (FBL_DCRHED == 0) + { +@@ -3105,7 +3105,7 @@ + + { + struct dct_entry **head; +- int i; ++ long i; + + head = (struct dct_entry **) + mbkalloc (sizeof(struct dct_entry *) * FBL_HSZDFN); +@@ -3121,12 +3121,12 @@ + struct dct_entry **head; + char *key_str; + char *ctx_str; +-int field; ++long field; + long valu; + + { +- int found = 0; +- int index; ++ long found = 0; ++ long index; + struct dct_entry *entry_pnt; + struct dct_recrd *recrd_pnt; + +@@ -3202,11 +3202,11 @@ + struct dct_entry **head; + char *key_str; + char *ctx_str; +-int field; ++long field; + + { +- int found = 0; +- int valu = 0; ++ long found = 0; ++ long valu = 0; + struct dct_entry *entry_pnt; + struct dct_recrd *recrd_pnt; + +@@ -3277,7 +3277,7 @@ + struct dct_entry *pt_entry; + struct dct_entry *pt_nxtentry; + struct dct_recrd *pt_record; +- int i; ++ long i; + + if (pt_hash != 0) + { +@@ -3310,8 +3310,8 @@ + + struct fbfig *ptfig; + char object; +-int mode; +-int prtype; ++long mode; ++long prtype; + unsigned char type; + char flag; + char *name; +@@ -3511,19 +3511,19 @@ + return (pnt); + } + +-int fbl_chkdcl (object,mode,type,flag,kind,constraint,conf) ++long fbl_chkdcl (object,mode,type,flag,kind,constraint,conf) + + char object; +-int mode; +-int type; ++long mode; ++long type; + char flag; +-int kind; ++long kind; + char constraint; +-int *conf; ++long *conf; + + { +- int errflg = 0; +- int lclcnf = 0; ++ long errflg = 0; ++ long lclcnf = 0; + + if (flag != constraint && constraint !='U' && flag !='U') + { +@@ -3695,7 +3695,7 @@ + return (errflg); + } + +-int val_type(name) ++long val_type(name) + char *name; + { + if(!name) +@@ -3760,7 +3760,7 @@ + struct choice_chain *lastpnt; + struct ptype *type; + char *val; +- unsigned int size; ++ unsigned long size; + { + struct choice_chain *pnt; + +@@ -3776,7 +3776,7 @@ + struct choice_chain *pnt; + struct ptype *type; + char *val; +- unsigned int size; ++ unsigned long size; + { + struct choice_chain *aux1; + struct choice_chain *aux2; +diff -Naur alliance-5.0/fvh/src/fbl_bspec.c alliance/fvh/src/fbl_bspec.c +--- alliance-5.0/fvh/src/fbl_bspec.c 2002-09-30 18:20:17.000000000 +0200 ++++ alliance/fvh/src/fbl_bspec.c 2009-06-13 19:47:44.000000000 +0200 +@@ -79,8 +79,8 @@ + struct fbgen *ptgen; + struct chain *ptauxnam; + struct chain *ptauxnat; +- int i; +- int inc = 1; ++ long i; ++ long inc = 1; + + ptgen = lastgeneric; + ptauxnam = nam_lst; +@@ -141,8 +141,8 @@ + + { + char *resstr; +- int i; +- int j=0; ++ long i; ++ long j=0; + + resstr = (char *)mbkalloc(100); + resstr[0] = '\0'; +@@ -226,8 +226,8 @@ + short oper; + fbl_ablstr expr1; + fbl_ablstr expr2; +-int left; +-int right; ++long left; ++long right; + + { + char name[256]; +@@ -677,11 +677,11 @@ + /* description : transform a ENUMERATE */ + /* in a string of '0' and '1's */ + /* ###--------------------------------------------------------------### */ +-int fbl_bintonum(str) ++long fbl_bintonum(str) + char* str; + + { +- int res,i=0; ++ long res,i=0; + + res = 0; + while(str[i]) +@@ -699,12 +699,12 @@ + /* in a string of '0' and '1's */ + /* ###--------------------------------------------------------------### */ + char *fbl_numtobin(num) +-int num; ++long num; + + { + char val[256]; + char *str; +- int res,i=1; ++ long res,i=1; + + val[255] = '\0'; + res = num; +@@ -724,18 +724,18 @@ + /* in a string of '0' and '1's */ + /* ###--------------------------------------------------------------### */ + +-int fbl_tobin (trg,src,left,right) ++long fbl_tobin (trg,src,left,right) + + char *trg; + char *src; +-int left; +-int right; ++long left; ++long right; + + { + char base; +- int indx; +- int j = 0; +- int errflg = 0; ++ long indx; ++ long j = 0; ++ long errflg = 0; + char lcl_trg[256]; + + lcl_trg[0] = '\0'; +@@ -927,7 +927,7 @@ + fbl_ablstr *pt_ablstr; /* tested expression */ + { + char binstr[512]; +- int i; ++ long i; + struct chain *pt_auxabl; + bddnode *pt_bddres; + bddnode *pt_bddnew; +@@ -936,8 +936,8 @@ + char nomvar[10]; + struct chain *pt_newabl; + struct chain *pt_newabl2; +- static int oth_flg=0; +- static int last_width=0; ++ static long oth_flg=0; ++ static long last_width=0; + + result->LIST_ABL = NULL; + result->IDENT = NULL; +diff -Naur alliance-5.0/fvh/src/fbl_bspec.h alliance/fvh/src/fbl_bspec.h +--- alliance-5.0/fvh/src/fbl_bspec.h 2002-09-30 18:20:17.000000000 +0200 ++++ alliance/fvh/src/fbl_bspec.h 2009-06-13 19:47:09.000000000 +0200 +@@ -57,11 +57,11 @@ + + extern struct chain * fbl_cpyabllst __P((struct chain *abllst)); + extern fbl_ablstr fbl_cpyablstr __P((fbl_ablstr ablstr)); +- extern fbl_ablstr fbl_crtabl __P((short oper, fbl_ablstr expr1, fbl_ablstr expr2, int left, int right)); +- extern char * fbl_numtobin __P((int num)); +- extern int fbl_tobin __P((char *trg, char *src, int left, int right)); +- extern void loc_fbl_error __P((int code, char *str1)); +- extern void fbl_toolbug __P((int code, char *str1, char *str2, int nbr1)); ++ extern fbl_ablstr fbl_crtabl __P((short oper, fbl_ablstr expr1, fbl_ablstr expr2, long left, long right)); ++ extern char * fbl_numtobin __P((long num)); ++ extern long fbl_tobin __P((char *trg, char *src, long left, long right)); ++ extern void loc_fbl_error __P((long code, char *str1)); ++ extern void fbl_toolbug __P((long code, char *str1, char *str2, long nbr1)); + + # define fbl_error( C, S ) \ + fprintf( stderr, "%s.%d: ", autbasename(__FILE__,NULL),__LINE__ ); loc_fbl_error( C, S ); +diff -Naur alliance-5.0/fvh/src/fbl_byacc.h alliance/fvh/src/fbl_byacc.h +--- alliance-5.0/fvh/src/fbl_byacc.h 2002-09-30 18:20:17.000000000 +0200 ++++ alliance/fvh/src/fbl_byacc.h 2009-06-13 19:46:49.000000000 +0200 +@@ -66,7 +66,7 @@ + + struct g_type + { +- int VALU; ++ long VALU; + char FLAG; + }; + +@@ -74,7 +74,7 @@ + { + struct choice_chain* NEXT; + char *VALUE; +- unsigned int SIZE; ++ unsigned long SIZE; + struct ptype *INSTRUCTION; + }; + +@@ -84,7 +84,7 @@ + + struct bddnode *FBL_BDDPNT = NULL; /* BDD pointer */ + static char *FBL_LBLNAM = NULL; /* label */ +-static int FBL_NUMTYP = 0; /* nombre de type */ ++static long FBL_NUMTYP = 0; /* nombre de type */ + static struct chain *FBL_NM1LST = NULL; /* 1-st name liste */ + static struct chain *FBL_GRDLST = NULL; /* list of guard's ABL */ + static struct chain *FBL_CNDLST = NULL; /* list of conditions (ABL) */ +@@ -102,22 +102,22 @@ + + extern char FBL_ERRFLG; /* set to 1 in case of error */ + extern struct fbfig *FBL_HEADFIG; /* head of fbfigs */ +-extern int FBL_LINNUM; +-extern int FBL_NUMPTP; ++extern long FBL_LINNUM; ++extern long FBL_NUMPTP; + + + static struct dct_entry **hshtab; + + extern struct fbgen * fbl_addgen __P((struct fbgen *lastgeneric, struct chain *nam_lst, struct chain *nat_lst, char *type, short left, short right)); +- extern int val_type __P((char *name)); ++ extern long val_type __P((char *name)); + +- extern int fbl_tobin __P((char *trg, char *src, int left, int right)); +- extern int fbl_bintonum __P((char *str)); +- extern fbl_ablstr fbl_crtabl __P((short oper, fbl_ablstr expr1, fbl_ablstr expr2, int left, int right)); ++ extern long fbl_tobin __P((char *trg, char *src, long left, long right)); ++ extern long fbl_bintonum __P((char *str)); ++ extern fbl_ablstr fbl_crtabl __P((short oper, fbl_ablstr expr1, fbl_ablstr expr2, long left, long right)); + extern fbl_ablstr fbl_cpyablstr __P((fbl_ablstr ablstr)); + extern void fbl_select(); + extern char * fbl_stostr __P((char *str)); + + extern void fbl_y_error __P((char *str)); +- extern int fbl_y_lex __P(()); ++ extern long fbl_y_lex __P(()); + +diff -Naur alliance-5.0/fvh/src/Makefile.in alliance/fvh/src/Makefile.in +--- alliance-5.0/fvh/src/Makefile.in 2007-07-18 19:04:33.000000000 +0200 ++++ alliance/fvh/src/Makefile.in 2009-06-13 22:27:28.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -15,8 +15,6 @@ + @SET_MAKE@ + + +-SOURCES = $(libFvh_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -69,11 +67,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) + LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +@@ -153,6 +151,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -175,6 +176,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -241,6 +245,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -252,6 +259,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -301,6 +311,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -308,6 +321,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-gcc43.patch b/alliance-gcc43.patch deleted file mode 100755 index 6c63b72..0000000 --- a/alliance-gcc43.patch +++ /dev/null @@ -1,47 +0,0 @@ -diff -Nur alliance-5.0.old/nero/src/ADefs.h alliance-5.0/nero/src/ADefs.h ---- alliance-5.0.old/nero/src/ADefs.h 2002-10-29 19:46:03.000000000 +0100 -+++ alliance-5.0/nero/src/ADefs.h 2008-03-19 03:16:12.000000000 +0100 -@@ -138,7 +138,7 @@ - - // Allocators. - private: static void *operator new (size_t size); -- private: static void operator delete (void *zone); -+ public: static void operator delete (void *zone); - public: static void *operator new (size_t size, CNodeASSet &NS); - - // Modifiers. -diff -Nur alliance-5.0.old/nero/src/MDefs.h alliance-5.0/nero/src/MDefs.h ---- alliance-5.0.old/nero/src/MDefs.h 2005-10-10 17:34:05.000000000 +0200 -+++ alliance-5.0/nero/src/MDefs.h 2008-03-19 01:08:24.000000000 +0100 -@@ -25,6 +25,8 @@ - - - # include "UDefs.h" -+# include -+# include - - - -diff -Nur alliance-5.0.old/ocp/src/placer/PPlacement.h alliance-5.0/ocp/src/placer/PPlacement.h ---- alliance-5.0.old/ocp/src/placer/PPlacement.h 2006-03-30 21:07:47.000000000 +0200 -+++ alliance-5.0/ocp/src/placer/PPlacement.h 2008-03-19 01:10:41.000000000 +0100 -@@ -43,6 +43,7 @@ - #include - #include - #include -+#include - using namespace std; - - #include "mut.h" -diff -Nur alliance-5.0.old/sea/src/DEF_grammar_lex.l alliance-5.0/sea/src/DEF_grammar_lex.l ---- alliance-5.0.old/sea/src/DEF_grammar_lex.l 2002-04-25 18:16:20.000000000 +0200 -+++ alliance-5.0/sea/src/DEF_grammar_lex.l 2008-03-19 01:11:28.000000000 +0100 -@@ -18,7 +18,7 @@ - # define yylineno DEF_grammarlineno - - -- int yylineno = 1; -+ // int yylineno = 1; - - - static int yywrap(void); diff --git a/alliance-gcp.patch b/alliance-gcp.patch new file mode 100644 index 0000000..e692102 --- /dev/null +++ b/alliance-gcp.patch @@ -0,0 +1,36890 @@ +diff -Naur alliance-5.0/gcp/configure.in alliance/gcp/configure.in +--- alliance-5.0/gcp/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/configure.in 2002-09-30 18:20:18.000000000 +0200 +@@ -0,0 +1,47 @@ ++dnl ++/* ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.2 2002/09/30 16:20:18 czo Exp $ ++dnl ++dnl ++AC_INIT(src/gcp.h) ++AM_INIT_AUTOMAKE(gcp, 1.1) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_PROG_YACC ++AM_PROG_LEX ++AC_HEADER_STDC ++AC_C_CONST ++AC_PROG_RANLIB ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++]) +diff -Naur alliance-5.0/gcp/Makefile.am alliance/gcp/Makefile.am +--- alliance-5.0/gcp/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/Makefile.am 2002-03-29 18:39:11.000000000 +0100 +@@ -0,0 +1 @@ ++SUBDIRS = src +diff -Naur alliance-5.0/gcp/Makefile.in alliance/gcp/Makefile.in +--- alliance-5.0/gcp/Makefile.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/Makefile.in 2009-06-13 22:27:29.000000000 +0200 +@@ -0,0 +1,670 @@ ++# Makefile.in generated by automake 1.9.6 from Makefile.am. ++# @configure_input@ ++ ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, ++# 2003, 2004, 2005 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++@SET_MAKE@ ++srcdir = @srcdir@ ++top_srcdir = @top_srcdir@ ++VPATH = @srcdir@ ++pkgdatadir = $(datadir)/@PACKAGE@ ++pkglibdir = $(libdir)/@PACKAGE@ ++pkgincludedir = $(includedir)/@PACKAGE@ ++top_builddir = .. ++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd ++INSTALL = @INSTALL@ ++install_sh_DATA = $(install_sh) -c -m 644 ++install_sh_PROGRAM = $(install_sh) -c ++install_sh_SCRIPT = $(install_sh) -c ++INSTALL_HEADER = $(INSTALL_DATA) ++transform = $(program_transform_name) ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++build_triplet = @build@ ++host_triplet = @host@ ++subdir = gcp ++DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/alliance.m4 $(top_srcdir)/motif.m4 \ ++ $(top_srcdir)/xpm.m4 $(top_srcdir)/configure.in ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++mkinstalldirs = $(install_sh) -d ++CONFIG_CLEAN_FILES = ++SOURCES = ++DIST_SOURCES = ++RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ ++ html-recursive info-recursive install-data-recursive \ ++ install-exec-recursive install-info-recursive \ ++ install-recursive installcheck-recursive installdirs-recursive \ ++ pdf-recursive ps-recursive uninstall-info-recursive \ ++ uninstall-recursive ++ETAGS = etags ++CTAGS = ctags ++DIST_SUBDIRS = $(SUBDIRS) ++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ++ABE_DLL_VERSION = @ABE_DLL_VERSION@ ++ABL_DLL_VERSION = @ABL_DLL_VERSION@ ++ABT_DLL_VERSION = @ABT_DLL_VERSION@ ++ABV_DLL_VERSION = @ABV_DLL_VERSION@ ++ACLOCAL = @ACLOCAL@ ++ALCBANNER_MAJOR_VERSION = @ALCBANNER_MAJOR_VERSION@ ++ALCBANNER_MINOR_VERSION = @ALCBANNER_MINOR_VERSION@ ++ALCBANNER_VERSION = @ALCBANNER_VERSION@ ++ALLIANCE_BUILD_FALSE = @ALLIANCE_BUILD_FALSE@ ++ALLIANCE_BUILD_TRUE = @ALLIANCE_BUILD_TRUE@ ++ALLIANCE_CFLAGS = @ALLIANCE_CFLAGS@ ++ALLIANCE_LIBS = @ALLIANCE_LIBS@ ++ALLIANCE_TOP = @ALLIANCE_TOP@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ ++AMTAR = @AMTAR@ ++AR = @AR@ ++ATTILA_MAJOR_VERSION = @ATTILA_MAJOR_VERSION@ ++ATTILA_MINOR_VERSION = @ATTILA_MINOR_VERSION@ ++ATTILA_VERSION = @ATTILA_VERSION@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ ++AUT_DLL_VERSION = @AUT_DLL_VERSION@ ++AWK = @AWK@ ++B2F_MAJOR_VERSION = @B2F_MAJOR_VERSION@ ++B2F_MINOR_VERSION = @B2F_MINOR_VERSION@ ++B2F_VERSION = @B2F_VERSION@ ++BDD_DLL_VERSION = @BDD_DLL_VERSION@ ++BEH_DLL_VERSION = @BEH_DLL_VERSION@ ++BHL_DLL_VERSION = @BHL_DLL_VERSION@ ++BOOG_MAJOR_VERSION = @BOOG_MAJOR_VERSION@ ++BOOG_MINOR_VERSION = @BOOG_MINOR_VERSION@ ++BOOG_VERSION = @BOOG_VERSION@ ++BOOM_MAJOR_VERSION = @BOOM_MAJOR_VERSION@ ++BOOM_MINOR_VERSION = @BOOM_MINOR_VERSION@ ++BOOM_VERSION = @BOOM_VERSION@ ++BTR_DLL_VERSION = @BTR_DLL_VERSION@ ++BVL_DLL_VERSION = @BVL_DLL_VERSION@ ++CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ ++CST_DLL_VERSION = @CST_DLL_VERSION@ ++CTL_DLL_VERSION = @CTL_DLL_VERSION@ ++CTP_DLL_VERSION = @CTP_DLL_VERSION@ ++CXX = @CXX@ ++CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ ++DEPDIR = @DEPDIR@ ++DOC_MAJOR_VERSION = @DOC_MAJOR_VERSION@ ++DOC_MINOR_VERSION = @DOC_MINOR_VERSION@ ++DOC_VERSION = @DOC_VERSION@ ++DREAL_MAJOR_VERSION = @DREAL_MAJOR_VERSION@ ++DREAL_MINOR_VERSION = @DREAL_MINOR_VERSION@ ++DREAL_VERSION = @DREAL_VERSION@ ++ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ ++EXEEXT = @EXEEXT@ ++EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ ++EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ ++EXP_VERSION = @EXP_VERSION@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ ++FKS_DLL_VERSION = @FKS_DLL_VERSION@ ++FLATBEH_MAJOR_VERSION = @FLATBEH_MAJOR_VERSION@ ++FLATBEH_MINOR_VERSION = @FLATBEH_MINOR_VERSION@ ++FLATBEH_VERSION = @FLATBEH_VERSION@ ++FMI_MAJOR_VERSION = @FMI_MAJOR_VERSION@ ++FMI_MINOR_VERSION = @FMI_MINOR_VERSION@ ++FMI_VERSION = @FMI_VERSION@ ++FSM_DLL_VERSION = @FSM_DLL_VERSION@ ++FSP_MAJOR_VERSION = @FSP_MAJOR_VERSION@ ++FSP_MINOR_VERSION = @FSP_MINOR_VERSION@ ++FSP_VERSION = @FSP_VERSION@ ++FTL_DLL_VERSION = @FTL_DLL_VERSION@ ++FVH_DLL_VERSION = @FVH_DLL_VERSION@ ++GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ ++GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ ++GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ ++INCLUDE_MOTIF = @INCLUDE_MOTIF@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ ++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++K2F_MAJOR_VERSION = @K2F_MAJOR_VERSION@ ++K2F_MINOR_VERSION = @K2F_MINOR_VERSION@ ++K2F_VERSION = @K2F_VERSION@ ++L2P_MAJOR_VERSION = @L2P_MAJOR_VERSION@ ++L2P_MINOR_VERSION = @L2P_MINOR_VERSION@ ++L2P_VERSION = @L2P_VERSION@ ++LDFLAGS = @LDFLAGS@ ++LEX = @LEX@ ++LEXLIB = @LEXLIB@ ++LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ ++LIBOBJS = @LIBOBJS@ ++LIBS = @LIBS@ ++LIBTOOL = @LIBTOOL@ ++LINK_MOTIF = @LINK_MOTIF@ ++LINK_XPM = @LINK_XPM@ ++LN_S = @LN_S@ ++LOG_DLL_VERSION = @LOG_DLL_VERSION@ ++LOON_MAJOR_VERSION = @LOON_MAJOR_VERSION@ ++LOON_MINOR_VERSION = @LOON_MINOR_VERSION@ ++LOON_VERSION = @LOON_VERSION@ ++LTLIBOBJS = @LTLIBOBJS@ ++LVX_MAJOR_VERSION = @LVX_MAJOR_VERSION@ ++LVX_MINOR_VERSION = @LVX_MINOR_VERSION@ ++LVX_VERSION = @LVX_VERSION@ ++LYNX_MAJOR_VERSION = @LYNX_MAJOR_VERSION@ ++LYNX_MINOR_VERSION = @LYNX_MINOR_VERSION@ ++LYNX_VERSION = @LYNX_VERSION@ ++M2E_MAJOR_VERSION = @M2E_MAJOR_VERSION@ ++M2E_MINOR_VERSION = @M2E_MINOR_VERSION@ ++M2E_VERSION = @M2E_VERSION@ ++MAKEINFO = @MAKEINFO@ ++MAL_DLL_VERSION = @MAL_DLL_VERSION@ ++MAP_DLL_VERSION = @MAP_DLL_VERSION@ ++MBK_CUR = @MBK_CUR@ ++MBK_DLL_VERSION = @MBK_DLL_VERSION@ ++MBK_REL = @MBK_REL@ ++MBK_REV = @MBK_REV@ ++MBK_VERSION = @MBK_VERSION@ ++MCL_DLL_VERSION = @MCL_DLL_VERSION@ ++MCP_DLL_VERSION = @MCP_DLL_VERSION@ ++MEL_DLL_VERSION = @MEL_DLL_VERSION@ ++MGL_DLL_VERSION = @MGL_DLL_VERSION@ ++MGN_DLL_VERSION = @MGN_DLL_VERSION@ ++MHL_DLL_VERSION = @MHL_DLL_VERSION@ ++MIPS_ASM_MAJOR_VERSION = @MIPS_ASM_MAJOR_VERSION@ ++MIPS_ASM_MINOR_VERSION = @MIPS_ASM_MINOR_VERSION@ ++MIPS_ASM_VERSION = @MIPS_ASM_VERSION@ ++MMG_DLL_VERSION = @MMG_DLL_VERSION@ ++MOCHA_MAJOR_VERSION = @MOCHA_MAJOR_VERSION@ ++MOCHA_MINOR_VERSION = @MOCHA_MINOR_VERSION@ ++MOCHA_VERSION = @MOCHA_VERSION@ ++MSL_DLL_VERSION = @MSL_DLL_VERSION@ ++MVG_DLL_VERSION = @MVG_DLL_VERSION@ ++MVL_DLL_VERSION = @MVL_DLL_VERSION@ ++NERO_MAJOR_VERSION = @NERO_MAJOR_VERSION@ ++NERO_MINOR_VERSION = @NERO_MINOR_VERSION@ ++NERO_VERSION = @NERO_VERSION@ ++OBJEXT = @OBJEXT@ ++OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ ++OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ ++OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ ++PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PAT2SPI_MAJOR_VERSION = @PAT2SPI_MAJOR_VERSION@ ++PAT2SPI_MINOR_VERSION = @PAT2SPI_MINOR_VERSION@ ++PAT2SPI_VERSION = @PAT2SPI_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ ++PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ ++PGN_DLL_VERSION = @PGN_DLL_VERSION@ ++PHL_DLL_VERSION = @PHL_DLL_VERSION@ ++PPT_DLL_VERSION = @PPT_DLL_VERSION@ ++PROOF_MAJOR_VERSION = @PROOF_MAJOR_VERSION@ ++PROOF_MINOR_VERSION = @PROOF_MINOR_VERSION@ ++PROOF_VERSION = @PROOF_VERSION@ ++RANLIB = @RANLIB@ ++RCF_DLL_VERSION = @RCF_DLL_VERSION@ ++RDS_DLL_VERSION = @RDS_DLL_VERSION@ ++RFM_DLL_VERSION = @RFM_DLL_VERSION@ ++RGS_DLL_VERSION = @RGS_DLL_VERSION@ ++RING_MAJOR_VERSION = @RING_MAJOR_VERSION@ ++RING_MINOR_VERSION = @RING_MINOR_VERSION@ ++RING_VERSION = @RING_VERSION@ ++RPR_DLL_VERSION = @RPR_DLL_VERSION@ ++RTD_DLL_VERSION = @RTD_DLL_VERSION@ ++RTL_DLL_VERSION = @RTL_DLL_VERSION@ ++RTN_DLL_VERSION = @RTN_DLL_VERSION@ ++RUT_DLL_VERSION = @RUT_DLL_VERSION@ ++RWI_DLL_VERSION = @RWI_DLL_VERSION@ ++S2R_MAJOR_VERSION = @S2R_MAJOR_VERSION@ ++S2R_MINOR_VERSION = @S2R_MINOR_VERSION@ ++S2R_VERSION = @S2R_VERSION@ ++SCAPIN_MAJOR_VERSION = @SCAPIN_MAJOR_VERSION@ ++SCAPIN_MINOR_VERSION = @SCAPIN_MINOR_VERSION@ ++SCAPIN_VERSION = @SCAPIN_VERSION@ ++SCH_DLL_VERSION = @SCH_DLL_VERSION@ ++SCL_DLL_VERSION = @SCL_DLL_VERSION@ ++SEA_MAJOR_VERSION = @SEA_MAJOR_VERSION@ ++SEA_MINOR_VERSION = @SEA_MINOR_VERSION@ ++SEA_VERSION = @SEA_VERSION@ ++SED = @SED@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ ++STRIP = @STRIP@ ++SYF_MAJOR_VERSION = @SYF_MAJOR_VERSION@ ++SYF_MINOR_VERSION = @SYF_MINOR_VERSION@ ++SYF_VERSION = @SYF_VERSION@ ++TOOLSDIRS = @TOOLSDIRS@ ++VASY_MAJOR_VERSION = @VASY_MAJOR_VERSION@ ++VASY_MINOR_VERSION = @VASY_MINOR_VERSION@ ++VASY_VERSION = @VASY_VERSION@ ++VBH_DLL_VERSION = @VBH_DLL_VERSION@ ++VBL_DLL_VERSION = @VBL_DLL_VERSION@ ++VERSION = @VERSION@ ++VEX_DLL_VERSION = @VEX_DLL_VERSION@ ++VPD_DLL_VERSION = @VPD_DLL_VERSION@ ++VPN_DLL_VERSION = @VPN_DLL_VERSION@ ++VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ ++VTL_DLL_VERSION = @VTL_DLL_VERSION@ ++VVH_DLL_VERSION = @VVH_DLL_VERSION@ ++X11_LIBS = @X11_LIBS@ ++XEXT_LIBS = @XEXT_LIBS@ ++XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ ++XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ ++XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ ++XM_LIBS = @XM_LIBS@ ++XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ ++XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ ++XPAT_VERSION = @XPAT_VERSION@ ++XPM_LIBS = @XPM_LIBS@ ++XP_LIBS = @XP_LIBS@ ++XSCH_MAJOR_VERSION = @XSCH_MAJOR_VERSION@ ++XSCH_MINOR_VERSION = @XSCH_MINOR_VERSION@ ++XSCH_VERSION = @XSCH_VERSION@ ++XT_LIBS = @XT_LIBS@ ++XVPN_MAJOR_VERSION = @XVPN_MAJOR_VERSION@ ++XVPN_MINOR_VERSION = @XVPN_MINOR_VERSION@ ++XVPN_VERSION = @XVPN_VERSION@ ++X_CFLAGS = @X_CFLAGS@ ++X_EXTRA_LIBS = @X_EXTRA_LIBS@ ++X_LIBS = @X_LIBS@ ++X_PRE_LIBS = @X_PRE_LIBS@ ++YACC = @YACC@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ ++am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ ++am__quote = @am__quote@ ++am__tar = @am__tar@ ++am__untar = @am__untar@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ ++datadir = @datadir@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ ++install_sh = @install_sh@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++mkdir_p = @mkdir_p@ ++oldincludedir = @oldincludedir@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ ++SUBDIRS = src ++all: all-recursive ++ ++.SUFFIXES: ++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) ++ @for dep in $?; do \ ++ case '$(am__configure_deps)' in \ ++ *$$dep*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ ++ && exit 0; \ ++ exit 1;; \ ++ esac; \ ++ done; \ ++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gcp/Makefile'; \ ++ cd $(top_srcdir) && \ ++ $(AUTOMAKE) --foreign gcp/Makefile ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ ++ esac; ++ ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++$(top_srcdir)/configure: $(am__configure_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++$(ACLOCAL_M4): $(am__aclocal_m4_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++mostlyclean-libtool: ++ -rm -f *.lo ++ ++clean-libtool: ++ -rm -rf .libs _libs ++ ++distclean-libtool: ++ -rm -f libtool ++uninstall-info-am: ++ ++# This directory's subdirectories are mostly independent; you can cd ++# into them and run `make' without going through this Makefile. ++# To change the values of `make' variables: instead of editing Makefiles, ++# (1) if the variable is set in `config.status', edit `config.status' ++# (which will cause the Makefiles to be regenerated when you run `make'); ++# (2) otherwise, pass the desired values on the `make' command line. ++$(RECURSIVE_TARGETS): ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ ++ dot_seen=no; \ ++ target=`echo $@ | sed s/-recursive//`; \ ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ echo "Making $$target in $$subdir"; \ ++ if test "$$subdir" = "."; then \ ++ dot_seen=yes; \ ++ local_target="$$target-am"; \ ++ else \ ++ local_target="$$target"; \ ++ fi; \ ++ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ ++ || eval $$failcom; \ ++ done; \ ++ if test "$$dot_seen" = "no"; then \ ++ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ ++ fi; test -z "$$fail" ++ ++mostlyclean-recursive clean-recursive distclean-recursive \ ++maintainer-clean-recursive: ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ ++ dot_seen=no; \ ++ case "$@" in \ ++ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ ++ *) list='$(SUBDIRS)' ;; \ ++ esac; \ ++ rev=''; for subdir in $$list; do \ ++ if test "$$subdir" = "."; then :; else \ ++ rev="$$subdir $$rev"; \ ++ fi; \ ++ done; \ ++ rev="$$rev ."; \ ++ target=`echo $@ | sed s/-recursive//`; \ ++ for subdir in $$rev; do \ ++ echo "Making $$target in $$subdir"; \ ++ if test "$$subdir" = "."; then \ ++ local_target="$$target-am"; \ ++ else \ ++ local_target="$$target"; \ ++ fi; \ ++ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ ++ || eval $$failcom; \ ++ done && test -z "$$fail" ++tags-recursive: ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ ++ done ++ctags-recursive: ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ ++ done ++ ++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ mkid -fID $$unique ++tags: TAGS ++ ++TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ ++ include_option=--etags-include; \ ++ empty_fix=.; \ ++ else \ ++ include_option=--include; \ ++ empty_fix=; \ ++ fi; \ ++ list='$(SUBDIRS)'; for subdir in $$list; do \ ++ if test "$$subdir" = .; then :; else \ ++ test ! -f $$subdir/TAGS || \ ++ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ ++ fi; \ ++ done; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ ++ test -n "$$unique" || unique=$$empty_fix; \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ $$tags $$unique; \ ++ fi ++ctags: CTAGS ++CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ ++GTAGS: ++ here=`$(am__cd) $(top_builddir) && pwd` \ ++ && cd $(top_srcdir) \ ++ && gtags -i $(GTAGS_ARGS) $$here ++ ++distclean-tags: ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags ++ ++distdir: $(DISTFILES) ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ ++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ ++ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ ++ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ ++ dir="/$$dir"; \ ++ $(mkdir_p) "$(distdir)$$dir"; \ ++ else \ ++ dir=''; \ ++ fi; \ ++ if test -d $$d/$$file; then \ ++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ ++ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ ++ fi; \ ++ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ ++ else \ ++ test -f $(distdir)/$$file \ ++ || cp -p $$d/$$file $(distdir)/$$file \ ++ || exit 1; \ ++ fi; \ ++ done ++ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ ++ if test "$$subdir" = .; then :; else \ ++ test -d "$(distdir)/$$subdir" \ ++ || $(mkdir_p) "$(distdir)/$$subdir" \ ++ || exit 1; \ ++ distdir=`$(am__cd) $(distdir) && pwd`; \ ++ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ ++ (cd $$subdir && \ ++ $(MAKE) $(AM_MAKEFLAGS) \ ++ top_distdir="$$top_distdir" \ ++ distdir="$$distdir/$$subdir" \ ++ distdir) \ ++ || exit 1; \ ++ fi; \ ++ done ++check-am: all-am ++check: check-recursive ++all-am: Makefile ++installdirs: installdirs-recursive ++installdirs-am: ++install: install-recursive ++install-exec: install-exec-recursive ++install-data: install-data-recursive ++uninstall: uninstall-recursive ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++ ++installcheck: installcheck-recursive ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ `test -z '$(STRIP)' || \ ++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++mostlyclean-generic: ++ ++clean-generic: ++ ++distclean-generic: ++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) ++ ++maintainer-clean-generic: ++ @echo "This command is intended for maintainers to use" ++ @echo "it deletes files that may require special tools to rebuild." ++clean: clean-recursive ++ ++clean-am: clean-generic clean-libtool mostlyclean-am ++ ++distclean: distclean-recursive ++ -rm -f Makefile ++distclean-am: clean-am distclean-generic distclean-libtool \ ++ distclean-tags ++ ++dvi: dvi-recursive ++ ++dvi-am: ++ ++html: html-recursive ++ ++info: info-recursive ++ ++info-am: ++ ++install-data-am: ++ ++install-exec-am: ++ ++install-info: install-info-recursive ++ ++install-man: ++ ++installcheck-am: ++ ++maintainer-clean: maintainer-clean-recursive ++ -rm -f Makefile ++maintainer-clean-am: distclean-am maintainer-clean-generic ++ ++mostlyclean: mostlyclean-recursive ++ ++mostlyclean-am: mostlyclean-generic mostlyclean-libtool ++ ++pdf: pdf-recursive ++ ++pdf-am: ++ ++ps: ps-recursive ++ ++ps-am: ++ ++uninstall-am: uninstall-info-am ++ ++uninstall-info: uninstall-info-recursive ++ ++.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ ++ clean clean-generic clean-libtool clean-recursive ctags \ ++ ctags-recursive distclean distclean-generic distclean-libtool \ ++ distclean-recursive distclean-tags distdir dvi dvi-am html \ ++ html-am info info-am install install-am install-data \ ++ install-data-am install-exec install-exec-am install-info \ ++ install-info-am install-man install-strip installcheck \ ++ installcheck-am installdirs installdirs-am maintainer-clean \ ++ maintainer-clean-generic maintainer-clean-recursive \ ++ mostlyclean mostlyclean-generic mostlyclean-libtool \ ++ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ ++ uninstall uninstall-am uninstall-info-am ++ ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: +diff -Naur alliance-5.0/gcp/src/c_ccomp.y alliance/gcp/src/c_ccomp.y +--- alliance-5.0/gcp/src/c_ccomp.y 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_ccomp.y 2005-05-11 10:05:32.000000000 +0200 +@@ -0,0 +1,3182 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*WARNING: This file is automatically generated!*/ ++/* YACC parser for C syntax and for Objective C. -*-c-*- ++ Copyright(C) 1987, 88, 89, 92-97, 1998 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or(at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++/* This file defines the grammar of C and that of Objective C. ++ ifobjc ... end ifobjc conditionals contain code for Objective C only. ++ ifc ... end ifc conditionals contain code for C only. ++ Sed commands in Makefile.in are used to convert this file into ++ c-parse.y and into objc-parse.y. */ ++ ++/* To whomever it may concern: I have heard that such a thing was once ++ written by AT&T, but I have never seen it. */ ++ ++%expect 46 ++ ++/* These are the 23 conflicts you should get in parse.output; ++ the state numbers may vary if minor changes in the grammar are made. ++ ++State 42 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTE.) ++State 44 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 103 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 110 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTE.) ++State 111 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 115 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 132 contains 1 shift/reduce conflict. (See comment at component_decl.) ++State 180 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTE.) ++State 194 contains 2 shift/reduce conflict. (Four ways to parse this.) ++State 202 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 214 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 220 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 304 contains 2 shift/reduce conflicts. (Four ways to parse this.) ++State 335 contains 2 shift/reduce conflicts. (Four ways to parse this.) ++State 347 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTES.) ++State 352 contains 1 shift/reduce conflict. (Two ways to parse ATTRIBUTES.) ++State 383 contains 2 shift/reduce conflicts. (Four ways to parse this.) ++State 434 contains 2 shift/reduce conflicts. (Four ways to parse this.) */ ++ ++ ++%{ ++ ++#include ++#include ++#include ++#include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_flags.h" ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_cdecl.h" ++# include "c_clex.h" ++# include "c_convert.h" ++# include "c_ctypeck.h" ++# include "c_expand.h" ++# include "c_stmt.h" ++# include "c_common.h" ++# include "c_debug.h" ++ ++#ifdef MULTIBYTE_CHARS ++#include ++#endif ++ ++ ++#ifndef errno ++extern int errno; ++#endif ++ ++void yyerror(); ++ ++/* Like YYERROR but do call yyerror. */ ++#define YYERROR1 { yyerror("syntax error"); YYERROR; } ++ ++/* Cause the `yydebug' variable to be defined. */ ++#define YYDEBUG 1 ++%} ++ ++%start program ++ ++/* %union {long itype; tree ttype; enum tree_code code; ++ char *filename; int lineno; int ends_in_label; } */ ++ ++%union {long itype; ++ c_tree_node *ttype; ++ int code; ++ char *filename; ++ int lineno; ++ c_stmt_or_label stmt_or_label; } ++ ++/* All identifiers that are not reserved words ++ and are not declared typedefs in the current block */ ++%token tok_IDENTIFIER ++ ++/* All identifiers that are declared typedefs in the current block. ++ In some contexts, they are treated just like IDENTIFIER, ++ but they can also serve as typespecs in declarations. */ ++%token tok_TYPENAME ++ ++/* Reserved words that specify storage class. ++ yylval contains an IDENTIFIER_NODE which indicates which one. */ ++%token tok_SCSPEC ++ ++/* Reserved words that specify type. ++ yylval contains an IDENTIFIER_NODE which indicates which one. */ ++%token tok_TYPESPEC ++ ++/* Reserved words that qualify type: "const" or "volatile". ++ yylval contains an IDENTIFIER_NODE which indicates which one. */ ++%token tok_TYPE_QUAL ++ ++/* Character or numeric constants. ++ yylval is the node for the constant. */ ++%token tok_CONSTANT ++ ++/* String constants in raw form. ++ yylval is a STRING_CST node. */ ++%token tok_STRING ++ ++/* "...", used for functions with variable arglists. */ ++%token tok_ELLIPSIS ++ ++/* the reserved words */ ++/* SCO include files test "ASM", so use something else. */ ++%token tok_SIZEOF tok_ENUM tok_STRUCT tok_UNION tok_IF tok_ELSE tok_WHILE tok_DO tok_FOR ++%token tok_SWITCH tok_CASE tok_DEFAULT ++%token tok_BREAK tok_CONTINUE tok_RETURN tok_GOTO tok_ASM_KEYWORD tok_TYPEOF tok_ALIGNOF ++%token tok_ATTRIBUTE tok_EXTENSION tok_LABEL ++%token tok_REALPART tok_IMAGPART ++ ++/* Add precedence rules to solve dangling else s/r conflict */ ++%nonassoc tok_IF ++%nonassoc tok_ELSE ++ ++/* Define the operator tokens and their precedences. ++ The value is an integer because, if used, it is the tree code ++ to use in the expression made from the operator. */ ++ ++%right tok_ASSIGN '=' ++%right '?' ':' ++%left tok_OROR ++%left tok_ANDAND ++%left '|' ++%left '^' ++%left '&' ++%left tok_EQCOMPARE ++%left tok_ARITHCOMPARE ++%left tok_LSHIFT tok_RSHIFT ++%left '+' '-' ++%left '*' '/' '%' ++%right tok_UNARY tok_PLUSPLUS tok_MINUSMINUS ++%left tok_HYPERUNARY ++%left tok_POINTSAT '.' '(' '[' ++ ++/* The Objective-C keywords. These are included in C and in ++ Objective C, so that the token codes are the same in both. */ ++%token tok_INTERFACE tok_IMPLEMENTATION tok_END tok_SELECTOR tok_DEFS tok_ENCODE ++%token tok_CLASSNAME tok_PUBLIC tok_PRIVATE tok_PROTECTED ++%token tok_PROTOCOL tok_OBJECTNAME tok_CLASS tok_ALIAS ++ ++/* Objective-C string constants in raw form. ++ yylval is an OBJC_STRING_CST node. */ ++%token tok_OBJC_STRING ++ ++ ++%type unop ++ ++%type identifier tok_IDENTIFIER tok_TYPENAME tok_CONSTANT ++%type expr nonnull_exprlist exprlist ++%type expr_no_commas cast_expr unary_expr primary string tok_STRING ++%type typed_declspecs reserved_declspecs ++%type typed_typespecs reserved_typespecquals ++%type declmods typespec typespecqual_reserved ++%type typed_declspecs_no_prefix_attr reserved_declspecs_no_prefix_attr ++%type declmods_no_prefix_attr ++%type tok_SCSPEC tok_TYPESPEC tok_TYPE_QUAL nonempty_type_quals maybe_type_qual ++%type initdecls notype_initdecls initdcl notype_initdcl ++%type init maybeasm ++%type asm_operands nonnull_asm_operands asm_operand asm_clobbers ++%type maybe_attribute attributes attribute attribute_list attrib ++%type any_word ++ ++%type fndef datadef extdefs extdef ++ ++%type compstmt ++ ++%type declarator ++%type notype_declarator after_type_declarator ++%type parm_declarator ++ ++%type structsp component_decl_list component_decl_list2 ++%type component_decl components component_declarator ++%type enumlist enumerator ++%type typename absdcl absdcl1 type_quals ++%type xexpr parms parm identifiers ++ ++%type parmlist parmlist_1 parmlist_2 ++%type parmlist_or_identifiers parmlist_or_identifiers_1 ++%type identifiers_or_typenames ++ ++%type setspecs ++%type setspecs_ludo ++ ++%type lineno_labeled_stmt ++ ++%type lineno_stmt_or_label lineno_stmt_or_labels stmt_or_label stmts xstmts ++%type stmt all_iter_stmt all_iter_stmt_simple compstmt_or_error ++%type do_stmt_start ++%type label ++ ++%type simple_if if_prefix ++ ++%type save_filename ++%type save_lineno ++ ++ ++ ++%{ ++/* Number of statements(loosely speaking) and compound statements ++ seen so far. */ ++static int stmt_count; ++static int compstmt_count; ++ ++/* Input file and line number of the end of the body of last simple_if; ++ used by the stmt-rule immediately after simple_if returns. */ ++static char *if_stmt_file; ++static int if_stmt_line; ++ ++/* List of types and structure classes of the current declaration. */ ++static c_tree_node *current_declspecs =(c_tree_node *)0; ++static c_tree_node *prefix_attributes =(c_tree_node *)0; ++ ++/* Stack of saved values of current_declspecs and prefix_attributes. */ ++static c_tree_node *declspec_stack; ++ ++/* 1 if we explained undeclared var errors. */ ++static int undeclared_variable_notice; ++ ++/* Tell yyparse how to print a token's value, if yydebug is set. */ ++ ++#define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL) ++extern void yyprint(); ++%} ++ ++%% ++program: /* empty */ ++ { ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids an empty source file"); ++ } ++ ++ c_finish_file( (c_tree_node *)0 ); ++ } ++ | extdefs ++ { ++ /* In case there were missing closebraces, ++ get us back to the global binding level. */ ++ ++ while(! c_global_bindings_p()) ++ { ++ c_pop_level(0, 0, 0); ++ } ++ ++ c_finish_file( c_tree_reverse_list( $1 ) ); ++ /* LUDO ++ c_view_bindings(); ++ */ ++ } ++ ; ++ ++/* the reason for the strange actions in this rule ++ is so that notype_initdecls when reached via datadef ++ can find a valid list of type and sc specs in $0. */ ++ ++extdefs: ++ extdef ++ { ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $1, (c_tree_node *)0 ); ++ } ++ | extdefs ++ extdef ++ { ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $2, $1 ); ++ } ++ ; ++ ++extdef: ++ fndef ++ { ++ $$ = $1; ++ } ++ | datadef ++ { ++ $$ = $1; ++ } ++ | tok_ASM_KEYWORD '(' expr ')' ';' ++ { ++ CStripNops($3); ++ ++ if ( ((CTreeNodeFirstCode($3) == C_EXPR_NODE) && ++ (CTreeExprCode($3) == C_ADDR_EXPR) && ++ (CTreeNodeFirstCode(CTreeExprOperand($3,0))== C_STRING_NODE)) || ++ (CTreeNodeFirstCode($3) == C_STRING_NODE )) ++ { ++# ifdef LUDO_DONE ++ assemble_asm($3); ++# endif ++ } ++ else ++ { ++ error("argument of `asm' is not a constant string"); ++ } ++ ++ $$ = (c_tree_node *)0; ++ } ++ | extension extdef ++ { ++ c_pedantic = $1; ++ $$ = $2; ++ } ++ ; ++ ++datadef: ++ setspecs_ludo notype_initdecls ';' ++ { ++ if ( c_pedantic) ++ { ++ error("ANSI C forbids data definition with no type or storage class"); ++ } ++ else if (!c_flag_traditional) ++ { ++ warning("data definition has no type or storage class"); ++ } ++ ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($1); ++ ++ $$ = $2; ++ } ++ | declmods setspecs notype_initdecls ';' ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ ++ $$ = $3; ++ } ++ | typed_declspecs setspecs initdecls ';' ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ ++ $$ = $3; ++ } ++ | declmods ';' ++ { ++ pedwarn("empty declaration"); ++ ++ $$ = (c_tree_node *)0; ++ } ++ | typed_declspecs ';' ++ { ++ c_shadow_tag($1); ++ ++ $$ = $1; ++ } ++ | error ';' ++ { ++ $$ = (c_tree_node *)0; ++ } ++ | error '}' ++ { ++ $$ = (c_tree_node *)0; ++ } ++ | ';' ++ { ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C does not allow extra `;' outside of a function"); ++ } ++ ++ $$ = (c_tree_node *)0; ++ } ++ ; ++ ++fndef: ++ typed_declspecs setspecs declarator ++ { ++ if (! c_start_function(current_declspecs, $3, ++ prefix_attributes,(c_tree_node *)0, 0)) ++ { ++ YYERROR1; ++ } ++ c_reinit_parse_for_function(); ++ } ++ old_style_parm_decls ++ { ++ c_store_parm_decls(); ++ } ++ compstmt_or_error ++ { ++ $$ = c_finish_function(0,$7); ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | typed_declspecs setspecs declarator error ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ ++ $$ = $3; ++ } ++ | declmods setspecs notype_declarator ++ { ++ if (! c_start_function(current_declspecs, $3, ++ prefix_attributes,(c_tree_node *)0, 0)) ++ { ++ YYERROR1; ++ } ++ c_reinit_parse_for_function(); ++ } ++ old_style_parm_decls ++ { ++ c_store_parm_decls(); ++ } ++ compstmt_or_error ++ { ++ $$ = c_finish_function(0,$7); ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | declmods setspecs notype_declarator error ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ ++ $$ = $3; ++ } ++ | setspecs_ludo notype_declarator ++ { ++ if (! c_start_function((c_tree_node *)0, $2, ++ prefix_attributes,(c_tree_node *)0, 0)) ++ { ++ YYERROR1; ++ } ++ c_reinit_parse_for_function(); ++ } ++ old_style_parm_decls ++ { ++ c_store_parm_decls(); ++ } ++ compstmt_or_error ++ { ++ $$ = c_finish_function(0,$6); ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($1); ++ } ++ | setspecs_ludo notype_declarator error ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($1); ++ ++ $$ = $2; ++ } ++ ; ++ ++identifier: ++ tok_IDENTIFIER ++ | tok_TYPENAME ++ ; ++ ++unop: '&' ++ { ++ $$ = C_ADDR_EXPR; ++ } ++ | '-' ++ { ++ $$ = C_NEGATE_EXPR; ++ } ++ | '+' ++ { ++ $$ = C_CONVERT_EXPR; ++ } ++ | tok_PLUSPLUS ++ { ++ $$ = C_PREINCREMENT_EXPR; ++ } ++ | tok_MINUSMINUS ++ { ++ $$ = C_PREDECREMENT_EXPR; ++ } ++ | '~' ++ { ++ $$ = C_BIT_NOT_EXPR; ++ } ++ | '!' ++ { ++ $$ = C_TRUTH_NOT_EXPR; ++ } ++ ; ++ ++expr: nonnull_exprlist ++ { ++ $$ = c_parser_build_compound_expr($1); ++ } ++ ; ++ ++exprlist: ++ /* empty */ ++ { ++ $$ =(c_tree_node *)0; ++ } ++ | nonnull_exprlist ++ ; ++ ++nonnull_exprlist: ++ expr_no_commas ++ { ++ $$ = c_tree_build_list((c_tree_node *)0, $1); ++ } ++ | nonnull_exprlist ',' expr_no_commas ++ { ++ c_tree_concat_list($1, c_tree_build_list((c_tree_node *)0, $3)); ++ } ++ ; ++ ++unary_expr: ++ primary ++ | '*' cast_expr %prec tok_UNARY ++ { ++ $$ = c_parser_build_indirect_ref( $2, "unary *"); ++ } ++ /* __extension__ turns off -c_pedantic for following primary. */ ++ | extension cast_expr %prec tok_UNARY ++ { ++ $$ = $2; ++ c_pedantic = $1; ++ } ++ | unop cast_expr %prec tok_UNARY ++ { ++ $$ = c_parser_build_unary_op($1, $2, 0); ++# ifdef LUDO_NO_SKIP ++ overflow_warning($$); ++# endif ++ } ++ /* Refer to the address of a label as a pointer. */ ++ | tok_ANDAND identifier ++ { ++ c_tree_node *label = c_lookup_label($2); ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids `&&'"); ++ } ++ if (label == 0) ++ { ++ $$ = c_null_pointer_node; ++ } ++ else ++ { ++ CSetTreeNodeUsed(label); ++ $$ = c_tree_build_unary_expr( C_ADDR_EXPR, label); ++ CTreeType( $$ ) = c_ptr_type_node; ++ CSetTreeNodeConstant($$); ++ } ++ } ++ | sizeof unary_expr %prec tok_UNARY ++ { ++ c_skip_evaluation--; ++ if ( CTreeExprCode($2) == C_COMPONENT_REF ++ && CTreeExprCode( CTreeExprOperand($2, 1))) ++ { ++ error("`sizeof' applied to a bit-field"); ++ } ++ $$ = c_get_c_sizeof(CTreeType($2)); ++ } ++ | sizeof '(' typename ')' %prec tok_HYPERUNARY ++ { ++ c_skip_evaluation--; ++ $$ = c_get_c_sizeof(c_groktypename($3)); ++ } ++ | alignof unary_expr %prec tok_UNARY ++ { ++ c_skip_evaluation--; ++ $$ = c_get_c_alignof_expr($2); ++ } ++ | alignof '(' typename ')' %prec tok_HYPERUNARY ++ { ++ c_skip_evaluation--; ++ $$ = c_get_c_alignof(c_groktypename($3)); ++ } ++ | tok_REALPART cast_expr %prec tok_UNARY ++ { ++ $$ = c_parser_build_unary_op(C_REALPART_EXPR, $2, 0); ++ } ++ | tok_IMAGPART cast_expr %prec tok_UNARY ++ { ++ $$ = c_parser_build_unary_op(C_IMAGPART_EXPR, $2, 0); ++ } ++ ; ++ ++sizeof: ++ tok_SIZEOF ++ { ++ c_skip_evaluation++; ++ } ++ ; ++ ++alignof: ++ tok_ALIGNOF ++ { ++ c_skip_evaluation++; ++ } ++ ; ++ ++cast_expr: ++ unary_expr ++ | '(' typename ')' cast_expr %prec tok_UNARY ++ { ++ c_tree_node *type = c_groktypename($2); ++ $$ = c_build_c_cast(type, $4); ++ } ++ | '(' typename ')' '{' ++ { ++ c_start_init((c_tree_node *)0, NULL, 0); ++ $2 = c_groktypename($2); ++ c_really_start_incremental_init($2); ++ } ++ initlist_maybe_comma '}' %prec tok_UNARY ++ { ++ c_tree_node *tmp_node; ++ ++ $$ = c_pop_init_level(0); ++ tmp_node = c_finish_init(); ++ ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids constructor expressions"); ++ } ++ ++ if ( CTreeTypeCode($2) == C_ARRAY_TYPE && CTreeTypeSize($2) == 0) ++ { ++ int failure = c_complete_array_type( $2, $$, 1); ++ if (failure) abort(); ++ } ++ ++ if ( CTreeDeclInitial( $$ ) == c_error_mark_node ) ++ CTreeDeclInitial( $$ ) = tmp_node; ++ } ++ ; ++ ++expr_no_commas: ++ cast_expr ++ | expr_no_commas '+' expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas '-' expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas '*' expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas '/' expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas '%' expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas tok_LSHIFT expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas tok_RSHIFT expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas tok_ARITHCOMPARE expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas tok_EQCOMPARE expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas '&' expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas '|' expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas '^' expr_no_commas ++ { ++ $$ = c_parser_build_binary_op($2, $1, $3); ++ } ++ | expr_no_commas tok_ANDAND ++ { ++ $1 = c_truthvalue_conversion( c_default_conversion($1)); ++ c_skip_evaluation += $1 == c_boolean_false_node; ++ } ++ expr_no_commas ++ { ++ c_skip_evaluation -= $1 == c_boolean_false_node; ++ $$ = c_parser_build_binary_op(C_TRUTH_ANDIF_EXPR, $1, $4); ++ } ++ | expr_no_commas tok_OROR ++ { ++ $1 = c_truthvalue_conversion(c_default_conversion($1)); ++ c_skip_evaluation += $1 == c_boolean_true_node; ++ } ++ expr_no_commas ++ { ++ c_skip_evaluation -= $1 == c_boolean_true_node; ++ $$ = c_parser_build_binary_op(C_TRUTH_ORIF_EXPR, $1, $4); ++ } ++ | expr_no_commas '?' ++ { ++ $1 = c_truthvalue_conversion(c_default_conversion($1)); ++ c_skip_evaluation += $1 == c_boolean_false_node; ++ } ++ expr ':' ++ { ++ c_skip_evaluation +=(($1 == c_boolean_true_node) ++ -($1 == c_boolean_false_node)); ++ } ++ expr_no_commas ++ { ++ c_skip_evaluation -= $1 == c_boolean_true_node; ++ $$ = c_parser_build_conditional_expr($1, $4, $7); ++ } ++ | expr_no_commas '?' ++ { ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids omitting the middle term of a ?: expression"); ++ } ++ $2 = $1; ++ $1 = c_truthvalue_conversion(c_default_conversion($2)); ++ c_skip_evaluation += $1 == c_boolean_true_node; ++ } ++ ':' expr_no_commas ++ { ++ c_skip_evaluation -= $1 == c_boolean_true_node; ++ $$ = c_parser_build_conditional_expr($1, $2, $5); ++ } ++ | expr_no_commas '=' expr_no_commas ++ { ++ $$ = c_parser_build_modify_expr($1, C_NOP_EXPR, $3); ++ CTreeExprComplexity($$) = C_MODIFY_EXPR; ++ } ++ | expr_no_commas tok_ASSIGN expr_no_commas ++ { ++ $$ = c_parser_build_modify_expr($1, $2, $3); ++ /* This inhibits warnings in truthvalue_conversion. */ ++ CTreeExprComplexity($$) = C_UNKNOWN_EXPR; ++ } ++ ; ++ ++primary: ++ tok_IDENTIFIER ++ { ++ $$ = c_lastiddecl; ++ ++ if (!$$ || $$ == c_error_mark_node) ++ { ++ if (yychar == YYEMPTY) yychar = YYLEX; ++ ++ if (yychar == '(') ++ { ++ /* Ordinary implicit function declaration. */ ++ $$ = c_implicitly_declare($1); ++# ifdef LUDO_DONE ++ assemble_external($$); ++# endif ++ CSetTreeNodeUsed($$); ++ } ++ else if (c_current_function_decl == 0) ++ { ++ error("`%s' undeclared here(not in a function)", CTreeIdentPointer($1)); ++ $$ = c_error_mark_node; ++ } ++ else ++ { ++ if ( CTreeIdentGlobalValue($1) != c_error_mark_node || ++ CTreeIdentErrorLocus($1) != c_current_function_decl) ++ { ++ error("`%s' undeclared(first use in this function)", ++ CTreeIdentPointer($1)); ++ ++ if (! undeclared_variable_notice) ++ { ++ error("(Each undeclared identifier is reported only once"); ++ error("for each function it appears in.)"); ++ undeclared_variable_notice = 1; ++ } ++ } ++ $$ = c_error_mark_node; ++ /* Prevent repeated error messages. */ ++ ++ CTreeIdentGlobalValue( $1) = c_error_mark_node; ++ CTreeIdentErrorLocus( $1 ) = c_current_function_decl; ++ } ++ } ++ else if (CTreeType($$) == c_error_mark_node) ++ { ++ $$ = c_error_mark_node; ++ } ++ else if (CIsTreeDeclAnticipated($$)) ++ { ++ /* The first time we see a build-in function used, ++ if it has not been declared. */ ++ CClearTreeDeclAnticipated($$); ++ if (yychar == YYEMPTY) yychar = YYLEX; ++ if (yychar == '(') ++ { ++ /* Omit the implicit declaration we ++ would ordinarily do, so we don't lose ++ the actual built in type. ++ But print a diagnostic for the mismatch. */ ++ if ( CTreeDeclCode($$) != C_FUNCTION_DECL) ++ { ++ error("`%s' implicitly declared as function", ++ CTreeIdentPointer(CTreeDeclName($$))); ++ } ++ else if (( CTreeTypeMode(CTreeType(CTreeType($$))) ++ != CTreeTypeMode(c_integer_type_node)) ++ &&(CTreeType(CTreeType($$)) ++ != c_void_type_node)) ++ { ++ pedwarn("type mismatch in implicit declaration for built-in function `%s'", ++ CTreeIdentPointer(CTreeDeclName($$))); ++ } ++ /* If it really returns void, change that to int. */ ++ if (CTreeType(CTreeType($$)) == c_void_type_node) ++ { ++ CTreeType($$) ++ = c_tree_build_function_type(c_integer_type_node, ++ CTreeTypeValues(CTreeType($$))); ++ } ++ } ++ else ++ { ++ pedwarn("built-in function `%s' used without declaration", ++ CTreeIdentPointer(CTreeDeclName($$))); ++ } ++ ++ /* Do what we would ordinarily do when a fn is used. */ ++# ifdef LUDO_DONE ++ assemble_external($$); ++# endif ++ CSetTreeNodeUsed($$); ++ } ++ else ++ { ++# ifdef LUDO_DONE ++ assemble_external($$); ++# endif ++ CSetTreeNodeUsed($$); ++ } ++ ++ if ( ( CTreeNodeFirstCode($$) == C_DECL_NODE ) && ++ ( CTreeDeclCode($$) == C_CONST_DECL ) ) ++ { ++ c_tree_node *type; ++ ++ $$ = CTreeDeclInitial( $$ ); ++ /* This is to prevent an enum whose value is 0 ++ from being considered a null pointer constant. */ ++ type = CTreeType( $$ ); ++ $$ = c_tree_build_unary_expr( C_NOP_EXPR, $$); ++ CTreeType( $$ ) = type; ++ CSetTreeNodeConstant($$); ++ } ++ } ++ | tok_CONSTANT ++ | string ++ { ++ $$ = c_tree_combine_strings($1); ++ } ++ | '(' expr ')' ++ { ++# ifdef LUDO_NO_SKIP ++ char class = TREE_CODE_CLASS(TREE_CODE($2)); ++ if (class == 'e' || class == '1' ++ || class == '2' || class == '<') ++ C_SET_EXP_ORIGINAL_CODE($2, ERROR_MARK); ++# endif ++ $$ = $2; ++ } ++ | '(' error ')' ++ { ++ $$ = c_error_mark_node; ++ } ++ | '(' ++ { ++ if (c_current_function_decl == 0) ++ { ++ error("braced-group within expression allowed only inside a function"); ++ YYERROR; ++ } ++# ifdef LUDO_NO_SKIP ++ /* We must force a BLOCK for this level ++ so that, if it is not expanded later, ++ there is a way to turn off the entire subtree of blocks ++ that are contained in it. */ ++ keep_next_level(); ++ push_iterator_stack(); ++ push_label_level(); ++ $$ = expand_start_stmt_expr(); ++# endif ++ } ++ compstmt ')' ++ { ++# ifdef LUDO_NO_SKIP ++ tree rtl_exp; ++# endif ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids braced-groups within expressions"); ++ } ++# ifdef LUDO_NO_SKIP ++ pop_iterator_stack(); ++ pop_label_level(); ++ rtl_exp = expand_end_stmt_expr($2); ++ /* The statements have side effects, so the group does. */ ++ TREE_SIDE_EFFECTS(rtl_exp) = 1; ++ ++ if (TREE_CODE($3) == BLOCK) ++ { ++ /* Make a BIND_EXPR for the BLOCK already made. */ ++ $$ = build(C_BIND_EXPR, CTreeType(rtl_exp), ++ (c_tree_node *)0, rtl_exp, $3); ++ /* Remove the block from the tree at this point. ++ It gets put back at the proper place ++ when the BIND_EXPR is expanded. */ ++ delete_block($3); ++ } ++ else ++# endif ++ $$ = $3; ++ } ++ | primary '(' exprlist ')' %prec '.' ++ { ++ $$ = c_parser_build_function_call($1, $3); ++ } ++ | primary '[' expr ']' %prec '.' ++ { ++ $$ = c_parser_build_array_ref($1, $3); ++ } ++ | primary '.' identifier ++ { ++ $$ = c_parser_build_component_ref($1, $3); ++ } ++ | primary tok_POINTSAT identifier ++ { ++ c_tree_node *expr = c_parser_build_indirect_ref($1, "->"); ++ $$ = c_parser_build_component_ref(expr, $3); ++ } ++ | primary tok_PLUSPLUS ++ { ++ $$ = c_parser_build_unary_op(C_POSTINCREMENT_EXPR, $1, 0); ++ } ++ | primary tok_MINUSMINUS ++ { ++ $$ = c_parser_build_unary_op(C_POSTDECREMENT_EXPR, $1, 0); ++ } ++ ; ++ ++/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */ ++string: ++ tok_STRING ++ | string tok_STRING ++ { ++ $$ = c_tree_concat_list($1, $2); ++ } ++ ; ++ ++ ++old_style_parm_decls: ++ /* empty */ ++ | datadecls ++ | datadecls tok_ELLIPSIS ++ /* ... is used here to indicate a varargs function. */ ++ { ++ c_c_mark_varargs(); ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C does not permit use of `varargs.h'"); ++ } ++ } ++ ; ++ ++/* The following are analogous to lineno_decl, decls and decl ++ except that they do not allow nested functions. ++ They are used for old-style parm decls. */ ++lineno_datadecl: ++ save_filename save_lineno datadecl ++ { ++ } ++ ; ++ ++datadecls: ++ lineno_datadecl ++ | errstmt ++ | datadecls lineno_datadecl ++ | lineno_datadecl errstmt ++ ; ++ ++/* We don't allow prefix attributes here because they cause reduce/reduce ++ conflicts: we can't know whether we're parsing a function decl with ++ attribute suffix, or function defn with attribute prefix on first old ++ style parm. */ ++datadecl: ++ typed_declspecs_no_prefix_attr setspecs initdecls ';' ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | declmods_no_prefix_attr setspecs notype_initdecls ';' ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | typed_declspecs_no_prefix_attr ';' ++ { ++ c_shadow_tag_warned($1, 1); ++ pedwarn("empty declaration"); ++ } ++ | declmods_no_prefix_attr ';' ++ { ++ pedwarn("empty declaration"); ++ } ++ ; ++ ++/* This combination which saves a lineno before a decl ++ is the normal thing to use, rather than decl itself. ++ This is to avoid shift/reduce conflicts in contexts ++ where statement labels are allowed. */ ++lineno_decl: ++ save_filename save_lineno decl ++ { ++ } ++ ; ++ ++decls: ++ lineno_decl ++ | errstmt ++ | decls lineno_decl ++ | lineno_decl errstmt ++ ; ++ ++/* records the type and storage class specs to use for processing ++ the declarators that follow. ++ Maintains a stack of outer-level values of current_declspecs, ++ for the sake of parm declarations nested in function declarators. */ ++setspecs: /* empty */ ++ { ++# ifdef LUDO_NO_SKIP ++ $$ = suspend_momentary(); ++ pending_xref_error(); ++# endif ++ declspec_stack = c_tree_add_head_list(prefix_attributes, ++ current_declspecs, declspec_stack); ++ c_split_specs_attrs($0, ¤t_declspecs, &prefix_attributes); ++ } ++ ; ++ ++setspecs_ludo: /* empty */ ++ { ++# ifdef LUDO_NO_SKIP ++ $$ = suspend_momentary(); ++ pending_xref_error(); ++# endif ++ declspec_stack = c_tree_add_head_list(prefix_attributes, ++ current_declspecs, declspec_stack); ++ c_split_specs_attrs(NULL, ¤t_declspecs, &prefix_attributes); ++ } ++ ; ++ ++/* ??? Yuck. See after_type_declarator. */ ++setattrs: /* empty */ ++ { ++ prefix_attributes = c_tree_concat_list(prefix_attributes, $0); ++ } ++ ; ++ ++decl: ++ typed_declspecs setspecs initdecls ';' ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | declmods setspecs notype_initdecls ';' ++ { ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | typed_declspecs ';' ++ { ++ c_shadow_tag($1); ++ } ++ | declmods ';' ++ { ++ pedwarn("empty declaration"); ++ } ++ | extension decl ++ { ++ c_pedantic = $1; ++ } ++ ; ++ ++/* Declspecs which contain at least one type specifier or typedef name. ++ (Just `const' or `volatile' is not enough.) ++ A typedef'd name following these is taken as a name to be declared. ++ Declspecs have a non-NULL CTreeListValue, attributes do not. */ ++ ++typed_declspecs: ++ typespec reserved_declspecs ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $1, $2); ++ } ++ | declmods typespec reserved_declspecs ++ { ++ $$ = c_tree_concat_list( $3, c_tree_add_head_list((c_tree_node *)0, $2, $1)); ++ } ++ ; ++ ++reserved_declspecs: /* empty */ ++ { ++ $$ =(c_tree_node *)0; ++ } ++ | reserved_declspecs typespecqual_reserved ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ } ++ | reserved_declspecs tok_SCSPEC ++ { ++ if (c_extra_warnings) ++ { ++ warning("`%s' is not at beginning of declaration", CTreeIdentPointer($2)); ++ } ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ } ++ | reserved_declspecs attributes ++ { ++ $$ = c_tree_add_head_list($2,(c_tree_node *)0, $1); ++ } ++ ; ++ ++typed_declspecs_no_prefix_attr: ++ typespec reserved_declspecs_no_prefix_attr ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $1, $2); ++ } ++ | declmods_no_prefix_attr typespec reserved_declspecs_no_prefix_attr ++ { ++ $$ = c_tree_concat_list($3, c_tree_add_head_list((c_tree_node *)0, $2, $1)); ++ } ++ ; ++ ++reserved_declspecs_no_prefix_attr: ++ /* empty */ ++ { ++ $$ =(c_tree_node *)0; ++ } ++ | reserved_declspecs_no_prefix_attr typespecqual_reserved ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ } ++ | reserved_declspecs_no_prefix_attr tok_SCSPEC ++ { ++ if (c_extra_warnings) ++ { ++ warning("`%s' is not at beginning of declaration", CTreeIdentPointer($2)); ++ } ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ } ++ ; ++ ++/* List of just storage classes, type modifiers, and prefix attributes. ++ A declaration can start with just this, but then it cannot be used ++ to redeclare a typedef-name. ++ Declspecs have a non-NULL CTreeListValue, attributes do not. */ ++ ++declmods: ++ declmods_no_prefix_attr ++ { ++ $$ = $1; ++ } ++ | attributes ++ { ++ $$ = c_tree_add_head_list($1,(c_tree_node *)0,(c_tree_node *)0); ++ } ++ | declmods declmods_no_prefix_attr ++ { ++ $$ = c_tree_concat_list($2, $1); ++ } ++ | declmods attributes ++ { ++ $$ = c_tree_add_head_list($2,(c_tree_node *)0, $1); ++ } ++ ; ++ ++declmods_no_prefix_attr: ++ tok_TYPE_QUAL ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $1,(c_tree_node *)0); ++ CSetTreeNodeStatic($$); ++ } ++ | tok_SCSPEC ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $1,(c_tree_node *)0); ++ } ++ | declmods_no_prefix_attr tok_TYPE_QUAL ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ CSetTreeNodeStatic($$); ++ } ++ | declmods_no_prefix_attr tok_SCSPEC ++ { ++ if ( ( c_extra_warnings ) && ++ ( CIsTreeNodeStatic($1) ) ) ++ { ++ warning("`%s' is not at beginning of declaration", CTreeIdentPointer($2)); ++ } ++ ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ if ( CIsTreeNodeStatic( $1 ) ) ++ { ++ CSetTreeNodeStatic( $$ ); ++ } ++ } ++ ; ++ ++ ++/* Used instead of declspecs where storage classes are not allowed ++ (that is, for typenames and structure components). ++ Don't accept a typedef-name if anything but a modifier precedes it. */ ++ ++typed_typespecs: ++ typespec reserved_typespecquals ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $1, $2); ++ } ++ | nonempty_type_quals typespec reserved_typespecquals ++ { ++ $$ = c_tree_concat_list($3, c_tree_add_head_list((c_tree_node *)0, $2, $1)); ++ } ++ ; ++ ++reserved_typespecquals: /* empty */ ++ { ++ $$ =(c_tree_node *)0; ++ } ++ | reserved_typespecquals typespecqual_reserved ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ } ++ ; ++ ++/* A typespec(but not a type qualifier). ++ Once we have seen one of these in a declaration, ++ if a typedef name appears then it is being redeclared. */ ++ ++typespec: tok_TYPESPEC ++ | structsp ++ | tok_TYPENAME ++ { ++ /* For a typedef name, record the meaning, not the name. ++ In case of `foo foo, bar;'. */ ++ $$ = c_lookup_name($1); ++ } ++ | tok_TYPEOF '(' expr ')' ++ { ++ $$ = CTreeType($3); ++ } ++ | tok_TYPEOF '(' typename ')' ++ { ++ $$ = c_groktypename($3); ++ } ++ ; ++ ++/* A typespec that is a reserved word, or a type qualifier. */ ++ ++typespecqual_reserved: tok_TYPESPEC ++ | tok_TYPE_QUAL ++ | structsp ++ ; ++ ++initdecls: ++ initdcl ++ { ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $1, (c_tree_node *)0 ); ++ } ++ | initdecls ',' initdcl ++ { ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $3, $1 ); ++ } ++ ; ++ ++notype_initdecls: ++ notype_initdcl ++ | notype_initdecls ',' initdcl ++ ; ++ ++maybeasm: ++ /* empty */ ++ { ++ $$ =(c_tree_node *)0; ++ } ++ | tok_ASM_KEYWORD '(' string ')' ++ { ++ if (CTreeChain($3)) ++ { ++ $3 = c_tree_combine_strings($3); ++ } ++ $$ = $3; ++ } ++ ; ++ ++initdcl: ++ declarator maybeasm maybe_attribute '=' ++ { ++ $$ = c_start_decl($1, current_declspecs, 1, $3, prefix_attributes); ++ c_start_init( $$, $2, c_global_bindings_p()); ++ } ++ init ++/* Note how the declaration of the variable is in effect while its init is parsed! */ ++ { ++ c_tree_node *tmp_node; ++ tmp_node = c_finish_init(); ++ c_finish_decl($5, $6, $2); ++ $$ = $5; ++ ++ if ( CTreeDeclInitial( $$ ) == c_error_mark_node ) ++ CTreeDeclInitial( $$ ) = tmp_node; ++ } ++ | declarator maybeasm maybe_attribute ++ { ++ c_tree_node *d = c_start_decl($1, current_declspecs, 0, $3, prefix_attributes); ++ c_finish_decl(d,(c_tree_node *)0, $2); ++ $$ = d; ++ } ++ ; ++ ++notype_initdcl: ++ notype_declarator maybeasm maybe_attribute '=' ++ { ++ $$ = c_start_decl($1, current_declspecs, 1, $3, prefix_attributes); ++ c_start_init($$, $2, c_global_bindings_p()); ++ } ++ init ++/* Note how the declaration of the variable is in effect while its init is parsed! */ ++ { ++ c_tree_node *tmp_node; ++ tmp_node = c_finish_init(); ++ ++ c_decl_attributes($5, $3, prefix_attributes); ++ c_finish_decl($5, $6, $2); ++ ++ if ( CTreeDeclInitial( $5 ) == c_error_mark_node ) ++ CTreeDeclInitial( $5 ) = tmp_node; ++ } ++ | notype_declarator maybeasm maybe_attribute ++ { ++ c_tree_node *d; ++ d = c_start_decl($1, current_declspecs, 0, $3, prefix_attributes); ++ c_finish_decl(d,(c_tree_node *)0, $2); ++ } ++ ; ++/* the * rules are dummies to accept the Apollo extended syntax ++ so that the header files compile. */ ++maybe_attribute: ++ /* empty */ ++ { ++ $$ =(c_tree_node *)0; ++ } ++ | attributes ++ { ++ $$ = $1; ++ } ++ ; ++ ++attributes: ++ attribute ++ { ++ $$ = $1; ++ } ++ | attributes attribute ++ { ++ $$ = c_tree_concat_list($1, $2); ++ } ++ ; ++ ++attribute: ++ tok_ATTRIBUTE '(' '(' attribute_list ')' ')' ++ { ++ $$ = $4; ++ } ++ ; ++ ++attribute_list: ++ attrib ++ { ++ $$ = $1; ++ } ++ | attribute_list ',' attrib ++ { ++ $$ = c_tree_concat_list($1, $3); ++ } ++ ; ++ ++attrib: ++ /* empty */ ++ { ++ $$ = (c_tree_node *)0; ++ } ++ | any_word ++ { ++ $$ = c_tree_build_list($1,(c_tree_node *)0); ++ } ++ | any_word '(' tok_IDENTIFIER ')' ++ { ++ $$ = c_tree_build_list($1, c_tree_build_list((c_tree_node *)0, $3)); ++ } ++ | any_word '(' tok_IDENTIFIER ',' nonnull_exprlist ')' ++ { ++ $$ = c_tree_build_list($1, c_tree_add_head_list((c_tree_node *)0, $3, $5)); ++ } ++ | any_word '(' exprlist ')' ++ { ++ $$ = c_tree_build_list($1, $3); ++ } ++ ; ++ ++/* This still leaves out most reserved keywords, ++ shouldn't we include them? */ ++ ++any_word: ++ identifier ++ | tok_SCSPEC ++ | tok_TYPESPEC ++ | tok_TYPE_QUAL ++ ; ++ ++/* Initializers. `init' is the entry point. */ ++ ++init: ++ expr_no_commas ++ | '{' ++ { ++ c_really_start_incremental_init((c_tree_node *)0); ++ /* Note that the call to clear_momentary ++ is in process_init_element. */ ++# ifdef LUDO_NO_SKIP ++ push_momentary(); ++# endif ++ } ++ initlist_maybe_comma '}' ++ { ++ $$ = c_pop_init_level(0); ++# ifdef LUDO_NO_SKIP ++ if ($$ == c_error_mark_node ++ && !(yychar == tok_STRING || yychar == tok_CONSTANT)) ++ pop_momentary(); ++ else ++ pop_momentary_nofree(); ++# endif ++ } ++ ++ | error ++ { ++ $$ = c_error_mark_node; ++ } ++ ; ++ ++/* `initlist_maybe_comma' is the guts of an initializer in braces. */ ++initlist_maybe_comma: ++ /* empty */ ++ { ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids empty initializer braces"); ++ } ++ } ++ | initlist1 maybecomma ++ ; ++ ++initlist1: ++ initelt ++ | initlist1 ',' initelt ++ ; ++ ++/* `initelt' is a single element of an initializer. ++ It may use braces. */ ++initelt: ++ expr_no_commas ++ { ++ c_process_init_element($1); ++ } ++ | '{' ++ { ++ c_push_init_level(0); ++ } ++ initlist_maybe_comma '}' ++ { ++ c_process_init_element(c_pop_init_level(0)); ++ } ++ | error ++ /* These are for labeled elements. The syntax for an array element ++ initializer conflicts with the syntax for an Objective-C message, ++ so don't include these productions in the Objective-C grammar. */ ++ | '[' expr_no_commas tok_ELLIPSIS expr_no_commas ']' '=' ++ { ++ c_set_init_index($2, $4); ++ } ++ initelt ++ | '[' expr_no_commas ']' '=' ++ { ++ c_set_init_index($2,(c_tree_node *)0); ++ } ++ initelt ++ | '[' expr_no_commas ']' ++ { ++ c_set_init_index($2,(c_tree_node *)0); ++ } ++ initelt ++ | identifier ':' ++ { ++ c_set_init_label($1); ++ } ++ initelt ++ | '.' identifier '=' ++ { ++ c_set_init_label($2); ++ } ++ initelt ++ ; ++ ++/* Any kind of declarator(thus, all declarators allowed ++ after an explicit typespec). */ ++ ++declarator: ++ after_type_declarator ++ { ++ $$ = $1; ++ } ++ | notype_declarator ++ { ++ $$ = $1; ++ } ++ ; ++ ++/* A declarator that is allowed only after an explicit typespec. */ ++ ++after_type_declarator: ++ '(' after_type_declarator ')' ++ { ++ $$ = $2; ++ } ++ | after_type_declarator '(' parmlist_or_identifiers %prec '.' ++ { ++ $$ = c_tree_build_ternary_expr( C_CALL_EXPR, $1, $3, (c_tree_node *)0 ); ++ } ++ | after_type_declarator '[' expr ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr( C_ARRAY_REF, $1, $3 ); ++ } ++ | after_type_declarator '[' ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr( C_ARRAY_REF, $1, (c_tree_node *)0 ); ++ } ++ | '*' type_quals after_type_declarator %prec tok_UNARY ++ { ++ $$ = c_tree_build_pointer_declarator($2, $3); ++ } ++ /* ??? Yuck. setattrs is a quick hack. We can't use ++ prefix_attributes because $1 only applies to this ++ declarator. We assume setspecs has already been done. ++ setattrs also avoids 5 reduce/reduce conflicts(otherwise multiple ++ attributes could be recognized here or in `attributes'). */ ++ | attributes setattrs after_type_declarator ++ { ++ $$ = $3; ++ } ++ | tok_TYPENAME ++ ; ++ ++/* Kinds of declarator that can appear in a parameter list ++ in addition to notype_declarator. This is like after_type_declarator ++ but does not allow a typedef name in parentheses as an identifier ++ (because it would conflict with a function with that typedef as arg). */ ++ ++parm_declarator: ++ parm_declarator '(' parmlist_or_identifiers %prec '.' ++ { ++ $$ = c_tree_build_ternary_expr( C_CALL_EXPR, $1, $3,(c_tree_node *)0); ++ } ++ | parm_declarator '[' expr ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr( C_ARRAY_REF, $1, $3); ++ } ++ | parm_declarator '[' ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr( C_ARRAY_REF, $1, (c_tree_node *)0); ++ } ++ | '*' type_quals parm_declarator %prec tok_UNARY ++ { ++ $$ = c_tree_build_pointer_declarator($2, $3); ++ } ++ /* ??? Yuck. setattrs is a quick hack. We can't use ++ prefix_attributes because $1 only applies to this ++ declarator. We assume setspecs has already been done. ++ setattrs also avoids 5 reduce/reduce conflicts(otherwise multiple ++ attributes could be recognized here or in `attributes'). */ ++ | attributes setattrs parm_declarator ++ { ++ $$ = $3; ++ } ++ | tok_TYPENAME ++ ; ++ ++/* A declarator allowed whether or not there has been ++ an explicit typespec. These cannot redeclare a typedef-name. */ ++ ++notype_declarator: ++ notype_declarator '(' parmlist_or_identifiers %prec '.' ++ { ++ $$ = c_tree_build_ternary_expr(C_CALL_EXPR, $1, $3,(c_tree_node *)0); ++ } ++ | '(' notype_declarator ')' ++ { ++ $$ = $2; ++ } ++ | '*' type_quals notype_declarator %prec tok_UNARY ++ { ++ $$ = c_tree_build_pointer_declarator($2, $3); ++ } ++ | notype_declarator '[' expr ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr(C_ARRAY_REF, $1, $3); ++ } ++ | notype_declarator '[' ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr(C_ARRAY_REF, $1,(c_tree_node *)0); ++ } ++ /* ??? Yuck. setattrs is a quick hack. We can't use ++ prefix_attributes because $1 only applies to this ++ declarator. We assume setspecs has already been done. ++ setattrs also avoids 5 reduce/reduce conflicts(otherwise multiple ++ attributes could be recognized here or in `attributes'). */ ++ | attributes setattrs notype_declarator ++ { ++ $$ = $3; ++ } ++ | tok_IDENTIFIER ++ { ++ $$ = $1; ++ } ++ ; ++ ++structsp: ++ tok_STRUCT identifier '{' ++ { ++ $$ = c_start_struct(C_RECORD_TYPE, $2); ++ /* Start scope of tag before parsing components. */ ++ } ++ component_decl_list '}' maybe_attribute ++ { ++ $$ = c_finish_struct($4, $5, $7); ++ } ++ | tok_STRUCT '{' component_decl_list '}' maybe_attribute ++ { ++ $$ = c_finish_struct(c_start_struct(C_RECORD_TYPE,(c_tree_node *)0), $3, $5); ++ } ++ | tok_STRUCT identifier ++ { ++ $$ = c_xref_tag(C_RECORD_TYPE, $2); ++ } ++ | tok_UNION identifier '{' ++ { ++ $$ = c_start_struct(C_UNION_TYPE, $2); ++ } ++ component_decl_list '}' maybe_attribute ++ { ++ $$ = c_finish_struct($4, $5, $7); ++ } ++ | tok_UNION '{' component_decl_list '}' maybe_attribute ++ { ++ $$ = c_finish_struct(c_start_struct(C_UNION_TYPE,(c_tree_node *)0), $3, $5); ++ } ++ | tok_UNION identifier ++ { ++ $$ = c_xref_tag(C_UNION_TYPE, $2); ++ } ++ | tok_ENUM identifier '{' ++ { ++# ifdef LUDO_NO_SKIP ++ $3 = suspend_momentary(); ++# endif ++ $$ = c_start_enum($2); ++ } ++ enumlist maybecomma_warn '}' maybe_attribute ++ { ++ $$ = c_finish_enum($4, c_tree_reverse_list($5), $8); ++ c_resume_momentary($3); ++ } ++ | tok_ENUM '{' ++ { ++# ifdef LUDO_NO_SKIP ++ $2 = suspend_momentary(); ++# endif ++ $$ = c_start_enum((c_tree_node *)0); ++ } ++ enumlist maybecomma_warn '}' maybe_attribute ++ { ++ $$ = c_finish_enum($3, c_tree_reverse_list($4), $7); ++ c_resume_momentary($2); ++ } ++ | tok_ENUM identifier ++ { ++ $$ = c_xref_tag(C_ENUMERAL_TYPE, $2); ++ } ++ ; ++ ++maybecomma: ++ /* empty */ ++ | ',' ++ ; ++ ++maybecomma_warn: ++ /* empty */ ++ | ',' ++ { ++ if (c_pedantic) ++ { ++ pedwarn("comma at end of enumerator list"); ++ } ++ } ++ ; ++ ++component_decl_list: ++ component_decl_list2 ++ { ++ $$ = $1; ++ } ++ | component_decl_list2 component_decl ++ { ++ $$ = c_tree_concat_list($1, $2); ++ pedwarn("no semicolon at end of struct or union"); ++ } ++ ; ++ ++component_decl_list2: /* empty */ ++ { ++ $$ = (c_tree_node *)0; ++ } ++ | component_decl_list2 component_decl ';' ++ { ++ $$ = c_tree_concat_list($1, $2); ++ } ++ | component_decl_list2 ';' ++ { ++ if (c_pedantic) ++ { ++ pedwarn("extra semicolon in struct or union specified"); ++ } ++ } ++ ; ++ ++/* There is a shift-reduce conflict here, because `components' may ++ start with a `typename'. It happens that shifting(the default resolution) ++ does the right thing, because it treats the `typename' as part of ++ a `typed_typespecs'. ++ ++ It is possible that this same technique would allow the distinction ++ between `notype_initdecls' and `initdecls' to be eliminated. ++ But I am being cautious and not trying it. */ ++ ++component_decl: ++ typed_typespecs setspecs components ++ { ++ $$ = $3; ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | typed_typespecs ++ { ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids member declarations with no members"); ++ } ++ c_shadow_tag($1); ++ $$ = (c_tree_node *)0; ++ } ++ | nonempty_type_quals setspecs components ++ { ++ $$ = $3; ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | nonempty_type_quals ++ { ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids member declarations with no members"); ++ } ++ c_shadow_tag($1); ++ $$ = (c_tree_node *)0; ++ } ++ | error ++ { ++ $$ =(c_tree_node *)0; ++ } ++ | extension component_decl ++ { ++ $$ = $2; ++ c_pedantic = $1; ++ } ++ ; ++ ++components: ++ component_declarator ++ | components ',' component_declarator ++ { ++ $$ = c_tree_concat_list($1, $3); ++ } ++ ; ++ ++component_declarator: ++ save_filename save_lineno declarator maybe_attribute ++ { ++ $$ = c_grokfield($1, $2, $3, current_declspecs,(c_tree_node *)0); ++ c_decl_attributes($$, $4, prefix_attributes); ++ } ++ | save_filename save_lineno ++ declarator ':' expr_no_commas maybe_attribute ++ { ++ $$ = c_grokfield($1, $2, $3, current_declspecs, $5); ++ c_decl_attributes($$, $6, prefix_attributes); ++ } ++ | save_filename save_lineno ':' expr_no_commas maybe_attribute ++ { ++ $$ = c_grokfield($1, $2,(c_tree_node *)0, current_declspecs, $4); ++ c_decl_attributes($$, $5, prefix_attributes); ++ } ++ ; ++ ++/* We chain the enumerators in reverse order. ++ They are put in forward order where enumlist is used. ++ (The order used to be significant, but no longer is so. ++ However, we still maintain the order, just to be clean.) */ ++ ++enumlist: ++ enumerator ++ | enumlist ',' enumerator ++ { ++ if ($1 == c_error_mark_node) ++ { ++ $$ = $1; ++ } ++ else ++ { ++ $$ = c_tree_concat_list($3, $1); ++ } ++ } ++ | error ++ { ++ $$ = c_error_mark_node; ++ } ++ ; ++ ++ ++enumerator: ++ identifier ++ { ++ $$ = c_build_enumerator($1,(c_tree_node *)0); ++ } ++ | identifier '=' expr_no_commas ++ { ++ $$ = c_build_enumerator($1, $3); ++ } ++ ; ++ ++typename: ++ typed_typespecs absdcl ++ { ++ $$ = c_tree_build_list($1, $2); ++ } ++ | nonempty_type_quals absdcl ++ { ++ $$ = c_tree_build_list($1, $2); ++ } ++ ; ++ ++absdcl: /* an absolute declarator */ ++ /* empty */ ++ { ++ $$ = (c_tree_node *)0; ++ } ++ | absdcl1 ++ ; ++ ++nonempty_type_quals: ++ tok_TYPE_QUAL ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $1,(c_tree_node *)0); ++ } ++ | nonempty_type_quals tok_TYPE_QUAL ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ } ++ ; ++ ++type_quals: ++ /* empty */ ++ { ++ $$ = (c_tree_node *)0; ++ } ++ | type_quals tok_TYPE_QUAL ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, $2, $1); ++ } ++ ; ++ ++absdcl1: /* a nonempty absolute declarator */ ++ '(' absdcl1 ')' ++ { ++ $$ = $2; ++ } ++ /* `(typedef)1' is `int'. */ ++ | '*' type_quals absdcl1 %prec tok_UNARY ++ { ++ $$ = c_tree_build_pointer_declarator($2, $3); ++ } ++ | '*' type_quals %prec tok_UNARY ++ { ++ $$ = c_tree_build_pointer_declarator($2,(c_tree_node *)0); ++ } ++ | absdcl1 '(' parmlist %prec '.' ++ { ++ $$ = c_tree_build_ternary_expr(C_CALL_EXPR, $1, $3,(c_tree_node *)0); ++ } ++ | absdcl1 '[' expr ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr(C_ARRAY_REF, $1, $3); ++ } ++ | absdcl1 '[' ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr(C_ARRAY_REF, $1,(c_tree_node *)0); ++ } ++ | '(' parmlist %prec '.' ++ { ++ $$ = c_tree_build_ternary_expr( C_CALL_EXPR, (c_tree_node *)0, ++ $2,(c_tree_node *)0); ++ } ++ | '[' expr ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr(C_ARRAY_REF,(c_tree_node *)0, $2); ++ } ++ | '[' ']' %prec '.' ++ { ++ $$ = c_tree_build_binary_expr(C_ARRAY_REF,(c_tree_node *)0,(c_tree_node *)0); ++ } ++ /* ??? It appears we have to support attributes here, however ++ using prefix_attributes is wrong. */ ++ ; ++ ++/* at least one statement, the first of which parses without error. */ ++/* stmts is used only after decls, so an invalid first statement ++ is actually regarded as an invalid decl and part of the decls. */ ++ ++stmts: ++ lineno_stmt_or_labels ++ { ++ if (c_pedantic && $1.ends_in_label) ++ { ++ pedwarn("ANSI C forbids label at end of compound statement"); ++ } ++ ++ $$ = $1; ++ } ++ ; ++ ++lineno_stmt_or_labels: ++ lineno_stmt_or_label ++ { ++ $$ = $1; ++ } ++ | lineno_stmt_or_labels lineno_stmt_or_label ++ { ++ $$.stmt = c_tree_concat_list( $2.stmt, $1.stmt ); ++ $$.ends_in_label = $2.ends_in_label; ++ } ++ | lineno_stmt_or_labels errstmt ++ { ++ $$.stmt = $1.stmt; ++ $$.ends_in_label = 0; ++ } ++ ; ++ ++xstmts: ++ /* empty */ ++ { ++ $$.ends_in_label = 0; ++ $$.stmt = (c_tree_node *)0; ++ } ++ | stmts ++ { ++ $$ = $1; ++ } ++ ; ++ ++errstmt: error ';' ++ ; ++ ++pushlevel: /* empty */ ++ { ++ c_emit_line_note(c_input_filename, c_lineno); ++ c_push_level(0); ++# ifdef LUDO_NO_SKIP ++ clear_last_expr(); ++ push_momentary(); ++ expand_start_bindings(0); ++# endif ++ } ++ ; ++ ++/* Read zero or more forward-declarations for labels ++ that nested functions can jump to. */ ++maybe_label_decls: ++ /* empty */ ++ | label_decls ++ { ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids label declarations"); ++ } ++ } ++ ; ++ ++label_decls: ++ label_decl ++ | label_decls label_decl ++ ; ++ ++label_decl: ++ tok_LABEL identifiers_or_typenames ';' ++ { ++ c_tree_node *link; ++ for(link = $2; link; link = CTreeChain(link)) ++ { ++ c_tree_node *label = c_shadow_label(CTreeListValue(link)); ++ CSetTreeDeclDeclaredLabel(label); ++ /* ++ c_declare_nonlocal_label(label); ++ */ ++ } ++ } ++ ; ++ ++/* This is the body of a function definition. ++ It causes syntax errors to ignore to the next openbrace. */ ++compstmt_or_error: ++ compstmt ++ { ++ $$ = $1; ++ } ++ | error compstmt ++ { ++ $$ = $2; ++ } ++ ; ++ ++compstmt_start: '{' ++ { ++ compstmt_count++; ++ } ++ ++compstmt: compstmt_start '}' ++ { ++# ifdef LUDO_NO_SKIP ++ $$ = c_convert_expr(c_void_type_node, c_integer_zero_node); ++# else ++ $$ = (c_tree_node *)0; ++# endif ++ } ++ | compstmt_start pushlevel maybe_label_decls decls xstmts '}' ++ { ++ c_emit_line_note(c_input_filename, c_lineno); ++# ifdef LUDO_NO_SKIP ++ expand_end_bindings(c_get_decls(), 1, 0); ++# endif ++ ++ $$ = c_pop_level(1, 1, 0); ++ $5.stmt = c_tree_reverse_list( $5.stmt ); ++ ++ if ( $$ != (c_tree_node *)0 ) ++ { ++ CTreeBlockBody( $$ ) = $5.stmt; ++ } ++ else ++ { ++ $$ = $5.stmt; ++ } ++ ++# ifdef LUDO_NO_SKIP ++ if (yychar == CONSTANT || yychar == STRING) ++ pop_momentary_nofree(); ++ else ++ pop_momentary(); ++# endif ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | compstmt_start pushlevel maybe_label_decls error '}' ++ { ++ c_emit_line_note(c_input_filename, c_lineno); ++# ifdef LUDO_NO_SKIP ++ expand_end_bindings(getdecls(), c_kept_level_p(), 0); ++# endif ++ ++ $$ = c_pop_level(c_kept_level_p(), 0, 0); ++ ++# ifdef LUDO_NO_SKIP ++ if (yychar == CONSTANT || yychar == STRING) ++ pop_momentary_nofree(); ++ else ++ pop_momentary(); ++# endif ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | compstmt_start pushlevel maybe_label_decls stmts '}' ++ { ++ c_emit_line_note(c_input_filename, c_lineno); ++# ifdef LUDO_NO_SKIP ++ expand_end_bindings(getdecls(), c_kept_level_p(), 0); ++# endif ++ ++ $$ = c_pop_level(c_kept_level_p(), 0, 0); ++ $4.stmt = c_tree_reverse_list( $4.stmt ); ++ ++ if ( $$ != (c_tree_node *)0 ) ++ { ++ CTreeBlockBody( $$ ) = $4.stmt; ++ } ++ else ++ { ++ $$ = $4.stmt; ++ } ++ ++# ifdef LUDO_NO_SKIP ++ if (yychar == CONSTANT || yychar == STRING) ++ pop_momentary_nofree(); ++ else ++ pop_momentary(); ++# endif ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ ; ++ ++/* Value is number of statements counted as of the closeparen. */ ++simple_if: ++ if_prefix lineno_labeled_stmt ++ { ++ $$ = $1; ++ CTreeInstIfThen( $$ ) = c_tree_reverse_list( $2 ); ++ } ++/* Make sure c_expand_end_cond is run once ++ for each call to c_expand_start_cond. ++ Otherwise a crash is likely. */ ++ | if_prefix error ++ { ++ $$ = $1; ++ } ++ ; ++ ++if_prefix: ++ tok_IF '(' expr ')' ++ { ++ c_emit_line_note($-1, $0); ++ $3 = c_truthvalue_conversion( $3 ); ++# ifdef LUDO_NO_SKIP ++ c_expand_start_cond($3, 0, compstmt_count); ++# endif ++ $$ = stmt_count; ++ if_stmt_file = $-1; ++ if_stmt_line = $0; ++ c_position_after_white_space(); ++ ++ $$ = c_tree_build_inst( C_IF_INST ); ++ CTreeInstIfCond( $$ ) = $3; ++ } ++ ; ++ ++/* This is a subroutine of stmt. ++ It is used twice, once for valid DO statements ++ and once for catching errors in parsing the end test. */ ++do_stmt_start: ++ tok_DO ++ { ++ stmt_count++; ++ compstmt_count++; ++ c_emit_line_note($-1, $0); ++ /* See comment in `while' alternative, above. */ ++# ifdef LUDO_NO_SKIP ++ emit_nop(); ++ expand_start_loop_continue_elsewhere(1); ++# endif ++ c_position_after_white_space(); ++ } ++ lineno_labeled_stmt tok_WHILE ++ { ++# ifdef LUDO_NO_SKIP ++ expand_loop_continue_here(); ++# endif ++ $$ = c_tree_build_inst( C_DO_INST ); ++ CTreeInstDoBody( $$ ) = c_tree_reverse_list( $3 ); ++ } ++ ; ++ ++save_filename: ++ { ++ $$ = c_input_filename; ++ } ++ ; ++ ++save_lineno: ++ { ++ $$ = c_lineno; ++ } ++ ; ++ ++lineno_labeled_stmt: ++ save_filename save_lineno stmt ++ { ++ $$ = $3; ++ } ++ | save_filename save_lineno label lineno_labeled_stmt ++ { ++ c_tree_node *label = c_tree_add_head_list( (c_tree_node *)0, $3, (c_tree_node *)0 ); ++ $$ = c_tree_concat_list( $4, label ); ++ } ++ ; ++ ++lineno_stmt_or_label: ++ save_filename save_lineno stmt_or_label ++ { ++ $$ = $3; ++ } ++ ; ++ ++stmt_or_label: ++ stmt ++ { ++ $$.stmt = $1; ++ $$.ends_in_label = 0; ++ } ++ | label ++ { ++ c_tree_node *label = c_tree_add_head_list( (c_tree_node *)0, $1, (c_tree_node *)0 ); ++ $$.stmt = label; ++ $$.ends_in_label = 1; ++ } ++ ; ++ ++/* Parse a single real statement, not including any labels. */ ++stmt: ++ compstmt ++ { ++ stmt_count++; ++ $$ = $1; ++ } ++ | all_iter_stmt ++ { ++ $$ = $1; ++ } ++ | expr ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++/* It appears that this should not be done--that a non-lvalue array ++ shouldn't get an error if the value isn't used. ++ Section 3.2.2.1 says that an array lvalue gets converted to a pointer ++ if it appears as a top-level expression, ++ but says nothing about non-lvalue arrays. */ ++# ifdef LUDO_NO_SKIP ++ c_iterator_expand($1); ++ clear_momentary(); ++# endif ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $1, (c_tree_node *)0 ); ++ } ++ | simple_if tok_ELSE ++ { ++# ifdef LUDO_NO_SKIP ++ c_expand_start_else(); ++ $1 = stmt_count; ++# endif ++ c_position_after_white_space(); ++ } ++ lineno_labeled_stmt ++ { ++# ifdef LUDO_NO_SKIP ++ c_expand_end_cond(); ++ if (c_extra_warnings && stmt_count == $1) ++ { ++ warning("empty body in an else-statement"); ++ } ++# endif ++ ++ CTreeInstIfElse( $1 ) = c_tree_reverse_list( $4 ); ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $1, (c_tree_node *)0 ); ++ } ++ | simple_if %prec tok_IF ++ { ++# ifdef LUDO_NO_SKIP ++ c_expand_end_cond(); ++ /* This warning is here instead of in simple_if, because we ++ do not want a warning if an empty if is followed by an ++ else statement. Increment stmt_count so we don't ++ give a second error if this is a nested `if'. */ ++ if (c_extra_warnings && stmt_count++ == $1) ++ { ++ warning_with_file_and_line(if_stmt_file, if_stmt_line, ++ "empty body in an if-statement"); ++ } ++# endif ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $1, (c_tree_node *)0 ); ++ } ++/* Make sure c_expand_end_cond is run once ++ for each call to c_expand_start_cond. ++ Otherwise a crash is likely. */ ++ | simple_if tok_ELSE error ++ { ++# ifdef LUDO_NO_SKIP ++ c_expand_end_cond(); ++# endif ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $1, (c_tree_node *)0 ); ++ } ++ | tok_WHILE ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ /* The emit_nop used to come before emit_line_note, ++ but that made the nop seem like part of the preceding line. ++ And that was confusing when the preceding line was ++ inside of an if statement and was not really executed. ++ I think it ought to work to put the nop after the line number. ++ We will see. --rms, July 15, 1991. */ ++ emit_nop(); ++# endif ++ } ++ '(' expr ')' ++ { ++# ifdef LUDO_NO_SKIP ++ /* Don't start the loop till we have succeeded ++ in parsing the end test. This is to make sure ++ that we end every loop we start. */ ++ expand_start_loop(1); ++# endif ++ c_emit_line_note(c_input_filename, c_lineno); ++ $4 = c_truthvalue_conversion( $4 ); ++# ifdef LUDO_NO_SKIP ++ expand_exit_loop_if_false(NULL_PTR, $4 ); ++# endif ++ c_position_after_white_space(); ++ } ++ lineno_labeled_stmt ++ { ++# ifdef LUDO_NO_SKIP ++ expand_end_loop(); ++# endif ++ $$ = c_tree_build_inst( C_WHILE_INST ); ++ CTreeInstWhileCond( $$ ) = $4; ++ CTreeInstWhileBody( $$ ) = c_tree_reverse_list( $7 ); ++ ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | do_stmt_start ++ '(' expr ')' ';' ++ { ++ c_emit_line_note(c_input_filename, c_lineno); ++ $3 = c_truthvalue_conversion( $3 ); ++# ifdef LUDO_NO_SKIP ++ expand_exit_loop_if_false(NULL_PTR, $3 ); ++ expand_end_loop(); ++ clear_momentary(); ++# endif ++ $$ = $1; ++ CTreeInstDoCond( $$ ) = $3; ++ ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++/* This rule is needed to make sure we end every loop we start. */ ++ | do_stmt_start error ++ { ++# ifdef LUDO_NO_SKIP ++ expand_end_loop(); ++ clear_momentary(); ++# endif ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $1, (c_tree_node *)0 ); ++ } ++ | tok_FOR ++ '(' xexpr ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ /* See comment in `while' alternative, above. */ ++ emit_nop(); ++ if ($3) c_expand_expr_stmt($3); ++ /* Next step is to call expand_start_loop_continue_elsewhere, ++ but wait till after we parse the entire for(...). ++ Otherwise, invalid input might cause us to call that ++ fn without calling expand_end_loop. */ ++# endif ++ } ++ xexpr ';' ++ /* Can't emit now; wait till after expand_start_loop... */ ++ { ++ $7 = c_lineno; ++ $$ = c_input_filename; ++ } ++ xexpr ')' ++ { ++# ifdef LUDO_NO_SKIP ++ ++ /* Start the loop. Doing this after parsing ++ all the expressions ensures we will end the loop. */ ++ expand_start_loop_continue_elsewhere(1); ++# endif ++ /* Emit the end-test, with a line number. */ ++ c_emit_line_note($8, $7); ++ ++ if ( $6 ) ++ { ++ $6 = c_truthvalue_conversion( $6 ); ++# ifdef LUDO_NO_SKIP ++ expand_exit_loop_if_false(NULL_PTR, $6 ); ++ /* Don't let the tree nodes for $9 be discarded by ++ clear_momentary during the parsing of the next stmt. */ ++ push_momentary(); ++# endif ++ } ++ $7 = c_lineno; ++ $8 = c_input_filename; ++ c_position_after_white_space(); ++ } ++ lineno_labeled_stmt ++ { ++ /* Emit the increment expression, with a line number. */ ++ c_emit_line_note($8, $7); ++# ifdef LUDO_NO_SKIP ++ expand_loop_continue_here(); ++ if ($9) ++ c_expand_expr_stmt($9); ++ if (yychar == CONSTANT || yychar == STRING) ++ pop_momentary_nofree(); ++ else ++ pop_momentary(); ++ expand_end_loop(); ++# endif ++ $$ = c_tree_build_inst( C_FOR_INST ); ++ CTreeInstForStart( $$ ) = $3; ++ CTreeInstForCond( $$ ) = $6; ++ CTreeInstForInc( $$ ) = $9; ++ CTreeInstForBody( $$ ) = $12; ++ ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | tok_SWITCH '(' expr ')' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ c_expand_start_case($3); ++ /* Don't let the tree nodes for $3 be discarded by ++ clear_momentary during the parsing of the next stmt. */ ++ push_momentary(); ++# endif ++ c_position_after_white_space(); ++ } ++ lineno_labeled_stmt ++ { ++# ifdef LUDO_NO_SKIP ++ expand_end_case($3); ++ if (yychar == CONSTANT || yychar == STRING) ++ pop_momentary_nofree(); ++ else ++ pop_momentary(); ++# endif ++ ++ $$ = c_tree_build_inst( C_SWITCH_INST ); ++ CTreeInstSwitchOn( $$ ) = $3; ++ CTreeInstSwitchBody( $$ ) = $6; ++ } ++ | tok_BREAK ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ if ( ! expand_exit_something()) ++ error("break statement not within loop or switch"); ++# endif ++ $$ = c_tree_build_inst( C_BREAK_INST ); ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | tok_CONTINUE ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ if (! expand_continue_loop(NULL_PTR)) ++ error("continue statement not within a loop"); ++# endif ++ $$ = c_tree_build_inst( C_CONTINUE_INST ); ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | tok_RETURN ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ c_expand_return((c_tree_node *)0); ++# endif ++ $$ = c_tree_build_inst( C_RETURN_INST ); ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | tok_RETURN expr ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ c_expand_return($2); ++# endif ++ $$ = c_tree_build_inst( C_RETURN_INST ); ++ CTreeInstReturnValue( $$ ) = $2; ++ ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | tok_ASM_KEYWORD maybe_type_qual '(' expr ')' ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++ CStripNops($4); ++ ++ if (( CTreeExprCode($4) == C_ADDR_EXPR ++ && CTreeNodeFirstCode( CTreeExprOperand($4, 0)) == C_STRING_NODE) ++ || CTreeNodeFirstCode($4) == C_STRING_NODE) ++ { ++# ifdef LUDO_NO_SKIP ++ expand_asm($4); ++# endif ++ } ++ else ++ { ++ error("argument of `asm' is not a constant string"); ++ } ++ ++ $$ = (c_tree_node *)0; ++ } ++/* This is the case with just output operands. */ ++ | tok_ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ')' ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ c_expand_asm_operands($4, $6,(c_tree_node *)0,(c_tree_node *)0, ++ $2 == ridpointers[(int)RID_VOLATILE], ++ c_input_filename, c_lineno); ++# endif ++ $$ = (c_tree_node *)0; ++ } ++/* This is the case with input operands as well. */ ++ | tok_ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' asm_operands ')' ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ c_expand_asm_operands($4, $6, $8,(c_tree_node *)0, ++ $2 == ridpointers[(int)RID_VOLATILE], ++ c_input_filename, c_lineno); ++# endif ++ $$ = (c_tree_node *)0; ++ } ++/* This is the case with clobbered registers as well. */ ++ | tok_ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' ++ asm_operands ':' asm_clobbers ')' ';' ++ { ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++# ifdef LUDO_NO_SKIP ++ c_expand_asm_operands($4, $6, $8, $10, $2 == ridpointers[(int)RID_VOLATILE], ++ c_input_filename, c_lineno); ++# endif ++ $$ = (c_tree_node *)0; ++ } ++ | tok_GOTO identifier ';' ++ { ++ c_tree_node *decl; ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++ decl = c_lookup_label($2); ++ ++ if (decl != 0) ++ { ++ CSetTreeNodeUsed(decl); ++# ifdef LUDO_NO_SKIP ++ expand_goto(decl); ++# endif ++ } ++ $$ = c_tree_build_inst( C_GOTO_INST ); ++ CTreeInstGotoLabel( $$ ) = decl; ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ } ++ | tok_GOTO '*' expr ';' ++ { ++ if ( c_pedantic ) ++ { ++ pedwarn("ANSI C forbids `goto *expr;'"); ++ } ++ stmt_count++; ++ c_emit_line_note($-1, $0); ++ $3 = c_convert_expr(c_ptr_type_node, $3); ++ ++ $$ = c_tree_build_inst( C_GOTO_INST ); ++ CTreeInstGotoLabel( $$ ) = $3; ++ ++ $$ = c_tree_add_head_list( (c_tree_node *)0, $$, (c_tree_node *)0 ); ++ ++# ifdef LUDO_NO_SKIP ++ expand_computed_goto($3); ++# endif ++ } ++ | ';' ++ { ++ $$ = (c_tree_node *)0; ++ } ++ ; ++ ++all_iter_stmt: ++ all_iter_stmt_simple ++/* | all_iter_stmt_with_decl */ ++ ; ++ ++all_iter_stmt_simple: ++ tok_FOR '(' primary ')' ++ { ++ /* The value returned by this action is */ ++ /* 1 if everything is OK */ ++ /* 0 in case of error or already bound iterator */ ++ ++ $$ = 0; ++ ++ if ( ( CTreeNodeFirstCode($3) != C_DECL_NODE ) || ++ ( CTreeDeclCode($3) != C_VAR_DECL ) ) ++ { ++ error("invalid `for(ITERATOR)' syntax"); ++ } ++ else if (! CIsTreeDeclIterator($3)) ++ { ++ error("`%s' is not an iterator", ++ CTreeIdentPointer(CTreeDeclName($3))); ++ } ++ else if ( CIsTreeNodeReadOnly($3)) ++ { ++ error("`for(%s)' inside expansion of same iterator", ++ CTreeIdentPointer(CTreeDeclName($3))); ++ } ++ else ++ { ++ $$ = 1; ++# ifdef LUDO_NO_SKIP ++ iterator_for_loop_start($3); ++# endif ++ } ++ } ++ lineno_labeled_stmt ++ { ++ $$ = (c_tree_node *)0; ++ ++ if ($5) ++ { ++# ifdef LUDO_NO_SKIP ++ iterator_for_loop_end($3); ++# endif ++ } ++ } ++ ++/* Any kind of label, including jump labels and case labels. ++ ANSI C accepts labels only before statements, but we allow them ++ also at the end of a compound statement. */ ++ ++label: tok_CASE expr_no_commas ':' ++ { ++ c_tree_node *value = c_check_case_value($2); ++# ifdef LUDO_NO_SKIP ++ c_tree_node *label ++ = c_tree_build_decl(C_LABEL_DECL,(c_tree_node *)0,(c_tree_node *)0); ++# endif ++ ++ stmt_count++; ++ ++ if (value != c_error_mark_node) ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *duplicate; ++ int success = c_push_case(value, c_convert_and_check, label, &duplicate); ++ ++ if (success == 1) ++ { ++ error("case label not within a switch statement"); ++ } ++ else if (success == 2) ++ { ++ error("duplicate case value"); ++ error_with_decl(duplicate, "this is the first entry for that value"); ++ } ++ else if (success == 3) ++ { ++ warning("case value out of range"); ++ } ++ else if (success == 5) ++ { ++ error("case label within scope of cleanup or variable array"); ++ } ++# endif ++ } ++ ++ $$ = c_tree_build_inst( C_CASE_INST ); ++ CTreeInstCaseCode( $$ ) = C_STANDARD_CASE; ++ CTreeInstCaseFrom( $$ ) = value; ++ CTreeInstCaseTo( $$ ) = value; ++ ++ c_position_after_white_space(); ++ } ++ | tok_CASE expr_no_commas tok_ELLIPSIS expr_no_commas ':' ++ { ++ c_tree_node *value1 = c_check_case_value($2); ++ c_tree_node *value2 = c_check_case_value($4); ++# ifdef LUDO_NO_SKIP ++ c_tree_node *label ++ = c_tree_build_decl(C_LABEL_DECL,(c_tree_node *)0,(c_tree_node *)0); ++# endif ++ ++ if (c_pedantic) ++ { ++ pedwarn("ANSI C forbids case ranges"); ++ } ++ stmt_count++; ++ ++ $$ = c_error_mark_node; ++ ++ if (value1 != c_error_mark_node && value2 != c_error_mark_node) ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *duplicate; ++ int success = c_push_case_range(value1, value2, c_convert_and_check, label, ++ &duplicate); ++ if (success == 1) ++ { ++ error("case label not within a switch statement"); ++ } ++ else if (success == 2) ++ { ++ error("duplicate case value"); ++ error_with_decl(duplicate, "this is the first entry for that value"); ++ } ++ else if (success == 3) ++ { ++ warning("case value out of range"); ++ } ++ else if (success == 4) ++ { ++ warning("empty case range"); ++ } ++ else if (success == 5) ++ { ++ error("case label within scope of cleanup or variable array"); ++ } ++ else ++# endif ++ } ++ ++ $$ = c_tree_build_inst( C_CASE_INST ); ++ CTreeInstCaseCode( $$ ) = C_RANGE_CASE; ++ CTreeInstCaseFrom( $$ ) = value1; ++ CTreeInstCaseTo( $$ ) = value2; ++ c_position_after_white_space(); ++ } ++ | tok_DEFAULT ':' ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *duplicate; ++ c_tree_node *label ++ = c_tree_build_decl(C_LABEL_DECL,(c_tree_node *)0,(c_tree_node *)0); ++ int success = c_push_case((c_tree_node *)0, 0, label, &duplicate); ++# endif ++ stmt_count++; ++ ++ $$ = c_error_mark_node; ++ ++# ifdef LUDO_NO_SKIP ++ if (success == 1) ++ { ++ error("default label not within a switch statement"); ++ } ++ else if (success == 2) ++ { ++ error("multiple default labels in one switch"); ++ error_with_decl(duplicate, "this is the first default label"); ++ } ++ else ++# endif ++ ++ $$ = c_tree_build_inst( C_CASE_INST ); ++ CTreeInstCaseCode( $$ ) = C_DEFAULT_CASE; ++ c_position_after_white_space(); ++ } ++ | identifier ':' ++ { ++ c_tree_node *label = c_define_label(c_input_filename, c_lineno, $1); ++ stmt_count++; ++ ++# ifdef LUDO_NO_SKIP ++ emit_nop(); ++ if (label) ++ { ++ expand_label(label); ++ } ++# endif ++ $$ = label; ++ c_position_after_white_space(); ++ } ++ ; ++ ++/* Either a type-qualifier or nothing. First thing in an `asm' statement. */ ++ ++maybe_type_qual: ++ /* empty */ ++ { ++ c_emit_line_note(c_input_filename, c_lineno); ++ $$ =(c_tree_node *)0; ++ } ++ | tok_TYPE_QUAL ++ { ++ c_emit_line_note(c_input_filename, c_lineno); ++ $$ =(c_tree_node *)0; ++ } ++ ; ++ ++xexpr: ++ /* empty */ ++ { ++ $$ =(c_tree_node *)0; ++ } ++ | expr ++ ; ++ ++/* These are the operands other than the first string and colon ++ in asm("addextend %2,%1": "=dm"(x), "0"(y), "g"(*x)) */ ++asm_operands: /* empty */ ++ { ++ $$ = (c_tree_node *)0; ++ } ++ | nonnull_asm_operands ++ ; ++ ++nonnull_asm_operands: ++ asm_operand ++ | nonnull_asm_operands ',' asm_operand ++ { ++ $$ = c_tree_concat_list($1, $3); ++ } ++ ; ++ ++asm_operand: ++ tok_STRING '(' expr ')' ++ { ++ $$ = c_tree_build_list($1, $3); ++ } ++ ; ++ ++asm_clobbers: ++ string ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, ++ c_tree_combine_strings($1),(c_tree_node *)0); ++ } ++ | asm_clobbers ',' string ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0, ++ c_tree_combine_strings($3), $1); ++ } ++ ; ++ ++/* This is what appears inside the parens in a function declarator. ++ Its value is a list of ..._TYPE nodes. */ ++parmlist: ++ { ++ c_push_level(0); ++ c_clear_parm_order(); ++ c_declare_parm_level(0); ++ } ++ parmlist_1 ++ { ++ $$ = $2; ++ c_parmlist_tags_warning(); ++ c_pop_level(0, 0, 0); ++ } ++ ; ++ ++parmlist_1: ++ parmlist_2 ')' ++ { ++ $$ = $1; ++ } ++ | parms ';' ++ { ++ c_tree_node *parm; ++ ++ if ( c_pedantic ) ++ { ++ pedwarn("ANSI C forbids forward parameter declarations"); ++ } ++ /* Mark the forward decls as such. */ ++ for(parm = c_get_decls(); parm; parm = CTreeChain(parm)) ++ { ++ CSetTreeNodeAsmWritten(parm); ++ } ++ c_clear_parm_order(); ++ } ++ parmlist_1 ++ { ++ $$ = $4; ++ } ++ | error ')' ++ { ++ $$ = c_tree_add_head_list((c_tree_node *)0,(c_tree_node *)0,(c_tree_node *)0); ++ } ++ ; ++ ++/* This is what appears inside the parens in a function declarator. ++ Is value is represented in the format that grokdeclarator expects. */ ++parmlist_2: /* empty */ ++ { ++ $$ = c_get_parm_info(0); ++ } ++ | tok_ELLIPSIS ++ { ++ $$ = c_get_parm_info(0); ++ /* Gcc used to allow this as an extension. However, it does ++ not work for all targets, and thus has been disabled. ++ Also, since func(...) and func() are indistinguishable, ++ it caused problems with the code in expand_builtin which ++ tries to verify that BUILT_IN_NEXT_ARG is being used ++ correctly. */ ++ error("ANSI C requires a named argument before `...'"); ++ } ++ | parms ++ { ++ $$ = c_get_parm_info(1); ++ } ++ | parms ',' tok_ELLIPSIS ++ { ++ $$ = c_get_parm_info(0); ++ } ++ ; ++ ++parms: ++ parm ++ { ++ c_push_parm_decl($1); ++ } ++ | parms ',' parm ++ { ++ c_push_parm_decl($3); ++ } ++ ; ++ ++/* A single parameter declaration or parameter type name, ++ as found in a parmlist. */ ++parm: ++ typed_declspecs setspecs parm_declarator maybe_attribute ++ { ++ $$ = c_tree_build_list(c_tree_build_list(current_declspecs, $3), ++ c_tree_build_list(prefix_attributes, $4)); ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | typed_declspecs setspecs notype_declarator maybe_attribute ++ { ++ $$ = c_tree_build_list(c_tree_build_list(current_declspecs, $3), ++ c_tree_build_list(prefix_attributes, $4)); ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | typed_declspecs setspecs absdcl maybe_attribute ++ { ++ $$ = c_tree_build_list(c_tree_build_list(current_declspecs, $3), ++ c_tree_build_list(prefix_attributes, $4)); ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ | declmods setspecs notype_declarator maybe_attribute ++ { ++ $$ = c_tree_build_list(c_tree_build_list(current_declspecs, $3), ++ c_tree_build_list(prefix_attributes, $4)); ++ current_declspecs = CTreeListValue(declspec_stack); ++ prefix_attributes = CTreeListPurpose(declspec_stack); ++ declspec_stack = CTreeChain(declspec_stack); ++ c_resume_momentary($2); ++ } ++ ++ | declmods setspecs absdcl maybe_attribute ++ { ++ $$ = c_tree_build_list( ++ c_tree_build_list(current_declspecs, $3), ++ c_tree_build_list(prefix_attributes, $4)); ++ ++ current_declspecs = CTreeListValue( declspec_stack ); ++ prefix_attributes = CTreeListPurpose( declspec_stack ); ++ declspec_stack = CTreeChain( declspec_stack ); ++ c_resume_momentary($2); ++ } ++ ; ++ ++/* This is used in a function definition ++ where either a parmlist or an identifier list is ok. ++ Its value is a list of ..._TYPE nodes or a list of identifiers. */ ++parmlist_or_identifiers: ++ { ++ c_push_level(0); ++ c_clear_parm_order(); ++ c_declare_parm_level(1); ++ } ++ parmlist_or_identifiers_1 ++ { ++ $$ = $2; ++ c_parmlist_tags_warning(); ++ c_pop_level(0, 0, 0); ++ } ++ ; ++ ++parmlist_or_identifiers_1: ++ parmlist_1 ++ | identifiers ')' ++ { ++ c_tree_node *ScanTree; ++ ++ for( ScanTree = $1; ++ ScanTree !=(c_tree_node *)0; ++ ScanTree = ScanTree->COMMON.CHAIN ) ++ { ++ if ( ScanTree->LIST.VALUE ==(c_tree_node *)0 ) ++ { ++ error("`...' in old-style identifier list"); ++ } ++ } ++ ++ $$ = c_tree_add_head_list((c_tree_node *)0,(c_tree_node *)0, $1); ++ } ++ ; ++ ++/* A nonempty list of identifiers. */ ++identifiers: ++ tok_IDENTIFIER ++ { ++ $$ = c_tree_build_list((c_tree_node *)0, $1); ++ } ++ | identifiers ',' tok_IDENTIFIER ++ { ++ $$ = c_tree_concat_list( $1, c_tree_build_list((c_tree_node *)0, $3)); ++ } ++ ; ++ ++/* A nonempty list of identifiers, including typenames. */ ++identifiers_or_typenames: ++ identifier ++ { ++ $$ = c_tree_build_list((c_tree_node *)0, $1); ++ } ++ | identifiers_or_typenames ',' identifier ++ { ++ $$ = c_tree_concat_list( $1, c_tree_build_list((c_tree_node *)0, $3)); ++ } ++ ; ++ ++extension: ++ tok_EXTENSION ++ { ++ $$ = c_pedantic; ++ c_pedantic = 0; ++ } ++ ; ++ ++%% +diff -Naur alliance-5.0/gcp/src/c_cdecl.c alliance/gcp/src/c_cdecl.c +--- alliance-5.0/gcp/src/c_cdecl.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_cdecl.c 2005-05-11 10:05:33.000000000 +0200 +@@ -0,0 +1,8709 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_cdecl.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_flags.h" ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_clex.h" ++# include "c_ctypeck.h" ++# include "c_cdecl.h" ++# include "c_convert.h" ++# include "c_common.h" ++# include "c_foldconst.h" ++# include "c_debug.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++#define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) ++ ++#define C_PROMOTING_INTEGER_TYPE_P(t) \ ++ ( CTreeTypeCode((t)) == C_INTEGER_TYPE \ ++ && ( CTreeTypeMainVariant(t) == c_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_signed_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_unsigned_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_short_integer_type_node \ ++ || CTreeTypeMainVariant(t) == c_short_unsigned_type_node)) ++ ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ c_tree_node *c_tree_program_node; ++ ++/* Set nonzero by jump_optimize if control can fall through ++ to the end of the function. */ ++ int c_can_reach_end; ++ ++/* The binding level currently in effect. */ ++static c_binding_level *c_current_binding_level; ++ ++/* The outermost binding level, for names of file scope. ++ This is created when the compiler is started and exists ++ through the entire run. */ ++static c_binding_level *c_global_binding_level; ++ ++/* Nonzero means unconditionally make a BLOCK for the next level pushed. */ ++ ++static int c_keep_next_level_flag; ++ ++/* Nonzero means make a BLOCK for the next level pushed ++ if it has subblocks. */ ++ ++static int c_keep_next_if_subblocks; ++ ++/* The chain of outer levels of label scopes. ++ This uses the same data structure used for binding levels, ++ but it works differently: each link in the chain records ++ saved values of named_labels and shadowed_labels for ++ a label binding level outside the current one. */ ++ ++# ifdef LUDO_NO_SKIP ++static struct binding_level *c_label_level_chain; ++# endif ++ ++/* a node which has tree code ERROR_MARK, and whose type is itself. ++ All erroneous expressions are replaced with this node. All functions ++ that accept nodes as arguments should avoid generating error messages ++ if this node is one of the arguments, since it is undesirable to get ++ multiple error messages from one error in the input. */ ++ ++ c_tree_node *c_error_mark_node; ++ ++ ++/* Data type for the expressions representing sizes of data types. ++ It is the first integer type laid out. ++ In C, this is int. */ ++ c_tree_node *c_size_type; ++ ++/* An integer constant with value 0 whose type is sizetype. */ ++ c_tree_node *c_size_zero_node; ++ ++/* An integer constant with value 1 whose type is sizetype. */ ++ ++ c_tree_node *c_size_one_node; ++ ++ ++/* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */ ++ ++ c_tree_node *c_short_integer_type_node; ++ c_tree_node *c_integer_type_node; ++ c_tree_node *c_long_integer_type_node; ++ c_tree_node *c_long_long_integer_type_node; ++ ++ c_tree_node *c_short_unsigned_type_node; ++ c_tree_node *c_unsigned_type_node; ++ c_tree_node *c_long_unsigned_type_node; ++ c_tree_node *c_long_long_unsigned_type_node; ++ ++ c_tree_node *c_boolean_type_node; ++ c_tree_node *c_boolean_false_node; ++ c_tree_node *c_boolean_true_node; ++ ++ c_tree_node *c_ptrdiff_type_node; ++ ++ c_tree_node *c_unsigned_char_type_node; ++ c_tree_node *c_signed_char_type_node; ++ c_tree_node *c_char_type_node; ++ c_tree_node *c_wchar_type_node; ++ c_tree_node *c_signed_wchar_type_node; ++ c_tree_node *c_unsigned_wchar_type_node; ++ ++ c_tree_node *c_float_type_node; ++ c_tree_node *c_double_type_node; ++ c_tree_node *c_long_double_type_node; ++ ++ c_tree_node *c_complex_integer_type_node; ++ c_tree_node *c_complex_float_type_node; ++ c_tree_node *c_complex_double_type_node; ++ c_tree_node *c_complex_long_double_type_node; ++ ++/*I ++ c_tree_node *intQI_type_node; ++ c_tree_node *intHI_type_node; ++ c_tree_node *intSI_type_node; ++ c_tree_node *intDI_type_node; ++ ++ c_tree_node *unsigned_intQI_type_node; ++ c_tree_node *unsigned_intHI_type_node; ++ c_tree_node *unsigned_intSI_type_node; ++ c_tree_node *unsigned_intDI_type_node; ++*/ ++ ++/* a VOID_TYPE node. */ ++ ++ c_tree_node *c_void_type_node; ++ ++/* Nodes for types `void *' and `const void *'. */ ++ ++ c_tree_node *c_ptr_type_node; ++ c_tree_node *c_const_ptr_type_node; ++ ++/* Nodes for types `char *' and `const char *'. */ ++ ++ c_tree_node *c_string_type_node; ++ c_tree_node *c_const_string_type_node; ++ ++/* Type `char[SOMENUMBER]'. ++ Used when an array of char is needed and the size is irrelevant. */ ++ ++ c_tree_node *c_char_array_type_node; ++ ++/* Type `int[SOMENUMBER]' or something like it. ++ Used when an array of int needed and the size is irrelevant. */ ++ ++ c_tree_node *c_int_array_type_node; ++ ++/* Type `wchar_t[SOMENUMBER]' or something like it. ++ Used when a wide string literal is created. */ ++ ++ c_tree_node *c_wchar_array_type_node; ++ ++/* type `int ()' -- used for implicit declaration of functions. */ ++ ++ c_tree_node *c_default_function_type; ++ ++/* function types `double (double)' and `double (double, double)', etc. */ ++ ++ c_tree_node *c_double_ftype_double; ++ c_tree_node *c_double_ftype_double_double; ++ c_tree_node *c_int_ftype_int; ++ c_tree_node *c_long_ftype_long; ++ c_tree_node *c_float_ftype_float; ++ c_tree_node *c_ldouble_ftype_ldouble; ++ ++/* Function type `void (void *, void *, int)' and similar ones */ ++ ++ c_tree_node *c_void_ftype_ptr_ptr_int; ++ c_tree_node *c_int_ftype_ptr_ptr_int; ++ c_tree_node *c_void_ftype_ptr_int_int; ++ ++/* Function type `char *(char *, char *)' and similar ones */ ++ c_tree_node *c_string_ftype_ptr_ptr; ++ c_tree_node *c_int_ftype_string_string; ++ ++/* Function type `int (const void *, const void *, size_t)' */ ++ c_tree_node *c_int_ftype_cptr_cptr_sizet; ++ ++/* Two expressions that are constants with value zero. ++ The first is of type `int', the second of type `void *'. */ ++ c_tree_node *c_integer_zero_node; ++ c_tree_node *c_null_pointer_node; ++ ++/* A node for the integer constant 1. */ ++ c_tree_node *c_integer_one_node; ++ ++/* Nonzero if we have seen an invalid cross reference ++ to a struct, union, or enum, but not yet printed the message. */ ++ ++ c_tree_node *c_pending_invalid_xref; ++/* File and line to appear in the eventual error message. */ ++char *c_pending_invalid_xref_file; ++int c_pending_invalid_xref_line; ++ ++/* While defining an enum type, this is 1 plus the last enumerator ++ constant value. Note that will do not have to save this or `enum_overflow' ++ around nested function definition since such a definition could only ++ occur in an enum value expression and we don't use these variables in ++c that case. */ ++ ++static c_tree_node *c_enum_next_value; ++ ++/* Nonzero means that there was overflow computing enum_next_value. */ ++ ++static int c_enum_overflow; ++ ++/* Parsing a function declarator leaves a list of parameter names ++ or a chain or parameter decls here. */ ++ ++static c_tree_node *c_last_function_parms; ++ ++/* Parsing a function declarator leaves here a chain of structure ++ and enum types declared in the parmlist. */ ++ ++static c_tree_node *c_last_function_parm_tags; ++ ++/* After parsing the declarator that starts a function definition, ++ `c_start_function' puts here the list of parameter names or chain of decls. ++ `store_parm_decls' finds it here. */ ++ ++static c_tree_node *c_current_function_parms; ++ ++/* Similar, for last_function_parm_tags. */ ++static c_tree_node *c_current_function_parm_tags; ++ ++/* Similar, for the file and line that the prototype came from if this is ++ an old-style definition. */ ++static char *c_current_function_prototype_file; ++static int c_current_function_prototype_line; ++ ++/* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function ++ that have names. Here so we can clear out their names' definitions ++ at the end of the function. */ ++ ++static c_tree_node *c_named_labels; ++ ++/* A list of LABEL_DECLs from outer contexts that are currently shadowed. */ ++ ++static c_tree_node *c_shadowed_labels; ++ ++/* Nonzero when store_parm_decls is called indicates a varargs function. ++ Value not meaningful after store_parm_decls. */ ++ ++static int c_c_function_varargs; ++ ++/* The FUNCTION_DECL for the function currently being compiled, ++ or 0 if between functions. */ ++ c_tree_node *c_current_function_decl; ++ ++/* Set to 0 at beginning of a function definition, set to 1 if ++ a return statement that specifies a return value is seen. */ ++ ++int c_current_function_returns_value; ++ ++/* Set to 0 at beginning of a function definition, set to 1 if ++ a return statement with no argument is seen. */ ++ ++int c_current_function_returns_null; ++ ++/* Set to nonzero by `c_grokdeclarator' for a function ++ whose return type is defaulted, if warnings for this are desired. */ ++ ++static int c_warn_about_return_type; ++ ++/* Nonzero when starting a function declared `extern inline'. */ ++ ++static int c_current_extern_inline; ++ ++/* Nonzero means the expression being parsed will never be evaluated. ++ This is a count, since unevaluated expressions can nest. */ ++ int c_skip_evaluation; ++ ++/* Nonzero if current function uses varargs.h or equivalent. ++ Zero for functions that use stdarg.h. */ ++ ++ int c_current_function_varargs; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Alloc Functions | ++| | ++\------------------------------------------------------------*/ ++ ++c_binding_level *c_alloc_binding_level() ++{ ++ return( (c_binding_level *)autallocheap( sizeof( c_binding_level ) ) ); ++} ++ ++void c_free_binding_level( Binding ) ++ ++ c_binding_level *Binding; ++{ ++ autfreeheap( Binding, sizeof( c_binding_level ) ); ++} ++ ++/* Nonzero if we are currently in the global binding level. */ ++ ++int c_global_bindings_p() ++{ ++ return c_current_binding_level == c_global_binding_level; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| View Functions | ++| | ++\------------------------------------------------------------*/ ++ ++void c_view_binding( Binding ) ++ ++ c_binding_level *Binding; ++{ ++ fprintf( stdout, "NAME LIST\n" ); ++ c_tree_view_node_list( Binding->NAME_LIST ); ++ fprintf( stdout, "TAG LIST\n" ); ++ c_tree_view_node_list( Binding->TAG_LIST ); ++ fprintf( stdout, "SHADOWED LIST\n" ); ++ c_tree_view_node_list( Binding->SHADOWED_LIST ); ++ fprintf( stdout, "BLOCK LIST\n" ); ++ c_tree_view_node_list( Binding->BLOCK_LIST ); ++ fprintf( stdout, "THIS BLOCK\n" ); ++ c_tree_view_node_list( Binding->THIS_BLOCK ); ++ fprintf( stdout, "PARAM LIST\n" ); ++ c_tree_view_node_list( Binding->PARAM_LIST ); ++} ++ ++void c_view_current_binding() ++{ ++ c_view_binding( c_current_binding_level ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Clear Parameter Order | ++| | ++\------------------------------------------------------------*/ ++ ++/* Clear the given order of parms in `parm_order'. ++ Used at start of parm list, ++ and also at semicolon terminating forward decls. */ ++ ++void c_clear_parm_order() ++{ ++ c_current_binding_level->PARAM_LIST = (c_tree_node *)0; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Push Level | ++| | ++\------------------------------------------------------------*/ ++ ++/* Enter a new binding level. ++ If TAG_TRANSPARENT is nonzero, do so only for the name space of variables, ++ not for that of tags. */ ++ ++void c_push_level( tag_transparent ) ++ ++ int tag_transparent; ++{ ++ c_binding_level *newlevel = (c_binding_level *)0; ++ ++ /* If this is the top level of a function, ++ just make sure that NAMED_LABELS is 0. */ ++ ++ if ( c_current_binding_level == c_global_binding_level ) ++ { ++ c_named_labels = 0; ++ } ++ ++ newlevel = c_alloc_binding_level(); ++ ++ /* Add this level to the front of the chain (stack) of levels that ++ are active. */ ++ ++ newlevel->TAG_TRANSPARENT ++ = (tag_transparent ++ || (c_current_binding_level ++ ? c_current_binding_level->SUBBLOCKS_TAG_TRANSPARENT ++ : 0)); ++ newlevel->LEVEL_CHAIN = c_current_binding_level; ++ c_current_binding_level = newlevel; ++ ++ newlevel->KEEP = c_keep_next_level_flag; ++ c_keep_next_level_flag = 0; ++ newlevel->KEEP_IF_SUBBLOCKS = c_keep_next_if_subblocks; ++ c_keep_next_if_subblocks = 0; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Pop Level | ++| | ++\------------------------------------------------------------*/ ++ ++ ++/* Clear the limbo values of all identifiers defined in BLOCK or a subblock. */ ++ ++static void c_clear_limbo_values (block) ++ c_tree_node *block; ++{ ++ c_tree_node *tem; ++ ++ for (tem = CTreeBlockVars(block); tem; tem = CTreeChain(tem)) ++ { ++ if (CTreeDeclName(tem) != 0) ++ { ++ CTreeIdentLimboValue( CTreeDeclName(tem)) = 0; ++ } ++ } ++ ++ for (tem = CTreeBlockSubBlocks(block); tem; tem = CTreeChain(tem)) ++ { ++ c_clear_limbo_values(tem); ++ } ++} ++ ++/* Exit a binding level. ++ Pop the level off, and restore the state of the identifier-decl mappings ++ that were in effect when this level was entered. ++ ++ If KEEP is nonzero, this level had explicit declarations, so ++ and create a "block" (a BLOCK node) for the level ++ to record its declarations and subblocks for symbol table output. ++ ++ If FUNCTIONBODY is nonzero, this level is the body of a function, ++ so create a block as if KEEP were set and also clear out all ++ label names. ++ ++ If REVERSE is nonzero, reverse the order of decls before putting ++ them into the BLOCK. */ ++ ++c_tree_node *c_pop_level( keep, reverse, functionbody ) ++ int keep; ++ int reverse; ++ int functionbody; ++{ ++ c_tree_node *link; ++ /* The chain of decls was accumulated in reverse order. ++ Put it into forward order, just for cleanliness. */ ++ c_tree_node *decls; ++ c_tree_node *tags = c_current_binding_level->TAG_LIST; ++ c_tree_node *subblocks = c_current_binding_level->BLOCK_LIST; ++ c_tree_node *block = (c_tree_node *)0; ++ c_tree_node *decl; ++ int block_previously_created; ++ ++ /* ++ loc_c_view_binding( c_current_binding_level ); ++ */ ++ ++ keep |= c_current_binding_level->KEEP; ++ ++ /* Get the decls in the order they were written. ++ Usually current_binding_level->names is in reverse order. ++ But parameter decls were previously put in forward order. */ ++ ++ if (reverse) ++ { ++ c_current_binding_level->NAME_LIST ++ = decls = c_tree_reverse_list(c_current_binding_level->NAME_LIST); ++ } ++ else ++ { ++ decls = c_current_binding_level->NAME_LIST; ++ } ++ ++ /* Output any nested inline functions within this block ++ if they weren't already output. */ ++ ++ for (decl = decls; decl; decl = CTreeChain(decl)) ++ { ++ if ( CTreeDeclCode(decl) == C_FUNCTION_DECL ++ && ! CIsTreeNodeAsmWritten(decl) ++ && CTreeDeclInitial(decl) != 0 ++ && CIsTreeNodeAddressable(decl)) ++ { ++ /* If this decl was copied from a file-scope decl ++ on account of a block-scope extern decl, ++ propagate TREE_ADDRESSABLE to the file-scope decl. ++ ++ DECL_ABSTRACT_ORIGIN can be set to itself if warn_return_type is ++ true, since then the decl goes through save_for_inline_copying. */ ++ if ( CTreeDeclAbstractOrigin(decl) != 0 ++ && CTreeDeclAbstractOrigin(decl) != decl) ++ CSetTreeNodeAddressable( CTreeDeclAbstractOrigin(decl)); ++# ifdef LUDO_NO_SKIP ++ else if (DECL_SAVED_INSNS (decl) != 0) ++ { ++ c_push_function_context (); ++ c_output_inline_function (decl); ++ c_pop_function_context (); ++ } ++# endif ++ } ++ } ++ ++ /* If there were any declarations or structure tags in that level, ++ or if this level is a function body, ++ create a BLOCK to record them for the life of this function. */ ++ ++ block = 0; ++ block_previously_created = (c_current_binding_level->THIS_BLOCK != 0); ++ if (block_previously_created) ++ { ++ block = c_current_binding_level->THIS_BLOCK; ++ } ++ else if (keep || functionbody ++ || (c_current_binding_level->KEEP_IF_SUBBLOCKS && subblocks != 0)) ++ { ++ block = c_tree_add_node( C_BLOCK_NODE ); ++ } ++ if (block != 0) ++ { ++ CTreeBlockVars(block) = decls; ++ CTreeBlockTypeTags(block) = tags; ++ CTreeBlockSubBlocks(block) = subblocks; ++# ifdef LUDO_NO_SKIP ++ remember_end_note (block); ++# endif ++ } ++ ++ /* In each subblock, record that this is its superior. */ ++ ++ for (link = subblocks; link; link = CTreeChain(link)) ++ { ++ CTreeBlockSuperContext(link) = block; ++ } ++ ++ /* Clear out the meanings of the local variables of this level. */ ++ ++ for (link = decls; link; link = CTreeChain(link)) ++ { ++ if ( CTreeDeclName(link) != 0) ++ { ++ /* If the ident. was used or addressed via a local extern decl, ++ don't forget that fact. */ ++ if ( CIsTreeDeclExternal(link)) ++ { ++ if ( CIsTreeNodeUsed(link)) ++ { ++ CSetTreeNodeUsed( CTreeDeclName(link)); ++ } ++# ifdef LUDO_NO_SKIP ++ if (TREE_ADDRESSABLE (link)) ++ TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1; ++# endif ++ } ++ CTreeIdentLocalValue( CTreeDeclName(link)) = 0; ++ } ++ } ++ ++ /* Restore all name-meanings of the outer levels ++ that were shadowed by this level. */ ++ ++ for (link = c_current_binding_level->SHADOWED_LIST; link; link = CTreeChain(link)) ++ { ++ CTreeIdentLocalValue( CTreeListPurpose(link)) = CTreeListValue(link); ++ } ++ ++ /* If the level being exited is the top level of a function, ++ check over all the labels, and clear out the current ++ (function local) meanings of their names. */ ++ ++ if (functionbody) ++ { ++ c_clear_limbo_values (block); ++ ++ /* If this is the top level block of a function, ++ the vars are the function's parameters. ++ Don't leave them in the BLOCK because they are ++ found in the FUNCTION_DECL instead. */ ++ ++ CTreeBlockVars(block) = 0; ++ ++ /* Clear out the definitions of all label names, ++ since their scopes end here, ++ and add them to BLOCK_VARS. */ ++ ++ for (link = c_named_labels; link; link = CTreeChain(link)) ++ { ++ c_tree_node *label = CTreeListValue(link); ++ ++ if ( CTreeDeclInitial(label) == 0) ++ { ++ error_with_decl (label, "label `%s' used but not defined"); ++ /* Avoid crashing later. */ ++ c_define_label(c_input_filename, c_lineno, CTreeDeclName(label)); ++ } ++ else if (c_warn_unused && ! CIsTreeNodeUsed(label)) ++ { ++ warning_with_decl(label, "label `%s' defined but not used"); ++ } ++ CTreeIdentLabelValue( CTreeDeclName(label)) = 0; ++ ++ /* Put the labels into the "variables" of the ++ top-level block, so debugger can see them. */ ++ CTreeChain(label) = CTreeBlockVars(block); ++ CTreeBlockVars(block) = label; ++ } ++ } ++ ++ /* Pop the current level, and free the structure for reuse. */ ++ ++ { ++ c_binding_level *level = c_current_binding_level; ++ c_current_binding_level = c_current_binding_level->LEVEL_CHAIN; ++ ++# ifdef LUDO_DONE ++ level->level_chain = free_binding_level; ++ free_binding_level = level; ++# else ++ c_free_binding_level( level ); ++# endif ++ } ++ ++ /* Dispose of the block that we just made inside some higher level. */ ++ if (functionbody) ++ { ++ CTreeDeclInitial(c_current_function_decl) = block; ++ } ++ else if (block) ++ { ++ if (!block_previously_created) ++ { ++ c_current_binding_level->BLOCK_LIST ++ = c_tree_concat_list(c_current_binding_level->BLOCK_LIST, block); ++ } ++ } ++ /* If we did not make a block for the level just exited, ++ any blocks made for inner levels ++ (since they cannot be recorded as subblocks in that level) ++ must be carried forward so they will later become subblocks ++ of something else. */ ++ else if (subblocks) ++ { ++ c_current_binding_level->BLOCK_LIST ++ = c_tree_concat_list(c_current_binding_level->BLOCK_LIST, subblocks); ++ } ++ ++ /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this ++ binding contour so that they point to the appropriate construct, i.e. ++ either to the current FUNCTION_DECL node, or else to the BLOCK node ++ we just constructed. ++ ++ Note that for tagged types whose scope is just the formal parameter ++ list for some function type specification, we can't properly set ++ their TYPE_CONTEXTs here, because we don't have a pointer to the ++ appropriate FUNCTION_TYPE node readily available to us. For those ++ cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set ++ in `grokdeclarator' as soon as we have created the FUNCTION_TYPE ++ node which will represent the "scope" for these "parameter list local" ++ tagged types. ++ */ ++ ++ if (functionbody) ++ { ++ for (link = tags; link; link = CTreeChain (link)) ++ { ++ CTreeTypeContext( CTreeListValue(link)) = c_current_function_decl; ++ } ++ } ++ else if (block) ++ { ++ for (link = tags; link; link = CTreeChain (link)) ++ { ++ CTreeTypeContext( CTreeListValue(link)) = block; ++ } ++ } ++ ++ if (block) CSetTreeNodeUsed(block); ++ ++ return block; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Lookup Name | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_lookup_name( TreeName ) ++ ++ c_tree_node *TreeName; ++{ ++ c_tree_node *TreeVal; ++ ++ if ( ( c_current_binding_level != c_global_binding_level ) && ++ ( CTreeIdentLocalValue( TreeName ) != (c_tree_node *)0 ) ) ++ { ++ TreeVal = CTreeIdentLocalValue( TreeName ); ++ } ++ else ++ { ++ TreeVal = CTreeIdentGlobalValue( TreeName ); ++ } ++ ++ return TreeVal; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Lookup Name Current Level | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_lookup_name_current_level( TreeName ) ++ ++ c_tree_node *TreeName; ++{ ++ c_tree_node *ScanTree; ++ ++ if ( c_current_binding_level == c_global_binding_level ) ++ { ++ return( CTreeIdentGlobalValue( TreeName ) ); ++ } ++ ++ if ( CTreeIdentLocalValue( TreeName ) == (c_tree_node *)0 ) ++ { ++ return( (c_tree_node *)0 ); ++ } ++ ++ for ( ScanTree = c_current_binding_level->NAME_LIST; ++ ScanTree != (c_tree_node *)0; ++ ScanTree = CTreeChain( ScanTree ) ) ++ { ++ if ( CTreeDeclName( ScanTree ) == TreeName ) break; ++ } ++ ++ return ScanTree; ++} ++ ++ ++/* Return zero if the declaration NEWDECL is valid ++ when the declaration OLDDECL (assumed to be for the same name) ++ has already been seen. ++ Otherwise return an error message format string with a %s ++ where the identifier should go. */ ++ ++static char *c_redeclaration_error_message (newdecl, olddecl) ++ c_tree_node *newdecl; ++ c_tree_node *olddecl; ++{ ++ if ( CTreeDeclCode(newdecl) == C_TYPE_DECL) ++ { ++ if (c_flag_traditional && CTreeType(newdecl) == CTreeType(olddecl)) ++ return 0; ++ /* pushdecl creates distinct types for TYPE_DECLs by calling ++ build_type_copy, so the above comparison generally fails. We do ++ another test against the CTreeTypeMainVariantof the olddecl, which ++ is equivalent to what this code used to do before the build_type_copy ++ call. The variant type distinction should not matter for traditional ++ code, because it doesn't have type qualifiers. */ ++ if (c_flag_traditional ++ && CTreeTypeMainVariant(CTreeType(olddecl)) == CTreeType(newdecl)) ++ return 0; ++ if (CIsTreeDeclSystemHeader(olddecl) || CIsTreeDeclSystemHeader(newdecl)) ++ return 0; ++ return "redefinition of `%s'"; ++ } ++ else if ( CTreeDeclCode(newdecl) == C_FUNCTION_DECL) ++ { ++ /* Declarations of functions can insist on internal linkage ++ but they can't be inconsistent with internal linkage, ++ so there can be no error on that account. ++ However defining the same name twice is no good. */ ++ if (CTreeDeclInitial(olddecl) != 0 && CTreeDeclInitial(newdecl) != 0 ++ /* However, defining once as extern inline and a second ++ time in another way is ok. */ ++ && !( CIsTreeDeclInline (olddecl) && CIsTreeDeclExternal (olddecl) ++ && !( CIsTreeDeclInline (newdecl) && CIsTreeDeclExternal (newdecl))) ++ ) ++ return "redefinition of `%s'"; ++ return 0; ++ } ++ else if (c_current_binding_level == c_global_binding_level) ++ { ++ /* Objects declared at top level: */ ++ /* If at least one is a reference, it's ok. */ ++ if (CIsTreeDeclExternal(newdecl) || CIsTreeDeclExternal(olddecl)) ++ return 0; ++ /* Reject two definitions. */ ++ if (CTreeDeclInitial(olddecl) != 0 && CTreeDeclInitial(newdecl) != 0) ++ return "redefinition of `%s'"; ++ /* Now we have two tentative defs, or one tentative and one real def. */ ++ /* Insist that the linkage match. */ ++ if ( CIsTreeNodePublic(olddecl) != CIsTreeNodePublic(newdecl)) ++ return "conflicting declarations of `%s'"; ++ return 0; ++ } ++ else if (c_current_binding_level->PARAM_FLAG ++ && CIsTreeNodeAsmWritten(olddecl) && !CIsTreeNodeAsmWritten(newdecl)) ++ return 0; ++ else ++ { ++ /* Newdecl has block scope. If olddecl has block scope also, then ++ reject two definitions, and reject a definition together with an ++ external reference. Otherwise, it is OK, because newdecl must ++ be an extern reference to olddecl. */ ++ if (!(CIsTreeDeclExternal(newdecl) && CIsTreeDeclExternal(olddecl)) ++ && CTreeDeclContext(newdecl) == CTreeDeclContext(olddecl)) ++ return "redeclaration of `%s'"; ++ return 0; ++ } ++} ++ ++/* Return 1 if PARMS specifies a fixed number of parameters ++ and none of their types is affected by default promotions. */ ++ ++int c_is_self_promoting_args_p(parms) ++ c_tree_node *parms; ++{ ++ c_tree_node *t; ++ for (t = parms; t; t = CTreeChain(t)) ++ { ++ c_tree_node *type = CTreeListValue(t); ++ ++ if (CTreeChain(t) == 0 && type != c_void_type_node) ++ return 0; ++ ++ if (type == 0) ++ return 0; ++ ++ if (CTreeTypeMainVariant(type) == c_float_type_node) ++ return 0; ++ ++ if (C_PROMOTING_INTEGER_TYPE_P(type)) ++ return 0; ++ } ++ return 1; ++} ++ ++ ++/* Handle when a new declaration NEWDECL ++ has the same name as an old one OLDDECL ++ in the same binding contour. ++ Prints an error message if appropriate. ++ ++ If safely possible, alter OLDDECL to look like NEWDECL, and return 1. ++ Otherwise, return 0. ++ ++ When DIFFERENT_BINDING_LEVEL is true, NEWDECL is an external declaration, ++ and OLDDECL is in an outer binding level and should thus not be changed. */ ++ ++static int ++c_is_duplicate_decls(newdecl, olddecl, different_binding_level) ++ c_tree_node *newdecl; ++ c_tree_node *olddecl; ++ int different_binding_level; ++{ ++ int types_match = c_is_comptypes(CTreeType(newdecl), CTreeType(olddecl)); ++ int new_is_definition = ( CTreeDeclCode(newdecl) == C_FUNCTION_DECL ++ && CTreeDeclInitial(newdecl) != 0); ++ c_tree_node *oldtype = CTreeType(olddecl); ++ c_tree_node *newtype = CTreeType(newdecl); ++ char *errmsg = 0; ++ ++# ifdef LUDO_NO_SKIP ++ if ( CTreeNodeFirstCode(olddecl) == C_DECL_NODE ) ++ DECL_MACHINE_ATTRIBUTES (newdecl) = DECL_MACHINE_ATTRIBUTES (olddecl); ++# endif ++ ++ if ( CTreeNodeFirstCode(newtype) == C_ERROR_NODE ++ || CTreeNodeFirstCode(oldtype) == C_ERROR_NODE) ++ types_match = 0; ++ ++ /* New decl is completely inconsistent with the old one => ++ tell caller to replace the old one. ++ This is always an error except in the case of shadowing a builtin. */ ++ if ( CTreeDeclCode(olddecl) != CTreeDeclCode(newdecl)) ++ { ++ if ( CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && ( CIsTreeDeclBuiltIn(olddecl) ++ || CIsTreeNodeUnsigned(olddecl))) ++ { ++ /* If you declare a built-in or predefined function name as static, ++ the old definition is overridden, ++ but optionally warn this was a bad choice of name. */ ++ if (! CIsTreeNodePublic(newdecl)) ++ { ++ if (!c_warn_shadow) ++ ; ++ else if ( CIsTreeDeclBuiltIn(olddecl)) ++ { ++ warning_with_decl (newdecl, "shadowing built-in function `%s'"); ++ } ++ else ++ { ++ warning_with_decl (newdecl, "shadowing library function `%s'"); ++ } ++ } ++ /* Likewise, if the built-in is not ansi, then programs can ++ override it even globally without an error. */ ++ else if (! CIsTreeDeclBuiltIn(olddecl)) ++ { ++ warning_with_decl (newdecl, ++ "library function `%s' declared as non-function"); ++ } ++ else if ( CIsTreeNodeUnsigned(olddecl)) ++ { ++ warning_with_decl (newdecl, ++ "built-in function `%s' declared as non-function"); ++ } ++ else ++ { ++ warning_with_decl (newdecl, ++ "built-in function `%s' declared as non-function"); ++ } ++ } ++ else ++ { ++ error_with_decl (newdecl, "`%s' redeclared as different kind of symbol"); ++ error_with_decl (olddecl, "previous declaration of `%s'"); ++ } ++ ++ return 0; ++ } ++ ++ /* For real parm decl following a forward decl, ++ return 1 so old decl will be reused. */ ++ if (types_match && CTreeDeclCode(newdecl) == C_PARAM_DECL ++ && CIsTreeNodeAsmWritten(olddecl) && ! CIsTreeNodeAsmWritten(newdecl)) ++ return 1; ++ ++ /* The new declaration is the same kind of object as the old one. ++ The declarations may partially match. Print warnings if they don't ++ match enough. Ultimately, copy most of the information from the new ++ decl to the old one, and keep using the old one. */ ++ ++ if (c_flag_traditional && CTreeDeclCode(newdecl) == C_FUNCTION_DECL ++ && CTreeIdentImplicitDecl(CTreeDeclName(newdecl)) == olddecl ++ && CTreeDeclInitial(olddecl) == 0) ++ /* If -traditional, avoid error for redeclaring fcn ++ after implicit decl. */ ++ ; ++ else if ( CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && CIsTreeDeclBuiltIn(olddecl)) ++ { ++ /* A function declaration for a built-in function. */ ++ if (! CIsTreeNodePublic(newdecl)) ++ { ++ /* If you declare a built-in function name as static, the ++ built-in definition is overridden, ++ but optionally warn this was a bad choice of name. */ ++ if (c_warn_shadow) ++ { ++ warning_with_decl (newdecl, "shadowing built-in function `%s'"); ++ } ++ /* Discard the old built-in function. */ ++ return 0; ++ } ++ else if (!types_match) ++ { ++ /* Accept the return type of the new declaration if same modes. */ ++ c_tree_node *oldreturntype = CTreeType(oldtype); ++ c_tree_node *newreturntype = CTreeType(newtype); ++ ++ /* Make sure we put the new type in the same obstack as the old ones. ++ If the old types are not both in the same obstack, use the ++ permanent one. */ ++# ifdef LUDO_NO_SKIP ++ if (TYPE_OBSTACK (oldtype) == TYPE_OBSTACK (newtype)) ++ push_obstacks (TYPE_OBSTACK (oldtype), TYPE_OBSTACK (oldtype)); ++ else ++ { ++ push_obstacks_nochange (); ++ end_temporary_allocation (); ++ } ++# endif ++ ++ if (CTreeTypeMode(oldreturntype) == CTreeTypeMode(newreturntype)) ++ { ++ /* Function types may be shared, so we can't just modify ++ the return type of olddecl's function type. */ ++ c_tree_node *trytype ++ = c_tree_build_function_type(newreturntype, CTreeTypeValues(oldtype)); ++ ++ types_match = c_is_comptypes(newtype, trytype); ++ if (types_match) ++ oldtype = trytype; ++ } ++ /* Accept harmless mismatch in first argument type also. ++ This is for ffs. */ ++ if ( CTreeTypeValues(CTreeType(newdecl)) != 0 ++ && CTreeTypeValues(oldtype) != 0 ++ && CTreeListValue( CTreeTypeValues(newtype)) != 0 ++ && CTreeListValue( CTreeTypeValues(oldtype)) != 0 ++ && (CTreeTypeMode( CTreeListValue( CTreeTypeValues(newtype))) ++ == CTreeTypeMode( CTreeListValue( CTreeTypeValues(oldtype))))) ++ { ++ /* Function types may be shared, so we can't just modify ++ the return type of olddecl's function type. */ ++ c_tree_node *trytype ++ = c_tree_build_function_type(CTreeType(oldtype), ++ c_tree_add_head_list( NULL, ++ CTreeListValue( CTreeTypeValues(newtype)), ++ CTreeChain( CTreeTypeValues(oldtype)))); ++ ++ types_match = c_is_comptypes(newtype, trytype); ++ if (types_match) ++ oldtype = trytype; ++ } ++ if (! different_binding_level) ++ CTreeType(olddecl) = oldtype; ++ ++# ifdef LUDO_NO_SKIP ++ pop_obstacks (); ++# endif ++ } ++ if (!types_match) ++ { ++ /* If types don't match for a built-in, throw away the built-in. */ ++ warning_with_decl (newdecl, "conflicting types for built-in function `%s'"); ++ return 0; ++ } ++ } ++ else if ( CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && CTreeDeclLineNum(olddecl) == 0) ++ { ++ /* A function declaration for a predeclared function ++ that isn't actually built in. */ ++ if (! CIsTreeNodePublic(newdecl)) ++ { ++ /* If you declare it as static, the ++ default definition is overridden. */ ++ return 0; ++ } ++ else if (!types_match) ++ { ++ /* If the types don't match, preserve volatility indication. ++ Later on, we will discard everything else about the ++ default declaration. */ ++ if ( CIsTreeNodeVolatile(olddecl) ) ++ { ++ CSetTreeNodeVolatile(newdecl); ++ } ++ } ++ } ++ /* Permit char *foo () to match void *foo (...) if not pedantic, ++ if one of them came from a system header file. */ ++ else if (!types_match ++ && CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && CTreeDeclCode(newdecl) == C_FUNCTION_DECL ++ && CTreeTypeCode(CTreeType(oldtype)) == C_POINTER_TYPE ++ && CTreeTypeCode(CTreeType(newtype)) == C_POINTER_TYPE ++ && (CIsTreeDeclSystemHeader(olddecl) ++ || CIsTreeDeclSystemHeader(newdecl)) ++ && ((CTreeTypeMainVariant(CTreeType(CTreeType(newtype))) == c_void_type_node ++ && CTreeTypeValues(oldtype) == 0 ++ && c_is_self_promoting_args_p( CTreeTypeValues(newtype)) ++ && CTreeType(CTreeType(oldtype)) == c_char_type_node) ++ || ++ (CTreeType(CTreeType(newtype)) == c_char_type_node ++ && CTreeTypeValues(newtype) == 0 ++ && c_is_self_promoting_args_p( CTreeTypeValues(oldtype)) ++ && CTreeTypeMainVariant(CTreeType(CTreeType(oldtype))) == c_void_type_node))) ++ { ++ if (c_pedantic) ++ { ++ pedwarn_with_decl (newdecl, "conflicting types for `%s'"); ++ } ++ /* Make sure we keep void * as ret type, not char *. */ ++ if (CTreeTypeMainVariant(CTreeType(CTreeType(oldtype))) == c_void_type_node) ++ CTreeType(newdecl) = newtype = oldtype; ++ ++ /* Set DECL_IN_SYSTEM_HEADER, so that if we see another declaration ++ we will come back here again. */ ++ CSetTreeDeclSystemHeader(newdecl); ++ } ++ else if (!types_match ++ /* Permit char *foo (int, ...); followed by char *foo (); ++ if not pedantic. */ ++ && ! ( CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && ! c_pedantic ++ /* Return types must still match. */ ++ && c_is_comptypes (CTreeType(oldtype), CTreeType(newtype)) ++ && CTreeTypeValues(newtype) == 0)) ++ { ++ error_with_decl (newdecl, "conflicting types for `%s'"); ++ /* Check for function type mismatch ++ involving an empty arglist vs a nonempty one. */ ++ if ( CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && c_is_comptypes(CTreeType(oldtype), CTreeType(newtype)) ++ && ((CTreeTypeValues(oldtype) == 0 ++ && CTreeDeclInitial(olddecl) == 0) ++ || ++ ( CTreeTypeValues(newtype) == 0 ++ && CTreeDeclInitial(newdecl) == 0))) ++ { ++ /* Classify the problem further. */ ++ c_tree_node *t = CTreeTypeValues(oldtype); ++ if (t == 0) ++ t = CTreeTypeValues(newtype); ++ for (; t; t = CTreeChain(t)) ++ { ++ c_tree_node *type = CTreeListValue(t); ++ ++ if (CTreeChain(t) == 0 ++ && CTreeTypeMainVariant(type) != c_void_type_node) ++ { ++ error ("A parameter list with an ellipsis can't match"); ++ error ("an empty parameter name list declaration."); ++ break; ++ } ++ ++ if (CTreeTypeMainVariant(type) == c_float_type_node ++ || C_PROMOTING_INTEGER_TYPE_P(type)) ++ { ++ error ("An argument type that has a default promotion"); ++ error ("can't match an empty parameter name list declaration."); ++ break; ++ } ++ } ++ } ++ error_with_decl (olddecl, "previous declaration of `%s'"); ++ } ++ else ++ { ++ errmsg = c_redeclaration_error_message (newdecl, olddecl); ++ if (errmsg) ++ { ++ error_with_decl (newdecl, errmsg); ++ error_with_decl (olddecl, ++ ((CTreeDeclInitial(olddecl) ++ && c_current_binding_level == c_global_binding_level) ++ ? "`%s' previously defined here" ++ : "`%s' previously declared here")); ++ } ++ else if ( CTreeDeclCode(newdecl) == C_TYPE_DECL ++ && (CIsTreeDeclSystemHeader(olddecl) ++ || CIsTreeDeclSystemHeader(newdecl))) ++ { ++ warning_with_decl (newdecl, "redefinition of `%s'"); ++ warning_with_decl ++ (olddecl, ++ ((CTreeDeclInitial(olddecl) ++ && c_current_binding_level == c_global_binding_level) ++ ? "`%s' previously defined here" ++ : "`%s' previously declared here")); ++ } ++ else if ( CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && CTreeDeclInitial(olddecl) != 0 ++ && CTreeTypeValues(oldtype) == 0 ++ && CTreeTypeValues(newtype) != 0 ++ && CTreeTypeNonCopiedParts(oldtype) != 0) ++ { ++ c_tree_node *type; ++ c_tree_node *parm; ++ int nargs; ++ /* Prototype decl follows defn w/o prototype. */ ++ ++ for (parm = CTreeTypeNonCopiedParts(oldtype), ++ type = CTreeTypeValues(newtype), ++ nargs = 1; ++ (CTreeTypeMainVariant( CTreeListValue(parm)) != c_void_type_node ++ || CTreeTypeMainVariant( CTreeListValue(type)) != c_void_type_node); ++ parm = CTreeChain(parm), type = CTreeChain(type), nargs++) ++ { ++ if (CTreeTypeMainVariant( CTreeListValue(parm)) == c_void_type_node ++ || CTreeTypeMainVariant( CTreeListValue(type)) == c_void_type_node) ++ { ++ errmsg = "prototype for `%s' follows and number of arguments"; ++ break; ++ } ++ /* Type for passing arg must be consistent ++ with that declared for the arg. */ ++ if (! c_is_comptypes( CTreeListValue(parm), CTreeListValue(type)) ++ /* If -traditional, allow `unsigned int' instead of `int' ++ in the prototype. */ ++ && ++ (! (c_flag_traditional ++ && CTreeTypeMainVariant( CTreeListValue(parm)) == c_integer_type_node ++ && CTreeTypeMainVariant( CTreeListValue(type)) == c_unsigned_type_node))) ++ { ++ errmsg = "prototype for `%s' follows and argument %d"; ++ break; ++ } ++ } ++ if (errmsg) ++ { ++ error_with_decl (newdecl, errmsg, nargs); ++ error_with_decl (olddecl, ++ "doesn't match non-prototype definition here"); ++ } ++ else ++ { ++ warning_with_decl (newdecl, "prototype for `%s' follows"); ++ warning_with_decl (olddecl, "non-prototype definition here"); ++ } ++ } ++ /* Warn about mismatches in various flags. */ ++ else ++ { ++ /* Warn if function is now inline ++ but was previously declared not inline and has been called. */ ++ if ( CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && ! CIsTreeDeclInline (olddecl) ++ && CIsTreeDeclInline (newdecl) ++ && CIsTreeNodeUsed(olddecl)) ++ { ++ warning_with_decl (newdecl, ++ "`%s' declared inline after being called"); ++ } ++ if ( CTreeDeclCode(olddecl) == C_FUNCTION_DECL ++ && ! CIsTreeDeclInline (olddecl) && CIsTreeDeclInline (newdecl) ++ && CTreeDeclInitial(olddecl) != 0) ++ { ++ warning_with_decl (newdecl, ++ "`%s' declared inline after its definition"); ++ } ++ ++ /* If pedantic, warn when static declaration follows a non-static ++ declaration. Otherwise, do so only for functions. */ ++ if ((c_pedantic || CTreeDeclCode(olddecl) == C_FUNCTION_DECL) ++ && CIsTreeNodePublic(olddecl) ++ && !CIsTreeNodePublic(newdecl)) ++ { ++ warning_with_decl (newdecl, "static declaration for `%s' follows non-static"); ++ } ++ ++ /* Warn when const declaration follows a non-const ++ declaration, but not for functions. */ ++ if ( CTreeDeclCode(olddecl) != C_FUNCTION_DECL ++ && ! CIsTreeNodeReadOnly(olddecl) ++ && CIsTreeNodeReadOnly(newdecl)) ++ { ++ warning_with_decl (newdecl, "const declaration for `%s' follows non-const"); ++ } ++ /* These bits are logically part of the type, for variables. ++ But not for functions ++ (where qualifiers are not valid ANSI anyway). */ ++ else if (c_pedantic && CTreeDeclCode(olddecl) != C_FUNCTION_DECL ++ && ( CIsTreeNodeReadOnly(newdecl) != CIsTreeNodeReadOnly(olddecl) ++ || CIsTreeNodeVolatile(newdecl) != CIsTreeNodeVolatile(olddecl))) ++ { ++ pedwarn_with_decl (newdecl, "type qualifiers for `%s' conflict with previous decl"); ++ } ++ } ++ } ++ ++ /* Optionally warn about more than one declaration for the same name. */ ++ if (errmsg == 0 && c_warn_redundant_decls && CTreeDeclLineNum(olddecl) != 0 ++ /* Don't warn about a function declaration ++ followed by a definition. */ ++ && !( CTreeDeclCode(newdecl) == C_FUNCTION_DECL && CTreeDeclInitial(newdecl) != 0 ++ && CTreeDeclInitial(olddecl) == 0) ++ /* Don't warn about extern decl followed by (tentative) definition. */ ++ && !(CIsTreeDeclExternal(olddecl) && ! CIsTreeDeclExternal(newdecl))) ++ { ++ warning_with_decl (newdecl, "redundant redeclaration of `%s' in same scope"); ++ warning_with_decl (olddecl, "previous declaration of `%s'"); ++ } ++ ++ /* Copy all the DECL_... slots specified in the new decl ++ except for any that we copy here from the old type. ++ ++ Past this point, we don't change OLDTYPE and NEWTYPE ++ even if we change the types of NEWDECL and OLDDECL. */ ++ ++ if (types_match) ++ { ++ /* When copying info to olddecl, we store into write_olddecl ++ instead. This allows us to avoid modifying olddecl when ++ different_binding_level is true. */ ++ c_tree_node *write_olddecl = different_binding_level ? newdecl : olddecl; ++ ++ /* Make sure we put the new type in the same obstack as the old ones. ++ If the old types are not both in the same obstack, use the permanent ++ one. */ ++# ifdef LUDO_NO_SKIP ++ if (TYPE_OBSTACK (oldtype) == TYPE_OBSTACK (newtype)) ++ push_obstacks (TYPE_OBSTACK (oldtype), TYPE_OBSTACK (oldtype)); ++ else ++ { ++ push_obstacks_nochange (); ++ end_temporary_allocation (); ++ } ++ ++ /* Merge the data types specified in the two decls. */ ++ if ( CTreeDeclCode(newdecl) != C_FUNCTION_DECL || ! ++ CIsTreeDeclBuiltIn(olddecl)) ++ { ++ if (different_binding_level) ++ CTreeType(newdecl) ++ = c_tree_build_type_attribute_variant ++ (newtype, ++ merge_attributes (TYPE_ATTRIBUTES (newtype), ++ TYPE_ATTRIBUTES (oldtype))); ++ else ++ CTreeType(newdecl) ++ = CTreeType(olddecl) ++ = common_type (newtype, oldtype); ++ } ++# endif ++ ++ /* Lay the type out, unless already done. */ ++ if (oldtype != CTreeType(newdecl)) ++ { ++ if (CTreeType(newdecl) != c_error_mark_node) ++ c_layout_type(CTreeType(newdecl)); ++ if ( CTreeDeclCode(newdecl) != C_FUNCTION_DECL ++ && CTreeDeclCode(newdecl) != C_TYPE_DECL ++ && CTreeDeclCode(newdecl) != C_CONST_DECL) ++ c_layout_decl(newdecl, 0); ++ } ++ else ++ { ++ /* Since the type is OLDDECL's, make OLDDECL's size go with. */ ++ CTreeDeclSize(newdecl) = CTreeDeclSize(olddecl); ++# ifdef LUDO_NO_SKIP ++ if ( CTreeDeclCode(olddecl) != C_FUNCTION_DECL) ++ if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl)) ++ DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl); ++# endif ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* Keep the old rtl since we can safely use it. */ ++ DECL_RTL (newdecl) = DECL_RTL (olddecl); ++ ++ /* Merge the type qualifiers. */ ++ if (DECL_BUILT_IN_NONANSI (olddecl) && TREE_THIS_VOLATILE (olddecl) ++ && !TREE_THIS_VOLATILE (newdecl)) ++ TREE_THIS_VOLATILE (write_olddecl) = 0; ++# endif ++ if ( CIsTreeNodeReadOnly(newdecl)) ++ CSetTreeNodeReadOnly(write_olddecl); ++# ifdef LUDO_NO_SKIP ++ if (TREE_THIS_VOLATILE (newdecl)) ++ { ++ TREE_THIS_VOLATILE (write_olddecl) = 1; ++ if (TREE_CODE (newdecl) == VAR_DECL) ++ make_var_volatile (newdecl); ++ } ++# endif ++ ++ /* Keep source location of definition rather than declaration. */ ++ /* When called with different_binding_level set, keep the old ++ information so that meaningful diagnostics can be given. */ ++ if (CTreeDeclInitial(newdecl) == 0 && CTreeDeclInitial(olddecl) != 0 ++ && ! different_binding_level) ++ { ++ CTreeDeclLineNum(newdecl) = CTreeDeclLineNum(olddecl); ++ CTreeDeclFileName(newdecl) = CTreeDeclFileName(olddecl); ++ } ++ ++ /* Merge the unused-warning information. */ ++ if (CIsTreeDeclSystemHeader(olddecl)) ++ CSetTreeDeclSystemHeader(newdecl); ++ else if (CIsTreeDeclSystemHeader(newdecl)) ++ CSetTreeDeclSystemHeader(write_olddecl); ++ ++ /* Merge the initialization information. */ ++ /* When called with different_binding_level set, don't copy over ++ DECL_INITIAL, so that we don't accidentally change function ++ declarations into function definitions. */ ++ if (CTreeDeclInitial(newdecl) == 0 && ! different_binding_level) ++ CTreeDeclInitial(newdecl) = CTreeDeclInitial(olddecl); ++ ++ /* Merge the section attribute. ++ We want to issue an error if the sections conflict but that must be ++ done later in decl_attributes since we are called before attributes ++ are assigned. */ ++# ifdef LUDO_NO_SKIP ++ if (DECL_SECTION_NAME (newdecl) == NULL_TREE) ++ DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl); ++ ++ if (CTreeDeclCode(newdecl) == C_FUNCTION_DECL) ++ { ++ DECL_STATIC_CONSTRUCTOR(newdecl) |= DECL_STATIC_CONSTRUCTOR(olddecl); ++ DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl); ++ } ++ ++ pop_obstacks (); ++# endif ++ } ++ /* If cannot merge, then use the new type and qualifiers, ++ and don't preserve the old rtl. */ ++ else if (! different_binding_level) ++ { ++ CTreeType(olddecl) = CTreeType(newdecl); ++ if ( CIsTreeNodeReadOnly(newdecl) ) ++ { ++ CSetTreeNodeReadOnly(olddecl); ++ } ++ ++ if ( CIsTreeNodeVolatile(newdecl) ) ++ { ++ CSetTreeNodeVolatile(olddecl); ++ } ++ ++ if ( CIsTreeNodeSideEffect(newdecl) ) ++ { ++ CSetTreeNodeSideEffect(olddecl); ++ } ++ } ++ ++ /* Merge the storage class information. */ ++ if ( CIsTreeDeclWeak( olddecl ) ) CSetTreeDeclWeak( newdecl ); ++ ++ /* For functions, static overrides non-static. */ ++ if ( CTreeDeclCode(newdecl) == C_FUNCTION_DECL) ++ { ++ if ( ! CIsTreeNodePublic(newdecl) || ++ ! CIsTreeNodePublic(olddecl) ) ++ { ++ CClearTreeNodePublic(newdecl); ++ } ++ ++ /* This is since we don't automatically ++ copy the attributes of NEWDECL into OLDDECL. */ ++ /* No need to worry about different_binding_level here because ++ then TREE_PUBLIC (newdecl) was true. */ ++ if ( CIsTreeNodePublic(newdecl) ) CSetTreeNodePublic(olddecl); ++ else CClearTreeNodePublic(olddecl); ++ ++ /* If this clears `static', clear it in the identifier too. */ ++ if (! CIsTreeNodePublic(olddecl)) ++ { ++ CClearTreeNodePublic(CTreeDeclName(olddecl)); ++ } ++ } ++ if ( CIsTreeNodeExternal(newdecl)) ++ { ++ if ( CIsTreeNodeStatic(olddecl) ) CSetTreeNodeStatic(newdecl); ++ else CClearTreeNodeStatic(newdecl); ++ ++ if ( CIsTreeNodeExternal(olddecl) ) CSetTreeNodeExternal(newdecl); ++ else CClearTreeNodeExternal(newdecl); ++ ++ /* An extern decl does not override previous storage class. */ ++ if ( CIsTreeNodePublic(olddecl) ) CSetTreeNodePublic(newdecl); ++ else CClearTreeNodePublic(newdecl); ++ ++ if (! CIsTreeDeclExternal(newdecl)) ++ { ++ CTreeDeclContext(newdecl) = CTreeDeclContext(olddecl); ++ } ++ } ++ else ++ { ++ if ( CIsTreeNodeStatic(newdecl) ) CSetTreeNodeStatic(olddecl); ++ else CClearTreeNodeStatic(olddecl); ++ ++ if ( CIsTreeNodePublic(newdecl) ) CSetTreeNodePublic(olddecl); ++ else CClearTreeNodePublic(olddecl); ++ ++ } ++ ++ /* If either decl says `inline', this fn is inline, ++ unless its definition was passed already. */ ++ if ( CIsTreeDeclInline(newdecl) && CTreeDeclInitial(olddecl) == 0) ++ CSetTreeDeclInline(olddecl); ++ ++ if ( CIsTreeDeclInline(olddecl) ) CSetTreeDeclInline( newdecl ); ++ else CClearTreeDeclInline( newdecl ); ++ ++ if ( CTreeDeclCode(newdecl) == C_FUNCTION_DECL) ++ { ++ if ( CIsTreeDeclBuiltIn(olddecl)) ++ { ++ /* Get rid of any built-in function if new arg types don't match it ++ or if we have a function definition. */ ++ if (! types_match || new_is_definition) ++ { ++ if (! different_binding_level) ++ { ++ CTreeType(olddecl) = CTreeType(newdecl); ++ CClearTreeDeclBuiltIn(olddecl); ++ } ++ } ++ else ++ { ++ /* If redeclaring a builtin function, and not a definition, ++ it stays built in. */ ++ CSetTreeDeclBuiltIn(newdecl); ++# ifdef LUDO_NO_SKIP ++ DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl); ++# endif ++ } ++ } ++ /* Also preserve various other info from the definition. */ ++ else if (! new_is_definition) ++ { ++# ifdef LUDO_NO_SKIP ++ DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl); ++# endif ++ } ++ if (! new_is_definition) ++ { ++ CTreeDeclResult(newdecl) = CTreeDeclResult(olddecl); ++ /* When called with different_binding_level set, don't copy over ++ DECL_INITIAL, so that we don't accidentally change function ++ declarations into function definitions. */ ++ if (! different_binding_level) ++ CTreeDeclInitial(newdecl) = CTreeDeclInitial(olddecl); ++# ifdef LUDO_NO_SKIP ++ DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl); ++# endif ++ CTreeDeclArguments(newdecl) = CTreeDeclArguments(olddecl); ++ ++ if ( CIsTreeDeclInline(newdecl)) ++ CTreeDeclAbstractOrigin(newdecl) = olddecl; ++ } ++ } ++ if (different_binding_level) ++ { ++ /* Don't output a duplicate symbol or debugging information for this ++ declaration. */ ++ CSetTreeNodeAsmWritten(newdecl); ++ CSetTreeDeclIgnored(newdecl); ++ return 0; ++ } ++ ++ /* Copy most of the decl-specific fields of NEWDECL into OLDDECL. ++ But preserve OLDDECL's DECL_UID. */ ++ { ++ unsigned olddecl_uid = CTreeDeclId(olddecl); ++ ++ bcopy ((char *) newdecl + sizeof (c_tree_common), ++ (char *) olddecl + sizeof (c_tree_common), ++ sizeof (c_tree_decl) - sizeof (c_tree_common)); ++ ++ CTreeDeclId(olddecl) = olddecl_uid; ++ } ++ ++ return 1; ++} ++ ++ ++/*------------------------------------------------------------\ ++| | ++| Push Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++ ++/* Return nonzero if ELEM is part of the chain CHAIN. */ ++ ++int ++c_is_chain_member(elem, chain) ++ c_tree_node *elem; ++ c_tree_node *chain; ++{ ++ while (chain) ++ { ++ if (elem == chain) ++ return 1; ++ chain = CTreeChain(chain); ++ } ++ ++ return 0; ++} ++ ++c_tree_node *c_push_decl( TreeDecl ) ++ ++ c_tree_node *TreeDecl; ++{ ++ c_binding_level *Binding; ++ c_tree_node *TreeName; ++ c_tree_node *TreeNode; ++ ++ TreeName = TreeDecl->DECL.NAME; ++ Binding = c_current_binding_level; ++ ++ CTreeDeclContext( TreeDecl ) = c_current_function_decl; ++ /* A local extern declaration for a function doesn't constitute nesting. ++ A local auto declaration does, since it's a forward decl ++ for a nested function coming later. */ ++ if ( ( CTreeDeclCode( TreeDecl ) == C_FUNCTION_DECL ) && ++ ( CTreeDeclInitial( TreeDecl ) == 0 ) && ++ ( CIsTreeDeclExternal( TreeDecl ) ) ) ++ { ++ CTreeDeclContext( TreeDecl ) = (c_tree_node *)0; ++ } ++ ++ if ( c_warn_nested_externs && CIsTreeDeclExternal( TreeDecl ) && ++ Binding != c_global_binding_level ++ && TreeDecl != CTreeIdentImplicitDecl( TreeName ) ++ /* Don't print error messages for __FUNCTION__ and __PRETTY_FUNCTION__ */ ++ && !CIsTreeDeclSystemHeader( TreeDecl )) ++ { ++ warning ("nested extern declaration of `%s'", CTreeIdentPointer( TreeName )); ++ } ++ ++ if ( TreeName != (c_tree_node *)0 ) ++ { ++ char *file; ++ int line; ++ int different_binding_level = 0; ++ ++ TreeNode = c_lookup_name_current_level( TreeName ); ++ ++ /* Don't type check externs here when -traditional. This is so that ++ code with conflicting declarations inside blocks will get warnings ++ not errors. X11 for instance depends on this. */ ++ if (! TreeNode && CIsTreeDeclExternal( TreeDecl ) && ++ CIsTreeNodePublic( TreeDecl ) && ! c_flag_traditional) ++ { ++ TreeNode = CTreeIdentGlobalValue( TreeName ); ++ /* Type decls at global scope don't conflict with externs declared ++ inside lexical blocks. */ ++ if ( TreeNode && CTreeDeclCode( TreeNode ) == C_TYPE_DECL) ++ TreeNode = 0; ++ different_binding_level = 1; ++ } ++ if ( TreeNode != 0 && TreeNode == c_error_mark_node) ++ /* error_mark_node is 0 for a while during initialization! */ ++ { ++ TreeNode = 0; ++ error_with_decl ( TreeDecl, "`%s' used prior to declaration"); ++ } ++ ++ if (TreeNode != (c_tree_node *)0) ++ { ++ file = CTreeDeclFileName( TreeNode ); ++ line = CTreeDeclLineNum( TreeNode ); ++ } ++ ++ /* If this decl is `static' and an implicit decl was seen previously, ++ warn. But don't complain if -traditional, ++ since traditional compilers don't complain. */ ++ if (! c_flag_traditional && CIsTreeNodePublic( TreeName ) ++ /* Don't test for DECL_EXTERNAL, because grokdeclarator ++ sets this for all functions. */ ++ && ! CIsTreeNodePublic( TreeDecl ) ++ && ( CTreeDeclCode( TreeDecl ) == C_FUNCTION_DECL || Binding == c_global_binding_level) ++ /* We used to warn also for explicit extern followed by static, ++ but sometimes you need to do it that way. */ ++ && CTreeIdentImplicitDecl( TreeName ) != 0) ++ { ++ pedwarn ("`%s' was declared implicitly `extern' and later `static'", ++ CTreeIdentPointer( TreeName )); ++ pedwarn_with_file_and_line( ++ CTreeDeclFileName( CTreeIdentImplicitDecl( TreeName )), ++ CTreeDeclLineNum( CTreeIdentImplicitDecl( TreeName )), ++ "previous declaration of `%s'", ++ CTreeIdentPointer( TreeName )); ++ } ++ ++ if ( TreeNode != 0 && c_is_duplicate_decls( TreeDecl, TreeNode, different_binding_level)) ++ { ++ if ( CTreeDeclCode( TreeNode ) == C_PARAM_DECL) ++ { ++ /* Don't allow more than one "real" duplicate ++ of a forward parm decl. */ ++ if ( CIsTreeNodeAsmWritten( TreeDecl ) ) CSetTreeNodeAsmWritten( TreeNode ); ++ ++ return TreeNode; ++ } ++ return TreeNode; ++ } ++ ++ /* If we are processing a typedef statement, generate a whole new ++ ..._TYPE node (which will be just an variant of the existing ++ ..._TYPE node with identical properties) and then install the ++ TYPE_DECL node generated to represent the typedef name as the ++ TYPE_NAME of this brand new (duplicate) ..._TYPE node. ++ ++ The whole point here is to end up with a situation where each ++ and every ..._TYPE node the compiler creates will be uniquely ++ associated with AT MOST one node representing a typedef name. ++ This way, even though the compiler substitutes corresponding ++ ..._TYPE nodes for TYPE_DECL (i.e. "typedef name") nodes very ++ early on, later parts of the compiler can always do the reverse ++ translation and get back the corresponding typedef name. For ++ example, given: ++ ++ typedef struct S MY_TYPE; ++ MY_TYPE object; ++ ++ Later parts of the compiler might only know that `object' was of ++ type `struct S' if if were not for code just below. With this ++ code however, later parts of the compiler see something like: ++ ++ struct S' == struct S ++ typedef struct S' MY_TYPE; ++ struct S' object; ++ ++ And they can then deduce (from the node for type struct S') that ++ the original object declaration was: ++ ++ MY_TYPE object; ++ ++ Being able to do this is important for proper support of protoize, ++ and also for generating precise symbolic debugging information ++ which takes full account of the programmer's (typedef) vocabulary. ++ ++ Obviously, we don't want to generate a duplicate ..._TYPE node if ++ the TYPE_DECL node that we are now processing really represents a ++ standard built-in type. ++ ++ Since all standard types are effectively declared at line zero ++ in the source file, we can easily check to see if we are working ++ on a standard type by checking the current value of lineno. */ ++ ++ if ( CTreeDeclCode( TreeDecl ) == C_TYPE_DECL) ++ { ++ if ( CTreeDeclLineNum( TreeDecl ) == 0) ++ { ++ if ( CTreeTypeName( CTreeType( TreeDecl ) ) == (c_tree_node *)0) ++ { ++ CTreeTypeName( CTreeType( TreeDecl ) ) = TreeDecl; ++ } ++ } ++ else if ( CTreeType( TreeDecl ) != c_error_mark_node ++ && CTreeDeclResult( TreeDecl ) == NULL) ++ { ++ c_tree_node *tt = CTreeType( TreeDecl ); ++ CTreeDeclResult( TreeDecl ) = tt; ++ tt = c_tree_build_type_copy(tt); ++ CTreeTypeName(tt) = TreeDecl ; ++ CTreeType( TreeDecl ) = tt; ++ } ++ } ++ ++ /* Multiple external decls of the same identifier ought to match. ++ Check against both global declarations (when traditional) and out of ++ scope (limbo) block level declarations. ++ ++ We get warnings about inline functions where they are defined. ++ Avoid duplicate warnings where they are used. */ ++ if ( CIsTreeNodePublic( TreeDecl ) ++ && ! CIsTreeDeclInline( TreeDecl ) ++ ) ++ { ++ c_tree_node *decl; ++ ++ if (c_flag_traditional && CTreeIdentGlobalValue( TreeName ) != 0 ++ && ( CIsTreeDeclExternal( CTreeIdentGlobalValue( TreeName )) ++ || CIsTreeNodePublic( CTreeIdentGlobalValue( TreeName )))) ++ decl = CTreeIdentGlobalValue( TreeName ); ++ else if ( CTreeIdentLimboValue( TreeName ) != 0) ++ /* Decls in limbo are always extern, so no need to check that. */ ++ decl = CTreeIdentLimboValue( TreeName ); ++ else ++ decl = 0; ++ ++ if (decl && ! c_is_comptypes( CTreeType( TreeDecl ), CTreeType(decl)) ++ /* If old decl is built-in, we already warned if we should. */ ++ && ! CIsTreeDeclBuiltIn(decl)) ++ { ++ pedwarn_with_decl ( TreeDecl, ++ "type mismatch with previous external decl"); ++ pedwarn_with_decl (decl, "previous external decl of `%s'"); ++ } ++ } ++ ++ /* If a function has had an implicit declaration, and then is defined, ++ make sure they are compatible. */ ++ ++ if ( CTreeIdentImplicitDecl( TreeName ) != 0 ++ && CTreeIdentGlobalValue( TreeName ) == 0 ++ && CTreeDeclCode( TreeDecl ) == C_FUNCTION_DECL ++ && ! c_is_comptypes( CTreeType( TreeDecl ), ++ CTreeType( CTreeIdentImplicitDecl( TreeName )))) ++ { ++ warning_with_decl( TreeDecl, "type mismatch with previous implicit declaration"); ++ warning_with_decl( CTreeIdentImplicitDecl( TreeName ), ++ "previous implicit declaration of `%s'"); ++ } ++ ++ /* In PCC-compatibility mode, extern decls of vars with no current decl ++ take effect at top level no matter where they are. */ ++ if (c_flag_traditional && CIsTreeDeclExternal( TreeDecl ) ++ && c_lookup_name( TreeName ) == 0) ++ { ++ c_tree_node *type = CTreeType( TreeDecl ); ++ ++ /* But don't do this if the type contains temporary nodes. */ ++ while (type) ++ { ++ if (type == c_error_mark_node) ++ break; ++ if (! CIsTreeNodePermanent(type)) ++ { ++ warning_with_decl( TreeDecl, "type of external `%s' is not global"); ++ /* By exiting the loop early, we leave TYPE nonzero, ++ and thus prevent globalization of the decl. */ ++ break; ++ } ++ else if ( CTreeDeclCode(type) == C_FUNCTION_TYPE ++ && CTreeTypeValues(type) != 0) ++ /* The types might not be truly local, ++ but the list of arg types certainly is temporary. ++ Since prototypes are nontraditional, ++ ok not to do the traditional thing. */ ++ break; ++ type = CTreeType(type); ++ } ++ ++ if (type == 0) ++ Binding = c_global_binding_level; ++ } ++ ++ /* This name is new in its binding level. ++ Install the new declaration and return it. */ ++ if ( Binding == c_global_binding_level) ++ { ++ /* Install a global value. */ ++ ++ /* If the first global decl has external linkage, ++ warn if we later see static one. */ ++ if (CTreeIdentGlobalValue( TreeName ) == 0 && CIsTreeNodePublic( TreeDecl )) ++ CSetTreeNodePublic( TreeName ); ++ ++ CTreeIdentGlobalValue( TreeName ) = TreeDecl; ++ ++ /* We no longer care about any previous block level declarations. */ ++ CTreeIdentLimboValue( TreeName ) = 0; ++ ++ /* Don't forget if the function was used via an implicit decl. */ ++ if (CTreeIdentImplicitDecl( TreeName ) ++ && CIsTreeNodeUsed(CTreeIdentImplicitDecl( TreeName ))) ++ { ++ CSetTreeNodeUsed( TreeDecl ); ++ CSetTreeNodeUsed( TreeName ); ++ } ++ ++ /* Don't forget if its address was taken in that way. */ ++ if (CTreeIdentImplicitDecl( TreeName ) ++ && CIsTreeNodeAddressable(CTreeIdentImplicitDecl( TreeName ))) ++ { ++ CSetTreeNodeAddressable( TreeDecl ); ++ } ++ ++ /* Warn about mismatches against previous implicit decl. */ ++ if (CTreeIdentImplicitDecl( TreeName ) != 0 ++ /* If this real decl matches the implicit, don't complain. */ ++ && ! ( CTreeDeclCode( TreeDecl ) == C_FUNCTION_DECL ++ && (CTreeTypeMainVariant( CTreeType( CTreeType( TreeDecl ))) ++ == c_integer_type_node))) ++ { ++ pedwarn ("`%s' was previously implicitly declared to return `int'", ++ CTreeIdentPointer( TreeName )); ++ } ++ ++ /* If this decl is `static' and an `extern' was seen previously, ++ that is erroneous. */ ++ if ( CIsTreeNodePublic( TreeName ) ++ && ! CIsTreeNodePublic( TreeDecl ) && ! CIsTreeDeclExternal( TreeDecl )) ++ { ++ /* Okay to redeclare an ANSI built-in as static. */ ++ if ( TreeNode != 0 && CIsTreeDeclBuiltIn( TreeNode )) ++ ; ++ /* Okay to declare a non-ANSI built-in as anything. */ ++# ifdef LUDO_NO_SKIP ++ else if (t != 0 && DECL_BUILT_IN_NONANSI (t)) ++ ; ++# endif ++ /* Okay to have global type decl after an earlier extern ++ declaration inside a lexical block. */ ++ else if ( CTreeDeclCode( TreeDecl ) == C_TYPE_DECL) ++ ; ++ else if (CTreeIdentImplicitDecl( TreeName )) ++ { ++ pedwarn ("`%s' was declared implicitly `extern' and later `static'", ++ CTreeIdentPointer( TreeName )); ++ } ++ else ++ { ++ pedwarn ("`%s' was declared `extern' and later `static'", ++ CTreeIdentPointer( TreeName )); ++ } ++ } ++ } ++ else ++ { ++ /* Here to install a non-global value. */ ++ c_tree_node * oldlocal = CTreeIdentGlobalValue( TreeName ); ++ c_tree_node * oldglobal = CTreeIdentGlobalValue( TreeName ); ++ CTreeIdentLocalValue( TreeName ) = TreeDecl; ++ ++ /* If this is an extern function declaration, see if we ++ have a global definition or declaration for the function. */ ++ if (oldlocal == 0 ++ && CIsTreeDeclExternal( TreeDecl ) ++ && !CIsTreeDeclInline( TreeDecl ) ++ && oldglobal != 0 ++ && CTreeDeclCode( TreeDecl ) == C_FUNCTION_DECL ++ && CTreeDeclCode(oldglobal) == C_FUNCTION_DECL) ++ { ++ /* We have one. Their types must agree. */ ++ if (! c_is_comptypes( CTreeType( TreeDecl ), ++ CTreeType( CTreeIdentGlobalValue( TreeName )))) ++ { ++ pedwarn_with_decl( TreeDecl, ++ "extern declaration of `%s' doesn't match global one"); ++ } ++ else ++ { ++ /* Inner extern decl is inline if global one is. ++ Copy enough to really inline it. */ ++ if ( CIsTreeDeclInline(oldglobal)) ++ { ++ CSetTreeDeclInline( TreeDecl ); ++ CTreeDeclInitial( TreeDecl ) = (c_current_function_decl == oldglobal ++ ? 0 : CTreeDeclInitial(oldglobal)); ++# ifdef LUDO_NO_SKIP ++ DECL_SAVED_INSNS ( TreeDecl ) = DECL_SAVED_INSNS (oldglobal); ++ DECL_FRAME_SIZE ( TreeDecl ) = DECL_FRAME_SIZE (oldglobal); ++# endif ++ CTreeDeclArguments( TreeDecl ) = CTreeDeclArguments(oldglobal); ++ CTreeDeclResult( TreeDecl ) = CTreeDeclResult(oldglobal); ++ if ( CIsTreeNodeAsmWritten(oldglobal)) ++ CSetTreeNodeAsmWritten( TreeDecl ); ++ CTreeDeclAbstractOrigin( TreeDecl ) = oldglobal; ++ } ++ /* Inner extern decl is built-in if global one is. */ ++ if ( CIsTreeDeclBuiltIn(oldglobal)) ++ { ++ CSetTreeDeclBuiltIn( TreeDecl ); ++# ifdef LUDO_NO_SKIP ++ DECL_FUNCTION_CODE ( TreeDecl ) = DECL_FUNCTION_CODE (oldglobal); ++# endif ++ } ++ /* Keep the arg types from a file-scope fcn defn. */ ++ if ( CTreeTypeValues(CTreeType(oldglobal)) != 0 ++ && CTreeDeclInitial(oldglobal) ++ && CTreeTypeValues(CTreeType( TreeDecl )) == 0) ++ { ++ CTreeType( TreeDecl ) = CTreeType(oldglobal); ++ } ++ } ++ } ++ ++ /* If we have a local external declaration, ++ and no file-scope declaration has yet been seen, ++ then if we later have a file-scope decl it must not be static. */ ++ if (oldlocal == 0 ++ && CIsTreeDeclExternal( TreeDecl ) ++ && CIsTreeNodePublic( TreeDecl )) ++ { ++ if (oldglobal == 0) ++ CSetTreeNodePublic( TreeName ); ++ ++ /* Save this decl, so that we can do type checking against ++ other decls after it falls out of scope. ++ ++ Only save it once. This prevents temporary decls created in ++ expand_inline_function from being used here, since this ++ will have been set when the inline function was parsed. ++ It also helps give slightly better warnings. */ ++ if (CTreeIdentLimboValue( TreeName ) == 0) ++ CTreeIdentLimboValue( TreeName ) = TreeDecl; ++ } ++ ++ /* Warn if shadowing an argument at the top level of the body. */ ++ if (oldlocal != 0 && !CIsTreeDeclExternal( TreeDecl ) ++ /* This warning doesn't apply to the parms of a nested fcn. */ ++ && ! c_current_binding_level->PARAM_FLAG ++ /* Check that this is one level down from the parms. */ ++ && c_current_binding_level->LEVEL_CHAIN->PARAM_FLAG ++ /* Check that the decl being shadowed ++ comes from the parm level, one level up. */ ++ && c_is_chain_member(oldlocal, c_current_binding_level->LEVEL_CHAIN->NAME_LIST)) ++ { ++ if ( CTreeDeclCode(oldlocal) == C_PARAM_DECL) ++ { ++ pedwarn ("declaration of `%s' shadows a parameter", ++ CTreeIdentPointer( TreeName )); ++ } ++ else ++ { ++ pedwarn ("declaration of `%s' shadows a symbol from the parameter list", ++ CTreeIdentPointer( TreeName )); ++ } ++ } ++ ++ /* Maybe warn if shadowing something else. */ ++ else if (c_warn_shadow && !CIsTreeDeclExternal( TreeDecl ) ++ /* No shadow warnings for internally generated vars. */ ++ && CTreeDeclLineNum( TreeDecl ) != 0 ++ /* No shadow warnings for vars made for inlining. */ ++ && ! (CTreeDeclAbstractOrigin( TreeDecl ) != NULL) ++ ) ++ { ++ char *warnstring = 0; ++ ++ if ( CTreeDeclCode( TreeDecl ) == C_PARAM_DECL ++ && c_current_binding_level->LEVEL_CHAIN->PARAM_FLAG) ++ /* Don't warn about the parm names in function declarator ++ within a function declarator. ++ It would be nice to avoid warning in any function ++ declarator in a declaration, as opposed to a definition, ++ but there is no way to tell it's not a definition. */ ++ ; ++ else if (oldlocal != 0 && CTreeDeclCode(oldlocal) == C_PARAM_DECL) ++ { ++ warnstring = "declaration of `%s' shadows a parameter"; ++ } ++ else if (oldlocal != 0) ++ { ++ warnstring = "declaration of `%s' shadows previous local"; ++ } ++ else if ( CTreeIdentGlobalValue( TreeName ) != 0 ++ && CTreeIdentGlobalValue( TreeName ) != c_error_mark_node) ++ { ++ warnstring = "declaration of `%s' shadows global declaration"; ++ } ++ ++ if (warnstring) ++ { ++ warning (warnstring, CTreeIdentPointer( TreeName )); ++ } ++ } ++ ++ /* If storing a local value, there may already be one (inherited). ++ If so, record it for restoration when this binding level ends. */ ++ if (oldlocal != 0) ++ Binding->SHADOWED_LIST = ++ c_tree_add_head_list( TreeName , oldlocal, Binding->SHADOWED_LIST); ++ } ++ ++ /* Keep count of variables in this level with incomplete type. */ ++ if ( CTreeTypeSize(CTreeType( TreeDecl )) == 0) ++ ++ Binding->N_INCOMPLETE; ++ } ++ ++ /* Put decls on list in reverse order. ++ We will reverse them later if necessary. */ ++ ++ TreeDecl->COMMON.CHAIN = Binding->NAME_LIST; ++ Binding->NAME_LIST = TreeDecl; ++ ++ return( TreeDecl ); ++} ++ ++ ++/* Decode the parameter-list info for a function type or function definition. ++ The argument is the value returned by `get_parm_info' (or made in parse.y ++ if there is an identifier list instead of a parameter decl list). ++ These two functions are separate because when a function returns ++ or receives functions then each is called multiple times but the order ++ of calls is different. The last call to `grokparms' is always the one ++ that contains the formal parameter names of a function definition. ++ ++ Store in `last_function_parms' a chain of the decls of parms. ++ Also store in `last_function_parm_tags' a chain of the struct, union, ++ and enum tags declared among the parms. ++ ++ Return a list of arg types to use in the FUNCTION_TYPE for this function. ++ ++ FUNCDEF_FLAG is nonzero for a function definition, 0 for ++ a mere declaration. A nonempty identifier-list gets an error message ++ when FUNCDEF_FLAG is zero. */ ++ ++static c_tree_node *c_grokparms(parms_info, Funcdef_flag) ++ c_tree_node *parms_info; ++ int Funcdef_flag; ++{ ++ c_tree_node *first_parm = CTreeChain(parms_info); ++ ++ c_last_function_parms = CTreeListPurpose(parms_info); ++ c_last_function_parm_tags = CTreeListValue(parms_info); ++ ++ if (c_warn_strict_prototypes && first_parm == 0 && !Funcdef_flag ++ && !c_in_system_header) ++ { ++ warning ("function declaration isn't a prototype"); ++ } ++ ++ if (first_parm != 0 ++ && CTreeNodeFirstCode( CTreeListValue(first_parm)) == C_IDENTIFIER_NODE) ++ { ++ if (! Funcdef_flag) ++ { ++ pedwarn ("parameter names (without types) in function declaration"); ++ } ++ ++ c_last_function_parms = first_parm; ++ return 0; ++ } ++ else ++ { ++ c_tree_node *parm; ++ c_tree_node *typelt; ++ /* We no longer test FUNCDEF_FLAG. ++ If the arg types are incomplete in a declaration, ++ they must include undefined tags. ++ These tags can never be defined in the scope of the declaration, ++ so the types can never be completed, ++ and no call can be compiled successfully. */ ++ ++ for (parm = c_last_function_parms, typelt = first_parm; ++ parm; ++ parm = CTreeChain(parm)) ++ { ++ /* Skip over any enumeration constants declared here. */ ++ if ( CTreeDeclCode(parm) == C_PARAM_DECL) ++ { ++ /* Barf if the parameter itself has an incomplete type. */ ++ c_tree_node *type = CTreeListValue(typelt); ++ if (CTreeTypeSize(type) == 0) ++ { ++ if (Funcdef_flag && CTreeDeclName(parm) != 0) ++ { ++ error ("parameter `%s' has incomplete type", ++ CTreeIdentPointer(CTreeDeclName(parm))); ++ } ++ else ++ { ++ warning ("parameter has incomplete type"); ++ } ++ if (Funcdef_flag) ++ { ++ CTreeListValue(typelt) = c_error_mark_node; ++ CTreeType(parm) = c_error_mark_node; ++ } ++ } ++ typelt = CTreeChain(typelt); ++ } ++ } ++ ++ /* Allocate the list of types the way we allocate a type. */ ++ if (first_parm && ! CIsTreeNodePermanent(first_parm)) ++ { ++ /* Construct a copy of the list of types ++ on the saveable obstack. */ ++ c_tree_node *result = NULL; ++ ++ for (typelt = first_parm; typelt; typelt = CTreeChain(typelt)) ++ { ++ result = c_tree_add_head_list( NULL, CTreeListValue(typelt), result); ++ } ++ ++ return c_tree_reverse_list(result); ++ } ++ else ++ /* The list we have is permanent already. */ ++ { ++ return first_parm; ++ } ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Grant Check Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++static c_tree_node *c_grokdeclarator( Declarator, Declspecs, Decl_context, Initialized ) ++ ++ c_tree_node *Declarator; ++ c_tree_node *Declspecs; ++ int Decl_context; ++ int Initialized; ++{ ++ c_tree_node *TreeDecl; ++ c_tree_node *ScanDeclarator; ++ c_tree_node *ScanSpec; ++ c_tree_node *TreeId; ++ c_tree_node *TreeNode; ++ c_tree_node *TreeType = (c_tree_node *)0; ++ c_tree_node *Typedef_decl = (c_tree_node *)0; ++ c_tree_node *Typedef_type = (c_tree_node *)0; ++ ++ char *Name; ++ ++ int Explicit_int = 0; ++ int Explicit_char = 0; ++ int Defaulted_int = 0; ++ int Specbits = 0; ++ int Longlong = 0; ++ int Funcdef_flag = 0; ++ int Bitfield = 0; ++ int Size_varies = 0; ++ ++ int Constp; ++ int Volatilep; ++ int Inlinep; ++ int Innermost_code = C_ERROR_NODE; ++ int NodeType; ++ int ExprType; ++ int TreeIdType; ++ int Index; ++ ++# ifdef LUDO_NO_SKIP ++ c_tree_node *spec; ++ tree typedef_type = 0; ++ tree decl_machine_attr = NULL; ++# endif ++ ++ if ( Decl_context == C_CDECL_BIT_FIELD) ++ { ++ Bitfield = 1; Decl_context = C_CDECL_FIELD; ++ } ++ ++ if ( Decl_context == C_CDECL_FUNCDEF) ++ { ++ Funcdef_flag = 1; Decl_context = C_CDECL_NORMAL; ++ } ++ ++# ifdef LUDO_NO_SKIP ++ push_obstacks_nochange (); ++ if (c_flag_traditional && allocation_temporary_p ()) ++ end_temporary_allocation (); ++# endif ++ ++ /* Look inside a declarator for the name being declared ++ and get it as a string, for an error message. */ ++ ++ ScanDeclarator = Declarator; ++ Name = (char *)0; ++ ++ while ( ScanDeclarator != (c_tree_node *)0 ) ++ { ++ NodeType = CTreeNodeFirstCode( ScanDeclarator ); ++ ++ if ( NodeType == C_EXPR_NODE ) ++ { ++ ExprType = CTreeExprCode( ScanDeclarator ); ++ ++ if ( ( ExprType == C_ARRAY_REF ) || ++ ( ExprType == C_INDIRECT_REF ) || ++ ( ExprType == C_CALL_EXPR ) ) ++ { ++ Innermost_code = ExprType; ++ ScanDeclarator = CTreeExprOperand( ScanDeclarator, 0 ); ++ } ++ } ++ else ++ if ( NodeType == C_IDENTIFIER_NODE ) ++ { ++ Name = CTreeIdentPointer( ScanDeclarator ); ++ ScanDeclarator = (c_tree_node *)0; ++ } ++ else ++ { ++ abort(); ++ } ++ } ++ ++ if ( Name == (char *)0 ) ++ { ++ Name = "type name"; ++ } ++ ++ /* A function definition's declarator must have the form of ++ a function declarator. */ ++ ++ if ( Funcdef_flag && ( Innermost_code != C_CALL_EXPR ) ) ++ { ++ return( (c_tree_node *)0 ); ++ } ++ ++ /* Anything declared one level down from the top level ++ must be one of the parameters of a function ++ (because the body is at least two levels down). */ ++ ++ /* If this looks like a function definition, make it one, ++ even if it occurs where parms are expected. ++ Then store_parm_decls will reject it and not use it as a parm. */ ++ ++ if ( ( Decl_context == C_CDECL_NORMAL ) && ++ ( ! Funcdef_flag ) && ++ ( c_current_binding_level->PARAM_FLAG ) ) ++ { ++ Decl_context = C_CDECL_PARAM; ++ } ++ ++ /* Look through the decl specs and record which ones appear. ++ Some typespecs are defined as built-in typenames. ++ Others, the ones that are modifiers of other types, ++ are represented by bits in SPECBITS: set the bits for ++ the modifiers that appear. Storage class keywords are also in SPECBITS. ++ ++ If there is a typedef name or a type, store the type in TYPE. ++ This includes builtin typedefs such as `int'. ++ ++ Set EXPLICIT_INT or EXPLICIT_CHAR if the type is `int' or `char' ++ and did not come from a user typedef. ++ ++ Set LONGLONG if `long' is mentioned twice. */ ++ ++ for ( ScanSpec = Declspecs; ++ ScanSpec != (c_tree_node *)0; ++ ScanSpec = CTreeChain( ScanSpec ) ) ++ { ++ TreeId = CTreeListValue( ScanSpec ); ++ TreeIdType = CTreeNodeFirstCode( TreeId ); ++ ++ if ( TreeId == c_ridpointers[(int)RID_INT] ) ++ { ++ Explicit_int = 1; ++ } ++ ++ if ( TreeId == c_ridpointers[(int)RID_CHAR] ) ++ { ++ Explicit_char = 1; ++ } ++ ++ if ( TreeIdType == C_IDENTIFIER_NODE ) ++ { ++ for ( Index = (int)RID_FIRST_MODIFIER; Index < (int) RID_MAX; Index++) ++ { ++ if ( c_ridpointers[ Index ] == TreeId ) ++ { ++ if ( ( Index == (int)RID_LONG ) && ++ ( Specbits & (1<< Index) ) ) ++ { ++ if ( Longlong ) ++ { ++ error ("`long long long' is too long for GCC"); ++ } ++ else ++ { ++ if ( ( c_pedantic ) && ( ! c_in_system_header ) ) ++ { ++ pedwarn ("ANSI C does not support `long long'"); ++ } ++ ++ Longlong = 1; ++ } ++ } ++ else ++ if ( Specbits & (1 << Index) ) ++ { ++ pedwarn ("duplicate `%s'", CTreeIdentPointer( TreeId ) ); ++ } ++ ++ Specbits |= 1 << Index; ++ goto found; ++ } ++ } ++ } ++ ++ if ( TreeType ) ++ { ++ error("two or more data types in declaration of `%s'", Name); ++ } ++ /* Actual typedefs come to us as TYPE_DECL nodes. */ ++ else if ( ( TreeIdType == C_DECL_NODE ) && ++ ( CTreeDeclCode( TreeId ) == C_TYPE_DECL ) ) ++ { ++ TreeType = CTreeType( TreeId ); ++# ifdef LUDO_NO_SKIP ++ Decl_machine_attr = DECL_MACHINE_ATTRIBUTES (id); ++# endif ++ Typedef_decl = TreeId; ++ } ++ /* Built-in types come as identifiers. */ ++ else ++ if ( TreeIdType == C_IDENTIFIER_NODE ) ++ { ++ TreeNode = c_lookup_name( TreeId ); ++ ++ if ( ( TreeNode == (c_tree_node *)0 ) || ++ ( CTreeDeclCode( TreeNode ) != C_TYPE_DECL ) ) ++ { ++ error("`%s' fails to be a typedef or built in type", CTreeIdentPointer( TreeId )); ++ } ++ else ++ if ( CTreeType( TreeNode ) != c_error_mark_node ) ++ { ++ TreeType = CTreeType( TreeNode ); ++ Typedef_decl = TreeNode; ++ } ++ } ++ else ++ if ( TreeIdType != C_ERROR_NODE ) ++ { ++ TreeType = TreeId; ++ } ++ ++ found: {} ++ } ++ ++ Typedef_type = TreeType; ++ ++ if ( TreeType != (c_tree_node *)0 ) ++ { ++ Size_varies = CIsTreeTypeVarSize(TreeType); ++ } ++ ++ /* No type at all: default to `int', and set DEFAULTED_INT ++ because it was not a user-defined typedef. */ ++ ++ if ( TreeType == (c_tree_node *)0 ) ++ { ++ if (! (Specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) ++ | (1 << (int) RID_SIGNED) ++ | (1 << (int) RID_UNSIGNED)))) ++ { ++ /* C9x will probably require a diagnostic here. ++ For now, issue a warning if -Wreturn-type and this is a function, ++ or if -Wimplicit; prefer the former warning since it is more ++ explicit. */ ++ if ((c_warn_implicit_int || c_warn_return_type) && Funcdef_flag) ++ c_warn_about_return_type = 1; ++ else if (c_warn_implicit_int) ++ { ++ warning ("type defaults to `int' in declaration of `%s'", Name); ++ } ++ } ++ ++ Defaulted_int = 1; ++ TreeType = c_integer_type_node; ++ } ++ ++ /* Now process the modifiers that were specified and check for invalid ++ * combinations. */ ++ /* Long double is a special combination. */ ++ ++ if (( Specbits & 1 << (int) RID_LONG) && ++ (! Longlong) && ++ (CTreeTypeMainVariant( TreeType ) == c_double_type_node)) ++ { ++ Specbits &= ~(1 << (int) RID_LONG); ++ TreeType = c_long_double_type_node; ++ } ++ ++ /* Check all other uses of type modifiers. */ ++ ++ if (Specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) ++ | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED))) ++ { ++ int Ok = 0; ++ ++ if ((Specbits & 1 << (int) RID_LONG) ++ && (Specbits & 1 << (int) RID_SHORT)) ++ { ++ error ("both long and short specified for `%s'", Name); ++ } ++ else if (((Specbits & 1 << (int) RID_LONG) ++ || (Specbits & 1 << (int) RID_SHORT)) ++ && Explicit_char) ++ { ++ error ("long or short specified with char for `%s'", Name); ++ } ++ else if (((Specbits & 1 << (int) RID_LONG) ++ || (Specbits & 1 << (int) RID_SHORT)) ++ && CTreeTypeCode( TreeType ) == C_REAL_TYPE) ++ { ++ static int Already = 0; ++ ++ error ("long or short specified with floating type for `%s'", Name); ++ if (! Already && ! c_pedantic) ++ { ++ error ("the only valid combination is `long double'"); ++ Already = 1; ++ } ++ } ++ else if ((Specbits & 1 << (int) RID_SIGNED) ++ && (Specbits & 1 << (int) RID_UNSIGNED)) ++ { ++ error ("both signed and unsigned specified for `%s'", Name); ++ } ++ else if ( CTreeTypeCode( TreeType ) != C_INTEGER_TYPE) ++ { ++ error ("long, short, signed or unsigned invalid for `%s'", Name); ++ } ++ else ++ { ++ Ok = 1; ++ ++ if (!Explicit_int && !Defaulted_int && !Explicit_char && c_pedantic) ++ { ++ pedwarn ("long, short, signed or unsigned used invalidly for `%s'", Name); ++ ++ if (c_flag_pedantic_errors) Ok = 0; ++ } ++ } ++ ++ /* Discard the type modifiers if they are invalid. */ ++ if (! Ok) ++ { ++ Specbits &= ~((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) ++ | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED)); ++ Longlong = 0; ++ } ++ } ++ ++ if ((Specbits & (1 << (int) RID_COMPLEX) ) && ++ (CTreeTypeCode( TreeType ) != C_INTEGER_TYPE) && ++ (CTreeTypeCode( TreeType ) != C_REAL_TYPE ) ) ++ { ++ error ("complex invalid for `%s'", Name); ++ Specbits &= ~ (1 << (int) RID_COMPLEX); ++ } ++ ++ /* Decide whether an integer type is signed or not. ++ Optionally treat bitfields as signed by default. */ ++ if ((Specbits & 1 << (int) RID_UNSIGNED) || ++ /* Traditionally, all bitfields are unsigned. */ ++ (Bitfield && c_flag_traditional ++ && (! c_explicit_flag_signed_bitfields || !c_flag_signed_bitfields)) || ++ (Bitfield && ! c_flag_signed_bitfields ++ && (Explicit_int || Defaulted_int || Explicit_char ++ /* A typedef for plain `int' without `signed' ++ can be controlled just like plain `int'. */ ++# ifdef LUDO_NO_SKIP ++ || ! (Typedef_decl != 0 && C_TYPEDEF_EXPLICITLY_SIGNED(typedef_decl)) ++# endif ++ ) ++ && CTreeTypeCode( TreeType ) != C_ENUMERAL_TYPE ++ && !(Specbits & 1 << (int) RID_SIGNED))) ++ { ++ if (Longlong) ++ { ++ TreeType = c_long_long_unsigned_type_node; ++ } ++ else if (Specbits & 1 << (int) RID_LONG) ++ { ++ TreeType = c_long_unsigned_type_node; ++ } ++ else if (Specbits & 1 << (int) RID_SHORT) ++ { ++ TreeType = c_short_unsigned_type_node; ++ } ++ else if (TreeType == c_char_type_node) ++ { ++ TreeType = c_unsigned_char_type_node; ++ } ++ else if ( Typedef_decl != (c_tree_node *)0 ) ++ { ++ TreeType = c_get_unsigned_type(TreeType); ++ } ++ else ++ { ++ TreeType = c_unsigned_type_node; ++ } ++ } ++ else if ((Specbits & 1 << (int) RID_SIGNED) && (TreeType == c_char_type_node)) ++ { ++ TreeType = c_signed_char_type_node; ++ } ++ else if (Longlong) ++ { ++ TreeType = c_long_long_integer_type_node; ++ } ++ else if (Specbits & 1 << (int) RID_LONG) ++ { ++ TreeType = c_long_integer_type_node; ++ } ++ else if (Specbits & 1 << (int) RID_SHORT) ++ { ++ TreeType = c_short_integer_type_node; ++ } ++ ++ if (Specbits & 1 << (int) RID_COMPLEX) ++ { ++ /* If we just have "complex", it is equivalent to ++ "complex double", but if any modifiers at all are specified it is ++ the complex form of TYPE. E.g, "complex short" is ++ "complex short int". */ ++ ++ if (Defaulted_int && ! Longlong ++ && ! (Specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) ++ | (1 << (int) RID_SIGNED) ++ | (1 << (int) RID_UNSIGNED)))) ++ { ++ TreeType = c_complex_double_type_node; ++ } ++ else if (TreeType == c_integer_type_node) ++ { ++ TreeType = c_complex_integer_type_node; ++ } ++ else if (TreeType == c_float_type_node) ++ { ++ TreeType = c_complex_float_type_node; ++ } ++ else if (TreeType == c_double_type_node) ++ { ++ TreeType = c_complex_double_type_node; ++ } ++ else if (TreeType == c_long_double_type_node) ++ { ++ TreeType = c_complex_long_double_type_node; ++ } ++ else ++ { ++ TreeType = c_tree_build_complex_type (TreeType); ++ } ++ } ++ ++ /* Set CONSTP if this declaration is `const', whether by ++ explicit specification or via a typedef. ++ Likewise for VOLATILEP. */ ++ ++ Constp = (!! (Specbits & 1 << (int) RID_CONST)) + ++ (!! CIsTreeNodeReadOnly(TreeType)) ; ++ ++ Volatilep = (!! (Specbits & 1 << (int) RID_VOLATILE)) + ++ (!! CIsTreeNodeVolatile(TreeType)); ++ ++ Inlinep = !! (Specbits & (1 << (int) RID_INLINE)); ++ if (Constp > 1) ++ { ++ pedwarn ("duplicate `const'"); ++ } ++ if (Volatilep > 1) ++ { ++ pedwarn ("duplicate `volatile'"); ++ } ++ ++ if (! c_flag_gen_aux_info && ++ (CIsTreeNodeReadOnly(TreeType) || CIsTreeNodeVolatile(TreeType))) ++ { ++ TreeType = CTreeTypeMainVariant(TreeType); ++ } ++ ++ /* Warn if two storage classes are given. Default to `auto'. */ ++ ++ { ++ int nclasses = 0; ++ ++ if (Specbits & 1 << (int) RID_AUTO) nclasses++; ++ if (Specbits & 1 << (int) RID_STATIC) nclasses++; ++ if (Specbits & 1 << (int) RID_EXTERN) nclasses++; ++ if (Specbits & 1 << (int) RID_REGISTER) nclasses++; ++ if (Specbits & 1 << (int) RID_TYPEDEF) nclasses++; ++ if (Specbits & 1 << (int) RID_ITERATOR) nclasses++; ++ ++ /* Warn about storage classes that are invalid for certain ++ kinds of declarations (parameters, typenames, etc.). */ ++ ++ if (nclasses > 1) ++ { ++ error ("multiple storage classes in declaration of `%s'", Name); ++ } ++ else if (Funcdef_flag ++ && (Specbits ++ & ((1 << (int) RID_REGISTER) ++ | (1 << (int) RID_AUTO) ++ | (1 << (int) RID_TYPEDEF)))) ++ { ++ if (Specbits & 1 << (int) RID_AUTO ++ && (c_pedantic || c_current_binding_level == c_global_binding_level)) ++ pedwarn ("function definition declared `auto'"); ++ if (Specbits & 1 << (int) RID_REGISTER) ++ error ("function definition declared `register'"); ++ if (Specbits & 1 << (int) RID_TYPEDEF) ++ error ("function definition declared `typedef'"); ++ Specbits &= ~ ((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER) ++ | (1 << (int) RID_AUTO)); ++ } ++ else if (Decl_context != C_CDECL_NORMAL && nclasses > 0) ++ { ++ if (Decl_context == C_CDECL_PARAM && Specbits & 1 << (int) RID_REGISTER) ; ++ else ++ { ++ error ((Decl_context == C_CDECL_FIELD ++ ? "storage class specified for structure field `%s'" ++ : (Decl_context == C_CDECL_PARAM ++ ? "storage class specified for parameter `%s'" ++ : "storage class specified for typename")), ++ Name); ++ Specbits &= ~ ((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER) ++ | (1 << (int) RID_AUTO) | (1 << (int) RID_STATIC) ++ | (1 << (int) RID_EXTERN)); ++ } ++ } ++ else if (Specbits & 1 << (int) RID_EXTERN && Initialized && ! Funcdef_flag) ++ { ++ /* `extern' with initialization is invalid if not at top level. */ ++ if (c_current_binding_level == c_global_binding_level) ++ { ++ warning ("`%s' initialized and declared `extern'", Name); ++ } ++ else ++ { ++ error ("`%s' has both `extern' and initializer", Name); ++ } ++ } ++ else if (Specbits & 1 << (int) RID_EXTERN && Funcdef_flag ++ && c_current_binding_level != c_global_binding_level) ++ { ++ error ("nested function `%s' declared `extern'", Name); ++ } ++ else if (c_current_binding_level == c_global_binding_level ++ && Specbits & (1 << (int) RID_AUTO)) ++ { ++ error ("top-level declaration of `%s' specifies `auto'", Name); ++ } ++ else if ((Specbits & 1 << (int) RID_ITERATOR) ++ && CTreeNodeFirstCode(Declarator) != C_IDENTIFIER_NODE) ++ { ++ error ("iterator `%s' has derived type", Name); ++ TreeType = c_error_mark_node; ++ } ++ else if ((Specbits & 1 << (int) RID_ITERATOR) ++ && CTreeTypeCode(TreeType) != C_INTEGER_TYPE) ++ { ++ error ("iterator `%s' has noninteger type", Name); ++ TreeType = c_error_mark_node; ++ } ++ } ++ ++ /* Now figure out the structure of the declarator proper. ++ Descend through it, creating more complex types, until we reach ++ the declared identifier (or NULL, in an absolute declarator). */ ++ ++ while ( ( Declarator != (c_tree_node *)0 ) && ++ ( CTreeNodeFirstCode( Declarator ) != C_IDENTIFIER_NODE) ) ++ { ++ if ( TreeType == c_error_mark_node ) ++ { ++ Declarator = CTreeExprOperand( Declarator, 0 ); ++ continue; ++ } ++ ++ /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]), ++ an INDIRECT_REF (for *...), ++ a CALL_EXPR (for ...(...)), ++ an identifier (for the name being declared) ++ or a null pointer (for the place in an absolute declarator ++ where the name was omitted). ++ For the last two cases, we have just exited the loop. ++ ++ At this point, TYPE is the TreeType of elements of an array, ++ or for a function to return, or for a pointer to point to. ++ After this sequence of ifs, TYPE is the TreeType of the ++ array or function or pointer, and DECLARATOR has had its ++ outermost layer removed. */ ++ ++ NodeType = CTreeNodeFirstCode( Declarator ); ++ ++ if ( ( NodeType == C_EXPR_NODE ) && ++ ( CTreeExprCode( Declarator) == C_ARRAY_REF ) ) ++ { ++ c_tree_node *itype = (c_tree_node *)0; ++ c_tree_node *size = CTreeExprOperand(Declarator, 1); ++ /* An uninitialized decl with `extern' is a reference. */ ++# ifdef LUDO_NO_SKIP ++ int extern_ref = !Initialized && (Specbits & (1 << (int) RID_EXTERN)); ++# endif ++ /* The index is a signed object `sizetype' bits wide. */ ++ c_tree_node *index_type = c_get_signed_type(c_size_type); ++ ++ Declarator = CTreeExprOperand(Declarator, 0); ++ ++ /* Check for some types that there cannot be arrays of. */ ++ ++ if ( CTreeTypeMainVariant(TreeType) == c_void_type_node) ++ { ++ error ("declaration of `%s' as array of voids", Name); ++ TreeType = c_error_mark_node; ++ } ++ ++ if ( CTreeTypeCode(TreeType) == C_FUNCTION_TYPE) ++ { ++ error ("declaration of `%s' as array of functions", Name); ++ TreeType = c_error_mark_node; ++ } ++ ++ if (size == c_error_mark_node) ++ { ++ TreeType = c_error_mark_node; ++ } ++ ++ if (TreeType == c_error_mark_node) ++ { ++ continue; ++ } ++ ++ /* If this is a block level extern, it must live past the end ++ of the function so that we can check it against other extern ++ declarations (IDENTIFIER_LIMBO_VALUE). */ ++# ifdef LUDO_NO_SKIP ++ if (extern_ref && allocation_temporary_p ()) ++ end_temporary_allocation (); ++# endif ++ ++ /* If size was specified, set ITYPE to a range-TreeType for that size. ++ Otherwise, ITYPE remains null. finish_decl may figure it out ++ from an initial value. */ ++ ++ if (size) ++ { ++ /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ ++ ++ CStripTypeNops(size); ++ ++ if ( CTreeTypeCode( CTreeType(size)) != C_INTEGER_TYPE ++ && CTreeTypeCode( CTreeType(size)) != C_ENUMERAL_TYPE) ++ { ++ error ("size of array `%s' has non-integer type", Name); ++ size = c_integer_one_node; ++ } ++ ++ if (c_pedantic && c_tree_is_integer_zerop(size)) ++ { ++ pedwarn ("ANSI C forbids zero-size array `%s'", Name); ++ } ++ ++ if (CTreeNodeFirstCode(size) == C_INT_CST_NODE) ++ { ++ c_constant_expression_warning(size); ++ if (c_tree_is_int_cst_sgn(size) < 0) ++ { ++ error ("size of array `%s' is negative", Name); ++ size = c_integer_one_node; ++ } ++ } ++ else ++ { ++ /* Make sure the array size remains visibly nonconstant ++ even if it is (eg) a const variable with known value. */ ++ Size_varies = 1; ++ ++ if (c_pedantic) ++ { ++ if ( CIsTreeNodeConstant(size)) ++ { ++ pedwarn("ANSI C forbids array `%s' whose size can't be evaluated", Name); ++ } ++ else ++ { ++ pedwarn("ANSI C forbids variable-size array `%s'", Name); ++ } ++ } ++ } ++ ++ /* Convert size to index_type, so that if it is a variable ++ the computations will be done in the proper mode. */ ++ itype = c_fold( c_tree_build_binary_typed_expr( ++ C_MINUS_EXPR, index_type, ++ c_convert_expr(index_type, size), ++ c_convert_expr(index_type, c_size_one_node)) ); ++ ++ /* If that overflowed, the array is too big. ++ ??? While a size of INT_MAX+1 technically shouldn't cause ++ an overflow (because we subtract 1), the overflow is recorded ++ during the conversion to index_type, before the subtraction. ++ Handling this case seems like an unnecessary complication. */ ++ if ( CIsTreeNodeOverflow(itype)) ++ { ++ error ("size of array `%s' is too large", Name); ++ TreeType = c_error_mark_node; ++ continue; ++ } ++ ++# ifdef LUDO_NO_SKIP ++ if (Size_varies) ++ { ++ itype = variable_size (itype); ++ } ++# endif ++ itype = c_tree_build_index_type(itype); ++ } ++ ++ /* Build the array TreeType itself, then merge any constancy or ++ volatility into the target TreeType. We must do it in this order ++ to ensure that the TYPE_MAIN_VARIANT field of the array TreeType ++ is set correctly. */ ++ ++ TreeType = c_tree_build_array_type(TreeType, itype); ++ if (Constp || Volatilep) ++ { ++ TreeType = c_c_build_type_variant(TreeType, Constp, Volatilep); ++ } ++ ++ if (Size_varies) ++ { ++ CSetTreeTypeVarSize(TreeType); ++ } ++ } ++ else ++ if ( ( NodeType == C_EXPR_NODE ) && ++ ( CTreeExprCode( Declarator) == C_CALL_EXPR ) ) ++ { ++# ifdef LUDO_NO_SKIP ++ int Extern_ref = (!(Specbits & (1 << (int) RID_AUTO)) ++ || c_current_binding_level == c_global_binding_level); ++# endif ++ c_tree_node *arg_types; ++ ++ /* Declaring a function TreeType. ++ Make sure we have a valid TreeType for the function to return. */ ++ if (TreeType == c_error_mark_node) ++ continue; ++ ++ Size_varies = 0; ++ ++ /* Warn about some types functions can't return. */ ++ ++ if ( CTreeTypeCode(TreeType) == C_FUNCTION_TYPE) ++ { ++ error ("`%s' declared as function returning a function", Name); ++ TreeType = c_integer_type_node; ++ } ++ if ( CTreeTypeCode(TreeType) == C_ARRAY_TYPE) ++ { ++ error ("`%s' declared as function returning an array", Name); ++ TreeType = c_integer_type_node; ++ } ++ ++#ifndef TRADITIONAL_RETURN_FLOAT ++ /* Traditionally, declaring return TreeType float means double. */ ++ ++ if (c_flag_traditional && CTreeTypeMainVariant(TreeType) == c_float_type_node) ++ { ++ TreeType = c_double_type_node; ++ } ++#endif /* TRADITIONAL_RETURN_FLOAT */ ++ ++ /* If this is a block level extern, it must live past the end ++ of the function so that we can check it against other extern ++ declarations (IDENTIFIER_LIMBO_VALUE). */ ++# ifdef LUDO_NO_SKIP ++ if (extern_ref && allocation_temporary_p ()) ++ end_temporary_allocation (); ++# endif ++ ++ /* Construct the function TreeType and go to the next ++ inner layer of declarator. */ ++ ++ arg_types = c_grokparms( CTreeExprOperand( Declarator, 1), ++ Funcdef_flag ++ /* Say it's a definition only for the CALL_EXPR closest to the identifier. */ ++ && CTreeNodeFirstCode( CTreeExprOperand(Declarator, 0)) == C_IDENTIFIER_NODE); ++ /* ANSI seems to say that `const int foo ();' ++ does not make the function foo const. */ ++ if (Constp || Volatilep) ++ { ++ TreeType = c_c_build_type_variant(TreeType, Constp, Volatilep); ++ } ++ Constp = 0; ++ Volatilep = 0; ++ ++ TreeType = c_tree_build_function_type(TreeType, arg_types); ++ Declarator = CTreeExprOperand(Declarator, 0); ++ ++ /* Set the TYPE_CONTEXTs for each tagged TreeType which is local to ++ the formal parameter list of this FUNCTION_TYPE to point to ++ the FUNCTION_TYPE node itself. */ ++ ++ { ++ c_tree_node *link; ++ ++ for (link = c_current_function_parm_tags; ++ link; ++ link = CTreeChain (link)) ++ CTreeTypeContext( CTreeListValue(link)) = TreeType; ++ } ++ } ++ else ++ if ( ( NodeType == C_EXPR_NODE ) && ++ ( CTreeExprCode( Declarator) == C_INDIRECT_REF ) ) ++ { ++ /* Merge any constancy or volatility into the target TreeType ++ for the pointer. */ ++ ++ if (c_pedantic && CTreeTypeCode(TreeType) == C_FUNCTION_TYPE ++ && (Constp || Volatilep)) ++ { ++ pedwarn ("ANSI C forbids const or volatile function types"); ++ } ++ if (Constp || Volatilep) ++ { ++ TreeType = c_c_build_type_variant(TreeType, Constp, Volatilep); ++ } ++ ++ Constp = 0; ++ Volatilep = 0; ++ Size_varies = 0; ++ ++ TreeType = c_tree_build_pointer_type(TreeType); ++ ++ /* Process a list of TreeType modifier keywords ++ (such as const or volatile) that were given inside the `*'. */ ++ ++ if ( CTreeType(Declarator) != (c_tree_node *)0 ) ++ { ++ c_tree_node *typemodlist; ++ int erred = 0; ++ for (typemodlist = CTreeType(Declarator); typemodlist; ++ typemodlist = CTreeChain(typemodlist)) ++ { ++ if ( CTreeListValue(typemodlist) == c_ridpointers[(int) RID_CONST]) ++ { ++ Constp++; ++ } ++ else if ( CTreeListValue(typemodlist) == c_ridpointers[(int) RID_VOLATILE]) ++ { ++ Volatilep++; ++ } ++ else if (!erred) ++ { ++ erred = 1; ++ error ("invalid TreeType modifier within pointer declarator"); ++ } ++ } ++ if (Constp > 1) ++ { ++ pedwarn ("duplicate `const'"); ++ } ++ if (Volatilep > 1) ++ { ++ pedwarn ("duplicate `volatile'"); ++ } ++ } ++ ++ Declarator = CTreeExprOperand(Declarator, 0); ++ } ++ else abort (); ++ } ++ ++ /* Now TYPE has the actual TreeType. */ ++ ++ /* Did array size calculations overflow? */ ++ ++ if ( CTreeTypeCode(TreeType) == C_ARRAY_TYPE ++ && CTreeTypeSize(TreeType) ++ && CIsTreeNodeOverflow( CTreeTypeSize(TreeType))) ++ { ++ error ("size of array `%s' is too large", Name); ++ } ++ ++ /* If this is declaring a typedef name, return a TYPE_DECL. */ ++ ++ if (Specbits & (1 << (int) RID_TYPEDEF)) ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *decl; ++# endif ++ /* Note that the grammar rejects storage classes ++ in typenames, fields or parameters */ ++ if ( c_pedantic && ++ ( CTreeTypeCode( TreeType ) == C_FUNCTION_TYPE ) && ++ ( Constp || Volatilep ) ) ++ { ++ pedwarn ("ANSI C forbids const or volatile function types"); ++ } ++ if (Constp || Volatilep) ++ { ++ TreeType = c_c_build_type_variant(TreeType, Constp, Volatilep); ++ } ++ ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, Declarator, TreeType); ++ ++# ifdef LUDO_NO_SKIP ++ if ((Specbits & (1 << (int) RID_SIGNED)) ++ || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) ++ C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1; ++ pop_obstacks (); ++# endif ++ ++ return( TreeDecl ); ++ } ++ ++ /* Detect the case of an array TreeType of unspecified size ++ which came, as such, direct from a typedef name. ++ We must copy the TreeType, so that each identifier gets ++ a distinct TreeType, so that each identifier's size can be ++ controlled separately by its own initializer. */ ++ ++ if ( ( TreeType != (c_tree_node *)0 ) && ++ ( Typedef_type != (c_tree_node *)0 ) && ++ ( CTreeTypeMainVariant(TreeType) == CTreeTypeMainVariant(Typedef_type) ) && ++ ( CTreeTypeCode(TreeType) == C_ARRAY_TYPE ) && ++ ( CTreeTypeValues(TreeType) == 0) ) ++ { ++ TreeType = c_tree_build_array_type( CTreeType(TreeType), 0); ++ if (Size_varies) ++ { ++ CSetTreeTypeVarSize(TreeType); ++ } ++ } ++ ++ /* If this is a TreeType name (such as, in a cast or sizeof), ++ compute the TreeType and return it now. */ ++ ++ if (Decl_context == C_CDECL_TYPENAME) ++ { ++ /* Note that the grammar rejects storage classes ++ in typenames, fields or parameters */ ++ if (c_pedantic && CTreeTypeCode(TreeType) == C_FUNCTION_TYPE ++ && (Constp || Volatilep)) ++ { ++ pedwarn ("ANSI C forbids const or volatile function types"); ++ } ++ ++ if (Constp || Volatilep) ++ { ++ TreeType = c_c_build_type_variant(TreeType, Constp, Volatilep); ++ } ++ ++# ifdef LUDO_NO_SKIP ++ pop_obstacks (); ++# endif ++ return TreeType; ++ } ++ ++ /* Aside from typedefs and TreeType names (handle above), ++ `void' at top level (not within pointer) ++ is allowed only in public variables. ++ We don't complain about parms either, but that is because ++ a better error message can be made later. */ ++ ++ if ( CTreeTypeMainVariant(TreeType) == c_void_type_node && ++ Decl_context != C_CDECL_PARAM ++ && ! ((Decl_context != C_CDECL_FIELD && ++ CTreeTypeCode(TreeType) != C_FUNCTION_TYPE) ++ && ((Specbits & (1 << (int) RID_EXTERN)) ++ || (c_current_binding_level == c_global_binding_level ++ && !(Specbits ++ & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER))))))) ++ { ++ error ("variable or field `%s' declared void", Name); ++ TreeType = c_integer_type_node; ++ } ++ ++ /* Now create the decl, which may be a VAR_DECL, a PARM_DECL ++ or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE. */ ++ ++ if ( Decl_context == C_CDECL_PARAM ) ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *type_as_written = TreeType; ++# endif ++ c_tree_node *main_type; ++ ++ /* A parameter declared as an array of T is really a pointer to T. ++ One declared as a function is really a pointer to a function. */ ++ ++ if ( CTreeTypeCode(TreeType) == C_ARRAY_TYPE) ++ { ++ /* Transfer const-ness of array into that of TreeType pointed to. */ ++ TreeType = CTreeType(TreeType); ++ ++ if (Constp || Volatilep) ++ { ++ TreeType = c_c_build_type_variant(TreeType, Constp, Volatilep); ++ } ++ TreeType = c_tree_build_pointer_type(TreeType); ++ Volatilep = Constp = 0; ++ Size_varies = 0; ++ } ++ else if ( CTreeTypeCode(TreeType) == C_FUNCTION_TYPE) ++ { ++ if (c_pedantic && (Constp || Volatilep)) ++ { ++ pedwarn ("ANSI C forbids const or volatile function types"); ++ } ++ if (Constp || Volatilep) ++ { ++ TreeType = c_c_build_type_variant(TreeType, Constp, Volatilep); ++ } ++ TreeType = c_tree_build_pointer_type(TreeType); ++ Volatilep = Constp = 0; ++ } ++ ++ TreeDecl = c_tree_build_decl( C_PARAM_DECL, Declarator, TreeType); ++ ++ if (Size_varies) ++ { ++ CSetTreeDeclVarSize( TreeDecl ); ++ } ++ ++ /* Compute the TreeType actually passed in the parmlist, ++ for the case where there is no prototype. ++ (For example, shorts and chars are passed as ints.) ++ When there is a prototype, this is overridden later. */ ++ ++ CTreeDeclInitial( TreeDecl ) = TreeType; ++ main_type = (TreeType == c_error_mark_node ++ ? c_error_mark_node : CTreeTypeMainVariant(TreeType)); ++ ++ if (main_type == c_float_type_node) ++ { ++ CTreeDeclInitial( TreeDecl ) = c_double_type_node; ++ } ++ /* Don't use TYPE_PRECISION to decide whether to promote, ++ because we should convert short if it's the same size as int, ++ but we should not convert long if it's the same size as int. */ ++ ++ else if ( CTreeNodeFirstCode(main_type) != C_ERROR_NODE ++ && C_PROMOTING_INTEGER_TYPE_P(main_type)) ++ { ++ if ( CTreeTypePrecision(TreeType) == CTreeTypePrecision(c_integer_type_node) ++ && CIsTreeNodeUnsigned(TreeType)) ++ { ++ CTreeDeclInitial( TreeDecl ) = c_unsigned_type_node; ++ } ++ else ++ { ++ CTreeDeclInitial( TreeDecl ) = c_integer_type_node; ++ } ++ } ++ ++# ifdef LUDO_NO_SKIP ++ DECL_ARG_TYPE_AS_WRITTEN ( TreeDecl ) = type_as_written; ++# endif ++ } ++ else if ( Decl_context == C_CDECL_FIELD) ++ { ++ /* Structure field. It may not be a function. */ ++ ++ if ( CTreeTypeCode(TreeType) == C_FUNCTION_TYPE) ++ { ++ error ("field `%s' declared as a function", Name); ++ TreeType = c_tree_build_pointer_type(TreeType); ++ } ++ else if ( CTreeNodeFirstCode(TreeType) != C_ERROR_NODE && CTreeTypeSize(TreeType) == 0) ++ { ++ error ("field `%s' has incomplete type", Name); ++ TreeType = c_error_mark_node; ++ } ++ /* Move TreeType qualifiers down to element of an array. */ ++ if ( CTreeTypeCode(TreeType) == C_ARRAY_TYPE && (Constp || Volatilep)) ++ { ++ TreeType = c_tree_build_array_type(c_c_build_type_variant( ++ CTreeType(TreeType), Constp, Volatilep), ++ CTreeTypeValues(TreeType)); ++ } ++ ++ TreeDecl = c_tree_build_decl( C_FIELD_DECL, Declarator, TreeType ); ++ ++ if (Size_varies) ++ { ++ CSetTreeDeclVarSize(TreeDecl); ++ } ++ } ++ else if ( CTreeTypeCode(TreeType) == C_FUNCTION_TYPE) ++ { ++ /* Every function declaration is "external" ++ except for those which are inside a function body ++ in which `auto' is used. ++ That is a case not specified by ANSI C, ++ and we use it for forward declarations for nested functions. */ ++ int extern_ref = (!(Specbits & (1 << (int) RID_AUTO)) ++ || c_current_binding_level == c_global_binding_level); ++ ++ if (Specbits & (1 << (int) RID_AUTO) ++ && (c_pedantic || c_current_binding_level == c_global_binding_level)) ++ { ++ pedwarn ("invalid storage class for function `%s'", Name); ++ } ++ if (Specbits & (1 << (int) RID_REGISTER)) ++ { ++ error ("invalid storage class for function `%s'", Name); ++ } ++ /* Function declaration not at top level. ++ Storage classes other than `extern' are not allowed ++ and `extern' makes no difference. */ ++ if (c_current_binding_level != c_global_binding_level ++ && (Specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE))) ++ && c_pedantic) ++ { ++ pedwarn ("invalid storage class for function `%s'", Name); ++ } ++ ++ /* If this is a block level extern, it must live past the end ++ of the function so that we can check it against other ++ extern declarations (IDENTIFIER_LIMBO_VALUE). */ ++# ifdef LUDO_NO_SKIP ++ if (extern_ref && allocation_temporary_p ()) ++ end_temporary_allocation (); ++# endif ++ ++ TreeDecl = c_tree_build_decl( C_FUNCTION_DECL, Declarator, TreeType ); ++ ++# ifdef LUDO_NO_SKIP ++ decl = c_build_decl_attribute_variant(decl, decl_machine_attr); ++# endif ++ ++ if (c_pedantic && (Constp || Volatilep) ++ && ! CIsTreeDeclSystemHeader( TreeDecl )) ++ { ++ pedwarn ("ANSI C forbids const or volatile functions"); ++ } ++ ++ if (c_pedantic ++ && CTreeTypeMainVariant( ++ CTreeType( CTreeType( TreeDecl ))) == c_void_type_node ++ && ( CIsTreeNodeReadOnly( CTreeType( CTreeType( TreeDecl ))) ++ || CIsTreeNodeVolatile( CTreeType( CTreeType( TreeDecl )))) ++ && ! CIsTreeDeclSystemHeader( TreeDecl )) ++ { ++ pedwarn ("ANSI C forbids const or volatile void function return type"); ++ } ++ ++ if (Volatilep ++ && CTreeType( CTreeType( TreeDecl )) != c_void_type_node) ++ { ++ warning ("`noreturn' function returns non-void value"); ++ } ++ ++ if (extern_ref) ++ { ++ CSetTreeDeclExternal( TreeDecl ); ++ } ++ ++ /* Record absence of global scope for `static' or `auto'. */ ++ if ( !(Specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO)))) ++ { ++ CSetTreeNodePublic( TreeDecl ); ++ } ++ ++ /* Record presence of `inline', if it is reasonable. */ ++ if (Inlinep) ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *last = c_tree_get_last_list( CTreeTypeValues(TreeType)); ++# endif ++ if (! strcmp( CTreeIdentPointer(Declarator), "main")) ++ { ++ warning ("cannot inline function `main'"); ++ } ++ else ++ /* Assume that otherwise the function can be inlined. */ ++ CSetTreeDeclInline( TreeDecl ); ++ ++ if (Specbits & (1 << (int) RID_EXTERN)) ++ { ++ c_current_extern_inline = 1; ++ } ++ } ++ } ++ else ++ { ++ /* It's a variable. */ ++ /* An uninitialized decl with `extern' is a reference. */ ++ int extern_ref = !Initialized && (Specbits & (1 << (int) RID_EXTERN)); ++ ++ /* Move TreeType qualifiers down to element of an array. */ ++ if ( CTreeTypeCode(TreeType) == C_ARRAY_TYPE && (Constp || Volatilep)) ++ { ++ TreeType = c_tree_build_array_type( ++ c_c_build_type_variant( CTreeType(TreeType), Constp, Volatilep), ++ CTreeTypeValues(TreeType)); ++ } ++ ++ /* If this is a block level extern, it must live past the end ++ of the function so that we can check it against other ++ extern declarations (IDENTIFIER_LIMBO_VALUE). */ ++# ifdef LUDO_NO_SKIP ++ if (extern_ref && allocation_temporary_p ()) ++ end_temporary_allocation (); ++# endif ++ ++ TreeDecl = c_tree_build_decl( C_VAR_DECL, Declarator, TreeType ); ++ ++ if (Size_varies) ++ { ++ CSetTreeDeclVarSize( TreeDecl ); ++ } ++ ++ if (Inlinep) ++ { ++ pedwarn_with_decl( TreeDecl, "variable `%s' declared `inline'"); ++ } ++ ++ if ( extern_ref ) ++ { ++ CSetTreeNodeExternal( TreeDecl); ++ } ++ /* At top level, the presence of a `static' or `register' storage ++ class specifier, or the absence of all storage class specifiers ++ makes this declaration a definition (perhaps tentative). Also, ++ the absence of both `static' and `register' makes it public. */ ++ if (c_current_binding_level == c_global_binding_level) ++ { ++ if ( !(Specbits ++ & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER))) ) ++ { ++ CSetTreeNodePublic( TreeDecl ); ++ } ++ ++ if ( ! CIsTreeNodeExternal( TreeDecl ) ) ++ { ++ CSetTreeNodeStatic( TreeDecl ); ++ } ++ } ++ /* Not at top level, only `static' makes a static definition. */ ++ else ++ { ++ if ( (Specbits & (1 << (int) RID_STATIC)) != 0 ) ++ { ++ CSetTreeNodeStatic( TreeDecl ); ++ } ++ ++ if ( CIsTreeNodeExternal( TreeDecl ) ) ++ { ++ CSetTreeNodePublic( TreeDecl ); ++ } ++ } ++ ++ if (Specbits & 1 << (int) RID_ITERATOR) ++ { ++ CSetTreeDeclIterator( TreeDecl ); ++ } ++ } ++ ++ /* Record `register' declaration for warnings on & ++ and in case doing stupid register allocation. */ ++ ++ if (Specbits & (1 << (int) RID_REGISTER)) ++ { ++ CSetTreeDeclRegister( TreeDecl ); ++ } ++ ++ /* Record constancy and volatility. */ ++ ++ if (Constp) ++ { ++ CSetTreeNodeReadOnly( TreeDecl ); ++ } ++ ++ if (Volatilep) ++ { ++ CSetTreeNodeSideEffect( TreeDecl ); ++ CSetTreeNodeVolatile( TreeDecl ); ++ } ++ ++ /* If a type has volatile components, it should be stored in memory. ++ Otherwise, the fact that those components are volatile ++ will be ignored, and would even crash the compiler. */ ++ if ( CIsTreeTypeFieldsVolatile( CTreeType( TreeDecl ))) ++ { ++ c_mark_addressable ( TreeDecl ); ++ } ++ ++ return( TreeDecl ); ++} ++ ++ ++ ++/* Given a parsed parameter declaration, ++ decode it into a PARM_DECL and push that on the current binding level. ++ Also, for the sake of forward parm decls, ++ record the given order of parms in `parm_order'. */ ++ ++void c_push_parm_decl(parm) ++ ++ c_tree_node *parm; ++{ ++ c_tree_node *decl; ++# ifdef LUDO_NO_SKIP ++ int old_immediate_size_expand = c_immediate_size_expand; ++ /* Don't try computing parm sizes now -- wait till fn is called. */ ++ immediate_size_expand = 0; ++ ++ /* The corresponding pop_obstacks is in finish_decl. */ ++ push_obstacks_nochange (); ++# endif ++ ++ decl = c_grokdeclarator( CTreeListValue( CTreeListPurpose(parm)), ++ CTreeListPurpose( CTreeListPurpose(parm)), C_CDECL_PARAM, 0); ++ c_decl_attributes( decl, ++ CTreeListValue( CTreeListValue(parm)), ++ CTreeListPurpose( CTreeListValue(parm))); ++ ++ decl = c_push_decl(decl); ++ ++# ifdef LUDO_NO_SKIP ++ immediate_size_expand = old_immediate_size_expand; ++# endif ++ ++ c_current_binding_level->PARAM_LIST ++ = c_tree_add_head_list( (c_tree_node *)0,decl,c_current_binding_level->PARAM_LIST ); ++ ++ /* Add this decl to the current binding level. */ ++ c_finish_decl(decl, (c_tree_node *)0, (c_tree_node *)0); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Initialize Predefined Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++void c_init_decl_processing() ++{ ++ static int FirstTime = 1; ++ ++# ifdef LUDO_NO_SKIP ++ int wchar_type_size; ++# endif ++ ++ c_tree_node *TreeDecl; ++ c_tree_node *TreeIdent; ++ c_tree_node *EndLink; ++ c_tree_node *array_domain_type; ++ c_tree_node *void_ftype_any; ++ c_tree_node *ptr_ftype_void; ++ c_tree_node *ptr_ftype_ptr; ++ c_tree_node *memcpy_ftype; ++ c_tree_node *memset_ftype; ++ c_tree_node *strlen_ftype; ++ c_tree_node *traditional_ptr_type_node; ++ ++ ++ c_current_binding_level = (c_binding_level *)0; ++ c_current_function_decl = (c_tree_node *)0; ++ c_named_labels = (c_tree_node *)0; ++ ++ c_push_level( 0 ); ++ ++ c_global_binding_level = c_current_binding_level; ++ ++ c_integer_type_node = c_tree_build_signed_type( C_INT_TYPE_SIZE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_ridpointers[(int)RID_INT], ++ c_integer_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ if ( FirstTime ) ++ { ++ FirstTime = 0; ++ /* Define `char', which is like either `signed char' or `unsigned char' ++ but not the same as either. */ ++ ++ if ( c_flag_signed_char ) ++ { ++ c_char_type_node = c_tree_build_signed_type( C_CHAR_TYPE_SIZE ); ++ } ++ else ++ { ++ c_char_type_node = c_tree_build_unsigned_type( C_CHAR_TYPE_SIZE ); ++ } ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("char"), ++ c_char_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ c_long_integer_type_node = c_tree_build_signed_type( C_LONG_TYPE_SIZE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("long int"), ++ c_long_integer_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ c_unsigned_type_node = c_tree_build_unsigned_type( C_INT_TYPE_SIZE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("unsigned int"), ++ c_unsigned_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ c_long_unsigned_type_node = c_tree_build_unsigned_type( C_LONG_TYPE_SIZE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("long unsigned int"), ++ c_long_unsigned_type_node ); ++ ++ c_push_decl( TreeDecl ); ++ ++ c_long_long_integer_type_node = c_tree_build_signed_type( C_LONG_LONG_TYPE_SIZE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("long long int"), ++ c_long_long_integer_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ c_long_long_unsigned_type_node = c_tree_build_unsigned_type( C_LONG_LONG_TYPE_SIZE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("long long unsigned int"), ++ c_long_long_unsigned_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ c_short_integer_type_node = c_tree_build_signed_type( C_SHORT_TYPE_SIZE ); ++ TreeDecl =c_tree_build_decl ( C_TYPE_DECL, ++ c_tree_get_identifier("short int"), ++ c_short_integer_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ c_short_unsigned_type_node = c_tree_build_unsigned_type( C_SHORT_TYPE_SIZE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("short unsigned int"), ++ c_short_unsigned_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ /* `unsigned long' is the standard type for sizeof. ++ Traditionally, use a signed type. ++ Note that stddef.h uses `unsigned long', ++ and this must agree, even of long and int are the same size. */ ++ ++ TreeIdent = c_tree_get_identifier( "long unsigned int" ); ++ c_size_type = CTreeType( CTreeIdentGlobalValue( TreeIdent ) ); ++ ++ if ( c_flag_traditional && CIsTreeNodeUnsigned( c_size_type ) ) ++ { ++ c_size_type = c_get_signed_type( c_size_type ); ++ } ++ ++ TreeIdent = c_tree_get_identifier( "long int" ); ++ c_ptrdiff_type_node = CTreeType( CTreeIdentGlobalValue( TreeIdent ) ); ++ ++ c_integer_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ c_char_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ c_unsigned_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ c_long_unsigned_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ c_long_integer_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ c_long_long_integer_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ c_long_long_unsigned_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ c_short_integer_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ c_short_unsigned_type_node->TYPE.SIZE->COMMON.TYPE = c_size_type; ++ ++ c_error_mark_node = c_tree_add_node( C_ERROR_NODE ); ++ c_error_mark_node->COMMON.TYPE = c_error_mark_node; ++ ++ /* Define both `signed char' and `unsigned char'. */ ++ ++ c_signed_char_type_node = c_tree_build_signed_type( C_CHAR_TYPE_SIZE ); ++ TreeDecl =c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("signed char"), ++ c_signed_char_type_node ); ++ c_push_decl( TreeDecl ); ++ ++ c_unsigned_char_type_node = c_tree_build_unsigned_type( C_CHAR_TYPE_SIZE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("unsigned char"), ++ c_unsigned_char_type_node ); ++ c_push_decl( TreeDecl ); ++ ++# ifdef LUDO_NO_SKIP ++ intQI_type_node = c_tree_build_signed_type(GET_MODE_BITSIZE (QImode)); ++ c_push_decl (c_tree_build_decl ( C_TYPE_DECL, NULL, intQI_type_node)); ++ ++ intHI_type_node = c_tree_build_signed_type(GET_MODE_BITSIZE (HImode)); ++ c_push_decl (c_tree_build_decl ( C_TYPE_DECL, NULL, intHI_type_node)); ++ ++ intSI_type_node = c_tree_build_signed_type(GET_MODE_BITSIZE (SImode)); ++ c_push_decl (c_tree_build_decl ( C_TYPE_DECL, NULL, intSI_type_node)); ++ ++ intDI_type_node = c_tree_build_signed_type(GET_MODE_BITSIZE (DImode)); ++ c_push_decl (c_tree_build_decl ( C_TYPE_DECL, NULL, intDI_type_node)); ++ ++ unsigned_intQI_type_node = c_tree_build_unsigned_type (GET_MODE_BITSIZE (QImode)); ++ c_push_decl (c_tree_build_decl ( C_TYPE_DECL, NULL, unsigned_intQI_type_node)); ++ ++ unsigned_intHI_type_node = c_tree_build_unsigned_type (GET_MODE_BITSIZE (HImode)); ++ c_push_decl (c_tree_build_decl ( C_TYPE_DECL, NULL, unsigned_intHI_type_node)); ++ ++ unsigned_intSI_type_node = c_tree_build_unsigned_type (GET_MODE_BITSIZE (SImode)); ++ c_push_decl (c_tree_build_decl ( C_TYPE_DECL, NULL, unsigned_intSI_type_node)); ++ ++ unsigned_intDI_type_node = c_tree_build_unsigned_type (GET_MODE_BITSIZE (DImode)); ++ c_push_decl (c_tree_build_decl ( C_TYPE_DECL, NULL, unsigned_intDI_type_node)); ++# endif ++ ++ c_float_type_node = c_tree_build_type( C_REAL_TYPE ); ++ c_float_type_node->TYPE.PRECISION = C_FLOAT_TYPE_SIZE; ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_ridpointers[(int) RID_FLOAT], ++ c_float_type_node ); ++ c_push_decl( TreeDecl ); ++ c_layout_type( c_float_type_node); ++ ++ c_double_type_node = c_tree_build_type( C_REAL_TYPE); ++ if ( c_flag_short_double ) ++ { ++ c_double_type_node->TYPE.PRECISION = C_FLOAT_TYPE_SIZE; ++ } ++ else ++ { ++ c_double_type_node->TYPE.PRECISION = C_DOUBLE_TYPE_SIZE; ++ } ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_ridpointers[(int) RID_DOUBLE], ++ c_double_type_node ); ++ c_push_decl( TreeDecl ); ++ c_layout_type( c_double_type_node); ++ ++ c_long_double_type_node = c_tree_build_type( C_REAL_TYPE ); ++ c_long_double_type_node->TYPE.PRECISION = C_LONG_DOUBLE_TYPE_SIZE; ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("long double"), ++ c_long_double_type_node ); ++ c_push_decl( TreeDecl ); ++ c_layout_type(c_long_double_type_node); ++ ++ c_complex_integer_type_node = c_tree_build_type( C_COMPLEX_TYPE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("complex int"), ++ c_complex_integer_type_node ); ++ c_push_decl( TreeDecl ); ++ c_complex_integer_type_node->COMMON.TYPE = c_integer_type_node; ++ c_layout_type(c_complex_integer_type_node); ++ ++ c_complex_float_type_node = c_tree_build_type( C_COMPLEX_TYPE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("complex float"), ++ c_complex_float_type_node ); ++ c_push_decl( TreeDecl ); ++ c_complex_float_type_node->COMMON.TYPE = c_float_type_node; ++ c_layout_type(c_complex_float_type_node); ++ ++ c_complex_double_type_node = c_tree_build_type( C_COMPLEX_TYPE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("complex double"), ++ c_complex_double_type_node ); ++ c_push_decl( TreeDecl ); ++ c_complex_double_type_node->COMMON.TYPE = c_double_type_node; ++ c_layout_type(c_complex_double_type_node); ++ ++ c_complex_long_double_type_node = c_tree_build_type( C_COMPLEX_TYPE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_tree_get_identifier("complex long double"), ++ c_complex_long_double_type_node ); ++ c_push_decl( TreeDecl ); ++ c_complex_long_double_type_node->COMMON.TYPE = c_long_double_type_node; ++ c_layout_type( c_complex_long_double_type_node); ++ ++ c_wchar_type_node = CTreeType( ++ CTreeIdentGlobalValue( c_tree_get_identifier( "int" ))); ++ c_signed_wchar_type_node = c_get_signed_type( c_wchar_type_node); ++ c_unsigned_wchar_type_node = c_get_unsigned_type( c_wchar_type_node); ++ ++ c_integer_zero_node = c_tree_build_int_2( 0, 0 ); ++ c_integer_zero_node->COMMON.TYPE = c_integer_type_node; ++ c_integer_one_node = c_tree_build_int_2( 1, 0 ); ++ c_integer_one_node->COMMON.TYPE = c_integer_type_node; ++ ++ c_boolean_type_node = c_integer_type_node; ++ c_boolean_true_node = c_integer_one_node; ++ c_boolean_false_node = c_integer_zero_node; ++ ++ c_size_zero_node = c_tree_build_int_2( 0, 0 ); ++ c_size_zero_node->COMMON.TYPE = c_size_type; ++ c_size_one_node = c_tree_build_int_2( 1, 0 ); ++ c_size_one_node->COMMON.TYPE = c_size_type; ++ ++ c_void_type_node = c_tree_build_type( C_VOID_TYPE ); ++ TreeDecl = c_tree_build_decl( C_TYPE_DECL, ++ c_ridpointers[(int) RID_VOID], ++ c_void_type_node ); ++ c_push_decl( TreeDecl ); ++ /* Uses integer_zero_node */ ++ c_layout_type( c_void_type_node); ++ /* We are not going to have real types in C with less than byte alignment, ++ so we might as well not have any types that claim to have it. */ ++ CTreeTypeAlign(c_void_type_node) = C_BITS_PER_UNIT; ++ ++ c_null_pointer_node = c_tree_build_int_2( 0, 0 ); ++ c_null_pointer_node->COMMON.TYPE = c_tree_build_pointer_type( c_void_type_node ); ++ c_layout_type( CTreeType( c_null_pointer_node ) ); ++ ++ c_string_type_node = c_tree_build_pointer_type( c_char_type_node ); ++ ++ c_const_string_type_node = c_tree_build_pointer_type( ++ c_tree_build_type_variant( c_char_type_node, 1, 0)); ++ ++ /* Make a type to be the domain of a few array types ++ whose domains don't really matter. ++ 200 is small enough that it always fits in size_t ++ and large enough that it can hold most function names for the ++ initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */ ++ array_domain_type = c_tree_build_index_type( c_tree_build_int_2( 200, 0 ) ); ++ ++ /* make a type for arrays of characters. ++ With luck nothing will ever really depend on the length of this ++ array type. */ ++ c_char_array_type_node ++ = c_tree_build_array_type( c_char_type_node, array_domain_type ); ++ /* Likewise for arrays of ints. */ ++ c_int_array_type_node ++ = c_tree_build_array_type( c_integer_type_node, array_domain_type ); ++ /* This is for wide string constants. */ ++ c_wchar_array_type_node ++ = c_tree_build_array_type(c_wchar_type_node, array_domain_type); ++ ++ c_default_function_type ++ = c_tree_build_function_type(c_integer_type_node, (c_tree_node *)0); ++ ++ c_ptr_type_node = c_tree_build_pointer_type( c_void_type_node); ++ c_const_ptr_type_node ++ = c_tree_build_pointer_type( c_tree_build_type_variant( c_void_type_node, 1, 0)); ++ ++ EndLink = c_tree_add_head_list( (c_tree_node *)0, ++ c_void_type_node, (c_tree_node *)0); ++ ++ void_ftype_any ++ = c_tree_build_function_type(c_void_type_node, NULL); ++ ++ c_float_ftype_float ++ = c_tree_build_function_type(c_float_type_node, ++ c_tree_add_head_list (NULL, c_float_type_node, EndLink)); ++ ++ c_double_ftype_double ++ = c_tree_build_function_type(c_double_type_node, ++ c_tree_add_head_list(NULL, c_double_type_node, EndLink)); ++ ++ c_ldouble_ftype_ldouble ++ = c_tree_build_function_type(c_long_double_type_node, ++ c_tree_add_head_list(NULL, c_long_double_type_node, ++ EndLink)); ++ ++ c_double_ftype_double_double ++ = c_tree_build_function_type(c_double_type_node, ++ c_tree_add_head_list(NULL, c_double_type_node, ++ c_tree_add_head_list(NULL, ++ c_double_type_node, EndLink))); ++ ++ c_int_ftype_int ++ = c_tree_build_function_type(c_integer_type_node, ++ c_tree_add_head_list(NULL, c_integer_type_node, EndLink)); ++ ++ c_long_ftype_long ++ = c_tree_build_function_type(c_long_integer_type_node, ++ c_tree_add_head_list(NULL, ++ c_long_integer_type_node, EndLink)); ++ ++ c_void_ftype_ptr_ptr_int ++ = c_tree_build_function_type(c_void_type_node, ++ c_tree_add_head_list(NULL, c_ptr_type_node, ++ c_tree_add_head_list(NULL, c_ptr_type_node, ++ c_tree_add_head_list(NULL, ++ c_integer_type_node, ++ EndLink)))); ++ ++ c_int_ftype_cptr_cptr_sizet ++ = c_tree_build_function_type(c_integer_type_node, ++ c_tree_add_head_list(NULL, c_const_ptr_type_node, ++ c_tree_add_head_list(NULL, c_const_ptr_type_node, ++ c_tree_add_head_list(NULL, ++ c_size_type, ++ EndLink)))); ++ ++ c_void_ftype_ptr_int_int ++ = c_tree_build_function_type(c_void_type_node, ++ c_tree_add_head_list(NULL, c_ptr_type_node, ++ c_tree_add_head_list(NULL, c_integer_type_node, ++ c_tree_add_head_list(NULL, ++ c_integer_type_node, ++ EndLink)))); ++ ++ c_string_ftype_ptr_ptr /* strcpy prototype */ ++ = c_tree_build_function_type(c_string_type_node, ++ c_tree_add_head_list(NULL, c_string_type_node, ++ c_tree_add_head_list(NULL, ++ c_const_string_type_node, ++ EndLink))); ++ ++ c_int_ftype_string_string /* strcmp prototype */ ++ = c_tree_build_function_type(c_integer_type_node, ++ c_tree_add_head_list(NULL, c_const_string_type_node, ++ c_tree_add_head_list(NULL, ++ c_const_string_type_node, ++ EndLink))); ++ ++ strlen_ftype /* strlen prototype */ ++ = c_tree_build_function_type(c_flag_traditional ? c_integer_type_node : c_size_type, ++ c_tree_add_head_list(NULL, c_const_string_type_node, ++ EndLink)); ++ ++ traditional_ptr_type_node ++ = (c_flag_traditional ? c_string_type_node : c_ptr_type_node); ++ ++ memcpy_ftype /* memcpy prototype */ ++ = c_tree_build_function_type(traditional_ptr_type_node, ++ c_tree_add_head_list(NULL, c_ptr_type_node, ++ c_tree_add_head_list(NULL, c_const_ptr_type_node, ++ c_tree_add_head_list(NULL, ++ c_size_type, ++ EndLink)))); ++ ++ memset_ftype /* memset prototype */ ++ = c_tree_build_function_type(traditional_ptr_type_node, ++ c_tree_add_head_list(NULL, c_ptr_type_node, ++ c_tree_add_head_list(NULL, c_integer_type_node, ++ c_tree_add_head_list(NULL, ++ c_size_type, ++ EndLink)))); ++ ++ ptr_ftype_void = c_tree_build_function_type(c_ptr_type_node, EndLink); ++ ptr_ftype_ptr = c_tree_build_function_type(c_ptr_type_node, ++ c_tree_add_head_list(NULL, c_ptr_type_node, EndLink)); ++ ++# ifdef LUDO_NO_SKIP ++ builtin_function ("__builtin_constant_p", c_default_function_type, ++ BUILT_IN_CONSTANT_P, NULL_PTR); ++ ++ builtin_function ("__builtin_return_address", ++ c_tree_build_function_type(ptr_type_node, ++ c_tree_add_head_list(NULL, ++ unsigned_type_node, ++ EndLink)), ++ BUILT_IN_RETURN_ADDRESS, NULL_PTR); ++ ++ builtin_function ("__builtin_frame_address", ++ c_tree_build_function_type(ptr_type_node, ++ c_tree_add_head_list(NULL, ++ unsigned_type_node, ++ EndLink)), ++ BUILT_IN_FRAME_ADDRESS, NULL_PTR); ++ ++ builtin_function ("__builtin_aggregate_incoming_address", ++ c_tree_build_function_type(ptr_type_node, NULL), ++ BUILT_IN_AGGREGATE_INCOMING_ADDRESS, NULL_PTR); ++ ++ /* Hooks for the DWARF 2 __throw routine. */ ++ builtin_function ("__builtin_unwind_init", ++ c_tree_build_function_type(void_type_node, EndLink), ++ BUILT_IN_UNWIND_INIT, NULL_PTR); ++ builtin_function ("__builtin_fp", ptr_ftype_void, BUILT_IN_FP, NULL_PTR); ++ builtin_function ("__builtin_sp", ptr_ftype_void, BUILT_IN_SP, NULL_PTR); ++ builtin_function ("__builtin_dwarf_fp_regnum", ++ c_tree_build_function_type(unsigned_type_node, EndLink), ++ BUILT_IN_DWARF_FP_REGNUM, NULL_PTR); ++ builtin_function ("__builtin_dwarf_reg_size", int_ftype_int, ++ BUILT_IN_DWARF_REG_SIZE, NULL_PTR); ++ builtin_function ("__builtin_frob_return_addr", ptr_ftype_ptr, ++ BUILT_IN_FROB_RETURN_ADDR, NULL_PTR); ++ builtin_function ("__builtin_extract_return_addr", ptr_ftype_ptr, ++ BUILT_IN_EXTRACT_RETURN_ADDR, NULL_PTR); ++ builtin_function ("__builtin_set_return_addr_reg", ++ c_tree_build_function_type(void_type_node, ++ c_tree_add_head_list(NULL, ++ ptr_type_node, ++ EndLink)), ++ BUILT_IN_SET_RETURN_ADDR_REG, NULL_PTR); ++ builtin_function ("__builtin_eh_stub", ptr_ftype_void, ++ BUILT_IN_EH_STUB, NULL_PTR); ++ builtin_function ++ ("__builtin_set_eh_regs", ++ c_tree_build_function_type(void_type_node, ++ c_tree_add_head_list(NULL, ptr_type_node, ++ c_tree_add_head_list(NULL, ++ type_for_mode (ptr_mode, 0), ++ EndLink))), ++ BUILT_IN_SET_EH_REGS, NULL_PTR); ++ ++ builtin_function ("__builtin_alloca", ++ c_tree_build_function_type(ptr_type_node, ++ c_tree_add_head_list(NULL, ++ sizetype, ++ EndLink)), ++ BUILT_IN_ALLOCA, "alloca"); ++ builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR); ++ /* Define alloca, ffs as builtins. ++ Declare _exit just to mark it as volatile. */ ++ if (! c_flag_no_builtin && !c_flag_no_nonansi_builtin) ++ { ++ temp = builtin_function ("alloca", ++ c_tree_build_function_type(ptr_type_node, ++ c_tree_add_head_list(NULL, ++ c_size_type, ++ EndLink)), ++ BUILT_IN_ALLOCA, NULL_PTR); ++ /* Suppress error if redefined as a non-function. */ ++ DECL_BUILT_IN_NONANSI (temp) = 1; ++ temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR); ++ /* Suppress error if redefined as a non-function. */ ++ DECL_BUILT_IN_NONANSI (temp) = 1; ++ temp = builtin_function ("_exit", void_ftype_any, NOT_BUILT_IN, ++ NULL_PTR); ++ TREE_THIS_VOLATILE (temp) = 1; ++ TREE_SIDE_EFFECTS (temp) = 1; ++ /* Suppress error if redefined as a non-function. */ ++ DECL_BUILT_IN_NONANSI (temp) = 1; ++ } ++ ++ builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR); ++ builtin_function ("__builtin_fabsf", float_ftype_float, BUILT_IN_FABS, ++ NULL_PTR); ++ builtin_function ("__builtin_fabs", double_ftype_double, BUILT_IN_FABS, ++ NULL_PTR); ++ builtin_function ("__builtin_fabsl", ldouble_ftype_ldouble, BUILT_IN_FABS, ++ NULL_PTR); ++ builtin_function ("__builtin_labs", long_ftype_long, BUILT_IN_LABS, ++ NULL_PTR); ++ builtin_function ("__builtin_saveregs", ++ c_tree_build_function_type(ptr_type_node, NULL), ++ BUILT_IN_SAVEREGS, NULL_PTR); ++# endif ++ } ++ ++ c_pedantic_lvalues = c_pedantic; ++ ++# ifdef LUDO_NO_SKIP ++ /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */ ++ declare_function_name (); ++ ++ start_identifier_warnings (); ++ ++ /* Prepare to check format strings against argument lists. */ ++ init_function_format_info (); ++ ++ init_iterators (); ++ ++ incomplete_decl_finalize_hook = finish_incomplete_decl; ++# endif ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Declaration Attributes | ++| | ++\------------------------------------------------------------*/ ++ ++void c_decl_attributes( Node, Attributes, Prefix_attributes ) ++ ++ c_tree_node *Node; ++ c_tree_node *Attributes; ++ c_tree_node *Prefix_attributes; ++{ ++# ifdef LUDO_NO_SKIP ++ c_tree_node *decl = 0; ++ c_tree_node *type; ++ int is_type; ++ c_tree_node *a; ++ ++ if (attrtab_idx == 0) ++ init_attributes (); ++ ++ if ( CTreeNodeFirstCode( node ) == C_DECL_NODE ) ++ { ++ decl = node; ++ type = CTreeType(decl); ++ is_type = CTreeDeclCode(node) == C_TYPE_DECL; ++ } ++ else if ( CTreeNodeFirstCode( node ) == C_TYPE_NODE ) ++ { ++ type = node, is_type = 1; ++ } ++ ++ attributes = c_tree_concat_list(prefix_attributes, attributes); ++ ++ for (a = attributes; a; a = CTreeChain(a)) ++ { ++ c_tree_node *name = CTreeListPurpose(a); ++ c_tree_node *args = CTreeListValue(a); ++ int i; ++ int id; ++ ++# ifdef LUDO_NO_SKIP ++ for (i = 0; i < attrtab_idx; i++) ++ if (attrtab[i].name == name) ++ break; ++# else ++ i = attrtab_idx; ++# endif ++ ++# ifdef LUDO_NO_SKIP ++ if (i == attrtab_idx) ++ { ++ if (! valid_machine_attribute(name, args, decl, type)) ++ { ++ warning ("`%s' attribute directive ignored", CTreeIdentPointer(name)); ++ } ++ else if (decl != 0) ++ type = TREE_TYPE (decl); ++ continue; ++ } ++ else if (attrtab[i].decl_req && decl == 0) ++ { ++ warning ("`%s' attribute does not apply to types", ++ IDENTIFIER_POINTER (name)); ++ continue; ++ } ++ else if (list_length (args) < attrtab[i].min ++ || list_length (args) > attrtab[i].max) ++ { ++ error ("wrong number of arguments specified for `%s' attribute", ++ IDENTIFIER_POINTER (name)); ++ continue; ++ } ++ ++ id = attrtab[i].id; ++ switch (id) ++ { ++ case A_PACKED: ++ if (is_type) ++ TYPE_PACKED (type) = 1; ++ else if (TREE_CODE (decl) == FIELD_DECL) ++ DECL_PACKED (decl) = 1; ++ /* We can't set DECL_PACKED for a VAR_DECL, because the bit is ++ used for DECL_REGISTER. It wouldn't mean anything anyway. */ ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_NOCOMMON: ++ if (TREE_CODE (decl) == VAR_DECL) ++ DECL_COMMON (decl) = 0; ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_COMMON: ++ if (TREE_CODE (decl) == VAR_DECL) ++ DECL_COMMON (decl) = 1; ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_NORETURN: ++ if (TREE_CODE (decl) == FUNCTION_DECL) ++ TREE_THIS_VOLATILE (decl) = 1; ++ else if (TREE_CODE (type) == POINTER_TYPE ++ && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) ++ TREE_TYPE (decl) = type ++ = c_tree_build_pointer_type ++ (build_type_variant (TREE_TYPE (type), ++ TREE_READONLY (TREE_TYPE (type)), 1)); ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_UNUSED: ++ if (is_type) ++ TREE_USED (type) = 1; ++ else if (TREE_CODE (decl) == PARM_DECL ++ || TREE_CODE (decl) == VAR_DECL ++ || TREE_CODE (decl) == FUNCTION_DECL) ++ CSetTreeNodeUsed(decl); ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_CONST: ++ if (TREE_CODE (decl) == FUNCTION_DECL) ++ TREE_READONLY (decl) = 1; ++ else if (TREE_CODE (type) == POINTER_TYPE ++ && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) ++ TREE_TYPE (decl) = type ++ = build_pointer_type ++ (build_type_variant (TREE_TYPE (type), 1, ++ TREE_THIS_VOLATILE (TREE_TYPE (type)))); ++ else ++ warning ( "`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_T_UNION: ++ if (is_type ++ && TREE_CODE (type) == UNION_TYPE ++ && (decl == 0 ++ || (TYPE_FIELDS (type) != 0 ++ && TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type))))) ++ TYPE_TRANSPARENT_UNION (type) = 1; ++ else if (decl != 0 && TREE_CODE (decl) == PARM_DECL ++ && TREE_CODE (type) == UNION_TYPE ++ && TYPE_MODE (type) == DECL_MODE (TYPE_FIELDS (type))) ++ DECL_TRANSPARENT_UNION (decl) = 1; ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_CONSTRUCTOR: ++ if (TREE_CODE (decl) == FUNCTION_DECL ++ && TREE_CODE (type) == FUNCTION_TYPE ++ && decl_function_context (decl) == 0) ++ { ++ DECL_STATIC_CONSTRUCTOR (decl) = 1; ++ CSetTreeNodeUsed(decl); ++ } ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_DESTRUCTOR: ++ if (TREE_CODE (decl) == FUNCTION_DECL ++ && TREE_CODE (type) == FUNCTION_TYPE ++ && decl_function_context (decl) == 0) ++ { ++ DECL_STATIC_DESTRUCTOR (decl) = 1; ++ CSetTreeNodeUsed(decl); ++ } ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ ++ case A_MODE: ++ if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE) ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ else ++ { ++ int j; ++ char *p = IDENTIFIER_POINTER (TREE_VALUE (args)); ++ int len = strlen (p); ++ enum machine_mode mode = VOIDmode; ++ tree typefm; ++ ++ if (len > 4 && p[0] == '_' && p[1] == '_' ++ && p[len - 1] == '_' && p[len - 2] == '_') ++ { ++ char *newp = (char *) alloca (len - 1); ++ ++ strcpy (newp, &p[2]); ++ newp[len - 4] = '\0'; ++ p = newp; ++ } ++ ++ /* Give this decl a type with the specified mode. ++ First check for the special modes. */ ++ if (! strcmp (p, "byte")) ++ mode = byte_mode; ++ else if (!strcmp (p, "word")) ++ mode = word_mode; ++ else if (! strcmp (p, "pointer")) ++ mode = ptr_mode; ++ else ++ for (j = 0; j < NUM_MACHINE_MODES; j++) ++ if (!strcmp (p, GET_MODE_NAME (j))) ++ mode = (enum machine_mode) j; ++ ++ if (mode == VOIDmode) ++ error ("unknown machine mode `%s'", p); ++ else if (0 == (typefm = type_for_mode (mode, ++ TREE_UNSIGNED (type)))) ++ error ("no data type for mode `%s'", p); ++ else ++ { ++ TREE_TYPE (decl) = type = typefm; ++ DECL_SIZE (decl) = 0; ++ c_layout_decl(decl, 0); ++ } ++ } ++ break; ++ ++ case A_SECTION: ++#ifdef ASM_OUTPUT_SECTION_NAME ++ if ((TREE_CODE (decl) == FUNCTION_DECL ++ || TREE_CODE (decl) == VAR_DECL) ++ && TREE_CODE (TREE_VALUE (args)) == STRING_CST) ++ { ++ if (TREE_CODE (decl) == VAR_DECL ++ && current_function_decl != NULL ++ && ! TREE_STATIC (decl)) ++ { ++ error_with_decl (decl, ++ "section attribute cannot be specified for local variables"); ++ /* The decl may have already been given a section attribute from ++ a previous declaration. Ensure they match. */ ++ } ++ else if (DECL_SECTION_NAME (decl) != NULL ++ && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), ++ TREE_STRING_POINTER (TREE_VALUE (args))) != 0) ++ { ++ error_with_decl (node, ++ "section of `%s' conflicts with previous declaration"); ++ } ++ else ++ DECL_SECTION_NAME (decl) = TREE_VALUE (args); ++ } ++ else ++ error_with_decl (node, ++ "section attribute not allowed for `%s'"); ++#else ++ error_with_decl (node, ++ "section attributes are not supported for this target"); ++#endif ++ break; ++ ++ case A_ALIGNED: ++ { ++ tree align_expr ++ = (args ? TREE_VALUE (args) ++ : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); ++ int align; ++ ++ /* Strip any NOPs of any kind. */ ++ while (TREE_CODE (align_expr) == NOP_EXPR ++ || TREE_CODE (align_expr) == CONVERT_EXPR ++ || TREE_CODE (align_expr) == NON_LVALUE_EXPR) ++ align_expr = TREE_OPERAND (align_expr, 0); ++ ++ if (TREE_CODE (align_expr) != INTEGER_CST) ++ { ++ error ("requested alignment is not a constant"); ++ continue; ++ } ++ ++ align = TREE_INT_CST_LOW (align_expr) * BITS_PER_UNIT; ++ ++ if (exact_log2 (align) == -1) ++ error ("requested alignment is not a power of 2"); ++ else if (is_type) ++ TYPE_ALIGN (type) = align; ++ else if (TREE_CODE (decl) != VAR_DECL ++ && TREE_CODE (decl) != FIELD_DECL) ++ { ++ error_with_decl (decl, ++ "alignment may not be specified for `%s'"); ++ } ++ else ++ DECL_ALIGN (decl) = align; ++ } ++ break; ++ ++ case A_FORMAT: ++ { ++ tree format_type = TREE_VALUE (args); ++ tree format_num_expr = TREE_VALUE (TREE_CHAIN (args)); ++ tree first_arg_num_expr ++ = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (args))); ++ int format_num; ++ int first_arg_num; ++ int is_scan; ++ tree argument; ++ int arg_num; ++ ++ if (TREE_CODE (decl) != FUNCTION_DECL) ++ { ++ error_with_decl (decl, ++ "argument format specified for non-function `%s'"); ++ continue; ++ } ++ ++ if (TREE_CODE (format_type) == IDENTIFIER_NODE ++ && (!strcmp (IDENTIFIER_POINTER (format_type), "printf") ++ || !strcmp (IDENTIFIER_POINTER (format_type), ++ "__printf__"))) ++ is_scan = 0; ++ else if (TREE_CODE (format_type) == IDENTIFIER_NODE ++ && (!strcmp (IDENTIFIER_POINTER (format_type), "scanf") ++ || !strcmp (IDENTIFIER_POINTER (format_type), ++ "__scanf__"))) ++ is_scan = 1; ++ else if (TREE_CODE (format_type) == IDENTIFIER_NODE) ++ { ++ error ("`%s' is an unrecognized format function type", ++ IDENTIFIER_POINTER (format_type)); ++ continue; ++ } ++ else ++ { ++ error ("unrecognized format specifier"); ++ continue; ++ } ++ ++ /* Strip any conversions from the string index and first arg number ++ and verify they are constants. */ ++ while (TREE_CODE (format_num_expr) == NOP_EXPR ++ || TREE_CODE (format_num_expr) == CONVERT_EXPR ++ || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR) ++ format_num_expr = TREE_OPERAND (format_num_expr, 0); ++ ++ while (TREE_CODE (first_arg_num_expr) == NOP_EXPR ++ || TREE_CODE (first_arg_num_expr) == CONVERT_EXPR ++ || TREE_CODE (first_arg_num_expr) == NON_LVALUE_EXPR) ++ first_arg_num_expr = TREE_OPERAND (first_arg_num_expr, 0); ++ ++ if (TREE_CODE (format_num_expr) != INTEGER_CST ++ || TREE_CODE (first_arg_num_expr) != INTEGER_CST) ++ { ++ error ("format string has non-constant operand number"); ++ continue; ++ } ++ ++ format_num = TREE_INT_CST_LOW (format_num_expr); ++ first_arg_num = TREE_INT_CST_LOW (first_arg_num_expr); ++ if (first_arg_num != 0 && first_arg_num <= format_num) ++ { ++ error ("format string arg follows the args to be formatted"); ++ continue; ++ } ++ ++ /* If a parameter list is specified, verify that the format_num ++ argument is actually a string, in case the format attribute ++ is in error. */ ++ argument = TYPE_ARG_TYPES (type); ++ if (argument) ++ { ++ for (arg_num = 1; ; ++arg_num) ++ { ++ if (argument == 0 || arg_num == format_num) ++ break; ++ argument = TREE_CHAIN (argument); ++ } ++ if (! argument ++ || TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE ++ || (CTreeTypeMainVariant (TREE_TYPE (TREE_VALUE (argument))) ++ != char_type_node)) ++ { ++ error ("format string arg not a string type"); ++ continue; ++ } ++ if (first_arg_num != 0) ++ { ++ /* Verify that first_arg_num points to the last arg, ++ the ... */ ++ while (argument) ++ arg_num++, argument = TREE_CHAIN (argument); ++ if (arg_num != first_arg_num) ++ { ++ error ("args to be formatted is not ..."); ++ continue; ++ } ++ } ++ } ++ ++ record_function_format (DECL_NAME (decl), ++ DECL_ASSEMBLER_NAME (decl), ++ is_scan, format_num, first_arg_num); ++ break; ++ } ++ ++ case A_FORMAT_ARG: ++ { ++ tree format_num_expr = TREE_VALUE (args); ++ int format_num, arg_num; ++ tree argument; ++ ++ if (TREE_CODE (decl) != FUNCTION_DECL) ++ { ++ error_with_decl (decl, ++ "argument format specified for non-function `%s'"); ++ continue; ++ } ++ ++ /* Strip any conversions from the first arg number and verify it ++ is a constant. */ ++ while (TREE_CODE (format_num_expr) == NOP_EXPR ++ || TREE_CODE (format_num_expr) == CONVERT_EXPR ++ || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR) ++ format_num_expr = TREE_OPERAND (format_num_expr, 0); ++ ++ if (TREE_CODE (format_num_expr) != INTEGER_CST) ++ { ++ error ("format string has non-constant operand number"); ++ continue; ++ } ++ ++ format_num = TREE_INT_CST_LOW (format_num_expr); ++ ++ /* If a parameter list is specified, verify that the format_num ++ argument is actually a string, in case the format attribute ++ is in error. */ ++ argument = TYPE_ARG_TYPES (type); ++ if (argument) ++ { ++ for (arg_num = 1; ; ++arg_num) ++ { ++ if (argument == 0 || arg_num == format_num) ++ break; ++ argument = TREE_CHAIN (argument); ++ } ++ if (! argument ++ || TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE ++ || (CTreeTypeMainVariant (TREE_TYPE (TREE_VALUE (argument))) ++ != char_type_node)) ++ { ++ error ("format string arg not a string type"); ++ continue; ++ } ++ } ++ ++ if (TREE_CODE (TREE_TYPE (TREE_TYPE (decl))) != POINTER_TYPE ++ || (CTreeTypeMainVariant (TREE_TYPE (TREE_TYPE (TREE_TYPE (decl)))) ++ != char_type_node)) ++ { ++ error ("function does not return string type"); ++ continue; ++ } ++ ++ record_international_format (DECL_NAME (decl), ++ DECL_ASSEMBLER_NAME (decl), ++ format_num); ++ break; ++ } ++ ++ case A_WEAK: ++ declare_weak (decl); ++ break; ++ ++ case A_ALIAS: ++ if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl)) ++ || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl))) ++ { ++ error_with_decl (decl, ++ "`%s' defined both normally and as an alias"); ++ } ++ else if (decl_function_context (decl) == 0) ++ { ++ tree id = get_identifier (TREE_STRING_POINTER ++ (TREE_VALUE (args))); ++ if (TREE_CODE (decl) == FUNCTION_DECL) ++ DECL_INITIAL (decl) = error_mark_node; ++ else ++ DECL_EXTERNAL (decl) = 0; ++ assemble_alias (decl, id); ++ } ++ else ++ warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); ++ break; ++ } ++# endif ++ } ++# endif ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Grant Fiel Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++/* Process the specs, declarator (NULL if omitted) and width (NULL if omitted) ++ of a structure component, returning a FIELD_DECL node. ++ WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. ++ ++ This is done during the parsing of the struct declaration. ++ The FIELD_DECL nodes are chained together and the lot of them ++ are ultimately passed to `build_struct' to make the RECORD_TYPE node. */ ++ ++c_tree_node *c_grokfield( Filename, Line, Declarator, Declspecs, Width) ++ ++ char *Filename; ++ int Line; ++ c_tree_node *Declarator; ++ c_tree_node *Declspecs; ++ c_tree_node *Width; ++{ ++ c_tree_node *Value; ++ ++ Value = c_grokdeclarator( Declarator, Declspecs, ++ ( Width != NULL ) ? C_CDECL_BIT_FIELD : C_CDECL_FIELD, 0 ); ++ ++ c_finish_decl( Value, NULL, NULL); ++ Value->DECL.INITIAL = Width; ++ ++# ifdef LUDO_NO_SKIP ++ c_maybe_objc_check_decl(value); ++# endif ++ return Value; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Grant Check Type Name | ++| | ++\------------------------------------------------------------*/ ++ ++/* Decode a "typename", such as "int **", returning a ..._TYPE node. */ ++ ++c_tree_node *c_groktypename( Typename ) ++ ++ c_tree_node *Typename; ++{ ++ if ( CTreeNodeFirstCode( Typename ) == C_LIST_NODE ) ++ { ++ Typename = c_grokdeclarator( CTreeListValue( Typename ), ++ CTreeListPurpose( Typename ), C_CDECL_TYPENAME, 0); ++ } ++ ++ return( Typename ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Start Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_start_decl( Declarator, Declspecs, Initialized, Attributes, ++ Prefix_attributes ) ++ c_tree_node *Declarator; ++ c_tree_node *Declspecs; ++ int Initialized; ++ c_tree_node *Attributes; ++ c_tree_node *Prefix_attributes; ++{ ++ c_tree_node *TreeDecl; ++ c_tree_node *TreeType; ++ c_tree_node *TreeTypeSize; ++ c_tree_node *TreeNode; ++ int Init_written; ++ ++ Init_written = Initialized; ++ TreeDecl = c_grokdeclarator( Declarator, Declspecs, C_CDECL_NORMAL, Initialized); ++ ++ if (c_warn_main && !strcmp( CTreeIdentPointer( Declarator ), "main" ) ) ++ { ++ warning_with_decl( TreeDecl, "`%s' is usually a function"); ++ } ++ ++ if ( Initialized ) ++ { ++ /* Is it valid for this decl to have an initializer at all? ++ If not, set INITIALIZED to zero, which will indirectly ++ tell `finish_decl' to ignore the initializer once it is parsed. */ ++ switch ( CTreeDeclCode( TreeDecl ) ) ++ { ++ case C_TYPE_DECL: ++ /* typedef foo = bar means give foo the same type as bar. ++ We haven't parsed bar yet, so `finish_decl' will fix that up. ++ Any other case of an initialization in a TYPE_DECL is an error. */ ++ if ( c_pedantic || c_tree_get_list_length( Declspecs ) > 1) ++ { ++ error( "typedef `%s' is initialized", ++ CTreeIdentPointer( CTreeDeclName( TreeDecl ) ) ); ++ Initialized = 0; ++ } ++ break; ++ ++ case C_FUNCTION_DECL: ++ error( "function `%s' is initialized like a variable", ++ CTreeIdentPointer( CTreeDeclName( TreeDecl ) ) ); ++ Initialized = 0; ++ break; ++ ++ case C_PARAM_DECL: ++ /* DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE. */ ++ error( "parameter `%s' is initialized", ++ CTreeIdentPointer( CTreeDeclName( TreeDecl ) ) ); ++ Initialized = 0; ++ break; ++ ++ default: ++ /* Don't allow initializations for incomplete types ++ except for arrays which might be completed by the initialization. */ ++ ++ TreeType = CTreeType( TreeDecl ); ++ TreeTypeSize = CTreeTypeSize( TreeType ); ++ ++ if ( CTreeTypeSize( TreeType ) != 0) ++ { ++ /* A complete type is ok if size is fixed. */ ++ if ( ( CTreeNodeFirstCode( TreeTypeSize ) != C_INT_CST_NODE ) ++ || CIsTreeDeclVarSize( TreeDecl ) ) ++ { ++ error ("variable-sized object may not be initialized"); ++ Initialized = 0; ++ } ++ } ++ else if ( CTreeTypeCode( TreeType ) != C_ARRAY_TYPE ) ++ { ++ error ("variable `%s' has initializer but incomplete type", ++ CTreeIdentPointer( CTreeDeclName( TreeDecl ) ) ); ++ Initialized = 0; ++ } ++ else if ( CTreeTypeSize( CTreeType( TreeType ) ) == 0 ) ++ { ++ error ("elements of array `%s' have incomplete type", ++ CTreeIdentPointer( CTreeDeclName( TreeDecl ) ) ); ++ Initialized = 0; ++ } ++ ++ break; ++ } ++ } ++ ++ if ( Initialized ) ++ { ++ CClearTreeNodeExternal( TreeDecl ); ++ ++ if ( c_current_binding_level == c_global_binding_level) ++ { ++ CSetTreeNodeStatic( TreeDecl ); ++ } ++ ++ /* Tell `c_push_decl' this is an Initialized decl ++ even though we don't yet have the initializer expression. ++ Also tell `finish_decl' it may store the real initializer. */ ++ ++ TreeDecl->DECL.INITIAL = c_error_mark_node; ++ } ++ ++ /* ANSI specifies that a tentative definition which is not merged with ++ a non-tentative definition behaves exactly like a definition with an ++ initializer equal to zero. (Section 3.7.2) ++ -fno-common gives strict ANSI behavior. Usually you don't want it. ++ This matters only for variables with external linkage. */ ++ if ( ! c_flag_no_common || ! CIsTreeNodePublic( TreeDecl ) ) ++ { ++ CSetTreeDeclCommon( TreeDecl ); ++ } ++ ++ /* Set attributes here so if duplicate decl, will have proper attributes. */ ++ c_decl_attributes( TreeDecl, Attributes, Prefix_attributes ); ++ ++ /* Add this decl to the current binding level. ++ TEM may equal DECL or it may be a previous decl of the same name. */ ++ TreeNode = c_push_decl( TreeDecl ); ++ ++ /* For a local variable, define the RTL now. */ ++# ifdef LUDO_NO_SKIP ++ if ( c_current_binding_level != c_global_binding_level ++ /* But not if this is a duplicate decl ++ and we preserved the rtl from the previous one ++ (which may or may not happen). */ ++ && DECL_RTL (tem) == 0) ++ { ++ if (TYPE_SIZE (TREE_TYPE (tem)) != 0) ++ expand_decl (tem); ++ else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE ++ && DECL_INITIAL (tem) != 0) ++ expand_decl (tem); ++ } ++# endif ++ ++ return( TreeNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Finish Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++void c_finish_decl( decl, init, asmspec_tree) ++ ++ c_tree_node *decl; ++ c_tree_node *init; ++ c_tree_node *asmspec_tree; ++{ ++ c_tree_node *type; ++ int was_incomplete; ++ char *asmspec = 0; ++ ++# ifdef LUDO_NO_SKIP ++ int temporary = allocation_temporary_p (); ++# endif ++ ++ type = CTreeType( decl ); ++ ++ was_incomplete = ( CTreeDeclSize(decl) == (c_tree_node *)0); ++ /* If a name was specified, get the string. */ ++ if (asmspec_tree) ++ { ++ asmspec = CTreeStringPointer(asmspec_tree); ++ } ++ ++ /* If `start_decl' didn't like having an initialization, ignore it now. */ ++ if ((init != (c_tree_node *)0) && ++ (CTreeDeclInitial(decl) == (c_tree_node *)0)) ++ { ++ init = (c_tree_node *)0; ++ } ++ ++ /* Don't crash if parm is initialized. */ ++ if ( CTreeDeclCode(decl) == C_PARAM_DECL) ++ { ++ init = (c_tree_node *)0; ++ } ++ ++ if (CIsTreeDeclIterator(decl)) ++ { ++ if (init == 0) ++ { ++ error_with_decl (decl, "iterator has no initial value"); ++ } ++ else ++ { ++# ifdef LUDO_NO_SKIP ++ init = save_expr (init); ++# endif ++ } ++ } ++ ++ if (init != (c_tree_node *)0 ) ++ { ++ if ( CTreeDeclCode(decl) != C_TYPE_DECL) ++ { ++ c_store_init_value( decl, init ); ++ } ++ else ++ { ++ /* typedef foo = bar; store the type of bar as the type of foo. */ ++ decl->COMMON.TYPE = CTreeType( init->COMMON.TYPE ); ++ decl->DECL.INITIAL = (c_tree_node *)0; ++ init->DECL.INITIAL = (c_tree_node *)0; ++ } ++ } ++ ++ /* Pop back to the obstack that is current for this binding level. ++ This is because MAXINDEX, rtl, etc. to be made below ++ must go in the permanent obstack. But don't discard the ++ temporary data yet. */ ++# ifdef LUDO_NO_SKIP ++ pop_obstacks (); ++# endif ++ ++ /* Deduce size of array from initialization, if not already known */ ++ ++ if ( CTreeTypeCode(type) == C_ARRAY_TYPE ++ && CTreeTypeValues(type) == 0 ++ && CTreeDeclCode(decl) != C_TYPE_DECL) ++ { ++ int do_default ++ = ( CIsTreeNodeStatic(decl) ++ /* Even if pedantic, an external linkage array ++ may have incomplete type at first. */ ++ ? c_pedantic && ! CIsTreeNodePublic(decl) ++ : ! CIsTreeDeclExternal(decl)); ++ int failure ++ = c_complete_array_type(type, CTreeDeclInitial(decl), do_default); ++ ++ /* Get the completed type made by complete_array_type. */ ++ type = CTreeType(decl); ++ ++ if (failure == 1) ++ { ++ error_with_decl (decl, "initializer fails to determine size of `%s'"); ++ } ++ ++ if (failure == 2) ++ { ++ if (do_default) ++ { ++ error_with_decl (decl, "array size missing in `%s'"); ++ } ++ /* If a `static' var's size isn't known, ++ make it extern as well as static, so it does not get ++ allocated. ++ If it is not `static', then do not mark extern; ++ finish_incomplete_decl will give it a default size ++ and it will get allocated. */ ++ else if (!c_pedantic && CIsTreeNodeStatic(decl) && ! CIsTreeNodePublic(decl)) ++ { ++ CSetTreeDeclExternal( decl ); ++ } ++ } ++ ++ /* TYPE_MAX_VALUE is always one less than the number of elements ++ in the array, because we start counting at zero. Therefore, ++ warn only if the value is less than zero. */ ++ if (c_pedantic && CTreeTypeValues(type) != 0 ++ && c_tree_is_int_cst_sgn( CTreeTypeMaxValue( CTreeTypeValues(type))) < 0) ++ { ++ error_with_decl (decl, "zero or negative size array `%s'"); ++ } ++ ++ c_layout_decl(decl, 0); ++ } ++ ++ if ( CTreeDeclCode( decl ) == C_VAR_DECL ) ++ { ++ if ( CTreeDeclSize(decl) == 0 ++ && CTreeTypeSize( CTreeType(decl)) != 0) ++ { ++ c_layout_decl(decl, 0); ++ } ++ ++ if ( CTreeDeclSize(decl) == 0 ++ && ( CIsTreeNodeStatic(decl) ++ ? ++ /* A static variable with an incomplete type ++ is an error if it is initialized. ++ Also if it is not file scope. ++ Otherwise, let it through, but if it is not `extern' ++ then it may cause an error message later. */ ++ /* A duplicate_decls call could have changed an extern ++ declaration into a file scope one. This can be detected ++ by TREE_ASM_WRITTEN being set. */ ++ ( CTreeDeclInitial(decl) != 0 ++ || (CTreeDeclContext(decl) != 0 && ! CIsTreeNodeAsmWritten(decl))) ++ : ++ /* An automatic variable with an incomplete type ++ is an error. */ ++ ! CIsTreeDeclExternal(decl))) ++ { ++ error_with_decl (decl, "storage size of `%s' isn't known"); ++ CTreeType(decl) = c_error_mark_node; ++ } ++ ++ if (( CIsTreeNodeExternal(decl) || CIsTreeNodeStatic(decl)) ++ && CTreeDeclSize(decl) != 0) ++ { ++ if ( CTreeNodeFirstCode( CTreeDeclSize(decl)) == C_INT_CST_NODE) ++ { ++ c_constant_expression_warning( CTreeDeclSize(decl)); ++ } ++ else ++ { ++ error_with_decl (decl, "storage size of `%s' isn't constant"); ++ } ++ } ++ ++ if ( CIsTreeNodeUsed(type)) CSetTreeNodeUsed(decl); ++ } ++ ++ /* If this is a function and an assembler name is specified, it isn't ++ builtin any more. Also reset DECL_RTL so we can give it its new ++ name. */ ++ if ( CTreeDeclCode(decl) == C_FUNCTION_DECL && asmspec) ++ { ++ CClearTreeDeclBuiltIn(decl); ++# ifdef LUDO_NO_SKIP ++ DECL_RTL (decl) = 0; ++# endif ++ } ++ ++ /* Output the assembler code and/or RTL code for variables and functions, ++ unless the type is an undefined structure or union. ++ If not, it will get done when the type is completed. */ ++ ++ if ( CTreeDeclCode(decl) == C_VAR_DECL || CTreeDeclCode(decl) == C_FUNCTION_DECL) ++ { ++# ifdef LUDO_NO_SKIP ++ if ((c_flag_traditional || CIsTreeNodePermanent(decl)) && ++ allocation_temporary_p()) ++ { ++ push_obstacks_nochange (); ++ end_temporary_allocation (); ++ /* This is a no-op in c-lang.c or something real in objc-actions.c. */ ++ maybe_objc_check_decl (decl); ++ rest_of_decl_compilation (decl, asmspec, ++ (DECL_CONTEXT (decl) == 0 ++ || CIsTreeNodeAsmWritten(decl)), ++ 0); ++ pop_obstacks (); ++ } ++ else ++ { ++ /* This is a no-op in c-lang.c or something real in objc-actions.c. */ ++ maybe_objc_check_decl (decl); ++ rest_of_decl_compilation (decl, asmspec, DECL_CONTEXT (decl) == 0, ++ 0); ++ } ++# endif ++ ++ if ( CTreeDeclContext(decl) != 0) ++ { ++ /* Recompute the RTL of a local array now ++ if it used to be an incomplete type. */ ++ if (was_incomplete ++ && ! CIsTreeNodeStatic(decl) && ! CIsTreeDeclExternal(decl)) ++ { ++ /* If we used it already as memory, it must stay in memory. */ ++ if ( CIsTreeNodeUsed( decl ) ) CSetTreeNodeAddressable( decl ); ++ else CClearTreeNodeAddressable( decl ); ++ /* If it's still incomplete now, no init will save it. */ ++ if ( CTreeDeclSize(decl) == 0) CTreeDeclInitial(decl) = 0; ++ ++# ifdef LUDO_NO_SKIP ++ expand_decl (decl); ++# endif ++ } ++ /* Compute and store the initial value. */ ++ ++# ifdef LUDO_NO_SKIP ++ if ( CTreeDeclCode(decl) != C_FUNCTION_DECL) ++ expand_decl_init (decl); ++# endif ++ } ++ } ++ ++ if ( CTreeDeclCode(decl) == C_TYPE_DECL) ++ { ++# ifdef LUDO_NO_SKIP ++ /* This is a no-op in c-lang.c or something real in objc-actions.c. */ ++ maybe_objc_check_decl (decl); ++ rest_of_decl_compilation (decl, NULL_PTR, DECL_CONTEXT (decl) == 0, 0); ++# endif ++ } ++ ++ /* ??? After 2.3, test (init != 0) instead of TREE_CODE. */ ++ /* This test used to include TREE_PERMANENT, however, we have the same ++ problem with initializers at the function level. Such initializers get ++ saved until the end of the function on the momentary_obstack. */ ++# ifdef LUDO_NO_SKIP ++ if (!( CTreeDeclCode(decl) == C_FUNCTION_DECL && CIsTreeDeclInline(decl)) ++ && temporary ++ /* DECL_INITIAL is not defined in PARM_DECLs, since it shares ++ space with DECL_ARG_TYPE. */ ++ && CTreeDeclCode(decl) != C_PARAM_DECL) ++ { ++ /* We need to remember that this array HAD an initialization, ++ but discard the actual temporary nodes, ++ since we can't have a permanent node keep pointing to them. */ ++ /* We make an exception for inline functions, since it's ++ normal for a local extern redeclaration of an inline function ++ to have a copy of the top-level decl's DECL_INLINE. */ ++ if ( CTreeDeclInitial(decl) != 0 && CTreeDeclInitial(decl) != c_error_mark_node) ++ { ++ /* If this is a const variable, then preserve the ++ initializer instead of discarding it so that we can optimize ++ references to it. */ ++ /* This test used to include TREE_STATIC, but this won't be set ++ for function level initializers. */ ++ if ( CIsTreeNodeReadOnly(decl) || CIsTreeDeclIterator(decl)) ++ { ++# ifdef LUDO_NO_SKIP ++ c_preserve_initializer (); ++# endif ++ /* Hack? Set the permanent bit for something that is permanent, ++ but not on the permanent obstack, so as to convince ++ output_constant_def to make its rtl on the permanent ++ obstack. */ ++ CSetTreeNodePermanent( CTreeDeclInitial(decl)); ++ ++ /* The initializer and DECL must have the same (or equivalent ++ types), but if the initializer is a STRING_CST, its type ++ might not be on the right obstack, so copy the type ++ of DECL. */ ++ CTreeType( CTreeDeclInitial(decl)) = type; ++ } ++ else ++ CTreeDeclInitial(decl) = c_error_mark_node; ++ } ++ } ++# endif ++ ++ /* If requested, warn about definitions of large data objects. */ ++ ++ if (c_warn_larger_than ++ && ( CTreeDeclCode(decl) == C_VAR_DECL || ++ CTreeDeclCode(decl) == C_PARAM_DECL) ++ && ! CIsTreeDeclExternal(decl)) ++ { ++ c_tree_node *decl_size = CTreeDeclSize(decl); ++ ++ if (decl_size && CTreeNodeFirstCode(decl_size) == C_INT_CST_NODE) ++ { ++ unsigned units = CTreeIntCstLow(decl_size) / C_BITS_PER_UNIT; ++ ++ if (units > c_larger_than_size) ++ { ++ warning_with_decl(decl, "size of `%s' is %u bytes", units); ++ } ++ } ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* If we have gone back from temporary to permanent allocation, ++ actually free the temporary space that we no longer need. */ ++ if (temporary && !allocation_temporary_p ()) ++ permanent_allocation (0); ++ ++ /* At the end of a declaration, throw away any variable type sizes ++ of types defined inside that declaration. There is no use ++ computing them in the following function definition. */ ++ if (current_binding_level == global_binding_level) ++ c_get_pending_sizes (); ++# endif ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Split Specification and Attributes | ++| | ++\------------------------------------------------------------*/ ++ ++/* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two ++ lists. SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE). ++ ++ The head of the declspec list is stored in DECLSPECS. ++ The head of the attribute list is stored in PREFIX_ATTRIBUTES. ++ ++ Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of ++ the list elements. We drop the containing TREE_LIST nodes and link the ++ resulting attributes together the way decl_attributes expects them. */ ++ ++void c_split_specs_attrs( Specs_attrs, Declspecs, Prefix_attributes ) ++ c_tree_node *Specs_attrs; ++ c_tree_node **Declspecs; ++ c_tree_node **Prefix_attributes; ++{ ++ c_tree_node *t, *s, *a, *next, *specs, *attrs; ++ ++ /* This can happen in c++ (eg: decl: typespec initdecls ';'). */ ++ if ((Specs_attrs != NULL) ++ && CTreeNodeFirstCode(Specs_attrs) != C_LIST_NODE) ++ { ++ *Declspecs = Specs_attrs; ++ *Prefix_attributes = NULL; ++ return; ++ } ++ ++ /* Remember to keep the lists in the same order, element-wise. */ ++ ++ specs = s = NULL; ++ attrs = a = NULL; ++ for (t = Specs_attrs; t; t = next) ++ { ++ next = CTreeChain(t); ++ /* Declspecs have a non-NULL TREE_VALUE. */ ++ if ( CTreeListValue(t) != NULL) ++ { ++ if (specs == NULL) ++ specs = s = t; ++ else ++ { ++ s->COMMON.CHAIN = t; ++ s = t; ++ } ++ } ++ else ++ { ++ if (attrs == NULL) ++ { ++ attrs = a = CTreeListPurpose(t); ++ } ++ else ++ { ++ a->COMMON.CHAIN = t->LIST.PURPOSE; ++ a = t->LIST.PURPOSE; ++ } ++ /* More attrs can be linked here, move A to the end. */ ++ while ( CTreeChain(a) != NULL) ++ a = CTreeChain(a); ++ } ++ } ++ ++ /* Terminate the lists. */ ++ if (s != NULL) ++ s->COMMON.CHAIN = NULL; ++ if (a != NULL) ++ a->COMMON.CHAIN = NULL; ++ ++ /* All done. */ ++ *Declspecs = specs; ++ *Prefix_attributes = attrs; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Layout Record | ++| | ++\------------------------------------------------------------*/ ++ ++ ++/* Lay out a RECORD_TYPE type (a C struct). ++ This means laying out the fields, determining their positions, ++ and computing the overall size and required alignment of the record. ++ Note that if you set the TYPE_ALIGN before calling this ++ then the struct is aligned to at least that boundary. ++ ++ If the type has basetypes, you must call layout_basetypes ++ before calling this function. ++ ++ The return value is a list of static members of the record. ++ They still need to be laid out. */ ++ ++static c_tree_node *c_layout_record(rec) ++ c_tree_node *rec; ++{ ++ c_tree_node *field; ++# ifdef LUDO_NO_SKIP ++ unsigned record_align = MAX(C_BITS_PER_UNIT, CTreeTypeAlign(rec)); ++# endif ++ /* These must be laid out *after* the record is. */ ++ c_tree_node *pending_statics = NULL; ++ /* Record size so far is CONST_SIZE + VAR_SIZE bits, ++ where CONST_SIZE is an integer ++ and VAR_SIZE is a c_tree_node *expression. ++ If VAR_SIZE is null, the size is just CONST_SIZE. ++ Naturally we try to avoid using VAR_SIZE. */ ++ int const_size = 0; ++ c_tree_node *var_size = 0; ++ /* Once we start using VAR_SIZE, this is the maximum alignment ++ that we know VAR_SIZE has. */ ++ int var_align = C_BITS_PER_UNIT; ++ ++#ifdef STRUCTURE_SIZE_BOUNDARY ++ /* Packed structures don't need to have minimum size. */ ++ if (! TYPE_PACKED (rec)) ++ record_align = MAX (record_align, STRUCTURE_SIZE_BOUNDARY); ++#endif ++ ++ for (field = CTreeTypeValues(rec); field; field = CTreeChain(field)) ++ { ++ int known_align = var_size ? var_align : const_size; ++# ifdef LUDO_NO_SKIP ++ int desired_align; ++# endif ++ ++ /* If FIELD is static, then treat it like a separate variable, ++ not really like a structure field. ++ If it is a FUNCTION_DECL, it's a method. ++ In both cases, all we do is lay out the decl, ++ and we do it *after* the record is laid out. */ ++ ++ if ( CTreeDeclCode(field) == C_VAR_DECL) ++ { ++ pending_statics = c_tree_add_head_list(NULL, field, pending_statics); ++ continue; ++ } ++ /* Enumerators and enum types which are local to this class need not ++ be laid out. Likewise for initialized constant fields. */ ++ if ( CTreeDeclCode(field) != C_FIELD_DECL) ++ continue; ++ ++ /* Lay out the field so we know what alignment it needs. ++ For a packed field, use the alignment as specified, ++ disregarding what the type would want. */ ++# ifdef LUDO_NO_SKIP ++ if (DECL_PACKED (field)) ++ desired_align = DECL_ALIGN (field); ++# endif ++ c_layout_decl(field, known_align); ++ ++# ifdef LUDO_NO_SKIP ++ if (! DECL_PACKED (field)) ++ desired_align = DECL_ALIGN (field); ++ /* Some targets (i.e. VMS) limit struct field alignment ++ to a lower boundary than alignment of variables. */ ++#ifdef BIGGEST_FIELD_ALIGNMENT ++ desired_align = MIN (desired_align, BIGGEST_FIELD_ALIGNMENT); ++#endif ++#ifdef ADJUST_FIELD_ALIGN ++ desired_align = ADJUST_FIELD_ALIGN (field, desired_align); ++#endif ++ ++ /* Record must have at least as much alignment as any field. ++ Otherwise, the alignment of the field within the record ++ is meaningless. */ ++ ++#ifndef PCC_BITFIELD_TYPE_MATTERS ++ record_align = MAX (record_align, desired_align); ++#else ++ if (PCC_BITFIELD_TYPE_MATTERS && CTreeType(field) != error_mark_node ++ && DECL_BIT_FIELD_TYPE (field) ++ && ! integer_zerop (CTreeTypeSize(CTreeType(field)))) ++ { ++ /* For these machines, a zero-length field does not ++ affect the alignment of the structure as a whole. ++ It does, however, affect the alignment of the next field ++ within the structure. */ ++ if (! integer_zerop (DECL_SIZE (field))) ++ record_align = MAX (record_align, desired_align); ++ else if (! DECL_PACKED (field)) ++ desired_align = TYPE_ALIGN (CTreeType(field)); ++ /* A named bit field of declared type `int' ++ forces the entire structure to have `int' alignment. */ ++ if (CTreeDeclName(field) != 0) ++ { ++ int type_align = TYPE_ALIGN (CTreeType(field)); ++ if (maximum_field_alignment != 0) ++ type_align = MIN (type_align, maximum_field_alignment); ++ else if (DECL_PACKED (field)) ++ type_align = MIN (type_align, BITS_PER_UNIT); ++ ++ record_align = MAX (record_align, type_align); ++ } ++ } ++ else ++ record_align = MAX (record_align, desired_align); ++#endif ++ ++ /* Does this field automatically have alignment it needs ++ by virtue of the fields that precede it and the record's ++ own alignment? */ ++ ++ if (const_size % desired_align != 0 ++ || (var_align % desired_align != 0 ++ && var_size != 0)) ++ { ++ /* No, we need to skip space before this field. ++ Bump the cumulative size to multiple of field alignment. */ ++ ++ if (var_size == 0 ++ || var_align % desired_align == 0) ++ const_size ++ = CEIL (const_size, desired_align) * desired_align; ++ else ++ { ++ if (const_size > 0) ++ var_size = c_build_size_binop(PLUS_EXPR, var_size, ++ size_int (const_size)); ++ const_size = 0; ++ var_size = round_up (var_size, desired_align); ++ var_align = MIN (var_align, desired_align); ++ } ++ } ++ ++#ifdef PCC_BITFIELD_TYPE_MATTERS ++ if (PCC_BITFIELD_TYPE_MATTERS ++ && TREE_CODE (field) == FIELD_DECL ++ && CTreeType(field) != error_mark_node ++ && DECL_BIT_FIELD_TYPE (field) ++ && !DECL_PACKED (field) ++ && maximum_field_alignment == 0 ++ && !integer_zerop (DECL_SIZE (field))) ++ { ++ int type_align = TYPE_ALIGN (CTreeType(field)); ++ register c_tree_node *dsize = DECL_SIZE (field); ++ int field_size = TREE_INT_CST_LOW (dsize); ++ ++ /* A bit field may not span more units of alignment of its type ++ than its type itself. Advance to next boundary if necessary. */ ++ if (((const_size + field_size + type_align - 1) / type_align ++ - const_size / type_align) ++ > TREE_INT_CST_LOW (CTreeTypeSize(CTreeType(field))) / type_align) ++ const_size = CEIL (const_size, type_align) * type_align; ++ } ++#endif ++ ++/* No existing machine description uses this parameter. ++ So I have made it in this aspect identical to PCC_BITFIELD_TYPE_MATTERS. */ ++#ifdef BITFIELD_NBYTES_LIMITED ++ if (BITFIELD_NBYTES_LIMITED ++ && TREE_CODE (field) == FIELD_DECL ++ && CTreeType(field) != error_mark_node ++ && DECL_BIT_FIELD_TYPE (field) ++ && !DECL_PACKED (field) ++ && !integer_zerop (DECL_SIZE (field))) ++ { ++ int type_align = TYPE_ALIGN (CTreeType(field)); ++ register c_tree_node *dsize = DECL_SIZE (field); ++ int field_size = TREE_INT_CST_LOW (dsize); ++ ++ if (maximum_field_alignment != 0) ++ type_align = MIN (type_align, maximum_field_alignment); ++ /* ??? This test is opposite the test in the containing if ++ statement, so this code is unreachable currently. */ ++ else if (DECL_PACKED (field)) ++ type_align = MIN (type_align, BITS_PER_UNIT); ++ ++ /* A bit field may not span the unit of alignment of its type. ++ Advance to next boundary if necessary. */ ++ /* ??? This code should match the code above for the ++ PCC_BITFIELD_TYPE_MATTERS case. */ ++ if (const_size / type_align ++ != (const_size + field_size - 1) / type_align) ++ const_size = CEIL (const_size, type_align) * type_align; ++ } ++#endif ++ ++ /* Size so far becomes the position of this field. */ ++ ++ if (var_size && const_size) ++ CTreeDeclArguments(field) ++ = c_build_size_binop(PLUS_EXPR, var_size, size_int (const_size)); ++ else if (var_size) ++ CTreeDeclArguments(field) = var_size; ++ else ++# endif ++ { ++ CTreeDeclArguments(field) = c_tree_get_size_int(const_size); ++ ++ /* If this field ended up more aligned than we thought it ++ would be (we approximate this by seeing if its position ++ changed), lay out the field again; perhaps we can use an ++ integral mode for it now. */ ++ if (known_align != const_size) ++ { ++ c_layout_decl(field, const_size); ++ } ++ } ++ ++ /* Now add size of this field to the size of the record. */ ++ ++ { ++ c_tree_node *dsize = CTreeDeclSize(field); ++ ++ /* This can happen when we have an invalid nested struct definition, ++ such as struct j { struct j { int i; } }. The error message is ++ printed in finish_struct. */ ++ if (dsize == 0) ++ /* Do nothing. */; ++ else if ( CTreeNodeFirstCode(dsize) == C_INT_CST_NODE ++ && ! CIsTreeNodeStatic(dsize) ++ && CTreeIntCstHigh(dsize) == 0 ++ && CTreeIntCstLow(dsize) + const_size >= const_size) ++ { ++ /* Use const_size if there's no overflow. */ ++ const_size += CTreeIntCstLow(dsize); ++ } ++ else ++ { ++ if (var_size == 0) ++ { ++ var_size = dsize; ++ } ++ else ++ { ++ var_size = c_build_size_binop( C_PLUS_EXPR, var_size, dsize); ++ } ++ } ++ } ++ } ++ ++ /* Work out the total size and alignment of the record ++ as one expression and store in the record type. ++ Round it up to a multiple of the record's alignment. */ ++ ++ if (var_size == 0) ++ { ++ CTreeTypeSize(rec) = c_tree_get_size_int(const_size); ++ } ++ else ++ { ++ if (const_size) ++ { ++ var_size = c_build_size_binop( C_PLUS_EXPR, var_size, c_tree_get_size_int( const_size ) ); ++ } ++ CTreeTypeSize(rec) = var_size; ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* Determine the desired alignment. */ ++#ifdef ROUND_TYPE_ALIGN ++ TYPE_ALIGN (rec) = ROUND_TYPE_ALIGN (rec, TYPE_ALIGN (rec), record_align); ++#else ++ TYPE_ALIGN (rec) = MAX (TYPE_ALIGN (rec), record_align); ++#endif ++ ++#ifdef ROUND_TYPE_SIZE ++ CTreeTypeSize(rec) = ROUND_CTreeTypeSize(rec, CTreeTypeSize(rec), TYPE_ALIGN (rec)); ++#else ++ /* Round the size up to be a multiple of the required alignment */ ++ CTreeTypeSize(rec) = round_up (CTreeTypeSize(rec), TYPE_ALIGN (rec)); ++#endif ++# endif ++ ++ return pending_statics; ++} ++ ++/* Return the value of VALUE, rounded up to a multiple of DIVISOR. */ ++ ++c_tree_node *c_round_up(value, divisor) ++ c_tree_node *value; ++ int divisor; ++{ ++ c_tree_node *tmp; ++ ++ tmp = c_build_size_binop( C_CEIL_DIV_EXPR, value, c_tree_get_size_int(divisor)); ++ tmp = c_build_size_binop( C_MULT_EXPR, tmp, c_tree_get_size_int(divisor)); ++ ++ return( tmp ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Layout Union | ++| | ++\------------------------------------------------------------*/ ++ ++/* Lay out a UNION_TYPE or QUAL_UNION_TYPE type. ++ Lay out all the fields, set their positions to zero, ++ and compute the size and alignment of the union (maximum of any field). ++ Note that if you set the TYPE_ALIGN before calling this ++ then the union align is aligned to at least that boundary. */ ++ ++static void c_layout_union (rec) ++ c_tree_node *rec; ++{ ++ c_tree_node *field; ++# ifdef LUDO_NO_SKIP ++ unsigned union_align = C_BITS_PER_UNIT; ++# endif ++ ++ /* The size of the union, based on the fields scanned so far, ++ is max (CONST_SIZE, VAR_SIZE). ++ VAR_SIZE may be null; then CONST_SIZE by itself is the size. */ ++ int const_size = 0; ++ c_tree_node *var_size = 0; ++ ++#ifdef STRUCTURE_SIZE_BOUNDARY ++ /* Packed structures don't need to have minimum size. */ ++ if (! TYPE_PACKED (rec)) ++ union_align = STRUCTURE_SIZE_BOUNDARY; ++#endif ++ ++ /* If this is a QUAL_UNION_TYPE, we want to process the fields in ++ the reverse order in building the COND_EXPR that denotes its ++ size. We reverse them again later. */ ++ if ( CTreeTypeCode(rec) == C_QUAL_UNION_TYPE) ++ { ++ CTreeTypeValues(rec) = c_tree_reverse_list( CTreeTypeValues(rec)); ++ } ++ ++ for (field = CTreeTypeValues(rec); field; field = CTreeChain(field)) ++ { ++ /* Enums which are local to this class need not be laid out. */ ++ if ( CTreeDeclCode(field) == C_CONST_DECL || CTreeDeclCode(field) == C_TYPE_DECL) ++ continue; ++ ++ c_layout_decl(field, 0); ++ CTreeDeclArguments(field) = c_tree_get_size_int(0); ++ ++ /* Union must be at least as aligned as any field requires. */ ++ ++# ifdef LUDO_NO_SKIP ++ union_align = MAX (union_align, DECL_ALIGN (field)); ++ ++#ifdef PCC_BITFIELD_TYPE_MATTERS ++ /* On the m88000, a bit field of declare type `int' ++ forces the entire union to have `int' alignment. */ ++ if (PCC_BITFIELD_TYPE_MATTERS && DECL_BIT_FIELD_TYPE (field)) ++ union_align = MAX (union_align, TYPE_ALIGN (CTreeType(field))); ++#endif ++# endif ++ ++ if ( CTreeTypeCode(rec) == C_UNION_TYPE) ++ { ++ /* Set union_size to max (decl_size, union_size). ++ There are more and less general ways to do this. ++ Use only CONST_SIZE unless forced to use VAR_SIZE. */ ++ ++ if ( CTreeNodeFirstCode( CTreeDeclSize(field)) == C_INT_CST_NODE) ++ { ++ const_size ++ = MAX(const_size, CTreeIntCstLow( CTreeDeclSize(field))); ++ } ++ else if (var_size == 0) ++ { ++ var_size = CTreeDeclSize(field); ++ } ++ else ++ { ++ var_size = c_build_size_binop( ++ C_MAX_EXPR, var_size, CTreeDeclSize(field)); ++ } ++ } ++ else if ( CTreeTypeCode(rec) == C_QUAL_UNION_TYPE) ++ { ++ var_size = c_tree_build_ternary_expr( C_COND_EXPR, ++ CTreeDeclInitial( field ), CTreeDeclSize( field ), ++ var_size ? var_size : c_integer_zero_node ); ++ CTreeType( var_size ) = c_size_type; ++ } ++ } ++ ++ if ( CTreeTypeCode(rec) == C_QUAL_UNION_TYPE) ++ { ++ CTreeTypeValues(rec) = c_tree_reverse_list( CTreeTypeValues(rec)); ++ } ++ ++ /* Determine the ultimate size of the union (in bytes). */ ++ if (var_size == NULL) ++ { ++#define CEIL(x,y) (((x) + (y) - 1) / (y)) ++ ++ CTreeTypeSize(rec) = c_tree_get_size_int( ++ CEIL(const_size, C_BITS_PER_UNIT) * C_BITS_PER_UNIT); ++ } ++ else if (const_size == 0) ++ { ++ CTreeTypeSize(rec) = var_size; ++ } ++ else ++ { ++ c_tree_node *tmp_node; ++ ++ tmp_node = c_round_up( c_tree_get_size_int(const_size), C_BITS_PER_UNIT); ++ tmp_node = c_build_size_binop( C_MAX_EXPR, var_size, tmp_node ); ++ CTreeTypeSize(rec) = tmp_node; ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* Determine the desired alignment. */ ++#ifdef ROUND_TYPE_ALIGN ++ TYPE_ALIGN (rec) = ROUND_TYPE_ALIGN (rec, TYPE_ALIGN (rec), union_align); ++#else ++ TYPE_ALIGN (rec) = MAX (TYPE_ALIGN (rec), union_align); ++#endif ++# endif ++ ++#ifdef ROUND_TYPE_SIZE ++ CTreeTypeSize(rec) = ROUND_CTreeTypeSize(rec, CTreeTypeSize(rec), TYPE_ALIGN (rec)); ++#else ++ /* Round the size up to be a multiple of the required alignment */ ++ CTreeTypeSize(rec) = c_round_up( CTreeTypeSize(rec), CTreeTypeAlign(rec)); ++#endif ++} ++ ++ ++/*------------------------------------------------------------\ ++| | ++| Layout Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++/* Set the size, mode and alignment of a ..._DECL node. ++ TYPE_DECL does need this for C++. ++ Note that LABEL_DECL and CONST_DECL nodes do not need this, ++ and FUNCTION_DECL nodes have them set up in a special (and simple) way. ++ Don't call layout_decl for them. ++ ++ KNOWN_ALIGN is the amount of alignment we can assume this ++ decl has with no special effort. It is relevant only for FIELD_DECLs ++ and depends on the previous fields. ++ All that matters about KNOWN_ALIGN is which powers of 2 divide it. ++ If KNOWN_ALIGN is 0, it means, "as much alignment as you like": ++ the record will be aligned to suit. */ ++ ++void c_layout_decl(decl, known_align) ++ c_tree_node *decl; ++ unsigned known_align; ++{ ++ c_tree_node *type = CTreeType(decl); ++ int code = CTreeDeclCode(decl); ++ int spec_size = CTreeDeclFieldSize(decl); ++ ++ if (code == C_CONST_DECL) ++ { ++ return; ++ } ++ ++ if (code != C_VAR_DECL && code != C_PARAM_DECL && code != C_RESULT_DECL ++ && code != C_FIELD_DECL && code != C_TYPE_DECL) ++ { ++ abort (); ++ } ++ ++ if (type == c_error_mark_node) ++ { ++ type = c_void_type_node; ++ spec_size = 0; ++ } ++ ++ /* Usually the size and mode come from the data type without change. */ ++ ++ decl->DECL.MODE = CTreeTypeMode(type); ++ if ( CIsTreeNodeUnsigned( type ) ) ++ { ++ CSetTreeNodeUnsigned( decl ); ++ } ++ ++ if ( CTreeDeclSize(decl) == (c_tree_node *)0) ++ { ++ decl->DECL.SIZE = type->TYPE.SIZE; ++ } ++ ++ if (code == C_FIELD_DECL && CIsTreeDeclBitField(decl)) ++ { ++ if (spec_size == 0 && CTreeDeclName(decl) != 0) ++ { ++ abort (); ++ } ++ ++ /* Size is specified number of bits. */ ++ CTreeDeclSize(decl) = c_tree_get_size_int(spec_size); ++ } ++ /* Force alignment required for the data type. ++ But if the decl itself wants greater alignment, don't override that. ++ Likewise, if the decl is packed, don't override it. */ ++# ifdef LUDO_NO_SKIP ++ else if (DECL_ALIGN (decl) == 0 ++ || (! DECL_PACKED (decl) && TYPE_ALIGN (type) > DECL_ALIGN (decl))) ++ DECL_ALIGN (decl) = TYPE_ALIGN (type); ++# endif ++ ++ /* See if we can use an ordinary integer mode for a bit-field. */ ++ /* Conditions are: a fixed size that is correct for another mode ++ and occupying a complete byte or bytes on proper boundary. */ ++ if (code == C_FIELD_DECL) ++ { ++ CTreeDeclResult(decl) = CIsTreeDeclBitField(decl) ? type : 0; ++# ifdef LUDO_NO_SKIP ++ if ( maximum_field_alignment != 0) ++ DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment); ++ else if (DECL_PACKED (decl)) ++ DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT); ++# endif ++ } ++ ++# ifdef LUDO_NO_SKIP ++ if ( CIsTreeDeclBitField(decl) ++ && CTreeTypeSize(type) != 0 ++ && CTreeNodeFirstCode( CTreeTypeSize(type)) == C_INT_CST_NODE ++ && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT ++ ) ++ { ++ register enum machine_mode xmode ++ = mode_for_size (TREE_INT_CST_LOW (DECL_SIZE (decl)), MODE_INT, 1); ++ ++ if (xmode != BLKmode ++ && known_align % GET_MODE_ALIGNMENT (xmode) == 0) ++ { ++ DECL_ALIGN (decl) = MAX (GET_MODE_ALIGNMENT (xmode), ++ DECL_ALIGN (decl)); ++ DECL_MODE (decl) = xmode; ++ DECL_SIZE (decl) = size_int (GET_MODE_BITSIZE (xmode)); ++ /* This no longer needs to be accessed as a bit field. */ ++ CClearTreeDeclBitField(decl); ++ } ++ } ++ ++ /* Turn off DECL_BIT_FIELD if we won't need it set. */ ++ if (DECL_BIT_FIELD (decl) && TYPE_MODE (type) == BLKmode ++ && known_align % TYPE_ALIGN (type) == 0 ++ && DECL_SIZE (decl) != 0 ++ && (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST ++ || (TREE_INT_CST_LOW (DECL_SIZE (decl)) % BITS_PER_UNIT) == 0) ++ && DECL_ALIGN (decl) >= TYPE_ALIGN (type)) ++ DECL_BIT_FIELD (decl) = 0; ++ ++ /* Evaluate nonconstant size only once, either now or as soon as safe. */ ++ if (CTreeDeclSize(decl) != 0 && CTreeNodeFirstCode(CTreeDeclSize(decl)) != C_INT_CST_NODE) ++ CTreeDeclSize(decl) = variable_size (DECL_SIZE (decl)); ++# endif ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Layout Type | ++| | ++\------------------------------------------------------------*/ ++ ++/* Calculate the mode, size, and alignment for TYPE. ++ For an array type, calculate the element separation as well. ++ Record TYPE on the chain of permanent or temporary types ++ so that dbxout will find out about it. ++ ++ TYPE_SIZE of a type is nonzero if the type has been laid out already. ++ c_layout_type does nothing on such a type. ++ ++ If the type is incomplete, its TYPE_SIZE remains zero. */ ++ ++void c_layout_type(type) ++ c_tree_node *type; ++{ ++# ifdef LUDO_NO_SKIP ++ int old; ++# endif ++ c_tree_node *pending_statics; ++ ++ if (type == 0) ++ { ++ abort (); ++ } ++ ++ /* Do nothing if type has been laid out before. */ ++ if ( CTreeTypeSize(type)) return; ++ ++# ifdef LUDO_NO_SKIP ++ /* Make sure all nodes we allocate are not momentary; ++ they must last past the current statement. */ ++ old = suspend_momentary (); ++ ++ /* Put all our nodes into the same obstack as the type. Also, ++ make expressions saveable (this is a no-op for permanent types). */ ++ ++ push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type)); ++ saveable_allocation (); ++# endif ++ ++ switch ( CTreeTypeCode( type ) ) ++ { ++ case C_LANG_TYPE: ++ /* This kind of type is the responsibility ++ of the language-specific code. */ ++ abort (); ++ ++ case C_BOOLEAN_TYPE: /* Used for Java, Pascal, and Chill. */ ++ if ( CTreeTypePrecision(type) == 0) ++ { ++ type->TYPE.PRECISION = 1; /* default to one byte/boolean. */ ++ } ++ /* ... fall through ... */ ++ ++ case C_INTEGER_TYPE: ++ case C_ENUMERAL_TYPE: ++ case C_CHAR_TYPE: ++ if ( (CTreeNodeFirstCode(TYPE_MIN_VALUE(type)) == C_INT_CST_NODE ) ++ && c_tree_is_int_cst_sgn(TYPE_MIN_VALUE (type)) >= 0) ++ { ++ CSetTreeNodeUnsigned(type); ++ } ++# ifdef LUDO_NO_SKIP ++ type->TYPE.MODE = c_get_smallest_mode_for_size( TYPE_PRECISION(type), MODE_INT ); ++ type->TYPE.SIZE = c_get_size_int( GET_MODE_BITSIZE( CTreeTypeMode(type))); ++# else ++ type->TYPE.SIZE = c_tree_get_size_int( CTreeTypePrecision( type ) ); ++# endif ++ ++ break; ++ ++ case C_REAL_TYPE: ++# ifdef LUDO_NO_SKIP ++ type->TYPE.MODE = c_get_mode_for_size( CTreeTypePrecision(type), MODE_FLOAT, 0); ++ type->TYPE.SIZE = c_get_size_int( GET_MODE_BITSIZE( CTreeTypeMode(type))); ++# else ++ type->TYPE.SIZE = c_tree_get_size_int( CTreeTypePrecision( type ) ); ++# endif ++ break; ++ ++ case C_COMPLEX_TYPE: ++ if ( CIsTreeNodeUnsigned( CTreeType(type))) ++ { ++ CSetTreeNodeUnsigned( type ); ++ } ++# ifdef LUDO_NO_SKIP ++ TYPE_MODE (type) ++ = mode_for_size (2 * TYPE_PRECISION (TREE_TYPE (type)), ++ (TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE ++ ? MODE_COMPLEX_INT : MODE_COMPLEX_FLOAT), ++ 0); ++ TYPE_SIZE (type) = size_int (GET_MODE_BITSIZE (TYPE_MODE (type))); ++# else ++ type->TYPE.SIZE = c_tree_get_size_int( CTreeTypePrecision( type ) ); ++# endif ++ break; ++ ++ case C_VOID_TYPE: ++ CTreeTypeSize(type) = c_size_zero_node; ++ CTreeTypeAlign( type ) = 1; ++# ifdef LUDO_NO_SKIP ++ TYPE_MODE (type) = VOIDmode; ++# endif ++ break; ++ ++ case C_OFFSET_TYPE: ++ CTreeTypeSize(type) = c_tree_get_size_int( C_POINTER_TYPE_SIZE ); ++# ifdef LUDO_NO_SKIP ++ TYPE_MODE (type) = ptr_mode; ++# endif ++ break; ++ ++ case C_FUNCTION_TYPE: ++ case C_METHOD_TYPE: ++# ifdef LUDO_NO_SKIP ++ TYPE_MODE (type) = mode_for_size (2 * POINTER_SIZE, MODE_INT, 0); ++# endif ++ CTreeTypeSize(type) = c_tree_get_size_int( C_POINTER_TYPE_SIZE * 2 ); ++ break; ++ ++ case C_POINTER_TYPE: ++ case C_REFERENCE_TYPE: ++# ifdef LUDO_NO_SKIP ++ TYPE_MODE (type) = ptr_mode; ++# endif ++ CTreeTypeSize(type) = c_tree_get_size_int( C_POINTER_TYPE_SIZE); ++ CSetTreeNodeUnsigned(type); ++ CTreeTypePrecision(type) = C_POINTER_TYPE_SIZE; ++ break; ++ ++ case C_ARRAY_TYPE: ++ { ++ c_tree_node * index = CTreeTypeValues(type); ++ c_tree_node * element = CTreeType(type); ++ ++ c_tree_build_pointer_type(element); ++ ++ /* We need to know both bounds in order to compute the size. */ ++ if (index && CTreeTypeMaxValue(index) && CTreeTypeMinValue(index) ++ && CTreeTypeSize(element)) ++ { ++ c_tree_node * ub = CTreeTypeMaxValue(index); ++ c_tree_node * lb = CTreeTypeMinValue(index); ++ c_tree_node * length; ++ c_tree_node * tmp_node; ++ ++ /* If UB is max (lb - 1, x), remove the MAX_EXPR since the ++ test for negative below covers it. */ ++ if ( CTreeNodeCode(ub) == C_MAX_EXPR ++ && CTreeNodeCode( CTreeExprOperand(ub, 0)) == C_MINUS_EXPR ++ && c_tree_is_integer_onep ( CTreeExprOperand( CTreeExprOperand(ub, 0), 1)) ++ && c_is_operand_equal_p ( CTreeExprOperand( CTreeExprOperand(ub, 0), 0), ++ lb, 0)) ++ ub = CTreeExprOperand(ub, 1); ++ else if ( CTreeNodeCode(ub) == C_MAX_EXPR ++ && CTreeNodeCode( CTreeExprOperand(ub, 1)) == C_MINUS_EXPR ++ && c_tree_is_integer_onep( CTreeExprOperand( CTreeExprOperand(ub, 1), 1)) ++ && c_is_operand_equal_p( CTreeExprOperand( CTreeExprOperand(ub, 1), ++ 0), ++ lb, 0)) ++ ub = CTreeExprOperand(ub, 0); ++ tmp_node = c_build_size_binop( C_MINUS_EXPR, ub, lb ); ++ length = c_build_size_binop( C_PLUS_EXPR, c_size_one_node, tmp_node ); ++ ++ /* If neither bound is a constant and sizetype is signed, make ++ sure the size is never negative. We should really do this ++ if *either* bound is non-constant, but this is the best ++ compromise between C and Ada. */ ++ if (! CIsTreeNodeUnsigned(c_size_type) ++ && CTreeNodeFirstCode( CTreeTypeMinValue(index)) != C_INT_CST_NODE ++ && CTreeNodeFirstCode( CTreeTypeMaxValue(index)) != C_INT_CST_NODE) ++ { ++ length = c_build_size_binop( C_MAX_EXPR, length, c_size_zero_node ); ++ } ++ ++ tmp_node = c_build_size_binop( C_MULT_EXPR, length, CTreeTypeSize( element ) ); ++ CTreeTypeSize(type) = tmp_node; ++ } ++ ++ /* Now round the alignment and size, ++ using machine-dependent criteria if any. */ ++ ++# ifdef LUDO_NO_SKIP ++#ifdef ROUND_TYPE_ALIGN ++ TYPE_ALIGN (type) ++ = ROUND_TYPE_ALIGN (type, TYPE_ALIGN (element), BITS_PER_UNIT); ++#else ++ TYPE_ALIGN (type) = MAX (TYPE_ALIGN (element), BITS_PER_UNIT); ++#endif ++ ++#ifdef ROUND_TYPE_SIZE ++ if (TYPE_SIZE (type) != 0) ++ TYPE_SIZE (type) ++ = ROUND_TYPE_SIZE (type, TYPE_SIZE (type), TYPE_ALIGN (type)); ++#endif ++ ++ TYPE_MODE (type) = BLKmode; ++ if ( CTreeTypeSize(type) != 0 ++ && CTreeNodeFirstCode( CTreeTypeSize(type)) == C_INT_CST_NODE ++ /* BLKmode elements force BLKmode aggregate; ++ else extract/store fields may lose. */ ++ && (TYPE_MODE (TREE_TYPE (type)) != BLKmode ++ || TYPE_NO_FORCE_BLK (TREE_TYPE (type)))) ++ { ++ TYPE_MODE (type) ++ = mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)), ++ MODE_INT, 1); ++ ++ if (STRICT_ALIGNMENT && TYPE_ALIGN (type) < BIGGEST_ALIGNMENT ++ && TYPE_ALIGN (type) < TREE_INT_CST_LOW (TYPE_SIZE (type)) ++ && TYPE_MODE (type) != BLKmode) ++ { ++ TYPE_NO_FORCE_BLK (type) = 1; ++ TYPE_MODE (type) = BLKmode; ++ } ++ } ++# endif ++ break; ++ } ++ ++ case C_RECORD_TYPE: ++ pending_statics = c_layout_record(type); ++# ifdef LUDO_NO_SKIP ++ TYPE_MODE (type) = BLKmode; ++ if ( CTreeNodeFirstCode( CTreeTypeSize(type)) == C_INT_CST_NODE) ++ { ++ c_tree_node * field; ++ enum machine_mode mode = VOIDmode; ++ ++ /* A record which has any BLKmode members must itself be BLKmode; ++ it can't go in a register. ++ Unless the member is BLKmode only because it isn't aligned. */ ++ for (field = CTreeTypeValues(type); field; field = CTreeChain(field)) ++ { ++ int bitpos; ++ ++ if ( CTreeDeclCode(field) != C_FIELD_DECL) continue; ++ ++ if (TYPE_MODE (TREE_TYPE (field)) == BLKmode ++ && ! TYPE_NO_FORCE_BLK (TREE_TYPE (field))) ++ goto record_lose; ++ ++ if ( CTreeNodeFirstCode( CTreeDeclArguments(field)) != C_INT_CST_NODE) ++ { ++ goto record_lose; ++ } ++ ++ bitpos = CTreeIntCstLow( CTreeDeclArguments(field)); ++ ++ /* Must be BLKmode if any field crosses a word boundary, ++ since extract_bit_field can't handle that in registers. */ ++ if (bitpos / C_BITS_PER_WORD ++ != (( CTreeIntCstLow( CTreeDeclSize(field)) + bitpos - 1) ++ / C_BITS_PER_WORD) ++ /* But there is no problem if the field is entire words. */ ++ && CTreeIntCstLow( CTreeDeclSize(field)) % C_BITS_PER_WORD != 0) ++ { ++ goto record_lose; ++ } ++ ++ /* If this field is the whole struct, remember its mode so ++ that, say, we can put a double in a class into a DF ++ register instead of forcing it to live in the stack. */ ++ if (simple_cst_equal (TYPE_SIZE (type), DECL_SIZE (field))) ++ { ++ mode = DECL_MODE (field); ++ } ++ } ++ ++ if (mode != VOIDmode) ++ /* We only have one real field; use its mode. */ ++ TYPE_MODE (type) = mode; ++ else ++ TYPE_MODE (type) ++ = mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)), ++ MODE_INT, 1); ++ ++ /* If structure's known alignment is less than ++ what the scalar mode would need, and it matters, ++ then stick with BLKmode. */ ++ if (STRICT_ALIGNMENT ++ && ! (TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT ++ || (TYPE_ALIGN (type) ++ >= TREE_INT_CST_LOW (TYPE_SIZE (type))))) ++ { ++ if (TYPE_MODE (type) != BLKmode) ++ /* If this is the only reason this type is BLKmode, ++ then don't force containing types to be BLKmode. */ ++ TYPE_NO_FORCE_BLK (type) = 1; ++ TYPE_MODE (type) = BLKmode; ++ } ++ ++ record_lose: ; ++ } ++# endif ++ ++ /* Lay out any static members. This is done now ++ because their type may use the record's type. */ ++ while (pending_statics) ++ { ++ c_layout_decl( CTreeListValue(pending_statics), 0); ++ pending_statics = CTreeChain(pending_statics); ++ } ++ break; ++ ++ case C_UNION_TYPE: ++ case C_QUAL_UNION_TYPE: ++ c_layout_union(type); ++ ++# ifdef LUDO_NO_SKIP ++ TYPE_MODE (type) = BLKmode; ++ if (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST ++ /* If structure's known alignment is less than ++ what the scalar mode would need, and it matters, ++ then stick with BLKmode. */ ++ && (! STRICT_ALIGNMENT ++ || TYPE_ALIGN (type) >= BIGGEST_ALIGNMENT ++ || TYPE_ALIGN (type) >= TREE_INT_CST_LOW (TYPE_SIZE (type)))) ++ { ++ c_tree_node * field; ++ /* A union which has any BLKmode members must itself be BLKmode; ++ it can't go in a register. ++ Unless the member is BLKmode only because it isn't aligned. */ ++ for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) ++ { ++ if (TREE_CODE (field) != FIELD_DECL) ++ continue; ++ ++ if (TYPE_MODE (TREE_TYPE (field)) == BLKmode ++ && ! TYPE_NO_FORCE_BLK (TREE_TYPE (field))) ++ goto union_lose; ++ } ++ ++ TYPE_MODE (type) ++ = mode_for_size (TREE_INT_CST_LOW (TYPE_SIZE (type)), ++ MODE_INT, 1); ++ ++ union_lose: ; ++ } ++# endif ++ break; ++ ++ case C_SET_TYPE: /* Used by Chill and Pascal. */ ++ if ( CTreeNodeFirstCode( CTreeTypeMaxValue( CTreeTypeValues(type))) != C_INT_CST_NODE ++ || CTreeNodeFirstCode( CTreeTypeMinValue( CTreeTypeValues(type))) != C_INT_CST_NODE) ++ abort(); ++ else ++ { ++#ifndef SET_WORD_SIZE ++#define SET_WORD_SIZE BITS_PER_WORD ++#endif ++# ifdef LUDO_NO_SKIP ++ int alignment = set_alignment ? set_alignment : SET_WORD_SIZE; ++# endif ++ int size_in_bits ++ = ( CTreeIntCstLow( CTreeTypeMaxValue( CTreeTypeValues(type))) ++ - CTreeIntCstLow( CTreeTypeMinValue( CTreeTypeValues(type))) + 1); ++# ifdef LUDO_NO_SKIP ++ int rounded_size ++ = ((size_in_bits + alignment - 1) / alignment) * alignment; ++ if (rounded_size > alignment) ++ TYPE_MODE (type) = BLKmode; ++ else ++ TYPE_MODE (type) = mode_for_size (alignment, MODE_INT, 1); ++ TYPE_SIZE (type) = c_tree_get_size_int(rounded_size); ++ TYPE_ALIGN (type) = alignment; ++# endif ++ CTreeTypePrecision(type) = size_in_bits; ++ } ++ break; ++ ++ case C_FILE_TYPE: ++# ifdef LUDO_NO_SKIP ++ /* The size may vary in different languages, so the language front end ++ should fill in the size. */ ++ TYPE_ALIGN (type) = BIGGEST_ALIGNMENT; ++ TYPE_MODE (type) = BLKmode; ++# endif ++ break; ++ ++ default: ++ ++ abort (); ++ } /* end switch */ ++ ++ /* Normally, use the alignment corresponding to the mode chosen. ++ However, where strict alignment is not required, avoid ++ over-aligning structures, since most compilers do not do this ++ alignment. */ ++ ++# ifdef LUDO_NO_SKIP ++ if (TYPE_MODE (type) != BLKmode && TYPE_MODE (type) != VOIDmode ++ && (STRICT_ALIGNMENT ++ || (TREE_CODE (type) != RECORD_TYPE && TREE_CODE (type) != UNION_TYPE ++ && TREE_CODE (type) != QUAL_UNION_TYPE ++ && TREE_CODE (type) != ARRAY_TYPE))) ++ TYPE_ALIGN (type) = GET_MODE_ALIGNMENT (TYPE_MODE (type)); ++ ++ /* Evaluate nonconstant size only once, either now or as soon as safe. */ ++ if (TYPE_SIZE (type) != 0 && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) ++ TYPE_SIZE (type) = variable_size (TYPE_SIZE (type)); ++# endif ++ ++ /* Also layout any other variants of the type. */ ++ if ( CTreeTypeNextVariant(type) ++ || type != CTreeTypeMainVariant(type)) ++ { ++ c_tree_node * variant; ++ /* Record layout info of this variant. */ ++ c_tree_node * size = CTreeTypeSize (type); ++# ifdef LUDO_NO_SKIP ++ int align = TYPE_ALIGN (type); ++ enum machine_mode mode = TYPE_MODE (type); ++# endif ++ ++ /* Copy it into all variants. */ ++ for (variant = CTreeTypeMainVariant(type); ++ variant; ++ variant = CTreeTypeNextVariant(variant)) ++ { ++ CTreeTypeSize(variant) = size; ++# ifdef LUDO_NO_SKIP ++ TYPE_ALIGN (variant) = align; ++ TYPE_MODE (variant) = mode; ++# endif ++ } ++ } ++ ++# ifdef LUDO_NO_SKIP ++ pop_obstacks (); ++ resume_momentary (old); ++# endif ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Param List Tags Warning | ++| | ++\------------------------------------------------------------*/ ++ ++/* At end of parameter list, warn about any struct, union or enum tags ++ defined within. Do so because these types cannot ever become complete. */ ++ ++void c_parmlist_tags_warning() ++{ ++ c_tree_node *elt; ++ static int already; ++ ++ for (elt = c_current_binding_level->TAG_LIST; elt; elt = CTreeChain(elt)) ++ { ++ int code = CTreeTypeCode( CTreeListValue(elt)); ++ /* An anonymous union parm type is meaningful as a GNU extension. ++ So don't warn for that. */ ++ if (code == C_UNION_TYPE && CTreeListPurpose(elt) == 0 && !c_pedantic) continue; ++ if ( CTreeListPurpose(elt) != 0) ++ { ++ warning ("`%s %s' declared inside parameter list", ++ (code == C_RECORD_TYPE ? "struct" ++ : code == C_UNION_TYPE ? "union" ++ : "enum"), ++ CTreeIdentPointer( CTreeListPurpose(elt))); ++ } ++ else ++ { ++ warning ("anonymous %s declared inside parameter list", ++ (code == C_RECORD_TYPE ? "struct" ++ : code == C_UNION_TYPE ? "union" ++ : "enum")); ++ } ++ ++ if (! already) ++ { ++ warning ("its scope is only this definition or declaration,"); ++ warning ("which is probably not what you want."); ++ already = 1; ++ } ++ } ++} ++ ++/* Identify this binding level as a level of parameters. ++ DEFINITION_FLAG is 1 for a definition, 0 for a declaration. ++ But it turns out there is no way to pass the right value for ++ DEFINITION_FLAG, so we ignore it. */ ++ ++void c_declare_parm_level( definition_flag ) ++ int definition_flag; ++{ ++ c_current_binding_level->PARAM_FLAG = 1; ++} ++ ++ ++/* Nonzero if currently making parm declarations. */ ++ ++int c_in_parm_level_p() ++{ ++ return c_current_binding_level->PARAM_FLAG; ++} ++ ++/* Nonzero if the current level needs to have a BLOCK made. */ ++ ++int ++c_kept_level_p () ++{ ++ return ((c_current_binding_level->KEEP_IF_SUBBLOCKS ++ && c_current_binding_level->BLOCK_LIST != 0) ++ || c_current_binding_level->KEEP ++ || c_current_binding_level->NAME_LIST != 0 ++ || (c_current_binding_level->TAG_LIST != 0 ++ && !c_current_binding_level->TAG_TRANSPARENT)); ++} ++ ++/* Given NAME, an IDENTIFIER_NODE, ++ return the structure (or union or enum) definition for that name. ++ Searches binding levels from BINDING_LEVEL up to the global level. ++ If THISLEVEL_ONLY is nonzero, searches only the specified context ++ (but skips any tag-transparent contexts to find one that is ++ meaningful for tags). ++ CODE says which kind of type the caller wants; ++ it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE. ++ If the wrong kind of type is found, an error is reported. */ ++ ++static c_tree_node *c_lookup_tag(code, name, binding_level, thislevel_only) ++ ++ int code; ++ c_binding_level *binding_level; ++ c_tree_node *name; ++ int thislevel_only; ++{ ++ c_binding_level *level; ++ c_tree_node *tail; ++ ++ for (level = binding_level; level; level = level->LEVEL_CHAIN) ++ { ++ for (tail = level->TAG_LIST; tail; tail = CTreeChain(tail)) ++ { ++ if ( CTreeListPurpose(tail) == name) ++ { ++ if ( CTreeTypeCode( CTreeListValue(tail)) != code) ++ { ++ /* Definition isn't the kind we were looking for. */ ++ c_pending_invalid_xref = name; ++ c_pending_invalid_xref_file = c_input_filename; ++ c_pending_invalid_xref_line = c_lineno; ++ } ++ return CTreeListValue(tail); ++ } ++ } ++ ++ if ( thislevel_only && ! level->TAG_TRANSPARENT) ++ { ++ return ( (c_tree_node *)0 ); ++ } ++ } ++ ++ return ( (c_tree_node *)0 ); ++} ++ ++/* Push a definition or a declaration of struct, union or enum tag "name". ++ "type" should be the type node. ++ We assume that the tag "name" is not already defined. ++ ++ Note that the definition may really be just a forward reference. ++ In that case, the TYPE_SIZE will be zero. */ ++ ++void c_push_tag(name, type) ++ ++ c_tree_node *name; ++ c_tree_node *type; ++{ ++ c_binding_level *b; ++ ++ /* Find the proper binding level for this type tag. */ ++ ++ for (b = c_current_binding_level; b->TAG_TRANSPARENT; b = b->LEVEL_CHAIN) ++ { ++ continue; ++ } ++ ++ if (name) ++ { ++ /* Record the identifier as the type's name if it has none. */ ++ ++ if ( CTreeTypeName(type) == (c_tree_node *)0) ++ { ++ CTreeTypeName(type) = name; ++ } ++ } ++ ++ if (b == c_global_binding_level) ++ { ++ b->TAG_LIST = c_tree_add_head_list(name, type, b->TAG_LIST); ++ } ++ else ++ { ++ b->TAG_LIST = c_tree_add_head_list(name, type, b->TAG_LIST); ++ } ++ ++ /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE will be the ++ tagged type we just added to the current binding level. This fake ++ NULL-named TYPE_DECL node helps dwarfout.c to know when it needs ++ to output a representation of a tagged type, and it also gives ++ us a convenient place to record the "scope start" address for the ++ tagged type. */ ++ ++ CTreeChain(type) = c_push_decl( c_tree_build_decl(C_TYPE_DECL, NULL, type)); ++ ++ /* An approximation for now, so we can tell this is a function-scope tag. ++ This will be updated in poplevel. */ ++ CTreeTypeContext(type) = CTreeDeclContext( CTreeChain(type)); ++} ++ ++/* Make sure that the tag NAME is defined *in the current binding level* ++ at least as a forward reference. ++ CODE says which kind of tag NAME ought to be. ++ ++ We also do a push_obstacks_nochange ++ whose matching pop is in finish_struct. */ ++ ++c_tree_node *c_start_struct(code_type, name) ++ ++ int code_type; ++ c_tree_node *name; ++{ ++ /* If there is already a tag defined at this binding level ++ (as a forward reference), just return it. */ ++ ++ c_tree_node *ref = 0; ++ ++# ifdef LUDO_NO_SKIP ++ push_obstacks_nochange (); ++ ++ if (c_current_binding_level == c_global_binding_level) ++ { ++ end_temporary_allocation (); ++ } ++# endif ++ ++ if (name != 0) ++ { ++ ref = c_lookup_tag(code_type, name, c_current_binding_level, 1); ++ } ++ ++ if (ref && CTreeTypeCode(ref) == code_type) ++ { ++# ifdef LUDO_NO_SKIP ++ C_TYPE_BEING_DEFINED(ref) = 1; ++ TYPE_PACKED (ref) = c_flag_pack_struct; ++# endif ++ if ( CTreeTypeValues(ref) != (c_tree_node *)0 ) ++ { ++ error((code_type == C_UNION_TYPE ? "redefinition of `union %s'" ++ : "redefinition of `struct %s'"), ++ CTreeIdentPointer(name)); ++ } ++ ++ return ref; ++ } ++ ++ /* Otherwise create a forward-reference just so the tag is in scope. */ ++ ++ ref = c_tree_build_type( code_type ); ++ ++ c_push_tag(name, ref); ++ ++# ifdef LUDO_NO_SKIP ++ C_TYPE_BEING_DEFINED (ref) = 1; ++ TYPE_PACKED (ref) = flag_pack_struct; ++# endif ++ return ref; ++} ++ ++/* Lay out the type T, and its element type, and so on. */ ++ ++static void c_layout_array_type(t) ++ ++ c_tree_node *t; ++{ ++ if ( CTreeTypeCode( CTreeType(t)) == C_ARRAY_TYPE) ++ { ++ c_layout_array_type( CTreeType(t)); ++ } ++ ++ c_layout_type (t); ++} ++ ++/* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T. ++ FIELDLIST is a chain of FIELD_DECL nodes for the fields. ++ ATTRIBUTES are attributes to be applied to the structure. ++ ++ We also do a pop_obstacks to match the push in start_struct. */ ++ ++c_tree_node *c_finish_struct(t, fieldlist, attributes) ++ ++ c_tree_node *t; ++ c_tree_node *fieldlist; ++ c_tree_node *attributes; ++{ ++ c_tree_node *x; ++# ifdef LUDO_NO_SKIP ++ int old_momentary; ++ int toplevel = c_global_binding_level == c_current_binding_level; ++# endif ++ ++ /* If this type was previously laid out as a forward reference, ++ make sure we lay it out again. */ ++ ++ CTreeTypeSize(t) = 0; ++ ++ c_decl_attributes(t, attributes, NULL); ++ ++ /* Nameless union parm types are useful as GCC extension. */ ++ if (! (CTreeTypeCode(t) == C_UNION_TYPE && ++ CTreeTypeName(t) == 0) && !c_pedantic) ++ { ++ /* Otherwise, warn about any struct or union def. in parmlist. */ ++ if (c_in_parm_level_p ()) ++ { ++ if (c_pedantic) ++ { ++ pedwarn (( CTreeTypeCode(t) == C_UNION_TYPE ? "union defined inside parms" ++ : "structure defined inside parms")); ++ } ++ else if (! c_flag_traditional) ++ { ++ warning (( CTreeTypeCode(t) == C_UNION_TYPE ? "union defined inside parms" ++ : "structure defined inside parms")); ++ } ++ } ++ } ++ ++# ifdef LUDO_NO_SKIP ++ old_momentary = suspend_momentary (); ++# endif ++ ++ if (c_pedantic) ++ { ++ for (x = fieldlist; x; x = CTreeChain(x)) ++ { ++ if ( CTreeDeclName(x) != NULL ) break; ++ } ++ ++ if (x == 0) ++ { ++ pedwarn ("%s has no %smembers", ++ ( CTreeTypeCode(t) == C_UNION_TYPE ? "union" : "structure"), ++ (fieldlist != NULL ? "named " : "")); ++ } ++ } ++ ++ /* Install struct as DECL_CONTEXT of each field decl. ++ Also process specified field sizes. ++ Set DECL_FIELD_SIZE to the specified size, or 0 if none specified. ++ The specified size is found in the DECL_INITIAL. ++ Store 0 there, except for ": 0" fields (so we can find them ++ and delete them, below). */ ++ ++ for (x = fieldlist; x; x = CTreeChain(x)) ++ { ++ CTreeDeclContext(x) = t; ++ ++# ifdef LUDO_NO_SKIP ++ DECL_PACKED (x) |= TYPE_PACKED (t); ++# endif ++ CTreeDeclFieldSize(x) = 0; ++ ++ /* If any field is const, the structure type is pseudo-const. */ ++ if ( CIsTreeNodeReadOnly(x)) ++ { ++ CSetTreeTypeFieldsReadOnly(t); ++ } ++ else ++ { ++ /* A field that is pseudo-const makes the structure likewise. */ ++ tree t1 = CTreeType(x); ++ while (CTreeTypeCode(t1) == C_ARRAY_TYPE) ++ t1 = CTreeType(t1); ++ if ((CTreeTypeCode(t1) == C_RECORD_TYPE || ++ CTreeTypeCode(t1) == C_UNION_TYPE) ++ && CIsTreeTypeFieldsReadOnly(t1)) ++ CSetTreeTypeFieldsReadOnly(t); ++ } ++ ++ /* Any field that is volatile means variables of this type must be ++ treated in some ways as volatile. */ ++ if ( CIsTreeNodeVolatile(x)) ++ CSetTreeTypeFieldsVolatile(t); ++ ++ /* Any field of nominal variable size implies structure is too. */ ++ if ( CIsTreeDeclVarSize (x)) ++ CSetTreeTypeVarSize(t); ++ ++ /* Detect invalid nested redefinition. */ ++ if ( CTreeType(x) == t) ++ { ++ error ("nested redefinition of `%s'", CTreeIdentPointer( CTreeTypeName(t))); ++ } ++ ++ /* Detect invalid bit-field size. */ ++ if ( CTreeDeclInitial(x) ) ++ { ++ CStripNops( CTreeDeclInitial(x)); ++ } ++ ++ if ( CTreeDeclInitial(x)) ++ { ++ if ( CTreeNodeFirstCode( CTreeDeclInitial(x)) == C_INT_CST_NODE) ++ { ++ c_constant_expression_warning (CTreeDeclInitial(x)); ++ } ++ else ++ { ++ error_with_decl (x, "bit-field `%s' width not an integer constant"); ++ CTreeDeclInitial(x) = NULL; ++ } ++ } ++ ++ /* Detect invalid bit-field type. */ ++ if ( CTreeDeclInitial(x) ++ && CTreeTypeCode( CTreeType(x)) != C_INTEGER_TYPE ++ && CTreeTypeCode( CTreeType(x)) != C_ENUMERAL_TYPE) ++ { ++ error_with_decl (x, "bit-field `%s' has invalid type"); ++ CTreeDeclInitial(x) = NULL; ++ } ++ ++ if ( CTreeDeclInitial(x) && c_pedantic ++ && CTreeTypeMainVariant( CTreeType(x)) != c_integer_type_node ++ && CTreeTypeMainVariant( CTreeType(x)) != c_unsigned_type_node ++ /* Accept an enum that's equivalent to int or unsigned int. */ ++ && !( CTreeTypeCode( CTreeType(x)) == C_ENUMERAL_TYPE ++ && ( CTreeTypePrecision( CTreeType(x)) ++ == CTreeTypePrecision(c_integer_type_node)))) ++ { ++ pedwarn_with_decl (x, "bit-field `%s' type invalid in ANSI C"); ++ } ++ ++ /* Detect and ignore out of range field width. */ ++ if ( CTreeDeclInitial(x)) ++ { ++ unsigned int width = CTreeIntCstLow( CTreeDeclInitial(x)); ++ ++ if (c_tree_is_int_cst_sgn( CTreeDeclInitial(x)) < 0) ++ { ++ CTreeDeclInitial(x) = NULL; ++ error_with_decl (x, "negative width in bit-field `%s'"); ++ } ++ else if ( CTreeIntCstHigh(CTreeDeclInitial(x)) != 0 ++ || width > CTreeTypePrecision(CTreeType(x))) ++ { ++ CTreeDeclInitial(x) = NULL; ++ pedwarn_with_decl (x, "width of `%s' exceeds its type"); ++ } ++ else if (width == 0 && CTreeDeclName(x) != 0) ++ { ++ error_with_decl (x, "zero width for bit-field `%s'"); ++ CTreeDeclInitial(x) = NULL; ++ } ++ } ++ ++ /* Process valid field width. */ ++ if ( CTreeDeclInitial(x) != NULL ) ++ { ++ int width = CTreeIntCstLow(CTreeDeclInitial(x)); ++ ++ if ( CTreeTypeCode(CTreeType(x)) == C_ENUMERAL_TYPE ++ && (width < c_min_precision( CTreeTypeMinValue(CTreeType(x)), ++ CIsTreeNodeUnsigned(CTreeType(x))) ++ || width < c_min_precision( CTreeTypeMaxValue(CTreeType(x)), ++ CIsTreeNodeUnsigned(CTreeType(x))))) ++ { ++ c_warning_with_decl(x, "`%s' is narrower than values of its type"); ++ } ++ ++ CTreeDeclFieldSize(x) = width; ++ CSetTreeDeclBitField(x); ++ CSetTreeDeclCBitField(x); ++ CTreeDeclInitial(x) = NULL; ++ ++# ifdef LUDO_NO_SKIP ++ if (width == 0) ++ { ++ /* field size 0 => force desired amount of alignment. */ ++#ifdef EMPTY_FIELD_BOUNDARY ++ DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY); ++#endif ++#ifdef PCC_BITFIELD_TYPE_MATTERS ++ if (PCC_BITFIELD_TYPE_MATTERS) ++ DECL_ALIGN (x) = MAX (DECL_ALIGN (x), ++ TYPE_ALIGN (CTreeType(x))); ++#endif ++ } ++# endif ++ } ++ else if ( CTreeType(x) != c_error_mark_node) ++ { ++# ifdef LUDO_NO_SKIP ++ int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT ++ : TYPE_ALIGN (CTreeType(x))); ++ /* Non-bit-fields are aligned for their type, except packed ++ fields which require only BITS_PER_UNIT alignment. */ ++ DECL_ALIGN (x) = MAX (DECL_ALIGN (x), min_align); ++# endif ++ } ++ } ++ ++ /* Now CTreeDeclInitialis null on all members. */ ++ ++ /* Delete all duplicate fields from the fieldlist */ ++ for (x = fieldlist; x && CTreeChain(x);) ++ { ++ /* Anonymous fields aren't duplicates. */ ++ if (CTreeDeclName(CTreeChain(x)) == NULL) ++ { ++ x = CTreeChain(x); ++ } ++ else ++ { ++ c_tree_node *y = fieldlist; ++ ++ while (1) ++ { ++ if (CTreeDeclName(y) == CTreeDeclName(CTreeChain(x))) break; ++ if (y == x) break; ++ y = CTreeChain(y); ++ } ++ ++ if (CTreeDeclName(y) == CTreeDeclName(CTreeChain(x))) ++ { ++ error_with_decl (CTreeChain(x), "duplicate member `%s'"); ++ CTreeChain(x) = CTreeChain(CTreeChain(x)); ++ } ++ else ++ { ++ x = CTreeChain(x); ++ } ++ } ++ } ++ ++ /* Now we have the nearly final fieldlist. Record it, ++ then lay out the structure or union (including the fields). */ ++ ++ CTreeTypeValues(t) = fieldlist; ++ ++ c_layout_type(t); ++ ++ /* Delete all zero-width bit-fields from the front of the fieldlist */ ++ while (fieldlist ++ && CTreeDeclInitial(fieldlist)) ++ { ++ fieldlist = CTreeChain(fieldlist); ++ } ++ /* Delete all such members from the rest of the fieldlist */ ++ for (x = fieldlist; x;) ++ { ++ if (CTreeChain(x) && CTreeDeclInitial(CTreeChain(x))) ++ { ++ CTreeChain(x) = CTreeChain(CTreeChain(x)); ++ } ++ else ++ { ++ x = CTreeChain(x); ++ } ++ } ++ ++ /* Now we have the truly final field list. ++ Store it in this type and in the variants. */ ++ ++ CTreeTypeValues(t) = fieldlist; ++ ++ /* If there are lots of fields, sort so we can look through them fast. ++ We arbitrarily consider 16 or more elts to be "a lot". */ ++# ifdef LUDO_NO_SKIP ++ { ++ int len = 0; ++ ++ for (x = fieldlist; x; x = CTreeChain(x)) ++ { ++ if (len > 15) break; ++ len += 1; ++ } ++ ++ if (len > 15) ++ { ++ tree *field_array; ++ char *space; ++ ++ len += c_tree_get_list_length (x); ++ /* Use the same allocation policy here that make_node uses, to ++ ensure that this lives as long as the rest of the struct decl. ++ All decls in an inline function need to be saved. */ ++ if (allocation_temporary_p ()) ++ space = savealloc (sizeof (struct lang_type) + len * sizeof (tree)); ++ else ++ space = oballoc (sizeof (struct lang_type) + len * sizeof (tree)); ++ ++ TYPE_LANG_SPECIFIC (t) = (struct lang_type *) space; ++ TYPE_LANG_SPECIFIC (t)->len = len; ++ ++ field_array = &TYPE_LANG_SPECIFIC (t)->elts[0]; ++ len = 0; ++ for (x = fieldlist; x; x = CTreeChain(x)) ++ field_array[len++] = x; ++ ++ qsort (field_array, len, sizeof (tree), field_decl_cmp); ++ } ++ } ++# endif ++ ++ for (x = CTreeTypeMainVariant(t); x; x = CTreeTypeNextVariant(x)) ++ { ++ CTreeTypeValues(x) = CTreeTypeValues(t); ++# ifdef LUDO_NO_SKIP ++ TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t); ++ TYPE_ALIGN (x) = TYPE_ALIGN (t); ++# endif ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* If this was supposed to be a transparent union, but we can't ++ make it one, warn and turn off the flag. */ ++ if ( CTreeTypeCode(t) == C_UNION_TYPE ++ && TYPE_TRANSPARENT_UNION (t) ++ && CTreeTypeMode(t) != CTreeDeclMode( CTreeTypeValues(t))) ++ { ++ TYPE_TRANSPARENT_UNION (t) = 0; ++ warning ("union cannot be made transparent"); ++ } ++# endif ++ ++ /* If this structure or union completes the type of any previous ++ variable declaration, lay it out and output its rtl. */ ++ ++ if (c_current_binding_level->N_INCOMPLETE != 0) ++ { ++ c_tree_node *decl; ++ ++ for (decl = c_current_binding_level->NAME_LIST; decl; decl = CTreeChain(decl)) ++ { ++ if ( ( CTreeType(decl) == t ) && ++ ( CTreeDeclCode(decl) != C_TYPE_DECL ) ) ++ { ++ c_layout_decl(decl, 0); ++ /* This is a no-op in c-lang.c or something real in objc-actions.c. */ ++# ifdef LUDO_NO_SKIP ++ maybe_objc_check_decl (decl); ++ rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0); ++ if (! toplevel) ++ { ++ expand_decl (decl); ++ } ++# endif ++ --c_current_binding_level->N_INCOMPLETE; ++ } ++ else if (CTreeTypeSize(CTreeType(decl)) == 0 ++ && CTreeTypeCode(CTreeType(decl)) == C_ARRAY_TYPE) ++ { ++ c_tree_node *element = CTreeType(decl); ++ ++ while ( CTreeTypeCode(element) == C_ARRAY_TYPE) ++ { ++ element = CTreeType(element); ++ } ++ ++ if (element == t) ++ { ++ c_layout_array_type(CTreeType(decl)); ++ } ++ } ++ } ++ } ++ ++# ifdef LUDO_NO_SKIP ++ resume_momentary (old_momentary); ++ ++ /* Finish debugging output for this type. */ ++ rest_of_type_compilation (t, toplevel); ++ ++ /* The matching push is in start_struct. */ ++ pop_obstacks (); ++# endif ++ ++ return t; ++} ++ ++/* Get the struct, enum or union (CODE says which) with tag NAME. ++ Define the tag as a forward-reference if it is not defined. */ ++ ++c_tree_node *c_xref_tag(code, name) ++ ++ int code; ++ c_tree_node *name; ++{ ++# ifdef LUDO_NO_SKIP ++ int temporary = allocation_temporary_p (); ++# endif ++ ++ /* If a cross reference is requested, look up the type ++ already defined for this tag and return it. */ ++ ++ c_tree_node *ref = c_lookup_tag(code, name, c_current_binding_level, 0); ++ /* Even if this is the wrong type of tag, return what we found. ++ There will be an error message anyway, from pending_xref_error. ++ If we create an empty xref just for an invalid use of the type, ++ the main result is to create lots of superfluous error messages. */ ++ if (ref) ++ { ++ return ref; ++ } ++ ++# ifdef LUDO_NO_SKIP ++ push_obstacks_nochange (); ++ ++ if (c_current_binding_level == c_global_binding_level && temporary) ++ { ++ end_temporary_allocation (); ++ } ++# endif ++ ++ /* If no such tag is yet defined, create a forward-reference node ++ and record it as the "definition". ++ When a real declaration of this type is found, ++ the forward-reference will be altered into a real type. */ ++ ++ ref = c_tree_build_type(code); ++ ++ if (code == C_ENUMERAL_TYPE) ++ { ++ /* (In ANSI, Enums can be referred to only if already defined.) */ ++ if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids forward references to `enum' types"); ++ } ++ /* Give the type a default layout like unsigned int ++ to avoid crashing if it does not get defined. */ ++ CTreeTypeMode(ref) = CTreeTypeMode(c_unsigned_type_node); ++# ifdef LUDO_NO_SKIP ++ TYPE_ALIGN (ref) = TYPE_ALIGN (c_unsigned_type_node); ++# endif ++ CSetTreeNodeUnsigned( ref ); ++ CTreeTypePrecision(ref) = CTreeTypePrecision( c_unsigned_type_node); ++ CTreeTypeMinValue(ref) = CTreeTypeMinValue( c_unsigned_type_node); ++ CTreeTypeMaxValue(ref) = CTreeTypeMaxValue( c_unsigned_type_node); ++ } ++ ++ c_push_tag(name, ref); ++ ++# ifdef LUDO_NO_SKIP ++ pop_obstacks (); ++# endif ++ ++ return ref; ++} ++ ++ ++/* Given a type, find the tag that was defined for it and return the tag name. ++ Otherwise return 0. */ ++ ++static c_tree_node *c_lookup_tag_reverse(type) ++ ++ c_tree_node *type; ++{ ++ c_binding_level *level; ++ ++ for (level = c_current_binding_level; level; level = level->LEVEL_CHAIN) ++ { ++ c_tree_node *tail; ++ ++ for (tail = level->TAG_LIST; tail; tail = CTreeChain(tail)) ++ { ++ if ( CTreeListValue(tail) == type) ++ { ++ return CTreeListPurpose(tail); ++ } ++ } ++ } ++ ++ return NULL; ++} ++ ++ ++/* Called when a declaration is seen that contains no names to declare. ++ If its type is a reference to a structure, union or enum inherited ++ from a containing scope, shadow that tag name for the current scope ++ with a forward reference. ++ If its type defines a new named structure or union ++ or defines an enum, it is valid but we need not do anything here. ++ Otherwise, it is an error. */ ++ ++ ++ ++void c_shadow_tag_warned(declspecs, warned) ++ ++ c_tree_node *declspecs; ++ int warned; ++ /* 1 => we have done a pedwarn. 2 => we have done a warning, but ++ no pedwarn. */ ++{ ++ int found_tag = 0; ++ c_tree_node *link; ++ ++ c_pending_invalid_xref = NULL; ++ ++ for (link = declspecs; link; link = CTreeChain(link)) ++ { ++ c_tree_node *value = CTreeListValue(link); ++ int code = CTreeTypeCode(value); ++ ++ if (code == C_RECORD_TYPE || code == C_UNION_TYPE || code == C_ENUMERAL_TYPE) ++ /* Used to test also that CTreeTypeSize(value) != 0. ++ That caused warning for `struct foo;' at top level in the file. */ ++ { ++ c_tree_node *name = c_lookup_tag_reverse(value); ++ c_tree_node *t; ++ ++ found_tag++; ++ ++ if (name == 0) ++ { ++ if (warned != 1 && code != C_ENUMERAL_TYPE) ++ /* Empty unnamed enum OK */ ++ { ++ pedwarn ("unnamed struct/union that defines no instances"); ++ warned = 1; ++ } ++ } ++ else ++ { ++ t = c_lookup_tag(code, name, c_current_binding_level, 1); ++ ++ if (t == 0) ++ { ++ t = c_tree_build_type(code); ++ c_push_tag(name, t); ++ } ++ } ++ } ++ else ++ { ++ if (!warned && ! c_in_system_header) ++ { ++ warning ("useless keyword or type name in empty declaration"); ++ warned = 2; ++ } ++ } ++ } ++ ++ if (found_tag > 1) ++ { ++ error ("two types specified in one empty declaration"); ++ } ++ ++ if (warned != 1) ++ { ++ if (found_tag == 0) ++ { ++ pedwarn ("empty declaration"); ++ } ++ } ++} ++ ++void c_shadow_tag(declspecs) ++ ++ c_tree_node *declspecs; ++{ ++ c_shadow_tag_warned(declspecs, 0); ++} ++ ++/* Make a label named NAME in the current function, ++ shadowing silently any that may be inherited from containing functions ++ or containing scopes. ++ ++ Note that valid use, if the label being shadowed ++ comes from another scope in the same function, ++ requires calling declare_nonlocal_label right away. */ ++ ++c_tree_node *c_shadow_label(name) ++ ++ c_tree_node *name; ++{ ++ c_tree_node *decl = CTreeIdentLabelValue(name); ++ ++ if (decl != 0) ++ { ++ c_tree_node *dup; ++ ++ /* Check to make sure that the label hasn't already been declared ++ at this label scope */ ++ for (dup = c_named_labels; dup; dup = CTreeChain(dup)) ++ { ++ if ( CTreeListValue(dup) == decl) ++ { ++ error ("duplicate label declaration `%s'", CTreeIdentPointer(name)); ++ error_with_decl (CTreeListValue(dup), "this is a previous declaration"); ++ /* Just use the previous declaration. */ ++ return c_lookup_label(name); ++ } ++ } ++ ++ c_shadowed_labels = c_tree_add_head_list( NULL, decl, c_shadowed_labels); ++ CTreeIdentLabelValue(name) = decl = NULL; ++ } ++ ++ return c_lookup_label(name); ++} ++ ++ ++/* Get the LABEL_DECL corresponding to identifier ID as a label. ++ Create one if none exists so far for the current function. ++ This function is called for both label definitions and label references. */ ++ ++c_tree_node *c_lookup_label(id) ++ ++ c_tree_node *id; ++{ ++ c_tree_node *decl = CTreeIdentLabelValue(id); ++ ++ if (c_current_function_decl == 0) ++ { ++ error ("label %s referenced outside of any function", CTreeIdentPointer(id)); ++ return 0; ++ } ++ ++ /* Use a label already defined or ref'd with this name. */ ++ if (decl != 0) ++ { ++ /* But not if it is inherited and wasn't declared to be inheritable. */ ++ if ( CTreeDeclContext(decl) != c_current_function_decl ++ && ! CIsTreeNodeCDeclLabel(decl)) ++ { ++ return c_shadow_label(id); ++ } ++ ++ return decl; ++ } ++ ++ decl = c_tree_build_decl( C_LABEL_DECL, id, c_void_type_node); ++ ++ /* Make sure every label has an rtx. */ ++# ifdef LUDO_NO_SKIP ++ label_rtx (decl); ++# endif ++ ++ /* A label not explicitly declared must be local to where it's ref'd. */ ++ CTreeDeclContext(decl) = c_current_function_decl; ++ ++# ifdef LUDO_NO_SKIP ++ CTreeDeclMode(decl) = VOIDmode; ++# endif ++ ++ /* Say where one reference is to the label, ++ for the sake of the error if it is not defined. */ ++ CTreeDeclLineNum(decl) = c_lineno; ++ CTreeDeclFileName(decl) = c_input_filename; ++ ++ CTreeIdentLabelValue(id) = decl; ++ ++ c_named_labels = c_tree_add_head_list( NULL, decl, c_named_labels); ++ ++ return decl; ++} ++ ++/* Define a label, specifying the location in the source file. ++ Return the LABEL_DECL node for the label, if the definition is valid. ++ Otherwise return 0. */ ++ ++c_tree_node *c_define_label(filename, line, name) ++ ++ char *filename; ++ int line; ++ c_tree_node *name; ++{ ++ c_tree_node *decl = c_lookup_label(name); ++ ++ /* If label with this name is known from an outer context, shadow it. */ ++ if (decl != 0 && CTreeDeclContext(decl) != c_current_function_decl) ++ { ++ c_shadowed_labels = c_tree_add_head_list( NULL, decl, c_shadowed_labels); ++ CTreeIdentLabelValue(name) = 0; ++ decl = c_lookup_label(name); ++ } ++ ++ if (CTreeDeclInitial(decl) != 0) ++ { ++ error ("duplicate label `%s'", CTreeIdentPointer(name)); ++ return 0; ++ } ++ else ++ { ++ /* Mark label as having been defined. */ ++ CTreeDeclInitial(decl) = c_error_mark_node; ++ /* Say where in the source. */ ++ CTreeDeclFileName(decl) = filename; ++ CTreeDeclLineNum(decl) = line; ++ ++ return decl; ++ } ++} ++ ++/* Begin compiling the definition of an enumeration type. ++ NAME is its name (or null if anonymous). ++ Returns the type object, as yet incomplete. ++ Also records info about it so that build_enumerator ++ may be used to declare the individual values as they are read. */ ++ ++c_tree_node *c_start_enum(name) ++ ++ c_tree_node *name; ++{ ++ c_tree_node *enumtype = 0; ++ ++ /* If this is the real definition for a previous forward reference, ++ fill in the contents in the same object that used to be the ++ forward reference. */ ++ ++ if (name != 0) ++ { ++ enumtype = c_lookup_tag( C_ENUMERAL_TYPE, name, c_current_binding_level, 1); ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* The corresponding pop_obstacks is in finish_enum. */ ++ push_obstacks_nochange (); ++ /* If these symbols and types are global, make them permanent. */ ++ if (c_current_binding_level == c_global_binding_level) ++ { ++ end_temporary_allocation (); ++ } ++# endif ++ ++ if (enumtype == 0 || CTreeTypeCode(enumtype) != C_ENUMERAL_TYPE) ++ { ++ enumtype = c_tree_build_type(C_ENUMERAL_TYPE); ++ c_push_tag(name, enumtype); ++ } ++ ++# ifdef LUDO_NO_SKIP ++ C_TYPE_BEING_DEFINED (enumtype) = 1; ++# endif ++ ++ if ( CTreeTypeValues(enumtype) != 0) ++ { ++ /* This enum is a named one that has been declared already. */ ++ error("redeclaration of `enum %s'", CTreeIdentPointer(name)); ++ ++ /* Completely replace its old definition. ++ The old enumerators remain defined, however. */ ++ CTreeTypeValues(enumtype) = 0; ++ } ++ ++ c_enum_next_value = c_integer_zero_node; ++ c_enum_overflow = 0; ++ ++# ifdef LUDO_NO_SKIP ++ if (c_flag_short_enums) ++ { ++ TYPE_PACKED (enumtype) = 1; ++ } ++# endif ++ ++ return enumtype; ++} ++ ++/* After processing and defining all the values of an enumeration type, ++ install their decls in the enumeration type and finish it off. ++ ENUMTYPE is the type object, VALUES a list of decl-value pairs, ++ and ATTRIBUTES are the specified attributes. ++ Returns ENUMTYPE. */ ++ ++c_tree_node *c_finish_enum(enumtype, values, attributes) ++ c_tree_node *enumtype; ++ c_tree_node *values; ++ c_tree_node *attributes; ++{ ++ c_tree_node *pair; ++ c_tree_node *tem; ++ c_tree_node *minnode = 0; ++ c_tree_node *maxnode = 0; ++ int lowprec, highprec, precision; ++# ifdef LUDO_NO_SKIP ++ int toplevel = c_global_binding_level == c_current_binding_level; ++# endif ++ ++ if (c_in_parm_level_p ()) ++ { ++ warning ("enum defined inside parms"); ++ } ++ ++ c_decl_attributes(enumtype, attributes, NULL); ++ ++ /* Calculate the maximum value of any enumerator in this type. */ ++ ++ if (values == c_error_mark_node) ++ { ++ minnode = maxnode = c_integer_zero_node; ++ } ++ else ++ { ++ for (pair = values; pair; pair = CTreeChain(pair)) ++ { ++ c_tree_node *value = CTreeListValue(pair); ++ ++ if (pair == values) ++ { ++ minnode = maxnode = CTreeListValue(pair); ++ } ++ else ++ { ++ if ( c_tree_is_int_cst_lt(maxnode, value)) ++ { ++ maxnode = value; ++ } ++ if ( c_tree_is_int_cst_lt(value, minnode)) ++ { ++ minnode = value; ++ } ++ } ++ } ++ } ++ ++ CTreeTypeMinValue(enumtype) = minnode; ++ CTreeTypeMaxValue(enumtype) = maxnode; ++ ++ /* An enum can have some negative values; then it is signed. */ ++ if ( c_tree_is_int_cst_sgn(minnode) >= 0 ) ++ { ++ CSetTreeNodeUnsigned(enumtype); ++ } ++ ++ /* Determine the precision this type needs. */ ++ ++ lowprec = c_min_precision(minnode, CIsTreeNodeUnsigned(enumtype)); ++ highprec = c_min_precision(maxnode, CIsTreeNodeUnsigned(enumtype)); ++ precision = MAX (lowprec, highprec); ++ ++ if ( ++# ifdef LUDO_NO_SKIP ++ TYPE_PACKED (enumtype) || ++# endif ++ precision > CTreeTypePrecision(c_integer_type_node)) ++ { ++ c_tree_node *narrowest = c_get_type_for_size(precision, 1); ++ if (narrowest == 0) ++ { ++ warning ("enumeration values exceed range of largest integer"); ++ narrowest = c_long_long_integer_type_node; ++ } ++ ++ CTreeTypePrecision(enumtype) = CTreeTypePrecision(narrowest); ++ } ++ else ++ { ++ CTreeTypePrecision(enumtype) = CTreeTypePrecision(c_integer_type_node); ++ } ++ ++ CTreeTypeSize(enumtype) = 0; ++ c_layout_type(enumtype); ++ ++ if (values != c_error_mark_node) ++ { ++ /* Change the type of the enumerators to be the enum type. ++ Formerly this was done only for enums that fit in an int, ++ but the comment said it was done only for enums wider than int. ++ It seems necessary to do this for wide enums, ++ and best not to change what's done for ordinary narrower ones. */ ++ for (pair = values; pair; pair = CTreeChain(pair)) ++ { ++ CTreeType( CTreeListPurpose(pair)) = enumtype; ++ CTreeDeclSize( CTreeListPurpose(pair)) = CTreeTypeSize(enumtype); ++ ++# ifdef LUDO_NO_SKIP ++ if ( CTreeDeclCode( CTreeListPurpose(pair)) != C_FUNCTION_DECL) ++ { ++ DECL_ALIGN (TREE_PURPOSE (pair)) = TYPE_ALIGN (enumtype); ++ } ++# endif ++ } ++ ++ /* Replace the decl nodes in VALUES with their names. */ ++ for (pair = values; pair; pair = CTreeChain(pair)) ++ { ++ CTreeListPurpose(pair) = CTreeDeclName( CTreeListPurpose(pair)); ++ } ++ ++ CTreeTypeValues(enumtype) = values; ++ } ++ ++ /* Fix up all variant types of this enum type. */ ++ for (tem = CTreeTypeMainVariant(enumtype); tem; tem = CTreeTypeNextVariant(tem)) ++ { ++ CTreeTypeValues(tem) = CTreeTypeValues(enumtype); ++ CTreeTypeMinValue(tem) = CTreeTypeMinValue(enumtype); ++ CTreeTypeMaxValue(tem) = CTreeTypeMaxValue(enumtype); ++ CTreeTypeSize(tem) = CTreeTypeSize(enumtype); ++ CTreeTypeMode(tem) = CTreeTypeMode(enumtype); ++ CTreeTypePrecision(tem) = CTreeTypePrecision(enumtype); ++ CTreeTypeAlign(tem) = CTreeTypeAlign(enumtype); ++ ++ if ( CIsTreeNodeUnsigned( enumtype ) ) ++ { ++ CSetTreeNodeUnsigned( tem ); ++ } ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* Finish debugging output for this type. */ ++ rest_of_type_compilation (enumtype, toplevel); ++ ++ /* This matches a push in start_enum. */ ++ pop_obstacks (); ++# endif ++ ++ return enumtype; ++} ++ ++/* Build and install a CONST_DECL for one value of the ++ current enumeration type (one that was begun with start_enum). ++ Return a tree-list containing the CONST_DECL and its value. ++ Assignment of sequential values by default is handled here. */ ++ ++c_tree_node *c_build_enumerator(name, value) ++ c_tree_node *name; ++ c_tree_node *value; ++{ ++ c_tree_node *decl; ++ c_tree_node *type; ++ ++ /* Validate and default VALUE. */ ++ ++ /* Remove no-op casts from the value. */ ++ if (value) ++ { ++ CStripNops(value); ++ } ++ ++ if (value != 0) ++ { ++ if ( CTreeNodeFirstCode(value) == C_INT_CST_NODE) ++ { ++ value = c_default_conversion(value); ++ c_constant_expression_warning(value); ++ } ++ else ++ { ++ error ("enumerator value for `%s' not integer constant", CTreeIdentPointer(name)); ++ value = 0; ++ } ++ } ++ ++ /* Default based on previous value. */ ++ /* It should no longer be possible to have NON_LVALUE_EXPR ++ in the default. */ ++ if (value == 0) ++ { ++ value = c_enum_next_value; ++ ++ if (c_enum_overflow) ++ { ++ error ("overflow in enumeration values"); ++ } ++ } ++ ++ if (c_pedantic && ! c_int_fits_type_p(value, c_integer_type_node)) ++ { ++ pedwarn ("ANSI C restricts enumerator values to range of `int'"); ++ value = c_integer_zero_node; ++ } ++ ++ /* Set basis for default for next value. */ ++ c_enum_next_value = c_build_binary_op(C_PLUS_EXPR, value, c_integer_one_node, 0); ++ c_enum_overflow = c_tree_is_int_cst_lt(c_enum_next_value, value); ++ ++ /* Now create a declaration for the enum value name. */ ++ ++ ++ type = CTreeType(value); ++ type = c_get_type_for_size( ++ MAX( CTreeTypePrecision(type), CTreeTypePrecision(c_integer_type_node)), ++ ((c_flag_traditional || ++ CTreeTypePrecision(type) >= CTreeTypePrecision(c_integer_type_node)) ++ && CIsTreeNodeUnsigned(type))); ++ ++ decl = c_tree_build_decl( C_CONST_DECL, name, type); ++ CTreeDeclInitial(decl) = value; ++ CTreeType(value) = type; ++ c_push_decl(decl); ++ ++ return c_tree_add_head_list(decl, value, NULL); ++} ++ ++ ++/* Create the FUNCTION_DECL for a function definition. ++ DECLSPECS, DECLARATOR, PREFIX_ATTRIBUTES and ATTRIBUTES are the parts of ++ the declaration; they describe the function's name and the type it returns, ++ but twisted together in a fashion that parallels the syntax of C. ++ ++ This function creates a binding context for the function body ++ as well as setting up the FUNCTION_DECL in current_function_decl. ++ ++ Returns 1 on success. If the DECLARATOR is not suitable for a function ++ (it defines a datum instead), we return 0, which tells ++ yyparse to report a parse error. ++ ++ NESTED is nonzero for a function nested within another function. */ ++ ++int c_start_function( declspecs, declarator, prefix_attributes, attributes, nested ) ++ c_tree_node *declarator; ++ c_tree_node *declspecs; ++ c_tree_node *prefix_attributes; ++ c_tree_node *attributes; ++ int nested; ++{ ++ c_tree_node *decl1; ++ c_tree_node *old_decl; ++ c_tree_node *restype; ++# ifdef LUDO_NO_SKIP ++ int old_immediate_size_expand = immediate_size_expand; ++# endif ++ ++ c_current_function_returns_value = 0; /* Assume, until we see it does. */ ++ c_current_function_returns_null = 0; ++ c_warn_about_return_type = 0; ++ c_current_extern_inline = 0; ++ c_c_function_varargs = 0; ++ c_named_labels = 0; ++ c_shadowed_labels = 0; ++ ++# ifdef LUDO_NO_SKIP ++ /* Don't expand any sizes in the return type of the function. */ ++ immediate_size_expand = 0; ++# endif ++ ++ decl1 = c_grokdeclarator(declarator, declspecs, C_CDECL_FUNCDEF, 1); ++ ++ /* If the declarator is not suitable for a function definition, ++ cause a syntax error. */ ++ if (decl1 == 0) ++ { ++# ifdef LUDO_NO_SKIP ++ immediate_size_expand = old_immediate_size_expand; ++# endif ++ return 0; ++ } ++ ++ c_decl_attributes(decl1, prefix_attributes, attributes); ++ ++# ifdef LUDO_NO_SKIP ++ announce_function(decl1); ++# endif ++ ++ if (CTreeTypeSize(CTreeType(CTreeType(decl1))) == 0) ++ { ++ error ("return-type is an incomplete type"); ++ /* Make it return void instead. */ ++ CTreeType(decl1) ++ = c_tree_build_function_type( c_void_type_node, ++ CTreeTypeValues(CTreeType(decl1))); ++ } ++ ++ if (c_warn_about_return_type) ++ { ++ warning("return-type defaults to `int'"); ++ } ++ ++ /* Save the parm names or decls from this function's declarator ++ where store_parm_decls will find them. */ ++ c_current_function_parms = c_last_function_parms; ++ c_current_function_parm_tags = c_last_function_parm_tags; ++ ++ /* Make the init_value nonzero so pushdecl knows this is not tentative. ++ error_mark_node is replaced below (in poplevel) with the BLOCK. */ ++ CTreeDeclInitial(decl1) = c_error_mark_node; ++ ++ /* If this definition isn't a prototype and we had a prototype declaration ++ before, copy the arg type info from that prototype. ++ But not if what we had before was a builtin function. */ ++ old_decl = c_lookup_name_current_level(CTreeDeclName(decl1)); ++ if (old_decl != 0 && CTreeTypeCode(CTreeType(old_decl)) == C_FUNCTION_TYPE ++ && ! CIsTreeDeclBuiltIn(old_decl) ++ && (CTreeTypeMainVariant(CTreeType(CTreeType(decl1))) ++ == CTreeTypeMainVariant(CTreeType(CTreeType(old_decl)))) ++ && CTreeTypeValues(CTreeType(decl1)) == 0) ++ { ++ CTreeType(decl1) = CTreeType(old_decl); ++ c_current_function_prototype_file = CTreeDeclFileName(old_decl); ++ c_current_function_prototype_line = CTreeDeclLineNum(old_decl); ++ } ++ ++ /* If there is no explicit declaration, look for any out-of-scope implicit ++ declarations. */ ++ if (old_decl == 0) ++ { ++ old_decl = CTreeIdentImplicitDecl(CTreeDeclName(decl1)); ++ } ++ ++ /* Optionally warn of old-fashioned def with no previous prototype. */ ++ if (c_warn_strict_prototypes ++ && CTreeTypeValues(CTreeType(decl1)) == 0 ++ && !(old_decl != 0 && CTreeTypeValues(CTreeType(old_decl)) != 0)) ++ { ++ warning ("function declaration isn't a prototype"); ++ } ++ /* Optionally warn of any global def with no previous prototype. */ ++ else if (c_warn_missing_prototypes ++ && CIsTreeNodePublic(decl1) ++ && !(old_decl != 0 && CTreeTypeValues(CTreeType(old_decl)) != 0) ++ && strcmp("main", CTreeIdentPointer(CTreeDeclName(decl1)))) ++ { ++ warning_with_decl(decl1, "no previous prototype for `%s'"); ++ } ++ /* Optionally warn of any def with no previous prototype ++ if the function has already been used. */ ++ else if (c_warn_missing_prototypes ++ && old_decl != 0 ++ && CIsTreeNodeUsed(old_decl) ++ && CTreeTypeValues(CTreeType(old_decl)) == 0) ++ { ++ warning_with_decl(decl1, "`%s' was used with no prototype before its definition"); ++ } ++ /* Optionally warn of any global def with no previous declaration. */ ++ else if (c_warn_missing_declarations ++ && CIsTreeNodePublic(decl1) ++ && old_decl == 0 ++ && strcmp ("main", CTreeIdentPointer(CTreeDeclName(decl1)))) ++ { ++ warning_with_decl(decl1, "no previous declaration for `%s'"); ++ } ++ /* Optionally warn of any def with no previous declaration ++ if the function has already been used. */ ++ else if (c_warn_missing_declarations ++ && old_decl != 0 ++ && CIsTreeNodeUsed(old_decl) ++ && old_decl == CTreeIdentImplicitDecl(CTreeDeclName(decl1)) ++ ) ++ { ++ warning_with_decl(decl1, "`%s' was used with no declaration before its definition"); ++ } ++ ++ /* This is a definition, not a reference. ++ So normally clear DECL_EXTERNAL. ++ However, `extern inline' acts like a declaration ++ except for defining how to inline. So set DECL_EXTERNAL in that case. */ ++ if ( c_current_extern_inline ) ++ { ++ CSetTreeDeclExternal(decl1); ++ } ++ ++ /* This function exists in static storage. ++ (This does not mean `static' in the C sense!) */ ++ CSetTreeNodeStatic(decl1); ++ ++ /* A nested function is not global. */ ++ if (c_current_function_decl != 0) ++ { ++ CClearTreeNodePublic(decl1); ++ } ++ ++ /* Warn for unlikely, improbable, or stupid declarations of `main'. */ ++ if (c_warn_main ++ && strcmp ("main", CTreeIdentPointer(CTreeDeclName(decl1))) == 0) ++ { ++ c_tree_node *args; ++ int argct = 0; ++ ++ if (CTreeTypeMainVariant(CTreeType(CTreeType(decl1))) ++ != c_integer_type_node) ++ { ++ pedwarn_with_decl(decl1, "return type of `%s' is not `int'"); ++ } ++ ++ for ( args = CTreeTypeValues(CTreeType(decl1)); args; ++ args = CTreeChain(args)) ++ { ++ c_tree_node *type = args ? CTreeListValue(args) : 0; ++ ++ if (type == c_void_type_node) break; ++ ++ ++argct; ++ switch (argct) ++ { ++ case 1: ++ if (CTreeTypeMainVariant(type) != c_integer_type_node) ++ { ++ pedwarn_with_decl(decl1, "first argument of `%s' should be `int'"); ++ } ++ break; ++ ++ case 2: ++ if ( CTreeTypeCode(type) != C_POINTER_TYPE ++ || CTreeTypeCode(CTreeType(type)) != C_POINTER_TYPE ++ || (CTreeTypeMainVariant(CTreeType(CTreeType(type))) ++ != c_char_type_node)) ++ { ++ pedwarn_with_decl(decl1, "second argument of `%s' should be `char **'"); ++ } ++ break; ++ ++ case 3: ++ if ( CTreeTypeCode(type) != C_POINTER_TYPE ++ || CTreeTypeCode(CTreeType(type)) != C_POINTER_TYPE ++ || (CTreeTypeMainVariant(CTreeType(CTreeType(type))) ++ != c_char_type_node)) ++ { ++ pedwarn_with_decl(decl1, "third argument of `%s' should probably be `char **'"); ++ } ++ break; ++ } ++ } ++ ++ /* It is intentional that this message does not mention the third ++ argument, which is warned for only pedantically, because it's ++ blessed by mention in an appendix of the standard. */ ++ ++ if (argct > 0 && (argct < 2 || argct > 3)) ++ { ++ pedwarn_with_decl(decl1, "`%s' takes only zero or two arguments"); ++ } ++ ++ if (argct == 3 && c_pedantic) ++ { ++ pedwarn_with_decl(decl1, "third argument of `%s' is deprecated"); ++ } ++ ++ if (! CIsTreeNodePublic(decl1)) ++ { ++ pedwarn_with_decl (decl1, "`%s' is normally a non-static function"); ++ } ++ } ++ ++ /* Record the decl so that the function name is defined. ++ If we already have a decl for this name, and it is a FUNCTION_DECL, ++ use the old decl. */ ++ ++ c_current_function_decl = c_push_decl(decl1); ++ ++ c_push_level(0); ++ c_declare_parm_level(1); ++ c_current_binding_level->SUBBLOCKS_TAG_TRANSPARENT = 1; ++ ++# ifdef LUDO_NO_SKIP ++ make_function_rtl(current_function_decl); ++# endif ++ ++ restype = CTreeType(CTreeType(c_current_function_decl)); ++ /* Promote the value to int before returning it. */ ++ ++ if (C_PROMOTING_INTEGER_TYPE_P(restype)) ++ { ++ /* It retains unsignedness if traditional ++ or if not really getting wider. */ ++ if ( CIsTreeNodeUnsigned(restype) ++ && (c_flag_traditional ++ || (CTreeTypePrecision(restype) ++ == CTreeTypePrecision(c_integer_type_node)))) ++ restype = c_unsigned_type_node; ++ else ++ restype = c_integer_type_node; ++ } ++ ++ CTreeDeclResult(c_current_function_decl) = ++ c_tree_build_decl( C_RESULT_DECL, NULL, restype); ++ ++# ifdef LUDO_NO_SKIP ++ if (!nested) ++ { ++ /* Allocate further c_tree_node *nodes temporarily during compilation ++ of this function only. */ ++ temporary_allocation (); ++ } ++ ++ /* If this fcn was already referenced via a block-scope `extern' decl ++ (or an implicit decl), propagate certain information about the usage. */ ++ if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl))) ++ TREE_ADDRESSABLE (current_function_decl) = 1; ++ ++ immediate_size_expand = old_immediate_size_expand; ++# endif ++ ++ return 1; ++} ++ ++/* Finish up a function declaration and compile that function ++ all the way to assembler language output. The free the storage ++ for the function definition. ++ ++ This is called after parsing the body of the function definition. ++ ++ NESTED is nonzero if the function being finished is nested in another. */ ++ ++c_tree_node *c_finish_function(nested, body) ++ int nested; ++ c_tree_node *body; ++{ ++ c_tree_node *fndecl = c_current_function_decl; ++ ++/* TREE_READONLY (fndecl) = 1; ++ This caused &foo to be of type ptr-to-const-function ++ which then got a warning when stored in a ptr-to-function variable. */ ++ ++ c_pop_level(1, 0, 1); ++ ++ if ( CTreeBlockBody( CTreeDeclInitial( fndecl ) ) == (c_tree_node *)0 ) ++ { ++ CTreeBlockBody( CTreeDeclInitial( fndecl ) ) = body; ++ } ++ ++ CTreeBlockSuperContext(CTreeDeclInitial(fndecl)) = fndecl; ++ ++ /* Must mark the RESULT_DECL as being in this function. */ ++ ++ CTreeDeclContext( CTreeDeclResult(fndecl)) = fndecl; ++ ++ /* Obey `register' declarations if `setjmp' is called in this fn. */ ++# ifdef LUDO_NO_SKIP ++ if (c_flag_traditional && c_current_function_calls_setjmp) ++ { ++ setjmp_protect (CTreeDeclInitial(fndecl)); ++ setjmp_protect_args (); ++ } ++# endif ++ ++ if (! strcmp( CTreeIdentPointer(CTreeDeclName(fndecl)), "main")) ++ { ++ if (CTreeTypeMainVariant(CTreeType(CTreeType(fndecl))) != c_integer_type_node) ++ { ++ /* You would expect the sense of this test to be the other way ++ around, but if warn_main is set, we will already have warned, ++ so this would be a duplicate. This is the warning you get ++ in some environments even if you *don't* ask for it, because ++ these are environments where it may be more of a problem than ++ usual. */ ++ if (! c_warn_main) ++ { ++ pedwarn_with_decl( fndecl, "return type of `%s' is not `int'"); ++ } ++ } ++ else ++ { ++#ifdef DEFAULT_MAIN_RETURN ++ /* Make it so that `main' always returns success by default. */ ++ DEFAULT_MAIN_RETURN; ++#endif ++ } ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* Generate rtl for function exit. */ ++ expand_function_end (input_filename, lineno, 0); ++# endif ++ ++ /* So we can tell if jump_optimize sets it to 1. */ ++ c_can_reach_end = 0; ++ ++# ifdef LUDO_NO_SKIP ++ /* Run the optimizers and output the assembler code for this function. */ ++ rest_of_compilation (fndecl); ++# endif ++ ++ c_current_function_returns_null |= c_can_reach_end; ++ ++ if ( CIsTreeNodeVolatile(fndecl) && c_current_function_returns_null) ++ { ++ warning ("`noreturn' function does return"); ++ } ++ else if (c_warn_return_type && c_can_reach_end ++ && CTreeTypeMainVariant(CTreeType(CTreeType(fndecl))) != c_void_type_node) ++ /* If this function returns non-void and control can drop through, ++ complain. */ ++ { ++ warning ("control reaches end of non-void function"); ++ } ++ /* With just -W, complain only if function returns both with ++ and without a value. */ ++ else if (c_extra_warnings ++ && c_current_function_returns_value && c_current_function_returns_null) ++ { ++ warning ("this function may return with or without a value"); ++ } ++ ++ /* If requested, warn about function definitions where the function will ++ return a value (usually of some struct or union type) which itself will ++ take up a lot of stack space. */ ++ ++ if (c_warn_larger_than && ! CIsTreeDeclExternal(fndecl) && CTreeType(fndecl)) ++ { ++ c_tree_node *ret_type = CTreeType(CTreeType(fndecl)); ++ ++ if (ret_type) ++ { ++ c_tree_node *ret_type_size = CTreeTypeSize(ret_type); ++ ++ if (CTreeNodeFirstCode(ret_type_size) == C_INT_CST_NODE) ++ { ++ unsigned units = CTreeIntCstLow(ret_type_size) / C_BITS_PER_UNIT; ++ ++ if (units > c_larger_than_size) ++ { ++ warning_with_decl(fndecl, "size of return value of `%s' is %u bytes", units); ++ } ++ } ++ } ++ } ++ ++ /* Free all the c_tree_node *nodes making up this function. */ ++ /* Switch back to allocating nodes permanently ++ until we start another function. */ ++# ifdef LUDO_NO_SKIP ++ if (! nested) ++ { ++ permanent_allocation (1); ++ } ++ ++ if (DECL_SAVED_INSNS(fndecl) == 0 && ! nested) ++ { ++ /* Stop pointing to the local nodes about to be freed. */ ++ /* But CTreeDeclInitialmust remain nonzero so we know this ++ was an actual function definition. */ ++ /* For a nested function, this is done in pop_c_function_context. */ ++ /* If rest_of_compilation set this to 0, leave it 0. */ ++ if (CTreeDeclInitial(fndecl) != 0) ++ CTreeDeclInitial(fndecl) = error_mark_node; ++ DECL_ARGUMENTS (fndecl) = 0; ++ } ++# endif ++ ++# ifdef LUDO_NO_SKIP ++ if (DECL_STATIC_CONSTRUCTOR (fndecl)) ++ { ++#ifndef ASM_OUTPUT_CONSTRUCTOR ++ if (! flag_gnu_linker) ++ static_ctors = perm_tree_cons (NULL_TREE, fndecl, static_ctors); ++ else ++#endif ++ assemble_constructor (IDENTIFIER_POINTER (CTreeDeclName(fndecl))); ++ } ++ if (DECL_STATIC_DESTRUCTOR (fndecl)) ++ { ++#ifndef ASM_OUTPUT_DESTRUCTOR ++ if (! flag_gnu_linker) ++ static_dtors = perm_tree_cons (NULL_TREE, fndecl, static_dtors); ++ else ++#endif ++ assemble_destructor (IDENTIFIER_POINTER (CTreeDeclName(fndecl))); ++ } ++# endif ++ ++ /* ++ loc_c_tree_view_node( c_current_function_decl ); ++ */ ++ ++ if (! nested) ++ { ++ /* Let the error reporting routines know that we're outside a ++ function. For a nested function, this value is used in ++ pop_c_function_context and then reset via pop_function_context. */ ++ c_current_function_decl = NULL; ++ } ++ ++ return( fndecl ); ++} ++ ++/* Store the list of declarations of the current level. ++ This is done for the parameter declarations of a function being defined, ++ after they are modified in the light of any missing parameters. */ ++ ++static void c_store_decls(decls) ++ ++ c_tree_node *decls; ++{ ++ c_current_binding_level->NAME_LIST = decls; ++} ++ ++/* Similarly, store the list of tags of the current level. */ ++ ++static void c_store_tags(tags) ++ ++ c_tree_node *tags; ++{ ++ c_current_binding_level->TAG_LIST = tags; ++} ++ ++ ++/* Return the list of type-tags (for structs, etc) of the current level. */ ++ ++c_tree_node *c_get_tags() ++{ ++ return c_current_binding_level->TAG_LIST; ++} ++ ++/* Return the list of declarations of the current level. ++ Note that this list is in reverse order unless/until ++ you nreverse it; and when you do nreverse it, you must ++ store the result back using `storedecls' or you will lose. */ ++ ++c_tree_node *c_get_decls() ++{ ++ return c_current_binding_level->NAME_LIST; ++} ++ ++/* Return a tree_list node with info on a parameter list just parsed. ++ The TREE_PURPOSE is a chain of decls of those parms. ++ The TREE_VALUE is a list of structure, union and enum tags defined. ++ The CTreeChainis a list of argument types to go in the FUNCTION_TYPE. ++ This tree_list node is later fed to `grokparms'. ++ ++ VOID_AT_END nonzero means append `void' to the end of the type-list. ++ Zero means the parmlist ended with an ellipsis so don't append `void'. */ ++ ++c_tree_node *c_get_parm_info(void_at_end) ++ int void_at_end; ++{ ++ c_tree_node *decl; ++ c_tree_node *result; ++ c_tree_node *t; ++ c_tree_node *types = 0; ++ int erred = 0; ++ c_tree_node *tags = c_get_tags(); ++ c_tree_node *parms = c_get_decls(); ++ c_tree_node *new_parms = 0; ++ c_tree_node *order = c_current_binding_level->PARAM_LIST; ++ ++ ++ /* Just `void' (and no ellipsis) is special. There are really no parms. */ ++ if (void_at_end && parms != 0 ++ && CTreeChain(parms) == 0 ++ && CTreeTypeMainVariant(CTreeType(parms)) == c_void_type_node ++ && CTreeDeclName(parms) == 0) ++ { ++ parms = NULL; ++ c_store_decls(NULL); ++ return c_tree_add_head_list( NULL, NULL, ++ c_tree_add_head_list(NULL, c_void_type_node, NULL)); ++ } ++ ++ /* Extract enumerator values and other non-parms declared with the parms. ++ Likewise any forward parm decls that didn't have real parm decls. */ ++ for (decl = parms; decl; ) ++ { ++ c_tree_node *next = CTreeChain(decl); ++ ++ if ( CTreeDeclCode(decl) != C_PARAM_DECL) ++ { ++ CTreeChain(decl) = new_parms; ++ new_parms = decl; ++ } ++ else if ( CIsTreeNodeAsmWritten(decl)) ++ { ++ error_with_decl (decl, "parameter `%s' has just a forward declaration"); ++ CTreeChain(decl) = new_parms; ++ new_parms = decl; ++ } ++ ++ decl = next; ++ } ++ ++ /* Put the parm decls back in the order they were in in the parm list. */ ++ for (t = order; t; t = CTreeChain(t)) ++ { ++ if (CTreeChain(t)) ++ { ++ CTreeChain( CTreeListValue(t)) = CTreeListValue(CTreeChain(t)); ++ } ++ else ++ { ++ CTreeChain( CTreeListValue(t)) = 0; ++ } ++ } ++ ++ new_parms = c_tree_concat_list(order ? ++ c_tree_reverse_list(CTreeListValue(order)) : 0, new_parms); ++ ++ /* Store the parmlist in the binding level since the old one ++ is no longer a valid list. (We have changed the chain pointers.) */ ++ c_store_decls(new_parms); ++ ++ for (decl = new_parms; decl; decl = CTreeChain(decl)) ++ /* There may also be declarations for enumerators if an enumeration ++ type is declared among the parms. Ignore them here. */ ++ { ++ if ( CTreeDeclCode(decl) == C_PARAM_DECL) ++ { ++ /* Since there is a prototype, args are passed in their declared types. */ ++ c_tree_node *type = CTreeType(decl); ++ CTreeDeclInitial(decl) = type; ++ ++#ifdef PROMOTE_PROTOTYPES ++ if ((TREE_CODE (type) == INTEGER_TYPE ++ || TREE_CODE (type) == ENUMERAL_TYPE) ++ && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) ++ { ++ CTreeDeclInitial(decl) = c_integer_type_node; ++ } ++#endif ++ ++ types = c_tree_add_head_list( NULL, CTreeType(decl), types); ++ ++ if (CTreeTypeMainVariant( CTreeListValue(types)) == c_void_type_node && ++ ! erred && CTreeDeclName(decl) == 0) ++ { ++ error ("`void' in parameter list must be the entire list"); ++ erred = 1; ++ } ++ } ++ } ++ ++ if (void_at_end) ++ { ++ result = c_tree_add_head_list( new_parms, tags, ++ c_tree_reverse_list( c_tree_add_head_list( NULL, c_void_type_node, types))); ++ } ++ else ++ { ++ result = c_tree_add_head_list(new_parms, tags, c_tree_reverse_list( types)); ++ } ++ ++ return( result ); ++} ++ ++/* Store the parameter declarations into the current function declaration. ++ This is called after parsing the parameter declarations, before ++ digesting the body of the function. ++ ++ For an old-style definition, modify the function's type ++ to specify at least the number of arguments. */ ++ ++void c_store_parm_decls() ++{ ++ c_tree_node *fndecl = c_current_function_decl; ++ c_tree_node *parm; ++ ++ /* This is either a chain of PARM_DECLs (if a prototype was used) ++ or a list of IDENTIFIER_NODEs (for an old-fashioned C definition). */ ++ c_tree_node *specparms = c_current_function_parms; ++ ++ /* This is a list of types declared among parms in a prototype. */ ++ c_tree_node *parmtags = c_current_function_parm_tags; ++ ++ /* This is a chain of PARM_DECLs from old-style parm declarations. */ ++ c_tree_node *parmdecls = c_get_decls(); ++ ++ /* This is a chain of any other decls that came in among the parm ++ declarations. If a parm is declared with enum {foo, bar} x; ++ then CONST_DECLs for foo and bar are put here. */ ++ c_tree_node *nonparms = 0; ++ ++ /* Nonzero if this definition is written with a prototype. */ ++ int prototype = 0; ++ ++ if (specparms != 0 && CTreeNodeFirstCode(specparms) != C_LIST_NODE) ++ { ++ /* This case is when the function was defined with an ANSI prototype. ++ The parms already have decls, so we need not do anything here ++ except record them as in effect ++ and complain if any redundant old-style parm decls were written. */ ++ ++ c_tree_node *next; ++ c_tree_node *others = 0; ++ ++ prototype = 1; ++ ++ if (parmdecls != 0) ++ { ++ c_tree_node *decl; ++ c_tree_node *link; ++ ++ error_with_decl (fndecl, "parm types given both in parmlist and separately"); ++ /* Get rid of the erroneous decls; don't keep them on ++ the list of parms, since they might not be PARM_DECLs. */ ++ for (decl = c_current_binding_level->NAME_LIST; decl; decl = CTreeChain(decl)) ++ { ++ if (CTreeDeclName(decl)) ++ { ++ CTreeIdentLocalValue(CTreeDeclName(decl)) = 0; ++ } ++ } ++ ++ for (link = c_current_binding_level->SHADOWED_LIST; ++ link; link = CTreeChain(link)) ++ { ++ CTreeIdentLocalValue( CTreeListPurpose(link)) = CTreeListValue(link); ++ } ++ ++ c_current_binding_level->NAME_LIST = 0; ++ c_current_binding_level->SHADOWED_LIST = 0; ++ } ++ ++ specparms = c_tree_reverse_list(specparms); ++ ++ for (parm = specparms; parm; parm = next) ++ { ++ next = CTreeChain(parm); ++ ++ if ( CTreeDeclCode(parm) == C_PARAM_DECL) ++ { ++ if (CTreeDeclName(parm) == 0) ++ { ++ error_with_decl (parm, "parameter name omitted"); ++ } ++ else if (CTreeTypeMainVariant(CTreeType(parm)) == c_void_type_node) ++ { ++ error_with_decl (parm, "parameter `%s' declared void"); ++ /* Change the type to error_mark_node so this parameter ++ will be ignored by assign_parms. */ ++ CTreeType(parm) = c_error_mark_node; ++ } ++ ++ c_push_decl(parm); ++ } ++ else ++ { ++ /* If we find an enum constant or a type tag, ++ put it aside for the moment. */ ++ CTreeChain(parm) = 0; ++ others = c_tree_concat_list(others, parm); ++ } ++ } ++ ++ /* Get the decls in their original chain order ++ and record in the function. */ ++ CTreeDeclArguments(fndecl) = c_get_decls(); ++ ++ /* Now pushdecl the enum constants. */ ++ for (parm = others; parm; parm = next) ++ { ++ next = CTreeChain(parm); ++ if (CTreeDeclName(parm) == 0) ; ++ else if (CTreeTypeMainVariant(CTreeType(parm)) == c_void_type_node) ; ++ else if ( CTreeDeclCode(parm) != C_PARAM_DECL) ++ { ++ c_push_decl(parm); ++ } ++ } ++ ++ c_store_tags( c_tree_concat_list( parmtags, c_get_tags())); ++ } ++ else ++ { ++ /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes ++ each with a parm name as the TREE_VALUE. ++ ++ PARMDECLS is a chain of declarations for parameters. ++ Warning! It can also contain CONST_DECLs which are not parameters ++ but are names of enumerators of any enum types ++ declared among the parameters. ++ ++ First match each formal parameter name with its declaration. ++ Associate decls with the names and store the decls ++ into the TREE_PURPOSE slots. */ ++ ++ for (parm = parmdecls; parm; parm = CTreeChain(parm)) ++ { ++ CTreeDeclResult(parm) = 0; ++ } ++ ++ for (parm = specparms; parm; parm = CTreeChain(parm)) ++ { ++ c_tree_node *tail = NULL; ++ c_tree_node *found = NULL; ++ ++ if (CTreeListValue(parm) == 0) ++ { ++ error_with_decl (fndecl, "parameter name missing from parameter list"); ++ CTreeListPurpose(parm) = 0; ++ continue; ++ } ++ ++ /* See if any of the parmdecls specifies this parm by name. ++ Ignore any enumerator decls. */ ++ for (tail = parmdecls; tail; tail = CTreeChain(tail)) ++ { ++ if (CTreeDeclName(tail) == CTreeListValue(parm) && ++ CTreeDeclCode(tail) == C_PARAM_DECL) ++ { ++ found = tail; break; ++ } ++ } ++ ++ /* If declaration already marked, we have a duplicate name. ++ Complain, and don't use this decl twice. */ ++ if (found && CTreeDeclResult(found) != 0) ++ { ++ error_with_decl (found, "multiple parameters named `%s'"); ++ found = 0; ++ } ++ ++ /* If the declaration says "void", complain and ignore it. */ ++ if (found && CTreeTypeMainVariant(CTreeType(found)) == c_void_type_node) ++ { ++ error_with_decl (found, "parameter `%s' declared void"); ++ CTreeType(found) = c_integer_type_node; ++ CTreeDeclInitial(found) = c_integer_type_node; ++ c_layout_decl(found, 0); ++ } ++ ++ /* Traditionally, a parm declared float is actually a double. */ ++ if (found && c_flag_traditional ++ && CTreeTypeMainVariant(CTreeType(found)) == c_float_type_node) ++ { ++ CTreeType(found) = c_double_type_node; ++ CTreeDeclInitial(found) = c_double_type_node; ++ c_layout_decl(found, 0); ++ } ++ ++ /* If no declaration found, default to int. */ ++ if (!found) ++ { ++ found = c_tree_build_decl( C_PARAM_DECL, ++ CTreeListValue(parm), c_integer_type_node); ++ CTreeDeclInitial(found) = CTreeType(found); ++ CTreeDeclLineNum(found) = CTreeDeclLineNum(fndecl); ++ CTreeDeclFileName(found) = CTreeDeclFileName(fndecl); ++ ++ if (c_extra_warnings) ++ { ++ warning_with_decl (found, "type of `%s' defaults to `int'"); ++ } ++ c_push_decl(found); ++ } ++ ++ CTreeListPurpose(parm) = found; ++ ++ /* Mark this decl as "already found" -- see test, above. ++ It is safe to use DECL_RESULT for this ++ since it is not used in PARM_DECLs or CONST_DECLs. */ ++ CTreeDeclResult(found) = c_error_mark_node; ++ } ++ ++ /* Put anything which is on the parmdecls chain and which is ++ not a PARM_DECL onto the list NONPARMS. (The types of ++ non-parm things which might appear on the list include ++ enumerators and NULL-named TYPE_DECL nodes.) Complain about ++ any actual PARM_DECLs not matched with any names. */ ++ ++ nonparms = 0; ++ for (parm = parmdecls; parm; ) ++ { ++ c_tree_node *next = CTreeChain(parm); ++ CTreeChain(parm) = 0; ++ ++ if ( CTreeDeclCode(parm) != C_PARAM_DECL ) ++ { ++ nonparms = c_tree_concat_list(nonparms, parm); ++ } ++ else ++ { ++ /* Complain about args with incomplete types. */ ++ if (CTreeTypeSize(CTreeType(parm)) == 0) ++ { ++ error_with_decl(parm, "parameter `%s' has incomplete type"); ++ CTreeType(parm) = c_error_mark_node; ++ } ++ ++ if ( CTreeDeclResult(parm) == 0) ++ { ++ error_with_decl(parm, "declaration for parameter `%s' but no such parameter"); ++ /* Pretend the parameter was not missing. ++ This gets us to a standard state and minimizes ++ further error messages. */ ++ specparms = c_tree_concat_list(specparms, ++ c_tree_add_head_list(parm, NULL_TREE, NULL_TREE)); ++ } ++ } ++ ++ parm = next; ++ } ++ ++ /* Chain the declarations together in the order of the list of names. */ ++ /* Store that chain in the function decl, replacing the list of names. */ ++ parm = specparms; ++ CTreeDeclArguments(fndecl) = 0; ++ ++ { ++ c_tree_node *last; ++ ++ for (last = 0; parm; parm = CTreeChain(parm)) ++ { ++ if ( CTreeListPurpose(parm)) ++ { ++ if (last == 0) ++ { ++ CTreeDeclArguments(fndecl) = CTreeListPurpose(parm); ++ } ++ else ++ { ++ CTreeChain(last) = CTreeListPurpose(parm); ++ } ++ ++ last = CTreeListPurpose(parm); ++ CTreeChain(last) = 0; ++ } ++ } ++ } ++ ++ /* If there was a previous prototype, ++ set the DECL_ARG_TYPE of each argument according to ++ the type previously specified, and report any mismatches. */ ++ ++ if ( CTreeTypeValues(CTreeType(fndecl))) ++ { ++ c_tree_node *type; ++ ++ for (parm = CTreeDeclArguments(fndecl), ++ type = CTreeTypeValues(CTreeType(fndecl)); ++ parm || ++ (type && (CTreeTypeMainVariant( CTreeListValue(type)) != c_void_type_node)); ++ parm = CTreeChain(parm), type = CTreeChain(type)) ++ { ++ if (parm == 0 || ++ type == 0 || ++ CTreeTypeMainVariant( CTreeListValue(type)) == c_void_type_node) ++ { ++ error ("number of arguments doesn't match prototype"); ++ error_with_file_and_line (c_current_function_prototype_file, ++ c_current_function_prototype_line, ++ "prototype declaration"); ++ break; ++ } ++ /* Type for passing arg must be consistent ++ with that declared for the arg. */ ++ if (! c_is_comptypes( CTreeTypeValues(parm), CTreeListValue(type))) ++ { ++ if (CTreeTypeMainVariant(CTreeType(parm)) == ++ CTreeTypeMainVariant(CTreeListValue(type))) ++ { ++ /* Adjust argument to match prototype. E.g. a previous ++ `int foo(float);' prototype causes ++ `int foo(x) float x; {...}' to be treated like ++ `int foo(float x) {...}'. This is particularly ++ useful for argument types like uid_t. */ ++ CTreeTypeValues(parm) = CTreeType(parm); ++#ifdef PROMOTE_PROTOTYPES ++ if ((TREE_CODE (CTreeType(parm)) == INTEGER_TYPE ++ || TREE_CODE (CTreeType(parm)) == ENUMERAL_TYPE) ++ && TYPE_PRECISION (CTreeType(parm)) ++ < TYPE_PRECISION (integer_type_node)) ++ DECL_ARG_TYPE (parm) = integer_type_node; ++#endif ++ if (c_pedantic) ++ { ++ pedwarn("promoted argument `%s' doesn't match prototype", ++ CTreeIdentPointer(CTreeDeclName(parm))); ++ warning_with_file_and_line( ++ c_current_function_prototype_file, ++ c_current_function_prototype_line, "prototype declaration"); ++ } ++ } ++ /* If -traditional, allow `int' argument to match ++ `unsigned' prototype. */ ++ else ++ if (! (c_flag_traditional ++ && CTreeTypeMainVariant(CTreeType(parm)) == ++ c_integer_type_node ++ && CTreeTypeMainVariant(CTreeListValue(type)) == ++ c_unsigned_type_node)) ++ { ++ error ("argument `%s' doesn't match prototype", ++ CTreeIdentPointer(CTreeDeclName(parm))); ++ error_with_file_and_line( c_current_function_prototype_file, ++ c_current_function_prototype_line, ++ "prototype declaration"); ++ } ++ } ++ } ++ ++ CTreeTypeNonCopiedParts(CTreeType(fndecl)) = 0; ++ } ++ ++ /* Otherwise, create a prototype that would match. */ ++ ++ else ++ { ++ c_tree_node *actual = 0; ++ c_tree_node *last = 0; ++ c_tree_node *type; ++ ++ for (parm = CTreeDeclArguments(fndecl); parm; parm = CTreeChain(parm)) ++ { ++ type = c_tree_add_head_list( NULL, CTreeDeclInitial(parm), NULL); ++ ++ if (last) ++ { ++ CTreeChain(last) = type; ++ } ++ else ++ { ++ actual = type; ++ } ++ last = type; ++ } ++ ++ type = c_tree_add_head_list(NULL, c_void_type_node, NULL); ++ ++ if (last) ++ { ++ CTreeChain(last) = type; ++ } ++ else ++ { ++ actual = type; ++ } ++ ++ /* We are going to assign a new value for the TYPE_ACTUAL_ARG_TYPES ++ of the type of this function, but we need to avoid having this ++ affect the types of other similarly-typed functions, so we must ++ first force the generation of an identical (but separate) type ++ node for the relevant function type. The new node we create ++ will be a variant of the main variant of the original function ++ type. */ ++ ++ CTreeType(fndecl) = c_tree_build_type_copy(CTreeType(fndecl)); ++ CTreeTypeNonCopiedParts(CTreeType(fndecl)) = actual; ++ } ++ ++ /* Now store the final chain of decls for the arguments ++ as the decl-chain of the current lexical scope. ++ Put the enumerators in as well, at the front so that ++ DECL_ARGUMENTS is not modified. */ ++ ++ c_store_decls( c_tree_concat_list(nonparms, CTreeDeclArguments(fndecl))); ++ } ++ ++ /* Make sure the binding level for the top of the function body ++ gets a BLOCK if there are any in the function. ++ Otherwise, the dbx output is wrong. */ ++ ++ c_keep_next_if_subblocks = 1; ++ ++ /* Write a record describing this function definition to the prototypes ++ file (if requested). */ ++ ++# ifdef LUDO_NO_SKIP ++ gen_aux_info_record (fndecl, 1, 0, prototype); ++ ++ /* Initialize the RTL code for the function. */ ++ ++ init_function_start(fndecl, input_filename, lineno); ++# endif ++ ++ /* If this is a varargs function, inform function.c. */ ++ ++ if (c_c_function_varargs) ++ { ++ c_mark_varargs (); ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function. */ ++ ++ declare_function_name(); ++ ++ /* Set up parameters and prepare for return, for the function. */ ++ ++ expand_function_start(fndecl, 0); ++ ++ /* If this function is `main', emit a call to `__main' ++ to run global initializers, etc. */ ++ if (CTreeDeclName(fndecl) ++ && strcmp (IDENTIFIER_POINTER (CTreeDeclName(fndecl)), "main") == 0 ++ && DECL_CONTEXT (fndecl) == NULL_TREE) ++ { ++ expand_main_function (); ++ } ++# endif ++} ++ ++/* Make TYPE a complete type based on INITIAL_VALUE. ++ Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered, ++ 2 if there was no information (in which case assume 1 if DO_DEFAULT). */ ++ ++int c_complete_array_type(type, initial_value, do_default) ++ ++ c_tree_node *type; ++ c_tree_node *initial_value; ++ int do_default; ++{ ++ c_tree_node *maxindex = NULL; ++ int value = 0; ++ ++ if (initial_value) ++ { ++ /* Note MAXINDEX is really the maximum index, ++ one less than the size. */ ++ if ( CTreeNodeFirstCode(initial_value) == C_STRING_NODE) ++ { ++ int eltsize ++ = c_get_int_size_in_bytes(CTreeType(CTreeType(initial_value))); ++ maxindex = c_tree_build_int_2(( CTreeStringLength(initial_value) ++ / eltsize) - 1, 0); ++ } ++ else if ( ( CTreeNodeFirstCode(initial_value) == C_EXPR_NODE ) && ++ ( CTreeExprCode(initial_value) == C_CONSTRUCTOR_EXPR) ) ++ { ++ c_tree_node *elts = CTreeExprOperand(initial_value,1); ++ maxindex = c_build_size_binop( C_MINUS_EXPR, ++ c_integer_zero_node, c_size_one_node ); ++ ++ for (; elts; elts = CTreeChain(elts)) ++ { ++ if ( CTreeListPurpose(elts)) ++ { ++ maxindex = CTreeListPurpose(elts); ++ } ++ else ++ { ++ maxindex = c_build_size_binop( C_PLUS_EXPR, maxindex, c_size_one_node ); ++ } ++ } ++ maxindex = c_tree_copy_node(maxindex); ++ } ++ else ++ { ++ /* Make an error message unless that happened already. */ ++ if (initial_value != c_error_mark_node) ++ { ++ value = 1; ++ } ++ ++ /* Prevent further error messages. */ ++ maxindex = c_tree_build_int_2(0, 0); ++ } ++ } ++ ++ if (!maxindex) ++ { ++ if (do_default) ++ { ++ maxindex = c_tree_build_int_2(0, 0); ++ } ++ value = 2; ++ } ++ ++ if (maxindex) ++ { ++ CTreeTypeValues(type) = c_tree_build_index_type(maxindex); ++ ++ if (!CTreeType(maxindex)) ++ { ++ CTreeType(maxindex) = CTreeTypeValues(type); ++ } ++ } ++ ++ /* Lay out the type now that we can get the real answer. */ ++ ++ c_layout_type(type); ++ ++ return value; ++} ++ ++ ++/* Generate an implicit declaration for identifier FUNCTIONID ++ as a function of type int (). Print a warning if appropriate. */ ++ ++c_tree_node *c_implicitly_declare(functionid) ++ c_tree_node *functionid; ++{ ++ c_tree_node *decl; ++ int traditional_warning = 0; ++ /* Only one "implicit declaration" warning per identifier. */ ++ int implicit_warning; ++ ++ /* Save the decl permanently so we can warn if definition follows. */ ++# ifdef LUDO_NO_SKIP ++ push_obstacks_nochange (); ++ end_temporary_allocation (); ++# endif ++ ++ /* We used to reuse an old implicit decl here, ++ but this loses with inline functions because it can clobber ++ the saved decl chains. */ ++/* if (IDENTIFIER_IMPLICIT_DECL (functionid) != 0) ++ decl = IDENTIFIER_IMPLICIT_DECL (functionid); ++ else */ ++ decl = c_tree_build_decl(C_FUNCTION_DECL, functionid, c_default_function_type); ++ ++ /* Warn of implicit decl following explicit local extern decl. ++ This is probably a program designed for traditional C. */ ++ if ( CIsTreeNodePublic(functionid) && ++ CTreeIdentGlobalValue(functionid) == 0) ++ { ++ traditional_warning = 1; ++ } ++ ++ /* Warn once of an implicit declaration. */ ++ implicit_warning = ( CTreeIdentImplicitDecl(functionid) == 0); ++ ++ CSetTreeDeclExternal(decl); ++ CSetTreeNodePublic(decl); ++ ++ /* Record that we have an implicit decl and this is it. */ ++ CTreeIdentImplicitDecl(functionid) = decl; ++ ++ /* ANSI standard says implicit declarations are in the innermost block. ++ So we record the decl in the standard fashion. ++ If flag_traditional is set, pushdecl does it top-level. */ ++ c_push_decl(decl); ++ ++# ifdef LUDO_NO_SKIP ++ /* This is a no-op in c-lang.c or something real in objc-actions.c. */ ++ maybe_objc_check_decl (decl); ++ ++ rest_of_decl_compilation (decl, NULL_PTR, 0, 0); ++# endif ++ ++ if (c_mesg_implicit_function_declaration && implicit_warning) ++ { ++ if (c_mesg_implicit_function_declaration == 2) ++ { ++ error ("implicit declaration of function `%s'", CTreeIdentPointer(functionid)); ++ } ++ else ++ { ++ warning ("implicit declaration of function `%s'", CTreeIdentPointer(functionid)); ++ } ++ } ++ else if (c_warn_traditional && traditional_warning) ++ { ++ warning ("function `%s' was previously declared within a block", ++ CTreeIdentPointer(functionid)); ++ } ++ ++ /* Write a record describing this implicit function declaration to the ++ prototypes file (if requested). */ ++ ++# ifdef LUDO_NO_SKIP ++ gen_aux_info_record (decl, 0, 1, 0); ++ ++ pop_obstacks (); ++# endif ++ ++ return decl; ++} ++ ++/* Record that this function is going to be a varargs function. ++ This is called before store_parm_decls, which is too early ++ to call mark_varargs directly. */ ++ ++void c_c_mark_varargs() ++{ ++ c_c_function_varargs = 1; ++} ++ ++/* Indicate that the current function uses extra args ++ not explicitly mentioned in the argument list in any fashion. */ ++ ++void c_mark_varargs () ++{ ++ c_current_function_varargs = 1; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| c_finish_file | ++| | ++\------------------------------------------------------------*/ ++ ++void c_finish_file( TreeNode ) ++ ++ c_tree_node *TreeNode; ++{ ++ c_tree_program_node = TreeNode; ++ ++ for ( TreeNode = C_HEAD_NODE_LIST[ C_IDENTIFIER_NODE ]; ++ TreeNode != (c_tree_node *)0; ++ TreeNode = TreeNode->COMMON.NEXT ) ++ { ++ CTreeIdentGlobalValue( TreeNode ) = 0; ++ CTreeIdentLocalValue( TreeNode ) = 0; ++ CTreeIdentLabelValue( TreeNode ) = 0; ++ CTreeIdentImplicitDecl( TreeNode ) = 0; ++ CTreeIdentErrorLocus( TreeNode ) = 0; ++ CTreeIdentLimboValue( TreeNode ) = 0; ++ } ++} ++ +diff -Naur alliance-5.0/gcp/src/c_cdecl.h alliance/gcp/src/c_cdecl.h +--- alliance-5.0/gcp/src/c_cdecl.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_cdecl.h 2002-09-30 18:20:19.000000000 +0200 +@@ -0,0 +1,201 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_cdecl.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_CDECL_H ++# define C_CDECL_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_INT_TYPE_SIZE (sizeof(int )*8) ++# define C_CHAR_TYPE_SIZE (sizeof(char)*8) ++# define C_LONG_TYPE_SIZE (sizeof(long)*8) ++# define C_LONG_LONG_TYPE_SIZE (sizeof(long long int)*8) ++# define C_SHORT_TYPE_SIZE (sizeof(short)*8) ++# define C_FLOAT_TYPE_SIZE (sizeof(float)*8) ++# define C_DOUBLE_TYPE_SIZE (sizeof(double)*8) ++# define C_LONG_DOUBLE_TYPE_SIZE (sizeof(long double)*8) ++# define C_POINTER_TYPE_SIZE (sizeof(char *)*8) ++# define C_POINTER_SIZE C_POINTER_TYPE_SIZE ++ ++# define C_HOST_BITS_PER_WIDE_INT (int)C_INT_TYPE_SIZE ++# define C_HOST_BITS_PER_LONG (int)C_LONG_TYPE_SIZE ++# define C_HOST_BITS_PER_INT (int)C_INT_TYPE_SIZE ++# define C_HOST_BITS_PER_CHAR (int)C_CHAR_TYPE_SIZE ++ ++# define C_HOST_WIDE_INT int ++ ++# define C_WCHAR_TYPE_SIZE C_INT_TYPE_SIZE ++# define C_BITS_PER_UNIT C_CHAR_TYPE_SIZE ++# define C_WCHAR_BYTES 1 ++# define C_BYTES_BIG_ENDIAN 0 ++# define C_BITS_PER_WORD (int)C_INT_TYPE_SIZE ++ ++/*------------------------------------------------------------\ ++| | ++| Declar | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_CDECL_NORMAL 1 ++# define C_CDECL_FUNCDEF 2 ++# define C_CDECL_PARAM 3 ++# define C_CDECL_FIELD 4 ++# define C_CDECL_BIT_FIELD 5 ++# define C_CDECL_TYPENAME 6 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++ ++# define c_resume_momentary(N) ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++ ++ typedef struct c_binding_level ++ { ++ struct c_binding_level *LEVEL_CHAIN; ++ c_tree_node *NAME_LIST; ++ c_tree_node *TAG_LIST; ++ c_tree_node *SHADOWED_LIST; ++ c_tree_node *BLOCK_LIST; ++ c_tree_node *THIS_BLOCK; ++ c_tree_node *PARAM_LIST; ++ char PARAM_FLAG; ++ char KEEP; ++ char KEEP_IF_SUBBLOCKS; ++ char TAG_TRANSPARENT; ++ char N_INCOMPLETE; ++ char SUBBLOCKS_TAG_TRANSPARENT; ++ } c_binding_level; ++ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern c_tree_node *c_tree_program_node; ++ ++ extern c_tree_node *c_pending_invalid_xref; ++ extern char *c_pending_invalid_xref_file; ++ extern int c_pending_invalid_xref_line; ++ extern c_tree_node *c_current_function_decl; ++ extern int c_current_function_returns_value; ++ extern int c_current_function_returns_null; ++ ++ extern c_tree_node *c_lastiddecl; ++ ++ extern int c_skip_evaluation; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern c_binding_level * c_alloc_binding_level __P(()); ++ extern int c_global_bindings_p __P(()); ++ extern void c_view_binding __P((c_binding_level *Binding)); ++ extern void c_view_current_binding __P(()); ++ extern void c_clear_parm_order __P(()); ++ extern void c_push_level __P((int tag_transparent)); ++ extern c_tree_node * c_pop_level __P((int keep, int reverse, int functionbody)); ++ extern c_tree_node * c_lookup_name __P((c_tree_node *TreeName)); ++ extern c_tree_node * c_lookup_name_current_level __P((c_tree_node *TreeName)); ++ extern int c_is_self_promoting_args_p __P((c_tree_node *parms)); ++ extern int c_is_chain_member __P((c_tree_node *elem, c_tree_node *chain)); ++ extern c_tree_node * c_push_decl __P((c_tree_node *TreeDecl)); ++ extern void c_push_parm_decl __P((c_tree_node *parm)); ++ extern void c_init_decl_processing __P(()); ++ extern void c_decl_attributes __P((c_tree_node *Node, c_tree_node *Attributes, c_tree_node *Prefix_attributes)); ++ extern c_tree_node * c_grokfield __P((char *Filename, int Line, c_tree_node *Declarator, c_tree_node *Declspecs, c_tree_node *Width)); ++ extern c_tree_node * c_groktypename __P((c_tree_node *Typename)); ++ extern c_tree_node * c_start_decl __P((c_tree_node *Declarator, c_tree_node *Declspecs, int Initialized, c_tree_node *Attributes, c_tree_node *Prefix_attributes)); ++ extern void c_finish_decl __P((c_tree_node *decl, c_tree_node *init, c_tree_node *asmspec_tree)); ++ extern void c_split_specs_attrs __P((c_tree_node *Specs_attrs, c_tree_node **Declspecs, c_tree_node **Prefix_attributes)); ++ extern c_tree_node * c_round_up __P((c_tree_node *value, int divisor)); ++ extern void c_layout_decl __P((c_tree_node *decl, unsigned known_align)); ++ extern void c_layout_type __P((c_tree_node *type)); ++ extern void c_parmlist_tags_warning __P(()); ++ extern void c_declare_parm_level __P((int definition_flag)); ++ extern int c_in_parm_level_p __P(()); ++ extern int c_kept_level_p __P(()); ++ extern void c_push_tag __P((c_tree_node *name, c_tree_node *type)); ++ extern c_tree_node * c_start_struct __P((int code_type, c_tree_node *name)); ++ extern c_tree_node * c_finish_struct __P((c_tree_node *t, c_tree_node *fieldlist, c_tree_node *attributes)); ++ extern c_tree_node * c_xref_tag __P((int code, c_tree_node *name)); ++ extern void c_shadow_tag_warned __P((c_tree_node *declspecs, int warned)); ++ extern void c_shadow_tag __P((c_tree_node *declspecs)); ++ extern c_tree_node * c_shadow_label __P((c_tree_node *name)); ++ extern c_tree_node * c_lookup_label __P((c_tree_node *id)); ++ extern c_tree_node * c_define_label __P((char *filename, int line, c_tree_node *name)); ++ extern c_tree_node * c_start_enum __P((c_tree_node *name)); ++ extern c_tree_node * c_finish_enum __P((c_tree_node *enumtype, c_tree_node *values, c_tree_node *attributes)); ++ extern c_tree_node * c_build_enumerator __P((c_tree_node *name, c_tree_node *value)); ++ extern int c_start_function __P((c_tree_node *declarator, c_tree_node *declspecs, c_tree_node *prefix_attributes, c_tree_node *attributes, int nested)); ++ extern c_tree_node * c_finish_function __P((int nested, c_tree_node *body)); ++ extern c_tree_node * c_get_tags __P(()); ++ extern c_tree_node * c_get_decls __P(()); ++ extern c_tree_node * c_get_parm_info __P((int void_at_end)); ++ extern void c_store_parm_decls __P(()); ++ extern int c_complete_array_type __P((c_tree_node *type, c_tree_node *initial_value, int do_default)); ++ extern c_tree_node * c_implicitly_declare __P((c_tree_node *functionid)); ++ extern void c_c_mark_varargs __P(()); ++ extern void c_mark_varargs __P(()); ++ ++ extern void c_finish_file __P((c_tree_node *TreeNode )); ++ ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_clex.c alliance/gcp/src/c_clex.c +--- alliance-5.0/gcp/src/c_clex.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_clex.c 2002-09-30 18:20:19.000000000 +0200 +@@ -0,0 +1,2461 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/* Lexical analyzer for C and Objective C. ++ Copyright (C) 1987, 88, 89, 92, 94-97, 1998 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++# include ++# include ++# include ++# include ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_flags.h" ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_clex.h" ++# include "c_cdecl.h" ++# include "c_ccomp.h" ++# include "c_convert.h" ++# include "c_ctypeck.h" ++# include "c_debug.h" ++# include "c_parse.h" ++ ++#include ++ ++/* MULTIBYTE_CHARS support only works for native compilers. ++ ??? Ideally what we want is to model widechar support after ++ the current floating point support. */ ++#ifdef CROSS_COMPILE ++#undef MULTIBYTE_CHARS ++#endif ++ ++#ifdef MULTIBYTE_CHARS ++#include ++#include ++#endif ++ ++#ifndef errno ++extern int errno; ++#endif ++ ++#if USE_CPPLIB ++#include "cpplib.h" ++cpp_reader parse_in; ++cpp_options parse_options; ++static enum cpp_token cpp_token; ++#endif ++ ++/* The elements of `c_ridpointers' are identifier nodes ++ for the reserved type names and storage classes. ++ It is indexed by a RID_... value. */ ++ ++c_tree_node *c_ridpointers[(int) RID_MAX]; ++FILE *c_y_in = (FILE *)0; ++int c_lineno; ++ ++/* Cause the `c_y_debug' variable to be defined. */ ++#define C_Y_DEBUG 1 ++ ++#if USE_CPPLIB ++static unsigned char *c_y__cur, *c_y__lim; ++ ++int ++c_y__get_token () ++{ ++ for (;;) ++ { ++ parse_in.limit = parse_in.token_buffer; ++ cpp_token = cpp_get_token (&parse_in); ++ if (cpp_token == CPP_EOF) ++ return -1; ++ c_y__lim = CPP_PWRITTEN (&parse_in); ++ c_y__cur = parse_in.token_buffer; ++ if (c_y__cur < c_y__lim) ++ return *c_y__cur++; ++ } ++} ++ ++#define GETC() (c_y__cur < c_y__lim ? *c_y__cur++ : c_y__get_token ()) ++#define UNGETC(c) ((c), c_y__cur--) ++#else ++#define GETC() getc (c_y_in) ++#define UNGETC(c) ungetc (c, c_y_in) ++#endif ++ ++/* the declaration found for the last IDENTIFIER token read in. ++ c_y_lex must look this up to detect typedefs, which get token type TYPENAME, ++ so it is left around in case the identifier is not a typedef but is ++ used in a context which makes it a reference to a variable. */ ++c_tree_node *c_lastiddecl; ++ ++/* Nonzero enables objc features. */ ++ ++# ifdef LUDO_DONE ++extern tree c_is_class_name (); ++# else ++# define c_is_class_name(N) 0 ++# endif ++ ++extern int c_y_debug; ++ ++/* Number of bytes in a wide character. */ ++ ++static int maxtoken; /* Current nominal length of token buffer. */ ++char *token_buffer; /* Pointer to token buffer. ++ Actual allocated length is maxtoken + 2. ++ This is not static because objc-parse.y uses it. */ ++ ++static int indent_level = 0; /* Number of { minus number of }. */ ++ ++/* Nonzero if end-of-file has been seen on input. */ ++static int end_of_file; ++ ++# ifdef LUDO_DONE ++#if !USE_CPPLIB ++/* Buffered-back input character; faster than using ungetc. */ ++static int nextchar = -1; ++#endif ++# else ++#if !USE_CPPLIB ++/* Buffered-back input character; faster than using ungetc. */ ++static int nextchar = '\n'; ++#endif ++# endif ++ ++ ++int check_newline (); ++ ++/* Do not insert generated code into the source, instead, include it. ++ This allows us to build gcc automatically even for targets that ++ need to add or modify the reserved keyword lists. */ ++#include "c_gperf.h" ++ ++/* Return something to represent absolute declarators containing a *. ++ TARGET is the absolute declarator that the * contains. ++ TYPE_QUALS is a list of modifiers such as const or volatile ++ to apply to the pointer type, represented as identifiers. ++ ++ We return an INDIRECT_REF whose "contents" are TARGET ++ and whose type is the modifier list. */ ++ ++# ifdef LUDO_DONE ++tree ++make_pointer_declarator (type_quals, target) ++ tree type_quals, target; ++{ ++ return build1 (INDIRECT_REF, type_quals, target); ++} ++# endif ++ ++static void forget_protocol_qualifiers () ++{ ++ int i, n = sizeof wordlist / sizeof (struct resword); ++ ++ for (i = 0; i < n; i++) ++ if ((int) wordlist[i].rid >= (int) RID_IN ++ && (int) wordlist[i].rid <= (int) RID_ONEWAY) ++ wordlist[i].name = ""; ++} ++ ++# ifdef LUDO_NO_SKIP ++static void remember_protocol_qualifiers () ++{ ++ int i, n = sizeof wordlist / sizeof (struct resword); ++ ++ for (i = 0; i < n; i++) ++ if (wordlist[i].rid == RID_IN) ++ wordlist[i].name = "in"; ++ else if (wordlist[i].rid == RID_OUT) ++ wordlist[i].name = "out"; ++ else if (wordlist[i].rid == RID_INOUT) ++ wordlist[i].name = "inout"; ++ else if (wordlist[i].rid == RID_BYCOPY) ++ wordlist[i].name = "bycopy"; ++ else if (wordlist[i].rid == RID_ONEWAY) ++ wordlist[i].name = "oneway"; ++} ++# endif ++ ++#if USE_CPPLIB ++void ++init_parse (filename) ++ char *filename; ++{ ++ init_lex (); ++ c_y__cur = "\n"; ++ c_y__lim = c_y__cur+1; ++ ++ cpp_reader_init (&parse_in); ++ parse_in.data = &parse_options; ++ cpp_options_init (&parse_options); ++ cpp_handle_options (&parse_in, 0, NULL); /* FIXME */ ++ parse_in.show_column = 1; ++ if (! cpp_start_read (&parse_in, filename)) ++ abort (); ++} ++ ++void ++finish_parse () ++{ ++ cpp_finish (&parse_in); ++} ++#endif ++ ++void ++c_init_lex ( InputFileName ) ++ ++ char *InputFileName; ++{ ++ char *buffer; ++ ++ c_input_file_stack = ++ (struct c_file_stack *)autallocblock(sizeof (struct c_file_stack)); ++ ++ buffer = autallocblock( strlen( InputFileName ) + 3 ); ++ sprintf( buffer, "\"%s\"", InputFileName ); ++ ++ c_input_file_stack->NAME = autnamealloc( buffer ); ++ c_input_filename = c_input_file_stack->NAME; ++ ++ autfreeblock( buffer); ++ ++ /* Make identifier nodes long enough for the language-specific slots. */ ++# ifdef LUDO_DONE ++ set_identifier_size(sizeof (struct lang_identifier)); ++# endif ++ ++ /* Start it at 0, because check_newline is called at the very beginning ++ and will increment it to 1. */ ++ c_lineno = 0; ++ ++#ifdef MULTIBYTE_CHARS ++ /* Change to the native locale for multibyte conversions. */ ++ setlocale (LC_CTYPE, ""); ++#endif ++ ++ c_lastiddecl = 0; ++ indent_level = 0; ++ end_of_file = 0; ++ ++# ifdef LUDO_DONE ++#if !USE_CPPLIB ++/* Buffered-back input character; faster than using ungetc. */ ++ nextchar = -1; ++#endif ++# else ++#if !USE_CPPLIB ++/* Buffered-back input character; faster than using ungetc. */ ++ nextchar = '\n'; ++#endif ++# endif ++ ++ maxtoken = 40; ++ token_buffer = (char *)autallocblock( maxtoken + 2); ++ ++ c_ridpointers[(int) RID_INT] = c_tree_get_identifier ("int"); ++ c_ridpointers[(int) RID_CHAR] = c_tree_get_identifier ("char"); ++ c_ridpointers[(int) RID_VOID] = c_tree_get_identifier ("void"); ++ c_ridpointers[(int) RID_FLOAT] = c_tree_get_identifier ("float"); ++ c_ridpointers[(int) RID_DOUBLE] = c_tree_get_identifier ("double"); ++ c_ridpointers[(int) RID_SHORT] = c_tree_get_identifier ("short"); ++ c_ridpointers[(int) RID_LONG] = c_tree_get_identifier ("long"); ++ c_ridpointers[(int) RID_UNSIGNED] = c_tree_get_identifier ("unsigned"); ++ c_ridpointers[(int) RID_SIGNED] = c_tree_get_identifier ("signed"); ++ c_ridpointers[(int) RID_INLINE] = c_tree_get_identifier ("inline"); ++ c_ridpointers[(int) RID_CONST] = c_tree_get_identifier ("const"); ++ c_ridpointers[(int) RID_VOLATILE] = c_tree_get_identifier ("volatile"); ++ c_ridpointers[(int) RID_AUTO] = c_tree_get_identifier ("auto"); ++ c_ridpointers[(int) RID_STATIC] = c_tree_get_identifier ("static"); ++ c_ridpointers[(int) RID_EXTERN] = c_tree_get_identifier ("extern"); ++ c_ridpointers[(int) RID_TYPEDEF] = c_tree_get_identifier ("typedef"); ++ c_ridpointers[(int) RID_REGISTER] = c_tree_get_identifier ("register"); ++ c_ridpointers[(int) RID_ITERATOR] = c_tree_get_identifier ("iterator"); ++ c_ridpointers[(int) RID_COMPLEX] = c_tree_get_identifier ("complex"); ++ c_ridpointers[(int) RID_ID] = c_tree_get_identifier ("id"); ++ c_ridpointers[(int) RID_IN] = c_tree_get_identifier ("in"); ++ c_ridpointers[(int) RID_OUT] = c_tree_get_identifier ("out"); ++ c_ridpointers[(int) RID_INOUT] = c_tree_get_identifier ("inout"); ++ c_ridpointers[(int) RID_BYCOPY] = c_tree_get_identifier ("bycopy"); ++ c_ridpointers[(int) RID_ONEWAY] = c_tree_get_identifier ("oneway"); ++ forget_protocol_qualifiers(); ++ ++ /* Some options inhibit certain reserved words. ++ Clear those words out of the hash table so they won't be recognized. */ ++#define UNSET_RESERVED_WORD(STRING) \ ++ do { struct resword *s = c_is_reserved_word (STRING, sizeof (STRING) - 1); \ ++ if (s) s->name = ""; } while (0) ++ ++ if (! c_doing_objc_thang) ++ UNSET_RESERVED_WORD ("id"); ++ ++ if (c_flag_traditional) ++ { ++ UNSET_RESERVED_WORD ("const"); ++ UNSET_RESERVED_WORD ("volatile"); ++ UNSET_RESERVED_WORD ("typeof"); ++ UNSET_RESERVED_WORD ("signed"); ++ UNSET_RESERVED_WORD ("inline"); ++ UNSET_RESERVED_WORD ("iterator"); ++ UNSET_RESERVED_WORD ("complex"); ++ } ++ if (c_flag_no_asm) ++ { ++ UNSET_RESERVED_WORD ("asm"); ++ UNSET_RESERVED_WORD ("typeof"); ++ UNSET_RESERVED_WORD ("inline"); ++ UNSET_RESERVED_WORD ("iterator"); ++ UNSET_RESERVED_WORD ("complex"); ++ } ++} ++ ++void ++c_reinit_parse_for_function () ++{ ++} ++ ++/* Function used when c_y_debug is set, to print a token in more detail. */ ++ ++void ++c_y_print (file, c_y_char, c_y_lval) ++ FILE *file; ++ int c_y_char; ++ C_Y_STYPE c_y_lval; ++{ ++ /* ++ if ( c_y_char >= tok_IDENTIFIER ) ++ { ++ fprintf( stdout, "\n" ); ++ c_fprintf( stdout, "token %d\n", c_y_char ); ++ loc_c_tree_view_node( c_y_lval.ttype ); ++ } ++ */ ++ /* ++ switch (c_y_char) ++ { ++ case tok_IDENTIFIER: ++ case tok_TYPENAME: ++ case tok_OBJECTNAME: ++ case tok_CONSTANT: ++ loc_c_tree_view_node( c_y_lval.ttype ); ++ break; ++ ++ case tok_SCSPEC : ++ case tok_TYPESPEC : ++ case tok_TYPE_QUAL : ++ case tok_STRING : ++ case tok_ELLIPSIS : ++ case tok_SIZEOF : ++ case tok_ENUM : ++ case tok_STRUCT : ++ case tok_UNION : ++ case tok_IF : ++ case tok_ELSE : ++ case tok_WHILE : ++ case tok_DO : ++ case tok_FOR : ++ case tok_SWITCH : ++ case tok_CASE : ++ case tok_DEFAULT : ++ case tok_BREAK : ++ case tok_CONTINUE : ++ case tok_RETURN : ++ case tok_GOTO : ++ case tok_ASM_KEYWORD : ++ case tok_TYPEOF : ++ case tok_ALIGNOF : ++ case tok_ATTRIBUTE : ++ case tok_EXTENSION : ++ case tok_LABEL : ++ case tok_REALPART : ++ case tok_IMAGPART : ++ case tok_ASSIGN : ++ case tok_OROR : ++ case tok_ANDAND : ++ case tok_EQCOMPARE : ++ case tok_ARITHCOMPARE : ++ case tok_LSHIFT : ++ case tok_RSHIFT : ++ case tok_UNARY : ++ case tok_PLUSPLUS : ++ case tok_MINUSMINUS : ++ case tok_HYPERUNARY : ++ case tok_POINTSAT : ++ case tok_INTERFACE : ++ case tok_IMPLEMENTATION : ++ case tok_END : ++ case tok_SELECTOR : ++ case tok_DEFS : ++ case tok_ENCODE : ++ case tok_CLASSNAME : ++ case tok_PUBLIC : ++ case tok_PRIVATE : ++ case tok_PROTECTED : ++ case tok_PROTOCOL : ++ case tok_CLASS : ++ case tok_ALIAS : ++ case tok_OBJC_STRING : ++ break; ++ } ++ */ ++} ++ ++/* If C is not whitespace, return C. ++ Otherwise skip whitespace and return first nonwhite char read. */ ++ ++static int ++skip_white_space (c) ++ register int c; ++{ ++ static int newline_warning = 0; ++ ++ for (;;) ++ { ++ switch (c) ++ { ++ /* We don't recognize comments here, because ++ cpp output can include / and * consecutively as operators. ++ Also, there's no need, since cpp removes all comments. */ ++ ++ case '\n': ++ c = check_newline (); ++ break; ++ ++ case ' ': ++ case '\t': ++ case '\f': ++ case '\v': ++ case '\b': ++ c = GETC(); ++ break; ++ ++ case '\r': ++ /* ANSI C says the effects of a carriage return in a source file ++ are undefined. */ ++ if (c_pedantic && !newline_warning) ++ { ++ warning ("carriage return in source file"); ++ warning ("(we only warn about the first carriage return)"); ++ newline_warning = 1; ++ } ++ c = GETC(); ++ break; ++ ++ case '\\': ++ c = GETC(); ++ if (c == '\n') ++ c_lineno++; ++ else ++ { ++ error ("stray '\\' in program"); ++ } ++ c = GETC(); ++ break; ++ ++ default: ++ return (c); ++ } ++ } ++} ++ ++/* Skips all of the white space at the current location in the input file. ++ Must use and reset nextchar if it has the next character. */ ++ ++void c_position_after_white_space () ++{ ++ register int c; ++ ++#if !USE_CPPLIB ++ if (nextchar != -1) ++ c = nextchar, nextchar = -1; ++ else ++#endif ++ c = GETC(); ++ ++ UNGETC (skip_white_space (c)); ++} ++ ++/* Make the token buffer longer, preserving the data in it. ++ P should point to just beyond the last valid character in the old buffer. ++ The value we return is a pointer to the new buffer ++ at a place corresponding to P. */ ++ ++static char * ++extend_token_buffer (p) ++ char *p; ++{ ++ int offset = p - token_buffer; ++ ++ maxtoken = maxtoken * 2 + 10; ++ token_buffer = (char *)realloc( token_buffer, maxtoken + 2 ); ++ ++ return token_buffer + offset; ++} ++ ++#if !USE_CPPLIB ++#define GET_DIRECTIVE_LINE() get_directive_line (c_y_in) ++#else /* USE_CPPLIB */ ++/* Read the rest of a #-directive from input stream FINPUT. ++ In normal use, the directive name and the white space after it ++ have already been read, so they won't be included in the result. ++ We allow for the fact that the directive line may contain ++ a newline embedded within a character or string literal which forms ++ a part of the directive. ++ ++ The value is a string in a reusable buffer. It remains valid ++ only until the next time this function is called. */ ++ ++static char * ++GET_DIRECTIVE_LINE () ++{ ++ static char *directive_buffer = NULL; ++ static unsigned buffer_length = 0; ++ register char *p; ++ register char *buffer_limit; ++ register int looking_for = 0; ++ register int char_escaped = 0; ++ ++ if (buffer_length == 0) ++ { ++ directive_buffer = (char *)xmalloc (128); ++ buffer_length = 128; ++ } ++ ++ buffer_limit = &directive_buffer[buffer_length]; ++ ++ for (p = directive_buffer; ; ) ++ { ++ int c; ++ ++ /* Make buffer bigger if it is full. */ ++ if (p >= buffer_limit) ++ { ++ register unsigned bytes_used = (p - directive_buffer); ++ ++ buffer_length *= 2; ++ directive_buffer ++ = (char *)xrealloc (directive_buffer, buffer_length); ++ p = &directive_buffer[bytes_used]; ++ buffer_limit = &directive_buffer[buffer_length]; ++ } ++ ++ c = GETC (); ++ ++ /* Discard initial whitespace. */ ++ if ((c == ' ' || c == '\t') && p == directive_buffer) ++ continue; ++ ++ /* Detect the end of the directive. */ ++ if (c == '\n' && looking_for == 0) ++ { ++ UNGETC (c); ++ c = '\0'; ++ } ++ ++ *p++ = c; ++ ++ if (c == 0) ++ return directive_buffer; ++ ++ /* Handle string and character constant syntax. */ ++ if (looking_for) ++ { ++ if (looking_for == c && !char_escaped) ++ looking_for = 0; /* Found terminator... stop looking. */ ++ } ++ else ++ if (c == '\'' || c == '"') ++ looking_for = c; /* Don't stop buffering until we see another ++ another one of these (or an EOF). */ ++ ++ /* Handle backslash. */ ++ char_escaped = (c == '\\' && ! char_escaped); ++ } ++} ++#endif /* USE_CPPLIB */ ++ ++/* At the beginning of a line, increment the line number ++ and process any #-directive on this line. ++ If the line is a #-directive, read the entire line and return a newline. ++ Otherwise, return the line's first non-whitespace character. */ ++ ++int ++check_newline () ++{ ++ register int c; ++ register int token; ++ ++ c_lineno++; ++ ++ /* Read first nonwhite char on the line. */ ++ ++ c = GETC(); ++ while (c == ' ' || c == '\t') ++ c = GETC(); ++ ++ if (c != '#') ++ { ++ /* If not #, return it so caller will use it. */ ++ return c; ++ } ++ ++ /* Read first nonwhite char after the `#'. */ ++ ++ c = GETC(); ++ while (c == ' ' || c == '\t') ++ c = GETC(); ++ ++ /* If a letter follows, then if the word here is `line', skip ++ it and ignore it; otherwise, ignore the line, with an error ++ if the word isn't `pragma', `ident', `define', or `undef'. */ ++ ++ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) ++ { ++ if (c == 'p') ++ { ++ if (GETC() == 'r' ++ && GETC() == 'a' ++ && GETC() == 'g' ++ && GETC() == 'm' ++ && GETC() == 'a' ++ && ((c = GETC()) == ' ' || c == '\t' || c == '\n')) ++ { ++ while (c == ' ' || c == '\t') ++ c = GETC (); ++ if (c == '\n') ++ return c; ++#ifdef HANDLE_SYSV_PRAGMA ++ UNGETC (c); ++ token = c_y_lex (); ++ if (token != IDENTIFIER) ++ goto skipline; ++ return handle_sysv_pragma (token); ++#else /* !HANDLE_SYSV_PRAGMA */ ++#ifdef HANDLE_PRAGMA ++#if !USE_CPPLIB ++ UNGETC (c); ++ token = c_y_lex (); ++ if (token != IDENTIFIER) ++ goto skipline; ++ if (HANDLE_PRAGMA (c_y_in, c_y_lval.ttype)) ++ { ++ c = GETC (); ++ return c; ++ } ++#else ++ ??? do not know what to do ???; ++#endif /* !USE_CPPLIB */ ++#endif /* HANDLE_PRAGMA */ ++#endif /* !HANDLE_SYSV_PRAGMA */ ++ goto skipline; ++ } ++ } ++ ++ else if (c == 'd') ++ { ++ if (GETC() == 'e' ++ && GETC() == 'f' ++ && GETC() == 'i' ++ && GETC() == 'n' ++ && GETC() == 'e' ++ && ((c = GETC()) == ' ' || c == '\t' || c == '\n')) ++ { ++ if (c != '\n') ++ { ++# ifdef LUDO_DONE ++ debug_define (c_lineno, GET_DIRECTIVE_LINE ()); ++# endif ++ } ++ goto skipline; ++ } ++ } ++ else if (c == 'u') ++ { ++ if (GETC() == 'n' ++ && GETC() == 'd' ++ && GETC() == 'e' ++ && GETC() == 'f' ++ && ((c = GETC()) == ' ' || c == '\t' || c == '\n')) ++ { ++ if (c != '\n') ++ { ++# ifdef LUDO_DONE ++ debug_undef (c_lineno, GET_DIRECTIVE_LINE ()); ++# endif ++ } ++ goto skipline; ++ } ++ } ++ else if (c == 'l') ++ { ++ if (GETC() == 'i' ++ && GETC() == 'n' ++ && GETC() == 'e' ++ && ((c = GETC()) == ' ' || c == '\t')) ++ goto linenum; ++ } ++ else if (c == 'i') ++ { ++ if (GETC() == 'd' ++ && GETC() == 'e' ++ && GETC() == 'n' ++ && GETC() == 't' ++ && ((c = GETC()) == ' ' || c == '\t')) ++ { ++ /* #ident. The c_pedantic warning is now in cccp.c. */ ++ ++ /* Here we have just seen `#ident '. ++ A string constant should follow. */ ++ ++ while (c == ' ' || c == '\t') ++ c = GETC(); ++ ++ /* If no argument, ignore the line. */ ++ if (c == '\n') ++ return c; ++ ++ UNGETC (c); ++ token = c_y_lex (); ++ if (( token != tok_STRING ) || ++ ( CTreeNodeFirstCode( c_y_lval.ttype ) != C_STRING_NODE )) ++ { ++ error ("invalid #ident"); ++ goto skipline; ++ } ++ if (!c_flag_no_ident) ++ { ++#ifdef ASM_OUTPUT_IDENT ++ ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (c_y_lval.ttype)); ++#endif ++ } ++ ++ /* Skip the rest of this line. */ ++ goto skipline; ++ } ++ } ++ ++ error ("undefined or invalid # directive"); ++ goto skipline; ++ } ++ ++linenum: ++ /* Here we have either `#line' or `# '. ++ In either case, it should be a line number; a digit should follow. */ ++ ++ while (c == ' ' || c == '\t') ++ c = GETC(); ++ ++ /* If the # is the only nonwhite char on the line, ++ just ignore it. Check the new newline. */ ++ if (c == '\n') ++ return c; ++ ++ /* Something follows the #; read a token. */ ++ ++ UNGETC (c); ++ token = c_y_lex (); ++ ++ if ((token == tok_CONSTANT) && ++ (CTreeNodeFirstCode( c_y_lval.ttype ) == C_INT_CST_NODE)) ++ { ++ int old_lineno = c_lineno; ++ int used_up = 0; ++ /* subtract one, because it is the following line that ++ gets the specified number */ ++ ++ int l = CTreeIntCstLow(c_y_lval.ttype) - 1; ++ ++ /* Is this the last nonwhite stuff on the line? */ ++ c = GETC(); ++ while (c == ' ' || c == '\t') ++ c = GETC(); ++ if (c == '\n') ++ { ++ /* No more: store the line number and check following line. */ ++ c_lineno = l; ++ return c; ++ } ++ UNGETC (c); ++ ++ /* More follows: it must be a string constant (filename). */ ++ ++ /* Read the string constant. */ ++ token = c_y_lex (); ++ ++ if ((token != tok_STRING) || ++ ( CTreeNodeFirstCode( c_y_lval.ttype ) != C_STRING_NODE)) ++ { ++ error ("invalid #line"); ++ goto skipline; ++ } ++ ++ c_input_filename ++ = (char *) autallocblock( CTreeStringLength(c_y_lval.ttype) + 1); ++ strcpy (c_input_filename, CTreeStringPointer(c_y_lval.ttype)); ++ c_lineno = l; ++ ++ /* Each change of file name ++ reinitializes whether we are now in a system header. */ ++ c_in_system_header = 0; ++ ++ if (c_main_input_filename == 0) ++ c_main_input_filename = c_input_filename; ++ ++ /* Is this the last nonwhite stuff on the line? */ ++ c = GETC(); ++ while (c == ' ' || c == '\t') ++ c = GETC(); ++ if (c == '\n') ++ { ++ /* Update the name in the top element of input_file_stack. */ ++ if (c_input_file_stack) ++ c_input_file_stack->NAME = c_input_filename; ++ ++ return c; ++ } ++ UNGETC (c); ++ ++ token = c_y_lex (); ++ used_up = 0; ++ ++ /* `1' after file name means entering new file. ++ `2' after file name means just left a file. */ ++ ++ if ((token == tok_CONSTANT) ++ && (CTreeNodeFirstCode(c_y_lval.ttype ) == C_INT_CST_NODE )) ++ { ++ if (CTreeIntCstLow(c_y_lval.ttype) == 1) ++ { ++ /* Pushing to a new file. */ ++ struct c_file_stack *p ++ = (struct c_file_stack *) autallocblock(sizeof (struct c_file_stack)); ++ c_input_file_stack->LINE = old_lineno; ++ p->NEXT = c_input_file_stack; ++ p->NAME = c_input_filename; ++ p->INDENT_LEVEL = indent_level; ++ c_input_file_stack = p; ++ c_input_file_stack_tick++; ++# ifdef LUDO_DONE ++ debug_start_source_file (c_input_filename); ++# endif ++ used_up = 1; ++ } ++ else if (CTreeIntCstLow(c_y_lval.ttype) == 2) ++ { ++ /* Popping out of a file. */ ++ if (c_input_file_stack->NEXT) ++ { ++ struct c_file_stack *p = c_input_file_stack; ++ if (indent_level != p->INDENT_LEVEL) ++ { ++ c_warning_with_file_and_line( p->NAME, old_lineno, ++ "This file contains more `%c's than `%c's.", ++ indent_level > p->INDENT_LEVEL ? '{' : '}', ++ indent_level > p->INDENT_LEVEL ? '}' : '{'); ++ } ++ c_input_file_stack = p->NEXT; ++ free (p); ++ c_input_file_stack_tick++; ++# ifdef LUDO_DONE ++ debug_end_source_file (c_input_file_stack->line); ++# endif ++ } ++ else ++ { ++ error ("#-lines for entering and leaving files don't match"); ++ } ++ ++ used_up = 1; ++ } ++ } ++ ++ /* Now that we've pushed or popped the input stack, ++ update the name in the top element. */ ++ if (c_input_file_stack) ++ c_input_file_stack->NAME = c_input_filename; ++ ++ /* If we have handled a `1' or a `2', ++ see if there is another number to read. */ ++ if (used_up) ++ { ++ /* Is this the last nonwhite stuff on the line? */ ++ c = GETC(); ++ while (c == ' ' || c == '\t') ++ c = GETC(); ++ if (c == '\n') ++ return c; ++ UNGETC (c); ++ ++ token = c_y_lex (); ++ used_up = 0; ++ } ++ ++ /* `3' after file name means this is a system header file. */ ++ ++ if (( token == tok_CONSTANT ) ++ && ( CTreeNodeFirstCode(c_y_lval.ttype) == C_INT_CST_NODE ) ++ && ( CTreeIntCstLow( c_y_lval.ttype) == 3 )) ++ c_in_system_header = 1, used_up = 1; ++ ++ if (used_up) ++ { ++ /* Is this the last nonwhite stuff on the line? */ ++ c = GETC(); ++ while (c == ' ' || c == '\t') ++ c = GETC(); ++ if (c == '\n') ++ return c; ++ UNGETC (c); ++ } ++ ++ warning ("unrecognized text at end of #line"); ++ } ++ else ++ { ++ error ("invalid #-line"); ++ } ++ ++ /* skip the rest of this line. */ ++ skipline: ++#if !USE_CPPLIB ++ if (c != '\n' && c != EOF && nextchar >= 0) ++ c = nextchar, nextchar = -1; ++#endif ++ while (c != '\n' && c != EOF) ++ c = GETC(); ++ return c; ++} ++ ++#ifdef HANDLE_SYSV_PRAGMA ++ ++/* Handle a #pragma directive. ++ TOKEN is the token we read after `#pragma'. Processes the entire input ++ line and returns a character for the caller to reread: either \n or EOF. */ ++ ++/* This function has to be in this file, in order to get at ++ the token types. */ ++ ++int ++handle_sysv_pragma (token) ++ register int token; ++{ ++ register int c; ++ ++ for (;;) ++ { ++ switch (token) ++ { ++ case tok_IDENTIFIER: ++ case tok_TYPENAME: ++ case tok_STRING: ++ case tok_CONSTANT: ++ handle_pragma_token (token_buffer, c_y_lval.ttype); ++ break; ++ default: ++ handle_pragma_token (token_buffer, 0); ++ } ++#if !USE_CPPLIB ++ if (nextchar >= 0) ++ c = nextchar, nextchar = -1; ++ else ++#endif ++ c = GETC (); ++ ++ while (c == ' ' || c == '\t') ++ c = GETC (); ++ if (c == '\n' || c == EOF) ++ { ++ handle_pragma_token (0, 0); ++ return c; ++ } ++ UNGETC (c); ++ token = c_y_lex (); ++ } ++} ++ ++#endif /* HANDLE_SYSV_PRAGMA */ ++ ++#define ENDFILE -1 /* token that represents end-of-file */ ++ ++/* Read an escape sequence, returning its equivalent as a character, ++ or store 1 in *ignore_ptr if it is backslash-newline. */ ++ ++static int ++readescape (ignore_ptr) ++ int *ignore_ptr; ++{ ++ register int c = GETC(); ++ register int code; ++ register unsigned count; ++ unsigned firstdig = 0; ++ int nonnull; ++ ++ switch (c) ++ { ++ case 'x': ++ if (c_warn_traditional) ++ { ++ warning ("the meaning of `\\x' varies with -traditional"); ++ } ++ ++ if (c_flag_traditional) ++ return c; ++ ++ code = 0; ++ count = 0; ++ nonnull = 0; ++ while (1) ++ { ++ c = GETC(); ++ if (!(c >= 'a' && c <= 'f') ++ && !(c >= 'A' && c <= 'F') ++ && !(c >= '0' && c <= '9')) ++ { ++ UNGETC (c); ++ break; ++ } ++ code *= 16; ++ if (c >= 'a' && c <= 'f') ++ code += c - 'a' + 10; ++ if (c >= 'A' && c <= 'F') ++ code += c - 'A' + 10; ++ if (c >= '0' && c <= '9') ++ code += c - '0'; ++ if (code != 0 || count != 0) ++ { ++ if (count == 0) ++ firstdig = code; ++ count++; ++ } ++ nonnull = 1; ++ } ++ if (! nonnull) ++ { ++ error ("\\x used with no following hex digits"); ++ } ++ else if (count == 0) ++ /* Digits are all 0's. Ok. */ ++ ; ++ else ++ if ((count - 1) * 4 >= CTreeTypePrecision( c_integer_type_node) ++ || (count > 1 ++ && ((1 << (CTreeTypePrecision(c_integer_type_node) - (count - 1)*4)) ++ <= firstdig))) ++ { ++ pedwarn ("hex escape out of range"); ++ } ++ return code; ++ ++ case '0': case '1': case '2': case '3': case '4': ++ case '5': case '6': case '7': ++ code = 0; ++ count = 0; ++ while ((c <= '7') && (c >= '0') && (count++ < 3)) ++ { ++ code = (code * 8) + (c - '0'); ++ c = GETC(); ++ } ++ UNGETC (c); ++ return code; ++ ++ case '\\': case '\'': case '"': ++ return c; ++ ++ case '\n': ++ c_lineno++; ++ *ignore_ptr = 1; ++ return 0; ++ ++ case 'n': ++ return '\n'; /* TARGET_NEWLINE */ ++ ++ case 't': ++ return '\t'; /* TARGET_TAB */ ++ ++ case 'r': ++ return '\r'; /* TARGET_CR */ ++ ++ case 'f': ++ return '\f'; /* TARGET_FF */ ++ ++ case 'b': ++ return '\b'; /* TARGET_BS */ ++ ++ case 'a': ++ if (c_warn_traditional) ++ { ++ warning ("the meaning of `\\a' varies with -traditional"); ++ } ++ ++ if (c_flag_traditional) ++ return c; ++ ++ return '\a'; /* TARGET_BELL */ ++ ++ case 'v': ++#if 0 /* Vertical tab is present in common usage compilers. */ ++ if (c_flag_traditional) ++ return c; ++#endif ++ return '\v'; /* TARGET_VT */ ++ ++ case 'e': ++ case 'E': ++ if (c_pedantic) ++ { ++ pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c); ++ } ++ return 033; ++ ++ case '?': ++ return c; ++ ++ /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */ ++ case '(': ++ case '{': ++ case '[': ++ /* `\%' is used to prevent SCCS from getting confused. */ ++ case '%': ++ if (c_pedantic) ++ { ++ pedwarn ("non-ANSI escape sequence `\\%c'", c); ++ } ++ return c; ++ } ++ if (c >= 040 && c < 0177) ++ { ++ pedwarn ("unknown escape sequence `\\%c'", c); ++ } ++ else ++ { ++ pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c); ++ } ++ return c; ++} ++ ++void ++c_y_error (string) ++ char *string; ++{ ++ char buf[200]; ++ ++ strcpy (buf, string); ++ ++ /* We can't print string and character constants well ++ because the token_buffer contains the result of processing escapes. */ ++ if (end_of_file) ++ strcat (buf, " at end of input"); ++ else if (token_buffer[0] == 0) ++ strcat (buf, " at null character"); ++ else if (token_buffer[0] == '"') ++ strcat (buf, " before string constant"); ++ else if (token_buffer[0] == '\'') ++ strcat (buf, " before character constant"); ++ else if (token_buffer[0] < 040 || (unsigned char) token_buffer[0] >= 0177) ++ sprintf (buf + strlen (buf), " before character 0%o", ++ (unsigned char) token_buffer[0]); ++ else ++ strcat (buf, " before `%s'"); ++ ++ /* fprintf( stdout, "Line %d, File %s ::", c_lineno, c_input_filename ); */ ++ error (buf, token_buffer); ++ gcpexit(1); ++} ++ ++#if 0 ++ ++struct try_type ++{ ++ tree *node_var; ++ char unsigned_flag; ++ char long_flag; ++ char long_long_flag; ++}; ++ ++struct try_type type_sequence[] = ++{ ++ { &integer_type_node, 0, 0, 0}, ++ { &unsigned_type_node, 1, 0, 0}, ++ { &long_integer_type_node, 0, 1, 0}, ++ { &long_unsigned_type_node, 1, 1, 0}, ++ { &long_long_integer_type_node, 0, 1, 1}, ++ { &long_long_unsigned_type_node, 1, 1, 1} ++}; ++#endif /* 0 */ ++ ++int ++c_y_lex () ++{ ++ register int c; ++ register char *p; ++ register int value; ++ int wide_flag = 0; ++ int objc_flag = 0; ++ ++#if !USE_CPPLIB ++ if (nextchar >= 0) ++ c = nextchar, nextchar = -1; ++ else ++#endif ++ c = GETC(); ++ ++ /* Effectively do c = skip_white_space (c) ++ but do it faster in the usual cases. */ ++ while (1) ++ switch (c) ++ { ++ case ' ': ++ case '\t': ++ case '\f': ++ case '\v': ++ case '\b': ++ c = GETC(); ++ break; ++ ++ case '\r': ++ /* Call skip_white_space so we can warn if appropriate. */ ++ ++ case '\n': ++ case '/': ++ case '\\': ++ c = skip_white_space (c); ++ default: ++ goto found_nonwhite; ++ } ++ found_nonwhite: ++ ++ token_buffer[0] = c; ++ token_buffer[1] = 0; ++ ++/* c_y_lloc.first_line = lineno; */ ++ ++ switch (c) ++ { ++ case EOF: ++ end_of_file = 1; ++ token_buffer[0] = 0; ++ value = ENDFILE; ++ break; ++ ++ case 'L': ++ /* Capital L may start a wide-string or wide-character constant. */ ++ { ++ register int c = GETC(); ++ if (c == '\'') ++ { ++ wide_flag = 1; ++ goto char_constant; ++ } ++ if (c == '"') ++ { ++ wide_flag = 1; ++ goto string_constant; ++ } ++ UNGETC (c); ++ } ++ goto letter; ++ ++ case '@': ++ if (!c_doing_objc_thang) ++ { ++ value = c; ++ break; ++ } ++ else ++ { ++ /* '@' may start a constant string object. */ ++ register int c = GETC (); ++ if (c == '"') ++ { ++ objc_flag = 1; ++ goto string_constant; ++ } ++ UNGETC (c); ++ /* Fall through to treat '@' as the start of an identifier. */ ++ } ++ ++ case 'A': case 'B': case 'C': case 'D': case 'E': ++ case 'F': case 'G': case 'H': case 'I': case 'J': ++ case 'K': case 'M': case 'N': case 'O': ++ case 'P': case 'Q': case 'R': case 'S': case 'T': ++ case 'U': case 'V': case 'W': case 'X': case 'Y': ++ case 'Z': ++ case 'a': case 'b': case 'c': case 'd': case 'e': ++ case 'f': case 'g': case 'h': case 'i': case 'j': ++ case 'k': case 'l': case 'm': case 'n': case 'o': ++ case 'p': case 'q': case 'r': case 's': case 't': ++ case 'u': case 'v': case 'w': case 'x': case 'y': ++ case 'z': ++ case '_': ++ case '$': ++ letter: ++ p = token_buffer; ++ while (isalnum (c) || c == '_' || c == '$' || c == '@') ++ { ++ /* Make sure this char really belongs in an identifier. */ ++ if (c == '@' && ! c_doing_objc_thang) ++ break; ++ if (c == '$') ++ { ++ if (! c_dollars_in_ident) ++ { ++ error ("`$' in identifier"); ++ } ++ else if (c_pedantic) ++ { ++ pedwarn ("`$' in identifier"); ++ } ++ } ++ ++ if (p >= token_buffer + maxtoken) ++ p = extend_token_buffer (p); ++ ++ *p++ = c; ++ c = GETC(); ++ } ++ ++ *p = 0; ++#if USE_CPPLIB ++ UNGETC (c); ++#else ++ nextchar = c; ++#endif ++ ++ value = tok_IDENTIFIER; ++ c_y_lval.itype = 0; ++ ++ /* Try to recognize a keyword. Uses minimum-perfect hash function */ ++ ++ { ++ register struct resword *ptr; ++ ++ ptr = c_is_reserved_word (token_buffer, p - token_buffer); ++ if ( ptr ) ++ { ++ if (ptr->rid) ++ c_y_lval.ttype = c_ridpointers[(int) ptr->rid]; ++ value = (int) ptr->token; ++ ++ /* Only return OBJECTNAME if it is a typedef. */ ++ if (c_doing_objc_thang && value == tok_OBJECTNAME) ++ { ++ c_lastiddecl = c_lookup_name(c_y_lval.ttype); ++ ++ if ((c_lastiddecl == (c_tree_node *)0) || ++ (CTreeDeclCode(c_lastiddecl) != C_TYPE_DECL)) ++ { ++ value = tok_IDENTIFIER; ++ } ++ } ++ ++ /* Even if we decided to recognize asm, still perhaps warn. */ ++ if (c_pedantic ++ && (value == tok_ASM_KEYWORD || value == tok_TYPEOF ++ || ptr->rid == RID_INLINE) ++ && token_buffer[0] != '_') ++ { ++ pedwarn ("ANSI does not permit the keyword `%s'", ++ token_buffer); ++ } ++ } ++ } ++ ++ /* If we did not find a keyword, look for an identifier ++ (or a typename). */ ++ ++ if (value == tok_IDENTIFIER) ++ { ++ if (token_buffer[0] == '@') ++ { ++ error("invalid identifier `%s'", token_buffer); ++ } ++ ++ c_y_lval.ttype = c_tree_get_identifier( token_buffer ); ++ c_lastiddecl = c_lookup_name( c_y_lval.ttype ); ++ ++ if ((c_lastiddecl != 0) && (CTreeDeclCode(c_lastiddecl) == C_TYPE_DECL)) ++ { ++ value = tok_TYPENAME; ++ } ++ /* A user-invisible read-only initialized variable ++ should be replaced by its value. ++ We handle only strings since that's the only case used in C. */ ++ else if ((c_lastiddecl != 0) && ++ (CTreeDeclCode(c_lastiddecl) == C_VAR_DECL) && ++ (CIsTreeDeclIgnored(c_lastiddecl)) && ++ (CIsTreeNodeReadOnly(c_lastiddecl)) && ++ (CTreeDeclInitial(c_lastiddecl) != (c_tree_node *)0) && ++ (CTreeNodeFirstCode( CTreeDeclInitial(c_lastiddecl)) == C_STRING_NODE)) ++ { ++ c_tree_node *stringval = CTreeDeclInitial(c_lastiddecl); ++ ++ /* Copy the string value so that we won't clobber anything ++ if we put something in the TREE_CHAIN of this one. */ ++ c_y_lval.ttype = c_tree_build_string( ++ CTreeStringLength(stringval), ++ CTreeStringPointer(stringval)); ++ value = tok_STRING; ++ } ++# ifdef LUDO_DONE ++ else if (c_doing_objc_thang) ++ { ++ c_tree_node *objc_interface_decl = c_is_class_name (c_y_lval.ttype); ++ ++ if (objc_interface_decl) ++ { ++ value = CLASSNAME; ++ c_y_lval.ttype = objc_interface_decl; ++ } ++ } ++# endif ++ } ++ ++ break; ++ ++ case '0': case '1': ++ { ++ int next_c; ++ /* Check first for common special case: single-digit 0 or 1. */ ++ ++ next_c = GETC (); ++ UNGETC (next_c); /* Always undo this lookahead. */ ++ if (!isalnum (next_c) && next_c != '.') ++ { ++ token_buffer[0] = (char)c, token_buffer[1] = '\0'; ++ c_y_lval.ttype = (c == '0') ? c_integer_zero_node : c_integer_one_node; ++ value = tok_CONSTANT; ++ break; ++ } ++ /*FALLTHRU*/ ++ } ++ ++ case '2': case '3': case '4': ++ case '5': case '6': case '7': case '8': case '9': ++ case '.': ++ { ++ int base = 10; ++ int count = 0; ++ int largest_digit = 0; ++ int numdigits = 0; ++ /* for multi-precision arithmetic, ++ we actually store only C_HOST_BITS_PER_CHAR bits in each part. ++ The number of parts is chosen so as to be sufficient to hold ++ the enough bits to fit into the two C_HOST_WIDE_INTs that contain ++ the integer value (this is always at least as many bits as are ++ in a target `long long' value, but may be wider). */ ++#define TOTAL_PARTS ((C_HOST_BITS_PER_WIDE_INT / C_HOST_BITS_PER_CHAR) * 2 + 2) ++ ++ int parts[TOTAL_PARTS]; ++ int overflow = 0; ++ ++ enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag ++ = NOT_FLOAT; ++ ++ for (count = 0; count < TOTAL_PARTS; count++) ++ { ++ parts[count] = 0; ++ } ++ ++ p = token_buffer; ++ *p++ = c; ++ ++ if (c == '0') ++ { ++ *p++ = (c = GETC()); ++ if ((c == 'x') || (c == 'X')) ++ { ++ base = 16; ++ *p++ = (c = GETC()); ++ } ++ /* Leading 0 forces octal unless the 0 is the only digit. */ ++ else if (c >= '0' && c <= '9') ++ { ++ base = 8; ++ numdigits++; ++ } ++ else ++ numdigits++; ++ } ++ ++ /* Read all the digits-and-decimal-points. */ ++ ++ while (c == '.' ++ || (isalnum (c) && c != 'l' && c != 'L' ++ && c != 'u' && c != 'U' ++ && c != 'i' && c != 'I' && c != 'j' && c != 'J' ++ && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F'))))) ++ { ++ if (c == '.') ++ { ++ if (base == 16) ++ { ++ error ("floating constant may not be in radix 16"); ++ } ++ if (floatflag == TOO_MANY_POINTS) ++ /* We have already emitted an error. Don't need another. */ ++ ; ++ else if (floatflag == AFTER_POINT) ++ { ++ error ("malformed floating constant"); ++ floatflag = TOO_MANY_POINTS; ++ /* Avoid another error from atof by forcing all characters ++ from here on to be ignored. */ ++ p[-1] = '\0'; ++ } ++ else ++ floatflag = AFTER_POINT; ++ ++ base = 10; ++ *p++ = c = GETC(); ++ /* Accept '.' as the start of a floating-point number ++ only when it is followed by a digit. ++ Otherwise, unread the following non-digit ++ and use the '.' as a structural token. */ ++ if (p == token_buffer + 2 && !isdigit (c)) ++ { ++ if (c == '.') ++ { ++ c = GETC(); ++ if (c == '.') ++ { ++ *p++ = c; ++ *p = 0; ++ return tok_ELLIPSIS; ++ } ++ error ("parse error at `..'"); ++ } ++ UNGETC (c); ++ token_buffer[1] = 0; ++ value = '.'; ++ goto done; ++ } ++ } ++ else ++ { ++ /* It is not a decimal point. ++ It should be a digit (perhaps a hex digit). */ ++ ++ if (isdigit (c)) ++ { ++ c = c - '0'; ++ } ++ else if (base <= 10) ++ { ++ if (c == 'e' || c == 'E') ++ { ++ base = 10; ++ floatflag = AFTER_POINT; ++ break; /* start of exponent */ ++ } ++ error ("nondigits in number and not hexadecimal"); ++ c = 0; ++ } ++ else if (c >= 'a') ++ { ++ c = c - 'a' + 10; ++ } ++ else ++ { ++ c = c - 'A' + 10; ++ } ++ if (c >= largest_digit) ++ largest_digit = c; ++ numdigits++; ++ ++ for (count = 0; count < TOTAL_PARTS; count++) ++ { ++ parts[count] *= base; ++ if (count) ++ { ++ parts[count] ++ += (parts[count-1] >> C_HOST_BITS_PER_CHAR); ++ parts[count-1] ++ &= (1 << C_HOST_BITS_PER_CHAR) - 1; ++ } ++ else ++ parts[0] += c; ++ } ++ ++ /* If the extra highest-order part ever gets anything in it, ++ the number is certainly too big. */ ++ if (parts[TOTAL_PARTS - 1] != 0) ++ overflow = 1; ++ ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = (c = GETC()); ++ } ++ } ++ ++ if (numdigits == 0) ++ { ++ error ("numeric constant with no digits"); ++ } ++ ++ if (largest_digit >= base) ++ { ++ error ("numeric constant contains digits beyond the radix"); ++ } ++ ++ /* Remove terminating char from the token buffer and delimit the string */ ++ *--p = 0; ++ ++ if (floatflag != NOT_FLOAT) ++ { ++ c_tree_node *type = c_double_type_node; ++ int imag = 0; ++ int conversion_errno = 0; ++ double value; ++# ifdef LUDO_DONE ++ jmp_buf handler; ++# endif ++ /* Read explicit exponent if any, and put it in tokenbuf. */ ++ ++ if ((c == 'e') || (c == 'E')) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer(p); ++ *p++ = c; ++ c = GETC(); ++ if ((c == '+') || (c == '-')) ++ { ++ *p++ = c; ++ c = GETC(); ++ } ++ if (! isdigit (c)) ++ { ++ error ("floating constant exponent has no digits"); ++ } ++ while (isdigit (c)) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = GETC(); ++ } ++ } ++ ++ *p = 0; ++ ++ /* Convert string to a double, checking for overflow. */ ++# ifdef LUDO_DONE ++ if (setjmp (handler)) ++ { ++ error ("floating constant out of range"); ++ value = dconst0; ++ } ++ else ++# endif ++ { ++ int fflag = 0, lflag = 0; ++ /* Copy token_buffer now, while it has just the number ++ and not the suffixes; once we add `f' or `i', ++ REAL_VALUE_ATOF may not work any more. */ ++ char *copy = (char *) autallocblock(p - token_buffer + 1); ++ bcopy (token_buffer, copy, p - token_buffer + 1); ++ ++# ifdef LUDO_DONE ++ set_float_handler (handler); ++# endif ++ while (1) ++ { ++ int lose = 0; ++ ++ /* Read the suffixes to choose a data type. */ ++ switch (c) ++ { ++ case 'f': case 'F': ++ if (fflag) ++ { ++ error ("more than one `f' in numeric constant"); ++ } ++ fflag = 1; ++ break; ++ ++ case 'l': case 'L': ++ if (lflag) ++ { ++ error ("more than one `l' in numeric constant"); ++ } ++ lflag = 1; ++ break; ++ ++ case 'i': case 'I': ++ if (imag) ++ { ++ error ("more than one `i' or `j' in numeric constant"); ++ } ++ else if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids imaginary numeric constants"); ++ } ++ imag = 1; ++ break; ++ ++ default: ++ lose = 1; ++ } ++ ++ if (lose) ++ break; ++ ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ *p = 0; ++ c = GETC(); ++ } ++ ++ /* The second argument, machine_mode, of REAL_VALUE_ATOF ++ tells the desired precision of the binary result ++ of decimal-to-binary conversion. */ ++ ++ if (fflag) ++ { ++ if (lflag) ++ { ++ error ("both `f' and `l' in floating constant"); ++ } ++ ++ type = c_float_type_node; ++ errno = 0; ++ value = atof(copy); ++ ++ conversion_errno = errno; ++# ifdef LUDO_DONE ++ /* A diagnostic is required here by some ANSI C testsuites. ++ This is not pedwarn, become some people don't want ++ an error for this. */ ++ if (REAL_VALUE_ISINF (value) && c_pedantic) ++ { ++ warning ("floating point number exceeds range of `float'"); ++ } ++# endif ++ } ++ else if (lflag) ++ { ++ type = c_long_double_type_node; ++ errno = 0; ++ value = atof(copy); ++ conversion_errno = errno; ++# ifdef LUDO_DONE ++ if (REAL_VALUE_ISINF (value) && c_pedantic) ++ { ++ warning ("floating point number exceeds range of `long double'"); ++ } ++# endif ++ } ++ else ++ { ++ errno = 0; ++ value = atof(copy); ++ conversion_errno = errno; ++# ifdef LUDO_DONE ++ if (REAL_VALUE_ISINF (value) && c_pedantic) ++ { ++ warning ("floating point number exceeds range of `double'"); ++ } ++# endif ++ } ++ ++# ifdef LUDO_DONE ++ set_float_handler (NULL_PTR); ++# endif ++ } ++ ++# ifdef LUDO_DONE ++#ifdef ERANGE ++ /* ERANGE is also reported for underflow, ++ so test the value to distinguish overflow from that. */ ++ if (conversion_errno == ERANGE && !c_flag_traditional && c_pedantic ++ && (REAL_VALUES_LESS (dconst1, value) ++ || REAL_VALUES_LESS (value, dconstm1))) ++ { ++ warning ("floating point number exceeds range of `double'"); ++ } ++#endif ++ ++ /* If the result is not a number, assume it must have been ++ due to some error message above, so silently convert ++ it to a zero. */ ++ if (REAL_VALUE_ISNAN (value)) ++ value = dconst0; ++# endif ++ ++ /* Create a node with determined type and value. */ ++ if (imag) ++ { ++ c_y_lval.ttype = c_tree_build_complex( (c_tree_node *)0, ++ c_convert_expr(type, c_integer_zero_node), ++ c_tree_build_real(type, value)); ++ } ++ else ++ { ++ c_y_lval.ttype = c_tree_build_real(type, value); ++ } ++ } ++ else ++ { ++ c_tree_node *traditional_type; ++ c_tree_node *ansi_type; ++ c_tree_node *type; ++ int high, low; ++ int spec_unsigned = 0; ++ int spec_long = 0; ++ int spec_long_long = 0; ++ int spec_imag = 0; ++ int bytes, warn, i; ++ ++ while (1) ++ { ++ if (c == 'u' || c == 'U') ++ { ++ if (spec_unsigned) ++ { ++ error ("two `u's in integer constant"); ++ } ++ spec_unsigned = 1; ++ } ++ else if (c == 'l' || c == 'L') ++ { ++ if (spec_long) ++ { ++ if (spec_long_long) ++ { ++ error ("three `l's in integer constant"); ++ } ++ else if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids long long integer constants"); ++ } ++ spec_long_long = 1; ++ } ++ spec_long = 1; ++ } ++ else if (c == 'i' || c == 'j' || c == 'I' || c == 'J') ++ { ++ if (spec_imag) ++ { ++ error ("more than one `i' or `j' in numeric constant"); ++ } ++ else if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids imaginary numeric constants"); ++ } ++ spec_imag = 1; ++ } ++ else ++ break; ++ if (p >= token_buffer + maxtoken - 3) ++ { ++ p = extend_token_buffer (p); ++ } ++ *p++ = c; ++ c = GETC(); ++ } ++ ++ /* If the constant won't fit in an unsigned long long, ++ then warn that the constant is out of range. */ ++ ++ /* ??? This assumes that long long and long integer types are ++ a multiple of 8 bits. This better than the original code ++ though which assumed that long was exactly 32 bits and long ++ long was exactly 64 bits. */ ++ ++ bytes = CTreeTypePrecision(c_long_long_integer_type_node) / 8; ++ ++ warn = overflow; ++ for (i = bytes; i < TOTAL_PARTS; i++) ++ { ++ if (parts[i]) warn = 1; ++ } ++ if (warn) ++ { ++ pedwarn ("integer constant out of range"); ++ } ++ ++ /* This is simplified by the fact that our constant ++ is always positive. */ ++ ++ high = low = 0; ++ ++ for (i = 0; i < C_HOST_BITS_PER_WIDE_INT / C_HOST_BITS_PER_CHAR; i++) ++ { ++ high |= ((int) parts[i + (C_HOST_BITS_PER_WIDE_INT ++ / C_HOST_BITS_PER_CHAR)] ++ << (i * C_HOST_BITS_PER_CHAR)); ++ low |= (int) parts[i] << (i * C_HOST_BITS_PER_CHAR); ++ } ++ ++ c_y_lval.ttype = c_tree_build_int_2(low, high); ++ CTreeType( c_y_lval.ttype ) = c_long_long_unsigned_type_node; ++ ++ /* If warn_traditional, calculate both the ANSI type and the ++ traditional type, then see if they disagree. ++ Otherwise, calculate only the type for the dialect in use. */ ++ if (c_warn_traditional || c_flag_traditional) ++ { ++ /* Calculate the traditional type. */ ++ /* Traditionally, any constant is signed; ++ but if unsigned is specified explicitly, obey that. ++ Use the smallest size with the right number of bits, ++ except for one special case with decimal constants. */ ++ if (! spec_long && base != 10 ++ && c_int_fits_type_p(c_y_lval.ttype, c_unsigned_type_node)) ++ traditional_type = (spec_unsigned ? c_unsigned_type_node ++ : c_integer_type_node); ++ /* A decimal constant must be long ++ if it does not fit in type int. ++ I think this is independent of whether ++ the constant is signed. */ ++ else if (! spec_long && base == 10 ++ && c_int_fits_type_p(c_y_lval.ttype, c_integer_type_node)) ++ traditional_type = (spec_unsigned ? c_unsigned_type_node ++ : c_integer_type_node); ++ else if (! spec_long_long) ++ traditional_type = (spec_unsigned ? c_long_unsigned_type_node ++ : c_long_integer_type_node); ++ else ++ traditional_type = (spec_unsigned ++ ? c_long_long_unsigned_type_node ++ : c_long_long_integer_type_node); ++ } ++ if (c_warn_traditional || ! c_flag_traditional) ++ { ++ /* Calculate the ANSI type. */ ++ if (! spec_long && ! spec_unsigned ++ && c_int_fits_type_p(c_y_lval.ttype, c_integer_type_node)) ++ ansi_type = c_integer_type_node; ++ else if (! spec_long && (base != 10 || spec_unsigned) ++ && c_int_fits_type_p(c_y_lval.ttype, c_unsigned_type_node)) ++ ansi_type = c_unsigned_type_node; ++ else if (! spec_unsigned && !spec_long_long ++ && c_int_fits_type_p(c_y_lval.ttype, c_long_integer_type_node)) ++ ansi_type = c_long_integer_type_node; ++ else if (! spec_long_long ++ && c_int_fits_type_p(c_y_lval.ttype, ++ c_long_unsigned_type_node)) ++ ansi_type = c_long_unsigned_type_node; ++ else if (! spec_unsigned ++ && c_int_fits_type_p(c_y_lval.ttype, ++ c_long_long_integer_type_node)) ++ ansi_type = c_long_long_integer_type_node; ++ else ++ ansi_type = c_long_long_unsigned_type_node; ++ } ++ ++ type = c_flag_traditional ? traditional_type : ansi_type; ++ ++ if (c_warn_traditional && traditional_type != ansi_type) ++ { ++ if ( CTreeTypePrecision(traditional_type) != ++ CTreeTypePrecision(ansi_type)) ++ { ++ warning ("width of integer constant changes with -traditional"); ++ } ++ else if ( CIsTreeNodeUnsigned(traditional_type) != ++ CIsTreeNodeUnsigned(ansi_type)) ++ { ++ warning("integer constant is unsigned in ANSI C, signed with -traditional"); ++ } ++ else ++ { ++ warning("width of integer constant may change on other systems with -traditional"); ++ } ++ } ++ ++ if (c_pedantic && !c_flag_traditional && !spec_long_long && !warn ++ && (CTreeTypePrecision(c_long_integer_type_node) ++ < CTreeTypePrecision(type))) ++ { ++ pedwarn("integer constant out of range"); ++ } ++ ++ if (base == 10 && ! spec_unsigned && CIsTreeNodeUnsigned(type)) ++ { ++ warning("decimal constant is so large that it is unsigned"); ++ } ++ ++ if (spec_imag) ++ { ++ if ( CTreeTypePrecision(type) ++ <= CTreeTypePrecision(c_integer_type_node)) ++ c_y_lval.ttype ++ = c_tree_build_complex((c_tree_node *)0, c_integer_zero_node, ++ c_convert_expr(c_integer_type_node, c_y_lval.ttype)); ++ else ++ { ++ error ("complex integer constant is too wide for `complex int'"); ++ } ++ } ++ else if (c_flag_traditional && !c_int_fits_type_p (c_y_lval.ttype, type)) ++ /* The traditional constant 0x80000000 is signed ++ but doesn't fit in the range of int. ++ This will change it to -0x80000000, which does fit. */ ++ { ++ CTreeType(c_y_lval.ttype) = c_get_unsigned_type(type); ++ c_y_lval.ttype = c_convert_expr(type, c_y_lval.ttype); ++ CClearTreeNodeCstOverflow( c_y_lval.ttype ); ++ CClearTreeNodeOverflow( c_y_lval.ttype ); ++ } ++ else ++ { ++ CTreeType(c_y_lval.ttype) = type; ++ } ++ } ++ ++ UNGETC (c); ++ *p = 0; ++ ++ if (isalnum (c) || c == '.' || c == '_' || c == '$' ++ || (!c_flag_traditional && (c == '-' || c == '+') ++ && (p[-1] == 'e' || p[-1] == 'E'))) ++ { ++ error ("missing white space after number `%s'", token_buffer); ++ } ++ ++ value = tok_CONSTANT; break; ++ } ++ ++ case '\'': ++ char_constant: ++ { ++ register int result = 0; ++ register int num_chars = 0; ++ unsigned width = CTreeTypePrecision(c_char_type_node); ++ int max_chars; ++ ++ if (wide_flag) ++ { ++ width = C_WCHAR_TYPE_SIZE; ++#ifdef MULTIBYTE_CHARS ++ max_chars = MB_CUR_MAX; ++#else ++ max_chars = 1; ++#endif ++ } ++ else ++ max_chars = CTreeTypePrecision( c_integer_type_node ) / width; ++ ++ while (1) ++ { ++ tryagain: ++ ++ c = GETC(); ++ ++ if (c == '\'' || c == EOF) ++ break; ++ ++ if (c == '\\') ++ { ++ int ignore = 0; ++ c = readescape (&ignore); ++ if (ignore) ++ goto tryagain; ++ if (width < C_HOST_BITS_PER_INT ++ && (unsigned) c >= (1 << width)) ++ { ++ pedwarn ("escape sequence out of range for character"); ++ } ++#ifdef MAP_CHARACTER ++ if (isprint (c)) ++ c = MAP_CHARACTER (c); ++#endif ++ } ++ else if (c == '\n') ++ { ++ if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids newline in character constant"); ++ } ++ c_lineno++; ++ } ++#ifdef MAP_CHARACTER ++ else ++ c = MAP_CHARACTER (c); ++#endif ++ ++ num_chars++; ++ if (num_chars > maxtoken - 4) ++ extend_token_buffer( token_buffer ); ++ ++ token_buffer[num_chars] = c; ++ ++ /* Merge character into result; ignore excess chars. */ ++ if (num_chars < max_chars + 1) ++ { ++ if (width < C_HOST_BITS_PER_INT) ++ result = (result << width) | (c & ((1 << width) - 1)); ++ else ++ result = c; ++ } ++ } ++ ++ token_buffer[num_chars + 1] = '\''; ++ token_buffer[num_chars + 2] = 0; ++ ++ if (c != '\'') ++ { ++ error("malformatted character constant"); ++ } ++ else if (num_chars == 0) ++ { ++ error("empty character constant"); ++ } ++ else if (num_chars > max_chars) ++ { ++ num_chars = max_chars; ++ { ++ error ("character constant too long"); ++ } ++ } ++ else if (num_chars != 1 && ! c_flag_traditional) ++ { ++ warning("multi-character character constant"); ++ } ++ ++ /* If char type is signed, sign-extend the constant. */ ++ if (! wide_flag) ++ { ++ int num_bits = num_chars * width; ++ if (num_bits == 0) ++ /* We already got an error; avoid invalid shift. */ ++ c_y_lval.ttype = c_tree_build_int_2 (0, 0); ++ else if ( CIsTreeNodeUnsigned( c_char_type_node ) ++ || ((result >> (num_bits - 1)) & 1) == 0) ++ c_y_lval.ttype ++ = c_tree_build_int_2( result & ((unsigned int) ~0 ++ >> (C_HOST_BITS_PER_WIDE_INT - num_bits)), 0); ++ else ++ c_y_lval.ttype ++ = c_tree_build_int_2 (result | ~((unsigned int) ~0 ++ >> (C_HOST_BITS_PER_WIDE_INT - num_bits)), -1); ++ CTreeType( c_y_lval.ttype ) = c_integer_type_node; ++ } ++ else ++ { ++#ifdef MULTIBYTE_CHARS ++ /* Set the initial shift state and convert the next sequence. */ ++ result = 0; ++ /* In all locales L'\0' is zero and mbtowc will return zero, ++ so don't use it. */ ++ if (num_chars > 1 ++ || (num_chars == 1 && token_buffer[1] != '\0')) ++ { ++ wchar_t wc; ++ (void) mbtowc (NULL_PTR, NULL_PTR, 0); ++ if (mbtowc (& wc, token_buffer + 1, num_chars) == num_chars) ++ result = wc; ++ else ++ { ++ warning ("Ignoring invalid multibyte character"); ++ } ++ } ++#endif ++ c_y_lval.ttype = c_tree_build_int_2(result, 0); ++ CTreeType( c_y_lval.ttype ) = c_wchar_type_node; ++ } ++ value = tok_CONSTANT; ++ break; ++ } ++ ++ case '"': ++ string_constant: ++ { ++ c = GETC(); ++ p = token_buffer + 1; ++ ++ while (c != '"' && c >= 0) ++ { ++ if (c == '\\') ++ { ++ int ignore = 0; ++ c = readescape (&ignore); ++ if (ignore) ++ goto skipnewline; ++ if (!wide_flag ++ && CTreeTypePrecision( c_char_type_node) < C_HOST_BITS_PER_INT ++ && c >= (1 << CTreeTypePrecision( c_char_type_node ))) ++ { ++ pedwarn ("escape sequence out of range for character"); ++ } ++ } ++ else if (c == '\n') ++ { ++ if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids newline in string constant"); ++ } ++ c_lineno++; ++ } ++ ++ if (p == token_buffer + maxtoken) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ ++ skipnewline: ++ c = GETC(); ++ } ++ ++ *p = 0; ++ ++ if (c < 0) ++ { ++ error ("Unterminated string constant"); ++ } ++ ++ /* We have read the entire constant. ++ Construct a STRING_CST for the result. */ ++ ++ if (wide_flag) ++ { ++ /* If this is a L"..." wide-string, convert the multibyte string ++ to a wide character string. */ ++ char *widep = (char *) autallocblock((p - token_buffer) * C_WCHAR_BYTES); ++ int len; ++ ++#ifdef MULTIBYTE_CHARS ++ len = mbstowcs ((wchar_t *) widep, token_buffer + 1, p - token_buffer); ++ if (len < 0 || len >= (p - token_buffer)) ++ { ++ warning ("Ignoring invalid multibyte string"); ++ len = 0; ++ } ++ bzero (widep + (len * WCHAR_BYTES), WCHAR_BYTES); ++#else ++ { ++ char *wp, *cp; ++ ++ wp = widep + (C_BYTES_BIG_ENDIAN ? C_WCHAR_BYTES - 1 : 0); ++ bzero (widep, (p - token_buffer) * C_WCHAR_BYTES); ++ for (cp = token_buffer + 1; cp < p; cp++) ++ *wp = *cp, wp += C_WCHAR_BYTES; ++ len = p - token_buffer - 1; ++ } ++#endif ++ c_y_lval.ttype = c_tree_build_string ((len + 1) * C_WCHAR_BYTES, widep); ++ CTreeType( c_y_lval.ttype ) = c_wchar_array_type_node; ++ value = tok_STRING; ++ } ++# ifdef LUDO_DONE ++ else if (objc_flag) ++ { ++ extern tree build_objc_string(); ++ /* Return an Objective-C @"..." constant string object. */ ++ c_y_lval.ttype = build_objc_string (p - token_buffer, ++ token_buffer + 1); ++ TREE_TYPE (c_y_lval.ttype) = char_array_type_node; ++ value = tok_OBJC_STRING; ++ } ++# endif ++ else ++ { ++ *p++ = '"'; ++ *p = 0; ++ ++ c_y_lval.ttype = c_tree_build_string(p - token_buffer, token_buffer ); ++ CTreeType( c_y_lval.ttype ) = c_char_array_type_node; ++ value = tok_STRING; ++ } ++ ++ ++ break; ++ } ++ ++ case '+': ++ case '-': ++ case '&': ++ case '|': ++ case ':': ++ case '<': ++ case '>': ++ case '*': ++ case '/': ++ case '%': ++ case '^': ++ case '!': ++ case '=': ++ { ++ register int c1; ++ ++ combine: ++ ++ switch (c) ++ { ++ case '+': ++ c_y_lval.code = C_PLUS_EXPR; break; ++ case '-': ++ c_y_lval.code = C_MINUS_EXPR; break; ++ case '&': ++ c_y_lval.code = C_BIT_AND_EXPR; break; ++ case '|': ++ c_y_lval.code = C_BIT_IOR_EXPR; break; ++ case '*': ++ c_y_lval.code = C_MULT_EXPR; break; ++ case '/': ++ c_y_lval.code = C_TRUNC_DIV_EXPR; break; ++ case '%': ++ c_y_lval.code = C_TRUNC_MOD_EXPR; break; ++ case '^': ++ c_y_lval.code = C_BIT_XOR_EXPR; break; ++ case tok_LSHIFT: ++ c_y_lval.code = C_LSHIFT_EXPR; break; ++ case tok_RSHIFT: ++ c_y_lval.code = C_RSHIFT_EXPR; break; ++ case '<': ++ c_y_lval.code = C_LT_EXPR; break; ++ case '>': ++ c_y_lval.code = C_GT_EXPR; break; ++ } ++ ++ token_buffer[1] = c1 = GETC(); ++ token_buffer[2] = 0; ++ ++ if (c1 == '=') ++ { ++ switch (c) ++ { ++ case '<': ++ value = tok_ARITHCOMPARE; c_y_lval.code = C_LE_EXPR; goto done; ++ case '>': ++ value = tok_ARITHCOMPARE; c_y_lval.code = C_GE_EXPR; goto done; ++ case '!': ++ value = tok_EQCOMPARE; c_y_lval.code = C_NE_EXPR; goto done; ++ case '=': ++ value = tok_EQCOMPARE; c_y_lval.code = C_EQ_EXPR; goto done; ++ } ++ value = tok_ASSIGN; goto done; ++ } ++ else if (c == c1) ++ switch (c) ++ { ++ case '+': ++ value = tok_PLUSPLUS; goto done; ++ case '-': ++ value = tok_MINUSMINUS; goto done; ++ case '&': ++ value = tok_ANDAND; goto done; ++ case '|': ++ value = tok_OROR; goto done; ++ case '<': ++ c = tok_LSHIFT; ++ goto combine; ++ case '>': ++ c = tok_RSHIFT; ++ goto combine; ++ } ++ else ++ switch (c) ++ { ++ case '-': ++ if (c1 == '>') ++ { value = tok_POINTSAT; goto done; } ++ break; ++ case ':': ++ if (c1 == '>') ++ { value = ']'; goto done; } ++ break; ++ case '<': ++ if (c1 == '%') ++ { value = '{'; indent_level++; goto done; } ++ if (c1 == ':') ++ { value = '['; goto done; } ++ break; ++ case '%': ++ if (c1 == '>') ++ { value = '}'; indent_level--; goto done; } ++ break; ++ } ++ UNGETC (c1); ++ token_buffer[1] = 0; ++ ++ if ((c == '<') || (c == '>')) ++ value = tok_ARITHCOMPARE; ++ else value = c; ++ goto done; ++ } ++ ++ case 0: ++ /* Don't make c_y_parse think this is eof. */ ++ value = 1; ++ break; ++ ++ case '{': ++ indent_level++; ++ value = c; ++ break; ++ ++ case '}': ++ indent_level--; ++ value = c; ++ break; ++ ++ default: ++ value = c; ++ } ++ ++done: ++/* c_y_lloc.last_line = lineno; */ ++ ++ return value; ++} ++ ++/* Sets the value of the 'c_y_debug' variable to VALUE. ++ This is a function so we don't have to have C_Y_DEBUG defined ++ in order to build the compiler. */ ++ ++void ++set_c_y_debug (value) ++ int value; ++{ ++#if C_Y_DEBUG != 0 ++ c_y_debug = value; ++#else ++ warning ("C_Y_DEBUG not defined."); ++#endif ++} +diff -Naur alliance-5.0/gcp/src/c_clex.h alliance/gcp/src/c_clex.h +--- alliance-5.0/gcp/src/c_clex.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_clex.h 2002-09-30 18:20:19.000000000 +0200 +@@ -0,0 +1,120 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/* Define constants for communication with c-parse.y. ++ Copyright (C) 1987, 1992 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++ ++ ++enum rid ++{ ++ RID_UNUSED, ++ RID_INT, ++ RID_CHAR, ++ RID_FLOAT, ++ RID_DOUBLE, ++ RID_VOID, ++ RID_UNUSED1, ++ ++ RID_UNSIGNED, ++ RID_SHORT, ++ RID_LONG, ++ RID_AUTO, ++ RID_STATIC, ++ RID_EXTERN, ++ RID_REGISTER, ++ RID_TYPEDEF, ++ RID_SIGNED, ++ RID_CONST, ++ RID_VOLATILE, ++ RID_INLINE, ++ RID_NOALIAS, ++ RID_ITERATOR, ++ RID_COMPLEX, ++ ++ RID_IN, ++ RID_OUT, ++ RID_INOUT, ++ RID_BYCOPY, ++ RID_ONEWAY, ++ RID_ID, ++ ++ RID_MAX ++}; ++ ++typedef struct c_stmt_or_label ++{ ++ c_tree_node *stmt; ++ int ends_in_label; ++ ++} c_stmt_or_label; ++ ++ ++#define NORID RID_UNUSED ++ ++#define RID_FIRST_MODIFIER RID_UNSIGNED ++ ++/* The elements of `ridpointers' are identifier nodes ++ for the reserved type names and storage classes. ++ It is indexed by a RID_... value. */ ++extern c_tree_node *c_ridpointers[(int) RID_MAX]; ++ ++/* the declaration found for the last IDENTIFIER token read in. ++ yylex must look this up to detect typedefs, which get token type TYPENAME, ++ so it is left around in case the identifier is not a typedef but is ++ used in a context which makes it a reference to a variable. */ ++extern c_tree_node *c_lastiddecl; ++ ++extern char *token_buffer; /* Pointer to token buffer. */ ++ ++# ifdef LUDO_NO_SKIP ++extern tree make_pointer_declarator(); ++extern int yylex (); ++# else ++ extern int c_y_lex __P(()); ++# endif ++ extern void c_reinit_parse_for_function __P(()); ++ extern void c_position_after_white_space __P(()); ++ extern void c_init_lex __P(( char *InputFileName )); ++ ++ extern char *get_directive_line (); +diff -Naur alliance-5.0/gcp/src/c_common.c alliance/gcp/src/c_common.c +--- alliance-5.0/gcp/src/c_common.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_common.c 2002-09-30 18:20:19.000000000 +0200 +@@ -0,0 +1,527 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_common.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_flags.h" ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_cdecl.h" ++# include "c_convert.h" ++# include "c_ctypeck.h" ++# include "c_common.h" ++# include "c_foldconst.h" ++# include "c_debug.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ ++/* Print a warning if a constant expression had overflow in folding. ++ Invoke this function on every expression that the language ++ requires to be a constant expression. ++ Note the ANSI C standard says it is erroneous for a ++ constant expression to overflow. */ ++ ++void c_constant_expression_warning (value) ++ c_tree_node *value; ++{ ++ if (( CTreeNodeFirstCode(value) == C_INT_CST_NODE || CTreeNodeFirstCode(value) == C_REAL_CST_NODE ++ || CTreeNodeFirstCode(value) == C_COMPLEX_NODE) ++ && CIsTreeNodeStatic(value) && c_pedantic) ++ { ++ pedwarn ("overflow in constant expression"); ++ } ++} ++ ++/* Given X, an unsigned number, return the largest int Y such that 2**Y <= X. ++ If X is 0, return -1. ++ ++ This should be used via the floor_log2 macro. */ ++ ++int ++c_floor_log2_wide (x) ++ register unsigned C_HOST_WIDE_INT x; ++{ ++ register int log = -1; ++ while (x != 0) ++ log++, ++ x >>= 1; ++ return log; ++} ++ ++ ++/* Return the minimum number of bits needed to represent VALUE in a ++ signed or unsigned type, UNSIGNEDP says which. */ ++ ++int c_min_precision (value, unsignedp) ++ c_tree_node *value; ++ int unsignedp; ++{ ++ int log; ++ ++ /* If the value is negative, compute its negative minus 1. The latter ++ adjustment is because the absolute value of the largest negative value ++ is one larger than the largest positive value. This is equivalent to ++ a bit-wise negation, so use that operation instead. */ ++ ++ if (c_tree_is_int_cst_sgn(value) < 0) ++ value = c_fold (c_tree_build_unary_typed_expr(C_BIT_NOT_EXPR, CTreeType(value), value)); ++ ++ /* Return the number of bits needed, taking into account the fact ++ that we need one more bit for a signed than unsigned type. */ ++ ++ if (c_tree_is_integer_zerop (value)) ++ log = 0; ++ else if (CTreeIntCstHigh(value) != 0) ++ log = C_HOST_BITS_PER_WIDE_INT + c_floor_log2_wide (CTreeIntCstHigh(value)); ++ else ++ log = c_floor_log2_wide (CTreeIntCstLow(value)); ++ ++ return log + 1 + ! unsignedp; ++} ++ ++ ++/* Validate the expression after `case' and apply default promotions. */ ++ ++c_tree_node *c_check_case_value(value) ++ c_tree_node *value; ++{ ++ if (value == NULL) ++ return value; ++ ++ /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ ++ CStripTypeNops(value); ++ ++ if ( CTreeNodeFirstCode(value) != C_INT_CST_NODE ++ && value != c_error_mark_node) ++ { ++ error ("case label does not reduce to an integer constant"); ++ value = c_error_mark_node; ++ } ++ else ++ /* Promote char or short to int. */ ++ value = c_default_conversion(value); ++ ++ c_constant_expression_warning(value); ++ ++ return value; ++} ++ ++ ++/* Subroutine of build_binary_op, used for comparison operations. ++ See if the operands have both been converted from subword integer types ++ and, if so, perhaps change them both back to their original type. ++ This function is also responsible for converting the two operands ++ to the proper common type for comparison. ++ ++ The arguments of this function are all pointers to local variables ++ of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1, ++ RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE. ++ ++ If this function returns nonzero, it means that the comparison has ++ a constant value. What this function returns is an expression for ++ that value. */ ++ ++c_tree_node *c_shorten_compare(op0_ptr, op1_ptr, restype_ptr, rescode_ptr) ++ c_tree_node **op0_ptr; ++ c_tree_node **op1_ptr; ++ c_tree_node **restype_ptr; ++ int *rescode_ptr; ++{ ++ c_tree_node *type; ++ c_tree_node *op0 = *op0_ptr; ++ c_tree_node *op1 = *op1_ptr; ++ int unsignedp0, unsignedp1; ++ int real1, real2; ++ c_tree_node *primop0; ++ c_tree_node *primop1; ++ int code = *rescode_ptr; ++ ++ /* Throw away any conversions to wider types ++ already present in the operands. */ ++ ++ primop0 = c_get_narrower(op0, &unsignedp0); ++ primop1 = c_get_narrower(op1, &unsignedp1); ++ ++ /* Handle the case that OP0 does not *contain* a conversion ++ but it *requires* conversion to FINAL_TYPE. */ ++ ++ if (op0 == primop0 && CTreeType(op0) != *restype_ptr) ++ unsignedp0 = CIsTreeNodeUnsigned(CTreeType(op0)); ++ if (op1 == primop1 && CTreeType(op1) != *restype_ptr) ++ unsignedp1 = CIsTreeNodeUnsigned(CTreeType(op1)); ++ ++ /* If one of the operands must be floated, we cannot optimize. */ ++ real1 = CTreeTypeCode(CTreeType(primop0)) == C_REAL_TYPE; ++ real2 = CTreeTypeCode(CTreeType(primop1)) == C_REAL_TYPE; ++ ++ /* If first arg is constant, swap the args (changing operation ++ so value is preserved), for canonicalization. Don't do this if ++ the second arg is 0. */ ++ ++ if ( CIsTreeNodeConstant(primop0) ++ && ! c_tree_is_integer_zerop(primop1) && ! ++ c_tree_is_real_zerop(primop1)) ++ { ++ c_tree_node *tem = primop0; ++ int temi = unsignedp0; ++ primop0 = primop1; ++ primop1 = tem; ++ tem = op0; ++ op0 = op1; ++ op1 = tem; ++ *op0_ptr = op0; ++ *op1_ptr = op1; ++ unsignedp0 = unsignedp1; ++ unsignedp1 = temi; ++ temi = real1; ++ real1 = real2; ++ real2 = temi; ++ ++ switch (code) ++ { ++ case C_LT_EXPR: ++ code = C_GT_EXPR; ++ break; ++ case C_GT_EXPR: ++ code = C_LT_EXPR; ++ break; ++ case C_LE_EXPR: ++ code = C_GE_EXPR; ++ break; ++ case C_GE_EXPR: ++ code = C_LE_EXPR; ++ break; ++ default: ++ break; ++ } ++ *rescode_ptr = code; ++ } ++ ++ /* If comparing an integer against a constant more bits wide, ++ maybe we can deduce a value of 1 or 0 independent of the data. ++ Or else truncate the constant now ++ rather than extend the variable at run time. ++ ++ This is only interesting if the constant is the wider arg. ++ Also, it is not safe if the constant is unsigned and the ++ variable arg is signed, since in this case the variable ++ would be sign-extended and then regarded as unsigned. ++ Our technique fails in this case because the lowest/highest ++ possible unsigned results don't follow naturally from the ++ lowest/highest possible values of the variable operand. ++ For just EQ_EXPR and NE_EXPR there is another technique that ++ could be used: see if the constant can be faithfully represented ++ in the other operand's type, by truncating it and reextending it ++ and see if that preserves the constant's value. */ ++ ++ if (!real1 && !real2 ++ && CTreeNodeFirstCode(primop1) == C_INT_CST_NODE ++ && CTreeTypePrecision(CTreeType(primop0)) < CTreeTypePrecision(*restype_ptr)) ++ { ++ int min_gt, max_gt, min_lt, max_lt; ++ c_tree_node *maxval; ++ c_tree_node *minval; ++ /* 1 if comparison is nominally unsigned. */ ++ int unsignedp = CIsTreeNodeUnsigned(*restype_ptr); ++ c_tree_node *val; ++ ++ type = c_get_signed_or_unsigned_type(unsignedp0, CTreeType(primop0)); ++ ++ maxval = CTreeTypeMaxValue(type); ++ minval = CTreeTypeMinValue(type); ++ ++ if (unsignedp && !unsignedp0) ++ *restype_ptr = c_get_signed_type(*restype_ptr); ++ ++ if (CTreeType(primop1) != *restype_ptr) ++ primop1 = c_convert_expr(*restype_ptr, primop1); ++ if (type != *restype_ptr) ++ { ++ minval = c_convert_expr(*restype_ptr, minval); ++ maxval = c_convert_expr(*restype_ptr, maxval); ++ } ++ ++ if (unsignedp && unsignedp0) ++ { ++ min_gt = INT_CST_LT_UNSIGNED (primop1, minval); ++ max_gt = INT_CST_LT_UNSIGNED (primop1, maxval); ++ min_lt = INT_CST_LT_UNSIGNED (minval, primop1); ++ max_lt = INT_CST_LT_UNSIGNED (maxval, primop1); ++ } ++ else ++ { ++ min_gt = INT_CST_LT (primop1, minval); ++ max_gt = INT_CST_LT (primop1, maxval); ++ min_lt = INT_CST_LT (minval, primop1); ++ max_lt = INT_CST_LT (maxval, primop1); ++ } ++ ++ val = 0; ++ /* This used to be a switch, but Genix compiler can't handle that. */ ++ if (code == C_NE_EXPR) ++ { ++ if (max_lt || min_gt) ++ val = c_boolean_true_node; ++ } ++ else if (code == C_EQ_EXPR) ++ { ++ if (max_lt || min_gt) ++ val = c_boolean_false_node; ++ } ++ else if (code == C_LT_EXPR) ++ { ++ if (max_lt) ++ val = c_boolean_true_node; ++ if (!min_lt) ++ val = c_boolean_false_node; ++ } ++ else if (code == C_GT_EXPR) ++ { ++ if (min_gt) ++ val = c_boolean_true_node; ++ if (!max_gt) ++ val = c_boolean_false_node; ++ } ++ else if (code == C_LE_EXPR) ++ { ++ if (!max_gt) ++ val = c_boolean_true_node; ++ if (min_gt) ++ val = c_boolean_false_node; ++ } ++ else if (code == C_GE_EXPR) ++ { ++ if (!min_lt) ++ val = c_boolean_true_node; ++ if (max_lt) ++ val = c_boolean_false_node; ++ } ++ ++ /* If primop0 was sign-extended and unsigned comparison specd, ++ we did a signed comparison above using the signed type bounds. ++ But the comparison we output must be unsigned. ++ ++ Also, for inequalities, VAL is no good; but if the signed ++ comparison had *any* fixed result, it follows that the ++ unsigned comparison just tests the sign in reverse ++ (positive values are LE, negative ones GE). ++ So we can generate an unsigned comparison ++ against an extreme value of the signed type. */ ++ ++ if (unsignedp && !unsignedp0) ++ { ++ if (val != 0) ++ switch (code) ++ { ++ case C_LT_EXPR: ++ case C_GE_EXPR: ++ primop1 = CTreeTypeMinValue(type); ++ val = 0; ++ break; ++ ++ case C_LE_EXPR: ++ case C_GT_EXPR: ++ primop1 = CTreeTypeMaxValue(type); ++ val = 0; ++ break; ++ ++ default: ++ break; ++ } ++ type = c_get_unsigned_type(type); ++ } ++ ++ if (!max_gt && !unsignedp0 && CTreeNodeFirstCode(primop0) != C_INT_CST_NODE) ++ { ++ /* This is the case of (char)x >?< 0x80, which people used to use ++ expecting old C compilers to change the 0x80 into -0x80. */ ++ if (val == c_boolean_false_node) ++ { ++ warning ("comparison is always 0 due to limited range of data type"); ++ } ++ if (val == c_boolean_true_node) ++ { ++ warning ("comparison is always 1 due to limited range of data type"); ++ } ++ } ++ ++ if (!min_lt && unsignedp0 && CTreeNodeFirstCode(primop0) != C_INT_CST_NODE) ++ { ++ /* This is the case of (unsigned char)x >?< -1 or < 0. */ ++ if (val == c_boolean_false_node) ++ { ++ warning ("comparison is always 0 due to limited range of data type"); ++ } ++ if (val == c_boolean_true_node) ++ { ++ warning ("comparison is always 1 due to limited range of data type"); ++ } ++ } ++ ++ if (val != 0) ++ { ++ /* Don't forget to evaluate PRIMOP0 if it has side effects. */ ++ if ( CIsTreeNodeSideEffect(primop0)) ++ return c_tree_build_binary_typed_expr( ++ C_COMPOUND_EXPR, CTreeType(val), primop0, val); ++ return val; ++ } ++ ++ /* Value is not predetermined, but do the comparison ++ in the type of the operand that is not constant. ++ TYPE is already properly set. */ ++ } ++ else if (real1 && real2 ++ && (CTreeTypePrecision(CTreeType(primop0)) ++ == CTreeTypePrecision(CTreeType(primop1)))) ++ type = CTreeType(primop0); ++ ++ /* If args' natural types are both narrower than nominal type ++ and both extend in the same manner, compare them ++ in the type of the wider arg. ++ Otherwise must actually extend both to the nominal ++ common type lest different ways of extending ++ alter the result. ++ (eg, (short)-1 == (unsigned short)-1 should be 0.) */ ++ ++ else if (unsignedp0 == unsignedp1 && real1 == real2 ++ && CTreeTypePrecision(CTreeType(primop0)) < CTreeTypePrecision(*restype_ptr) ++ && CTreeTypePrecision(CTreeType(primop1)) < CTreeTypePrecision(*restype_ptr)) ++ { ++ type = c_get_common_type(CTreeType(primop0), CTreeType(primop1)); ++ type = c_get_signed_or_unsigned_type(unsignedp0 ++ || CIsTreeNodeUnsigned(*restype_ptr), ++ type); ++ /* Make sure shorter operand is extended the right way ++ to match the longer operand. */ ++ primop0 = c_convert_expr( ++ c_get_signed_or_unsigned_type(unsignedp0, CTreeType(primop0)), primop0); ++ primop1 = c_convert_expr( ++ c_get_signed_or_unsigned_type(unsignedp1, CTreeType(primop1)), primop1); ++ } ++ else ++ { ++ /* Here we must do the comparison on the nominal type ++ using the args exactly as we received them. */ ++ type = *restype_ptr; ++ primop0 = op0; ++ primop1 = op1; ++ ++ if (!real1 && !real2 && c_tree_is_integer_zerop(primop1) ++ && CIsTreeNodeUnsigned(*restype_ptr)) ++ { ++ c_tree_node *value = 0; ++ switch (code) ++ { ++ case C_GE_EXPR: ++ /* All unsigned values are >= 0, so we warn if extra warnings ++ are requested. However, if OP0 is a constant that is ++ >= 0, the signedness of the comparison isn't an issue, ++ so suppress the warning. */ ++ if (c_extra_warnings ++ && ! ( CTreeNodeFirstCode(primop0) == C_INT_CST_NODE ++ && ! CIsTreeNodeOverflow( ++ c_convert_expr(c_get_signed_type(type), primop0)))) ++ { ++ warning ("unsigned value >= 0 is always 1"); ++ } ++ value = c_boolean_true_node; ++ break; ++ ++ case C_LT_EXPR: ++ if (c_extra_warnings ++ && ! ( CTreeNodeFirstCode(primop0) == C_INT_CST_NODE ++ && ! CIsTreeNodeOverflow( ++ c_convert_expr(c_get_signed_type(type), primop0)))) ++ { ++ warning ("unsigned value < 0 is always 0"); ++ } ++ value = c_boolean_false_node; ++ break; ++ ++ default: ++ break; ++ } ++ ++ if (value != 0) ++ { ++ /* Don't forget to evaluate PRIMOP0 if it has side effects. */ ++ if ( CIsTreeNodeSideEffect(primop0)) ++ return c_tree_build_binary_typed_expr( ++ C_COMPOUND_EXPR, CTreeType(value), primop0, value); ++ return value; ++ } ++ } ++ } ++ ++ *op0_ptr = c_convert_expr(type, primop0); ++ *op1_ptr = c_convert_expr(type, primop1); ++ ++ *restype_ptr = c_boolean_type_node; ++ ++ return 0; ++} +diff -Naur alliance-5.0/gcp/src/c_common.h alliance/gcp/src/c_common.h +--- alliance-5.0/gcp/src/c_common.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_common.h 2002-09-30 18:20:19.000000000 +0200 +@@ -0,0 +1,75 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_common.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_COMMON_H ++# define C_COMMON_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ extern void c_constant_expression_warning __P((c_tree_node *value)); ++ extern int c_min_precision __P((c_tree_node *value, int unsignedp)); ++ extern c_tree_node * c_check_case_value __P((c_tree_node *value)); ++ extern c_tree_node * c_check_case_value __P((c_tree_node *value)); ++ extern c_tree_node * c_shorten_compare __P(( c_tree_node **op0_ptr, c_tree_node **op1_ptr, c_tree_node **restype_ptr, int *rescode_ptr )); ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_convert.c alliance/gcp/src/c_convert.c +--- alliance-5.0/gcp/src/c_convert.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_convert.c 2005-05-11 10:05:33.000000000 +0200 +@@ -0,0 +1,1268 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_convert.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_cdecl.h" ++# include "c_ctypeck.h" ++# include "c_flags.h" ++# include "c_convert.h" ++# include "c_foldconst.h" ++# include "c_debug.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ ++/* Convert EXPR to some pointer or reference type TYPE. ++ ++ EXPR must be pointer, reference, integer, enumeral, or literal zero; ++ in other cases error is called. */ ++ ++c_tree_node *c_convert_to_pointer( type, expr ) ++ ++ c_tree_node *type; ++ c_tree_node *expr; ++{ ++ c_tree_node *intype = CTreeType(expr); ++ int form = CTreeTypeCode(intype); ++ ++ if ( c_tree_is_integer_zerop(expr)) ++ { ++ expr = c_tree_build_int_2(0, 0); ++ CTreeType(expr) = type; ++ return expr; ++ } ++ ++ if (form == C_POINTER_TYPE || form == C_REFERENCE_TYPE) ++ { ++ expr = c_tree_build_unary_expr( C_NOP_EXPR, expr ); ++ CTreeType( expr ) = type; ++ ++ return( expr ); ++ } ++ ++ ++ if ( form == C_INTEGER_TYPE || form == C_ENUMERAL_TYPE ) ++ { ++ if (c_type_precision(intype) == C_POINTER_TYPE_SIZE) ++ { ++ expr = c_tree_build_unary_expr( C_CONVERT_EXPR, expr ); ++ CTreeType( expr ) = type; ++ ++ return expr; ++ } ++ ++ expr = c_convert_expr(c_get_type_for_size(C_POINTER_TYPE_SIZE, 0), expr); ++ /* Modes may be different but sizes should be the same. */ ++# ifdef LUDO_DONE ++ if (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr))) ++ != GET_MODE_SIZE (TYPE_MODE (type))) ++ /* There is supposed to be some integral type ++ that is the same width as a pointer. */ ++ abort (); ++# endif ++ return c_convert_to_pointer(type, expr); ++ } ++ ++ error ("cannot convert to a pointer type"); ++ ++ expr = c_tree_build_int_2(0, 0); ++ CTreeType(expr) = type; ++ ++ return expr; ++} ++ ++/* Convert EXPR to some floating-point type TYPE. ++ ++ EXPR must be float, integer, or enumeral; ++ in other cases error is called. */ ++ ++c_tree_node *c_convert_to_real(type, expr) ++ c_tree_node *type; ++ c_tree_node *expr; ++{ ++ int form = CTreeTypeCode( CTreeType(expr)); ++ ++ if (form == C_REAL_TYPE) ++ { ++ expr = c_tree_build_unary_expr( ++ c_flag_float_store ? C_CONVERT_EXPR : C_NOP_EXPR, expr ); ++ ++ CTreeType( expr ) = type; ++ ++ return( expr ); ++ } ++ ++ if ( INTEGRAL_TYPE_P( CTreeType(expr))) ++ { ++ expr = c_tree_build_unary_expr( C_FLOAT_EXPR, expr ); ++ CTreeType( expr ) = type; ++ ++ return( expr ); ++ } ++ ++ if (form == C_COMPLEX_TYPE) ++ { ++ c_tree_node *tmp; ++ ++ tmp = c_tree_build_unary_expr( C_REALPART_EXPR, expr ); ++ CTreeType( tmp ) = CTreeType( CTreeType( expr ) ); ++ tmp = c_fold( tmp ); ++ ++ expr = c_convert_expr( type, tmp ); ++ ++ return( expr ); ++ } ++ ++ if (form == C_POINTER_TYPE || form == C_REFERENCE_TYPE) ++ { ++ error ("pointer value used where a floating point value was expected"); ++ } ++ else ++ { ++ error ("aggregate value used where a float was expected"); ++ } ++ ++ { ++ c_tree_node *tem = c_tree_add_node( C_REAL_CST_NODE ); ++ CTreeType(tem) = type; ++ CTreeRealCstValue(tem) = 0.0; ++# ifdef LUDO_DONE ++ TREE_REAL_CST (tem) = REAL_VALUE_ATOF ("0.0", TYPE_MODE (type)); ++# endif ++ return tem; ++ } ++} ++ ++/* Convert EXPR to the complex type TYPE in the usual ways. */ ++ ++c_tree_node *c_convert_to_complex(type, expr) ++ c_tree_node *type; ++ c_tree_node *expr; ++{ ++ int form = CTreeTypeCode( CTreeType(expr)); ++ c_tree_node *subtype = CTreeType(type); ++ ++ if (form == C_REAL_TYPE || form == C_INTEGER_TYPE || form == C_ENUMERAL_TYPE) ++ { ++ expr = c_convert_expr( subtype, expr ); ++ ++ expr = c_tree_build_binary_expr( ++ C_COMPLEX_EXPR, expr, ++ c_convert_expr(subtype, c_integer_zero_node)); ++ ++ CTreeType( expr ) = type; ++ ++ return( expr ); ++ } ++ ++ if ( form == C_COMPLEX_TYPE ) ++ { ++ c_tree_node *elt_type = CTreeType( CTreeType(expr)); ++ if ( CTreeTypeMainVariant(elt_type) == CTreeTypeMainVariant(subtype)) ++ { ++ return expr; ++ } ++ else if ( CTreeExprCode(expr) == C_COMPLEX_EXPR) ++ { ++ expr = c_tree_build_binary_expr( ++ C_COMPLEX_EXPR, ++ c_convert_expr(subtype, CTreeExprOperand(expr, 0)), ++ c_convert_expr(subtype, CTreeExprOperand(expr, 1))); ++ CTreeType( expr ) = type; ++ expr = c_fold( expr ); ++ ++ return( expr ); ++ } ++ else ++ { ++ c_tree_node *oper1; ++ c_tree_node *oper2; ++ ++ oper1 = c_tree_build_unary_expr( C_REALPART_EXPR, expr); ++ CTreeType( oper1 ) = CTreeType( CTreeType(expr)); ++ oper1 = c_fold( oper1 ); ++ ++ oper2 = c_tree_build_unary_expr( C_IMAGPART_EXPR, expr); ++ CTreeType( oper2 ) = CTreeType( CTreeType(expr)); ++ oper2 = c_fold( oper2 ); ++ ++ expr = c_tree_build_binary_expr( ++ C_COMPLEX_EXPR, ++ c_convert_expr(subtype,oper1), ++ c_convert_expr(subtype,oper2) ); ++ ++ CTreeType( expr ) = type; ++ expr = c_fold( expr ); ++ ++ return( expr ); ++ } ++ } ++ ++ if (form == C_POINTER_TYPE || form == C_REFERENCE_TYPE) ++ { ++ error ("pointer value used where a complex was expected"); ++ } ++ else ++ { ++ error ("aggregate value used where a complex was expected"); ++ } ++ ++ expr = c_tree_build_binary_expr( C_COMPLEX_EXPR, ++ c_convert_expr(subtype, c_integer_zero_node), ++ c_convert_expr(subtype, c_integer_zero_node)); ++ ++ CTreeType( expr ) = type; ++ ++ return( expr ); ++} ++ ++/* Convert EXPR to some integer (or enum) type TYPE. ++ EXPR must be pointer, integer, discrete (enum, char, or bool), or float; ++ in other cases error is called. ++ ++ The result of this is always supposed to be a newly created tree node ++ not in use in any existing structure. */ ++ ++c_tree_node *c_convert_to_integer(type, expr) ++ c_tree_node *type; ++ c_tree_node *expr; ++{ ++ c_tree_node *intype = CTreeType(expr); ++ int form = CTreeTypeCode(intype); ++ ++ if (form == C_POINTER_TYPE || form == C_REFERENCE_TYPE) ++ { ++ if (c_tree_is_integer_zerop (expr)) ++ { ++ expr = c_integer_zero_node; ++ intype = CTreeType( expr ); ++ } ++ else ++ { ++ intype = c_get_type_for_size( C_POINTER_TYPE_SIZE, 0); ++ expr = c_tree_build_unary_expr( C_CONVERT_EXPR, expr); ++ CTreeType( expr ) = intype; ++ expr = c_fold( expr ); ++ } ++ ++ form = CTreeTypeCode(intype); ++ ++ if (intype == type) ++ { ++ return expr; ++ } ++ } ++ ++ if (form == C_INTEGER_TYPE || form == C_ENUMERAL_TYPE ++ || form == C_BOOLEAN_TYPE || form == C_CHAR_TYPE) ++ { ++ unsigned outprec = CTreeTypePrecision(type); ++ unsigned inprec = CTreeTypePrecision(intype); ++ int ex_form = CTreeExprCode(expr); ++ ++ /* If we are widening the type, put in an explicit conversion. ++ Similarly if we are not changing the width. However, if this is ++ a logical operation that just returns 0 or 1, we can change the ++ type of the expression. For logical operations, we must ++ also change the types of the operands to maintain type ++ correctness. */ ++ ++ if ( (ex_form == C_LT_EXPR) || ++ (ex_form == C_LE_EXPR) || ++ (ex_form == C_GT_EXPR) || ++ (ex_form == C_GE_EXPR) || ++ (ex_form == C_EQ_EXPR) || ++ (ex_form == C_NE_EXPR) || ++ (ex_form == C_SET_LE_EXPR) ) ++ { ++ CTreeType(expr) = type; ++ return expr; ++ } ++ else if (ex_form == C_TRUTH_AND_EXPR || ex_form == C_TRUTH_ANDIF_EXPR ++ || ex_form == C_TRUTH_OR_EXPR || ex_form == C_TRUTH_ORIF_EXPR ++ || ex_form == C_TRUTH_XOR_EXPR) ++ { ++ CTreeExprOperand(expr, 0) = c_convert_expr(type, CTreeExprOperand(expr, 0)); ++ CTreeExprOperand(expr, 1) = c_convert_expr(type, CTreeExprOperand(expr, 1)); ++ CTreeType(expr) = type; ++ ++ return expr; ++ } ++ else if (ex_form == C_TRUTH_NOT_EXPR) ++ { ++ CTreeExprOperand(expr, 0) = c_convert_expr(type, CTreeExprOperand(expr, 0)); ++ CTreeType(expr) = type; ++ return expr; ++ } ++ else if (outprec >= inprec) ++ { ++ expr = c_tree_build_unary_expr( C_NOP_EXPR, expr); ++ CTreeType( expr ) = type; ++ return expr; ++ } ++ ++ /* If TYPE is an enumeral type or a type with a precision less ++ than the number of bits in its mode, do the conversion to the ++ type corresponding to its mode, then do a nop conversion ++ to TYPE. */ ++# ifdef LUDO_DONE ++ else if ( CTreeTypeCode(type) == C_ENUMERAL_TYPE ++ || outprec != GET_MODE_BITSIZE(TYPE_MODE (type))) ++ { ++ return build1 (NOP_EXPR, type, ++ convert (type_for_mode (TYPE_MODE (type), ++ TREE_UNSIGNED (type)), ++ expr)); ++ } ++# endif ++ ++ /* Here detect when we can distribute the truncation down past some ++ arithmetic. For example, if adding two longs and converting to an ++ int, we can equally well convert both to ints and then add. ++ For the operations handled here, such truncation distribution ++ is always safe. ++ It is desirable in these cases: ++ 1) when truncating down to full-word from a larger size ++ 2) when truncating takes no work. ++ 3) when at least one operand of the arithmetic has been extended ++ (as by C's default conversions). In this case we need two conversions ++ if we do the arithmetic as already requested, so we might as well ++ truncate both and then combine. Perhaps that way we need only one. ++ ++ Note that in general we cannot do the arithmetic in a type ++ shorter than the desired result of conversion, even if the operands ++ are both extended from a shorter type, because they might overflow ++ if combined in that type. The exceptions to this--the times when ++ two narrow values can be combined in their narrow type even to ++ make a wider result--are handled by "shorten" in build_binary_op. */ ++ ++ switch (ex_form) ++ { ++ case C_RSHIFT_EXPR: ++ /* We can pass truncation down through right shifting ++ when the shift count is a nonpositive constant. */ ++ if ( CTreeNodeFirstCode( CTreeExprOperand(expr, 1)) == C_INT_CST_NODE ++ && c_tree_is_int_cst_lt( CTreeExprOperand(expr, 1), ++ c_convert_expr( CTreeType(CTreeExprOperand (expr, 1)), ++ c_integer_one_node))) ++ goto trunc1; ++ break; ++ ++ case C_LSHIFT_EXPR: ++ /* We can pass truncation down through left shifting ++ when the shift count is a nonnegative constant. */ ++ if ( CTreeNodeFirstCode(CTreeExprOperand(expr, 1)) == C_INT_CST_NODE ++ && c_tree_is_int_cst_sgn(CTreeExprOperand(expr, 1)) >= 0 ++ && CTreeNodeFirstCode( CTreeTypeSize(type)) == C_INT_CST_NODE) ++ { ++ /* If shift count is less than the width of the truncated type, ++ really shift. */ ++ if ( c_tree_is_int_cst_lt(CTreeExprOperand(expr, 1), ++ CTreeTypeSize(type))) ++ /* In this case, shifting is like multiplication. */ ++ goto trunc1; ++ else ++ { ++ /* If it is >= that width, result is zero. ++ Handling this with trunc1 would give the wrong result: ++ (int) ((long long) a << 32) is well defined (as 0) ++ but (int) a << 32 is undefined and would get a ++ warning. */ ++ ++ c_tree_node *t = c_convert_to_integer(type, c_integer_zero_node); ++ ++ /* If the original expression had side-effects, we must ++ preserve it. */ ++ if ( CIsTreeNodeSideEffect(expr)) ++ { ++ c_tree_node *tmp_node; ++ ++ tmp_node = c_tree_build_binary_expr( C_COMPOUND_EXPR, expr, t ); ++ CTreeType( tmp_node ) = type; ++ ++ return tmp_node; ++ } ++ else ++ return t; ++ } ++ } ++ break; ++ ++ case C_MAX_EXPR: ++ case C_MIN_EXPR: ++ case C_MULT_EXPR: ++ { ++ c_tree_node *arg0 = c_get_unwidened( CTreeExprOperand(expr, 0), type); ++ c_tree_node *arg1 = c_get_unwidened( CTreeExprOperand(expr, 1), type); ++ ++ /* Don't distribute unless the output precision is at least as big ++ as the actual inputs. Otherwise, the comparison of the ++ truncated values will be wrong. */ ++ if (outprec >= CTreeTypePrecision( CTreeType(arg0)) ++ && outprec >= CTreeTypePrecision( CTreeType(arg1)) ++ /* If signedness of arg0 and arg1 don't match, ++ we can't necessarily find a type to compare them in. */ ++ && ( CIsTreeNodeUnsigned( CTreeType(arg0)) ++ == CIsTreeNodeUnsigned( CTreeType(arg1)))) ++ goto trunc1; ++ break; ++ } ++ ++ case C_PLUS_EXPR: ++ case C_MINUS_EXPR: ++ case C_BIT_AND_EXPR: ++ case C_BIT_IOR_EXPR: ++ case C_BIT_XOR_EXPR: ++ case C_BIT_ANDTC_EXPR: ++ trunc1: ++ { ++# ifdef LUDO_DONE ++ c_tree_node * arg0 = c_get_unwidened(CTreeExprOperand (expr, 0), type); ++ c_tree_node * arg1 = c_get_unwidened(CTreeExprOperand (expr, 1), type); ++ ++ if (outprec >= C_BITS_PER_WORD ++ || TRULY_NOOP_TRUNCATION (outprec, inprec) ++ || inprec > TYPE_PRECISION (TREE_TYPE (arg0)) ++ || inprec > TYPE_PRECISION (TREE_TYPE (arg1))) ++ { ++ /* Do the arithmetic in type TYPEX, ++ then convert result to TYPE. */ ++ register tree typex = type; ++ ++ /* Can't do arithmetic in enumeral types ++ so use an integer type that will hold the values. */ ++ if (TREE_CODE (typex) == ENUMERAL_TYPE) ++ typex = type_for_size (TYPE_PRECISION (typex), ++ TREE_UNSIGNED (typex)); ++ ++ /* But now perhaps TYPEX is as wide as INPREC. ++ In that case, do nothing special here. ++ (Otherwise would recurse infinitely in convert. */ ++ if (TYPE_PRECISION (typex) != inprec) ++ { ++ /* Don't do unsigned arithmetic where signed was wanted, ++ or vice versa. ++ Exception: if either of the original operands were ++ unsigned then can safely do the work as unsigned. ++ And we may need to do it as unsigned ++ if we truncate to the original size. */ ++ typex = ((TREE_UNSIGNED (TREE_TYPE (expr)) ++ || TREE_UNSIGNED (TREE_TYPE (arg0)) ++ || TREE_UNSIGNED (TREE_TYPE (arg1))) ++ ? unsigned_type (typex) : signed_type (typex)); ++ return convert (type, ++ c_fold (build (ex_form, typex, ++ convert (typex, arg0), ++ convert (typex, arg1), ++ 0))); ++ } ++ } ++# endif ++ } ++ break; ++ ++ case C_NEGATE_EXPR: ++ case C_BIT_NOT_EXPR: ++ /* This is not correct for ABS_EXPR, ++ since we must test the sign before truncation. */ ++ { ++ c_tree_node *typex = type; ++ ++ /* Can't do arithmetic in enumeral types ++ so use an integer type that will hold the values. */ ++ if ( CTreeTypeCode(typex) == C_ENUMERAL_TYPE) ++ typex = c_get_type_for_size( CTreeTypePrecision(typex), ++ CIsTreeNodeUnsigned(typex)); ++ ++ /* But now perhaps TYPEX is as wide as INPREC. ++ In that case, do nothing special here. ++ (Otherwise would recurse infinitely in convert. */ ++ if ( CTreeTypePrecision(typex) != inprec) ++ { ++ c_tree_node *tmp_node; ++ /* Don't do unsigned arithmetic where signed was wanted, ++ or vice versa. */ ++ typex = ( CIsTreeNodeUnsigned( CTreeType(expr)) ++ ? c_get_unsigned_type(typex) : c_get_signed_type(typex)); ++ ++ tmp_node = c_tree_build_unary_expr( ex_form, ++ c_convert_expr( typex, CTreeExprOperand( expr, 0 ) ) ); ++ CTreeType( tmp_node ) = typex; ++ tmp_node = c_fold( tmp_node ); ++ ++ return c_convert_expr(type, tmp_node ); ++ } ++ } ++ ++ case C_NOP_EXPR: ++ /* If truncating after truncating, might as well do all at once. ++ If truncating after extending, we may get rid of wasted work. */ ++ return c_convert_expr(type, c_get_unwidened(CTreeExprOperand(expr, 0), type)); ++ ++ case C_COND_EXPR: ++ /* Can treat the two alternative values like the operands ++ of an arithmetic expression. */ ++ { ++# ifdef LUDO_DONE ++ c_tree_node * arg1 = c_get_unwidened(CTreeExprOperand (expr, 1), type); ++ c_tree_node * arg2 = c_get_unwidened(CTreeExprOperand (expr, 2), type); ++ ++ if (outprec >= BITS_PER_WORD ++ || TRULY_NOOP_TRUNCATION (outprec, inprec) ++ || inprec > TYPE_PRECISION (TREE_TYPE (arg1)) ++ || inprec > TYPE_PRECISION (TREE_TYPE (arg2))) ++ { ++ /* Do the arithmetic in type TYPEX, ++ then convert result to TYPE. */ ++ register tree typex = type; ++ ++ /* Can't do arithmetic in enumeral types ++ so use an integer type that will hold the values. */ ++ if (TREE_CODE (typex) == ENUMERAL_TYPE) ++ typex = type_for_size (TYPE_PRECISION (typex), ++ TREE_UNSIGNED (typex)); ++ ++ /* But now perhaps TYPEX is as wide as INPREC. ++ In that case, do nothing special here. ++ (Otherwise would recurse infinitely in convert. */ ++ if (TYPE_PRECISION (typex) != inprec) ++ { ++ /* Don't do unsigned arithmetic where signed was wanted, ++ or vice versa. */ ++ typex = (TREE_UNSIGNED (TREE_TYPE (expr)) ++ ? unsigned_type (typex) : signed_type (typex)); ++ return convert (type, ++ fold (build (COND_EXPR, typex, ++ CTreeExprOperand (expr, 0), ++ convert (typex, arg1), ++ convert (typex, arg2)))); ++ } ++ else ++ /* It is sometimes worthwhile ++ to push the narrowing down through the conditional. */ ++ return fold (build (COND_EXPR, type, ++ CTreeExprOperand (expr, 0), ++ convert (type, CTreeExprOperand (expr, 1)), ++ convert (type, CTreeExprOperand (expr, 2)))); ++ } ++# endif ++ } ++ break; ++ ++ default: ++ break; ++ } ++ ++ expr = c_tree_build_unary_expr( C_NOP_EXPR, expr); ++ CTreeType( expr ) = type; ++ return expr; ++ } ++ ++ if (form == C_REAL_TYPE) ++ { ++ expr = c_tree_build_unary_expr( C_FIX_TRUNC_EXPR, expr ); ++ CTreeType( expr ) = type; ++ ++ return( expr ); ++ } ++ ++ if (form == C_COMPLEX_TYPE) ++ { ++ c_tree_node *tmp_type; ++ ++ tmp_type = CTreeType( CTreeType( expr ) ); ++ expr = c_tree_build_unary_expr( C_REALPART_EXPR, expr ); ++ CTreeType( expr ) = tmp_type; ++ expr = c_fold( expr ); ++ expr = c_convert_expr( type, expr ); ++ ++ return( expr ); ++ } ++ ++ error ("aggregate value used where an integer was expected"); ++ ++ { ++ c_tree_node *tem = c_tree_build_int_2 (0, 0); ++ CTreeType(tem) = type; ++ ++ return tem; ++ } ++} ++ ++/* Create an expression whose value is that of EXPR, ++ converted to type TYPE. The TREE_TYPE of the value is always TYPE. This ++ function implements all reasonable conversions; callers should filter out ++ those that are not permitted by the language being compiled. */ ++ ++c_tree_node *c_convert_expr( type, expr ) ++ ++ c_tree_node *type; ++ c_tree_node *expr; ++{ ++ c_tree_node *e = expr; ++ c_tree_node *result = c_error_mark_node; ++ int type_type = CTreeTypeCode(type); ++ ++ if (type == CTreeType(expr) ++ || CTreeNodeFirstCode(expr) == C_ERROR_NODE) ++ result = expr; ++ else ++ if (CTreeTypeMainVariant(type) == CTreeTypeMainVariant( CTreeType(expr))) ++ { ++ e = c_tree_build_unary_expr( C_NOP_EXPR, e); ++ CTreeType( e ) = type; ++ ++ result = c_fold( e ); ++ } ++ else ++ if ( CTreeNodeFirstCode( CTreeType(expr)) == C_ERROR_NODE) ++ { ++ result = c_error_mark_node; ++ } ++ else ++ if ( CTreeTypeCode( CTreeType(expr)) == C_VOID_TYPE) ++ { ++ error("void value not ignored as it ought to be"); ++ result = c_error_mark_node; ++ } ++ else ++ if (type_type == C_VOID_TYPE) ++ { ++ e = c_tree_build_unary_expr( C_CONVERT_EXPR, e); ++ CTreeType( e ) = type; ++ ++ result = e; ++ } ++ else ++ if (type_type == C_INTEGER_TYPE || type_type == C_ENUMERAL_TYPE) ++ { ++ result = c_fold( c_convert_to_integer(type, e) ); ++ } ++ else ++ if (type_type == C_POINTER_TYPE) ++ { ++ result = c_fold( c_convert_to_pointer(type, e) ); ++ } ++ else ++ if (type_type == C_REAL_TYPE) ++ { ++ result = c_fold( c_convert_to_real(type, e) ); ++ } ++ else ++ if (type_type == C_COMPLEX_TYPE) ++ { ++ result = c_fold( c_convert_to_complex(type, e) ); ++ } ++ else ++ { ++ error("conversion to non-scalar type requested"); ++ } ++ ++ return result; ++} ++ ++ ++/* Return the innermost context enclosing DECL that is ++ a FUNCTION_DECL, or zero if none. */ ++ ++c_tree_node *c_get_decl_function_context(decl) ++ c_tree_node *decl; ++{ ++ c_tree_node *context; ++ ++ if ( CTreeNodeFirstCode(decl) == C_ERROR_NODE) ++ return 0; ++ ++ if ( CTreeNodeFirstCode(decl) == C_EXPR_NODE && ++ CTreeDeclCode(decl) == C_SAVE_EXPR ) ++ context = CTreeExprOperand(decl,1); ++ else ++ context = CTreeDeclContext(decl); ++ ++ while (context && ( CTreeNodeFirstCode(context) != C_DECL_NODE || ++ CTreeDeclCode(context) != C_FUNCTION_DECL) ) ++ { ++ if ( (CTreeNodeFirstCode(context) == C_TYPE_NODE) && ++ ( CTreeTypeCode(context) == C_RECORD_TYPE ++ || CTreeTypeCode(context) == C_UNION_TYPE ++ || CTreeTypeCode(context) == C_QUAL_UNION_TYPE)) ++ context = CTreeTypeContext(context); ++ else if ( CTreeNodeFirstCode(context) == C_DECL_NODE && ++ CTreeDeclCode(context) == C_TYPE_DECL) ++ context = CTreeDeclContext(context); ++ else if ( CTreeNodeFirstCode(context) == C_BLOCK_NODE) ++ context = CTreeBlockSuperContext(context); ++ else ++ /* Unhandled CONTEXT !? */ ++ abort (); ++ } ++ ++ return context; ++} ++ ++ ++/* Return nonzero if arg is static -- a reference to an object in ++ static storage. This is not the same as the C meaning of `static'. */ ++ ++int ++c_is_staticp(arg) ++ ++ c_tree_node *arg; ++{ ++ int code; ++ ++ code = CTreeNodeFirstCode(arg); ++ ++ if ( code == C_DECL_NODE ) ++ { ++ switch ( CTreeDeclCode( arg ) ) ++ { ++ case C_FUNCTION_DECL: ++ /* Nested functions aren't static, since taking their address ++ involves a trampoline. */ ++ return c_get_decl_function_context(arg) == 0 || CIsTreeDeclRegister(arg); ++ case C_VAR_DECL: ++ return CIsTreeNodeStatic(arg) || CIsTreeDeclExternal(arg); ++ } ++ } ++ else ++ if ( code == C_EXPR_NODE ) ++ { ++ switch ( CTreeExprCode(arg)) ++ { ++ case C_CONSTRUCTOR_EXPR: ++ return CIsTreeNodeStatic(arg); ++ ++ /* If we are referencing a bitfield, we can't evaluate an ++ ADDR_EXPR at compile time and so it isn't a constant. */ ++ case C_COMPONENT_REF: ++ return (! CIsTreeDeclBitField( CTreeExprOperand(arg, 1)) ++ && c_is_staticp( CTreeExprOperand(arg, 0))); ++ ++ case C_BIT_FIELD_REF: ++ return 0; ++ ++ case C_ARRAY_REF: ++ if ( CTreeNodeFirstCode( CTreeTypeSize( CTreeType(arg))) == C_INT_CST_NODE ++ && CTreeNodeFirstCode( CTreeExprOperand(arg, 1)) == C_INT_CST_NODE) ++ return c_is_staticp( CTreeExprOperand(arg, 0)); ++ } ++ } ++ else ++ if ( code == C_STRING_NODE ) ++ { ++ return 1; ++ } ++ ++ return 0; ++} ++ ++/* Perform default promotions for C data used in expressions. ++ Arrays and functions are converted to pointers; ++ enumeral types or short or char, to int. ++ In addition, manifest constants symbols are replaced by their values. */ ++ ++c_tree_node *c_default_conversion( exp ) ++ ++ c_tree_node *exp; ++{ ++ c_tree_node *type = CTreeType(exp); ++ int code = CTreeTypeCode(type); ++ ++ /* Constants can be used directly unless they're not loadable. */ ++ if ( ( CTreeNodeFirstCode(exp) == C_DECL_NODE ) && ++ ( CTreeDeclCode(exp) == C_CONST_DECL) ) ++ { ++ exp = CTreeDeclInitial(exp); ++ } ++ ++ /* Replace a nonvolatile const static variable with its value unless ++ it is an array, in which case we must be sure that taking the ++ address of the array produces consistent results. */ ++# ifdef LUDO_DONE ++ else if (optimize && TREE_CODE (exp) == VAR_DECL && code != ARRAY_TYPE) ++ { ++ exp = c_decl_constant_value(exp); ++ type = TREE_TYPE (exp); ++ } ++# endif ++ ++ /* Strip NON_LVALUE_EXPRs and no-op conversions, since we aren't using as ++ an lvalue. */ ++ /* Do not use STRIP_NOPS here! It will remove conversions from pointer ++ to integer and cause infinite recursion. */ ++ while ( CTreeExprCode(exp) == C_NON_LVALUE_EXPR ++ || ( CTreeExprCode(exp) == C_NOP_EXPR ++ && CTreeType( CTreeExprOperand(exp, 0)) == CTreeType(exp))) ++ { ++ exp = CTreeExprOperand(exp, 0); ++ } ++ ++ /* Normally convert enums to int, ++ but convert wide enums to something wider. */ ++ if (code == C_ENUMERAL_TYPE) ++ { ++#define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) ++ ++ type = c_get_type_for_size( ++ MAX( CTreeTypePrecision(type), ++ CTreeTypePrecision(c_integer_type_node)), ++ ((c_flag_traditional ++ || (CTreeTypePrecision(type) ++ >= CTreeTypePrecision(c_integer_type_node))) ++ && CIsTreeNodeUnsigned(type))); ++ return c_convert_expr(type, exp); ++ } ++ ++ if ( CTreeExprCode(exp) == C_COMPONENT_REF ++ && CIsTreeDeclCBitField( CTreeExprOperand(exp, 1))) ++ { ++ c_tree_node *width = CTreeDeclSize( CTreeExprOperand(exp, 1)); ++ int low = CTreeIntCstLow(width); ++ ++ /* If it's thinner than an int, promote it like a ++ C_PROMOTING_INTEGER_TYPE_P, otherwise leave it alone. */ ++ ++ if (low < CTreeTypePrecision(c_integer_type_node)) ++ { ++ if (c_flag_traditional && CIsTreeNodeUnsigned(type)) ++ { ++ return c_convert_expr(c_unsigned_type_node, exp); ++ } ++ else ++ { ++ return c_convert_expr(c_integer_type_node, exp); ++ } ++ } ++ } ++ ++#define C_PROMOTING_INTEGER_TYPE_P(t) \ ++ ( CTreeTypeCode((t)) == C_INTEGER_TYPE \ ++ && ( CTreeTypeMainVariant(t) == c_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_signed_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_unsigned_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_short_integer_type_node \ ++ || CTreeTypeMainVariant(t) == c_short_unsigned_type_node)) ++ ++ if (C_PROMOTING_INTEGER_TYPE_P (type)) ++ { ++ /* Traditionally, unsignedness is preserved in default promotions. ++ Also preserve unsignedness if not really getting any wider. */ ++ if ( CIsTreeNodeUnsigned(type) ++ && (c_flag_traditional ++ || CTreeTypePrecision(type) == CTreeTypePrecision(c_integer_type_node))) ++ return c_convert_expr(c_unsigned_type_node, exp); ++ return c_convert_expr(c_integer_type_node, exp); ++ } ++ if (c_flag_traditional && !c_flag_allow_single_precision ++ && CTreeTypeMainVariant(type) == c_float_type_node) ++ return c_convert_expr(c_double_type_node, exp); ++ ++ if (code == C_VOID_TYPE) ++ { ++ error ("void value not ignored as it ought to be"); ++ return c_error_mark_node; ++ } ++ ++ if (code == C_FUNCTION_TYPE) ++ { ++ return c_parser_build_unary_op( C_ADDR_EXPR, exp, 0); ++ } ++ ++ if (code == C_ARRAY_TYPE) ++ { ++ c_tree_node *adr; ++ c_tree_node *restype = CTreeType(type); ++ c_tree_node *ptrtype; ++ int constp = 0; ++ int volatilep = 0; ++ ++ if ( ( CTreeNodeFirstCode(exp) == C_EXPR_NODE && ++ ( CTreeExprCode(exp) == C_COMPONENT_REF ++ || CTreeExprCode(exp ) == C_BIT_FIELD_REF ++ || CTreeExprCode(exp ) == C_INDIRECT_REF ++ || CTreeExprCode(exp ) == C_BUFFER_REF ++ || CTreeExprCode(exp ) == C_ARRAY_REF)) ++ || ( CTreeNodeFirstCode(exp) == C_DECL_NODE ) ) ++ { ++ constp = CIsTreeNodeReadOnly(exp); ++ volatilep = CIsTreeNodeVolatile(exp); ++ } ++ ++ if ( CIsTreeNodeReadOnly(type) || ++ CIsTreeNodeVolatile(type) ++ || constp || volatilep) ++ { ++ restype = c_tree_build_type_variant(restype, ++ CIsTreeNodeReadOnly(type) || constp, ++ CIsTreeNodeVolatile(type) || volatilep); ++ } ++ if ( CTreeExprCode(exp) == C_INDIRECT_REF) ++ { ++ return c_convert_expr( CTreeTypePointerTo(restype), CTreeExprOperand(exp, 0)); ++ } ++ ++ if ( CTreeExprCode(exp) == C_COMPOUND_EXPR) ++ { ++ c_tree_node *op1 = c_default_conversion( CTreeExprOperand(exp, 1)); ++ ++ exp = c_tree_build_binary_expr( C_COMPOUND_EXPR, CTreeExprOperand( exp, 0 ), op1 ); ++ CTreeType( exp ) = CTreeType( op1 ); ++ ++ return exp; ++ } ++ ++ if (! c_is_lvalue_p(exp) ++ && ! ( CTreeExprCode(exp) == C_CONSTRUCTOR_EXPR && CIsTreeNodeStatic(exp))) ++ { ++ error ("invalid use of non-lvalue array"); ++ return c_error_mark_node; ++ } ++ ++ ptrtype = c_tree_build_pointer_type(restype); ++ ++ if ( ( CTreeNodeFirstCode(exp) == C_DECL_NODE ) && ++ ( CTreeDeclCode( exp ) == C_VAR_DECL ) ) ++ { ++ /* ??? This is not really quite correct ++ in that the type of the operand of ADDR_EXPR ++ is not the target type of the type of the ADDR_EXPR itself. ++ Question is, can this lossage be avoided? */ ++ adr = c_tree_build_unary_typed_expr(C_ADDR_EXPR, ptrtype, exp); ++ if (c_mark_addressable(exp) == 0) ++ return c_error_mark_node; ++ if ( c_is_staticp(exp) ) CSetTreeNodeConstant(adr); ++ CClearTreeNodeSideEffect(adr); /* Default would be, same as EXP. */ ++ return adr; ++ } ++ /* This way is better for a COMPONENT_REF since it can ++ simplify the offset for a component. */ ++ adr = c_parser_build_unary_op( C_ADDR_EXPR, exp, 1); ++ return c_convert_expr (ptrtype, adr); ++ } ++ ++ return exp; ++} ++ ++/* Prepare expr to be an argument of a TRUTH_NOT_EXPR, ++ or validate its data type for an `if' or `while' statement or ?..: exp. ++ ++ This preparation consists of taking the ordinary ++ representation of an expression expr and producing a valid tree ++ boolean expression describing whether expr is nonzero. We could ++ simply always do build_binary_op (NE_EXPR, expr, boolean_false_node, 1), ++ but we optimize comparisons, &&, ||, and !. ++ ++ The resulting type should always be `boolean_type_node'. */ ++ ++c_tree_node *c_truthvalue_conversion(expr) ++ ++ c_tree_node *expr; ++{ ++ c_tree_node *tmp_node; ++ ++ if ( CTreeNodeFirstCode(expr) == C_ERROR_NODE) ++ { ++ return expr; ++ } ++ ++ if ( CTreeNodeFirstCode(expr) == C_INT_CST_NODE ) ++ { ++ return c_tree_is_integer_zerop(expr) ? c_boolean_false_node : c_boolean_true_node; ++ } ++ ++ if ( CTreeNodeFirstCode(expr) == C_REAL_CST_NODE ) ++ { ++ return c_tree_is_real_zerop(expr) ? c_boolean_false_node : c_boolean_true_node; ++ } ++ ++ switch ( CTreeExprCode(expr)) ++ { ++ case C_EQ_EXPR: ++ case C_NE_EXPR: ++ case C_LE_EXPR: ++ case C_GE_EXPR: ++ case C_LT_EXPR: ++ case C_GT_EXPR: ++ case C_TRUTH_ANDIF_EXPR: ++ case C_TRUTH_ORIF_EXPR: ++ case C_TRUTH_AND_EXPR: ++ case C_TRUTH_OR_EXPR: ++ case C_TRUTH_XOR_EXPR: ++ case C_TRUTH_NOT_EXPR: ++ ++ CTreeType(expr) = c_boolean_type_node; ++ ++ return expr; ++ ++ case C_ADDR_EXPR: ++ /* If we are taking the address of a external decl, it might be zero ++ if it is weak, so we cannot optimize. */ ++ if ( CTreeNodeFirstCode(CTreeExprOperand (expr, 0)) == C_DECL_NODE ++ && CIsTreeDeclExternal(CTreeExprOperand(expr, 0))) break; ++ ++ if (CIsTreeNodeSideEffect( CTreeExprOperand(expr, 0))) ++ { ++ tmp_node = c_tree_build_binary_expr( ++ C_COMPOUND_EXPR, CTreeExprOperand(expr, 0), c_boolean_true_node); ++ CTreeType( tmp_node ) = c_boolean_type_node; ++ ++ return( tmp_node ); ++ } ++ else ++ return c_boolean_true_node; ++ ++ case C_COMPLEX_EXPR: ++ ++ tmp_node = c_build_binary_op( ++ ( CIsTreeNodeSideEffect( CTreeExprOperand(expr, 1)) ++ ? C_TRUTH_OR_EXPR : C_TRUTH_ORIF_EXPR), ++ c_truthvalue_conversion( CTreeExprOperand(expr, 0)), ++ c_truthvalue_conversion( CTreeExprOperand(expr, 1)), 0 ); ++ ++ case C_NEGATE_EXPR: ++ case C_ABS_EXPR: ++ case C_FLOAT_EXPR: ++ case C_FFS_EXPR: ++ /* These don't change whether an object is non-zero or zero. */ ++ return c_truthvalue_conversion( CTreeExprOperand(expr, 0)); ++ ++ case C_LROTATE_EXPR: ++ case C_RROTATE_EXPR: ++ /* These don't change whether an object is zero or non-zero, but ++ we can't ignore them if their second arg has side-effects. */ ++ if ( CIsTreeNodeSideEffect( CTreeExprOperand(expr, 1))) ++ { ++ tmp_node = c_tree_build_binary_expr( ++ C_COMPOUND_EXPR, CTreeExprOperand(expr, 1), ++ c_truthvalue_conversion( CTreeExprOperand(expr, 0))); ++ CTreeType( tmp_node ) = c_boolean_type_node; ++ ++ return( tmp_node ); ++ } ++ else ++ return c_truthvalue_conversion( CTreeExprOperand(expr, 0)); ++ ++ case C_COND_EXPR: ++ /* Distribute the conversion into the arms of a COND_EXPR. */ ++ tmp_node = c_tree_build_ternary_expr( ++ C_COND_EXPR, ++ CTreeExprOperand(expr, 0), ++ c_truthvalue_conversion( CTreeExprOperand(expr, 1)), ++ c_truthvalue_conversion( CTreeExprOperand(expr, 2))); ++ ++ CTreeType( tmp_node ) = c_boolean_type_node; ++ ++ return( tmp_node ); ++ ++ case C_CONVERT_EXPR: ++ /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE, ++ since that affects how `default_conversion' will behave. */ ++ if ( CTreeTypeCode(CTreeType(expr)) == C_REFERENCE_TYPE ++ || CTreeTypeCode(CTreeType(CTreeExprOperand(expr,0))) == C_REFERENCE_TYPE) ++ break; ++ /* fall through... */ ++ case C_NOP_EXPR: ++ /* If this is widening the argument, we can ignore it. */ ++ if ( CTreeTypePrecision(CTreeType(expr)) ++ >= CTreeTypePrecision(CTreeType( CTreeExprOperand(expr, 0)))) ++ return c_truthvalue_conversion(CTreeExprOperand(expr, 0)); ++ break; ++ ++ case C_MINUS_EXPR: ++ /* With IEEE arithmetic, x - x may not equal 0, so we can't optimize ++ this case. */ ++# ifdef LUDO_DONE ++ if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT ++ && TREE_CODE (CTreeType(expr)) == REAL_TYPE) ++ break; ++# endif ++ /* fall through... */ ++ case C_BIT_XOR_EXPR: ++ /* This and MINUS_EXPR can be changed into a comparison of the ++ two objects. */ ++ if (CTreeType(CTreeExprOperand(expr, 0)) ++ == CTreeType(CTreeExprOperand(expr, 1))) ++ { ++ return( c_build_binary_op( ++ C_NE_EXPR, CTreeExprOperand(expr, 0), ++ CTreeExprOperand(expr, 1), 1 ) ); ++ } ++ ++ tmp_node = c_tree_build_unary_expr( C_NOP_EXPR, CTreeExprOperand(expr, 1)); ++ CTreeType( tmp_node ) = CTreeType(CTreeExprOperand(expr, 0)); ++ ++ return c_build_binary_op( C_NE_EXPR, CTreeExprOperand(expr, 0), tmp_node, 1 ); ++ ++ case C_BIT_AND_EXPR: ++ ++ if (c_tree_is_integer_onep(CTreeExprOperand (expr, 1)) ++ && CTreeType(expr) != c_boolean_type_node) ++ /* Using convert here would cause infinite recursion. */ ++ { ++ tmp_node = c_tree_build_unary_expr( C_NOP_EXPR, expr ); ++ CTreeType( tmp_node ) = c_boolean_type_node; ++ ++ return( tmp_node ); ++ } ++ break; ++ ++ case C_MODIFY_EXPR: ++ ++ if (c_warn_parentheses && CTreeExprComplexity(expr) == C_MODIFY_EXPR) ++ { ++ warning ("suggest parentheses around assignment used as truth value"); ++ } ++ break; ++ ++ default: ++ break; ++ } ++ ++ if ( CTreeTypeCode(CTreeType(expr)) == C_COMPLEX_TYPE) ++ { ++ return ( c_build_binary_op( ++ (CIsTreeNodeSideEffect(expr) ? C_TRUTH_OR_EXPR : C_TRUTH_ORIF_EXPR), ++ c_truthvalue_conversion( ++ c_parser_build_unary_op( C_REALPART_EXPR, expr, 0)), ++ c_truthvalue_conversion( ++ c_parser_build_unary_op( C_IMAGPART_EXPR, expr, 0)), 0 )); ++ } ++ ++ return c_build_binary_op( C_NE_EXPR, expr, c_integer_zero_node, 1 ); ++} ++ ++ ++/* Print a warning if a large constant is truncated to unsigned, ++ or if -Wconversion is used and a constant < 0 is converted to unsigned. ++ Invoke this function on every expression that might be implicitly ++ converted to an unsigned type. */ ++ ++void c_unsigned_conversion_warning(result, operand) ++ c_tree_node *result; ++ c_tree_node *operand; ++{ ++ if ( CTreeNodeFirstCode(operand) == C_INT_CST_NODE ++ && CTreeTypeCode(CTreeType(result)) == C_INTEGER_TYPE ++ && CIsTreeNodeUnsigned(CTreeType(result)) ++ && c_skip_evaluation == 0 ++ && !c_int_fits_type_p(operand, CTreeType(result))) ++ { ++ if (!c_int_fits_type_p(operand, c_get_signed_type(CTreeType(result)))) ++ /* This detects cases like converting -129 or 256 to unsigned char. */ ++ { ++ warning ("large integer implicitly truncated to unsigned type"); ++ } ++ else if (c_warn_conversion) ++ { ++ warning ("negative integer implicitly converted to unsigned type"); ++ } ++ } ++} ++ ++/* Convert EXPR to TYPE, warning about conversion problems with constants. ++ Invoke this function on every expression that is converted implicitly, ++ i.e. because of language rules and not because of an explicit cast. */ ++ ++c_tree_node *c_convert_and_check(type, expr) ++ c_tree_node *type; ++ c_tree_node *expr; ++{ ++ c_tree_node *t = c_convert_expr(type, expr); ++ if ( CTreeNodeFirstCode(t) == C_INT_CST_NODE) ++ { ++ if (CIsTreeNodeOverflow(t)) ++ { ++ CClearTreeNodeOverflow(t); ++ ++ /* Do not diagnose overflow in a constant expression merely ++ because a conversion overflowed. */ ++ if ( CIsTreeNodeCstOverflow(expr) ) CSetTreeNodeCstOverflow(t); ++ else CClearTreeNodeCstOverflow(t); ++ ++ /* No warning for converting 0x80000000 to int. */ ++ if (!(CIsTreeNodeUnsigned(type) < CIsTreeNodeUnsigned(CTreeType(expr)) ++ && CTreeNodeCode(CTreeType(expr)) == C_INTEGER_TYPE ++ && CTreeTypePrecision(type) == CTreeTypePrecision(CTreeType(expr)))) ++ /* If EXPR fits in the unsigned version of TYPE, ++ don't warn unless pedantic. */ ++ if ((c_pedantic ++ || CIsTreeNodeUnsigned(type) ++ || ! c_int_fits_type_p(expr, c_get_unsigned_type(type))) ++ && c_skip_evaluation == 0) ++ { ++ warning ("overflow in implicit constant conversion"); ++ } ++ } ++ else ++ c_unsigned_conversion_warning(t, expr); ++ } ++ return t; ++} +diff -Naur alliance-5.0/gcp/src/c_convert.h alliance/gcp/src/c_convert.h +--- alliance-5.0/gcp/src/c_convert.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_convert.h 2002-09-30 18:20:19.000000000 +0200 +@@ -0,0 +1,82 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_convert.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_CONVERT_H ++# define C_CONVERT_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern c_tree_node * c_convert_to_pointer __P((c_tree_node *type, c_tree_node *expr)); ++ extern c_tree_node * c_convert_to_real __P((c_tree_node *type, c_tree_node *expr)); ++ extern c_tree_node * c_convert_to_complex __P((c_tree_node *type, c_tree_node *expr)); ++ extern c_tree_node * c_convert_to_integer __P((c_tree_node *type, c_tree_node *expr)); ++ extern c_tree_node * c_convert_expr __P((c_tree_node *type, c_tree_node *expr)); ++ extern c_tree_node * c_default_conversion __P((c_tree_node *exp)); ++ extern c_tree_node * c_truthvalue_conversion __P((c_tree_node *expr)); ++ extern c_tree_node * c_convert_and_check __P((c_tree_node *type, c_tree_node *expr)); ++ extern int c_is_staticp __P((c_tree_node *arg)); ++ ++ c_tree_node *arg; ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_ctypeck.c alliance/gcp/src/c_ctypeck.c +--- alliance-5.0/gcp/src/c_ctypeck.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_ctypeck.c 2005-05-11 10:05:33.000000000 +0200 +@@ -0,0 +1,7816 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_ctypeck.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_flags.h" ++# include "c_cdecl.h" ++# include "c_ctypeck.h" ++# include "c_convert.h" ++# include "c_debug.h" ++# include "c_foldconst.h" ++# include "c_stmt.h" ++# include "c_common.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++/* Type of object we are accumulating a constructor for. ++ This type is always a RECORD_TYPE, UNION_TYPE or ARRAY_TYPE. */ ++static c_tree_node *c_constructor_type; ++ ++/* For a RECORD_TYPE or UNION_TYPE, this is the chain of fields ++ left to fill. */ ++static c_tree_node *c_constructor_fields; ++ ++/* For an ARRAY_TYPE, this is the specified index ++ at which to store the next element we get. ++ This is a special INTEGER_CST node that we modify in place. */ ++static c_tree_node *c_constructor_index; ++ ++/* For an ARRAY_TYPE, this is the end index of the range ++ to initialize with the next element, or NULL in the ordinary case ++ where the element is used just once. */ ++static c_tree_node *c_constructor_range_end; ++ ++/* For an ARRAY_TYPE, this is the maximum index. */ ++static c_tree_node *c_constructor_max_index; ++ ++/* For a RECORD_TYPE, this is the first field not yet written out. */ ++static c_tree_node *c_constructor_unfilled_fields; ++ ++/* For an ARRAY_TYPE, this is the index of the first element ++ not yet written out. ++ This is a special INTEGER_CST node that we modify in place. */ ++static c_tree_node *c_constructor_unfilled_index; ++ ++/* In a RECORD_TYPE, the byte index of the next consecutive field. ++ This is so we can generate gaps between fields, when appropriate. ++ This is a special INTEGER_CST node that we modify in place. */ ++static c_tree_node *c_constructor_bit_index; ++ ++/* If we are saving up the elements rather than allocating them, ++ this is the list of elements so far (in reverse order, ++ most recent first). */ ++static c_tree_node *c_constructor_elements; ++ ++/* 1 if so far this constructor's elements are all compile-time constants. */ ++static int c_constructor_constant; ++ ++/* 1 if so far this constructor's elements are all valid address constants. */ ++static int c_constructor_simple; ++ ++/* 1 if this constructor is erroneous so far. */ ++static int c_constructor_erroneous; ++ ++/* 1 if have called defer_addressed_constants. */ ++static int c_constructor_subconstants_deferred; ++ ++/* List of pending elements at this constructor level. ++ These are elements encountered out of order ++ which belong at places we haven't reached yet in actually ++ writing the output. */ ++static c_tree_node *c_constructor_pending_elts; ++ ++/* The SPELLING_DEPTH of this constructor. */ ++static int c_constructor_depth; ++ ++/* 0 if implicitly pushing constructor levels is allowed. */ ++int c_constructor_no_implicit = 0; /* 0 for C; 1 for some other languages. */ ++ ++/* 1 if this constructor level was entered implicitly. */ ++# ifdef LUDO_NO_SKIP ++static int c_constructor_implicit; ++# endif ++ ++static int c_require_constant_value; ++static int c_require_constant_elements; ++ ++/* 1 if it is ok to output this constructor as we read it. ++ 0 means must accumulate a CONSTRUCTOR expression. */ ++static int c_constructor_incremental; ++ ++/* DECL node for which an initializer is being read. ++ 0 means we are reading a constructor expression ++ such as (struct foo) {...}. */ ++static c_tree_node *c_constructor_decl; ++ ++/* start_init saves the ASMSPEC arg here for really_start_incremental_init. */ ++static char *c_constructor_asmspec; ++ ++/* Nonzero if this is an initializer for a top-level decl. */ ++static int c_constructor_top_level; ++ ++/* When we finish reading a constructor expression ++ (constructor_decl is 0), the CONSTRUCTOR goes here. */ ++# ifdef LUDO_NO_SKIP ++static c_tree_node *c_constructor_result; ++# endif ++ ++/* This stack has a level for each implicit or explicit level of ++ structuring in the initializer, including the outermost one. It ++ saves the values of most of the variables above. */ ++ ++struct constructor_stack ++{ ++ struct constructor_stack *next; ++ c_tree_node *type; ++ c_tree_node *fields; ++ c_tree_node *index; ++ c_tree_node *range_end; ++ c_tree_node *max_index; ++ c_tree_node *unfilled_index; ++ c_tree_node *unfilled_fields; ++ c_tree_node *bit_index; ++ c_tree_node *elements; ++ int offset; ++ c_tree_node *pending_elts; ++ int depth; ++ /* If nonzero, this value should replace the entire ++ constructor at this level. */ ++ c_tree_node *replacement_value; ++ char constant; ++ char simple; ++ char implicit; ++ char incremental; ++ char erroneous; ++ char outer; ++}; ++ ++struct constructor_stack *c_constructor_stack; ++ ++/* This stack records separate initializers that are nested. ++ Nested initializers can't happen in ANSI C, but GNU C allows them ++ in cases like { ... (struct foo) { ... } ... }. */ ++ ++struct initializer_stack ++{ ++ struct initializer_stack *next; ++ c_tree_node *decl; ++ char *asmspec; ++ struct constructor_stack *constructor_stack; ++ c_tree_node *elements; ++ struct spelling *spelling; ++ struct spelling *spelling_base; ++ int spelling_size; ++ char top_level; ++ char incremental; ++ char require_constant_value; ++ char require_constant_elements; ++ char deferred; ++}; ++ ++struct initializer_stack *c_initializer_stack; ++ ++ ++/* Nonzero if we've already printed a "missing braces around initializer" ++ message within this initializer. */ ++static int c_missing_braces_mentioned; ++ ++ ++/* Ajoute par Ludo pour obtenir la liste des constantes lors ++ * d'une initialisation de tableau ou de structure */ ++static c_tree_node *c_output_constant_list = (c_tree_node *)0; ++ ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++/* Methods for storing and printing names for error messages. */ ++ ++/* Implement a spelling stack that allows components of a name to be pushed ++ and popped. Each element on the stack is this structure. */ ++ ++struct spelling ++{ ++ int kind; ++ union ++ { ++ int i; ++ char *s; ++ } u; ++}; ++ ++#define SPELLING_STRING 1 ++#define SPELLING_MEMBER 2 ++#define SPELLING_BOUNDS 3 ++ ++static struct spelling *c_spelling; /* Next stack element (unused). */ ++static struct spelling *c_spelling_base; /* Spelling stack base. */ ++static int c_spelling_size; /* Size of the spelling stack. */ ++ ++/* Macros to save and restore the spelling stack around push_... functions. ++ Alternative to SAVE_SPELLING_STACK. */ ++ ++#define SPELLING_DEPTH() (c_spelling - c_spelling_base) ++#define RESTORE_SPELLING_DEPTH(depth) (c_spelling = c_spelling_base + depth) ++ ++/* Save and restore the spelling stack around arbitrary C code. */ ++ ++#define SAVE_SPELLING_DEPTH(code) \ ++{ \ ++ int __depth = SPELLING_DEPTH (); \ ++ code; \ ++ RESTORE_SPELLING_DEPTH (__depth); \ ++} ++ ++/* Push an element on the spelling stack with type KIND and assign VALUE ++ to MEMBER. */ ++ ++#define PUSH_SPELLING(KIND, VALUE, MEMBER) \ ++{ \ ++ int depth = SPELLING_DEPTH (); \ ++ \ ++ if (depth >= c_spelling_size) \ ++ { \ ++ c_spelling_size += 10; \ ++ if (c_spelling_base == 0) \ ++ c_spelling_base \ ++ = (struct spelling *)autallocblock(c_spelling_size * sizeof (struct spelling)); \ ++ else \ ++ c_spelling_base \ ++ = (struct spelling *)mbkrealloc(c_spelling_base, \ ++ c_spelling_size * sizeof (struct spelling)); \ ++ RESTORE_SPELLING_DEPTH (depth); \ ++ } \ ++ \ ++ c_spelling->kind = (KIND); \ ++ c_spelling->MEMBER = (VALUE); \ ++ c_spelling++; \ ++} ++ ++/* Push STRING on the stack. Printed literally. */ ++ ++static void ++c_push_string (string) ++ char *string; ++{ ++ PUSH_SPELLING (SPELLING_STRING, string, u.s); ++} ++ ++/* Push a member name on the stack. Printed as '.' STRING. */ ++ ++static void ++c_push_member_name (decl) ++ c_tree_node *decl; ++ ++{ ++ char *string ++ = CTreeDeclName(decl) ? CTreeIdentPointer(CTreeDeclName(decl)) : ""; ++ PUSH_SPELLING (SPELLING_MEMBER, string, u.s); ++} ++ ++/* Push an array bounds on the stack. Printed as [BOUNDS]. */ ++ ++static void ++c_push_array_bounds (bounds) ++ int bounds; ++{ ++ PUSH_SPELLING (SPELLING_BOUNDS, bounds, u.i); ++} ++ ++/* Compute the maximum size in bytes of the printed spelling. */ ++ ++static int ++c_spelling_length () ++{ ++ register int size = 0; ++ register struct spelling *p; ++ ++ for (p = c_spelling_base; p < c_spelling; p++) ++ { ++ if (p->kind == SPELLING_BOUNDS) ++ size += 25; ++ else ++ size += strlen (p->u.s) + 1; ++ } ++ ++ return size; ++} ++ ++/* Print the spelling to BUFFER and return it. */ ++ ++static char * ++c_print_spelling (buffer) ++ register char *buffer; ++{ ++ register char *d = buffer; ++ register char *s; ++ register struct spelling *p; ++ ++ for (p = c_spelling_base; p < c_spelling; p++) ++ if (p->kind == SPELLING_BOUNDS) ++ { ++ sprintf (d, "[%d]", p->u.i); ++ d += strlen (d); ++ } ++ else ++ { ++ if (p->kind == SPELLING_MEMBER) ++ *d++ = '.'; ++ for (s = p->u.s; (*d = *s++) != 0; d++) ++ ; ++ } ++ *d++ = '\0'; ++ return buffer; ++} ++ ++/* Provide a means to pass component names derived from the spelling stack. */ ++ ++char c_initialization_message; ++ ++/* Interpret the spelling of the given ERRTYPE message. */ ++ ++static char * ++c_get_spelling (errtype) ++ char *errtype; ++{ ++ static char *buffer; ++ static int size = -1; ++ ++ if (errtype == &c_initialization_message) ++ { ++ /* Avoid counting chars */ ++ static char message[] = "initialization of `%s'"; ++ register int needed = sizeof (message) + c_spelling_length () + 1; ++ char *temp; ++ ++ if (size < 0) ++ buffer = (char *) autallocblock(size = needed); ++ if (needed > size) ++ buffer = (char *) mbkrealloc(buffer, size = needed); ++ ++ temp = (char *) alloca (needed); ++ sprintf (buffer, message, c_print_spelling (temp)); ++ return buffer; ++ } ++ ++ return errtype; ++} ++ ++/* Issue an error message for a bad initializer component. ++ FORMAT describes the message. OFWHAT is the name for the component. ++ LOCAL is a format string for formatting the insertion of the name ++ into the message. ++ ++ If OFWHAT is null, the component name is stored on the spelling stack. ++ If the component name is a null string, then LOCAL is omitted entirely. */ ++ ++void ++c_error_init (format, local, ofwhat) ++ char *format, *local, *ofwhat; ++{ ++ char *buffer; ++ ++ if (ofwhat == 0) ++ ofwhat = c_print_spelling ((char *) autallocblock(c_spelling_length () + 1)); ++ buffer = (char *) autallocblock(strlen (local) + strlen (ofwhat) + 2); ++ ++ if (*ofwhat) ++ sprintf (buffer, local, ofwhat); ++ else ++ buffer[0] = 0; ++ ++ error (format, buffer); ++} ++ ++/* Issue a pedantic warning for a bad initializer component. ++ FORMAT describes the message. OFWHAT is the name for the component. ++ LOCAL is a format string for formatting the insertion of the name ++ into the message. ++ ++ If OFWHAT is null, the component name is stored on the spelling stack. ++ If the component name is a null string, then LOCAL is omitted entirely. */ ++ ++void ++c_pedwarn_init (format, local, ofwhat) ++ char *format, *local, *ofwhat; ++{ ++ char *buffer; ++ ++ if (ofwhat == 0) ++ ofwhat = c_print_spelling ((char *) autallocblock(c_spelling_length () + 1)); ++ buffer = (char *) autallocblock(strlen (local) + strlen (ofwhat) + 2); ++ ++ if (*ofwhat) ++ sprintf (buffer, local, ofwhat); ++ else ++ buffer[0] = 0; ++ ++ c_pedwarn(format, buffer); ++} ++ ++/* Issue a warning for a bad initializer component. ++ FORMAT describes the message. OFWHAT is the name for the component. ++ LOCAL is a format string for formatting the insertion of the name ++ into the message. ++ ++ If OFWHAT is null, the component name is stored on the spelling stack. ++ If the component name is a null string, then LOCAL is omitted entirely. */ ++ ++static void ++c_warning_init (format, local, ofwhat) ++ char *format, *local, *ofwhat; ++{ ++ char *buffer; ++ ++ if (ofwhat == 0) ++ ofwhat = c_print_spelling ((char *) autallocblock(c_spelling_length () + 1)); ++ buffer = (char *) autallocblock(strlen (local) + strlen (ofwhat) + 2); ++ ++ if (*ofwhat) ++ sprintf (buffer, local, ofwhat); ++ else ++ buffer[0] = 0; ++ ++ c_warning (format, buffer); ++} ++ ++ ++/* If pedantic, warn about improper lvalue. CODE is either COND_EXPR ++ COMPOUND_EXPR, or CONVERT_EXPR (for casts). */ ++ ++static void ++c_pedantic_lvalue_warning(code) ++ int code; ++{ ++ if (c_pedantic) ++ { ++ c_pedwarn ("ANSI C forbids use of %s expressions as lvalues", ++ code == C_COND_EXPR ? "conditional" ++ : code == C_COMPOUND_EXPR ? "compound" : "cast"); ++ } ++} ++ ++ ++/* Warn about storing in something that is `const'. */ ++ ++void c_readonly_warning(arg, string) ++ c_tree_node *arg; ++ char *string; ++{ ++ char buf[80]; ++ strcpy (buf, string); ++ ++ /* Forbid assignments to iterators. */ ++ if ( CTreeNodeFirstCode(arg) == C_DECL_NODE && ++ CTreeDeclCode( arg ) == C_VAR_DECL && ++ CIsTreeDeclIterator(arg)) ++ { ++ strcat (buf, " of iterator `%s'"); ++ pedwarn (buf, CTreeIdentPointer(CTreeDeclName(arg))); ++ } ++ ++ if (CTreeNodeFirstCode(arg ) == C_EXPR_NODE && CTreeExprCode(arg) == C_COMPONENT_REF) ++ { ++ if ( CIsTreeNodeReadOnly(CTreeType(CTreeExprOperand(arg, 0)))) ++ { ++ c_readonly_warning (CTreeExprOperand(arg, 0), string); ++ } ++ else ++ { ++ strcat (buf, " of read-only member `%s'"); ++ pedwarn (buf, CTreeIdentPointer(CTreeDeclName(CTreeExprOperand(arg, 1)))); ++ } ++ } ++ else if ( CTreeNodeFirstCode(arg) == C_DECL_NODE && CTreeDeclCode(arg) == C_VAR_DECL) ++ { ++ strcat (buf, " of read-only variable `%s'"); ++ pedwarn (buf, CTreeIdentPointer(CTreeDeclName(arg))); ++ } ++ else ++ { ++ pedwarn ("%s of read-only location", buf); ++ } ++} ++ ++ ++/* Print a warning using MSG. ++ It gets OPNAME as its one parameter. ++ If OPNAME is null, it is replaced by "passing arg ARGNUM of `FUNCTION'". ++ FUNCTION and ARGNUM are handled specially if we are building an ++ Objective-C selector. */ ++ ++static void ++c_warn_for_assignment(msg, opname, function, argnum) ++ char *msg; ++ char *opname; ++ c_tree_node *function; ++ int argnum; ++{ ++ static char argstring[] = "passing arg %d of `%s'"; ++ static char argnofun[] = "passing arg %d"; ++ ++ if (opname == 0) ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *selector = maybe_building_objc_message_expr (); ++# else ++ c_tree_node *selector = 0; ++# endif ++ ++ if (selector && argnum > 2) ++ { ++ function = selector; ++ argnum -= 2; ++ } ++ if (function) ++ { ++ /* Function name is known; supply it. */ ++ opname = (char *) autallocblock(CTreeIdentLength(function) ++ + sizeof (argstring) + 25 /*%d*/ + 1); ++ sprintf (opname, argstring, argnum, CTreeIdentPointer(function)); ++ } ++ else ++ { ++ /* Function name unknown (call through ptr); just give arg number. */ ++ opname = (char *) autallocblock(sizeof (argnofun) + 25 /*%d*/ + 1); ++ sprintf (opname, argnofun, argnum); ++ } ++ } ++ c_pedwarn (msg, opname); ++} ++ ++ ++/* Apply unary lvalue-demanding operator CODE to the expression ARG ++ for certain kinds of expressions which are not really lvalues ++ but which we can accept as lvalues. ++ ++ If ARG is not a kind of expression we can handle, return zero. */ ++ ++static c_tree_node *c_unary_complex_lvalue(code, arg) ++ int code; ++ c_tree_node *arg; ++{ ++ /* Handle (a, b) used as an "lvalue". */ ++ if ( CTreeNodeFirstCode(arg) == C_EXPR_NODE && ++ CTreeExprCode(arg) == C_COMPOUND_EXPR) ++ { ++ c_tree_node *real_result = c_parser_build_unary_op(code, CTreeExprOperand(arg, 1), 0); ++ ++ /* If this returns a function type, it isn't really being used as ++ an lvalue, so don't issue a warning about it. */ ++ if ( CTreeTypeCode(CTreeType(arg)) != C_FUNCTION_TYPE) ++ { ++ c_pedantic_lvalue_warning (C_COMPOUND_EXPR); ++ } ++ ++ return c_tree_build_binary_typed_expr( C_COMPOUND_EXPR, CTreeType(real_result), ++ CTreeExprOperand(arg, 0), real_result); ++ } ++ ++ /* Handle (a ? b : c) used as an "lvalue". */ ++ if ( CTreeNodeFirstCode(arg) == C_EXPR_NODE && ++ CTreeExprCode(arg) == C_COND_EXPR) ++ { ++ c_pedantic_lvalue_warning(C_COND_EXPR); ++ if ( CTreeTypeCode(CTreeType(arg)) != C_FUNCTION_TYPE) ++ { ++ c_pedantic_lvalue_warning (C_COMPOUND_EXPR); ++ } ++ ++ return (c_parser_build_conditional_expr ++ (CTreeExprOperand(arg, 0), ++ c_parser_build_unary_op(code, CTreeExprOperand(arg, 1), 0), ++ c_parser_build_unary_op(code, CTreeExprOperand(arg, 2), 0))); ++ } ++ ++ return 0; ++} ++ ++ ++/* Subroutine of stabilize_reference; this is called for subtrees of ++ references. Any expression with side-effects must be put in a SAVE_EXPR ++ to ensure that it is only evaluated once. ++ ++ We don't put SAVE_EXPR nodes around everything, because assigning very ++ simple expressions to temporaries causes us to miss good opportunities ++ for optimizations. Among other things, the opportunity to fold in the ++ addition of a constant into an addressing mode often gets lost, e.g. ++ "y[i+1] += x;". In general, we take the approach that we should not make ++ an assignment unless we are forced into it - i.e., that any non-side effect ++ operator should be allowed, and that cse should take care of coalescing ++ multiple utterances of the same expression should that prove fruitful. */ ++ ++c_tree_node *c_stabilize_reference_1(e) ++ c_tree_node *e; ++{ ++ return( e ); ++} ++ ++/* Return either DECL or its known constant value (if it has one). */ ++ ++c_tree_node *c_decl_constant_value(decl) ++ c_tree_node *decl; ++{ ++ if (/* Don't change a variable array bound or initial value to a constant ++ in a place where a variable is invalid. */ ++ c_current_function_decl != 0 ++ && ! c_pedantic ++ && ! CIsTreeNodeVolatile(decl) ++ && CIsTreeNodeReadOnly(decl) && ! CIsTreeDeclIterator(decl) ++ && CTreeDeclInitial(decl) != 0 ++ && CTreeNodeFirstCode(CTreeDeclInitial(decl)) != C_ERROR_NODE ++ /* This is invalid if initial value is not constant. ++ If it has either a function call, a memory reference, ++ or a variable, then re-evaluating it could give different results. */ ++ && CIsTreeNodeConstant(CTreeDeclInitial(decl)) ++ /* Check for cases where this is sub-optimal, even though valid. */ ++ && ( CTreeNodeFirstCode(CTreeDeclInitial(decl)) != C_EXPR_NODE || ++ CTreeExprCode(CTreeDeclInitial(decl)) != C_CONSTRUCTOR_EXPR) ++# ifdef LUDO_DONE ++ && CTreeDeclMode(decl) != BLKmode ++# endif ++ ) ++ return CTreeDeclInitial(decl); ++ return decl; ++} ++ ++ ++/* Stabilize a reference so that we can use it any number of times ++ without causing its operands to be evaluated more than once. ++ Returns the stabilized reference. This works by means of save_expr, ++ so see the caveats in the comments about save_expr. ++ ++ Also allows conversion expressions whose operands are references. ++ Any other kind of expression is returned unchanged. */ ++ ++c_tree_node *c_stabilize_reference(ref) ++ c_tree_node *ref; ++{ ++ c_tree_node *result; ++ int code = CTreeNodeFirstCode(ref); ++ ++ if ( code == C_DECL_NODE ) ++ { ++ code = CTreeDeclCode( ref ); ++ ++ switch (code) ++ { ++ case C_VAR_DECL: ++ case C_PARAM_DECL: ++ case C_RESULT_DECL: ++ /* No action is needed in this case. */ ++ return ref; ++ } ++ ++ return ref; ++ } ++ else ++ if ( code == C_EXPR_NODE ) ++ { ++ code = CTreeExprCode( ref ); ++ ++ switch (code) ++ { ++ case C_NOP_EXPR: ++ case C_CONVERT_EXPR: ++ case C_FLOAT_EXPR: ++ case C_FIX_TRUNC_EXPR: ++ case C_FIX_FLOOR_EXPR: ++ case C_FIX_ROUND_EXPR: ++ case C_FIX_CEIL_EXPR: ++ result = c_tree_build_unary_expr(code, c_stabilize_reference(CTreeExprOperand(ref, 0))); ++ break; ++ ++ case C_INDIRECT_REF: ++ result = c_tree_build_unary_expr(C_INDIRECT_REF, ++ c_stabilize_reference_1 (CTreeExprOperand(ref, 0))); ++ break; ++ ++ case C_COMPONENT_REF: ++ result = c_tree_build_binary_expr(C_COMPONENT_REF, ++ c_stabilize_reference (CTreeExprOperand(ref, 0)), ++ CTreeExprOperand(ref, 1)); ++ break; ++ ++ case C_BIT_FIELD_REF: ++ result = c_tree_build_ternary_expr(C_BIT_FIELD_REF, ++ c_stabilize_reference (CTreeExprOperand(ref, 0)), ++ c_stabilize_reference_1 (CTreeExprOperand(ref, 1)), ++ c_stabilize_reference_1 (CTreeExprOperand(ref, 2))); ++ break; ++ ++ case C_ARRAY_REF: ++ result = c_tree_build_binary_expr(C_ARRAY_REF, ++ c_stabilize_reference (CTreeExprOperand(ref, 0)), ++ c_stabilize_reference_1 (CTreeExprOperand(ref, 1))); ++ break; ++ ++ case C_COMPOUND_EXPR: ++ /* We cannot wrap the first expression in a SAVE_EXPR, as then ++ it wouldn't be ignored. This matters when dealing with ++ volatiles. */ ++ return c_stabilize_reference_1 (ref); ++ ++ case C_RTL_EXPR: ++ result = c_tree_build_unary_typed_expr( C_INDIRECT_REF, CTreeType(ref), ++ c_tree_build_unary_typed_expr( ++ C_ADDR_EXPR, c_tree_build_pointer_type(CTreeType(ref)), ref)); ++ break; ++ ++ ++ /* If arg isn't a kind of lvalue we recognize, make no change. ++ Caller should recognize the error for an invalid lvalue. */ ++ default: ++ return ref; ++ ++ } ++ } ++ else ++ if ( code == C_ERROR_NODE ) ++ { ++ return c_error_mark_node; ++ } ++ else ++ { ++ return ref; ++ } ++ ++ CTreeType(result) = CTreeType(ref); ++ if ( CIsTreeNodeReadOnly( ref ) ) CSetTreeNodeReadOnly( result ); ++ if ( CIsTreeNodeSideEffect( ref ) ) CSetTreeNodeSideEffect( result ); ++ if ( CIsTreeNodeVolatile( ref ) ) CSetTreeNodeVolatile( result ); ++ if ( CIsTreeNodeRaises( ref ) ) CSetTreeNodeRaises( result ); ++ ++ return result; ++} ++ ++/* Return OP, stripped of any conversions to wider types as much as is safe. ++ Converting the value back to OP's type makes a value equivalent to OP. ++ ++ If FOR_TYPE is nonzero, we return a value which, if converted to ++ type FOR_TYPE, would be equivalent to converting OP to type FOR_TYPE. ++ ++ If FOR_TYPE is nonzero, unaligned bit-field references may be changed to the ++ narrowest type that can hold the value, even if they don't exactly fit. ++ Otherwise, bit-field references are changed to a narrower type ++ only if they can be fetched directly from memory in that type. ++ ++ OP must have integer, real or enumeral type. Pointers are not allowed! ++ ++ There are some cases where the obvious value we could return ++ would regenerate to OP if converted to OP's type, ++ but would not extend like OP to wider types. ++ If FOR_TYPE indicates such extension is contemplated, we eschew such values. ++ For example, if OP is (unsigned short)(signed char)-1, ++ we avoid returning (signed char)-1 if FOR_TYPE is int, ++ even though extending that to an unsigned short would regenerate OP, ++ since the result of extending (signed char)-1 to (int) ++ is different from (int) OP. */ ++ ++c_tree_node *c_get_unwidened(op, for_type) ++ c_tree_node *op; ++ c_tree_node *for_type; ++{ ++ /* Set UNS initially if converting OP to FOR_TYPE is a zero-extension. */ ++ /* CTreeTypePrecisionis safe in place of type_precision since ++ pointer types are not allowed. */ ++ c_tree_node *type = CTreeType(op); ++ unsigned final_prec = CTreeTypePrecision(for_type != 0 ? for_type : type); ++ int uns = (for_type != 0 && for_type != type ++ && final_prec > CTreeTypePrecision(type) ++ && CIsTreeNodeUnsigned(type)); ++ c_tree_node *win = op; ++ ++ while ( CTreeExprCode(op) == C_NOP_EXPR) ++ { ++ int bitschange ++ = CTreeTypePrecision(CTreeType(op)) ++ - CTreeTypePrecision(CTreeType(CTreeExprOperand(op, 0))); ++ ++ /* Truncations are many-one so cannot be removed. ++ Unless we are later going to truncate down even farther. */ ++ if (bitschange < 0 ++ && final_prec > CTreeTypePrecision(CTreeType(op))) ++ break; ++ ++ /* See what's inside this conversion. If we decide to strip it, ++ we will set WIN. */ ++ op = CTreeExprOperand(op, 0); ++ ++ /* If we have not stripped any zero-extensions (uns is 0), ++ we can strip any kind of extension. ++ If we have previously stripped a zero-extension, ++ only zero-extensions can safely be stripped. ++ Any extension can be stripped if the bits it would produce ++ are all going to be discarded later by truncating to FOR_TYPE. */ ++ ++ if (bitschange > 0) ++ { ++ if (! uns || final_prec <= CTreeTypePrecision(CTreeType(op))) ++ win = op; ++ /* CIsTreeNodeUnsignedsays whether this is a zero-extension. ++ Let's avoid computing it if it does not affect WIN ++ and if UNS will not be needed again. */ ++ if ((uns || CTreeExprCode(op) == C_NOP_EXPR) ++ && CIsTreeNodeUnsigned(CTreeType(op))) ++ { ++ uns = 1; ++ win = op; ++ } ++ } ++ } ++ ++ if ( CTreeExprCode(op) == C_COMPONENT_REF ++ /* Since type_for_size always gives an integer type. */ ++ && CTreeTypeCode(type) != C_REAL_TYPE ++ /* Don't crash if field not laid out yet. */ ++ && CTreeDeclSize(CTreeExprOperand(op, 1)) != 0) ++ { ++ unsigned innerprec = CTreeIntCstLow( CTreeDeclSize(CTreeExprOperand(op, 1))); ++ type = c_get_type_for_size(innerprec, CIsTreeNodeUnsigned(CTreeExprOperand(op, 1))); ++ ++ /* We can get this structure field in the narrowest type it fits in. ++ If FOR_TYPE is 0, do this only for a field that matches the ++ narrower type exactly and is aligned for it ++ The resulting extension to its nominal type (a fullword type) ++ must fit the same conditions as for other extensions. */ ++ ++ if (innerprec < CTreeTypePrecision(CTreeType(op)) ++ && (for_type || ! CIsTreeDeclBitField(CTreeExprOperand(op, 1))) ++ && (! uns || final_prec <= innerprec ++ || CIsTreeNodeUnsigned(CTreeExprOperand(op, 1))) ++ && type != 0) ++ { ++ win = c_tree_build_binary_expr(C_COMPONENT_REF, ++ CTreeExprOperand(op, 0), CTreeExprOperand(op, 1)); ++ CTreeType( win ) = type; ++ if ( CIsTreeNodeSideEffect(op) ) CSetTreeNodeSideEffect(win); ++ if ( CIsTreeNodeVolatile(op) ) CSetTreeNodeVolatile(win); ++ if ( CIsTreeNodeRaises(op) ) CSetTreeNodeRaises( win ); ++ } ++ } ++ return win; ++} ++ ++ ++/* Return OP or a simpler expression for a narrower value ++ which can be sign-extended or zero-extended to give back OP. ++ Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended ++ or 0 if the value should be sign-extended. */ ++ ++c_tree_node *c_get_narrower(op, unsignedp_ptr) ++ c_tree_node *op; ++ int *unsignedp_ptr; ++{ ++ int uns = 0; ++ int first = 1; ++ c_tree_node *win = op; ++ ++ while ( CTreeExprCode(op) == C_NOP_EXPR) ++ { ++ int bitschange ++ = CTreeTypePrecision(CTreeType(op)) ++ - CTreeTypePrecision(CTreeType(CTreeExprOperand(op, 0))); ++ ++ /* Truncations are many-one so cannot be removed. */ ++ if (bitschange < 0) ++ break; ++ ++ /* See what's inside this conversion. If we decide to strip it, ++ we will set WIN. */ ++ op = CTreeExprOperand(op, 0); ++ ++ if (bitschange > 0) ++ { ++ /* An extension: the outermost one can be stripped, ++ but remember whether it is zero or sign extension. */ ++ if (first) ++ uns = !! CIsTreeNodeUnsigned(CTreeType(op)); ++ /* Otherwise, if a sign extension has been stripped, ++ only sign extensions can now be stripped; ++ if a zero extension has been stripped, only zero-extensions. */ ++ else if (uns != !! CIsTreeNodeUnsigned(CTreeType(op))) ++ break; ++ first = 0; ++ } ++ else /* bitschange == 0 */ ++ { ++ /* A change in nominal type can always be stripped, but we must ++ preserve the unsignedness. */ ++ if (first) ++ uns = !! CIsTreeNodeUnsigned(CTreeType(op)); ++ first = 0; ++ } ++ ++ win = op; ++ } ++ ++ if ( CTreeExprCode(op) == C_COMPONENT_REF ++ /* Since type_for_size always gives an integer type. */ ++ && CTreeTypeCode(CTreeType(op)) != C_REAL_TYPE) ++ { ++ unsigned innerprec = CTreeIntCstLow( CTreeDeclSize(CTreeExprOperand(op, 1))); ++ c_tree_node *type = c_get_type_for_size(innerprec, CIsTreeNodeUnsigned(op)); ++ ++ /* We can get this structure field in a narrower type that fits it, ++ but the resulting extension to its nominal type (a fullword type) ++ must satisfy the same conditions as for other extensions. ++ ++ Do this only for fields that are aligned (not bit-fields), ++ because when bit-field insns will be used there is no ++ advantage in doing this. */ ++ ++ if (innerprec < CTreeTypePrecision(CTreeType(op)) ++ && ! CIsTreeDeclBitField(CTreeExprOperand(op, 1)) ++ && (first || uns == CIsTreeNodeUnsigned(CTreeExprOperand(op, 1))) ++ && type != 0) ++ { ++ if (first) ++ uns = CIsTreeNodeUnsigned(CTreeExprOperand(op, 1)); ++ win = c_tree_build_binary_expr( ++ C_COMPONENT_REF, CTreeExprOperand(op, 0), CTreeExprOperand(op, 1)); ++ CTreeType( win ) = type; ++ ++ if ( CIsTreeNodeSideEffect(op) ) CSetTreeNodeSideEffect(win); ++ if ( CIsTreeNodeVolatile(op) ) CSetTreeNodeVolatile(win); ++ if ( CIsTreeNodeRaises(op) ) CSetTreeNodeRaises( win ); ++ } ++ } ++ *unsignedp_ptr = uns; ++ return win; ++} ++ ++ ++/* Make the integer constant T valid for its type ++ by setting to 0 or 1 all the bits in the constant ++ that don't belong in the type. ++ Yield 1 if a signed overflow occurs, 0 otherwise. ++ If OVERFLOW is nonzero, a signed overflow has already occurred ++ in calculating T, so propagate it. ++ ++ Make the real constant T valid for its type by calling CHECK_FLOAT_VALUE, ++ if it exists. */ ++ ++int c_force_fit_type(t, overflow) ++ c_tree_node *t; ++ int overflow; ++{ ++ int low, high; ++ int prec; ++ ++ if ( CTreeNodeFirstCode(t) == C_REAL_CST_NODE) ++ { ++#ifdef CHECK_FLOAT_VALUE ++ CHECK_FLOAT_VALUE (CTreeTypeMode(CTreeType(t)), TREE_REAL_CST (t), ++ overflow); ++#endif ++ return overflow; ++ } ++ ++ else if ( CTreeNodeFirstCode(t) != C_INT_CST_NODE) ++ return overflow; ++ ++ low = CTreeIntCstLow(t); ++ high = CTreeIntCstHigh(t); ++ ++ if (POINTER_TYPE_P (CTreeType(t))) ++ prec = C_POINTER_SIZE; ++ else ++ prec = CTreeTypePrecision(CTreeType(t)); ++ ++ /* First clear all bits that are beyond the type's precision. */ ++ ++ if (prec == 2 * C_HOST_BITS_PER_WIDE_INT) ++ ; ++ else if (prec > C_HOST_BITS_PER_WIDE_INT) ++ { ++ CTreeIntCstHigh(t) ++ &= ~((C_HOST_WIDE_INT) (-1) << (prec - C_HOST_BITS_PER_WIDE_INT)); ++ } ++ else ++ { ++ CTreeIntCstHigh(t) = 0; ++ if (prec < C_HOST_BITS_PER_WIDE_INT) ++ CTreeIntCstLow(t) &= ~((C_HOST_WIDE_INT) (-1) << prec); ++ } ++ ++ /* Unsigned types do not suffer sign extension or overflow. */ ++ if ( CIsTreeNodeUnsigned(CTreeType(t))) ++ return overflow; ++ ++ /* If the value's sign bit is set, extend the sign. */ ++ if (prec != 2 * C_HOST_BITS_PER_WIDE_INT ++ && (prec > C_HOST_BITS_PER_WIDE_INT ++ ? (CTreeIntCstHigh(t) ++ & ((C_HOST_WIDE_INT) 1 << (prec - C_HOST_BITS_PER_WIDE_INT - 1))) ++ : CTreeIntCstLow(t) & ((C_HOST_WIDE_INT) 1 << (prec - 1)))) ++ { ++ /* Value is negative: ++ set to 1 all the bits that are outside this type's precision. */ ++ if (prec > C_HOST_BITS_PER_WIDE_INT) ++ { ++ CTreeIntCstHigh(t) ++ |= ((C_HOST_WIDE_INT) (-1) << (prec - C_HOST_BITS_PER_WIDE_INT)); ++ } ++ else ++ { ++ CTreeIntCstHigh(t) = -1; ++ if (prec < C_HOST_BITS_PER_WIDE_INT) ++ CTreeIntCstLow(t) |= ((C_HOST_WIDE_INT) (-1) << prec); ++ } ++ } ++ ++ /* Yield nonzero if signed overflow occurred. */ ++ return ++ ((overflow | (low ^ CTreeIntCstLow(t)) | (high ^ CTreeIntCstHigh(t))) ++ != 0); ++} ++ ++/* Return 1 if TTL and TTR are pointers to types that are equivalent, ++ ignoring their qualifiers. */ ++ ++static int c_is_comp_target_types(ttl, ttr) ++ c_tree_node *ttl; ++ c_tree_node *ttr; ++{ ++ int val; ++ ++ /* Give maybe_objc_comptypes a crack at letting these types through. */ ++# ifdef LUDO_DONE ++ if (val = maybe_objc_comptypes (ttl, ttr, 1) >= 0) ++ return val; ++# endif ++ ++ val = c_is_comptypes(CTreeTypeMainVariant(CTreeType(ttl)), ++ CTreeTypeMainVariant(CTreeType(ttr))); ++ ++ if (val == 2 && c_pedantic) ++ { ++ pedwarn ("types are not quite compatible"); ++ } ++ return val; ++} ++ ++/* Nonzero if the type T promotes to itself. ++ ANSI C states explicitly the list of types that promote; ++ in particular, short promotes to int even if they have the same width. */ ++#define C_PROMOTING_INTEGER_TYPE_P(t) \ ++ ( CTreeTypeCode((t)) == C_INTEGER_TYPE \ ++ && (CTreeTypeMainVariant(t) == c_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_signed_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_unsigned_char_type_node \ ++ || CTreeTypeMainVariant(t) == c_short_integer_type_node \ ++ || CTreeTypeMainVariant(t) == c_short_unsigned_type_node)) ++ ++ ++/* Return 1 if TYPE is not affected by default promotions. */ ++ ++static int c_is_self_promoting_type_p(type) ++ c_tree_node *type; ++{ ++ if (CTreeTypeMainVariant(type) == c_float_type_node) ++ return 0; ++ ++ if (C_PROMOTING_INTEGER_TYPE_P(type)) ++ return 0; ++ ++ return 1; ++} ++ ++ ++/* Check two lists of types for compatibility, ++ returning 0 for incompatible, 1 for compatible, ++ or 2 for compatible with warning. */ ++ ++static int c_is_type_lists_compatible_p(args1, args2) ++ c_tree_node *args1; ++ c_tree_node *args2; ++{ ++ /* 1 if no need for warning yet, 2 if warning cause has been seen. */ ++ int val = 1; ++ int newval = 0; ++ ++ while (1) ++ { ++ if (args1 == 0 && args2 == 0) ++ return val; ++ /* If one list is shorter than the other, ++ they fail to match. */ ++ if (args1 == 0 || args2 == 0) ++ return 0; ++ /* A null pointer instead of a type ++ means there is supposed to be an argument ++ but nothing is specified about what type it has. ++ So match anything that self-promotes. */ ++ if ( CTreeListValue(args1) == 0) ++ { ++ if (! c_is_self_promoting_type_p( CTreeListValue(args2))) ++ return 0; ++ } ++ else if (CTreeListValue(args2) == 0) ++ { ++ if (! c_is_self_promoting_type_p(CTreeListValue(args1))) ++ return 0; ++ } ++ else if (! (newval = c_is_comptypes(CTreeListValue(args1), CTreeListValue(args2)))) ++ { ++ /* Allow wait (union {union wait *u; int *i} *) ++ and wait (union wait *) to be compatible. */ ++ if ( CTreeTypeCode(CTreeListValue(args1)) == C_UNION_TYPE ++ && ( CTreeTypeName(CTreeListValue(args1)) == 0 ++ || CIsTreeTypeTransUnion(CTreeListValue(args1))) ++ && CTreeNodeFirstCode(CTreeTypeSize(CTreeListValue(args1))) == C_INT_CST_NODE ++ && c_tree_is_int_cst_equal(CTreeTypeSize(CTreeListValue(args1)), ++ CTreeTypeSize(CTreeListValue(args2)))) ++ { ++ c_tree_node *memb; ++ for (memb = CTreeTypeValues(CTreeListValue(args1)); ++ memb; memb = CTreeChain(memb)) ++ if ( c_is_comptypes(CTreeType(memb), CTreeListValue(args2))) ++ break; ++ if (memb == 0) ++ return 0; ++ } ++ else if ( CTreeTypeCode(CTreeListValue(args2)) == C_UNION_TYPE ++ && ( CTreeTypeName(CTreeListValue(args2)) == 0 ++ || CIsTreeTypeTransUnion(CTreeListValue(args2))) ++ && CTreeNodeFirstCode(CTreeTypeSize(CTreeListValue(args2))) == C_INT_CST_NODE ++ && c_tree_is_int_cst_equal(CTreeTypeSize(CTreeListValue(args2)), ++ CTreeTypeSize(CTreeListValue(args1)))) ++ { ++ c_tree_node *memb; ++ for (memb = CTreeTypeValues(CTreeListValue(args2)); ++ memb; memb = CTreeChain(memb)) ++ if ( c_is_comptypes(CTreeType(memb), CTreeListValue(args1))) ++ break; ++ if (memb == 0) ++ return 0; ++ } ++ else ++ return 0; ++ } ++ ++ /* comptypes said ok, but record if it said to warn. */ ++ if (newval > val) ++ val = newval; ++ ++ args1 = CTreeChain(args1); ++ args2 = CTreeChain(args2); ++ } ++} ++ ++/* Return 1 if two function types F1 and F2 are compatible. ++ If either type specifies no argument types, ++ the other must specify a fixed number of self-promoting arg types. ++ Otherwise, if one type specifies only the number of arguments, ++ the other must specify that number of self-promoting arg types. ++ Otherwise, the argument types must match. */ ++ ++static int c_is_function_types_compatible_p(f1, f2) ++ c_tree_node *f1; ++ c_tree_node *f2; ++{ ++ c_tree_node *args1; ++ c_tree_node *args2; ++ /* 1 if no need for warning yet, 2 if warning cause has been seen. */ ++ int val = 1; ++ int val1; ++ ++ if (!(CTreeType(f1) == CTreeType(f2) ++ || (val = c_is_comptypes(CTreeType(f1), CTreeType(f2))))) ++ return 0; ++ ++ args1 = CTreeTypeValues(f1); ++ args2 = CTreeTypeValues(f2); ++ ++ /* An unspecified parmlist matches any specified parmlist ++ whose argument types don't need default promotions. */ ++ ++ if (args1 == 0) ++ { ++ if (! c_is_self_promoting_args_p(args2)) ++ return 0; ++ /* If one of these types comes from a non-prototype fn definition, ++ compare that with the other type's arglist. ++ If they don't match, ask for a warning (but no error). */ ++ if ( CTreeTypeNonCopiedParts(f1) ++ && 1 != c_is_type_lists_compatible_p(args2, CTreeTypeNonCopiedParts(f1))) ++ val = 2; ++ return val; ++ } ++ if (args2 == 0) ++ { ++ if (! c_is_self_promoting_args_p(args1)) ++ return 0; ++ if ( CTreeTypeNonCopiedParts(f2) ++ && 1 != c_is_type_lists_compatible_p(args1, CTreeTypeNonCopiedParts(f2))) ++ val = 2; ++ return val; ++ } ++ ++ /* Both types have argument lists: compare them and propagate results. */ ++ val1 = c_is_type_lists_compatible_p(args1, args2); ++ return val1 != 1 ? val1 : val; ++} ++ ++ ++/* Return 1 if TYPE1 and TYPE2 are compatible types for assignment ++ or various other operations. Return 2 if they are compatible ++ but a warning may be needed if you use them together. */ ++ ++int c_is_comptypes(type1, type2) ++ ++ c_tree_node *type1; ++ c_tree_node *type2; ++{ ++ c_tree_node *t1 = type1; ++ c_tree_node *t2 = type2; ++ int attrval, val; ++ ++ /* Suppress errors caused by previously reported errors. */ ++ ++ if (t1 == t2 || ++ CTreeNodeFirstCode(t1) == C_ERROR_NODE || ++ CTreeNodeFirstCode(t2) == C_ERROR_NODE ) ++ { ++ return 1; ++ } ++ ++ /* Treat an enum type as the integer type of the same width and ++ signedness. */ ++ ++ if ( CTreeTypeCode(t1) == C_ENUMERAL_TYPE) ++ t1 = c_get_type_for_size( CTreeTypePrecision(t1), CIsTreeNodeUnsigned(t1)); ++ ++ if ( CTreeTypeCode(t2) == C_ENUMERAL_TYPE) ++ t2 = c_get_type_for_size(CTreeTypePrecision(t2), CIsTreeNodeUnsigned(t2)); ++ ++ if (t1 == t2) ++ return 1; ++ ++ /* Different classes of types can't be compatible. */ ++ ++ if ( CTreeTypeCode(t1) != CTreeTypeCode(t2)) return 0; ++ ++ /* Qualifiers must match. */ ++ ++ if ( CIsTreeNodeReadOnly(t1) != CIsTreeNodeReadOnly(t2)) ++ return 0; ++ if ( CIsTreeNodeVolatile(t1) != CIsTreeNodeVolatile(t2)) ++ return 0; ++ ++ /* Allow for two different type nodes which have essentially the same ++ definition. Note that we already checked for equality of the type ++ type qualifiers (just above). */ ++ ++ if (CTreeTypeMainVariant(t1) == CTreeTypeMainVariant(t2)) ++ return 1; ++ ++#ifndef COMP_TYPE_ATTRIBUTES ++#define COMP_TYPE_ATTRIBUTES(t1,t2) 1 ++#endif ++ ++ /* 1 if no need for warning yet, 2 if warning cause has been seen. */ ++ if (! (attrval = COMP_TYPE_ATTRIBUTES(t1, t2))) ++ return 0; ++ ++ /* 1 if no need for warning yet, 2 if warning cause has been seen. */ ++ val = 0; ++ ++ switch ( CTreeTypeCode(t1)) ++ { ++ case C_POINTER_TYPE: ++ val = (CTreeType(t1) == CTreeType(t2) ++ ? 1 : c_is_comptypes(CTreeType(t1), CTreeType(t2))); ++ break; ++ ++ case C_FUNCTION_TYPE: ++ val = c_is_function_types_compatible_p(t1, t2); ++ break; ++ ++ case C_ARRAY_TYPE: ++ { ++ c_tree_node *d1 = CTreeTypeValues(t1); ++ c_tree_node *d2 = CTreeTypeValues(t2); ++ val = 1; ++ ++ /* Target types must match incl. qualifiers. */ ++ if (CTreeType(t1) != CTreeType(t2) ++ && 0 == (val = c_is_comptypes(CTreeType(t1), CTreeType(t2)))) ++ return 0; ++ ++ /* Sizes must match unless one is missing or variable. */ ++ if (d1 == 0 || d2 == 0 || d1 == d2 ++ || CTreeNodeFirstCode( CTreeTypeMinValue(d1)) != C_INT_CST_NODE ++ || CTreeNodeFirstCode( CTreeTypeMinValue(d2)) != C_INT_CST_NODE ++ || CTreeNodeFirstCode( CTreeTypeMaxValue(d1)) != C_INT_CST_NODE ++ || CTreeNodeFirstCode( CTreeTypeMaxValue(d2)) != C_INT_CST_NODE) ++ break; ++ ++ if (! ((CTreeIntCstLow(CTreeTypeMinValue(d1)) ++ == CTreeIntCstLow(CTreeTypeMinValue(d2))) ++ && (CTreeIntCstHigh(CTreeTypeMinValue(d1)) ++ == CTreeIntCstHigh(CTreeTypeMinValue(d2))) ++ && (CTreeIntCstLow(CTreeTypeMaxValue(d1)) ++ == CTreeIntCstLow(CTreeTypeMaxValue(d2))) ++ && (CTreeIntCstHigh(CTreeTypeMaxValue(d1)) ++ == CTreeIntCstHigh(CTreeTypeMaxValue(d2))))) ++ val = 0; ++ break; ++ } ++ ++ case C_RECORD_TYPE: ++# ifdef LUDO_DONE ++ if (maybe_objc_comptypes (t1, t2, 0) == 1) ++ val = 1; ++# endif ++ break; ++ ++ default: ++ break; ++ } ++ return attrval == 2 && val == 1 ? 2 : val; ++} ++ ++ ++/* Convert value RHS to type TYPE as preparation for an assignment ++ to an lvalue of type TYPE. ++ The real work of conversion is done by `convert'. ++ The purpose of this function is to generate error messages ++ for assignments that are not allowed in C. ++ ERRTYPE is a string to use in error messages: ++ "assignment", "return", etc. If it is null, this is parameter passing ++ for a function call (and different error messages are output). Otherwise, ++ it may be a name stored in the spelling stack and interpreted by ++ get_spelling. ++ ++ FUNNAME is the name of the function being called, ++ as an IDENTIFIER_NODE, or null. ++ PARMNUM is the number of the argument, for printing in error messages. */ ++ ++static c_tree_node *c_convert_for_assignment( ++ type, rhs, errtype, fundecl, funname, parmnum) ++ c_tree_node *type; ++ c_tree_node *rhs; ++ char *errtype; ++ c_tree_node *fundecl; ++ c_tree_node *funname; ++ int parmnum; ++{ ++ int codel = CTreeTypeCode(type); ++ c_tree_node *rhstype; ++ c_tree_node *tmp_node; ++ int coder; ++ ++ /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ ++ /* Do not use STRIP_NOPS here. We do not want an enumerator ++ whose value is 0 to count as a null pointer constant. */ ++ if ( ( CTreeNodeFirstCode(rhs) == C_EXPR_NODE ) && ++ ( CTreeExprCode(rhs) == C_NON_LVALUE_EXPR) ) ++ { ++ rhs = CTreeExprOperand (rhs, 0); ++ } ++ ++ if ( CTreeTypeCode(CTreeType(rhs)) == C_ARRAY_TYPE ++ || CTreeTypeCode(CTreeType(rhs)) == C_FUNCTION_TYPE) ++ { ++ rhs = c_default_conversion(rhs); ++ } ++# ifdef LUDO_DONE ++ else if (optimize && TREE_CODE (rhs) == VAR_DECL) ++ rhs = c_decl_constant_value (rhs); ++# endif ++ ++ rhstype = CTreeType(rhs); ++ ++ if ( CTreeNodeFirstCode( rhstype ) == C_ERROR_NODE) ++ return c_error_mark_node; ++ ++ coder = CTreeTypeCode(rhstype); ++ ++ if (CTreeTypeMainVariant(type) == CTreeTypeMainVariant(rhstype)) ++ { ++# ifdef LUDO_DONE ++ overflow_warning (rhs); ++ /* Check for Objective-C protocols. This will issue a warning if ++ there are protocol violations. No need to use the return value. */ ++ maybe_objc_comptypes (type, rhstype, 0); ++# endif ++ return rhs; ++ } ++ ++ if (coder == C_VOID_TYPE) ++ { ++ error ("void value not ignored as it ought to be"); ++ return c_error_mark_node; ++ } ++ /* Arithmetic types all interconvert, and enum is treated like int. */ ++ if ((codel == C_INTEGER_TYPE || codel == C_REAL_TYPE || codel == C_ENUMERAL_TYPE ++ || codel == C_COMPLEX_TYPE) ++ && (coder == C_INTEGER_TYPE || coder == C_REAL_TYPE || coder == C_ENUMERAL_TYPE ++ || coder == C_COMPLEX_TYPE)) ++ { ++ return c_convert_and_check(type, rhs); ++ } ++ ++ /* Conversion to a transparent union from its member types. ++ This applies only to function arguments. */ ++ else if (codel == C_UNION_TYPE && CIsTreeTypeTransUnion(type) && ! errtype) ++ { ++ c_tree_node *memb_types; ++ c_tree_node *marginal_memb_type = 0; ++ ++ for (memb_types = CTreeTypeValues(type); memb_types; ++ memb_types = CTreeChain(memb_types)) ++ { ++ c_tree_node *memb_type = CTreeType(memb_types); ++ ++ if (c_is_comptypes(CTreeTypeMainVariant(memb_type), ++ CTreeTypeMainVariant(rhstype))) ++ break; ++ ++ if ( CTreeTypeCode(memb_type) != C_POINTER_TYPE) ++ continue; ++ ++ if (coder == C_POINTER_TYPE) ++ { ++ c_tree_node *ttl = CTreeType(memb_type); ++ c_tree_node *ttr = CTreeType(rhstype); ++ ++ /* Any non-function converts to a [const][volatile] void * ++ and vice versa; otherwise, targets must be the same. ++ Meanwhile, the lhs target must have all the qualifiers of ++ the rhs. */ ++ if (CTreeTypeMainVariant(ttl) == c_void_type_node ++ || CTreeTypeMainVariant(ttr) == c_void_type_node ++ || c_is_comp_target_types(memb_type, rhstype)) ++ { ++ /* If this type won't generate any warnings, use it. */ ++ if ((CTreeTypeCode(ttr) == C_FUNCTION_TYPE ++ && CTreeTypeCode(ttl) == C_FUNCTION_TYPE) ++ ? ((! CIsTreeNodeReadOnly(ttl) | CIsTreeNodeReadOnly(ttr)) ++ & (! CIsTreeNodeVolatile(ttl) | CIsTreeNodeVolatile(ttr))) ++ : ((CIsTreeNodeReadOnly(ttl) | ! CIsTreeNodeReadOnly(ttr)) ++ & (CIsTreeNodeVolatile(ttl) | ! CIsTreeNodeVolatile(ttr)))) ++ break; ++ ++ /* Keep looking for a better type, but remember this one. */ ++ if (! marginal_memb_type) ++ marginal_memb_type = memb_type; ++ } ++ } ++ ++ /* Can convert integer zero to any pointer type. */ ++ if (c_tree_is_integer_zerop(rhs) ++ || ( CTreeExprCode(rhs) == C_NOP_EXPR ++ && c_tree_is_integer_zerop(CTreeExprOperand(rhs, 0)))) ++ { ++ rhs = c_null_pointer_node; ++ break; ++ } ++ } ++ ++ if (memb_types || marginal_memb_type) ++ { ++ if (! memb_types) ++ { ++ /* We have only a marginally acceptable member type; ++ it needs a warning. */ ++ c_tree_node *ttl = CTreeType(marginal_memb_type); ++ c_tree_node *ttr = CTreeType(rhstype); ++ ++ /* Const and volatile mean something different for function ++ types, so the usual warnings are not appropriate. */ ++ if ( CTreeTypeCode(ttr) == C_FUNCTION_TYPE ++ && CTreeTypeCode(ttl) == C_FUNCTION_TYPE) ++ { ++ /* Because const and volatile on functions are ++ restrictions that say the function will not do ++ certain things, it is okay to use a const or volatile ++ function where an ordinary one is wanted, but not ++ vice-versa. */ ++ if ( CIsTreeNodeReadOnly(ttl) && ! CIsTreeNodeReadOnly(ttr)) ++ { ++ warn_for_assignment( ++ "%s makes `const *' function pointer from non-const", ++ c_get_spelling(errtype), funname, parmnum); ++ } ++ if ( CIsTreeNodeVolatile(ttl) && ! CIsTreeNodeVolatile(ttr)) ++ { ++ warn_for_assignment( ++ "%s makes `volatile *' function pointer from non-volatile", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ } ++ else ++ { ++ if (! CIsTreeNodeReadOnly(ttl) && CIsTreeNodeReadOnly(ttr)) ++ { ++ warn_for_assignment( ++ "%s discards `const' from pointer target type", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ if (! CIsTreeNodeVolatile(ttl) && CIsTreeNodeVolatile(ttr)) ++ { ++ warn_for_assignment( ++ "%s discards `volatile' from pointer target type", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ } ++ } ++ ++ if (c_pedantic && ! CIsTreeDeclSystemHeader(fundecl)) ++ { ++ pedwarn ("ANSI C prohibits argument conversion to union type"); ++ } ++ ++ tmp_node = c_tree_build_unary_expr( C_NOP_EXPR, rhs ); ++ CTreeType( tmp_node ) = type; ++ return( tmp_node ); ++ } ++ } ++ ++ /* Conversions among pointers */ ++ else if (codel == C_POINTER_TYPE && coder == C_POINTER_TYPE) ++ { ++ c_tree_node *ttl = CTreeType(type); ++ c_tree_node *ttr = CTreeType(rhstype); ++ ++ /* Any non-function converts to a [const][volatile] void * ++ and vice versa; otherwise, targets must be the same. ++ Meanwhile, the lhs target must have all the qualifiers of the rhs. */ ++ if (CTreeTypeMainVariant(ttl) == c_void_type_node ++ || CTreeTypeMainVariant(ttr) == c_void_type_node ++ || c_is_comp_target_types(type, rhstype) ++ || (c_get_unsigned_type(CTreeTypeMainVariant(ttl)) ++ == c_get_unsigned_type(CTreeTypeMainVariant(ttr)))) ++ { ++ if (c_pedantic ++ && ((CTreeTypeMainVariant(ttl) == c_void_type_node ++ && CTreeTypeCode(ttr) == C_FUNCTION_TYPE) ++ || ++ (CTreeTypeMainVariant(ttr) == c_void_type_node ++ /* Check TREE_CODE to catch cases like (void *) (char *) 0 ++ which are not ANSI null ptr constants. */ ++ && (!c_tree_is_integer_zerop(rhs) || CTreeExprCode(rhs) == C_NOP_EXPR) ++ && CTreeTypeCode(ttl) == C_FUNCTION_TYPE))) ++ { ++ warn_for_assignment( "ANSI forbids %s between function pointer and `void *'", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ /* Const and volatile mean something different for function types, ++ so the usual warnings are not appropriate. */ ++ else if ( CTreeTypeCode(ttr) != C_FUNCTION_TYPE ++ && CTreeTypeCode(ttl) != C_FUNCTION_TYPE) ++ { ++ if (! CIsTreeNodeReadOnly(ttl) && CIsTreeNodeReadOnly(ttr)) ++ { ++ warn_for_assignment("%s discards `const' from pointer target type", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ else if (! CIsTreeNodeVolatile(ttl) && CIsTreeNodeVolatile(ttr)) ++ { ++ c_warn_for_assignment ("%s discards `volatile' from pointer target type", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ /* If this is not a case of ignoring a mismatch in signedness, ++ no warning. */ ++ else if (CTreeTypeMainVariant(ttl) == c_void_type_node ++ || CTreeTypeMainVariant(ttr) == c_void_type_node ++ || c_is_comp_target_types(type, rhstype)) ++ ; ++ /* If there is a mismatch, do warn. */ ++ else if (c_pedantic) ++ { ++ warn_for_assignment ("pointer targets in %s differ in signedness", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ } ++ else if ( CTreeTypeCode(ttl) == C_FUNCTION_TYPE ++ && CTreeTypeCode(ttr) == C_FUNCTION_TYPE) ++ { ++ /* Because const and volatile on functions are restrictions ++ that say the function will not do certain things, ++ it is okay to use a const or volatile function ++ where an ordinary one is wanted, but not vice-versa. */ ++ if ( CIsTreeNodeReadOnly(ttl) && ! CIsTreeNodeReadOnly(ttr)) ++ { ++ warn_for_assignment ("%s makes `const *' function pointer from non-const", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ if ( CIsTreeNodeVolatile(ttl) && ! CIsTreeNodeVolatile(ttr)) ++ { ++ warn_for_assignment("%s makes `volatile *' function pointer from non-volatile", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ } ++ } ++ else ++ { ++ warn_for_assignment("%s from incompatible pointer type", ++ c_get_spelling (errtype), funname, parmnum); ++ } ++ ++ return c_convert_expr(type, rhs); ++ } ++ else if (codel == C_POINTER_TYPE && coder == C_INTEGER_TYPE) ++ { ++ /* An explicit constant 0 can convert to a pointer, ++ or one that results from arithmetic, even including ++ a cast to integer type. */ ++ if (! ( CTreeNodeFirstCode(rhs) == C_INT_CST_NODE && c_tree_is_integer_zerop(rhs)) ++ && ++ ! ( CTreeExprCode(rhs) == C_NOP_EXPR ++ && CTreeTypeCode(CTreeType(rhs)) == C_INTEGER_TYPE ++ && CTreeNodeFirstCode(CTreeExprOperand(rhs, 0)) == C_INT_CST_NODE ++ && c_tree_is_integer_zerop(CTreeExprOperand(rhs, 0)))) ++ { ++ warn_for_assignment("%s makes pointer from integer without a cast", ++ c_get_spelling (errtype), funname, parmnum); ++ return c_convert_expr(type, rhs); ++ } ++ return c_null_pointer_node; ++ } ++ else if (codel == C_INTEGER_TYPE && coder == C_POINTER_TYPE) ++ { ++ warn_for_assignment("%s makes integer from pointer without a cast", ++ c_get_spelling (errtype), funname, parmnum); ++ return c_convert_expr(type, rhs); ++ } ++ ++ if (!errtype) ++ { ++ if (funname) ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *selector = maybe_building_objc_message_expr (); ++# else ++ c_tree_node *selector = 0; ++# endif ++ ++ if (selector && parmnum > 2) ++ { ++ error ("incompatible type for argument %d of `%s'", ++ parmnum - 2, CTreeIdentPointer(selector)); ++ } ++ else ++ { ++ error ("incompatible type for argument %d of `%s'", ++ parmnum, CTreeIdentPointer(funname)); ++ } ++ } ++ else ++ { ++ error ("incompatible type for argument %d of indirect function call", ++ parmnum); ++ } ++ } ++ else ++ { ++ error ("incompatible types in %s", c_get_spelling(errtype)); ++ } ++ ++ return c_error_mark_node; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Parser Build Indirect Reference | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_parser_build_indirect_ref( ptr, errorstring) ++ c_tree_node *ptr; ++ char *errorstring; ++{ ++ c_tree_node *pointer = c_default_conversion(ptr); ++ c_tree_node *type = CTreeType(pointer); ++ ++ if ( CTreeTypeCode(type) == C_POINTER_TYPE) ++ { ++ if ( CTreeExprCode(pointer) == C_ADDR_EXPR ++ && !c_flag_volatile ++ && ( CTreeType(CTreeExprOperand(pointer, 0)) ++ == CTreeType(type))) ++ { ++ return CTreeExprOperand(pointer, 0); ++ } ++ else ++ { ++ c_tree_node *t = CTreeType(type); ++ c_tree_node *ref = c_tree_build_unary_expr( C_INDIRECT_REF, pointer ); ++ CTreeType( ref ) = CTreeTypeMainVariant(t); ++ ++ if ( CTreeTypeSize(t) == 0 && CTreeTypeCode(t) != C_ARRAY_TYPE) ++ { ++ error ("dereferencing pointer to incomplete type"); ++ return c_error_mark_node; ++ } ++ if ( CTreeTypeCode(t) == C_VOID_TYPE && c_skip_evaluation == 0) ++ { ++ warning ("dereferencing `void *' pointer"); ++ } ++ ++ /* We *must* set TREE_READONLY when dereferencing a pointer to const, ++ so that we get the proper error message if the result is used ++ to assign to. Also, &* is supposed to be a no-op. ++ And ANSI C seems to specify that the type of the result ++ should be the const type. */ ++ /* A de-reference of a pointer to const is not a const. It is valid ++ to change it via some other pointer. */ ++ if ( CIsTreeNodeReadOnly(t) ) ++ { ++ CSetTreeNodeReadOnly(ref); ++ } ++ if ( CIsTreeNodeVolatile(t) || ++ CIsTreeNodeSideEffect(pointer) || ++ c_flag_volatile ) CSetTreeNodeSideEffect( ref ); ++ ++ if ( CIsTreeNodeVolatile(t) ) CSetTreeNodeVolatile( ref ); ++ return ref; ++ } ++ } ++ else if ( CTreeNodeFirstCode(pointer) != C_ERROR_NODE) ++ { ++ error ("invalid type argument of `%s'", errorstring); ++ } ++ return c_error_mark_node; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Build Unary Oper | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return nonzero if REF is an lvalue valid for this language. ++ Lvalues can be assigned, unless their type has TYPE_READONLY. ++ Lvalues can have their address taken, unless they have DECL_REGISTER. */ ++ ++int ++c_lvalue_p (ref) ++ c_tree_node *ref; ++{ ++ int code = CTreeNodeFirstCode(ref); ++ ++ if ( code == C_STRING_NODE) ++ { ++ return 1; ++ } ++ else ++ if ( code == C_DECL_NODE ) ++ { ++ code = CTreeExprCode( ref ); ++ switch (code) ++ { ++ case C_VAR_DECL: ++ case C_PARAM_DECL: ++ case C_RESULT_DECL: ++ return ( CTreeTypeCode(CTreeType(ref)) != C_FUNCTION_TYPE ++ && CTreeTypeCode(CTreeType(ref)) != C_METHOD_TYPE); ++ } ++ } ++ else ++ if ( code == C_ERROR_NODE ) ++ { ++ return ( CTreeTypeCode(CTreeType(ref)) != C_FUNCTION_TYPE ++ && CTreeTypeCode(CTreeType(ref)) != C_METHOD_TYPE); ++ } ++ else ++ if ( code == C_EXPR_NODE ) ++ { ++ code = CTreeExprCode( ref ); ++ switch (code) ++ { ++ case C_REALPART_EXPR: ++ case C_IMAGPART_EXPR: ++ case C_COMPONENT_REF: ++ return c_lvalue_p( CTreeExprOperand(ref, 0)); ++ ++ case C_INDIRECT_REF: ++ case C_ARRAY_REF: ++ return ( CTreeTypeCode(CTreeType(ref)) != C_FUNCTION_TYPE ++ && CTreeTypeCode(CTreeType(ref)) != C_METHOD_TYPE); ++ ++ case C_BIND_EXPR: ++ case C_RTL_EXPR: ++ return CTreeTypeCode(CTreeType(ref)) == C_ARRAY_TYPE; ++ ++ default: ++ return 0; ++ } ++ } ++ ++ return 0; ++} ++ ++ ++/* Return nonzero if REF is an lvalue valid for this language; ++ otherwise, print an error message and return zero. */ ++ ++int c_lvalue_or_else (ref, string) ++ c_tree_node *ref; ++ char *string; ++{ ++ int win = c_lvalue_p (ref); ++ if (! win) ++ { ++ error ("invalid lvalue in %s", string); ++ } ++ return win; ++} ++ ++ ++/* Mark EXP saying that we need to be able to take the ++ address of it; it should not be allocated in a register. ++ Value is 1 if successful. */ ++ ++int c_mark_addressable (exp) ++ c_tree_node *exp; ++{ ++ c_tree_node *x = exp; ++ while (1) ++ { ++ if (CTreeNodeFirstCode(x) == C_EXPR_NODE && ++ CTreeExprCode(x) == C_COMPONENT_REF ) ++ { ++ if ( CIsTreeDeclBitField(CTreeExprOperand(x, 1))) ++ { ++ error ("cannot take address of bitfield `%s'", ++ CTreeIdentPointer(CTreeDeclName(CTreeExprOperand(x, 1)))); ++ return 0; ++ } ++ } ++ else ++ /* ... fall through ... */ ++ if ( CTreeNodeFirstCode(x) == C_EXPR_NODE && ++ (CTreeExprCode(x) == C_ADDR_EXPR || ++ CTreeExprCode(x) == C_ARRAY_REF || ++ CTreeExprCode(x) == C_REALPART_EXPR || ++ CTreeExprCode(x) == C_IMAGPART_EXPR )) ++ { ++ x = CTreeExprOperand(x, 0); continue; ++ } ++ else ++ if ( CTreeNodeFirstCode(x) == C_EXPR_NODE && ++ CTreeExprCode(x) == C_CONSTRUCTOR_EXPR) ++ { ++ CSetTreeNodeAddressable(x); ++ return 1; ++ } ++ else ++ if ( CTreeNodeFirstCode( x ) == C_DECL_NODE && ++ (CTreeDeclCode(x ) == C_VAR_DECL || ++ CTreeDeclCode(x ) == C_CONST_DECL || ++ CTreeDeclCode(x ) == C_PARAM_DECL || ++ CTreeDeclCode(x ) == C_RESULT_DECL )) ++ { ++ if ( CIsTreeDeclRegister(x) && ! CIsTreeNodeAddressable(x) ++ && CIsTreeDeclNonLocal(x)) ++ { ++ if ( CIsTreeNodePublic(x)) ++ { ++ error ("global register variable `%s' used in nested function", ++ CTreeIdentPointer(CTreeDeclName(x))); ++ return 0; ++ } ++ pedwarn ("register variable `%s' used in nested function", ++ CTreeIdentPointer(CTreeDeclName(x))); ++ } ++ else if ( CIsTreeDeclRegister(x) && ! CIsTreeNodeAddressable(x)) ++ { ++ if ( CIsTreeNodePublic(x)) ++ { ++ error ("address of global register variable `%s' requested", ++ CTreeIdentPointer(CTreeDeclName(x))); ++ return 0; ++ } ++ ++ /* If we are making this addressable due to its having ++ volatile components, give a different error message. Also ++ handle the case of an unnamed parameter by not trying ++ to give the name. */ ++ ++ else if (CIsTreeTypeFieldsVolatile(CTreeType(x))) ++ { ++ error ("cannot put object with volatile field into register"); ++ return 0; ++ } ++ ++ pedwarn ("address of register variable `%s' requested", ++ CTreeIdentPointer(CTreeDeclName(x))); ++ } ++# ifdef LUDO_NO_SKIP ++ put_var_into_stack (x); ++# endif ++ } ++ else if ( CTreeNodeFirstCode( x) == C_DECL_NODE && ++ CTreeDeclCode( x ) == C_FUNCTION_DECL ) ++ { ++ CSetTreeNodeAddressable(x); ++ } ++ ++ return 1; ++ } ++} ++ ++/* Construct and perhaps optimize a c_tree_node *representation ++ for a unary operation. CODE, a tree_code, specifies the operation ++ and XARG is the operand. NOCONVERT nonzero suppresses ++ the default promotions (such as from short to int). */ ++ ++c_tree_node *c_parser_build_unary_op(code, xarg, noconvert) ++ int code; ++ c_tree_node *xarg; ++ int noconvert; ++{ ++ /* No default_conversion here. It causes trouble for ADDR_EXPR. */ ++ c_tree_node *arg = xarg; ++ c_tree_node *argtype = 0; ++ int typecode = CTreeTypeCode(CTreeType(arg)); ++ char *errstring = NULL; ++ c_tree_node *val; ++ ++ if ( CTreeNodeFirstCode( CTreeType(arg) ) == C_ERROR_NODE) ++ return c_error_mark_node; ++ if (typecode == C_ENUMERAL_TYPE) ++ typecode = C_INTEGER_TYPE; ++ ++ switch (code) ++ { ++ case C_CONVERT_EXPR: ++ /* This is used for unary plus, because a CONVERT_EXPR ++ is enough to prevent anybody from looking inside for ++ associativity, but won't generate any code. */ ++ if (!(typecode == C_INTEGER_TYPE || ++ typecode == C_REAL_TYPE || ++ typecode == C_COMPLEX_TYPE)) ++ errstring = "wrong type argument to unary plus"; ++ else if (!noconvert) ++ arg = c_default_conversion(arg); ++ break; ++ ++ case C_NEGATE_EXPR: ++ if (!(typecode == C_INTEGER_TYPE || typecode == C_REAL_TYPE ++ || typecode == C_COMPLEX_TYPE)) ++ errstring = "wrong type argument to unary minus"; ++ else if (!noconvert) ++ arg = c_default_conversion(arg); ++ break; ++ ++ case C_BIT_NOT_EXPR: ++ if (typecode == C_COMPLEX_TYPE) ++ { ++ code = C_CONJ_EXPR; ++ if (!noconvert) ++ arg = c_default_conversion(arg); ++ } ++ else if (typecode != C_INTEGER_TYPE) ++ errstring = "wrong type argument to bit-complement"; ++ else if (!noconvert) ++ arg = c_default_conversion (arg); ++ break; ++ ++ case C_ABS_EXPR: ++ if (!(typecode == C_INTEGER_TYPE || typecode == C_REAL_TYPE ++ || typecode == C_COMPLEX_TYPE)) ++ errstring = "wrong type argument to abs"; ++ else if (!noconvert) ++ arg = c_default_conversion (arg); ++ break; ++ ++ case C_CONJ_EXPR: ++ /* Conjugating a real value is a no-op, but allow it anyway. */ ++ if (!(typecode == C_INTEGER_TYPE || typecode == C_REAL_TYPE ++ || typecode == C_COMPLEX_TYPE)) ++ errstring = "wrong type argument to conjugation"; ++ else if (!noconvert) ++ arg = c_default_conversion (arg); ++ break; ++ ++ case C_TRUTH_NOT_EXPR: ++ if (typecode != C_INTEGER_TYPE ++ && typecode != C_REAL_TYPE && typecode != C_POINTER_TYPE ++ && typecode != C_COMPLEX_TYPE ++ /* These will convert to a pointer. */ ++ && typecode != C_ARRAY_TYPE && typecode != C_FUNCTION_TYPE) ++ { ++ errstring = "wrong type argument to unary exclamation mark"; ++ break; ++ } ++ arg = c_truthvalue_conversion(arg); ++ return c_invert_truthvalue(arg); ++ ++ case C_NOP_EXPR: ++ break; ++ ++ case C_REALPART_EXPR: ++ if ( CTreeNodeFirstCode(arg) == C_COMPLEX_NODE) ++ return CTreeComplexReal(arg); ++ else if ( CTreeTypeCode(CTreeType(arg)) == C_COMPLEX_TYPE) ++ { ++ return c_fold ( c_tree_build_unary_typed_expr ( C_REALPART_EXPR, CTreeType(CTreeType(arg)), arg)); ++ } ++ else ++ return arg; ++ ++ case C_IMAGPART_EXPR: ++ if ( CTreeNodeFirstCode(arg) == C_COMPLEX_NODE) ++ return CTreeComplexImag(arg); ++ else if ( CTreeNodeFirstCode(CTreeType(arg)) == C_COMPLEX_TYPE) ++ { ++ return c_fold ( c_tree_build_unary_typed_expr (C_IMAGPART_EXPR, CTreeType(CTreeType(arg)), arg)); ++ } ++ else ++ return c_convert_expr(CTreeType(arg), c_integer_zero_node); ++ ++ case C_PREINCREMENT_EXPR: ++ case C_POSTINCREMENT_EXPR: ++ case C_PREDECREMENT_EXPR: ++ case C_POSTDECREMENT_EXPR: ++ /* Handle complex lvalues (when permitted) ++ by reduction to simpler cases. */ ++ ++ val = c_unary_complex_lvalue(code, arg); ++ if (val != 0) ++ return val; ++ ++ /* Increment or decrement the real part of the value, ++ and don't change the imaginary part. */ ++ if (typecode == C_COMPLEX_TYPE) ++ { ++ c_tree_node *real; ++ c_tree_node *imag; ++ ++ arg = c_stabilize_reference(arg); ++ real = c_parser_build_unary_op(C_REALPART_EXPR, arg, 1); ++ imag = c_parser_build_unary_op(C_IMAGPART_EXPR, arg, 1); ++ return c_tree_build_binary_typed_expr(C_COMPLEX_EXPR, CTreeType(arg), ++ c_parser_build_unary_op(code, real, 1), imag); ++ } ++ ++ /* Report invalid types. */ ++ ++ if (typecode != C_POINTER_TYPE ++ && typecode != C_INTEGER_TYPE && typecode != C_REAL_TYPE) ++ { ++ if (code == C_PREINCREMENT_EXPR || code == C_POSTINCREMENT_EXPR) ++ errstring ="wrong type argument to increment"; ++ else ++ errstring ="wrong type argument to decrement"; ++ break; ++ } ++ ++ { ++ c_tree_node *inc; ++ c_tree_node *result_type = CTreeType(arg); ++ ++ arg = c_get_unwidened(arg, 0); ++ argtype = CTreeType(arg); ++ ++ /* Compute the increment. */ ++ ++ if (typecode == C_POINTER_TYPE) ++ { ++ /* If pointer target is an undefined struct, ++ we just cannot know how to do the arithmetic. */ ++ if (CTreeTypeSize(CTreeType(result_type)) == 0) ++ { ++ error ("%s of pointer to unknown structure", ++ ((code == C_PREINCREMENT_EXPR ++ || code == C_POSTINCREMENT_EXPR) ++ ? "increment" : "decrement")); ++ } ++ else if ((c_pedantic || c_warn_pointer_arith) ++ && (CTreeTypeCode(CTreeType(result_type)) == C_FUNCTION_TYPE ++ || CTreeTypeCode(CTreeType(result_type)) == C_VOID_TYPE)) ++ { ++ pedwarn ("wrong type argument to %s", ++ ((code == C_PREINCREMENT_EXPR ++ || code == C_POSTINCREMENT_EXPR) ++ ? "increment" : "decrement")); ++ } ++ inc = c_get_size_in_bytes(CTreeType(result_type)); ++ } ++ else ++ inc = c_integer_one_node; ++ ++ inc = c_convert_expr(argtype, inc); ++ ++ /* Handle incrementing a cast-expression. */ ++ ++ while (1) ++ switch ( CTreeExprCode(arg)) ++ { ++ case C_NOP_EXPR: ++ case C_CONVERT_EXPR: ++ case C_FLOAT_EXPR: ++ case C_FIX_TRUNC_EXPR: ++ case C_FIX_FLOOR_EXPR: ++ case C_FIX_ROUND_EXPR: ++ case C_FIX_CEIL_EXPR: ++ c_pedantic_lvalue_warning(C_CONVERT_EXPR); ++ /* If the real type has the same machine representation ++ as the type it is cast to, we can make better output ++ by adding directly to the inside of the cast. */ ++ if (( CTreeTypeCode(CTreeType(arg)) ++ == CTreeTypeCode(CTreeType(CTreeExprOperand(arg, 0)))) ++ && (CTreeTypeMode(CTreeType(arg)) ++ == CTreeTypeMode(CTreeType(CTreeExprOperand(arg, 0))))) ++ arg = CTreeExprOperand(arg, 0); ++ else ++ { ++ c_tree_node *incremented; ++ c_tree_node *modify; ++ c_tree_node *value; ++ arg = c_stabilize_reference (arg); ++ if (code == C_PREINCREMENT_EXPR || code == C_PREDECREMENT_EXPR) ++ value = arg; ++ else ++# ifdef LUDO_DONE ++ value = save_expr (arg); ++# else ++ value = arg; ++ ++# endif ++ incremented = c_tree_build_binary_typed_expr (((code == C_PREINCREMENT_EXPR ++ || code == C_POSTINCREMENT_EXPR) ++ ? C_PLUS_EXPR : C_MINUS_EXPR), ++ argtype, value, inc); ++ CSetTreeNodeSideEffect(incremented); ++ modify = c_parser_build_modify_expr(arg, C_NOP_EXPR, incremented); ++ value = c_tree_build_binary_typed_expr( ++ C_COMPOUND_EXPR, CTreeType(arg), modify, value); ++ CSetTreeNodeUsed(value); ++ return value; ++ } ++ break; ++ ++ default: ++ goto give_up; ++ } ++ give_up: ++ ++ /* Complain about anything else that is not a true lvalue. */ ++ if (!c_lvalue_or_else (arg, ((code == C_PREINCREMENT_EXPR ++ || code == C_POSTINCREMENT_EXPR) ++ ? "increment" : "decrement"))) ++ return c_error_mark_node; ++ ++ /* Report a read-only lvalue. */ ++ if ( CIsTreeNodeReadOnly(arg)) ++ { ++ c_readonly_warning (arg, ++ ((code == C_PREINCREMENT_EXPR ++ || code == C_POSTINCREMENT_EXPR) ++ ? "increment" : "decrement")); ++ } ++ ++ val = c_tree_build_binary_typed_expr (code, CTreeType(arg), arg, inc); ++ CSetTreeNodeSideEffect(val); ++ val = c_convert_expr(result_type, val); ++ if ( CTreeTypeCode(val) != code) ++ { ++ CSetTreeNodeStatic(val); ++ } ++ return val; ++ } ++ ++ case C_ADDR_EXPR: ++ /* Note that this operation never does default_conversion ++ regardless of NOCONVERT. */ ++ ++ /* Let &* cancel out to simplify resulting code. */ ++ if ( CTreeExprCode(arg) == C_INDIRECT_REF) ++ { ++ /* Don't let this be an lvalue. */ ++ if (c_lvalue_p (CTreeExprOperand(arg, 0))) ++ return c_non_lvalue (CTreeExprOperand(arg, 0)); ++ return CTreeExprOperand(arg, 0); ++ } ++ ++ /* For &x[y], return x+y */ ++ if ( CTreeExprCode(arg) == C_ARRAY_REF) ++ { ++ if (c_mark_addressable (CTreeExprOperand(arg, 0)) == 0) ++ return c_error_mark_node; ++ return c_build_binary_op(C_PLUS_EXPR, CTreeExprOperand(arg, 0), ++ CTreeExprOperand(arg, 1), 1); ++ } ++ ++ /* Handle complex lvalues (when permitted) ++ by reduction to simpler cases. */ ++ val = c_unary_complex_lvalue(code, arg); ++ if (val != 0) ++ return val; ++ ++ /* Allow the address of a constructor if all the elements ++ are constant. */ ++ if ( CTreeExprCode(arg) == C_CONSTRUCTOR_EXPR && CIsTreeNodeConstant(arg)) ++ ; ++ /* Anything not already handled and not a true memory reference ++ is an error. */ ++ else if (typecode != C_FUNCTION_TYPE && !c_lvalue_or_else (arg, "unary `&'")) ++ return c_error_mark_node; ++ ++ /* Ordinary case; arg is a COMPONENT_REF or a decl. */ ++ argtype = CTreeType(arg); ++ /* If the lvalue is const or volatile, ++ merge that into the type that the address will point to. */ ++ if ( (CTreeNodeFirstCode(arg) == C_DECL_NODE) ++ || (CTreeNodeFirstCode(arg) == C_EXPR_NODE && ++ (CTreeExprCode(arg) == C_COMPONENT_REF || ++ CTreeExprCode(arg) == C_BIT_FIELD_REF || ++ CTreeExprCode(arg) == C_INDIRECT_REF || ++ CTreeExprCode(arg) == C_BUFFER_REF || ++ CTreeExprCode(arg) == C_ARRAY_REF ++ ))) ++ { ++ if ( CIsTreeNodeReadOnly(arg) || CIsTreeNodeVolatile(arg)) ++ argtype = c_tree_build_type_variant( ++ argtype, CIsTreeNodeReadOnly(arg), ++ CIsTreeNodeVolatile(arg)); ++ } ++ ++ argtype = c_tree_build_pointer_type(argtype); ++ ++ if (c_mark_addressable (arg) == 0) ++ return c_error_mark_node; ++ ++ { ++ c_tree_node *addr; ++ ++ if ( CTreeExprCode(arg) == C_COMPONENT_REF) ++ { ++ c_tree_node *field = CTreeExprOperand(arg, 1); ++ ++ addr = c_parser_build_unary_op( C_ADDR_EXPR, CTreeExprOperand(arg, 0), 0); ++ ++ if ( CIsTreeDeclBitField(field)) ++ { ++ error ("attempt to take address of bit-field structure member `%s'", ++ CTreeIdentPointer(CTreeDeclName(field))); ++ return c_error_mark_node; ++ } ++ ++ addr = c_convert_expr(argtype, addr); ++ ++ if (! c_tree_is_integer_zerop( CTreeDeclArguments(field))) ++ { ++ c_tree_node *offset ++ = c_build_size_binop( C_TRUNC_DIV_EXPR, ++ CTreeDeclArguments(field), c_tree_get_size_int( C_BITS_PER_UNIT)); ++ int flag = CIsTreeNodeConstant(addr); ++ ++ addr = c_fold (c_tree_build_binary_typed_expr(C_PLUS_EXPR, argtype, ++ addr, c_convert_expr(argtype, offset))); ++ if ( flag ) CSetTreeNodeConstant( addr ); ++ } ++ } ++ else ++ addr = c_tree_build_unary_typed_expr(code, argtype, arg); ++ ++ /* Address of a static or external variable or ++ file-scope function counts as a constant. */ ++ if (c_is_staticp(arg) ++ && ! ( CTreeNodeFirstCode(arg) == C_DECL_NODE && ++ CTreeDeclCode(arg) == C_FUNCTION_DECL && ++ CTreeDeclContext(arg) != 0)) ++ { ++ CSetTreeNodeConstant( addr ); ++ } ++ ++ return addr; ++ } ++ ++ default: ++ break; ++ } ++ ++ if (!errstring) ++ { ++ if (argtype == 0) ++ argtype = CTreeType(arg); ++ return c_fold(c_tree_build_unary_typed_expr(code, argtype, arg)); ++ } ++ ++ error (errstring); ++ return c_error_mark_node; ++} ++/*------------------------------------------------------------\ ++| | ++| C Parser Build Binary Oper | ++| | ++\------------------------------------------------------------*/ ++ ++ ++/* Return a c_tree_node *for the sum or difference (RESULTCODE says which) ++ of pointer PTROP and integer INTOP. */ ++ ++static c_tree_node *c_pointer_int_sum(resultcode, ptrop, intop) ++ int resultcode; ++ c_tree_node *ptrop; ++ c_tree_node *intop; ++{ ++ c_tree_node *size_exp; ++ ++ c_tree_node *result; ++ c_tree_node *folded; ++ ++ /* The result is a pointer of the same type that is being added. */ ++ ++ c_tree_node *result_type = CTreeType(ptrop); ++ ++ if ( CTreeTypeCode(CTreeType(result_type)) == C_VOID_TYPE) ++ { ++ if (c_pedantic || c_warn_pointer_arith) ++ { ++ pedwarn ("pointer of type `void *' used in arithmetic"); ++ } ++ size_exp = c_integer_one_node; ++ } ++ else if ( CTreeTypeCode(CTreeType(result_type)) == C_FUNCTION_TYPE) ++ { ++ if (c_pedantic || c_warn_pointer_arith) ++ { ++ pedwarn ("pointer to a function used in arithmetic"); ++ } ++ size_exp = c_integer_one_node; ++ } ++ else ++ size_exp = c_get_size_in_bytes(CTreeType(result_type)); ++ ++ /* If what we are about to multiply by the size of the elements ++ contains a constant term, apply distributive law ++ and multiply that constant term separately. ++ This helps produce common subexpressions. */ ++ ++ if (( CTreeExprCode(intop) == C_PLUS_EXPR || ++ CTreeExprCode(intop) == C_MINUS_EXPR) ++ && ! CIsTreeNodeConstant(intop) ++ && CIsTreeNodeConstant(CTreeExprOperand(intop, 1)) ++ && CIsTreeNodeConstant(size_exp) ++ /* If the constant comes from pointer subtraction, ++ skip this optimization--it would cause an error. */ ++ && CTreeTypeCode(CTreeType(CTreeExprOperand(intop, 0))) == C_INTEGER_TYPE ++ /* If the constant is unsigned, and smaller than the pointer size, ++ then we must skip this optimization. This is because it could cause ++ an overflow error if the constant is negative but INTOP is not. */ ++ && (! CIsTreeNodeUnsigned(CTreeType(intop)) ++ || (CTreeTypePrecision(CTreeType(intop)) ++ == CTreeTypePrecision(CTreeType(ptrop))))) ++ { ++ int subcode = resultcode; ++ c_tree_node *int_type = CTreeType(intop); ++ if ( CTreeExprCode(intop) == C_MINUS_EXPR) ++ subcode = (subcode == C_PLUS_EXPR ? C_MINUS_EXPR : C_PLUS_EXPR); ++ /* Convert both subexpression types to the type of intop, ++ because weird cases involving pointer arithmetic ++ can result in a sum or difference with different type args. */ ++ ptrop = c_build_binary_op(subcode, ptrop, ++ c_convert_expr(int_type, CTreeExprOperand(intop, 1)), 1); ++ intop = c_convert_expr(int_type, CTreeExprOperand(intop, 0)); ++ } ++ ++ /* Convert the integer argument to a type the same size as c_size_type ++ so the multiply won't overflow spuriously. */ ++ ++ if (CTreeTypePrecision(CTreeType(intop)) != CTreeTypePrecision(c_size_type) ++ || CIsTreeNodeUnsigned(CTreeType(intop)) != CIsTreeNodeUnsigned(c_size_type)) ++ intop = c_convert_expr(c_get_type_for_size( CTreeTypePrecision(c_size_type), ++ CIsTreeNodeUnsigned(c_size_type)), intop); ++ ++ /* Replace the integer argument with a suitable product by the object size. ++ Do this multiplication as signed, then convert to the appropriate ++ pointer type (actually unsigned integral). */ ++ ++ intop = c_convert_expr( result_type, ++ c_build_binary_op( C_MULT_EXPR, intop, ++ c_convert_expr(CTreeType(intop), size_exp), 1)); ++ ++ /* Create the sum or difference. */ ++ ++ result = c_tree_build_binary_expr(resultcode, ptrop, intop); ++ CTreeType( result ) = result_type; ++ ++ folded = c_fold (result); ++ ++ if (folded == result) ++ { ++ if ( CIsTreeNodeConstant( ptrop ) && ++ CIsTreeNodeConstant( intop ) ) ++ { ++ CSetTreeNodeConstant( folded ); ++ } ++ } ++ return folded; ++} ++ ++ ++/* Return a c_tree_node *for the difference of pointers OP0 and OP1. ++ The resulting c_tree_node *has type int. */ ++ ++static c_tree_node *c_pointer_diff(op0, op1) ++ c_tree_node *op0; ++ c_tree_node *op1; ++{ ++ c_tree_node *result; ++ c_tree_node *folded; ++ c_tree_node *restype = c_ptrdiff_type_node; ++ ++ c_tree_node *target_type = CTreeType(CTreeType(op0)); ++ ++ if (c_pedantic || c_warn_pointer_arith) ++ { ++ if ( CTreeTypeCode(target_type) == C_VOID_TYPE) ++ { ++ pedwarn ("pointer of type `void *' used in subtraction"); ++ } ++ if ( CTreeTypeCode(target_type) == C_FUNCTION_TYPE) ++ { ++ pedwarn ("pointer to a function used in subtraction"); ++ } ++ } ++ ++ /* First do the subtraction as integers; ++ then drop through to build the divide operator. ++ Do not do default conversions on the minus operator ++ in case restype is a short type. */ ++ ++ op0 = c_build_binary_op( C_MINUS_EXPR, c_convert_expr(restype, op0), ++ c_convert_expr(restype, op1), 0); ++ /* This generates an error if op1 is pointer to incomplete type. */ ++ if (CTreeTypeSize(CTreeType(CTreeType(op1))) == 0) ++ { ++ error ("arithmetic on pointer to an incomplete type"); ++ } ++ ++ /* This generates an error if op0 is pointer to incomplete type. */ ++ op1 = c_get_size_in_bytes(target_type); ++ ++ /* Divide by the size, in easiest possible way. */ ++ ++ result = c_tree_build_binary_expr( C_EXACT_DIV_EXPR, op0, c_convert_expr(restype, op1)); ++ CTreeType( result ) = restype; ++ ++ folded = c_fold (result); ++ ++ if (folded == result) ++ { ++ if ( CIsTreeNodeConstant(op0) && ++ CIsTreeNodeConstant(op1) ) ++ { ++ CSetTreeNodeConstant( folded ); ++ } ++ } ++ return folded; ++} ++ ++/* Return the common type of two types. ++ We assume that comptypes has already been done and returned 1; ++ if that isn't so, this may crash. In particular, we assume that qualifiers ++ match. ++ ++ This is the type for the result of most arithmetic operations ++ if the operands have the given two types. */ ++ ++c_tree_node *c_get_common_type(t1, t2) ++ c_tree_node *t1; ++ c_tree_node *t2; ++{ ++ int code1; ++ int code2; ++ c_tree_node *attributes; ++ ++ /* Save time if the two types are the same. */ ++ ++ if (t1 == t2) return t1; ++ ++ /* If one type is nonsense, use the other. */ ++ if (t1 == c_error_mark_node) ++ return t2; ++ if (t2 == c_error_mark_node) ++ return t1; ++ ++# ifdef LUDO_NO_SKIP ++ /* Merge the attributes */ ++ attributes = c_merge_attributes (TYPE_ATTRIBUTES (t1), TYPE_ATTRIBUTES (t2)); ++# else ++ attributes = NULL; ++# endif ++ ++ /* Treat an enum type as the unsigned integer type of the same width. */ ++ ++ if ( CTreeTypeCode (t1) == C_ENUMERAL_TYPE) ++ t1 = c_get_type_for_size(CTreeTypePrecision(t1), 1); ++ if ( CTreeTypeCode (t2) == C_ENUMERAL_TYPE) ++ t2 = c_get_type_for_size(CTreeTypePrecision(t2), 1); ++ ++ code1 = CTreeTypeCode(t1); ++ code2 = CTreeTypeCode(t2); ++ ++ /* If one type is complex, form the common type of the non-complex ++ components, then make that complex. Use T1 or T2 if it is the ++ required type. */ ++ if (code1 == C_COMPLEX_TYPE || code2 == C_COMPLEX_TYPE) ++ { ++ c_tree_node *subtype1 = code1 == C_COMPLEX_TYPE ? CTreeType(t1) : t1; ++ c_tree_node *subtype2 = code2 == C_COMPLEX_TYPE ? CTreeType(t2) : t2; ++ c_tree_node *subtype = c_get_common_type(subtype1, subtype2); ++ ++ if (code1 == C_COMPLEX_TYPE && CTreeType(t1) == subtype) ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ else if (code2 == C_COMPLEX_TYPE && CTreeType(t2) == subtype) ++ return c_tree_build_type_attribute_variant(t2, attributes); ++ else ++ return c_tree_build_type_attribute_variant( ++ c_tree_build_complex_type(subtype), attributes); ++ } ++ ++ switch (code1) ++ { ++ case C_INTEGER_TYPE: ++ case C_REAL_TYPE: ++ /* If only one is real, use it as the result. */ ++ ++ if (code1 == C_REAL_TYPE && code2 != C_REAL_TYPE) ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ ++ if (code2 == C_REAL_TYPE && code1 != C_REAL_TYPE) ++ return c_tree_build_type_attribute_variant(t2, attributes); ++ ++ /* Both real or both integers; use the one with greater precision. */ ++ ++ if (CTreeTypePrecision(t1) > CTreeTypePrecision(t2)) ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ else if (CTreeTypePrecision(t2) > CTreeTypePrecision(t1)) ++ return c_tree_build_type_attribute_variant(t2, attributes); ++ ++ /* Same precision. Prefer longs to ints even when same size. */ ++ ++ if (CTreeTypeMainVariant(t1) == c_long_unsigned_type_node ++ || CTreeTypeMainVariant(t2) == c_long_unsigned_type_node) ++ return c_tree_build_type_attribute_variant(c_long_unsigned_type_node, ++ attributes); ++ ++ if (CTreeTypeMainVariant(t1) == c_long_integer_type_node ++ || CTreeTypeMainVariant(t2) == c_long_integer_type_node) ++ { ++ /* But preserve unsignedness from the other type, ++ since long cannot hold all the values of an unsigned int. */ ++ if (CIsTreeNodeUnsigned (t1) || CIsTreeNodeUnsigned (t2)) ++ t1 = c_long_unsigned_type_node; ++ else ++ t1 = c_long_integer_type_node; ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ } ++ ++ /* Likewise, prefer long double to double even if same size. */ ++ if (CTreeTypeMainVariant(t1) == c_long_double_type_node ++ || CTreeTypeMainVariant(t2) == c_long_double_type_node) ++ return c_tree_build_type_attribute_variant(c_long_double_type_node, ++ attributes); ++ ++ /* Otherwise prefer the unsigned one. */ ++ ++ if (CIsTreeNodeUnsigned (t1)) ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ else ++ return c_tree_build_type_attribute_variant(t2, attributes); ++ ++ case C_POINTER_TYPE: ++ /* For two pointers, do this recursively on the target type, ++ and combine the qualifiers of the two types' targets. */ ++ /* This code was turned off; I don't know why. ++ But ANSI C specifies doing this with the qualifiers. ++ So I turned it on again. */ ++ { ++ c_tree_node *target = c_get_common_type (CTreeTypeMainVariant(CTreeType(t1)), ++ CTreeTypeMainVariant(CTreeType(t2))); ++ int constp ++ = CIsTreeNodeReadOnly (CTreeType(t1)) || CIsTreeNodeReadOnly (CTreeType(t2)); ++ int volatilep ++ = CIsTreeNodeVolatile (CTreeType(t1)) || CIsTreeNodeVolatile (CTreeType(t2)); ++ t1 = c_tree_build_pointer_type(c_tree_build_type_variant(target, constp, ++ volatilep)); ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ } ++ ++ case C_ARRAY_TYPE: ++ { ++ c_tree_node *elt = c_get_common_type (CTreeType(t1), CTreeType(t2)); ++ /* Save space: see if the result is identical to one of the args. */ ++ if (elt == CTreeType(t1) && CTreeTypeValues (t1)) ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ if (elt == CTreeType(t2) && CTreeTypeValues (t2)) ++ return c_tree_build_type_attribute_variant(t2, attributes); ++ /* Merge the element types, and have a size if either arg has one. */ ++ t1 = c_tree_build_array_type (elt, CTreeTypeValues(CTreeTypeValues (t1) ? t1 : t2)); ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ } ++ ++ case C_FUNCTION_TYPE: ++ /* Function types: prefer the one that specified arg types. ++ If both do, merge the arg types. Also merge the return types. */ ++ { ++ c_tree_node *valtype = c_get_common_type (CTreeType(t1), CTreeType(t2)); ++ c_tree_node *p1 = CTreeTypeValues (t1); ++ c_tree_node *p2 = CTreeTypeValues (t2); ++ int len; ++ c_tree_node *newargs; ++ c_tree_node *n; ++ int i; ++ ++ /* Save space: see if the result is identical to one of the args. */ ++ if (valtype == CTreeType(t1) && ! CTreeTypeValues (t2)) ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ if (valtype == CTreeType(t2) && ! CTreeTypeValues (t1)) ++ return c_tree_build_type_attribute_variant(t2, attributes); ++ ++ /* Simple way if one arg fails to specify argument types. */ ++ if (CTreeTypeValues (t1) == 0) ++ { ++ t1 = c_tree_build_function_type (valtype, CTreeTypeValues(t2)); ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ } ++ if (CTreeTypeValues (t2) == 0) ++ { ++ t1 = c_tree_build_function_type (valtype, CTreeTypeValues(t1)); ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ } ++ ++ /* If both args specify argument types, we must merge the two ++ lists, argument by argument. */ ++ ++ len = c_tree_get_list_length(p1); ++ newargs = 0; ++ ++ for (i = 0; i < len; i++) ++ newargs = c_tree_add_head_list( NULL, NULL, newargs); ++ ++ n = newargs; ++ ++ for (; p1; ++ p1 = CTreeChain(p1), p2 = CTreeChain(p2), n = CTreeChain(n)) ++ { ++ /* A null type means arg type is not specified. ++ Take whatever the other function type has. */ ++ if ( CTreeListValue (p1) == 0) ++ { ++ CTreeListValue (n) = CTreeListValue (p2); ++ goto parm_done; ++ } ++ if ( CTreeListValue (p2) == 0) ++ { ++ CTreeListValue (n) = CTreeListValue (p1); ++ goto parm_done; ++ } ++ ++ /* Given wait (union {union wait *u; int *i} *) ++ and wait (union wait *), ++ prefer union wait * as type of parm. */ ++ if ( CTreeTypeCode(CTreeListValue (p1)) == C_UNION_TYPE ++ && CTreeListValue (p1) != CTreeListValue (p2)) ++ { ++ c_tree_node *memb; ++ for (memb = CTreeTypeValues(CTreeListValue (p1)); ++ memb; memb = CTreeChain(memb)) ++ if (c_is_comptypes(CTreeType(memb), CTreeListValue (p2))) ++ { ++ CTreeListValue (n) = CTreeListValue (p2); ++ if (c_pedantic) ++ { ++ pedwarn ("function types not truly compatible in ANSI C"); ++ } ++ goto parm_done; ++ } ++ } ++ if ( CTreeTypeCode( CTreeListValue (p2)) == C_UNION_TYPE ++ && CTreeListValue(p2) != CTreeListValue(p1)) ++ { ++ c_tree_node *memb; ++ for (memb = CTreeTypeValues( CTreeListValue (p2)); ++ memb; memb = CTreeChain(memb)) ++ if (c_is_comptypes(CTreeType(memb), CTreeListValue (p1))) ++ { ++ CTreeListValue (n) = CTreeListValue (p1); ++ if (c_pedantic) ++ { ++ pedwarn ("function types not truly compatible in ANSI C"); ++ } ++ goto parm_done; ++ } ++ } ++ CTreeListValue(n) = c_get_common_type( CTreeListValue(p1), CTreeListValue(p2)); ++ parm_done: ; ++ } ++ ++ t1 = c_tree_build_function_type(valtype, newargs); ++ /* ... falls through ... */ ++ } ++ ++ default: ++ return c_tree_build_type_attribute_variant(t1, attributes); ++ } ++} ++ ++ ++/* Print an error message for invalid operands to arith operation CODE. ++ NOP_EXPR is used as a special case (see truthvalue_conversion). */ ++ ++void c_binary_op_error (code) ++ int code; ++{ ++ char *opname; ++ ++ switch (code) ++ { ++ case C_NOP_EXPR: ++ error ("invalid truth-value expression"); ++ return; ++ ++ case C_PLUS_EXPR: ++ opname = "+"; break; ++ case C_MINUS_EXPR: ++ opname = "-"; break; ++ case C_MULT_EXPR: ++ opname = "*"; break; ++ case C_MAX_EXPR: ++ opname = "max"; break; ++ case C_MIN_EXPR: ++ opname = "min"; break; ++ case C_EQ_EXPR: ++ opname = "=="; break; ++ case C_NE_EXPR: ++ opname = "!="; break; ++ case C_LE_EXPR: ++ opname = "<="; break; ++ case C_GE_EXPR: ++ opname = ">="; break; ++ case C_LT_EXPR: ++ opname = "<"; break; ++ case C_GT_EXPR: ++ opname = ">"; break; ++ case C_LSHIFT_EXPR: ++ opname = "<<"; break; ++ case C_RSHIFT_EXPR: ++ opname = ">>"; break; ++ case C_TRUNC_MOD_EXPR: ++ case C_FLOOR_MOD_EXPR: ++ opname = "%"; break; ++ case C_TRUNC_DIV_EXPR: ++ case C_FLOOR_DIV_EXPR: ++ opname = "/"; break; ++ case C_BIT_AND_EXPR: ++ opname = "&"; break; ++ case C_BIT_IOR_EXPR: ++ opname = "|"; break; ++ case C_TRUTH_ANDIF_EXPR: ++ opname = "&&"; break; ++ case C_TRUTH_ORIF_EXPR: ++ opname = "||"; break; ++ case C_BIT_XOR_EXPR: ++ opname = "^"; break; ++ case C_LROTATE_EXPR: ++ case C_RROTATE_EXPR: ++ opname = "rotate"; break; ++ default: ++ opname = "unknown"; break; ++ } ++ error ("invalid operands to binary %s", opname); ++} ++ ++/* Build a binary-operation expression without default conversions. ++ CODE is the kind of expression to build. ++ This function differs from `build' in several ways: ++ the data type of the result is computed and recorded in it, ++ warnings are generated if arg data types are invalid, ++ special handling for addition and subtraction of pointers is known, ++ and some optimization is done (operations on narrow ints ++ are done in the narrower type when that gives the same result). ++ Constant folding is also done before the result is returned. ++ ++ Note that the operands will never have enumeral types, or function ++ or array types, because either they will have the default conversions ++ performed or they have both just been converted to some other type in which ++ the arithmetic is to be done. */ ++ ++c_tree_node *c_build_binary_op(code, orig_op0, orig_op1, convert_p) ++ int code; ++ c_tree_node *orig_op0; ++ c_tree_node *orig_op1; ++ int convert_p; ++{ ++ c_tree_node *type0; ++ c_tree_node *type1; ++ int code0, code1; ++ c_tree_node *op0; ++ c_tree_node *op1; ++ ++ /* Expression code to give to the expression when it is built. ++ Normally this is CODE, which is what the caller asked for, ++ but in some special cases we change it. */ ++ int resultcode = code; ++ ++ /* Data type in which the computation is to be performed. ++ In the simplest cases this is the common type of the arguments. */ ++ c_tree_node *result_type = NULL; ++ ++ /* Nonzero means operands have already been type-converted ++ in whatever way is necessary. ++ Zero means they need to be converted to RESULT_TYPE. */ ++ int converted = 0; ++ ++ /* Nonzero means create the expression with this type, rather than ++ RESULT_TYPE. */ ++ c_tree_node *build_type = 0; ++ ++ /* Nonzero means after finally constructing the expression ++ convert it to this type. */ ++ c_tree_node *final_type = 0; ++ ++ /* Nonzero if this is an operation like MIN or MAX which can ++ safely be computed in short if both args are promoted shorts. ++ Also implies COMMON. ++ -1 indicates a bitwise operation; this makes a difference ++ in the exact conditions for when it is safe to do the operation ++ in a narrower mode. */ ++ int shorten = 0; ++ ++ /* Nonzero if this is a comparison operation; ++ if both args are promoted shorts, compare the original shorts. ++ Also implies COMMON. */ ++ int short_compare = 0; ++ ++ /* Nonzero if this is a right-shift operation, which can be computed on the ++ original short and then promoted if the operand is a promoted short. */ ++ int short_shift = 0; ++ ++ /* Nonzero means set RESULT_TYPE to the common type of the args. */ ++ int common = 0; ++ ++ if (convert_p) ++ { ++ op0 = c_default_conversion(orig_op0); ++ op1 = c_default_conversion(orig_op1); ++ } ++ else ++ { ++ op0 = orig_op0; ++ op1 = orig_op1; ++ } ++ ++ type0 = CTreeType(op0); ++ type1 = CTreeType(op1); ++ ++ /* The expression codes of the data types of the arguments tell us ++ whether the arguments are integers, floating, pointers, etc. */ ++ code0 = CTreeTypeCode(type0); ++ code1 = CTreeTypeCode(type1); ++ ++ /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue. */ ++ CStripTypeNops(op0); ++ CStripTypeNops(op1); ++ ++ /* If an error was already reported for one of the arguments, ++ avoid reporting another error. */ ++ ++ if ( CTreeNodeFirstCode(type0) == C_ERROR_NODE || ++ CTreeNodeFirstCode(type1) == C_ERROR_NODE) ++ { ++ return c_error_mark_node; ++ } ++ ++ switch (code) ++ { ++ case C_PLUS_EXPR: ++ /* Handle the pointer + int case. */ ++ if (code0 == C_POINTER_TYPE && code1 == C_INTEGER_TYPE) ++ return c_pointer_int_sum(C_PLUS_EXPR, op0, op1); ++ else if (code1 == C_POINTER_TYPE && code0 == C_INTEGER_TYPE) ++ return c_pointer_int_sum(C_PLUS_EXPR, op1, op0); ++ else ++ common = 1; ++ break; ++ ++ case C_MINUS_EXPR: ++ /* Subtraction of two similar pointers. ++ We must subtract them as integers, then divide by object size. */ ++ if (code0 == C_POINTER_TYPE && code1 == C_POINTER_TYPE ++ && c_is_comp_target_types(type0, type1)) ++ return c_pointer_diff(op0, op1); ++ /* Handle pointer minus int. Just like pointer plus int. */ ++ else if (code0 == C_POINTER_TYPE && code1 == C_INTEGER_TYPE) ++ return c_pointer_int_sum(C_MINUS_EXPR, op0, op1); ++ else ++ common = 1; ++ break; ++ ++ case C_MULT_EXPR: ++ common = 1; ++ break; ++ ++ case C_TRUNC_DIV_EXPR: ++ case C_CEIL_DIV_EXPR: ++ case C_FLOOR_DIV_EXPR: ++ case C_ROUND_DIV_EXPR: ++ case C_EXACT_DIV_EXPR: ++ if ((code0 == C_INTEGER_TYPE || code0 == C_REAL_TYPE ++ || code0 == C_COMPLEX_TYPE) ++ && (code1 == C_INTEGER_TYPE || code1 == C_REAL_TYPE ++ || code1 == C_COMPLEX_TYPE)) ++ { ++ if (!(code0 == C_INTEGER_TYPE && code1 == C_INTEGER_TYPE)) ++ resultcode = C_RDIV_EXPR; ++ else ++ { ++ /* Although it would be tempting to shorten always here, that ++ loses on some targets, since the modulo instruction is ++ undefined if the quotient can't be represented in the ++ computation mode. We shorten only if unsigned or if ++ dividing by something we know != -1. */ ++ shorten = ( CIsTreeNodeUnsigned(CTreeType(orig_op0)) ++ || ( CTreeNodeFirstCode(op1) == C_INT_CST_NODE ++ && ( CTreeIntCstLow(op1) != -1 ++ || CTreeIntCstHigh(op1) != -1))); ++ } ++ common = 1; ++ } ++ break; ++ ++ case C_BIT_AND_EXPR: ++ case C_BIT_ANDTC_EXPR: ++ case C_BIT_IOR_EXPR: ++ case C_BIT_XOR_EXPR: ++ if (code0 == C_INTEGER_TYPE && code1 == C_INTEGER_TYPE) ++ shorten = -1; ++ /* If one operand is a constant, and the other is a short type ++ that has been converted to an int, ++ really do the work in the short type and then convert the ++ result to int. If we are lucky, the constant will be 0 or 1 ++ in the short type, making the entire operation go away. */ ++ if ( CTreeNodeFirstCode(op0) == C_INT_CST_NODE ++ && CTreeNodeFirstCode(op1) == C_EXPR_NODE ++ && CTreeExprCode(op1) == C_NOP_EXPR ++ && CTreeTypePrecision(type1) > ++ CTreeTypePrecision(CTreeType(CTreeExprOperand(op1, 0))) ++ && CIsTreeNodeUnsigned(CTreeType(CTreeExprOperand(op1, 0)))) ++ { ++ final_type = result_type; ++ op1 = CTreeExprOperand(op1, 0); ++ result_type = CTreeType(op1); ++ } ++ if ( CTreeNodeFirstCode(op1) == C_INT_CST_NODE ++ && CTreeNodeFirstCode(op0) == C_EXPR_NODE ++ && CTreeExprCode(op0) == C_NOP_EXPR ++ && CTreeTypePrecision(type0) > ++ CTreeTypePrecision(CTreeType( CTreeExprOperand(op0, 0))) ++ && CIsTreeNodeUnsigned(CTreeType( CTreeExprOperand(op0, 0)))) ++ { ++ final_type = result_type; ++ op0 = CTreeExprOperand(op0, 0); ++ result_type = CTreeType(op0); ++ } ++ break; ++ ++ case C_TRUNC_MOD_EXPR: ++ case C_FLOOR_MOD_EXPR: ++ if (code0 == C_INTEGER_TYPE && code1 == C_INTEGER_TYPE) ++ { ++ /* Although it would be tempting to shorten always here, that loses ++ on some targets, since the modulo instruction is undefined if the ++ quotient can't be represented in the computation mode. We shorten ++ only if unsigned or if dividing by something we know != -1. */ ++ shorten = ( CIsTreeNodeUnsigned(CTreeType(orig_op0)) ++ || ( CTreeNodeFirstCode(op1) == C_INT_CST_NODE ++ && ( CTreeIntCstLow(op1) != -1 ++ || CTreeIntCstHigh(op1) != -1))); ++ common = 1; ++ } ++ break; ++ ++ case C_TRUTH_ANDIF_EXPR: ++ case C_TRUTH_ORIF_EXPR: ++ case C_TRUTH_AND_EXPR: ++ case C_TRUTH_OR_EXPR: ++ case C_TRUTH_XOR_EXPR: ++ if ((code0 == C_INTEGER_TYPE || code0 == C_POINTER_TYPE ++ || code0 == C_REAL_TYPE || code0 == C_COMPLEX_TYPE) ++ && (code1 == C_INTEGER_TYPE || code1 == C_POINTER_TYPE ++ || code1 == C_REAL_TYPE || code1 == C_COMPLEX_TYPE)) ++ { ++ /* Result of these operations is always an int, ++ but that does not mean the operands should be ++ converted to ints! */ ++ result_type = c_integer_type_node; ++ op0 = c_truthvalue_conversion(op0); ++ op1 = c_truthvalue_conversion(op1); ++ converted = 1; ++ } ++ break; ++ ++ /* Shift operations: result has same type as first operand; ++ always convert second operand to int. ++ Also set SHORT_SHIFT if shifting rightward. */ ++ ++ case C_RSHIFT_EXPR: ++ if (code0 == C_INTEGER_TYPE && code1 == C_INTEGER_TYPE) ++ { ++ if ( CTreeNodeFirstCode(op1) == C_INT_CST_NODE && c_skip_evaluation == 0) ++ { ++ if (c_tree_is_int_cst_sgn(op1) < 0) ++ { ++ warning ("right shift count is negative"); ++ } ++ else ++ { ++ if ( CTreeIntCstLow(op1) | CTreeIntCstHigh(op1)) ++ { ++ short_shift = 1; ++ } ++ if ( CTreeIntCstHigh(op1) != 0 ++ || ((unsigned int) CTreeIntCstLow(op1) ++ >= CTreeTypePrecision(type0))) ++ { ++ warning ("right shift count >= width of type"); ++ } ++ } ++ } ++ /* Use the type of the value to be shifted. ++ This is what most traditional C compilers do. */ ++ result_type = type0; ++ /* Unless traditional, convert the shift-count to an integer, ++ regardless of size of value being shifted. */ ++ if (! c_flag_traditional) ++ { ++ if (CTreeTypeMainVariant(CTreeType(op1)) != c_integer_type_node) ++ { ++ op1 = c_convert_expr( c_integer_type_node, op1); ++ } ++ /* Avoid converting op1 to result_type later. */ ++ converted = 1; ++ } ++ } ++ break; ++ ++ case C_LSHIFT_EXPR: ++ if (code0 == C_INTEGER_TYPE && code1 == C_INTEGER_TYPE) ++ { ++ if ( CTreeNodeFirstCode(op1) == C_INT_CST_NODE && c_skip_evaluation == 0) ++ { ++ if ( c_tree_is_int_cst_sgn(op1) < 0) ++ { ++ warning ("left shift count is negative"); ++ } ++ else if ( CTreeIntCstHigh(op1) != 0 ++ || ((unsigned int) CTreeIntCstLow(op1) ++ >= CTreeTypePrecision(type0))) ++ { ++ warning ("left shift count >= width of type"); ++ } ++ } ++ /* Use the type of the value to be shifted. ++ This is what most traditional C compilers do. */ ++ result_type = type0; ++ /* Unless traditional, convert the shift-count to an integer, ++ regardless of size of value being shifted. */ ++ if (! c_flag_traditional) ++ { ++ if (CTreeTypeMainVariant(CTreeType(op1)) != c_integer_type_node) ++ op1 = c_convert_expr(c_integer_type_node, op1); ++ /* Avoid converting op1 to result_type later. */ ++ converted = 1; ++ } ++ } ++ break; ++ ++ case C_RROTATE_EXPR: ++ case C_LROTATE_EXPR: ++ if (code0 == C_INTEGER_TYPE && code1 == C_INTEGER_TYPE) ++ { ++ if ( CTreeNodeFirstCode(op1) == C_INT_CST_NODE && c_skip_evaluation == 0) ++ { ++ if (c_tree_is_int_cst_sgn (op1) < 0) ++ { ++ warning ("shift count is negative"); ++ } ++ else if ( CTreeIntCstHigh(op1) != 0 ++ || ((unsigned int) CTreeIntCstLow(op1) ++ >= CTreeTypePrecision(type0))) ++ { ++ warning ("shift count >= width of type"); ++ } ++ } ++ /* Use the type of the value to be shifted. ++ This is what most traditional C compilers do. */ ++ result_type = type0; ++ /* Unless traditional, convert the shift-count to an integer, ++ regardless of size of value being shifted. */ ++ if (! c_flag_traditional) ++ { ++ if (CTreeTypeMainVariant(CTreeType(op1)) != c_integer_type_node) ++ op1 = c_convert_expr(c_integer_type_node, op1); ++ /* Avoid converting op1 to result_type later. */ ++ converted = 1; ++ } ++ } ++ break; ++ ++ case C_EQ_EXPR: ++ case C_NE_EXPR: ++ /* Result of comparison is always int, ++ but don't convert the args to int! */ ++ build_type = c_integer_type_node; ++ if ((code0 == C_INTEGER_TYPE || code0 == C_REAL_TYPE ++ || code0 == C_COMPLEX_TYPE) ++ && (code1 == C_INTEGER_TYPE || code1 == C_REAL_TYPE ++ || code1 == C_COMPLEX_TYPE)) ++ short_compare = 1; ++ else if (code0 == C_POINTER_TYPE && code1 == C_POINTER_TYPE) ++ { ++ c_tree_node *tt0 = CTreeType(type0); ++ c_tree_node *tt1 = CTreeType(type1); ++ /* Anything compares with void *. void * compares with anything. ++ Otherwise, the targets must be compatible ++ and both must be object or both incomplete. */ ++ if ( c_is_comp_target_types(type0, type1)) ++ { ++ result_type = c_get_common_type (type0, type1); ++ } ++ else if (CTreeTypeMainVariant(tt0) == c_void_type_node) ++ { ++ /* op0 != orig_op0 detects the case of something ++ whose value is 0 but which isn't a valid null ptr const. */ ++ if (c_pedantic && (! c_tree_is_integer_zerop(op0) || op0 != orig_op0) ++ && CTreeTypeCode(tt1) == C_FUNCTION_TYPE) ++ { ++ pedwarn ("ANSI C forbids comparison of `void *' with function pointer"); ++ } ++ } ++ else if (CTreeTypeMainVariant(tt1) == c_void_type_node) ++ { ++ if (c_pedantic && (!c_tree_is_integer_zerop(op1) || op1 != orig_op1) ++ && CTreeTypeCode(tt0) == C_FUNCTION_TYPE) ++ { ++ pedwarn ("ANSI C forbids comparison of `void *' with function pointer"); ++ } ++ } ++ else ++ { ++ pedwarn ("comparison of distinct pointer types lacks a cast"); ++ } ++ ++ if (result_type == NULL) ++ result_type = c_ptr_type_node; ++ } ++ else if (code0 == C_POINTER_TYPE && CTreeNodeFirstCode(op1) == C_INT_CST_NODE ++ && c_tree_is_integer_zerop(op1)) ++ result_type = type0; ++ else if (code1 == C_POINTER_TYPE && CTreeNodeFirstCode(op0) == C_INT_CST_NODE ++ && c_tree_is_integer_zerop(op0)) ++ result_type = type1; ++ else if (code0 == C_POINTER_TYPE && code1 == C_INTEGER_TYPE) ++ { ++ result_type = type0; ++ if (! c_flag_traditional) ++ { ++ pedwarn ("comparison between pointer and integer"); ++ } ++ } ++ else if (code0 == C_INTEGER_TYPE && code1 == C_POINTER_TYPE) ++ { ++ result_type = type1; ++ if (! c_flag_traditional) ++ { ++ pedwarn ("comparison between pointer and integer"); ++ } ++ } ++ break; ++ ++ case C_MAX_EXPR: ++ case C_MIN_EXPR: ++ if ((code0 == C_INTEGER_TYPE || code0 == C_REAL_TYPE) ++ && (code1 == C_INTEGER_TYPE || code1 == C_REAL_TYPE)) ++ shorten = 1; ++ else if (code0 == C_POINTER_TYPE && code1 == C_POINTER_TYPE) ++ { ++ if ( c_is_comp_target_types(type0, type1)) ++ { ++ result_type = c_get_common_type(type0, type1); ++ if (c_pedantic ++ && CTreeTypeCode(CTreeType(type0)) == C_FUNCTION_TYPE) ++ { ++ pedwarn ("ANSI C forbids ordered comparisons of pointers to functions"); ++ } ++ } ++ else ++ { ++ result_type = c_ptr_type_node; ++ pedwarn ("comparison of distinct pointer types lacks a cast"); ++ } ++ } ++ break; ++ ++ case C_LE_EXPR: ++ case C_GE_EXPR: ++ case C_LT_EXPR: ++ case C_GT_EXPR: ++ build_type = c_integer_type_node; ++ if ((code0 == C_INTEGER_TYPE || code0 == C_REAL_TYPE) ++ && (code1 == C_INTEGER_TYPE || code1 == C_REAL_TYPE)) ++ short_compare = 1; ++ else if (code0 == C_POINTER_TYPE && code1 == C_POINTER_TYPE) ++ { ++ if ( c_is_comp_target_types(type0, type1)) ++ { ++ result_type = c_get_common_type (type0, type1); ++ if ((CTreeTypeSize(CTreeType(type0)) != 0) ++ != (CTreeTypeSize(CTreeType(type1)) != 0)) ++ { ++ pedwarn ("comparison of complete and incomplete pointers"); ++ } ++ else if (c_pedantic ++ && CTreeTypeCode(CTreeType(type0)) == C_FUNCTION_TYPE) ++ { ++ pedwarn ("ANSI C forbids ordered comparisons of pointers to functions"); ++ } ++ } ++ else ++ { ++ result_type = c_ptr_type_node; ++ pedwarn ("comparison of distinct pointer types lacks a cast"); ++ } ++ } ++ else if (code0 == C_POINTER_TYPE && CTreeNodeFirstCode(op1) == C_INT_CST_NODE ++ && c_tree_is_integer_zerop (op1)) ++ { ++ result_type = type0; ++ if (c_pedantic || c_extra_warnings) ++ { ++ pedwarn ("ordered comparison of pointer with integer zero"); ++ } ++ } ++ else if (code1 == C_POINTER_TYPE && CTreeNodeFirstCode(op0) == C_INT_CST_NODE ++ && c_tree_is_integer_zerop (op0)) ++ { ++ result_type = type1; ++ if (c_pedantic) ++ { ++ pedwarn ("ordered comparison of pointer with integer zero"); ++ } ++ } ++ else if (code0 == C_POINTER_TYPE && code1 == C_INTEGER_TYPE) ++ { ++ result_type = type0; ++ if (! c_flag_traditional) ++ { ++ pedwarn ("comparison between pointer and integer"); ++ } ++ } ++ else if (code0 == C_INTEGER_TYPE && code1 == C_POINTER_TYPE) ++ { ++ result_type = type1; ++ if (! c_flag_traditional) ++ { ++ pedwarn ("comparison between pointer and integer"); ++ } ++ } ++ break; ++ ++ default: ++ break; ++ } ++ ++ if ((code0 == C_INTEGER_TYPE || code0 == C_REAL_TYPE || code0 == C_COMPLEX_TYPE) ++ && ++ (code1 == C_INTEGER_TYPE || code1 == C_REAL_TYPE || code1 == C_COMPLEX_TYPE)) ++ { ++ int none_complex = (code0 != C_COMPLEX_TYPE && code1 != C_COMPLEX_TYPE); ++ ++ if (shorten || common || short_compare) ++ result_type = c_get_common_type (type0, type1); ++ ++ /* For certain operations (which identify themselves by shorten != 0) ++ if both args were extended from the same smaller type, ++ do the arithmetic in that type and then extend. ++ ++ shorten !=0 and !=1 indicates a bitwise operation. ++ For them, this optimization is safe only if ++ both args are zero-extended or both are sign-extended. ++ Otherwise, we might change the result. ++ Eg, (short)-1 | (unsigned short)-1 is (int)-1 ++ but calculated in (unsigned short) it would be (unsigned short)-1. */ ++ ++ if (shorten && none_complex) ++ { ++ int unsigned0, unsigned1; ++ c_tree_node *arg0 = c_get_narrower(op0, &unsigned0); ++ c_tree_node *arg1 = c_get_narrower(op1, &unsigned1); ++ /* UNS is 1 if the operation to be done is an unsigned one. */ ++ int uns = !! CIsTreeNodeUnsigned(result_type); ++ c_tree_node *type; ++ ++ final_type = result_type; ++ ++ /* Handle the case that OP0 (or OP1) does not *contain* a conversion ++ but it *requires* conversion to FINAL_TYPE. */ ++ ++ if (( CTreeTypePrecision(CTreeType(op0)) ++ == CTreeTypePrecision(CTreeType(arg0))) ++ && CTreeType(op0) != final_type) ++ unsigned0 = !!CIsTreeNodeUnsigned(CTreeType(op0)); ++ if (( CTreeTypePrecision(CTreeType(op1)) ++ == CTreeTypePrecision(CTreeType(arg1))) ++ && CTreeType(op1) != final_type) ++ unsigned1 = !!CIsTreeNodeUnsigned(CTreeType(op1)); ++ ++ /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE. */ ++ ++ /* For bitwise operations, signedness of nominal type ++ does not matter. Consider only how operands were extended. */ ++ if (shorten == -1) ++ uns = unsigned0; ++ ++ /* Note that in all three cases below we refrain from optimizing ++ an unsigned operation on sign-extended args. ++ That would not be valid. */ ++ ++ /* Both args variable: if both extended in same way ++ from same width, do it in that width. ++ Do it unsigned if args were zero-extended. */ ++ if ((CTreeTypePrecision(CTreeType(arg0)) ++ < CTreeTypePrecision(result_type)) ++ && (CTreeTypePrecision(CTreeType(arg1)) ++ == CTreeTypePrecision(CTreeType(arg0))) ++ && unsigned0 == unsigned1 ++ && (unsigned0 || !uns)) ++ result_type ++ = c_get_signed_or_unsigned_type(unsigned0, ++ c_get_common_type (CTreeType(arg0), CTreeType(arg1))); ++ else if ( CTreeNodeFirstCode(arg0) == C_INT_CST_NODE ++ && (unsigned1 || !uns) ++ && ( CTreeTypePrecision(CTreeType(arg1)) ++ < CTreeTypePrecision(result_type)) ++ && (type = c_get_signed_or_unsigned_type(unsigned1, CTreeType(arg1)), ++ c_int_fits_type_p (arg0, type))) ++ result_type = type; ++ else if ( CTreeNodeFirstCode(arg1) == C_INT_CST_NODE ++ && (unsigned0 || !uns) ++ && ( CTreeTypePrecision(CTreeType(arg0)) ++ < CTreeTypePrecision(result_type)) ++ && (type = c_get_signed_or_unsigned_type(unsigned0, CTreeType(arg0)), ++ c_int_fits_type_p (arg1, type))) ++ result_type = type; ++ } ++ ++ /* Shifts can be shortened if shifting right. */ ++ ++ if (short_shift) ++ { ++ int unsigned_arg; ++ c_tree_node *arg0 = c_get_narrower(op0, &unsigned_arg); ++ ++ final_type = result_type; ++ ++ if (arg0 == op0 && final_type == CTreeType(op0)) ++ unsigned_arg = !!CIsTreeNodeUnsigned(CTreeType(op0)); ++ ++ if (CTreeTypePrecision(CTreeType(arg0)) < CTreeTypePrecision(result_type) ++ /* We can shorten only if the shift count is less than the ++ number of bits in the smaller type size. */ ++ && CTreeIntCstHigh(op1) == 0 ++ && CTreeTypePrecision(CTreeType(arg0)) > CTreeIntCstLow(op1) ++ /* If arg is sign-extended and then unsigned-shifted, ++ we can simulate this with a signed shift in arg's type ++ only if the extended result is at least twice as wide ++ as the arg. Otherwise, the shift could use up all the ++ ones made by sign-extension and bring in zeros. ++ We can't optimize that case at all, but in most machines ++ it never happens because available widths are 2**N. */ ++ && (! CIsTreeNodeUnsigned(final_type) ++ || unsigned_arg ++ || 2 * CTreeTypePrecision(CTreeType(arg0)) <= CTreeTypePrecision(result_type))) ++ { ++ /* Do an unsigned shift if the operand was zero-extended. */ ++ result_type ++ = c_get_signed_or_unsigned_type(unsigned_arg, CTreeType(arg0)); ++ /* Convert value-to-be-shifted to that type. */ ++ if (CTreeType(op0) != result_type) ++ op0 = c_convert_expr(result_type, op0); ++ converted = 1; ++ } ++ } ++ ++ /* Comparison operations are shortened too but differently. ++ They identify themselves by setting short_compare = 1. */ ++ ++ if (short_compare) ++ { ++ /* Don't write &op0, etc., because that would prevent op0 ++ from being kept in a register. ++ Instead, make copies of the our local variables and ++ pass the copies by reference, then copy them back afterward. */ ++ c_tree_node *xop0 = op0; ++ c_tree_node *xop1 = op1; ++ c_tree_node *xresult_type = result_type; ++ int xresultcode = resultcode; ++ c_tree_node *val ++ = c_shorten_compare(&xop0, &xop1, &xresult_type, &xresultcode); ++ if (val != 0) ++ return val; ++ op0 = xop0, op1 = xop1; ++ converted = 1; ++ resultcode = xresultcode; ++ ++ if ((c_warn_sign_compare < 0 ? c_extra_warnings : c_warn_sign_compare != 0) ++ && c_skip_evaluation == 0) ++ { ++ int op0_signed = ! CIsTreeNodeUnsigned(CTreeType(orig_op0)); ++ int op1_signed = ! CIsTreeNodeUnsigned(CTreeType(orig_op1)); ++ ++ int unsignedp0, unsignedp1; ++ c_tree_node *primop0 = c_get_narrower(op0, &unsignedp0); ++ c_tree_node *primop1 = c_get_narrower(op1, &unsignedp1); ++ ++ /* Avoid spurious warnings for comparison with enumerators. */ ++ ++ xop0 = orig_op0; ++ xop1 = orig_op1; ++ CStripTypeNops(xop0); ++ CStripTypeNops(xop1); ++ ++ /* Give warnings for comparisons between signed and unsigned ++ quantities that may fail. */ ++ /* Do the checking based on the original operand trees, so that ++ casts will be considered, but default promotions won't be. */ ++ ++ /* Do not warn if the comparison is being done in a signed type, ++ since the signed type will only be chosen if it can represent ++ all the values of the unsigned type. */ ++ if (! CIsTreeNodeUnsigned(result_type)) ++ /* OK */; ++ /* Do not warn if both operands are unsigned. */ ++ else if (op0_signed == op1_signed) ++ /* OK */; ++ /* Do not warn if the signed quantity is an unsuffixed ++ integer literal (or some static constant expression ++ involving such literals) and it is non-negative. */ ++ else if ((op0_signed && CTreeNodeFirstCode(xop0) == C_INT_CST_NODE ++ && c_tree_is_int_cst_sgn(xop0) >= 0) ++ || (op1_signed && CTreeNodeFirstCode(xop1) == C_INT_CST_NODE ++ && c_tree_is_int_cst_sgn(xop1) >= 0)) ++ /* OK */; ++ /* Do not warn if the comparison is an equality operation, ++ the unsigned quantity is an integral constant and it does ++ not use the most significant bit of result_type. */ ++ else if ((resultcode == C_EQ_EXPR || resultcode == C_NE_EXPR) ++ && ((op0_signed && CTreeNodeFirstCode(xop1) == C_INT_CST_NODE ++ && c_int_fits_type_p(xop1, c_get_signed_type(result_type))) ++ || (op1_signed && CTreeNodeFirstCode(xop0) == C_INT_CST_NODE ++ && c_int_fits_type_p(xop0, c_get_signed_type(result_type))))) ++ /* OK */; ++ else ++ { ++ warning ("comparison between signed and unsigned"); ++ } ++ ++ /* Warn if two unsigned values are being compared in a size ++ larger than their original size, and one (and only one) is the ++ result of a `~' operator. This comparison will always fail. ++ ++ Also warn if one operand is a constant, and the constant ++ does not have all bits set that are set in the ~ operand ++ when it is extended. */ ++ ++ if (( CTreeNodeFirstCode(primop0) == C_EXPR_NODE && ++ CTreeExprCode(primop0) == C_BIT_NOT_EXPR) ++ != ++ ( CTreeNodeFirstCode(primop0) == C_EXPR_NODE && ++ CTreeExprCode(primop1) == C_BIT_NOT_EXPR )) ++ { ++ if ( CTreeNodeFirstCode(primop0) == C_EXPR_NODE && ++ CTreeExprCode(primop0) == C_BIT_NOT_EXPR) ++ primop0 = c_get_narrower(CTreeExprOperand (primop0, 0), ++ &unsignedp0); ++ else ++ primop1 = c_get_narrower(CTreeExprOperand (primop1, 0), ++ &unsignedp1); ++ ++ if ( CTreeNodeFirstCode(primop0) == C_INT_CST_NODE ++ || CTreeNodeFirstCode(primop1) == C_INT_CST_NODE) ++ { ++ c_tree_node *primop; ++ long constant, mask; ++ int unsignedp, bits; ++ ++ if ( CTreeNodeFirstCode(primop0) == C_INT_CST_NODE) ++ { ++ primop = primop1; ++ unsignedp = unsignedp1; ++ constant = CTreeIntCstLow(primop0); ++ } ++ else ++ { ++ primop = primop0; ++ unsignedp = unsignedp0; ++ constant = CTreeIntCstLow(primop1); ++ } ++ ++ bits = CTreeTypePrecision(CTreeType(primop)); ++ if (bits < CTreeTypePrecision(result_type) ++ && bits < C_HOST_BITS_PER_LONG && unsignedp) ++ { ++ mask = (~0L) << bits; ++ if ((mask & constant) != mask) ++ { ++ warning ("comparison of promoted ~unsigned with constant"); ++ } ++ } ++ } ++ else if (unsignedp0 && unsignedp1 ++ && (CTreeTypePrecision(CTreeType(primop0)) ++ < CTreeTypePrecision(result_type)) ++ && (CTreeTypePrecision(CTreeType(primop1)) ++ < CTreeTypePrecision(result_type))) ++ { ++ warning ("comparison of promoted ~unsigned with unsigned"); ++ } ++ } ++ } ++ } ++ } ++ ++ /* At this point, RESULT_TYPE must be nonzero to avoid an error message. ++ If CONVERTED is zero, both args will be converted to type RESULT_TYPE. ++ Then the expression will be built. ++ It will be given type FINAL_TYPE if that is nonzero; ++ otherwise, it will be given type RESULT_TYPE. */ ++ ++ if (!result_type) ++ { ++ c_binary_op_error(code); ++ return c_error_mark_node; ++ } ++ ++ if (! converted) ++ { ++ if (CTreeType(op0) != result_type) ++ op0 = c_convert_expr(result_type, op0); ++ if (CTreeType(op1) != result_type) ++ op1 = c_convert_expr(result_type, op1); ++ } ++ ++ if (build_type == NULL) ++ build_type = result_type; ++ ++ { ++ c_tree_node *result; ++ c_tree_node *folded; ++ ++ result = c_tree_build_binary_expr(resultcode, op0, op1); ++ CTreeType( result ) = result_type; ++ ++ ++ folded = c_fold (result); ++ if (folded == result) ++ { ++ if ( CIsTreeNodeConstant( op0 ) && ++ CIsTreeNodeConstant( op1 ) ) ++ { ++ CSetTreeNodeConstant( folded ); ++ } ++ } ++ if (final_type != 0) ++ { ++ return c_convert_expr(final_type, folded); ++ } ++ return folded; ++ } ++} ++ ++ ++/* This is the entry point used by the parser ++ for binary operators in the input. ++ In addition to constructing the expression, ++ we check for operands that were written with other binary operators ++ in a way that is likely to confuse the user. */ ++ ++c_tree_node *c_parser_build_binary_op(code, arg1, arg2) ++ int code; ++ c_tree_node *arg1; ++ c_tree_node *arg2; ++{ ++ c_tree_node *result = c_build_binary_op(code, arg1, arg2, 1); ++ ++# ifdef LUDO_NO_SKIP ++ char class; ++ char class1 = TREE_CODE_CLASS (TREE_CODE (arg1)); ++ char class2 = TREE_CODE_CLASS (TREE_CODE (arg2)); ++ int code1 = C_ERROR_NODE; ++ int code2 = C_ERROR_NODE; ++ ++ if (class1 == 'e' || class1 == '1' ++ || class1 == '2' || class1 == '<') ++ code1 = CTreeExprComplexity(arg1); ++ if (class2 == 'e' || class2 == '1' ++ || class2 == '2' || class2 == '<') ++ code2 = CTreeExprComplexity(arg2); ++ ++ /* Check for cases such as x+y<= CTreeTypePrecision(CTreeType(CTreeExprOperand(value, 0))))) ++ return c_is_initializer_constant_valid_p(CTreeExprOperand(value, 0), ++ endtype); ++ ++ /* Likewise conversions from int to pointers. */ ++ if ( CTreeTypeCode(CTreeType(value)) == C_POINTER_TYPE ++ && CTreeTypeCode(CTreeType(CTreeExprOperand(value, 0))) == C_INTEGER_TYPE ++ && (CTreeTypePrecision(CTreeType(value)) ++ <= CTreeTypePrecision(CTreeType(CTreeExprOperand(value, 0))))) ++ return c_is_initializer_constant_valid_p(CTreeExprOperand(value, 0), ++ endtype); ++ ++ /* Allow conversions to union types if the value inside is okay. */ ++ if ( CTreeTypeCode(CTreeType(value)) == C_UNION_TYPE) ++ return c_is_initializer_constant_valid_p(CTreeExprOperand(value, 0), ++ endtype); ++ return 0; ++ ++ case C_PLUS_EXPR: ++ if ( CTreeTypeCode(endtype) == C_INTEGER_TYPE ++ && CTreeTypePrecision(endtype) < C_POINTER_SIZE) ++ return 0; ++ { ++ c_tree_node *valid0 = c_is_initializer_constant_valid_p(CTreeExprOperand(value, 0), ++ endtype); ++ c_tree_node *valid1 = c_is_initializer_constant_valid_p(CTreeExprOperand(value, 1), ++ endtype); ++ /* If either term is absolute, use the other terms relocation. */ ++ if (valid0 == c_null_pointer_node) ++ return valid1; ++ if (valid1 == c_null_pointer_node) ++ return valid0; ++ return 0; ++ } ++ ++ case C_MINUS_EXPR: ++ if ( CTreeTypeCode(endtype) == C_INTEGER_TYPE ++ && CTreeTypePrecision(endtype) < C_POINTER_SIZE) ++ return 0; ++ { ++ c_tree_node *valid0 = c_is_initializer_constant_valid_p(CTreeExprOperand(value, 0), ++ endtype); ++ c_tree_node *valid1 = c_is_initializer_constant_valid_p(CTreeExprOperand(value, 1), ++ endtype); ++ /* Win if second argument is absolute. */ ++ if (valid1 == c_null_pointer_node) ++ return valid0; ++ /* Win if both arguments have the same relocation. ++ Then the value is absolute. */ ++ if (valid0 == valid1) ++ return c_null_pointer_node; ++ return 0; ++ } ++ ++ default: ++ return 0; ++ } ++ } ++ ++ return 0; ++} ++ ++ ++/* If VALUE is a compound expr all of whose expressions are constant, then ++ return its value. Otherwise, return error_mark_node. ++ ++ This is for handling COMPOUND_EXPRs as initializer elements ++ which is allowed with a warning when -pedantic is specified. */ ++ ++static c_tree_node *c_is_valid_compound_expr_initializer(value, endtype) ++ c_tree_node *value; ++ c_tree_node *endtype; ++{ ++ if ( CTreeExprCode(value) == C_COMPOUND_EXPR) ++ { ++ if ( c_is_valid_compound_expr_initializer(CTreeExprOperand(value, 0), endtype) ++ == c_error_mark_node) ++ return c_error_mark_node; ++ return c_is_valid_compound_expr_initializer(CTreeExprOperand (value, 1), endtype); ++ } ++ else if (! CIsTreeNodeConstant(value) ++ && ! c_is_initializer_constant_valid_p(value, endtype)) ++ return c_error_mark_node; ++ else ++ return value; ++} ++ ++/* Digest the parser output INIT as an initializer for type TYPE. ++ Return a C expression of type TYPE to represent the initial value. ++ ++ The arguments REQUIRE_CONSTANT and CONSTRUCTOR_CONSTANT request errors ++ if non-constant initializers or elements are seen. CONSTRUCTOR_CONSTANT ++ applies only to elements of constructors. */ ++ ++static c_tree_node *c_digest_init( type, init, require_constant, constructor_constant ) ++ c_tree_node *type; ++ c_tree_node *init; ++ int require_constant, constructor_constant; ++{ ++ int code = CTreeTypeCode(type); ++ c_tree_node *inside_init = init; ++ ++ if (init == c_error_mark_node) ++ return init; ++ ++ /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ ++ /* Do not use STRIP_NOPS here. We do not want an enumerator ++ whose value is 0 to count as a null pointer constant. */ ++ if ( CTreeExprCode(init) == C_NON_LVALUE_EXPR) ++ { ++ inside_init = CTreeExprOperand (init, 0); ++ } ++ ++ /* Initialization of an array of chars from a string constant ++ optionally enclosed in braces. */ ++ ++ if (code == C_ARRAY_TYPE) ++ { ++ c_tree_node *typ1 = CTreeTypeMainVariant(CTreeType(type)); ++ if ((typ1 == c_char_type_node ++ || typ1 == c_signed_char_type_node ++ || typ1 == c_unsigned_char_type_node ++ || typ1 == c_unsigned_wchar_type_node ++ || typ1 == c_signed_wchar_type_node) ++ && ((inside_init && CTreeNodeFirstCode(inside_init) == C_STRING_NODE))) ++ { ++ if (c_is_comptypes(CTreeTypeMainVariant(CTreeType(inside_init)), ++ CTreeTypeMainVariant(type))) ++ { ++ return inside_init; ++ } ++ ++ if ((CTreeTypeMainVariant(CTreeType(CTreeType(inside_init))) ++ != c_char_type_node) ++ && CTreeTypePrecision(typ1) == CTreeTypePrecision(c_char_type_node)) ++ { ++ error("char-array initialized from wide string" ); ++ return c_error_mark_node; ++ } ++ if ((CTreeTypeMainVariant(CTreeType(CTreeType(inside_init))) ++ == c_char_type_node) ++ && CTreeTypePrecision(typ1) != CTreeTypePrecision(c_char_type_node)) ++ { ++ error("int-array initialized from non-wide string"); ++ return c_error_mark_node; ++ } ++ ++ CTreeType(inside_init) = type; ++ if ( CTreeTypeValues(type) != 0 ++ && CTreeNodeFirstCode(CTreeTypeSize(type)) == C_INT_CST_NODE) ++ { ++ register int size = CTreeIntCstLow(CTreeTypeSize(type)); ++ size = (size + C_BITS_PER_UNIT - 1) / C_BITS_PER_UNIT; ++ /* Subtract 1 (or sizeof (wchar_t)) ++ because it's ok to ignore the terminating null char ++ that is counted in the length of the constant. */ ++ if (size < CTreeStringLength(inside_init) ++ - (CTreeTypePrecision(typ1) != CTreeTypePrecision(c_char_type_node) ++ ? CTreeTypePrecision(c_wchar_type_node) / C_BITS_PER_UNIT ++ : 1)) ++ pedwarn( "initializer-string for array of chars is too long"); ++ } ++ return inside_init; ++ } ++ } ++ ++ /* Any type can be initialized ++ from an expression of the same type, optionally with braces. */ ++ ++ if (inside_init && CTreeType(inside_init) != 0 ++ && (c_is_comptypes(CTreeTypeMainVariant(CTreeType(inside_init)), ++ CTreeTypeMainVariant(type)) ++ || (code == C_ARRAY_TYPE ++ && c_is_comptypes(CTreeType(inside_init), type)) ++ || (code == C_POINTER_TYPE ++ && ( CTreeNodeFirstCode(CTreeType(inside_init)) == C_ARRAY_TYPE ++ || CTreeNodeFirstCode(CTreeType(inside_init)) == C_FUNCTION_TYPE) ++ && c_is_comptypes(CTreeType(CTreeType(inside_init)), ++ CTreeType(type))))) ++ { ++ if (code == C_POINTER_TYPE ++ && ( CTreeNodeFirstCode(CTreeType(inside_init)) == C_ARRAY_TYPE ++ || CTreeNodeFirstCode(CTreeType(inside_init)) == C_FUNCTION_TYPE)) ++ { ++ inside_init = c_default_conversion(inside_init); ++ } ++ else if (code == C_ARRAY_TYPE && CTreeNodeFirstCode(inside_init) != C_STRING_NODE ++ && ++ ( CTreeNodeFirstCode(inside_init) != C_EXPR_NODE || ++ CTreeExprCode(inside_init) != C_CONVERT_EXPR) ) ++ { ++ error("array initialized from non-constant array expression" ); ++ return c_error_mark_node; ++ } ++ ++# ifdef LUDO_DONE ++ if (optimize && CTreeDeclCode(inside_init) == C_VAR_DECL) ++ { ++ inside_init = c_decl_constant_value(inside_init); ++ } ++# endif ++ ++ /* Compound expressions can only occur here if -pedantic or ++ -pedantic-errors is specified. In the later case, we always want ++ an error. In the former case, we simply want a warning. */ ++ if (require_constant && c_pedantic ++ && CTreeExprCode(inside_init) == C_COMPOUND_EXPR) ++ { ++ inside_init ++ = c_is_valid_compound_expr_initializer(inside_init, ++ CTreeType(inside_init)); ++ if (inside_init == c_error_mark_node) ++ { ++ error("initializer element is not constant"); ++ } ++ else ++ { ++ pedwarn("initializer element is not constant" ); ++ } ++ ++ if (c_flag_pedantic_errors) ++ { ++ inside_init = c_error_mark_node; ++ } ++ } ++ else if (require_constant && ! CIsTreeNodeConstant(inside_init)) ++ { ++ error("initializer element is not constant" ); ++ inside_init = c_error_mark_node; ++ } ++ else if (require_constant ++ && c_is_initializer_constant_valid_p(inside_init, CTreeType(inside_init)) == 0) ++ { ++ error("initializer element is not computable at load time" ); ++ inside_init = c_error_mark_node; ++ } ++ ++ return inside_init; ++ } ++ ++ /* Handle scalar types, including conversions. */ ++ ++ if (code == C_INTEGER_TYPE || code == C_REAL_TYPE || code == C_POINTER_TYPE ++ || code == C_ENUMERAL_TYPE || code == C_COMPLEX_TYPE) ++ { ++ /* Note that convert_for_assignment calls default_conversion ++ for arrays and functions. We must not call it in the ++ case where inside_init is a null pointer constant. */ ++ inside_init ++ = c_convert_for_assignment(type, init, "initialization", NULL, NULL, 0); ++ ++ if (require_constant && ! CIsTreeNodeConstant(inside_init)) ++ { ++ error("initializer element is not constant" ); ++ inside_init = c_error_mark_node; ++ } ++ else if (require_constant ++ && c_is_initializer_constant_valid_p(inside_init, CTreeType(inside_init)) == 0) ++ { ++ error("initializer element is not computable at load time" ); ++ inside_init = c_error_mark_node; ++ } ++ ++ return inside_init; ++ } ++ ++ /* Come here only for records and arrays. */ ++ ++ if (CTreeTypeSize(type) && CTreeNodeFirstCode(CTreeTypeSize(type)) != C_INT_CST_NODE) ++ { ++ error("variable-sized object may not be initialized" ); ++ return c_error_mark_node; ++ } ++ ++ /* Traditionally, you can write struct foo x = 0; ++ and it initializes the first element of x to 0. */ ++ if (c_flag_traditional) ++ { ++ c_tree_node *top = 0; ++ c_tree_node *prev = 0; ++ c_tree_node *otype = type; ++ ++ while ( CTreeTypeCode(type) == C_RECORD_TYPE ++ || CTreeTypeCode(type) == C_ARRAY_TYPE ++ || CTreeTypeCode(type) == C_QUAL_UNION_TYPE ++ || CTreeTypeCode(type) == C_UNION_TYPE) ++ { ++ c_tree_node *temp = c_tree_build_unary_expr( C_CONSTRUCTOR_EXPR, NULL ); ++ CTreeType( temp ) = type; ++ ++ if (prev == 0) ++ { ++ top = temp; ++ } ++ else ++ { ++ CTreeExprOperand(prev, 1) = c_tree_build_list(NULL, temp); ++ } ++ prev = temp; ++ if ( CTreeTypeCode(type) == C_ARRAY_TYPE) ++ { ++ type = CTreeType(type); ++ } ++ else if ( CTreeTypeValues(type)) ++ { ++ type = CTreeType( CTreeTypeValues(type)); ++ } ++ else ++ { ++ error("invalid initializer" ); ++ return c_error_mark_node; ++ } ++ } ++ ++ if (otype != type) ++ { ++ CTreeExprOperand(prev, 1) ++ = c_tree_build_list( NULL, ++ c_digest_init(type, init, require_constant, ++ constructor_constant)); ++ return top; ++ } ++ else ++ return c_error_mark_node; ++ } ++ error("invalid initializer"); ++ return c_error_mark_node; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Store Init Value | ++| | ++\------------------------------------------------------------*/ ++ ++ ++/* Perform appropriate conversions on the initial value of a variable, ++ store it in the declaration DECL, ++ and print any error messages that are appropriate. ++ If the init is invalid, store an ERROR_MARK. */ ++ ++void c_store_init_value (decl, init) ++ ++ c_tree_node *decl; ++ c_tree_node *init; ++{ ++ c_tree_node *value; ++ c_tree_node *type; ++ ++ /* If variable's type was invalidly declared, just ignore it. */ ++ ++ type = CTreeType(decl); ++ if ( CTreeNodeFirstCode(type) == C_ERROR_NODE) return; ++ ++ /* Digest the specified initializer into an expression. */ ++ ++ value = c_digest_init(type, init, CIsTreeNodeStatic(decl), ++ CIsTreeNodeStatic(decl) || c_pedantic); ++ ++ /* Store the expression if valid; else report error. */ ++ CTreeDeclInitial(decl) = value; ++ ++ /* ANSI wants warnings about out-of-range constant initializers. */ ++ CStripTypeNops(value); ++ c_constant_expression_warning(value); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Get Signed Or Unsigned Type | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return a type the same as TYPE except unsigned or ++ signed according to UNSIGNEDP. */ ++ ++c_tree_node *c_get_signed_or_unsigned_type( unsignedp, type ) ++ int unsignedp; ++ c_tree_node *type; ++{ ++ int Precision; ++ ++ if ((! INTEGRAL_TYPE_P (type) && ! POINTER_TYPE_P (type)) ++ || !!CIsTreeNodeUnsigned(type) == unsignedp) ++ return type; ++ ++ Precision = CTreeTypePrecision(type); ++ ++ if ( Precision == CTreeTypePrecision( c_signed_char_type_node)) ++ { ++ return unsignedp ? c_unsigned_char_type_node : c_signed_char_type_node; ++ } ++ if ( Precision == CTreeTypePrecision( c_integer_type_node)) ++ { ++ return unsignedp ? c_unsigned_type_node : c_integer_type_node; ++ } ++ if ( Precision == CTreeTypePrecision( c_short_integer_type_node)) ++ { ++ return unsignedp ? c_short_unsigned_type_node : c_short_integer_type_node; ++ } ++ if ( Precision == CTreeTypePrecision( c_long_integer_type_node)) ++ { ++ return unsignedp ? c_long_unsigned_type_node : c_long_integer_type_node; ++ } ++ if ( Precision == CTreeTypePrecision( c_long_long_integer_type_node)) ++ { ++ return (unsignedp ? c_long_long_unsigned_type_node : c_long_long_integer_type_node); ++ } ++ ++ return type; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Get Signed Type | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return a signed type the same as TYPE in other respects. */ ++ ++c_tree_node *c_get_signed_type( type ) ++ ++ c_tree_node *type; ++{ ++ c_tree_node *type1 = CTreeTypeMainVariant(type); ++ ++ if (type1 == c_unsigned_char_type_node || type1 == c_char_type_node) ++ return c_signed_char_type_node; ++ if (type1 == c_unsigned_type_node) ++ return c_integer_type_node; ++ if (type1 == c_short_unsigned_type_node) ++ return c_short_integer_type_node; ++ if (type1 == c_long_unsigned_type_node) ++ return c_long_integer_type_node; ++ if (type1 == c_long_long_unsigned_type_node) ++ return c_long_long_integer_type_node; ++# ifdef LUDO_NO_SKIP ++ if (type1 == c_unsigned_intDI_type_node) ++ return c_intDI_type_node; ++ if (type1 == c_unsigned_intSI_type_node) ++ return c_intSI_type_node; ++ if (type1 == c_unsigned_intHI_type_node) ++ return c_intHI_type_node; ++ if (type1 == c_unsigned_intQI_type_node) ++ return c_intQI_type_node; ++# endif ++ ++ return c_get_signed_or_unsigned_type(0, type); ++} ++ ++/* Return an unsigned type the same as TYPE in other respects. */ ++ ++c_tree_node *c_get_unsigned_type( type ) ++ ++ c_tree_node *type; ++{ ++ c_tree_node *type1 = CTreeTypeMainVariant(type); ++ ++ if (type1 == c_signed_char_type_node || type1 == c_char_type_node) ++ return c_unsigned_char_type_node; ++ if (type1 == c_integer_type_node) ++ return c_unsigned_type_node; ++ if (type1 == c_short_integer_type_node) ++ return c_short_unsigned_type_node; ++ if (type1 == c_long_integer_type_node) ++ return c_long_unsigned_type_node; ++ if (type1 == c_long_long_integer_type_node) ++ return c_long_long_unsigned_type_node; ++# ifdef LUDO_NO_SKIP ++ if (type1 == intDI_type_node) ++ return unsigned_intDI_type_node; ++ if (type1 == intSI_type_node) ++ return unsigned_intSI_type_node; ++ if (type1 == intHI_type_node) ++ return unsigned_intHI_type_node; ++ if (type1 == intQI_type_node) ++ return unsigned_intQI_type_node; ++# endif ++ ++ return c_get_signed_or_unsigned_type(1, type); ++} ++ ++/* Nonzero if integer constant C has a value that is permissible ++ for type TYPE (an INTEGER_TYPE). */ ++ ++int c_int_fits_type_p(c, type) ++ c_tree_node *c; ++ c_tree_node *type; ++{ ++ if (CIsTreeNodeUnsigned(type)) ++ { ++ return (! (CTreeNodeFirstCode( CTreeTypeMaxValue(type)) == C_INT_CST_NODE ++ && INT_CST_LT_UNSIGNED( CTreeTypeMaxValue(type), c)) ++ && ! ( CTreeNodeFirstCode( CTreeTypeMinValue(type)) == C_INT_CST_NODE ++ && INT_CST_LT_UNSIGNED(c, CTreeTypeMinValue(type))) ++ /* Negative ints never fit unsigned types. */ ++ && ! ( CTreeIntCstHigh(c) < 0 ++ && ! CIsTreeNodeUnsigned( CTreeType(c)))); ++ } ++ else ++ { ++ return (! ( CTreeNodeFirstCode(CTreeTypeMaxValue(type)) == C_INT_CST_NODE ++ && INT_CST_LT( CTreeTypeMaxValue(type), c)) ++ && ! ( CTreeNodeFirstCode( CTreeTypeMinValue(type)) == C_INT_CST_NODE ++ && INT_CST_LT(c, CTreeTypeMinValue(type))) ++ /* Unsigned ints with top bit set never fit signed types. */ ++ && ! ( CTreeIntCstHigh(c) < 0 ++ && CIsTreeNodeUnsigned(CTreeType(c)))); ++ } ++} ++ ++/* Return an integer type with BITS bits of precision, ++ that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */ ++ ++c_tree_node *c_get_type_for_size( bits, unsignedp ) ++ unsigned bits; ++ int unsignedp; ++{ ++ if (bits == CTreeTypePrecision( c_integer_type_node)) ++ return unsignedp ? c_unsigned_type_node : c_integer_type_node; ++ ++ if (bits == CTreeTypePrecision( c_signed_char_type_node)) ++ return unsignedp ? c_unsigned_char_type_node : c_signed_char_type_node; ++ ++ if (bits == CTreeTypePrecision( c_short_integer_type_node)) ++ return unsignedp ? c_short_unsigned_type_node : c_short_integer_type_node; ++ ++ if (bits == CTreeTypePrecision( c_long_integer_type_node)) ++ return unsignedp ? c_long_unsigned_type_node : c_long_integer_type_node; ++ ++ if (bits == CTreeTypePrecision( c_long_long_integer_type_node)) ++ return (unsignedp ? c_long_long_unsigned_type_node ++ : c_long_long_integer_type_node); ++ ++# ifdef LUDO_NO_SKIP ++ if (bits <= CTreeTypePrecision(intQI_type_node)) ++ return unsignedp ? unsigned_intQI_type_node : intQI_type_node; ++ ++ if (bits <= CTreeTypePrecision(intHI_type_node)) ++ return unsignedp ? unsigned_intHI_type_node : intHI_type_node; ++ ++ if (bits <= CTreeTypePrecision(intSI_type_node)) ++ return unsignedp ? unsigned_intSI_type_node : intSI_type_node; ++ ++ if (bits <= CTreeTypePrecision(intDI_type_node)) ++ return unsignedp ? unsigned_intDI_type_node : intDI_type_node; ++# endif ++ ++ return (c_tree_node *)0; ++} ++ ++/* Return the precision of a type, for arithmetic purposes. ++ Supports all types on which arithmetic is possible ++ (including pointer types). ++ It's not clear yet what will be right for complex types. */ ++ ++int c_type_precision(type) ++ ++ c_tree_node *type; ++{ ++ int TypeType; ++ ++ TypeType = CTreeTypeCode( type ); ++ ++ return (( TypeType == C_INTEGER_TYPE || ++ TypeType == C_ENUMERAL_TYPE || ++ TypeType == C_REAL_TYPE) ++ ? CTreeTypePrecision(type) : C_POINTER_TYPE_SIZE); ++} ++ ++/* Make a variant type in the proper way for C/C++, propagating qualifiers ++ down to the element type of an array. */ ++ ++c_tree_node *c_c_build_type_variant(type, constp, volatilep) ++ c_tree_node *type; ++ int constp, volatilep; ++{ ++ if ( CTreeTypeCode(type) == C_ARRAY_TYPE) ++ { ++ return c_tree_build_array_type( ++ c_c_build_type_variant( CTreeType(type), constp, volatilep), ++ CTreeTypeValues(type)); ++ } ++ return c_tree_build_type_variant(type, constp, volatilep); ++} ++ ++ ++/* Within a struct initializer, specify the next field to be initialized. */ ++ ++void c_set_init_label(fieldname) ++ ++ c_tree_node *fieldname; ++{ ++ c_tree_node *tail; ++ int passed = 0; ++ ++ /* Don't die if an entire brace-pair level is superfluous ++ in the containing level. */ ++ if (c_constructor_type == 0) return; ++ ++ for (tail = CTreeTypeValues(c_constructor_type); tail; ++ tail = CTreeChain(tail)) ++ { ++ if (tail == c_constructor_unfilled_fields) ++ { ++ passed = 1; ++ } ++ if (CTreeDeclName(tail) == fieldname) break; ++ } ++ ++ if (tail == 0) ++ { ++ error ("unknown field `%s' specified in initializer", CTreeIdentPointer(fieldname)); ++ } ++ else if (!passed) ++ { ++ error ("field `%s' already initialized", CTreeIdentPointer(fieldname)); ++ } ++ else ++ { ++ c_constructor_fields = tail; ++ ++ if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids specifying structure member to initialize"); ++ } ++ } ++} ++ ++ ++/* Within an array initializer, specify the next index to be initialized. ++ FIRST is that index. If LAST is nonzero, then initialize a range ++ of indices, running from FIRST through LAST. */ ++ ++void c_set_init_index(first, last) ++ c_tree_node *first; ++ c_tree_node *last; ++{ ++ while (( CTreeExprCode(first) == C_NOP_EXPR ++ || CTreeExprCode(first) == C_CONVERT_EXPR ++ || CTreeExprCode(first) == C_NON_LVALUE_EXPR) ++ && (CTreeTypeMode(CTreeType(first)) ++ == CTreeTypeMode(CTreeType( CTreeExprOperand(first, 0))))) ++ { ++ (first) = CTreeExprOperand(first, 0); ++ } ++ ++ if (last) ++ { ++ while (( CTreeExprCode(last) == C_NOP_EXPR ++ || CTreeExprCode(last) == C_CONVERT_EXPR ++ || CTreeExprCode(last) == C_NON_LVALUE_EXPR) ++ && (CTreeTypeMode(CTreeType(last)) ++ == CTreeTypeMode(CTreeType( CTreeExprOperand(last, 0))))) ++ { ++ (last) = CTreeExprOperand(last, 0); ++ } ++ } ++ ++ if ( CTreeNodeFirstCode(first) != C_INT_CST_NODE) ++ { ++ error("nonconstant array index in initializer"); ++ } ++ else if (last != 0 && CTreeNodeFirstCode(last) != C_INT_CST_NODE) ++ { ++ error("nonconstant array index in initializer" ); ++ } ++ else if (! c_constructor_unfilled_index) ++ { ++ error("array index in non-array initializer" ); ++ } ++ else if (c_tree_is_int_cst_lt(first, c_constructor_unfilled_index)) ++ { ++ error("duplicate array index in initializer" ); ++ } ++ else ++ { ++ CTreeIntCstLow(c_constructor_index) = CTreeIntCstLow(first); ++ CTreeIntCstHigh(c_constructor_index) = CTreeIntCstHigh(first); ++ ++ if (last != 0 && c_tree_is_int_cst_lt(last, first)) ++ { ++ error("empty index range in initializer" ); ++ } ++ else ++ { ++ if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids specifying element to initialize"); ++ } ++ ++ c_constructor_range_end = last; ++ } ++ } ++} ++ ++ ++/* Build an expression representing a cast to type TYPE of expression EXPR. */ ++ ++c_tree_node *c_build_c_cast(type, expr) ++ ++ c_tree_node *type; ++ c_tree_node *expr; ++{ ++ c_tree_node *value = expr; ++ ++ if (type == c_error_mark_node || expr == c_error_mark_node) ++ { ++ return c_error_mark_node; ++ } ++ ++ type = CTreeTypeMainVariant(type); ++ ++ if ( CTreeTypeCode(type) == C_ARRAY_TYPE) ++ { ++ error ("cast specifies array type"); ++ return c_error_mark_node; ++ } ++ ++ if ( CTreeTypeCode(type) == C_FUNCTION_TYPE) ++ { ++ error ("cast specifies function type"); ++ return c_error_mark_node; ++ } ++ ++ if (type == CTreeType(value)) ++ { ++ if (c_pedantic) ++ { ++ if ( CTreeTypeCode(type) == C_RECORD_TYPE ++ || CTreeTypeCode(type) == C_UNION_TYPE) ++ { ++ pedwarn ("ANSI C forbids casting nonscalar to the same type"); ++ } ++ } ++ } ++ else if ( CTreeTypeCode(type) == C_UNION_TYPE) ++ { ++ c_tree_node *field; ++ ++ if ( CTreeTypeCode(CTreeType(value)) == C_ARRAY_TYPE ++ || CTreeTypeCode(CTreeType(value)) == C_FUNCTION_TYPE) ++ { ++ value = c_default_conversion(value); ++ } ++ ++ for (field = CTreeTypeValues(type); field; field = CTreeChain(field)) ++ { ++ if (c_is_comptypes( ++ CTreeTypeMainVariant(CTreeType(field)), ++ CTreeTypeMainVariant(CTreeType(value)))) break; ++ } ++ ++ if (field) ++ { ++ char *name; ++ c_tree_node *t; ++ ++ if (c_pedantic) ++ { ++ pedwarn ("ANSI C forbids casts to union type"); ++ } ++ ++ if ( CTreeTypeName(type) != 0) ++ { ++ if ( CTreeNodeFirstCode( CTreeTypeName(type)) == C_IDENTIFIER_NODE) ++ { ++ name = CTreeIdentPointer( CTreeTypeName(type)); ++ } ++ else ++ { ++ name = CTreeIdentPointer(CTreeDeclName( CTreeTypeName(type))); ++ } ++ } ++ else ++ { ++ name = ""; ++ } ++ ++ t = c_tree_build_list(field, value); ++ t = c_tree_build_binary_expr( C_CONSTRUCTOR_EXPR, NULL, t ); ++ CTreeType( t ) = type; ++ ++ t = c_digest_init(type, t, 0, 0 ); ++ ++ if ( CIsTreeNodeConstant( value ) ) ++ { ++ CSetTreeNodeConstant(t); ++ } ++ return t; ++ } ++ ++ error("cast to union type from type not present in union"); ++ return c_error_mark_node; ++ } ++ else ++ { ++ c_tree_node *otype; ++ c_tree_node *ovalue; ++ ++ /* If casting to void, avoid the error that would come ++ from default_conversion in the case of a non-lvalue array. */ ++ if (type == c_void_type_node) ++ { ++ value = c_tree_build_unary_expr( C_CONVERT_EXPR, value ); ++ CTreeType( value ) = type; ++ return value; ++ } ++ ++ /* Convert functions and arrays to pointers, ++ but don't convert any other types. */ ++ if ( CTreeTypeCode(CTreeType(value)) == C_FUNCTION_TYPE ++ || CTreeTypeCode(CTreeType(value)) == C_ARRAY_TYPE) ++ { ++ value = c_default_conversion(value); ++ } ++ ++ otype = CTreeType(value); ++ ++ /* Optionally warn about potentially worrisome casts. */ ++ ++ if (c_warn_cast_qual ++ && CTreeTypeCode(type) == C_POINTER_TYPE ++ && CTreeTypeCode(otype) == C_POINTER_TYPE) ++ { ++ if ( CIsTreeNodeVolatile(CTreeType(otype)) ++ && ! CIsTreeNodeVolatile(CTreeType(type))) ++ { ++ pedwarn("cast discards `volatile' from pointer target type"); ++ } ++ if ( CIsTreeNodeReadOnly(CTreeType(otype)) ++ && ! CIsTreeNodeReadOnly(CTreeType(type))) ++ { ++ pedwarn("cast discards `const' from pointer target type"); ++ } ++ } ++ ++# ifdef LUDO_NO_SKIP ++ /* Warn about possible alignment problems. */ ++ if (STRICT_ALIGNMENT && warn_cast_align ++ && TREE_CODE (type) == POINTER_TYPE ++ && TREE_CODE (otype) == POINTER_TYPE ++ && TREE_CODE (CTreeType(otype)) != VOID_TYPE ++ && TREE_CODE (CTreeType(otype)) != FUNCTION_TYPE ++ /* Don't warn about opaque types, where the actual alignment ++ restriction is unknown. */ ++ && !((TREE_CODE (CTreeType(otype)) == UNION_TYPE ++ || TREE_CODE (CTreeType(otype)) == RECORD_TYPE) ++ && CTreeTypeMode(CTreeType(otype)) == VOIDmode) ++ && TYPE_ALIGN (CTreeType(type)) > TYPE_ALIGN (CTreeType(otype))) ++ warning ("cast increases required alignment of target type"); ++# endif ++ ++ if ( CTreeTypeCode(type) == C_INTEGER_TYPE ++ && CTreeTypeCode(otype) == C_POINTER_TYPE ++ && CTreeTypePrecision(type) != CTreeTypePrecision(otype) ++ && ! CIsTreeNodeConstant(value)) ++ { ++ warning ("cast from pointer to integer of different size"); ++ } ++ ++ if (c_warn_bad_function_cast ++ && ( CTreeNodeFirstCode(value) == C_EXPR_NODE && CTreeExprCode(value) == C_CALL_EXPR) ++ && CTreeTypeCode(type) != CTreeTypeCode(otype)) ++ { ++ warning ("cast does not match function type"); ++ } ++ ++ if ( CTreeTypeCode(type) == C_POINTER_TYPE ++ && CTreeTypeCode(otype) == C_INTEGER_TYPE ++ && CTreeTypePrecision(type) != CTreeTypePrecision(otype) ++ /* Don't warn about converting any constant. */ ++ && ! CIsTreeNodeConstant(value)) ++ { ++ warning ("cast to pointer from integer of different size"); ++ } ++ ++ ovalue = value; ++ value = c_convert_expr(type, value); ++ ++ /* Ignore any integer overflow caused by the cast. */ ++ if ( CTreeNodeFirstCode(value) == C_INT_CST_NODE) ++ { ++ if ( CIsTreeNodeOverflow(ovalue) ) CSetTreeNodeOverflow(value); ++ if ( CIsTreeNodeStatic(ovalue) ) CSetTreeNodeStatic(value); ++ } ++ } ++ ++ /* Pedantically, don't ley (void *) (FOO *) 0 be a null pointer constant. */ ++ if (c_pedantic && CTreeNodeFirstCode(value) == C_INT_CST_NODE ++ && CTreeNodeFirstCode(expr) == C_INT_CST_NODE ++ && CTreeTypeCode(CTreeType(expr)) != C_INTEGER_TYPE) ++ { ++ value = c_get_non_lvalue(value); ++ } ++ ++ /* If pedantic, don't let a cast be an lvalue. */ ++ if (value == expr && c_pedantic) ++ { ++ value = c_get_non_lvalue(value); ++ } ++ ++ return value; ++} ++ ++/* Compute the value of the `sizeof' operator. */ ++ ++c_tree_node *c_get_c_sizeof(type) ++ ++ c_tree_node *type; ++{ ++ int code; ++ c_tree_node *t; ++ ++ if ( CTreeNodeFirstCode( type ) == C_ERROR_NODE ) ++ { ++ return c_tree_get_size_int(1); ++ } ++ ++ code = CTreeTypeCode(type); ++ ++ if (code == C_FUNCTION_TYPE) ++ { ++ if (c_pedantic || c_warn_pointer_arith) ++ { ++ pedwarn ("sizeof applied to a function type"); ++ } ++ ++ return c_tree_get_size_int(1); ++ } ++ ++ if (code == C_VOID_TYPE) ++ { ++ if (c_pedantic || c_warn_pointer_arith) ++ { ++ pedwarn ("sizeof applied to a void type"); ++ } ++ ++ return c_tree_get_size_int(1); ++ } ++ ++ if (CTreeTypeSize(type) == 0) ++ { ++ error ("sizeof applied to an incomplete type"); ++ ++ return c_tree_get_size_int(0); ++ } ++ ++ /* Convert in case a char is more than one unit. */ ++ t = c_tree_build_binary_expr( ++ C_CEIL_DIV_EXPR, ++ CTreeTypeSize(type), ++ c_tree_get_size_int( CTreeTypePrecision(c_char_type_node))); ++ CTreeType( t ) = c_size_type; ++ ++ /* size_binop does not put the constant in range, so do it now. */ ++ if (CTreeNodeFirstCode(t) == C_INT_CST_NODE && c_force_fit_type(t, 0)) ++ { ++ CSetTreeNodeStatic(t); ++ CSetTreeNodeOverflow(t); ++ } ++ ++ return t; ++} ++ ++ ++/* Implement the __alignof keyword: Return the minimum required ++ alignment of TYPE, measured in bytes. */ ++ ++c_tree_node *c_get_c_alignof(type) ++ ++ c_tree_node *type; ++{ ++ int code; ++ ++ if ( CTreeNodeFirstCode( type ) == C_ERROR_NODE ) ++ { ++ return c_tree_get_size_int(1); ++ } ++ ++ code = CTreeTypeCode(type); ++ ++# ifdef LUDO_NO_SKIP ++ if (code == C_FUNCTION_TYPE) ++ { ++ return c_tree_get_size_int( FUNCTION_BOUNDARY / C_BITS_PER_UNIT); ++ } ++# endif ++ ++ if (code == C_VOID_TYPE) ++ { ++ return c_tree_get_size_int(1); ++ } ++ ++ return c_tree_get_size_int( CTreeTypeAlign(type) / C_BITS_PER_UNIT); ++} ++ ++/* Implement the __alignof keyword: Return the minimum required ++ alignment of EXPR, measured in bytes. For VAR_DECL's and ++ FIELD_DECL's return DECL_ALIGN (which can be set from an ++ "aligned" __attribute__ specification). */ ++ ++c_tree_node *c_get_c_alignof_expr(expr) ++ ++ c_tree_node *expr; ++{ ++ if ( ( CTreeNodeFirstCode(expr) == C_DECL_NODE ) && ++ ( CTreeDeclCode( expr ) == C_VAR_DECL ) ) ++ { ++# ifdef LUDO_NO_SKIP ++ return c_tree_get_size_int(DECL_ALIGN (expr) / C_BITS_PER_UNIT); ++# else ++ return c_get_c_alignof(CTreeType(expr)); ++ ++# endif ++ } ++ ++ if ( CTreeExprCode(expr) == C_COMPONENT_REF ++ && CIsTreeDeclCBitField( CTreeExprOperand(expr, 1))) ++ { ++ error("`__alignof' applied to a bit-field"); ++ return c_tree_get_size_int(1); ++ } ++ else if ( CTreeExprCode(expr) == C_COMPONENT_REF ++ && CTreeDeclCode( CTreeExprOperand(expr, 1)) == C_FIELD_DECL) ++ { ++# ifdef LUDO_NO_SKIP ++ return c_tree_get_size_int( ++ DECL_ALIGN( CTreeExprOperand(expr, 1)) / C_BITS_PER_UNIT); ++# else ++ return c_tree_get_size_int(1); ++# endif ++ } ++ ++ if ( CTreeExprCode(expr) == C_INDIRECT_REF) ++ { ++ c_tree_node *t = CTreeExprOperand(expr, 0); ++ c_tree_node *best = t; ++ int bestalign = CTreeTypeAlign(CTreeType(CTreeType(t))); ++ ++ while ( CTreeExprCode(t) == C_NOP_EXPR ++ && CTreeTypeCode(CTreeType( CTreeExprOperand(t, 0))) == C_POINTER_TYPE) ++ { ++ int thisalign; ++ ++ t = CTreeExprOperand(t, 0); ++ thisalign = CTreeTypeAlign(CTreeType(CTreeType(t))); ++ ++ if (thisalign > bestalign) best = t, bestalign = thisalign; ++ } ++ ++ return c_get_c_alignof(CTreeType(CTreeType(best))); ++ } ++ else ++ { ++ return c_get_c_alignof(CTreeType(expr)); ++ } ++} ++ ++/* Return the size of TYPE (in bytes) as a wide integer ++ or return -1 if the size can vary or is larger than an integer. */ ++ ++int c_get_int_size_in_bytes(type) ++ c_tree_node *type; ++{ ++ c_tree_node *t; ++ ++ if (type == c_error_mark_node) ++ { ++ return 0; ++ } ++ ++ type = CTreeTypeMainVariant(type); ++ if (CTreeTypeSize(type) == 0 ++ || CTreeNodeFirstCode(CTreeTypeSize(type)) != C_INT_CST_NODE) ++ { ++ return -1; ++ } ++ ++ if ( CTreeIntCstHigh(CTreeTypeSize(type)) == 0) ++ return (( CTreeIntCstLow(CTreeTypeSize(type)) + C_BITS_PER_UNIT - 1) ++ / C_BITS_PER_UNIT); ++ ++ t = c_tree_build_binary_expr( ++ C_CEIL_DIV_EXPR, ++ CTreeTypeSize(type), ++ c_tree_get_size_int( C_BITS_PER_UNIT )); ++ CTreeType( t ) = c_size_type; ++ ++ if ( CTreeNodeFirstCode(t) != C_INT_CST_NODE || CTreeIntCstHigh(t) != 0) ++ { ++ return -1; ++ } ++ ++ return CTreeIntCstLow(t); ++} ++ ++ ++ ++/* Compute the size to increment a pointer by. */ ++ ++c_tree_node *c_get_size_in_bytes(type) ++ c_tree_node *type; ++{ ++ int code = CTreeTypeCode(type); ++ c_tree_node *t; ++ ++ if ( CTreeNodeFirstCode(type) == C_ERROR_NODE) ++ { ++ return c_tree_get_size_int (1); ++ } ++ ++ if (code == C_FUNCTION_TYPE) ++ return c_tree_get_size_int (1); ++ if (code == C_VOID_TYPE) ++ return c_tree_get_size_int (1); ++ ++ if (CTreeTypeSize(type) == 0) ++ { ++ error("arithmetic on pointer to an incomplete type"); ++ return c_tree_get_size_int(1); ++ } ++ ++ /* Convert in case a char is more than one unit. */ ++ t = c_build_size_binop(C_CEIL_DIV_EXPR, CTreeTypeSize(type), ++ c_tree_get_size_int(C_BITS_PER_UNIT)); ++ c_force_fit_type(t, 0); ++ return t; ++} ++ ++ ++/* Convert the argument expressions in the list VALUES ++ to the types in the list TYPELIST. The result is a list of converted ++ argument expressions. ++ ++ If TYPELIST is exhausted, or when an element has NULL as its type, ++ perform the default conversions. ++ ++ PARMLIST is the chain of parm decls for the function being called. ++ It may be 0, if that info is not available. ++ It is used only for generating error messages. ++ ++ NAME is an IDENTIFIER_NODE or 0. It is used only for error messages. ++ ++ This is also where warnings about wrong number of args are generated. ++ ++ Both VALUES and the returned value are chains of TREE_LIST nodes ++ with the elements of the list in the TREE_VALUE slots of those nodes. */ ++ ++static c_tree_node *c_convert_arguments(typelist, values, name, fundecl) ++ c_tree_node *typelist; ++ c_tree_node *values; ++ c_tree_node *name; ++ c_tree_node *fundecl; ++{ ++ c_tree_node *typetail; ++ c_tree_node *valtail; ++ c_tree_node *result = NULL; ++ int parmnum; ++ ++ /* Scan the given expressions and types, producing individual ++ converted arguments and pushing them on RESULT in reverse order. */ ++ ++ for (valtail = values, typetail = typelist, parmnum = 0; ++ valtail; ++ valtail = CTreeChain(valtail), parmnum++) ++ { ++ c_tree_node *type = typetail ? CTreeListValue(typetail) : 0; ++ c_tree_node *val = CTreeListValue(valtail); ++ ++ if (type == c_void_type_node) ++ { ++ if (name) ++ { ++ error ("too many arguments to function `%s'", ++ CTreeIdentPointer(name)); ++ } ++ else ++ { ++ error ("too many arguments to function"); ++ } ++ break; ++ } ++ ++ /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ ++ /* Do not use STRIP_NOPS here! We do not want an enumerator with value 0 ++ to convert automatically to a pointer. */ ++ if ( CTreeExprCode(val) == C_NON_LVALUE_EXPR) ++ { ++ val = CTreeExprOperand(val, 0); ++ } ++ ++ if ( CTreeTypeCode(CTreeType(val)) == C_ARRAY_TYPE ++ || CTreeTypeCode(CTreeType(val)) == C_FUNCTION_TYPE) ++ { ++ val = c_default_conversion(val); ++ } ++ ++ val = c_require_complete_type(val); ++ ++ if (type != 0) ++ { ++ /* Formal parm type is specified by a function prototype. */ ++ c_tree_node *parmval; ++ ++ if (CTreeTypeSize(type) == 0) ++ { ++ error ("type of formal parameter %d is incomplete", parmnum + 1); ++ parmval = val; ++ } ++ else ++ { ++ /* Optionally warn about conversions that ++ differ from the default conversions. */ ++ if (c_warn_conversion) ++ { ++ int formal_prec = CTreeTypePrecision(type); ++ ++ if (INTEGRAL_TYPE_P (type) ++ && CTreeTypeCode(CTreeType(val)) == C_REAL_TYPE) ++ { ++ warn_for_assignment( ++ "%s as integer rather than floating due to prototype", ++ (char *) 0, name, parmnum + 1); ++ } ++ else if ( CTreeTypeCode(type) == C_COMPLEX_TYPE ++ && CTreeTypeCode(CTreeType(val)) == C_REAL_TYPE) ++ { ++ warn_for_assignment( ++ "%s as complex rather than floating due to prototype", ++ (char *) 0, name, parmnum + 1); ++ } ++ else if (CTreeTypeCode(type) == C_REAL_TYPE ++ && INTEGRAL_TYPE_P (CTreeType(val))) ++ { ++ warn_for_assignment( ++ "%s as floating rather than integer due to prototype", ++ (char *) 0, name, parmnum + 1); ++ } ++ else if (CTreeTypeCode(type) == C_REAL_TYPE ++ && CTreeTypeCode(CTreeType(val)) == C_COMPLEX_TYPE) ++ { ++ warn_for_assignment ( ++ "%s as floating rather than complex due to prototype", ++ (char *) 0, name, parmnum + 1); ++ } ++ /* ??? At some point, messages should be written about ++ conversions between complex types, but that's too messy ++ to do now. */ ++ else if (CTreeTypeCode(type) == C_REAL_TYPE ++ && CTreeTypeCode(CTreeType(val)) == C_REAL_TYPE) ++ { ++ /* Warn if any argument is passed as `float', ++ since without a prototype it would be `double'. */ ++ if (formal_prec == CTreeTypePrecision(c_float_type_node)) ++ { ++ warn_for_assignment ( ++ "%s as `float' rather than `double' due to prototype", ++ (char *) 0, name, parmnum + 1); ++ } ++ } ++ /* Detect integer changing in width or signedness. */ ++ else if (INTEGRAL_TYPE_P (type) ++ && INTEGRAL_TYPE_P (CTreeType(val))) ++ { ++ c_tree_node *would_have_been = c_default_conversion (val); ++ c_tree_node *type1 = CTreeType(would_have_been); ++ ++ if (CTreeTypeCode(type) == C_ENUMERAL_TYPE ++ && type == CTreeType(val)) ++ /* No warning if function asks for enum ++ and the actual arg is that enum type. */ ++ ; ++ else if (formal_prec != CTreeTypePrecision(type1)) ++ { ++ warn_for_assignment ( ++ "%s with different width due to prototype", ++ (char *) 0, name, parmnum + 1); ++ } ++ else if ( CIsTreeNodeUnsigned(type) == CIsTreeNodeUnsigned(type1)) ++ ; ++ /* Don't complain if the formal parameter type ++ is an enum, because we can't tell now whether ++ the value was an enum--even the same enum. */ ++ else if (CTreeTypeCode(type) == C_ENUMERAL_TYPE) ++ ; ++ else if ( CTreeNodeFirstCode(val) == C_INT_CST_NODE ++ && c_int_fits_type_p(val, type)) ++ /* Change in signedness doesn't matter ++ if a constant value is unaffected. */ ++ ; ++ /* Likewise for a constant in a NOP_EXPR. */ ++ else if ( CTreeNodeFirstCode(val) == C_EXPR_NODE && ++ CTreeExprCode(val) == C_NOP_EXPR ++ && CTreeNodeFirstCode(CTreeExprOperand (val, 0)) == C_INT_CST_NODE ++ && c_int_fits_type_p(CTreeExprOperand (val, 0), type)) ++ ; ++ /* If the value is extended from a narrower ++ unsigned type, it doesn't matter whether we ++ pass it as signed or unsigned; the value ++ certainly is the same either way. */ ++ else if (CTreeTypePrecision(CTreeType(val)) < CTreeTypePrecision(type) ++ && CIsTreeNodeUnsigned(CTreeType(val))) ++ ; ++ else if ( CIsTreeNodeUnsigned(type)) ++ { ++ warn_for_assignment ( ++ "%s as unsigned due to prototype", ++ (char *) 0, name, parmnum + 1); ++ } ++ else ++ { ++ warn_for_assignment ( ++ "%s as signed due to prototype", ++ (char *) 0, name, parmnum + 1); ++ } ++ } ++ } ++ ++ parmval = c_convert_for_assignment(type, val, ++ (char *) 0, /* arg passing */ ++ fundecl, name, parmnum + 1); ++ ++#ifdef PROMOTE_PROTOTYPES ++ if ((TREE_CODE (type) == INTEGER_TYPE ++ || TREE_CODE (type) == ENUMERAL_TYPE) ++ && (CTreeTypePrecision(type) < CTreeTypePrecision(integer_type_node))) ++ parmval = default_conversion (parmval); ++#endif ++ } ++ result = c_tree_add_head_list( NULL, parmval, result); ++ } ++ else if ( CTreeTypeCode(CTreeType(val)) == C_REAL_TYPE ++ && ( CTreeTypePrecision(CTreeType(val)) ++ < CTreeTypePrecision(c_double_type_node))) ++ { ++ /* Convert `float' to `double'. */ ++ result = c_tree_add_head_list( NULL, ++ c_convert_expr(c_double_type_node, val), result); ++ } ++ else ++ { ++ /* Convert `short' and `char' to full-size `int'. */ ++ result = c_tree_add_head_list( NULL, c_default_conversion(val), result); ++ } ++ ++ if (typetail) ++ { ++ typetail = CTreeChain(typetail); ++ } ++ } ++ ++ if (typetail != 0 && CTreeListValue(typetail) != c_void_type_node) ++ { ++ if (name) ++ { ++ error ("too few arguments to function `%s'", CTreeIdentPointer(name)); ++ } ++ else ++ { ++ error ("too few arguments to function"); ++ } ++ } ++ ++ return c_tree_reverse_list(result); ++} ++ ++ ++/* Build a function call to function FUNCTION with parameters PARAMS. ++ PARAMS is a list--a chain of TREE_LIST nodes--in which the ++ TREE_VALUE of each node is a parameter-expression. ++ FUNCTION's data type may be a function type or a pointer-to-function. */ ++ ++c_tree_node *c_parser_build_function_call(function, params) ++ c_tree_node *function; ++ c_tree_node *params; ++{ ++ c_tree_node *fntype = NULL; ++ c_tree_node *fundecl = NULL; ++ c_tree_node *coerced_params; ++ c_tree_node *name = NULL; ++# ifdef LUDO_NO_SKIP ++ c_tree_node *assembler_name = NULL; ++# endif ++ ++ /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue. */ ++ CStripTypeNops(function); ++ ++ /* Convert anything with function type to a pointer-to-function. */ ++ if ( CTreeDeclCode(function) == C_FUNCTION_DECL) ++ { ++ name = CTreeDeclName(function); ++# ifdef LUDO_NO_SKIP ++ assembler_name = DECL_ASSEMBLER_NAME (function); ++# endif ++ ++ /* Differs from default_conversion by not setting TREE_ADDRESSABLE ++ (because calling an inline function does not mean the function ++ needs to be separately compiled). */ ++ fntype = c_tree_build_type_variant(CTreeType(function), ++ CIsTreeNodeReadOnly(function), ++ CIsTreeNodeVolatile(function)); ++ fundecl = function; ++ function = c_tree_build_unary_expr( C_ADDR_EXPR, function); ++ CTreeType( function ) = c_tree_build_pointer_type(fntype); ++ } ++ else ++ { ++ function = c_default_conversion(function); ++ } ++ ++ fntype = CTreeType(function); ++ ++ if ( CTreeNodeFirstCode(fntype) == C_ERROR_NODE) ++ { ++ return c_error_mark_node; ++ } ++ ++ if (!( CTreeTypeCode(fntype) == C_POINTER_TYPE ++ && CTreeTypeCode(CTreeType(fntype)) == C_FUNCTION_TYPE)) ++ { ++ error ("called object is not a function"); ++ return c_error_mark_node; ++ } ++ ++ /* fntype now gets the type of function pointed to. */ ++ fntype = CTreeType(fntype); ++ ++ /* Convert the parameters to the types declared in the ++ function prototype, or apply default promotions. */ ++ ++ coerced_params ++ = c_convert_arguments( CTreeTypeValues(fntype), params, name, fundecl); ++ ++ /* Check for errors in format strings. */ ++ ++# ifdef LUDO_NO_SKIP ++ if (c_warn_format && (name || assembler_name)) ++ { ++ c_check_function_format(name, assembler_name, coerced_params); ++ } ++# endif ++ ++ /* Recognize certain built-in functions so we can make tree-codes ++ other than CALL_EXPR. We do this when it enables fold-const.c ++ to do something useful. */ ++ ++# ifdef LUDO_NO_SKIP ++ if ( CTreeNodeFirstCode( function ) == C_EXPR_NODE ++ && CTreeExprCode(function) == C_ADDR_EXPR ++ && CTreeDeclCode(CTreeExprOperand(function, 0)) == C_FUNCTION_DECL ++ && CIsTreeDeclBuiltIn( CTreeExprOperand(function, 0))) ++ { ++ switch (DECL_FUNCTION_CODE ( CTreeExprOperand(function, 0))) ++ { ++ case BUILT_IN_ABS: ++ case BUILT_IN_LABS: ++ case BUILT_IN_FABS: ++ if (coerced_params == 0) ++ return integer_zero_node; ++ return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0); ++ default: ++ break; ++ } ++ ++ } ++# endif ++ { ++ c_tree_node *result ++ = c_tree_build_binary_expr( C_CALL_EXPR, function, coerced_params ); ++ ++ CTreeType( result ) = CTreeType(fntype), ++ ++ CSetTreeNodeSideEffect( result); ++ ++ if (CTreeType(result) == c_void_type_node) ++ { ++ return result; ++ } ++ return c_require_complete_type(result); ++ } ++} ++ ++/* Print an error message for invalid use of an incomplete type. ++ VALUE is the expression that was used (or 0 if that isn't known) ++ and TYPE is the type that was invalid. */ ++ ++void c_incomplete_type_error(value, type) ++ c_tree_node *value; ++ c_tree_node *type; ++{ ++ char *errmsg; ++ ++ /* Avoid duplicate error message. */ ++ if ( CTreeNodeFirstCode(type) == C_ERROR_NODE) ++ return; ++ ++ if (value != 0 && ( CTreeDeclCode(value) == C_VAR_DECL ++ || CTreeDeclCode(value) == C_PARAM_DECL)) ++ { ++ error ("`%s' has an incomplete type", CTreeIdentPointer(CTreeDeclName(value))); ++ } ++ else ++ { ++ retry: ++ /* We must print an error message. Be clever about what it says. */ ++ ++ switch ( CTreeTypeCode(type)) ++ { ++ case C_RECORD_TYPE: ++ errmsg = "invalid use of undefined type `struct %s'"; ++ break; ++ ++ case C_UNION_TYPE: ++ errmsg = "invalid use of undefined type `union %s'"; ++ break; ++ ++ case C_ENUMERAL_TYPE: ++ errmsg = "invalid use of undefined type `enum %s'"; ++ break; ++ ++ case C_VOID_TYPE: ++ error ("invalid use of void expression"); ++ return; ++ ++ case C_ARRAY_TYPE: ++ if ( CTreeTypeValues(type)) ++ { ++ type = CTreeType(type); ++ goto retry; ++ } ++ error ("invalid use of array with unspecified bounds"); ++ return; ++ ++ default: ++ abort (); ++ } ++ ++ if ( CTreeNodeFirstCode( CTreeTypeName(type)) == C_IDENTIFIER_NODE) ++ { ++ error (errmsg, CTreeIdentPointer( CTreeTypeName(type))); ++ } ++ else ++ { ++ /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL. */ ++ error ("invalid use of incomplete typedef `%s'", ++ CTreeIdentPointer(CTreeDeclName( CTreeTypeName(type)))); ++ } ++ } ++} ++ ++/* Do `exp = require_complete_type (exp);' to make sure exp ++ does not have an incomplete type. (That includes void types.) */ ++ ++c_tree_node *c_require_complete_type(value) ++ c_tree_node *value; ++{ ++ c_tree_node *type = CTreeType(value); ++ ++ /* First, detect a valid value with a complete type. */ ++ if (CTreeTypeSize(type) != 0 ++ && type != c_void_type_node) ++ return value; ++ ++ c_incomplete_type_error(value, type); ++ return c_error_mark_node; ++} ++ ++ ++/* Return nonzero if REF is an lvalue valid for this language. ++ Lvalues can be assigned, unless their type has TYPE_READONLY. ++ Lvalues can have their address taken, unless they have DECL_REGISTER. */ ++ ++int c_is_lvalue_p(ref) ++ c_tree_node *ref; ++{ ++ int code; ++ ++ if ( CTreeNodeFirstCode(ref) == C_STRING_NODE) ++ { ++ return 1; ++ } ++ ++ if ( CTreeNodeFirstCode(ref) == C_ERROR_NODE) ++ { ++ return ( CTreeTypeCode(CTreeType(ref)) != C_FUNCTION_TYPE ++ && CTreeTypeCode(CTreeType(ref)) != C_METHOD_TYPE); ++ } ++ ++ if ( CTreeNodeFirstCode(ref) == C_DECL_NODE) ++ { ++ code = CTreeDeclCode(ref); ++ ++ if (code == C_VAR_DECL || ++ code == C_PARAM_DECL || ++ code == C_RESULT_DECL ) ++ { ++ return ( CTreeTypeCode(CTreeType(ref)) != C_FUNCTION_TYPE ++ && CTreeTypeCode(CTreeType(ref)) != C_METHOD_TYPE); ++ } ++ ++ return 0; ++ } ++ ++ if ( CTreeNodeFirstCode(ref) == C_EXPR_NODE) ++ { ++ code = CTreeExprCode(ref); ++ ++ switch (code) ++ { ++ case C_REALPART_EXPR: ++ case C_IMAGPART_EXPR: ++ case C_COMPONENT_REF: ++ return c_is_lvalue_p(CTreeExprOperand(ref, 0)); ++ ++ case C_INDIRECT_REF: ++ case C_ARRAY_REF: ++ return ( CTreeTypeCode(CTreeType(ref)) != C_FUNCTION_TYPE ++ && CTreeTypeCode(CTreeType(ref)) != C_METHOD_TYPE); ++ ++ case C_BIND_EXPR: ++ case C_RTL_EXPR: ++ return CTreeTypeCode(CTreeType(ref)) == C_ARRAY_TYPE; ++ ++ } ++ } ++ ++ return 0; ++} ++ ++/* This handles expressions of the form "a[i]", which denotes ++ an array reference. ++ ++ This is logically equivalent in C to *(a+i), but we may do it differently. ++ If A is a variable or a member, we generate a primitive ARRAY_REF. ++ This avoids forcing the array out of registers, and can work on ++ arrays that are not lvalues (for example, members of structures returned ++ by functions). */ ++ ++c_tree_node *c_parser_build_array_ref(array, index) ++ ++ c_tree_node *array; ++ c_tree_node *index; ++{ ++ if (index == 0) ++ { ++ error ("subscript missing in array reference"); ++ return c_error_mark_node; ++ } ++ ++ if (CTreeType(array) == c_error_mark_node ++ || CTreeType(index) == c_error_mark_node) ++ return c_error_mark_node; ++ ++ if ( CTreeTypeCode(CTreeType(array)) == C_ARRAY_TYPE ++ && CTreeExprCode(array) != C_INDIRECT_REF) ++ { ++ c_tree_node *rval; ++ c_tree_node *type; ++ ++ /* Subscripting with type char is likely to lose ++ on a machine where chars are signed. ++ So warn on any machine, but optionally. ++ Don't warn for unsigned char since that type is safe. ++ Don't warn for signed char because anyone who uses that ++ must have done so deliberately. */ ++ if (c_warn_char_subscripts ++ && CTreeTypeMainVariant(CTreeType(index)) == c_char_type_node) ++ { ++ warning ("array subscript has type `char'"); ++ } ++ ++ /* Apply default promotions *after* noticing character types. */ ++ index = c_default_conversion(index); ++ ++ /* Require integer *after* promotion, for sake of enums. */ ++ if ( CTreeTypeCode(CTreeType(index)) != C_INTEGER_TYPE) ++ { ++ error ("array subscript is not an integer"); ++ return c_error_mark_node; ++ } ++ ++ /* An array that is indexed by a non-constant ++ cannot be stored in a register; we must be able to do ++ address arithmetic on its address. ++ Likewise an array of elements of variable size. */ ++ if ( CTreeNodeFirstCode(index) != C_INT_CST_NODE ++ || (CTreeTypeSize(CTreeType(CTreeType(array))) != 0 ++ && ++ CTreeNodeFirstCode(CTreeTypeSize(CTreeType(CTreeType(array)))) != C_INT_CST_NODE)) ++ { ++ if ( c_mark_addressable (array) == 0) ++ return c_error_mark_node; ++ } ++ /* An array that is indexed by a constant value which is not within ++ the array bounds cannot be stored in a register either; because we ++ would get a crash in store_bit_field/extract_bit_field when trying ++ to access a non-existent part of the register. */ ++ if ( CTreeNodeFirstCode(index) == C_INT_CST_NODE ++ && CTreeTypeValues(CTreeType(array)) ++ && ! c_int_fits_type_p(index, CTreeTypeValues(CTreeType(array)))) ++ { ++ if (c_mark_addressable (array) == 0) ++ return c_error_mark_node; ++ } ++ ++ if (c_pedantic && ! c_is_lvalue_p(array)) ++ { ++ if ( CIsTreeDeclRegister(array)) ++ { ++ pedwarn ("ANSI C forbids subscripting `register' array"); ++ } ++ else ++ { ++ pedwarn ("ANSI C forbids subscripting non-lvalue array"); ++ } ++ } ++ ++ if (c_pedantic) ++ { ++ c_tree_node *foo = array; ++ ++ while ( CTreeNodeFirstCode(foo) == C_EXPR_NODE && ++ CTreeExprCode(foo) == C_COMPONENT_REF ) ++ { ++ foo = CTreeExprOperand(foo, 0); ++ } ++ ++ if ( CTreeNodeFirstCode(foo) == C_DECL_NODE && CTreeDeclCode(foo) == C_VAR_DECL && ++ CIsTreeDeclRegister(foo)) ++ { ++ pedwarn ("ANSI C forbids subscripting non-lvalue array"); ++ } ++ } ++ ++ type = CTreeTypeMainVariant(CTreeType(CTreeType(array))); ++ rval = c_tree_build_binary_expr(C_ARRAY_REF, array, index); ++ CTreeType( rval ) = type; ++ ++ /* Array ref is const/volatile if the array elements are ++ or if the array is. */ ++ if ( CIsTreeNodeReadOnly(CTreeType(CTreeType(array))) ++ | CIsTreeNodeReadOnly(array)) ++ { ++ CSetTreeNodeReadOnly(rval); ++ } ++ ++ if (CIsTreeNodeVolatile(CTreeType(CTreeType(array))) ++ | CIsTreeNodeSideEffect(array)) ++ { ++ CSetTreeNodeSideEffect(rval); ++ } ++ ++ if ( CIsTreeNodeVolatile(CTreeType(CTreeType(array))) ++ /* This was added by rms on 16 Nov 91. ++ It fixes vol struct foo *a; a->elts[1] ++ in an inline function. ++ Hope it doesn't break something else. */ ++ | CIsTreeNodeVolatile(array)) ++ { ++ CSetTreeNodeVolatile(rval); ++ } ++ ++ return c_require_complete_type( c_fold(rval)); ++ } ++ ++ { ++ c_tree_node *ar = c_default_conversion(array); ++ c_tree_node *ind = c_default_conversion(index); ++ ++ /* Do the same warning check as above, but only on the part that's ++ syntactically the index and only if it is also semantically ++ the index. */ ++ if (c_warn_char_subscripts ++ && CTreeTypeCode(CTreeType(index)) == C_INTEGER_TYPE ++ && CTreeTypeMainVariant(CTreeType(index)) == c_char_type_node) ++ { ++ warning ("subscript has type `char'"); ++ } ++ ++ /* Put the integer in IND to simplify error checking. */ ++ if ( CTreeTypeCode(CTreeType(ar)) == C_INTEGER_TYPE) ++ { ++ c_tree_node *temp = ar; ++ ar = ind; ++ ind = temp; ++ } ++ ++ if (ar == c_error_mark_node) ++ return ar; ++ ++ if (CTreeTypeCode(CTreeType(ar)) != C_POINTER_TYPE ++ || CTreeTypeCode(CTreeType(CTreeType(ar))) == C_FUNCTION_TYPE) ++ { ++ error ("subscripted value is neither array nor pointer"); ++ return c_error_mark_node; ++ } ++ if ( CTreeTypeCode(CTreeType(ind)) != C_INTEGER_TYPE) ++ { ++ error ("array subscript is not an integer"); ++ return c_error_mark_node; ++ } ++ ++ return c_parser_build_indirect_ref( ++ c_build_binary_op( C_PLUS_EXPR, ar, ind, 0), "array indexing"); ++ } ++} ++ ++ ++/* Look up component name in the structure type definition. ++ ++ If this component name is found indirectly within an anonymous union, ++ store in *INDIRECT the component which directly contains ++ that anonymous union. Otherwise, set *INDIRECT to 0. */ ++ ++static c_tree_node *c_lookup_field(type, component, indirect) ++ c_tree_node *type; ++ c_tree_node *component; ++ c_tree_node **indirect; ++{ ++ c_tree_node *field; ++ ++ /* If TYPE_LANG_SPECIFIC is set, then it is a sorted array of pointers ++ to the field elements. Use a binary search on this array to quickly ++ find the element. Otherwise, do a linear search. TYPE_LANG_SPECIFIC ++ will always be set for structures which have many elements. */ ++ ++# ifdef LUDO_NO_SKIP ++ if (TYPE_LANG_SPECIFIC (type)) ++ { ++ int bot, top, half; ++ c_tree_node **field_array = &TYPE_LANG_SPECIFIC (type)->elts[0]; ++ ++ field = TYPE_FIELDS (type); ++ bot = 0; ++ top = TYPE_LANG_SPECIFIC (type)->len; ++ while (top - bot > 1) ++ { ++ half = (top - bot + 1) >> 1; ++ field = field_array[bot+half]; ++ ++ if (CTreeDeclName(field) == NULL) ++ { ++ /* Step through all anon unions in linear fashion. */ ++ while (CTreeDeclName(field_array[bot]) == NULL) ++ { ++ c_tree_node *anon = 0, junk; ++ ++ field = field_array[bot++]; ++ if (TREE_CODE (CTreeType(field)) == RECORD_TYPE ++ || TREE_CODE (CTreeType(field)) == UNION_TYPE) ++ anon = lookup_field (CTreeType(field), component, &junk); ++ ++ if (anon != NULL) ++ { ++ *indirect = field; ++ return anon; ++ } ++ } ++ ++ /* Entire record is only anon unions. */ ++ if (bot > top) ++ return NULL; ++ ++ /* Restart the binary search, with new lower bound. */ ++ continue; ++ } ++ ++ if (CTreeDeclName(field) == component) ++ break; ++ if (CTreeDeclName(field) < component) ++ bot += half; ++ else ++ top = bot + half; ++ } ++ ++ if (CTreeDeclName(field_array[bot]) == component) ++ field = field_array[bot]; ++ else if (CTreeDeclName(field) != component) ++ field = 0; ++ } ++ else ++# endif ++ { ++ for (field = CTreeTypeValues(type); field; field = CTreeChain(field)) ++ { ++ if (CTreeDeclName(field) == NULL) ++ { ++ c_tree_node *junk; ++ c_tree_node *anon = 0; ++ ++ if ( CTreeTypeCode(CTreeType(field)) == C_RECORD_TYPE ++ || CTreeTypeCode(CTreeType(field)) == C_UNION_TYPE) ++ { ++ anon = c_lookup_field(CTreeType(field), component, &junk); ++ } ++ ++ if (anon != NULL) ++ { ++ *indirect = field; ++ return anon; ++ } ++ } ++ ++ if (CTreeDeclName(field) == component) ++ break; ++ } ++ } ++ ++ *indirect = NULL; ++ return field; ++} ++ ++ ++/* Make an expression to refer to the COMPONENT field of ++ structure or union value DATUM. COMPONENT is an IDENTIFIER_NODE. */ ++ ++c_tree_node *c_parser_build_component_ref(datum, component) ++ c_tree_node *datum; ++ c_tree_node *component; ++{ ++ c_tree_node *type = CTreeType(datum); ++ int code = CTreeTypeCode(type); ++ c_tree_node *field = NULL; ++ c_tree_node *ref; ++ c_tree_node *tmp_node; ++ ++ /* If DATUM is a COMPOUND_EXPR or COND_EXPR, move our reference inside it ++ unless we are not to support things not strictly ANSI. */ ++ switch ( CTreeExprCode(datum)) ++ { ++ case C_COMPOUND_EXPR: ++ { ++ ++ c_tree_node *value = c_parser_build_component_ref( ++ CTreeExprOperand(datum, 1), component); ++ ++ tmp_node = c_tree_build_binary_expr( C_COMPOUND_EXPR, ++ CTreeExprOperand(datum, 0), value); ++ CTreeType( tmp_node ) = CTreeType( value ); ++ } ++ case C_COND_EXPR: ++ return ++ c_parser_build_conditional_expr( ++ CTreeExprOperand(datum, 0), ++ c_parser_build_component_ref(CTreeExprOperand (datum, 1), component), ++ c_parser_build_component_ref(CTreeExprOperand (datum, 2), component)); ++ ++ default: ++ break; ++ } ++ ++ /* See if there is a field or component with name COMPONENT. */ ++ ++ if (code == C_RECORD_TYPE || code == C_UNION_TYPE) ++ { ++ c_tree_node *indirect = 0; ++ ++ if (CTreeTypeSize(type) == 0) ++ { ++ c_incomplete_type_error(NULL, type); ++ return c_error_mark_node; ++ } ++ ++ field = c_lookup_field(type, component, &indirect); ++ ++ if (!field) ++ { ++ error (code == C_RECORD_TYPE ++ ? "structure has no member named `%s'" ++ : "union has no member named `%s'", ++ CTreeIdentPointer(component)); ++ return c_error_mark_node; ++ } ++ if (CTreeType(field) == c_error_mark_node) ++ { ++ return c_error_mark_node; ++ } ++ ++ /* If FIELD was found buried within an anonymous union, ++ make one COMPONENT_REF to get that anonymous union, ++ then fall thru to make a second COMPONENT_REF to get FIELD. */ ++ if (indirect != 0) ++ { ++ ref = c_tree_build_binary_expr( C_COMPONENT_REF,datum, indirect ); ++ CTreeType( ref ) = CTreeType(indirect); ++ ++ if ( CIsTreeNodeReadOnly(datum) || CIsTreeNodeReadOnly(indirect)) ++ { ++ CSetTreeNodeReadOnly(ref); ++ } ++ ++ if ( CIsTreeNodeVolatile(datum) || CIsTreeNodeVolatile(indirect)) ++ { ++ CSetTreeNodeVolatile(ref); ++ } ++ datum = ref; ++ } ++ ++ ref = c_tree_build_binary_expr( C_COMPONENT_REF, datum, field); ++ CTreeType( ref ) = CTreeType(field); ++ ++ if ( CIsTreeNodeReadOnly(datum) || CIsTreeNodeReadOnly(field)) ++ { ++ CSetTreeNodeReadOnly(ref); ++ } ++ ++ if ( CIsTreeNodeVolatile(datum) || CIsTreeNodeVolatile(field)) ++ { ++ CSetTreeNodeVolatile(ref); ++ } ++ ++ return ref; ++ } ++ else if ( CTreeNodeFirstCode(type) != C_ERROR_NODE) ++ { ++ error ("request for member `%s' in something not a structure or union", ++ CTreeIdentPointer(component)); ++ } ++ ++ return c_error_mark_node; ++} ++ ++ ++/* Prepare to parse and output the initializer for variable DECL. */ ++ ++void c_start_init(decl, asmspec_tree, top_level) ++ c_tree_node *decl; ++ c_tree_node *asmspec_tree; ++ int top_level; ++{ ++ char *locus; ++ struct initializer_stack *p ++ = (struct initializer_stack *) autallocblock (sizeof (struct initializer_stack)); ++ char *asmspec = 0; ++ ++ if (asmspec_tree) ++ asmspec = CTreeStringPointer(asmspec_tree); ++ ++ p->decl = c_constructor_decl; ++ p->asmspec = c_constructor_asmspec; ++ p->incremental = c_constructor_incremental; ++ p->require_constant_value = c_require_constant_value; ++ p->require_constant_elements = c_require_constant_elements; ++ p->constructor_stack = c_constructor_stack; ++ p->elements = c_constructor_elements; ++ p->spelling = c_spelling; ++ p->spelling_base = c_spelling_base; ++ p->spelling_size = c_spelling_size; ++ p->deferred = c_constructor_subconstants_deferred; ++ p->top_level = c_constructor_top_level; ++ p->next = c_initializer_stack; ++ c_initializer_stack = p; ++ ++ c_constructor_decl = decl; ++ c_constructor_incremental = top_level; ++ c_constructor_asmspec = asmspec; ++ c_constructor_subconstants_deferred = 0; ++ c_constructor_top_level = top_level; ++ ++ if (decl != 0) ++ { ++ c_require_constant_value = CIsTreeNodeConstant(decl); ++ c_require_constant_elements ++ = ((CIsTreeNodeStatic(decl) || c_pedantic) ++ /* For a scalar, you can always use any value to initialize, ++ even within braces. */ ++ && ( CTreeTypeCode(CTreeType(decl)) == C_ARRAY_TYPE ++ || CTreeTypeCode(CTreeType(decl)) == C_RECORD_TYPE ++ || CTreeTypeCode(CTreeType(decl)) == C_UNION_TYPE ++ || CTreeTypeCode(CTreeType(decl)) == C_QUAL_UNION_TYPE)); ++ locus = CTreeIdentPointer(CTreeDeclName(decl)); ++ c_constructor_incremental |= CIsTreeNodeStatic(decl); ++ } ++ else ++ { ++ c_require_constant_value = 0; ++ c_require_constant_elements = 0; ++ locus = "(anonymous)"; ++ } ++ ++ c_constructor_stack = 0; ++ ++ c_missing_braces_mentioned = 0; ++ ++ c_spelling_base = 0; ++ c_spelling_size = 0; ++ RESTORE_SPELLING_DEPTH (0); ++ ++ if (locus) ++ c_push_string(locus); ++} ++ ++c_tree_node *c_finish_init() ++{ ++ struct initializer_stack *p = c_initializer_stack; ++ c_tree_node *tmp_node; ++ ++ /* Output subconstants (string constants, usually) ++ that were referenced within this initializer and saved up. ++ Must do this if and only if we called defer_addressed_constants. */ ++# ifdef LUDO_NO_SKIP ++ if (c_constructor_subconstants_deferred) ++ c_output_deferred_addressed_constants(); ++# endif ++ ++ /* Free the whole constructor stack of this initializer. */ ++ while (c_constructor_stack) ++ { ++ struct constructor_stack *q = c_constructor_stack; ++ c_constructor_stack = q->next; ++ autfreeblock (q); ++ } ++ ++ /* Pop back to the data of the outer initializer (if any). */ ++ c_constructor_decl = p->decl; ++ c_constructor_asmspec = p->asmspec; ++ c_constructor_incremental = p->incremental; ++ c_require_constant_value = p->require_constant_value; ++ c_require_constant_elements = p->require_constant_elements; ++ c_constructor_stack = p->constructor_stack; ++ c_constructor_elements = p->elements; ++ c_spelling = p->spelling; ++ c_spelling_base = p->spelling_base; ++ c_spelling_size = p->spelling_size; ++ c_constructor_subconstants_deferred = p->deferred; ++ c_constructor_top_level = p->top_level; ++ c_initializer_stack = p->next; ++ autfreeblock (p); ++ ++ tmp_node = c_tree_reverse_list( c_output_constant_list ); ++ c_output_constant_list = (c_tree_node *)0; ++ ++ return( tmp_node ); ++} ++ ++ ++/* Don't read a struct incrementally if it has any bitfields, ++ because the incremental reading code doesn't know how to ++ handle bitfields yet. */ ++ ++static void c_check_init_type_bitfields (type) ++ c_tree_node *type; ++{ ++ if ( CTreeTypeCode(type) == C_RECORD_TYPE) ++ { ++ c_tree_node *tail; ++ for (tail = CTreeTypeValues(type); tail; ++ tail = CTreeChain(tail)) ++ { ++ if ( CIsTreeDeclCBitField(tail) ++ /* This catches cases like `int foo : 8;'. */ ++ || CTreeDeclMode(tail) != CTreeTypeMode(CTreeType(tail))) ++ { ++ c_constructor_incremental = 0; ++ break; ++ } ++ ++ c_check_init_type_bitfields (CTreeType(tail)); ++ } ++ } ++ ++ else if ( CTreeTypeCode(type) == C_ARRAY_TYPE) ++ { ++ c_check_init_type_bitfields (CTreeType(type)); ++ } ++} ++ ++/* Call here when we see the initializer is surrounded by braces. ++ This is instead of a call to push_init_level; ++ it is matched by a call to pop_init_level. ++ ++ TYPE is the type to initialize, for a constructor expression. ++ For an initializer for a decl, TYPE is zero. */ ++ ++void ++c_really_start_incremental_init (type) ++ c_tree_node *type; ++{ ++ struct constructor_stack *p ++ = (struct constructor_stack *)autallocblock(sizeof (struct constructor_stack)); ++ ++ if (type == 0) ++ type = CTreeType(c_constructor_decl); ++ ++ /* Turn off constructor_incremental if type is a struct with bitfields. ++ Do this before the first push, so that the corrected value ++ is available in c_finish_init. */ ++ c_check_init_type_bitfields (type); ++ ++ p->type = c_constructor_type; ++ p->fields = c_constructor_fields; ++ p->index = c_constructor_index; ++ p->range_end = c_constructor_range_end; ++ p->max_index = c_constructor_max_index; ++ p->unfilled_index = c_constructor_unfilled_index; ++ p->unfilled_fields = c_constructor_unfilled_fields; ++ p->bit_index = c_constructor_bit_index; ++ p->elements = c_constructor_elements; ++ p->constant = c_constructor_constant; ++ p->simple = c_constructor_simple; ++ p->erroneous = c_constructor_erroneous; ++ p->pending_elts = c_constructor_pending_elts; ++ p->depth = c_constructor_depth; ++ p->replacement_value = 0; ++ p->implicit = 0; ++ p->incremental = c_constructor_incremental; ++ p->outer = 0; ++ p->next = 0; ++ c_constructor_stack = p; ++ ++ c_constructor_constant = 1; ++ c_constructor_simple = 1; ++ c_constructor_depth = SPELLING_DEPTH (); ++ c_constructor_elements = 0; ++ c_constructor_pending_elts = 0; ++ c_constructor_type = type; ++ ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ c_constructor_fields = CTreeTypeValues(c_constructor_type); ++ /* Skip any nameless bit fields at the beginning. */ ++ while (c_constructor_fields != 0 && CIsTreeDeclCBitField(c_constructor_fields) ++ && CTreeDeclName(c_constructor_fields) == 0) ++ c_constructor_fields = CTreeChain(c_constructor_fields); ++ c_constructor_unfilled_fields = c_constructor_fields; ++ c_constructor_bit_index = c_tree_copy_node(c_integer_zero_node); ++ } ++ else if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ c_constructor_range_end = 0; ++ if ( CTreeTypeValues(c_constructor_type)) ++ { ++ c_constructor_max_index ++ = CTreeTypeMaxValue( CTreeTypeValues(c_constructor_type)); ++ c_constructor_index ++ = c_tree_copy_node( CTreeTypeMinValue(CTreeTypeValues(c_constructor_type))); ++ } ++ else ++ { ++ c_constructor_index = c_tree_copy_node(c_integer_zero_node); ++ } ++ c_constructor_unfilled_index = c_tree_copy_node(c_constructor_index); ++ } ++ else ++ { ++ /* Handle the case of int x = {5}; */ ++ c_constructor_fields = c_constructor_type; ++ c_constructor_unfilled_fields = c_constructor_type; ++ } ++ ++ if (c_constructor_incremental) ++ { ++# ifdef LUDO_NO_SKIP ++ int momentary = suspend_momentary (); ++ push_obstacks_nochange (); ++ if ( CIsTreeNodePermanent(c_constructor_decl)) ++ end_temporary_allocation (); ++ make_decl_rtl (constructor_decl, constructor_asmspec, ++ constructor_top_level); ++ assemble_variable(c_constructor_decl, c_constructor_top_level, 0, 1); ++ pop_obstacks (); ++ resume_momentary (momentary); ++# endif ++ } ++ ++ if (c_constructor_incremental) ++ { ++# ifdef LUDO_NO_SKIP ++ c_defer_addressed_constants (); ++# endif ++ c_constructor_subconstants_deferred = 1; ++ } ++} ++ ++static void c_assemble_zeros( Size ) ++ ++ int Size; ++{ ++ c_tree_node *size_node; ++ ++ if ( Size > 0 ) ++ { ++ size_node = c_tree_build_int_2( Size, Size ); ++ ++ c_output_constant_list = ++ c_tree_add_head_list( size_node, c_integer_zero_node, c_output_constant_list ); ++ } ++} ++ ++static void c_output_constant( TreeCst, Size ) ++ ++ c_tree_node *TreeCst; ++ int Size; ++{ ++ c_output_constant_list = ++ c_tree_add_head_list( (c_tree_node *)0, TreeCst, c_output_constant_list ); ++} ++ ++/* Push down into a subobject, for initialization. ++ If this is for an explicit set of braces, IMPLICIT is 0. ++ If it is because the next element belongs at a lower level, ++ IMPLICIT is 1. */ ++ ++void ++c_push_init_level(implicit) ++ int implicit; ++{ ++ struct constructor_stack *p; ++ ++ /* If we've exhausted any levels that didn't have braces, ++ pop them now. */ ++ while (c_constructor_stack->implicit) ++ { ++ if (( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ && c_constructor_fields == 0) ++ { ++ c_process_init_element(c_pop_init_level(1)); ++ } ++ else if (CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE ++ && c_tree_is_int_cst_lt(c_constructor_max_index, c_constructor_index)) ++ { ++ c_process_init_element( c_pop_init_level(1)); ++ } ++ else ++ break; ++ } ++ ++ /* Structure elements may require alignment. Do this now if necessary ++ for the subaggregate, and if it comes next in sequence. Don't do ++ this for subaggregates that will go on the pending list. */ ++ if (c_constructor_incremental && c_constructor_type != 0 ++ && CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE && c_constructor_fields ++ && c_constructor_fields == c_constructor_unfilled_fields) ++ { ++ /* Advance to offset of this element. */ ++ if (! c_tree_is_int_cst_equal(c_constructor_bit_index, ++ CTreeDeclArguments(c_constructor_fields))) ++ { ++ int next = (CTreeIntCstLow(CTreeDeclArguments(c_constructor_fields)) ++ / C_BITS_PER_UNIT); ++ int here = (CTreeIntCstLow(c_constructor_bit_index) ++ / C_BITS_PER_UNIT); ++ c_assemble_zeros(next - here); ++ } ++ /* Indicate that we have now filled the structure up to the current ++ field. */ ++ c_constructor_unfilled_fields = c_constructor_fields; ++ } ++ ++ p = (struct constructor_stack *)autallocblock(sizeof (struct constructor_stack)); ++ p->type = c_constructor_type; ++ p->fields = c_constructor_fields; ++ p->index = c_constructor_index; ++ p->range_end = c_constructor_range_end; ++ p->max_index = c_constructor_max_index; ++ p->unfilled_index = c_constructor_unfilled_index; ++ p->unfilled_fields = c_constructor_unfilled_fields; ++ p->bit_index = c_constructor_bit_index; ++ p->elements = c_constructor_elements; ++ p->constant = c_constructor_constant; ++ p->simple = c_constructor_simple; ++ p->erroneous = c_constructor_erroneous; ++ p->pending_elts = c_constructor_pending_elts; ++ p->depth = c_constructor_depth; ++ p->replacement_value = 0; ++ p->implicit = implicit; ++ p->incremental = c_constructor_incremental; ++ p->outer = 0; ++ p->next = c_constructor_stack; ++ c_constructor_stack = p; ++ ++ c_constructor_constant = 1; ++ c_constructor_simple = 1; ++ c_constructor_depth = SPELLING_DEPTH (); ++ c_constructor_elements = 0; ++ c_constructor_pending_elts = 0; ++ ++ /* Don't die if an entire brace-pair level is superfluous ++ in the containing level. */ ++ if (c_constructor_type == 0) ++ ; ++ else if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ /* Don't die if there are extra init elts at the end. */ ++ if (c_constructor_fields == 0) ++ c_constructor_type = 0; ++ else ++ { ++ c_constructor_type = CTreeType(c_constructor_fields); ++ c_push_member_name (c_constructor_fields); ++ c_constructor_depth++; ++ if (c_constructor_fields != c_constructor_unfilled_fields) ++ c_constructor_incremental = 0; ++ } ++ } ++ else if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ c_constructor_type = CTreeType(c_constructor_type); ++ c_push_array_bounds (CTreeIntCstLow(c_constructor_index)); ++ c_constructor_depth++; ++ if (! c_tree_is_int_cst_equal(c_constructor_index, c_constructor_unfilled_index) ++ || c_constructor_range_end != 0) ++ c_constructor_incremental = 0; ++ } ++ ++ if (c_constructor_type == 0) ++ { ++ error_init ("extra brace group at end of initializer%s", ++ " for `%s'", NULL); ++ c_constructor_fields = 0; ++ c_constructor_unfilled_fields = 0; ++ return; ++ } ++ ++ /* Turn off constructor_incremental if type is a struct with bitfields. */ ++ c_check_init_type_bitfields(c_constructor_type); ++ ++ if (implicit && c_warn_missing_braces && !c_missing_braces_mentioned) ++ { ++ c_missing_braces_mentioned = 1; ++ warning_init ("missing braces around initializer%s", " for `%s'", NULL); ++ } ++ ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ c_constructor_fields = CTreeTypeValues(c_constructor_type); ++ /* Skip any nameless bit fields at the beginning. */ ++ while (c_constructor_fields != 0 && CIsTreeDeclCBitField(c_constructor_fields) ++ && CTreeDeclName(c_constructor_fields) == 0) ++ c_constructor_fields = CTreeChain(c_constructor_fields); ++ c_constructor_unfilled_fields = c_constructor_fields; ++ c_constructor_bit_index = c_tree_copy_node(c_integer_zero_node); ++ } ++ else if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ c_constructor_range_end = 0; ++ if ( CTreeTypeValues(c_constructor_type)) ++ { ++ c_constructor_max_index ++ = CTreeTypeMaxValue( CTreeTypeValues(c_constructor_type)); ++ c_constructor_index ++ = c_tree_copy_node( CTreeTypeMinValue( CTreeTypeValues(c_constructor_type))); ++ } ++ else ++ c_constructor_index = c_tree_copy_node(c_integer_zero_node); ++ c_constructor_unfilled_index = c_tree_copy_node(c_constructor_index); ++ } ++ else ++ { ++ warning_init ("braces around scalar initializer%s", " for `%s'", NULL); ++ c_constructor_fields = c_constructor_type; ++ c_constructor_unfilled_fields = c_constructor_type; ++ } ++} ++ ++static void c_output_init_element(); ++ ++/* Output any pending elements which have become next. ++ As we output elements, constructor_unfilled_{fields,index} ++ advances, which may cause other elements to become next; ++ if so, they too are output. ++ ++ If ALL is 0, we return when there are ++ no more pending elements to output now. ++ ++ If ALL is 1, we output space as necessary so that ++ we can output all the pending elements. */ ++ ++static void c_output_pending_init_elements (all) ++ int all; ++{ ++ c_tree_node *tail; ++ c_tree_node *next; ++ ++ retry: ++ ++ /* Look thru the whole pending list. ++ If we find an element that should be output now, ++ output it. Otherwise, set NEXT to the element ++ that comes first among those still pending. */ ++ ++ next = 0; ++ for (tail = c_constructor_pending_elts; tail; ++ tail = CTreeChain(tail)) ++ { ++ if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ if (c_tree_is_int_cst_equal(CTreeListPurpose(tail), ++ c_constructor_unfilled_index)) ++ { ++ c_output_init_element(CTreeListValue(tail), ++ CTreeType(c_constructor_type), ++ c_constructor_unfilled_index, 0); ++ goto retry; ++ } ++ else if (c_tree_is_int_cst_lt(CTreeListPurpose(tail), ++ c_constructor_unfilled_index)) ++ ; ++ else if (next == 0 ++ || c_tree_is_int_cst_lt(CTreeListPurpose(tail), next)) ++ next = CTreeListPurpose(tail); ++ } ++ else if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ if (CTreeListPurpose(tail) == c_constructor_unfilled_fields) ++ { ++ c_output_init_element(CTreeListValue(tail), ++ CTreeType(c_constructor_unfilled_fields), ++ c_constructor_unfilled_fields, ++ 0); ++ goto retry; ++ } ++ else if (c_constructor_unfilled_fields == 0 ++ || c_tree_is_int_cst_lt( CTreeDeclArguments(CTreeListPurpose(tail)), ++ CTreeDeclArguments(c_constructor_unfilled_fields))) ++ ; ++ else if (next == 0 ++ || c_tree_is_int_cst_lt( CTreeDeclArguments(CTreeListPurpose(tail)), ++ CTreeDeclArguments(next))) ++ next = CTreeListPurpose(tail); ++ } ++ } ++ ++ /* Ordinarily return, but not if we want to output all ++ and there are elements left. */ ++ if (! (all && next != 0)) ++ return; ++ ++ /* Generate space up to the position of NEXT. */ ++ if (c_constructor_incremental) ++ { ++ c_tree_node *filled; ++ c_tree_node *nextpos_tree = c_tree_get_size_int(0); ++ ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ /* Find the last field written out, if any. */ ++ for (tail = CTreeTypeValues(c_constructor_type); tail; ++ tail = CTreeChain(tail)) ++ if (CTreeChain(tail) == c_constructor_unfilled_fields) ++ break; ++ ++ if (tail) ++ /* Find the offset of the end of that field. */ ++ filled = c_build_size_binop(C_CEIL_DIV_EXPR, ++ c_build_size_binop(C_PLUS_EXPR, ++ CTreeDeclArguments(tail), ++ CTreeDeclSize(tail)), ++ c_tree_get_size_int(C_BITS_PER_UNIT)); ++ else ++ filled = c_tree_get_size_int(0); ++ ++ nextpos_tree = c_build_size_binop(C_CEIL_DIV_EXPR, ++ CTreeDeclArguments(next), ++ c_tree_get_size_int(C_BITS_PER_UNIT)); ++ ++ CTreeIntCstHigh(c_constructor_bit_index) ++ = CTreeIntCstHigh(CTreeDeclArguments(next)); ++ CTreeIntCstLow(c_constructor_bit_index) ++ = CTreeIntCstLow(CTreeDeclArguments(next)); ++ c_constructor_unfilled_fields = next; ++ } ++ else if (CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ filled = c_build_size_binop(C_MULT_EXPR, c_constructor_unfilled_index, ++ c_get_size_in_bytes(CTreeType(c_constructor_type))); ++ nextpos_tree ++ = c_build_size_binop(C_MULT_EXPR, next, ++ c_get_size_in_bytes(CTreeType(c_constructor_type))); ++ CTreeIntCstLow(c_constructor_unfilled_index) ++ = CTreeIntCstLow(next); ++ CTreeIntCstHigh(c_constructor_unfilled_index) ++ = CTreeIntCstHigh(next); ++ } ++ else ++ filled = 0; ++ ++ if (filled) ++ { ++ int nextpos = CTreeIntCstLow(nextpos_tree); ++ ++ c_assemble_zeros(nextpos - CTreeIntCstLow(filled)); ++ } ++ } ++ else ++ { ++ /* If it's not incremental, just skip over the gap, ++ so that after jumping to retry we will output the next ++ successive element. */ ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ c_constructor_unfilled_fields = next; ++ else if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ CTreeIntCstLow(c_constructor_unfilled_index) ++ = CTreeIntCstLow(next); ++ CTreeIntCstHigh(c_constructor_unfilled_index) ++ = CTreeIntCstHigh(next); ++ } ++ } ++ ++ goto retry; ++} ++ ++/* "Output" the next constructor element. ++ At top level, really output it to assembler code now. ++ Otherwise, collect it in a list from which we will make a CONSTRUCTOR. ++ TYPE is the data type that the containing data type wants here. ++ FIELD is the field (a FIELD_DECL) or the index that this element fills. ++ ++ PENDING if non-nil means output pending elements that belong ++ right after this element. (PENDING is normally 1; ++ it is 0 while outputting pending elements, to avoid recursion.) */ ++ ++static void ++c_output_init_element (value, type, field, pending) ++ c_tree_node *value; ++ c_tree_node *type; ++ c_tree_node *field; ++ int pending; ++{ ++ int duplicate = 0; ++ ++ if ( CTreeTypeCode(CTreeType(value)) == C_FUNCTION_TYPE ++ || ( CTreeTypeCode(CTreeType(value)) == C_ARRAY_TYPE ++ && !( CTreeNodeFirstCode(value) == C_STRING_NODE ++ && CTreeTypeCode(type) == C_ARRAY_TYPE ++ && CTreeTypeCode(CTreeType(type)) == C_INTEGER_TYPE) ++ && !c_is_comptypes(CTreeTypeMainVariant(CTreeType(value)), ++ CTreeTypeMainVariant(type)))) ++ { ++ value = c_default_conversion(value); ++ } ++ ++ if (value == c_error_mark_node) ++ c_constructor_erroneous = 1; ++ else if (! CIsTreeNodeConstant(value)) ++ c_constructor_constant = 0; ++ else if (c_is_initializer_constant_valid_p(value, CTreeType(value)) == 0 ++ || (( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ && CIsTreeDeclCBitField(field) ++ && CTreeNodeFirstCode(value) != C_INT_CST_NODE)) ++ c_constructor_simple = 0; ++ ++ if (c_require_constant_value && ! CIsTreeNodeConstant(value)) ++ { ++ error_init ("initializer element%s is not constant", ++ " for `%s'", NULL); ++ value = c_error_mark_node; ++ } ++ else if (c_require_constant_elements ++ && c_is_initializer_constant_valid_p(value, CTreeType(value)) == 0) ++ { ++ error_init ("initializer element%s is not computable at load time", ++ " for `%s'", NULL); ++ value = c_error_mark_node; ++ } ++ ++ /* If this element duplicates one on constructor_pending_elts, ++ print a message and ignore it. Don't do this when we're ++ processing elements taken off constructor_pending_elts, ++ because we'd always get spurious errors. */ ++ if (pending) ++ { ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ if (c_tree_get_purpose_member(field, c_constructor_pending_elts)) ++ { ++ error_init ("duplicate initializer%s", " for `%s'", NULL); ++ duplicate = 1; ++ } ++ } ++ if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ c_tree_node *tail; ++ for (tail = c_constructor_pending_elts; tail; ++ tail = CTreeChain(tail)) ++ if (CTreeListPurpose(tail) != 0 ++ && CTreeNodeFirstCode(CTreeListPurpose(tail)) == C_INT_CST_NODE ++ && c_tree_is_int_cst_equal(CTreeListPurpose(tail), c_constructor_index)) ++ break; ++ ++ if (tail != 0) ++ { ++ error_init ("duplicate initializer%s", " for `%s'", NULL); ++ duplicate = 1; ++ } ++ } ++ } ++ ++ /* If this element doesn't come next in sequence, ++ put it on constructor_pending_elts. */ ++ if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE ++ && !c_tree_is_int_cst_equal(field, c_constructor_unfilled_index)) ++ { ++ if (! duplicate) ++ /* The copy_node is needed in case field is actually ++ constructor_index, which is modified in place. */ ++ c_constructor_pending_elts ++ = c_tree_add_head_list(c_tree_copy_node(field), ++ c_digest_init(type, value, c_require_constant_value, ++ c_require_constant_elements), ++ c_constructor_pending_elts); ++ } ++ else if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ && field != c_constructor_unfilled_fields) ++ { ++ /* We do this for records but not for unions. In a union, ++ no matter which field is specified, it can be initialized ++ right away since it starts at the beginning of the union. */ ++ if (!duplicate) ++ c_constructor_pending_elts ++ = c_tree_add_head_list(field, ++ c_digest_init(type, value, c_require_constant_value, ++ c_require_constant_elements), ++ c_constructor_pending_elts); ++ } ++ else ++ { ++ /* Otherwise, output this element either to ++ constructor_elements or to the assembler file. */ ++ ++ if (!duplicate) ++ { ++ if (! c_constructor_incremental) ++ { ++ if (field && CTreeNodeFirstCode(field) == C_INT_CST_NODE) ++ field = c_tree_copy_node (field); ++ c_constructor_elements ++ = c_tree_add_head_list(field, c_digest_init(type, value, ++ c_require_constant_value, ++ c_require_constant_elements), ++ c_constructor_elements); ++ } ++ else ++ { ++ /* Structure elements may require alignment. ++ Do this, if necessary. */ ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE) ++ { ++ /* Advance to offset of this element. */ ++ if (! c_tree_is_int_cst_equal(c_constructor_bit_index, ++ CTreeDeclArguments(field))) ++ { ++ int next = (CTreeIntCstLow(CTreeDeclArguments(field)) ++ / C_BITS_PER_UNIT); ++ int here = (CTreeIntCstLow(c_constructor_bit_index) ++ / C_BITS_PER_UNIT); ++ ++ c_assemble_zeros(next - here); ++ } ++ } ++ { ++ c_tree_node *tmp_node; ++ tmp_node = c_digest_init(type, value, c_require_constant_value, ++ c_require_constant_elements); ++ c_output_constant( tmp_node, c_get_int_size_in_bytes(type)); ++ ++ /* For a record or union, ++ keep track of end position of last field. */ ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ c_tree_node *temp = c_build_size_binop( ++ C_PLUS_EXPR, CTreeDeclArguments(field), CTreeDeclSize(field)); ++ CTreeIntCstLow(c_constructor_bit_index) ++ = CTreeIntCstLow(temp); ++ CTreeIntCstHigh(c_constructor_bit_index) ++ = CTreeIntCstHigh(temp); ++ } ++ } ++ } ++ } ++ ++ /* Advance the variable that indicates sequential elements output. */ ++ if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ c_tree_node *tem = c_build_size_binop(C_PLUS_EXPR, ++ c_constructor_unfilled_index, c_integer_one_node); ++ CTreeIntCstLow(c_constructor_unfilled_index) ++ = CTreeIntCstLow(tem); ++ CTreeIntCstHigh(c_constructor_unfilled_index) ++ = CTreeIntCstHigh(tem); ++ } ++ else if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE) ++ c_constructor_unfilled_fields = CTreeChain(c_constructor_unfilled_fields); ++ else if ( CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ c_constructor_unfilled_fields = 0; ++ ++ /* Now output any pending elements which have become next. */ ++ if (pending) ++ c_output_pending_init_elements(0); ++ } ++} ++ ++ ++/* At the end of an implicit or explicit brace level, ++ finish up that level of constructor. ++ If we were outputting the elements as they are read, return 0 ++ from inner levels (process_init_element ignores that), ++ but return error_mark_node from the outermost level ++ (that's what we want to put in DECL_INITIAL). ++ Otherwise, return a CONSTRUCTOR expression. */ ++ ++c_tree_node *c_pop_init_level(implicit) ++ int implicit; ++{ ++ struct constructor_stack *p; ++ int size = 0; ++ c_tree_node *constructor = 0; ++ ++ if (implicit == 0) ++ { ++ /* When we come to an explicit close brace, ++ pop any inner levels that didn't have explicit braces. */ ++ while (c_constructor_stack->implicit) ++ { ++ c_process_init_element(c_pop_init_level(1)); ++ } ++ } ++ ++ p = c_constructor_stack; ++ ++ if (c_constructor_type != 0) ++ size = c_get_int_size_in_bytes(c_constructor_type); ++ ++ /* Now output all pending elements. */ ++ c_output_pending_init_elements(1); ++ ++ /* Pad out the end of the structure. */ ++ ++ if (p->replacement_value) ++ { ++ /* If this closes a superfluous brace pair, ++ just pass out the element between them. */ ++ constructor = p->replacement_value; ++ /* If this is the top level thing within the initializer, ++ and it's for a variable, then since we already called ++ assemble_variable, we must output the value now. */ ++ if (p->next == 0 && c_constructor_decl != 0 ++ && c_constructor_incremental) ++ { ++ constructor = c_digest_init(c_constructor_type, constructor, ++ c_require_constant_value, ++ c_require_constant_elements); ++ ++ /* If initializing an array of unknown size, ++ determine the size now. */ ++ if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE ++ && CTreeTypeValues(c_constructor_type) == 0) ++ { ++ int failure; ++ ++# ifdef LUDO_NO_SKIP ++ int momentary_p; ++ push_obstacks_nochange (); ++ if (TREE_PERMANENT (constructor_type)) ++ end_temporary_allocation (); ++ ++ momentary_p = suspend_momentary (); ++# endif ++ ++ /* We shouldn't have an incomplete array type within ++ some other type. */ ++ if (c_constructor_stack->next) ++ abort (); ++ ++ failure ++ = c_complete_array_type(c_constructor_type, constructor, 0); ++ if (failure) ++ abort (); ++ ++ size = c_get_int_size_in_bytes(c_constructor_type); ++# ifdef LUDO_NO_SKIP ++ resume_momentary (momentary_p); ++ pop_obstacks (); ++# endif ++ } ++ ++# ifdef LUDO_NO_SKIP ++ c_output_constant(constructor, size); ++# endif ++ } ++ } ++ else if (c_constructor_type == 0) ++ ; ++ else if ( CTreeTypeCode(c_constructor_type) != C_RECORD_TYPE ++ && CTreeTypeCode(c_constructor_type) != C_UNION_TYPE ++ && CTreeTypeCode(c_constructor_type) != C_ARRAY_TYPE ++ && ! c_constructor_incremental) ++ { ++ /* A nonincremental scalar initializer--just return ++ the element, after verifying there is just one. */ ++ if (c_constructor_elements == 0) ++ { ++ error_init ("empty scalar initializer%s", ++ " for `%s'", NULL); ++ constructor = c_error_mark_node; ++ } ++ else if (CTreeChain(c_constructor_elements) != 0) ++ { ++ error_init("extra elements in scalar initializer%s", " for `%s'", NULL); ++ constructor = CTreeListValue(c_constructor_elements); ++ } ++ else ++ constructor = CTreeListValue(c_constructor_elements); ++ } ++ else if (! c_constructor_incremental) ++ { ++ if (c_constructor_erroneous) ++ constructor = c_error_mark_node; ++ else ++ { ++# ifdef LUDO_NO_SKIP ++ int momentary = suspend_momentary (); ++# endif ++ ++ constructor = c_tree_build_binary_typed_expr( ++ C_CONSTRUCTOR_EXPR, c_constructor_type, NULL, ++ c_tree_reverse_list(c_constructor_elements)); ++ if (c_constructor_constant) ++ CSetTreeNodeConstant(constructor); ++ if (c_constructor_constant && c_constructor_simple) ++ CSetTreeNodeStatic(constructor); ++ ++# ifdef LUDO_NO_SKIP ++ resume_momentary (momentary); ++# endif ++ } ++ } ++ else ++ { ++ c_tree_node *filled; ++# ifdef LUDO_NO_SKIP ++ int momentary = suspend_momentary (); ++# endif ++ ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ /* Find the offset of the end of that field. */ ++ filled = c_build_size_binop(C_CEIL_DIV_EXPR, ++ c_constructor_bit_index, ++ c_tree_get_size_int(C_BITS_PER_UNIT)); ++ } ++ else if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ /* If initializing an array of unknown size, ++ determine the size now. */ ++ if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE ++ && CTreeTypeValues(c_constructor_type) == 0) ++ { ++ c_tree_node *maxindex ++ = c_build_size_binop(C_MINUS_EXPR, ++ c_constructor_unfilled_index, ++ c_integer_one_node); ++ ++# ifdef LUDO_NO_SKIP ++ push_obstacks_nochange (); ++ if (CIsTreeNodePermanent(c_constructor_type)) ++ end_temporary_allocation (); ++# endif ++ maxindex = c_tree_copy_node(maxindex); ++ CTreeTypeValues(c_constructor_type) = c_tree_build_index_type(maxindex); ++ CTreeType(maxindex) = CTreeTypeValues(c_constructor_type); ++ ++ /* TYPE_MAX_VALUE is always one less than the number of elements ++ in the array, because we start counting at zero. Therefore, ++ warn only if the value is less than zero. */ ++ if (c_pedantic ++ && (c_tree_is_int_cst_sgn( ++ CTreeTypeMaxValue(CTreeTypeValues(c_constructor_type))) < 0)) ++ { ++ error_with_decl(c_constructor_decl, "zero or negative array size `%s'"); ++ } ++ c_layout_type(c_constructor_type); ++ size = c_get_int_size_in_bytes(c_constructor_type); ++# ifdef LUDO_NO_SKIP ++ pop_obstacks (); ++# endif ++ } ++ ++ filled = c_build_size_binop(C_MULT_EXPR, c_constructor_unfilled_index, ++ c_get_size_in_bytes(CTreeType(c_constructor_type))); ++ } ++ else ++ filled = 0; ++ ++ if (filled != 0) ++ { ++ c_assemble_zeros(size - CTreeIntCstLow(filled)); ++ } ++ ++# ifdef LUDO_NO_SKIP ++ resume_momentary (momentary); ++# endif ++ } ++ ++ ++ c_constructor_type = p->type; ++ c_constructor_fields = p->fields; ++ c_constructor_index = p->index; ++ c_constructor_range_end = p->range_end; ++ c_constructor_max_index = p->max_index; ++ c_constructor_unfilled_index = p->unfilled_index; ++ c_constructor_unfilled_fields = p->unfilled_fields; ++ c_constructor_bit_index = p->bit_index; ++ c_constructor_elements = p->elements; ++ c_constructor_constant = p->constant; ++ c_constructor_simple = p->simple; ++ c_constructor_erroneous = p->erroneous; ++ c_constructor_pending_elts = p->pending_elts; ++ c_constructor_depth = p->depth; ++ c_constructor_incremental = p->incremental; ++ RESTORE_SPELLING_DEPTH(c_constructor_depth); ++ ++ c_constructor_stack = p->next; ++ autfreeblock(p); ++ ++ if (constructor == 0) ++ { ++ if (c_constructor_stack == 0) ++ return c_error_mark_node; ++ return NULL; ++ } ++ return constructor; ++} ++ ++/* Add one non-braced element to the current constructor level. ++ This adjusts the current position within the constructor's type. ++ This may also start or terminate implicit levels ++ to handle a partly-braced initializer. ++ ++ Once this has found the correct level for the new element, ++ it calls output_init_element. ++ ++ Note: if we are incrementally outputting this constructor, ++ this function may be called with a null argument ++ representing a sub-constructor that was already incrementally output. ++ When that happens, we output nothing, but we do the bookkeeping ++ to skip past that element of the current constructor. */ ++ ++void c_process_init_element(value) ++ c_tree_node *value; ++{ ++ c_tree_node *orig_value = value; ++ int string_flag = value != 0 && CTreeNodeFirstCode(value) == C_STRING_NODE; ++ ++ /* Handle superfluous braces around string cst as in ++ char x[] = {"foo"}; */ ++ if (string_flag ++ && c_constructor_type ++ && CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE ++ && CTreeTypeCode(CTreeType(c_constructor_type)) == C_INTEGER_TYPE ++ && c_tree_is_integer_zerop(c_constructor_unfilled_index)) ++ { ++ c_constructor_stack->replacement_value = value; ++ return; ++ } ++ ++ if (c_constructor_stack->replacement_value != 0) ++ { ++ error_init("excess elements in struct initializer%s", " after `%s'", NULL); ++ return; ++ } ++ ++ /* Ignore elements of a brace group if it is entirely superfluous ++ and has already been diagnosed. */ ++ if (c_constructor_type == 0) ++ return; ++ ++ /* If we've exhausted any levels that didn't have braces, ++ pop them now. */ ++ while (c_constructor_stack->implicit) ++ { ++ if ((CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE ++ || CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ && c_constructor_fields == 0) ++ { ++ c_process_init_element(c_pop_init_level(1)); ++ } ++ else if (CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE ++ && (c_constructor_max_index == 0 ++ || c_tree_is_int_cst_lt(c_constructor_max_index, c_constructor_index))) ++ { ++ c_process_init_element( c_pop_init_level(1)); ++ } ++ else ++ break; ++ } ++ ++ while (1) ++ { ++ if ( CTreeTypeCode(c_constructor_type) == C_RECORD_TYPE) ++ { ++ c_tree_node *fieldtype; ++ int fieldcode; ++ ++ if (c_constructor_fields == 0) ++ { ++ pedwarn_init ("excess elements in struct initializer%s", ++ " after `%s'", NULL); ++ break; ++ } ++ ++ fieldtype = CTreeType(c_constructor_fields); ++ if (fieldtype != c_error_mark_node) ++ { ++ fieldtype = CTreeTypeMainVariant(fieldtype); ++ } ++ fieldcode = CTreeTypeCode(fieldtype); ++ ++ /* Accept a string constant to initialize a subarray. */ ++ if (value != 0 ++ && fieldcode == C_ARRAY_TYPE ++ && CTreeTypeCode(CTreeType(fieldtype)) == C_INTEGER_TYPE ++ && string_flag) ++ { ++ value = orig_value; ++ } ++ /* Otherwise, if we have come to a subaggregate, ++ and we don't have an element of its type, push into it. */ ++ else if (value != 0 && !c_constructor_no_implicit ++ && value != c_error_mark_node ++ && CTreeTypeMainVariant(CTreeType(value)) != fieldtype ++ && (fieldcode == C_RECORD_TYPE || fieldcode == C_ARRAY_TYPE ++ || fieldcode == C_UNION_TYPE)) ++ { ++ c_push_init_level(1); ++ continue; ++ } ++ ++ if (value) ++ { ++ c_push_member_name(c_constructor_fields); ++ c_output_init_element(value, fieldtype, c_constructor_fields, 1); ++ RESTORE_SPELLING_DEPTH(c_constructor_depth); ++ } ++ else ++ /* Do the bookkeeping for an element that was ++ directly output as a constructor. */ ++ { ++ /* For a record, keep track of end position of last field. */ ++ c_tree_node *temp = c_build_size_binop(C_PLUS_EXPR, ++ CTreeDeclArguments(c_constructor_fields), ++ CTreeDeclSize(c_constructor_fields)); ++ CTreeIntCstLow(c_constructor_bit_index) ++ = CTreeIntCstLow(temp); ++ CTreeIntCstHigh(c_constructor_bit_index) ++ = CTreeIntCstHigh(temp); ++ ++ c_constructor_unfilled_fields = CTreeChain(c_constructor_fields); ++ } ++ ++ c_constructor_fields = CTreeChain(c_constructor_fields); ++ /* Skip any nameless bit fields at the beginning. */ ++ while (c_constructor_fields != 0 ++ && CIsTreeDeclCBitField(c_constructor_fields) ++ && CTreeDeclName(c_constructor_fields) == 0) ++ { ++ c_constructor_fields = CTreeChain(c_constructor_fields); ++ } ++ break; ++ } ++ if ( CTreeTypeCode(c_constructor_type) == C_UNION_TYPE) ++ { ++ c_tree_node *fieldtype; ++ int fieldcode; ++ ++ if (c_constructor_fields == 0) ++ { ++ pedwarn_init ("excess elements in union initializer%s", " after `%s'", NULL); ++ break; ++ } ++ ++ fieldtype = CTreeType(c_constructor_fields); ++ if (fieldtype != c_error_mark_node) ++ fieldtype = CTreeTypeMainVariant(fieldtype); ++ fieldcode = CTreeTypeCode(fieldtype); ++ ++ /* Accept a string constant to initialize a subarray. */ ++ if (value != 0 ++ && fieldcode == C_ARRAY_TYPE ++ && CTreeTypeCode(CTreeType(fieldtype)) == C_INTEGER_TYPE ++ && string_flag) ++ { ++ value = orig_value; ++ } ++ /* Otherwise, if we have come to a subaggregate, ++ and we don't have an element of its type, push into it. */ ++ else if (value != 0 && !c_constructor_no_implicit ++ && value != c_error_mark_node ++ && CTreeTypeMainVariant(CTreeType(value)) != fieldtype ++ && (fieldcode == C_RECORD_TYPE || fieldcode == C_ARRAY_TYPE ++ || fieldcode == C_UNION_TYPE)) ++ { ++ c_push_init_level(1); ++ continue; ++ } ++ ++ if (value) ++ { ++ c_push_member_name(c_constructor_fields); ++ c_output_init_element(value, fieldtype, c_constructor_fields, 1); ++ RESTORE_SPELLING_DEPTH(c_constructor_depth); ++ } ++ else ++ /* Do the bookkeeping for an element that was ++ directly output as a constructor. */ ++ { ++ CTreeIntCstLow(c_constructor_bit_index) ++ = CTreeIntCstLow( CTreeDeclSize(c_constructor_fields)); ++ CTreeIntCstHigh(c_constructor_bit_index) ++ = CTreeIntCstHigh( CTreeDeclSize(c_constructor_fields)); ++ ++ c_constructor_unfilled_fields = CTreeChain(c_constructor_fields); ++ } ++ ++ c_constructor_fields = 0; ++ break; ++ } ++ if ( CTreeTypeCode(c_constructor_type) == C_ARRAY_TYPE) ++ { ++ c_tree_node *elttype = CTreeTypeMainVariant(CTreeType(c_constructor_type)); ++ int eltcode = CTreeTypeCode(elttype); ++ ++ /* Accept a string constant to initialize a subarray. */ ++ if (value != 0 ++ && eltcode == C_ARRAY_TYPE ++ && CTreeTypeCode(CTreeType(elttype)) == C_INTEGER_TYPE ++ && string_flag) ++ { ++ value = orig_value; ++ } ++ /* Otherwise, if we have come to a subaggregate, ++ and we don't have an element of its type, push into it. */ ++ else if (value != 0 && !c_constructor_no_implicit ++ && value != c_error_mark_node ++ && CTreeTypeMainVariant(CTreeType(value)) != elttype ++ && (eltcode == C_RECORD_TYPE || eltcode == C_ARRAY_TYPE ++ || eltcode == C_UNION_TYPE)) ++ { ++ c_push_init_level(1); ++ continue; ++ } ++ ++ if (c_constructor_max_index != 0 ++ && c_tree_is_int_cst_lt(c_constructor_max_index, c_constructor_index)) ++ { ++ pedwarn_init ("excess elements in array initializer%s", " after `%s'", NULL); ++ break; ++ } ++ ++ /* In the case of [LO .. HI] = VALUE, only evaluate VALUE once. */ ++ if (c_constructor_range_end) ++ { ++ if (c_constructor_max_index != 0 ++ && c_tree_is_int_cst_lt(c_constructor_max_index, c_constructor_range_end)) ++ { ++ pedwarn_init ("excess elements in array initializer%s", ++ " after `%s'", NULL); ++ CTreeIntCstHigh(c_constructor_range_end) ++ = CTreeIntCstHigh(c_constructor_max_index); ++ CTreeIntCstLow(c_constructor_range_end) ++ = CTreeIntCstLow(c_constructor_max_index); ++ } ++ ++# ifdef LUDO_NO_SKIP ++ value = save_expr (value); ++# endif ++ } ++ ++ /* Now output the actual element. ++ Ordinarily, output once. ++ If there is a range, repeat it till we advance past the range. */ ++ do ++ { ++ c_tree_node *tem; ++ ++ if (value) ++ { ++ c_push_array_bounds (CTreeIntCstLow(c_constructor_index)); ++ c_output_init_element(value, elttype, c_constructor_index, 1); ++ RESTORE_SPELLING_DEPTH(c_constructor_depth); ++ } ++ ++ tem = c_build_size_binop(C_PLUS_EXPR, c_constructor_index, ++ c_integer_one_node); ++ CTreeIntCstLow(c_constructor_index) = CTreeIntCstLow(tem); ++ CTreeIntCstHigh(c_constructor_index) = CTreeIntCstHigh(tem); ++ ++ if (!value) ++ /* If we are doing the bookkeeping for an element that was ++ directly output as a constructor, ++ we must update constructor_unfilled_index. */ ++ { ++ CTreeIntCstLow(c_constructor_unfilled_index) ++ = CTreeIntCstLow(c_constructor_index); ++ CTreeIntCstHigh(c_constructor_unfilled_index) ++ = CTreeIntCstHigh(c_constructor_index); ++ } ++ } ++ while (! (c_constructor_range_end == 0 ++ || c_tree_is_int_cst_lt(c_constructor_range_end, ++ c_constructor_index))); ++ ++ break; ++ } ++ ++ /* Handle the sole element allowed in a braced initializer ++ for a scalar variable. */ ++ if (c_constructor_fields == 0) ++ { ++ pedwarn_init ("excess elements in scalar initializer%s", ++ " after `%s'", NULL); ++ break; ++ } ++ ++ if (value) ++ { ++ c_output_init_element(value, c_constructor_type, NULL, 1); ++ } ++ c_constructor_fields = 0; ++ break; ++ } ++ ++ /* If the (lexically) previous elments are not now saved, ++ we can discard the storage for them. */ ++# ifdef LUDO_NO_SKIP ++ if (c_constructor_incremental && c_constructor_pending_elts == 0 && value != 0 ++ && c_constructor_stack == 0) ++ clear_momentary (); ++# endif ++} +diff -Naur alliance-5.0/gcp/src/c_ctypeck.h alliance/gcp/src/c_ctypeck.h +--- alliance-5.0/gcp/src/c_ctypeck.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_ctypeck.h 2002-09-30 18:20:19.000000000 +0200 +@@ -0,0 +1,116 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_ctypeck.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_CTYPECK_H ++# define C_CTYPECK_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern int c_is_comptypes __P((c_tree_node *type1, c_tree_node *type2)); ++ extern c_tree_node * c_parser_build_indirect_ref __P((c_tree_node *ptr, char *errorstring)); ++ extern c_tree_node * c_parser_build_conditional_expr __P((c_tree_node *TreeIf, c_tree_node *TreeArg1, c_tree_node *TreeArg2)); ++ extern c_tree_node * c_parser_build_modify_expr __P(( c_tree_node *lhs, int modifycode, c_tree_node *rhs)); ++ extern c_tree_node * c_get_non_lvalue __P((c_tree_node *x)); ++ extern c_tree_node * c_parser_build_compound_expr __P((c_tree_node *list)); ++ extern c_tree_node * c_is_initializer_constant_valid_p __P((c_tree_node *value, c_tree_node *endtype)); ++ extern void c_store_init_value __P((c_tree_node *decl, c_tree_node *init)); ++ extern c_tree_node * c_get_signed_or_unsigned_type __P((int unsignedp, c_tree_node *type)); ++ extern c_tree_node * c_get_signed_type __P((c_tree_node *type)); ++ extern c_tree_node * c_get_unsigned_type __P((c_tree_node *type)); ++ extern int c_int_fits_type_p __P((c_tree_node *c, c_tree_node *type)); ++ extern int c_is_tree_int_cst_lt __P((c_tree_node *t1, c_tree_node *t2)); ++ extern c_tree_node * c_get_type_for_size __P((unsigned bits, int unsignedp)); ++ extern int c_type_precision __P((c_tree_node *type)); ++ extern c_tree_node * c_c_build_type_variant __P((c_tree_node *type, int constp, int volatilep)); ++ extern void c_set_init_label __P((c_tree_node *fieldname)); ++ extern void c_set_init_index __P((c_tree_node *first, c_tree_node *last)); ++ extern c_tree_node * c_build_c_cast __P((c_tree_node *type, c_tree_node *expr)); ++ extern c_tree_node * c_get_c_sizeof __P((c_tree_node *type)); ++ extern c_tree_node * c_get_c_alignof __P((c_tree_node *type)); ++ extern c_tree_node * c_get_c_alignof_expr __P((c_tree_node *expr)); ++ extern int c_get_int_size_in_bytes __P((c_tree_node *type)); ++ extern c_tree_node * c_parser_build_function_call __P((c_tree_node *function, c_tree_node *params)); ++ extern void c_incomplete_type_error __P((c_tree_node *value, c_tree_node *type)); ++ extern c_tree_node * c_require_complete_type __P((c_tree_node *value)); ++ extern int c_is_lvalue_p __P((c_tree_node *ref)); ++ extern c_tree_node * c_parser_build_array_ref __P((c_tree_node *array, c_tree_node *index)); ++ extern c_tree_node * c_parser_build_component_ref __P((c_tree_node *datum, c_tree_node *component)); ++ extern c_tree_node * c_get_size_in_bytes __P((c_tree_node *type)); ++ ++ extern c_tree_node * c_build_binary_op __P(( int code, c_tree_node *orig_op0, c_tree_node *orig_op1, int convert_p)); ++ extern c_tree_node * c_parser_build_binary_op __P(( int code, c_tree_node *arg1, c_tree_node *arg2)); ++ extern c_tree_node * c_parser_build_unary_op __P((int code, c_tree_node *xarg, int noconvert)); ++ extern c_tree_node * c_get_narrower __P((c_tree_node *op, int *unsignedp_ptr)); ++ extern c_tree_node * c_get_unwidened __P((c_tree_node *op, c_tree_node *for_type)); ++ extern int c_mark_addressable __P((c_tree_node *exp)); ++ extern void c_process_init_element __P((c_tree_node *value)); ++ extern c_tree_node * c_pop_init_level __P((int implicit)); ++ extern void c_push_init_level __P((int implicit)); ++ extern void c_really_start_incremental_init __P((c_tree_node *type)); ++ extern c_tree_node * c_finish_init __P(()); ++ extern void c_start_init __P((c_tree_node *decl, c_tree_node *asmspec_tree, int top_level)); ++ extern c_tree_node * c_get_common_type __P((c_tree_node *t1, c_tree_node *t2)); ++ extern int c_force_fit_type __P((c_tree_node *t, int overflow )); ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_debug.c alliance/gcp/src/c_debug.c +--- alliance-5.0/gcp/src/c_debug.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_debug.c 2004-01-05 14:40:18.000000000 +0100 +@@ -0,0 +1,711 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_debug.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++# include ++ ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_flags.h" ++# include "c_cdecl.h" ++# include "c_ctypeck.h" ++# include "c_convert.h" ++# include "c_debug.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++#ifndef VPROTO ++#ifdef __STDC__ ++#define PVPROTO(ARGS) ARGS ++#define VPROTO(ARGS) ARGS ++#define VA_START(va_list,var) va_start(va_list,var) ++#else ++#define PVPROTO(ARGS) () ++#define VPROTO(ARGS) (va_alist) va_dcl ++#define VA_START(va_list,var) va_start(va_list) ++#endif ++#endif ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++static int c_need_error_newline; ++ ++/* Function of last error message; ++ more generally, function such that if next error message is in it ++ then we don't have to mention the function name. */ ++static c_tree_node *c_last_error_function = NULL; ++ ++/* Used to detect when input_file_stack has changed since last described. */ ++static int c_last_error_tick; ++ ++/* Called when the start of a function definition is parsed, ++ this function prints on stdout the name of the function. */ ++ ++/* Number of error messages and warning messages so far. */ ++ ++ int c_errorcount = 0; ++ int c_warningcount = 0; ++ int c_sorrycount = 0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++/* Count an error or warning. Return 1 if the message should be printed. */ ++ ++int c_count_error(warningp) ++ int warningp; ++{ ++ if (warningp && c_inhibit_warnings) ++ return 0; ++ ++ if (warningp && !c_warnings_are_errors) ++ c_warningcount++; ++ else ++ { ++ static int warning_message = 0; ++ ++ if (warningp && !warning_message) ++ { ++ fprintf (stdout, "warnings being treated as errors\n" ); ++ warning_message = 1; ++ } ++ c_errorcount++; ++ } ++ ++ return 1; ++} ++ ++static char *c_print_decl_name(decl, verbosity) ++ c_tree_node *decl; ++ int verbosity; ++{ ++ return CTreeIdentPointer( CTreeDeclName(decl)); ++} ++ ++static void c_default_print_error_function(file) ++ char *file; ++{ ++ if (c_last_error_function != c_current_function_decl) ++ { ++ char *kind = "function"; ++ if (c_current_function_decl != 0 ++ && CTreeTypeCode( CTreeType(c_current_function_decl)) == C_METHOD_TYPE) ++ { ++ kind = "method"; ++ } ++ ++ if (file) ++ { ++ fprintf (stdout, "%s: ", file); ++ } ++ ++ if (c_current_function_decl == NULL) ++ { ++ fprintf (stdout, "At top level:\n"); ++ } ++ else ++ { ++ char *name = c_print_decl_name(c_current_function_decl, 2); ++ fprintf (stdout, "In %s `%s':\n", kind, name); ++ } ++ ++ c_last_error_function = c_current_function_decl; ++ } ++} ++ ++/* Prints out, if necessary, the name of the current function ++ that caused an error. Called from all error and warning functions. */ ++ ++void c_report_error_function(file) ++ char *file; ++{ ++ c_file_stack *p; ++ ++ if (c_need_error_newline) ++ { ++ fprintf (stdout, "\n"); ++ c_need_error_newline = 0; ++ } ++ ++ c_default_print_error_function(file); ++ ++ if (c_input_file_stack && c_input_file_stack->NEXT != 0 ++ && c_input_file_stack_tick != c_last_error_tick ++ && file == c_input_filename) ++ { ++ fprintf (stdout, "In file included"); ++ for (p = c_input_file_stack->NEXT; p; p = p->NEXT) ++ { ++ fprintf (stdout, " from %s:%d", p->NAME, p->LINE); ++ if (p->NEXT) ++ fprintf (stdout, ",\n "); ++ } ++ fprintf (stdout, ":\n"); ++ c_last_error_tick = c_input_file_stack_tick; ++ } ++} ++ ++/* Print a message. */ ++ ++static void ++c_vmessage(prefix, s, ap) ++ char *prefix; ++ char *s; ++ va_list ap; ++{ ++ if (prefix) ++ fprintf (stdout, "%s: ", prefix); ++ ++#ifdef HAVE_VPRINTF ++ vfprintf (stdout, s, ap); ++#else ++ { ++ int v1 = va_arg(ap, int); ++ int v2 = va_arg(ap, int); ++ int v3 = va_arg(ap, int); ++ int v4 = va_arg(ap, int); ++ fprintf (stdout, s, v1, v2, v3, v4); ++ } ++#endif ++} ++ ++/* Print a message relevant to line LINE of file FILE. */ ++ ++static void ++c_v_message_with_file_and_line(file, line, prefix, s, ap) ++ char *file; ++ int line; ++ char *prefix; ++ char *s; ++ va_list ap; ++{ ++ if (file) ++ fprintf (stdout, "%s:%d: ", file, line); ++ ++ c_vmessage(prefix, s, ap); ++ fputc('\n', stdout); ++} ++ ++/* Print a message relevant to the given DECL. */ ++ ++static void ++c_v_message_with_decl(decl, prefix, s, ap) ++ c_tree_node *decl; ++ char *prefix; ++ char *s; ++ va_list ap; ++{ ++ char *p; ++ ++ fprintf (stdout, "%s:%d: ", ++ CTreeDeclFileName(decl), CTreeDeclLineNum(decl)); ++ ++ if (prefix) ++ fprintf (stdout, "%s: ", prefix); ++ ++ /* Do magic to get around lack of varargs support for insertion ++ of arguments into existing list. We know that the decl is first; ++ we ass_u_me that it will be printed with "%s". */ ++ ++ for (p = s; *p; ++p) ++ { ++ if (*p == '%') ++ { ++ if (*(p + 1) == '%') ++ ++p; ++ else ++ break; ++ } ++ } ++ ++ if (p > s) /* Print the left-hand substring. */ ++ { ++ char fmt[sizeof "%.255s"]; ++ long width = p - s; ++ ++ if (width > 255L) width = 255L; /* arbitrary */ ++ sprintf (fmt, "%%.%lds", width); ++ fprintf (stdout, fmt, s); ++ } ++ ++ if (*p == '%') /* Print the name. */ ++ { ++ char *n = (CTreeDeclName(decl) ++ ? c_print_decl_name(decl, 2) ++ : "((anonymous))"); ++ fputs (n, stdout); ++ while (*p) ++ { ++ ++p; ++ if (isalpha (*(p - 1) & 0xFF)) ++ break; ++ } ++ } ++ ++ if (*p) /* Print the rest of the message. */ ++ c_vmessage((char *)NULL, p, ap); ++ ++ fputc ('\n', stdout); ++} ++ ++/* Report an error at line LINE of file FILE. */ ++ ++static void ++c_v_error_with_file_and_line(file, line, s, ap) ++ char *file; ++ int line; ++ char *s; ++ va_list ap; ++{ ++ c_count_error(0); ++ c_report_error_function(file); ++ c_v_message_with_file_and_line(file, line, (char *)NULL, s, ap); ++} ++ ++void ++c_error_with_file_and_line(char *file, int line, char *s, ...) ++{ ++#ifndef __STDC__ ++ char *file; ++ int line; ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ file = va_arg (ap, char *); ++ line = va_arg (ap, int); ++ s = va_arg (ap, char *); ++#endif ++ ++ c_v_error_with_file_and_line (file, line, s, ap); ++ va_end (ap); ++} ++ ++/* Report an error at the declaration DECL. ++ S is a format string which uses %s to substitute the declaration ++ name; subsequent substitutions are a la printf. */ ++ ++static void c_v_error_with_decl (decl, s, ap) ++ c_tree_node *decl; ++ char *s; ++ va_list ap; ++{ ++ c_count_error(0); ++ c_report_error_function( CTreeDeclFileName(decl)); ++ c_v_message_with_decl(decl, (char *)NULL, s, ap); ++} ++ ++void ++c_error_with_decl (tree decl, char *s, ...) ++{ ++#ifndef __STDC__ ++ c_tree_node *decl; ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ decl = va_arg (ap, tree); ++ s = va_arg (ap, char *); ++#endif ++ ++ c_v_error_with_decl (decl, s, ap); ++ va_end (ap); ++} ++ ++/* Report an error at the line number of the insn INSN. ++ This is used only when INSN is an `asm' with operands, ++ and each ASM_OPERANDS records its own source file and line. */ ++ ++static void ++c_verror (s, ap) ++ char *s; ++ va_list ap; ++{ ++ c_v_error_with_file_and_line(c_input_filename, c_lineno, s, ap); ++} ++ ++void c_error(char *s, ...) ++{ ++#ifndef __STDC__ ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ s = va_arg (ap, char *); ++#endif ++ ++ c_verror(s, ap); ++ va_end (ap); ++} ++ ++/* Report a fatal error at the current line number. */ ++ ++static void ++c_vfatal (s, ap) ++ char *s; ++ va_list ap; ++{ ++ c_verror (s, ap); ++ gcpexit( 1 ); ++} ++ ++void ++c_fatal (char *s, ...) ++{ ++#ifndef __STDC__ ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ s = va_arg (ap, char *); ++#endif ++ ++ c_vfatal (s, ap); ++ va_end (ap); ++} ++ ++/* Report a warning at line LINE of file FILE. */ ++ ++static void ++c_v_warning_with_file_and_line (file, line, s, ap) ++ char *file; ++ int line; ++ char *s; ++ va_list ap; ++{ ++ if (c_count_error(1)) ++ { ++ c_report_error_function(file); ++ c_v_message_with_file_and_line(file, line, "warning", s, ap); ++ } ++} ++ ++void ++c_warning_with_file_and_line (char *file, int line, char *s, ...) ++{ ++#ifndef __STDC__ ++ char *file; ++ int line; ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ file = va_arg (ap, char *); ++ line = va_arg (ap, int); ++ s = va_arg (ap, char *); ++#endif ++ ++ c_v_warning_with_file_and_line (file, line, s, ap); ++ va_end (ap); ++} ++ ++/* Report a warning at the declaration DECL. ++ S is a format string which uses %s to substitute the declaration ++ name; subsequent substitutions are a la printf. */ ++ ++static void c_v_warning_with_decl (decl, s, ap) ++ c_tree_node *decl; ++ char *s; ++ va_list ap; ++{ ++ if (c_count_error(1)) ++ { ++ c_report_error_function ( CTreeDeclFileName(decl)); ++ c_v_message_with_decl(decl, "warning", s, ap); ++ } ++} ++ ++void c_warning_with_decl (tree decl, char *s, ...) ++{ ++#ifndef __STDC__ ++ c_tree_node *decl; ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ decl = va_arg (ap, tree); ++ s = va_arg (ap, char *); ++#endif ++ ++ c_v_warning_with_decl (decl, s, ap); ++ va_end (ap); ++} ++ ++/* Report a warning at the current line number. */ ++ ++static void ++c_vwarning (s, ap) ++ char *s; ++ va_list ap; ++{ ++ c_v_warning_with_file_and_line(c_input_filename, c_lineno, s, ap); ++} ++ ++void ++c_warning (char *s, ...) ++{ ++#ifndef __STDC__ ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ s = va_arg (ap, char *); ++#endif ++ ++ c_vwarning(s, ap); ++ va_end (ap); ++} ++ ++/* These functions issue either warnings or errors depending on ++ -pedantic-errors. */ ++ ++static void ++c_vpedwarn (s, ap) ++ char *s; ++ va_list ap; ++{ ++ if (c_flag_pedantic_errors) ++ c_verror (s, ap); ++ else ++ c_vwarning (s, ap); ++} ++ ++void c_pedwarn (char *s, ...) ++{ ++#ifndef __STDC__ ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ s = va_arg (ap, char *); ++#endif ++ ++ c_vpedwarn (s, ap); ++ va_end (ap); ++} ++ ++static void ++c_v_pedwarn_with_decl(decl, s, ap) ++ c_tree_node *decl; ++ char *s; ++ va_list ap; ++{ ++ /* We don't want -pedantic-errors to cause the compilation to fail from ++ "errors" in system header files. Sometimes fixincludes can't fix what's ++ broken (eg: unsigned char bitfields - fixing it may change the alignment ++ which will cause programs to mysteriously fail because the C library ++ or kernel uses the original layout). There's no point in issuing a ++ warning either, it's just unnecessary noise. */ ++ ++ if (! CIsTreeDeclSystemHeader(decl)) ++ { ++ if (c_flag_pedantic_errors) ++ c_v_error_with_decl(decl, s, ap); ++ else ++ c_v_warning_with_decl(decl, s, ap); ++ } ++} ++ ++void ++c_pedwarn_with_decl (tree decl, char *s, ...) ++{ ++#ifndef __STDC__ ++ c_tree_node *decl; ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ decl = va_arg (ap, tree); ++ s = va_arg (ap, char *); ++#endif ++ ++ c_v_pedwarn_with_decl (decl, s, ap); ++ va_end (ap); ++} ++ ++static void ++c_v_pedwarn_with_file_and_line (file, line, s, ap) ++ char *file; ++ int line; ++ char *s; ++ va_list ap; ++{ ++ if (c_flag_pedantic_errors) ++ c_v_error_with_file_and_line (file, line, s, ap); ++ else ++ c_v_warning_with_file_and_line (file, line, s, ap); ++} ++ ++void ++c_pedwarn_with_file_and_line (char *file, int line, char *s, ...) ++{ ++#ifndef __STDC__ ++ char *file; ++ int line; ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ file = va_arg (ap, char *); ++ line = va_arg (ap, int); ++ s = va_arg (ap, char *); ++#endif ++ ++ c_v_pedwarn_with_file_and_line (file, line, s, ap); ++ va_end (ap); ++} ++ ++/* Apologize for not implementing some feature. */ ++ ++static void c_vsorry(s, ap) ++ char *s; ++ va_list ap; ++{ ++ c_sorrycount++; ++ if (c_input_filename) ++ fprintf (stdout, "%s:%d: ", c_input_filename, c_lineno); ++ else ++ c_vmessage ("sorry, not implemented", s, ap); ++ fputc ('\n', stdout); ++} ++ ++void c_sorry(char *s, ...) ++{ ++#ifndef __STDC__ ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ s = va_arg (ap, char *); ++#endif ++ ++ c_vsorry (s, ap); ++ va_end (ap); ++} ++ ++/* Apologize for not implementing some feature, then quit. */ ++ ++static void ++c_v_really_sorry (s, ap) ++ char *s; ++ va_list ap; ++{ ++ c_sorrycount++; ++ if (c_input_filename) ++ fprintf (stdout, "%s:%d: ", c_input_filename, c_lineno); ++ else ++ c_vmessage ("sorry, not implemented", s, ap); ++ c_fatal (" (fatal)\n"); ++} ++ ++void c_really_sorry (char *s, ...) ++{ ++#ifndef __STDC__ ++ char *s; ++#endif ++ va_list ap; ++ ++ VA_START (ap, s); ++ ++#ifndef __STDC__ ++ s = va_arg (ap, char *); ++#endif ++ ++ c_v_really_sorry (s, ap); ++ va_end (ap); ++} +diff -Naur alliance-5.0/gcp/src/c_debug.h alliance/gcp/src/c_debug.h +--- alliance-5.0/gcp/src/c_debug.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_debug.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,82 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_debug.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_DEBUG_H ++# define C_DEBUG_H ++ ++# define c_header_debug() fprintf( stdout, "%s:%d: *%s*\n", \ ++ basename(__FILE__),__LINE__, __FUNCTION__) ++# define c_fprintf c_header_debug(); fprintf ++# define loc_c_tree_view_node c_header_debug(); fprintf( stdout, "\n" ); c_tree_view_node ++# define loc_c_tree_view_node_list c_header_debug(); fprintf( stdout, "\n" ); c_tree_view_node_list ++# define loc_c_view_binding c_header_debug(); fprintf( stdout, "\n" ); c_view_binding ++ ++# define warning c_header_debug(); c_warning ++# define pedwarn c_header_debug(); c_pedwarn ++# define error c_header_debug(); c_error ++# define warning_with_decl c_header_debug(); c_warning_with_decl ++# define error_with_decl c_header_debug(); c_error_with_decl ++# define pedwarn_with_decl c_header_debug(); c_pedwarn_with_decl ++# define warning_with_file_and_line c_header_debug(); c_warning_with_file_and_line ++# define error_with_file_and_line c_header_debug(); c_error_with_file_and_line ++# define pedwarn_with_file_and_line c_header_debug(); c_pedwarn_with_file_and_line ++# define warning_init c_header_debug(); c_warning_init ++# define pedwarn_init c_header_debug(); c_pedwarn_init ++# define error_init c_header_debug(); c_error_init ++# define warn_for_assignment c_header_debug(); c_warn_for_assignment ++ ++ extern void c_error __P((char *s, ...)); ++ extern void c_pedwarn __P((char *s, ...)); ++ extern void c_warning __P((char *s, ...)); ++ ++ extern void c_warning_with_file_and_line __P((char *file, int line, char *s, ...)); ++ extern void c_pedwarn_with_file_and_line __P((char *file, int line, char *s, ...)); ++ extern void c_error_with_file_and_line __P((char *file, int line, char *s, ...)); ++ ++ extern void c_error_with_decl __P((c_tree_node *decl, char *s, ...)); ++ extern void c_warning_with_decl __P((c_tree_node *decl, char *s, ...)); ++ extern void c_pedwarn_with_decl __P((c_tree_node *decl, char *s, ...)); ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_expand.c alliance/gcp/src/c_expand.c +--- alliance-5.0/gcp/src/c_expand.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_expand.c 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,106 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_expand.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_flags.h" ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_cdecl.h" ++# include "c_convert.h" ++# include "c_ctypeck.h" ++# include "c_expand.h" ++# include "c_debug.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++/* ++ ITERATOR RTL EXPANSIONS ++ ++ Expanding simple statements with iterators is straightforward: ++ collect the list of all free iterators in the statement, and ++ generate a loop for each of them. ++ ++ An iterator is "free" if it has not been "bound" by a FOR ++ operator. The DECL_RTL of the iterator is the loop counter. */ ++ ++/* Expand a statement STMT, possibly containing iterator usage, into RTL. */ ++ ++void c_iterator_expand (stmt) ++ c_tree_node *stmt; ++{ ++# ifdef LUDO_NO_SKIP ++ c_tree_node *iter_list; ++ save_exprs = NULL_TREE; ++ iter_list = collect_iterators (stmt, NULL_TREE); ++ expand_stmt_with_iterators_1 (stmt, iter_list); ++ istack_sublevel_to_current (); ++# endif ++ ++ /* ++ loc_c_tree_view_node( stmt ); ++ */ ++} +diff -Naur alliance-5.0/gcp/src/c_expand.h alliance/gcp/src/c_expand.h +--- alliance-5.0/gcp/src/c_expand.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_expand.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,72 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_expand.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_EXPAND_H ++# define C_EXPAND_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void c_iterator_expand __P((c_tree_node *stmt)); ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_flags.c alliance/gcp/src/c_flags.c +--- alliance-5.0/gcp/src/c_flags.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_flags.c 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,740 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_flags.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_flags.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++/* Nonzero for -pedantic switch: warn about anything that standard C forbids. */ ++ int c_pedantic = 0; ++ ++/* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */ ++ int c_flag_traditional = 0; ++ ++/* Nonzero means `$' can be in an identifier. */ ++ int c_dollars_in_ident = 0; ++ ++/* Nonzero enables objc features. */ ++ int c_doing_objc_thang = 0; ++ ++/* Nonzero means don't recognize the keyword `asm'. */ ++ int c_flag_no_asm = 0; ++ ++/* Nonzero means warn about any identifiers that match in the first N ++ characters. The value N is in `id_clash_len'. */ ++ int c_warn_id_clash; ++ unsigned c_id_clash_len; ++ ++/* Nonzero for -fwritable-strings: ++ store string constants in data segment and don't uniquize them. */ ++ int c_flag_writable_strings; ++ ++/* Nonzero means `char' should be signed. */ ++ int c_flag_signed_char; ++ ++/* Nonzero means give an enum type only as many bytes as it needs. */ ++ int c_flag_short_enums; ++ ++/* Nonzero means warn about function definitions that default the return type ++ or that use a null return and have a return-type other than void. */ ++ int c_warn_return_type; ++ ++/* Nonzero to warn about variables used before they are initialized. */ ++ int c_warn_uninitialized; ++ ++/* Nonzero to warn about unused local variables. */ ++ int c_warn_unused; ++ ++/* Warn if a switch on an enum fails to have a case for every enum value. */ ++ int c_warn_switch; ++ ++/* Nonzero means warn about all declarations which shadow others. */ ++ int c_warn_shadow; ++ ++/* Nonzero means don't place uninitialized global data in common storage ++ by default. */ ++ int c_flag_no_common; ++ ++/* Nonzero means warn about any objects definitions whose size is larger ++ than N bytes. Also want about function definitions whose returned ++ values are larger than N bytes. The value N is in `larger_than_size'. */ ++ ++ int c_warn_larger_than; ++ unsigned c_larger_than_size; ++ ++/* Nonzero means change certain warnings into errors. ++ Usually these are warnings about failure to conform to some standard. */ ++ int c_flag_pedantic_errors = 0; ++ ++/* Tag all structures with __attribute__(packed) */ ++ int c_flag_pack_struct = 0; ++ ++/* Warn about traditional constructs whose meanings changed in ANSI C. */ ++ int c_warn_traditional; ++ ++/* Nonzero means that we have builtin functions, and main is an int */ ++ int c_flag_hosted = 1; ++ ++/* Nonzero means don't recognize any builtin functions. */ ++ int c_flag_no_builtin; ++ ++/* Nonzero means to allow single precision math even if we're generally ++ being traditional. */ ++ int flag_allow_single_precision = 0; ++ ++/* Warn if main is suspicious. */ ++ int c_warn_main; ++ ++/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */ ++ int c_flag_signed_bitfields = 1; ++ int c_explicit_flag_signed_bitfields = 0; ++ ++/* Nonzero means allow type mismatches in conditional expressions; ++ just make their values `void'. */ ++ int c_flag_cond_mismatch; ++ ++/* Nonzero means give `double' the same size as `float'. */ ++ int c_flag_short_double; ++ ++/* Nonzero means handle `#ident' directives. 0 means ignore them. */ ++ int c_flag_no_ident = 0; ++ ++/* Nonzero means don't recognize the non-ANSI builtin functions. ++ -ansi sets this. */ ++ int c_flag_no_nonansi_builtin; ++ ++/* Nonzero means message about use of implicit function declarations; ++ 1 means warning; 2 means error. */ ++ int c_mesg_implicit_function_declaration; ++ ++/* Nonzero means warn about use of implicit int. */ ++ int c_warn_implicit_int; ++ ++/* Nonzero means to allow single precision math even if we're generally ++ being traditional. */ ++ int c_flag_allow_single_precision = 0; ++ ++/* Nonzero means give string constants the type `const char *' ++ to get extra warnings from them. These warnings will be too numerous ++ to be useful, except in thoroughly ANSIfied programs. */ ++ int c_warn_write_strings; ++ ++/* Nonzero means warn about pointer casts that can drop a type qualifier ++ from the pointer target type. */ ++ int c_warn_cast_qual; ++ ++/* Nonzero means warn when casting a function call to a type that does ++ not match the return type (e.g. (float)sqrt() or (anything*)malloc() ++ when there is no previous declaration of sqrt or malloc. */ ++ int c_warn_bad_function_cast; ++ ++ ++/* Nonzero means warn about sizeof(function) or addition/subtraction ++ of function pointers. */ ++ int c_warn_pointer_arith; ++ ++/* Nonzero means warn for non-prototype function decls ++ or non-prototyped defs without previous prototype. */ ++ int c_warn_strict_prototypes; ++ ++/* Nonzero means warn for any global function def ++ without separate previous prototype decl. */ ++ int c_warn_missing_prototypes; ++ ++/* Nonzero means warn for any global function def ++ without separate previous decl. */ ++ int c_warn_missing_declarations; ++ ++/* Nonzero means warn about multiple (redundant) decls for the same single ++ variable or function. */ ++ int c_warn_redundant_decls = 0; ++ ++/* Nonzero means warn about extern declarations of objects not at ++ file-scope level and about *all* declarations of functions (whether ++ extern or static) not at file-scope level. Note that we exclude ++ implicit function declarations. To get warnings about those, use ++ -Wimplicit. */ ++ int c_warn_nested_externs = 0; ++ ++/* Warn about *printf or *scanf format/argument anomalies. */ ++ int c_warn_format; ++ ++/* Warn about a subscript that has type char. */ ++ int c_warn_char_subscripts = 0; ++ ++/* Warn if a type conversion is done that might have confusing results. */ ++ int c_warn_conversion; ++ ++/* Warn if adding () is suggested. */ ++ int c_warn_parentheses; ++ ++/* Warn if initializer is not completely bracketed. */ ++ int c_warn_missing_braces; ++ ++/* Warn about comparison of signed and unsigned values. ++ If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified. */ ++ int c_warn_sign_compare = -1; ++ ++/* Temporarily suppress certain warnings. ++ This is set while reading code from a system header file. */ ++ int c_in_system_header = 0; ++ ++/* Name of current original source file (what was input to cpp). ++ This comes from each #-command in the actual input. */ ++ char *c_input_filename; ++ ++/* Name of top-level original source file (what was input to cpp). ++ This comes from the #-command at the beginning of the actual input. ++ If there isn't any there, then this is the cc1 input file name. */ ++ char *c_main_input_filename; ++ ++/* Stack of currently pending input files. */ ++ c_file_stack *c_input_file_stack; ++ ++/* Incremented on each change to input_file_stack. */ ++ int c_input_file_stack_tick; ++ ++/* Nonzero for -ffloat-store: don't allocate floats and doubles ++ in extended-precision registers. */ ++ int c_flag_float_store = 0; ++ ++ ++/* Nonzero means all references through pointers are volatile. */ ++ int c_flag_volatile; ++ ++/* Don't print warning messages. -w. */ ++ int c_inhibit_warnings = 0; ++ ++/* Print various extra warnings. -W. */ ++ int c_extra_warnings = 0; ++ ++/* Treat warnings as errors. -Werror. */ ++ int c_warnings_are_errors = 0; ++ ++/* Nonzero means we should be saving declaration info into a .X file. */ ++ int c_flag_gen_aux_info = 0; ++ ++/* Nonzero allows GCC to violate some IEEE or ANSI rules regarding math ++ operations in the interest of optimization. For example it allows ++ GCC to assume arguments to sqrt are nonnegative numbers, allowing ++ faster code for sqrt to be generated. */ ++ int c_flag_fast_math = 0; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++static void c_init_flags() ++{ ++/* Nonzero for -pedantic switch: warn about anything that standard C forbids. */ ++ c_pedantic = 0; ++ ++/* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */ ++ c_flag_traditional = 0; ++ ++/* Nonzero means `$' can be in an identifier. */ ++ c_dollars_in_ident = 0; ++ ++/* Nonzero enables objc features. */ ++ c_doing_objc_thang = 0; ++ ++/* Nonzero means don't recognize the keyword `asm'. */ ++ c_flag_no_asm = 0; ++ ++/* Nonzero means warn about any identifiers that match in the first N ++ characters. The value N is in `id_clash_len'. */ ++ c_warn_id_clash = 0; ++ c_id_clash_len = 0; ++ ++/* Nonzero for -fwritable-strings: ++ store string constants in data segment and don't uniquize them. */ ++ c_flag_writable_strings = 0; ++ ++/* Nonzero means `char' should be signed. */ ++ c_flag_signed_char = 0; ++ ++/* Nonzero means give an enum type only as many bytes as it needs. */ ++ c_flag_short_enums = 0; ++ ++/* Nonzero means warn about function definitions that default the return type ++ or that use a null return and have a return-type other than void. */ ++ c_warn_return_type = 0; ++ ++/* Nonzero to warn about variables used before they are initialized. */ ++ c_warn_uninitialized = 0; ++ ++/* Nonzero to warn about unused local variables. */ ++ c_warn_unused = 0; ++ ++/* Warn if a switch on an enum fails to have a case for every enum value. */ ++ c_warn_switch = 0; ++ ++/* Nonzero means warn about all declarations which shadow others. */ ++ c_warn_shadow = 0; ++ ++/* Nonzero means don't place uninitialized global data in common storage ++ by default. */ ++ c_flag_no_common = 0; ++ ++/* Nonzero means warn about any objects definitions whose size is larger ++ than N bytes. Also want about function definitions whose returned ++ values are larger than N bytes. The value N is in `larger_than_size'. */ ++ ++ c_warn_larger_than = 0; ++ c_larger_than_size = 0; ++ ++/* Nonzero means change certain warnings into errors. ++ Usually these are warnings about failure to conform to some standard. */ ++ c_flag_pedantic_errors = 0; ++ ++/* Tag all structures with __attribute__(packed) */ ++ c_flag_pack_struct = 0; ++ ++/* Warn about traditional constructs whose meanings changed in ANSI C. */ ++ c_warn_traditional = 0; ++ ++/* Nonzero means that we have builtin functions, and main is an*/ ++ c_flag_hosted = 1; ++ ++/* Nonzero means don't recognize any builtin functions. */ ++ c_flag_no_builtin = 0; ++ ++/* Nonzero means to allow single precision math even if we're generally ++ being traditional. */ ++ flag_allow_single_precision = 0; ++ ++/* Warn if main is suspicious. */ ++ c_warn_main = 0; ++ ++/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */ ++ c_flag_signed_bitfields = 1; ++ c_explicit_flag_signed_bitfields = 0; ++ ++/* Nonzero means allow type mismatches in conditional expressions = 0; ++ just make their values `void'. */ ++ c_flag_cond_mismatch = 0; ++ ++/* Nonzero means give `double' the same size as `float'. */ ++ c_flag_short_double = 0; ++ ++/* Nonzero means handle `#ident' directives. 0 means ignore them. */ ++ c_flag_no_ident = 0; ++ ++/* Nonzero means don't recognize the non-ANSI builtin functions. ++ -ansi sets this. */ ++ c_flag_no_nonansi_builtin = 0; ++ ++/* Nonzero means message about use of implicit function declarations = 0; ++ 1 means warning; 2 means error. */ ++ c_mesg_implicit_function_declaration = 0; ++ ++/* Nonzero means warn about use of implicit int. */ ++ c_warn_implicit_int = 0; ++ ++/* Nonzero means to allow single precision math even if we're generally ++ being traditional. */ ++ c_flag_allow_single_precision = 0; ++ ++/* Nonzero means give string constants the type `const char *' ++ to get extra warnings from them. These warnings will be too numerous ++ to be useful, except in thoroughly ANSIfied programs. */ ++ c_warn_write_strings = 0; ++ ++/* Nonzero means warn about pointer casts that can drop a type qualifier ++ from the pointer target type. */ ++ c_warn_cast_qual = 0; ++ ++/* Nonzero means warn when casting a function call to a type that does ++ not match the return type (e.g. (float)sqrt() or (anything*)malloc() ++ when there is no previous declaration of sqrt or malloc. */ ++ c_warn_bad_function_cast = 0; ++ ++ ++/* Nonzero means warn about sizeof(function) or addition/subtraction ++ of function pointers. */ ++ c_warn_pointer_arith = 0; ++ ++/* Nonzero means warn for non-prototype function decls ++ or non-prototyped defs without previous prototype. */ ++ c_warn_strict_prototypes = 0; ++ ++/* Nonzero means warn for any global function def ++ without separate previous prototype decl. */ ++ c_warn_missing_prototypes = 0; ++ ++/* Nonzero means warn for any global function def ++ without separate previous decl. */ ++ c_warn_missing_declarations = 0; ++ ++/* Nonzero means warn about multiple (redundant) decls for the same single ++ variable or function. */ ++ c_warn_redundant_decls = 0; ++ ++/* Nonzero means warn about extern declarations of objects not at ++ file-scope level and about *all* declarations of functions (whether ++ extern or static) not at file-scope level. Note that we exclude ++ implicit function declarations. To get warnings about those, use ++ -Wimplicit. */ ++ c_warn_nested_externs = 0; ++ ++/* Warn about *printf or *scanf format/argument anomalies. */ ++ c_warn_format = 0; ++ ++/* Warn about a subscript that has type char. */ ++ c_warn_char_subscripts = 0; ++ ++/* Warn if a type conversion is done that might have confusing results. */ ++ c_warn_conversion = 0; ++ ++/* Warn if adding () is suggested. */ ++ c_warn_parentheses = 0; ++ ++/* Warn if initializer is not completely bracketed. */ ++ c_warn_missing_braces = 0; ++ ++/* Warn about comparison of signed and unsigned values. ++ If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified. */ ++ c_warn_sign_compare = -1; ++ ++/* Temporarily suppress certain warnings. ++ This is set while reading code from a system header file. */ ++ c_in_system_header = 0; ++ ++/* Name of current original source file (what was input to cpp). ++ This comes from each #-command in the actual input. */ ++ c_input_filename = 0; ++ ++/* Name of top-level original source file (what was input to cpp). ++ This comes from the #-command at the beginning of the actual input. ++ If there isn't any there, then this is the cc1 input file name. */ ++ c_main_input_filename = 0; ++ ++/* Stack of currently pending input files. */ ++ c_input_file_stack = 0; ++ ++/* Incremented on each change to input_file_stack. */ ++ c_input_file_stack_tick = 0; ++ ++/* Nonzero for -ffloat-store: don't allocate floats and doubles ++ in extended-precision registers. */ ++ c_flag_float_store = 0; ++ ++ ++/* Nonzero means all references through pointers are volatile. */ ++ c_flag_volatile = 0; ++ ++/* Don't print warning messages. -w. */ ++ c_inhibit_warnings = 0; ++ ++/* Print various extra warnings. -W. */ ++ c_extra_warnings = 0; ++ ++/* Treat warnings as errors. -Werror. */ ++ c_warnings_are_errors = 0; ++ ++/* Nonzero means we should be saving declaration info into a .X file. */ ++ c_flag_gen_aux_info = 0; ++ ++/* Nonzero allows GCC to violate some IEEE or ANSI rules regarding math ++ operations in the interest of optimization. For example it allows ++ GCC to assume arguments to sqrt are nonnegative numbers, allowing ++ faster code for sqrt to be generated. */ ++ c_flag_fast_math = 0; ++} ++ ++static int c_parse_one_flags( p ) ++ ++ char *p; ++{ ++ c_init_flags(); ++ ++ if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional")) ++ { ++ c_flag_traditional = 1; ++ c_flag_writable_strings = 1; ++ } ++ else if (!strcmp (p, "-fallow-single-precision")) ++ c_flag_allow_single_precision = 1; ++ else if (!strcmp (p, "-fhosted") || !strcmp (p, "-fno-freestanding")) ++ { ++ c_flag_hosted = 1; ++ c_flag_no_builtin = 0; ++ } ++ else if (!strcmp (p, "-ffreestanding") || !strcmp (p, "-fno-hosted")) ++ { ++ c_flag_hosted = 0; ++ c_flag_no_builtin = 1; ++ /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */ ++ if (c_warn_main == 2) ++ c_warn_main = 0; ++ } ++ else if (!strcmp (p, "-fnotraditional") || !strcmp (p, "-fno-traditional")) ++ { ++ c_flag_traditional = 0; ++ c_flag_writable_strings = 0; ++ } ++ else if (!strcmp (p, "-fdollars-in-identifiers")) ++ c_dollars_in_ident = 1; ++ else if (!strcmp (p, "-fno-dollars-in-identifiers")) ++ c_dollars_in_ident = 0; ++ else if (!strcmp (p, "-fsigned-char")) ++ c_flag_signed_char = 1; ++ else if (!strcmp (p, "-funsigned-char")) ++ c_flag_signed_char = 0; ++ else if (!strcmp (p, "-fno-signed-char")) ++ c_flag_signed_char = 0; ++ else if (!strcmp (p, "-fno-unsigned-char")) ++ c_flag_signed_char = 1; ++ else if (!strcmp (p, "-fsigned-bitfields") ++ || !strcmp (p, "-fno-unsigned-bitfields")) ++ { ++ c_flag_signed_bitfields = 1; ++ c_explicit_flag_signed_bitfields = 1; ++ } ++ else if (!strcmp (p, "-funsigned-bitfields") ++ || !strcmp (p, "-fno-signed-bitfields")) ++ { ++ c_flag_signed_bitfields = 0; ++ c_explicit_flag_signed_bitfields = 1; ++ } ++ else if (!strcmp (p, "-fshort-enums")) ++ c_flag_short_enums = 1; ++ else if (!strcmp (p, "-fno-short-enums")) ++ c_flag_short_enums = 0; ++ else if (!strcmp (p, "-fcond-mismatch")) ++ c_flag_cond_mismatch = 1; ++ else if (!strcmp (p, "-fno-cond-mismatch")) ++ c_flag_cond_mismatch = 0; ++ else if (!strcmp (p, "-fshort-double")) ++ c_flag_short_double = 1; ++ else if (!strcmp (p, "-fno-short-double")) ++ c_flag_short_double = 0; ++ else if (!strcmp (p, "-fasm")) ++ c_flag_no_asm = 0; ++ else if (!strcmp (p, "-fno-asm")) ++ c_flag_no_asm = 1; ++ else if (!strcmp (p, "-fbuiltin")) ++ c_flag_no_builtin = 0; ++ else if (!strcmp (p, "-fno-builtin")) ++ c_flag_no_builtin = 1; ++ else if (!strcmp (p, "-fno-ident")) ++ c_flag_no_ident = 1; ++ else if (!strcmp (p, "-fident")) ++ c_flag_no_ident = 0; ++ else if (!strcmp (p, "-ansi")) ++ c_flag_no_asm = 1, c_flag_no_nonansi_builtin = 1; ++ else if (!strcmp (p, "-Werror-implicit-function-declaration")) ++ c_mesg_implicit_function_declaration = 2; ++ else if (!strcmp (p, "-Wimplicit-function-declaration")) ++ c_mesg_implicit_function_declaration = 1; ++ else if (!strcmp (p, "-Wno-implicit-function-declaration")) ++ c_mesg_implicit_function_declaration = 0; ++ else if (!strcmp (p, "-Wimplicit-int")) ++ c_warn_implicit_int = 1; ++ else if (!strcmp (p, "-Wno-implicit-int")) ++ c_warn_implicit_int = 0; ++ else if (!strcmp (p, "-Wimplicit")) ++ { ++ c_warn_implicit_int = 1; ++ if (c_mesg_implicit_function_declaration != 2) ++ c_mesg_implicit_function_declaration = 1; ++ } ++ else if (!strcmp (p, "-Wno-implicit")) ++ c_warn_implicit_int = 0, c_mesg_implicit_function_declaration = 0; ++ else if (!strcmp (p, "-Wwrite-strings")) ++ c_warn_write_strings = 1; ++ else if (!strcmp (p, "-Wno-write-strings")) ++ c_warn_write_strings = 0; ++ else if (!strcmp (p, "-Wcast-qual")) ++ c_warn_cast_qual = 1; ++ else if (!strcmp (p, "-Wno-cast-qual")) ++ c_warn_cast_qual = 0; ++ else if (!strcmp (p, "-Wbad-function-cast")) ++ c_warn_bad_function_cast = 1; ++ else if (!strcmp (p, "-Wno-bad-function-cast")) ++ c_warn_bad_function_cast = 0; ++ else if (!strcmp (p, "-Wpointer-arith")) ++ c_warn_pointer_arith = 1; ++ else if (!strcmp (p, "-Wno-pointer-arith")) ++ c_warn_pointer_arith = 0; ++ else if (!strcmp (p, "-Wstrict-prototypes")) ++ c_warn_strict_prototypes = 1; ++ else if (!strcmp (p, "-Wno-strict-prototypes")) ++ c_warn_strict_prototypes = 0; ++ else if (!strcmp (p, "-Wmissing-prototypes")) ++ c_warn_missing_prototypes = 1; ++ else if (!strcmp (p, "-Wno-missing-prototypes")) ++ c_warn_missing_prototypes = 0; ++ else if (!strcmp (p, "-Wmissing-declarations")) ++ c_warn_missing_declarations = 1; ++ else if (!strcmp (p, "-Wno-missing-declarations")) ++ c_warn_missing_declarations = 0; ++ else if (!strcmp (p, "-Wredundant-decls")) ++ c_warn_redundant_decls = 1; ++ else if (!strcmp (p, "-Wno-redundant-decls")) ++ c_warn_redundant_decls = 0; ++ else if (!strcmp (p, "-Wnested-externs")) ++ c_warn_nested_externs = 1; ++ else if (!strcmp (p, "-Wno-nested-externs")) ++ c_warn_nested_externs = 0; ++ else if (!strcmp (p, "-Wtraditional")) ++ c_warn_traditional = 1; ++ else if (!strcmp (p, "-Wno-traditional")) ++ c_warn_traditional = 0; ++ else if (!strcmp (p, "-Wformat")) ++ c_warn_format = 1; ++ else if (!strcmp (p, "-Wno-format")) ++ c_warn_format = 0; ++ else if (!strcmp (p, "-Wchar-subscripts")) ++ c_warn_char_subscripts = 1; ++ else if (!strcmp (p, "-Wno-char-subscripts")) ++ c_warn_char_subscripts = 0; ++ else if (!strcmp (p, "-Wconversion")) ++ c_warn_conversion = 1; ++ else if (!strcmp (p, "-Wno-conversion")) ++ c_warn_conversion = 0; ++ else if (!strcmp (p, "-Wparentheses")) ++ c_warn_parentheses = 1; ++ else if (!strcmp (p, "-Wno-parentheses")) ++ c_warn_parentheses = 0; ++ else if (!strcmp (p, "-Wreturn-type")) ++ c_warn_return_type = 1; ++ else if (!strcmp (p, "-Wno-return-type")) ++ c_warn_return_type = 0; ++ else if (!strcmp (p, "-Wcomment")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wno-comment")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wcomments")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wno-comments")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wtrigraphs")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wno-trigraphs")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wundef")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wno-undef")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wimport")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wno-import")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wmissing-braces")) ++ c_warn_missing_braces = 1; ++ else if (!strcmp (p, "-Wno-missing-braces")) ++ c_warn_missing_braces = 0; ++ else if (!strcmp (p, "-Wmain")) ++ c_warn_main = 1; ++ else if (!strcmp (p, "-Wno-main")) ++ c_warn_main = 0; ++ else if (!strcmp (p, "-Wsign-compare")) ++ c_warn_sign_compare = 1; ++ else if (!strcmp (p, "-Wno-sign-compare")) ++ c_warn_sign_compare = 0; ++ else if (!strcmp (p, "-Wall")) ++ { ++ /* We save the value of warn_uninitialized, since if they put ++ -Wuninitialized on the command line, we need to generate a ++ warning about not using it without also specifying -O. */ ++ if (c_warn_uninitialized != 1) ++ c_warn_uninitialized = 2; ++ c_warn_implicit_int = 1; ++ c_mesg_implicit_function_declaration = 1; ++ c_warn_return_type = 1; ++ c_warn_unused = 1; ++ c_warn_switch = 1; ++ c_warn_format = 1; ++ c_warn_char_subscripts = 1; ++ c_warn_parentheses = 1; ++ c_warn_missing_braces = 1; ++ /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding can turn ++ it off only if it's not explicit. */ ++ c_warn_main = 2; ++ } ++ else ++ return 0; ++ ++ return 1; ++} ++ ++int c_parse_flags( Argc, Argv ) ++ ++ int Argc; ++ char **Argv; ++{ ++ int Index; ++ int Error; ++ ++ Error = 0; ++ ++ for ( Index = 0; Index < Argc; Index++ ) ++ { ++ if ( ! c_parse_one_flags( Argv[ Index ] ) ) Error = 1; ++ } ++ ++ return( Error ); ++} +diff -Naur alliance-5.0/gcp/src/c_flags.h alliance/gcp/src/c_flags.h +--- alliance-5.0/gcp/src/c_flags.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_flags.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,303 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_flags.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_FLAGS_H ++# define C_FLAGS_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++ ++ typedef struct c_file_stack ++ { ++ struct c_file_stack *NEXT; ++ char *NAME; ++ int LINE; ++ int INDENT_LEVEL; ++ ++ } c_file_stack; ++ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++/* Nonzero for -pedantic switch: warn about anything that standard C forbids. */ ++ int c_pedantic; ++ ++/* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */ ++ int c_flag_traditional; ++ ++/* Nonzero means `$' can be in an identifier. */ ++ extern int c_dollars_in_ident; ++ ++/* Nonzero enables objc features. */ ++ extern int c_doing_objc_thang; ++ ++/* Nonzero means don't recognize the keyword `asm'. */ ++ extern int c_flag_no_asm; ++ ++/* Temporarily suppress certain warnings. ++ extern This is set while reading code from a system header file. */ ++ extern int c_in_system_header; ++ ++/* Nonzero means warn about any identifiers that match in the first N ++ extern characters. The value N is in `id_clash_len'. */ ++ extern int c_warn_id_clash; ++ extern unsigned c_id_clash_len; ++ ++/* Nonzero for -fwritable-strings: ++ extern store string constants in data segment and don't uniquize them. */ ++ extern int c_flag_writable_strings; ++ ++/* Nonzero means `char' should be signed. */ ++ extern int c_flag_signed_char; ++ ++/* Nonzero means give an enum type only as many bytes as it needs. */ ++ extern int c_flag_short_enums; ++ ++/* Nonzero means warn about function definitions that default the return type ++ extern or that use a null return and have a return-type other than void. */ ++ extern int c_warn_return_type; ++ ++/* Nonzero to warn about variables used before they are initialized. */ ++ extern int c_warn_uninitialized; ++ ++/* Nonzero to warn about unused local variables. */ ++ extern int c_warn_unused; ++ ++/* Warn if a switch on an enum fails to have a case for every enum value. */ ++ extern int c_warn_switch; ++ ++/* Nonzero means warn about all declarations which shadow others. */ ++ extern int c_warn_shadow; ++ ++/* Nonzero means don't place uninitialized global data in common storage ++ extern by default. */ ++ extern int c_flag_no_common; ++ ++/* Nonzero means warn about any objects definitions whose size is larger ++ extern than N bytes. Also want about function definitions whose returned ++ extern values are larger than N bytes. The value N is in `larger_than_size'. */ ++ ++ extern int c_warn_larger_than; ++ extern unsigned c_larger_than_size; ++ ++/* Nonzero means change certain warnings into errors. ++ extern Usually these are warnings about failure to conform to some standard. */ ++ extern int c_flag_pedantic_errors; ++ ++/* Tag all structures with __attribute__(packed) */ ++ extern int c_flag_pack_struct; ++ ++/* Warn about traditional constructs whose meanings changed in ANSI C. */ ++ extern int c_warn_traditional; ++ ++/* Nonzero means that we have builtin functions, and main is an int */ ++ extern int c_flag_hosted; ++ ++/* Nonzero means don't recognize any builtin functions. */ ++ extern int c_flag_no_builtin; ++ ++/* Nonzero means to allow single precision math even if we're generally ++ extern being traditional. */ ++ extern int flag_allow_single_precision; ++ ++/* Warn if main is suspicious. */ ++ extern int c_warn_main; ++ ++/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */ ++ extern int c_flag_signed_bitfields; ++ extern int c_explicit_flag_signed_bitfields; ++ ++/* Nonzero means allow type mismatches in conditional expressions; ++ extern just make their values `void'. */ ++ extern int c_flag_cond_mismatch; ++ ++/* Nonzero means give `double' the same size as `float'. */ ++ extern int c_flag_short_double; ++ ++/* Nonzero means handle `#ident' directives. 0 means ignore them. */ ++ extern int c_flag_no_ident; ++ ++/* Nonzero means don't recognize the non-ANSI builtin functions. ++ extern -ansi sets this. */ ++ extern int c_flag_no_nonansi_builtin; ++ ++/* Nonzero means message about use of implicit function declarations; ++ 1 means warning; 2 means error. */ ++ extern int c_mesg_implicit_function_declaration; ++ ++/* Nonzero means warn about use of implicit int. */ ++ extern int c_warn_implicit_int; ++ ++/* Nonzero means to allow single precision math even if we're generally ++ extern being traditional. */ ++ extern int c_flag_allow_single_precision; ++ ++/* Nonzero means give string constants the type `const char *' ++ extern to get extra warnings from them. These warnings will be too numerous ++ extern to be useful, except in thoroughly ANSIfied programs. */ ++ extern int c_warn_write_strings; ++ ++/* Nonzero means warn about pointer casts that can drop a type qualifier ++ extern from the pointer target type. */ ++ extern int c_warn_cast_qual; ++ ++/* Nonzero means warn when casting a function call to a type that does ++ extern not match the return type (e.g. (float)sqrt() or (anything*)malloc() ++ extern when there is no previous declaration of sqrt or malloc. */ ++ extern int c_warn_bad_function_cast; ++ ++ ++/* Nonzero means warn about sizeof(function) or addition/subtraction ++ extern of function pointers. */ ++ extern int c_warn_pointer_arith; ++ ++/* Nonzero means warn for non-prototype function decls ++ extern or non-prototyped defs without previous prototype. */ ++ extern int c_warn_strict_prototypes; ++ ++/* Nonzero means warn for any global function def ++ extern without separate previous prototype decl. */ ++ extern int c_warn_missing_prototypes; ++ ++/* Nonzero means warn for any global function def ++ extern without separate previous decl. */ ++ extern int c_warn_missing_declarations; ++ ++/* Nonzero means warn about multiple (redundant) decls for the same single ++ extern variable or function. */ ++ extern int c_warn_redundant_decls; ++ ++/* Nonzero means warn about extern declarations of objects not at ++ extern file-scope level and about *all* declarations of functions (whether ++ extern extern or static) not at file-scope level. Note that we exclude ++ extern implicit function declarations. To get warnings about those, use ++ extern -Wimplicit. */ ++ extern int c_warn_nested_externs; ++ ++/* Warn about *printf or *scanf format/argument anomalies. */ ++ extern int c_warn_format; ++ ++/* Warn about a subscript that has type char. */ ++ extern int c_warn_char_subscripts; ++ ++/* Warn if a type conversion is done that might have confusing results. */ ++ extern int c_warn_conversion; ++ ++/* Warn if adding () is suggested. */ ++ extern int c_warn_parentheses; ++ ++/* Warn if initializer is not completely bracketed. */ ++ extern int c_warn_missing_braces; ++ ++/* Warn about comparison of signed and unsigned values. ++ extern If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified. */ ++ extern int c_warn_sign_compare; ++ ++/* Temporarily suppress certain warnings. ++ This is set while reading code from a system header file. */ ++ extern int c_in_system_header; ++ ++/* Name of current original source file (what was input to cpp). ++ This comes from each #-command in the actual input. */ ++ extern char *c_input_filename; ++ ++/* Name of top-level original source file (what was input to cpp). ++ This comes from the #-command at the beginning of the actual input. ++ If there isn't any there, then this is the cc1 input file name. */ ++ extern char *c_main_input_filename; ++ ++/* Current line number in real source file. */ ++ extern int c_lineno; ++ ++/* Stack of currently pending input files. */ ++ extern c_file_stack *c_input_file_stack; ++ ++/* Incremented on each change to input_file_stack. */ ++ extern int c_input_file_stack_tick; ++ ++/* Nonzero for -ffloat-store: don't allocate floats and doubles ++ in extended-precision registers. */ ++ extern int c_flag_float_store; ++ ++/* Nonzero means all references through pointers are volatile. */ ++ extern int c_flag_volatile; ++ ++/* Don't print warning messages. -w. */ ++ extern int c_inhibit_warnings; ++ ++/* Print various extra warnings. -W. */ ++ extern int c_extra_warnings; ++ ++/* Treat warnings as errors. -Werror. */ ++ extern int c_warnings_are_errors; ++ ++/* Nonzero means we should be saving declaration info into a .X file. */ ++ extern int c_flag_gen_aux_info; ++ ++/* Nonzero allows GCC to violate some IEEE or ANSI rules regarding math ++ operations in the interest of optimization. For example it allows ++ GCC to assume arguments to sqrt are nonnegative numbers, allowing ++ faster code for sqrt to be generated. */ ++ extern int c_flag_fast_math; ++ ++ extern int c_parse_flags __P((int Argc, char **Argv)); ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_foldconst.c alliance/gcp/src/c_foldconst.c +--- alliance-5.0/gcp/src/c_foldconst.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_foldconst.c 2005-05-11 10:05:33.000000000 +0200 +@@ -0,0 +1,4321 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_foldconst.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_flags.h" ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_cdecl.h" ++# include "c_convert.h" ++# include "c_ctypeck.h" ++# include "c_foldconst.h" ++# include "c_debug.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++#define c_overflow_sum_sign(a, b, sum) ((~((a) ^ (b)) & ((a) ^ (sum))) < 0) ++ ++#define LOWPART(x) \ ++ ((x) & (((unsigned C_HOST_WIDE_INT) 1 << (C_HOST_BITS_PER_WIDE_INT/2)) - 1)) ++#define HIGHPART(x) \ ++ ((unsigned C_HOST_WIDE_INT) (x) >> C_HOST_BITS_PER_WIDE_INT/2) ++#define BASE ((unsigned C_HOST_WIDE_INT) 1 << C_HOST_BITS_PER_WIDE_INT/2) ++ ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++/* Nonzero means lvalues are limited to those valid in pedantic ANSI C. ++ Zero means allow extended lvalues. */ ++ ++ int c_pedantic_lvalues; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ ++ extern void c_rshift_double(); ++ extern void c_lshift_double(); ++ extern void c_lrotate_double(); ++ extern void c_rrotate_double(); ++ ++ ++/* When pedantic, return an expr equal to X but certainly not valid as a ++ pedantic lvalue. Otherwise, return X. */ ++ ++c_tree_node *c_get_pedantic_non_lvalue(x) ++ c_tree_node *x; ++{ ++ if (c_pedantic_lvalues) ++ return c_get_non_lvalue(x); ++ else ++ return x; ++} ++ ++/* Given a c_tree_node *comparison code, return the code that is the logical inverse ++ of the given code. It is not safe to do this for floating-point ++ comparisons, except for NE_EXPR and EQ_EXPR. */ ++ ++static int c_invert_tree_comparison(code) ++ int code; ++{ ++ switch (code) ++ { ++ case C_EQ_EXPR: ++ return C_NE_EXPR; ++ case C_NE_EXPR: ++ return C_EQ_EXPR; ++ case C_GT_EXPR: ++ return C_LE_EXPR; ++ case C_GE_EXPR: ++ return C_LT_EXPR; ++ case C_LT_EXPR: ++ return C_GE_EXPR; ++ case C_LE_EXPR: ++ return C_GT_EXPR; ++ default: ++ abort (); ++ } ++} ++ ++/* Return a simplified c_tree_node *node for the truth-negation of ARG. This ++ never alters ARG itself. We assume that ARG is an operation that ++ returns a truth value (0 or 1). */ ++ ++c_tree_node *c_invert_truthvalue(arg) ++ c_tree_node *arg; ++{ ++ c_tree_node *type = CTreeType(arg); ++ int code = CTreeNodeFirstCode(arg); ++ ++ if (code == C_ERROR_NODE) ++ return arg; ++ ++ code = CTreeExprCode(arg); ++ ++ /* If this is a comparison, we can simply invert it, except for ++ floating-point non-equality comparisons, in which case we just ++ enclose a TRUTH_NOT_EXPR around what we have. */ ++ ++ if ( code == C_LT_EXPR || ++ code == C_LE_EXPR || ++ code == C_GT_EXPR || ++ code == C_GE_EXPR || ++ code == C_EQ_EXPR || ++ code == C_NE_EXPR || ++ code == C_SET_LE_EXPR ) ++ { ++ if (FLOAT_TYPE_P (CTreeType(CTreeExprOperand(arg, 0))) ++ && code != C_NE_EXPR && code != C_EQ_EXPR) ++ return c_tree_build_unary_typed_expr(C_TRUTH_NOT_EXPR, type, arg); ++ else ++ return c_tree_build_binary_typed_expr(c_invert_tree_comparison(code), type, ++ CTreeExprOperand(arg, 0), CTreeExprOperand(arg, 1)); ++ } ++ ++ switch (code) ++ { ++ case C_INT_CST_NODE: ++ return c_convert_expr(type, c_tree_build_int_2(CTreeIntCstLow(arg) == 0 ++ && CTreeIntCstHigh(arg) == 0, 0)); ++ ++ case C_TRUTH_AND_EXPR: ++ return c_tree_build_binary_typed_expr(C_TRUTH_OR_EXPR, type, ++ c_invert_truthvalue (CTreeExprOperand(arg, 0)), ++ c_invert_truthvalue (CTreeExprOperand(arg, 1))); ++ ++ case C_TRUTH_OR_EXPR: ++ return c_tree_build_binary_typed_expr(C_TRUTH_AND_EXPR, type, ++ c_invert_truthvalue (CTreeExprOperand(arg, 0)), ++ c_invert_truthvalue (CTreeExprOperand(arg, 1))); ++ ++ case C_TRUTH_XOR_EXPR: ++ /* Here we can invert either operand. We invert the first operand ++ unless the second operand is a TRUTH_NOT_EXPR in which case our ++ result is the XOR of the first operand with the inside of the ++ negation of the second operand. */ ++ ++ if ( CTreeExprCode(CTreeExprOperand(arg, 1)) == C_TRUTH_NOT_EXPR) ++ return c_tree_build_binary_typed_expr(C_TRUTH_XOR_EXPR, type, CTreeExprOperand(arg, 0), ++ CTreeExprOperand(CTreeExprOperand(arg, 1), 0)); ++ else ++ return c_tree_build_binary_typed_expr (C_TRUTH_XOR_EXPR, type, ++ c_invert_truthvalue (CTreeExprOperand(arg, 0)), ++ CTreeExprOperand(arg, 1)); ++ ++ case C_TRUTH_ANDIF_EXPR: ++ return c_tree_build_binary_typed_expr (C_TRUTH_ORIF_EXPR, type, ++ c_invert_truthvalue (CTreeExprOperand(arg, 0)), ++ c_invert_truthvalue (CTreeExprOperand(arg, 1))); ++ ++ case C_TRUTH_ORIF_EXPR: ++ return c_tree_build_binary_typed_expr (C_TRUTH_ANDIF_EXPR, type, ++ c_invert_truthvalue (CTreeExprOperand(arg, 0)), ++ c_invert_truthvalue (CTreeExprOperand(arg, 1))); ++ ++ case C_TRUTH_NOT_EXPR: ++ return CTreeExprOperand(arg, 0); ++ ++ case C_COND_EXPR: ++ return c_tree_build_ternary_typed_expr (C_COND_EXPR, type, CTreeExprOperand(arg, 0), ++ c_invert_truthvalue (CTreeExprOperand(arg, 1)), ++ c_invert_truthvalue (CTreeExprOperand(arg, 2))); ++ ++ case C_COMPOUND_EXPR: ++ return c_tree_build_binary_typed_expr (C_COMPOUND_EXPR, type, CTreeExprOperand(arg, 0), ++ c_invert_truthvalue (CTreeExprOperand(arg, 1))); ++ ++ case C_NON_LVALUE_EXPR: ++ return c_invert_truthvalue (CTreeExprOperand(arg, 0)); ++ ++ case C_NOP_EXPR: ++ case C_CONVERT_EXPR: ++ case C_FLOAT_EXPR: ++ return c_tree_build_unary_typed_expr ( CTreeExprCode(arg), type, ++ c_invert_truthvalue (CTreeExprOperand(arg, 0))); ++ ++ case C_BIT_AND_EXPR: ++ if (! c_tree_is_integer_onep(CTreeExprOperand(arg, 1))) ++ break; ++ return c_tree_build_binary_typed_expr( ++ C_EQ_EXPR, type, arg, c_convert_expr(type, c_integer_zero_node)); ++ ++ case C_SAVE_EXPR: ++ return c_tree_build_unary_typed_expr(C_TRUTH_NOT_EXPR, type, arg); ++ ++ case C_CLEANUP_POINT_EXPR: ++ return c_tree_build_unary_typed_expr(C_CLEANUP_POINT_EXPR, type, ++ c_invert_truthvalue(CTreeExprOperand(arg, 0))); ++ ++ default: ++ break; ++ } ++ if ( CTreeTypeCode(CTreeType(arg)) != C_BOOLEAN_TYPE) ++ abort (); ++ return c_tree_build_unary_typed_expr(C_TRUTH_NOT_EXPR, type, arg); ++} ++ ++ ++/* Return an expr equal to X but certainly not valid as an lvalue. ++ Also make sure it is not valid as an null pointer constant. */ ++ ++c_tree_node *c_non_lvalue(x) ++ c_tree_node *x; ++{ ++ c_tree_node *result; ++ int code = CTreeNodeFirstCode(x); ++ ++ /* These things are certainly not lvalues. */ ++ if ( ( code == C_EXPR_NODE && ++ (CTreeExprCode(x) == C_NON_LVALUE_EXPR || CTreeExprCode(x) == C_ADDR_EXPR)) ++ || code == C_INT_CST_NODE ++ || code == C_REAL_CST_NODE ++ || code == C_STRING_NODE ) ++ { ++ if ( code == C_INT_CST_NODE && c_tree_is_integer_zerop(x)) ++ { ++ /* Use NOP_EXPR instead of NON_LVALUE_EXPR ++ so convert_for_assignment won't strip it. ++ This is so this 0 won't be treated as a null pointer constant. */ ++ result = c_tree_build_unary_typed_expr( C_NOP_EXPR, CTreeType(x), x); ++ if ( CIsTreeNodeConstant(x) ) CSetTreeNodeConstant( result ); ++ return result; ++ } ++ return x; ++ } ++ ++ result = c_tree_build_unary_typed_expr( C_NON_LVALUE_EXPR, CTreeType(x), x); ++ if ( CIsTreeNodeConstant(x) ) CSetTreeNodeConstant( result ); ++ ++ return result; ++} ++ ++ ++/* Similar, but return the comparison that results if the operands are ++ swapped. This is safe for floating-point. */ ++ ++static int c_swap_tree_comparison(code) ++ int code; ++{ ++ switch (code) ++ { ++ case C_EQ_EXPR: ++ case C_NE_EXPR: ++ return code; ++ case C_GT_EXPR: ++ return C_LT_EXPR; ++ case C_GE_EXPR: ++ return C_LE_EXPR; ++ case C_LT_EXPR: ++ return C_GT_EXPR; ++ case C_LE_EXPR: ++ return C_GE_EXPR; ++ default: ++ abort (); ++ } ++} ++ ++/* Return nonzero if CODE is a c_tree_node *code that represents a truth value. */ ++ ++static int ++c_truth_value_p (code) ++ int code; ++{ ++ return ( code == C_LT_EXPR || ++ code == C_LE_EXPR || ++ code == C_GT_EXPR || ++ code == C_GE_EXPR || ++ code == C_EQ_EXPR || ++ code == C_NE_EXPR || ++ code == C_SET_LE_EXPR || ++ code == C_TRUTH_AND_EXPR || ++ code == C_TRUTH_ANDIF_EXPR || ++ code == C_TRUTH_OR_EXPR || ++ code == C_TRUTH_ORIF_EXPR || ++ code == C_TRUTH_XOR_EXPR || ++ code == C_TRUTH_NOT_EXPR); ++ ++} ++ ++ ++/* Given T, a c_tree_node *representing type conversion of ARG1, a constant, ++ return a constant c_tree_node *representing the result of conversion. */ ++ ++static c_tree_node *c_fold_convert_expr(t, arg1) ++ c_tree_node *t; ++ c_tree_node *arg1; ++{ ++ c_tree_node *type = CTreeType(t); ++# ifdef LUDO_NO_SKIP ++ int overflow = 0; ++# endif ++ ++ if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type)) ++ { ++ if ( CTreeNodeCode(arg1) == C_INT_CST_NODE) ++ { ++ /* If we would build a constant wider than GCC supports, ++ leave the conversion unfolded. */ ++ if (CTreeTypePrecision(type) > 2 * C_HOST_BITS_PER_WIDE_INT) ++ return t; ++ ++ /* Given an integer constant, make new constant with new type, ++ appropriately sign-extended or truncated. */ ++ t = c_tree_build_int_2(CTreeIntCstLow(arg1), CTreeIntCstHigh(arg1)); ++ CTreeType(t) = type; ++ /* Indicate an overflow if (1) ARG1 already overflowed, ++ or (2) force_fit_type indicates an overflow. ++ Tell force_fit_type that an overflow has already occurred ++ if ARG1 is a too-large unsigned value and T is signed. ++ But don't indicate an overflow if converting a pointer. */ ++ if ((c_force_fit_type(t, (CTreeIntCstHigh(arg1) < 0 ++ & (CIsTreeNodeUnsigned(type) ++ < CIsTreeNodeUnsigned(CTreeType(arg1))))) ++ && ! POINTER_TYPE_P (CTreeType(arg1))) ++ || CIsTreeNodeOverflow(arg1)) ++ CSetTreeNodeOverflow(t); ++ ++ ++ if ( CIsTreeNodeOverflow(t) || CIsTreeNodeCstOverflow(arg1)) ++ CSetTreeNodeCstOverflow(t); ++ } ++# ifdef LUDO_NO_SKIP ++#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ else if (CTreeNodeCode(arg1) == REAL_CST) ++ { ++ /* Don't initialize these, use assignments. ++ Initialized local aggregates don't work on old compilers. */ ++ C_REAL_VALUE_TYPE x; ++ C_REAL_VALUE_TYPE l; ++ C_REAL_VALUE_TYPE u; ++ c_tree_node *type1 = CTreeType(arg1); ++ ++ x = TREE_REAL_CST (arg1); ++ l = c_real_value_from_int_cst(type1, TYPE_MIN_VALUE (type)); ++ u = c_real_value_from_int_cst(type1, TYPE_MAX_VALUE (type)); ++ /* See if X will be in range after truncation towards 0. ++ To compensate for truncation, move the bounds away from 0, ++ but reject if X exactly equals the adjusted bounds. */ ++#ifdef REAL_ARITHMETIC ++ REAL_ARITHMETIC (l, MINUS_EXPR, l, dconst1); ++ REAL_ARITHMETIC (u, PLUS_EXPR, u, dconst1); ++#else ++ l--; ++ u++; ++#endif ++ /* If X is a NaN, use zero instead and show we have an overflow. ++ Otherwise, range check. */ ++ if (REAL_VALUE_ISNAN (x)) ++ overflow = 1, x = dconst0; ++ else if (! (REAL_VALUES_LESS (l, x) && REAL_VALUES_LESS (x, u))) ++ overflow = 1; ++ ++#ifndef REAL_ARITHMETIC ++ { ++ C_HOST_WIDE_INT low, high; ++ C_HOST_WIDE_INT half_word ++ = (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2); ++ ++ if (x < 0) ++ x = -x; ++ ++ high = (HOST_WIDE_INT) (x / half_word / half_word); ++ x -= (REAL_VALUE_TYPE) high * half_word * half_word; ++ if (x >= (REAL_VALUE_TYPE) half_word * half_word / 2) ++ { ++ low = x - (REAL_VALUE_TYPE) half_word * half_word / 2; ++ low |= (HOST_WIDE_INT) -1 << (HOST_BITS_PER_WIDE_INT - 1); ++ } ++ else ++ low = (HOST_WIDE_INT) x; ++ if (TREE_REAL_CST (arg1) < 0) ++ neg_double (low, high, &low, &high); ++ t = build_int_2 (low, high); ++ } ++#else ++ { ++ C_HOST_WIDE_INT low, high; ++ REAL_VALUE_TO_INT (&low, &high, x); ++ t = build_int_2 (low, high); ++ } ++#endif ++ CTreeType(t) = type; ++ TREE_OVERFLOW (t) ++ = TREE_OVERFLOW (arg1) | force_fit_type (t, overflow); ++ TREE_CONSTANT_OVERFLOW (t) ++ = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1); ++ } ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++# endif ++ CTreeType(t) = type; ++ } ++ else if ( CTreeNodeCode(type) == C_REAL_TYPE) ++ { ++# ifdef LUDO_NO_SKIP ++#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE) ++ return c_build_real_from_int_cst(type, arg1); ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++# endif ++ if (CTreeNodeCode(arg1) == C_REAL_CST_NODE) ++ { ++# ifdef LUDO_NO_SKIP ++ if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))) ++ { ++ t = arg1; ++ CTreeType(arg1) = type; ++ return t; ++ } ++ else if (setjmp (float_error)) ++ { ++ overflow = 1; ++ t = copy_node (arg1); ++ goto got_it; ++ } ++ set_float_handler (float_error); ++ ++ t = c_tree_build_real(type, c_real_value_truncate(CTreeTypeMode(type), ++ CTreeRealCstValue(arg1))); ++ set_float_handler (NULL_PTR); ++ ++ got_it: ++ TREE_OVERFLOW (t) ++ = TREE_OVERFLOW (arg1) | force_fit_type (t, overflow); ++ TREE_CONSTANT_OVERFLOW (t) ++ = TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1); ++ return t; ++# endif ++ } ++ } ++ ++ CSetTreeNodeConstant(t); ++ return t; ++} ++ ++ ++/* If T contains a COMPOUND_EXPR which was inserted merely to evaluate ++ S, a SAVE_EXPR, return the expression actually being evaluated. Note ++ that we may sometimes modify the tree. */ ++ ++static c_tree_node *c_strip_compound_expr(t, s) ++ c_tree_node *t; ++ c_tree_node *s; ++{ ++# ifdef LUDO_NO_SKIP ++ c_tree_node *type = CTreeType(t); ++# endif ++ int code = CTreeNodeCode(t); ++ ++ /* See if this is the COMPOUND_EXPR we want to eliminate. */ ++ if (code == C_COMPOUND_EXPR && CTreeNodeCode(CTreeExprOperand(t, 0)) == C_CONVERT_EXPR ++ && CTreeExprOperand(CTreeExprOperand(t, 0), 0) == s) ++ return CTreeExprOperand(t, 1); ++ ++ /* See if this is a COND_EXPR or a simple arithmetic operator. We ++ don't bother handling any other types. */ ++ else if (code == C_COND_EXPR) ++ { ++ CTreeExprOperand(t, 0) = c_strip_compound_expr(CTreeExprOperand(t, 0), s); ++ CTreeExprOperand(t, 1) = c_strip_compound_expr(CTreeExprOperand(t, 1), s); ++ CTreeExprOperand(t, 2) = c_strip_compound_expr(CTreeExprOperand(t, 2), s); ++ } ++ else if ( c_tree_get_code_class(code) == '1') ++ CTreeExprOperand(t, 0) = c_strip_compound_expr(CTreeExprOperand(t, 0), s); ++ else if (c_tree_get_code_class(code) == '<' ++ || c_tree_get_code_class(code) == '2') ++ { ++ CTreeExprOperand(t, 0) = c_strip_compound_expr(CTreeExprOperand(t, 0), s); ++ CTreeExprOperand(t, 1) = c_strip_compound_expr(CTreeExprOperand(t, 1), s); ++ } ++ ++ return t; ++} ++ ++ ++/* Split a c_tree_node *IN into a constant and a variable part ++ that could be combined with CODE to make IN. ++ CODE must be a commutative arithmetic operation. ++ Store the constant part into *CONP and the variable in &VARP. ++ Return 1 if this was done; zero means the c_tree_node *IN did not decompose ++ this way. ++ ++ If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. ++ Therefore, we must tell the caller whether the variable part ++ was subtracted. We do this by storing 1 or -1 into *VARSIGNP. ++ The value stored is the coefficient for the variable term. ++ The constant term we return should always be added; ++ we negate it if necessary. */ ++ ++static int c_split_tree (in, code, varp, conp, varsignp) ++ c_tree_node *in; ++ int code; ++ c_tree_node **varp; ++ c_tree_node **conp; ++ int *varsignp; ++{ ++ c_tree_node *outtype = CTreeType(in); ++ *varp = 0; ++ *conp = 0; ++ ++ /* Strip any conversions that don't change the machine mode. */ ++ while ((CTreeNodeCode(in) == C_NOP_EXPR ++ || CTreeNodeCode(in) == C_CONVERT_EXPR) ++ && (CTreeTypeMode(CTreeType(in)) ++ == CTreeTypeMode(CTreeType(CTreeExprOperand(in, 0))))) ++ in = CTreeExprOperand(in, 0); ++ ++ if (CTreeNodeCode(in) == code ++ || (! FLOAT_TYPE_P (CTreeType(in)) ++ /* We can associate addition and subtraction together ++ (even though the C standard doesn't say so) ++ for integers because the value is not affected. ++ For reals, the value might be affected, so we can't. */ ++ && ((code == C_PLUS_EXPR && CTreeNodeCode(in) == C_MINUS_EXPR) ++ || (code == C_MINUS_EXPR && CTreeNodeCode(in) == C_PLUS_EXPR)))) ++ { ++ int code = CTreeNodeCode(CTreeExprOperand(in, 0)); ++ if (code == C_INT_CST_NODE) ++ { ++ *conp = CTreeExprOperand(in, 0); ++ *varp = CTreeExprOperand(in, 1); ++ if (CTreeTypeMode(CTreeType(*varp)) != CTreeTypeMode(outtype) ++ && CTreeType(*varp) != outtype) ++ *varp = c_convert_expr(outtype, *varp); ++ *varsignp = (CTreeNodeCode(in) == C_MINUS_EXPR) ? -1 : 1; ++ return 1; ++ } ++ if ( CIsTreeNodeConstant(CTreeExprOperand(in, 1))) ++ { ++ *conp = CTreeExprOperand(in, 1); ++ *varp = CTreeExprOperand(in, 0); ++ *varsignp = 1; ++ if (CTreeTypeMode(CTreeType(*varp)) != CTreeTypeMode(outtype) ++ && CTreeType(*varp) != outtype) ++ *varp = c_convert_expr(outtype, *varp); ++ if (CTreeNodeCode(in) == C_MINUS_EXPR) ++ { ++ /* If operation is subtraction and constant is second, ++ must negate it to get an additive constant. ++ And this cannot be done unless it is a manifest constant. ++ It could also be the address of a static variable. ++ We cannot negate that, so give up. */ ++ if (CTreeNodeCode(*conp) == C_INT_CST_NODE) ++ /* Subtracting from integer_zero_node loses for long long. */ ++ *conp = c_fold ( ++ c_tree_build_unary_typed_expr(C_NEGATE_EXPR, CTreeType(*conp), *conp)); ++ else ++ return 0; ++ } ++ return 1; ++ } ++ if ( CIsTreeNodeConstant(CTreeExprOperand(in, 0))) ++ { ++ *conp = CTreeExprOperand(in, 0); ++ *varp = CTreeExprOperand(in, 1); ++ if (CTreeTypeMode(CTreeType(*varp)) != CTreeTypeMode(outtype) ++ && CTreeType(*varp) != outtype) ++ *varp = c_convert_expr(outtype, *varp); ++ *varsignp = (CTreeNodeCode(in) == C_MINUS_EXPR) ? -1 : 1; ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++/* Unpack a two-word integer into 4 words. ++ LOW and HI are the integer, as two `HOST_WIDE_INT' pieces. ++ WORDS points to the array of HOST_WIDE_INTs. */ ++ ++static void c_encode(words, low, hi) ++ C_HOST_WIDE_INT *words; ++ C_HOST_WIDE_INT low, hi; ++{ ++ words[0] = LOWPART (low); ++ words[1] = HIGHPART (low); ++ words[2] = LOWPART (hi); ++ words[3] = HIGHPART (hi); ++} ++ ++/* Pack an array of 4 words into a two-word integer. ++ WORDS points to the array of words. ++ The integer is stored into *LOW and *HI as two `HOST_WIDE_INT' pieces. */ ++ ++static void ++c_decode (words, low, hi) ++ C_HOST_WIDE_INT *words; ++ C_HOST_WIDE_INT *low, *hi; ++{ ++ *low = words[0] | words[1] * BASE; ++ *hi = words[2] | words[3] * BASE; ++} ++ ++ ++ ++ ++/* Negate a doubleword integer with doubleword result. ++ Return nonzero if the operation overflows, assuming it's signed. ++ The argument is given as two `HOST_WIDE_INT' pieces in L1 and H1. ++ The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */ ++ ++int c_neg_double (l1, h1, lv, hv) ++ C_HOST_WIDE_INT l1, h1; ++ C_HOST_WIDE_INT *lv, *hv; ++{ ++ if (l1 == 0) ++ { ++ *lv = 0; ++ *hv = - h1; ++ return (*hv & h1) < 0; ++ } ++ else ++ { ++ *lv = - l1; ++ *hv = ~ h1; ++ return 0; ++ } ++} ++ ++ ++/* Divide doubleword integer LNUM, HNUM by doubleword integer LDEN, HDEN ++ for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM). ++ CODE is a c_tree_node *code for a kind of division, one of ++ TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR ++ or EXACT_DIV_EXPR ++ It controls how the quotient is rounded to a integer. ++ Return nonzero if the operation overflows. ++ UNS nonzero says do unsigned division. */ ++ ++extern int c_mul_double(); ++extern int c_neg_double(); ++extern int c_add_double(); ++ ++int ++c_div_and_round_double (code, uns, ++ lnum_orig, hnum_orig, lden_orig, hden_orig, ++ lquo, hquo, lrem, hrem) ++ int code; ++ int uns; ++ C_HOST_WIDE_INT lnum_orig, hnum_orig; /* num == numerator == dividend */ ++ C_HOST_WIDE_INT lden_orig, hden_orig; /* den == denominator == divisor */ ++ C_HOST_WIDE_INT *lquo, *hquo, *lrem, *hrem; ++{ ++ int quo_neg = 0; ++ C_HOST_WIDE_INT num[4 + 1]; /* extra element for scaling. */ ++ C_HOST_WIDE_INT den[4], quo[4]; ++ int i, j; ++ unsigned C_HOST_WIDE_INT work; ++ unsigned C_HOST_WIDE_INT carry = 0; ++ C_HOST_WIDE_INT lnum = lnum_orig; ++ C_HOST_WIDE_INT hnum = hnum_orig; ++ C_HOST_WIDE_INT lden = lden_orig; ++ C_HOST_WIDE_INT hden = hden_orig; ++ int overflow = 0; ++ ++ if ((hden == 0) && (lden == 0)) ++ overflow = 1, lden = 1; ++ ++ /* calculate quotient sign and convert operands to unsigned. */ ++ if (!uns) ++ { ++ if (hnum < 0) ++ { ++ quo_neg = ~ quo_neg; ++ /* (minimum integer) / (-1) is the only overflow case. */ ++ if (c_neg_double(lnum, hnum, &lnum, &hnum) && (lden & hden) == -1) ++ overflow = 1; ++ } ++ if (hden < 0) ++ { ++ quo_neg = ~ quo_neg; ++ c_neg_double (lden, hden, &lden, &hden); ++ } ++ } ++ ++ if (hnum == 0 && hden == 0) ++ { /* single precision */ ++ *hquo = *hrem = 0; ++ /* This unsigned division rounds toward zero. */ ++ *lquo = lnum / (unsigned C_HOST_WIDE_INT) lden; ++ goto finish_up; ++ } ++ ++ if (hnum == 0) ++ { /* trivial case: dividend < divisor */ ++ /* hden != 0 already checked. */ ++ *hquo = *lquo = 0; ++ *hrem = hnum; ++ *lrem = lnum; ++ goto finish_up; ++ } ++ ++ bzero ((char *) quo, sizeof quo); ++ ++ bzero ((char *) num, sizeof num); /* to zero 9th element */ ++ bzero ((char *) den, sizeof den); ++ ++ c_encode (num, lnum, hnum); ++ c_encode (den, lden, hden); ++ ++ /* Special code for when the divisor < BASE. */ ++ if (hden == 0 && lden < BASE) ++ { ++ /* hnum != 0 already checked. */ ++ for (i = 4 - 1; i >= 0; i--) ++ { ++ work = num[i] + carry * BASE; ++ quo[i] = work / (unsigned C_HOST_WIDE_INT) lden; ++ carry = work % (unsigned C_HOST_WIDE_INT) lden; ++ } ++ } ++ else ++ { ++ /* Full double precision division, ++ with thanks to Don Knuth's "Seminumerical Algorithms". */ ++ int num_hi_sig, den_hi_sig; ++ unsigned C_HOST_WIDE_INT quo_est, scale; ++ ++ /* Find the highest non-zero divisor digit. */ ++ for (i = 4 - 1; ; i--) ++ if (den[i] != 0) { ++ den_hi_sig = i; ++ break; ++ } ++ ++ /* Insure that the first digit of the divisor is at least BASE/2. ++ This is required by the quotient digit estimation algorithm. */ ++ ++ scale = BASE / (den[den_hi_sig] + 1); ++ if (scale > 1) { /* scale divisor and dividend */ ++ carry = 0; ++ for (i = 0; i <= 4 - 1; i++) { ++ work = (num[i] * scale) + carry; ++ num[i] = LOWPART (work); ++ carry = HIGHPART (work); ++ } num[4] = carry; ++ carry = 0; ++ for (i = 0; i <= 4 - 1; i++) { ++ work = (den[i] * scale) + carry; ++ den[i] = LOWPART (work); ++ carry = HIGHPART (work); ++ if (den[i] != 0) den_hi_sig = i; ++ } ++ } ++ ++ num_hi_sig = 4; ++ ++ /* Main loop */ ++ for (i = num_hi_sig - den_hi_sig - 1; i >= 0; i--) { ++ /* guess the next quotient digit, quo_est, by dividing the first ++ two remaining dividend digits by the high order quotient digit. ++ quo_est is never low and is at most 2 high. */ ++ unsigned C_HOST_WIDE_INT tmp; ++ ++ num_hi_sig = i + den_hi_sig + 1; ++ work = num[num_hi_sig] * BASE + num[num_hi_sig - 1]; ++ if (num[num_hi_sig] != den[den_hi_sig]) ++ quo_est = work / den[den_hi_sig]; ++ else ++ quo_est = BASE - 1; ++ ++ /* refine quo_est so it's usually correct, and at most one high. */ ++ tmp = work - quo_est * den[den_hi_sig]; ++ if (tmp < BASE ++ && den[den_hi_sig - 1] * quo_est > (tmp * BASE + num[num_hi_sig - 2])) ++ quo_est--; ++ ++ /* Try QUO_EST as the quotient digit, by multiplying the ++ divisor by QUO_EST and subtracting from the remaining dividend. ++ Keep in mind that QUO_EST is the I - 1st digit. */ ++ ++ carry = 0; ++ for (j = 0; j <= den_hi_sig; j++) ++ { ++ work = quo_est * den[j] + carry; ++ carry = HIGHPART (work); ++ work = num[i + j] - LOWPART (work); ++ num[i + j] = LOWPART (work); ++ carry += HIGHPART (work) != 0; ++ } ++ ++ /* if quo_est was high by one, then num[i] went negative and ++ we need to correct things. */ ++ ++ if (num[num_hi_sig] < carry) ++ { ++ quo_est--; ++ carry = 0; /* add divisor back in */ ++ for (j = 0; j <= den_hi_sig; j++) ++ { ++ work = num[i + j] + den[j] + carry; ++ carry = HIGHPART (work); ++ num[i + j] = LOWPART (work); ++ } ++ num [num_hi_sig] += carry; ++ } ++ ++ /* store the quotient digit. */ ++ quo[i] = quo_est; ++ } ++ } ++ ++ c_decode (quo, lquo, hquo); ++ ++ finish_up: ++ /* if result is negative, make it so. */ ++ if (quo_neg) ++ c_neg_double (*lquo, *hquo, lquo, hquo); ++ ++ /* compute trial remainder: rem = num - (quo * den) */ ++ c_mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem); ++ c_neg_double (*lrem, *hrem, lrem, hrem); ++ c_add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem); ++ ++ switch (code) ++ { ++ case C_TRUNC_DIV_EXPR: ++ case C_TRUNC_MOD_EXPR: /* round toward zero */ ++ case C_EXACT_DIV_EXPR: /* for this one, it shouldn't matter */ ++ return overflow; ++ ++ case C_FLOOR_DIV_EXPR: ++ case C_FLOOR_MOD_EXPR: /* round toward negative infinity */ ++ if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */ ++ { ++ /* quo = quo - 1; */ ++ c_add_double(*lquo, *hquo, (C_HOST_WIDE_INT) -1, (C_HOST_WIDE_INT) -1, ++ lquo, hquo); ++ } ++ else return overflow; ++ break; ++ ++ case C_CEIL_DIV_EXPR: ++ case C_CEIL_MOD_EXPR: /* round toward positive infinity */ ++ if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */ ++ { ++ c_add_double (*lquo, *hquo, (C_HOST_WIDE_INT) 1, (C_HOST_WIDE_INT) 0, ++ lquo, hquo); ++ } ++ else return overflow; ++ break; ++ ++ case C_ROUND_DIV_EXPR: ++ case C_ROUND_MOD_EXPR: /* round to closest integer */ ++ { ++ C_HOST_WIDE_INT labs_rem = *lrem, habs_rem = *hrem; ++ C_HOST_WIDE_INT labs_den = lden, habs_den = hden, ltwice, htwice; ++ ++ /* get absolute values */ ++ if (*hrem < 0) c_neg_double (*lrem, *hrem, &labs_rem, &habs_rem); ++ if (hden < 0) c_neg_double (lden, hden, &labs_den, &habs_den); ++ ++ /* if (2 * abs (lrem) >= abs (lden)) */ ++ c_mul_double ((C_HOST_WIDE_INT) 2, (C_HOST_WIDE_INT) 0, ++ labs_rem, habs_rem, <wice, &htwice); ++ if (((unsigned C_HOST_WIDE_INT) habs_den ++ < (unsigned C_HOST_WIDE_INT) htwice) ++ || (((unsigned C_HOST_WIDE_INT) habs_den ++ == (unsigned C_HOST_WIDE_INT) htwice) ++ && ((C_HOST_WIDE_INT unsigned) labs_den ++ < (unsigned C_HOST_WIDE_INT) ltwice))) ++ { ++ if (*hquo < 0) ++ /* quo = quo - 1; */ ++ c_add_double (*lquo, *hquo, ++ (C_HOST_WIDE_INT) -1, (C_HOST_WIDE_INT) -1, lquo, hquo); ++ else ++ /* quo = quo + 1; */ ++ c_add_double (*lquo, *hquo, (C_HOST_WIDE_INT) 1, (C_HOST_WIDE_INT) 0, ++ lquo, hquo); ++ } ++ else return overflow; ++ } ++ break; ++ ++ default: ++ abort (); ++ } ++ ++ /* compute true remainder: rem = num - (quo * den) */ ++ c_mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem); ++ c_neg_double (*lrem, *hrem, lrem, hrem); ++ c_add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem); ++ return overflow; ++} ++ ++ ++/* Return nonzero if two operands are necessarily equal. ++ If ONLY_CONST is non-zero, only return non-zero for constants. ++ This function tests whether the operands are indistinguishable; ++ it does not test whether they are equal using C's == operation. ++ The distinction is important for IEEE floating point, because ++ (1) -0.0 and 0.0 are distinguishable, but -0.0==0.0, and ++ (2) two NaNs may be indistinguishable, but NaN!=NaN. */ ++ ++int c_is_operand_equal_p(arg0, arg1, only_const) ++ c_tree_node *arg0; ++ c_tree_node *arg1; ++ int only_const; ++{ ++ /* If both types don't have the same signedness, then we can't consider ++ them equal. We must check this before the STRIP_NOPS calls ++ because they may change the signedness of the arguments. */ ++ if (CIsTreeNodeUnsigned(CTreeType(arg0)) != CIsTreeNodeUnsigned(CTreeType(arg1))) ++ return 0; ++ ++ CStripNops(arg0); ++ CStripNops(arg1); ++ ++ if ( CTreeNodeCode(arg0) != CTreeNodeCode(arg1) ++ /* This is needed for conversions and for COMPONENT_REF. ++ Might as well play it safe and always test this. */ ++ || CTreeTypeMode(CTreeType(arg0)) != CTreeTypeMode(CTreeType(arg1))) ++ return 0; ++ ++ /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal. ++ We don't care about side effects in that case because the SAVE_EXPR ++ takes care of that for us. In all other cases, two expressions are ++ equal if they have no side effects. If we have two identical ++ expressions with side effects that should be treated the same due ++ to the only side effects being identical SAVE_EXPR's, that will ++ be detected in the recursive calls below. */ ++ if (arg0 == arg1 && ! only_const ++ && (CTreeNodeCode(arg0) == C_SAVE_EXPR ++ || (! CIsTreeNodeSideEffect(arg0) && ! CIsTreeNodeSideEffect(arg1)))) ++ return 1; ++ ++ /* Next handle constant cases, those for which we can return 1 even ++ if ONLY_CONST is set. */ ++ if ( CIsTreeNodeConstant(arg0) && CIsTreeNodeConstant(arg1)) ++ switch (CTreeNodeCode(arg0)) ++ { ++ case C_INT_CST_NODE: ++ return (! CIsTreeNodeCstOverflow(arg0) ++ && ! CIsTreeNodeCstOverflow(arg1) ++ && CTreeIntCstLow(arg0) == CTreeIntCstLow(arg1) ++ && CTreeIntCstHigh(arg0) == CTreeIntCstHigh(arg1)); ++ ++ case C_REAL_CST_NODE: ++ return (! CIsTreeNodeCstOverflow(arg0) ++ && ! CIsTreeNodeCstOverflow(arg1) ++ && REAL_VALUES_IDENTICAL ( CTreeRealCstValue(arg0), ++ CTreeRealCstValue(arg1))); ++ ++ case C_COMPLEX_NODE: ++ return (c_is_operand_equal_p( CTreeComplexReal(arg0), CTreeComplexReal(arg1), ++ only_const) ++ && c_is_operand_equal_p( CTreeComplexImag(arg0), CTreeComplexImag(arg1), ++ only_const)); ++ ++ case C_STRING_NODE: ++ return ( CTreeStringLength(arg0) == CTreeStringLength(arg1) ++ && ! strncmp ( CTreeStringPointer(arg0), CTreeStringPointer(arg1), ++ CTreeStringLength(arg0))); ++ ++ case C_ADDR_EXPR: ++ return c_is_operand_equal_p(CTreeExprOperand(arg0, 0), CTreeExprOperand(arg1, 0), ++ 0); ++ default: ++ break; ++ } ++ ++ if (only_const) ++ return 0; ++ ++ switch ( c_tree_get_code_class(CTreeNodeCode(arg0))) ++ { ++ case '1': ++ /* Two conversions are equal only if signedness and modes match. */ ++ if ((CTreeNodeCode(arg0) == C_NOP_EXPR || CTreeNodeCode(arg0) == C_CONVERT_EXPR) ++ && (CIsTreeNodeUnsigned(CTreeType(arg0)) ++ != CIsTreeNodeUnsigned(CTreeType(arg1)))) ++ return 0; ++ ++ return c_is_operand_equal_p(CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(arg1, 0), 0); ++ ++ case '<': ++ case '2': ++ if (c_is_operand_equal_p(CTreeExprOperand(arg0, 0), CTreeExprOperand(arg1, 0), 0) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), CTreeExprOperand(arg1, 1), ++ 0)) ++ return 1; ++ ++ /* For commutative ops, allow the other order. */ ++ return ((CTreeNodeCode(arg0) == C_PLUS_EXPR || CTreeNodeCode(arg0) == C_MULT_EXPR ++ || CTreeNodeCode(arg0) == C_MIN_EXPR || CTreeNodeCode(arg0) == C_MAX_EXPR ++ || CTreeNodeCode(arg0) == C_BIT_IOR_EXPR ++ || CTreeNodeCode(arg0) == C_BIT_XOR_EXPR ++ || CTreeNodeCode(arg0) == C_BIT_AND_EXPR ++ || CTreeNodeCode(arg0) == C_NE_EXPR || CTreeNodeCode(arg0) == C_EQ_EXPR) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(arg1, 1), 0) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ CTreeExprOperand(arg1, 0), 0)); ++ ++ case 'r': ++ switch (CTreeNodeCode(arg0)) ++ { ++ case C_INDIRECT_REF: ++ return c_is_operand_equal_p(CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(arg1, 0), 0); ++ ++ case C_COMPONENT_REF: ++ case C_ARRAY_REF: ++ return (c_is_operand_equal_p(CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(arg1, 0), 0) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ CTreeExprOperand(arg1, 1), 0)); ++ ++ case C_BIT_FIELD_REF: ++ return (c_is_operand_equal_p(CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(arg1, 0), 0) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ CTreeExprOperand(arg1, 1), 0) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 2), ++ CTreeExprOperand(arg1, 2), 0)); ++ default: ++ return 0; ++ } ++ ++ default: ++ return 0; ++ } ++} ++ ++ ++/* Similar to operand_equal_p, but see if ARG0 might have been made by ++ shorten_compare from ARG1 when ARG1 was being compared with OTHER. ++ ++ When in doubt, return 0. */ ++ ++static int ++c_is_operand_equal_for_comparison_p(arg0, arg1, other) ++ c_tree_node *arg0; ++ c_tree_node *arg1; ++ c_tree_node *other; ++{ ++ int unsignedp1, unsignedpo; ++ c_tree_node *primarg1; ++ c_tree_node *primother; ++ unsigned correct_width; ++ ++ if (c_is_operand_equal_p(arg0, arg1, 0)) ++ return 1; ++ ++ if (! INTEGRAL_TYPE_P (CTreeType(arg0)) ++ || ! INTEGRAL_TYPE_P (CTreeType(arg1))) ++ return 0; ++ ++ /* Duplicate what shorten_compare does to ARG1 and see if that gives the ++ actual comparison operand, ARG0. ++ ++ First throw away any conversions to wider types ++ already present in the operands. */ ++ ++ primarg1 = c_get_narrower(arg1, &unsignedp1); ++ primother = c_get_narrower(other, &unsignedpo); ++ ++ correct_width = CTreeTypePrecision(CTreeType(arg1)); ++ if (unsignedp1 == unsignedpo ++ && CTreeTypePrecision(CTreeType(primarg1)) < correct_width ++ && CTreeTypePrecision(CTreeType(primother)) < correct_width) ++ { ++ c_tree_node *type = CTreeType(arg0); ++ ++ /* Make sure shorter operand is extended the right way ++ to match the longer operand. */ ++ primarg1 = c_convert_expr( ++ c_get_signed_or_unsigned_type(unsignedp1, CTreeType(primarg1)), primarg1); ++ ++ if (c_is_operand_equal_p(arg0, c_convert_expr(type, primarg1), 0)) ++ return 1; ++ } ++ ++ return 0; ++} ++ ++ ++/* See if ARG is an expression that is either a comparison or is performing ++ arithmetic on comparisons. The comparisons must only be comparing ++ two different values, which will be stored in *CVAL1 and *CVAL2; if ++ they are non-zero it means that some operands have already been found. ++ No variables may be used anywhere else in the expression except in the ++ comparisons. If SAVE_P is true it means we removed a SAVE_EXPR around ++ the expression and save_expr needs to be called with CVAL1 and CVAL2. ++ ++ If this is true, return 1. Otherwise, return zero. */ ++ ++static int c_twoval_comparison_p (arg, cval1, cval2, save_p) ++ c_tree_node *arg; ++ c_tree_node **cval1; ++ c_tree_node **cval2; ++ int *save_p; ++{ ++ int code = CTreeNodeCode(arg); ++ char class = c_tree_get_code_class(code); ++ ++ /* We can handle some of the 'e' cases here. */ ++ if (class == 'e' && code == C_TRUTH_NOT_EXPR) ++ class = '1'; ++ else if (class == 'e' ++ && (code == C_TRUTH_ANDIF_EXPR || code == C_TRUTH_ORIF_EXPR ++ || code == C_COMPOUND_EXPR)) ++ class = '2'; ++ ++ switch (class) ++ { ++ case '1': ++ return c_twoval_comparison_p(CTreeExprOperand(arg, 0), cval1, cval2, save_p); ++ ++ case '2': ++ return (c_twoval_comparison_p(CTreeExprOperand(arg, 0), cval1, cval2, save_p) ++ && c_twoval_comparison_p(CTreeExprOperand(arg, 1), ++ cval1, cval2, save_p)); ++ ++ case 'c': ++ return 1; ++ ++ case 'e': ++ if (code == C_COND_EXPR) ++ return (c_twoval_comparison_p(CTreeExprOperand(arg, 0), ++ cval1, cval2, save_p) ++ && c_twoval_comparison_p(CTreeExprOperand(arg, 1), ++ cval1, cval2, save_p) ++ && c_twoval_comparison_p(CTreeExprOperand(arg, 2), ++ cval1, cval2, save_p)); ++ return 0; ++ ++ case '<': ++ /* First see if we can handle the first operand, then the second. For ++ the second operand, we know *CVAL1 can't be zero. It must be that ++ one side of the comparison is each of the values; test for the ++ case where this isn't true by failing if the two operands ++ are the same. */ ++ ++ if (c_is_operand_equal_p(CTreeExprOperand(arg, 0), ++ CTreeExprOperand(arg, 1), 0)) ++ return 0; ++ ++ if (*cval1 == 0) ++ *cval1 = CTreeExprOperand(arg, 0); ++ else if (c_is_operand_equal_p(*cval1, CTreeExprOperand(arg, 0), 0)) ++ ; ++ else if (*cval2 == 0) ++ *cval2 = CTreeExprOperand(arg, 0); ++ else if (c_is_operand_equal_p(*cval2, CTreeExprOperand(arg, 0), 0)) ++ ; ++ else ++ return 0; ++ ++ if ( c_is_operand_equal_p(*cval1, CTreeExprOperand(arg, 1), 0)) ++ ; ++ else if (*cval2 == 0) ++ *cval2 = CTreeExprOperand(arg, 1); ++ else if (c_is_operand_equal_p(*cval2, CTreeExprOperand(arg, 1), 0)) ++ ; ++ else ++ return 0; ++ ++ return 1; ++ ++ default: ++ return 0; ++ } ++} ++ ++/* Combine two integer constants ARG1 and ARG2 under operation CODE ++ to produce a new constant. ++ ++ If NOTRUNC is nonzero, do not truncate the result to fit the data type. ++ If FORSIZE is nonzero, compute overflow for unsigned types. */ ++ ++static c_tree_node *c_int_const_binop(code, arg1, arg2, notrunc, forsize) ++ int code; ++ c_tree_node *arg1; ++ c_tree_node *arg2; ++ int notrunc, forsize; ++{ ++ C_HOST_WIDE_INT int1l, int1h, int2l, int2h; ++ C_HOST_WIDE_INT low, hi; ++ C_HOST_WIDE_INT garbagel, garbageh; ++ c_tree_node *t; ++ int uns = CIsTreeNodeUnsigned(CTreeType(arg1)); ++ int overflow = 0; ++ int no_overflow = 0; ++ ++ int1l = CTreeIntCstLow(arg1); ++ int1h = CTreeIntCstHigh(arg1); ++ int2l = CTreeIntCstLow(arg2); ++ int2h = CTreeIntCstHigh(arg2); ++ ++ switch (code) ++ { ++ case C_BIT_IOR_EXPR: ++ low = int1l | int2l, hi = int1h | int2h; ++ break; ++ ++ case C_BIT_XOR_EXPR: ++ low = int1l ^ int2l, hi = int1h ^ int2h; ++ break; ++ ++ case C_BIT_AND_EXPR: ++ low = int1l & int2l, hi = int1h & int2h; ++ break; ++ ++ case C_BIT_ANDTC_EXPR: ++ low = int1l & ~int2l, hi = int1h & ~int2h; ++ break; ++ ++ case C_RSHIFT_EXPR: ++ int2l = - int2l; ++ case C_LSHIFT_EXPR: ++ /* It's unclear from the C standard whether shifts can overflow. ++ The following code ignores overflow; perhaps a C standard ++ interpretation ruling is needed. */ ++ c_lshift_double(int1l, int1h, int2l, ++ CTreeTypePrecision(CTreeType(arg1)), &low, &hi, !uns); ++ no_overflow = 1; ++ break; ++ ++ case C_RROTATE_EXPR: ++ int2l = - int2l; ++ case C_LROTATE_EXPR: ++ c_lrotate_double(int1l, int1h, int2l, ++ CTreeTypePrecision(CTreeType(arg1)), &low, &hi); ++ break; ++ ++ case C_PLUS_EXPR: ++ overflow = c_add_double(int1l, int1h, int2l, int2h, &low, &hi); ++ break; ++ ++ case C_MINUS_EXPR: ++ c_neg_double (int2l, int2h, &low, &hi); ++ c_add_double (int1l, int1h, low, hi, &low, &hi); ++ overflow = c_overflow_sum_sign (hi, int2h, int1h); ++ break; ++ ++ case C_MULT_EXPR: ++ overflow = c_mul_double(int1l, int1h, int2l, int2h, &low, &hi); ++ break; ++ ++ case C_TRUNC_DIV_EXPR: ++ case C_FLOOR_DIV_EXPR: ++ case C_CEIL_DIV_EXPR: ++ case C_EXACT_DIV_EXPR: ++ /* This is a shortcut for a common special case. */ ++ if (int2h == 0 && int2l > 0 ++ && ! CIsTreeNodeCstOverflow(arg1) ++ && ! CIsTreeNodeCstOverflow(arg2) ++ && int1h == 0 && int1l >= 0) ++ { ++ if (code == C_CEIL_DIV_EXPR) ++ int1l += int2l - 1; ++ low = int1l / int2l, hi = 0; ++ break; ++ } ++ ++ /* ... fall through ... */ ++ ++ case C_ROUND_DIV_EXPR: ++ if (int2h == 0 && int2l == 1) ++ { ++ low = int1l, hi = int1h; ++ break; ++ } ++ if (int1l == int2l && int1h == int2h ++ && ! (int1l == 0 && int1h == 0)) ++ { ++ low = 1, hi = 0; ++ break; ++ } ++ overflow = c_div_and_round_double(code, uns, ++ int1l, int1h, int2l, int2h, ++ &low, &hi, &garbagel, &garbageh); ++ break; ++ ++ case C_TRUNC_MOD_EXPR: ++ case C_FLOOR_MOD_EXPR: ++ case C_CEIL_MOD_EXPR: ++ /* This is a shortcut for a common special case. */ ++ if (int2h == 0 && int2l > 0 ++ && ! CIsTreeNodeCstOverflow(arg1) ++ && ! CIsTreeNodeCstOverflow(arg2) ++ && int1h == 0 && int1l >= 0) ++ { ++ if (code == C_CEIL_MOD_EXPR) ++ int1l += int2l - 1; ++ low = int1l % int2l, hi = 0; ++ break; ++ } ++ ++ /* ... fall through ... */ ++ ++ case C_ROUND_MOD_EXPR: ++ overflow = c_div_and_round_double (code, uns, ++ int1l, int1h, int2l, int2h, ++ &garbagel, &garbageh, &low, &hi); ++ break; ++ ++ case C_MIN_EXPR: ++ case C_MAX_EXPR: ++ if (uns) ++ { ++ low = (((unsigned C_HOST_WIDE_INT) int1h ++ < (unsigned C_HOST_WIDE_INT) int2h) ++ || (((unsigned C_HOST_WIDE_INT) int1h ++ == (unsigned C_HOST_WIDE_INT) int2h) ++ && ((unsigned C_HOST_WIDE_INT) int1l ++ < (unsigned C_HOST_WIDE_INT) int2l))); ++ } ++ else ++ { ++ low = ((int1h < int2h) ++ || ((int1h == int2h) ++ && ((unsigned C_HOST_WIDE_INT) int1l ++ < (unsigned C_HOST_WIDE_INT) int2l))); ++ } ++ if (low == (code == C_MIN_EXPR)) ++ low = int1l, hi = int1h; ++ else ++ low = int2l, hi = int2h; ++ break; ++ ++ default: ++ abort (); ++ } ++ ++ if (CTreeType(arg1) == c_size_type && hi == 0 ++ && low >= 0 && low <= CTreeIntCstLow( CTreeTypeMaxValue(c_size_type)) ++ && ! overflow ++ && ! CIsTreeNodeOverflow(arg1) && ! CIsTreeNodeOverflow(arg2)) ++ t = c_tree_get_size_int(low); ++ else ++ { ++ t = c_tree_build_int_2(low, hi); ++ CTreeType(t) = CTreeType(arg1); ++ } ++ ++# ifdef LUDO_NO_SKIP ++ TREE_OVERFLOW (t) ++ = ((notrunc ? (!uns || forsize) && overflow ++ : force_fit_type (t, (!uns || forsize) && overflow) && ! no_overflow) ++ | TREE_OVERFLOW (arg1) ++ | TREE_OVERFLOW (arg2)); ++ /* If we're doing a size calculation, unsigned arithmetic does overflow. ++ So check if force_fit_type truncated the value. */ ++ if (forsize ++ && ! CIsTreeNodeOverflow(t) ++ && (CTreeIntCstHigh(t) != hi ++ || CTreeIntCstLow(t) != low)) ++ TREE_OVERFLOW (t) = 1; ++ TREE_CONSTANT_OVERFLOW (t) = (TREE_OVERFLOW (t) ++ | TREE_CONSTANT_OVERFLOW (arg1) ++ | TREE_CONSTANT_OVERFLOW (arg2)); ++# endif ++ return t; ++} ++ ++/* Combine operands OP1 and OP2 with arithmetic operation CODE. ++ CODE is a c_tree_node *code. Data type is taken from `c_size_type', ++ If the operands are constant, so is the result. */ ++ ++c_tree_node *c_build_size_binop(code, arg0, arg1) ++ int code; ++ c_tree_node *arg0; ++ c_tree_node *arg1; ++{ ++ c_tree_node *tmp_node; ++ /* Handle the special case of two integer constants faster. */ ++ if ( CTreeNodeFirstCode(arg0) == C_INT_CST_NODE && ++ CTreeNodeFirstCode(arg1) == C_INT_CST_NODE) ++ { ++ /* And some specific cases even faster than that. */ ++ if (code == C_PLUS_EXPR && c_tree_is_integer_zerop(arg0)) ++ return arg1; ++ else if ((code == C_MINUS_EXPR || code == C_PLUS_EXPR) ++ && c_tree_is_integer_zerop(arg1)) ++ return arg0; ++ else if (code == C_MULT_EXPR && c_tree_is_integer_onep(arg0)) ++ return arg1; ++ ++ /* Handle general case of two integer constants. */ ++ return c_int_const_binop (code, arg0, arg1, 0, 1); ++ } ++ ++ if (arg0 == c_error_mark_node || arg1 == c_error_mark_node) ++ return c_error_mark_node; ++ ++ tmp_node = c_tree_build_binary_expr( code, arg0, arg1 ); ++ CTreeType( tmp_node ) = c_size_type; ++ ++ tmp_node = c_fold( tmp_node ); ++ ++ ++ return( tmp_node ); ++} ++ ++ ++ ++/* Add two doubleword integers with doubleword result. ++ Each argument is given as two `HOST_WIDE_INT' pieces. ++ One argument is L1 and H1; the other, L2 and H2. ++ The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */ ++ ++int ++c_add_double (l1, h1, l2, h2, lv, hv) ++ C_HOST_WIDE_INT l1, h1, l2, h2; ++ C_HOST_WIDE_INT *lv, *hv; ++{ ++ C_HOST_WIDE_INT l, h; ++ ++ l = l1 + l2; ++ h = h1 + h2 + ((unsigned C_HOST_WIDE_INT) l < l1); ++ ++ *lv = l; ++ *hv = h; ++ return c_overflow_sum_sign(h1, h2, h); ++} ++ ++ ++/* Multiply two doubleword integers with doubleword result. ++ Return nonzero if the operation overflows, assuming it's signed. ++ Each argument is given as two `HOST_WIDE_INT' pieces. ++ One argument is L1 and H1; the other, L2 and H2. ++ The value is stored as two `HOST_WIDE_INT' pieces in *LV and *HV. */ ++ ++int ++c_mul_double (l1, h1, l2, h2, lv, hv) ++ C_HOST_WIDE_INT l1, h1, l2, h2; ++ C_HOST_WIDE_INT *lv, *hv; ++{ ++ C_HOST_WIDE_INT arg1[4]; ++ C_HOST_WIDE_INT arg2[4]; ++ C_HOST_WIDE_INT prod[4 * 2]; ++ unsigned C_HOST_WIDE_INT carry; ++ int i, j, k; ++ C_HOST_WIDE_INT toplow, tophigh, neglow, neghigh; ++ ++ c_encode(arg1, l1, h1); ++ c_encode(arg2, l2, h2); ++ ++ bzero ((char *) prod, sizeof prod); ++ ++ for (i = 0; i < 4; i++) ++ { ++ carry = 0; ++ for (j = 0; j < 4; j++) ++ { ++ k = i + j; ++ /* This product is <= 0xFFFE0001, the sum <= 0xFFFF0000. */ ++ carry += arg1[i] * arg2[j]; ++ /* Since prod[p] < 0xFFFF, this sum <= 0xFFFFFFFF. */ ++ carry += prod[k]; ++ prod[k] = LOWPART (carry); ++ carry = HIGHPART (carry); ++ } ++ prod[i + 4] = carry; ++ } ++ ++ c_decode(prod, lv, hv); /* This ignores prod[4] through prod[4*2-1] */ ++ ++ /* Check for overflow by calculating the top half of the answer in full; ++ it should agree with the low half's sign bit. */ ++ c_decode(prod+4, &toplow, &tophigh); ++ if (h1 < 0) ++ { ++ c_neg_double(l2, h2, &neglow, &neghigh); ++ c_add_double(neglow, neghigh, toplow, tophigh, &toplow, &tophigh); ++ } ++ if (h2 < 0) ++ { ++ c_neg_double(l1, h1, &neglow, &neghigh); ++ c_add_double(neglow, neghigh, toplow, tophigh, &toplow, &tophigh); ++ } ++ return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0; ++} ++ ++/* Shift the doubleword integer in L1, H1 left by COUNT places ++ keeping only PREC bits of result. ++ Shift right if COUNT is negative. ++ ARITH nonzero specifies arithmetic shifting; otherwise use logical shift. ++ Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */ ++ ++ ++void ++c_lshift_double (l1, h1, count, prec, lv, hv, arith) ++ C_HOST_WIDE_INT l1, h1, count; ++ int prec; ++ C_HOST_WIDE_INT *lv, *hv; ++ int arith; ++{ ++ if (count < 0) ++ { ++ c_rshift_double (l1, h1, - count, prec, lv, hv, arith); ++ return; ++ } ++ ++#ifdef SHIFT_COUNT_TRUNCATED ++ if (SHIFT_COUNT_TRUNCATED) ++ count %= prec; ++#endif ++ ++ if (count >= C_HOST_BITS_PER_WIDE_INT) ++ { ++ *hv = (unsigned C_HOST_WIDE_INT) l1 << (count - C_HOST_BITS_PER_WIDE_INT); ++ *lv = 0; ++ } ++ else ++ { ++ *hv = (((unsigned C_HOST_WIDE_INT) h1 << count) ++ | ((unsigned C_HOST_WIDE_INT) l1 >> ((C_HOST_BITS_PER_WIDE_INT - count - 1) >> 1))); ++ *lv = (unsigned C_HOST_WIDE_INT) l1 << count; ++ } ++} ++ ++/* Shift the doubleword integer in L1, H1 right by COUNT places ++ keeping only PREC bits of result. COUNT must be positive. ++ ARITH nonzero specifies arithmetic shifting; otherwise use logical shift. ++ Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */ ++ ++void ++c_rshift_double (l1, h1, count, prec, lv, hv, arith) ++ C_HOST_WIDE_INT l1, h1, count; ++ int prec; ++ C_HOST_WIDE_INT *lv, *hv; ++ int arith; ++{ ++ unsigned C_HOST_WIDE_INT signmask; ++ signmask = (arith ++ ? -((unsigned C_HOST_WIDE_INT) h1 >> (C_HOST_BITS_PER_WIDE_INT - 1)) ++ : 0); ++ ++#ifdef SHIFT_COUNT_TRUNCATED ++ if (SHIFT_COUNT_TRUNCATED) ++ count %= prec; ++#endif ++ ++ if (count >= C_HOST_BITS_PER_WIDE_INT) ++ { ++ *hv = signmask; ++ *lv = ((signmask << ((2 * C_HOST_BITS_PER_WIDE_INT - count - 1) << 1)) ++ | ((unsigned C_HOST_WIDE_INT) h1 >> (count - C_HOST_BITS_PER_WIDE_INT))); ++ } ++ else ++ { ++ *lv = (((unsigned C_HOST_WIDE_INT) l1 >> count) ++ | ((unsigned C_HOST_WIDE_INT) h1 << ((C_HOST_BITS_PER_WIDE_INT - count - 1) << 1))); ++ *hv = ((signmask << (C_HOST_BITS_PER_WIDE_INT - count)) ++ | ((unsigned C_HOST_WIDE_INT) h1 >> count)); ++ } ++} ++ ++/* Rotate the doubleword integer in L1, H1 left by COUNT places ++ keeping only PREC bits of result. ++ Rotate right if COUNT is negative. ++ Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */ ++ ++void ++c_lrotate_double (l1, h1, count, prec, lv, hv) ++ C_HOST_WIDE_INT l1, h1, count; ++ int prec; ++ C_HOST_WIDE_INT *lv, *hv; ++{ ++ C_HOST_WIDE_INT s1l, s1h, s2l, s2h; ++ ++ count %= prec; ++ if (count < 0) ++ count += prec; ++ ++ c_lshift_double (l1, h1, count, prec, &s1l, &s1h, 0); ++ c_rshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0); ++ *lv = s1l | s2l; ++ *hv = s1h | s2h; ++} ++ ++/* Rotate the doubleword integer in L1, H1 left by COUNT places ++ keeping only PREC bits of result. COUNT must be positive. ++ Store the value as two `HOST_WIDE_INT' pieces in *LV and *HV. */ ++ ++void ++c_rrotate_double (l1, h1, count, prec, lv, hv) ++ C_HOST_WIDE_INT l1, h1, count; ++ int prec; ++ C_HOST_WIDE_INT *lv, *hv; ++{ ++ C_HOST_WIDE_INT s1l, s1h, s2l, s2h; ++ ++ count %= prec; ++ if (count < 0) ++ count += prec; ++ ++ c_rshift_double (l1, h1, count, prec, &s1l, &s1h, 0); ++ c_lshift_double (l1, h1, prec - count, prec, &s2l, &s2h, 0); ++ *lv = s1l | s2l; ++ *hv = s1h | s2h; ++} ++ ++ ++ ++/* Combine two constants ARG1 and ARG2 under operation CODE ++ to produce a new constant. ++ We assume ARG1 and ARG2 have the same data type, ++ or at least are the same kind of constant and the same machine mode. ++ ++ If NOTRUNC is nonzero, do not truncate the result to fit the data type. */ ++ ++static c_tree_node *c_const_binop(code, arg1, arg2, notrunc) ++ int code; ++ c_tree_node *arg1; ++ c_tree_node *arg2; ++ int notrunc; ++{ ++ CStripNops(arg1); CStripNops(arg2); ++ ++ if ( CTreeNodeCode(arg1) == C_INT_CST_NODE) ++ return c_int_const_binop(code, arg1, arg2, notrunc, 0); ++ ++# ifdef LUDO_NO_SKIP ++#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ if (CTreeNodeCode(arg1) == REAL_CST) ++ { ++ REAL_VALUE_TYPE d1; ++ REAL_VALUE_TYPE d2; ++ int overflow = 0; ++ REAL_VALUE_TYPE value; ++ c_tree_node *t; ++ ++ d1 = TREE_REAL_CST (arg1); ++ d2 = TREE_REAL_CST (arg2); ++ ++ /* If either operand is a NaN, just return it. Otherwise, set up ++ for floating-point trap; we return an overflow. */ ++ if (REAL_VALUE_ISNAN (d1)) ++ return arg1; ++ else if (REAL_VALUE_ISNAN (d2)) ++ return arg2; ++ else if (setjmp (float_error)) ++ { ++ t = copy_node (arg1); ++ overflow = 1; ++ goto got_float; ++ } ++ ++ set_float_handler (float_error); ++ ++#ifdef REAL_ARITHMETIC ++ REAL_ARITHMETIC (value, code, d1, d2); ++#else ++ switch (code) ++ { ++ case PLUS_EXPR: ++ value = d1 + d2; ++ break; ++ ++ case MINUS_EXPR: ++ value = d1 - d2; ++ break; ++ ++ case MULT_EXPR: ++ value = d1 * d2; ++ break; ++ ++ case RDIV_EXPR: ++#ifndef REAL_INFINITY ++ if (d2 == 0) ++ abort (); ++#endif ++ ++ value = d1 / d2; ++ break; ++ ++ case MIN_EXPR: ++ value = MIN (d1, d2); ++ break; ++ ++ case MAX_EXPR: ++ value = MAX (d1, d2); ++ break; ++ ++ default: ++ abort (); ++ } ++#endif /* no REAL_ARITHMETIC */ ++ t = build_real (CTreeType(arg1), ++ real_value_truncate (CTreeTypeMode(CTreeType(arg1)), value)); ++ got_float: ++ set_float_handler (NULL_PTR); ++ ++ TREE_OVERFLOW (t) ++ = (force_fit_type (t, overflow) ++ | TREE_OVERFLOW (arg1) | TREE_OVERFLOW (arg2)); ++ TREE_CONSTANT_OVERFLOW (t) ++ = TREE_OVERFLOW (t) ++ | TREE_CONSTANT_OVERFLOW (arg1) ++ | TREE_CONSTANT_OVERFLOW (arg2); ++ return t; ++ } ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++# endif ++ if (CTreeNodeCode(arg1) == C_COMPLEX_NODE) ++ { ++ c_tree_node *type = CTreeType(arg1); ++ c_tree_node *r1 = CTreeComplexReal(arg1); ++ c_tree_node *i1 = CTreeComplexImag(arg1); ++ c_tree_node *r2 = CTreeComplexReal(arg2); ++ c_tree_node *i2 = CTreeComplexImag(arg2); ++ c_tree_node *t; ++ ++ switch (code) ++ { ++ case C_PLUS_EXPR: ++ t = c_tree_build_complex (type, ++ c_const_binop(C_PLUS_EXPR, r1, r2, notrunc), ++ c_const_binop(C_PLUS_EXPR, i1, i2, notrunc)); ++ break; ++ ++ case C_MINUS_EXPR: ++ t = c_tree_build_complex (type, ++ c_const_binop(C_MINUS_EXPR, r1, r2, notrunc), ++ c_const_binop(C_MINUS_EXPR, i1, i2, notrunc)); ++ break; ++ ++ case C_MULT_EXPR: ++ t = c_tree_build_complex(type, ++ c_const_binop(C_MINUS_EXPR, ++ c_const_binop(C_MULT_EXPR, ++ r1, r2, notrunc), ++ c_const_binop(C_MULT_EXPR, ++ i1, i2, notrunc), ++ notrunc), ++ c_const_binop(C_PLUS_EXPR, ++ c_const_binop(C_MULT_EXPR, ++ r1, i2, notrunc), ++ c_const_binop(C_MULT_EXPR, ++ i1, r2, notrunc), ++ notrunc)); ++ break; ++ ++ case C_RDIV_EXPR: ++ { ++ c_tree_node *magsquared ++ = c_const_binop(C_PLUS_EXPR, ++ c_const_binop(C_MULT_EXPR, r2, r2, notrunc), ++ c_const_binop(C_MULT_EXPR, i2, i2, notrunc), ++ notrunc); ++ ++ t = c_tree_build_complex(type, ++ c_const_binop ++ (INTEGRAL_TYPE_P (CTreeType(r1)) ++ ? C_TRUNC_DIV_EXPR : C_RDIV_EXPR, ++ c_const_binop(C_PLUS_EXPR, ++ c_const_binop(C_MULT_EXPR, r1, r2, ++ notrunc), ++ c_const_binop(C_MULT_EXPR, i1, i2, ++ notrunc), ++ notrunc), ++ magsquared, notrunc), ++ c_const_binop ++ (INTEGRAL_TYPE_P (CTreeType(r1)) ++ ? C_TRUNC_DIV_EXPR : C_RDIV_EXPR, ++ c_const_binop(C_MINUS_EXPR, ++ c_const_binop(C_MULT_EXPR, i1, r2, ++ notrunc), ++ c_const_binop(C_MULT_EXPR, r1, i2, ++ notrunc), ++ notrunc), ++ magsquared, notrunc)); ++ } ++ break; ++ ++ default: ++ abort (); ++ } ++ return t; ++ } ++ return 0; ++} ++ ++ ++/* Return a c_tree_node *for the case when the result of an expression is RESULT ++ converted to TYPE and OMITTED was previously an operand of the expression ++ but is now not needed (e.g., we folded OMITTED * 0). ++ ++ If OMITTED has side effects, we must evaluate it. Otherwise, just do ++ the conversion of RESULT to TYPE. */ ++ ++static c_tree_node *c_omit_one_operand(type, result, omitted) ++ c_tree_node *type; ++ c_tree_node *result; ++ c_tree_node *omitted; ++{ ++ c_tree_node *t = c_convert_expr(type, result); ++ ++ if ( CIsTreeNodeSideEffect(omitted)) ++ return c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, type, omitted, t); ++ ++ return c_get_non_lvalue(t); ++} ++ ++ ++/* Similar, but call pedantic_non_lvalue instead of non_lvalue. */ ++ ++static c_tree_node *c_pedantic_omit_one_operand(type, result, omitted) ++ c_tree_node *type; ++ c_tree_node *result; ++ c_tree_node *omitted; ++{ ++ c_tree_node *t = c_convert_expr(type, result); ++ ++ if ( CIsTreeNodeSideEffect(omitted)) ++ return c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, type, omitted, t); ++ ++ return c_get_pedantic_non_lvalue(t); ++} ++ ++ ++/* Given a bit-wise operation CODE applied to ARG0 and ARG1, see if both ++ operands are another bit-wise operation with a common input. If so, ++ distribute the bit operations to save an operation and possibly two if ++ constants are involved. For example, convert ++ (A | B) & (A | C) into A | (B & C) ++ Further simplification will occur if B and C are constants. ++ ++ If this optimization cannot be done, 0 will be returned. */ ++ ++static c_tree_node *c_distribute_bit_expr(code, type, arg0, arg1) ++ int code; ++ c_tree_node *type; ++ c_tree_node *arg0; ++ c_tree_node *arg1; ++{ ++ c_tree_node *common; ++ c_tree_node *left; ++ c_tree_node *right; ++ ++ if (CTreeNodeCode(arg0) != CTreeNodeCode(arg1) ++ || CTreeNodeCode(arg0) == code ++ || (CTreeNodeCode(arg0) != C_BIT_AND_EXPR ++ && CTreeNodeCode(arg0) != C_BIT_IOR_EXPR)) ++ return 0; ++ ++ if (c_is_operand_equal_p(CTreeExprOperand(arg0, 0), CTreeExprOperand(arg1, 0), 0)) ++ { ++ common = CTreeExprOperand(arg0, 0); ++ left = CTreeExprOperand(arg0, 1); ++ right = CTreeExprOperand(arg1, 1); ++ } ++ else if (c_is_operand_equal_p(CTreeExprOperand(arg0, 0), CTreeExprOperand(arg1, 1), 0)) ++ { ++ common = CTreeExprOperand(arg0, 0); ++ left = CTreeExprOperand(arg0, 1); ++ right = CTreeExprOperand(arg1, 0); ++ } ++ else if (c_is_operand_equal_p(CTreeExprOperand(arg0, 1), CTreeExprOperand(arg1, 0), 0)) ++ { ++ common = CTreeExprOperand(arg0, 1); ++ left = CTreeExprOperand(arg0, 0); ++ right = CTreeExprOperand(arg1, 1); ++ } ++ else if (c_is_operand_equal_p(CTreeExprOperand(arg0, 1), CTreeExprOperand(arg1, 1), 0)) ++ { ++ common = CTreeExprOperand(arg0, 1); ++ left = CTreeExprOperand(arg0, 0); ++ right = CTreeExprOperand(arg1, 0); ++ } ++ else ++ return 0; ++ ++ return c_fold( c_tree_build_binary_typed_expr( ++ CTreeNodeCode(arg0), type, common, ++ c_fold(c_tree_build_binary_typed_expr(code, type, left, right)))); ++} ++ ++ ++/* ARG is a c_tree_node *that is known to contain just arithmetic operations and ++ comparisons. Evaluate the operations in the c_tree_node *substituting NEW0 for ++ any occurrence of OLD0 as an operand of a comparison and likewise for ++ NEW1 and OLD1. */ ++ ++static c_tree_node *c_eval_subst(arg, old0, new0, old1, new1) ++ c_tree_node *arg; ++ c_tree_node *old0; ++ c_tree_node *new0; ++ c_tree_node *old1; ++ c_tree_node *new1; ++{ ++ c_tree_node *type = CTreeType(arg); ++ int code = CTreeNodeCode(arg); ++ char class = c_tree_get_code_class(code); ++ ++ /* We can handle some of the 'e' cases here. */ ++ if (class == 'e' && code == C_TRUTH_NOT_EXPR) ++ class = '1'; ++ else if (class == 'e' ++ && (code == C_TRUTH_ANDIF_EXPR || code == C_TRUTH_ORIF_EXPR)) ++ class = '2'; ++ ++ switch (class) ++ { ++ case '1': ++ return c_fold( c_tree_build_unary_typed_expr(code, type, ++ c_eval_subst(CTreeExprOperand(arg, 0), ++ old0, new0, old1, new1))); ++ ++ case '2': ++ return c_fold( c_tree_build_binary_typed_expr(code, type, ++ c_eval_subst(CTreeExprOperand(arg, 0), ++ old0, new0, old1, new1), ++ c_eval_subst(CTreeExprOperand(arg, 1), ++ old0, new0, old1, new1))); ++ ++ case 'e': ++ switch (code) ++ { ++ case C_SAVE_EXPR: ++ return c_eval_subst(CTreeExprOperand(arg, 0), old0, new0, old1, new1); ++ ++ case C_COMPOUND_EXPR: ++ return c_eval_subst(CTreeExprOperand(arg, 1), old0, new0, old1, new1); ++ ++ case C_COND_EXPR: ++ return c_fold(c_tree_build_ternary_typed_expr(code, type, ++ c_eval_subst(CTreeExprOperand(arg, 0), ++ old0, new0, old1, new1), ++ c_eval_subst(CTreeExprOperand(arg, 1), ++ old0, new0, old1, new1), ++ c_eval_subst(CTreeExprOperand(arg, 2), ++ old0, new0, old1, new1))); ++ default: ++ break; ++ } ++ /* fall through (???) */ ++ ++ case '<': ++ { ++ c_tree_node *arg0 = CTreeExprOperand(arg, 0); ++ c_tree_node *arg1 = CTreeExprOperand(arg, 1); ++ ++ /* We need to check both for exact equality and c_tree_node *equality. The ++ former will be true if the operand has a side-effect. In that ++ case, we know the operand occurred exactly once. */ ++ ++ if (arg0 == old0 || c_is_operand_equal_p(arg0, old0, 0)) ++ arg0 = new0; ++ else if (arg0 == old1 || c_is_operand_equal_p(arg0, old1, 0)) ++ arg0 = new1; ++ ++ if (arg1 == old0 || c_is_operand_equal_p(arg1, old0, 0)) ++ arg1 = new0; ++ else if (arg1 == old1 || c_is_operand_equal_p(arg1, old1, 0)) ++ arg1 = new1; ++ ++ return c_fold( c_tree_build_binary_typed_expr(code, type, arg0, arg1)); ++ } ++ ++ default: ++ return arg; ++ } ++} ++ ++ ++c_tree_node *c_fold( expr ) ++ ++ c_tree_node *expr; ++{ ++ c_tree_node *t = expr; ++ c_tree_node *t1 = NULL; ++ c_tree_node *tem; ++ c_tree_node *type = CTreeType(expr); ++ c_tree_node *arg0; ++ c_tree_node *arg1; ++ int code = CTreeNodeCode(t); ++ int kind; ++ int invert; ++ ++ /* WINS will be nonzero when the switch is done ++ if all operands are constant. */ ++ ++ int wins = 1; ++ ++ /* Don't try to process an RTL_EXPR since its operands aren't trees. ++ Likewise for a SAVE_EXPR that's already been evaluated. */ ++ if (code == C_RTL_EXPR ++# ifdef LUDO_NO_SKIP ++ || (code == C_SAVE_EXPR && SAVE_EXPR_RTL (t)) != 0 ++# endif ++ ) ++ return t; ++ ++ /* Return right away if already constant. */ ++ if (CIsTreeNodeConstant(t)) ++ { ++ if (code == C_CONST_DECL) ++ return CTreeDeclInitial(t); ++ return t; ++ } ++ ++ kind = c_tree_get_code_class(code); ++ if (code == C_NOP_EXPR || code == C_FLOAT_EXPR || code == C_CONVERT_EXPR) ++ { ++ c_tree_node *subop; ++ ++ /* Special case for conversion ops that can have fixed point args. */ ++ arg0 = CTreeExprOperand(t, 0); ++ ++ /* Don't use STRIP_NOPS, because signedness of argument type matters. */ ++ if (arg0 != 0) ++ { ++ CStripTypeNops(arg0); ++ } ++ ++ if (arg0 != 0 && CTreeNodeFirstCode(arg0) == C_COMPLEX_NODE) ++ subop = CTreeComplexReal(arg0); ++ else ++ subop = arg0; ++ ++ if (subop != 0 && CTreeNodeFirstCode(subop) != C_INT_CST_NODE ++#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ && CTreeNodeFirstCode(subop) != C_REAL_CST_NODE ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ ) ++ /* Note that CIsTreeNodeConstantisn't enough: ++ static var addresses are constant but we can't ++ do arithmetic on them. */ ++ wins = 0; ++ } ++ else if (kind == 'e' || kind == '<' ++ || kind == '1' || kind == '2' || kind == 'r') ++ { ++ int len = CTreeExprNumOper(t); ++ int i; ++ for (i = 0; i < len; i++) ++ { ++ c_tree_node *op = CTreeExprOperand(t, i); ++ c_tree_node *subop; ++ ++ if (op == 0) ++ continue; /* Valid for CALL_EXPR, at least. */ ++ ++ if (kind == '<' || code == C_RSHIFT_EXPR) ++ { ++ /* Signedness matters here. Perhaps we can refine this ++ later. */ ++ CStripTypeNops(op); ++ } ++ else ++ { ++ /* Strip any conversions that don't change the mode. */ ++ CStripNops(op); ++ } ++ ++ if ( CTreeNodeFirstCode(op) == C_COMPLEX_NODE) ++ subop = CTreeComplexReal(op); ++ else ++ subop = op; ++ ++ if ( CTreeNodeFirstCode(subop) != C_INT_CST_NODE ++#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ && CTreeNodeFirstCode(subop) != C_REAL_CST_NODE ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ ) ++ /* Note that CIsTreeNodeConstantisn't enough: ++ static var addresses are constant but we can't ++ do arithmetic on them. */ ++ wins = 0; ++ ++ if (i == 0) ++ arg0 = op; ++ else if (i == 1) ++ arg1 = op; ++ } ++ } ++ ++ /* If this is a commutative operation, and ARG0 is a constant, move it ++ to ARG1 to reduce the number of tests below. */ ++ if ((code == C_PLUS_EXPR || code == C_MULT_EXPR || code == C_MIN_EXPR ++ || code == C_MAX_EXPR || code == C_BIT_IOR_EXPR || code == C_BIT_XOR_EXPR ++ || code == C_BIT_AND_EXPR) ++ && ( CTreeNodeFirstCode(arg0) == C_INT_CST_NODE || ++ CTreeNodeFirstCode(arg0) == C_REAL_CST_NODE)) ++ { ++ tem = arg0; arg0 = arg1; arg1 = tem; ++ ++ tem = CTreeExprOperand(t, 0); CTreeExprOperand(t, 0) = CTreeExprOperand(t, 1); ++ CTreeExprOperand(t, 1) = tem; ++ } ++ ++ /* Now WINS is set as described above, ++ ARG0 is the first operand of EXPR, ++ and ARG1 is the second operand (if it has more than one operand). ++ ++ First check for cases where an arithmetic operation is applied to a ++ compound, conditional, or comparison operation. Push the arithmetic ++ operation inside the compound or conditional to see if any folding ++ can then be done. Convert comparison to conditional for this purpose. ++ The also optimizes non-constant cases that used to be done in ++ expand_expr. ++ ++ Before we do that, see if this is a BIT_AND_EXPR or a BIT_OR_EXPR, ++ one of the operands is a comparison and the other is a comparison, a ++ BIT_AND_EXPR with the constant 1, or a truth value. In that case, the ++ code below would make the expression more complex. Change it to a ++ TRUTH_{AND,OR}_EXPR. Likewise, c_convert_expra similar NE_EXPR to ++ TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */ ++ ++ if ((code == C_BIT_AND_EXPR || code == C_BIT_IOR_EXPR ++ || code == C_EQ_EXPR || code == C_NE_EXPR) ++ && ((c_truth_value_p(CTreeNodeCode(arg0)) ++ && (c_truth_value_p(CTreeNodeCode(arg1)) ++ || (CTreeNodeCode(arg1) == C_BIT_AND_EXPR ++ && c_tree_is_integer_onep (CTreeExprOperand(arg1, 1))))) ++ || (c_truth_value_p(CTreeNodeCode(arg1)) ++ && (c_truth_value_p(CTreeNodeCode(arg0)) ++ || (CTreeNodeCode(arg0) == C_BIT_AND_EXPR ++ && c_tree_is_integer_onep (CTreeExprOperand(arg0, 1))))))) ++ { ++ t = c_fold( c_tree_build_binary_typed_expr( ++ code == C_BIT_AND_EXPR ? C_TRUTH_AND_EXPR ++ : code == C_BIT_IOR_EXPR ? C_TRUTH_OR_EXPR ++ : C_TRUTH_XOR_EXPR, type, arg0, arg1)); ++ ++ if (code == C_EQ_EXPR) ++ t = c_invert_truthvalue(t); ++ ++ return t; ++ } ++ ++ if (c_tree_get_code_class(code) == '1') ++ { ++ if (CTreeNodeCode(arg0) == C_COMPOUND_EXPR) ++ return c_tree_build_binary_typed_expr( ++ C_COMPOUND_EXPR, type, CTreeExprOperand(arg0, 0), ++ c_fold( c_tree_build_unary_typed_expr(code, type, CTreeExprOperand(arg0, 1)))); ++ else if (CTreeNodeCode(arg0) == C_COND_EXPR) ++ { ++ t = c_fold( ++ c_tree_build_ternary_typed_expr(C_COND_EXPR, type, CTreeExprOperand(arg0, 0), ++ c_fold(c_tree_build_unary_typed_expr(code, type, CTreeExprOperand(arg0, 1))), ++ c_fold(c_tree_build_unary_typed_expr(code, type, CTreeExprOperand(arg0, 2))))); ++ ++ /* If this was a conversion, and all we did was to move into ++ inside the COND_EXPR, bring it back out. But leave it if ++ it is a conversion from integer to integer and the ++ result precision is no wider than a word since such a ++ conversion is cheap and may be optimized away by combine, ++ while it couldn't if it were outside the COND_EXPR. Then return ++ so we don't get into an infinite recursion loop taking the ++ conversion out and then back in. */ ++ ++ if ((code == C_NOP_EXPR || code == C_CONVERT_EXPR ++ || code == C_NON_LVALUE_EXPR) ++ && CTreeNodeCode(t) == C_COND_EXPR ++ && CTreeNodeCode(CTreeExprOperand(t, 1)) == code ++ && CTreeNodeCode(CTreeExprOperand(t, 2)) == code ++ && (CTreeType(CTreeExprOperand(CTreeExprOperand(t, 1), 0)) ++ == CTreeType(CTreeExprOperand(CTreeExprOperand(t, 2), 0))) ++ && ! ( INTEGRAL_TYPE_P(CTreeType(t)) ++ && INTEGRAL_TYPE_P(CTreeType(CTreeExprOperand(CTreeExprOperand(t, 1), 0))) ++ && CTreeTypePrecision(CTreeType(t)) <= C_BITS_PER_WORD)) ++ t = c_tree_build_unary_typed_expr(code, type, ++ c_tree_build_ternary_typed_expr(C_COND_EXPR, ++ CTreeType(CTreeExprOperand(CTreeExprOperand(t, 1), 0)), ++ CTreeExprOperand(t, 0), ++ CTreeExprOperand(CTreeExprOperand(t, 1), 0), ++ CTreeExprOperand(CTreeExprOperand(t, 2), 0))); ++ return t; ++ } ++ else if ( c_tree_get_code_class(CTreeNodeCode(arg0)) == '<') ++ return c_fold(c_tree_build_ternary_typed_expr(C_COND_EXPR, type, arg0, ++ c_fold(c_tree_build_unary_typed_expr(code, type, c_integer_one_node)), ++ c_fold(c_tree_build_unary_typed_expr(code, type, c_integer_zero_node)))); ++ } ++ else if (c_tree_get_code_class(code) == '2' ++ || c_tree_get_code_class(code) == '<') ++ { ++ if ( CTreeNodeCode(arg1) == C_COMPOUND_EXPR) ++ return c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, type, ++ CTreeExprOperand(arg1, 0), ++ c_fold(c_tree_build_binary_typed_expr(code, type, ++ arg0, CTreeExprOperand(arg1, 1)))); ++ else if ((CTreeNodeCode(arg1) == C_COND_EXPR ++ || (c_tree_get_code_class(CTreeNodeCode(arg1)) == '<' ++ && c_tree_get_code_class(code) != '<')) ++ && (! CIsTreeNodeSideEffect(arg0) || c_current_function_decl != 0)) ++ { ++ c_tree_node *test; ++ c_tree_node *true_value; ++ c_tree_node *false_value; ++ ++ if (CTreeNodeCode(arg1) == C_COND_EXPR) ++ { ++ test = CTreeExprOperand(arg1, 0); ++ true_value = CTreeExprOperand(arg1, 1); ++ false_value = CTreeExprOperand(arg1, 2); ++ } ++ else ++ { ++ c_tree_node *testtype = CTreeType(arg1); ++ test = arg1; ++ true_value = c_convert_expr(testtype, c_integer_one_node); ++ false_value = c_convert_expr(testtype, c_integer_zero_node); ++ } ++ ++ /* If ARG0 is complex we want to make sure we only evaluate ++ it once. Though this is only required if it is volatile, it ++ might be more efficient even if it is not. However, if we ++ succeed in folding one part to a constant, we do not need ++ to make this SAVE_EXPR. Since we do this optimization ++ primarily to see if we do end up with constant and this ++ SAVE_EXPR interferes with later optimizations, suppressing ++ it when we can is important. */ ++ ++ if (CTreeNodeCode(arg0) != C_SAVE_EXPR ++ && ((CTreeNodeCode(arg0) != C_VAR_DECL ++ && CTreeNodeCode(arg0) != C_PARAM_DECL) ++ || CIsTreeNodeSideEffect(arg0))) ++ { ++ c_tree_node *lhs = ++ c_fold(c_tree_build_binary_typed_expr(code, type, arg0, true_value)); ++ c_tree_node *rhs = ++ c_fold(c_tree_build_binary_typed_expr(code, type, arg0, false_value)); ++ ++ if (CIsTreeNodeConstant(lhs) || CIsTreeNodeConstant(rhs)) ++ return c_fold( ++ c_tree_build_ternary_typed_expr(C_COND_EXPR, type, test, lhs, rhs)); ++ ++ if (c_current_function_decl != 0) ++ { ++# ifdef LUDO_NO_SKIP ++ arg0 = save_expr (arg0); ++# endif ++ } ++ } ++ ++ test = c_fold(c_tree_build_ternary_typed_expr(C_COND_EXPR, type, test, ++ c_fold(c_tree_build_binary_typed_expr(code, type, arg0, true_value)), ++ c_fold(c_tree_build_binary_typed_expr(code, type, arg0, false_value)))); ++ if (CTreeNodeCode(arg0) == C_SAVE_EXPR) ++ return c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, type, ++ c_convert_expr(c_void_type_node, arg0), ++ c_strip_compound_expr(test, arg0)); ++ else ++ return c_convert_expr(type, test); ++ } ++ ++ else if (CTreeNodeCode(arg0) == C_COMPOUND_EXPR) ++ return c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, type, ++ CTreeExprOperand(arg0, 0), ++ c_fold(c_tree_build_binary_typed_expr(code, type, ++ CTreeExprOperand(arg0, 1), arg1))); ++ else if ((CTreeNodeCode(arg0) == C_COND_EXPR ++ || (c_tree_get_code_class(CTreeNodeCode(arg0)) == '<' ++ && c_tree_get_code_class(code) != '<')) ++ && (! CIsTreeNodeSideEffect(arg1) || c_current_function_decl != 0)) ++ { ++ c_tree_node *test; ++ c_tree_node *true_value; ++ c_tree_node *false_value; ++ ++ if (CTreeNodeCode(arg0) == C_COND_EXPR) ++ { ++ test = CTreeExprOperand(arg0, 0); ++ true_value = CTreeExprOperand(arg0, 1); ++ false_value = CTreeExprOperand(arg0, 2); ++ } ++ else ++ { ++ c_tree_node *testtype = CTreeType(arg0); ++ test = arg0; ++ true_value = c_convert_expr(testtype, c_integer_one_node); ++ false_value = c_convert_expr(testtype, c_integer_zero_node); ++ } ++ ++ if (CTreeNodeCode(arg1) != C_SAVE_EXPR ++ && ((CTreeNodeCode(arg1) != C_VAR_DECL ++ && CTreeNodeCode(arg1) != C_PARAM_DECL) ++ || CIsTreeNodeSideEffect(arg1))) ++ { ++ c_tree_node *lhs = c_fold( ++ c_tree_build_binary_typed_expr(code, type, true_value, arg1)); ++ c_tree_node *rhs = c_fold( ++ c_tree_build_binary_typed_expr(code, type, false_value, arg1)); ++ ++ if (CIsTreeNodeConstant(lhs) || CIsTreeNodeConstant(rhs) ++ || CIsTreeNodeConstant(arg1)) ++ return c_fold( ++ c_tree_build_ternary_typed_expr(C_COND_EXPR, type, test, lhs, rhs)); ++ ++# ifdef LUDO_NO_SKIP ++ if (c_current_function_decl != 0) ++ arg1 = save_expr (arg1); ++# endif ++ } ++ ++ test = c_fold( ++ c_tree_build_ternary_typed_expr(C_COND_EXPR, type, test, ++ c_fold(c_tree_build_binary_typed_expr(code, type, true_value, arg1)), ++ c_fold(c_tree_build_binary_typed_expr(code, type, false_value, arg1)))); ++ if (CTreeNodeCode(arg1) == C_SAVE_EXPR) ++ return c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, type, ++ c_convert_expr(c_void_type_node, arg1), ++ c_strip_compound_expr(test, arg1)); ++ else ++ return c_convert_expr(type, test); ++ } ++ } ++ else if (c_tree_get_code_class(code) == '<' ++ && CTreeNodeCode(arg0) == C_COMPOUND_EXPR) ++ return ++ c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, type, CTreeExprOperand(arg0, 0), ++ c_fold( c_tree_build_binary_typed_expr(code, type, CTreeExprOperand(arg0, 1), arg1))); ++ ++ else if (c_tree_get_code_class(code) == '<' ++ && CTreeNodeCode(arg1) == C_COMPOUND_EXPR) ++ return c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, type, CTreeExprOperand(arg1, 0), ++ c_fold(c_tree_build_binary_typed_expr(code, type, arg0, CTreeExprOperand(arg1, 1)))); ++ ++ switch (code) ++ { ++ case C_INT_CST_NODE: ++ case C_REAL_CST_NODE: ++ case C_STRING_NODE: ++ case C_COMPLEX_NODE: ++ case C_CONSTRUCTOR_EXPR: ++ return t; ++ ++ case C_CONST_DECL: ++ return c_fold(CTreeDeclInitial(t)); ++ ++ case C_NOP_EXPR: ++ case C_FLOAT_EXPR: ++ case C_CONVERT_EXPR: ++ case C_FIX_TRUNC_EXPR: ++ /* Other kinds of FIX are not handled properly by fold_convert. */ ++ ++ if (CTreeType(CTreeExprOperand(t, 0)) == CTreeType(t)) ++ return CTreeExprOperand(t, 0); ++ ++ /* Handle cases of two conversions in a row. */ ++ if (CTreeNodeCode(CTreeExprOperand(t, 0)) == C_NOP_EXPR ++ || CTreeNodeCode(CTreeExprOperand(t, 0)) == C_CONVERT_EXPR) ++ { ++ c_tree_node *inside_type = CTreeType(CTreeExprOperand(CTreeExprOperand(t, 0), 0)); ++ c_tree_node *inter_type = CTreeType(CTreeExprOperand(t, 0)); ++ c_tree_node *final_type = CTreeType(t); ++ int inside_int = INTEGRAL_TYPE_P (inside_type); ++ int inside_ptr = POINTER_TYPE_P (inside_type); ++ int inside_float = FLOAT_TYPE_P (inside_type); ++ int inside_prec = CTreeTypePrecision(inside_type); ++ int inside_unsignedp = CIsTreeNodeUnsigned(inside_type); ++ int inter_int = INTEGRAL_TYPE_P (inter_type); ++ int inter_ptr = POINTER_TYPE_P (inter_type); ++ int inter_float = FLOAT_TYPE_P (inter_type); ++ int inter_prec = CTreeTypePrecision(inter_type); ++ int inter_unsignedp = CIsTreeNodeUnsigned(inter_type); ++ int final_int = INTEGRAL_TYPE_P (final_type); ++ int final_ptr = POINTER_TYPE_P (final_type); ++ int final_float = FLOAT_TYPE_P (final_type); ++ int final_prec = CTreeTypePrecision(final_type); ++ int final_unsignedp = CIsTreeNodeUnsigned(final_type); ++ ++ /* In addition to the cases of two conversions in a row ++ handled below, if we are converting something to its own ++ type via an object of identical or wider precision, neither ++ conversion is needed. */ ++ if (inside_type == final_type ++ && ((inter_int && final_int) || (inter_float && final_float)) ++ && inter_prec >= final_prec) ++ return CTreeExprOperand(CTreeExprOperand(t, 0), 0); ++ ++ /* Likewise, if the intermediate and final types are either both ++ float or both integer, we don't need the middle conversion if ++ it is wider than the final type and doesn't change the signedness ++ (for integers). Avoid this if the final type is a pointer ++ since then we sometimes need the inner conversion. Likewise if ++ the outer has a precision not equal to the size of its mode. */ ++ if ((((inter_int || inter_ptr) && (inside_int || inside_ptr)) ++ || (inter_float && inside_float)) ++ && inter_prec >= inside_prec ++ && (inter_float || inter_unsignedp == inside_unsignedp) ++# ifdef LUDO_NO_SKIP ++ && ! (final_prec != GET_MODE_BITSIZE (CTreeTypeMode(final_type)) ++ && CTreeTypeMode(final_type) == CTreeTypeMode(inter_type)) ++# endif ++ && ! final_ptr) ++ return c_convert_expr(final_type, CTreeExprOperand(CTreeExprOperand(t, 0), 0)); ++ ++ /* Two conversions in a row are not needed unless: ++ - some conversion is floating-point (overstrict for now), or ++ - the intermediate type is narrower than both initial and ++ final, or ++ - the intermediate type and innermost type differ in signedness, ++ and the outermost type is wider than the intermediate, or ++ - the initial type is a pointer type and the precisions of the ++ intermediate and final types differ, or ++ - the final type is a pointer type and the precisions of the ++ initial and intermediate types differ. */ ++ if (! inside_float && ! inter_float && ! final_float ++ && (inter_prec > inside_prec || inter_prec > final_prec) ++ && ! (inside_int && inter_int ++ && inter_unsignedp != inside_unsignedp ++ && inter_prec < final_prec) ++ && ((inter_unsignedp && inter_prec > inside_prec) ++ == (final_unsignedp && final_prec > inter_prec)) ++ && ! (inside_ptr && inter_prec != final_prec) ++ && ! (final_ptr && inside_prec != inter_prec) ++# ifdef LUDO_NO_SKIP ++ && ! (final_prec != GET_MODE_BITSIZE (CTreeTypeMode(final_type)) ++ && CTreeTypeMode(final_type) == CTreeTypeMode(inter_type)) ++# endif ++ && ! final_ptr) ++ return c_convert_expr(final_type, CTreeExprOperand(CTreeExprOperand(t, 0), 0)); ++ } ++ ++ if (CTreeNodeCode(CTreeExprOperand(t, 0)) == C_MODIFY_EXPR ++ && CIsTreeNodeConstant(CTreeExprOperand(CTreeExprOperand(t, 0), 1)) ++ /* Detect assigning a bitfield. */ ++ && !(CTreeNodeCode(CTreeExprOperand(CTreeExprOperand(t, 0), 0)) == C_COMPONENT_REF ++ && CIsTreeDeclBitField( ++ CTreeExprOperand(CTreeExprOperand(CTreeExprOperand(t, 0), 0), 1)))) ++ { ++ /* Don't leave an assignment inside a conversion ++ unless assigning a bitfield. */ ++ c_tree_node *prev = CTreeExprOperand(t, 0); ++ CTreeExprOperand(t, 0) = CTreeExprOperand(prev, 1); ++ /* First do the assignment, then return converted constant. */ ++ t = c_tree_build_binary_typed_expr(C_COMPOUND_EXPR, CTreeType(t), prev, c_fold(t)); ++ CSetTreeNodeUsed(t); ++ return t; ++ } ++ if (!wins) ++ { ++ if ( CIsTreeNodeConstant(arg0) ) ++ CSetTreeNodeConstant(t); ++ return t; ++ } ++ return c_fold_convert_expr(t, arg0); ++ ++ case C_COMPONENT_REF: ++ if (CTreeNodeCode(arg0) == C_CONSTRUCTOR_EXPR) ++ { ++ c_tree_node *m = c_tree_get_purpose_member(arg1, CTreeExprOperand(arg0,1)); ++ if (m) ++ t = CTreeListValue(m); ++ } ++ return t; ++ ++ case C_RANGE_EXPR: ++ if ( wins ) CSetTreeNodeConstant(t); ++ else CClearTreeNodeConstant(t); ++ ++ return t; ++ ++ case C_NEGATE_EXPR: ++ if (wins) ++ { ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE) ++ { ++ C_HOST_WIDE_INT low, high; ++ int overflow = c_neg_double (CTreeIntCstLow(arg0), ++ CTreeIntCstHigh(arg0), ++ &low, &high); ++ t = c_tree_build_int_2(low, high); ++ CTreeType(t) = type; ++ if ( (CIsTreeNodeOverflow(arg0) ++ || c_force_fit_type(t, overflow && !CIsTreeNodeUnsigned(type)))) ++ CSetTreeNodeOverflow(t); ++ ++ if ( CIsTreeNodeOverflow(t) || CIsTreeNodeCstOverflow(arg0)) ++ CSetTreeNodeCstOverflow(t); ++ } ++ else if (CTreeNodeCode(arg0) == C_REAL_CST_NODE) ++ t = c_tree_build_real(type, REAL_VALUE_NEGATE( CTreeRealCstValue(arg0))); ++ } ++ else if (CTreeNodeCode(arg0) == C_NEGATE_EXPR) ++ return CTreeExprOperand(arg0, 0); ++ ++ /* Convert - (a - b) to (b - a) for non-floating-point. */ ++ else if (CTreeNodeCode(arg0) == C_MINUS_EXPR && ! FLOAT_TYPE_P (type)) ++ return c_tree_build_binary_typed_expr(C_MINUS_EXPR, type, CTreeExprOperand(arg0, 1), ++ CTreeExprOperand(arg0, 0)); ++ ++ return t; ++ ++ case C_ABS_EXPR: ++ if (wins) ++ { ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE) ++ { ++ if (! CIsTreeNodeUnsigned(type) ++ && CTreeIntCstHigh(arg0) < 0) ++ { ++ C_HOST_WIDE_INT low, high; ++ int overflow = c_neg_double (CTreeIntCstLow(arg0), ++ CTreeIntCstHigh(arg0), ++ &low, &high); ++ t = c_tree_build_int_2(low, high); ++ CTreeType(t) = type; ++ if ( CIsTreeNodeOverflow(arg0) ++ | c_force_fit_type(t, overflow)) ++ CSetTreeNodeOverflow(t); ++ if (CIsTreeNodeOverflow(t) || CIsTreeNodeCstOverflow(arg0)) ++ CSetTreeNodeCstOverflow(t); ++ } ++ } ++ else if (CTreeNodeCode(arg0) == C_REAL_CST_NODE) ++ { ++ if (REAL_VALUE_NEGATIVE ( CTreeRealCstValue(arg0))) ++ t = c_tree_build_real (type, ++ REAL_VALUE_NEGATE( CTreeRealCstValue(arg0))); ++ } ++ } ++ else if (CTreeNodeCode(arg0) == C_ABS_EXPR || CTreeNodeCode(arg0) == C_NEGATE_EXPR) ++ return c_tree_build_unary_typed_expr(C_ABS_EXPR, type, CTreeExprOperand(arg0, 0)); ++ return t; ++ ++ case C_CONJ_EXPR: ++ if (CTreeNodeCode(CTreeType(arg0)) != C_COMPLEX_TYPE) ++ return arg0; ++ else if (CTreeNodeCode(arg0) == C_COMPLEX_EXPR) ++ return c_tree_build_binary_typed_expr(C_COMPLEX_EXPR, CTreeType(arg0), ++ CTreeExprOperand(arg0, 0), ++ c_fold(c_tree_build_unary_typed_expr(C_NEGATE_EXPR, ++ CTreeType(CTreeType(arg0)), ++ CTreeExprOperand(arg0, 1)))); ++ else if (CTreeNodeCode(arg0) == C_COMPLEX_NODE) ++ return c_tree_build_complex(type, CTreeExprOperand(arg0, 0), ++ c_fold(c_tree_build_unary_typed_expr(C_NEGATE_EXPR, ++ CTreeType(CTreeType(arg0)), ++ CTreeExprOperand(arg0, 1)))); ++ else if (CTreeNodeCode(arg0) == C_PLUS_EXPR || CTreeNodeCode(arg0) == C_MINUS_EXPR) ++ return c_fold(c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), type, ++ c_fold(c_tree_build_unary_typed_expr(C_CONJ_EXPR, type, ++ CTreeExprOperand(arg0, 0))), ++ c_fold(c_tree_build_unary_typed_expr(C_CONJ_EXPR, ++ type, CTreeExprOperand(arg0, 1))))); ++ else if (CTreeNodeCode(arg0) == C_CONJ_EXPR) ++ return CTreeExprOperand(arg0, 0); ++ return t; ++ ++ case C_BIT_NOT_EXPR: ++ if (wins) ++ { ++ t = c_tree_build_int_2(~ CTreeIntCstLow(arg0), ~ CTreeIntCstHigh(arg0)); ++ CTreeType(t) = type; ++ c_force_fit_type(t, 0); ++ if ( CIsTreeNodeOverflow(arg0)) CSetTreeNodeOverflow(t); ++ if ( CIsTreeNodeCstOverflow(arg0)) CSetTreeNodeCstOverflow(arg0); ++ } ++ else if (CTreeNodeCode(arg0) == C_BIT_NOT_EXPR) ++ return CTreeExprOperand(arg0, 0); ++ return t; ++ ++ case C_PLUS_EXPR: ++ /* A + (-B) -> A - B */ ++ if (CTreeNodeCode(arg1) == C_NEGATE_EXPR) ++ return c_fold( ++ c_tree_build_binary_typed_expr( ++ C_MINUS_EXPR, type, arg0, CTreeExprOperand(arg1, 0))); ++ else if (! FLOAT_TYPE_P (type)) ++ { ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ ++ /* If we are adding two BIT_AND_EXPR's, both of which are and'ing ++ with a constant, and the two constants have no bits in common, ++ we should treat this as a BIT_IOR_EXPR since this may produce more ++ simplifications. */ ++ if (CTreeNodeCode(arg0) == C_BIT_AND_EXPR ++ && CTreeNodeCode(arg1) == C_BIT_AND_EXPR ++ && CTreeNodeCode(CTreeExprOperand(arg0, 1)) == C_INT_CST_NODE ++ && CTreeNodeCode(CTreeExprOperand(arg1, 1)) == C_INT_CST_NODE ++ && c_tree_is_integer_zerop( ++ c_const_binop(C_BIT_AND_EXPR, ++ CTreeExprOperand(arg0, 1), CTreeExprOperand(arg1, 1), 0))) ++ { ++ code = C_BIT_IOR_EXPR; ++ goto bit_ior; ++ } ++ ++ /* (A * C) + (B * C) -> (A+B) * C. Since we are most concerned ++ about the case where C is a constant, just try one of the ++ four possibilities. */ ++ ++ if (CTreeNodeCode(arg0) == C_MULT_EXPR && ++ CTreeNodeCode(arg1) == C_MULT_EXPR ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ CTreeExprOperand(arg1, 1), 0)) ++ return c_fold(c_tree_build_binary_typed_expr(C_MULT_EXPR, type, ++ c_fold(c_tree_build_binary_typed_expr(C_PLUS_EXPR, type, ++ CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(arg1, 0))), ++ CTreeExprOperand(arg0, 1))); ++ } ++ /* In IEEE floating point, x+0 may not equal x. */ ++ else if (( ++# ifdef LUDO_NO_SKIP ++ TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT ++# else ++ 1 ++# endif ++ || c_flag_fast_math) ++ && c_tree_is_real_zerop(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ associate: ++ /* In most languages, can't associate operations on floats ++ through parentheses. Rather than remember where the parentheses ++ were, we don't associate floats at all. It shouldn't matter much. ++ However, associating multiplications is only very slightly ++ inaccurate, so do that if -ffast-math is specified. */ ++ if (FLOAT_TYPE_P (type) ++ && ! (c_flag_fast_math && code == C_MULT_EXPR)) ++ goto binary; ++ ++ /* The varsign == -1 cases happen only for addition and subtraction. ++ It says that the arg that was split was really CON minus VAR. ++ The rest of the code applies to all associative operations. */ ++ if (!wins) ++ { ++ c_tree_node *var; ++ c_tree_node *con; ++ int varsign; ++ ++ if (c_split_tree(arg0, code, &var, &con, &varsign)) ++ { ++ if (varsign == -1) ++ { ++ /* EXPR is (CON-VAR) +- ARG1. */ ++ /* If it is + and VAR==ARG1, return just CONST. */ ++ if (code == C_PLUS_EXPR && c_is_operand_equal_p(var, arg1, 0)) ++ return c_convert_expr(CTreeType(t), con); ++ ++ /* If ARG0 is a constant, don't change things around; ++ instead keep all the constant computations together. */ ++ ++ if (CIsTreeNodeConstant(arg0)) ++ return t; ++ ++ /* Otherwise return (CON +- ARG1) - VAR. */ ++ t = c_tree_build_binary_typed_expr(C_MINUS_EXPR, type, ++ c_fold(c_tree_build_binary_typed_expr(code, type, con, arg1)), var); ++ } ++ else ++ { ++ /* EXPR is (VAR+CON) +- ARG1. */ ++ /* If it is - and VAR==ARG1, return just CONST. */ ++ if (code == C_MINUS_EXPR && c_is_operand_equal_p(var, arg1, 0)) ++ return c_convert_expr(CTreeType(t), con); ++ ++ /* If ARG0 is a constant, don't change things around; ++ instead keep all the constant computations together. */ ++ ++ if (CIsTreeNodeConstant(arg0)) ++ return t; ++ ++ /* Otherwise return VAR +- (ARG1 +- CON). */ ++ tem = c_fold(c_tree_build_binary_typed_expr(code, type, arg1, con)); ++ t = c_tree_build_binary_typed_expr(code, type, var, tem); ++ ++ if (c_tree_is_integer_zerop(tem) ++ && (code == C_PLUS_EXPR || code == C_MINUS_EXPR)) ++ return c_convert_expr(type, var); ++ /* If we have x +/- (c - d) [c an explicit integer] ++ change it to x -/+ (d - c) since if d is relocatable ++ then the latter can be a single immediate insn ++ and the former cannot. */ ++ if (CTreeNodeCode(tem) == C_MINUS_EXPR ++ && CTreeNodeCode(CTreeExprOperand(tem, 0)) == C_INT_CST_NODE) ++ { ++ c_tree_node *tem1 = CTreeExprOperand(tem, 1); ++ CTreeExprOperand(tem, 1) = CTreeExprOperand(tem, 0); ++ CTreeExprOperand(tem, 0) = tem1; ++ CTreeNodeCode(t) = (code == C_PLUS_EXPR ? C_MINUS_EXPR : C_PLUS_EXPR); ++ } ++ } ++ return t; ++ } ++ ++ if (c_split_tree(arg1, code, &var, &con, &varsign)) ++ { ++ if (CIsTreeNodeConstant(arg1)) ++ return t; ++ ++ if (varsign == -1) ++ CTreeNodeCode(t) = (code == C_PLUS_EXPR ? C_MINUS_EXPR : C_PLUS_EXPR); ++ ++ /* EXPR is ARG0 +- (CON +- VAR). */ ++ if (CTreeNodeCode(t) == C_MINUS_EXPR ++ && c_is_operand_equal_p(var, arg0, 0)) ++ { ++ /* If VAR and ARG0 cancel, return just CON or -CON. */ ++ if (code == C_PLUS_EXPR) ++ return c_convert_expr(CTreeType(t), con); ++ return c_fold(c_tree_build_unary_typed_expr(C_NEGATE_EXPR, CTreeType(t), ++ c_convert_expr(CTreeType(t), con))); ++ } ++ ++ t = c_tree_build_binary_typed_expr(CTreeNodeCode(t), type, ++ c_fold(c_tree_build_binary_typed_expr(code, CTreeType(t), arg0, con)), var); ++ ++ if (c_tree_is_integer_zerop(CTreeExprOperand(t, 0)) ++ && CTreeNodeCode(t) == C_PLUS_EXPR) ++ return c_convert_expr(CTreeType(t), var); ++ return t; ++ } ++ } ++ binary: ++# ifdef LUDO_NO_SKIP ++#if defined (REAL_IS_NOT_DOUBLE) && ! defined (REAL_ARITHMETIC) ++ if (CTreeNodeCode(arg1) == C_REAL_CST_NODE) ++ return t; ++#endif /* REAL_IS_NOT_DOUBLE, and no REAL_ARITHMETIC */ ++# endif ++ if (wins) ++ t1 = c_const_binop(code, arg0, arg1, 0); ++ if (t1 != NULL) ++ { ++ /* The return value should always have ++ the same type as the original expression. */ ++ if (CTreeType(t1) != CTreeType(t)) ++ t1 = c_convert_expr(CTreeType(t), t1); ++ ++ return t1; ++ } ++ return t; ++ ++ case C_MINUS_EXPR: ++ if (! FLOAT_TYPE_P (type)) ++ { ++ if (! wins && c_tree_is_integer_zerop(arg0)) ++ return c_tree_build_unary_typed_expr(C_NEGATE_EXPR, type, arg1); ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ ++ /* (A * C) - (B * C) -> (A-B) * C. Since we are most concerned ++ about the case where C is a constant, just try one of the ++ four possibilities. */ ++ ++ if (CTreeNodeCode(arg0) == C_MULT_EXPR && CTreeNodeCode(arg1) == C_MULT_EXPR ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ CTreeExprOperand(arg1, 1), 0)) ++ return c_fold(c_tree_build_binary_typed_expr(C_MULT_EXPR, type, ++ c_fold(c_tree_build_binary_typed_expr(C_MINUS_EXPR, type, ++ CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(arg1, 0))), ++ CTreeExprOperand(arg0, 1))); ++ } ++ /* Convert A - (-B) to A + B. */ ++ else if (CTreeNodeCode(arg1) == C_NEGATE_EXPR) ++ return c_fold( ++ c_tree_build_binary_typed_expr( ++ C_PLUS_EXPR, type, arg0, CTreeExprOperand(arg1, 0))); ++ ++ else if ( ++# ifdef LUDO_NO_SKIP ++ TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT ++# else ++ 1 ++# endif ++ || c_flag_fast_math) ++ { ++ /* Except with IEEE floating point, 0-x equals -x. */ ++ if (! wins && c_tree_is_real_zerop(arg0)) ++ return c_tree_build_unary_typed_expr(C_NEGATE_EXPR, type, arg1); ++ /* Except with IEEE floating point, x-0 equals x. */ ++ if (c_tree_is_real_zerop(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ } ++ ++ /* Fold &x - &x. This can happen from &x.foo - &x. ++ This is unsafe for certain floats even in non-IEEE formats. ++ In IEEE, it is unsafe because it does wrong for NaNs. ++ Also note that c_is_operand_equal_pis always false if an operand ++ is volatile. */ ++ ++ if ((! FLOAT_TYPE_P (type) || c_flag_fast_math) ++ && c_is_operand_equal_p(arg0, arg1, 0)) ++ return c_convert_expr(type, c_integer_zero_node); ++ ++ goto associate; ++ ++ case C_MULT_EXPR: ++ if (! FLOAT_TYPE_P (type)) ++ { ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_omit_one_operand(type, arg1, arg0); ++ if (c_tree_is_integer_onep(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ ++ /* ((A / C) * C) is A if the division is an ++ EXACT_DIV_EXPR. Since C is normally a constant, ++ just check for one of the four possibilities. */ ++ ++ if (CTreeNodeCode(arg0) == C_EXACT_DIV_EXPR ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), arg1, 0)) ++ return CTreeExprOperand(arg0, 0); ++ ++ /* (a * (1 << b)) is (a << b) */ ++ if (CTreeNodeCode(arg1) == C_LSHIFT_EXPR ++ && c_tree_is_integer_onep(CTreeExprOperand(arg1, 0))) ++ return c_fold(c_tree_build_binary_typed_expr(C_LSHIFT_EXPR, type, arg0, ++ CTreeExprOperand(arg1, 1))); ++ if (CTreeNodeCode(arg0) == C_LSHIFT_EXPR ++ && c_tree_is_integer_onep(CTreeExprOperand(arg0, 0))) ++ return c_fold(c_tree_build_binary_typed_expr(C_LSHIFT_EXPR, type, arg1, ++ CTreeExprOperand(arg0, 1))); ++ } ++ else ++ { ++ /* x*0 is 0, except for IEEE floating point. */ ++ if (( ++# ifdef LUDO_NO_SKIP ++ TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT ++# else ++ 1 ++# endif ++ || c_flag_fast_math) ++ && c_tree_is_real_zerop(arg1)) ++ return c_omit_one_operand(type, arg1, arg0); ++ /* In IEEE floating point, x*1 is not equivalent to x for snans. ++ However, ANSI says we can drop signals, ++ so we can do this anyway. */ ++ if (c_tree_is_real_onep(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ /* x*2 is x+x */ ++ if (! wins && c_tree_is_real_twop(arg1) && c_current_function_decl != 0) ++ { ++# ifdef LUDO_NO_SKIP ++ c_tree_node *arg = save_expr (arg0); ++# else ++ c_tree_node *arg = arg0; ++# endif ++ return c_tree_build_binary_typed_expr(C_PLUS_EXPR, type, arg, arg); ++ } ++ } ++ goto associate; ++ ++ case C_BIT_IOR_EXPR: ++ bit_ior: ++ { ++ int code0, code1; ++ ++ if (c_tree_is_integer_all_onesp(arg1)) ++ return c_omit_one_operand(type, arg1, arg0); ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ t1 = c_distribute_bit_expr(code, type, arg0, arg1); ++ if (t1 != NULL) ++ return t1; ++ ++ /* (A << C1) | (A >> C2) if A is unsigned and C1+C2 is the size of A ++ is a rotate of A by C1 bits. */ ++ /* (A << B) | (A >> (Z - B)) if A is unsigned and Z is the size of A ++ is a rotate of A by B bits. */ ++ ++ code0 = CTreeNodeCode(arg0); ++ code1 = CTreeNodeCode(arg1); ++ if (((code0 == C_RSHIFT_EXPR && code1 == C_LSHIFT_EXPR) ++ || (code1 == C_RSHIFT_EXPR && code0 == C_LSHIFT_EXPR)) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 0), CTreeExprOperand(arg1,0), 0) ++ && CIsTreeNodeUnsigned(CTreeType(CTreeExprOperand(arg0, 0)))) ++ { ++ c_tree_node *tree01; ++ c_tree_node *tree11; ++ int code01, code11; ++ ++ tree01 = CTreeExprOperand(arg0, 1); ++ tree11 = CTreeExprOperand(arg1, 1); ++ code01 = CTreeNodeCode(tree01); ++ code11 = CTreeNodeCode(tree11); ++ if (code01 == C_INT_CST_NODE ++ && code11 == C_INT_CST_NODE ++ && CTreeIntCstHigh(tree01) == 0 ++ && CTreeIntCstHigh(tree11) == 0 ++ && ((CTreeIntCstLow(tree01) + CTreeIntCstLow(tree11)) ++ == CTreeTypePrecision(CTreeType(CTreeExprOperand(arg0, 0))))) ++ return ++ c_tree_build_binary_typed_expr(C_LROTATE_EXPR, type, CTreeExprOperand(arg0, 0), ++ code0 == C_LSHIFT_EXPR ? tree01 : tree11); ++ else if (code11 == C_MINUS_EXPR ++ && CTreeNodeCode(CTreeExprOperand(tree11, 0)) == C_INT_CST_NODE ++ && CTreeIntCstHigh(CTreeExprOperand(tree11, 0)) == 0 ++ && CTreeIntCstLow(CTreeExprOperand(tree11, 0)) ++ == CTreeTypePrecision(CTreeType(CTreeExprOperand(arg0, 0))) ++ && c_is_operand_equal_p(tree01, CTreeExprOperand(tree11, 1), 0)) ++ return ++ c_tree_build_binary_typed_expr( ++ code0 == C_LSHIFT_EXPR ? C_LROTATE_EXPR : C_RROTATE_EXPR, ++ type, CTreeExprOperand(arg0, 0), tree01); ++ else if (code01 == C_MINUS_EXPR ++ && CTreeNodeCode(CTreeExprOperand(tree01, 0)) == C_INT_CST_NODE ++ && CTreeIntCstHigh(CTreeExprOperand(tree01, 0)) == 0 ++ && CTreeIntCstLow(CTreeExprOperand(tree01, 0)) ++ == CTreeTypePrecision(CTreeType(CTreeExprOperand(arg0, 0))) ++ && c_is_operand_equal_p(tree11, CTreeExprOperand(tree01, 1), 0)) ++ return ++ c_tree_build_binary_typed_expr( ++ code0 != C_LSHIFT_EXPR ? C_LROTATE_EXPR : C_RROTATE_EXPR, ++ type, CTreeExprOperand(arg0, 0), tree11); ++ } ++ ++ goto associate; ++ } ++ ++ case C_BIT_XOR_EXPR: ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ if (c_tree_is_integer_all_onesp(arg1)) ++ return c_fold(c_tree_build_unary_typed_expr(C_BIT_NOT_EXPR, type, arg0)); ++ goto associate; ++ ++ case C_BIT_AND_EXPR: ++ bit_and: ++ if (c_tree_is_integer_all_onesp(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_omit_one_operand(type, arg1, arg0); ++ t1 = c_distribute_bit_expr(code, type, arg0, arg1); ++ if (t1 != NULL) ++ return t1; ++ /* Simplify ((int)c & 0x377) into (int)c, if c is unsigned char. */ ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE && CTreeNodeCode(arg1) == C_NOP_EXPR ++ && CIsTreeNodeUnsigned(CTreeType(CTreeExprOperand(arg1, 0)))) ++ { ++ int prec = CTreeTypePrecision(CTreeType(CTreeExprOperand(arg1, 0))); ++ if (prec < C_BITS_PER_WORD && prec < C_HOST_BITS_PER_WIDE_INT ++ && (~CTreeIntCstLow(arg0) ++ & (((C_HOST_WIDE_INT) 1 << prec) - 1)) == 0) ++ return c_tree_build_unary_typed_expr(C_NOP_EXPR, type, CTreeExprOperand(arg1, 0)); ++ } ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE && CTreeNodeCode(arg0) == C_NOP_EXPR ++ && CIsTreeNodeUnsigned(CTreeType(CTreeExprOperand(arg0, 0)))) ++ { ++ int prec = CTreeTypePrecision(CTreeType(CTreeExprOperand(arg0, 0))); ++ if (prec < C_BITS_PER_WORD && prec < C_HOST_BITS_PER_WIDE_INT ++ && (~CTreeIntCstLow(arg1) ++ & (((C_HOST_WIDE_INT) 1 << prec) - 1)) == 0) ++ return c_tree_build_unary_typed_expr(C_NOP_EXPR, type, CTreeExprOperand(arg0, 0)); ++ } ++ goto associate; ++ ++ case C_BIT_ANDTC_EXPR: ++ if (c_tree_is_integer_all_onesp(arg0)) ++ return c_get_non_lvalue(c_convert_expr(type, arg1)); ++ if (c_tree_is_integer_zerop(arg0)) ++ return c_omit_one_operand(type, arg0, arg1); ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE) ++ { ++ arg1 = c_fold(c_tree_build_unary_typed_expr(C_BIT_NOT_EXPR, type, arg1)); ++ code = C_BIT_AND_EXPR; ++ goto bit_and; ++ } ++ goto binary; ++ ++ case C_RDIV_EXPR: ++ /* In most cases, do nothing with a divide by zero. */ ++#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++#ifndef REAL_INFINITY ++ if (CTreeNodeCode(arg1) == C_REAL_CST_NODE && c_tree_is_real_zerop(arg1)) ++ return t; ++#endif ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ ++ /* In IEEE floating point, x/1 is not equivalent to x for snans. ++ However, ANSI says we can drop signals, so we can do this anyway. */ ++ if (c_tree_is_real_onep(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ ++ /* If ARG1 is a constant, we can c_convert_exprthis to a multiply by the ++ reciprocal. This does not have the same rounding properties, ++ so only do this if -ffast-math. We can actually always safely ++ do it if ARG1 is a power of two, but it's hard to tell if it is ++ or not in a portable manner. */ ++ if (CTreeNodeCode(arg1) == C_REAL_CST_NODE) ++ { ++ if (c_flag_fast_math ++ && 0 != (tem = c_const_binop(code, ++ c_tree_build_real(type, 1.0), arg1, 0))) ++ return c_fold(c_tree_build_binary_typed_expr(C_MULT_EXPR, type, arg0, tem)); ++ /* Find the reciprocal if optimizing and the result is exact. */ ++# ifdef LUDO_NO_SKIP ++ else if (optimize) ++ { ++ REAL_VALUE_TYPE r; ++ r = CTreeRealCstValue(arg1); ++ if (c_exact_real_inverse(TYPE_MODE(TREE_TYPE(arg0)), &r)) ++ { ++ tem = c_tree_build_real(type, r); ++ return ++ c_fold(c_tree_build_binary_typed_expr(C_MULT_EXPR, type, arg0, tem)); ++ } ++ } ++# endif ++ } ++ goto binary; ++ ++ case C_TRUNC_DIV_EXPR: ++ case C_ROUND_DIV_EXPR: ++ case C_FLOOR_DIV_EXPR: ++ case C_CEIL_DIV_EXPR: ++ case C_EXACT_DIV_EXPR: ++ if (c_tree_is_integer_onep(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ if (c_tree_is_integer_zerop(arg1)) ++ return t; ++ ++ /* If we have ((a / C1) / C2) where both division are the same type, try ++ to simplify. First see if C1 * C2 overflows or not. */ ++ if (CTreeNodeCode(arg0) == code && CTreeNodeCode(arg1) == C_INT_CST_NODE ++ && CTreeNodeCode(CTreeExprOperand(arg0, 1)) == C_INT_CST_NODE) ++ { ++ c_tree_node *new_divisor; ++ ++ new_divisor = c_const_binop(C_MULT_EXPR, CTreeExprOperand(arg0, 1), arg1, 0); ++ tem = c_const_binop(C_FLOOR_DIV_EXPR, new_divisor, arg1, 0); ++ ++ if (CTreeIntCstLow(CTreeExprOperand(arg0, 1)) == CTreeIntCstLow(tem) ++ && CTreeIntCstHigh(CTreeExprOperand(arg0, 1)) == CTreeIntCstHigh(tem)) ++ { ++ /* If no overflow, divide by C1*C2. */ ++ return ++ c_fold( ++ c_tree_build_binary_typed_expr( ++ code, type, CTreeExprOperand(arg0, 0), new_divisor)); ++ } ++ } ++ ++ /* Look for ((a * C1) / C3) or (((a * C1) + C2) / C3), ++ where C1 % C3 == 0 or C3 % C1 == 0. We can simplify these ++ expressions, which often appear in the offsets or sizes of ++ objects with a varying size. Only deal with positive divisors ++ and multiplicands. If C2 is negative, we must have C2 % C3 == 0. ++ ++ Look for NOPs and SAVE_EXPRs inside. */ ++ ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE ++ && c_tree_is_int_cst_sgn(arg1) >= 0) ++ { ++ int have_save_expr = 0; ++ c_tree_node *c2 = c_integer_zero_node; ++ c_tree_node *xarg0 = arg0; ++ ++ if (CTreeNodeCode(xarg0) == C_SAVE_EXPR ++# ifdef LUDO_NO_SKIP ++ && SAVE_EXPR_RTL (xarg0) == 0 ++# endif ++ ) ++ have_save_expr = 1, xarg0 = CTreeExprOperand(xarg0, 0); ++ ++ CStripNops(xarg0); ++ ++ if (CTreeNodeCode(xarg0) == C_PLUS_EXPR ++ && CTreeNodeCode(CTreeExprOperand(xarg0, 1)) == C_INT_CST_NODE) ++ c2 = CTreeExprOperand(xarg0, 1), xarg0 = CTreeExprOperand(xarg0, 0); ++ else if (CTreeNodeCode(xarg0) == C_MINUS_EXPR ++ && CTreeNodeCode(CTreeExprOperand(xarg0, 1)) == C_INT_CST_NODE ++ /* If we are doing this computation unsigned, the negate ++ is incorrect. */ ++ && ! CIsTreeNodeUnsigned(type)) ++ { ++ c2 = ++ c_fold( c_tree_build_unary_typed_expr( ++ C_NEGATE_EXPR, type, CTreeExprOperand(xarg0, 1))); ++ xarg0 = CTreeExprOperand(xarg0, 0); ++ } ++ ++ if (CTreeNodeCode(xarg0) == C_SAVE_EXPR ++# ifdef LUDO_NO_SKIP ++ && SAVE_EXPR_RTL (xarg0) == 0 ++# endif ++ ) ++ have_save_expr = 1, xarg0 = CTreeExprOperand(xarg0, 0); ++ ++ CStripNops(xarg0); ++ ++ if (CTreeNodeCode(xarg0) == C_MULT_EXPR ++ && CTreeNodeCode(CTreeExprOperand(xarg0, 1)) == C_INT_CST_NODE ++ && c_tree_is_int_cst_sgn(CTreeExprOperand(xarg0, 1)) >= 0 ++ && (c_tree_is_integer_zerop(c_const_binop(C_TRUNC_MOD_EXPR, ++ CTreeExprOperand(xarg0, 1), arg1, 1)) ++ || c_tree_is_integer_zerop(c_const_binop(C_TRUNC_MOD_EXPR, arg1, ++ CTreeExprOperand(xarg0, 1), 1))) ++ && (c_tree_is_int_cst_sgn(c2) >= 0 ++ || c_tree_is_integer_zerop(c_const_binop(C_TRUNC_MOD_EXPR, c2, ++ arg1, 1)))) ++ { ++ c_tree_node *outer_div = c_integer_one_node; ++ c_tree_node *c1 = CTreeExprOperand(xarg0, 1); ++ c_tree_node *c3 = arg1; ++ ++ /* If C3 > C1, set them equal and do a divide by ++ C3/C1 at the end of the operation. */ ++ if (c_tree_is_int_cst_lt(c1, c3)) ++ outer_div = c_const_binop(code, c3, c1, 0), c3 = c1; ++ ++ /* The result is A * (C1/C3) + (C2/C3). */ ++ t = c_fold(c_tree_build_binary_typed_expr(C_PLUS_EXPR, type, ++ c_fold(c_tree_build_binary_typed_expr(C_MULT_EXPR, type, ++ CTreeExprOperand(xarg0, 0), ++ c_const_binop(code, c1, c3, 1))), ++ c_const_binop(code, c2, c3, 1))); ++ ++ if (! c_tree_is_integer_onep(outer_div)) ++ t = c_fold( c_tree_build_binary_typed_expr( ++ code, type, t, c_convert_expr(type, outer_div))); ++ ++# ifdef LUDO_NO_SKIP ++ if (have_save_expr) ++ t = save_expr (t); ++# endif ++ return t; ++ } ++ } ++ ++ goto binary; ++ ++ case C_CEIL_MOD_EXPR: ++ case C_FLOOR_MOD_EXPR: ++ case C_ROUND_MOD_EXPR: ++ case C_TRUNC_MOD_EXPR: ++ if (c_tree_is_integer_onep(arg1)) ++ return c_omit_one_operand(type, c_integer_zero_node, arg0); ++ if (c_tree_is_integer_zerop(arg1)) ++ return t; ++ ++ /* Look for ((a * C1) % C3) or (((a * C1) + C2) % C3), ++ where C1 % C3 == 0. Handle similarly to the division case, ++ but don't bother with SAVE_EXPRs. */ ++ ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE ++ && ! c_tree_is_integer_zerop(arg1)) ++ { ++ c_tree_node *c2 = c_integer_zero_node; ++ c_tree_node *xarg0 = arg0; ++ ++ if (CTreeNodeCode(xarg0) == C_PLUS_EXPR ++ && CTreeNodeCode(CTreeExprOperand(xarg0, 1)) == C_INT_CST_NODE) ++ c2 = CTreeExprOperand(xarg0, 1), xarg0 = CTreeExprOperand(xarg0, 0); ++ else if (CTreeNodeCode(xarg0) == C_MINUS_EXPR ++ && CTreeNodeCode(CTreeExprOperand(xarg0, 1)) == C_INT_CST_NODE ++ && ! CIsTreeNodeUnsigned(type)) ++ { ++ c2 = c_fold(c_tree_build_unary_typed_expr( ++ C_NEGATE_EXPR, type, CTreeExprOperand(xarg0, 1))); ++ xarg0 = CTreeExprOperand(xarg0, 0); ++ } ++ ++ CStripNops(xarg0); ++ ++ if (CTreeNodeCode(xarg0) == C_MULT_EXPR ++ && CTreeNodeCode(CTreeExprOperand(xarg0, 1)) == C_INT_CST_NODE ++ && c_tree_is_integer_zerop(c_const_binop(C_TRUNC_MOD_EXPR, ++ CTreeExprOperand(xarg0, 1), ++ arg1, 1)) ++ && c_tree_is_int_cst_sgn(c2) >= 0) ++ /* The result is (C2%C3). */ ++ return c_omit_one_operand(type, c_const_binop(code, c2, arg1, 1), ++ CTreeExprOperand(xarg0, 0)); ++ } ++ ++ goto binary; ++ ++ case C_LSHIFT_EXPR: ++ case C_RSHIFT_EXPR: ++ case C_LROTATE_EXPR: ++ case C_RROTATE_EXPR: ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(c_convert_expr(type, arg0)); ++ /* Since negative shift count is not well-defined, ++ don't try to compute it in the compiler. */ ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE && c_tree_is_int_cst_sgn(arg1) < 0) ++ return t; ++ /* Rewrite an LROTATE_EXPR by a constant into an ++ RROTATE_EXPR by a new constant. */ ++# ifdef LUDO_NO_SKIP ++ if (code == C_LROTATE_EXPR && CTreeNodeCode(arg1) == C_INT_CST_NODE) ++ { ++ CTreeNodeCode(t) = C_RROTATE_EXPR; ++ code = C_RROTATE_EXPR; ++ CTreeExprOperand(t, 1) = arg1 ++ = c_const_binop(C_MINUS_EXPR, ++ c_convert_expr(CTreeType(arg1), ++ c_tree_build_int_2(GET_MODE_BITSIZE(CTreeTypeMode(type)), 0)), ++ arg1, 0); ++ if (c_tree_is_int_cst_sgn(arg1) < 0) ++ return t; ++ } ++# endif ++ ++ /* If we have a rotate of a bit operation with the rotate count and ++ the second operand of the bit operation both constant, ++ permute the two operations. */ ++ if (code == C_RROTATE_EXPR && CTreeNodeCode(arg1) == C_INT_CST_NODE ++ && (CTreeNodeCode(arg0) == C_BIT_AND_EXPR ++ || CTreeNodeCode(arg0) == C_BIT_ANDTC_EXPR ++ || CTreeNodeCode(arg0) == C_BIT_IOR_EXPR ++ || CTreeNodeCode(arg0) == C_BIT_XOR_EXPR) ++ && CTreeNodeCode(CTreeExprOperand(arg0, 1)) == C_INT_CST_NODE) ++ return c_fold(c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), type, ++ c_fold(c_tree_build_binary_typed_expr(code, type, ++ CTreeExprOperand(arg0, 0), arg1)), ++ c_fold(c_tree_build_binary_typed_expr(code, type, ++ CTreeExprOperand(arg0, 1), arg1)))); ++ ++# ifdef LUDO_NO_SKIP ++ /* Two consecutive rotates adding up to the width of the mode can ++ be ignored. */ ++ if (code == C_RROTATE_EXPR && CTreeNodeCode(arg1) == C_INT_CST_NODE ++ && CTreeNodeCode(arg0) == C_RROTATE_EXPR ++ && CTreeNodeCode(CTreeExprOperand(arg0, 1)) == C_INT_CST_NODE ++ && CTreeIntCstHigh(arg1) == 0 ++ && CTreeIntCstHigh(CTreeExprOperand(arg0, 1)) == 0 ++ && ((CTreeIntCstLow(arg1) ++ + CTreeIntCstLow(CTreeExprOperand(arg0, 1))) ++ == GET_MODE_BITSIZE(CTreeTypeMode(type)))) ++ return CTreeExprOperand(arg0, 0); ++# endif ++ ++ goto binary; ++ ++ case C_MIN_EXPR: ++ if (c_is_operand_equal_p(arg0, arg1, 0)) ++ return arg0; ++ if (INTEGRAL_TYPE_P (type) ++ && c_is_operand_equal_p(arg1, CTreeTypeMinValue(type), 1)) ++ return c_omit_one_operand(type, arg1, arg0); ++ goto associate; ++ ++ case C_MAX_EXPR: ++ if (c_is_operand_equal_p(arg0, arg1, 0)) ++ return arg0; ++ if (INTEGRAL_TYPE_P (type) ++ && c_is_operand_equal_p(arg1, CTreeTypeMaxValue(type), 1)) ++ return c_omit_one_operand(type, arg1, arg0); ++ goto associate; ++ ++ case C_TRUTH_NOT_EXPR: ++ /* Note that the operand of this must be an int ++ and its values must be 0 or 1. ++ ("true" is a fixed value perhaps depending on the language, ++ but we don't handle values other than 1 correctly yet.) */ ++ tem = c_invert_truthvalue(arg0); ++ /* Avoid infinite recursion. */ ++ if (CTreeNodeCode(tem) == C_TRUTH_NOT_EXPR) ++ return t; ++ return c_convert_expr(type, tem); ++ ++ case C_TRUTH_ANDIF_EXPR: ++ /* Note that the operands of this must be ints ++ and their values must be 0 or 1. ++ ("true" is a fixed value perhaps depending on the language.) */ ++ /* If first arg is constant zero, return it. */ ++ if (c_tree_is_integer_zerop(arg0)) ++ return arg0; ++ case C_TRUTH_AND_EXPR: ++ /* If either arg is constant true, drop it. */ ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE && ! c_tree_is_integer_zerop(arg0)) ++ return c_get_non_lvalue(arg1); ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE && ! c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(arg0); ++ /* If second arg is constant zero, result is zero, but first arg ++ must be evaluated. */ ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_omit_one_operand(type, arg1, arg0); ++ /* Likewise for first arg, but note that only the TRUTH_AND_EXPR ++ case will be handled here. */ ++ if (c_tree_is_integer_zerop(arg0)) ++ return c_omit_one_operand(type, arg0, arg1); ++ ++ truth_andor: ++ /* We only do these simplifications if we are optimizing. */ ++# ifdef LUDO_NO_SKIP ++ if (!optimize) ++ return t; ++ ++ /* Check for things like (A || B) && (A || C). We can c_convert_exprthis ++ to A || (B && C). Note that either operator can be any of the four ++ truth and/or operations and the transformation will still be ++ valid. Also note that we only care about order for the ++ ANDIF and ORIF operators. If B contains side effects, this ++ might change the truth-value of A. */ ++ if (CTreeNodeCode(arg0) == CTreeNodeCode(arg1) ++ && (CTreeNodeCode(arg0) == TRUTH_ANDIF_EXPR ++ || CTreeNodeCode(arg0) == TRUTH_ORIF_EXPR ++ || CTreeNodeCode(arg0) == TRUTH_AND_EXPR ++ || CTreeNodeCode(arg0) == TRUTH_OR_EXPR) ++ && ! TREE_SIDE_EFFECTS (CTreeExprOperand(arg0, 1))) ++ { ++ c_tree_node *a00 = CTreeExprOperand(arg0, 0); ++ c_tree_node *a01 = CTreeExprOperand(arg0, 1); ++ c_tree_node *a10 = CTreeExprOperand(arg1, 0); ++ c_tree_node *a11 = CTreeExprOperand(arg1, 1); ++ int commutative = ((CTreeNodeCode(arg0) == TRUTH_OR_EXPR ++ || CTreeNodeCode(arg0) == TRUTH_AND_EXPR) ++ && (code == TRUTH_AND_EXPR ++ || code == TRUTH_OR_EXPR)); ++ ++ if (c_is_operand_equal_p(a00, a10, 0)) ++ return c_fold(c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), type, a00, ++ c_fold(c_tree_build_binary_typed_expr(code, type, a01, a11)))); ++ else if (commutative && c_is_operand_equal_p(a00, a11, 0)) ++ return c_fold(c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), type, a00, ++ c_fold(c_tree_build_binary_typed_expr(code, type, a01, a10)))); ++ else if (commutative && c_is_operand_equal_p(a01, a10, 0)) ++ return c_fold(c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), type, a01, ++ c_fold(c_tree_build_binary_typed_expr(code, type, a00, a11)))); ++ ++ /* This case if tricky because we must either have commutative ++ operators or else A10 must not have side-effects. */ ++ ++ else if ((commutative || ! TREE_SIDE_EFFECTS (a10)) ++ && c_is_operand_equal_p(a01, a11, 0)) ++ return c_fold(c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), type, ++ c_fold(c_tree_build_binary_typed_expr(code, type, a00, a10)), ++ a01)); ++ } ++ ++ /* See if we can c_tree_build_binary_typed_expra range comparison. */ ++ if (0 != (tem = fold_range_test (t))) ++ return tem; ++ ++ /* Check for the possibility of merging component references. If our ++ lhs is another similar operation, try to merge its rhs with our ++ rhs. Then try to merge our lhs and rhs. */ ++ if (CTreeNodeCode(arg0) == code ++ && 0 != (tem = fold_truthop (code, type, ++ CTreeExprOperand(arg0, 1), arg1))) ++ return ++ c_fold(c_tree_build_binary_typed_expr(code, type, CTreeExprOperand(arg0, 0), tem)); ++ ++ if ((tem = fold_truthop (code, type, arg0, arg1)) != 0) ++ return tem; ++# endif ++ ++ return t; ++ ++ case C_TRUTH_ORIF_EXPR: ++ /* Note that the operands of this must be ints ++ and their values must be 0 or true. ++ ("true" is a fixed value perhaps depending on the language.) */ ++ /* If first arg is constant true, return it. */ ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE && ! c_tree_is_integer_zerop(arg0)) ++ return arg0; ++ case C_TRUTH_OR_EXPR: ++ /* If either arg is constant zero, drop it. */ ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE && c_tree_is_integer_zerop(arg0)) ++ return c_get_non_lvalue(arg1); ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE && c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(arg0); ++ /* If second arg is constant true, result is true, but we must ++ evaluate first arg. */ ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE && ! c_tree_is_integer_zerop(arg1)) ++ return c_omit_one_operand(type, arg1, arg0); ++ /* Likewise for first arg, but note this only occurs here for ++ TRUTH_OR_EXPR. */ ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE && ! c_tree_is_integer_zerop(arg0)) ++ return c_omit_one_operand(type, arg0, arg1); ++ goto truth_andor; ++ ++ case C_TRUTH_XOR_EXPR: ++ /* If either arg is constant zero, drop it. */ ++ if (c_tree_is_integer_zerop(arg0)) ++ return c_get_non_lvalue(arg1); ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(arg0); ++ /* If either arg is constant true, this is a logical inversion. */ ++ if (c_tree_is_integer_onep(arg0)) ++ return c_get_non_lvalue(c_invert_truthvalue(arg1)); ++ if (c_tree_is_integer_onep(arg1)) ++ return c_get_non_lvalue(c_invert_truthvalue(arg0)); ++ return t; ++ ++ case C_EQ_EXPR: ++ case C_NE_EXPR: ++ case C_LT_EXPR: ++ case C_GT_EXPR: ++ case C_LE_EXPR: ++ case C_GE_EXPR: ++ /* If one arg is a constant integer, put it last. */ ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE ++ && CTreeNodeCode(arg1) != C_INT_CST_NODE) ++ { ++ CTreeExprOperand(t, 0) = arg1; ++ CTreeExprOperand(t, 1) = arg0; ++ arg0 = CTreeExprOperand(t, 0); ++ arg1 = CTreeExprOperand(t, 1); ++ code = c_swap_tree_comparison(code); ++ CTreeNodeCode(t) = code; ++ } ++ ++ /* Convert foo++ == CONST into ++foo == CONST + INCR. ++ First, see if one arg is constant; find the constant arg ++ and the other one. */ ++ { ++ c_tree_node *constop = 0; ++ c_tree_node *varop; ++ int constopnum = -1; ++ ++ if (CIsTreeNodeConstant(arg1)) ++ constopnum = 1, constop = arg1, varop = arg0; ++ if (CIsTreeNodeConstant(arg0)) ++ constopnum = 0, constop = arg0, varop = arg1; ++ ++ if (constop && CTreeNodeCode(varop) == C_POSTINCREMENT_EXPR) ++ { ++ /* This optimization is invalid for ordered comparisons ++ if CONST+INCR overflows or if foo+incr might overflow. ++ This optimization is invalid for floating point due to rounding. ++ For pointer types we assume overflow doesn't happen. */ ++ if (POINTER_TYPE_P (CTreeType(varop)) ++ || (! FLOAT_TYPE_P (CTreeType(varop)) ++ && (code == C_EQ_EXPR || code == C_NE_EXPR))) ++ { ++ c_tree_node *newconst ++ = c_fold(c_tree_build_binary_typed_expr(C_PLUS_EXPR, CTreeType(varop), ++ constop, CTreeExprOperand(varop, 1))); ++ CTreeNodeCode(varop) = C_PREINCREMENT_EXPR; ++ ++ /* If VAROP is a reference to a bitfield, we must mask ++ the constant by the width of the field. */ ++ if (CTreeNodeCode(CTreeExprOperand(varop, 0)) == C_COMPONENT_REF ++ && CIsTreeDeclBitField(CTreeExprOperand(CTreeExprOperand(varop, 0), 1))) ++ { ++ int size ++ = CTreeIntCstLow(CTreeDeclSize( ++ CTreeExprOperand(CTreeExprOperand(varop, 0), 1))); ++ ++ newconst = c_fold(c_tree_build_binary_typed_expr(C_BIT_AND_EXPR, ++ CTreeType(varop), newconst, ++ c_convert_expr(CTreeType(varop), ++ c_tree_build_int_2(size, 0)))); ++ } ++ ++ ++ t = c_tree_build_binary_typed_expr(code, type, CTreeExprOperand(t, 0), ++ CTreeExprOperand(t, 1)); ++ CTreeExprOperand(t, constopnum) = newconst; ++ return t; ++ } ++ } ++ else if (constop && CTreeNodeCode(varop) == C_POSTDECREMENT_EXPR) ++ { ++ if (POINTER_TYPE_P (CTreeType(varop)) ++ || (! FLOAT_TYPE_P (CTreeType(varop)) ++ && (code == C_EQ_EXPR || code == C_NE_EXPR))) ++ { ++ c_tree_node *newconst ++ = c_fold(c_tree_build_binary_typed_expr(C_MINUS_EXPR, CTreeType(varop), ++ constop, CTreeExprOperand(varop, 1))); ++ CTreeNodeCode(varop) = C_PREDECREMENT_EXPR; ++ ++ if (CTreeNodeCode(CTreeExprOperand(varop, 0)) == C_COMPONENT_REF ++ && CIsTreeDeclBitField(CTreeExprOperand(CTreeExprOperand(varop, 0), 1))) ++ { ++ int size ++ = CTreeIntCstLow(CTreeDeclSize(CTreeExprOperand( ++ CTreeExprOperand(varop, 0), 1))); ++ ++ newconst = c_fold(c_tree_build_binary_typed_expr(C_BIT_AND_EXPR, ++ CTreeType(varop), newconst, ++ c_convert_expr(CTreeType(varop), ++ c_tree_build_int_2(size, 0)))); ++ } ++ ++ ++ t = c_tree_build_binary_typed_expr(code, type, CTreeExprOperand(t, 0), ++ CTreeExprOperand(t, 1)); ++ CTreeExprOperand(t, constopnum) = newconst; ++ return t; ++ } ++ } ++ } ++ ++ /* Change X >= CST to X > (CST - 1) if CST is positive. */ ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE ++ && CTreeNodeCode(arg0) != C_INT_CST_NODE ++ && c_tree_is_int_cst_sgn(arg1) > 0) ++ { ++ switch (CTreeNodeCode(t)) ++ { ++ case C_GE_EXPR: ++ code = C_GT_EXPR; ++ arg1 = c_const_binop(C_MINUS_EXPR, arg1, c_integer_one_node, 0); ++ t = c_tree_build_binary_typed_expr(code, type, CTreeExprOperand(t, 0), arg1); ++ break; ++ ++ case C_LT_EXPR: ++ code = C_LE_EXPR; ++ arg1 = c_const_binop(C_MINUS_EXPR, arg1, c_integer_one_node, 0); ++ t = c_tree_build_binary_typed_expr(code, type, CTreeExprOperand(t, 0), arg1); ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* If this is an EQ or NE comparison with zero and ARG0 is ++ (1 << foo) & bar, c_convert_exprit to (bar >> foo) & 1. Both require ++ two operations, but the latter can be done in one less insn ++ on machines that have only two-operand insns or on which a ++ constant cannot be the first operand. */ ++ if (c_tree_is_integer_zerop(arg1) && (code == C_EQ_EXPR || code == C_NE_EXPR) ++ && CTreeNodeCode(arg0) == C_BIT_AND_EXPR) ++ { ++ if (CTreeNodeCode(CTreeExprOperand(arg0, 0)) == C_LSHIFT_EXPR ++ && c_tree_is_integer_onep(CTreeExprOperand(CTreeExprOperand(arg0, 0), 0))) ++ return ++ c_fold(c_tree_build_binary_typed_expr(code, type, ++ c_tree_build_binary_typed_expr(C_BIT_AND_EXPR, CTreeType(arg0), ++ c_tree_build_binary_typed_expr(C_RSHIFT_EXPR, ++ CTreeType(CTreeExprOperand(arg0, 0)), ++ CTreeExprOperand(arg0, 1), ++ CTreeExprOperand(CTreeExprOperand(arg0, 0), 1)), ++ c_convert_expr(CTreeType(arg0), ++ c_integer_one_node)), ++ arg1)); ++ else if (CTreeNodeCode(CTreeExprOperand(arg0, 1)) == C_LSHIFT_EXPR ++ && c_tree_is_integer_onep(CTreeExprOperand(CTreeExprOperand(arg0, 1), 0))) ++ return ++ c_fold(c_tree_build_binary_typed_expr(code, type, ++ c_tree_build_binary_typed_expr(C_BIT_AND_EXPR, CTreeType(arg0), ++ c_tree_build_binary_typed_expr(C_RSHIFT_EXPR, ++ CTreeType(CTreeExprOperand(arg0, 1)), ++ CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(CTreeExprOperand(arg0, 1), 1)), ++ c_convert_expr(CTreeType(arg0), ++ c_integer_one_node)), ++ arg1)); ++ } ++ ++ /* If this is an NE or EQ comparison of zero against the result of a ++ signed MOD operation whose second operand is a power of 2, make ++ the MOD operation unsigned since it is simpler and equivalent. */ ++ if ((code == C_NE_EXPR || code == C_EQ_EXPR) ++ && c_tree_is_integer_zerop(arg1) ++ && ! CIsTreeNodeUnsigned(CTreeType(arg0)) ++ && (CTreeNodeCode(arg0) == C_TRUNC_MOD_EXPR ++ || CTreeNodeCode(arg0) == C_CEIL_MOD_EXPR ++ || CTreeNodeCode(arg0) == C_FLOOR_MOD_EXPR ++ || CTreeNodeCode(arg0) == C_ROUND_MOD_EXPR) ++ && c_tree_is_integer_pow2p(CTreeExprOperand(arg0, 1))) ++ { ++ c_tree_node *newtype = c_get_unsigned_type(CTreeType(arg0)); ++ c_tree_node *newmod = c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), newtype, ++ c_convert_expr(newtype, CTreeExprOperand(arg0, 0)), ++ c_convert_expr(newtype, CTreeExprOperand(arg0, 1))); ++ ++ return c_tree_build_binary_typed_expr( ++ code, type, newmod, c_convert_expr(newtype, arg1)); ++ } ++ ++ /* If this is an NE comparison of zero with an AND of one, remove the ++ comparison since the AND will give the correct value. */ ++ if (code == C_NE_EXPR && c_tree_is_integer_zerop(arg1) ++ && CTreeNodeCode(arg0) == C_BIT_AND_EXPR ++ && c_tree_is_integer_onep(CTreeExprOperand(arg0, 1))) ++ return c_convert_expr(type, arg0); ++ ++ /* If we have (A & C) == C where C is a power of 2, c_convert_exprthis into ++ (A & C) != 0. Similarly for NE_EXPR. */ ++ if ((code == C_EQ_EXPR || code == C_NE_EXPR) ++ && CTreeNodeCode(arg0) == C_BIT_AND_EXPR ++ && c_tree_is_integer_pow2p(CTreeExprOperand(arg0, 1)) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), arg1, 0)) ++ return ++ c_tree_build_binary_typed_expr(code == C_EQ_EXPR ? C_NE_EXPR : C_EQ_EXPR, type, ++ arg0, c_integer_zero_node); ++ ++ /* If X is unsigned, c_convert_exprX < (1 << Y) into X >> Y == 0 ++ and similarly for >= into !=. */ ++ if ((code == C_LT_EXPR || code == C_GE_EXPR) ++ && CIsTreeNodeUnsigned(CTreeType(arg0)) ++ && CTreeNodeCode(arg1) == C_LSHIFT_EXPR ++ && c_tree_is_integer_onep(CTreeExprOperand(arg1, 0))) ++ return c_tree_build_binary_typed_expr(code == C_LT_EXPR ? C_EQ_EXPR : C_NE_EXPR, type, ++ c_tree_build_binary_typed_expr(C_RSHIFT_EXPR, CTreeType(arg0), arg0, ++ CTreeExprOperand(arg1, 1)), ++ c_convert_expr(CTreeType(arg0), c_integer_zero_node)); ++ ++ else if ((code == C_LT_EXPR || code == C_GE_EXPR) ++ && CIsTreeNodeUnsigned(CTreeType(arg0)) ++ && (CTreeNodeCode(arg1) == C_NOP_EXPR ++ || CTreeNodeCode(arg1) == C_CONVERT_EXPR) ++ && CTreeNodeCode(CTreeExprOperand(arg1, 0)) == C_LSHIFT_EXPR ++ && c_tree_is_integer_onep(CTreeExprOperand(CTreeExprOperand(arg1, 0), 0))) ++ return ++ c_tree_build_binary_typed_expr(code == C_LT_EXPR ? C_EQ_EXPR : C_NE_EXPR, type, ++ c_convert_expr(CTreeType(arg0), ++ c_tree_build_binary_typed_expr(C_RSHIFT_EXPR, CTreeType(arg0), arg0, ++ CTreeExprOperand(CTreeExprOperand(arg1, 0), 1))), ++ c_convert_expr(CTreeType(arg0), c_integer_zero_node)); ++ ++ /* Simplify comparison of something with itself. (For IEEE ++ floating-point, we can only do some of these simplifications.) */ ++ if (c_is_operand_equal_p(arg0, arg1, 0)) ++ { ++ switch (code) ++ { ++ case C_EQ_EXPR: ++ case C_GE_EXPR: ++ case C_LE_EXPR: ++ if (INTEGRAL_TYPE_P (CTreeType(arg0))) ++ { ++ if (type == c_integer_type_node) ++ return c_integer_one_node; ++ ++ t = c_tree_build_int_2(1, 0); ++ CTreeType(t) = type; ++ return t; ++ } ++ code = C_EQ_EXPR; ++ CTreeNodeCode(t) = code; ++ break; ++ ++ case C_NE_EXPR: ++ /* For NE, we can only do this simplification if integer. */ ++ if (! INTEGRAL_TYPE_P (CTreeType(arg0))) ++ break; ++ /* ... fall through ... */ ++ case C_GT_EXPR: ++ case C_LT_EXPR: ++ if (type == c_integer_type_node) ++ return c_integer_zero_node; ++ ++ t = c_tree_build_int_2(0, 0); ++ CTreeType(t) = type; ++ return t; ++ default: ++ abort (); ++ } ++ } ++ ++ /* An unsigned comparison against 0 can be simplified. */ ++ if (c_tree_is_integer_zerop(arg1) ++ && (INTEGRAL_TYPE_P (CTreeType(arg1)) ++ || POINTER_TYPE_P (CTreeType(arg1))) ++ && CIsTreeNodeUnsigned(CTreeType(arg1))) ++ { ++ switch (CTreeNodeCode(t)) ++ { ++ case C_GT_EXPR: ++ code = C_NE_EXPR; ++ CTreeNodeCode(t) = C_NE_EXPR; ++ break; ++ case C_LE_EXPR: ++ code = C_EQ_EXPR; ++ CTreeNodeCode(t) = C_EQ_EXPR; ++ break; ++ case C_GE_EXPR: ++ return c_omit_one_operand(type, ++ c_convert_expr(type, c_integer_one_node), ++ arg0); ++ case C_LT_EXPR: ++ return c_omit_one_operand(type, ++ c_convert_expr(type, c_integer_zero_node), ++ arg0); ++ default: ++ break; ++ } ++ } ++ ++ /* An unsigned <= 0x7fffffff can be simplified. */ ++ { ++ int width = CTreeTypePrecision(CTreeType(arg1)); ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE ++ && ! CIsTreeNodeCstOverflow(arg1) ++ && width <= C_HOST_BITS_PER_WIDE_INT ++ && CTreeIntCstLow(arg1) == ((C_HOST_WIDE_INT) 1 << (width - 1)) - 1 ++ && CTreeIntCstHigh(arg1) == 0 ++ && (INTEGRAL_TYPE_P (CTreeType(arg1)) ++ || POINTER_TYPE_P (CTreeType(arg1))) ++ && CIsTreeNodeUnsigned(CTreeType(arg1))) ++ { ++ switch (CTreeNodeCode(t)) ++ { ++ case C_LE_EXPR: ++ return c_fold(c_tree_build_binary_typed_expr(C_GE_EXPR, type, ++ c_convert_expr(c_get_signed_type(CTreeType(arg0)), ++ arg0), ++ c_convert_expr(c_get_signed_type(CTreeType(arg1)), ++ c_integer_zero_node))); ++ case C_GT_EXPR: ++ return c_fold(c_tree_build_binary_typed_expr(C_LT_EXPR, type, ++ c_convert_expr( c_get_signed_type(CTreeType(arg0)), ++ arg0), ++ c_convert_expr( c_get_signed_type(CTreeType(arg1)), ++ c_integer_zero_node))); ++ } ++ } ++ } ++ ++ /* If we are comparing an expression that just has comparisons ++ of two integer values, arithmetic expressions of those comparisons, ++ and constants, we can simplify it. There are only three cases ++ to check: the two values can either be equal, the first can be ++ greater, or the second can be greater. Fold the expression for ++ those three values. Since each value must be 0 or 1, we have ++ eight possibilities, each of which corresponds to the constant 0 ++ or 1 or one of the six possible comparisons. ++ ++ This handles common cases like (a > b) == 0 but also handles ++ expressions like ((x > y) - (y > x)) > 0, which supposedly ++ occur in macroized code. */ ++ ++ if (CTreeNodeCode(arg1) == C_INT_CST_NODE && ++ CTreeNodeCode(arg0) != C_INT_CST_NODE) ++ { ++ c_tree_node *cval1 = 0; ++ c_tree_node *cval2 = 0; ++ int save_p = 0; ++ ++ if (c_twoval_comparison_p(arg0, &cval1, &cval2, &save_p) ++ /* Don't handle degenerate cases here; they should already ++ have been handled anyway. */ ++ && cval1 != 0 && cval2 != 0 ++ && ! (CIsTreeNodeConstant(cval1) && CIsTreeNodeConstant(cval2)) ++ && CTreeType(cval1) == CTreeType(cval2) ++ && INTEGRAL_TYPE_P (CTreeType(cval1)) ++ && ! c_is_operand_equal_p(CTreeTypeMinValue(CTreeType(cval1)), ++ CTreeTypeMaxValue(CTreeType(cval2)), 0)) ++ { ++ c_tree_node *maxval = CTreeTypeMaxValue(CTreeType(cval1)); ++ c_tree_node *minval = CTreeTypeMinValue(CTreeType(cval1)); ++ ++ /* We can't just pass T to c_eval_substin case cval1 or cval2 ++ was the same as ARG1. */ ++ ++ c_tree_node *high_result ++ = c_fold(c_tree_build_binary_typed_expr(code, type, ++ c_eval_subst(arg0, cval1, maxval, cval2, minval), ++ arg1)); ++ c_tree_node *equal_result ++ = c_fold(c_tree_build_binary_typed_expr(code, type, ++ c_eval_subst(arg0, cval1, maxval, cval2, maxval), ++ arg1)); ++ c_tree_node *low_result ++ = c_fold(c_tree_build_binary_typed_expr(code, type, ++ c_eval_subst(arg0, cval1, minval, cval2, maxval), ++ arg1)); ++ ++ /* All three of these results should be 0 or 1. Confirm they ++ are. Then use those values to select the proper code ++ to use. */ ++ ++ if ((c_tree_is_integer_zerop(high_result) ++ || c_tree_is_integer_onep(high_result)) ++ && (c_tree_is_integer_zerop(equal_result) ++ || c_tree_is_integer_onep(equal_result)) ++ && (c_tree_is_integer_zerop(low_result) ++ || c_tree_is_integer_onep(low_result))) ++ { ++ /* Make a 3-bit mask with the high-order bit being the ++ value for `>', the next for '=', and the low for '<'. */ ++ switch ((c_tree_is_integer_onep(high_result) * 4) ++ + (c_tree_is_integer_onep(equal_result) * 2) ++ + c_tree_is_integer_onep(low_result)) ++ { ++ case 0: ++ /* Always false. */ ++ return c_omit_one_operand(type, c_integer_zero_node, arg0); ++ case 1: ++ code = C_LT_EXPR; ++ break; ++ case 2: ++ code = C_EQ_EXPR; ++ break; ++ case 3: ++ code = C_LE_EXPR; ++ break; ++ case 4: ++ code = C_GT_EXPR; ++ break; ++ case 5: ++ code = C_NE_EXPR; ++ break; ++ case 6: ++ code = C_GE_EXPR; ++ break; ++ case 7: ++ /* Always true. */ ++ return c_omit_one_operand(type, c_integer_one_node, arg0); ++ } ++ ++ t = c_tree_build_binary_typed_expr(code, type, cval1, cval2); ++ if (save_p) ++# ifdef LUDO_NO_SKIP ++ return save_expr (t); ++# else ++ return t; ++# endif ++ else ++ return c_fold(t); ++ } ++ } ++ } ++ ++ /* If this is a comparison of a field, we may be able to simplify it. */ ++# ifdef LUDO_NO_SKIP ++ if ((CTreeNodeCode(arg0) == C_COMPONENT_REF ++ || CTreeNodeCode(arg0) == C_BIT_FIELD_REF) ++ && (code == C_EQ_EXPR || code == C_NE_EXPR) ++ /* Handle the constant case even without -O ++ to make sure the warnings are given. */ ++ && (optimize || CTreeNodeCode(arg1) == C_INT_CST_NODE)) ++ { ++ t1 = c_optimize_bit_field_compare(code, type, arg0, arg1); ++ return t1 ? t1 : t; ++ } ++# endif ++ ++ /* If this is a comparison of complex values and either or both ++ sizes are a COMPLEX_EXPR, it is best to split up the comparisons ++ and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR. This ++ may prevent needless evaluations. */ ++ if ((code == C_EQ_EXPR || code == C_NE_EXPR) ++ && CTreeNodeCode(CTreeType(arg0)) == C_COMPLEX_TYPE ++ && (CTreeNodeCode(arg0) == C_COMPLEX_EXPR ++ || CTreeNodeCode(arg1) == C_COMPLEX_EXPR)) ++ { ++ c_tree_node *subtype = CTreeType(CTreeType(arg0)); ++ c_tree_node *real0 = ++ c_fold(c_tree_build_unary_typed_expr(C_REALPART_EXPR, subtype, arg0)); ++ c_tree_node *imag0 = ++ c_fold(c_tree_build_unary_typed_expr(C_IMAGPART_EXPR, subtype, arg0)); ++ c_tree_node *real1 = ++ c_fold(c_tree_build_unary_typed_expr(C_REALPART_EXPR, subtype, arg1)); ++ c_tree_node *imag1 = ++ c_fold(c_tree_build_unary_typed_expr(C_IMAGPART_EXPR, subtype, arg1)); ++ ++ return c_fold(c_tree_build_binary_typed_expr( ++ (code == C_EQ_EXPR ? C_TRUTH_ANDIF_EXPR : C_TRUTH_ORIF_EXPR), type, ++ c_fold(c_tree_build_binary_typed_expr(code, type, real0, real1)), ++ c_fold(c_tree_build_binary_typed_expr(code, type, imag0, imag1)))); ++ } ++ ++ /* From here on, the only cases we handle are when the result is ++ known to be a constant. ++ ++ To compute GT, swap the arguments and do LT. ++ To compute GE, do LT and invert the result. ++ To compute LE, swap the arguments, do LT and invert the result. ++ To compute NE, do EQ and invert the result. ++ ++ Therefore, the code below must handle only EQ and LT. */ ++ ++ if (code == C_LE_EXPR || code == C_GT_EXPR) ++ { ++ tem = arg0, arg0 = arg1, arg1 = tem; ++ code = c_swap_tree_comparison(code); ++ } ++ ++ /* Note that it is safe to invert for real values here because we ++ will check below in the one case that it matters. */ ++ ++ invert = 0; ++ if (code == C_NE_EXPR || code == C_GE_EXPR) ++ { ++ invert = 1; ++ code = c_invert_tree_comparison(code); ++ } ++ ++ /* Compute a result for LT or EQ if args permit; ++ otherwise return T. */ ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE && CTreeNodeCode(arg1) == C_INT_CST_NODE) ++ { ++ if (code == C_EQ_EXPR) ++ t1 = c_tree_build_int_2((CTreeIntCstLow(arg0) ++ == CTreeIntCstLow(arg1)) ++ && (CTreeIntCstHigh(arg0) ++ == CTreeIntCstHigh(arg1)), ++ 0); ++ else ++ t1 = c_tree_build_int_2((CIsTreeNodeUnsigned(CTreeType(arg0)) ++ ? INT_CST_LT_UNSIGNED (arg0, arg1) ++ : INT_CST_LT (arg0, arg1)), ++ 0); ++ } ++ /* Two real constants can be compared explicitly. */ ++ else if (CTreeNodeCode(arg0) == C_REAL_CST_NODE && ++ CTreeNodeCode(arg1) == C_REAL_CST_NODE) ++ { ++ /* If either operand is a NaN, the result is false with two ++ exceptions: First, an NE_EXPR is true on NaNs, but that case ++ is already handled correctly since we will be inverting the ++ result for NE_EXPR. Second, if we had inverted a LE_EXPR ++ or a GE_EXPR into a LT_EXPR, we must return true so that it ++ will be inverted into false. */ ++ ++# ifdef LUDO_NO_SKIP ++ if (REAL_VALUE_ISNAN (TREE_REAL_CST (arg0)) ++ || REAL_VALUE_ISNAN (TREE_REAL_CST (arg1))) ++ t1 = c_tree_build_int_2(invert && code == LT_EXPR, 0); ++ else ++# endif ++ if (code == C_EQ_EXPR) ++ t1 = c_tree_build_int_2(REAL_VALUES_EQUAL ( ++ CTreeRealCstValue(arg0), CTreeRealCstValue(arg1)), ++ 0); ++ else ++ t1 = c_tree_build_int_2(REAL_VALUES_LESS (CTreeRealCstValue(arg0), ++ CTreeRealCstValue(arg1)), ++ 0); ++ } ++ ++ if (t1 == NULL) ++ return t; ++ ++ if (invert) ++ CTreeIntCstLow(t1) ^= 1; ++ ++ CTreeType(t1) = type; ++ return t1; ++ ++ case C_COND_EXPR: ++ /* Pedantic ANSI C says that a conditional expression is never an lvalue, ++ so all simple results must be passed through pedantic_non_lvalue. */ ++ if (CTreeNodeCode(arg0) == C_INT_CST_NODE) ++ return c_get_pedantic_non_lvalue( ++ CTreeExprOperand(t, (c_tree_is_integer_zerop(arg0) ? 2 : 1))); ++ else if (c_is_operand_equal_p(arg1, CTreeExprOperand(expr, 2), 0)) ++ return c_pedantic_omit_one_operand(type, arg1, arg0); ++ ++ /* If the second operand is zero, invert the comparison and swap ++ the second and third operands. Likewise if the second operand ++ is constant and the third is not or if the third operand is ++ equivalent to the first operand of the comparison. */ ++ ++ if (c_tree_is_integer_zerop(arg1) ++ || (CIsTreeNodeConstant(arg1) && ! CIsTreeNodeConstant(CTreeExprOperand(t, 2))) ++ || (c_tree_get_code_class(CTreeNodeCode(arg0)) == '<' ++ && c_is_operand_equal_for_comparison_p( ++ CTreeExprOperand(arg0, 0), CTreeExprOperand(t, 2), ++ CTreeExprOperand(arg0, 1)))) ++ { ++ /* See if this can be inverted. If it can't, possibly because ++ it was a floating-point inequality comparison, don't do ++ anything. */ ++ tem = c_invert_truthvalue(arg0); ++ ++ if (CTreeNodeCode(tem) != C_TRUTH_NOT_EXPR) ++ { ++ t = c_tree_build_ternary_typed_expr(code, type, tem, ++ CTreeExprOperand(t, 2), CTreeExprOperand(t, 1)); ++ arg0 = tem; ++ arg1 = CTreeExprOperand(t, 2); ++ CStripNops(arg1); ++ } ++ } ++ ++ /* If we have A op B ? A : C, we may be able to c_convert_exprthis to a ++ simpler expression, depending on the operation and the values ++ of B and C. IEEE floating point prevents this though, ++ because A or B might be -0.0 or a NaN. */ ++ ++ if (c_tree_get_code_class(CTreeNodeCode(arg0)) == '<' ++ && ( ++# ifdef LUDO_NO_SKIP ++ TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT || ++# endif ++ ! FLOAT_TYPE_P (CTreeType(CTreeExprOperand(arg0, 0))) ++ || c_flag_fast_math) ++ && c_is_operand_equal_for_comparison_p(CTreeExprOperand(arg0, 0), ++ arg1, CTreeExprOperand(arg0, 1))) ++ { ++ c_tree_node *arg2 = CTreeExprOperand(t, 2); ++ int comp_code = CTreeNodeCode(arg0); ++ ++ CStripNops(arg2); ++ ++ /* If we have A op 0 ? A : -A, this is A, -A, abs (A), or abs (-A), ++ depending on the comparison operation. */ ++ if ((FLOAT_TYPE_P (CTreeType(CTreeExprOperand(arg0, 1))) ++ ? c_tree_is_real_zerop(CTreeExprOperand(arg0, 1)) ++ : c_tree_is_integer_zerop(CTreeExprOperand(arg0, 1))) ++ && CTreeNodeCode(arg2) == C_NEGATE_EXPR ++ && c_is_operand_equal_p(CTreeExprOperand(arg2, 0), arg1, 0)) ++ switch (comp_code) ++ { ++ case C_EQ_EXPR: ++ return c_get_pedantic_non_lvalue( ++ c_fold(c_tree_build_unary_typed_expr(C_NEGATE_EXPR, type, arg1))); ++ case C_NE_EXPR: ++ return c_get_pedantic_non_lvalue(c_convert_expr(type, arg1)); ++ case C_GE_EXPR: ++ case C_GT_EXPR: ++ return c_get_pedantic_non_lvalue( ++ c_convert_expr(type, c_fold(c_tree_build_unary_typed_expr(C_ABS_EXPR, ++ CTreeType(arg1), arg1)))); ++ case C_LE_EXPR: ++ case C_LT_EXPR: ++ return c_get_pedantic_non_lvalue( ++ c_fold(c_tree_build_unary_typed_expr(C_NEGATE_EXPR, type, ++ c_convert_expr(type, ++ c_fold(c_tree_build_unary_typed_expr(C_ABS_EXPR, ++ CTreeType(arg1), ++ arg1)))))); ++ default: ++ abort (); ++ } ++ ++ /* If this is A != 0 ? A : 0, this is simply A. For ==, it is ++ always zero. */ ++ ++ if (c_tree_is_integer_zerop(CTreeExprOperand(arg0, 1)) && ++ c_tree_is_integer_zerop(arg2)) ++ { ++ if (comp_code == C_NE_EXPR) ++ return c_get_pedantic_non_lvalue(c_convert_expr(type, arg1)); ++ else if (comp_code == C_EQ_EXPR) ++ return c_get_pedantic_non_lvalue(c_convert_expr(type, c_integer_zero_node)); ++ } ++ ++ /* If this is A op B ? A : B, this is either A, B, min (A, B), ++ or max (A, B), depending on the operation. */ ++ ++ if (c_is_operand_equal_for_comparison_p(CTreeExprOperand(arg0, 1), ++ arg2, CTreeExprOperand(arg0, 0))) ++ { ++ c_tree_node *comp_op0 = CTreeExprOperand(arg0, 0); ++ c_tree_node *comp_op1 = CTreeExprOperand(arg0, 1); ++ c_tree_node *comp_type = CTreeType(comp_op0); ++ ++ switch (comp_code) ++ { ++ case C_EQ_EXPR: ++ return c_get_pedantic_non_lvalue(c_convert_expr(type, arg2)); ++ case C_NE_EXPR: ++ return c_get_pedantic_non_lvalue(c_convert_expr(type, arg1)); ++ case C_LE_EXPR: ++ case C_LT_EXPR: ++ /* In C++ a ?: expression can be an lvalue, so put the ++ operand which will be used if they are equal first ++ so that we can c_convert_exprthis back to the ++ corresponding COND_EXPR. */ ++ return c_get_pedantic_non_lvalue( ++ c_convert_expr( ++ type, (c_fold(c_tree_build_binary_typed_expr(C_MIN_EXPR, comp_type, ++ (comp_code == C_LE_EXPR ++ ? comp_op0 : comp_op1), ++ (comp_code == C_LE_EXPR ++ ? comp_op1 : comp_op0)))))); ++ break; ++ case C_GE_EXPR: ++ case C_GT_EXPR: ++ return c_get_pedantic_non_lvalue( ++ c_convert_expr(type, ++ c_fold(c_tree_build_binary_typed_expr(C_MAX_EXPR, comp_type, ++ (comp_code == C_GE_EXPR ++ ? comp_op0 : comp_op1), ++ (comp_code == C_GE_EXPR ++ ? comp_op1 : comp_op0))))); ++ break; ++ default: ++ abort (); ++ } ++ } ++ ++ /* If this is A op C1 ? A : C2 with C1 and C2 constant integers, ++ we might still be able to simplify this. For example, ++ if C1 is one less or one more than C2, this might have started ++ out as a MIN or MAX and been transformed by this function. ++ Only good for INTEGER_TYPEs, because we need TYPE_MAX_VALUE. */ ++ ++ if (INTEGRAL_TYPE_P (type) ++ && CTreeNodeCode(CTreeExprOperand(arg0, 1)) == C_INT_CST_NODE ++ && CTreeNodeCode(arg2) == C_INT_CST_NODE) ++ switch (comp_code) ++ { ++ case C_EQ_EXPR: ++ /* We can replace A with C1 in this case. */ ++ arg1 = c_convert_expr(type, CTreeExprOperand(arg0, 1)); ++ t = c_tree_build_ternary_typed_expr(code, type, CTreeExprOperand(t, 0), arg1, ++ CTreeExprOperand(t, 2)); ++ break; ++ ++ case C_LT_EXPR: ++ /* If C1 is C2 + 1, this is min(A, C2). */ ++ if (! c_is_operand_equal_p(arg2, CTreeTypeMaxValue(type), 1) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ c_const_binop(C_PLUS_EXPR, arg2, ++ c_integer_one_node, 0), 1)) ++ return c_get_pedantic_non_lvalue( ++ c_fold(c_tree_build_binary_typed_expr(C_MIN_EXPR, type, arg1, arg2))); ++ break; ++ ++ case C_LE_EXPR: ++ /* If C1 is C2 - 1, this is min(A, C2). */ ++ if (! c_is_operand_equal_p(arg2, CTreeTypeMinValue(type), 1) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ c_const_binop(C_MINUS_EXPR, arg2, ++ c_integer_one_node, 0), 1)) ++ return c_get_pedantic_non_lvalue( ++ c_fold(c_tree_build_binary_typed_expr(C_MIN_EXPR, type, arg1, arg2))); ++ break; ++ ++ case C_GT_EXPR: ++ /* If C1 is C2 - 1, this is max(A, C2). */ ++ if (! c_is_operand_equal_p(arg2, CTreeTypeMinValue(type), 1) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ c_const_binop(C_MINUS_EXPR, arg2, ++ c_integer_one_node, 0), 1)) ++ return c_get_pedantic_non_lvalue( ++ c_fold(c_tree_build_binary_typed_expr(C_MAX_EXPR, type, arg1, arg2))); ++ break; ++ ++ case C_GE_EXPR: ++ /* If C1 is C2 + 1, this is max(A, C2). */ ++ if (! c_is_operand_equal_p(arg2, CTreeTypeMaxValue(type), 1) ++ && c_is_operand_equal_p(CTreeExprOperand(arg0, 1), ++ c_const_binop(C_PLUS_EXPR, arg2, ++ c_integer_one_node, 0), 1)) ++ return c_get_pedantic_non_lvalue( ++ c_fold(c_tree_build_binary_typed_expr(C_MAX_EXPR, type, arg1, arg2))); ++ break; ++ case C_NE_EXPR: ++ break; ++ default: ++ abort (); ++ } ++ } ++ ++ /* If the second operand is simpler than the third, swap them ++ since that produces better jump optimization results. */ ++ if ((CIsTreeNodeConstant(arg1) || c_tree_get_code_class(CTreeNodeCode(arg1)) == 'd' ++ || CTreeNodeCode(arg1) == C_SAVE_EXPR) ++ && ! (CIsTreeNodeConstant(CTreeExprOperand(t, 2)) ++ || c_tree_get_code_class(CTreeNodeCode(CTreeExprOperand(t, 2))) == 'd' ++ || CTreeNodeCode(CTreeExprOperand(t, 2)) == C_SAVE_EXPR)) ++ { ++ /* See if this can be inverted. If it can't, possibly because ++ it was a floating-point inequality comparison, don't do ++ anything. */ ++ tem = c_invert_truthvalue(arg0); ++ ++ if (CTreeNodeCode(tem) != C_TRUTH_NOT_EXPR) ++ { ++ t = c_tree_build_ternary_typed_expr(code, type, tem, ++ CTreeExprOperand(t, 2), CTreeExprOperand(t, 1)); ++ arg0 = tem; ++ arg1 = CTreeExprOperand(t, 2); ++ CStripNops(arg1); ++ } ++ } ++ ++ /* Convert A ? 1 : 0 to simply A. */ ++ if (c_tree_is_integer_onep(CTreeExprOperand(t, 1)) ++ && c_tree_is_integer_zerop(CTreeExprOperand(t, 2)) ++ /* If we try to c_convert_exprCTreeExprOperand(t, 0) to our type, the ++ call to c_foldwill try to move the conversion inside ++ a COND, which will recurse. In that case, the COND_EXPR ++ is probably the best choice, so leave it alone. */ ++ && type == CTreeType(arg0)) ++ return c_get_pedantic_non_lvalue(arg0); ++ ++ /* Look for expressions of the form A & 2 ? 2 : 0. The result of this ++ operation is simply A & 2. */ ++ ++ if (c_tree_is_integer_zerop(CTreeExprOperand(t, 2)) ++ && CTreeNodeCode(arg0) == C_NE_EXPR ++ && c_tree_is_integer_zerop(CTreeExprOperand(arg0, 1)) ++ && c_tree_is_integer_pow2p(arg1) ++ && CTreeNodeCode(CTreeExprOperand(arg0, 0)) == C_BIT_AND_EXPR ++ && c_is_operand_equal_p(CTreeExprOperand(CTreeExprOperand(arg0, 0), 1), ++ arg1, 1)) ++ return c_get_pedantic_non_lvalue(c_convert_expr(type, CTreeExprOperand(arg0, 0))); ++ ++ return t; ++ ++ case C_COMPOUND_EXPR: ++ /* When pedantic, a compound expression can be neither an lvalue ++ nor an integer constant expression. */ ++ if ( CIsTreeNodeSideEffect(arg0) || c_pedantic) ++ return t; ++ /* Don't let (0, 0) be null pointer constant. */ ++ if (c_tree_is_integer_zerop(arg1)) ++ return c_get_non_lvalue(arg1); ++ return arg1; ++ ++ case C_COMPLEX_EXPR: ++ if (wins) ++ return c_tree_build_complex(type, arg0, arg1); ++ return t; ++ ++ case C_REALPART_EXPR: ++ if (CTreeNodeCode(CTreeType(arg0)) != C_COMPLEX_TYPE) ++ return t; ++ else if (CTreeNodeCode(arg0) == C_COMPLEX_EXPR) ++ return c_omit_one_operand(type, CTreeExprOperand(arg0, 0), ++ CTreeExprOperand(arg0, 1)); ++ else if (CTreeNodeCode(arg0) == C_COMPLEX_NODE) ++ return CTreeComplexReal(arg0); ++ else if (CTreeNodeCode(arg0) == C_PLUS_EXPR || CTreeNodeCode(arg0) == C_MINUS_EXPR) ++ return c_fold(c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), type, ++ c_fold(c_tree_build_unary_typed_expr(C_REALPART_EXPR, type, ++ CTreeExprOperand(arg0, 0))), ++ c_fold(c_tree_build_unary_typed_expr(C_REALPART_EXPR, ++ type, CTreeExprOperand(arg0, 1))))); ++ return t; ++ ++ case C_IMAGPART_EXPR: ++ if (CTreeNodeCode(CTreeType(arg0)) != C_COMPLEX_TYPE) ++ return c_convert_expr(type, c_integer_zero_node); ++ else if (CTreeNodeCode(arg0) == C_COMPLEX_EXPR) ++ return c_omit_one_operand(type, CTreeExprOperand(arg0, 1), ++ CTreeExprOperand(arg0, 0)); ++ else if (CTreeNodeCode(arg0) == C_COMPLEX_NODE) ++ return CTreeComplexImag(arg0); ++ else if (CTreeNodeCode(arg0) == C_PLUS_EXPR || CTreeNodeCode(arg0) == C_MINUS_EXPR) ++ return c_fold(c_tree_build_binary_typed_expr(CTreeNodeCode(arg0), type, ++ c_fold(c_tree_build_unary_typed_expr(C_IMAGPART_EXPR, type, ++ CTreeExprOperand(arg0, 0))), ++ c_fold(c_tree_build_unary_typed_expr(C_IMAGPART_EXPR, type, ++ CTreeExprOperand(arg0, 1))))); ++ return t; ++ ++ /* Pull arithmetic ops out of the CLEANUP_POINT_EXPR where ++ appropriate. */ ++ case C_CLEANUP_POINT_EXPR: ++ if (! CIsTreeNodeSideEffect(arg0)) ++ return CTreeExprOperand(t, 0); ++ ++ { ++ int code0 = CTreeNodeCode(arg0); ++ int kind0 = c_tree_get_code_class(code0); ++ c_tree_node *arg00 = CTreeExprOperand(arg0, 0); ++ c_tree_node *arg01; ++ ++ if (kind0 == '1' || code0 == C_TRUTH_NOT_EXPR) ++ return c_fold(c_tree_build_unary_typed_expr(code0, type, ++ c_fold(c_tree_build_unary_typed_expr(C_CLEANUP_POINT_EXPR, ++ CTreeType(arg00), arg00)))); ++ ++ if (kind0 == '<' || kind0 == '2' ++ || code0 == C_TRUTH_ANDIF_EXPR || code0 == C_TRUTH_ORIF_EXPR ++ || code0 == C_TRUTH_AND_EXPR || code0 == C_TRUTH_OR_EXPR ++ || code0 == C_TRUTH_XOR_EXPR) ++ { ++ arg01 = CTreeExprOperand(arg0, 1); ++ ++ if (! CIsTreeNodeSideEffect(arg00)) ++ return c_fold(c_tree_build_binary_typed_expr(code0, type, arg00, ++ c_fold(c_tree_build_unary_typed_expr(C_CLEANUP_POINT_EXPR, ++ CTreeType(arg01), arg01)))); ++ ++ if (! CIsTreeNodeSideEffect(arg01)) ++ return c_fold(c_tree_build_binary_typed_expr(code0, type, ++ c_fold(c_tree_build_unary_typed_expr(C_CLEANUP_POINT_EXPR, ++ CTreeType(arg00), arg00)), ++ arg01)); ++ } ++ ++ return t; ++ } ++ ++ default: ++ return t; ++ } /* switch (code) */ ++ return expr; ++} +diff -Naur alliance-5.0/gcp/src/c_foldconst.h alliance/gcp/src/c_foldconst.h +--- alliance-5.0/gcp/src/c_foldconst.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_foldconst.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,87 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_foldconst.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_FOLD_CONST_H ++# define C_FOLD_CONST_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++/* Nonzero means lvalues are limited to those valid in pedantic ANSI C. ++ Zero means allow extended lvalues. */ ++ extern int c_pedantic_lvalues; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern c_tree_node *c_invert_truthvalue __P((c_tree_node *arg)); ++ extern c_tree_node *c_non_lvalue __P(( c_tree_node *x)); ++ extern c_tree_node *c_build_size_binop __P(( int code, c_tree_node *arg0, c_tree_node *arg1)); ++ extern c_tree_node *c_fold __P((c_tree_node *expr)); ++ extern int c_is_operand_equal_p __P((c_tree_node *arg0, c_tree_node *arg1, int only_const)); ++ extern c_tree_node *c_get_pedantic_non_lvalue __P((c_tree_node *x)); ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_gperf.h alliance/gcp/src/c_gperf.h +--- alliance-5.0/gcp/src/c_gperf.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_gperf.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,219 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/* C code produced by gperf version 2.5 (GNU C++ version) */ ++/* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ ./c-parse.gperf */ ++/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ ++struct resword { char *name; short token; enum rid rid; }; ++ ++#define TOTAL_KEYWORDS 79 ++#define MIN_WORD_LENGTH 2 ++#define MAX_WORD_LENGTH 20 ++#define MIN_HASH_VALUE 10 ++#define MAX_HASH_VALUE 144 ++/* maximum key range = 135, duplicates = 0 */ ++ ++#ifdef __GNUC__ ++inline ++#endif ++static unsigned int ++hash (str, len) ++ register char *str; ++ register int unsigned len; ++{ ++ static unsigned char asso_values[] = ++ { ++ 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 25, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, ++ 145, 145, 145, 145, 145, 1, 145, 46, 8, 15, ++ 61, 6, 36, 48, 3, 5, 145, 18, 63, 25, ++ 29, 76, 1, 145, 13, 2, 1, 51, 37, 9, ++ 9, 1, 3, 145, 145, 145, 145, 145, ++ }; ++ register int hval = len; ++ ++ switch (hval) ++ { ++ default: ++ case 3: ++ hval += asso_values[(unsigned int)str[2]]; ++ case 2: ++ case 1: ++ hval += asso_values[(unsigned int)str[0]]; ++ break; ++ } ++ return hval + asso_values[(unsigned int)str[len - 1]]; ++} ++ ++static struct resword wordlist[] = ++{ ++ {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ++ {"",}, ++ {"int", tok_TYPESPEC, RID_INT}, ++ {"",}, {"",}, ++ {"__typeof__", tok_TYPEOF, NORID}, ++ {"__signed__", tok_TYPESPEC, RID_SIGNED}, ++ {"__imag__", tok_IMAGPART, NORID}, ++ {"switch", tok_SWITCH, NORID}, ++ {"__inline__", tok_SCSPEC, RID_INLINE}, ++ {"else", tok_ELSE, NORID}, ++ {"__iterator__", tok_SCSPEC, RID_ITERATOR}, ++ {"__inline", tok_SCSPEC, RID_INLINE}, ++ {"__extension__", tok_EXTENSION, NORID}, ++ {"struct", tok_STRUCT, NORID}, ++ {"__real__", tok_REALPART, NORID}, ++ {"__const", tok_TYPE_QUAL, RID_CONST}, ++ {"while", tok_WHILE, NORID}, ++ {"__const__", tok_TYPE_QUAL, RID_CONST}, ++ {"case", tok_CASE, NORID}, ++ {"__complex__", tok_TYPESPEC, RID_COMPLEX}, ++ {"__iterator", tok_SCSPEC, RID_ITERATOR}, ++ {"bycopy", tok_TYPE_QUAL, RID_BYCOPY}, ++ {"",}, {"",}, {"",}, ++ {"__complex", tok_TYPESPEC, RID_COMPLEX}, ++ {"",}, ++ {"in", tok_TYPE_QUAL, RID_IN}, ++ {"break", tok_BREAK, NORID}, ++ {"@defs", tok_DEFS, NORID}, ++ {"",}, {"",}, {"",}, ++ {"extern", tok_SCSPEC, RID_EXTERN}, ++ {"if", tok_IF, NORID}, ++ {"typeof", tok_TYPEOF, NORID}, ++ {"typedef", tok_SCSPEC, RID_TYPEDEF}, ++ {"__typeof", tok_TYPEOF, NORID}, ++ {"sizeof", tok_SIZEOF, NORID}, ++ {"",}, ++ {"return", tok_RETURN, NORID}, ++ {"const", tok_TYPE_QUAL, RID_CONST}, ++ {"__volatile__", tok_TYPE_QUAL, RID_VOLATILE}, ++ {"@private", tok_PRIVATE, NORID}, ++ {"@selector", tok_SELECTOR, NORID}, ++ {"__volatile", tok_TYPE_QUAL, RID_VOLATILE}, ++ {"__asm__", tok_ASM_KEYWORD, NORID}, ++ {"",}, {"",}, ++ {"continue", tok_CONTINUE, NORID}, ++ {"__alignof__", tok_ALIGNOF, NORID}, ++ {"__imag", tok_IMAGPART, NORID}, ++ {"__attribute__", tok_ATTRIBUTE, NORID}, ++ {"",}, {"",}, ++ {"__attribute", tok_ATTRIBUTE, NORID}, ++ {"for", tok_FOR, NORID}, ++ {"",}, ++ {"@encode", tok_ENCODE, NORID}, ++ {"id", tok_OBJECTNAME, RID_ID}, ++ {"static", tok_SCSPEC, RID_STATIC}, ++ {"@interface", tok_INTERFACE, NORID}, ++ {"",}, ++ {"__signed", tok_TYPESPEC, RID_SIGNED}, ++ {"",}, ++ {"__label__", tok_LABEL, NORID}, ++ {"",}, {"",}, ++ {"__asm", tok_ASM_KEYWORD, NORID}, ++ {"char", tok_TYPESPEC, RID_CHAR}, ++ {"",}, ++ {"inline", tok_SCSPEC, RID_INLINE}, ++ {"out", tok_TYPE_QUAL, RID_OUT}, ++ {"register", tok_SCSPEC, RID_REGISTER}, ++ {"__real", tok_REALPART, NORID}, ++ {"short", tok_TYPESPEC, RID_SHORT}, ++ {"",}, ++ {"enum", tok_ENUM, NORID}, ++ {"inout", tok_TYPE_QUAL, RID_INOUT}, ++ {"",}, ++ {"oneway", tok_TYPE_QUAL, RID_ONEWAY}, ++ {"union", tok_UNION, NORID}, ++ {"",}, ++ {"__alignof", tok_ALIGNOF, NORID}, ++ {"",}, ++ {"@implementation", tok_IMPLEMENTATION, NORID}, ++ {"",}, ++ {"@class", tok_CLASS, NORID}, ++ {"",}, ++ {"@public", tok_PUBLIC, NORID}, ++ {"asm", tok_ASM_KEYWORD, NORID}, ++ {"",}, {"",}, {"",}, {"",}, {"",}, ++ {"default", tok_DEFAULT, NORID}, ++ {"",}, ++ {"void", tok_TYPESPEC, RID_VOID}, ++ {"",}, ++ {"@protected", tok_PROTECTED, NORID}, ++ {"@protocol", tok_PROTOCOL, NORID}, ++ {"",}, {"",}, {"",}, ++ {"volatile", tok_TYPE_QUAL, RID_VOLATILE}, ++ {"",}, {"",}, ++ {"signed", tok_TYPESPEC, RID_SIGNED}, ++ {"float", tok_TYPESPEC, RID_FLOAT}, ++ {"@end", tok_END, NORID}, ++ {"",}, {"",}, ++ {"unsigned", tok_TYPESPEC, RID_UNSIGNED}, ++ {"@compatibility_alias", tok_ALIAS, NORID}, ++ {"double", tok_TYPESPEC, RID_DOUBLE}, ++ {"",}, {"",}, ++ {"auto", tok_SCSPEC, RID_AUTO}, ++ {"",}, ++ {"goto", tok_GOTO, NORID}, ++ {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, ++ {"do", tok_DO, NORID}, ++ {"",}, {"",}, {"",}, {"",}, ++ {"long", tok_TYPESPEC, RID_LONG}, ++}; ++ ++#ifdef __GNUC__ ++inline ++#endif ++struct resword * ++c_is_reserved_word (str, len) ++ register char *str; ++ register unsigned int len; ++{ ++ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) ++ { ++ register int key = hash (str, len); ++ ++ if (key <= MAX_HASH_VALUE && key >= 0) ++ { ++ register char *s = wordlist[key].name; ++ ++ if (*s == *str && !strcmp (str + 1, s + 1)) ++ return &wordlist[key]; ++ } ++ } ++ return 0; ++} +diff -Naur alliance-5.0/gcp/src/c_parse.c alliance/gcp/src/c_parse.c +--- alliance-5.0/gcp/src/c_parse.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_parse.c 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,172 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : VBL | ++| | ++| File : c_parse.c | ++| | ++| Author : Jacomme Ludovic | ++| | ++| Date : 01.01.95 | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include ++# include ++# include ++# include ++# include ++# include ++ ++# include "c_tree.h" ++# include "c_cdecl.h" ++# include "c_clex.h" ++# include "c_debug.h" ++# include "c_flags.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern FILE *c_y_in; ++ extern int c_y_parse(); ++ ++ static char BuffTmpFile[ 64 ]; ++ static int UnlinkTmpFile = 0; ++ ++void gcpexit( Code ) ++ ++ int Code; ++{ ++ if ( UnlinkTmpFile ) ++ { ++ unlink( BuffTmpFile ); ++ } ++ ++ autexit( Code ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| c_tree_parse_file | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_parse_file( InputFileName, Argc, Argv ) ++ ++ char *InputFileName; ++ int Argc; ++ char **Argv; ++{ ++ struct stat Stat; ++ char BuffExec[ 2048 ]; ++ char *ScanArg; ++ int Index; ++ int Error; ++ ++ if ( stat( InputFileName, &Stat ) ) ++ { ++ fprintf( stdout, "Error unable to open file %s\n", InputFileName ); ++ gcpexit( 1 ); ++ } ++ ++ sprintf( BuffTmpFile, "/tmp/gcp%d", getpid() ); ++ ++ ScanArg = BuffExec; ++ sprintf( ScanArg, "gcc -E %s ", InputFileName ); ++ ScanArg += strlen( ScanArg ); ++ ++ for ( Index = 0; Index < Argc; Index++ ) ++ { ++ strcpy( ScanArg, "'" ); ++ ScanArg += 1; ++ strcpy( ScanArg, Argv[ Index ] ); ++ ScanArg += strlen( ScanArg ); ++ strcpy( ScanArg, "' " ); ++ ScanArg += 2; ++ } ++ ++ sprintf( ScanArg, "-o %s", BuffTmpFile ); ++ ++ UnlinkTmpFile = 1; ++ ++ errno = 0; ++ Error = system( BuffExec ); ++ ++ if ( ( Error ) && ++ ( Error != -1 ) ) ++ { ++ fprintf( stdout, ++ "An error occured while preprocessing %s, exit code %d (errno %d)\n", ++ InputFileName, Error, errno ); ++ gcpexit( 2 ); ++ } ++ ++ c_y_in = fopen( BuffTmpFile, "r" ); ++ ++ if ( c_y_in == (FILE *)0 ) ++ { ++ fprintf( stdout, "Error unable to open file %s\n", BuffTmpFile ); ++ gcpexit( 3 ); ++ } ++ ++ c_parse_flags( Argc, Argv ); ++ ++ c_init_lex( InputFileName ); ++ c_init_decl_processing(); ++ ++ Error = c_y_parse(); ++ ++ fclose( c_y_in ); ++ ++ unlink( BuffTmpFile ); ++ UnlinkTmpFile = 0; ++ ++ return( c_tree_program_node ); ++} +diff -Naur alliance-5.0/gcp/src/c_parse.h alliance/gcp/src/c_parse.h +--- alliance-5.0/gcp/src/c_parse.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_parse.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,52 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_cparse.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_CPARSE_H ++# define C_CPARSE_H ++ ++ extern void gcpexit __P(( int Code )); ++ ++# endif ++ +diff -Naur alliance-5.0/gcp/src/c_stmt.c alliance/gcp/src/c_stmt.c +--- alliance-5.0/gcp/src/c_stmt.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_stmt.c 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,93 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_stmt.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_flags.h" ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_cdecl.h" ++# include "c_convert.h" ++# include "c_ctypeck.h" ++# include "c_stmt.h" ++# include "c_debug.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++/* Filename and line number of last line-number note, ++ whether we actually emitted it or not. */ ++ ++ char *c_emit_filename; ++ int c_emit_lineno; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++void c_emit_line_note(file, line) ++ char *file; ++ int line; ++{ ++ c_emit_filename = file; ++ c_emit_lineno = line; ++} +diff -Naur alliance-5.0/gcp/src/c_stmt.h alliance/gcp/src/c_stmt.h +--- alliance-5.0/gcp/src/c_stmt.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_stmt.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,81 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_stmt.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_STMT_H ++# define C_STMT_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern char *c_emit_filename; ++ extern int c_emit_lineno; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern void c_emit_line_note __P((char *file, int line)); ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_tree.c alliance/gcp/src/c_tree.c +--- alliance-5.0/gcp/src/c_tree.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_tree.c 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,2307 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_tree.c | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Include Files | ++| | ++\------------------------------------------------------------*/ ++ ++# include ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++# include "c_tree.h" ++# include "c_treecompat.h" ++# include "c_debug.h" ++# include "c_cdecl.h" ++# include "c_debug.h" ++# include "c_convert.h" ++# include "c_flags.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ static authtable *CTreeHashIdentifier = (authtable *)0; ++ static char *CTreeNameBuiltIn = (char *)0; ++ ++ char *C_NODE_CODE_NAME[ C_MAX_NODE_CODE ] = ++ { ++ "INT_CST", ++ "REAL_CST", ++ "STRING", ++ "COMPLEX", ++ "IDENTIFIER", ++ "LIST", ++ "VEC", ++ "EXPR", ++ "BLOCK", ++ "TYPE", ++ "DECL", ++ "INST", ++ "ERROR" ++ }; ++ ++ int C_NODE_SIZE[ C_MAX_NODE_CODE ] = ++ { ++ sizeof( c_tree_int_cst ), /* INT_CST_NODE */ ++ sizeof( c_tree_real_cst ), /* REAL_CST_NODE */ ++ sizeof( c_tree_string ), /* STRING_NODE */ ++ sizeof( c_tree_complex ), /* COMPLEX_NODE */ ++ sizeof( c_tree_ident ), /* IDENTIFIER_NODE */ ++ sizeof( c_tree_list ), /* LIST_NODE */ ++ sizeof( c_tree_vec ), /* VEC_NODE */ ++ sizeof( c_tree_expr ), /* EXPR_NODE */ ++ sizeof( c_tree_block ), /* BLOCK_NODE */ ++ sizeof( c_tree_type ), /* TYPE_NODE */ ++ sizeof( c_tree_decl ), /* DECL_NODE */ ++ sizeof( c_tree_inst ), /* INST_NODE */ ++ sizeof( c_tree_common ) /* ERROR_NODE */ ++ }; ++ ++ char *C_EXPR_CODE_NAME[ C_MAX_EXPR_CODE ] = ++ { ++ "UNKNOWN", ++ "CONSTRUCTOR", ++ "COMPOUND", ++ "MODIFY", ++ "INIT", ++ "TARGET", ++ "COND", ++ "BIND", ++ "CALL", ++ "METHOD_CALL", ++ "WITH_CLEANUP", ++ "CLEANUP_POINT", ++ "PLACEHOLDER", ++ "WITH_RECORD", ++ "PLUS", ++ "MINUS", ++ "MULT", ++ "TRUNC_DIV", ++ "CEIL_DIV", ++ "FLOOR_DIV", ++ "ROUND_DIV", ++ "TRUNC_MOD", ++ "CEIL_MOD", ++ "FLOOR_MOD", ++ "ROUND_MOD", ++ "RDIV", ++ "EXACT_DIV", ++ "FIX_TRUNC", ++ "FIX_CEIL", ++ "FIX_FLOOR", ++ "FIX_ROUND", ++ "FLOAT", ++ "EXPON", ++ "NEGATE", ++ "MIN", ++ "MAX", ++ "ABS", ++ "FFS", ++ "LSHIFT", ++ "RSHIFT", ++ "LROTATE", ++ "RROTATE", ++ "BIT_IOR", ++ "BIT_XOR", ++ "BIT_AND", ++ "BIT_ANDTC", ++ "BIT_NOT", ++ "TRUTH_ANDIF", ++ "TRUTH_ORIF", ++ "TRUTH_AND", ++ "TRUTH_OR", ++ "TRUTH_XOR", ++ "TRUTH_NOT", ++ "LT", ++ "LE", ++ "GT", ++ "GE", ++ "EQ", ++ "NE", ++ "IN", ++ "SET_LE", ++ "CARD", ++ "RANGE", ++ "CONVERT", ++ "NOP", ++ "NON_LVALUE", ++ "SAVE", ++ "UNSAVE", ++ "RTL", ++ "ADDR", ++ "REFERENCE", ++ "ENTRY_VALUE", ++ "COMPLEX", ++ "CONJ", ++ "REALPART", ++ "IMAGPART", ++ "PREDECREMENT", ++ "PREINCREMENT", ++ "POSTDECREMENT", ++ "POSTINCREMENT", ++ "TRY_CATCH", ++ "POPDHC", ++ "POPDCC", ++ "LABEL", ++ "GOTO", ++ "RETURN", ++ "EXIT", ++ "LOOP", ++ "COMPONENT_REF", ++ "BIT_FIELD_REF", ++ "INDIRECT_REF", ++ "BUFFER_REF", ++ "ARRAY_REF" ++ }; ++ ++ char *C_TYPE_CODE_NAME[ C_MAX_TYPE_CODE ] = ++ { ++ "UNKNOWN", ++ "VOID", ++ "INTEGER", ++ "REAL", ++ "COMPLEX", ++ "ENUMERAL", ++ "BOOLEAN", ++ "CHAR", ++ "POINTER", ++ "OFFSET", ++ "REFERENCE", ++ "METHOD", ++ "FILE", ++ "ARRAY", ++ "SET", ++ "RECORD", ++ "UNION", ++ "QUAL_UNION", ++ "FUNCTION", ++ "LANG" ++ }; ++ ++ char *C_DECL_CODE_NAME[ C_MAX_DECL_CODE ] = ++ { ++ "UNKNOWN", ++ "FUNCTION", ++ "LABEL", ++ "CONST", ++ "TYPE", ++ "VAR", ++ "PARAM", ++ "RESULT", ++ "FIELD" ++ }; ++ ++ char *C_INST_CODE_NAME[ C_MAX_INST_CODE ] = ++ { ++ "UNKNOWN", ++ "FOR", ++ "WHILE", ++ "DO", ++ "IF", ++ "GOTO", ++ "RETURN", ++ "CONTINUE", ++ "BREAK", ++ "SWITCH", ++ "CASE" ++ }; ++ ++ char *C_CASE_CODE_NAME[ C_MAX_CASE_CODE ] = ++ { ++ "STANDARD", ++ "RANGE", ++ "DEFAULT" ++ }; ++ ++ short C_TREE_FORCE_VIEW_NODE = 0; ++ short C_TREE_VIEW_TYPE_NODE = 0; ++ short C_TREE_VIEW_SIZE_NODE = 0; ++ ++ c_tree_node *C_HEAD_NODE_LIST[ C_MAX_NODE_CODE ]; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| C Alloc Function | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| C Alloc Tree Node | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_alloc_node( NodeCode ) ++ ++ int NodeCode; ++{ ++ c_tree_node *TreeNode; ++ int FirstCode; ++ ++ FirstCode = CFirstCode( NodeCode ); ++ TreeNode = (c_tree_node *)autallocheap( C_NODE_SIZE[ FirstCode ] ); ++ CTreeNodeCode( TreeNode ) = NodeCode; ++ ++ TreeNode->COMMON.NEXT = C_HEAD_NODE_LIST[ FirstCode ]; ++ C_HEAD_NODE_LIST[ FirstCode ] = TreeNode; ++ ++ return( TreeNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Alloc Tree Node Array | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node **c_tree_alloc_node_array( Length ) ++ ++ int Length; ++{ ++ return( (c_tree_node **)autallocheap( sizeof( c_tree_node *) * Length ) ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Make Function | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| C Tree Make Node | ++| | ++\------------------------------------------------------------*/ ++ ++extern int c_lineno; ++extern char *c_input_filename; ++ ++c_tree_node *c_tree_add_node( NodeCode ) ++ ++ int NodeCode; ++{ ++ c_tree_node *TreeNode; ++ int FirstCode; ++ ++ TreeNode = c_tree_alloc_node( NodeCode ); ++ FirstCode = CFirstCode( NodeCode ); ++ ++ CTreeLineNum( TreeNode ) = c_lineno; ++ ++ if ( c_input_filename ) ++ { ++ CTreeFileName( TreeNode ) = c_input_filename; ++ } ++ else ++ { ++ if ( CTreeNameBuiltIn == (char *)0 ) ++ { ++ CTreeNameBuiltIn = autnamealloc( "" ); ++ } ++ ++ CTreeFileName( TreeNode ) = CTreeNameBuiltIn; ++ } ++ ++ ++ if ( FirstCode == C_TYPE_NODE ) ++ { ++ CTreeTypeAlign( TreeNode ) = 1; ++ CTreeTypeMainVariant( TreeNode ) = TreeNode; ++ } ++ else ++ if ( ( FirstCode == C_INT_CST_NODE ) || ++ ( FirstCode == C_REAL_CST_NODE ) || ++ ( FirstCode == C_STRING_NODE ) || ++ ( FirstCode == C_COMPLEX_NODE ) ) ++ { ++ CSetTreeNodeConstant( TreeNode ); ++ } ++ ++ ++ return( TreeNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Copy Function | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| C Tree Copy Node | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_copy_node( TreeNode ) ++ ++ c_tree_node *TreeNode; ++{ ++ c_tree_node *DupNode; ++ int NodeCode; ++ int FirstCode; ++ ++ NodeCode = CTreeNodeCode( TreeNode ); ++ FirstCode = CFirstCode( NodeCode ); ++ DupNode = c_tree_alloc_node( NodeCode ); ++ memcpy( DupNode, TreeNode, C_NODE_SIZE[ FirstCode ] ); ++ ++ CTreeChain( DupNode ) = (c_tree_node *)0; ++ ++ return( DupNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Copy List | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_copy_list( TreeNode ) ++ ++ c_tree_node *TreeNode; ++{ ++ c_tree_node *PrevNode; ++ c_tree_node *NextNode; ++ c_tree_node *HeadNode; ++ ++ if ( TreeNode == (c_tree_node *)0 ) ++ { ++ return( (c_tree_node *)0 ); ++ } ++ ++ HeadNode = c_tree_copy_node( TreeNode ); ++ PrevNode = HeadNode; ++ ++ NextNode = TreeNode->COMMON.CHAIN; ++ ++ while ( NextNode != (c_tree_node *)0 ) ++ { ++ PrevNode->COMMON.CHAIN = c_tree_copy_node( NextNode ); ++ PrevNode = PrevNode->COMMON.CHAIN; ++ NextNode = NextNode->COMMON.CHAIN; ++ } ++ ++ return( HeadNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Build Function | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Vector | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_vec( Length ) ++ ++ int Length; ++{ ++ c_tree_node *TreeNode; ++ ++ TreeNode = c_tree_add_node( C_VEC_NODE ); ++ TreeNode->VEC.LENGTH = Length; ++ TreeNode->VEC.ARRAY = c_tree_alloc_node_array( Length ); ++ ++ return( TreeNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build List | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_list( Purpose, Value ) ++ ++ c_tree_node *Purpose; ++ c_tree_node *Value; ++{ ++ c_tree_node *ListTree; ++ ++ ListTree = c_tree_add_node( C_LIST_NODE ); ++ ListTree->LIST.PURPOSE = Purpose; ++ ListTree->LIST.VALUE = Value; ++ ++ return( ListTree ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Complex | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_complex( Type, Real, Imag ) ++ ++ c_tree_node *Type; ++ c_tree_node *Real; ++ c_tree_node *Imag; ++{ ++ c_tree_node *ComplexTree; ++ ++ ComplexTree = c_tree_add_node( C_COMPLEX_NODE ); ++ ComplexTree->COMPLEX.REAL = Real; ++ ComplexTree->COMPLEX.IMAG = Imag; ++ ++ if ( Type == (c_tree_node *)0 ) ++ { ++ Type = c_tree_build_complex_type( CTreeType( Real ) ); ++ } ++ ++ return( ComplexTree ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_decl( DeclCode, TreeName, TreeType ) ++ ++ int DeclCode; ++ c_tree_node *TreeName; ++ c_tree_node *TreeType; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_add_node( DeclCode ); ++ TreeResult->DECL.NAME = TreeName; ++ TreeResult->COMMON.TYPE = TreeType; ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Instruction | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_inst( InstCode ) ++ ++ int InstCode; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_add_node( InstCode ); ++ ++ return( TreeResult ); ++ ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Type | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_type( TypeCode ) ++ ++ int TypeCode; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_add_node( TypeCode ); ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Type Copy | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_type_copy( TreeType ) ++ ++ c_tree_node *TreeType; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_copy_node( TreeType ); ++ ++ CTreeTypeNextVariant( TreeResult ) = CTreeTypeNextVariant( TreeType ); ++ CTreeTypeNextVariant( CTreeTypeMainVariant( TreeType ) ) = TreeResult; ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Type Variant | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_type_variant( TreeType, ConstP, VolatileP ) ++ ++ c_tree_node *TreeType; ++ int ConstP; ++ int VolatileP; ++{ ++ c_tree_node *TreeResult; ++ ++ ConstP = !! ConstP; ++ VolatileP = !! VolatileP; ++ ++ for ( TreeResult = CTreeTypeMainVariant( TreeType ); ++ TreeResult != (c_tree_node *)0; ++ TreeResult = CTreeTypeNextVariant( TreeResult ) ) ++ { ++ if ( ( ( !! CIsTreeNodeReadOnly( TreeResult ) ) == ConstP ) && ++ ( ( !! CIsTreeNodeVolatile( TreeResult ) ) == VolatileP ) && ++ ( CTreeTypeName( TreeResult ) == CTreeTypeName( TreeType ) ) ) ++ { ++ return( TreeResult ); ++ } ++ } ++ ++ TreeResult = c_tree_build_type_copy( TreeType ); ++ ++ if ( ConstP ) CSetTreeNodeReadOnly( TreeType ); ++ if ( VolatileP ) CSetTreeNodeVolatile( TreeType ); ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Type Attribute Variant | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_type_attribute_variant( TreeType, TreeAttr ) ++ ++ c_tree_node *TreeType; ++ c_tree_node *TreeAttr; ++{ ++ /* Rien a voir avec l'original car les attributs ne nous interessent pas */ ++ ++ return( c_tree_build_type_variant( TreeType, ++ CIsTreeNodeReadOnly( TreeType ), ++ CIsTreeNodeVolatile( TreeType ) ) ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Function Type | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_function_type( ValueType, ArgTypes ) ++ ++ c_tree_node *ValueType; ++ c_tree_node *ArgTypes; ++{ ++ c_tree_node *TreeResult; ++ ++ if ( CTreeTypeCode( ValueType ) == C_FUNCTION_TYPE ) ++ { ++ error("function return type cannot be function"); ++ ValueType = c_integer_type_node; ++ } ++ ++ TreeResult = c_tree_build_type( C_FUNCTION_TYPE ); ++ CTreeType( TreeResult ) = ValueType; ++ CTreeTypeValues( TreeResult ) = ArgTypes; ++ ++ /* ++ if ( CTreeTypeSize( TreeResult ) == 0 ) ++ { ++ c_layout_type( TreeResult ); ++ } ++ */ ++ ++ c_layout_type( TreeResult ); ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Complex Type | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_complex_type( Component ) ++ ++ c_tree_node *Component; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_build_type( C_COMPLEX_TYPE ); ++ TreeResult->COMMON.TYPE = CTreeTypeMainVariant( Component ); ++ ++ if ( CIsTreeNodeVolatile( Component ) ) ++ { ++ CSetTreeNodeVolatile( TreeResult ); ++ } ++ ++ if ( CIsTreeNodeReadOnly( Component ) ) ++ { ++ CSetTreeNodeReadOnly( TreeResult ); ++ } ++ ++ c_layout_type( TreeResult ); ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Signed Type | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_signed_type( Precision ) ++ ++ int Precision; ++{ ++ c_tree_node *TreeResult; ++ c_tree_node *TreeMin; ++ c_tree_node *TreeMax; ++ ++ TreeResult = c_tree_build_type( C_INTEGER_TYPE ); ++ CTreeTypePrecision( TreeResult ) = Precision; ++ ++ TreeMin = c_tree_build_int_2((Precision - C_HOST_BITS_PER_WIDE_INT > 0 ++ ? 0 : (C_HOST_WIDE_INT) (-1) << (Precision - 1)), ++ (((C_HOST_WIDE_INT) (-1) ++ << (Precision - C_HOST_BITS_PER_WIDE_INT - 1 > 0 ++ ? Precision - C_HOST_BITS_PER_WIDE_INT - 1 ++ : 0)))); ++ TreeMax = c_tree_build_int_2((Precision - C_HOST_BITS_PER_WIDE_INT > 0 ++ ? -1 : ((C_HOST_WIDE_INT) 1 << (Precision - 1)) - 1), ++ (Precision - C_HOST_BITS_PER_WIDE_INT - 1 > 0 ++ ? (((C_HOST_WIDE_INT) 1 ++ << (Precision - C_HOST_BITS_PER_WIDE_INT - 1))) - 1 ++ : 0)); ++ ++ CTreeType( TreeMin ) = TreeResult; ++ CTreeType( TreeMax ) = TreeResult; ++ ++ CTreeTypeMinValue( TreeResult ) = TreeMin; ++ CTreeTypeMaxValue( TreeResult ) = TreeMax; ++ ++ if ( c_size_type == (c_tree_node *)0 ) ++ { ++ c_size_type = TreeResult; ++ } ++ ++ c_layout_type( TreeResult ); ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Unsigned Type | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_unsigned_type( Precision ) ++ ++ int Precision; ++{ ++ c_tree_node *TreeResult; ++ c_tree_node *TreeMin; ++ c_tree_node *TreeMax; ++ ++ TreeResult = c_tree_build_type( C_INTEGER_TYPE ); ++ CTreeTypePrecision( TreeResult ) = Precision; ++ CSetTreeNodeUnsigned( TreeResult ); ++ ++ TreeMin = c_tree_build_int_2( 0, 0 ); ++ TreeMax = c_tree_build_int_2( Precision - C_HOST_BITS_PER_WIDE_INT >= 0 ++ ? -1 : ((C_HOST_WIDE_INT) 1 << Precision) - 1, ++ Precision - C_HOST_BITS_PER_WIDE_INT > 0 ++ ? ((unsigned C_HOST_WIDE_INT) ~0 ++ >> (C_HOST_BITS_PER_WIDE_INT ++ - (Precision - C_HOST_BITS_PER_WIDE_INT))) ++ : 0); ++ ++ CTreeType( TreeMin ) = TreeResult; ++ CTreeType( TreeMax ) = TreeResult; ++ ++ CTreeTypeMinValue( TreeResult ) = TreeMin; ++ CTreeTypeMaxValue( TreeResult ) = TreeMax; ++ ++ c_layout_type( TreeResult ); ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Pointer Type | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_pointer_type( TreeType ) ++ ++ c_tree_node *TreeType; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = TreeType->TYPE.POINTER_TO; ++ ++ if ( TreeResult == (c_tree_node *)0 ) ++ { ++ TreeResult = c_tree_build_type( C_POINTER_TYPE ); ++ TreeResult->COMMON.TYPE = TreeType; ++ TreeType->TYPE.POINTER_TO = TreeResult; ++ ++ c_layout_type( TreeResult ); ++ } ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Array Type | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_array_type( ElemType, IndexType ) ++ ++ c_tree_node *ElemType; ++ c_tree_node *IndexType; ++{ ++ c_tree_node *TreeResult; ++ ++ if ( CTreeTypeCode( ElemType ) == C_FUNCTION_TYPE ) ++ { ++ error("arrays of functions are not meaningful"); ++ ElemType = c_integer_type_node; ++ } ++ ++ c_tree_build_pointer_type( ElemType ); ++ ++ TreeResult = c_tree_build_type( C_ARRAY_TYPE ); ++ ++ CTreeType( TreeResult ) = ElemType; ++ CTreeTypeValues( TreeResult ) = IndexType; ++ ++ if ( IndexType == (c_tree_node *)0 ) ++ { ++ return( TreeResult ); ++ } ++ ++ if ( CTreeTypeSize( TreeResult ) == (c_tree_node *)0 ) ++ { ++ c_layout_type( TreeResult ); ++ } ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Index Type | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_index_type( MaxVal ) ++ ++ c_tree_node *MaxVal; ++{ ++ c_tree_node *IndexType; ++ ++ IndexType = c_tree_build_type( C_INTEGER_TYPE ); ++ CTreeTypePrecision( IndexType ) = CTreeTypePrecision( c_size_type ); ++ ++ CTreeTypeMinValue( IndexType ) = c_size_zero_node; ++ CTreeTypeMaxValue( IndexType ) = c_convert_expr( c_size_type, MaxVal ); ++ ++ CTreeTypeMode( IndexType ) = CTreeTypeMode( c_size_type ); ++ CTreeTypeSize( IndexType ) = CTreeTypeSize( c_size_type ); ++ CTreeTypeAlign( IndexType ) = CTreeTypeAlign( c_size_type ); ++ ++ ++ if ( CTreeNodeFirstCode( MaxVal ) == C_INST_NODE ) ++ { ++ /* If the domain should be empty, make sure the maxval remains -1 and is not ++ * spoiled by truncation. */ ++ ++ if ( INT_CST_LT( MaxVal, c_integer_zero_node)) ++ { ++ CTreeTypeMaxValue( IndexType ) = c_tree_build_int_2(-1, -1); ++ CTreeType( CTreeTypeMaxValue( IndexType ) ) = c_size_type; ++ } ++ } ++ ++ return( IndexType ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Unary Expr | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_unary_expr( ExprCode, TreeExpr ) ++ ++ int ExprCode; ++ c_tree_node *TreeExpr; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_add_node( ExprCode ); ++ TreeResult->EXPR.OPERANDS = c_tree_alloc_node_array( 1 ); ++ TreeResult->EXPR.NUM_OPER = 1; ++ ++ TreeResult->EXPR.OPERANDS[ 0 ] = TreeExpr; ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Binary Expr | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_binary_expr( ExprCode, TreeExpr1, TreeExpr2 ) ++ ++ int ExprCode; ++ c_tree_node *TreeExpr1; ++ c_tree_node *TreeExpr2; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_add_node( ExprCode ); ++ TreeResult->EXPR.OPERANDS = c_tree_alloc_node_array( 2 ); ++ TreeResult->EXPR.NUM_OPER = 2; ++ ++ TreeResult->EXPR.OPERANDS[ 0 ] = TreeExpr1; ++ TreeResult->EXPR.OPERANDS[ 1 ] = TreeExpr2; ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Ternary Expr | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_ternary_expr( ExprCode, TreeExpr1, TreeExpr2, TreeExpr3 ) ++ ++ int ExprCode; ++ c_tree_node *TreeExpr1; ++ c_tree_node *TreeExpr2; ++ c_tree_node *TreeExpr3; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_add_node( ExprCode ); ++ TreeResult->EXPR.OPERANDS = c_tree_alloc_node_array( 3 ); ++ TreeResult->EXPR.NUM_OPER = 3; ++ ++ TreeResult->EXPR.OPERANDS[ 0 ] = TreeExpr1; ++ TreeResult->EXPR.OPERANDS[ 1 ] = TreeExpr2; ++ TreeResult->EXPR.OPERANDS[ 2 ] = TreeExpr3; ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Real | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_real( TreeType, Value ) ++ ++ c_tree_node *TreeType; ++ double Value; ++{ ++ c_tree_node *RealCstTree; ++ ++ RealCstTree = c_tree_add_node( C_REAL_CST_NODE ); ++ RealCstTree->REAL_CST.VALUE = Value; ++ RealCstTree->COMMON.TYPE = TreeType; ++ ++ return( RealCstTree ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Integer | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_int_2( Low, High ) ++ ++ long Low; ++ long High; ++{ ++ c_tree_node *IntCstTree; ++ ++ IntCstTree = c_tree_add_node( C_INT_CST_NODE ); ++ IntCstTree->INT_CST.LOW = Low; ++ IntCstTree->INT_CST.HIGH = High; ++ IntCstTree->COMMON.TYPE = c_integer_type_node; ++ ++ return( IntCstTree ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build String | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_string( Length, Text ) ++ ++ int Length; ++ char *Text; ++{ ++ c_tree_node *TreeString; ++ ++ Text = autnamealloc( Text ); ++ ++ TreeString = c_tree_add_node( C_STRING_NODE ); ++ TreeString->STRING.LENGTH = Length; ++ TreeString->STRING.POINTER = Text; ++ ++ return( TreeString ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Build Pointer Declarator | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_build_pointer_declarator( TreeTypeQual, TreeTarget ) ++ ++ c_tree_node *TreeTypeQual; ++ c_tree_node *TreeTarget; ++{ ++ c_tree_node *TreeResult; ++ ++ TreeResult = c_tree_build_unary_expr( C_INDIRECT_REF, TreeTarget ); ++ CTreeType( TreeResult ) = TreeTypeQual; ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Combine Function | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_combine_strings( TreeString ) ++ ++ c_tree_node *TreeString; ++{ ++ c_tree_node *TreeResult; ++ c_tree_node *ScanString; ++ c_tree_node *TreeType; ++ char *Name; ++ char *Buffer; ++ char *Scan; ++ int Length; ++ int TotalLength; ++ ++ if ( CTreeChain( TreeString ) != (c_tree_node *)0 ) ++ { ++ TotalLength = 1; ++ ++ for ( ScanString = TreeString; ++ ScanString != (c_tree_node *)0; ++ ScanString = CTreeChain( ScanString ) ) ++ { ++ c_fprintf( stdout, "%s %d\n", ++ CTreeStringPointer( ScanString ), ++ CTreeStringLength( ScanString ) ); ++ TotalLength += (CTreeStringLength( ScanString ) - 1); ++ } ++ ++ /* If anything is wide, the non-wides will be converted, ++ which makes them take more space. */ ++ ++ Buffer = autallocblock( TotalLength ); ++ Buffer[ 0 ] = '"'; ++ Scan = Buffer + 1; ++ ++ for ( ScanString = TreeString; ++ ScanString != (c_tree_node *)0; ++ ScanString = CTreeChain( ScanString ) ) ++ { ++ Name = CTreeStringPointer( ScanString ) + 1; ++ Length = CTreeStringLength( ScanString ) - 1; ++ ++ strncpy( Scan, Name, Length ); ++ Scan += (Length - 1); ++ } ++ ++ TreeResult = c_tree_build_string( TotalLength, Buffer ); ++ autfreeblock( Buffer ); ++ } ++ else ++ { ++ TreeResult = TreeString; ++ TotalLength = CTreeStringLength( TreeString ); ++ } ++ ++ /* Create the array type for the string constant. ++ -Wwrite-strings says make the string constant an array of const char ++ so that copying it to a non-const pointer will get a warning. */ ++ ++ if ( ( c_warn_write_strings ) && ++ (! c_flag_traditional ) && ++ (! c_flag_writable_strings ) ) ++ { ++ TreeType = c_tree_build_type_variant( c_char_type_node, 1, 0); ++ ++ CTreeType( TreeResult ) = ++ c_tree_build_array_type( TreeType, ++ c_tree_build_index_type( c_tree_build_int_2( TotalLength - 1, 0))); ++ } ++ else ++ { ++ CTreeType( TreeResult ) = ++ c_tree_build_array_type( c_char_type_node, ++ c_tree_build_index_type( c_tree_build_int_2( TotalLength - 1, 0))); ++ } ++ ++ CSetTreeNodeConstant( TreeResult ); ++ CSetTreeNodeStatic( TreeResult ); ++ ++ return( TreeResult ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Get Function | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| C Tree Get Size Int | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_get_size_int( Number ) ++ ++ int Number; ++{ ++ c_tree_node *TreeNode; ++ ++ TreeNode = c_tree_build_int_2( Number, 0 ); ++ CTreeType( TreeNode ) = c_size_type; ++ ++ return( TreeNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Get List Length | ++| | ++\------------------------------------------------------------*/ ++ ++int c_tree_get_list_length( ListTree ) ++ ++ c_tree_node *ListTree; ++{ ++ int Length; ++ ++ Length = 0; ++ ++ while ( ListTree != (c_tree_node *)0 ) ++ { ++ ListTree = CTreeChain( ListTree ); ++ Length++; ++ } ++ ++ return( Length ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Get Identifier | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_get_identifier( Text ) ++ ++ char *Text; ++{ ++ c_tree_node *TreeNode; ++ authelem *Element; ++ ++ Text = autnamealloc( Text ); ++ ++ if ( CTreeHashIdentifier == (authtable *)0 ) ++ { ++ CTreeHashIdentifier = createauthtable( 1000 ); ++ } ++ ++ Element = searchauthelem( CTreeHashIdentifier, Text ); ++ ++ if ( Element == (authelem *)0 ) ++ { ++ TreeNode = c_tree_add_node( C_IDENTIFIER_NODE ); ++ TreeNode->IDENT.LENGTH = strlen( Text ); ++ TreeNode->IDENT.POINTER = Text; ++ ++ addauthelem( CTreeHashIdentifier, Text, (long)TreeNode ); ++ } ++ else ++ { ++ TreeNode = (c_tree_node *)Element->VALUE; ++ } ++ ++ return( TreeNode ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Concat List | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_concat_list( ListTree1, ListTree2 ) ++ ++ c_tree_node *ListTree1; ++ c_tree_node *ListTree2; ++{ ++ c_tree_node *ScanTree; ++ ++ if ( ListTree1 == (c_tree_node *)0 ) ++ { ++ return( ListTree2 ); ++ } ++ ++ for ( ScanTree = ListTree1; ++ ScanTree != (c_tree_node *)0; ++ ScanTree = ScanTree->COMMON.CHAIN ) ++ { ++ if ( ScanTree->COMMON.CHAIN == (c_tree_node *)0 ) ++ { ++ ScanTree->COMMON.CHAIN = ListTree2; break; ++ } ++ } ++ ++ return( ListTree1 ); ++} ++ ++/* Return first list element whose TREE_PURPOSE is ELEM. ++ Return 0 if ELEM is not in LIST. */ ++ ++c_tree_node *c_tree_get_purpose_member(elem, list) ++ c_tree_node *elem; ++ c_tree_node *list; ++{ ++ while (list) ++ { ++ if (elem == CTreeListPurpose(list)) ++ return list; ++ list = CTreeChain(list); ++ } ++ return (c_tree_node *)0; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Add Head List | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_add_head_list( Purpose, Value, ListTree ) ++ ++ c_tree_node *Purpose; ++ c_tree_node *Value; ++ c_tree_node *ListTree; ++{ ++ c_tree_node *HeadTree; ++ ++ HeadTree = c_tree_add_node( C_LIST_NODE ); ++ HeadTree->LIST.PURPOSE = Purpose; ++ HeadTree->LIST.VALUE = Value; ++ HeadTree->COMMON.CHAIN = ListTree; ++ ++ return( HeadTree ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Is Int Cst Signed | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return an indication of the sign of the integer constant T. ++ The return value is -1 if T < 0, 0 if T == 0, and 1 if T > 0. ++ Note that -1 will never be returned it T's type is unsigned. */ ++ ++int c_tree_is_int_cst_sgn (t) ++ ++ c_tree_node *t; ++{ ++ if ( ( CTreeIntCstLow(t) == 0 ) && ++ ( CTreeIntCstHigh(t) == 0 ) ) ++ { ++ return 0; ++ } ++ else if ( CIsTreeNodeUnsigned( CTreeType(t))) ++ { ++ return 1; ++ } ++ else if ( CTreeIntCstHigh(t) < 0) ++ { ++ return -1; ++ } ++ else ++ { ++ return 1; ++ } ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Is Real Zero | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return 1 if EXPR is the integer constant zero or a complex constant ++ of zero. */ ++ ++int c_tree_is_real_zerop(expr) ++ ++ c_tree_node *expr; ++{ ++ CStripNops(expr); ++ ++ if ( CTreeNodeFirstCode( expr ) == C_REAL_CST_NODE ) ++ { ++ return( CTreeRealCstValue( expr ) == 0.0 ); ++ } ++ ++ if ( CTreeNodeFirstCode( expr ) == C_COMPLEX_NODE ) ++ { ++ return( c_tree_is_real_zerop( CTreeComplexReal( expr ) ) && ++ c_tree_is_real_zerop( CTreeComplexImag( expr ) ) ); ++ ++ } ++ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Is Real One | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return 1 if EXPR is the integer constant one or the corresponding ++ complex constant. */ ++ ++int c_tree_is_real_onep(expr) ++ ++ c_tree_node *expr; ++{ ++ CStripNops(expr); ++ ++ if ( CTreeNodeFirstCode( expr ) == C_REAL_CST_NODE ) ++ { ++ return( CTreeRealCstValue( expr ) == 1.0 ); ++ } ++ ++ if ( CTreeNodeFirstCode( expr ) == C_COMPLEX_NODE ) ++ { ++ return( c_tree_is_real_onep( CTreeComplexReal( expr ) ) && ++ c_tree_is_real_zerop( CTreeComplexImag( expr ) ) ); ++ ++ } ++ ++ return( 0 ); ++} ++ ++/* Return 1 if EXPR is the integer constant two or the corresponding ++ complex constant. */ ++ ++int c_tree_is_real_twop(expr) ++ ++ c_tree_node *expr; ++{ ++ CStripNops(expr); ++ ++ if ( CTreeNodeFirstCode( expr ) == C_REAL_CST_NODE ) ++ { ++ return( CTreeRealCstValue( expr ) == 2.0 ); ++ } ++ ++ if ( CTreeNodeFirstCode( expr ) == C_COMPLEX_NODE ) ++ { ++ return( c_tree_is_real_twop( CTreeComplexReal( expr ) ) && ++ c_tree_is_real_twop( CTreeComplexImag( expr ) ) ); ++ ++ } ++ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Is Int Zero | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return 1 if EXPR is the integer constant zero or a complex constant ++ of zero. */ ++ ++int c_tree_is_integer_zerop(expr) ++ ++ c_tree_node *expr; ++{ ++ CStripNops(expr); ++ ++ if ( CTreeNodeFirstCode( expr ) == C_INT_CST_NODE ) ++ { ++ return( ( CTreeIntCstLow( expr ) == 0 ) && ++ ( CTreeIntCstHigh( expr ) == 0 ) ); ++ } ++ ++ if ( CTreeNodeFirstCode( expr ) == C_COMPLEX_NODE ) ++ { ++ return( c_tree_is_integer_zerop( CTreeComplexReal( expr ) ) && ++ c_tree_is_integer_zerop( CTreeComplexImag( expr ) ) ); ++ ++ } ++ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Is Int One | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return 1 if EXPR is the integer constant one or the corresponding ++ complex constant. */ ++ ++int c_tree_is_integer_onep(expr) ++ ++ c_tree_node *expr; ++{ ++ CStripNops(expr); ++ ++ if ( CTreeNodeFirstCode( expr ) == C_INT_CST_NODE ) ++ { ++ return( ( CTreeIntCstLow( expr ) == 1 ) && ++ ( CTreeIntCstHigh( expr ) == 0 ) ); ++ } ++ ++ if ( CTreeNodeFirstCode( expr ) == C_COMPLEX_NODE ) ++ { ++ return( c_tree_is_integer_onep( CTreeComplexReal( expr ) ) && ++ c_tree_is_integer_zerop( CTreeComplexImag( expr ) ) ); ++ ++ } ++ ++ return( 0 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Is Int Less Than | ++| | ++\------------------------------------------------------------*/ ++ ++int c_tree_is_int_cst_lt(t1, t2) ++ ++ c_tree_node *t1; ++ c_tree_node *t2; ++{ ++ if (t1 == t2) ++ { ++ return 0; ++ } ++ ++ if (! CIsTreeNodeUnsigned( CTreeType(t1))) ++ { ++ return INT_CST_LT(t1, t2); ++ } ++ return INT_CST_LT_UNSIGNED(t1, t2); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Is Int Cst Equal | ++| | ++\------------------------------------------------------------*/ ++ ++/* Nonzero if integer constants T1 and T2 ++ represent the same constant value. */ ++ ++int c_tree_is_int_cst_equal(t1, t2) ++ c_tree_node *t1; ++ c_tree_node *t2; ++{ ++ if (t1 == t2) ++ return 1; ++ if (t1 == 0 || t2 == 0) ++ return 0; ++ if ( CTreeNodeFirstCode(t1) == C_INT_CST_NODE ++ && CTreeNodeFirstCode(t2) == C_INT_CST_NODE ++ && CTreeIntCstLow(t1) == CTreeIntCstLow(t2) ++ && CTreeIntCstHigh(t1) == CTreeIntCstHigh(t2)) ++ return 1; ++ return 0; ++} ++ ++ ++/* Return 1 if EXPR is an integer constant that is a power of 2 (i.e., has only ++ one bit on). */ ++ ++int c_tree_is_integer_pow2p(expr) ++ c_tree_node *expr; ++{ ++ int prec; ++ C_HOST_WIDE_INT high, low; ++ ++ CStripNops(expr); ++ ++ if (CTreeNodeCode(expr) == C_COMPLEX_NODE ++ && c_tree_is_integer_pow2p( CTreeComplexReal(expr)) ++ && c_tree_is_integer_zerop( CTreeComplexImag(expr))) ++ return 1; ++ ++ if (CTreeNodeCode(expr) != C_INT_CST_NODE || CIsTreeNodeCstOverflow(expr)) ++ return 0; ++ ++ prec = (POINTER_TYPE_P (CTreeType(expr)) ++ ? C_POINTER_SIZE : CTreeTypePrecision(CTreeType(expr))); ++ high = CTreeIntCstHigh(expr); ++ low = CTreeIntCstLow(expr); ++ ++ /* First clear all bits that are beyond the type's precision in case ++ we've been sign extended. */ ++ ++ if (prec == 2 * C_HOST_BITS_PER_WIDE_INT) ++ ; ++ else if (prec > C_HOST_BITS_PER_WIDE_INT) ++ high &= ~((C_HOST_WIDE_INT) (-1) << (prec - C_HOST_BITS_PER_WIDE_INT)); ++ else ++ { ++ high = 0; ++ if (prec < C_HOST_BITS_PER_WIDE_INT) ++ low &= ~((C_HOST_WIDE_INT) (-1) << prec); ++ } ++ ++ if (high == 0 && low == 0) ++ return 0; ++ ++ return ((high == 0 && (low & (low - 1)) == 0) ++ || (low == 0 && (high & (high - 1)) == 0)); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Reverse List | ++| | ++\------------------------------------------------------------*/ ++ ++c_tree_node *c_tree_reverse_list( t ) ++ ++ c_tree_node *t; ++{ ++ c_tree_node *prev = 0; ++ c_tree_node *decl; ++ c_tree_node *next; ++ ++ for (decl = t; decl; decl = next) ++ { ++ next = CTreeChain(decl); ++ CTreeChain(decl) = prev; ++ prev = decl; ++ } ++ ++ return prev; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree Get Last List | ++| | ++\------------------------------------------------------------*/ ++ ++/* Return the last node in a chain of nodes (chained through TREE_CHAIN). */ ++ ++c_tree_node *c_tree_get_last_list(chain) ++ ++ c_tree_node *chain; ++{ ++ c_tree_node *next; ++ if (chain) ++ { ++ while ((next = CTreeChain(chain)) != NULL ) ++ { ++ chain = next; ++ } ++ } ++ return chain; ++} ++ ++/* Same as above, but only builds for unary operators. ++ Saves lions share of calls to `build'; cuts down use ++ of varargs, which is expensive for RISC machines. */ ++ ++c_tree_node *c_tree_build_unary_typed_expr(code, type, node) ++ int code; ++ c_tree_node *type; ++ c_tree_node *node; ++{ ++ c_tree_node *t; ++ ++ t = c_tree_build_unary_expr( code, node ); ++ ++ CTreeType(t) = type; ++ if (node) ++ { ++ if ( CIsTreeNodeSideEffect(node)) CSetTreeNodeSideEffect(t); ++ if ( CIsTreeNodeRaises(node)) CSetTreeNodeRaises(t); ++ } ++ ++ return t; ++} ++ ++ ++c_tree_node *c_tree_build_binary_typed_expr(code, type, arg0, arg1 ) ++ int code; ++ c_tree_node *type; ++ c_tree_node *arg0; ++ c_tree_node *arg1; ++{ ++ c_tree_node *t; ++ ++ t = c_tree_build_binary_expr( code, arg0, arg1 ); ++ ++ CTreeType(t) = type; ++ if (arg0) ++ { ++ if ( CIsTreeNodeSideEffect(arg0)) CSetTreeNodeSideEffect(t); ++ if ( CIsTreeNodeRaises(arg0)) CSetTreeNodeRaises(t); ++ } ++ ++ if (arg1) ++ { ++ if ( CIsTreeNodeSideEffect(arg1)) CSetTreeNodeSideEffect(t); ++ if ( CIsTreeNodeRaises(arg1)) CSetTreeNodeRaises(t); ++ } ++ ++ return t; ++} ++ ++c_tree_node *c_tree_build_ternary_typed_expr(code, type, arg0, arg1, arg2 ) ++ int code; ++ c_tree_node *type; ++ c_tree_node *arg0; ++ c_tree_node *arg1; ++ c_tree_node *arg2; ++{ ++ c_tree_node *t; ++ ++ t = c_tree_build_ternary_expr( code, arg0, arg1, arg2 ); ++ ++ CTreeType(t) = type; ++ if (arg0) ++ { ++ if ( CIsTreeNodeSideEffect(arg0)) CSetTreeNodeSideEffect(t); ++ if ( CIsTreeNodeRaises(arg0)) CSetTreeNodeRaises(t); ++ } ++ ++ if (arg1) ++ { ++ if ( CIsTreeNodeSideEffect(arg1)) CSetTreeNodeSideEffect(t); ++ if ( CIsTreeNodeRaises(arg1)) CSetTreeNodeRaises(t); ++ } ++ ++ if (arg2) ++ { ++ if ( CIsTreeNodeSideEffect(arg2)) CSetTreeNodeSideEffect(t); ++ if ( CIsTreeNodeRaises(arg2)) CSetTreeNodeRaises(t); ++ } ++ ++ return t; ++} ++ ++/*------------------------------------------------------------\ ++| | ++| C Tree View Node | ++| | ++\------------------------------------------------------------*/ ++ ++ ++static long CViewIdent = 0; ++ ++void c_indent() ++{ ++ long Index; ++ ++ for ( Index = 1; Index < CViewIdent; Index++ ) ++ { ++ fprintf( stdout, "| " ); ++ } ++} ++ ++# define c_printf c_indent(); fprintf ++ ++void c_tree_view_node( TreeNode ) ++ ++ c_tree_node *TreeNode; ++{ ++ c_tree_node *TreeScan; ++ c_tree_node *TreeHead; ++ c_tree_node *TreeName; ++ char *Name; ++ int FirstCode; ++ int ExprCode; ++ int TypeCode; ++ int DeclCode; ++ int InstCode; ++ int CaseCode; ++ int Index; ++ int ViewList; ++ ++ if ( TreeNode == (c_tree_node *)0 ) ++ { ++ fprintf( stdout, " \n" ); ++ return; ++ } ++ ++ if ( TreeNode == c_error_mark_node ) ++ { ++ fprintf( stdout, " #ERROR#\n" ); ++ return; ++ } ++ ++ if ( CIsTreeNodeMark( TreeNode ) ) ++ { ++ FirstCode = CTreeNodeFirstCode( TreeNode ); ++ fprintf( stdout, " %s", C_NODE_CODE_NAME[ FirstCode ] ); ++ ++ switch ( FirstCode ) ++ { ++ case C_INT_CST_NODE : ++ fprintf( stdout, ",%ld,%ld", ++ CTreeIntCstLow(TreeNode), CTreeIntCstHigh(TreeNode)); ++ break; ++ ++ case C_REAL_CST_NODE : ++ fprintf( stdout, ",%g", CTreeRealCstValue( TreeNode ) ); ++ break; ++ ++ case C_STRING_NODE : ++ fprintf( stdout, ",/*%s*/", CTreeStringPointer( TreeNode ) ); ++ break; ++ ++ case C_COMPLEX_NODE : ++ break; ++ ++ case C_IDENTIFIER_NODE : ++ fprintf( stdout, ",/*%s*/", CTreeIdentPointer( TreeNode ) ); ++ break; ++ ++ case C_LIST_NODE : ++ break; ++ ++ case C_VEC_NODE : ++ break; ++ ++ case C_EXPR_NODE : ++ ExprCode = CExtraCode( CTreeExprCode( TreeNode ) ); ++ fprintf( stdout, ",%s", C_EXPR_CODE_NAME[ ExprCode ] ); ++ break; ++ ++ case C_BLOCK_NODE : ++ break; ++ ++ case C_TYPE_NODE : ++ TypeCode = CExtraCode( CTreeTypeCode( TreeNode ) ); ++ TreeName = CTreeTypeName( TreeNode ); ++ fprintf( stdout, ",%s", C_TYPE_CODE_NAME[ TypeCode ] ); ++ ++ if ( ( TreeName != (c_tree_node *)0 ) && ++ ( CTreeNodeFirstCode( TreeName ) == C_DECL_NODE ) ) ++ { ++ TreeName = CTreeDeclName( TreeName ); ++ if ( TreeName != (c_tree_node *)0 ) ++ { ++ fprintf( stdout, ",%s", CTreeIdentPointer( TreeName ) ); ++ } ++ } ++ ++ break; ++ case C_DECL_NODE : ++ DeclCode = CExtraCode( CTreeDeclCode( TreeNode ) ); ++ TreeName = CTreeDeclName( TreeNode ); ++ fprintf( stdout, ",%s", C_DECL_CODE_NAME[ DeclCode ] ); ++ ++ if ( ( TreeName != (c_tree_node *)0 ) && ++ ( CTreeNodeFirstCode( TreeName ) == C_IDENTIFIER_NODE ) ) ++ { ++ fprintf( stdout, ",/*%s*/", CTreeIdentPointer( TreeName ) ); ++ } ++ ++ break; ++ case C_INST_NODE : ++ InstCode = CExtraCode( CTreeInstCode( TreeNode ) ); ++ fprintf( stdout, ",%s", C_INST_CODE_NAME[ InstCode ] ); ++ break; ++ } ++ ++ fprintf( stdout, ",[0x%08lx]\n", (long)TreeNode ); ++ ++ return; ++ } ++ ++ CViewIdent++; ++ fprintf( stdout, "\n" ); ++ ++ TreeHead = TreeNode; ++ ViewList = 0; ++ ++ while ( TreeNode != (c_tree_node *)0 ) ++ { ++ CSetTreeNodeMark( TreeNode ); ++ ++ c_printf( stdout, "{-- COMMON ------# [0x%08lx]\n", (long)TreeNode ); ++ ++ FirstCode = CTreeNodeFirstCode( TreeNode ); ++ c_printf( stdout, "NODE_CODE : %s\n" , C_NODE_CODE_NAME[ FirstCode ] ); ++ ++ if ( CTreeChain( TreeNode ) != (c_tree_node *)0 ) ++ { ++ c_printf( stdout, "CHAIN : [0x%08lx]\n", (long)CTreeChain( TreeNode ) ); ++ } ++ else ++ { ++ c_printf( stdout, "CHAIN : \n" ); ++ } ++ ++ c_printf( stdout, "TYPE :" ); ++ ++ if ( ! C_TREE_VIEW_TYPE_NODE ) ++ { ++ if ( CTreeType( TreeNode ) != (c_tree_node *)0 ) ++ { ++ CSetTreeNodeMark( CTreeType( TreeNode ) ); ++ } ++ } ++ ++ c_tree_view_node( CTreeType( TreeNode ) ); ++ ++ c_printf( stdout, "FLAGS : 0x%08lx\n", CTreeFlags( TreeNode ) ); ++ c_printf( stdout, "USER : 0x%08lx\n", (long)CTreeUser( TreeNode ) ); ++ Name = CTreeFileName( TreeNode ); ++ c_printf( stdout, "FILE_NAME : %s\n", ( Name != (char *)0 ) ? Name : "null" ); ++ c_printf( stdout, "LINE_NUM : %d\n", CTreeLineNum( TreeNode ) ); ++ ++ c_printf( stdout, "#-- %-10s --#\n", C_NODE_CODE_NAME[ FirstCode ] ); ++ ++ switch ( FirstCode ) ++ { ++ case C_INT_CST_NODE : ++ c_printf( stdout, "LOW : %ld\n", CTreeIntCstLow( TreeNode ) ); ++ c_printf( stdout, "HIGH : %ld\n", CTreeIntCstHigh( TreeNode ) ); ++ break; ++ case C_REAL_CST_NODE : ++ c_printf( stdout, "VALUE : %g\n", CTreeRealCstValue( TreeNode ) ); ++ break; ++ case C_STRING_NODE : ++ c_printf( stdout, "LENGTH : %d\n", CTreeStringLength( TreeNode ) ); ++ c_printf( stdout, "POINTER : /*%s*/\n", CTreeStringPointer( TreeNode ) ); ++ break; ++ case C_COMPLEX_NODE : ++ c_printf( stdout, "REAL : %ld\n", (long)CTreeComplexReal( TreeNode ) ); ++ c_printf( stdout, "IMAG : %ld\n", (long)CTreeComplexImag( TreeNode ) ); ++ break; ++ case C_IDENTIFIER_NODE : ++ c_printf( stdout, "LENGTH : %d\n", CTreeIdentLength( TreeNode ) ); ++ c_printf( stdout, "POINTER : /*%s*/\n", CTreeIdentPointer( TreeNode ) ); ++ c_printf( stdout, "GLOBAL :" ); ++ c_tree_view_node( CTreeIdentGlobalValue( TreeNode ) ); ++ c_printf( stdout, "LOCAL :" ); ++ c_tree_view_node( CTreeIdentLocalValue( TreeNode ) ); ++ c_printf( stdout, "LABEL :" ); ++ c_tree_view_node( CTreeIdentLabelValue( TreeNode ) ); ++ c_printf( stdout, "IMPLICIT :" ); ++ c_tree_view_node( CTreeIdentImplicitDecl( TreeNode ) ); ++ c_printf( stdout, "ERROR :" ); ++ c_tree_view_node( CTreeIdentErrorLocus( TreeNode ) ); ++ c_printf( stdout, "LIMBO :" ); ++ c_tree_view_node( CTreeIdentLimboValue( TreeNode ) ); ++ break; ++ case C_LIST_NODE : ++ c_printf( stdout, "PURPOSE :" ); ++ c_tree_view_node( CTreeListPurpose( TreeNode ) ); ++ c_printf( stdout, "VALUE :" ); ++ c_tree_view_node( CTreeListValue( TreeNode ) ); ++ ++ ViewList = 1; ++ break; ++ case C_VEC_NODE : ++ c_printf( stdout, "LENGTH : %d\n", CTreeVecLength( TreeNode ) ); ++ ++ for ( Index = 0; Index < CTreeVecLength( TreeNode ); Index++ ) ++ { ++ TreeScan = CTreeVecElem( TreeNode, Index ); ++ c_printf( stdout, "ARRAY : %d", Index ); ++ c_tree_view_node( TreeScan ); ++ } ++ break; ++ case C_EXPR_NODE : ++ ExprCode = CExtraCode( CTreeExprCode( TreeNode ) ); ++ c_printf( stdout, "EXPR_CODE : %s\n", C_EXPR_CODE_NAME[ ExprCode ] ); ++ c_printf( stdout, "COMPLEXITY: %d\n", CTreeExprComplexity( TreeNode ) ); ++ c_printf( stdout, "NUM_OPER : %d\n", CTreeExprNumOper( TreeNode ) ); ++ ++ for ( Index = 0; Index < CTreeExprNumOper( TreeNode ); Index++ ) ++ { ++ TreeScan = CTreeExprOperand( TreeNode, Index ); ++ c_printf( stdout, "OPERANDS : %d", Index ); ++ c_tree_view_node( TreeScan ); ++ } ++ break; ++ case C_BLOCK_NODE : ++ c_printf( stdout, "VARS :" ); ++ c_tree_view_node_list( CTreeBlockVars( TreeNode ) ); ++ c_printf( stdout, "TYPE TAGS :" ); ++ c_tree_view_node( CTreeBlockTypeTags( TreeNode ) ); ++ c_printf( stdout, "BODY :" ); ++ c_tree_view_node( CTreeBlockBody( TreeNode ) ); ++ c_printf( stdout, "SUB BLOCK :" ); ++ c_tree_view_node( CTreeBlockSubBlocks( TreeNode ) ); ++ c_printf( stdout, "SUP CONT :" ); ++ c_tree_view_node( CTreeBlockSuperContext( TreeNode ) ); ++ c_printf( stdout, "AB ORIGIN :" ); ++ c_tree_view_node( CTreeBlockAbstractOrigin( TreeNode ) ); ++ break; ++ case C_TYPE_NODE : ++ TypeCode = CExtraCode( CTreeTypeCode( TreeNode ) ); ++ c_printf( stdout, "TYPE_CODE : %s\n", C_TYPE_CODE_NAME[ TypeCode ] ); ++ c_printf( stdout, "VALUES :" ); ++ c_tree_view_node( CTreeTypeValues( TreeNode ) ); ++ ++ if ( C_TREE_VIEW_SIZE_NODE ) ++ { ++ c_printf( stdout, "SIZE :" ); ++ c_tree_view_node( CTreeTypeSize( TreeNode ) ); ++ } ++ ++ c_printf( stdout, "ATTRIBUTES:" ); ++ c_tree_view_node( CTreeTypeAttributes( TreeNode ) ); ++ c_printf( stdout, "TYPE_ID : %d\n", CTreeTypeId( TreeNode ) ); ++ c_printf( stdout, "MODE : %d\n", CTreeTypeMode( TreeNode ) ); ++ c_printf( stdout, "PRECISION : %d\n", CTreeTypePrecision( TreeNode ) ); ++ c_printf( stdout, "ALIGN : %d\n", CTreeTypeAlign( TreeNode ) ); ++ c_printf( stdout, "POINTER_TO:" ); ++ c_tree_view_node( CTreeTypePointerTo( TreeNode ) ); ++ c_printf( stdout, "REF_TO :" ); ++ c_tree_view_node( CTreeTypeReferenceTo( TreeNode ) ); ++ c_printf( stdout, "NAME :" ); ++ c_tree_view_node( CTreeTypeName( TreeNode ) ); ++ c_printf( stdout, "MIN_VALUE :" ); ++ c_tree_view_node( CTreeTypeMinValue( TreeNode ) ); ++ c_printf( stdout, "MAX_VALUE :" ); ++ c_tree_view_node( CTreeTypeMaxValue( TreeNode ) ); ++ c_printf( stdout, "NEXT_VARIA:" ); ++ c_tree_view_node( CTreeTypeNextVariant( TreeNode ) ); ++ c_printf( stdout, "MAIN_VARIA:" ); ++ c_tree_view_node( CTreeTypeMainVariant( TreeNode ) ); ++ c_printf( stdout, "BINFO :" ); ++ c_tree_view_node( CTreeTypeBInfo( TreeNode ) ); ++ c_printf( stdout, "NONCOPIED :" ); ++ c_tree_view_node( CTreeTypeNonCopiedParts( TreeNode ) ); ++ c_printf( stdout, "CONTEXT :" ); ++ c_tree_view_node( CTreeTypeContext( TreeNode ) ); ++ break; ++ case C_DECL_NODE : ++ DeclCode = CExtraCode( CTreeDeclCode( TreeNode ) ); ++ c_printf( stdout, "DECL_CODE : %s\n", C_DECL_CODE_NAME[ DeclCode ] ); ++ Name = CTreeDeclFileName( TreeNode ); ++ c_printf( stdout, "DECL_ID : %d\n", CTreeDeclId( TreeNode ) ); ++ ++ if ( C_TREE_VIEW_SIZE_NODE ) ++ { ++ c_printf( stdout, "SIZE :" ); ++ c_tree_view_node( CTreeDeclSize( TreeNode ) ); ++ } ++ ++ c_printf( stdout, "MODE : %d\n", CTreeDeclMode( TreeNode ) ); ++ c_printf( stdout, "FIELD SIZE: %d\n", CTreeDeclFieldSize( TreeNode ) ); ++ c_printf( stdout, "NAME :" ); ++ c_tree_view_node( CTreeDeclName( TreeNode ) ); ++ c_printf( stdout, "CONTEXT :" ); ++ c_tree_view_node( CTreeDeclContext( TreeNode ) ); ++ c_printf( stdout, "AB ORIGIN :" ); ++ c_tree_view_node( CTreeDeclAbstractOrigin( TreeNode ) ); ++ c_printf( stdout, "ARGUMENTS :" ); ++ c_tree_view_node_list( CTreeDeclArguments( TreeNode ) ); ++ c_printf( stdout, "RESULT :" ); ++ c_tree_view_node( CTreeDeclResult( TreeNode ) ); ++ c_printf( stdout, "INITIAL :" ); ++ c_tree_view_node( CTreeDeclInitial( TreeNode ) ); ++ c_printf( stdout, "FLAGS : 0x%08lx\n", CTreeDeclFlags( TreeNode ) ); ++ ++ ViewList = CTreeDeclCode( TreeNode ) == C_FIELD_DECL; ++ break; ++ case C_INST_NODE : ++ InstCode = CExtraCode( CTreeInstCode( TreeNode ) ); ++ c_printf( stdout, "INST_CODE : %s\n", C_INST_CODE_NAME[ InstCode ] ); ++ ++ InstCode = CTreeNodeCode( TreeNode ); ++ ++ switch ( InstCode ) ++ { ++ case C_FOR_INST : ++ c_printf( stdout, "START :" ); ++ c_tree_view_node( CTreeInstForStart( TreeNode ) ); ++ c_printf( stdout, "COND :" ); ++ c_tree_view_node( CTreeInstForCond( TreeNode ) ); ++ c_printf( stdout, "INC :" ); ++ c_tree_view_node( CTreeInstForInc( TreeNode ) ); ++ c_printf( stdout, "BODY :" ); ++ c_tree_view_node( CTreeInstForBody( TreeNode ) ); ++ break; ++ case C_WHILE_INST : ++ c_printf( stdout, "COND :" ); ++ c_tree_view_node( CTreeInstWhileCond( TreeNode ) ); ++ c_printf( stdout, "BODY :" ); ++ c_tree_view_node( CTreeInstWhileBody( TreeNode ) ); ++ break; ++ case C_DO_INST : ++ c_printf( stdout, "BODY :" ); ++ c_tree_view_node( CTreeInstDoBody( TreeNode ) ); ++ c_printf( stdout, "COND :" ); ++ c_tree_view_node( CTreeInstDoCond( TreeNode ) ); ++ break; ++ case C_IF_INST : ++ c_printf( stdout, "COND :" ); ++ c_tree_view_node( CTreeInstIfCond( TreeNode ) ); ++ c_printf( stdout, "THEN :" ); ++ c_tree_view_node( CTreeInstIfThen( TreeNode ) ); ++ c_printf( stdout, "ELSE :" ); ++ c_tree_view_node( CTreeInstIfElse( TreeNode ) ); ++ break; ++ case C_GOTO_INST : ++ c_printf( stdout, "LABEL :" ); ++ c_tree_view_node( CTreeInstGotoLabel( TreeNode ) ); ++ break; ++ case C_RETURN_INST : ++ c_printf( stdout, "VALUE :" ); ++ c_tree_view_node( CTreeInstReturnValue( TreeNode ) ); ++ break; ++ case C_CONTINUE_INST : ++ break; ++ case C_BREAK_INST : ++ break; ++ case C_SWITCH_INST : ++ c_printf( stdout, "ON :" ); ++ c_tree_view_node( CTreeInstSwitchOn( TreeNode ) ); ++ c_printf( stdout, "BODY :" ); ++ c_tree_view_node( CTreeInstSwitchBody( TreeNode ) ); ++ break; ++ case C_CASE_INST : ++ CaseCode = CTreeInstCaseCode( TreeNode ); ++ c_printf( stdout, "CASE_CODE : %s\n", C_CASE_CODE_NAME[ CaseCode ] ); ++ c_printf( stdout, "FROM :" ); ++ c_tree_view_node( CTreeInstCaseFrom( TreeNode ) ); ++ c_printf( stdout, "TO :" ); ++ c_tree_view_node( CTreeInstCaseTo( TreeNode ) ); ++ break; ++ } ++ break; ++ } ++ ++ TreeNode = CTreeChain( TreeNode ); ++ c_printf( stdout, "}\n" ); ++ ++ if ( ! ViewList ) break; ++ } ++ ++ if ( C_TREE_FORCE_VIEW_NODE ) ++ { ++ for ( TreeNode = TreeHead; ++ TreeNode != (c_tree_node *)0; ++ TreeNode = CTreeChain( TreeNode ) ) ++ { ++ CClearTreeNodeMark( TreeNode ); ++ } ++ } ++ ++ CViewIdent--; ++} ++ ++void c_tree_view_node_list( TreeNode ) ++ ++ c_tree_node *TreeNode; ++{ ++ if ( TreeNode == (c_tree_node *)0 ) ++ { ++ c_tree_view_node( TreeNode ); ++ } ++ ++ while ( TreeNode != (c_tree_node *)0 ) ++ { ++ c_tree_view_node( TreeNode ); ++ TreeNode = CTreeChain( TreeNode ); ++ } ++} ++ ++char c_tree_get_code_class( NodeCode ) ++ ++ int NodeCode; ++{ ++static int LastCode = -1; ++static char LastClass = 'x'; ++ ++ int FirstCode; ++ ++ if ( NodeCode == LastCode ) return LastClass; ++ ++ LastCode = NodeCode; ++ FirstCode = CFirstCode( NodeCode ); ++ ++ if ( FirstCode == C_TYPE_NODE ) ++ { ++ LastClass = 't'; ++ } ++ else ++ if ( FirstCode == C_BLOCK_NODE ) ++ { ++ LastClass = 'b'; ++ } ++ else ++ if ( FirstCode == C_INT_CST_NODE || ++ FirstCode == C_REAL_CST_NODE || ++ FirstCode == C_STRING_NODE || ++ FirstCode == C_COMPLEX_NODE ) ++ { ++ LastClass = 'c'; ++ } ++ else ++ if ( FirstCode == C_DECL_NODE ) ++ { ++ LastClass = 'd'; ++ } ++ else ++ if ( NodeCode == C_COMPONENT_REF || ++ NodeCode == C_BIT_FIELD_REF || ++ NodeCode == C_INDIRECT_REF || ++ NodeCode == C_BUFFER_REF || ++ NodeCode == C_ARRAY_REF) ++ { ++ LastClass = 'r'; ++ } ++ else ++ if ( FirstCode == C_EXPR_NODE ) ++ { ++ if ( NodeCode == C_LT_EXPR || ++ NodeCode == C_LE_EXPR || ++ NodeCode == C_GT_EXPR || ++ NodeCode == C_GE_EXPR || ++ NodeCode == C_EQ_EXPR || ++ NodeCode == C_NE_EXPR || ++ NodeCode == C_SET_LE_EXPR ) LastClass = '<'; ++ else ++ if ( NodeCode == C_POPDHC_EXPR || ++ NodeCode == C_POPDCC_EXPR || ++ NodeCode == C_LABEL_EXPR || ++ NodeCode == C_GOTO_EXPR || ++ NodeCode == C_RETURN_EXPR || ++ NodeCode == C_EXIT_EXPR || ++ NodeCode == C_LOOP_EXPR ) LastClass = 's'; ++ else ++ if ( NodeCode == C_FIX_TRUNC_EXPR || ++ NodeCode == C_FIX_CEIL_EXPR || ++ NodeCode == C_FIX_FLOOR_EXPR || ++ NodeCode == C_FIX_ROUND_EXPR || ++ NodeCode == C_FLOAT_EXPR || ++ NodeCode == C_NEGATE_EXPR || ++ NodeCode == C_ABS_EXPR || ++ NodeCode == C_FFS_EXPR || ++ NodeCode == C_BIT_NOT_EXPR || ++ NodeCode == C_CARD_EXPR || ++ NodeCode == C_CONVERT_EXPR || ++ NodeCode == C_NOP_EXPR || ++ NodeCode == C_NON_LVALUE_EXPR || ++ NodeCode == C_CONJ_EXPR || ++ NodeCode == C_REALPART_EXPR || ++ NodeCode == C_IMAGPART_EXPR ) LastClass = '1'; ++ else ++ if ( NodeCode == C_PLUS_EXPR || ++ NodeCode == C_MINUS_EXPR || ++ NodeCode == C_MULT_EXPR || ++ NodeCode == C_TRUNC_DIV_EXPR || ++ NodeCode == C_CEIL_DIV_EXPR || ++ NodeCode == C_FLOOR_DIV_EXPR || ++ NodeCode == C_ROUND_DIV_EXPR || ++ NodeCode == C_TRUNC_MOD_EXPR || ++ NodeCode == C_CEIL_MOD_EXPR || ++ NodeCode == C_FLOOR_MOD_EXPR || ++ NodeCode == C_ROUND_MOD_EXPR || ++ NodeCode == C_RDIV_EXPR || ++ NodeCode == C_EXACT_DIV_EXPR || ++ NodeCode == C_EXPON_EXPR || ++ NodeCode == C_MIN_EXPR || ++ NodeCode == C_MAX_EXPR || ++ NodeCode == C_LSHIFT_EXPR || ++ NodeCode == C_RSHIFT_EXPR || ++ NodeCode == C_LROTATE_EXPR || ++ NodeCode == C_RROTATE_EXPR || ++ NodeCode == C_BIT_IOR_EXPR || ++ NodeCode == C_BIT_XOR_EXPR || ++ NodeCode == C_BIT_AND_EXPR || ++ NodeCode == C_BIT_ANDTC_EXPR || ++ NodeCode == C_IN_EXPR || ++ NodeCode == C_RANGE_EXPR || ++ NodeCode == C_COMPLEX_EXPR ) LastClass = '2'; ++ else ++ LastClass = 'e'; ++ } ++ else ++ { ++ LastClass = 'x'; ++ } ++ ++ return LastClass; ++} ++ ++ ++/* Return 1 if EXPR is an integer containing all 1's in as much precision as ++ it contains. Likewise for the corresponding complex constant. */ ++ ++int c_tree_is_integer_all_onesp(expr) ++ c_tree_node *expr; ++{ ++ int prec; ++ int uns; ++ ++ CStripNops(expr); ++ ++ if ( CTreeNodeCode(expr) == C_COMPLEX_NODE ++ && c_tree_is_integer_all_onesp( CTreeComplexReal(expr)) ++ && c_tree_is_integer_zerop( CTreeComplexImag(expr))) ++ return 1; ++ ++ else if (CTreeNodeCode(expr) != C_INT_CST_NODE ++ || CIsTreeNodeCstOverflow(expr)) ++ return 0; ++ ++ uns = CIsTreeNodeUnsigned(CTreeType(expr)); ++ if (!uns) ++ return CTreeIntCstLow(expr) == -1 && CTreeIntCstHigh(expr) == -1; ++ ++ /* Note that using CTreeTypePrecisionhere is wrong. We care about the ++ actual bits, not the (arbitrary) range of the type. */ ++# ifdef LUDO_NO_SKIP ++ prec = GET_MODE_BITSIZE (CTreeTypeMode(CTreeType(expr))); ++ if (prec >= HOST_BITS_PER_WIDE_INT) ++ { ++ int high_value, shift_amount; ++ ++ shift_amount = prec - HOST_BITS_PER_WIDE_INT; ++ ++ if (shift_amount > HOST_BITS_PER_WIDE_INT) ++ /* Can not handle precisions greater than twice the host int size. */ ++ abort (); ++ else if (shift_amount == HOST_BITS_PER_WIDE_INT) ++ /* Shifting by the host word size is undefined according to the ANSI ++ standard, so we must handle this as a special case. */ ++ high_value = -1; ++ else ++ high_value = ((C_C_HOST_WIDE_INT) 1 << shift_amount) - 1; ++ ++ return CTreeIntCstLow(expr) == -1 ++ && CTreeIntCstHigh(expr) == high_value; ++ } ++ else ++# endif ++ return CTreeIntCstLow(expr) == ((C_HOST_WIDE_INT) 1 << prec) - 1; ++} ++ ++void c_tree_free_all_node() ++{ ++ c_tree_node *FreeNode; ++ int Index; ++ int FirstCode; ++ ++ for ( Index = 0; Index < C_MAX_NODE_CODE; Index++ ) ++ { ++ if ( Index == C_IDENTIFIER_NODE ) continue; ++ ++ while ( C_HEAD_NODE_LIST[ Index ] != (c_tree_node *)0 ) ++ { ++ FreeNode = C_HEAD_NODE_LIST[ Index ]; ++ C_HEAD_NODE_LIST[ Index ] = FreeNode->COMMON.NEXT; ++ ++ FirstCode = CTreeNodeFirstCode( FreeNode ); ++ autfreeheap( FreeNode, C_NODE_SIZE[ FirstCode ] ); ++ } ++ } ++} +diff -Naur alliance-5.0/gcp/src/c_treecompat.h alliance/gcp/src/c_treecompat.h +--- alliance-5.0/gcp/src/c_treecompat.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_treecompat.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,109 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_treecompat.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_TREE_COMPAT_H ++# define C_TREE_COMPAT_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_NULL_TREE (c_tree_node *)0 ++ ++# define TREE_TYPE(N) CTreeType(N) ++# define TREE_CHAIN(N) CTreeChain(N) ++ ++# define TREE_INT_CST_LOW(N) CTreeIntCstLow(N) ++# define TREE_INT_CST_HIGH(N) CTreeIntCstHigh(N) ++ ++# define TYPE_MIN_VALUE(N) CTreeTypeMinValue( N ) ++# define TYPE_MAX_VALUE(N) CTreeTypeMaxValue( N ) ++ ++typedef union c_tree_node *tree; ++ ++# define NULL_TREE (tree)0 ++ ++#define INT_CST_LT(A, B) \ ++(CTreeIntCstHigh(A) < CTreeIntCstHigh(B) \ ++ || ( CTreeIntCstHigh(A) == CTreeIntCstHigh(B) \ ++ && ((unsigned int) CTreeIntCstLow(A) \ ++ < (unsigned int) CTreeIntCstLow(B)))) ++ ++ ++#define INT_CST_LT_UNSIGNED(A, B) \ ++(((unsigned int) CTreeIntCstHigh(A) \ ++ < (unsigned int) CTreeIntCstHigh(B)) \ ++ || (((unsigned int) CTreeIntCstHigh(A) \ ++ == (unsigned int ) CTreeIntCstHigh(B)) \ ++ && (((unsigned int) CTreeIntCstLow(A) \ ++ < (unsigned int) CTreeIntCstLow(B))))) ++ ++# define INTEGRAL_TYPE_P(TYPE) \ ++ ( CTreeTypeCode(TYPE) == C_INTEGER_TYPE || \ ++ CTreeTypeCode(TYPE) == C_ENUMERAL_TYPE || \ ++ CTreeTypeCode(TYPE) == C_BOOLEAN_TYPE || \ ++ CTreeTypeCode(TYPE) == C_CHAR_TYPE) ++ ++#define POINTER_TYPE_P(TYPE) \ ++ (CTreeTypeCode(TYPE) == C_POINTER_TYPE || \ ++ CTreeTypeCode(TYPE) == C_REFERENCE_TYPE) ++ ++ ++# define REAL_VALUE_TYPE double ++ ++#define REAL_VALUE_NEGATE(N) (double)(-N) ++#define REAL_VALUE_NEGATIVE(N) ((N) < 0.0) ++#define REAL_VALUES_EQUAL(A,B) ((A) == (B)) ++#define REAL_VALUES_LESS(A,B) ((A) < (B)) ++ ++#define FLOAT_TYPE_P(TYPE) \ ++ ( CTreeTypeCode(TYPE) == C_REAL_TYPE \ ++ || ( CTreeTypeCode(TYPE) == C_COMPLEX_TYPE \ ++ && CTreeTypeCode( CTreeType(TYPE)) == C_REAL_TYPE)) ++# define REAL_VALUES_IDENTICAL(A, B) (A == B) ++ ++# endif +diff -Naur alliance-5.0/gcp/src/c_tree.h alliance/gcp/src/c_tree.h +--- alliance-5.0/gcp/src/c_tree.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/c_tree.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,65 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++#ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++#endif ++/*------------------------------------------------------------\ ++| | ++| Tool : C | ++| | ++| File : c_tree.h | ++| | ++| Date : 09.07.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------------*/ ++ ++# ifndef C_TREE_H ++# define C_TREE_H ++ ++/*------------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++# endif +diff -Naur alliance-5.0/gcp/src/gcp.h alliance/gcp/src/gcp.h +--- alliance-5.0/gcp/src/gcp.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/gcp.h 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,1021 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------\ ++| | ++| Title : Structures and fonctions for GCP | ++| | ++| Date : 09.01.99 | ++| | ++| Author : Jacomme Ludovic | ++| | ++\------------------------------------------------------*/ ++ ++# ifndef GCP_101_H ++# define GCP_101_H ++ ++/*------------------------------------------------------\ ++| | ++| Constants | ++| | ++\------------------------------------------------------*/ ++ ++# ifndef __P ++# if defined(__STDC__) || defined(__GNUC__) ++# define __P(x) x ++# else ++# define __P(x) () ++# endif ++# endif ++ ++/*------------------------------------------------------------\ ++| | ++| Tree Mode Class | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_MODE_CLASS_RANDOM 0 ++# define C_MODE_CLASS_INT 1 ++# define C_MODE_CLASS_FLOAT 2 ++# define C_MODE_CLASS_PARTIAL_INT 3 ++# define C_MODE_CLASS_CC 4 ++# define C_MODE_CLASS_COMPLEX_INT 5 ++# define C_MODE_CLASS_COMPLEX_FLOAT 6 ++ ++# define C_MAX_MODE_CLASS 7 ++ ++/*------------------------------------------------------------\ ++| | ++| Tree Node | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_INT_CST_NODE 0 ++# define C_REAL_CST_NODE 1 ++# define C_STRING_NODE 2 ++# define C_COMPLEX_NODE 3 ++# define C_IDENTIFIER_NODE 4 ++# define C_LIST_NODE 5 ++# define C_VEC_NODE 6 ++# define C_EXPR_NODE 7 ++# define C_BLOCK_NODE 8 ++# define C_TYPE_NODE 9 ++# define C_DECL_NODE 10 ++# define C_INST_NODE 11 ++# define C_ERROR_NODE 12 ++ ++# define C_MAX_NODE_CODE 13 ++ ++/*------------------------------------------------------------\ ++| | ++| Tree Type | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_TREE_NODE_FIRST_CODE_MASK 0x00FF ++# define C_TREE_NODE_EXTRA_CODE_MASK 0xFF00 ++# define C_TREE_NODE_EXTRA_CODE_SHIFT 8 ++ ++# define CConcatCode(E,C) (((E) << C_TREE_NODE_EXTRA_CODE_SHIFT) | C) ++# define CFirstCode(C) ((C) & C_TREE_NODE_FIRST_CODE_MASK) ++# define CExtraCode(C) ((C) >> C_TREE_NODE_EXTRA_CODE_SHIFT) ++ ++# define C_UNKNOWN_TYPE CConcatCode(0,C_TYPE_NODE) ++# define C_VOID_TYPE CConcatCode(1,C_TYPE_NODE) ++# define C_INTEGER_TYPE CConcatCode(2,C_TYPE_NODE) ++# define C_REAL_TYPE CConcatCode(3,C_TYPE_NODE) ++# define C_COMPLEX_TYPE CConcatCode(4,C_TYPE_NODE) ++# define C_ENUMERAL_TYPE CConcatCode(5,C_TYPE_NODE) ++# define C_BOOLEAN_TYPE CConcatCode(6,C_TYPE_NODE) ++# define C_CHAR_TYPE CConcatCode(7,C_TYPE_NODE) ++# define C_POINTER_TYPE CConcatCode(8,C_TYPE_NODE) ++# define C_OFFSET_TYPE CConcatCode(9,C_TYPE_NODE) ++# define C_REFERENCE_TYPE CConcatCode(10,C_TYPE_NODE) ++# define C_METHOD_TYPE CConcatCode(11,C_TYPE_NODE) ++# define C_FILE_TYPE CConcatCode(12,C_TYPE_NODE) ++# define C_ARRAY_TYPE CConcatCode(13,C_TYPE_NODE) ++# define C_SET_TYPE CConcatCode(14,C_TYPE_NODE) ++# define C_RECORD_TYPE CConcatCode(15,C_TYPE_NODE) ++# define C_UNION_TYPE CConcatCode(16,C_TYPE_NODE) ++# define C_QUAL_UNION_TYPE CConcatCode(17,C_TYPE_NODE) ++# define C_FUNCTION_TYPE CConcatCode(18,C_TYPE_NODE) ++# define C_LANG_TYPE CConcatCode(19,C_TYPE_NODE) ++ ++# define C_MAX_TYPE_CODE 20 ++ ++/*------------------------------------------------------------\ ++| | ++| Tree Declaration | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_UNKNOWN_DECL CConcatCode(0,C_DECL_NODE) ++# define C_FUNCTION_DECL CConcatCode(1,C_DECL_NODE) ++# define C_LABEL_DECL CConcatCode(2,C_DECL_NODE) ++# define C_CONST_DECL CConcatCode(3,C_DECL_NODE) ++# define C_TYPE_DECL CConcatCode(4,C_DECL_NODE) ++# define C_VAR_DECL CConcatCode(5,C_DECL_NODE) ++# define C_PARAM_DECL CConcatCode(6,C_DECL_NODE) ++# define C_RESULT_DECL CConcatCode(7,C_DECL_NODE) ++# define C_FIELD_DECL CConcatCode(8,C_DECL_NODE) ++ ++# define C_MAX_DECL_CODE 9 ++ ++/*------------------------------------------------------------\ ++| | ++| Tree Expression | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_UNKNOWN_EXPR CConcatCode(0,C_EXPR_NODE) ++# define C_CONSTRUCTOR_EXPR CConcatCode(1,C_EXPR_NODE) ++# define C_COMPOUND_EXPR CConcatCode(2,C_EXPR_NODE) ++# define C_MODIFY_EXPR CConcatCode(3,C_EXPR_NODE) ++# define C_INIT_EXPR CConcatCode(4,C_EXPR_NODE) ++# define C_TARGET_EXPR CConcatCode(5,C_EXPR_NODE) ++# define C_COND_EXPR CConcatCode(6,C_EXPR_NODE) ++# define C_BIND_EXPR CConcatCode(7,C_EXPR_NODE) ++# define C_CALL_EXPR CConcatCode(8,C_EXPR_NODE) ++# define C_METHOD_CALL_EXPR CConcatCode(9,C_EXPR_NODE) ++# define C_WITH_CLEANUP_EXPR CConcatCode(10,C_EXPR_NODE) ++# define C_CLEANUP_POINT_EXPR CConcatCode(11,C_EXPR_NODE) ++# define C_PLACEHOLDER_EXPR CConcatCode(12,C_EXPR_NODE) ++# define C_WITH_RECORD_EXPR CConcatCode(13,C_EXPR_NODE) ++# define C_PLUS_EXPR CConcatCode(14,C_EXPR_NODE) ++# define C_MINUS_EXPR CConcatCode(15,C_EXPR_NODE) ++# define C_MULT_EXPR CConcatCode(16,C_EXPR_NODE) ++# define C_TRUNC_DIV_EXPR CConcatCode(17,C_EXPR_NODE) ++# define C_CEIL_DIV_EXPR CConcatCode(18,C_EXPR_NODE) ++# define C_FLOOR_DIV_EXPR CConcatCode(19,C_EXPR_NODE) ++# define C_ROUND_DIV_EXPR CConcatCode(20,C_EXPR_NODE) ++# define C_TRUNC_MOD_EXPR CConcatCode(21,C_EXPR_NODE) ++# define C_CEIL_MOD_EXPR CConcatCode(22,C_EXPR_NODE) ++# define C_FLOOR_MOD_EXPR CConcatCode(23,C_EXPR_NODE) ++# define C_ROUND_MOD_EXPR CConcatCode(24,C_EXPR_NODE) ++# define C_RDIV_EXPR CConcatCode(25,C_EXPR_NODE) ++# define C_EXACT_DIV_EXPR CConcatCode(26,C_EXPR_NODE) ++# define C_FIX_TRUNC_EXPR CConcatCode(27,C_EXPR_NODE) ++# define C_FIX_CEIL_EXPR CConcatCode(28,C_EXPR_NODE) ++# define C_FIX_FLOOR_EXPR CConcatCode(29,C_EXPR_NODE) ++# define C_FIX_ROUND_EXPR CConcatCode(30,C_EXPR_NODE) ++# define C_FLOAT_EXPR CConcatCode(31,C_EXPR_NODE) ++# define C_EXPON_EXPR CConcatCode(32,C_EXPR_NODE) ++# define C_NEGATE_EXPR CConcatCode(33,C_EXPR_NODE) ++# define C_MIN_EXPR CConcatCode(34,C_EXPR_NODE) ++# define C_MAX_EXPR CConcatCode(35,C_EXPR_NODE) ++# define C_ABS_EXPR CConcatCode(36,C_EXPR_NODE) ++# define C_FFS_EXPR CConcatCode(37,C_EXPR_NODE) ++# define C_LSHIFT_EXPR CConcatCode(38,C_EXPR_NODE) ++# define C_RSHIFT_EXPR CConcatCode(39,C_EXPR_NODE) ++# define C_LROTATE_EXPR CConcatCode(40,C_EXPR_NODE) ++# define C_RROTATE_EXPR CConcatCode(41,C_EXPR_NODE) ++# define C_BIT_IOR_EXPR CConcatCode(42,C_EXPR_NODE) ++# define C_BIT_XOR_EXPR CConcatCode(43,C_EXPR_NODE) ++# define C_BIT_AND_EXPR CConcatCode(44,C_EXPR_NODE) ++# define C_BIT_ANDTC_EXPR CConcatCode(45,C_EXPR_NODE) ++# define C_BIT_NOT_EXPR CConcatCode(46,C_EXPR_NODE) ++# define C_TRUTH_ANDIF_EXPR CConcatCode(47,C_EXPR_NODE) ++# define C_TRUTH_ORIF_EXPR CConcatCode(48,C_EXPR_NODE) ++# define C_TRUTH_AND_EXPR CConcatCode(49,C_EXPR_NODE) ++# define C_TRUTH_OR_EXPR CConcatCode(50,C_EXPR_NODE) ++# define C_TRUTH_XOR_EXPR CConcatCode(51,C_EXPR_NODE) ++# define C_TRUTH_NOT_EXPR CConcatCode(52,C_EXPR_NODE) ++# define C_LT_EXPR CConcatCode(53,C_EXPR_NODE) ++# define C_LE_EXPR CConcatCode(54,C_EXPR_NODE) ++# define C_GT_EXPR CConcatCode(55,C_EXPR_NODE) ++# define C_GE_EXPR CConcatCode(56,C_EXPR_NODE) ++# define C_EQ_EXPR CConcatCode(57,C_EXPR_NODE) ++# define C_NE_EXPR CConcatCode(58,C_EXPR_NODE) ++# define C_IN_EXPR CConcatCode(59,C_EXPR_NODE) ++# define C_SET_LE_EXPR CConcatCode(60,C_EXPR_NODE) ++# define C_CARD_EXPR CConcatCode(61,C_EXPR_NODE) ++# define C_RANGE_EXPR CConcatCode(62,C_EXPR_NODE) ++# define C_CONVERT_EXPR CConcatCode(63,C_EXPR_NODE) ++# define C_NOP_EXPR CConcatCode(64,C_EXPR_NODE) ++# define C_NON_LVALUE_EXPR CConcatCode(65,C_EXPR_NODE) ++# define C_SAVE_EXPR CConcatCode(66,C_EXPR_NODE) ++# define C_UNSAVE_EXPR CConcatCode(67,C_EXPR_NODE) ++# define C_RTL_EXPR CConcatCode(68,C_EXPR_NODE) ++# define C_ADDR_EXPR CConcatCode(69,C_EXPR_NODE) ++# define C_REFERENCE_EXPR CConcatCode(70,C_EXPR_NODE) ++# define C_ENTRY_VALUE_EXPR CConcatCode(71,C_EXPR_NODE) ++# define C_COMPLEX_EXPR CConcatCode(72,C_EXPR_NODE) ++# define C_CONJ_EXPR CConcatCode(73,C_EXPR_NODE) ++# define C_REALPART_EXPR CConcatCode(74,C_EXPR_NODE) ++# define C_IMAGPART_EXPR CConcatCode(75,C_EXPR_NODE) ++# define C_PREDECREMENT_EXPR CConcatCode(76,C_EXPR_NODE) ++# define C_PREINCREMENT_EXPR CConcatCode(77,C_EXPR_NODE) ++# define C_POSTDECREMENT_EXPR CConcatCode(78,C_EXPR_NODE) ++# define C_POSTINCREMENT_EXPR CConcatCode(79,C_EXPR_NODE) ++# define C_TRY_CATCH_EXPR CConcatCode(80,C_EXPR_NODE) ++# define C_POPDHC_EXPR CConcatCode(81,C_EXPR_NODE) ++# define C_POPDCC_EXPR CConcatCode(82,C_EXPR_NODE) ++# define C_LABEL_EXPR CConcatCode(83,C_EXPR_NODE) ++# define C_GOTO_EXPR CConcatCode(84,C_EXPR_NODE) ++# define C_RETURN_EXPR CConcatCode(85,C_EXPR_NODE) ++# define C_EXIT_EXPR CConcatCode(86,C_EXPR_NODE) ++# define C_LOOP_EXPR CConcatCode(87,C_EXPR_NODE) ++ ++# define C_COMPONENT_REF CConcatCode(88,C_EXPR_NODE) ++# define C_BIT_FIELD_REF CConcatCode(89,C_EXPR_NODE) ++# define C_INDIRECT_REF CConcatCode(90,C_EXPR_NODE) ++# define C_BUFFER_REF CConcatCode(91,C_EXPR_NODE) ++# define C_ARRAY_REF CConcatCode(92,C_EXPR_NODE) ++ ++# define C_MAX_EXPR_CODE 93 ++ ++/*------------------------------------------------------------\ ++| | ++| Tree Instruction | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_UNKNOWN_INST CConcatCode(0,C_INST_NODE) ++# define C_FOR_INST CConcatCode(1,C_INST_NODE) ++# define C_WHILE_INST CConcatCode(2,C_INST_NODE) ++# define C_DO_INST CConcatCode(3,C_INST_NODE) ++# define C_IF_INST CConcatCode(4,C_INST_NODE) ++# define C_GOTO_INST CConcatCode(5,C_INST_NODE) ++# define C_RETURN_INST CConcatCode(6,C_INST_NODE) ++# define C_CONTINUE_INST CConcatCode(7,C_INST_NODE) ++# define C_BREAK_INST CConcatCode(8,C_INST_NODE) ++# define C_SWITCH_INST CConcatCode(9,C_INST_NODE) ++# define C_CASE_INST CConcatCode(10,C_INST_NODE) ++ ++# define C_MAX_INST_CODE 11 ++ ++/*------------------------------------------------------------\ ++| | ++| Case Code | ++| | ++\------------------------------------------------------------*/ ++ ++# define C_STANDARD_CASE 0 ++# define C_RANGE_CASE 1 ++# define C_DEFAULT_CASE 2 ++ ++# define C_MAX_CASE_CODE 3 ++ ++/*------------------------------------------------------------\ ++| | ++| Macro | ++| | ++\------------------------------------------------------------*/ ++ ++# define c_sizeof_numbits( N ) (sizeof( N ) * 8) ++ ++# define CStripNops( E ) \ ++ \ ++ while (( CTreeExprCode( E ) == C_NOP_EXPR \ ++ || CTreeExprCode( E ) == C_CONVERT_EXPR \ ++ || CTreeExprCode( E ) == C_NON_LVALUE_EXPR) \ ++ && ( CTreeTypeMode( CTreeType( E )) \ ++ == CTreeTypeMode( CTreeType( CTreeExprOperand( E, 0))))) \ ++ ( E ) = CTreeExprOperand( E, 0); ++ ++# define CStripTypeNops( E ) \ ++ \ ++ while (( CTreeExprCode( E ) == C_NOP_EXPR \ ++ || CTreeExprCode( E ) == C_CONVERT_EXPR \ ++ || CTreeExprCode( E ) == C_NON_LVALUE_EXPR) \ ++ && ( CTreeType( E ) \ ++ == CTreeType( CTreeExprOperand( E , 0)))) \ ++ ( E ) = CTreeExprOperand( E, 0); ++ ++/*------------------------------------------------------------\ ++| | ++| Types | ++| | ++\------------------------------------------------------------*/ ++ ++# define CTreeNodeFirstCode(N) (CFirstCode((N)->COMMON.NODE_CODE)) ++# define CTreeNodeExtraCode(N) (CExtraCode((N)->COMMON.NODE_CODE)) ++ ++# define CTreeNodeCode(N) ((N)->COMMON.NODE_CODE) ++# define CTreeChain(N) ((N)->COMMON.CHAIN) ++# define CTreeType(N) ((N)->COMMON.TYPE) ++# define CTreeFlags(N) ((N)->COMMON.FLAGS) ++# define CTreeUser(N) ((N)->COMMON.USER) ++# define CTreeFileName(N) ((N)->COMMON.FILE_NAME) ++# define CTreeLineNum(N) ((N)->COMMON.LINE_NUM) ++ ++# define C_TREE_NODE_MARK_MASK 0x00001 ++# define C_TREE_NODE_EXTERNAL_MASK 0x00002 ++# define C_TREE_NODE_STATIC_MASK 0x00004 ++# define C_TREE_NODE_PUBLIC_MASK 0x00008 ++# define C_TREE_NODE_PRIVATE_MASK 0x00010 ++# define C_TREE_NODE_UNSIGNED_MASK 0x00020 ++# define C_TREE_NODE_READONLY_MASK 0x00040 ++# define C_TREE_NODE_VOLATILE_MASK 0x00080 ++# define C_TREE_NODE_CONSTANT_MASK 0x00100 ++# define C_TREE_NODE_SIDE_EFFECT_MASK 0x00200 ++# define C_TREE_NODE_CDECL_LABEL_MASK 0x00400 ++# define C_TREE_NODE_USED_MASK 0x00800 ++# define C_TREE_NODE_ASM_WRITTEN_MASK 0x01000 ++# define C_TREE_NODE_PERMANENT_MASK 0x02000 ++# define C_TREE_NODE_RAISES_MASK 0x04000 ++# define C_TREE_NODE_ADDRESSABLE_MASK 0x08000 ++# define C_TREE_NODE_OVERFLOW_MASK 0x10000 ++# define C_TREE_NODE_CST_OVERFLOW_MASK 0x20000 ++ ++# define CIsTreeNodeMark( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_MARK_MASK ) ++# define CSetTreeNodeMark( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_MARK_MASK) ++# define CClearTreeNodeMark( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_MARK_MASK) ++ ++# define CIsTreeNodeExternal( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_EXTERNAL_MASK ) ++# define CSetTreeNodeExternal( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_EXTERNAL_MASK) ++# define CClearTreeNodeExternal( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_EXTERNAL_MASK) ++ ++# define CIsTreeNodeStatic( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_STATIC_MASK ) ++# define CSetTreeNodeStatic( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_STATIC_MASK) ++# define CClearTreeNodeStatic( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_STATIC_MASK) ++ ++# define CIsTreeNodePublic( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_PUBLIC_MASK ) ++# define CSetTreeNodePublic( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_PUBLIC_MASK) ++# define CClearTreeNodePublic( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_PUBLIC_MASK) ++ ++# define CIsTreeNodePrivate( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_PRIVATE_MASK ) ++# define CSetTreeNodePrivate( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_PRIVATE_MASK) ++# define CClearTreeNodePrivate( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_PRIVATE_MASK) ++ ++# define CIsTreeNodeUnsigned( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_UNSIGNED_MASK ) ++# define CSetTreeNodeUnsigned( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_UNSIGNED_MASK) ++# define CClearTreeNodeUnsigned( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_UNSIGNED_MASK) ++ ++# define CIsTreeNodeReadOnly( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_READONLY_MASK ) ++# define CSetTreeNodeReadOnly( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_READONLY_MASK) ++# define CClearTreeNodeReadOnly( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_READONLY_MASK) ++ ++# define CIsTreeNodeVolatile( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_VOLATILE_MASK ) ++# define CSetTreeNodeVolatile( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_VOLATILE_MASK) ++# define CClearTreeNodeVolatile( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_VOLATILE_MASK) ++ ++# define CIsTreeNodeConstant( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_CONSTANT_MASK ) ++# define CSetTreeNodeConstant( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_CONSTANT_MASK) ++# define CClearTreeNodeConstant( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_CONSTANT_MASK) ++ ++# define CIsTreeNodeSideEffect( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_SIDE_EFFECT_MASK ) ++# define CSetTreeNodeSideEffect( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_SIDE_EFFECT_MASK) ++# define CClearTreeNodeSideEffect( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_SIDE_EFFECT_MASK) ++ ++# define CIsTreeNodeCDeclLabel( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_CDECL_LABEL_MASK ) ++# define CSetTreeNodeCDeclLabel( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_CDECL_LABEL_MASK) ++# define CClearTreeNodeCDeclLabel( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_CDECL_LABEL_MASK) ++ ++# define CIsTreeNodeUsed( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_USED_MASK ) ++# define CSetTreeNodeUsed( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_USED_MASK) ++# define CClearTreeNodeUsed( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_USED_MASK) ++ ++# define CIsTreeNodeAsmWritten( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_ASM_WRITTEN_MASK ) ++# define CSetTreeNodeAsmWritten( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_ASM_WRITTEN_MASK) ++# define CClearTreeNodeAsmWritten( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_ASM_WRITTEN_MASK) ++ ++# define CIsTreeNodePermanent( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_PERMANENT_MASK ) ++# define CSetTreeNodePermanent( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_PERMANENT_MASK) ++# define CClearTreeNodePermanent( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_PERMANENT_MASK) ++ ++# define CIsTreeNodeRaises( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_RAISES_MASK ) ++# define CSetTreeNodeRaises( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_RAISES_MASK) ++# define CClearTreeNodeRaises( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_RAISES_MASK) ++ ++# define CIsTreeNodeAddressable( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_ADDRESSABLE_MASK ) ++# define CSetTreeNodeAddressable( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_ADDRESSABLE_MASK) ++# define CClearTreeNodeAddressable( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_ADDRESSABLE_MASK) ++ ++# define CIsTreeNodeOverflow( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_OVERFLOW_MASK ) ++# define CSetTreeNodeOverflow( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_OVERFLOW_MASK) ++# define CClearTreeNodeOverflow( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_OVERFLOW_MASK) ++ ++# define CIsTreeNodeCstOverflow( N ) ((N)->COMMON.FLAGS & C_TREE_NODE_CST_OVERFLOW_MASK ) ++# define CSetTreeNodeCstOverflow( N ) ((N)->COMMON.FLAGS |= C_TREE_NODE_CST_OVERFLOW_MASK) ++# define CClearTreeNodeCstOverflow( N ) ((N)->COMMON.FLAGS &= ~C_TREE_NODE_CST_OVERFLOW_MASK) ++ ++ typedef struct c_tree_common ++ { ++ union c_tree_node *CHAIN; ++ union c_tree_node *TYPE; ++ union c_tree_node *NEXT; ++ char *FILE_NAME; ++ int LINE_NUM; ++ short NODE_CODE; ++ long FLAGS; ++ void *USER; ++ ++ } c_tree_common; ++ ++# define CTreeIntCstLow(N) ((N)->INT_CST.LOW) ++# define CTreeIntCstHigh(N) ((N)->INT_CST.HIGH) ++ ++ typedef struct c_tree_int_cst ++ { ++ struct c_tree_common COMMON; ++ long LOW; ++ long HIGH; ++ ++ } c_tree_int_cst; ++ ++# define CTreeRealCstValue(N) ((N)->REAL_CST.VALUE) ++ ++ typedef struct c_tree_real_cst ++ { ++ struct c_tree_common COMMON; ++ double VALUE; ++ ++ } c_tree_real_cst; ++ ++# define CTreeStringLength(N) ((int )(N)->STRING.LENGTH) ++# define CTreeStringPointer(N) ((char *)(N)->STRING.POINTER) ++ ++ typedef struct c_tree_string ++ { ++ struct c_tree_common COMMON; ++ int LENGTH; ++ char *POINTER; ++ ++ } c_tree_string; ++ ++# define CTreeComplexReal(N) ((N)->COMPLEX.REAL) ++# define CTreeComplexImag(N) ((N)->COMPLEX.IMAG) ++ ++ typedef struct c_tree_complex ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *REAL; ++ union c_tree_node *IMAG; ++ ++ } c_tree_complex; ++ ++# define CTreeIdentLength(N) ((N)->IDENT.LENGTH ) ++# define CTreeIdentPointer(N) ((N)->IDENT.POINTER) ++# define CTreeIdentGlobalValue(N) ((N)->IDENT.GLOBAL_VALUE) ++# define CTreeIdentLocalValue(N) ((N)->IDENT.LOCAL_VALUE) ++# define CTreeIdentLabelValue(N) ((N)->IDENT.LABEL_VALUE) ++# define CTreeIdentImplicitDecl(N) ((N)->IDENT.IMPLICIT_DECL) ++# define CTreeIdentErrorLocus(N) ((N)->IDENT.ERROR_LOCUS) ++# define CTreeIdentLimboValue(N) ((N)->IDENT.LIMBO_VALUE) ++ ++ typedef struct c_tree_ident ++ { ++ struct c_tree_common COMMON; ++ int LENGTH; ++ char *POINTER; ++ union c_tree_node *GLOBAL_VALUE; ++ union c_tree_node *LOCAL_VALUE; ++ union c_tree_node *LABEL_VALUE; ++ union c_tree_node *IMPLICIT_DECL; ++ union c_tree_node *ERROR_LOCUS; ++ union c_tree_node *LIMBO_VALUE; ++ ++ } c_tree_ident; ++ ++# define CTreeListPurpose( N ) ((N)->LIST.PURPOSE) ++# define CTreeListValue( N ) ((N)->LIST.VALUE) ++ ++ typedef struct c_tree_list ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *PURPOSE; ++ union c_tree_node *VALUE; ++ ++ } c_tree_list; ++ ++# define CTreeVecLength( N ) ((N)->VEC.LENGTH) ++# define CTreeVecElem( N, I ) ((N)->VEC.ARRAY[(I)]) ++ ++ typedef struct c_tree_vec ++ { ++ struct c_tree_common COMMON; ++ int LENGTH; ++ union c_tree_node **ARRAY; ++ ++ } c_tree_vec; ++ ++# define CTreeExprCode( N ) CTreeNodeCode(N) ++# define CTreeExprComplexity( N ) ((N)->EXPR.COMPLEXITY) ++# define CTreeExprNumOper( N ) ((N)->EXPR.NUM_OPER) ++# define CTreeExprOperand( N, I ) ((N)->EXPR.OPERANDS[(I)]) ++ ++ typedef struct c_tree_expr ++ { ++ struct c_tree_common COMMON; ++ int COMPLEXITY; ++ int NUM_OPER; ++ union c_tree_node **OPERANDS; ++ ++ } c_tree_expr; ++ ++# define CTreeBlockVars( N ) ((N)->BLOCK.VARS) ++# define CTreeBlockTypeTags( N ) ((N)->BLOCK.TYPE_TAGS) ++# define CTreeBlockSubBlocks( N ) ((N)->BLOCK.SUB_BLOCKS) ++# define CTreeBlockSuperContext( N ) ((N)->BLOCK.SUPER_CONTEXT) ++# define CTreeBlockAbstractOrigin( N ) ((N)->BLOCK.ABSTRACT_ORIGIN) ++# define CTreeBlockBody( N ) ((N)->BLOCK.BODY) ++ ++ typedef struct c_tree_block ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *VARS; ++ union c_tree_node *TYPE_TAGS; ++ union c_tree_node *SUB_BLOCKS; ++ union c_tree_node *SUPER_CONTEXT; ++ union c_tree_node *ABSTRACT_ORIGIN; ++ union c_tree_node *BODY; ++ ++ } c_tree_block; ++ ++# define CTreeTypeCode( N ) CTreeNodeCode(N) ++# define CTreeTypeValues( N ) ((N)->TYPE.VALUES) ++# define CTreeTypeSize( N ) ((N)->TYPE.SIZE) ++# define CTreeTypeAttributes( N ) ((N)->TYPE.ATTRIBUTES) ++# define CTreeTypeId( N ) ((N)->TYPE.TYPE_ID) ++# define CTreeTypeMode( N ) ((N)->TYPE.MODE) ++# define CTreeTypePrecision( N ) ((N)->TYPE.PRECISION) ++# define CTreeTypeAlign( N ) ((N)->TYPE.ALIGN) ++# define CTreeTypePointerTo( N ) ((N)->TYPE.POINTER_TO) ++# define CTreeTypeReferenceTo( N ) ((N)->TYPE.REFERENCE_TO) ++# define CTreeTypeName( N ) ((N)->TYPE.NAME) ++# define CTreeTypeMinValue( N ) ((N)->TYPE.MIN_VALUE) ++# define CTreeTypeMaxValue( N ) ((N)->TYPE.MAX_VALUE) ++# define CTreeTypeNextVariant( N ) ((N)->TYPE.NEXT_VARIANT) ++# define CTreeTypeMainVariant( N ) ((N)->TYPE.MAIN_VARIANT) ++# define CTreeTypeBInfo( N ) ((N)->TYPE.BINFO) ++# define CTreeTypeNonCopiedParts( N ) ((N)->TYPE.NONCOPIED_PARTS) ++# define CTreeTypeContext( N ) ((N)->TYPE.CONTEXT) ++ ++# define C_TREE_TYPE_VAR_SIZE_MASK 0x01 ++# define C_TREE_TYPE_TRANS_UNION_MASK 0x02 ++# define C_TREE_TYPE_FIELDS_RD_ONLY_MASK 0x04 ++# define C_TREE_TYPE_FIELDS_VOLAT_MASK 0x08 ++ ++# define CIsTreeTypeVarSize( N ) ((N)->TYPE.FLAGS & C_TREE_TYPE_VAR_SIZE_MASK ) ++# define CSetTreeTypeVarSize( N ) ((N)->TYPE.FLAGS |= C_TREE_TYPE_VAR_SIZE_MASK) ++# define CClearTreeTypeVarSize( N ) ((N)->TYPE.FLAGS &= ~C_TREE_TYPE_VAR_SIZE_MASK) ++ ++# define CIsTreeTypeTransUnion( N ) ((N)->TYPE.FLAGS & C_TREE_TYPE_TRANS_UNION_MASK ) ++# define CSetTreeTypeTransUnion( N ) ((N)->TYPE.FLAGS |= C_TREE_TYPE_TRANS_UNION_MASK) ++# define CClearTreeTypeTransUnion( N ) ((N)->TYPE.FLAGS &= ~C_TREE_TYPE_TRANS_UNION_MASK) ++ ++# define CIsTreeTypeFieldsReadOnly(N) ((N)->TYPE.FLAGS & C_TREE_TYPE_FIELDS_RD_ONLY_MASK ) ++# define CSetTreeTypeFieldsReadOnly(N) ((N)->TYPE.FLAGS |= C_TREE_TYPE_FIELDS_RD_ONLY_MASK) ++# define CClearTreeTypeFieldsReadOnly(N) ((N)->TYPE.FLAGS &= ~C_TREE_TYPE_FIELDS_RD_ONLY_MASK) ++ ++# define CIsTreeTypeFieldsVolatile( N ) ((N)->TYPE.FLAGS & C_TREE_TYPE_FIELDS_VOLAT_MASK ) ++# define CSetTreeTypeFieldsVolatile( N ) ((N)->TYPE.FLAGS |= C_TREE_TYPE_FIELDS_VOLAT_MASK) ++# define CClearTreeTypeFieldsVolatile( N ) ((N)->TYPE.FLAGS &= ~C_TREE_TYPE_FIELDS_VOLAT_MASK) ++ ++ ++ ++ typedef struct c_tree_type ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *VALUES; ++ union c_tree_node *SIZE; ++ union c_tree_node *ATTRIBUTES; ++ int TYPE_ID; ++ int MODE; ++ unsigned char PRECISION; ++ unsigned char UNSIGNED; ++ int ALIGN; ++ union c_tree_node *POINTER_TO; ++ union c_tree_node *REFERENCE_TO; ++ union c_tree_node *NAME; ++ union c_tree_node *MIN_VALUE; ++ union c_tree_node *MAX_VALUE; ++ union c_tree_node *NEXT_VARIANT; ++ union c_tree_node *MAIN_VARIANT; ++ union c_tree_node *BINFO; ++ union c_tree_node *NONCOPIED_PARTS; ++ union c_tree_node *CONTEXT; ++ long FLAGS; ++ ++ } c_tree_type; ++ ++# define CTreeDeclCode(N) CTreeNodeCode(N) ++# define CTreeDeclFileName(N) CTreeFileName(N) ++# define CTreeDeclLineNum(N) CTreeLineNum(N) ++# define CTreeDeclId(N) ((N)->DECL.DECL_ID) ++# define CTreeDeclSize(N) ((N)->DECL.SIZE) ++# define CTreeDeclMode(N) ((N)->DECL.MODE) ++# define CTreeDeclFieldSize(N) ((N)->DECL.FIELD_SIZE) ++# define CTreeDeclName(N) ((N)->DECL.NAME) ++# define CTreeDeclContext(N) ((N)->DECL.CONTEXT) ++# define CTreeDeclAbstractOrigin(N) ((N)->DECL.ABSTRACT_ORIGIN) ++# define CTreeDeclArguments(N) ((N)->DECL.ARGUMENTS) ++# define CTreeDeclResult(N) ((N)->DECL.RESULT) ++# define CTreeDeclInitial(N) ((N)->DECL.INITIAL) ++# define CTreeDeclFlags(N) ((N)->DECL.FLAGS) ++ ++# define C_TREE_DECL_EXTERNAL_MASK 0x0001 ++# define C_TREE_DECL_NON_LOCAL_MASK 0x0002 ++# define C_TREE_DECL_COMMON_MASK 0x0004 ++# define C_TREE_DECL_VAR_SIZE_MASK 0x0008 ++# define C_TREE_DECL_C_BIT_FIELD_MASK 0x0010 ++# define C_TREE_DECL_ITERATOR_MASK 0x0020 ++# define C_TREE_DECL_REGISTER_MASK 0x0040 ++# define C_TREE_DECL_BUILT_IN_MASK 0x0080 ++# define C_TREE_DECL_BIT_FIELD_MASK 0x0100 ++# define C_TREE_DECL_SYSTEM_HEADER_MASK 0x0100 ++# define C_TREE_DECL_IGNORED_MASK 0x0200 ++# define C_TREE_DECL_ANTICIPATED_MASK 0x0400 ++# define C_TREE_DECL_DECLARED_LABEL_MASK 0x0800 ++# define C_TREE_DECL_WEAK_MASK 0x1000 ++# define C_TREE_DECL_INLINE_MASK 0x2000 ++ ++# define CIsTreeDeclExternal( N ) ((N)->DECL.FLAGS & C_TREE_DECL_EXTERNAL_MASK ) ++# define CSetTreeDeclExternal( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_EXTERNAL_MASK) ++# define CClearTreeDeclExternal( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_EXTERNAL_MASK) ++ ++# define CIsTreeDeclNonLocal( N ) ((N)->DECL.FLAGS & C_TREE_DECL_NON_LOCAL_MASK ) ++# define CSetTreeDeclNonLocal( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_NON_LOCAL_MASK) ++# define CClearTreeDeclNonLocal( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_NON_LOCAL_MASK) ++ ++# define CIsTreeDeclCommon( N ) ((N)->DECL.FLAGS & C_TREE_DECL_COMMON_MASK ) ++# define CSetTreeDeclCommon( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_COMMON_MASK) ++# define CClearTreeDeclCommon( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_COMMON_MASK) ++ ++# define CIsTreeDeclVarSize( N ) ((N)->DECL.FLAGS & C_TREE_DECL_VAR_SIZE_MASK ) ++# define CSetTreeDeclVarSize( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_VAR_SIZE_MASK) ++# define CClearTreeDeclVarSize( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_VAR_SIZE_MASK) ++ ++# define CIsTreeDeclCBitField( N ) ((N)->DECL.FLAGS & C_TREE_DECL_C_BIT_FIELD_MASK ) ++# define CSetTreeDeclCBitField( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_C_BIT_FIELD_MASK) ++# define CClearTreeDeclCBitField( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_C_BIT_FIELD_MASK) ++ ++# define CIsTreeDeclIterator( N ) ((N)->DECL.FLAGS & C_TREE_DECL_ITERATOR_MASK) ++# define CSetTreeDeclIterator( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_ITERATOR_MASK) ++# define CClearTreeDeclIterator( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_ITERATOR_MASK) ++ ++# define CIsTreeDeclRegister( N ) ((N)->DECL.FLAGS & C_TREE_DECL_REGISTER_MASK) ++# define CSetTreeDeclRegister( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_REGISTER_MASK) ++# define CClearTreeDeclRegister( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_REGISTER_MASK) ++ ++# define CIsTreeDeclBuiltIn( N ) ((N)->DECL.FLAGS & C_TREE_DECL_BUILT_IN_MASK) ++# define CSetTreeDeclBuiltIn( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_BUILT_IN_MASK) ++# define CClearTreeDeclBuiltIn( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_BUILT_IN_MASK) ++ ++# define CIsTreeDeclBitField( N ) ((N)->DECL.FLAGS & C_TREE_DECL_BIT_FIELD_MASK ) ++# define CSetTreeDeclBitField( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_BIT_FIELD_MASK) ++# define CClearTreeDeclBitField( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_BIT_FIELD_MASK) ++ ++# define CIsTreeDeclSystemHeader( N ) ((N)->DECL.FLAGS & C_TREE_DECL_SYSTEM_HEADER_MASK ) ++# define CSetTreeDeclSystemHeader( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_SYSTEM_HEADER_MASK) ++# define CClearTreeDeclSystemHeader( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_SYSTEM_HEADER_MASK) ++ ++# define CIsTreeDeclIgnored( N ) ((N)->DECL.FLAGS & C_TREE_DECL_IGNORED_MASK ) ++# define CSetTreeDeclIgnored( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_IGNORED_MASK) ++# define CClearTreeDeclIgnored( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_IGNORED_MASK) ++ ++# define CIsTreeDeclAnticipated( N ) ((N)->DECL.FLAGS & C_TREE_DECL_ANTICIPATED_MASK ) ++# define CSetTreeDeclAnticipated( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_ANTICIPATED_MASK) ++# define CClearTreeDeclAnticipated( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_ANTICIPATED_MASK) ++ ++# define CIsTreeDeclDeclaredLabel( N ) ((N)->DECL.FLAGS & C_TREE_DECL_DECLARED_LABEL_MASK ) ++# define CSetTreeDeclDeclaredLabel( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_DECLARED_LABEL_MASK) ++# define CClearTreeDeclDeclaredLabel( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_DECLARED_LABEL_MASK) ++ ++# define CIsTreeDeclWeak( N ) ((N)->DECL.FLAGS & C_TREE_DECL_WEAK_MASK ) ++# define CSetTreeDeclWeak( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_WEAK_MASK) ++# define CClearTreeDeclWeak( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_WEAK_MASK) ++ ++# define CIsTreeDeclInline( N ) ((N)->DECL.FLAGS & C_TREE_DECL_INLINE_MASK ) ++# define CSetTreeDeclInline( N ) ((N)->DECL.FLAGS |= C_TREE_DECL_INLINE_MASK) ++# define CClearTreeDeclInline( N ) ((N)->DECL.FLAGS &= ~C_TREE_DECL_INLINE_MASK) ++ ++ typedef struct c_tree_decl ++ { ++ struct c_tree_common COMMON; ++ int DECL_ID; ++ union c_tree_node *SIZE; ++ int MODE; ++ int FIELD_SIZE; ++ union c_tree_node *NAME; ++ union c_tree_node *CONTEXT; ++ union c_tree_node *ABSTRACT_ORIGIN; ++ union c_tree_node *ARGUMENTS; ++ union c_tree_node *RESULT; ++ union c_tree_node *INITIAL; ++ long FLAGS; ++ ++ } c_tree_decl; ++ ++# define CTreeInstCaseCode(N) ((N)->INST.CLASS.CASE.CASE_CODE) ++# define CTreeInstCaseFrom(N) ((N)->INST.CLASS.CASE.FROM) ++# define CTreeInstCaseTo(N) ((N)->INST.CLASS.CASE.TO) ++ ++ typedef struct c_tree_inst_case ++ { ++ struct c_tree_common COMMON; ++ short CASE_CODE; ++ union c_tree_node *FROM; ++ union c_tree_node *TO; ++ ++ } c_tree_inst_case; ++ ++# define CTreeInstSwitchOn(N) ((N)->INST.CLASS.SWITCH.ON) ++# define CTreeInstSwitchBody(N) ((N)->INST.CLASS.SWITCH.BODY) ++ ++ typedef struct c_tree_inst_switch ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *ON; ++ union c_tree_node *BODY; ++ ++ } c_tree_inst_switch; ++ ++ typedef struct c_tree_inst_break ++ { ++ struct c_tree_common COMMON; ++ ++ } c_tree_inst_break; ++ ++ typedef struct c_tree_inst_continue ++ { ++ struct c_tree_common COMMON; ++ ++ } c_tree_inst_continue; ++ ++# define CTreeInstReturnValue(N) ((N)->INST.CLASS.RETURN.VALUE) ++ ++ typedef struct c_tree_inst_return ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *VALUE; ++ ++ } c_tree_inst_return; ++ ++# define CTreeInstGotoLabel(N) ((N)->INST.CLASS.GOTO.LABEL) ++ ++ typedef struct c_tree_inst_goto ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *LABEL; ++ ++ } c_tree_inst_goto; ++ ++# define CTreeInstForStart(N) ((N)->INST.CLASS.FOR.START) ++# define CTreeInstForCond(N) ((N)->INST.CLASS.FOR.COND) ++# define CTreeInstForInc(N) ((N)->INST.CLASS.FOR.INC) ++# define CTreeInstForBody(N) ((N)->INST.CLASS.FOR.BODY) ++ ++ typedef struct c_tree_inst_for ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *START; ++ union c_tree_node *COND; ++ union c_tree_node *INC; ++ union c_tree_node *BODY; ++ ++ } c_tree_inst_for; ++ ++# define CTreeInstWhileCond(N) ((N)->INST.CLASS.WHILE.COND) ++# define CTreeInstWhileBody(N) ((N)->INST.CLASS.WHILE.BODY) ++ ++ typedef struct c_tree_inst_while ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *COND; ++ union c_tree_node *BODY; ++ ++ } c_tree_inst_while; ++ ++# define CTreeInstDoCond(N) ((N)->INST.CLASS.DO.COND) ++# define CTreeInstDoBody(N) ((N)->INST.CLASS.DO.BODY) ++ ++ typedef struct c_tree_inst_do ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *COND; ++ union c_tree_node *BODY; ++ ++ } c_tree_inst_do; ++ ++# define CTreeInstIfCond(N) ((N)->INST.CLASS.IF.COND) ++# define CTreeInstIfThen(N) ((N)->INST.CLASS.IF.THEN) ++# define CTreeInstIfElse(N) ((N)->INST.CLASS.IF.ELSE) ++ ++ typedef struct c_tree_inst_if ++ { ++ struct c_tree_common COMMON; ++ union c_tree_node *COND; ++ union c_tree_node *THEN; ++ union c_tree_node *ELSE; ++ ++ } c_tree_inst_if; ++ ++# define CTreeInstCode(N) CTreeNodeCode(N) ++ ++ typedef struct c_tree_inst ++ { ++ struct c_tree_common COMMON; ++ union ++ { ++ c_tree_inst_for FOR; ++ c_tree_inst_while WHILE; ++ c_tree_inst_do DO; ++ c_tree_inst_if IF; ++ c_tree_inst_goto GOTO; ++ c_tree_inst_return RETURN; ++ c_tree_inst_continue CONTINUE; ++ c_tree_inst_break BREAK; ++ c_tree_inst_switch SWITCH; ++ c_tree_inst_case CASE; ++ ++ } CLASS; ++ } c_tree_inst; ++ ++ typedef union c_tree_node ++ { ++ c_tree_common COMMON; ++ c_tree_int_cst INT_CST; ++ c_tree_real_cst REAL_CST; ++ c_tree_string STRING; ++ c_tree_complex COMPLEX; ++ c_tree_ident IDENT; ++ c_tree_decl DECL; ++ c_tree_type TYPE; ++ c_tree_list LIST; ++ c_tree_vec VEC; ++ c_tree_expr EXPR; ++ c_tree_block BLOCK; ++ c_tree_inst INST; ++ ++ } c_tree_node; ++ ++/*------------------------------------------------------------\ ++| | ++| Variables | ++| | ++\------------------------------------------------------------*/ ++ ++ extern char *C_NODE_CODE_NAME[ C_MAX_NODE_CODE ]; ++ extern int C_NODE_SIZE[ C_MAX_NODE_CODE ]; ++ extern char *C_EXPR_CODE_NAME[ C_MAX_EXPR_CODE ]; ++ extern char *C_TYPE_CODE_NAME[ C_MAX_TYPE_CODE ]; ++ extern char *C_DECL_CODE_NAME[ C_MAX_DECL_CODE ]; ++ extern char *C_INST_CODE_NAME[ C_MAX_INST_CODE ]; ++ extern char *C_CASE_CODE_NAME[ C_MAX_CASE_CODE ]; ++ ++ extern short C_TREE_FORCE_VIEW_NODE; ++ extern short C_TREE_VIEW_TYPE_NODE; ++ extern short C_TREE_VIEW_SIZE_NODE; ++ extern c_tree_node *C_HEAD_NODE_LIST[ C_MAX_NODE_CODE ]; ++ ++ extern c_tree_node *c_error_mark_node; ++ extern c_tree_node *c_size_type; ++ extern c_tree_node *c_size_zero_node; ++ extern c_tree_node *c_size_one_node; ++ extern c_tree_node *c_short_integer_type_node; ++ extern c_tree_node *c_integer_type_node; ++ extern c_tree_node *c_long_integer_type_node; ++ extern c_tree_node *c_long_long_integer_type_node; ++ extern c_tree_node *c_short_unsigned_type_node; ++ extern c_tree_node *c_unsigned_type_node; ++ extern c_tree_node *c_long_unsigned_type_node; ++ extern c_tree_node *c_long_long_unsigned_type_node; ++ extern c_tree_node *c_boolean_type_node; ++ extern c_tree_node *c_boolean_false_node; ++ extern c_tree_node *c_boolean_true_node; ++ extern c_tree_node *c_ptrdiff_type_node; ++ extern c_tree_node *c_unsigned_char_type_node; ++ extern c_tree_node *c_signed_char_type_node; ++ extern c_tree_node *c_char_type_node; ++ extern c_tree_node *c_wchar_type_node; ++ extern c_tree_node *c_signed_wchar_type_node; ++ extern c_tree_node *c_unsigned_wchar_type_node; ++ extern c_tree_node *c_float_type_node; ++ extern c_tree_node *c_double_type_node; ++ extern c_tree_node *c_long_double_type_node; ++ extern c_tree_node *c_complex_integer_type_node; ++ extern c_tree_node *c_complex_float_type_node; ++ extern c_tree_node *c_complex_double_type_node; ++ extern c_tree_node *c_complex_long_double_type_node; ++ extern c_tree_node *c_void_type_node; ++ extern c_tree_node *c_ptr_type_node; ++ extern c_tree_node *c_const_ptr_type_node; ++ extern c_tree_node *c_string_type_node; ++ extern c_tree_node *c_const_string_type_node; ++ extern c_tree_node *c_char_array_type_node; ++ extern c_tree_node *c_int_array_type_node; ++ extern c_tree_node *c_wchar_array_type_node; ++ extern c_tree_node *c_default_function_type; ++ extern c_tree_node *c_double_ftype_double; ++ extern c_tree_node *c_double_ftype_double_double; ++ extern c_tree_node *c_int_ftype_int; ++ extern c_tree_node *c_long_ftype_long; ++ extern c_tree_node *c_float_ftype_float; ++ extern c_tree_node *c_ldouble_ftype_ldouble; ++ extern c_tree_node *c_void_ftype_ptr_ptr_int; ++ extern c_tree_node *c_int_ftype_ptr_ptr_int; ++ extern c_tree_node *c_void_ftype_ptr_int_int; ++ extern c_tree_node *c_string_ftype_ptr_ptr; ++ extern c_tree_node *c_int_ftype_string_string; ++ extern c_tree_node *c_int_ftype_cptr_cptr_sizet; ++ extern c_tree_node *c_integer_zero_node; ++ extern c_tree_node *c_null_pointer_node; ++ extern c_tree_node *c_integer_one_node; ++ extern c_tree_node *c_size_type; ++ extern c_tree_node *c_size_zero_node; ++ extern c_tree_node *c_size_one_node; ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++/*------------------------------------------------------------\ ++| | ++| Tree Function | ++| | ++\------------------------------------------------------------*/ ++ ++ extern c_tree_node * c_tree_alloc_node __P(()); ++ extern c_tree_node ** c_tree_alloc_node_array __P((int Length)); ++ extern c_tree_node * c_tree_add_node __P((int NodeCode)); ++ extern c_tree_node * c_tree_copy_node __P((c_tree_node *TreeNode)); ++ extern c_tree_node * c_tree_copy_list __P((c_tree_node *TreeNode)); ++ extern c_tree_node * c_tree_build_vec __P((int Length)); ++ extern c_tree_node * c_tree_build_list __P((c_tree_node *Purpose, c_tree_node *Value)); ++ extern c_tree_node * c_tree_build_complex __P((c_tree_node *Type, c_tree_node *Real, c_tree_node *Imag)); ++ extern c_tree_node * c_tree_build_decl __P((int DeclType, c_tree_node *TreeName, c_tree_node *TreeType)); ++ extern c_tree_node * c_tree_build_inst __P(( int InstCode )); ++ extern c_tree_node * c_tree_build_type __P((int TypeType)); ++ extern c_tree_node * c_tree_build_type_copy __P((c_tree_node *TreeType)); ++ extern c_tree_node * c_tree_build_type_variant __P((c_tree_node *TreeType, int ConstP, int VolatileP)); ++ extern c_tree_node * c_tree_build_function_type __P((c_tree_node *ValueType, c_tree_node *ArgTypes)); ++ extern c_tree_node * c_tree_build_complex_type __P((c_tree_node *Component)); ++ extern c_tree_node * c_tree_build_signed_type __P((int Precision)); ++ extern c_tree_node * c_tree_build_unsigned_type __P((int Precision)); ++ extern c_tree_node * c_tree_build_pointer_type __P((c_tree_node *TreeType)); ++ extern c_tree_node * c_tree_build_array_type __P((c_tree_node *ElemType, c_tree_node *IndexType)); ++ extern c_tree_node * c_tree_build_index_type __P((c_tree_node *MaxVal)); ++ extern c_tree_node * c_tree_build_unary_expr __P((int ExprCode, c_tree_node *TreeExpr)); ++ extern c_tree_node * c_tree_build_binary_expr __P((int ExprCode, c_tree_node *TreeExpr1, c_tree_node *TreeExpr2)); ++ extern c_tree_node * c_tree_build_ternary_expr __P((int ExprCode, c_tree_node *TreeExpr1, c_tree_node *TreeExpr2, c_tree_node *TreeExpr3)); ++ extern c_tree_node * c_tree_build_real __P((c_tree_node *TreeType, double Value)); ++ extern c_tree_node * c_tree_build_int_2 __P((long Low, long High)); ++ extern c_tree_node * c_tree_build_string __P((int Length, char *Text)); ++ extern c_tree_node * c_tree_build_pointer_declarator __P((c_tree_node *TreeTypeQual, c_tree_node *TreeTarget)); ++ extern c_tree_node * c_tree_combine_strings __P((c_tree_node *TreeString)); ++ extern c_tree_node * c_tree_get_size_int __P((int Number)); ++ extern int c_tree_get_list_length __P((c_tree_node *ListTree)); ++ extern c_tree_node * c_tree_get_identifier __P((char *Text)); ++ extern c_tree_node * c_tree_concat_list __P((c_tree_node *ListTree1, c_tree_node *ListTree2)); ++ extern c_tree_node * c_tree_add_head_list __P((c_tree_node *Purpose, c_tree_node *Value, c_tree_node *ListTree)); ++ extern int c_tree_is_int_cst_sgn __P((c_tree_node *t)); ++ extern int c_tree_is_real_zerop __P((c_tree_node *expr)); ++ extern int c_tree_is_real_onep __P((c_tree_node *expr)); ++ extern int c_tree_is_real_twop __P((c_tree_node *expr)); ++ extern int c_tree_is_integer_zerop __P((c_tree_node *expr)); ++ extern int c_tree_is_integer_onep __P((c_tree_node *expr)); ++ extern int c_tree_is_integer_all_onesp __P((c_tree_node *expr)); ++ extern int c_tree_is_int_cst_lt __P((c_tree_node *t1, c_tree_node *t2)); ++ extern int c_tree_is_int_cst_equal __P((c_tree_node *t1, c_tree_node *t2)); ++ extern int c_tree_is_integer_pow2p __P((c_tree_node *expr)); ++ extern c_tree_node * c_tree_reverse_list __P((c_tree_node *t)); ++ extern c_tree_node * c_tree_get_last_list __P((c_tree_node *chain)); ++ extern void c_indent __P(()); ++ extern void c_tree_view_node __P((c_tree_node *TreeNode)); ++ extern void c_tree_view_node_list __P((c_tree_node *TreeNode)); ++ ++ extern c_tree_node * c_tree_build_type_attribute_variant __P((c_tree_node *TreeType, c_tree_node *TreeAttr )); ++ extern c_tree_node * c_tree_build_unary_typed_expr __P((int code, c_tree_node *type, c_tree_node *node)); ++ extern c_tree_node * c_tree_build_binary_typed_expr __P((int code, c_tree_node *type, c_tree_node * arg0, c_tree_node * arg1 )); ++ extern c_tree_node * c_tree_build_ternary_typed_expr __P((int code, c_tree_node *type, c_tree_node *arg0, c_tree_node *arg1, c_tree_node *arg2 )); ++ extern c_tree_node * c_tree_get_purpose_member __P((c_tree_node *elem, c_tree_node *list)); ++ ++ extern char c_tree_get_code_class __P(( int NodeCode )); ++ ++ extern void c_tree_free_all_node __P(()); ++ ++/*------------------------------------------------------------\ ++| | ++| Parse Function | ++| | ++\------------------------------------------------------------*/ ++ ++ extern c_tree_node *c_tree_parse_file __P((char *InputFileName, int Argc, char **Argv)); ++ ++# endif +diff -Naur alliance-5.0/gcp/src/main.c alliance/gcp/src/main.c +--- alliance-5.0/gcp/src/main.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/main.c 2002-09-30 18:20:20.000000000 +0200 +@@ -0,0 +1,187 @@ ++/*------------------------------------------------------------\ ++| | ++| This file is part of the Alliance CAD System Copyright | ++| (C) Laboratoire LIP6 - Dpartement ASIM Universite P&M Curie| ++| | ++| Home page : http://www-asim.lip6.fr/alliance/ | ++| E-mail : mailto:alliance-users@asim.lip6.fr | ++| | ++| This progam is free software; you can redistribute it | ++| and/or modify it under the terms of the GNU Library General| ++| Public License as published by the Free Software Foundation | ++| either version 2 of the License, or (at your option) any | ++| later version. | ++| | ++| Alliance VLSI CAD System is distributed in the hope that | ++| it will be useful, but WITHOUT ANY WARRANTY; | ++| without even the implied warranty of MERCHANTABILITY or | ++| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ++| Public License for more details. | ++| | ++| You should have received a copy of the GNU General Public | ++| License along with the GNU C Library; see the file COPYING. | ++| If not, write to the Free Software Foundation, Inc., | ++| 675 Mass Ave, Cambridge, MA 02139, USA. | ++| | ++\------------------------------------------------------------*/ ++# include ++ ++# include "mut.h" ++# include "aut.h" ++# include "gcp.h" ++ ++/*------------------------------------------------------------\ ++| | ++| Usage | ++| | ++\------------------------------------------------------------*/ ++ ++void CUsage() ++{ ++ fprintf( stderr, "\t\tgcptest --[Options] Input_name_1 ... Input_name_N -[GCC Options]\n\n" ); ++ fprintf( stdout, "\t\tOptions : --V Sets Verbose mode on\n" ); ++ fprintf( stdout, "\t\t --D Sets Debug mode on\n" ); ++ fprintf( stdout, "\t\t --F Sets Force display\n" ); ++ fprintf( stdout, "\t\t --T Sets display Types\n" ); ++ fprintf( stdout, "\t\t --S Sets display Sizes\n" ); ++ fprintf( stdout, "\n" ); ++ ++ exit( 1 ); ++} ++ ++/*------------------------------------------------------------\ ++| | ++| Functions | ++| | ++\------------------------------------------------------------*/ ++ ++ extern int c_y_debug; ++ ++int main( argc, argv ) ++ ++ int argc; ++ char **argv; ++{ ++ c_tree_node *TreeNode; ++ char *InputFileName[ 10 ]; ++ int Last; ++ int Number; ++ int Index; ++ char Option; ++ char *Extention; ++ char **Argv; ++ int Argc; ++ ++ int FlagVerbose = 0; ++ int FlagDebug = 0; ++ int NoMoreFileName = 0; ++ ++ mbkenv(); ++ autenv(); ++ ++ if ( argc < 2 ) CUsage(); ++ ++ InputFileName[ 0 ] = (char *)0; ++ Last = 0; ++ Argc = 0; ++ Argv = (char **)0; ++ ++ for ( Number = 1; Number < argc; Number++ ) ++ { ++ if ( argv[ Number ][ 0 ] == '-' ) ++ { ++ if ( argv[ Number ][ 1 ] == '-' ) ++ { ++ for ( Index = 2; argv[ Number ][ Index ] != '\0'; Index++ ) ++ { ++ Option = argv[ Number ][ Index ]; ++ ++ if ( Option == 'I' ) ++ { ++ Number++; ++ ++ if ( Number < argc ) Extention = argv[ Number ]; ++ else CUsage(); ++ ++ break; ++ } ++ ++ switch ( Option ) ++ { ++ case 'V' : FlagVerbose = 1; ++ break; ++ case 'D' : FlagDebug |= 1; ++ break; ++ case 'F' : FlagDebug |= 2; ++ break; ++ case 'T' : FlagDebug |= 4; ++ break; ++ case 'S' : FlagDebug |= 8; ++ break; ++ default : CUsage(); ++ } ++ } ++ } ++ else ++ if ( ! NoMoreFileName ) ++ { ++ NoMoreFileName = 1; ++ Argv = &argv[ Number ]; ++ Argc = argc - Number; ++ } ++ } ++ else ++ if ( ! NoMoreFileName ) ++ { ++ InputFileName[ Last ] = argv[ Number ]; ++ Last++; ++ ++ if ( Last >= 10 ) NoMoreFileName = 1; ++ else InputFileName[ Last ] = (char *)0; ++ } ++ else ++ CUsage(); ++ } ++ ++ if ( InputFileName[ 0 ] == (char *)0 ) CUsage(); ++ ++ if ( FlagDebug & 1 ) ++ { ++ c_y_debug = 1; ++ } ++ ++ if ( FlagDebug & 2 ) ++ { ++ C_TREE_FORCE_VIEW_NODE = 1; ++ } ++ ++ if ( FlagDebug & 4 ) ++ { ++ C_TREE_VIEW_TYPE_NODE = 1; ++ } ++ ++ if ( FlagDebug & 8 ) ++ { ++ C_TREE_VIEW_SIZE_NODE = 1; ++ } ++ ++ for ( Index = 0; Index < Last; Index++ ) ++ { ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "--> Processing file %s\n", InputFileName[ Index ] ); ++ } ++ ++ TreeNode = c_tree_parse_file( InputFileName[ Index ], Argc, Argv ); ++ ++ if ( FlagVerbose ) ++ { ++ fprintf( stdout, "<-- done\n\n" ); ++ c_tree_view_node( TreeNode ); ++ } ++ } ++ ++ c_tree_free_all_node(); ++ ++ return( 0 ); ++} +diff -Naur alliance-5.0/gcp/src/Makefile.am alliance/gcp/src/Makefile.am +--- alliance-5.0/gcp/src/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/Makefile.am 2005-01-19 16:13:51.000000000 +0100 +@@ -0,0 +1,21 @@ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src ++lib_LTLIBRARIES = libGcp.la ++include_HEADERS = gcp.h ++libGcp_la_SOURCES = c_ccomp.y \ ++c_cdecl.c c_cdecl.h c_clex.c c_clex.h c_common.c c_common.h c_convert.c \ ++c_convert.h c_ctypeck.c c_ctypeck.h c_debug.c c_debug.h c_expand.c c_expand.h \ ++c_flags.c c_flags.h c_foldconst.c c_foldconst.h c_gperf.h c_parse.c c_parse.h \ ++c_stmt.c c_stmt.h c_tree.c c_treecompat.h c_tree.h gcp.h ++ ++CLEANFILES = c_ccomp.c c_ccomp.h vbl_bcomp_l.c ++EXTRA_DIST = c_ccomp.h ++ ++c_ccomp.c c_ccomp.h : $(srcdir)/c_ccomp.y ++ $(YACC) -d $(YFLAGS) $(srcdir)/c_ccomp.y && sed -e "s/yy/c_y_/g" -e "s/YY/C_Y_/g" y.tab.c > c_ccomp.c && sed -e "s/yy/c_y_/g" -e "s/YY/C_Y_/g" y.tab.h > c_ccomp.h ++ ++ ++LIBTOOL_DEPS = @LIBTOOL_DEPS@ ++libtool: $(LIBTOOL_DEPS) ++ $(SHELL) ./config.status --recheck ++ ++ +diff -Naur alliance-5.0/gcp/src/Makefile.in alliance/gcp/src/Makefile.in +--- alliance-5.0/gcp/src/Makefile.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/gcp/src/Makefile.in 2009-06-13 22:27:29.000000000 +0200 +@@ -0,0 +1,730 @@ ++# Makefile.in generated by automake 1.9.6 from Makefile.am. ++# @configure_input@ ++ ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, ++# 2003, 2004, 2005 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++@SET_MAKE@ ++ ++ ++srcdir = @srcdir@ ++top_srcdir = @top_srcdir@ ++VPATH = @srcdir@ ++pkgdatadir = $(datadir)/@PACKAGE@ ++pkglibdir = $(libdir)/@PACKAGE@ ++pkgincludedir = $(includedir)/@PACKAGE@ ++top_builddir = ../.. ++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd ++INSTALL = @INSTALL@ ++install_sh_DATA = $(install_sh) -c -m 644 ++install_sh_PROGRAM = $(install_sh) -c ++install_sh_SCRIPT = $(install_sh) -c ++INSTALL_HEADER = $(INSTALL_DATA) ++transform = $(program_transform_name) ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++build_triplet = @build@ ++host_triplet = @host@ ++subdir = gcp/src ++DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ ++ $(srcdir)/Makefile.in c_ccomp.c ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/alliance.m4 $(top_srcdir)/motif.m4 \ ++ $(top_srcdir)/xpm.m4 $(top_srcdir)/configure.in ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++mkinstalldirs = $(install_sh) -d ++CONFIG_CLEAN_FILES = ++am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; ++am__vpath_adj = case $$p in \ ++ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ ++ *) f=$$p;; \ ++ esac; ++am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; ++am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" ++libLTLIBRARIES_INSTALL = $(INSTALL) ++LTLIBRARIES = $(lib_LTLIBRARIES) ++libGcp_la_LIBADD = ++am_libGcp_la_OBJECTS = c_ccomp.lo c_cdecl.lo c_clex.lo c_common.lo \ ++ c_convert.lo c_ctypeck.lo c_debug.lo c_expand.lo c_flags.lo \ ++ c_foldconst.lo c_parse.lo c_stmt.lo c_tree.lo ++libGcp_la_OBJECTS = $(am_libGcp_la_OBJECTS) ++DEFAULT_INCLUDES = -I. -I$(srcdir) ++depcomp = $(SHELL) $(top_srcdir)/depcomp ++am__depfiles_maybe = depfiles ++COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ ++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ ++ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ ++ $(AM_CFLAGS) $(CFLAGS) ++CCLD = $(CC) ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++ $(AM_LDFLAGS) $(LDFLAGS) -o $@ ++YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) ++LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ ++ $(AM_YFLAGS) ++SOURCES = $(libGcp_la_SOURCES) ++DIST_SOURCES = $(libGcp_la_SOURCES) ++includeHEADERS_INSTALL = $(INSTALL_HEADER) ++HEADERS = $(include_HEADERS) ++ETAGS = etags ++CTAGS = ctags ++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ++ABE_DLL_VERSION = @ABE_DLL_VERSION@ ++ABL_DLL_VERSION = @ABL_DLL_VERSION@ ++ABT_DLL_VERSION = @ABT_DLL_VERSION@ ++ABV_DLL_VERSION = @ABV_DLL_VERSION@ ++ACLOCAL = @ACLOCAL@ ++ALCBANNER_MAJOR_VERSION = @ALCBANNER_MAJOR_VERSION@ ++ALCBANNER_MINOR_VERSION = @ALCBANNER_MINOR_VERSION@ ++ALCBANNER_VERSION = @ALCBANNER_VERSION@ ++ALLIANCE_BUILD_FALSE = @ALLIANCE_BUILD_FALSE@ ++ALLIANCE_BUILD_TRUE = @ALLIANCE_BUILD_TRUE@ ++ALLIANCE_CFLAGS = @ALLIANCE_CFLAGS@ ++ALLIANCE_LIBS = @ALLIANCE_LIBS@ ++ALLIANCE_TOP = @ALLIANCE_TOP@ ++AMDEP_FALSE = @AMDEP_FALSE@ ++AMDEP_TRUE = @AMDEP_TRUE@ ++AMTAR = @AMTAR@ ++AR = @AR@ ++ATTILA_MAJOR_VERSION = @ATTILA_MAJOR_VERSION@ ++ATTILA_MINOR_VERSION = @ATTILA_MINOR_VERSION@ ++ATTILA_VERSION = @ATTILA_VERSION@ ++AUTOCONF = @AUTOCONF@ ++AUTOHEADER = @AUTOHEADER@ ++AUTOMAKE = @AUTOMAKE@ ++AUT_DLL_VERSION = @AUT_DLL_VERSION@ ++AWK = @AWK@ ++B2F_MAJOR_VERSION = @B2F_MAJOR_VERSION@ ++B2F_MINOR_VERSION = @B2F_MINOR_VERSION@ ++B2F_VERSION = @B2F_VERSION@ ++BDD_DLL_VERSION = @BDD_DLL_VERSION@ ++BEH_DLL_VERSION = @BEH_DLL_VERSION@ ++BHL_DLL_VERSION = @BHL_DLL_VERSION@ ++BOOG_MAJOR_VERSION = @BOOG_MAJOR_VERSION@ ++BOOG_MINOR_VERSION = @BOOG_MINOR_VERSION@ ++BOOG_VERSION = @BOOG_VERSION@ ++BOOM_MAJOR_VERSION = @BOOM_MAJOR_VERSION@ ++BOOM_MINOR_VERSION = @BOOM_MINOR_VERSION@ ++BOOM_VERSION = @BOOM_VERSION@ ++BTR_DLL_VERSION = @BTR_DLL_VERSION@ ++BVL_DLL_VERSION = @BVL_DLL_VERSION@ ++CC = @CC@ ++CCDEPMODE = @CCDEPMODE@ ++CFLAGS = @CFLAGS@ ++CPP = @CPP@ ++CPPFLAGS = @CPPFLAGS@ ++CST_DLL_VERSION = @CST_DLL_VERSION@ ++CTL_DLL_VERSION = @CTL_DLL_VERSION@ ++CTP_DLL_VERSION = @CTP_DLL_VERSION@ ++CXX = @CXX@ ++CXXCPP = @CXXCPP@ ++CXXDEPMODE = @CXXDEPMODE@ ++CXXFLAGS = @CXXFLAGS@ ++CYGPATH_W = @CYGPATH_W@ ++DEFS = @DEFS@ ++DEPDIR = @DEPDIR@ ++DOC_MAJOR_VERSION = @DOC_MAJOR_VERSION@ ++DOC_MINOR_VERSION = @DOC_MINOR_VERSION@ ++DOC_VERSION = @DOC_VERSION@ ++DREAL_MAJOR_VERSION = @DREAL_MAJOR_VERSION@ ++DREAL_MINOR_VERSION = @DREAL_MINOR_VERSION@ ++DREAL_VERSION = @DREAL_VERSION@ ++ECHO = @ECHO@ ++ECHO_C = @ECHO_C@ ++ECHO_N = @ECHO_N@ ++ECHO_T = @ECHO_T@ ++EGREP = @EGREP@ ++ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ ++EXEEXT = @EXEEXT@ ++EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ ++EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ ++EXP_VERSION = @EXP_VERSION@ ++F77 = @F77@ ++FFLAGS = @FFLAGS@ ++FKS_DLL_VERSION = @FKS_DLL_VERSION@ ++FLATBEH_MAJOR_VERSION = @FLATBEH_MAJOR_VERSION@ ++FLATBEH_MINOR_VERSION = @FLATBEH_MINOR_VERSION@ ++FLATBEH_VERSION = @FLATBEH_VERSION@ ++FMI_MAJOR_VERSION = @FMI_MAJOR_VERSION@ ++FMI_MINOR_VERSION = @FMI_MINOR_VERSION@ ++FMI_VERSION = @FMI_VERSION@ ++FSM_DLL_VERSION = @FSM_DLL_VERSION@ ++FSP_MAJOR_VERSION = @FSP_MAJOR_VERSION@ ++FSP_MINOR_VERSION = @FSP_MINOR_VERSION@ ++FSP_VERSION = @FSP_VERSION@ ++FTL_DLL_VERSION = @FTL_DLL_VERSION@ ++FVH_DLL_VERSION = @FVH_DLL_VERSION@ ++GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ ++GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ ++GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ ++INCLUDE_MOTIF = @INCLUDE_MOTIF@ ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ ++INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ ++K2F_MAJOR_VERSION = @K2F_MAJOR_VERSION@ ++K2F_MINOR_VERSION = @K2F_MINOR_VERSION@ ++K2F_VERSION = @K2F_VERSION@ ++L2P_MAJOR_VERSION = @L2P_MAJOR_VERSION@ ++L2P_MINOR_VERSION = @L2P_MINOR_VERSION@ ++L2P_VERSION = @L2P_VERSION@ ++LDFLAGS = @LDFLAGS@ ++LEX = @LEX@ ++LEXLIB = @LEXLIB@ ++LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ ++LIBOBJS = @LIBOBJS@ ++LIBS = @LIBS@ ++LIBTOOL = @LIBTOOL@ ++LINK_MOTIF = @LINK_MOTIF@ ++LINK_XPM = @LINK_XPM@ ++LN_S = @LN_S@ ++LOG_DLL_VERSION = @LOG_DLL_VERSION@ ++LOON_MAJOR_VERSION = @LOON_MAJOR_VERSION@ ++LOON_MINOR_VERSION = @LOON_MINOR_VERSION@ ++LOON_VERSION = @LOON_VERSION@ ++LTLIBOBJS = @LTLIBOBJS@ ++LVX_MAJOR_VERSION = @LVX_MAJOR_VERSION@ ++LVX_MINOR_VERSION = @LVX_MINOR_VERSION@ ++LVX_VERSION = @LVX_VERSION@ ++LYNX_MAJOR_VERSION = @LYNX_MAJOR_VERSION@ ++LYNX_MINOR_VERSION = @LYNX_MINOR_VERSION@ ++LYNX_VERSION = @LYNX_VERSION@ ++M2E_MAJOR_VERSION = @M2E_MAJOR_VERSION@ ++M2E_MINOR_VERSION = @M2E_MINOR_VERSION@ ++M2E_VERSION = @M2E_VERSION@ ++MAKEINFO = @MAKEINFO@ ++MAL_DLL_VERSION = @MAL_DLL_VERSION@ ++MAP_DLL_VERSION = @MAP_DLL_VERSION@ ++MBK_CUR = @MBK_CUR@ ++MBK_DLL_VERSION = @MBK_DLL_VERSION@ ++MBK_REL = @MBK_REL@ ++MBK_REV = @MBK_REV@ ++MBK_VERSION = @MBK_VERSION@ ++MCL_DLL_VERSION = @MCL_DLL_VERSION@ ++MCP_DLL_VERSION = @MCP_DLL_VERSION@ ++MEL_DLL_VERSION = @MEL_DLL_VERSION@ ++MGL_DLL_VERSION = @MGL_DLL_VERSION@ ++MGN_DLL_VERSION = @MGN_DLL_VERSION@ ++MHL_DLL_VERSION = @MHL_DLL_VERSION@ ++MIPS_ASM_MAJOR_VERSION = @MIPS_ASM_MAJOR_VERSION@ ++MIPS_ASM_MINOR_VERSION = @MIPS_ASM_MINOR_VERSION@ ++MIPS_ASM_VERSION = @MIPS_ASM_VERSION@ ++MMG_DLL_VERSION = @MMG_DLL_VERSION@ ++MOCHA_MAJOR_VERSION = @MOCHA_MAJOR_VERSION@ ++MOCHA_MINOR_VERSION = @MOCHA_MINOR_VERSION@ ++MOCHA_VERSION = @MOCHA_VERSION@ ++MSL_DLL_VERSION = @MSL_DLL_VERSION@ ++MVG_DLL_VERSION = @MVG_DLL_VERSION@ ++MVL_DLL_VERSION = @MVL_DLL_VERSION@ ++NERO_MAJOR_VERSION = @NERO_MAJOR_VERSION@ ++NERO_MINOR_VERSION = @NERO_MINOR_VERSION@ ++NERO_VERSION = @NERO_VERSION@ ++OBJEXT = @OBJEXT@ ++OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ ++OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ ++OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ ++PACKAGE = @PACKAGE@ ++PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ ++PACKAGE_NAME = @PACKAGE_NAME@ ++PACKAGE_STRING = @PACKAGE_STRING@ ++PACKAGE_TARNAME = @PACKAGE_TARNAME@ ++PACKAGE_VERSION = @PACKAGE_VERSION@ ++PAT2SPI_MAJOR_VERSION = @PAT2SPI_MAJOR_VERSION@ ++PAT2SPI_MINOR_VERSION = @PAT2SPI_MINOR_VERSION@ ++PAT2SPI_VERSION = @PAT2SPI_VERSION@ ++PATH_SEPARATOR = @PATH_SEPARATOR@ ++PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ ++PGN_DLL_VERSION = @PGN_DLL_VERSION@ ++PHL_DLL_VERSION = @PHL_DLL_VERSION@ ++PPT_DLL_VERSION = @PPT_DLL_VERSION@ ++PROOF_MAJOR_VERSION = @PROOF_MAJOR_VERSION@ ++PROOF_MINOR_VERSION = @PROOF_MINOR_VERSION@ ++PROOF_VERSION = @PROOF_VERSION@ ++RANLIB = @RANLIB@ ++RCF_DLL_VERSION = @RCF_DLL_VERSION@ ++RDS_DLL_VERSION = @RDS_DLL_VERSION@ ++RFM_DLL_VERSION = @RFM_DLL_VERSION@ ++RGS_DLL_VERSION = @RGS_DLL_VERSION@ ++RING_MAJOR_VERSION = @RING_MAJOR_VERSION@ ++RING_MINOR_VERSION = @RING_MINOR_VERSION@ ++RING_VERSION = @RING_VERSION@ ++RPR_DLL_VERSION = @RPR_DLL_VERSION@ ++RTD_DLL_VERSION = @RTD_DLL_VERSION@ ++RTL_DLL_VERSION = @RTL_DLL_VERSION@ ++RTN_DLL_VERSION = @RTN_DLL_VERSION@ ++RUT_DLL_VERSION = @RUT_DLL_VERSION@ ++RWI_DLL_VERSION = @RWI_DLL_VERSION@ ++S2R_MAJOR_VERSION = @S2R_MAJOR_VERSION@ ++S2R_MINOR_VERSION = @S2R_MINOR_VERSION@ ++S2R_VERSION = @S2R_VERSION@ ++SCAPIN_MAJOR_VERSION = @SCAPIN_MAJOR_VERSION@ ++SCAPIN_MINOR_VERSION = @SCAPIN_MINOR_VERSION@ ++SCAPIN_VERSION = @SCAPIN_VERSION@ ++SCH_DLL_VERSION = @SCH_DLL_VERSION@ ++SCL_DLL_VERSION = @SCL_DLL_VERSION@ ++SEA_MAJOR_VERSION = @SEA_MAJOR_VERSION@ ++SEA_MINOR_VERSION = @SEA_MINOR_VERSION@ ++SEA_VERSION = @SEA_VERSION@ ++SED = @SED@ ++SET_MAKE = @SET_MAKE@ ++SHELL = @SHELL@ ++STRIP = @STRIP@ ++SYF_MAJOR_VERSION = @SYF_MAJOR_VERSION@ ++SYF_MINOR_VERSION = @SYF_MINOR_VERSION@ ++SYF_VERSION = @SYF_VERSION@ ++TOOLSDIRS = @TOOLSDIRS@ ++VASY_MAJOR_VERSION = @VASY_MAJOR_VERSION@ ++VASY_MINOR_VERSION = @VASY_MINOR_VERSION@ ++VASY_VERSION = @VASY_VERSION@ ++VBH_DLL_VERSION = @VBH_DLL_VERSION@ ++VBL_DLL_VERSION = @VBL_DLL_VERSION@ ++VERSION = @VERSION@ ++VEX_DLL_VERSION = @VEX_DLL_VERSION@ ++VPD_DLL_VERSION = @VPD_DLL_VERSION@ ++VPN_DLL_VERSION = @VPN_DLL_VERSION@ ++VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ ++VTL_DLL_VERSION = @VTL_DLL_VERSION@ ++VVH_DLL_VERSION = @VVH_DLL_VERSION@ ++X11_LIBS = @X11_LIBS@ ++XEXT_LIBS = @XEXT_LIBS@ ++XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ ++XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ ++XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ ++XM_LIBS = @XM_LIBS@ ++XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ ++XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ ++XPAT_VERSION = @XPAT_VERSION@ ++XPM_LIBS = @XPM_LIBS@ ++XP_LIBS = @XP_LIBS@ ++XSCH_MAJOR_VERSION = @XSCH_MAJOR_VERSION@ ++XSCH_MINOR_VERSION = @XSCH_MINOR_VERSION@ ++XSCH_VERSION = @XSCH_VERSION@ ++XT_LIBS = @XT_LIBS@ ++XVPN_MAJOR_VERSION = @XVPN_MAJOR_VERSION@ ++XVPN_MINOR_VERSION = @XVPN_MINOR_VERSION@ ++XVPN_VERSION = @XVPN_VERSION@ ++X_CFLAGS = @X_CFLAGS@ ++X_EXTRA_LIBS = @X_EXTRA_LIBS@ ++X_LIBS = @X_LIBS@ ++X_PRE_LIBS = @X_PRE_LIBS@ ++YACC = @YACC@ ++ac_ct_AR = @ac_ct_AR@ ++ac_ct_CC = @ac_ct_CC@ ++ac_ct_CXX = @ac_ct_CXX@ ++ac_ct_F77 = @ac_ct_F77@ ++ac_ct_RANLIB = @ac_ct_RANLIB@ ++ac_ct_STRIP = @ac_ct_STRIP@ ++am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ ++am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ ++am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ ++am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ ++am__include = @am__include@ ++am__leading_dot = @am__leading_dot@ ++am__quote = @am__quote@ ++am__tar = @am__tar@ ++am__untar = @am__untar@ ++bindir = @bindir@ ++build = @build@ ++build_alias = @build_alias@ ++build_cpu = @build_cpu@ ++build_os = @build_os@ ++build_vendor = @build_vendor@ ++datadir = @datadir@ ++exec_prefix = @exec_prefix@ ++host = @host@ ++host_alias = @host_alias@ ++host_cpu = @host_cpu@ ++host_os = @host_os@ ++host_vendor = @host_vendor@ ++includedir = @includedir@ ++infodir = @infodir@ ++install_sh = @install_sh@ ++libdir = @libdir@ ++libexecdir = @libexecdir@ ++localstatedir = @localstatedir@ ++mandir = @mandir@ ++mkdir_p = @mkdir_p@ ++oldincludedir = @oldincludedir@ ++prefix = @prefix@ ++program_transform_name = @program_transform_name@ ++sbindir = @sbindir@ ++sharedstatedir = @sharedstatedir@ ++sysconfdir = @sysconfdir@ ++target_alias = @target_alias@ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src ++lib_LTLIBRARIES = libGcp.la ++include_HEADERS = gcp.h ++libGcp_la_SOURCES = c_ccomp.y \ ++c_cdecl.c c_cdecl.h c_clex.c c_clex.h c_common.c c_common.h c_convert.c \ ++c_convert.h c_ctypeck.c c_ctypeck.h c_debug.c c_debug.h c_expand.c c_expand.h \ ++c_flags.c c_flags.h c_foldconst.c c_foldconst.h c_gperf.h c_parse.c c_parse.h \ ++c_stmt.c c_stmt.h c_tree.c c_treecompat.h c_tree.h gcp.h ++ ++CLEANFILES = c_ccomp.c c_ccomp.h vbl_bcomp_l.c ++EXTRA_DIST = c_ccomp.h ++LIBTOOL_DEPS = @LIBTOOL_DEPS@ ++all: all-am ++ ++.SUFFIXES: ++.SUFFIXES: .c .lo .o .obj .y ++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) ++ @for dep in $?; do \ ++ case '$(am__configure_deps)' in \ ++ *$$dep*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ ++ && exit 0; \ ++ exit 1;; \ ++ esac; \ ++ done; \ ++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gcp/src/Makefile'; \ ++ cd $(top_srcdir) && \ ++ $(AUTOMAKE) --foreign gcp/src/Makefile ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ ++ esac; ++ ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++$(top_srcdir)/configure: $(am__configure_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++$(ACLOCAL_M4): $(am__aclocal_m4_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++install-libLTLIBRARIES: $(lib_LTLIBRARIES) ++ @$(NORMAL_INSTALL) ++ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" ++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ if test -f $$p; then \ ++ f=$(am__strip_dir) \ ++ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ ++ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ ++ else :; fi; \ ++ done ++ ++uninstall-libLTLIBRARIES: ++ @$(NORMAL_UNINSTALL) ++ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ p=$(am__strip_dir) \ ++ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ ++ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ ++ done ++ ++clean-libLTLIBRARIES: ++ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) ++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ ++ test "$$dir" != "$$p" || dir=.; \ ++ echo "rm -f \"$${dir}/so_locations\""; \ ++ rm -f "$${dir}/so_locations"; \ ++ done ++libGcp.la: $(libGcp_la_OBJECTS) $(libGcp_la_DEPENDENCIES) ++ $(LINK) -rpath $(libdir) $(libGcp_la_LDFLAGS) $(libGcp_la_OBJECTS) $(libGcp_la_LIBADD) $(LIBS) ++ ++mostlyclean-compile: ++ -rm -f *.$(OBJEXT) ++ ++distclean-compile: ++ -rm -f *.tab.c ++ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_ccomp.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_cdecl.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_clex.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_common.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_convert.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_ctypeck.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_debug.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_expand.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_flags.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_foldconst.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_parse.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_stmt.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c_tree.Plo@am__quote@ ++ ++.c.o: ++@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ ++@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(COMPILE) -c $< ++ ++.c.obj: ++@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ ++@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ++ ++.c.lo: ++@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ ++@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< ++ ++.y.c: ++ $(YACCCOMPILE) $< ++ if test -f y.tab.h; then \ ++ to=`echo "$*_H" | sed \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ ++ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \ ++ sed -e "/^#/!b" -e "s/Y_TAB_H/$$to/g" -e "s|y\.tab\.h|$*.h|" \ ++ y.tab.h >$*.ht; \ ++ rm -f y.tab.h; \ ++ if cmp -s $*.ht $*.h; then \ ++ rm -f $*.ht ;\ ++ else \ ++ mv $*.ht $*.h; \ ++ fi; \ ++ fi ++ if test -f y.output; then \ ++ mv y.output $*.output; \ ++ fi ++ sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@ ++ rm -f y.tab.c ++ ++mostlyclean-libtool: ++ -rm -f *.lo ++ ++clean-libtool: ++ -rm -rf .libs _libs ++ ++distclean-libtool: ++ -rm -f libtool ++uninstall-info-am: ++install-includeHEADERS: $(include_HEADERS) ++ @$(NORMAL_INSTALL) ++ test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" ++ @list='$(include_HEADERS)'; for p in $$list; do \ ++ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ ++ f=$(am__strip_dir) \ ++ echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ ++ $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ ++ done ++ ++uninstall-includeHEADERS: ++ @$(NORMAL_UNINSTALL) ++ @list='$(include_HEADERS)'; for p in $$list; do \ ++ f=$(am__strip_dir) \ ++ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ ++ rm -f "$(DESTDIR)$(includedir)/$$f"; \ ++ done ++ ++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ mkid -fID $$unique ++tags: TAGS ++ ++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ ++ test -n "$$unique" || unique=$$empty_fix; \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ $$tags $$unique; \ ++ fi ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ ++GTAGS: ++ here=`$(am__cd) $(top_builddir) && pwd` \ ++ && cd $(top_srcdir) \ ++ && gtags -i $(GTAGS_ARGS) $$here ++ ++distclean-tags: ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags ++ ++distdir: $(DISTFILES) ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ ++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ ++ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ ++ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ ++ dir="/$$dir"; \ ++ $(mkdir_p) "$(distdir)$$dir"; \ ++ else \ ++ dir=''; \ ++ fi; \ ++ if test -d $$d/$$file; then \ ++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ ++ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ ++ fi; \ ++ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ ++ else \ ++ test -f $(distdir)/$$file \ ++ || cp -p $$d/$$file $(distdir)/$$file \ ++ || exit 1; \ ++ fi; \ ++ done ++check-am: all-am ++check: check-am ++all-am: Makefile $(LTLIBRARIES) $(HEADERS) ++installdirs: ++ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ ++ test -z "$$dir" || $(mkdir_p) "$$dir"; \ ++ done ++install: install-am ++install-exec: install-exec-am ++install-data: install-data-am ++uninstall: uninstall-am ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++ ++installcheck: installcheck-am ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ `test -z '$(STRIP)' || \ ++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++mostlyclean-generic: ++ ++clean-generic: ++ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) ++ ++distclean-generic: ++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) ++ ++maintainer-clean-generic: ++ @echo "This command is intended for maintainers to use" ++ @echo "it deletes files that may require special tools to rebuild." ++ -rm -f c_ccomp.c ++clean: clean-am ++ ++clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ ++ mostlyclean-am ++ ++distclean: distclean-am ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-libtool distclean-tags ++ ++dvi: dvi-am ++ ++dvi-am: ++ ++html: html-am ++ ++info: info-am ++ ++info-am: ++ ++install-data-am: install-includeHEADERS ++ ++install-exec-am: install-libLTLIBRARIES ++ ++install-info: install-info-am ++ ++install-man: ++ ++installcheck-am: ++ ++maintainer-clean: maintainer-clean-am ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++maintainer-clean-am: distclean-am maintainer-clean-generic ++ ++mostlyclean: mostlyclean-am ++ ++mostlyclean-am: mostlyclean-compile mostlyclean-generic \ ++ mostlyclean-libtool ++ ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ ++uninstall-am: uninstall-includeHEADERS uninstall-info-am \ ++ uninstall-libLTLIBRARIES ++ ++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ++ clean-libLTLIBRARIES clean-libtool ctags distclean \ ++ distclean-compile distclean-generic distclean-libtool \ ++ distclean-tags distdir dvi dvi-am html html-am info info-am \ ++ install install-am install-data install-data-am install-exec \ ++ install-exec-am install-includeHEADERS install-info \ ++ install-info-am install-libLTLIBRARIES install-man \ ++ install-strip installcheck installcheck-am installdirs \ ++ maintainer-clean maintainer-clean-generic mostlyclean \ ++ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ ++ pdf pdf-am ps ps-am tags uninstall uninstall-am \ ++ uninstall-includeHEADERS uninstall-info-am \ ++ uninstall-libLTLIBRARIES ++ ++ ++c_ccomp.c c_ccomp.h : $(srcdir)/c_ccomp.y ++ $(YACC) -d $(YFLAGS) $(srcdir)/c_ccomp.y && sed -e "s/yy/c_y_/g" -e "s/YY/C_Y_/g" y.tab.c > c_ccomp.c && sed -e "s/yy/c_y_/g" -e "s/YY/C_Y_/g" y.tab.h > c_ccomp.h ++libtool: $(LIBTOOL_DEPS) ++ $(SHELL) ./config.status --recheck ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: diff --git a/alliance-genlib.patch b/alliance-genlib.patch new file mode 100644 index 0000000..7a1a5b2 --- /dev/null +++ b/alliance-genlib.patch @@ -0,0 +1,1364 @@ +diff -Naur alliance-5.0/genlib/configure.in alliance/genlib/configure.in +--- alliance-5.0/genlib/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/configure.in 2003-01-29 10:59:35.000000000 +0100 +@@ -0,0 +1,73 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl Purpose : Auto stuffing Alliance ++dnl Almost ten years since I wrote this stuff, I just can't ++dnl believe it ++dnl Date : 01/02/2002 ++dnl Author : Frederic Petrot ++dnl $Id: configure.in,v 1.8 2003/01/29 09:59:35 jpc Exp $ ++dnl ++dnl ++AC_INIT(src/genlib.c) ++MGN_DLL_VERSION=3:3:0 ++AC_SUBST(MGN_DLL_VERSION) ++AM_INIT_AUTOMAKE(genlib, 3.3) ++AC_PROG_INSTALL ++AC_PROG_CC ++AC_HEADER_STDC ++AC_CHECK_HEADERS(strings.h unistd.h) ++AC_C_CONST ++AC_TYPE_SIGNAL ++AM_PROG_LIBTOOL ++AC_CHECK_PROG(SED, sed, sed) ++AM_PROG_LEX ++AC_PROG_YACC ++AC_PROG_MAKE_SET ++ ++changequote(,)dnl ++if test -z $SED ; then ++ echo "Cannot find sed here! Quiting, ..." ++ exit 1 ++fi ++changequote([,])dnl ++ ++dnl Setting pathes as necessary, using externally set shell variables ++changequote(,)dnl ++INCLUDES="-I\$(prefix)/include -I${ALLIANCE_TOP}/include" ++LDFLAGS="-L\$(prefix)/lib -L${ALLIANCE_TOP}/lib" ++changequote([,])dnl ++ ++AM_ALLIANCE ++ ++AC_SUBST(INCLUDES) ++AC_SUBST(LDFLAGS) ++ ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++man1/Makefile ++man3/Makefile ++doc/Makefile ++doc/genlib/Makefile ++]) +diff -Naur alliance-5.0/genlib/doc/build_doc.sh alliance/genlib/doc/build_doc.sh +--- alliance-5.0/genlib/doc/build_doc.sh 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/build_doc.sh 2004-07-22 21:22:27.000000000 +0200 +@@ -0,0 +1,103 @@ ++#!/bin/sh ++ ++ ++ LOG="build_doc.log" ++ TOOL="genlib" ++ SGML_DOC="$TOOL.sgm" ++ ++ ++ detect_fail () ++ { ++ echo "" >&2 ++ echo "build_doc.sh ERROR:" >&2 ++ echo "" >&2 ++ echo " Cannot find \"$1\"." >&2 ++ echo "" >&2 ++ echo " Please check that DocBook is installed on your system." >&2 ++ echo "" >&2 ++ ++ exit 1 ++ } ++ ++ ++ detect () ++ { ++ STR="`which $1 2> /dev/null`" ++ ++ if [ -z "$STR" ]; then detect_fail "$1"; fi ++ ++ echo "$STR" ++ } ++ ++ ++ DB2MAN=`detect docbook2man` ++ DB2PDF=`detect db2pdf` ++ DB2HTML=`detect db2html` ++ ++ ++ rm -f $LOG ++ ++ ++ echo "" ++ echo " o Building MAN pages..." ++ $DB2MAN $SGML_DOC > $LOG 2>&1 ++ mv *.1 ../man1 ++ mv *.3 ../man3 ++ ++ ++ echo "" ++ echo " o Building HTML..." ++ if [ -d $TOOL ]; then ++ echo " - Backuping CVS" ++ mv $TOOL/CVS ./CVS-$TOOL ++ mv $TOOL/stylesheet-images/CVS ./CVS-SS-$TOOL ++ fi ++ $DB2HTML $SGML_DOC >> $LOG 2>&1 ++ if [ -d $TOOL.junk ]; then rm -r $TOOL.junk; fi ++ ++ echo " - Building Makefile.am for html subdir." ++ DOC_AM="Makefile.am-doc" ++ echo "" > $DOC_AM ++ echo "" >> $DOC_AM ++ echo "pkghtmldir = \$(DESTDIR)\$(prefix)/doc/html/@PACKAGE@" >> $DOC_AM ++ echo "pkghtml_DATA = \\" >> $DOC_AM ++ FILE_LIST=`(cd $TOOL; find . -name \*.html -exec echo {} \;)` ++ set $FILE_LIST ++ while [ $# -gt 0 ]; do ++ LINE=" $1" ++ if [ $# -gt 1 ]; then LINE="$LINE \\"; fi ++ echo "$LINE" >> $DOC_AM ++ shift ++ done ++ echo "" >> $DOC_AM ++ echo "EXTRA_DIST = \$(pkghtml_DATA)" >> $DOC_AM ++ mv $DOC_AM $TOOL/Makefile.am ++ if [ -d ./CVS-$TOOL ]; then ++ echo " - Restoring CVS" ++ mv ./CVS-$TOOL $TOOL/CVS ++ mv ./CVS-SS-$TOOL $TOOL/stylesheet-images/CVS ++ fi ++ ++ ++ echo "" ++ echo " o Building PDF..." ++ $DB2PDF $SGML_DOC >> $LOG 2>&1 ++ ++ echo " - Building Makefile.am for doc dir." ++ DOC_AM="Makefile.am" ++ echo "" > $DOC_AM ++ echo "SUBDIRS = $TOOL" >> $DOC_AM ++ echo "" >> $DOC_AM ++ echo "pdfdir = \$(DESTDIR)\$(prefix)/doc/pdf" >> $DOC_AM ++ echo "pdf_DATA = $TOOL.pdf" >> $DOC_AM ++ echo "" >> $DOC_AM ++ echo "EXTRA_DIST = \$(pdf_DATA) \\" >> $DOC_AM ++ FILE_LIST=`find . -name \*.sgm -exec echo {} \;` ++ set $FILE_LIST ++ while [ $# -gt 0 ]; do ++ LINE=" $1" ++ if [ $# -gt 1 ]; then LINE="$LINE \\"; fi ++ echo "$LINE" >> $DOC_AM ++ shift ++ done ++ echo "" >> $DOC_AM +diff -Naur alliance-5.0/genlib/doc/genlib/Makefile.in alliance/genlib/doc/genlib/Makefile.in +--- alliance-5.0/genlib/doc/genlib/Makefile.in 2007-07-18 19:04:33.000000000 +0200 ++++ alliance/genlib/doc/genlib/Makefile.in 2009-06-13 22:27:30.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -123,6 +123,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -145,6 +148,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -211,6 +217,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -222,6 +231,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -271,6 +283,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -278,6 +293,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/caution.gif alliance/genlib/doc/genlib/stylesheet-images/caution.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/caution.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/caution.gif 2002-05-24 20:34:40.000000000 +0200 +@@ -0,0 +1,3 @@ ++GIF87a!!11BBZZcckkss{{sss{s{cZcc19B191,uH_@Ȑ 6DHB ++$N$ ++4>pиa (e|QGE(YaD`P 8j,XEJt@P?MeHL)%d)؝ JCgep`-[ tYb 16|o "ؕd=H)UDFW4  热-XċBݐ'ơ:o ; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/home.gif alliance/genlib/doc/genlib/stylesheet-images/home.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/home.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/home.gif 2002-05-24 20:34:40.000000000 +0200 +@@ -0,0 +1 @@ ++GIF87a#!!))11BBJJccssƌΔΥ޵,#%H*\ȰC4p A24 @`42D@` P J F` I(%X`@p@ XAPJ``@:H:)֜\ E٠$P6-Y傐`U{ ֔&d@HAA+^!A.la\ͺ; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/important.gif alliance/genlib/doc/genlib/stylesheet-images/important.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/important.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/important.gif 2002-05-24 20:34:40.000000000 +0200 +@@ -0,0 +1,3 @@ ++GIF87a)))999BB1BBBJJJRRRZZ)ccccRccckkBkkkssR{{{9{ZZc{c!9k{JRZZsRck!19R!)1Zc{1B19J!,HpA*ܲĆ ""Bae!A+3,|ҤcG,0$WRTC dd͔ML9& ++|ܰs 5WR@ARM< $J rSG ++8Pܼ"i'c9,""LdOW`+D2ͫ2$>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~, HA*ثR:[1F{1J&R<(Zʓ[Hi&L5 :+ub)LS`QzRAJ5kr͚3F Ftn9 ++<Ҙ9Mu lFQE=5k-5Szҿw=QbsT¸$eJ{Jq\ǫ=@W˚Z!l3ƦR<-%3!c[B*'{ƚxyǨ^Sj lĊQ9o;6$H; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/prev.gif alliance/genlib/doc/genlib/stylesheet-images/prev.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/prev.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/prev.gif 2002-05-24 20:34:41.000000000 +0200 +@@ -0,0 +1,2 @@ ++GIF87a#!!))11BBJJRRkkssƌΔΥ֭,#)H*\ȰCH|bP(@":(P`D@ 4 ++  Ӟ>A,J$ (u U0"A zh@#XA@ H@W߿; ; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/tip.gif alliance/genlib/doc/genlib/stylesheet-images/tip.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/tip.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/tip.gif 2002-05-24 20:34:41.000000000 +0200 +@@ -0,0 +1,6 @@ ++GIF87a ++ ++ ++  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~, HA*xX)J"Btvoa{&!%J,2M3QUQsj)TK!s ++W&tV{{BYTI7yFЛх*^Uh ++k`֔x˞ )Hv[?]m&V'^BxpBÀ#DẂV2 g-Oz3& kQ«k='ۘɔ=x"m|_@; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/toc-blank.gif alliance/genlib/doc/genlib/stylesheet-images/toc-blank.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/toc-blank.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/toc-blank.gif 2002-05-24 20:34:41.000000000 +0200 +@@ -0,0 +1 @@ ++GIF89a , ɇ8۪`%_ƕtf; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/toc-minus.gif alliance/genlib/doc/genlib/stylesheet-images/toc-minus.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/toc-minus.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/toc-minus.gif 2002-05-24 20:34:41.000000000 +0200 +@@ -0,0 +1 @@ ++GIF89a , 08P*LPÆ641:ܘPč?V"A; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/toc-plus.gif alliance/genlib/doc/genlib/stylesheet-images/toc-plus.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/toc-plus.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/toc-plus.gif 2002-05-24 20:34:41.000000000 +0200 +@@ -0,0 +1 @@ ++GIF89a , 38P*LPC6tx0hH1LJ)6)qD ; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/up.gif alliance/genlib/doc/genlib/stylesheet-images/up.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/up.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/up.gif 2002-05-24 20:34:41.000000000 +0200 +@@ -0,0 +1 @@ ++GIF87a#!!))11BBcckkƌΔ޵,##H*\p Dh` @ D(d ,(`KF@Pq̩PB "0PTrL jNjjMsB|4˶m€; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/genlib/stylesheet-images/warning.gif alliance/genlib/doc/genlib/stylesheet-images/warning.gif +--- alliance-5.0/genlib/doc/genlib/stylesheet-images/warning.gif 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/doc/genlib/stylesheet-images/warning.gif 2002-05-24 20:34:41.000000000 +0200 +@@ -0,0 +1 @@ ++GIF87a!)1BJRZks{{{RRZZ{{99JJ11))))))!!,yC p`6Da p#ǏQ\̈#E S@q#PL"K"NJSpT9@2C^!3 3sh@7 z {5kdeKv5+͚C рJYg0@,Sjuf 8@a@3T G;P}@NNI2C"t́ag}Q;m7fD>ou;w ; +\ No newline at end of file +diff -Naur alliance-5.0/genlib/doc/Makefile.in alliance/genlib/doc/Makefile.in +--- alliance-5.0/genlib/doc/Makefile.in 2007-07-18 19:04:33.000000000 +0200 ++++ alliance/genlib/doc/Makefile.in 2009-06-13 22:27:29.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -132,6 +132,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -154,6 +157,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -220,6 +226,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -231,6 +240,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -280,6 +292,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -287,6 +302,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -461,7 +479,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -473,7 +497,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -481,7 +505,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -502,7 +532,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/genlib/Makefile.in alliance/genlib/Makefile.in +--- alliance-5.0/genlib/Makefile.in 2007-07-18 19:04:33.000000000 +0200 ++++ alliance/genlib/Makefile.in 2009-06-13 22:27:29.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/genlib/man1/Makefile.in alliance/genlib/man1/Makefile.in +--- alliance-5.0/genlib/man1/Makefile.in 2007-07-18 19:04:34.000000000 +0200 ++++ alliance/genlib/man1/Makefile.in 2009-06-13 22:27:30.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/genlib/man3/DPGEN_SHROT.3 alliance/genlib/man3/DPGEN_SHROT.3 +--- alliance-5.0/genlib/man3/DPGEN_SHROT.3 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/man3/DPGEN_SHROT.3 2002-07-16 00:19:25.000000000 +0200 +@@ -0,0 +1,75 @@ ++.\\" auto-generated by docbook2man-spec $Revision: 1.1 $ ++.TH "DPGEN_SHROT" "3" "17 June 2002" "ASIM/LIP6" "Alliance - genlib User's Manual" ++.SH NAME ++DPGEN_SHROT \- Shift/Rotation Macro-Generator ++.SH SYNOPSIS ++\fB#include ++.sp ++void GENLIB_MACRO( ++.nf ++.ta 7n +20n ++ DPGEN_SHROT, ++ char *\fImodelname\fB, ++ long \fIflags\fB, ++ long \fIN\fB ++); ++.fi ++\fR.SH "DESCRIPTION" ++.PP ++Generate a \fIN\fR bits shift/rotation operator with name \fImodelname\fR. ++.PP ++How it works : ++.TP 0.2i ++\(bu ++if the op[0] signal is set to '1' ++right shift/rotation occurs, otherwise left shift/rotation ++occurs. ++.TP 0.2i ++\(bu ++if the op[1] signal is set to '1' performs ++an arithmetic shift (only meaningful in case of a right shift). ++.TP 0.2i ++\(bu ++if the op[2] signal is set to '1' performs ++a rotation, otherwise performs a shift. ++.TP 0.2i ++\(bu ++shamt : specifies the shift amount. The width of this signal ++(\fIY\fR) is computed from the operator's width : ++Y = ceil(log2(N)) - 1. ++.PP ++.SS "TERMINAL NAMES" ++.IP 1. ++op : select the kind of shift/rotation (input, 3 bit). ++.IP 2. ++shamt : the shift amount (input, \fIY\fR bits). ++.IP 3. ++: value to shift (input, \fIN\fR bits). ++.IP 4. ++: output (\fIN\fR bits). ++.IP 5. ++vdd : power. ++.IP 6. ++vss : ground. ++.SH "EXAMPLE" ++.PP ++.sp ++.nf ++GENLIB_MACRO(DPGEN_SHROT, "rot25", ++ F_BEHAV|F_PLACE, ++ 25); ++ ++GENLIB_LOINS("rot25", ++ "instance1_rot25", ++ "op[2:0]", ++ "shamt[4:0]", ++ "x[31:0]", ++ "y[31:0]", ++ "vdd", "vss", NULL); ++ ++.sp ++.fi ++.SH "SEE ALSO" ++.PP ++\fBGENLIB_MACRO\fR(3), ++\fBgenlib\fR(1) +diff -Naur alliance-5.0/genlib/man3/Makefile.in alliance/genlib/man3/Makefile.in +--- alliance-5.0/genlib/man3/Makefile.in 2007-07-18 19:04:34.000000000 +0200 ++++ alliance/genlib/man3/Makefile.in 2009-06-13 22:27:30.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/genlib/src/cvslog.27345 alliance/genlib/src/cvslog.27345 +--- alliance-5.0/genlib/src/cvslog.27345 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genlib/src/cvslog.27345 2009-06-14 15:51:43.000000000 +0200 +@@ -0,0 +1,13 @@ ++=================================================================== ++Modification le : Sun Jun 14 15:51:43 CEST 2009 ++Par : ludo ++=================================================================== ++ ++Update of /users/outil/alliance/cvsroot/alliance/src/genlib/src ++In directory do:/users/cao/ludo/alliance/src/genlib/src ++ ++Modified Files: ++ dpgen_Adder.c dpgen_Nul.c genlib.c mgn.h ++Log Message: ++- port 64 bits ++ +diff -Naur alliance-5.0/genlib/src/dpgen_Adder.c alliance/genlib/src/dpgen_Adder.c +--- alliance-5.0/genlib/src/dpgen_Adder.c 2002-09-30 18:20:21.000000000 +0200 ++++ alliance/genlib/src/dpgen_Adder.c 2009-06-14 15:51:43.000000000 +0200 +@@ -1,5 +1,5 @@ + /* +- * $Id: dpgen_Adder.c,v 1.2 2002/09/30 16:20:21 czo Exp $ ++ * $Id: dpgen_Adder.c,v 1.3 2009/06/14 13:51:43 ludo Exp $ + * + * /----------------------------------------------------------------\ + * | | +@@ -191,7 +191,7 @@ + "add_sub", + GENLIB_ELM ("INB" , i), + GENLIB_ELM ("XORB", i), +- "VDD", "VSS", 0); ++ "VDD", "VSS", NULL); + } + + +@@ -202,26 +202,26 @@ + GENLIB_ELM ("XORB", i), + GENLIB_NAME ("GI_0_%d", i), + GENLIB_NAME ("PI_0_%d", i), +- "VDD", "VSS", 0); ++ "VDD", "VSS", NULL); + } + + + /* Calcul somme et retenue du LSB */ + GENLIB_LOINS ("fulladder_x2", "S0", +- GENLIB_ELM ("INA",0), +- GENLIB_ELM ("INA",0), +- GENLIB_ELM ("INA",0), +- GENLIB_ELM ("INA",0), +- GENLIB_ELM ("XORB",0), +- GENLIB_ELM ("XORB",0), +- GENLIB_ELM ("XORB",0), +- GENLIB_ELM ("XORB",0), ++ GENLIB_ELM ("INA",NULL), ++ GENLIB_ELM ("INA",NULL), ++ GENLIB_ELM ("INA",NULL), ++ GENLIB_ELM ("INA",NULL), ++ GENLIB_ELM ("XORB",NULL), ++ GENLIB_ELM ("XORB",NULL), ++ GENLIB_ELM ("XORB",NULL), ++ GENLIB_ELM ("XORB",NULL), + "add_sub", + "add_sub", + "add_sub", + "R_1", +- GENLIB_ELM ("S", 0), +- "VDD", "VSS", 0); ++ GENLIB_ELM ("S", NULL), ++ "VDD", "VSS", NULL); + + + for (n = 1; n <= ilog2 (LV_N); n++) { +@@ -233,7 +233,7 @@ + GENLIB_NAME ("R_%d" , iexp2 (n - 1)), + GENLIB_NAME ("GI_%d_%d", ilog2 (isr), iexp2(n - 1) + isr), + GENLIB_NAME ("R_%d" , iexp2 (n - 1) + isr + 1), +- "VDD", "VSS", 0); ++ "VDD", "VSS", NULL); + } + + /* Calcul des PI GI intermediaires (PG) */ +@@ -245,7 +245,7 @@ + GENLIB_NAME ("PI_%d_%d" , n - 1, ipg - 1), + GENLIB_NAME ("PI_%d_%d" , ilog2 (npg), inpg), + GENLIB_NAME ("PI_%d_%d" , n, inpg), +- "VDD", "VSS", 0); ++ "VDD", "VSS", NULL); + + GENLIB_LOINS("oa22_x2", + GENLIB_NAME ("PG_i2_%d_%d", n, inpg), +@@ -253,7 +253,7 @@ + GENLIB_NAME ("GI_%d_%d" , n - 1, ipg - 1), + GENLIB_NAME ("GI_%d_%d" , ilog2 (npg), inpg), + GENLIB_NAME ("GI_%d_%d" , n, inpg), +- "VDD", "VSS", 0); ++ "VDD", "VSS", NULL); + } + } + } +@@ -266,7 +266,7 @@ + GENLIB_NAME ("PI_0_%d", i), + GENLIB_NAME ("R_%d", i), + GENLIB_ELM ("S", i), +- "VDD","VSS",0); ++ "VDD","VSS",NULL); + } + + +diff -Naur alliance-5.0/genlib/src/dpgen_Nul.c alliance/genlib/src/dpgen_Nul.c +--- alliance-5.0/genlib/src/dpgen_Nul.c 2002-09-30 18:20:22.000000000 +0200 ++++ alliance/genlib/src/dpgen_Nul.c 2009-06-14 15:51:43.000000000 +0200 +@@ -1,5 +1,5 @@ + /* +- * $Id: dpgen_Nul.c,v 1.2 2002/09/30 16:20:22 czo Exp $ ++ * $Id: dpgen_Nul.c,v 1.3 2009/06/14 13:51:43 ludo Exp $ + * + * /----------------------------------------------------------------\ + * | | +@@ -101,7 +101,7 @@ + s64printf("i => i0[%ld]", aOffset), + "nq => nul", + "vdd => vdd", +- "vss => vss", 0); ++ "vss => vss", NULL); + } else { + LV_prevTreeOut = aOffset; + +@@ -119,7 +119,7 @@ + s64printf("i => i0[%ld]", aOffset), + s64printf("nq => nul_%ld", aOffset), + "vdd => vdd", +- "vss => vss", 0); ++ "vss => vss", NULL); + + } + LV_oneShift = 1; aOffset++; +@@ -184,7 +184,7 @@ + sInstance, + sI0, sI1, sQ, + "vdd => vdd", +- "vss => vss", 0); ++ "vss => vss", NULL); + } + } + +@@ -225,7 +225,7 @@ + s64printf("i1 => nul_%ld", i1_index), + sQ, + "vdd => vdd", +- "vss => vss", 0); ++ "vss => vss", NULL); + + LV_prevTreeOut = cell_index; + +@@ -258,7 +258,7 @@ + + + offset = 0; +- depthNext = get_depth (LV_N, 0); ++ depthNext = get_depth (LV_N, NULL); + + do { + depth = depthNext; +@@ -398,7 +398,7 @@ + + + offset = 0; +- depthNext = get_depth (LV_N, 0); ++ depthNext = get_depth (LV_N, NULL); + + do { + depth = depthNext; +diff -Naur alliance-5.0/genlib/src/genlib.c alliance/genlib/src/genlib.c +--- alliance-5.0/genlib/src/genlib.c 2003-02-06 10:52:14.000000000 +0100 ++++ alliance/genlib/src/genlib.c 2009-06-14 15:51:43.000000000 +0200 +@@ -71,7 +71,7 @@ + #include "mbkgen.h" + #define __GENLIB__ + #include "mgn.h" +-static char rcsid[] = "$Id: genlib.c,v 1.12 2003/02/06 09:52:14 fred Exp $"; ++static char rcsid[] = "$Id: genlib.c,v 1.13 2009/06/14 13:51:43 ludo Exp $"; + + /******************************************************************************* + * global variables used in genlib * +@@ -89,7 +89,7 @@ + static char *checkname(); + static void toolong(); + static int hassep(); +-int is_bus(); ++int is_bus(char *name); + int bus_decod(); + + /******************************************************************************* +@@ -281,8 +281,7 @@ + /******************************************************************************* + * function DEF_PHFIG * + *******************************************************************************/ +-void genDEF_PHFIG(name) +-char *name; ++void genDEF_PHFIG( char *name ) + { + phfig_list *ptfig; + char *s; +@@ -3081,8 +3080,7 @@ + /******************************************************************************* + * function LOSIG * + *******************************************************************************/ +-void genLOSIG(signame) +-char *signame; ++void genLOSIG( char *signame ) + { + losig_list *ptsig; + chain_list *ptchain, *ptchain1 = NULL; +@@ -3167,8 +3165,7 @@ + /******************************************************************************* + * function LOCON * + *******************************************************************************/ +-void genLOCON(conname, direction, signame) +-char *conname, direction, *signame; ++void genLOCON( char *conname, char direction, char *signame ) + { + losig_list * ptsig; + chain_list * ptchain, *ptchain1 = NULL, *ptchain2 = NULL; +@@ -3336,10 +3333,7 @@ + /******************************************************************************* + * function LOTRS * + *******************************************************************************/ +-void genLOTRS(type, width, length, grid, source, drain) +-char type; +-unsigned short width, length; +-char *grid, *source, *drain; ++void genLOTRS( char type, unsigned short width, unsigned short length, char *grid, char *source, char *drain ) + { + int i = 0; + losig_list *s_grid = NULL, *s_source = NULL, *s_drain = NULL, *ptsig = NULL; +@@ -3390,8 +3384,7 @@ + /******************************************************************************* + * function LOSIGMERGE * + *******************************************************************************/ +-void genLOSIGMERGE(sig1, sig2) +-char *sig1, *sig2; ++void genLOSIGMERGE( char *sig1, char *sig2 ) + { + losig_list *ls0, *ls1, *ls2; + locon_list *c; +@@ -3680,9 +3673,7 @@ + /******************************************************************************* + * function FLATTEN_LOFIG * + *******************************************************************************/ +-void genFLATTEN_LOFIG(insname, concat) +-char *insname; +-char concat; ++void genFLATTEN_LOFIG( char *insname, char concat ) + { + long i = 0; + losig_list *s; +@@ -3705,8 +3696,7 @@ + /******************************************************************************* + * flattens FLATTEN_ALL_LOINS * + *******************************************************************************/ +-void genFLATTEN_ALL_LOINS(concat, catal) +-char concat, catal; ++void genFLATTEN_ALL_LOINS( char concat, int catal ) + { + chain_list *c, *namelist = NULL; + loins_list *l; +@@ -3779,10 +3769,7 @@ + /******************************************************************************* + * function SC_PLACE * + *******************************************************************************/ +-void genSC_PLACE(insname, sym, x, y) +-char *insname; +-int sym; +-long x, y; ++void genSC_PLACE( char *insname, int sym, long x, long y ) + { + loins_list * ptins; + char *s = namealloc(insname); +@@ -3816,9 +3803,7 @@ + /******************************************************************************* + * function SC_RIGHT * + *******************************************************************************/ +-void genSC_RIGHT(insname, sym) +-char *insname; +-int sym; ++void genSC_RIGHT( char *insname, int sym ) + { + loins_list * ptins; + char *s = namealloc(insname); +@@ -3852,9 +3837,7 @@ + /******************************************************************************* + * function SC_LEFT * + *******************************************************************************/ +-void genSC_LEFT(insname, sym) +-char *insname; +-int sym; ++void genSC_LEFT( char *insname, int sym ) + { + loins_list *ptins; + char *s = namealloc(insname); +@@ -3886,9 +3869,7 @@ + /******************************************************************************* + * function SC_TOP * + *******************************************************************************/ +-void genSC_TOP(insname, sym) +-char *insname; +-int sym; ++void genSC_TOP( char *insname, int sym ) + { + loins_list *ptins; + char *s = namealloc(insname); +@@ -3920,9 +3901,7 @@ + /******************************************************************************* + * function SC_BOTTOM * + *******************************************************************************/ +-void genSC_BOTTOM(insname, sym) +-char *insname; +-int sym; ++void genSC_BOTTOM( char *insname, int sym ) + { + loins_list *ptins; + char *s = namealloc(insname); +@@ -3955,9 +3934,7 @@ + /******************************************************************************* + * BUS allows the definition of a bus for logical operations * + *******************************************************************************/ +-char *genBUS(signame, from, to) +-char *signame; +-long from, to; ++char *genBUS( char *signame, long from, long to ) + { + char sigid[100]; + +@@ -3974,9 +3951,7 @@ + /******************************************************************************* + * ELM allows the definition of a bus element for logical operations * + *******************************************************************************/ +-char *genELM(signame, number) +-char *signame; +-long number; ++char *genELM( char *signame, long number ) + { + char sigid[100]; + +@@ -3994,9 +3969,7 @@ + * Do not forget to free a vectorized string that comes out from this + * function ! */ + +-char *genUSED(s, c) +- char *s; +- int c; ++char *genUSED( char *s, int c ) + /* Czo */ + { + char *t, *u; +@@ -4015,8 +3988,7 @@ + * loads the net-list description of a cell and create what's necessary to * + * physically describe it * + *******************************************************************************/ +-void genDEF_PHSC(name) +-char *name; ++void genDEF_PHSC( char *name ) + { + lofig_list *ptlofig; + +@@ -4192,8 +4164,7 @@ + * something like "abcd[efgh]" will exit on a syntax error * + * return 1 if "abcd[23:45]" 0 if "abcd" or "abdc[12]" * + *******************************************************************************/ +-int is_bus(signame) +-char *signame; ++int is_bus( char *signame ) + { + char *t = signame, c; + char is_a_bus = 0, flag = 0; +@@ -4251,9 +4222,7 @@ + * function bus_decod * + * decods the bus name so buses can be used in LOINS & LOCON * + *******************************************************************************/ +-int bus_decod(busname, signame, first, last) +-char *busname, *signame; +-long *first, *last; ++int bus_decod( char *busname, char *signame, long *first, long *last ) + { + char *space; + char *buffer = mbkstrdup(busname); +@@ -4276,8 +4245,7 @@ + * function toolong * + * cheks the validity of the lentgh of a string * + *******************************************************************************/ +-static void toolong(length) +-long length; ++static void toolong( long length ) + { + if (length > BUFSIZ) { + (void)fflush(stdout); +@@ -4290,8 +4258,7 @@ + /******************************************************************************* + * checkname : check for busses with single index * + *******************************************************************************/ +-static char *checkname(name) +-char *name; ++static char *checkname( char *name ) + { + static char str[256]; + char *s, *t; +@@ -4324,8 +4291,7 @@ + /******************************************************************************* + * hassep : check for legal instance names * + *******************************************************************************/ +-static int hassep(s) +-char *s; ++static int hassep( char *s ) + { + for (; *s != '\0'; s++) + if (*s == '[' || *s == ']' || +diff -Naur alliance-5.0/genlib/src/Makefile.in alliance/genlib/src/Makefile.in +--- alliance-5.0/genlib/src/Makefile.in 2007-07-18 19:04:34.000000000 +0200 ++++ alliance/genlib/src/Makefile.in 2009-06-13 22:27:30.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -16,8 +16,6 @@ + + + +-SOURCES = $(libMgn_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -74,11 +72,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) + LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ +@@ -156,6 +154,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -178,6 +179,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -244,6 +248,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -255,6 +262,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -304,6 +314,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -311,6 +324,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/genlib/src/mgn.h alliance/genlib/src/mgn.h +--- alliance-5.0/genlib/src/mgn.h 2004-09-17 21:03:10.000000000 +0200 ++++ alliance/genlib/src/mgn.h 2009-06-14 03:22:38.000000000 +0200 +@@ -94,18 +94,18 @@ + extern void genLOINS(char *, ...); + extern void genLOINSE(char *, ...); + extern void genLOINSA(); +-extern void genLOTRS(); +-extern void genLOCON(); +-extern void genLOSIGMERGE(); +-extern void genFLATTEN_LOFIG(); +-extern void genFLATTEN_ALL_LOINS(); +-extern void genDEF_PHSC(); ++extern void genLOTRS( char type, unsigned short width, unsigned short length, char *grid, char *source, char *drain ); ++extern void genLOCON( char *conname, char direction, char *signame ); ++extern void genLOSIGMERGE( char *sig1, char *sig2 ); ++extern void genFLATTEN_LOFIG( char *insname, char concat ); ++extern void genFLATTEN_ALL_LOINS( char concat, int catal ); ++extern void genDEF_PHSC( char *name ); + extern void genSAVE_PHSC(); +-extern void genSC_PLACE(); +-extern void genSC_RIGHT(); +-extern void genSC_LEFT(); +-extern void genSC_TOP(); +-extern void genSC_BOTTOM(); ++extern void genSC_PLACE( char *insname, int sym, long x, long y ); ++extern void genSC_RIGHT( char *insname, int sym ); ++extern void genSC_LEFT( char *insname, int sym ); ++extern void genSC_TOP( char *insname, int sym ); ++extern void genSC_BOTTOM( char *insname, int sym ); + extern void genSC_CHANNEL(); + extern void genSC_CON_CHANNEL(); + extern void genLOGEN(char *, int, ...); diff --git a/alliance-genpat.patch b/alliance-genpat.patch new file mode 100644 index 0000000..4122bf0 --- /dev/null +++ b/alliance-genpat.patch @@ -0,0 +1,1276 @@ +diff -Naur alliance-5.0/genpat/configure.in alliance/genpat/configure.in +--- alliance-5.0/genpat/configure.in 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genpat/configure.in 2002-10-16 20:04:24.000000000 +0200 +@@ -0,0 +1,50 @@ ++dnl ++dnl This file is part of the Alliance CAD System ++dnl Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++dnl Universite Pierre et Marie Curie ++dnl ++dnl Home page : http://www-asim.lip6.fr/alliance/ ++dnl E-mail : mailto:alliance-users@asim.lip6.fr ++dnl ++dnl This library is free software; you can redistribute it and/or modify it ++dnl under the terms of the GNU Library General Public License as published ++dnl by the Free Software Foundation; either version 2 of the License, or (at ++dnl your option) any later version. ++dnl ++dnl Alliance VLSI CAD System is distributed in the hope that it will be ++dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++dnl Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License along ++dnl with the GNU C Library; see the file COPYING. If not, write to the Free ++dnl Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++dnl ++dnl ++AC_INIT(src/genpat.sh) ++PGN_DLL_VERSION=3:3:0 ++AC_SUBST(PGN_DLL_VERSION) ++AM_INIT_AUTOMAKE(genpat, 3.3) ++AC_PROG_CC ++AM_PROG_LIBTOOL ++AC_CHECK_PROG(SED, sed, sed) ++AM_PROG_LEX ++AC_PROG_YACC ++AC_PROG_MAKE_SET ++ ++changequote(,)dnl ++if test -z $SED ; then ++ echo "Cannot find sed here! Quiting, ..." ++ exit 1 ++fi ++changequote([,])dnl ++ ++AM_ALLIANCE ++ ++AC_OUTPUT([ ++Makefile ++src/Makefile ++doc/Makefile ++doc/man1/Makefile ++doc/man3/Makefile ++]) +diff -Naur alliance-5.0/genpat/doc/Makefile.in alliance/genpat/doc/Makefile.in +--- alliance-5.0/genpat/doc/Makefile.in 2007-07-18 19:04:35.000000000 +0200 ++++ alliance/genpat/doc/Makefile.in 2009-06-13 22:27:31.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/genpat/doc/man1/Makefile.in alliance/genpat/doc/man1/Makefile.in +--- alliance-5.0/genpat/doc/man1/Makefile.in 2007-07-18 19:04:35.000000000 +0200 ++++ alliance/genpat/doc/man1/Makefile.in 2009-06-13 22:27:31.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/genpat/doc/man3/Makefile.in alliance/genpat/doc/man3/Makefile.in +--- alliance-5.0/genpat/doc/man3/Makefile.in 2007-07-18 19:04:35.000000000 +0200 ++++ alliance/genpat/doc/man3/Makefile.in 2009-06-13 22:27:31.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -117,6 +117,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -139,6 +142,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -205,6 +211,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -216,6 +225,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -265,6 +277,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -272,6 +287,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +diff -Naur alliance-5.0/genpat/Makefile.in alliance/genpat/Makefile.in +--- alliance-5.0/genpat/Makefile.in 2007-07-18 19:04:34.000000000 +0200 ++++ alliance/genpat/Makefile.in 2009-06-13 22:27:30.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -122,6 +122,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -144,6 +147,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -210,6 +216,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -221,6 +230,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -270,6 +282,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -277,6 +292,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ +@@ -389,7 +407,13 @@ + # (which will cause the Makefiles to be regenerated when you run `make'); + # (2) otherwise, pass the desired values on the `make' command line. + $(RECURSIVE_TARGETS): +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -401,7 +425,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ +@@ -409,7 +433,13 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $$MAKEFLAGS; amf=$$2; \ ++ @failcom='exit 1'; \ ++ for f in x $$MAKEFLAGS; do \ ++ case $$f in \ ++ *=* | --[!k]*);; \ ++ *k*) failcom='fail=yes';; \ ++ esac; \ ++ done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ +@@ -430,7 +460,7 @@ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ +- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ ++ || eval $$failcom; \ + done && test -z "$$fail" + tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ +diff -Naur alliance-5.0/genpat/src/Makefile alliance/genpat/src/Makefile +--- alliance-5.0/genpat/src/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genpat/src/Makefile 2005-05-11 10:05:34.000000000 +0200 +@@ -0,0 +1,729 @@ ++# Makefile.in generated by automake 1.8.5 from Makefile.am. ++# genpat/src/Makefile. Generated from Makefile.in by configure. ++ ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, ++# 2003, 2004 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++ ++ ++ ++ ++SOURCES = $(libPgn_la_SOURCES) ++ ++srcdir = . ++top_srcdir = ../.. ++ ++pkgdatadir = $(datadir)/alliance ++pkglibdir = $(libdir)/alliance ++pkgincludedir = $(includedir)/alliance ++top_builddir = ../.. ++am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd ++INSTALL = /usr/bin/install -c ++install_sh_DATA = $(install_sh) -c -m 644 ++install_sh_PROGRAM = $(install_sh) -c ++install_sh_SCRIPT = $(install_sh) -c ++INSTALL_HEADER = $(INSTALL_DATA) ++transform = $(program_transform_name) ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++host_triplet = i686-pc-linux-gnu ++subdir = genpat/src ++DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ ++ $(srcdir)/Makefile.in ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/./alliance.m4 \ ++ $(top_srcdir)/./motif.m4 $(top_srcdir)/./xpm.m4 \ ++ $(top_srcdir)/configure.in ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++mkinstalldirs = $(mkdir_p) ++CONFIG_CLEAN_FILES = ++am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)" ++libLTLIBRARIES_INSTALL = $(INSTALL) ++LTLIBRARIES = $(lib_LTLIBRARIES) ++libPgn_la_LIBADD = ++am_libPgn_la_OBJECTS = AFFECT.lo ARRAY.lo CONV.lo DECLAR.lo DEF_GEN.lo \ ++ GETCPAT.lo INIT.lo LABEL.lo SAVE.lo SAV_GEN.lo SETTUNIT.lo \ ++ libpat_l.lo ++libPgn_la_OBJECTS = $(am_libPgn_la_OBJECTS) ++binSCRIPT_INSTALL = $(INSTALL_SCRIPT) ++SCRIPTS = $(bin_SCRIPTS) ++DEFAULT_INCLUDES = -I. -I$(srcdir) ++depcomp = $(SHELL) $(top_srcdir)/depcomp ++am__depfiles_maybe = depfiles ++DEP_FILES = ./$(DEPDIR)/AFFECT.Plo ./$(DEPDIR)/ARRAY.Plo \ ++ ./$(DEPDIR)/CONV.Plo ./$(DEPDIR)/DECLAR.Plo \ ++ ./$(DEPDIR)/DEF_GEN.Plo ./$(DEPDIR)/GETCPAT.Plo \ ++ ./$(DEPDIR)/INIT.Plo ./$(DEPDIR)/LABEL.Plo \ ++ ./$(DEPDIR)/SAVE.Plo ./$(DEPDIR)/SAV_GEN.Plo \ ++ ./$(DEPDIR)/SETTUNIT.Plo ./$(DEPDIR)/libpat_l.Plo ++COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ ++ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) ++LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ ++ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ ++ $(AM_CFLAGS) $(CFLAGS) ++CCLD = $(CC) ++LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++ $(AM_LDFLAGS) $(LDFLAGS) -o $@ ++SOURCES = $(libPgn_la_SOURCES) ++DIST_SOURCES = $(libPgn_la_SOURCES) ++includeHEADERS_INSTALL = $(INSTALL_HEADER) ++HEADERS = $(include_HEADERS) ++ETAGS = etags ++CTAGS = ctags ++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ++ABE_DLL_VERSION = 2:1:0 ++ABL_DLL_VERSION = 1:3:0 ++ABT_DLL_VERSION = 2:1:0 ++ABV_DLL_VERSION = 2:1:0 ++ACLOCAL = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run aclocal-1.8 ++ALCBANNER_MAJOR_VERSION = 1 ++ALCBANNER_MINOR_VERSION = 1 ++ALCBANNER_VERSION = 1.1 ++ALLIANCE_BUILD_FALSE = # ++ALLIANCE_BUILD_TRUE = ++ALLIANCE_CFLAGS = -I/users/outil/alliance/Linux.FC2/include ++ALLIANCE_LIBS = -L/users/outil/alliance/Linux.FC2/lib ++ALLIANCE_TOP = /users/outil/alliance/Linux.FC2 ++AMDEP_FALSE = # ++AMDEP_TRUE = ++AMTAR = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run tar ++AR = ar ++ATTILA_MAJOR_VERSION = 0 ++ATTILA_MINOR_VERSION = 1 ++ATTILA_VERSION = 0.1 ++AUTOCONF = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run autoconf ++AUTOHEADER = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run autoheader ++AUTOMAKE = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run automake-1.8 ++AUT_DLL_VERSION = 1:3:0 ++AWK = gawk ++B2F_MAJOR_VERSION = 1 ++B2F_MINOR_VERSION = 2 ++B2F_VERSION = 1.2 ++BDD_DLL_VERSION = 1:5:0 ++BEH_DLL_VERSION = 1:11:0 ++BHL_DLL_VERSION = 1:11:0 ++BOOG_MAJOR_VERSION = 1 ++BOOG_MINOR_VERSION = 7 ++BOOG_VERSION = 1.7 ++BOOM_MAJOR_VERSION = 1 ++BOOM_MINOR_VERSION = 2 ++BOOM_VERSION = 1.2 ++BTR_DLL_VERSION = 1:3:0 ++BVL_DLL_VERSION = 1:14:0 ++CC = gcc ++CCDEPMODE = depmode=gcc3 ++CFLAGS = -I/users/outil/alliance/Linux.FC2/include -g -O2 ++CPP = gcc -E ++CPPFLAGS = ++CST_DLL_VERSION = 3:2:0 ++CTL_DLL_VERSION = 1:1:0 ++CTP_DLL_VERSION = 1:1:0 ++CXX = g++ ++CXXCPP = g++ -E ++CXXDEPMODE = depmode=gcc3 ++CXXFLAGS = -g -O2 ++CYGPATH_W = echo ++DEFS = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"alliance\" -DVERSION=\"5.0\" -DYYTEXT_POINTER=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FCNTL_H=1 -DHAVE_MALLOC_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRINGS_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBIBERTY=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_UNISTD_H=1 -DHAVE_FORK=1 -DHAVE_VFORK=1 -DHAVE_WORKING_VFORK=1 -DHAVE_WORKING_FORK=1 -DSTDC_HEADERS=1 -DHAVE_SYS_WAIT_H=1 -DRETSIGTYPE=void -DHAVE_MOTIF=1 -DHAVE_XPM=1 -DHAVE_XPM=1 -DHAVE_X11_XPM_H=1 -DHAVE_XP=1 -DHAVE_MOTIF=1 -DHAVE_XMUSEVERSION=1 -DHAVE_XMINSTALLIMAGE=1 -DALLIANCE_VERSION=\"5.0\" -DALLIANCE_TOP=\"/users/outil/alliance/Linux.FC2\" -DHAVE_LIBIBERTY=1 ++DEPDIR = .deps ++DOC_MAJOR_VERSION = 1 ++DOC_MINOR_VERSION = 0 ++DOC_VERSION = 1.0 ++DREAL_MAJOR_VERSION = 1 ++DREAL_MINOR_VERSION = 14 ++DREAL_VERSION = 1.14 ++ECHO = echo ++ECHO_C = ++ECHO_N = -n ++ECHO_T = ++EGREP = grep -E ++ELP_DLL_VERSION = 1:5:0 ++EMULBS_MAJOR_VERSION = 3 ++EMULBS_MINOR_VERSION = 2 ++EMULBS_VERSION = 3.2 ++EXEEXT = ++EXP_MAJOR_VERSION = 1 ++EXP_MINOR_VERSION = 0 ++EXP_VERSION = 1.0 ++F77 = g77 ++FFLAGS = -g -O2 ++FKS_DLL_VERSION = 1:4:0 ++FLATBEH_MAJOR_VERSION = 1 ++FLATBEH_MINOR_VERSION = 1 ++FLATBEH_VERSION = 1.1 ++FMI_MAJOR_VERSION = 1 ++FMI_MINOR_VERSION = 1 ++FMI_VERSION = 1.1 ++FSM_DLL_VERSION = 1:4:0 ++FSP_MAJOR_VERSION = 1 ++FSP_MINOR_VERSION = 1 ++FSP_VERSION = 1.1 ++FTL_DLL_VERSION = 1:4:0 ++FVH_DLL_VERSION = 1:4:0 ++GRAAL_MAJOR_VERSION = 1 ++GRAAL_MINOR_VERSION = 27 ++GRAAL_VERSION = 1.27 ++GROWSTK_MAJOR_VERSION = 1 ++GROWSTK_MINOR_VERSION = 5 ++GROWSTK_VERSION = 1.5 ++INCLUDE_MOTIF = ++INSTALL_DATA = ${INSTALL} -m 664 ++INSTALL_PROGRAM = ${INSTALL} -m 775 ++INSTALL_SCRIPT = ${INSTALL} ++INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s ++K2F_MAJOR_VERSION = 1 ++K2F_MINOR_VERSION = 1 ++K2F_VERSION = 1.1 ++L2P_MAJOR_VERSION = 1 ++L2P_MINOR_VERSION = 12 ++L2P_VERSION = 1.12 ++LDFLAGS = -static -L/users/outil/alliance/Linux.FC2/lib ++LEX = flex ++LEXLIB = -lfl ++LEX_OUTPUT_ROOT = lex.yy ++LIBOBJS = ++LIBS = -liberty -lm -lm -lm -lm -liberty ++LIBTOOL = $(SHELL) $(top_builddir)/libtool ++LINK_MOTIF = -lXm ++LINK_XPM = -lXpm ++LN_S = ln -s ++LOG_DLL_VERSION = 2:1:0 ++LOON_MAJOR_VERSION = 1 ++LOON_MINOR_VERSION = 7 ++LOON_VERSION = 1.7 ++LTLIBOBJS = ++LVX_MAJOR_VERSION = 1 ++LVX_MINOR_VERSION = 2 ++LVX_VERSION = 1.2 ++LYNX_MAJOR_VERSION = 1 ++LYNX_MINOR_VERSION = 21 ++LYNX_VERSION = 1.21 ++M2E_MAJOR_VERSION = 1 ++M2E_MINOR_VERSION = 0 ++M2E_VERSION = 1.0 ++MAKEINFO = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run makeinfo ++MAL_DLL_VERSION = 6:0:0 ++MAP_DLL_VERSION = 6:0:0 ++MBK_CUR = 4 ++MBK_DLL_VERSION = 4:2:0 ++MBK_REL = 0 ++MBK_REV = 2 ++MBK_VERSION = 4.2 ++MCL_DLL_VERSION = 4:9:0 ++MCP_DLL_VERSION = 4:9:0 ++MEL_DLL_VERSION = 4:9:0 ++MGL_DLL_VERSION = 0:8:0 ++MGN_DLL_VERSION = 3:3:0 ++MHL_DLL_VERSION = 2:1:0 ++MIPS_ASM_MAJOR_VERSION = 1 ++MIPS_ASM_MINOR_VERSION = 0 ++MIPS_ASM_VERSION = 1.0 ++MMG_DLL_VERSION = 1:0:0 ++MOCHA_MAJOR_VERSION = 1 ++MOCHA_MINOR_VERSION = 1 ++MOCHA_VERSION = 1.1 ++MSL_DLL_VERSION = 7:0:0 ++MVG_DLL_VERSION = 4:1:0 ++MVL_DLL_VERSION = 4:1:0 ++NERO_MAJOR_VERSION = 1 ++NERO_MINOR_VERSION = 0 ++NERO_VERSION = 1.0 ++OBJEXT = o ++OCP_MAJOR_VERSION = 1 ++OCP_MINOR_VERSION = 0 ++OCP_VERSION = 1.0 ++OCR_MAJOR_VERSION = 1 ++OCR_MINOR_VERSION = 0 ++OCR_VERSION = 1.0 ++PACKAGE = alliance ++PACKAGE_BUGREPORT = ++PACKAGE_NAME = ++PACKAGE_STRING = ++PACKAGE_TARNAME = ++PACKAGE_VERSION = ++PAT2SPI_MAJOR_VERSION = 1 ++PAT2SPI_MINOR_VERSION = 1 ++PAT2SPI_VERSION = 1.1 ++PATH_SEPARATOR = : ++PAT_DLL_VERSION = 1:9:0 ++PCBS_MAJOR_VERSION = 2 ++PCBS_MINOR_VERSION = 1 ++PCBS_VERSION = 2.1 ++PGN_DLL_VERSION = 3:3:0 ++PHL_DLL_VERSION = 1:9:0 ++PPT_DLL_VERSION = 1:9:0 ++PROOF_MAJOR_VERSION = 4 ++PROOF_MINOR_VERSION = 9 ++PROOF_VERSION = 4.9 ++RANLIB = ranlib ++RCF_DLL_VERSION = 2:1:0 ++RDS_DLL_VERSION = 2:1:0 ++RFM_DLL_VERSION = 2:1:0 ++RGS_DLL_VERSION = 2:1:0 ++RING_MAJOR_VERSION = 3 ++RING_MINOR_VERSION = 0 ++RING_VERSION = 3.0 ++RPR_DLL_VERSION = 2:1:0 ++RTD_DLL_VERSION = 1:1:0 ++RTL_DLL_VERSION = 2:1:0 ++RTN_DLL_VERSION = 1:1:0 ++RUT_DLL_VERSION = 2:1:0 ++RWI_DLL_VERSION = 2:1:0 ++S2R_MAJOR_VERSION = 4 ++S2R_MINOR_VERSION = 4 ++S2R_VERSION = 4.4 ++SCAPIN_MAJOR_VERSION = 1 ++SCAPIN_MINOR_VERSION = 1 ++SCAPIN_VERSION = 1.1 ++SCH_DLL_VERSION = 3:2:0 ++SCL_DLL_VERSION = 1:5:0 ++SEA_MAJOR_VERSION = 1 ++SEA_MINOR_VERSION = 0 ++SEA_VERSION = 1.0 ++SED = /bin/sed ++SET_MAKE = ++SHELL = /bin/sh ++STRIP = strip ++SYF_MAJOR_VERSION = 3 ++SYF_MINOR_VERSION = 6 ++SYF_VERSION = 3.6 ++TOOLSDIRS = mbk mbkal mbkap mbkedif mbkhilo mbkmg mbkspice mbkvhdl mbkvrlog mbkvti mbkvhdlg aut rds rdscif rdsgds elp abl bdd log btr vex ctl ctp abe abt abv fsm fks fvh ftl rtn rtd scl vbh vbl vpn vpd vvh vtl pat ppt phl gcp druc beh bhl bvl alcban asimut attila b2f boog boom cells distrib dreal exp flatbeh flatlo flatph fmi fsp genlib genpat graal k2f l2p loon lvx lynx m2e mips_asm mocha nero ocp pat2spi proof ring s2r scapin sea syf vasy vst2xnf x2y xfsm xpat xsch xvpn documentation ++VASY_MAJOR_VERSION = 1 ++VASY_MINOR_VERSION = 5 ++VASY_VERSION = 1.5 ++VBH_DLL_VERSION = 1:4:0 ++VBL_DLL_VERSION = 1:4:0 ++VERSION = 5.0 ++VEX_DLL_VERSION = 1:3:0 ++VPD_DLL_VERSION = 1:5:0 ++VPN_DLL_VERSION = 1:5:0 ++VRD_DLL_VERSION = 3:4:0 ++VST2XNF_MAJOR_VERSION = 1 ++VST2XNF_MINOR_VERSION = 0 ++VST2XNF_VERSION = 1.0 ++VTL_DLL_VERSION = 1:5:0 ++VVH_DLL_VERSION = 1:5:0 ++X11_LIBS = -lX11 ++XEXT_LIBS = -lXext ++XFSM_MAJOR_VERSION = 1 ++XFSM_MINOR_VERSION = 4 ++XFSM_VERSION = 1.4 ++XM_LIBS = -lXm ++XPAT_MAJOR_VERSION = 1 ++XPAT_MINOR_VERSION = 4 ++XPAT_VERSION = 1.4 ++XPM_LIBS = -lXpm ++XP_LIBS = -lXp ++XSCH_MAJOR_VERSION = 1 ++XSCH_MINOR_VERSION = 4 ++XSCH_VERSION = 1.4 ++XT_LIBS = -lXt ++XVPN_MAJOR_VERSION = 1 ++XVPN_MINOR_VERSION = 5 ++XVPN_VERSION = 1.5 ++X_CFLAGS = -I/usr/X11R6/include ++X_EXTRA_LIBS = ++X_LIBS = -L/usr/X11R6/lib ++X_PRE_LIBS = -lSM -lICE ++YACC = bison -y ++ac_ct_AR = ar ++ac_ct_CC = gcc ++ac_ct_CXX = g++ ++ac_ct_F77 = g77 ++ac_ct_RANLIB = ranlib ++ac_ct_STRIP = strip ++am__fastdepCC_FALSE = # ++am__fastdepCC_TRUE = ++am__fastdepCXX_FALSE = # ++am__fastdepCXX_TRUE = ++am__include = include ++am__leading_dot = . ++am__quote = ++bindir = ${exec_prefix}/bin ++build = i686-pc-linux-gnu ++build_alias = ++build_cpu = i686 ++build_os = linux-gnu ++build_vendor = pc ++datadir = ${prefix}/share ++exec_prefix = ${prefix} ++host = i686-pc-linux-gnu ++host_alias = ++host_cpu = i686 ++host_os = linux-gnu ++host_vendor = pc ++includedir = ${prefix}/include ++infodir = ${prefix}/info ++install_sh = /dsk/l1/misc/hcl/alliance/src/install-sh ++libdir = ${exec_prefix}/lib ++libexecdir = ${exec_prefix}/libexec ++localstatedir = ${prefix}/var ++mandir = ${prefix}/man ++mkdir_p = mkdir -p -- . ++oldincludedir = /usr/include ++prefix = /dsk/l1/misc/hcl/altest ++program_transform_name = s,x,x, ++sbindir = ${exec_prefix}/sbin ++sharedstatedir = ${prefix}/com ++sysconfdir = ${prefix}/etc ++target_alias = ++AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++-I$(top_srcdir)/pat/src \ ++-I$(top_srcdir)/ppt/src \ ++-I$(top_srcdir)/phl/src ++ ++lib_LTLIBRARIES = libPgn.la ++include_HEADERS = genpat.h ++libPgn_la_SOURCES = AFFECT.c ARRAY.c CONV.c DECLAR.c DEF_GEN.c GETCPAT.c \ ++ INIT.c LABEL.c SAVE.c SAV_GEN.c SETTUNIT.c \ ++ libpat_l.c libpat_l.h ++ ++libPgn_la_LDFLAGS = -version-info 3:3:0 ++bin_SCRIPTS = genpat ++CLEANFILES = genpat ++EXTRA_DIST = genpat.sh ++all: all-am ++ ++.SUFFIXES: ++.SUFFIXES: .c .lo .o .obj ++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) ++ @for dep in $?; do \ ++ case '$(am__configure_deps)' in \ ++ *$$dep*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ ++ && exit 0; \ ++ exit 1;; \ ++ esac; \ ++ done; \ ++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign genpat/src/Makefile'; \ ++ cd $(top_srcdir) && \ ++ $(AUTOMAKE) --foreign genpat/src/Makefile ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ ++ esac; ++ ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++ ++$(top_srcdir)/configure: $(am__configure_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++$(ACLOCAL_M4): $(am__aclocal_m4_deps) ++ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ++install-libLTLIBRARIES: $(lib_LTLIBRARIES) ++ @$(NORMAL_INSTALL) ++ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" ++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ if test -f $$p; then \ ++ f="`echo $$p | sed -e 's|^.*/||'`"; \ ++ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ ++ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ ++ else :; fi; \ ++ done ++ ++uninstall-libLTLIBRARIES: ++ @$(NORMAL_UNINSTALL) ++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ p="`echo $$p | sed -e 's|^.*/||'`"; \ ++ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ ++ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ ++ done ++ ++clean-libLTLIBRARIES: ++ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) ++ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ ++ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ ++ test "$$dir" != "$$p" || dir=.; \ ++ echo "rm -f \"$${dir}/so_locations\""; \ ++ rm -f "$${dir}/so_locations"; \ ++ done ++libPgn.la: $(libPgn_la_OBJECTS) $(libPgn_la_DEPENDENCIES) ++ $(LINK) -rpath $(libdir) $(libPgn_la_LDFLAGS) $(libPgn_la_OBJECTS) $(libPgn_la_LIBADD) $(LIBS) ++install-binSCRIPTS: $(bin_SCRIPTS) ++ @$(NORMAL_INSTALL) ++ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" ++ @list='$(bin_SCRIPTS)'; for p in $$list; do \ ++ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ ++ if test -f $$d$$p; then \ ++ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ ++ echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ ++ $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ ++ else :; fi; \ ++ done ++ ++uninstall-binSCRIPTS: ++ @$(NORMAL_UNINSTALL) ++ @list='$(bin_SCRIPTS)'; for p in $$list; do \ ++ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ ++ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ ++ rm -f "$(DESTDIR)$(bindir)/$$f"; \ ++ done ++ ++mostlyclean-compile: ++ -rm -f *.$(OBJEXT) ++ ++distclean-compile: ++ -rm -f *.tab.c ++ ++include ./$(DEPDIR)/AFFECT.Plo ++include ./$(DEPDIR)/ARRAY.Plo ++include ./$(DEPDIR)/CONV.Plo ++include ./$(DEPDIR)/DECLAR.Plo ++include ./$(DEPDIR)/DEF_GEN.Plo ++include ./$(DEPDIR)/GETCPAT.Plo ++include ./$(DEPDIR)/INIT.Plo ++include ./$(DEPDIR)/LABEL.Plo ++include ./$(DEPDIR)/SAVE.Plo ++include ./$(DEPDIR)/SAV_GEN.Plo ++include ./$(DEPDIR)/SETTUNIT.Plo ++include ./$(DEPDIR)/libpat_l.Plo ++ ++.c.o: ++ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ ++ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++# source='$<' object='$@' libtool=no \ ++# depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ ++# $(CCDEPMODE) $(depcomp) \ ++# $(COMPILE) -c $< ++ ++.c.obj: ++ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ ++ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++# source='$<' object='$@' libtool=no \ ++# depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ ++# $(CCDEPMODE) $(depcomp) \ ++# $(COMPILE) -c `$(CYGPATH_W) '$<'` ++ ++.c.lo: ++ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ ++ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi ++# source='$<' object='$@' libtool=yes \ ++# depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ ++# $(CCDEPMODE) $(depcomp) \ ++# $(LTCOMPILE) -c -o $@ $< ++ ++mostlyclean-libtool: ++ -rm -f *.lo ++ ++clean-libtool: ++ -rm -rf .libs _libs ++ ++distclean-libtool: ++ -rm -f libtool ++uninstall-info-am: ++install-includeHEADERS: $(include_HEADERS) ++ @$(NORMAL_INSTALL) ++ test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" ++ @list='$(include_HEADERS)'; for p in $$list; do \ ++ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ ++ f="`echo $$p | sed -e 's|^.*/||'`"; \ ++ echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ ++ $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ ++ done ++ ++uninstall-includeHEADERS: ++ @$(NORMAL_UNINSTALL) ++ @list='$(include_HEADERS)'; for p in $$list; do \ ++ f="`echo $$p | sed -e 's|^.*/||'`"; \ ++ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ ++ rm -f "$(DESTDIR)$(includedir)/$$f"; \ ++ done ++ ++ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ mkid -fID $$unique ++tags: TAGS ++ ++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ ++ test -n "$$unique" || unique=$$empty_fix; \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ $$tags $$unique; \ ++ fi ++ctags: CTAGS ++CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ ++ $(TAGS_FILES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ ++ unique=`for i in $$list; do \ ++ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ ++ done | \ ++ $(AWK) ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(CTAGS_ARGS)$$tags$$unique" \ ++ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ ++ $$tags $$unique ++ ++GTAGS: ++ here=`$(am__cd) $(top_builddir) && pwd` \ ++ && cd $(top_srcdir) \ ++ && gtags -i $(GTAGS_ARGS) $$here ++ ++distclean-tags: ++ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags ++ ++distdir: $(DISTFILES) ++ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ ++ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ ++ list='$(DISTFILES)'; for file in $$list; do \ ++ case $$file in \ ++ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ ++ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ ++ esac; \ ++ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ ++ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ ++ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ ++ dir="/$$dir"; \ ++ $(mkdir_p) "$(distdir)$$dir"; \ ++ else \ ++ dir=''; \ ++ fi; \ ++ if test -d $$d/$$file; then \ ++ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ ++ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ ++ fi; \ ++ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ ++ else \ ++ test -f $(distdir)/$$file \ ++ || cp -p $$d/$$file $(distdir)/$$file \ ++ || exit 1; \ ++ fi; \ ++ done ++check-am: all-am ++check: check-am ++all-am: Makefile $(LTLIBRARIES) $(SCRIPTS) $(HEADERS) ++installdirs: ++ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \ ++ test -z "$$dir" || $(mkdir_p) "$$dir"; \ ++ done ++install: install-am ++install-exec: install-exec-am ++install-data: install-data-am ++uninstall: uninstall-am ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++ ++installcheck: installcheck-am ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ ++ `test -z '$(STRIP)' || \ ++ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install ++mostlyclean-generic: ++ ++clean-generic: ++ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) ++ ++distclean-generic: ++ -rm -f $(CONFIG_CLEAN_FILES) ++ ++maintainer-clean-generic: ++ @echo "This command is intended for maintainers to use" ++ @echo "it deletes files that may require special tools to rebuild." ++clean: clean-am ++ ++clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ ++ mostlyclean-am ++ ++distclean: distclean-am ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-libtool distclean-tags ++ ++dvi: dvi-am ++ ++dvi-am: ++ ++html: html-am ++ ++info: info-am ++ ++info-am: ++ ++install-data-am: install-includeHEADERS ++ ++install-exec-am: install-binSCRIPTS install-libLTLIBRARIES ++ ++install-info: install-info-am ++ ++install-man: ++ ++installcheck-am: ++ ++maintainer-clean: maintainer-clean-am ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++maintainer-clean-am: distclean-am maintainer-clean-generic ++ ++mostlyclean: mostlyclean-am ++ ++mostlyclean-am: mostlyclean-compile mostlyclean-generic \ ++ mostlyclean-libtool ++ ++pdf: pdf-am ++ ++pdf-am: ++ ++ps: ps-am ++ ++ps-am: ++ ++uninstall-am: uninstall-binSCRIPTS uninstall-includeHEADERS \ ++ uninstall-info-am uninstall-libLTLIBRARIES ++ ++.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ ++ clean-libLTLIBRARIES clean-libtool ctags distclean \ ++ distclean-compile distclean-generic distclean-libtool \ ++ distclean-tags distdir dvi dvi-am html html-am info info-am \ ++ install install-am install-binSCRIPTS install-data \ ++ install-data-am install-exec install-exec-am \ ++ install-includeHEADERS install-info install-info-am \ ++ install-libLTLIBRARIES install-man install-strip installcheck \ ++ installcheck-am installdirs maintainer-clean \ ++ maintainer-clean-generic mostlyclean mostlyclean-compile \ ++ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ ++ tags uninstall uninstall-am uninstall-binSCRIPTS \ ++ uninstall-includeHEADERS uninstall-info-am \ ++ uninstall-libLTLIBRARIES ++ ++ ++genpat : ${srcdir}/genpat.sh ++ ${SED} 's,__ALLIANCE_INSTALL_DIR__,$(ALLIANCE_INSTALL_DIR),' $< > $@ ++ chmod a+x $@ ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: +diff -Naur alliance-5.0/genpat/src/Makefile.in alliance/genpat/src/Makefile.in +--- alliance-5.0/genpat/src/Makefile.in 2007-07-18 19:04:35.000000000 +0200 ++++ alliance/genpat/src/Makefile.in 2009-06-13 22:27:31.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.9.2 from Makefile.am. ++# Makefile.in generated by automake 1.9.6 from Makefile.am. + # @configure_input@ + + # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. ++# 2003, 2004, 2005 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -16,8 +16,6 @@ + + + +-SOURCES = $(libPgn_la_SOURCES) +- + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -72,11 +70,11 @@ + am__depfiles_maybe = depfiles + COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) \ ++LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) + CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link --tag=CC $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ ++LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = $(libPgn_la_SOURCES) + DIST_SOURCES = $(libPgn_la_SOURCES) +@@ -151,6 +149,9 @@ + ECHO_T = @ECHO_T@ + EGREP = @EGREP@ + ELP_DLL_VERSION = @ELP_DLL_VERSION@ ++EMULBS_MAJOR_VERSION = @EMULBS_MAJOR_VERSION@ ++EMULBS_MINOR_VERSION = @EMULBS_MINOR_VERSION@ ++EMULBS_VERSION = @EMULBS_VERSION@ + EXEEXT = @EXEEXT@ + EXP_MAJOR_VERSION = @EXP_MAJOR_VERSION@ + EXP_MINOR_VERSION = @EXP_MINOR_VERSION@ +@@ -173,6 +174,9 @@ + GRAAL_MAJOR_VERSION = @GRAAL_MAJOR_VERSION@ + GRAAL_MINOR_VERSION = @GRAAL_MINOR_VERSION@ + GRAAL_VERSION = @GRAAL_VERSION@ ++GROWSTK_MAJOR_VERSION = @GROWSTK_MAJOR_VERSION@ ++GROWSTK_MINOR_VERSION = @GROWSTK_MINOR_VERSION@ ++GROWSTK_VERSION = @GROWSTK_VERSION@ + INCLUDE_MOTIF = @INCLUDE_MOTIF@ + INSTALL_DATA = @INSTALL_DATA@ + INSTALL_PROGRAM = @INSTALL_PROGRAM@ +@@ -239,6 +243,9 @@ + OCP_MAJOR_VERSION = @OCP_MAJOR_VERSION@ + OCP_MINOR_VERSION = @OCP_MINOR_VERSION@ + OCP_VERSION = @OCP_VERSION@ ++OCR_MAJOR_VERSION = @OCR_MAJOR_VERSION@ ++OCR_MINOR_VERSION = @OCR_MINOR_VERSION@ ++OCR_VERSION = @OCR_VERSION@ + PACKAGE = @PACKAGE@ + PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ + PACKAGE_NAME = @PACKAGE_NAME@ +@@ -250,6 +257,9 @@ + PAT2SPI_VERSION = @PAT2SPI_VERSION@ + PATH_SEPARATOR = @PATH_SEPARATOR@ + PAT_DLL_VERSION = @PAT_DLL_VERSION@ ++PCBS_MAJOR_VERSION = @PCBS_MAJOR_VERSION@ ++PCBS_MINOR_VERSION = @PCBS_MINOR_VERSION@ ++PCBS_VERSION = @PCBS_VERSION@ + PGN_DLL_VERSION = @PGN_DLL_VERSION@ + PHL_DLL_VERSION = @PHL_DLL_VERSION@ + PPT_DLL_VERSION = @PPT_DLL_VERSION@ +@@ -299,6 +309,9 @@ + VPD_DLL_VERSION = @VPD_DLL_VERSION@ + VPN_DLL_VERSION = @VPN_DLL_VERSION@ + VRD_DLL_VERSION = @VRD_DLL_VERSION@ ++VST2XNF_MAJOR_VERSION = @VST2XNF_MAJOR_VERSION@ ++VST2XNF_MINOR_VERSION = @VST2XNF_MINOR_VERSION@ ++VST2XNF_VERSION = @VST2XNF_VERSION@ + VTL_DLL_VERSION = @VTL_DLL_VERSION@ + VVH_DLL_VERSION = @VVH_DLL_VERSION@ + X11_LIBS = @X11_LIBS@ +@@ -306,6 +319,9 @@ + XFSM_MAJOR_VERSION = @XFSM_MAJOR_VERSION@ + XFSM_MINOR_VERSION = @XFSM_MINOR_VERSION@ + XFSM_VERSION = @XFSM_VERSION@ ++XGRA_MAJOR_VERSION = @XGRA_MAJOR_VERSION@ ++XGRA_MINOR_VERSION = @XGRA_MINOR_VERSION@ ++XGRA_VERSION = @XGRA_VERSION@ + XM_LIBS = @XM_LIBS@ + XPAT_MAJOR_VERSION = @XPAT_MAJOR_VERSION@ + XPAT_MINOR_VERSION = @XPAT_MINOR_VERSION@ diff --git a/alliance-genview.patch b/alliance-genview.patch new file mode 100644 index 0000000..c754c5c --- /dev/null +++ b/alliance-genview.patch @@ -0,0 +1,201935 @@ +diff -Naur alliance-5.0/genview/src/gcc-1.42/alloca.c alliance/genview/src/gcc-1.42/alloca.c +--- alliance-5.0/genview/src/gcc-1.42/alloca.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/alloca.c 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,214 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* ++ alloca -- (mostly) portable public-domain implementation -- D A Gwyn ++ ++ last edit: 86/05/30 rms ++ include config.h, since on VMS it renames some symbols. ++ Use xmalloc instead of malloc. ++ ++ This implementation of the PWB library alloca() function, ++ which is used to allocate space off the run-time stack so ++ that it is automatically reclaimed upon procedure exit, ++ was inspired by discussions with J. Q. Johnson of Cornell. ++ ++ It should work under any C implementation that uses an ++ actual procedure stack (as opposed to a linked list of ++ frames). There are some preprocessor constants that can ++ be defined when compiling for your specific system, for ++ improved efficiency; however, the defaults should be okay. ++ ++ The general concept of this implementation is to keep ++ track of all alloca()-allocated blocks, and reclaim any ++ that are found to be deeper in the stack than the current ++ invocation. This heuristic does not reclaim storage as ++ soon as it becomes invalid, but it will do so eventually. ++ ++ As a special case, alloca(0) reclaims storage without ++ allocating any. It is a good idea to use alloca(0) in ++ your main control loop, etc. to force garbage collection. ++*/ ++#ifndef lint ++static char SCCSid[] = "@(#)alloca.c 1.1"; /* for the "what" utility */ ++#endif ++ ++#ifdef emacs ++#include "config.h" ++#ifdef static ++/* actually, only want this if static is defined as "" ++ -- this is for usg, in which emacs must undefine static ++ in order to make unexec workable ++ */ ++#ifndef STACK_DIRECTION ++you ++lose ++-- must know STACK_DIRECTION at compile-time ++#endif /* STACK_DIRECTION undefined */ ++#endif static ++#endif emacs ++ ++#ifdef X3J11 ++typedef void *pointer; /* generic pointer type */ ++#else ++typedef char *pointer; /* generic pointer type */ ++#endif ++ ++#define NULL 0 /* null pointer constant */ ++ ++extern void free(); ++extern pointer xmalloc(); ++ ++/* ++ Define STACK_DIRECTION if you know the direction of stack ++ growth for your system; otherwise it will be automatically ++ deduced at run-time. ++ ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown ++*/ ++ ++#ifndef STACK_DIRECTION ++#define STACK_DIRECTION 0 /* direction unknown */ ++#endif ++ ++#if STACK_DIRECTION != 0 ++ ++#define STACK_DIR STACK_DIRECTION /* known at compile-time */ ++ ++#else /* STACK_DIRECTION == 0; need run-time code */ ++ ++static int stack_dir; /* 1 or -1 once known */ ++#define STACK_DIR stack_dir ++ ++static void ++find_stack_direction (/* void */) ++{ ++ static char *addr = NULL; /* address of first ++ `dummy', once known */ ++ auto char dummy; /* to get stack address */ ++ ++ if (addr == NULL) ++ { /* initial entry */ ++ addr = &dummy; ++ ++ find_stack_direction (); /* recurse once */ ++ } ++ else /* second entry */ ++ if (&dummy > addr) ++ stack_dir = 1; /* stack grew upward */ ++ else ++ stack_dir = -1; /* stack grew downward */ ++} ++ ++#endif /* STACK_DIRECTION == 0 */ ++ ++/* ++ An "alloca header" is used to: ++ (a) chain together all alloca()ed blocks; ++ (b) keep track of stack depth. ++ ++ It is very important that sizeof(header) agree with malloc() ++ alignment chunk size. The following default should work okay. ++*/ ++ ++#ifndef ALIGN_SIZE ++#define ALIGN_SIZE sizeof(double) ++#endif ++ ++typedef union hdr ++{ ++ char align[ALIGN_SIZE]; /* to force sizeof(header) */ ++ struct ++ { ++ union hdr *next; /* for chaining headers */ ++ char *deep; /* for stack depth measure */ ++ } h; ++} header; ++ ++/* ++ alloca( size ) returns a pointer to at least `size' bytes of ++ storage which will be automatically reclaimed upon exit from ++ the procedure that called alloca(). Originally, this space ++ was supposed to be taken from the current stack frame of the ++ caller, but that method cannot be made to work for some ++ implementations of C, for example under Gould's UTX/32. ++*/ ++ ++static header *last_alloca_header = NULL; /* -> last alloca header */ ++ ++pointer ++alloca (size) /* returns pointer to storage */ ++ unsigned size; /* # bytes to allocate */ ++{ ++ auto char probe; /* probes stack depth: */ ++ register char *depth = &probe; ++ ++#if STACK_DIRECTION == 0 ++ if (STACK_DIR == 0) /* unknown growth direction */ ++ find_stack_direction (); ++#endif ++ ++ /* Reclaim garbage, defined as all alloca()ed storage that ++ was allocated from deeper in the stack than currently. */ ++ ++ { ++ register header *hp; /* traverses linked list */ ++ ++ for (hp = last_alloca_header; hp != NULL;) ++ if (STACK_DIR > 0 && hp->h.deep > depth ++ || STACK_DIR < 0 && hp->h.deep < depth) ++ { ++ register header *np = hp->h.next; ++ ++ free ((pointer) hp); /* collect garbage */ ++ ++ hp = np; /* -> next header */ ++ } ++ else ++ break; /* rest are not deeper */ ++ ++ last_alloca_header = hp; /* -> last valid storage */ ++ } ++ ++ if (size == 0) ++ return NULL; /* no allocation required */ ++ ++ /* Allocate combined header + user data storage. */ ++ ++ { ++ register pointer new = xmalloc (sizeof (header) + size); ++ /* address of header */ ++ ++ ((header *)new)->h.next = last_alloca_header; ++ ((header *)new)->h.deep = depth; ++ ++ last_alloca_header = (header *)new; ++ ++ /* User storage begins just after header. */ ++ ++ return (pointer)((char *)new + sizeof(header)); ++ } ++} ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/assert.h alliance/genview/src/gcc-1.42/assert.h +--- alliance-5.0/genview/src/gcc-1.42/assert.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/assert.h 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,55 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Allow this file to be included multiple times ++ with different settings of NDEBUG. */ ++#undef assert ++#undef __assert ++ ++#ifdef NDEBUG ++#define assert(ignore) ((void)0) ++#else ++ ++void __eprintf (); /* Defined in gnulib */ ++ ++#ifdef __STDC__ ++ ++#define assert(expression) \ ++ ((void) ((expression) ? 0 : __assert (#expression, __FILE__, __LINE__))) ++ ++#define __assert(expression, file, lineno) \ ++ (__eprintf ("Failed assertion `%s' at line %d of `%s'.\n", \ ++ expression, lineno, file), 0) ++ ++#else /* no __STDC__; i.e. -traditional. */ ++ ++#define assert(expression) \ ++ ((void) ((expression) ? 0 : __assert (expression, __FILE__, __LINE__))) ++ ++#define __assert(expression, file, lineno) \ ++ (__eprintf ("Failed assertion `%s' at line %d of `%s'.\n", \ ++ "expression", lineno, file), 0) ++ ++#endif /* no __STDC__; i.e. -traditional. */ ++ ++#endif +diff -Naur alliance-5.0/genview/src/gcc-1.42/aux-output.c alliance/genview/src/gcc-1.42/aux-output.c +--- alliance-5.0/genview/src/gcc-1.42/aux-output.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/aux-output.c 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,157 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* ++ * Description de la machine virtuelle ++ * ++ * Ecrit par Arnaud COMPAN & Francois PECHEUX ** avril-juin 1990 ++ * Avec quelques modifications par Frederic Petrot. ++ */ ++ ++#ifndef FILE ++#include ++#endif ++ ++#define AT_SP(mode) (gen_rtx (MEM, (mode), stack_pointer_rtx)) ++#define AT_BP(mode) (gen_rtx (MEM, (mode), frame_pointer_rtx)) ++ ++#define RET return "" ++ ++#define RETCOM(X) return "" ++ ++extern FILE *asm_out_file; ++static char *singlemove_string (); ++static void output_movf (); ++static void replace_float_constant (); ++static int mentions_fp_top (); ++static int call_top_dead_p (); ++static int fp_top_dead_p1 (); ++static rtx via_memory (); ++static void output_asm_insn_double_reg_op (); ++ ++#define PRINT_REG(X, CODE, FILE) fprintf (FILE, "%s", reg_name[REGNO (X)]) ++ ++notice_update_cc(exp) ++rtx exp; ++{ ++ if (GET_CODE (exp) == SET) { ++ if (SET_DEST (exp) == pc_rtx) ++ return; ++ if (REG_P (SET_DEST (exp)) ++ && (REG_P (SET_SRC (exp)) || GET_CODE (SET_SRC (exp)) == MEM)) { ++ if (cc_status.value1 ++ && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value1)) ++ cc_status.value1 = 0; ++ if (cc_status.value2 ++ && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value2)) ++ cc_status.value2 = 0; ++ return; ++ } ++ if (GET_CODE (SET_DEST (exp)) == MEM && REG_P (SET_SRC (exp))) { ++ if (cc_status.value1 && GET_CODE (cc_status.value1) == MEM) ++ cc_status.value1 = 0; ++ if (cc_status.value2 && GET_CODE (cc_status.value2) == MEM) ++ cc_status.value2 = 0; ++ return; ++ } else if (GET_CODE (SET_SRC (exp)) == CALL) { ++ CC_STATUS_INIT; ++ return; ++ } else if (SET_DEST (exp) == cc0_rtx) { ++ CC_STATUS_INIT; ++ cc_status.value1 = SET_SRC (exp); ++ return; ++ } else if (GET_MODE (SET_SRC (exp)) == SImode) ++ switch (GET_CODE (SET_SRC (exp))) { ++ case ASHIFTRT: ++ case LSHIFTRT: ++ case ASHIFT: ++ case LSHIFT: ++ if (GET_CODE (XEXP (SET_SRC (exp), 1)) != CONST_INT) { ++ CC_STATUS_INIT; ++ break; ++ } ++ case PLUS: ++ case MINUS: ++ case NEG: ++ case AND: ++ case IOR: ++ case XOR: ++ cc_status.flags = CC_NO_OVERFLOW; ++ cc_status.value1 = SET_SRC (exp); ++ cc_status.value2 = SET_DEST (exp); ++ break; ++ default: ++ CC_STATUS_INIT; ++ } ++ else ++ CC_STATUS_INIT; ++ } else if (GET_CODE (exp) == PARALLEL ++ && GET_CODE (XVECEXP (exp, 0, 0)) == SET) { ++ if (SET_DEST (XVECEXP (exp, 0, 0)) == pc_rtx) ++ return; ++ if (SET_DEST (XVECEXP (exp, 0, 0)) == cc0_rtx) { ++ CC_STATUS_INIT; ++ cc_status.value1 = SET_SRC (XVECEXP (exp, 0, 0)); ++ return; ++ } ++ CC_STATUS_INIT; ++ } else ++ CC_STATUS_INIT; ++} ++ ++output_ascii(file, p, size) ++FILE *file; ++char *p; ++int size; ++{ ++int i; ++ ++ fprintf (file, "\t.string \""); ++ for (i = 0; i < size; i++) { ++ register int c = p[i]; ++ if (c == '\"' || c == '\\') ++ putc ('\\', file); ++ if (c >= ' ' && c < 0177) ++ putc (c, file); ++ else { ++ fprintf (file, "\\%03o", c); ++ if (i < size - 1 && p[i + 1] >= '0' && p[i + 1] <= '9') ++ fprintf (file, "\"\n\tstring \""); ++ } ++ } ++ fprintf (file, "\"\n"); ++} ++ ++int ever_good(op, mode) ++register rtx op; ++enum machine_mode mode; ++{ ++ return 1; ++} ++ ++int no_good(op, mode) ++register rtx op; ++enum machine_mode mode; ++{ ++ return 0; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/basic-block.h alliance/genview/src/gcc-1.42/basic-block.h +--- alliance-5.0/genview/src/gcc-1.42/basic-block.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/basic-block.h 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,85 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Define control and data flow tables, and regsets. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* Define the type for a pointer to a set with a bit for each ++ (hard or pseudo) register. */ ++ ++typedef long *regset; ++ ++/* Size of a regset for the current function, ++ in (1) bytes and (2) elements. */ ++ ++extern int regset_bytes; ++extern int regset_size; ++ ++/* Number of bits in each actual element of a regset. */ ++ ++#define REGSET_ELT_BITS HOST_BITS_PER_INT ++ ++/* Number of basic blocks in the current function. */ ++ ++extern int n_basic_blocks; ++ ++/* Index by basic block number, get first insn in the block. */ ++ ++extern rtx *basic_block_head; ++ ++/* Index by basic block number, get last insn in the block. */ ++ ++extern rtx *basic_block_end; ++ ++/* Index by basic block number, get address of regset ++ describing the registers live at the start of that block. */ ++ ++extern regset *basic_block_live_at_start; ++ ++/* Indexed by n, gives number of basic block that (REG n) is used in. ++ If the value is REG_BLOCK_GLOBAL (-2), ++ it means (REG n) is used in more than one basic block. ++ REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know. ++ This information remains valid for the rest of the compilation ++ of the current function; it is used to control register allocation. */ ++ ++#define REG_BLOCK_UNKNOWN -1 ++#define REG_BLOCK_GLOBAL -2 ++extern short *reg_basic_block; +diff -Naur alliance-5.0/genview/src/gcc-1.42/caller-save.c alliance/genview/src/gcc-1.42/caller-save.c +--- alliance-5.0/genview/src/gcc-1.42/caller-save.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/caller-save.c 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,689 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Save and restore call-clobbered registers which are live across a call. ++ Copyright (C) 1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++#include "config.h" ++#include "rtl.h" ++#include "insn-config.h" ++#include "flags.h" ++#include "regs.h" ++#include "hard-reg-set.h" ++#include "reload.h" ++#include "recog.h" ++#include "basic-block.h" ++ ++/* Set of hard regs currently live (during scan of all insns). */ ++ ++static HARD_REG_SET hard_regs_live; ++ ++/* The block of storage on the stack where regs are saved */ ++ ++static rtx save_block_addr; ++static int save_block_size; ++ ++/* A REG rtx for each hard register that has been saved. */ ++ ++static rtx save_reg_rtx[FIRST_PSEUDO_REGISTER]; ++ ++static void set_reg_live (); ++static void clear_reg_live (); ++static void insert_call_saves (); ++static void emit_mult_save (); ++static void emit_mult_restore (); ++static rtx grow_save_block (); ++static enum machine_mode choose_hard_reg_mode (); ++ ++/* Find the places where hard regs are live across calls and save them. */ ++ ++save_call_clobbered_regs () ++{ ++ rtx insn; ++ int b; ++ ++ if (obey_regdecls) ++ return; ++ ++ save_block_size = 0; ++ save_block_addr = 0; ++ bzero (save_reg_rtx, sizeof save_reg_rtx); ++ ++ for (b = 0; b < n_basic_blocks; b++) ++ { ++ regset regs_live = basic_block_live_at_start[b]; ++ int offset, bit, i; ++ ++ /* Compute hard regs live at start of block -- this is the ++ real hard regs marked live, plus live pseudo regs that ++ have been renumbered to hard regs. */ ++ ++#ifdef HARD_REG_SET ++ hard_regs_live = *regs_live; ++#else ++ COPY_HARD_REG_SET (hard_regs_live, regs_live); ++#endif ++ ++ for (offset = 0, i = 0; offset < regset_size; offset++) ++ { ++ if (regs_live[offset] == 0) ++ i += HOST_BITS_PER_INT; ++ else ++ for (bit = 1; bit && i < max_regno; bit <<= 1, i++) ++ if ((regs_live[offset] & bit) && reg_renumber[i] >= 0) ++ SET_HARD_REG_BIT (hard_regs_live, reg_renumber[i]); ++ } ++ ++ /* Now scan the insns in the block, keeping track of what hard ++ regs are live as we go. When we see a call, save the live ++ call-clobbered hard regs. */ ++ ++ for (insn = basic_block_head[b]; TRUE; insn = NEXT_INSN (insn)) ++ { ++ RTX_CODE code = GET_CODE (insn); ++ ++ if (code == CALL_INSN) ++ insert_call_saves (insn); ++ ++ if (code == INSN || code == CALL_INSN || code == JUMP_INSN) ++ { ++ rtx link; ++ ++ /* NB: the normal procedure is to first enliven any ++ registers set by insn, then deaden any registers that ++ had their last use at insn. This is incorrect now, ++ since multiple pseudos may have been mapped to the ++ same hard reg, and the death notes are ambiguous. So ++ it must be done in the other, safe, order. */ ++ ++ for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ++ if (REG_NOTE_KIND (link) == REG_DEAD) ++ clear_reg_live (XEXP (link, 0)); ++ ++ note_stores (PATTERN (insn), set_reg_live); ++ } ++ ++ if (insn == basic_block_end[b]) ++ break; ++ } ++ } ++} ++ ++/* Here from note_stores when an insn stores a value in a register. ++ Set the proper bit or bits in hard_regs_live. */ ++ ++static void ++set_reg_live (reg, setter) ++ rtx reg, setter; ++{ ++ register int regno; ++ ++ /* WORD is which word of a multi-register group is being stored. ++ For the case where the store is actually into a SUBREG of REG. ++ Except we don't use it; I believe the entire REG needs to be ++ live. */ ++ int word = 0; ++ ++ if (GET_CODE (reg) == SUBREG) ++ { ++ word = SUBREG_WORD (reg); ++ reg = SUBREG_REG (reg); ++ } ++ ++ if (GET_CODE (reg) != REG) ++ return; ++ ++ regno = REGNO (reg); ++ ++ /* For pseudo reg, see if it has been assigned a hardware reg. */ ++ if (reg_renumber[regno] >= 0) ++ regno = reg_renumber[regno] /* + word */; ++ ++ /* Handle hardware regs (and pseudos allocated to hard regs). */ ++ if (regno < FIRST_PSEUDO_REGISTER && ! call_fixed_regs[regno]) ++ { ++ register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ++ while (regno < last) ++ { ++ SET_HARD_REG_BIT (hard_regs_live, regno); ++ regno++; ++ } ++ } ++} ++ ++/* Here when a REG_DEAD note records the last use of a reg. Clear ++ the appropriate bit or bits in hard_regs_live. */ ++ ++static void ++clear_reg_live (reg) ++ rtx reg; ++{ ++ register int regno = REGNO (reg); ++ ++ /* For pseudo reg, see if it has been assigned a hardware reg. */ ++ if (reg_renumber[regno] >= 0) ++ regno = reg_renumber[regno]; ++ ++ /* Handle hardware regs (and pseudos allocated to hard regs). */ ++ if (regno < FIRST_PSEUDO_REGISTER && ! call_fixed_regs[regno]) ++ { ++ /* Pseudo regs already assigned hardware regs are treated ++ almost the same as explicit hardware regs. */ ++ register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ++ while (regno < last) ++ { ++ CLEAR_HARD_REG_BIT (hard_regs_live, regno); ++ regno++; ++ } ++ } ++} ++ ++/* Insert insns to save and restore live call-clobbered regs around ++ call insn INSN. */ ++ ++static void ++insert_call_saves (insn) ++ rtx insn; ++{ ++ int regno; ++ int save_block_size_needed; ++ int save_block_offset[FIRST_PSEUDO_REGISTER]; ++ ++ save_block_size_needed = 0; ++ ++ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) ++ { ++ save_block_offset[regno] = -1; ++ if (call_used_regs[regno] && ! call_fixed_regs[regno] ++ && TEST_HARD_REG_BIT (hard_regs_live, regno)) ++ { ++ enum machine_mode mode = choose_hard_reg_mode (regno); ++ int align = GET_MODE_UNIT_SIZE (mode); ++ if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT) ++ align = BIGGEST_ALIGNMENT / BITS_PER_UNIT; ++ save_block_size_needed = ++ ((save_block_size_needed + align - 1) / align) * align; ++ save_block_offset[regno] = save_block_size_needed; ++ save_block_size_needed += GET_MODE_SIZE (mode); ++ if (! save_reg_rtx[regno]) ++ save_reg_rtx[regno] = gen_rtx (REG, mode, regno); ++ } ++ } ++ ++ if (save_block_size < save_block_size_needed) ++ save_block_addr = grow_save_block (save_block_addr, ++ save_block_size_needed); ++ emit_mult_save (insn, save_block_addr, save_block_offset); ++ emit_mult_restore (insn, save_block_addr, save_block_offset); ++} ++ ++/* Emit a string of stores to save the hard regs listed in ++ OFFSET[] at address ADDR. Emit them before INSN. ++ OFFSET[reg] is -1 if reg should not be saved, or a ++ suitably-aligned offset from ADDR. ++ The offsets actually used do not have to be those listed ++ in OFFSET, but should fit in a block of the same size. */ ++ ++static void ++emit_mult_save (insn, addr, offset) ++ rtx insn, addr; ++ int offset[]; ++{ ++ int regno; ++ /* A register to use as a temporary for address calculations. */ ++ rtx tempreg; ++ /* A register that could be used as that temp if we save and restore it. */ ++ rtx can_push_reg; ++ /* Nonzero means we need to save a register to use it as TEMPREG. */ ++ int needpush; ++ /* The amount the stack is decremented to save that register (if we do). */ ++ int decrement; ++ /* Record which regs we save, in case we branch to retry. */ ++ char already_saved[FIRST_PSEUDO_REGISTER]; ++ ++ bzero (already_saved, sizeof already_saved); ++ ++ /* Hair is needed because sometimes the addresses to save in are ++ not valid (offsets too big). ++ So we need a reg, TEMPREG, to compute addresses in. ++ ++ We look first for an empty reg to use. ++ Sometimes no reg is empty. Then we push a reg, use it, and pop it. ++ ++ Sometimes the only reg to push and pop this way is one we want to save. ++ We can't save it while using it as a temporary. ++ So we save all the other registers, pop it, and go back to `retry'. ++ At that point, only this reg remains to be saved; ++ all the others already saved are empty. ++ So one of them can be the temporary for this one. */ ++ ++ /* Sometimes we can't save all the regs conveniently at once, just some. ++ If that happens, we branch back here to save the rest. */ ++ retry: ++ needpush = 0; ++ tempreg = 0; ++ can_push_reg = 0; ++ ++ /* Set NEEDPUSH if any save-addresses are not valid memory addresses. ++ If any register is available, record it in TEMPREG. ++ If any register doesn't need saving here, record it in CAN_PUSH_REG. */ ++ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) ++ { ++ if (offset[regno] >= 0 && ! already_saved[regno]) ++ { ++ rtx reg = save_reg_rtx[regno]; ++ rtx addr1 = plus_constant (addr, offset[regno]); ++ if (memory_address_p (GET_MODE (reg), addr1)) ++ needpush = 1; ++ } ++ ++ /* A call-clobbered reg that is dead, or already saved, ++ can be used as a temporary for sure, at no extra cost. */ ++ if (tempreg == 0 && call_used_regs[regno] && ! fixed_regs[regno] ++ && !(offset[regno] >= 0 && ! already_saved[regno]) ++ && HARD_REGNO_MODE_OK (regno, Pmode)) ++ { ++ tempreg = gen_rtx (REG, Pmode, regno); ++ /* Don't use it if not valid for addressing. */ ++ if (! strict_memory_address_p (QImode, tempreg)) ++ tempreg = 0; ++ } ++ ++ /* A call-saved reg can be a temporary if we push and pop it. */ ++ if (can_push_reg == 0 && ! call_used_regs[regno] ++ && HARD_REGNO_MODE_OK (regno, Pmode)) ++ { ++ can_push_reg = gen_rtx (REG, Pmode, regno); ++ /* Don't use it if not valid for addressing. */ ++ if (! strict_memory_address_p (QImode, can_push_reg)) ++ can_push_reg = 0; ++ } ++ } ++ ++ /* Clear NEEDPUSH if we already found an empty reg. */ ++ if (tempreg != 0) ++ needpush = 0; ++ ++ /* If we need a temp reg and none is free, make one free. */ ++ if (needpush) ++ { ++ /* Choose a reg, preferably not among those it is our job to save. */ ++ if (can_push_reg != 0) ++ tempreg = can_push_reg; ++ else ++ { ++ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) ++ if (offset[regno] >= 0 && !already_saved[regno] ++ && HARD_REGNO_MODE_OK (regno, Pmode)) ++ { ++ tempreg = gen_rtx (REG, Pmode, regno); ++ /* Don't use it if not valid for addressing. */ ++ if (! strict_memory_address_p (QImode, tempreg)) ++ tempreg = 0; ++ else ++ break; ++ } ++ } ++ ++ /* Push it on the stack. */ ++#ifdef STACK_GROWS_DOWNWARD ++ decrement = UNITS_PER_WORD; ++#else ++ decrement = - UNITS_PER_WORD; ++#endif ++ ++ emit_insn_before (gen_add2_insn (stack_pointer_rtx, ++ gen_rtx (CONST_INT, VOIDmode, -decrement)), ++ insn); ++ emit_insn_before (gen_move_insn (gen_rtx (MEM, Pmode, stack_pointer_rtx), ++ tempreg), ++ insn); ++ } ++ ++ /* Save the regs we are supposed to save, aside from TEMPREG. ++ Use TEMPREG for address calculations when needed. */ ++ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) ++ if (offset[regno] >= 0 && ! already_saved[regno] ++ && tempreg != 0 && REGNO (tempreg) != regno) ++ { ++ rtx reg = save_reg_rtx[regno]; ++ rtx addr1 = plus_constant (addr, offset[regno]); ++ rtx temp; ++ if (! memory_address_p (GET_MODE (reg), addr1)) ++ { ++ if (GET_CODE (addr1) != PLUS) ++ abort (); ++ if (GET_CODE (XEXP (addr1, 1)) != CONST_INT ++ || GET_CODE (XEXP (addr1, 0)) != REG) ++ abort (); ++ emit_insn_before (gen_move_insn (tempreg, XEXP (addr1, 0)), insn); ++ emit_insn_before (gen_add2_insn (tempreg, XEXP (addr1, 1)), insn); ++ addr1 = tempreg; ++ } ++ temp = gen_rtx (MEM, GET_MODE (reg), addr1); ++ emit_insn_before (gen_move_insn (temp, reg), insn); ++ already_saved[regno] = 1; ++ } ++ ++ /* If we pushed TEMPREG to make it free, pop it. */ ++ if (needpush) ++ { ++ emit_insn_before (gen_move_insn (tempreg, ++ gen_rtx (MEM, Pmode, stack_pointer_rtx)), ++ insn); ++ emit_insn_before (gen_add2_insn (stack_pointer_rtx, ++ gen_rtx (CONST_INT, VOIDmode, decrement)), ++ insn); ++ } ++ ++ /* If TEMPREG itself needs saving, go back and save it. ++ There are plenty of free regs now, those already saved. */ ++ if (tempreg != 0 ++ && offset[REGNO (tempreg)] >= 0 && ! already_saved[REGNO (tempreg)]) ++ goto retry; ++} ++ ++/* Emit a string of loads to restore the hard regs listed in ++ OFFSET[] from address ADDR; insert the loads after INSN. ++ OFFSET[reg] is -1 if reg should not be loaded, or a ++ suitably-aligned offset from ADDR. ++ The offsets actually used do not need to be those provided in ++ OFFSET, but should agree with whatever emit_mult_save does. */ ++ ++static void ++emit_mult_restore (insn, addr, offset) ++ rtx insn, addr; ++ int offset[]; ++{ ++ int regno; ++ ++ /* Number of regs now needing to be restored. */ ++ int restore_count; ++ /* A register to use as a temporary for address calculations. */ ++ rtx tempreg; ++ /* A register available for that purpose but less desirable. */ ++ rtx maybe_tempreg; ++ /* A register that could be used as that temp if we push and pop it. */ ++ rtx can_push_reg; ++ /* Nonzero means we need to push and pop a register to use it as TEMPREG. */ ++ int needpush; ++ /* The amount the stack is decremented to save that register (if we do). */ ++ int decrement; ++ /* Record which regs we restore, in case we branch to retry. */ ++ char already_restored[FIRST_PSEUDO_REGISTER]; ++ ++ bzero (already_restored, sizeof already_restored); ++ ++ /* Note: INSN can't be the last insn, since if it were, ++ no regs would live across it. */ ++ insn = NEXT_INSN (insn); ++ if (insn == 0) ++ abort (); ++ /* Now we can insert before INSN. ++ That is convenient because we can insert them in the order ++ that they should ultimately appear. */ ++ ++ /* Hair is needed because sometimes the addresses to restore from are ++ not valid (offsets too big). ++ So we need a reg, TEMPREG, to compute addresses in. ++ ++ We look first for an empty reg to use. ++ Sometimes no reg is empty. Then we push a reg, use it, and pop it. ++ ++ If all the suitable regs need to be restored, ++ that strategy won't work. So we restore all but one, using that one ++ as a temporary. Then we jump to `retry' to restore that one, ++ pushing and popping another (already restored) as a temporary. */ ++ ++ retry: ++ needpush = 0; ++ tempreg = 0; ++ can_push_reg = 0; ++ restore_count = 0; ++ ++ /* Set NEEDPUSH if any restore-addresses are not valid memory addresses. ++ If any register is available, record it in TEMPREG. ++ Otherwise, one register yet to be restored goes in MAYBE_TEMPREG, ++ and can be used as TEMPREG for any other regs to be restored. ++ If any register doesn't need restoring, record it in CAN_PUSH_REG. */ ++ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) ++ { ++ if (offset[regno] >= 0 && ! already_restored[regno]) ++ { ++ rtx reg = save_reg_rtx[regno]; ++ rtx addr1 = plus_constant (addr, offset[regno]); ++ ++ restore_count++; ++ ++ if (memory_address_p (GET_MODE (reg), addr1)) ++ needpush = 1; ++ ++ /* Find a call-clobbered reg that needs restoring. ++ We can use it as a temporary if we defer restoring it. */ ++ if (maybe_tempreg == 0) ++ { ++ maybe_tempreg = gen_rtx (REG, Pmode, regno); ++ /* Don't use it if not valid for addressing. */ ++ if (! strict_memory_address_p (QImode, maybe_tempreg)) ++ maybe_tempreg = 0; ++ } ++ } ++ ++ /* If any call-clobbered reg is dead, put it in TEMPREG. ++ It can be used as a temporary at no extra cost. */ ++ if (tempreg == 0 && call_used_regs[regno] && ! fixed_regs[regno] ++ && offset[regno] < 0 ++ && HARD_REGNO_MODE_OK (regno, Pmode)) ++ { ++ tempreg = gen_rtx (REG, Pmode, regno); ++ /* Don't use it if not valid for addressing. */ ++ if (! strict_memory_address_p (QImode, tempreg)) ++ tempreg = 0; ++ } ++ ++ /* Any non-call-clobbered reg, put in CAN_PUSH_REG. ++ It can be used as a temporary if we push and pop it. */ ++ if (can_push_reg == 0 && ! call_used_regs[regno] ++ && HARD_REGNO_MODE_OK (regno, Pmode)) ++ { ++ can_push_reg = gen_rtx (REG, Pmode, regno); ++ /* Don't use it if not valid for addressing. */ ++ if (! strict_memory_address_p (QImode, can_push_reg)) ++ can_push_reg = 0; ++ } ++ /* Any reg we already restored can be a temporary ++ if we push and pop it. */ ++ if (can_push_reg == 0 && already_restored[regno] ++ && HARD_REGNO_MODE_OK (regno, Pmode)) ++ { ++ can_push_reg = gen_rtx (REG, Pmode, regno); ++ /* Don't use it if not valid for addressing. */ ++ if (! strict_memory_address_p (QImode, can_push_reg)) ++ can_push_reg = 0; ++ } ++ } ++ ++ /* If 2 or more regs need to be restored, use one as a temp reg ++ for the rest (if we need a tempreg). */ ++ if (tempreg == 0 && maybe_tempreg != 0 && restore_count > 1) ++ tempreg = maybe_tempreg; ++ ++ /* Clear NEEDPUSH if we already found an empty reg. */ ++ if (tempreg != 0) ++ needpush = 0; ++ ++ /* If we need a temp reg and none is free, make one free. */ ++ if (needpush) ++ { ++ tempreg = can_push_reg; ++ ++ /* Push it on the stack. */ ++#ifdef STACK_GROWS_DOWNWARD ++ decrement = UNITS_PER_WORD; ++#else ++ decrement = - UNITS_PER_WORD; ++#endif ++ ++ emit_insn_before (gen_add2_insn (stack_pointer_rtx, ++ gen_rtx (CONST_INT, VOIDmode, -decrement)), ++ insn); ++ emit_insn_before (gen_move_insn (gen_rtx (MEM, Pmode, stack_pointer_rtx), ++ tempreg), ++ insn); ++ } ++ ++ /* Restore the regs we are supposed to restore, aside from TEMPREG. ++ Use TEMPREG for address calculations when needed. */ ++ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno) ++ if (offset[regno] >= 0 && ! already_restored[regno] ++ && tempreg != 0 && REGNO (tempreg) != regno) ++ { ++ rtx reg = save_reg_rtx[regno]; ++ rtx addr1 = plus_constant (addr, offset[regno]); ++ rtx temp; ++ if (! memory_address_p (GET_MODE (reg), addr1)) ++ { ++ if (GET_CODE (addr1) != PLUS) ++ abort (); ++ if (GET_CODE (XEXP (addr1, 1)) != CONST_INT ++ || GET_CODE (XEXP (addr1, 0)) != REG) ++ abort (); ++ emit_insn_before (gen_move_insn (tempreg, XEXP (addr1, 0)), insn); ++ emit_insn_before (gen_add2_insn (tempreg, XEXP (addr1, 1)), insn); ++ addr1 = tempreg; ++ } ++ temp = gen_rtx (MEM, GET_MODE (reg), addr1); ++ emit_insn_before (gen_move_insn (reg, temp), insn); ++ already_restored[regno] = 1; ++ } ++ ++ /* If we pushed TEMPREG to make it free, pop it. */ ++ if (needpush) ++ { ++ emit_insn_before (gen_move_insn (tempreg, ++ gen_rtx (MEM, Pmode, stack_pointer_rtx)), ++ insn); ++ emit_insn_before (gen_add2_insn (stack_pointer_rtx, ++ gen_rtx (CONST_INT, VOIDmode, decrement)), ++ insn); ++ } ++ ++ /* If TEMPREG itself needs restoring, go back and restore it. ++ We can find a reg already restored to push and use as a temporary. */ ++ if (tempreg != 0 ++ && offset[REGNO (tempreg)] >= 0 && ! already_restored[REGNO (tempreg)]) ++ goto retry; ++} ++ ++/* Return the address of a new block of size SIZE on the stack. ++ The old save block is at ADDR; ADDR is 0 if no block exists yet. */ ++ ++static rtx ++grow_save_block (addr, size) ++ rtx addr; ++ int size; ++{ ++ rtx newaddr; ++ ++ /* Keep the size a multiple of the main allocation unit. */ ++ size = (((size + (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1) ++ / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)) ++ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); ++ ++ /* If no save block exists yet, create one and return it. */ ++ if (! addr) ++ { ++ save_block_size = size; ++ return XEXP (assign_stack_local (BLKmode, size), 0); ++ } ++ ++ /* Get a new block and coalesce it with the old one. */ ++ newaddr = XEXP (assign_stack_local (BLKmode, size - save_block_size), 0); ++ if (GET_CODE (newaddr) == PLUS ++ && XEXP (newaddr, 0) == frame_pointer_rtx ++ && GET_CODE (XEXP (newaddr, 1)) == CONST_INT ++ && GET_CODE (addr) == PLUS ++ && XEXP (addr, 0) == frame_pointer_rtx ++ && GET_CODE (XEXP (addr, 1)) == CONST_INT ++ && ((INTVAL (XEXP (newaddr, 1)) - INTVAL (XEXP (addr, 1)) ++ == size - save_block_size) ++ || (INTVAL (XEXP (addr, 1)) - INTVAL (XEXP (newaddr, 1)) ++ == size - save_block_size))) ++ { ++ save_block_size = size; ++ if (INTVAL (XEXP (newaddr, 1)) < INTVAL (XEXP (addr, 1))) ++ return newaddr; ++ else ++ return addr; ++ } ++ ++ /* They didn't coalesce, find out why */ ++ abort (); ++ ++ save_block_size = size; ++ return XEXP (assign_stack_local (BLKmode, size), 0); ++} ++ ++/* Return a machine mode that is legitimate for hard reg REGNO ++ and large enough to save the whole register. */ ++ ++static enum machine_mode ++choose_hard_reg_mode (regno) ++ int regno; ++{ ++ enum reg_class class = REGNO_REG_CLASS (regno); ++ ++ if (CLASS_MAX_NREGS (class, DImode) == 1 ++ && HARD_REGNO_MODE_OK (regno, DImode)) ++ return DImode; ++ else if (CLASS_MAX_NREGS (class, DFmode) == 1 ++ && HARD_REGNO_MODE_OK (regno, DFmode)) ++ return DFmode; ++ else if (CLASS_MAX_NREGS (class, SImode) == 1 ++ && HARD_REGNO_MODE_OK (regno, SImode)) ++ return SImode; ++ else if (CLASS_MAX_NREGS (class, SFmode) == 1 ++ && HARD_REGNO_MODE_OK (regno, SFmode)) ++ return SFmode; ++ else if (CLASS_MAX_NREGS (class, HImode) == 1 ++ && HARD_REGNO_MODE_OK (regno, HImode)) ++ return HImode; ++ else ++ abort (); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-convert.c alliance/genview/src/gcc-1.42/c-convert.c +--- alliance-5.0/genview/src/gcc-1.42/c-convert.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-convert.c 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,420 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Language-level data type conversion for GNU C. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* This file contains the functions for converting C expressions ++ to different data types. The only entry point is `convert'. ++ Every language front end must have a `convert' function ++ but what kind of conversions it does will depend on the language. */ ++ ++#include "config.h" ++#include "tree.h" ++ ++/* Change of width--truncation and extension of integers or reals-- ++ is represented with NOP_EXPR. Proper functioning of many things ++ assumes that no other conversions can be NOP_EXPRs. ++ ++ Conversion between integer and pointer is represented with CONVERT_EXPR. ++ Converting integer to real uses FLOAT_EXPR ++ and real to integer uses FIX_TRUNC_EXPR. ++ ++ Here is a list of all the functions that assume that widening and ++ narrowing is always done with a NOP_EXPR: ++ In c-convert.c, convert_to_integer. ++ In c-typeck.c, build_binary_op_nodefault (boolean ops), ++ and truthvalue_conversion. ++ In expr.c: expand_expr, for operands of a MULT_EXPR. ++ In fold-const.c: fold. ++ In tree.c: get_narrower and get_unwidened. */ ++ ++/* Subroutines of `convert'. */ ++ ++static tree ++convert_to_pointer (type, expr) ++ tree type, expr; ++{ ++ register tree intype = TREE_TYPE (expr); ++ register enum tree_code form = TREE_CODE (intype); ++ ++ if (integer_zerop (expr)) ++ { ++ if (type == TREE_TYPE (null_pointer_node)) ++ return null_pointer_node; ++ expr = build_int_2 (0, 0); ++ TREE_TYPE (expr) = type; ++ return expr; ++ } ++ ++ if (form == POINTER_TYPE) ++ return build (NOP_EXPR, type, expr); ++ ++ ++ if (form == INTEGER_TYPE || form == ENUMERAL_TYPE) ++ { ++ if (type_precision (intype) == POINTER_SIZE) ++ return build (CONVERT_EXPR, type, expr); ++ return convert_to_pointer (type, ++ convert (type_for_size (POINTER_SIZE, 0), ++ expr)); ++ } ++ ++ error ("cannot convert to a pointer type"); ++ ++ return null_pointer_node; ++} ++ ++static tree ++convert_to_real (type, expr) ++ tree type, expr; ++{ ++ register enum tree_code form = TREE_CODE (TREE_TYPE (expr)); ++ extern int flag_float_store; ++ ++ if (form == REAL_TYPE) ++ return build (flag_float_store ? CONVERT_EXPR : NOP_EXPR, ++ type, expr); ++ ++ if (form == INTEGER_TYPE || form == ENUMERAL_TYPE) ++ return build (FLOAT_EXPR, type, expr); ++ ++ if (form == POINTER_TYPE) ++ error ("pointer value used where a float was expected"); ++ else ++ error ("aggregate value used where a float was expected"); ++ ++ { ++ register tree tem = make_node (REAL_CST); ++ TREE_TYPE (tem) = type; ++ TREE_REAL_CST (tem) = REAL_VALUE_ATOF ("0.0"); ++ return tem; ++ } ++} ++ ++/* The result of this is always supposed to be a newly created tree node ++ not in use in any existing structure. */ ++ ++static tree ++convert_to_integer (type, expr) ++ tree type, expr; ++{ ++ register tree intype = TREE_TYPE (expr); ++ register enum tree_code form = TREE_CODE (intype); ++ extern tree build_binary_op_nodefault (); ++ extern tree build_unary_op (); ++ ++ if (form == POINTER_TYPE) ++ { ++ if (integer_zerop (expr)) ++ expr = integer_zero_node; ++ else ++ expr = fold (build (CONVERT_EXPR, ++ type_for_size (POINTER_SIZE, 0), expr)); ++ intype = TREE_TYPE (expr); ++ form = TREE_CODE (intype); ++ if (intype == type) ++ return expr; ++ } ++ ++ if (form == INTEGER_TYPE || form == ENUMERAL_TYPE) ++ { ++ register int outprec = TYPE_PRECISION (type); ++ register int inprec = TYPE_PRECISION (intype); ++ register enum tree_code ex_form = TREE_CODE (expr); ++ ++ if (outprec >= inprec) ++ return build (NOP_EXPR, type, expr); ++ ++/* Here detect when we can distribute the truncation down past some arithmetic. ++ For example, if adding two longs and converting to an int, ++ we can equally well convert both to ints and then add. ++ For the operations handled here, such truncation distribution ++ is always safe. ++ It is desirable in these cases: ++ 1) when truncating down to full-word from a larger size ++ 2) when truncating takes no work. ++ 3) when at least one operand of the arithmetic has been extended ++ (as by C's default conversions). In this case we need two conversions ++ if we do the arithmetic as already requested, so we might as well ++ truncate both and then combine. Perhaps that way we need only one. ++ ++ Note that in general we cannot do the arithmetic in a type ++ shorter than the desired result of conversion, even if the operands ++ are both extended from a shorter type, because they might overflow ++ if combined in that type. The exceptions to this--the times when ++ two narrow values can be combined in their narrow type even to ++ make a wider result--are handled by "shorten" in build_binary_op. */ ++ ++ switch (ex_form) ++ { ++ case RSHIFT_EXPR: ++ /* We can pass truncation down through right shifting ++ when the shift count is a negative constant. */ ++ if (TREE_CODE (TREE_OPERAND (expr, 1)) != INTEGER_CST ++ || TREE_INT_CST_LOW (TREE_OPERAND (expr, 1)) > 0) ++ break; ++ goto trunc1; ++ ++ case LSHIFT_EXPR: ++ /* We can pass truncation down through left shifting ++ when the shift count is a positive constant. */ ++ if (TREE_CODE (TREE_OPERAND (expr, 1)) != INTEGER_CST ++ || TREE_INT_CST_LOW (TREE_OPERAND (expr, 1)) < 0) ++ break; ++ /* In this case, shifting is like multiplication. */ ++ goto trunc1; ++ ++ case MAX_EXPR: ++ case MIN_EXPR: ++ case MULT_EXPR: ++ { ++ tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type); ++ tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type); ++ ++ /* Don't distribute unless the output precision is at least as big ++ as the actual inputs. Otherwise, the comparison of the ++ truncated values will be wrong. */ ++ if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0)) ++ && outprec >= TYPE_PRECISION (TREE_TYPE (arg1)) ++ /* If signedness of arg0 and arg1 don't match, ++ we can't necessarily find a type to compare them in. */ ++ && (TREE_UNSIGNED (TREE_TYPE (arg0)) ++ == TREE_UNSIGNED (TREE_TYPE (arg1)))) ++ goto trunc1; ++ break; ++ } ++ ++ case PLUS_EXPR: ++ case MINUS_EXPR: ++ case BIT_AND_EXPR: ++ case BIT_IOR_EXPR: ++ case BIT_XOR_EXPR: ++ case BIT_ANDTC_EXPR: ++ trunc1: ++ { ++ tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type); ++ tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type); ++ ++ if (outprec >= BITS_PER_WORD ++ || TRULY_NOOP_TRUNCATION (outprec, inprec) ++ || inprec > TYPE_PRECISION (TREE_TYPE (arg0)) ++ || inprec > TYPE_PRECISION (TREE_TYPE (arg1))) ++ { ++ /* Do the arithmetic in type TYPEX, ++ then convert result to TYPE. */ ++ register tree typex = type; ++ ++ /* Can't do arithmetic in enumeral types ++ so use an integer type that will hold the values. */ ++ if (TREE_CODE (typex) == ENUMERAL_TYPE) ++ typex = type_for_size (TYPE_PRECISION (typex), ++ TREE_UNSIGNED (typex)); ++ ++ /* But now perhaps TYPEX is as wide as INPREC. ++ In that case, do nothing special here. ++ (Otherwise would recurse infinitely in convert. */ ++ if (TYPE_PRECISION (typex) != inprec) ++ { ++ /* Don't do unsigned arithmetic where signed was wanted, ++ or vice versa. ++ Exception: if the original operands were unsigned ++ then can safely do the work as unsigned. ++ And we may need to do it as unsigned ++ if we truncate to the original size. */ ++ typex = ((TREE_UNSIGNED (TREE_TYPE (expr)) ++ || TREE_UNSIGNED (TREE_TYPE (arg0))) ++ ? unsigned_type (typex) : signed_type (typex)); ++ return convert (type, ++ build_binary_op_nodefault (ex_form, ++ convert (typex, arg0), ++ convert (typex, arg1), ++ ex_form)); ++ } ++ } ++ } ++ break; ++ ++ case EQ_EXPR: ++ case NE_EXPR: ++ case GT_EXPR: ++ case GE_EXPR: ++ case LT_EXPR: ++ case LE_EXPR: ++ case TRUTH_AND_EXPR: ++ case TRUTH_ANDIF_EXPR: ++ case TRUTH_OR_EXPR: ++ case TRUTH_ORIF_EXPR: ++ case TRUTH_NOT_EXPR: ++ /* If we want result of comparison converted to a byte, ++ we can just regard it as a byte, since it is 0 or 1. */ ++ TREE_TYPE (expr) = type; ++ return expr; ++ ++ case NEGATE_EXPR: ++ case BIT_NOT_EXPR: ++ case ABS_EXPR: ++ { ++ register tree typex = type; ++ ++ /* Can't do arithmetic in enumeral types ++ so use an integer type that will hold the values. */ ++ if (TREE_CODE (typex) == ENUMERAL_TYPE) ++ typex = type_for_size (TYPE_PRECISION (typex), ++ TREE_UNSIGNED (typex)); ++ ++ /* But now perhaps TYPEX is as wide as INPREC. ++ In that case, do nothing special here. ++ (Otherwise would recurse infinitely in convert. */ ++ if (TYPE_PRECISION (typex) != inprec) ++ { ++ /* Don't do unsigned arithmetic where signed was wanted, ++ or vice versa. */ ++ typex = (TREE_UNSIGNED (TREE_TYPE (expr)) ++ ? unsigned_type (typex) : signed_type (typex)); ++ return convert (type, ++ build_unary_op (ex_form, ++ convert (typex, TREE_OPERAND (expr, 0)), ++ 1)); ++ } ++ } ++ ++ case NOP_EXPR: ++ /* If truncating after truncating, might as well do all at once. ++ If truncating after extending, we may get rid of wasted work. */ ++ return convert (type, get_unwidened (TREE_OPERAND (expr, 0), type)); ++ ++ case COND_EXPR: ++ /* Can treat the two alternative values like the operands ++ of an arithmetic expression. */ ++ { ++ tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type); ++ tree arg2 = get_unwidened (TREE_OPERAND (expr, 2), type); ++ ++ if (outprec >= BITS_PER_WORD ++ || TRULY_NOOP_TRUNCATION (outprec, inprec) ++ || inprec > TYPE_PRECISION (TREE_TYPE (arg1)) ++ || inprec > TYPE_PRECISION (TREE_TYPE (arg2))) ++ { ++ /* Do the arithmetic in type TYPEX, ++ then convert result to TYPE. */ ++ register tree typex = type; ++ ++ /* Can't do arithmetic in enumeral types ++ so use an integer type that will hold the values. */ ++ if (TREE_CODE (typex) == ENUMERAL_TYPE) ++ typex = type_for_size (TYPE_PRECISION (typex), ++ TREE_UNSIGNED (typex)); ++ ++ /* But now perhaps TYPEX is as wide as INPREC. ++ In that case, do nothing special here. ++ (Otherwise would recurse infinitely in convert. */ ++ if (TYPE_PRECISION (typex) != inprec) ++ { ++ /* Don't do unsigned arithmetic where signed was wanted, ++ or vice versa. */ ++ typex = (TREE_UNSIGNED (TREE_TYPE (expr)) ++ ? unsigned_type (typex) : signed_type (typex)); ++ return convert (type, ++ build (COND_EXPR, typex, ++ TREE_OPERAND (expr, 0), ++ convert (typex, arg1), ++ convert (typex, arg2))); ++ } ++ } ++ } ++ ++ } ++ ++ return build (NOP_EXPR, type, expr); ++ } ++ ++ if (form == REAL_TYPE) ++ return build (FIX_TRUNC_EXPR, type, expr); ++ ++ error ("aggregate value used where an integer was expected"); ++ ++ { ++ register tree tem = build_int_2 (0, 0); ++ TREE_TYPE (tem) = type; ++ return tem; ++ } ++} ++ ++/* Create an expression whose value is that of EXPR, ++ converted to type TYPE. The TREE_TYPE of the value ++ is always TYPE. This function implements all reasonable ++ conversions; callers should filter out those that are ++ not permitted by the language being compiled. */ ++ ++tree ++convert (type, expr) ++ tree type, expr; ++{ ++ register tree e = expr; ++ register enum tree_code code = TREE_CODE (type); ++ ++ if (type == TREE_TYPE (expr) || TREE_CODE (expr) == ERROR_MARK) ++ return expr; ++ if (TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK) ++ return error_mark_node; ++ if (TREE_CODE (TREE_TYPE (expr)) == VOID_TYPE) ++ { ++ error ("void value not ignored as it ought to be"); ++ return error_mark_node; ++ } ++ if (code == VOID_TYPE) ++ return build (CONVERT_EXPR, type, e); ++#if 0 ++ /* This is incorrect. A truncation can't be stripped this way. ++ Extensions will be stripped by the use of get_unwidened. */ ++ if (TREE_CODE (expr) == NOP_EXPR) ++ return convert (type, TREE_OPERAND (expr, 0)); ++#endif ++ if (code == INTEGER_TYPE || code == ENUMERAL_TYPE) ++ return fold (convert_to_integer (type, e)); ++ if (code == POINTER_TYPE) ++ return fold (convert_to_pointer (type, e)); ++ if (code == REAL_TYPE) ++ return fold (convert_to_real (type, e)); ++ ++ error ("conversion to non-scalar type requested"); ++ return error_mark_node; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-decl.c alliance/genview/src/gcc-1.42/c-decl.c +--- alliance-5.0/genview/src/gcc-1.42/c-decl.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-decl.c 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,4131 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Process declarations and variables for C compiler. ++ Copyright (C) 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* Process declarations and symbol lookup for C front end. ++ Also constructs types; the standard scalar types at initialization, ++ and structure, union, array and enum types when they are declared. */ ++ ++/* ??? not all decl nodes are given the most useful possible ++ line numbers. For example, the CONST_DECLs for enum values. */ ++ ++#include "config.h" ++#include "tree.h" ++#include "flags.h" ++#include "c-tree.h" ++#include "c-parse.h" ++ ++#include ++ ++/* In grokdeclarator, distinguish syntactic contexts of declarators. */ ++enum decl_context ++{ NORMAL, /* Ordinary declaration */ ++ FUNCDEF, /* Function definition */ ++ PARM, /* Declaration of parm before function body */ ++ FIELD, /* Declaration inside struct or union */ ++ TYPENAME}; /* Typename (inside cast or sizeof) */ ++ ++#undef NULL ++#define NULL 0 ++#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) ++#define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) ++ ++#ifndef CHAR_TYPE_SIZE ++#define CHAR_TYPE_SIZE BITS_PER_UNIT ++#endif ++ ++#ifndef SHORT_TYPE_SIZE ++#define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2)) ++#endif ++ ++#ifndef INT_TYPE_SIZE ++#define INT_TYPE_SIZE BITS_PER_WORD ++#endif ++ ++#ifndef LONG_TYPE_SIZE ++#define LONG_TYPE_SIZE BITS_PER_WORD ++#endif ++ ++#ifndef LONG_LONG_TYPE_SIZE ++#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2) ++#endif ++ ++#ifndef FLOAT_TYPE_SIZE ++#define FLOAT_TYPE_SIZE BITS_PER_WORD ++#endif ++ ++#ifndef DOUBLE_TYPE_SIZE ++#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2) ++#endif ++ ++#ifndef LONG_DOUBLE_TYPE_SIZE ++#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2) ++#endif ++ ++/* a node which has tree code ERROR_MARK, and whose type is itself. ++ All erroneous expressions are replaced with this node. All functions ++ that accept nodes as arguments should avoid generating error messages ++ if this node is one of the arguments, since it is undesirable to get ++ multiple error messages from one error in the input. */ ++ ++tree error_mark_node; ++ ++/* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */ ++ ++tree short_integer_type_node; ++tree integer_type_node; ++tree long_integer_type_node; ++tree long_long_integer_type_node; ++ ++tree short_unsigned_type_node; ++tree unsigned_type_node; ++tree long_unsigned_type_node; ++tree long_long_unsigned_type_node; ++ ++tree unsigned_char_type_node; ++tree signed_char_type_node; ++tree char_type_node; ++ ++tree float_type_node; ++tree double_type_node; ++tree long_double_type_node; ++ ++/* a VOID_TYPE node. */ ++ ++tree void_type_node; ++ ++/* A node for type `void *'. */ ++ ++tree ptr_type_node; ++ ++/* A node for type `char *'. */ ++ ++tree string_type_node; ++ ++/* Type `char[256]' or something like it. ++ Used when an array of char is needed and the size is irrelevant. */ ++ ++tree char_array_type_node; ++ ++/* Type `int[256]' or something like it. ++ Used when an array of int needed and the size is irrelevant. */ ++ ++tree int_array_type_node; ++ ++/* type `int ()' -- used for implicit declaration of functions. */ ++ ++tree default_function_type; ++ ++/* function types `double (double)' and `double (double, double)', etc. */ ++ ++tree double_ftype_double, double_ftype_double_double; ++tree int_ftype_int, long_ftype_long; ++ ++/* Function type `void (void *, void *, int)' and similar ones */ ++ ++tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int; ++ ++/* Two expressions that are constants with value zero. ++ The first is of type `int', the second of type `void *'. */ ++ ++tree integer_zero_node; ++tree null_pointer_node; ++ ++/* A node for the integer constant 1. */ ++ ++tree integer_one_node; ++ ++/* An identifier whose name is . This is used as the "name" ++ of the RESULT_DECLs for values of functions. */ ++ ++tree value_identifier; ++ ++/* A permanent tree_list whose value slot is the void type. */ ++ ++static tree void_list_node; ++ ++/* While defining an enum type, this is 1 plus the last enumerator ++ constant value. */ ++ ++static tree enum_next_value; ++ ++/* Parsing a function declarator leaves a list of parameter names ++ or a chain or parameter decls here. */ ++ ++static tree last_function_parms; ++ ++/* Parsing a function declarator leaves here a chain of structure ++ and enum types declared in the parmlist. */ ++ ++static tree last_function_parm_tags; ++ ++/* After parsing the declarator that starts a function definition, ++ `start_function' puts here the list of parameter names or chain of decls. ++ `store_parm_decls' finds it here. */ ++ ++static tree current_function_parms; ++ ++/* Similar, for last_function_parm_tags. */ ++static tree current_function_parm_tags; ++ ++/* A list (chain of TREE_LIST nodes) of all LABEL_STMTs in the function ++ that have names. Here so we can clear out their names' definitions ++ at the end of the function. */ ++ ++static tree named_labels; ++ ++/* The FUNCTION_DECL for the function currently being compiled, ++ or 0 if between functions. */ ++tree current_function_decl; ++ ++/* Set to 0 at beginning of a function definition, set to 1 if ++ a return statement that specifies a return value is seen. */ ++ ++int current_function_returns_value; ++ ++/* Set to 0 at beginning of a function definition, set to 1 if ++ a return statement with no argument is seen. */ ++ ++int current_function_returns_null; ++ ++/* Set to nonzero by `grokdeclarator' for a function ++ whose return type is defaulted, if warnings for this are desired. */ ++ ++static int warn_about_return_type; ++ ++/* Nonzero when starting a function delcared `extern inline'. */ ++ ++static int current_extern_inline; ++ ++/* For each binding contour we allocate a binding_level structure ++ * which records the names defined in that contour. ++ * Contours include: ++ * 0) the global one ++ * 1) one for each function definition, ++ * where internal declarations of the parameters appear. ++ * 2) one for each compound statement, ++ * to record its declarations. ++ * ++ * The current meaning of a name can be found by searching the levels from ++ * the current one out to the global one. ++ */ ++ ++/* Note that the information in the `names' component of the global contour ++ is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers. */ ++ ++struct binding_level ++ { ++ /* A chain of _DECL nodes for all variables, constants, functions, ++ and typedef types. These are in the reverse of the order supplied. ++ */ ++ tree names; ++ ++ /* A list of structure, union and enum definitions, ++ * for looking up tag names. ++ * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name, ++ * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE, ++ * or ENUMERAL_TYPE node. ++ */ ++ tree tags; ++ ++ /* For each level, a list of shadowed outer-level local definitions ++ to be restored when this level is popped. ++ Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and ++ whose TREE_VALUE is its old definition (a kind of ..._DECL node). */ ++ tree shadowed; ++ ++ /* For each level (except not the global one), ++ a chain of LET_STMT nodes for all the levels ++ that were entered and exited one level down. */ ++ tree blocks; ++ ++ /* The binding level which this one is contained in (inherits from). */ ++ struct binding_level *level_chain; ++ ++ /* Nonzero for the level that holds the parameters of a function. */ ++ char parm_flag; ++ ++ /* Nonzero if this level "doesn't exist" for tags. */ ++ char tag_transparent; ++ ++ /* Nonzero means make a LET_STMT for this level regardless of all else. */ ++ char keep; ++ ++ /* Nonzero means make a LET_STMT if this level has any subblocks. */ ++ char keep_if_subblocks; ++ ++ /* Number of decls in `names' that have incomplete ++ structure or union types. */ ++ int n_incomplete; ++ }; ++ ++#define NULL_BINDING_LEVEL (struct binding_level *) NULL ++ ++/* The binding level currently in effect. */ ++ ++static struct binding_level *current_binding_level; ++ ++/* A chain of binding_level structures awaiting reuse. */ ++ ++static struct binding_level *free_binding_level; ++ ++/* The outermost binding level, for names of file scope. ++ This is created when the compiler is started and exists ++ through the entire run. */ ++ ++static struct binding_level *global_binding_level; ++ ++/* Binding level structures are initialized by copying this one. */ ++ ++static struct binding_level clear_binding_level ++ = {NULL, NULL, NULL, NULL, NULL, 0, 0, 0}; ++ ++/* Nonzero means unconditionally make a LET_STMT for the next level pushed. */ ++ ++static int keep_next_level_flag; ++ ++/* Nonzero means make a LET_STMT for the next level pushed ++ if it has subblocks. */ ++ ++static int keep_next_if_subblocks; ++ ++/* Forward declarations. */ ++ ++static tree grokparms (), grokdeclarator (); ++tree pushdecl (); ++static void builtin_function (); ++ ++static tree lookup_tag (); ++static tree lookup_tag_reverse (); ++static tree lookup_name_current_level (); ++static char *redeclaration_error_message (); ++static void layout_array_type (); ++ ++/* C-specific option variables. */ ++ ++/* Nonzero means allow type mismatches in conditional expressions; ++ just make their values `void'. */ ++ ++int flag_cond_mismatch; ++ ++/* Nonzero means don't recognize the keyword `asm'. */ ++ ++int flag_no_asm; ++ ++/* Nonzero means do some things the same way PCC does. */ ++ ++int flag_traditional; ++ ++/* Nonzero means warn about implicit declarations. */ ++ ++int warn_implicit; ++ ++/* Nonzero means warn about function definitions that default the return type ++ or that use a null return and have a return-type other than void. */ ++ ++int warn_return_type; ++ ++/* Nonzero means give string constants the type `const char *' ++ to get extra warnings from them. These warnings will be too numerous ++ to be useful, except in thoroughly ANSIfied programs. */ ++ ++int warn_write_strings; ++ ++/* Nonzero means warn about pointer casts that can drop a type qualifier ++ from the pointer target type. */ ++ ++int warn_cast_qual; ++ ++/* Nonzero means warn about sizeof(function) or addition/subtraction ++ of function pointers. */ ++ ++int warn_pointer_arith; ++ ++/* Nonzero means warn for all old-style non-prototype function decls. */ ++ ++int warn_strict_prototypes; ++ ++/* Nonzero means `$' can be in an identifier. ++ See cccp.c for reasons why this breaks some obscure ANSI C programs. */ ++ ++#ifndef DOLLARS_IN_IDENTIFIERS ++#define DOLLARS_IN_IDENTIFIERS 0 ++#endif ++int dollars_in_ident = DOLLARS_IN_IDENTIFIERS; ++ ++char *language_string = "GNU C"; ++ ++/* Decode the string P as a language-specific option. ++ Return 1 if it is recognized (and handle it); ++ return 0 if not recognized. */ ++ ++int ++lang_decode_option (p) ++ char *p; ++{ ++ if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional")) ++ flag_traditional = 1, dollars_in_ident = 1, flag_writable_strings = 1; ++ else if (!strcmp (p, "-fsigned-char")) ++ flag_signed_char = 1; ++ else if (!strcmp (p, "-funsigned-char")) ++ flag_signed_char = 0; ++ else if (!strcmp (p, "-fno-signed-char")) ++ flag_signed_char = 0; ++ else if (!strcmp (p, "-fno-unsigned-char")) ++ flag_signed_char = 1; ++ else if (!strcmp (p, "-fshort-enums")) ++ flag_short_enums = 1; ++ else if (!strcmp (p, "-fno-short-enums")) ++ flag_short_enums = 0; ++ else if (!strcmp (p, "-fcond-mismatch")) ++ flag_cond_mismatch = 1; ++ else if (!strcmp (p, "-fno-cond-mismatch")) ++ flag_cond_mismatch = 0; ++ else if (!strcmp (p, "-fasm")) ++ flag_no_asm = 0; ++ else if (!strcmp (p, "-fno-asm")) ++ flag_no_asm = 1; ++ else if (!strcmp (p, "-ansi")) ++ flag_no_asm = 1, dollars_in_ident = 0; ++ else if (!strcmp (p, "-Wimplicit")) ++ warn_implicit = 1; ++ else if (!strcmp (p, "-Wreturn-type")) ++ warn_return_type = 1; ++ else if (!strcmp (p, "-Wwrite-strings")) ++ warn_write_strings = 1; ++ else if (!strcmp (p, "-Wcast-qual")) ++ warn_cast_qual = 1; ++ else if (!strcmp (p, "-Wpointer-arith")) ++ warn_pointer_arith = 1; ++ else if (!strcmp (p, "-Wstrict-prototypes")) ++ warn_strict_prototypes = 1; ++ else if (!strcmp (p, "-Wcomment")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wcomments")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wtrigraphs")) ++ ; /* cpp handles this one. */ ++ else if (!strcmp (p, "-Wall")) ++ { ++ extra_warnings = 1; ++ warn_implicit = 1; ++ warn_return_type = 1; ++ warn_unused = 1; ++ warn_switch = 1; ++ } ++ else ++ return 0; ++ ++ return 1; ++} ++ ++void ++print_lang_identifier (file, node, indent) ++ FILE *file; ++ tree node; ++ int indent; ++{ ++ print_node (file, "global", IDENTIFIER_GLOBAL_VALUE (node), indent + 4); ++ print_node (file, "local", IDENTIFIER_LOCAL_VALUE (node), indent + 4); ++ print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4); ++ print_node (file, "implicit", IDENTIFIER_IMPLICIT_DECL (node), indent + 4); ++ print_node (file, "error locus", IDENTIFIER_ERROR_LOCUS (node), indent + 4); ++} ++ ++/* Create a new `struct binding_level'. */ ++ ++static ++struct binding_level * ++make_binding_level () ++{ ++ /* NOSTRICT */ ++ return (struct binding_level *) xmalloc (sizeof (struct binding_level)); ++} ++ ++/* Nonzero if we are currently in the global binding level. */ ++ ++int ++global_bindings_p () ++{ ++ return current_binding_level == global_binding_level; ++} ++ ++void ++keep_next_level () ++{ ++ keep_next_level_flag = 1; ++} ++ ++/* Nonzero if the current level needs to have a LET_STMT made. */ ++ ++int ++kept_level_p () ++{ ++ return ((current_binding_level->keep_if_subblocks ++ && current_binding_level->blocks != 0) ++ || current_binding_level->keep ++ || current_binding_level->names != 0); ++} ++ ++/* Identify this binding level as a level of parameters. */ ++ ++void ++declare_parm_level () ++{ ++ current_binding_level->parm_flag = 1; ++} ++ ++/* Nonzero if currently making parm declarations. */ ++ ++in_parm_level_p () ++{ ++ return current_binding_level->parm_flag; ++} ++ ++/* Enter a new binding level. ++ If TAG_TRANSPARENT is nonzero, do so only for the name space of variables, ++ not for that of tags. */ ++ ++void ++pushlevel (tag_transparent) ++ int tag_transparent; ++{ ++ register struct binding_level *newlevel = NULL_BINDING_LEVEL; ++ ++ /* If this is the top level of a function, ++ just make sure that NAMED_LABELS is 0. ++ They should have been set to 0 at the end of the previous function. */ ++ ++ if (current_binding_level == global_binding_level) ++ { ++ if (named_labels) ++ abort (); ++ } ++ ++ /* Reuse or create a struct for this binding level. */ ++ ++ if (free_binding_level) ++ { ++ newlevel = free_binding_level; ++ free_binding_level = free_binding_level->level_chain; ++ } ++ else ++ { ++ newlevel = make_binding_level (); ++ } ++ ++ /* Add this level to the front of the chain (stack) of levels that ++ are active. */ ++ ++ *newlevel = clear_binding_level; ++ newlevel->level_chain = current_binding_level; ++ current_binding_level = newlevel; ++ newlevel->tag_transparent = tag_transparent; ++ newlevel->keep = keep_next_level_flag; ++ keep_next_level_flag = 0; ++ newlevel->keep_if_subblocks = keep_next_if_subblocks; ++ keep_next_if_subblocks = 0; ++} ++ ++/* Exit a binding level. ++ Pop the level off, and restore the state of the identifier-decl mappings ++ that were in effect when this level was entered. ++ ++ If KEEP is nonzero, this level had explicit declarations, so ++ and create a "block" (a LET_STMT node) for the level ++ to record its declarations and subblocks for symbol table output. ++ ++ If FUNCTIONBODY is nonzero, this level is the body of a function, ++ so create a block as if KEEP were set and also clear out all ++ label names. ++ ++ If REVERSE is nonzero, reverse the order of decls before putting ++ them into the LET_STMT. */ ++ ++tree ++poplevel (keep, reverse, functionbody) ++ int keep; ++ int reverse; ++ int functionbody; ++{ ++ register tree link; ++ /* The chain of decls was accumulated in reverse order. ++ Put it into forward order, just for cleanliness. */ ++ tree decls; ++ tree tags = current_binding_level->tags; ++ tree subblocks = current_binding_level->blocks; ++ tree block = 0; ++ ++ keep |= current_binding_level->keep; ++ ++ /* This warning is turned off because it causes warnings for ++ declarations like `extern struct foo *x'. */ ++#if 0 ++ /* Warn about incomplete structure types in this level. */ ++ for (link = tags; link; link = TREE_CHAIN (link)) ++ if (TYPE_SIZE (TREE_VALUE (link)) == 0) ++ { ++ tree type = TREE_VALUE (link); ++ char *errmsg; ++ switch (TREE_CODE (type)) ++ { ++ case RECORD_TYPE: ++ errmsg = "`struct %s' incomplete in scope ending here"; ++ break; ++ case UNION_TYPE: ++ errmsg = "`union %s' incomplete in scope ending here"; ++ break; ++ case ENUMERAL_TYPE: ++ errmsg = "`enum %s' incomplete in scope ending here"; ++ break; ++ } ++ if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) ++ error (errmsg, IDENTIFIER_POINTER (TYPE_NAME (type))); ++ else ++ /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL. */ ++ error (errmsg, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))); ++ } ++#endif /* 0 */ ++ ++ /* Get the decls in the order they were written. ++ Usually current_binding_level->names is in reverse order. ++ But parameter decls were previously put in forward order. */ ++ ++ if (reverse) ++ current_binding_level->names ++ = decls = nreverse (current_binding_level->names); ++ else ++ decls = current_binding_level->names; ++ ++ /* If there were any declarations or structure tags in that level, ++ or if this level is a function body, ++ create a LET_STMT to record them for the life of this function. */ ++ ++ if (keep || functionbody ++ || (current_binding_level->keep_if_subblocks && subblocks != 0)) ++ block = build_let (0, 0, keep ? decls : 0, ++ subblocks, 0, keep ? tags : 0); ++ ++ /* In each subblock, record that this is its superior. */ ++ ++ for (link = subblocks; link; link = TREE_CHAIN (link)) ++ STMT_SUPERCONTEXT (link) = block; ++ ++ /* Clear out the meanings of the local variables of this level; ++ also record in each decl which block it belongs to. */ ++ ++ for (link = decls; link; link = TREE_CHAIN (link)) ++ { ++ if (DECL_NAME (link) != 0) ++ { ++ /* If the ident. was used via a local extern decl, ++ don't forget that fact. */ ++ if (TREE_USED (link) && TREE_EXTERNAL (link)) ++ TREE_USED (DECL_NAME (link)) = 1; ++ IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0; ++ } ++ DECL_CONTEXT (link) = block; ++ } ++ ++ /* Restore all name-meanings of the outer levels ++ that were shadowed by this level. */ ++ ++ for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link)) ++ IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); ++ ++ /* If the level being exited is the top level of a function, ++ check over all the labels. */ ++ ++ if (functionbody) ++ { ++ /* Clear out the definitions of all label names, ++ since their scopes end here. */ ++ ++ for (link = named_labels; link; link = TREE_CHAIN (link)) ++ { ++ if (DECL_SOURCE_LINE (TREE_VALUE (link)) == 0) ++ { ++ error ("label `%s' used somewhere above but not defined", ++ IDENTIFIER_POINTER (DECL_NAME (TREE_VALUE (link)))); ++ /* Avoid crashing later. */ ++ define_label (input_filename, 1, DECL_NAME (TREE_VALUE (link))); ++ } ++ else if (warn_unused && !TREE_USED (TREE_VALUE (link))) ++ warning_with_decl (TREE_VALUE (link), ++ "label `%s' defined but not used"); ++ IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) = 0; ++ } ++ ++ named_labels = 0; ++ } ++ ++ /* Pop the current level, and free the structure for reuse. */ ++ ++ { ++ register struct binding_level *level = current_binding_level; ++ current_binding_level = current_binding_level->level_chain; ++ ++ level->level_chain = free_binding_level; ++ free_binding_level = level; ++ } ++ ++ if (functionbody) ++ { ++ DECL_INITIAL (current_function_decl) = block; ++ /* If this is the top level block of a function, ++ the vars are the function's parameters. ++ Don't leave them in the LET_STMT because they are ++ found in the FUNCTION_DECL instead. */ ++ STMT_VARS (block) = 0; ++ } ++ else if (block) ++ current_binding_level->blocks ++ = chainon (current_binding_level->blocks, block); ++ /* If we did not make a block for the level just exited, ++ any blocks made for inner levels ++ (since they cannot be recorded as subblocks in that level) ++ must be carried forward so they will later become subblocks ++ of something else. */ ++ else if (subblocks) ++ current_binding_level->blocks ++ = chainon (current_binding_level->blocks, subblocks); ++ ++ if (block) ++ TREE_USED (block) = 1; ++ return block; ++} ++ ++/* Push a definition of struct, union or enum tag "name". ++ "type" should be the type node. ++ We assume that the tag "name" is not already defined. ++ ++ Note that the definition may really be just a forward reference. ++ In that case, the TYPE_SIZE will be zero. */ ++ ++void ++pushtag (name, type) ++ tree name, type; ++{ ++ register struct binding_level *b = current_binding_level; ++ while (b->tag_transparent) b = b->level_chain; ++ ++ if (name) ++ { ++ /* Record the identifier as the type's name if it has none. */ ++ ++ if (TYPE_NAME (type) == 0) ++ TYPE_NAME (type) = name; ++ ++ if (b == global_binding_level) ++ b->tags = perm_tree_cons (name, type, b->tags); ++ else ++ b->tags = saveable_tree_cons (name, type, b->tags); ++ } ++} ++ ++/* Handle when a new declaration NEWDECL ++ has the same name as an old one OLDDECL ++ in the same binding contour. ++ Prints an error message if appropriate. ++ ++ If safely possible, alter OLDDECL to look like NEWDECL, and return 1. ++ Otherwise, return 0. */ ++ ++static int ++duplicate_decls (newdecl, olddecl) ++ register tree newdecl, olddecl; ++{ ++ int types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl)); ++ ++ if (TREE_CODE (TREE_TYPE (newdecl)) == ERROR_MARK ++ || TREE_CODE (TREE_TYPE (olddecl)) == ERROR_MARK) ++ types_match = 0; ++ ++ /* If this decl has linkage, and the old one does too, maybe no error. */ ++ if (TREE_CODE (olddecl) != TREE_CODE (newdecl)) ++ { ++ error_with_decl (newdecl, "`%s' redeclared as different kind of symbol"); ++ error_with_decl (olddecl, "previous declaration of `%s'"); ++ } ++ else ++ { ++ if (flag_traditional && TREE_CODE (newdecl) == FUNCTION_DECL ++ && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (newdecl)) == olddecl ++ && DECL_INITIAL (olddecl) == 0) ++ /* If -traditional, avoid error for redeclaring fcn ++ after implicit decl. */ ++ ; ++ else if (TREE_CODE (olddecl) == FUNCTION_DECL ++ && DECL_FUNCTION_CODE (olddecl) != NOT_BUILT_IN) ++ { ++ if (!types_match) ++ error_with_decl (newdecl, "conflicting types for built-in function `%s'"); ++ else if (extra_warnings) ++ warning_with_decl (newdecl, "built-in function `%s' redeclared"); ++ } ++ else if (!types_match) ++ { ++ error_with_decl (newdecl, "conflicting types for `%s'"); ++ /* Check for function type mismatch ++ involving an empty arglist vs a nonempty one. */ ++ if (TREE_CODE (olddecl) == FUNCTION_DECL ++ && comptypes (TREE_TYPE (TREE_TYPE (olddecl)), ++ TREE_TYPE (TREE_TYPE (newdecl))) ++ && ((TYPE_ARG_TYPES (TREE_TYPE (olddecl)) == 0 ++ && DECL_INITIAL (olddecl) == 0) ++ || ++ (TYPE_ARG_TYPES (TREE_TYPE (newdecl)) == 0 ++ && DECL_INITIAL (newdecl) == 0))) ++ { ++ /* Classify the problem further. */ ++ register tree t = TYPE_ARG_TYPES (TREE_TYPE (olddecl)); ++ if (t == 0) ++ t = TYPE_ARG_TYPES (TREE_TYPE (newdecl)); ++ for (; t; t = TREE_CHAIN (t)) ++ { ++ register tree type = TREE_VALUE (t); ++ ++ if (TREE_CHAIN (t) == 0 && type != void_type_node) ++ { ++ error ("A parameter list with an ellipsis can't match"); ++ error ("an empty parameter name list declaration."); ++ break; ++ } ++ ++ if (type == float_type_node ++ || (TREE_CODE (type) == INTEGER_TYPE ++ && (TYPE_PRECISION (type) ++ < TYPE_PRECISION (integer_type_node)))) ++ { ++ error ("An argument type that has a default promotion"); ++ error ("can't match an empty parameter name list declaration."); ++ break; ++ } ++ } ++ } ++ error_with_decl (olddecl, "previous declaration of `%s'"); ++ } ++ else ++ { ++ char *errmsg = redeclaration_error_message (newdecl, olddecl); ++ if (errmsg) ++ { ++ error_with_decl (newdecl, errmsg); ++ error_with_decl (olddecl, ++ "here is the previous declaration of `%s'"); ++ } ++ else if (TREE_CODE (olddecl) == FUNCTION_DECL ++ && DECL_INITIAL (olddecl) != 0 ++ && TYPE_ARG_TYPES (TREE_TYPE (olddecl)) == 0 ++ && TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != 0) ++ { ++ /* Prototype decl follows defn w/o prototype. */ ++ warning_with_decl (newdecl, "prototype for `%s'"); ++ warning_with_decl (olddecl, ++ "follows non-prototype definition here"); ++ } ++ ++ /* These bits are logically part of the type. */ ++ if (pedantic ++ && (TREE_READONLY (newdecl) != TREE_READONLY (olddecl) ++ || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl))) ++ warning_with_decl (newdecl, "type qualifiers for `%s' conflict with previous decl"); ++ } ++ } ++ ++ if (TREE_CODE (olddecl) == TREE_CODE (newdecl)) ++ { ++ int new_is_definition = (TREE_CODE (newdecl) == FUNCTION_DECL ++ && DECL_INITIAL (newdecl) != 0); ++ ++ /* Copy all the DECL_... slots specified in the new decl ++ except for any that we copy here from the old type. */ ++ ++ if (types_match) ++ { ++ tree oldtype = TREE_TYPE (olddecl); ++ /* Merge the data types specified in the two decls. */ ++ TREE_TYPE (newdecl) ++ = TREE_TYPE (olddecl) ++ = commontype (TREE_TYPE (newdecl), TREE_TYPE (olddecl)); ++ ++ /* Lay the type out, unless already done. */ ++ if (oldtype != TREE_TYPE (newdecl)) ++ { ++ if (TREE_TYPE (newdecl) != error_mark_node) ++ layout_type (TREE_TYPE (newdecl)); ++ if (TREE_CODE (newdecl) != FUNCTION_DECL ++ && TREE_CODE (newdecl) != TYPE_DECL ++ && TREE_CODE (newdecl) != CONST_DECL) ++ layout_decl (newdecl, 0); ++ } ++ else ++ { ++ /* Since the type is OLDDECL's, make OLDDECL's size go with. */ ++ DECL_SIZE (newdecl) = DECL_SIZE (olddecl); ++ DECL_SIZE_UNIT (newdecl) = DECL_SIZE_UNIT (olddecl); ++ if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl)) ++ DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl); ++ } ++ ++ /* Merge the type qualifiers. */ ++ if (TREE_READONLY (newdecl)) ++ TREE_READONLY (olddecl) = 1; ++ if (TREE_THIS_VOLATILE (newdecl)) ++ TREE_THIS_VOLATILE (olddecl) = 1; ++ ++ /* Merge the initialization information. */ ++ if (DECL_INITIAL (newdecl) == 0) ++ DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); ++ /* Keep the old rtl since we can safely use it. */ ++ DECL_RTL (newdecl) = DECL_RTL (olddecl); ++ } ++ /* If cannot merge, then use the new type and qualifiers, ++ and don't preserve the old rtl. */ ++ else ++ { ++ TREE_TYPE (olddecl) = TREE_TYPE (newdecl); ++ TREE_READONLY (olddecl) = TREE_READONLY (newdecl); ++ TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl); ++ TREE_VOLATILE (olddecl) = TREE_VOLATILE (newdecl); ++ } ++ ++ /* Merge the storage class information. */ ++ if (TREE_EXTERNAL (newdecl)) ++ { ++ TREE_STATIC (newdecl) = TREE_STATIC (olddecl); ++ TREE_EXTERNAL (newdecl) = TREE_EXTERNAL (olddecl); ++ ++ /* For functions, static overrides non-static. */ ++ if (TREE_CODE (newdecl) == FUNCTION_DECL) ++ { ++ TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl); ++ /* This is since we don't automatically ++ copy the attributes of NEWDECL into OLDDECL. */ ++ TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl); ++ /* If this clears `static', clear it in the identifier too. */ ++ if (! TREE_PUBLIC (olddecl)) ++ TREE_PUBLIC (DECL_NAME (olddecl)) = 0; ++ } ++ else ++ TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl); ++ } ++ else ++ { ++ TREE_STATIC (olddecl) = TREE_STATIC (newdecl); ++ TREE_EXTERNAL (olddecl) = 0; ++ TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl); ++ } ++ ++ /* If either decl says `inline', this fn is inline, ++ unless its definition was passed already. */ ++ if (TREE_INLINE (newdecl) && DECL_INITIAL (olddecl) == 0) ++ TREE_INLINE (olddecl) = 1; ++ ++ /* If redeclaring a builtin function, and not a definition, ++ it stays built in. ++ Also preserve various other info from the definition. */ ++ if (TREE_CODE (newdecl) == FUNCTION_DECL && !new_is_definition) ++ { ++ DECL_SET_FUNCTION_CODE (newdecl, DECL_FUNCTION_CODE (olddecl)); ++ DECL_RESULT (newdecl) = DECL_RESULT (olddecl); ++ DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); ++ DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl); ++ DECL_RESULT_TYPE (newdecl) = DECL_RESULT_TYPE (olddecl); ++ DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl); ++ DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl); ++ } ++ ++ /* Don't lose track of having output OLDDECL as GDB symbol. */ ++ DECL_BLOCK_SYMTAB_ADDRESS (newdecl) ++ = DECL_BLOCK_SYMTAB_ADDRESS (olddecl); ++ ++ bcopy ((char *) newdecl + sizeof (struct tree_common), ++ (char *) olddecl + sizeof (struct tree_common), ++ sizeof (struct tree_decl) - sizeof (struct tree_common)); ++ ++ return 1; ++ } ++ ++ /* New decl is completely inconsistent with the old one => ++ tell caller to replace the old one. */ ++ return 0; ++} ++ ++/* Record a decl-node X as belonging to the current lexical scope. ++ Check for errors (such as an incompatible declaration for the same ++ name already seen in the same scope). ++ ++ Returns either X or an old decl for the same name. ++ If an old decl is returned, it may have been smashed ++ to agree with what X says. */ ++ ++tree ++pushdecl (x) ++ tree x; ++{ ++ register tree t; ++ register tree name = DECL_NAME (x); ++ register struct binding_level *b = current_binding_level; ++ ++ if (name) ++ { ++ char *file; ++ int line; ++ ++ t = lookup_name_current_level (name); ++ if (t != 0 && t == error_mark_node) ++ /* error_mark_node is 0 for a while during initialization! */ ++ { ++ t = 0; ++ error_with_decl (x, "`%s' used prior to declaration"); ++ } ++ ++ if (t != 0) ++ { ++ file = DECL_SOURCE_FILE (t); ++ line = DECL_SOURCE_LINE (t); ++ } ++ ++ if (t != 0 && duplicate_decls (x, t)) ++ { ++ /* If this decl is `static' and an implicit decl was seen previously, ++ warn. But don't complain if -traditional, ++ since traditional compilers don't complain. */ ++ if (!flag_traditional && TREE_PUBLIC (name) ++ && ! TREE_PUBLIC (x) && ! TREE_EXTERNAL (x) ++ /* We used to warn also for explicit extern followed by static, ++ but sometimes you need to do it that way. */ ++ && IDENTIFIER_IMPLICIT_DECL (name) != 0) ++ { ++ warning ("`%s' was declared implicitly `extern' and later `static'", ++ IDENTIFIER_POINTER (name)); ++ warning_with_file_and_line (file, line, ++ "previous declaration of `%s'", ++ IDENTIFIER_POINTER (name)); ++ } ++ return t; ++ } ++ ++ /* If declaring a type as a typedef, and the type has no known ++ typedef name, install this TYPE_DECL as its typedef name. */ ++ if (TREE_CODE (x) == TYPE_DECL) ++ if (TYPE_NAME (TREE_TYPE (x)) == 0) ++ TYPE_NAME (TREE_TYPE (x)) = x; ++ ++ /* Multiple external decls of the same identifier ought to match. */ ++ ++ if (TREE_EXTERNAL (x) && IDENTIFIER_GLOBAL_VALUE (name) != 0 ++ && (TREE_EXTERNAL (IDENTIFIER_GLOBAL_VALUE (name)) ++ || TREE_PUBLIC (IDENTIFIER_GLOBAL_VALUE (name)))) ++ { ++ if (! comptypes (TREE_TYPE (x), ++ TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name)))) ++ { ++ warning_with_decl (x, ++ "type mismatch with previous external decl"); ++ warning_with_decl (IDENTIFIER_GLOBAL_VALUE (name), ++ "previous external decl of `%s'"); ++ } ++ } ++ ++ /* In PCC-compatibility mode, extern decls of vars with no current decl ++ take effect at top level no matter where they are. */ ++ if (flag_traditional && TREE_EXTERNAL (x) ++ && lookup_name (name) == 0) ++ { ++ tree type = TREE_TYPE (x); ++ ++ /* But don't do this if the type contains temporary nodes. */ ++ while (type) ++ { ++ if (! TREE_PERMANENT (type)) ++ { ++ warning_with_decl (x, "Type of `extern' decl is not global"); ++ break; ++ } ++ else if (TREE_CODE (type) == FUNCTION_TYPE ++ && TYPE_ARG_TYPES (type) != 0) ++ /* The types might not be truly local, ++ but the list of arg types certainly is temporary. ++ Since prototypes are nontraditional, ++ ok not to do the traditional thing. */ ++ break; ++ type = TREE_TYPE (type); ++ } ++ ++ if (type == 0) ++ b = global_binding_level; ++ } ++ ++ /* This name is new in its binding level. ++ Install the new declaration and return it. */ ++ if (b == global_binding_level) ++ { ++ /* Install a global value. */ ++ ++ /* If the first global decl has external linkage, ++ warn if we later see static one. */ ++ if (IDENTIFIER_GLOBAL_VALUE (name) == 0 && TREE_PUBLIC (x)) ++ TREE_PUBLIC (name) = 1; ++ ++ IDENTIFIER_GLOBAL_VALUE (name) = x; ++ ++ /* Don't forget if the function was used via an implicit decl. */ ++ if (IDENTIFIER_IMPLICIT_DECL (name) ++ && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name))) ++ TREE_USED (x) = 1, TREE_USED (name) = 1; ++ ++ /* Don't forget if its address was taken in that way. */ ++ if (IDENTIFIER_IMPLICIT_DECL (name) ++ && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name))) ++ TREE_ADDRESSABLE (x) = 1; ++ ++ /* Warn about mismatches against previous implicit decl. */ ++ if (IDENTIFIER_IMPLICIT_DECL (name) != 0 ++ /* If this real decl matches the implicit, don't complain. */ ++ && ! (TREE_CODE (x) == FUNCTION_DECL ++ && TREE_TYPE (TREE_TYPE (x)) == integer_type_node)) ++ warning ("`%s' was previously implicitly declared to return `int'", ++ IDENTIFIER_POINTER (name)); ++ ++ /* If this decl is `static' and an `extern' was seen previously, ++ that is erroneous. */ ++ if (TREE_PUBLIC (name) ++ && ! TREE_PUBLIC (x) && ! TREE_EXTERNAL (x)) ++ { ++ if (IDENTIFIER_IMPLICIT_DECL (name)) ++ warning ("`%s' was declared implicitly `extern' and later `static'", ++ IDENTIFIER_POINTER (name)); ++ else ++ warning ("`%s' was declared `extern' and later `static'", ++ IDENTIFIER_POINTER (name)); ++ } ++ } ++ else ++ { ++ /* Here to install a non-global value. */ ++ tree oldlocal = IDENTIFIER_LOCAL_VALUE (name); ++ tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name); ++ IDENTIFIER_LOCAL_VALUE (name) = x; ++ ++ /* If this is an extern function declaration, see if we ++ have a global definition for the function. */ ++ if (oldlocal == 0 ++ && oldglobal != 0 ++ && TREE_CODE (x) == FUNCTION_DECL ++ && TREE_CODE (oldglobal) == FUNCTION_DECL) ++ { ++ /* We have one. Their types must agree. */ ++ if (! comptypes (TREE_TYPE (x), ++ TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name)))) ++ warning_with_decl (x, "local declaration of `%s' doesn't match global one"); ++ /* If the global one is inline, make the local one inline. */ ++ else if (TREE_INLINE (oldglobal) ++ || DECL_FUNCTION_CODE (oldglobal) != NOT_BUILT_IN ++ || (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != 0 ++ && TYPE_ARG_TYPES (TREE_TYPE (x)) == 0)) ++ IDENTIFIER_LOCAL_VALUE (name) = oldglobal; ++ } ++ /* If we have a local external declaration, ++ and no file-scope declaration has yet been seen, ++ then if we later have a file-scope decl it must not be static. */ ++ if (oldlocal == 0 ++ && oldglobal == 0 ++ && TREE_EXTERNAL (x) ++ && TREE_PUBLIC (x)) ++ { ++ TREE_PUBLIC (name) = 1; ++ } ++ ++ /* Warn if shadowing an argument at the top level of the body. */ ++ if (oldlocal != 0 && !TREE_EXTERNAL (x) ++ && TREE_CODE (oldlocal) == PARM_DECL ++ && TREE_CODE (x) != PARM_DECL ++ && current_binding_level->level_chain->parm_flag) ++ warning ("declaration of `%s' shadows a parameter", ++ IDENTIFIER_POINTER (name)); ++ ++ /* Maybe warn if shadowing something else. */ ++ else if (warn_shadow && !TREE_EXTERNAL (x) ++ /* No shadow warnings for vars made for inlining. */ ++ && !TREE_INLINE (x)) ++ { ++ char *warnstring = 0; ++ ++ if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL) ++ warnstring = "declaration of `%s' shadows a parameter"; ++ else if (oldlocal != 0) ++ warnstring = "declaration of `%s' shadows previous local"; ++ else if (IDENTIFIER_GLOBAL_VALUE (name) != 0) ++ warnstring = "declaration of `%s' shadows global declaration"; ++ ++ if (warnstring) ++ warning (warnstring, IDENTIFIER_POINTER (name)); ++ } ++ ++ /* If storing a local value, there may already be one (inherited). ++ If so, record it for restoration when this binding level ends. */ ++ if (oldlocal != 0) ++ b->shadowed = tree_cons (name, oldlocal, b->shadowed); ++ } ++ ++ /* Keep count of variables in this level with incomplete type. */ ++ if (TYPE_SIZE (TREE_TYPE (x)) == 0) ++ ++b->n_incomplete; ++ } ++ ++ /* Put decls on list in reverse order. ++ We will reverse them later if necessary. */ ++ TREE_CHAIN (x) = b->names; ++ b->names = x; ++ ++ return x; ++} ++ ++/* Generate an implicit declaration for identifier FUNCTIONID ++ as a function of type int (). Print a warning if appropriate. */ ++ ++tree ++implicitly_declare (functionid) ++ tree functionid; ++{ ++ register tree decl; ++ ++ /* Save the decl permanently so we can warn if definition follows. */ ++#if 0 /* A temporary implicit decl causes a crash in pushdecl. ++ In 1.38, fix pushdecl. */ ++ if (flag_traditional || !warn_implicit ++ || current_binding_level == global_binding_level) ++#endif ++ end_temporary_allocation (); ++ ++ /* We used to reuse an old implicit decl here, ++ but this loses with inline functions because it can clobber ++ the saved decl chains. */ ++/* if (IDENTIFIER_IMPLICIT_DECL (functionid) != 0) ++ decl = IDENTIFIER_IMPLICIT_DECL (functionid); ++ else */ ++ decl = build_decl (FUNCTION_DECL, functionid, default_function_type); ++ ++ TREE_EXTERNAL (decl) = 1; ++ TREE_PUBLIC (decl) = 1; ++ ++ /* ANSI standard says implicit declarations are in the innermost block. ++ So we record the decl in the standard fashion. ++ If flag_traditional is set, pushdecl does it top-level. */ ++ pushdecl (decl); ++ rest_of_decl_compilation (decl, 0, 0, 0); ++ ++ if (warn_implicit ++ /* Only one warning per identifier. */ ++ && IDENTIFIER_IMPLICIT_DECL (functionid) == 0) ++ warning ("implicit declaration of function `%s'", ++ IDENTIFIER_POINTER (functionid)); ++ ++ IDENTIFIER_IMPLICIT_DECL (functionid) = decl; ++ ++#if 0 ++ if (flag_traditional || ! warn_implicit ++ || current_binding_level == global_binding_level) ++#endif ++ resume_temporary_allocation (); ++ ++ return decl; ++} ++ ++/* Return zero if the declaration NEWDECL is valid ++ when the declaration OLDDECL (assumed to be for the same name) ++ has already been seen. ++ Otherwise return an error message format string with a %s ++ where the identifier should go. */ ++ ++static char * ++redeclaration_error_message (newdecl, olddecl) ++ tree newdecl, olddecl; ++{ ++ if (TREE_CODE (newdecl) == TYPE_DECL) ++ { ++ if (flag_traditional && TREE_TYPE (newdecl) == TREE_TYPE (olddecl)) ++ return 0; ++ return "redefinition of `%s'"; ++ } ++ else if (TREE_CODE (newdecl) == FUNCTION_DECL) ++ { ++ /* Declarations of functions can insist on internal linkage ++ but they can't be inconsistent with internal linkage, ++ so there can be no error on that account. ++ However defining the same name twice is no good. */ ++ if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0 ++ /* However, defining once as extern inline and a second ++ time in another way is ok. */ ++ && !(TREE_INLINE (olddecl) && TREE_EXTERNAL (olddecl) ++ && !(TREE_INLINE (newdecl) && TREE_EXTERNAL (newdecl)))) ++ return "redefinition of `%s'"; ++ return 0; ++ } ++ else if (current_binding_level == global_binding_level) ++ { ++ /* Objects declared at top level: */ ++ /* If at least one is a reference, it's ok. */ ++ if (TREE_EXTERNAL (newdecl) || TREE_EXTERNAL (olddecl)) ++ return 0; ++ /* Reject two definitions. */ ++ if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0) ++ return "redefinition of `%s'"; ++ /* Now we have two tentative defs, or one tentative and one real def. */ ++ /* Insist that the linkage match. */ ++ if (TREE_PUBLIC (olddecl) != TREE_PUBLIC (newdecl)) ++ return "conflicting declarations of `%s'"; ++ return 0; ++ } ++ else ++ { ++ /* Objects declared with block scope: */ ++ /* Reject two definitions, and reject a definition ++ together with an external reference. */ ++ if (!(TREE_EXTERNAL (newdecl) && TREE_EXTERNAL (olddecl))) ++ return "redeclaration of `%s'"; ++ return 0; ++ } ++} ++ ++/* Get the LABEL_DECL corresponding to identifier ID as a label. ++ Create one if none exists so far for the current function. ++ This function is called for both label definitions and label references. */ ++ ++tree ++lookup_label (id) ++ tree id; ++{ ++ register tree decl = IDENTIFIER_LABEL_VALUE (id); ++ ++ if (decl != 0) ++ return decl; ++ ++ decl = build_decl (LABEL_DECL, id, NULL_TREE); ++ DECL_MODE (decl) = VOIDmode; ++ /* Mark that the label's definition has not been seen. */ ++ DECL_SOURCE_LINE (decl) = 0; ++ ++ IDENTIFIER_LABEL_VALUE (id) = decl; ++ ++ named_labels ++ = tree_cons (NULL_TREE, decl, named_labels); ++ ++ return decl; ++} ++ ++/* Define a label, specifying the location in the source file. ++ Return the LABEL_DECL node for the label, if the definition is valid. ++ Otherwise return 0. */ ++ ++tree ++define_label (filename, line, name) ++ char *filename; ++ int line; ++ tree name; ++{ ++ tree decl = lookup_label (name); ++ if (DECL_SOURCE_LINE (decl) != 0) ++ { ++ error_with_decl (decl, "duplicate label `%s'"); ++ return 0; ++ } ++ else ++ { ++ /* Mark label as having been defined. */ ++ DECL_SOURCE_FILE (decl) = filename; ++ DECL_SOURCE_LINE (decl) = line; ++ return decl; ++ } ++} ++ ++/* Return the list of declarations of the current level. ++ Note that this list is in reverse order unless/until ++ you nreverse it; and when you do nreverse it, you must ++ store the result back using `storedecls' or you will lose. */ ++ ++tree ++getdecls () ++{ ++ return current_binding_level->names; ++} ++ ++/* Return the list of type-tags (for structs, etc) of the current level. */ ++ ++tree ++gettags () ++{ ++ return current_binding_level->tags; ++} ++ ++/* Store the list of declarations of the current level. ++ This is done for the parameter declarations of a function being defined, ++ after they are modified in the light of any missing parameters. */ ++ ++static void ++storedecls (decls) ++ tree decls; ++{ ++ current_binding_level->names = decls; ++} ++ ++/* Similarly, store the list of tags of the current level. */ ++ ++static void ++storetags (tags) ++ tree tags; ++{ ++ current_binding_level->tags = tags; ++} ++ ++/* Given NAME, an IDENTIFIER_NODE, ++ return the structure (or union or enum) definition for that name. ++ Searches binding levels from BINDING_LEVEL up to the global level. ++ If THISLEVEL_ONLY is nonzero, searches only the specified context ++ (but skips any tag-transparent contexts to find one that is ++ meaningful for tags). ++ FORM says which kind of type the caller wants; ++ it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE. ++ If the wrong kind of type is found, an error is reported. */ ++ ++static tree ++lookup_tag (form, name, binding_level, thislevel_only) ++ enum tree_code form; ++ struct binding_level *binding_level; ++ tree name; ++ int thislevel_only; ++{ ++ register struct binding_level *level; ++ ++ for (level = binding_level; level; level = level->level_chain) ++ { ++ register tree tail; ++ for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) ++ { ++ if (TREE_PURPOSE (tail) == name) ++ { ++ if (TREE_CODE (TREE_VALUE (tail)) != form) ++ { ++ /* Definition isn't the kind we were looking for. */ ++ error ("`%s' defined as wrong kind of tag", ++ IDENTIFIER_POINTER (name)); ++ } ++ return TREE_VALUE (tail); ++ } ++ } ++ if (thislevel_only && ! level->tag_transparent) ++ return NULL_TREE; ++ } ++ return NULL_TREE; ++} ++ ++/* Given a type, find the tag that was defined for it and return the tag name. ++ Otherwise return 0. However, the value can never be 0 ++ in the cases in which this is used. */ ++ ++static tree ++lookup_tag_reverse (type) ++ tree type; ++{ ++ register struct binding_level *level; ++ ++ for (level = current_binding_level; level; level = level->level_chain) ++ { ++ register tree tail; ++ for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) ++ { ++ if (TREE_VALUE (tail) == type) ++ return TREE_PURPOSE (tail); ++ } ++ } ++ return NULL_TREE; ++} ++ ++/* Look up NAME in the current binding level and its superiors ++ in the namespace of variables, functions and typedefs. ++ Return a ..._DECL node of some kind representing its definition, ++ or return 0 if it is undefined. */ ++ ++tree ++lookup_name (name) ++ tree name; ++{ ++ register tree val; ++ if (current_binding_level != global_binding_level ++ && IDENTIFIER_LOCAL_VALUE (name)) ++ val = IDENTIFIER_LOCAL_VALUE (name); ++ else ++ val = IDENTIFIER_GLOBAL_VALUE (name); ++ if (val && TREE_TYPE (val) == error_mark_node) ++ return error_mark_node; ++ return val; ++} ++ ++/* Similar to `lookup_name' but look only at current binding level. */ ++ ++static tree ++lookup_name_current_level (name) ++ tree name; ++{ ++ register tree t; ++ ++ if (current_binding_level == global_binding_level) ++ return IDENTIFIER_GLOBAL_VALUE (name); ++ ++ if (IDENTIFIER_LOCAL_VALUE (name) == 0) ++ return 0; ++ ++ for (t = current_binding_level->names; t; t = TREE_CHAIN (t)) ++ if (DECL_NAME (t) == name) ++ break; ++ ++ return t; ++} ++ ++/* Create the predefined scalar types of C, ++ and some nodes representing standard constants (0, 1, (void *)0). ++ Initialize the global binding level. ++ Make definitions for built-in primitive functions. */ ++ ++void ++init_decl_processing () ++{ ++ register tree endlink; ++ ++ /* Make identifier nodes long enough for the language-specific slots. */ ++ set_identifier_size (sizeof (struct lang_identifier)); ++ ++ current_function_decl = NULL; ++ named_labels = NULL; ++ current_binding_level = NULL_BINDING_LEVEL; ++ free_binding_level = NULL_BINDING_LEVEL; ++ pushlevel (0); /* make the binding_level structure for global names */ ++ global_binding_level = current_binding_level; ++ ++ value_identifier = get_identifier (""); ++ ++ /* Define `int' and `char' first so that dbx will output them first. */ ++ ++ integer_type_node = make_signed_type (INT_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_INT], ++ integer_type_node)); ++ ++ /* Define `char', which is like either `signed char' or `unsigned char' ++ but not the same as either. */ ++ ++ char_type_node = ++ (flag_signed_char ++ ? make_signed_type (CHAR_TYPE_SIZE) ++ : make_unsigned_type (CHAR_TYPE_SIZE)); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("char"), ++ char_type_node)); ++ ++ long_integer_type_node = make_signed_type (LONG_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("long int"), ++ long_integer_type_node)); ++ ++ unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"), ++ unsigned_type_node)); ++ ++ long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("long unsigned int"), ++ long_unsigned_type_node)); ++ ++ /* `unsigned long' or `unsigned int' is the standard type for sizeof. ++ Traditionally, use a signed type. */ ++ if (INT_TYPE_SIZE != LONG_TYPE_SIZE) ++ sizetype = flag_traditional ? long_integer_type_node : long_unsigned_type_node; ++ else ++ sizetype = flag_traditional ? integer_type_node : unsigned_type_node; ++ ++ TREE_TYPE (TYPE_SIZE (integer_type_node)) = sizetype; ++ TREE_TYPE (TYPE_SIZE (char_type_node)) = sizetype; ++ TREE_TYPE (TYPE_SIZE (unsigned_type_node)) = sizetype; ++ TREE_TYPE (TYPE_SIZE (long_unsigned_type_node)) = sizetype; ++ TREE_TYPE (TYPE_SIZE (long_integer_type_node)) = sizetype; ++ ++ error_mark_node = make_node (ERROR_MARK); ++ TREE_TYPE (error_mark_node) = error_mark_node; ++ ++ short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("short int"), ++ short_integer_type_node)); ++ ++ long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("long long int"), ++ long_long_integer_type_node)); ++ ++ short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("short unsigned int"), ++ short_unsigned_type_node)); ++ ++ long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("long long unsigned int"), ++ long_long_unsigned_type_node)); ++ ++ /* Define both `signed char' and `unsigned char'. */ ++ signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("signed char"), ++ signed_char_type_node)); ++ ++ unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE); ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned char"), ++ unsigned_char_type_node)); ++ ++ float_type_node = make_node (REAL_TYPE); ++ TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE; ++ pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_FLOAT], ++ float_type_node)); ++ layout_type (float_type_node); ++ ++ double_type_node = make_node (REAL_TYPE); ++ TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE; ++ pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_DOUBLE], ++ double_type_node)); ++ layout_type (double_type_node); ++ ++ long_double_type_node = make_node (REAL_TYPE); ++ TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE; ++ pushdecl (build_decl (TYPE_DECL, get_identifier ("long double"), ++ long_double_type_node)); ++ layout_type (long_double_type_node); ++ ++ integer_zero_node = build_int_2 (0, 0); ++ TREE_TYPE (integer_zero_node) = integer_type_node; ++ integer_one_node = build_int_2 (1, 0); ++ TREE_TYPE (integer_one_node) = integer_type_node; ++ ++ size_zero_node = build_int_2 (0, 0); ++ TREE_TYPE (size_zero_node) = sizetype; ++ size_one_node = build_int_2 (1, 0); ++ TREE_TYPE (size_one_node) = sizetype; ++ ++ void_type_node = make_node (VOID_TYPE); ++ pushdecl (build_decl (TYPE_DECL, ++ ridpointers[(int) RID_VOID], void_type_node)); ++ layout_type (void_type_node); /* Uses integer_zero_node */ ++ ++ null_pointer_node = build_int_2 (0, 0); ++ TREE_TYPE (null_pointer_node) = build_pointer_type (void_type_node); ++ layout_type (TREE_TYPE (null_pointer_node)); ++ ++ string_type_node = build_pointer_type (char_type_node); ++ ++ /* make a type for arrays of 256 characters. ++ 256 is picked randomly because we have a type for integers from 0 to 255. ++ With luck nothing will ever really depend on the length of this ++ array type. */ ++ char_array_type_node ++ = build_array_type (char_type_node, unsigned_char_type_node); ++ /* Likewise for arrays of ints. */ ++ int_array_type_node ++ = build_array_type (integer_type_node, unsigned_char_type_node); ++ ++ default_function_type ++ = build_function_type (integer_type_node, NULL_TREE); ++ ++ ptr_type_node = build_pointer_type (void_type_node); ++ endlink = tree_cons (NULL_TREE, void_type_node, NULL_TREE); ++ ++ double_ftype_double ++ = build_function_type (double_type_node, ++ tree_cons (NULL_TREE, double_type_node, endlink)); ++ ++ double_ftype_double_double ++ = build_function_type (double_type_node, ++ tree_cons (NULL_TREE, double_type_node, ++ tree_cons (NULL_TREE, ++ double_type_node, endlink))); ++ ++ int_ftype_int ++ = build_function_type (integer_type_node, ++ tree_cons (NULL_TREE, integer_type_node, endlink)); ++ ++ long_ftype_long ++ = build_function_type (long_integer_type_node, ++ tree_cons (NULL_TREE, ++ long_integer_type_node, endlink)); ++ ++ void_ftype_ptr_ptr_int ++ = build_function_type (void_type_node, ++ tree_cons (NULL_TREE, ptr_type_node, ++ tree_cons (NULL_TREE, ptr_type_node, ++ tree_cons (NULL_TREE, ++ integer_type_node, ++ endlink)))); ++ ++ int_ftype_ptr_ptr_int ++ = build_function_type (integer_type_node, ++ tree_cons (NULL_TREE, ptr_type_node, ++ tree_cons (NULL_TREE, ptr_type_node, ++ tree_cons (NULL_TREE, ++ integer_type_node, ++ endlink)))); ++ ++ void_ftype_ptr_int_int ++ = build_function_type (void_type_node, ++ tree_cons (NULL_TREE, ptr_type_node, ++ tree_cons (NULL_TREE, integer_type_node, ++ tree_cons (NULL_TREE, ++ integer_type_node, ++ endlink)))); ++ ++ builtin_function ("__builtin_alloca", ++ build_function_type (ptr_type_node, ++ tree_cons (NULL_TREE, ++ integer_type_node, ++ endlink)), ++ BUILT_IN_ALLOCA); ++ ++ builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS); ++ builtin_function ("__builtin_fabs", double_ftype_double, BUILT_IN_FABS); ++ builtin_function ("__builtin_labs", long_ftype_long, BUILT_IN_LABS); ++ builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS); ++ builtin_function ("__builtin_saveregs", default_function_type, ++ BUILT_IN_SAVEREGS); ++ builtin_function ("__builtin_classify_type", default_function_type, ++ BUILT_IN_CLASSIFY_TYPE); ++ builtin_function ("__builtin_next_arg", ++ build_function_type (ptr_type_node, endlink), ++ BUILT_IN_NEXT_ARG); ++#if 0 ++ /* Support for these has not been written in either expand_builtin ++ or build_function_call. */ ++ builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV); ++ builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV); ++ builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR); ++ builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL); ++ builtin_function ("__builtin_fmod", double_ftype_double_double, BUILT_IN_FMOD); ++ builtin_function ("__builtin_frem", double_ftype_double_double, BUILT_IN_FREM); ++ builtin_function ("__builtin_memcpy", void_ftype_ptr_ptr_int, BUILT_IN_MEMCPY); ++ builtin_function ("__builtin_memcmp", int_ftype_ptr_ptr_int, BUILT_IN_MEMCMP); ++ builtin_function ("__builtin_memset", void_ftype_ptr_int_int, BUILT_IN_MEMSET); ++ builtin_function ("__builtin_fsqrt", double_ftype_double, BUILT_IN_FSQRT); ++ builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP); ++ builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN); ++#endif ++ ++ void_list_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE); ++ start_identifier_warnings (); ++} ++ ++/* Make a definition for a builtin function named NAME and whose data type ++ is TYPE. TYPE should be a function type with argument types. ++ FUNCTION_CODE tells later passes how to compile calls to this function. ++ See tree.h for its possible values. */ ++ ++static void ++builtin_function (name, type, function_code) ++ char *name; ++ tree type; ++ enum built_in_function function_code; ++{ ++ tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type); ++ TREE_EXTERNAL (decl) = 1; ++ TREE_PUBLIC (decl) = 1; ++ make_decl_rtl (decl, 0, 1); ++ pushdecl (decl); ++ DECL_SET_FUNCTION_CODE (decl, function_code); ++} ++ ++/* Called when a declaration is seen that contains no names to declare. ++ If its type is a reference to a structure, union or enum inherited ++ from a containing scope, shadow that tag name for the current scope ++ with a forward reference. ++ If its type defines a new named structure or union ++ or defines an enum, it is valid but we need not do anything here. ++ Otherwise, it is an error. */ ++ ++void ++shadow_tag (declspecs) ++ tree declspecs; ++{ ++ int found_tag = 0; ++ int warned = 0; ++ register tree link; ++ ++ for (link = declspecs; link; link = TREE_CHAIN (link)) ++ { ++ register tree value = TREE_VALUE (link); ++ register enum tree_code code = TREE_CODE (value); ++ int ok = 0; ++ ++ if (code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE) ++ /* Used to test also that TYPE_SIZE (value) != 0. ++ That caused warning for `struct foo;' at top level in the file. */ ++ { ++ register tree name = lookup_tag_reverse (value); ++ register tree t = lookup_tag (code, name, current_binding_level, 1); ++ ++ if (t == 0) ++ { ++ t = make_node (code); ++ pushtag (name, t); ++ ok = 1; ++ } ++ else if (name != 0 || code == ENUMERAL_TYPE) ++ ok = 1; ++ } ++ ++ if (ok) ++ found_tag++; ++ else ++ { ++ if (!warned) ++ warning ("useless keyword or type name in declaration"); ++ warned = 1; ++ } ++ } ++ ++ if (!warned) ++ { ++ if (found_tag > 1) ++ warning ("multiple types in one declaration"); ++ if (found_tag == 0) ++ warning ("empty declaration"); ++ } ++} ++ ++/* Decode a "typename", such as "int **", returning a ..._TYPE node. */ ++ ++tree ++groktypename (typename) ++ tree typename; ++{ ++ if (TREE_CODE (typename) != TREE_LIST) ++ return typename; ++ return grokdeclarator (TREE_VALUE (typename), ++ TREE_PURPOSE (typename), ++ TYPENAME, 0); ++} ++ ++/* Decode a declarator in an ordinary declaration or data definition. ++ This is called as soon as the type information and variable name ++ have been parsed, before parsing the initializer if any. ++ Here we create the ..._DECL node, fill in its type, ++ and put it on the list of decls for the current context. ++ The ..._DECL node is returned as the value. ++ ++ Exception: for arrays where the length is not specified, ++ the type is left null, to be filled in by `finish_decl'. ++ ++ Function definitions do not come here; they go to start_function ++ instead. However, external and forward declarations of functions ++ do go through here. Structure field declarations are done by ++ grokfield and not through here. */ ++ ++/* Set this to zero to debug not using the temporary obstack ++ to parse initializers. */ ++int debug_temp_inits = 1; ++ ++tree ++start_decl (declarator, declspecs, initialized) ++ tree declspecs, declarator; ++ int initialized; ++{ ++ register tree decl = grokdeclarator (declarator, declspecs, ++ NORMAL, initialized); ++ register tree tem; ++ int init_written = initialized; ++ ++ if (initialized) ++ /* Is it valid for this decl to have an initializer at all? ++ If not, set INITIALIZED to zero, which will indirectly ++ tell `finish_decl' to ignore the initializer once it is parsed. */ ++ switch (TREE_CODE (decl)) ++ { ++ case TYPE_DECL: ++ /* typedef foo = bar means give foo the same type as bar. ++ We haven't parsed bar yet, so `finish_decl' will fix that up. ++ Any other case of an initialization in a TYPE_DECL is an error. */ ++ if (pedantic || list_length (declspecs) > 1) ++ { ++ error ("typedef `%s' is initialized", ++ IDENTIFIER_POINTER (DECL_NAME (decl))); ++ initialized = 0; ++ } ++ break; ++ ++ case FUNCTION_DECL: ++ error ("function `%s' is initialized like a variable", ++ IDENTIFIER_POINTER (DECL_NAME (decl))); ++ initialized = 0; ++ break; ++ ++ default: ++ /* Don't allow initializations for incomplete types ++ except for arrays which might be completed by the initialization. */ ++ if (TYPE_SIZE (TREE_TYPE (decl)) != 0) ++ ; /* A complete type is ok. */ ++ else if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE) ++ { ++ error ("variable `%s' has initializer but incomplete type", ++ IDENTIFIER_POINTER (DECL_NAME (decl))); ++ initialized = 0; ++ } ++ else if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl))) == 0) ++ { ++ error ("elements of array `%s' have incomplete type", ++ IDENTIFIER_POINTER (DECL_NAME (decl))); ++ initialized = 0; ++ } ++ } ++ ++ if (initialized) ++ { ++#if 0 /* Seems redundant. */ ++ if (current_binding_level != global_binding_level ++ && TREE_EXTERNAL (decl) ++ && TREE_CODE (decl) != FUNCTION_DECL) ++ warning ("declaration of `%s' has `extern' and is initialized", ++ IDENTIFIER_POINTER (DECL_NAME (decl))); ++#endif ++ TREE_EXTERNAL (decl) = 0; ++ if (current_binding_level == global_binding_level) ++ TREE_STATIC (decl) = 1; ++ ++ /* Tell `pushdecl' this is an initialized decl ++ even though we don't yet have the initializer expression. ++ Also tell `finish_decl' it may store the real initializer. */ ++ DECL_INITIAL (decl) = error_mark_node; ++ } ++ ++ /* Add this decl to the current binding level. ++ TEM may equal DECL or it may be a previous decl of the same name. */ ++ tem = pushdecl (decl); ++ ++ /* For a local variable, define the RTL now. */ ++ if (current_binding_level != global_binding_level ++ /* But not if this is a duplicate decl ++ and we preserved the rtl from the previous one ++ (which may or may not happen). */ ++ && DECL_RTL (tem) == 0) ++ { ++ if (TYPE_SIZE (TREE_TYPE (tem)) != 0) ++ expand_decl (tem, NULL_TREE); ++ else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE ++ && DECL_INITIAL (tem) != 0) ++ expand_decl (tem, NULL_TREE); ++ } ++ ++ if (init_written) ++ { ++ /* When parsing and digesting the initializer, ++ use temporary storage. Do this even if we will ignore the value. */ ++ if (current_binding_level == global_binding_level && debug_temp_inits) ++ temporary_allocation (); ++ } ++ ++ return tem; ++} ++ ++/* Finish processing of a declaration; ++ install its line number and initial value. ++ If the length of an array type is not known before, ++ it must be determined now, from the initial value, or it is an error. */ ++ ++void ++finish_decl (decl, init, asmspec_tree) ++ tree decl, init; ++ tree asmspec_tree; ++{ ++ register tree type = TREE_TYPE (decl); ++ int was_incomplete = (DECL_SIZE (decl) == 0); ++ int temporary = allocation_temporary_p (); ++ char *asmspec = 0; ++ ++ if (asmspec_tree) ++ asmspec = TREE_STRING_POINTER (asmspec_tree); ++ ++ /* If `start_decl' didn't like having an initialization, ignore it now. */ ++ ++ if (init != 0 && DECL_INITIAL (decl) == 0) ++ init = 0; ++ ++ if (init) ++ { ++ if (TREE_CODE (decl) != TYPE_DECL) ++ store_init_value (decl, init); ++ else ++ { ++ /* typedef foo = bar; store the type of bar as the type of foo. */ ++ TREE_TYPE (decl) = TREE_TYPE (init); ++ DECL_INITIAL (decl) = init = 0; ++ } ++ } ++ ++ /* For top-level declaration, the initial value was read in ++ the temporary obstack. MAXINDEX, rtl, etc. to be made below ++ must go in the permanent obstack; but don't discard the ++ temporary data yet. */ ++ ++ if (current_binding_level == global_binding_level && temporary) ++ end_temporary_allocation (); ++ ++ /* Deduce size of array from initialization, if not already known */ ++ ++ if (TREE_CODE (type) == ARRAY_TYPE ++ && TYPE_DOMAIN (type) == 0 ++ && TREE_CODE (decl) != TYPE_DECL) ++ { ++#if 0 ++ int do_default = ! ((!pedantic && TREE_STATIC (decl)) ++ || TREE_EXTERNAL (decl)); ++#endif ++ int do_default ++ = (TREE_STATIC (decl) ++ /* Even if pedantic, an external linkage array ++ may have incomplete type at first. */ ++ ? pedantic && !TREE_PUBLIC (decl) ++ : !TREE_EXTERNAL (decl)); ++ int failure ++ = complete_array_type (type, DECL_INITIAL (decl), do_default); ++ ++ if (failure == 1) ++ error_with_decl (decl, "initializer fails to determine size of `%s'"); ++ ++ if (failure == 2) ++ { ++ if (do_default) ++ { ++ if (! TREE_PUBLIC (decl)) ++ error_with_decl (decl, "array size missing in `%s'"); ++ } ++ else if (!pedantic && TREE_STATIC (decl)) ++ TREE_EXTERNAL (decl) = 1; ++ } ++ ++ if (pedantic && TYPE_DOMAIN (type) != 0 ++ && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), ++ integer_zero_node)) ++ error_with_decl (decl, "zero-size array `%s'"); ++ ++ layout_decl (decl, 0); ++ } ++ ++ if (TREE_CODE (decl) == VAR_DECL) ++ { ++ if (TREE_STATIC (decl) && DECL_SIZE (decl) == 0) ++ { ++ /* A static variable with an incomplete type: ++ that is an error if it is initialized or `static'. ++ Otherwise, let it through, but if it is not `extern' ++ then it may cause an error message later. */ ++ if (! (TREE_PUBLIC (decl) && DECL_INITIAL (decl) == 0)) ++ error_with_decl (decl, "storage size of `%s' isn't known"); ++ } ++ else if (!TREE_EXTERNAL (decl) && DECL_SIZE (decl) == 0) ++ { ++ /* An automatic variable with an incomplete type: ++ that is an error. */ ++ error_with_decl (decl, "storage size of `%s' isn't known"); ++ TREE_TYPE (decl) = error_mark_node; ++ } ++ ++ if ((TREE_EXTERNAL (decl) || TREE_STATIC (decl)) ++ && DECL_SIZE (decl) != 0 && ! TREE_LITERAL (DECL_SIZE (decl))) ++ error_with_decl (decl, "storage size of `%s' isn't constant"); ++ } ++ ++ /* Output the assembler code and/or RTL code for variables and functions, ++ unless the type is an undefined structure or union. ++ If not, it will get done when the type is completed. */ ++ ++ if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL) ++ { ++ if (flag_traditional && allocation_temporary_p ()) ++ { ++ end_temporary_allocation (); ++ rest_of_decl_compilation (decl, asmspec, ++ current_binding_level == global_binding_level, ++ 0); ++ resume_temporary_allocation (); ++ } ++ else ++ rest_of_decl_compilation (decl, asmspec, ++ current_binding_level == global_binding_level, ++ 0); ++ if (current_binding_level != global_binding_level) ++ { ++ /* Recompute the RTL of a local array now ++ if it used to be an incomplete type. */ ++ if (was_incomplete ++ && ! TREE_STATIC (decl) && ! TREE_EXTERNAL (decl)) ++ { ++ /* If we used it already as memory, it must stay in memory. */ ++ TREE_ADDRESSABLE (decl) = TREE_USED (decl); ++ /* If it's still incomplete now, no init will save it. */ ++ if (DECL_SIZE (decl) == 0) ++ DECL_INITIAL (decl) = 0; ++ expand_decl (decl, NULL_TREE); ++ } ++ /* Compute and store the initial value. */ ++ expand_decl_init (decl); ++ } ++ } ++ ++ if (TREE_CODE (decl) == TYPE_DECL) ++ rest_of_decl_compilation (decl, 0, ++ current_binding_level == global_binding_level, ++ 0); ++ ++ /* Resume permanent allocation, if not within a function. */ ++ if (temporary && current_binding_level == global_binding_level) ++ { ++ permanent_allocation (); ++ /* We need to remember that this array HAD an initialization, ++ but discard the actual nodes, since they are temporary anyway. */ ++ if (DECL_INITIAL (decl) != 0) ++ DECL_INITIAL (decl) = error_mark_node; ++ } ++ ++ /* At the end of a declaration, throw away any variable type sizes ++ of types defined inside that declaration. There is no use ++ computing them in the following function definition. */ ++ if (current_binding_level == global_binding_level) ++ get_pending_sizes (); ++} ++ ++/* Given a parsed parameter declaration, ++ decode it into a PARM_DECL and push that on the current binding level. */ ++ ++void ++push_parm_decl (parm) ++ tree parm; ++{ ++ register tree decl = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm), ++ PARM, 0); ++ ++ /* Add this decl to the current binding level. */ ++ finish_decl (pushdecl (decl), NULL_TREE, NULL_TREE); ++} ++ ++/* Make TYPE a complete type based on INITIAL_VALUE. ++ Return 0 if successful, 1 if INITIAL_VALUE can't be decyphered, ++ 2 if there was no information (in which case assume 1 if DO_DEFAULT). */ ++ ++int ++complete_array_type (type, initial_value, do_default) ++ tree type; ++ tree initial_value; ++ int do_default; ++{ ++ register tree maxindex = NULL_TREE; ++ int value = 0; ++ int temporary = (TREE_PERMANENT (type) && allocation_temporary_p ()); ++ ++ /* Don't put temporary nodes in permanent type. */ ++ if (temporary) ++ end_temporary_allocation (); ++ ++ if (initial_value) ++ { ++ /* Note MAXINDEX is really the maximum index, ++ one less than the size. */ ++ if (TREE_CODE (initial_value) == STRING_CST) ++ { ++ int eltsize = TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (TREE_TYPE (initial_value)))); ++ maxindex = build_int_2 (TREE_STRING_LENGTH (initial_value) / eltsize - 1, 0); ++ } ++ else if (TREE_CODE (initial_value) == CONSTRUCTOR) ++ { ++ register int nelts ++ = list_length (CONSTRUCTOR_ELTS (initial_value)); ++ maxindex = build_int_2 (nelts - 1, 0); ++ } ++ else ++ { ++ /* Make an error message unless that happened already. */ ++ if (initial_value != error_mark_node) ++ value = 1; ++ ++ /* Prevent further error messages. */ ++ maxindex = build_int_2 (1, 0); ++ } ++ } ++ ++ if (!maxindex) ++ { ++ if (do_default) ++ maxindex = build_int_2 (1, 0); ++ value = 2; ++ } ++ ++ if (maxindex) ++ { ++ TYPE_DOMAIN (type) = build_index_type (maxindex); ++ if (!TREE_TYPE (maxindex)) ++ TREE_TYPE (maxindex) = TYPE_DOMAIN (type); ++ } ++ ++ /* Lay out the type now that we can get the real answer. */ ++ ++ layout_type (type); ++ ++ if (temporary) ++ resume_temporary_allocation (); ++ ++ return value; ++} ++ ++/* Given declspecs and a declarator, ++ determine the name and type of the object declared ++ and construct a ..._DECL node for it. ++ (In one case we can return a ..._TYPE node instead. ++ For invalid input we sometimes return 0.) ++ ++ DECLSPECS is a chain of tree_list nodes whose value fields ++ are the storage classes and type specifiers. ++ ++ DECL_CONTEXT says which syntactic context this declaration is in: ++ NORMAL for most contexts. Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL. ++ FUNCDEF for a function definition. Like NORMAL but a few different ++ error messages in each case. Return value may be zero meaning ++ this definition is too screwy to try to parse. ++ PARM for a parameter declaration (either within a function prototype ++ or before a function body). Make a PARM_DECL, or return void_type_node. ++ TYPENAME if for a typename (in a cast or sizeof). ++ Don't make a DECL node; just return the ..._TYPE node. ++ FIELD for a struct or union field; make a FIELD_DECL. ++ INITIALIZED is 1 if the decl has an initializer. ++ ++ In the TYPENAME case, DECLARATOR is really an absolute declarator. ++ It may also be so in the PARM case, for a prototype where the ++ argument type is specified but not the name. ++ ++ This function is where the complicated C meanings of `static' ++ and `extern' are intrepreted. */ ++ ++static tree ++grokdeclarator (declarator, declspecs, decl_context, initialized) ++ tree declspecs; ++ tree declarator; ++ enum decl_context decl_context; ++ int initialized; ++{ ++ int specbits = 0; ++ tree spec; ++ tree type = NULL_TREE; ++ int longlong = 0; ++ int constp; ++ int volatilep; ++ int inlinep; ++ int explicit_int = 0; ++ int explicit_char = 0; ++ char *name; ++ tree typedef_type = 0; ++ int funcdef_flag = 0; ++ int resume_temporary = 0; ++ enum tree_code innermost_code = ERROR_MARK; ++ ++ if (decl_context == FUNCDEF) ++ funcdef_flag = 1, decl_context = NORMAL; ++ ++ if (flag_traditional && allocation_temporary_p ()) ++ { ++ resume_temporary = 1; ++ end_temporary_allocation (); ++ } ++ ++ /* Look inside a declarator for the name being declared ++ and get it as a string, for an error message. */ ++ { ++ register tree decl = declarator; ++ name = 0; ++ ++ while (decl) ++ switch (TREE_CODE (decl)) ++ { ++ case ARRAY_REF: ++ case INDIRECT_REF: ++ case CALL_EXPR: ++ innermost_code = TREE_CODE (decl); ++ decl = TREE_OPERAND (decl, 0); ++ break; ++ ++ case IDENTIFIER_NODE: ++ name = IDENTIFIER_POINTER (decl); ++ decl = 0; ++ break; ++ ++ default: ++ abort (); ++ } ++ if (name == 0) ++ name = "type name"; ++ } ++ ++ /* A function definition's declarator must have the form of ++ a function declarator. */ ++ ++ if (funcdef_flag && innermost_code != CALL_EXPR) ++ return 0; ++ ++ /* Anything declared one level down from the top level ++ must be one of the parameters of a function ++ (because the body is at least two levels down). */ ++ ++ if (decl_context == NORMAL ++ && current_binding_level->level_chain == global_binding_level) ++ decl_context = PARM; ++ ++ /* Look through the decl specs and record which ones appear. ++ Some typespecs are defined as built-in typenames. ++ Others, the ones that are modifiers of other types, ++ are represented by bits in SPECBITS: set the bits for ++ the modifiers that appear. Storage class keywords are also in SPECBITS. ++ ++ If there is a typedef name or a type, store the type in TYPE. ++ This includes builtin typedefs such as `int'. ++ ++ Set EXPLICIT_INT if the type is `int' or `char' and did not ++ come from a user typedef. ++ ++ Set LONGLONG if `long' is mentioned twice. */ ++ ++ for (spec = declspecs; spec; spec = TREE_CHAIN (spec)) ++ { ++ register int i; ++ register tree id = TREE_VALUE (spec); ++ ++ if (id == ridpointers[(int) RID_INT]) ++ explicit_int = 1; ++ if (id == ridpointers[(int) RID_CHAR]) ++ explicit_char = 1; ++ ++ if (TREE_CODE (id) == IDENTIFIER_NODE) ++ for (i = (int) RID_FIRST_MODIFIER; i < (int) RID_MAX; i++) ++ { ++ if (ridpointers[i] == id) ++ { ++ if (i == (int) RID_LONG && specbits & (1< 1) ++ warning ("duplicate `const'"); ++ if (volatilep > 1) ++ warning ("duplicate `volatile'"); ++ type = TYPE_MAIN_VARIANT (type); ++ ++ /* Warn if two storage classes are given. Default to `auto'. */ ++ ++ { ++ int nclasses = 0; ++ ++ if (specbits & 1 << (int) RID_AUTO) nclasses++; ++ if (specbits & 1 << (int) RID_STATIC) nclasses++; ++ if (specbits & 1 << (int) RID_EXTERN) nclasses++; ++ if (specbits & 1 << (int) RID_REGISTER) nclasses++; ++ if (specbits & 1 << (int) RID_TYPEDEF) nclasses++; ++ ++ /* Warn about storage classes that are invalid for certain ++ kinds of declarations (parameters, typenames, etc.). */ ++ ++ if (nclasses > 1) ++ error ("multiple storage classes in declaration of `%s'", name); ++ else if (funcdef_flag ++ && (specbits ++ & ((1 << (int) RID_REGISTER) ++ | (1 << (int) RID_AUTO) ++ | (1 << (int) RID_TYPEDEF)))) ++ { ++ if (specbits & 1 << (int) RID_AUTO) ++ error ("function definition declared `auto'"); ++ if (specbits & 1 << (int) RID_REGISTER) ++ error ("function definition declared `auto'"); ++ if (specbits & 1 << (int) RID_TYPEDEF) ++ error ("function definition declared `typedef'"); ++ specbits &= ~ ((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER) ++ | (1 << (int) RID_AUTO)); ++ } ++ else if (decl_context != NORMAL && nclasses > 0) ++ { ++ if (decl_context == PARM && specbits & 1 << (int) RID_REGISTER) ++ ; ++ else ++ { ++ error ((decl_context == FIELD ++ ? "storage class specified for structure field `%s'" ++ : (decl_context == PARM ++ ? "storage class specified for parameter `%s'" ++ : "storage class specified for typename")), ++ name); ++ specbits &= ~ ((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER) ++ | (1 << (int) RID_AUTO) | (1 << (int) RID_STATIC) ++ | (1 << (int) RID_EXTERN)); ++ } ++ } ++ else if (specbits & 1 << (int) RID_EXTERN && initialized ++ && ! funcdef_flag) ++ warning ("`%s' initialized and declared `extern'", name); ++ else if (current_binding_level == global_binding_level ++ && specbits & (1 << (int) RID_AUTO)) ++ error ("top-level declaration of `%s' specifies `auto'", name); ++ } ++ ++ /* Now figure out the structure of the declarator proper. ++ Descend through it, creating more complex types, until we reach ++ the declared identifier (or NULL_TREE, in an absolute declarator). */ ++ ++ while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE) ++ { ++ if (type == error_mark_node) ++ { ++ declarator = TREE_OPERAND (declarator, 0); ++ continue; ++ } ++ ++ /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]), ++ an INDIRECT_REF (for *...), ++ a CALL_EXPR (for ...(...)), ++ an identifier (for the name being declared) ++ or a null pointer (for the place in an absolute declarator ++ where the name was omitted). ++ For the last two cases, we have just exited the loop. ++ ++ At this point, TYPE is the type of elements of an array, ++ or for a function to return, or for a pointer to point to. ++ After this sequence of ifs, TYPE is the type of the ++ array or function or pointer, and DECLARATOR has had its ++ outermost layer removed. */ ++ ++ if (TREE_CODE (declarator) == ARRAY_REF) ++ { ++ register tree itype = NULL_TREE; ++ register tree size = TREE_OPERAND (declarator, 1); ++ ++ declarator = TREE_OPERAND (declarator, 0); ++ ++ /* Check for some types that there cannot be arrays of. */ ++ ++ if (type == void_type_node) ++ { ++ error ("declaration of `%s' as array of voids", name); ++ type = error_mark_node; ++ } ++ ++ if (TREE_CODE (type) == FUNCTION_TYPE) ++ { ++ error ("declaration of `%s' as array of functions", name); ++ type = error_mark_node; ++ } ++ ++ if (size == error_mark_node) ++ type = error_mark_node; ++ ++ if (type == error_mark_node) ++ continue; ++ ++ /* If size was specified, set ITYPE to a range-type for that size. ++ Otherwise, ITYPE remains null. finish_decl may figure it out ++ from an initial value. */ ++ ++ if (size) ++ { ++ /* might be a cast */ ++ if (TREE_CODE (size) == NOP_EXPR ++ && TREE_TYPE (size) == TREE_TYPE (TREE_OPERAND (size, 0))) ++ size = TREE_OPERAND (size, 0); ++ ++ if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE ++ && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE) ++ { ++ error ("size of array `%s' has non-integer type", name); ++ size = integer_one_node; ++ } ++ if (pedantic && integer_zerop (size)) ++ warning ("ANSI C forbids zero-size array `%s'", name); ++ if (TREE_CODE (size) == INTEGER_CST) ++ { ++ if (INT_CST_LT (size, integer_zero_node)) ++ { ++ error ("size of array `%s' is negative", name); ++ size = integer_one_node; ++ } ++ itype = build_index_type (build_int_2 (TREE_INT_CST_LOW (size) - 1, 0)); ++ } ++ else ++ { ++ if (pedantic) ++ warning ("ANSI C forbids variable-size array `%s'", name); ++ itype = build_binary_op (MINUS_EXPR, size, integer_one_node); ++ itype = build_index_type (itype); ++ } ++ } ++ ++#if 0 /* This loses for union incomplete (*foo)[4]; */ ++ /* Complain about arrays of incomplete types, except in typedefs. */ ++ ++ if (TYPE_SIZE (type) == 0 ++ && !(specbits & (1 << (int) RID_TYPEDEF))) ++ warning ("array type has incomplete element type"); ++#endif ++ ++ /* Build the array type itself. ++ Merge any constancy or volatility into the target type. */ ++ ++ if (constp || volatilep) ++ type = c_build_type_variant (type, constp, volatilep); ++ ++#if 0 /* don't clear these; leave them set so that the array type ++ or the variable is itself const or volatile. */ ++ constp = 0; ++ volatilep = 0; ++#endif ++ ++ type = build_array_type (type, itype); ++ } ++ else if (TREE_CODE (declarator) == CALL_EXPR) ++ { ++ tree arg_types; ++ ++ /* Declaring a function type. ++ Make sure we have a valid type for the function to return. */ ++ if (type == error_mark_node) ++ continue; ++ ++ if (pedantic && (constp || volatilep)) ++ warning ("function declared to return const or volatile result"); ++ ++ /* Warn about some types functions can't return. */ ++ ++ if (TREE_CODE (type) == FUNCTION_TYPE) ++ { ++ error ("`%s' declared as function returning a function", name); ++ type = integer_type_node; ++ } ++ if (TREE_CODE (type) == ARRAY_TYPE) ++ { ++ error ("`%s' declared as function returning an array", name); ++ type = integer_type_node; ++ } ++ ++ /* Traditionally, declaring return type float means double. */ ++ ++ if (flag_traditional && type == float_type_node) ++ type = double_type_node; ++ ++ /* Construct the function type and go to the next ++ inner layer of declarator. */ ++ ++ arg_types = grokparms (TREE_OPERAND (declarator, 1), ++ funcdef_flag ++ /* Say it's a definition ++ only for the CALL_EXPR ++ closest to the identifier. */ ++ && TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE); ++#if 0 /* This seems to be false. We turn off temporary allocation ++ above in this function if -traditional. ++ And this code caused inconsistent results with prototypes: ++ callers would ignore them, and pass arguments wrong. */ ++ ++ /* Omit the arg types if -traditional, since the arg types ++ and the list links might not be permanent. */ ++ type = build_function_type (type, flag_traditional ? 0 : arg_types); ++#endif ++ type = build_function_type (type, arg_types); ++ declarator = TREE_OPERAND (declarator, 0); ++ } ++ else if (TREE_CODE (declarator) == INDIRECT_REF) ++ { ++ /* Merge any constancy or volatility into the target type ++ for the pointer. */ ++ ++ if (constp || volatilep) ++ type = c_build_type_variant (type, constp, volatilep); ++ constp = 0; ++ volatilep = 0; ++ ++ type = build_pointer_type (type); ++ ++ /* Process a list of type modifier keywords ++ (such as const or volatile) that were given inside the `*'. */ ++ ++ if (TREE_TYPE (declarator)) ++ { ++ register tree typemodlist; ++ int erred = 0; ++ for (typemodlist = TREE_TYPE (declarator); typemodlist; ++ typemodlist = TREE_CHAIN (typemodlist)) ++ { ++ if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_CONST]) ++ constp++; ++ else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE]) ++ volatilep++; ++ else if (!erred) ++ { ++ erred = 1; ++ error ("invalid type modifier within pointer declarator"); ++ } ++ } ++ if (constp > 1) ++ warning ("duplicate `const'"); ++ if (volatilep > 1) ++ warning ("duplicate `volatile'"); ++ } ++ ++ declarator = TREE_OPERAND (declarator, 0); ++ } ++ else ++ abort (); ++ ++/* layout_type (type); */ ++ ++ /* @@ Should perhaps replace the following code by changes in ++ * @@ stor_layout.c. */ ++ if (TREE_CODE (type) == FUNCTION_DECL) ++ { ++ /* A function variable in C should be Pmode rather than EPmode ++ because it has just the address of a function, no static chain.*/ ++ TYPE_MODE (type) = Pmode; ++ } ++ } ++ ++ /* Now TYPE has the actual type. */ ++ ++ /* If this is declaring a typedef name, return a TYPE_DECL. */ ++ ++ if (specbits & (1 << (int) RID_TYPEDEF)) ++ { ++ /* Note that the grammar rejects storage classes ++ in typenames, fields or parameters */ ++ if (constp || volatilep) ++ type = c_build_type_variant (type, constp, volatilep); ++ if (resume_temporary) ++ resume_temporary_allocation (); ++ return build_decl (TYPE_DECL, declarator, type); ++ } ++ ++ /* Detect the case of an array type of unspecified size ++ which came, as such, direct from a typedef name. ++ We must copy the type, so that each identifier gets ++ a distinct type, so that each identifier's size can be ++ controlled separately by its own initializer. */ ++ ++ if (type != 0 && typedef_type != 0 ++ && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (typedef_type) ++ && TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == 0) ++ type = build_array_type (TREE_TYPE (type), 0); ++ ++ /* If this is a type name (such as, in a cast or sizeof), ++ compute the type and return it now. */ ++ ++ if (decl_context == TYPENAME) ++ { ++ /* Note that the grammar rejects storage classes ++ in typenames, fields or parameters */ ++ if (constp || volatilep) ++ type = c_build_type_variant (type, constp, volatilep); ++ if (resume_temporary) ++ resume_temporary_allocation (); ++ return type; ++ } ++ ++ /* `void' at top level (not within pointer) ++ is allowed only in typedefs or type names. ++ We don't complain about parms either, but that is because ++ a better error message can be made later. */ ++ ++ if (type == void_type_node && decl_context != PARM) ++ { ++ error ("variable or field `%s' declared void", ++ IDENTIFIER_POINTER (declarator)); ++ type = integer_type_node; ++ } ++ ++ /* Now create the decl, which may be a VAR_DECL, a PARM_DECL ++ or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE. */ ++ ++ { ++ register tree decl; ++ ++ if (decl_context == PARM) ++ { ++ /* A parameter declared as an array of T is really a pointer to T. ++ One declared as a function is really a pointer to a function. */ ++ ++ if (TREE_CODE (type) == ARRAY_TYPE) ++ { ++ /* Transfer const-ness of array into that of type pointed to. */ ++ type = build_pointer_type ++ (c_build_type_variant (TREE_TYPE (type), constp, volatilep)); ++ volatilep = constp = 0; ++ } ++ else if (TREE_CODE (type) == FUNCTION_TYPE) ++ { ++ if (pedantic && (constp || volatilep)) ++ warning ("ANSI C forbids const or volatile function types"); ++ type = build_pointer_type (c_build_type_variant (type, constp, volatilep)); ++ volatilep = constp = 0; ++ } ++ ++ if (initialized) ++ error ("parameter `%s' is initialized", name); ++ ++ decl = build_decl (PARM_DECL, declarator, type); ++ ++ /* Compute the type actually passed in the parmlist, ++ for the case where there is no prototype. ++ (For example, shorts and chars are passed as ints.) ++ When there is a prototype, this is overridden later. */ ++ ++ DECL_ARG_TYPE (decl) = type; ++ if (type == float_type_node) ++ DECL_ARG_TYPE (decl) = double_type_node; ++ else if (TREE_CODE (type) == INTEGER_TYPE ++ /* ANSI C says short and char are promoted to int ++ or unsigned int, even if that is not wider. */ ++ && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node) ++ || type == short_integer_type_node ++ || type == short_unsigned_type_node)) ++ { ++ if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node) ++ && TREE_UNSIGNED (type)) ++ DECL_ARG_TYPE (decl) = unsigned_type_node; ++ else ++ DECL_ARG_TYPE (decl) = integer_type_node; ++ } ++ } ++ else if (decl_context == FIELD) ++ { ++ /* Structure field. It may not be a function. */ ++ ++ if (TREE_CODE (type) == FUNCTION_TYPE) ++ { ++ error ("field `%s' declared as a function", ++ IDENTIFIER_POINTER (declarator)); ++ type = build_pointer_type (type); ++ } ++ else if (TREE_CODE (type) != ERROR_MARK && TYPE_SIZE (type) == 0) ++ { ++ error ("field `%s' has incomplete type", ++ IDENTIFIER_POINTER (declarator)); ++ type = error_mark_node; ++ } ++ /* Move type qualifiers down to element of an array. */ ++ if (TREE_CODE (type) == ARRAY_TYPE && (constp || volatilep)) ++ { ++ type = c_build_type_variant (type, constp, volatilep); ++ constp = volatilep = 0; ++ } ++ /* Note that the grammar rejects storage classes ++ in typenames, fields or parameters */ ++ decl = build_decl (FIELD_DECL, declarator, type); ++ } ++ else if (TREE_CODE (type) == FUNCTION_TYPE) ++ { ++ if (specbits & ((1 << (int) RID_AUTO) | (1 << (int) RID_REGISTER))) ++ error ("invalid storage class for function `%s'", ++ IDENTIFIER_POINTER (declarator)); ++ /* Function declaration not at top level. ++ Storage classes other than `extern' are not allowed ++ and `extern' makes no difference. */ ++ if (current_binding_level != global_binding_level ++ && (specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE))) ++ && pedantic) ++ warning ("invalid storage class for function `%s'", ++ IDENTIFIER_POINTER (declarator)); ++ decl = build_decl (FUNCTION_DECL, declarator, type); ++ ++ TREE_EXTERNAL (decl) = 1; ++ /* Record presence of `static'. */ ++ TREE_PUBLIC (decl) = !(specbits & (1 << (int) RID_STATIC)); ++ /* Record presence of `inline', if it is reasonable. */ ++ if (inlinep) ++ { ++ tree last = tree_last (TYPE_ARG_TYPES (type)); ++ ++ if (! strcmp (IDENTIFIER_POINTER (declarator), "main")) ++ warning ("cannot inline function `main'"); ++ else if (last && TREE_VALUE (last) != void_type_node) ++ warning ("inline declaration ignored for function with `...'"); ++ else ++ /* Assume that otherwise the function can be inlined. */ ++ TREE_INLINE (decl) = 1; ++ ++ if (specbits & (1 << (int) RID_EXTERN)) ++ current_extern_inline = 1; ++ } ++ } ++ else ++ { ++ /* It's a variable. */ ++ ++ /* Move type qualifiers down to element of an array. */ ++ if (TREE_CODE (type) == ARRAY_TYPE && (constp || volatilep)) ++ { ++ type = c_build_type_variant (type, constp, volatilep); ++#if 0 /* but a variable whose type is const should still have TREE_READONLY. */ ++ constp = volatilep = 0; ++#endif ++ } ++ ++ decl = build_decl (VAR_DECL, declarator, type); ++ ++ if (inlinep) ++ warning_with_decl (decl, "variable `%s' declared `inline'"); ++ ++ /* An uninitialized decl with `extern' is a reference. */ ++ TREE_EXTERNAL (decl) ++ = !initialized && (specbits & (1 << (int) RID_EXTERN)); ++ /* At top level, either `static' or no s.c. makes a definition ++ (perhaps tentative), and absence of `static' makes it public. */ ++ if (current_binding_level == global_binding_level) ++ { ++ TREE_PUBLIC (decl) = !(specbits & (1 << (int) RID_STATIC)); ++ TREE_STATIC (decl) = ! TREE_EXTERNAL (decl); ++ } ++ /* Not at top level, only `static' makes a static definition. */ ++ else ++ { ++ TREE_STATIC (decl) = (specbits & (1 << (int) RID_STATIC)) != 0; ++ TREE_PUBLIC (decl) = TREE_EXTERNAL (decl); ++ /* `extern' with initialization is invalid if not at top level. */ ++ if ((specbits & (1 << (int) RID_EXTERN)) && initialized) ++ error ("`%s' has both `extern' and initializer", name); ++ } ++ } ++ ++ /* Record `register' declaration for warnings on & ++ and in case doing stupid register allocation. */ ++ ++ if (specbits & (1 << (int) RID_REGISTER)) ++ TREE_REGDECL (decl) = 1; ++ ++ /* Record constancy and volatility. */ ++ ++ if (constp) ++ TREE_READONLY (decl) = 1; ++ if (volatilep) ++ { ++ TREE_VOLATILE (decl) = 1; ++ TREE_THIS_VOLATILE (decl) = 1; ++ } ++ ++ if (resume_temporary) ++ resume_temporary_allocation (); ++ ++ return decl; ++ } ++} ++ ++/* Make a variant type in the proper way for C, propagating qualifiers ++ down to the element type of an array. */ ++ ++tree ++c_build_type_variant (type, constp, volatilep) ++ tree type; ++ int constp, volatilep; ++{ ++ if (TREE_CODE (type) != ARRAY_TYPE) ++ return build_type_variant (type, constp, volatilep); ++ ++ return build_array_type (c_build_type_variant (TREE_TYPE (type), ++ constp, volatilep), ++ TYPE_DOMAIN (type)); ++} ++ ++/* Decode the parameter-list info for a function type or function definition. ++ The argument is the value returned by `get_parm_info' (or made in parse.y ++ if there is an identifier list instead of a parameter decl list). ++ These two functions are separate because when a function returns ++ or receives functions then each is called multiple times but the order ++ of calls is different. The last call to `grokparms' is always the one ++ that contains the formal parameter names of a function definition. ++ ++ Store in `last_function_parms' a chain of the decls of parms. ++ Also store in `last_function_parm_tags' a chain of the struct and union ++ tags declared among the parms. ++ ++ Return a list of arg types to use in the FUNCTION_TYPE for this function. ++ ++ FUNCDEF_FLAG is nonzero for a function definition, 0 for ++ a mere declaration. A nonempty identifier-list gets an error message ++ when FUNCDEF_FLAG is zero. */ ++ ++static tree ++grokparms (parms_info, funcdef_flag) ++ tree parms_info; ++ int funcdef_flag; ++{ ++ tree first_parm = TREE_CHAIN (parms_info); ++ ++ last_function_parms = TREE_PURPOSE (parms_info); ++ last_function_parm_tags = TREE_VALUE (parms_info); ++ ++ if (warn_strict_prototypes && first_parm == 0 && !funcdef_flag) ++ warning ("function declaration isn't a prototype"); ++ ++ if (first_parm != 0 ++ && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE) ++ { ++ if (! funcdef_flag) ++ warning ("parameter names (without types) in function declaration"); ++ ++ last_function_parms = first_parm; ++ return 0; ++ } ++ else ++ { ++ tree parm; ++ tree typelt; ++ /* We no longer test FUNCDEF_FLAG. ++ If the arg types are incomplete in a declaration, ++ they must include undefined tags. ++ These tags can never be defined in the scope of the declaration, ++ so the types can never be completed, ++ and no call can be compiled successfully. */ ++#if 0 ++ /* In a fcn definition, arg types must be complete. */ ++ if (funcdef_flag) ++#endif ++ for (parm = last_function_parms, typelt = first_parm; ++ parm; ++ parm = TREE_CHAIN (parm)) ++ /* Skip over any enumeration constants declared here. */ ++ if (TREE_CODE (parm) == PARM_DECL) ++ { ++ /* Barf if the parameter itself has an incomplete type. */ ++ tree type = TREE_VALUE (typelt); ++ if (TYPE_SIZE (type) == 0) ++ { ++ if (funcdef_flag && DECL_NAME (parm) != 0) ++ error ("parameter `%s' has incomplete type", ++ IDENTIFIER_POINTER (DECL_NAME (parm))); ++ else ++ warning ("parameter has incomplete type"); ++ if (funcdef_flag) ++ { ++ TREE_VALUE (typelt) = error_mark_node; ++ TREE_TYPE (parm) = error_mark_node; ++ } ++ } ++#if 0 /* This has been replaced by parm_tags_warning ++ which uses a more accurate criterion for what to warn about. */ ++ else ++ { ++ /* Now warn if is a pointer to an incomplete type. */ ++ while (TREE_CODE (type) == POINTER_TYPE ++ || TREE_CODE (type) == REFERENCE_TYPE) ++ type = TREE_TYPE (type); ++ type = TYPE_MAIN_VARIANT (type); ++ if (TYPE_SIZE (type) == 0) ++ { ++ if (DECL_NAME (parm) != 0) ++ warning ("parameter `%s' points to incomplete type", ++ IDENTIFIER_POINTER (DECL_NAME (parm))); ++ else ++ warning ("parameter points to incomplete type"); ++ } ++ } ++#endif ++ typelt = TREE_CHAIN (typelt); ++ } ++ ++ return first_parm; ++ } ++} ++ ++ ++/* Return a tree_list node with info on a parameter list just parsed. ++ The TREE_PURPOSE is a chain of decls of those parms. ++ The TREE_VALUE is a list of structure, union and enum tags defined. ++ The TREE_CHAIN is a list of argument types to go in the FUNCTION_TYPE. ++ This tree_list node is later fed to `grokparms'. ++ ++ VOID_AT_END nonzero means append `void' to the end of the type-list. ++ Zero means the parmlist ended with an ellipsis so don't append `void'. */ ++ ++tree ++get_parm_info (void_at_end) ++ int void_at_end; ++{ ++ register tree decl; ++ register tree types = 0; ++ int erred = 0; ++ tree tags = gettags (); ++ tree parms = nreverse (getdecls ()); ++ ++ /* Just `void' (and no ellipsis) is special. There are really no parms. */ ++ if (void_at_end && parms != 0 ++ && TREE_CHAIN (parms) == 0 ++ && TREE_TYPE (parms) == void_type_node ++ && DECL_NAME (parms) == 0) ++ { ++ parms = NULL_TREE; ++ storedecls (NULL_TREE); ++ return saveable_tree_cons (NULL_TREE, NULL_TREE, void_list_node); ++ } ++ ++ storedecls (parms); ++ ++ for (decl = parms; decl; decl = TREE_CHAIN (decl)) ++ /* There may also be declarations for enumerators if an enumeration ++ type is declared among the parms. Ignore them here. */ ++ if (TREE_CODE (decl) == PARM_DECL) ++ { ++ /* Since there is a prototype, ++ args are passed in their declared types. */ ++ tree type = TREE_TYPE (decl); ++ DECL_ARG_TYPE (decl) = type; ++#ifdef PROMOTE_PROTOTYPES ++ if (TREE_CODE (type) == INTEGER_TYPE ++ && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) ++ DECL_ARG_TYPE (decl) = integer_type_node; ++#endif ++ ++ types = saveable_tree_cons (NULL_TREE, TREE_TYPE (decl), types); ++ if (TREE_VALUE (types) == void_type_node && ! erred ++ && DECL_NAME (decl) == 0) ++ { ++ error ("`void' in parameter list must be the entire list"); ++ erred = 1; ++ } ++ } ++ ++ if (void_at_end) ++ return saveable_tree_cons (parms, tags, ++ nreverse (saveable_tree_cons (NULL_TREE, void_type_node, types))); ++ ++ return saveable_tree_cons (parms, tags, nreverse (types)); ++} ++ ++/* At end of parameter list, warn about any struct, union or enum tags ++ defined within. Do so because these types cannot ever become complete. */ ++ ++void ++parmlist_tags_warning () ++{ ++ tree elt; ++ static int already; ++ ++ for (elt = current_binding_level->tags; elt; elt = TREE_CHAIN (elt)) ++ { ++ enum tree_code code = TREE_CODE (TREE_VALUE (elt)); ++ warning ("`%s %s' declared inside parameter list", ++ (code == RECORD_TYPE ? "struct" ++ : code == UNION_TYPE ? "union" ++ : "enum"), ++ IDENTIFIER_POINTER (TREE_PURPOSE (elt))); ++ if (! already) ++ { ++ warning ("its scope is only this definition or declaration,"); ++ warning ("which is probably not what you want."); ++ already = 1; ++ } ++ } ++} ++ ++/* Get the struct, enum or union (CODE says which) with tag NAME. ++ Define the tag as a forward-reference if it is not defined. */ ++ ++tree ++xref_tag (code, name) ++ enum tree_code code; ++ tree name; ++{ ++ int temporary = allocation_temporary_p (); ++ ++ /* If a cross reference is requested, look up the type ++ already defined for this tag and return it. */ ++ ++ register tree ref = lookup_tag (code, name, current_binding_level, 0); ++ if (ref) return ref; ++ ++ if (current_binding_level == global_binding_level && temporary) ++ end_temporary_allocation (); ++ ++ /* If no such tag is yet defined, create a forward-reference node ++ and record it as the "definition". ++ When a real declaration of this type is found, ++ the forward-reference will be altered into a real type. */ ++ ++ ref = make_node (code); ++ if (code == ENUMERAL_TYPE) ++ { ++ /* (In ANSI, Enums can be referred to only if already defined.) */ ++ if (pedantic) ++ warning ("ANSI C forbids forward references to `enum' types"); ++ /* Give the type a default layout like unsigned int ++ to avoid crashing if it does not get defined. */ ++ TYPE_MODE (ref) = SImode; ++ TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node); ++ TREE_UNSIGNED (ref) = 1; ++ TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node); ++ TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node); ++ TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node); ++ } ++ ++ pushtag (name, ref); ++ ++ if (current_binding_level == global_binding_level && temporary) ++ resume_temporary_allocation (); ++ ++ return ref; ++} ++ ++/* Make sure that the tag NAME is defined *in the current binding level* ++ at least as a forward reference. ++ CODE says which kind of tag NAME ought to be. */ ++ ++tree ++start_struct (code, name) ++ enum tree_code code; ++ tree name; ++{ ++ /* If there is already a tag defined at this binding level ++ (as a forward reference), just return it. */ ++ ++ register tree ref = 0; ++ ++ if (name != 0) ++ ref = lookup_tag (code, name, current_binding_level, 1); ++ if (ref && TREE_CODE (ref) == code) ++ { ++ if (TYPE_FIELDS (ref)) ++ error ((code == UNION_TYPE ? "redefinition of `union %s'" ++ : "redefinition of `struct %s'"), ++ IDENTIFIER_POINTER (name)); ++ ++ return ref; ++ } ++ ++ /* Otherwise create a forward-reference just so the tag is in scope. */ ++ ++ ref = make_node (code); ++ pushtag (name, ref); ++ return ref; ++} ++ ++/* Process the specs, declarator (NULL if omitted) and width (NULL if omitted) ++ of a structure component, returning a FIELD_DECL node. ++ WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. ++ ++ This is done during the parsing of the struct declaration. ++ The FIELD_DECL nodes are chained together and the lot of them ++ are ultimately passed to `build_struct' to make the RECORD_TYPE node. */ ++ ++tree ++grokfield (filename, line, declarator, declspecs, width) ++ char *filename; ++ int line; ++ tree declarator, declspecs, width; ++{ ++ register tree value = grokdeclarator (declarator, declspecs, FIELD, 0); ++ ++ finish_decl (value, NULL, NULL); ++ DECL_INITIAL (value) = width; ++ ++ return value; ++} ++ ++/* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T. ++ FIELDLIST is a chain of FIELD_DECL nodes for the fields. */ ++ ++tree ++finish_struct (t, fieldlist) ++ register tree t, fieldlist; ++{ ++ register tree x; ++ int old_momentary; ++ int round_up_size = 1; ++ ++ /* If this type was previously laid out as a forward reference, ++ make sure we lay it out again. */ ++ ++ TYPE_SIZE (t) = 0; ++ ++ if (in_parm_level_p ()) ++ warning ((TREE_CODE (t) == UNION_TYPE ? "union defined inside parms" ++ : "structure defined inside parms")); ++ ++ old_momentary = suspend_momentary (); ++ ++ if (fieldlist == 0 && pedantic) ++ warning ((TREE_CODE (t) == UNION_TYPE ? "union has no members" ++ : "structure has no members")); ++ ++ /* Install struct as DECL_CONTEXT of each field decl. ++ Also process specified field sizes. ++ Set DECL_SIZE_UNIT to the specified size, or 0 if none specified. ++ The specified size is found in the DECL_INITIAL. ++ Store 0 there, except for ": 0" fields (so we can find them ++ and delete them, below). */ ++ ++ for (x = fieldlist; x; x = TREE_CHAIN (x)) ++ { ++ DECL_CONTEXT (x) = t; ++ DECL_SIZE_UNIT (x) = 0; ++ ++ /* If any field is const, the structure type is pseudo-const. */ ++ if (TREE_READONLY (x)) ++ C_TYPE_FIELDS_READONLY (t) = 1; ++ else ++ { ++ /* A field that is pseudo-const makes the structure likewise. */ ++ tree t1 = TREE_TYPE (x); ++ while (TREE_CODE (t1) == ARRAY_TYPE) ++ t1 = TREE_TYPE (t1); ++ if ((TREE_CODE (t1) == RECORD_TYPE || TREE_CODE (t1) == UNION_TYPE) ++ && C_TYPE_FIELDS_READONLY (t1)) ++ C_TYPE_FIELDS_READONLY (t) = 1; ++ } ++ ++ /* Detect invalid bit-field size. */ ++ if (DECL_INITIAL (x) && TREE_CODE (DECL_INITIAL (x)) != INTEGER_CST) ++ { ++ error_with_decl (x, "bit-field `%s' width not an integer constant"); ++ DECL_INITIAL (x) = NULL; ++ } ++ ++ /* Detect invalid bit-field type. */ ++ if (DECL_INITIAL (x) ++ && TREE_CODE (TREE_TYPE (x)) != INTEGER_TYPE ++ && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE) ++ { ++ error_with_decl (x, "bit-field `%s' has invalid type"); ++ DECL_INITIAL (x) = NULL; ++ } ++ if (DECL_INITIAL (x) && pedantic ++ && TREE_TYPE (x) != integer_type_node ++ && TREE_TYPE (x) != unsigned_type_node) ++ warning_with_decl (x, "bit-field `%s' type invalid in ANSI C"); ++ ++ /* Detect and ignore out of range field width. */ ++ if (DECL_INITIAL (x)) ++ { ++ register int width = TREE_INT_CST_LOW (DECL_INITIAL (x)); ++ ++ if (width < 0) ++ { ++ DECL_INITIAL (x) = NULL; ++ warning_with_decl (x, "negative width in bit-field `%s'"); ++ } ++ else if (width == 0 && DECL_NAME (x) != 0) ++ { ++ error_with_decl (x, "zero width for bit-field `%s'"); ++ DECL_INITIAL (x) = NULL; ++ } ++ else if (width > TYPE_PRECISION (TREE_TYPE (x))) ++ { ++ DECL_INITIAL (x) = NULL; ++ warning_with_decl (x, "width of `%s' exceeds its type"); ++ } ++ } ++ ++ /* Process valid field width. */ ++ if (DECL_INITIAL (x)) ++ { ++ register int width = TREE_INT_CST_LOW (DECL_INITIAL (x)); ++ ++ if (width == 0) ++ { ++ /* field size 0 => mark following field as "aligned" */ ++ if (TREE_CHAIN (x)) ++ DECL_ALIGN (TREE_CHAIN (x)) ++ = MAX (DECL_ALIGN (TREE_CHAIN (x)), EMPTY_FIELD_BOUNDARY); ++ /* field of size 0 at the end => round up the size. */ ++ else ++ round_up_size = EMPTY_FIELD_BOUNDARY; ++ } ++ else ++ { ++ DECL_INITIAL (x) = NULL; ++ DECL_SIZE_UNIT (x) = width; ++ TREE_PACKED (x) = 1; ++ /* Traditionally a bit field is unsigned ++ even if declared signed. */ ++ if (flag_traditional ++ && TREE_CODE (TREE_TYPE (x)) == INTEGER_TYPE) ++ TREE_TYPE (x) = unsigned_type_node; ++ } ++ } ++ else ++ /* Non-bit-fields are aligned for their type. */ ++ DECL_ALIGN (x) = MAX (DECL_ALIGN (x), TYPE_ALIGN (TREE_TYPE (x))); ++ } ++ ++ /* Now DECL_INITIAL is null on all members except for zero-width bit-fields. ++ And they have already done their work. */ ++ ++ /* Delete all zero-width bit-fields from the front of the fieldlist */ ++ while (fieldlist ++ && DECL_INITIAL (fieldlist)) ++ fieldlist = TREE_CHAIN (fieldlist); ++ /* Delete all such members from the rest of the fieldlist */ ++ for (x = fieldlist; x;) ++ { ++ if (TREE_CHAIN (x) && DECL_INITIAL (TREE_CHAIN (x))) ++ TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x)); ++ else x = TREE_CHAIN (x); ++ } ++ ++ /* Delete all duplicate fields from the fieldlist */ ++ for (x = fieldlist; x && TREE_CHAIN (x);) ++ /* Anonymous fields aren't duplicates. */ ++ if (DECL_NAME (TREE_CHAIN (x)) == 0) ++ x = TREE_CHAIN (x); ++ else ++ { ++ register tree y = fieldlist; ++ ++ while (1) ++ { ++ if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x))) ++ break; ++ if (y == x) ++ break; ++ y = TREE_CHAIN (y); ++ } ++ if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x))) ++ { ++ error_with_decl (TREE_CHAIN (x), "duplicate member `%s'"); ++ TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x)); ++ } ++ else x = TREE_CHAIN (x); ++ } ++ ++ /* Now we have the final fieldlist. Record it, ++ then lay out the structure or union (including the fields). */ ++ ++ TYPE_FIELDS (t) = fieldlist; ++ ++ /* If there's a :0 field at the end, round the size to the ++ EMPTY_FIELD_BOUNDARY. */ ++ TYPE_ALIGN (t) = round_up_size; ++ ++ for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x)) ++ { ++ TYPE_FIELDS (x) = TYPE_FIELDS (t); ++ TYPE_ALIGN (x) = TYPE_ALIGN (t); ++ } ++ ++ layout_type (t); ++ ++ /* Promote each bit-field's type to int if it is narrower than that. */ ++ for (x = fieldlist; x; x = TREE_CHAIN (x)) ++ if (TREE_PACKED (x) ++ && TREE_CODE (TREE_TYPE (x)) == INTEGER_TYPE ++ && (TREE_INT_CST_LOW (DECL_SIZE (x)) * DECL_SIZE_UNIT (x) ++ < TYPE_PRECISION (integer_type_node))) ++ TREE_TYPE (x) = integer_type_node; ++ ++ /* If this structure or union completes the type of any previous ++ variable declaration, lay it out and output its rtl. */ ++ ++ if (current_binding_level->n_incomplete != 0) ++ { ++ tree decl; ++ for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl)) ++ { ++ if (TREE_TYPE (decl) == t ++ && TREE_CODE (decl) != TYPE_DECL) ++ { ++ int toplevel = global_binding_level == current_binding_level; ++ layout_decl (decl, 0); ++ rest_of_decl_compilation (decl, 0, toplevel, 0); ++ if (! toplevel) ++ expand_decl (decl, NULL_TREE); ++ --current_binding_level->n_incomplete; ++ } ++ else if (TYPE_SIZE (TREE_TYPE (decl)) == 0 ++ && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) ++ { ++ tree element = TREE_TYPE (decl); ++ while (TREE_CODE (element) == ARRAY_TYPE) ++ element = TREE_TYPE (element); ++ if (element == t) ++ layout_array_type (TREE_TYPE (decl)); ++ } ++ } ++ } ++ ++ resume_momentary (old_momentary); ++ ++ return t; ++} ++ ++/* Lay out the type T, and its element type, and so on. */ ++ ++static void ++layout_array_type (t) ++ tree t; ++{ ++ if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE) ++ layout_array_type (TREE_TYPE (t)); ++ layout_type (t); ++} ++ ++/* Begin compiling the definition of an enumeration type. ++ NAME is its name (or null if anonymous). ++ Returns the type object, as yet incomplete. ++ Also records info about it so that build_enumerator ++ may be used to declare the individual values as they are read. */ ++ ++tree ++start_enum (name) ++ tree name; ++{ ++ register tree enumtype = 0; ++ ++ /* If this is the real definition for a previous forward reference, ++ fill in the contents in the same object that used to be the ++ forward reference. */ ++ ++ if (name != 0) ++ enumtype = lookup_tag (ENUMERAL_TYPE, name, current_binding_level, 1); ++ ++ if (enumtype == 0 || TREE_CODE (enumtype) != ENUMERAL_TYPE) ++ { ++ enumtype = make_node (ENUMERAL_TYPE); ++ pushtag (name, enumtype); ++ } ++ ++ if (TYPE_VALUES (enumtype) != 0) ++ { ++ /* This enum is a named one that has been declared already. */ ++ error ("redeclaration of `enum %s'", IDENTIFIER_POINTER (name)); ++ ++ /* Completely replace its old definition. ++ The old enumerators remain defined, however. */ ++ TYPE_VALUES (enumtype) = 0; ++ } ++ ++ /* Initially, set up this enum as like `int' ++ so that we can create the enumerators' declarations and values. ++ Later on, the precision of the type may be changed and ++ it may be laid out again. */ ++ ++ TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node); ++ TYPE_SIZE (enumtype) = 0; ++ fixup_unsigned_type (enumtype); ++ ++ enum_next_value = integer_zero_node; ++ ++ return enumtype; ++} ++ ++/* After processing and defining all the values of an enumeration type, ++ install their decls in the enumeration type and finish it off. ++ ENUMTYPE is the type object and VALUES a list of name-value pairs. ++ Returns ENUMTYPE. */ ++ ++tree ++finish_enum (enumtype, values) ++ register tree enumtype, values; ++{ ++ register tree pair; ++ tree maximum = 0, minimum = 0; ++ register long maxvalue = 0; ++ register long minvalue = 0; ++ register int i; ++ ++ if (in_parm_level_p ()) ++ warning ("enum defined inside parms"); ++ ++ TYPE_VALUES (enumtype) = values; ++ ++ /* Calculate the maximum and minimum values ++ of any enumerator in this type. */ ++ ++ for (pair = values; pair; pair = TREE_CHAIN (pair)) ++ { ++ tree value = TREE_VALUE (pair); ++ if (pair == values) ++ maximum = minimum = value; ++ else ++ { ++ if (tree_int_cst_lt (maximum, value)) ++ maximum = value; ++ if (tree_int_cst_lt (value, minimum)) ++ minimum = value; ++ } ++ } ++ ++ TYPE_MIN_VALUE (enumtype) = minimum; ++ TYPE_MAX_VALUE (enumtype) = maximum; ++ ++ /* An enum can have some negative values; then it is signed. */ ++ if (tree_int_cst_lt (minimum, integer_zero_node)) ++ TREE_UNSIGNED (enumtype) = 0; ++ ++ if (flag_short_enums) ++ { ++ /* Determine the precision this type needs, lay it out, and define it. */ ++ int maxvalue = TREE_INT_CST_LOW (maximum); ++ int minvalue = TREE_INT_CST_LOW (minimum); ++ int prec = floor_log2 (maxvalue) + 1; ++ ++ if (! tree_int_cst_lt (minimum, integer_zero_node)) ++ { ++ /* All values are nonnegatives. */ ++ if (prec == 0) ++ prec = 1; ++ ++ TYPE_PRECISION (enumtype) = prec; ++ } ++ else ++ { ++ int negprec = floor_log2 (-1 - minvalue) + 1; ++ ++ if (prec < negprec) ++ prec = negprec; ++ TYPE_PRECISION (enumtype) = prec + 1; ++ } ++ ++ /* Increase the size till it becomes the size of some mode. */ ++ ++ TYPE_PRECISION (enumtype) = round_size (TYPE_PRECISION (enumtype)); ++ ++ /* Cancel the laying out previously done for the enum type, ++ so that fixup_unsigned_type will do it over. */ ++ TYPE_SIZE (enumtype) = 0; ++ ++ layout_type (enumtype); ++ } ++ ++ return enumtype; ++} ++ ++/* Build and install a CONST_DECL for one value of the ++ current enumeration type (one that was begun with start_enum). ++ Return a tree-list containing the name and its value. ++ Assignment of sequential values by default is handled here. */ ++ ++tree ++build_enumerator (name, value) ++ tree name, value; ++{ ++ register tree decl; ++ ++ /* Validate and default VALUE. */ ++ ++ /* Remove no-op casts from the value. */ ++ while (value != 0 && TREE_CODE (value) == NOP_EXPR) ++ value = TREE_OPERAND (value, 0); ++ ++ if (value != 0 && TREE_CODE (value) != INTEGER_CST) ++ { ++ error ("enumerator value for `%s' not integer constant", ++ IDENTIFIER_POINTER (name)); ++ value = 0; ++ } ++ ++ /* Default based on previous value. */ ++ if (value == 0) ++ value = enum_next_value; ++ ++ /* Might as well enforce the ANSI restriction, since ++ values outside this range don't work in version 1. */ ++ if (! int_fits_type_p (value, integer_type_node)) ++ { ++ error ("enumerator value outside range of `int'"); ++ value = integer_zero_node; ++ } ++ ++ /* Set basis for default for next value. */ ++ enum_next_value = build_binary_op_nodefault (PLUS_EXPR, value, ++ integer_one_node, PLUS_EXPR); ++ ++ /* Now create a declaration for the enum value name. */ ++ ++ decl = build_decl (CONST_DECL, name, integer_type_node); ++ DECL_INITIAL (decl) = value; ++ TREE_TYPE (value) = integer_type_node; ++ pushdecl (decl); ++ ++ return saveable_tree_cons (name, value, NULL); ++} ++ ++/* Create the FUNCTION_DECL for a function definition. ++ DECLSPECS and DECLARATOR are the parts of the declaration; ++ they describe the function's name and the type it returns, ++ but twisted together in a fashion that parallels the syntax of C. ++ ++ This function creates a binding context for the function body ++ as well as setting up the FUNCTION_DECL in current_function_decl. ++ ++ Returns 1 on success. If the DECLARATOR is not suitable for a function ++ (it defines a datum instead), we return 0, which tells ++ yyparse to report a parse error. */ ++ ++int ++start_function (declspecs, declarator) ++ tree declarator, declspecs; ++{ ++ tree decl1, old_decl; ++ tree restype; ++ ++ current_function_returns_value = 0; /* Assume, until we see it does. */ ++ current_function_returns_null = 0; ++ warn_about_return_type = 0; ++ current_extern_inline = 0; ++ ++ decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1); ++ ++ /* If the declarator is not suitable for a function definition, ++ cause a syntax error. */ ++ if (decl1 == 0) ++ return 0; ++ ++ current_function_decl = decl1; ++ ++ announce_function (current_function_decl); ++ ++ if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl1))) == 0) ++ { ++ error ("return-type is an incomplete type"); ++ /* Make it return void instead. */ ++ TREE_TYPE (decl1) ++ = build_function_type (void_type_node, ++ TYPE_ARG_TYPES (TREE_TYPE (decl1))); ++ } ++ ++ if (warn_about_return_type) ++ warning ("return-type defaults to `int'"); ++ ++ /* Save the parm names or decls from this function's declarator ++ where store_parm_decls will find them. */ ++ current_function_parms = last_function_parms; ++ current_function_parm_tags = last_function_parm_tags; ++ ++ /* Make the init_value nonzero so pushdecl knows this is not tentative. ++ error_mark_node is replaced below (in poplevel) with the LET_STMT. */ ++ DECL_INITIAL (current_function_decl) = error_mark_node; ++ ++ /* If this definition isn't a prototype and we had a prototype declaration ++ before, copy the arg type info from that prototype. */ ++ old_decl = lookup_name_current_level (DECL_NAME (current_function_decl)); ++ if (old_decl != 0 ++ && TREE_TYPE (TREE_TYPE (current_function_decl)) == TREE_TYPE (TREE_TYPE (old_decl)) ++ && TYPE_ARG_TYPES (TREE_TYPE (current_function_decl)) == 0) ++ TREE_TYPE (current_function_decl) = TREE_TYPE (old_decl); ++ ++ /* This is a definition, not a reference. ++ So normally clear TREE_EXTERNAL. ++ However, `extern inline' acts like a declaration ++ except for defining how to inline. So set TREE_EXTERNAL in that case. */ ++ TREE_EXTERNAL (current_function_decl) = current_extern_inline; ++ ++ /* This function exists in static storage. ++ (This does not mean `static' in the C sense!) */ ++ TREE_STATIC (current_function_decl) = 1; ++ ++ /* Record the decl so that the function name is defined. ++ If we already have a decl for this name, and it is a FUNCTION_DECL, ++ use the old decl. */ ++ ++ current_function_decl = pushdecl (current_function_decl); ++ ++ pushlevel (0); ++ declare_parm_level (); ++ ++ make_function_rtl (current_function_decl); ++ ++ restype = TREE_TYPE (TREE_TYPE (current_function_decl)); ++ /* Promote the value to int before returning it. */ ++ if (TREE_CODE (restype) == INTEGER_TYPE ++ && TYPE_PRECISION (restype) < TYPE_PRECISION (integer_type_node)) ++ restype = integer_type_node; ++ DECL_RESULT_TYPE (current_function_decl) = restype; ++ DECL_RESULT (current_function_decl) ++ = build_decl (RESULT_DECL, value_identifier, restype); ++ ++ /* Allocate further tree nodes temporarily during compilation ++ of this function only. */ ++ temporary_allocation (); ++ ++ /* If this fcn was already referenced via a block-scope `extern' decl ++ (or an implicit decl), propagate certain information about the usage. */ ++ if (TREE_ADDRESSABLE (DECL_NAME (current_function_decl))) ++ TREE_ADDRESSABLE (current_function_decl) = 1; ++ ++ return 1; ++} ++ ++/* Store the parameter declarations into the current function declaration. ++ This is called after parsing the parameter declarations, before ++ digesting the body of the function. */ ++ ++void ++store_parm_decls () ++{ ++ register tree fndecl = current_function_decl; ++ register tree parm; ++ ++ /* This is either a chain of PARM_DECLs (if a prototype was used) ++ or a list of IDENTIFIER_NODEs (for an old-fashioned C definition). */ ++ tree specparms = current_function_parms; ++ ++ /* This is a list of types declared among parms in a prototype. */ ++ tree parmtags = current_function_parm_tags; ++ ++ /* This is a chain of PARM_DECLs from old-style parm declarations. */ ++ register tree parmdecls = getdecls (); ++ ++ /* This is a chain of any other decls that came in among the parm ++ declarations. If a parm is declared with enum {foo, bar} x; ++ then CONST_DECLs for foo and bar are put here. */ ++ tree nonparms = 0; ++ ++ if (specparms != 0 && TREE_CODE (specparms) != TREE_LIST) ++ { ++ /* This case is when the function was defined with an ANSI prototype. ++ The parms already have decls, so we need not do anything here ++ except record them as in effect ++ and complain if any redundant old-style parm decls were written. */ ++ ++ register tree next; ++ tree others = 0; ++ ++ if (parmdecls != 0) ++ error_with_decl (fndecl, ++ "parm types given both in parmlist and separately"); ++ ++ specparms = nreverse (specparms); ++ for (parm = specparms; parm; parm = next) ++ { ++ next = TREE_CHAIN (parm); ++ if (DECL_NAME (parm) == 0) ++ error_with_decl (parm, "parameter name omitted"); ++ else if (TREE_TYPE (parm) == void_type_node) ++ error_with_decl (parm, "parameter `%s' declared void"); ++ else if (TREE_CODE (parm) == PARM_DECL) ++ pushdecl (parm); ++ else ++ { ++ /* If we find an enum constant, put it aside for the moment. */ ++ TREE_CHAIN (parm) = 0; ++ others = chainon (others, parm); ++ } ++ } ++ ++ /* Get the decls in their original chain order ++ and record in the function. */ ++ DECL_ARGUMENTS (fndecl) = getdecls (); ++ ++ /* Now pushdecl the enum constants. */ ++ for (parm = others; parm; parm = next) ++ { ++ next = TREE_CHAIN (parm); ++ if (DECL_NAME (parm) == 0) ++ ; ++ else if (TREE_TYPE (parm) == void_type_node) ++ ; ++ else if (TREE_CODE (parm) != PARM_DECL) ++ pushdecl (parm); ++ } ++ ++ storetags (chainon (parmtags, gettags ())); ++ } ++ else ++ { ++ /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes ++ each with a parm name as the TREE_VALUE. ++ ++ PARMDECLS is a list of declarations for parameters. ++ Warning! It can also contain CONST_DECLs which are not parameters ++ but are names of enumerators of any enum types ++ declared among the parameters. ++ ++ First match each formal parameter name with its declaration. ++ Associate decls with the names and store the decls ++ into the TREE_PURPOSE slots. */ ++ ++ for (parm = specparms; parm; parm = TREE_CHAIN (parm)) ++ { ++ register tree tail, found = NULL; ++ ++ if (TREE_VALUE (parm) == 0) ++ { ++ error_with_decl (fndecl, "parameter name missing from parameter list"); ++ TREE_PURPOSE (parm) = 0; ++ continue; ++ } ++ ++ /* See if any of the parmdecls specifies this parm by name. ++ Ignore any enumerator decls. */ ++ for (tail = parmdecls; tail; tail = TREE_CHAIN (tail)) ++ if (DECL_NAME (tail) == TREE_VALUE (parm) ++ && TREE_CODE (tail) == PARM_DECL) ++ { ++ found = tail; ++ break; ++ } ++ ++ /* If declaration already marked, we have a duplicate name. ++ Complain, and don't use this decl twice. */ ++ if (found && DECL_CONTEXT (found) != 0) ++ { ++ error_with_decl (found, "multiple parameters named `%s'"); ++ found = 0; ++ } ++ ++ /* If the declaration says "void", complain and ignore it. */ ++ if (found && TREE_TYPE (found) == void_type_node) ++ { ++ error_with_decl (found, "parameter `%s' declared void"); ++ TREE_TYPE (found) = integer_type_node; ++ DECL_ARG_TYPE (found) = integer_type_node; ++ layout_decl (found, 0); ++ } ++ ++ /* If no declaration found, default to int. */ ++ if (!found) ++ { ++ found = build_decl (PARM_DECL, TREE_VALUE (parm), ++ integer_type_node); ++ DECL_ARG_TYPE (found) = TREE_TYPE (found); ++ DECL_SOURCE_LINE (found) = DECL_SOURCE_LINE (fndecl); ++ DECL_SOURCE_FILE (found) = DECL_SOURCE_FILE (fndecl); ++ if (extra_warnings) ++ warning_with_decl (found, "type of `%s' defaults to `int'"); ++ pushdecl (found); ++ } ++ ++ TREE_PURPOSE (parm) = found; ++ ++ /* Mark this decl as "already found" -- see test, above. ++ It is safe to clobber DECL_CONTEXT temporarily ++ because the final values are not stored until ++ the `poplevel' in `finish_function'. */ ++ DECL_CONTEXT (found) = error_mark_node; ++ } ++ ++ /* Complain about declarations not matched with any names. ++ Put any enumerator constants onto the list NONPARMS. */ ++ ++ nonparms = 0; ++ for (parm = parmdecls; parm; ) ++ { ++ tree next = TREE_CHAIN (parm); ++ TREE_CHAIN (parm) = 0; ++ ++ /* Complain about args with incomplete types. */ ++ if (TYPE_SIZE (TREE_TYPE (parm)) == 0) ++ { ++ error_with_decl (parm, "parameter `%s' has incomplete type"); ++ TREE_TYPE (parm) = error_mark_node; ++ } ++ ++ if (TREE_CODE (parm) != PARM_DECL) ++ nonparms = chainon (nonparms, parm); ++ ++ else if (DECL_CONTEXT (parm) == 0) ++ { ++ error_with_decl (parm, ++ "declaration for parameter `%s' but no such parameter"); ++ /* Pretend the parameter was not missing. ++ This gets us to a standard state and minimizes ++ further error messages. */ ++ specparms ++ = chainon (specparms, ++ tree_cons (parm, NULL_TREE, NULL_TREE)); ++ } ++ ++ parm = next; ++ } ++ ++ /* Chain the declarations together in the order of the list of names. */ ++ /* Store that chain in the function decl, replacing the list of names. */ ++ parm = specparms; ++ DECL_ARGUMENTS (fndecl) = 0; ++ { ++ register tree last; ++ for (last = 0; parm; parm = TREE_CHAIN (parm)) ++ if (TREE_PURPOSE (parm)) ++ { ++ if (last == 0) ++ DECL_ARGUMENTS (fndecl) = TREE_PURPOSE (parm); ++ else ++ TREE_CHAIN (last) = TREE_PURPOSE (parm); ++ last = TREE_PURPOSE (parm); ++ TREE_CHAIN (last) = 0; ++ DECL_CONTEXT (last) = 0; ++ } ++ } ++ ++ /* If there was a previous prototype, ++ set the DECL_ARG_TYPE of each argument according to ++ the type previously specified, and report any mismatches. */ ++ ++ if (TYPE_ARG_TYPES (TREE_TYPE (fndecl))) ++ { ++ register tree type; ++ for (parm = DECL_ARGUMENTS (fndecl), ++ type = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); ++ parm || (type && TREE_VALUE (type) != void_type_node); ++ parm = TREE_CHAIN (parm), type = TREE_CHAIN (type)) ++ { ++ if (parm == 0 || type == 0 ++ || TREE_VALUE (type) == void_type_node) ++ { ++ error ("number of arguments doesn't match prototype"); ++ break; ++ } ++ /* Type for passing arg must be consistent ++ with that declared for the arg. */ ++ if (! comptypes (DECL_ARG_TYPE (parm), TREE_VALUE (type)) ++ /* If -traditional, allow `unsigned int' instead of `int' ++ in the prototype. */ ++ && (! (flag_traditional ++ && DECL_ARG_TYPE (parm) == integer_type_node ++ && TREE_VALUE (type) == unsigned_type_node))) ++ { ++ error ("argument `%s' doesn't match function prototype", ++ IDENTIFIER_POINTER (DECL_NAME (parm))); ++ if (DECL_ARG_TYPE (parm) == integer_type_node ++ && TREE_VALUE (type) == TREE_TYPE (parm)) ++ { ++ error ("a formal parameter type that promotes to `int'"); ++ error ("can match only `int' in the prototype"); ++ } ++ if (DECL_ARG_TYPE (parm) == double_type_node ++ && TREE_VALUE (type) == TREE_TYPE (parm)) ++ { ++ error ("a formal parameter type that promotes to `double'"); ++ error ("can match only `double' in the prototype"); ++ } ++ } ++ } ++ } ++ ++ /* Now store the final chain of decls for the arguments ++ as the decl-chain of the current lexical scope. ++ Put the enumerators in as well, at the front so that ++ DECL_ARGUMENTS is not modified. */ ++ ++ storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl))); ++ } ++ ++ /* Make sure the binding level for the top of the function body ++ gets a LET_STMT if there are any in the function. ++ Otherwise, the dbx output is wrong. */ ++ ++ keep_next_if_subblocks = 1; ++ ++ /* Initialize the RTL code for the function. */ ++ ++ init_function_start (fndecl, input_filename, lineno); ++ ++ /* Set up parameters and prepare for return, for the function. */ ++ ++ expand_function_start (fndecl, 0); ++} ++ ++/* Finish up a function declaration and compile that function ++ all the way to assembler language output. The free the storage ++ for the function definition. ++ ++ This is called after parsing the body of the function definition. ++ LINENO is the current line number. */ ++ ++void ++finish_function (lineno) ++ int lineno; ++{ ++ register tree fndecl = current_function_decl; ++ ++/* TREE_READONLY (fndecl) = 1; ++ This caused &foo to be of type ptr-to-const-function ++ which then got a warning when stored in a ptr-to-function variable. */ ++ ++ poplevel (1, 0, 1); ++ ++ /* Must mark the RESULT_DECL as being in this function. */ ++ ++ DECL_CONTEXT (DECL_RESULT (fndecl)) = DECL_INITIAL (fndecl); ++ ++ /* Obey `register' declarations if `setjmp' is called in this fn. */ ++ if (flag_traditional && current_function_calls_setjmp) ++ setjmp_protect (DECL_INITIAL (fndecl)); ++ ++ /* Generate rtl for function exit. */ ++ expand_function_end (input_filename, lineno); ++ ++ /* So we can tell if jump_optimize sets it to 1. */ ++ current_function_returns_null = 0; ++ ++ /* Run the optimizers and output the assembler code for this function. */ ++ rest_of_compilation (fndecl); ++ ++ if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null) ++ warning ("`volatile' function does return"); ++ else if (warn_return_type && current_function_returns_null ++ && TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node) ++ /* If this function returns non-void and control can drop through, ++ complain. */ ++ warning ("control reaches end of non-void function"); ++ /* With just -W, complain only if function returns both with ++ and without a value. */ ++ else if (extra_warnings ++ && current_function_returns_value && current_function_returns_null) ++ warning ("this function may return with or without a value"); ++ ++ /* Free all the tree nodes making up this function. */ ++ /* Switch back to allocating nodes permanently ++ until we start another function. */ ++ permanent_allocation (); ++ ++ if (DECL_SAVED_INSNS (fndecl) == 0) ++ { ++ /* Stop pointing to the local nodes about to be freed. */ ++ /* But DECL_INITIAL must remain nonzero so we know this ++ was an actual function definition. */ ++ DECL_INITIAL (fndecl) = error_mark_node; ++ DECL_ARGUMENTS (fndecl) = 0; ++ } ++ ++ /* Let the error reporting routines know that we're outside a function. */ ++ current_function_decl = NULL; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/cexp.c alliance/genview/src/gcc-1.42/cexp.c +--- alliance-5.0/genview/src/gcc-1.42/cexp.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cexp.c 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,1491 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++ ++/* A Bison parser, made from ./cexp.y */ ++ ++#define INT 258 ++#define CHAR 259 ++#define NAME 260 ++#define ERROR 261 ++#define OR 262 ++#define AND 263 ++#define EQUAL 264 ++#define NOTEQUAL 265 ++#define LEQ 266 ++#define GEQ 267 ++#define LSH 268 ++#define RSH 269 ++#define UNARY 270 ++ ++#line 26 "./cexp.y" ++ ++#include "config.h" ++#include ++/* #define YYDEBUG 1 */ ++ ++ int yylex (); ++ void yyerror (); ++ int expression_value; ++ ++ static jmp_buf parse_return_error; ++ ++ /* some external tables of character types */ ++ extern unsigned char is_idstart[], is_idchar[]; ++ ++#ifndef CHAR_TYPE_SIZE ++#define CHAR_TYPE_SIZE BITS_PER_UNIT ++#endif ++ ++#line 45 "./cexp.y" ++typedef union { ++ struct constant {long value; int unsignedp;} integer; ++ int voidval; ++ char *sval; ++} YYSTYPE; ++ ++#ifndef YYLTYPE ++typedef ++ struct yyltype ++ { ++ int timestamp; ++ int first_line; ++ int first_column; ++ int last_line; ++ int last_column; ++ char *text; ++ } ++ yyltype; ++ ++#define YYLTYPE yyltype ++#endif ++ ++#include ++ ++#ifndef __STDC__ ++#define const ++#endif ++ ++ ++ ++#define YYFINAL 61 ++#define YYFLAG -32768 ++#define YYNTBASE 33 ++ ++#define YYTRANSLATE(x) ((unsigned)(x) <= 270 ? yytranslate[x] : 36) ++ ++static const char yytranslate[] = { 0, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 29, 2, 2, 2, 27, 14, 2, 31, ++ 32, 25, 23, 9, 24, 2, 26, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 8, 2, 17, ++ 2, 18, 7, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 12, 2, 30, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, ++ 6, 10, 11, 15, 16, 19, 20, 21, 22, 28 ++}; ++ ++static const short yyprhs[] = { 0, ++ 0, 2, 4, 8, 11, 14, 17, 20, 24, 28, ++ 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, ++ 72, 76, 80, 84, 88, 92, 96, 102, 104, 106 ++}; ++ ++static const short yyrhs[] = { 34, ++ 0, 35, 0, 34, 9, 35, 0, 24, 35, 0, ++ 29, 35, 0, 23, 35, 0, 30, 35, 0, 31, ++ 34, 32, 0, 35, 25, 35, 0, 35, 26, 35, ++ 0, 35, 27, 35, 0, 35, 23, 35, 0, 35, ++ 24, 35, 0, 35, 21, 35, 0, 35, 22, 35, ++ 0, 35, 15, 35, 0, 35, 16, 35, 0, 35, ++ 19, 35, 0, 35, 20, 35, 0, 35, 17, 35, ++ 0, 35, 18, 35, 0, 35, 14, 35, 0, 35, ++ 13, 35, 0, 35, 12, 35, 0, 35, 11, 35, ++ 0, 35, 10, 35, 0, 35, 7, 35, 8, 35, ++ 0, 3, 0, 4, 0, 5, 0 ++}; ++ ++#if YYDEBUG != 0 ++static const short yyrline[] = { 0, ++ 74, 79, 80, 85, 88, 91, 93, 96, 101, 107, ++ 118, 129, 132, 135, 141, 147, 150, 153, 159, 165, ++ 171, 177, 180, 183, 186, 189, 192, 195, 197, 199 ++}; ++ ++static const char * const yytname[] = { "$", ++"error","$illegal.","INT","CHAR","NAME","ERROR","'?'","':'","','","OR", ++"AND","'|'","'^'","'&'","EQUAL","NOTEQUAL","'<'","'>'","LEQ","GEQ", ++"LSH","RSH","'+'","'-'","'*'","'/'","'%'","UNARY","'!'","'~'", ++"'('","')'","start","exp1","exp","" ++}; ++#endif ++ ++static const short yyr1[] = { 0, ++ 33, 34, 34, 35, 35, 35, 35, 35, 35, 35, ++ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ++ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35 ++}; ++ ++static const short yyr2[] = { 0, ++ 1, 1, 3, 2, 2, 2, 2, 3, 3, 3, ++ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, ++ 3, 3, 3, 3, 3, 3, 5, 1, 1, 1 ++}; ++ ++static const short yydefact[] = { 0, ++ 28, 29, 30, 0, 0, 0, 0, 0, 1, 2, ++ 6, 4, 5, 7, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 8, 3, 0, 26, 25, ++ 24, 23, 22, 16, 17, 20, 21, 18, 19, 14, ++ 15, 12, 13, 9, 10, 11, 0, 27, 0, 0, ++ 0 ++}; ++ ++static const short yydefgoto[] = { 59, ++ 9, 10 ++}; ++ ++static const short yypact[] = { 31, ++-32768,-32768,-32768, 31, 31, 31, 31, 31, 1, 77, ++-32768,-32768,-32768,-32768, 0, 31, 31, 31, 31, 31, ++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, ++ 31, 31, 31, 31, 31,-32768, 77, 56, 94, 25, ++ 109, 123, 136, 147, 147, 154, 154, 154, 154, -19, ++ -19, 32, 32,-32768,-32768,-32768, 31, 77, 11, 33, ++-32768 ++}; ++ ++static const short yypgoto[] = {-32768, ++ 48, -4 ++}; ++ ++ ++#define YYLAST 181 ++ ++ ++static const short yytable[] = { 11, ++ 12, 13, 14, 31, 32, 33, 34, 35, 16, 16, ++ 60, 37, 38, 39, 40, 41, 42, 43, 44, 45, ++ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, ++ 56, 36, 61, 1, 2, 3, 20, 21, 22, 23, ++ 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ++ 34, 35, 58, 4, 5, 15, 33, 34, 35, 6, ++ 7, 8, 17, 57, 0, 18, 19, 20, 21, 22, ++ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, ++ 33, 34, 35, 17, 0, 0, 18, 19, 20, 21, ++ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ++ 32, 33, 34, 35, 19, 20, 21, 22, 23, 24, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 21, 22, 23, 24, 25, 26, 27, 28, 29, ++ 30, 31, 32, 33, 34, 35, 22, 23, 24, 25, ++ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, ++ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, ++ 33, 34, 35, 25, 26, 27, 28, 29, 30, 31, ++ 32, 33, 34, 35, 29, 30, 31, 32, 33, 34, ++ 35 ++}; ++ ++static const short yycheck[] = { 4, ++ 5, 6, 7, 23, 24, 25, 26, 27, 9, 9, ++ 0, 16, 17, 18, 19, 20, 21, 22, 23, 24, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 32, 0, 3, 4, 5, 12, 13, 14, 15, ++ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, ++ 26, 27, 57, 23, 24, 8, 25, 26, 27, 29, ++ 30, 31, 7, 8, -1, 10, 11, 12, 13, 14, ++ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, ++ 25, 26, 27, 7, -1, -1, 10, 11, 12, 13, ++ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, ++ 24, 25, 26, 27, 11, 12, 13, 14, 15, 16, ++ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ++ 27, 13, 14, 15, 16, 17, 18, 19, 20, 21, ++ 22, 23, 24, 25, 26, 27, 14, 15, 16, 17, ++ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, ++ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, ++ 25, 26, 27, 17, 18, 19, 20, 21, 22, 23, ++ 24, 25, 26, 27, 21, 22, 23, 24, 25, 26, ++ 27 ++}; ++/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ ++#line 3 "bison.simple" ++ ++/* Skeleton output parser for bison, ++ Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 1, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#ifndef alloca ++#ifdef __GNUC__ ++#define alloca __builtin_alloca ++#else /* Not GNU C. */ ++#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) ++#include ++#else /* Not sparc */ ++#ifdef MSDOS ++#include ++#endif /* MSDOS */ ++#endif /* Not sparc. */ ++#endif /* Not GNU C. */ ++#endif /* alloca not defined. */ ++ ++/* This is the parser code that is written into each bison parser ++ when the %semantic_parser declaration is not specified in the grammar. ++ It was written by Richard Stallman by simplifying the hairy parser ++ used when %semantic_parser is specified. */ ++ ++/* Note: there must be only one dollar sign in this file. ++ It is replaced by the list of actions, each action ++ as one case of the switch. */ ++ ++#define yyerrok (yyerrstatus = 0) ++#define yyclearin (yychar = YYEMPTY) ++#define YYEMPTY -2 ++#define YYEOF 0 ++#define YYACCEPT return(0) ++#define YYABORT return(1) ++#define YYERROR goto yyerrlab1 ++/* Like YYERROR except do call yyerror. ++ This remains here temporarily to ease the ++ transition to the new meaning of YYERROR, for GCC. ++ Once GCC version 2 has supplanted version 1, this can go. */ ++#define YYFAIL goto yyerrlab ++#define YYRECOVERING() (!!yyerrstatus) ++#define YYBACKUP(token, value) \ ++do \ ++ if (yychar == YYEMPTY && yylen == 1) \ ++ { yychar = (token), yylval = (value); \ ++ yychar1 = YYTRANSLATE (yychar); \ ++ YYPOPSTACK; \ ++ goto yybackup; \ ++ } \ ++ else \ ++ { yyerror ("syntax error: cannot back up"); YYERROR; } \ ++while (0) ++ ++#define YYTERROR 1 ++#define YYERRCODE 256 ++ ++#ifndef YYPURE ++#define YYLEX yylex() ++#endif ++ ++#ifdef YYPURE ++#ifdef YYLSP_NEEDED ++#define YYLEX yylex(&yylval, &yylloc) ++#else ++#define YYLEX yylex(&yylval) ++#endif ++#endif ++ ++/* If nonreentrant, generate the variables here */ ++ ++#ifndef YYPURE ++ ++int yychar; /* the lookahead symbol */ ++YYSTYPE yylval; /* the semantic value of the */ ++ /* lookahead symbol */ ++ ++#ifdef YYLSP_NEEDED ++YYLTYPE yylloc; /* location data for the lookahead */ ++ /* symbol */ ++#endif ++ ++int yynerrs; /* number of parse errors so far */ ++#endif /* not YYPURE */ ++ ++#if YYDEBUG != 0 ++int yydebug; /* nonzero means print parse trace */ ++/* Since this is uninitialized, it does not stop multiple parsers ++ from coexisting. */ ++#endif ++ ++/* YYINITDEPTH indicates the initial size of the parser's stacks */ ++ ++#ifndef YYINITDEPTH ++#define YYINITDEPTH 200 ++#endif ++ ++/* YYMAXDEPTH is the maximum size the stacks can grow to ++ (effective only if the built-in stack extension method is used). */ ++ ++#if YYMAXDEPTH == 0 ++#undef YYMAXDEPTH ++#endif ++ ++#ifndef YYMAXDEPTH ++#define YYMAXDEPTH 10000 ++#endif ++ ++#ifndef __cplusplus ++ ++/* This is the most reliable way to avoid incompatibilities ++ in available built-in functions on various systems. */ ++static void ++__yy_bcopy (from, to, count) ++ char *from; ++ char *to; ++ int count; ++{ ++ register char *f = from; ++ register char *t = to; ++ register int i = count; ++ ++ while (i-- > 0) ++ *t++ = *f++; ++} ++ ++#else /* __cplusplus */ ++ ++/* This is the most reliable way to avoid incompatibilities ++ in available built-in functions on various systems. */ ++static void ++__yy_bcopy (char *from, char *to, int count) ++{ ++ register char *f = from; ++ register char *t = to; ++ register int i = count; ++ ++ while (i-- > 0) ++ *t++ = *f++; ++} ++ ++#endif ++ ++#line 160 "bison.simple" ++int ++yyparse() ++{ ++ register int yystate; ++ register int yyn; ++ register short *yyssp; ++ register YYSTYPE *yyvsp; ++ int yyerrstatus; /* number of tokens to shift before error messages enabled */ ++ int yychar1; /* lookahead token as an internal (translated) token number */ ++ ++ short yyssa[YYINITDEPTH]; /* the state stack */ ++ YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ ++ ++ short *yyss = yyssa; /* refer to the stacks thru separate pointers */ ++ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ ++ ++#ifdef YYLSP_NEEDED ++ YYLTYPE *yyls = yylsa; ++ YYLTYPE *yylsp; ++ YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ ++ ++#define YYPOPSTACK (yyvsp--, yysp--, yylsp--) ++#else ++#define YYPOPSTACK (yyvsp--, yysp--) ++#endif ++ ++ int yystacksize = YYINITDEPTH; ++ ++#ifdef YYPURE ++ int yychar; ++ YYSTYPE yylval; ++ int yynerrs; ++#ifdef YYLSP_NEEDED ++ YYLTYPE yylloc; ++#endif ++#endif ++ ++ YYSTYPE yyval; /* the variable used to return */ ++ /* semantic values from the action */ ++ /* routines */ ++ ++ int yylen; ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Starting parse\n"); ++#endif ++ ++ yystate = 0; ++ yyerrstatus = 0; ++ yynerrs = 0; ++ yychar = YYEMPTY; /* Cause a token to be read. */ ++ ++ /* Initialize stack pointers. ++ Waste one element of value and location stack ++ so that they stay on the same level as the state stack. */ ++ ++ yyssp = yyss - 1; ++ yyvsp = yyvs; ++#ifdef YYLSP_NEEDED ++ yylsp = yyls; ++#endif ++ ++/* Push a new state, which is found in yystate . */ ++/* In all cases, when you get here, the value and location stacks ++ have just been pushed. so pushing a state here evens the stacks. */ ++yynewstate: ++ ++ *++yyssp = yystate; ++ ++ if (yyssp >= yyss + yystacksize - 1) ++ { ++ /* Give user a chance to reallocate the stack */ ++ /* Use copies of these so that the &'s don't force the real ones into memory. */ ++ YYSTYPE *yyvs1 = yyvs; ++ short *yyss1 = yyss; ++#ifdef YYLSP_NEEDED ++ YYLTYPE *yyls1 = yyls; ++#endif ++ ++ /* Get the current used size of the three stacks, in elements. */ ++ int size = yyssp - yyss + 1; ++ ++#ifdef yyoverflow ++ /* Each stack pointer address is followed by the size of ++ the data in use in that stack, in bytes. */ ++ yyoverflow("parser stack overflow", ++ &yyss1, size * sizeof (*yyssp), ++ &yyvs1, size * sizeof (*yyvsp), ++#ifdef YYLSP_NEEDED ++ &yyls1, size * sizeof (*yylsp), ++#endif ++ &yystacksize); ++ ++ yyss = yyss1; yyvs = yyvs1; ++#ifdef YYLSP_NEEDED ++ yyls = yyls1; ++#endif ++#else /* no yyoverflow */ ++ /* Extend the stack our own way. */ ++ if (yystacksize >= YYMAXDEPTH) ++ { ++ yyerror("parser stack overflow"); ++ return 2; ++ } ++ yystacksize *= 2; ++ if (yystacksize > YYMAXDEPTH) ++ yystacksize = YYMAXDEPTH; ++ yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); ++ __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); ++ yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); ++ __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); ++#ifdef YYLSP_NEEDED ++ yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); ++ __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); ++#endif ++#endif /* no yyoverflow */ ++ ++ yyssp = yyss + size - 1; ++ yyvsp = yyvs + size - 1; ++#ifdef YYLSP_NEEDED ++ yylsp = yyls + size - 1; ++#endif ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Stack size increased to %d\n", yystacksize); ++#endif ++ ++ if (yyssp >= yyss + yystacksize - 1) ++ YYABORT; ++ } ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Entering state %d\n", yystate); ++#endif ++ ++ yybackup: ++ ++/* Do appropriate processing given the current state. */ ++/* Read a lookahead token if we need one and don't already have one. */ ++/* yyresume: */ ++ ++ /* First try to decide what to do without reference to lookahead token. */ ++ ++ yyn = yypact[yystate]; ++ if (yyn == YYFLAG) ++ goto yydefault; ++ ++ /* Not known => get a lookahead token if don't already have one. */ ++ ++ /* yychar is either YYEMPTY or YYEOF ++ or a valid token in external form. */ ++ ++ if (yychar == YYEMPTY) ++ { ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Reading a token: "); ++#endif ++ yychar = YYLEX; ++ } ++ ++ /* Convert token to internal form (in yychar1) for indexing tables with */ ++ ++ if (yychar <= 0) /* This means end of input. */ ++ { ++ yychar1 = 0; ++ yychar = YYEOF; /* Don't call YYLEX any more */ ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Now at end of input.\n"); ++#endif ++ } ++ else ++ { ++ yychar1 = YYTRANSLATE(yychar); ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Next token is %d (%s)\n", yychar, yytname[yychar1]); ++#endif ++ } ++ ++ yyn += yychar1; ++ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) ++ goto yydefault; ++ ++ yyn = yytable[yyn]; ++ ++ /* yyn is what to do for this token type in this state. ++ Negative => reduce, -yyn is rule number. ++ Positive => shift, yyn is new state. ++ New state is final state => don't bother to shift, ++ just return success. ++ 0, or most negative number => error. */ ++ ++ if (yyn < 0) ++ { ++ if (yyn == YYFLAG) ++ goto yyerrlab; ++ yyn = -yyn; ++ goto yyreduce; ++ } ++ else if (yyn == 0) ++ goto yyerrlab; ++ ++ if (yyn == YYFINAL) ++ YYACCEPT; ++ ++ /* Shift the lookahead token. */ ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); ++#endif ++ ++ /* Discard the token being shifted unless it is eof. */ ++ if (yychar != YYEOF) ++ yychar = YYEMPTY; ++ ++ *++yyvsp = yylval; ++#ifdef YYLSP_NEEDED ++ *++yylsp = yylloc; ++#endif ++ ++ /* count tokens shifted since error; after three, turn off error status. */ ++ if (yyerrstatus) yyerrstatus--; ++ ++ yystate = yyn; ++ goto yynewstate; ++ ++/* Do the default action for the current state. */ ++yydefault: ++ ++ yyn = yydefact[yystate]; ++ if (yyn == 0) ++ goto yyerrlab; ++ ++/* Do a reduction. yyn is the number of a rule to reduce with. */ ++yyreduce: ++ yylen = yyr2[yyn]; ++ yyval = yyvsp[1-yylen]; /* implement default value of the action */ ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ { ++ int i; ++ ++ fprintf (stderr, "Reducing via rule %d (line %d), ", ++ yyn, yyrline[yyn]); ++ ++ /* Print the symboles being reduced, and their result. */ ++ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) ++ fprintf (stderr, "%s ", yytname[yyrhs[i]]); ++ fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); ++ } ++#endif ++ ++ ++ switch (yyn) { ++ ++case 1: ++#line 75 "./cexp.y" ++{ expression_value = yyvsp[0].integer.value; ; ++ break;} ++case 3: ++#line 81 "./cexp.y" ++{ yyval.integer = yyvsp[0].integer; ; ++ break;} ++case 4: ++#line 86 "./cexp.y" ++{ yyval.integer.value = - yyvsp[0].integer.value; ++ yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; ; ++ break;} ++case 5: ++#line 89 "./cexp.y" ++{ yyval.integer.value = ! yyvsp[0].integer.value; ++ yyval.integer.unsignedp = 0; ; ++ break;} ++case 6: ++#line 92 "./cexp.y" ++{ yyval.integer = yyvsp[0].integer; ; ++ break;} ++case 7: ++#line 94 "./cexp.y" ++{ yyval.integer.value = ~ yyvsp[0].integer.value; ++ yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; ; ++ break;} ++case 8: ++#line 97 "./cexp.y" ++{ yyval.integer = yyvsp[-1].integer; ; ++ break;} ++case 9: ++#line 102 "./cexp.y" ++{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ++ if (yyval.integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value * yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value * yyvsp[0].integer.value; ; ++ break;} ++case 10: ++#line 108 "./cexp.y" ++{ if (yyvsp[0].integer.value == 0) ++ { ++ error ("division by zero in #if"); ++ yyvsp[0].integer.value = 1; ++ } ++ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ++ if (yyval.integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value / yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value / yyvsp[0].integer.value; ; ++ break;} ++case 11: ++#line 119 "./cexp.y" ++{ if (yyvsp[0].integer.value == 0) ++ { ++ error ("division by zero in #if"); ++ yyvsp[0].integer.value = 1; ++ } ++ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ++ if (yyval.integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value % yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value % yyvsp[0].integer.value; ; ++ break;} ++case 12: ++#line 130 "./cexp.y" ++{ yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value; ++ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; ++ break;} ++case 13: ++#line 133 "./cexp.y" ++{ yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value; ++ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; ++ break;} ++case 14: ++#line 136 "./cexp.y" ++{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp; ++ if (yyval.integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value << yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value << yyvsp[0].integer.value; ; ++ break;} ++case 15: ++#line 142 "./cexp.y" ++{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp; ++ if (yyval.integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value >> yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value >> yyvsp[0].integer.value; ; ++ break;} ++case 16: ++#line 148 "./cexp.y" ++{ yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value); ++ yyval.integer.unsignedp = 0; ; ++ break;} ++case 17: ++#line 151 "./cexp.y" ++{ yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value); ++ yyval.integer.unsignedp = 0; ; ++ break;} ++case 18: ++#line 154 "./cexp.y" ++{ yyval.integer.unsignedp = 0; ++ if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value <= yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value; ; ++ break;} ++case 19: ++#line 160 "./cexp.y" ++{ yyval.integer.unsignedp = 0; ++ if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value >= yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value; ; ++ break;} ++case 20: ++#line 166 "./cexp.y" ++{ yyval.integer.unsignedp = 0; ++ if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value < yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value; ; ++ break;} ++case 21: ++#line 172 "./cexp.y" ++{ yyval.integer.unsignedp = 0; ++ if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp) ++ yyval.integer.value = (unsigned) yyvsp[-2].integer.value > yyvsp[0].integer.value; ++ else ++ yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value; ; ++ break;} ++case 22: ++#line 178 "./cexp.y" ++{ yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value; ++ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; ++ break;} ++case 23: ++#line 181 "./cexp.y" ++{ yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value; ++ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; ++ break;} ++case 24: ++#line 184 "./cexp.y" ++{ yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value; ++ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; ++ break;} ++case 25: ++#line 187 "./cexp.y" ++{ yyval.integer.value = (yyvsp[-2].integer.value && yyvsp[0].integer.value); ++ yyval.integer.unsignedp = 0; ; ++ break;} ++case 26: ++#line 190 "./cexp.y" ++{ yyval.integer.value = (yyvsp[-2].integer.value || yyvsp[0].integer.value); ++ yyval.integer.unsignedp = 0; ; ++ break;} ++case 27: ++#line 193 "./cexp.y" ++{ yyval.integer.value = yyvsp[-4].integer.value ? yyvsp[-2].integer.value : yyvsp[0].integer.value; ++ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; ; ++ break;} ++case 28: ++#line 196 "./cexp.y" ++{ yyval.integer = yylval.integer; ; ++ break;} ++case 29: ++#line 198 "./cexp.y" ++{ yyval.integer = yylval.integer; ; ++ break;} ++case 30: ++#line 200 "./cexp.y" ++{ yyval.integer.value = 0; ++ yyval.integer.unsignedp = 0; ; ++ break;} ++} ++ /* the action file gets copied in in place of this dollarsign */ ++#line 423 "bison.simple" ++ ++ yyvsp -= yylen; ++ yyssp -= yylen; ++#ifdef YYLSP_NEEDED ++ yylsp -= yylen; ++#endif ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ { ++ short *ssp1 = yyss - 1; ++ fprintf (stderr, "state stack now"); ++ while (ssp1 != yyssp) ++ fprintf (stderr, " %d", *++ssp1); ++ fprintf (stderr, "\n"); ++ } ++#endif ++ ++ *++yyvsp = yyval; ++ ++#ifdef YYLSP_NEEDED ++ yylsp++; ++ if (yylen == 0) ++ { ++ yylsp->first_line = yylloc.first_line; ++ yylsp->first_column = yylloc.first_column; ++ yylsp->last_line = (yylsp-1)->last_line; ++ yylsp->last_column = (yylsp-1)->last_column; ++ yylsp->text = 0; ++ } ++ else ++ { ++ yylsp->last_line = (yylsp+yylen-1)->last_line; ++ yylsp->last_column = (yylsp+yylen-1)->last_column; ++ } ++#endif ++ ++ /* Now "shift" the result of the reduction. ++ Determine what state that goes to, ++ based on the state we popped back to ++ and the rule number reduced by. */ ++ ++ yyn = yyr1[yyn]; ++ ++ yystate = yypgoto[yyn - YYNTBASE] + *yyssp; ++ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) ++ yystate = yytable[yystate]; ++ else ++ yystate = yydefgoto[yyn - YYNTBASE]; ++ ++ goto yynewstate; ++ ++yyerrlab: /* here on detecting error */ ++ ++ if (! yyerrstatus) ++ /* If not already recovering from an error, report this error. */ ++ { ++ ++yynerrs; ++ ++#ifdef YYERROR_VERBOSE ++ yyn = yypact[yystate]; ++ ++ if (yyn > YYFLAG && yyn < YYLAST) ++ { ++ int size = 0; ++ char *msg; ++ int x, count; ++ ++ count = 0; ++ for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++) ++ if (yycheck[x + yyn] == x) ++ size += strlen(yytname[x]) + 15, count++; ++ msg = (char *) xmalloc(size + 15); ++ strcpy(msg, "parse error"); ++ ++ if (count < 5) ++ { ++ count = 0; ++ for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++) ++ if (yycheck[x + yyn] == x) ++ { ++ strcat(msg, count == 0 ? ", expecting `" : " or `"); ++ strcat(msg, yytname[x]); ++ strcat(msg, "'"); ++ count++; ++ } ++ } ++ yyerror(msg); ++ free(msg); ++ } ++ else ++#endif /* YYERROR_VERBOSE */ ++ yyerror("parse error"); ++ } ++ ++yyerrlab1: /* here on error raised explicitly by an action */ ++ ++ if (yyerrstatus == 3) ++ { ++ /* if just tried and failed to reuse lookahead token after an error, discard it. */ ++ ++ /* return failure if at end of input */ ++ if (yychar == YYEOF) ++ YYABORT; ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); ++#endif ++ ++ yychar = YYEMPTY; ++ } ++ ++ /* Else will try to reuse lookahead token ++ after shifting the error token. */ ++ ++ yyerrstatus = 3; /* Each real token shifted decrements this */ ++ ++ goto yyerrhandle; ++ ++yyerrdefault: /* current state does not do anything special for the error token. */ ++ ++#if 0 ++ /* This is wrong; only states that explicitly want error tokens ++ should shift them. */ ++ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ ++ if (yyn) goto yydefault; ++#endif ++ ++yyerrpop: /* pop the current state because it cannot handle the error token */ ++ ++ if (yyssp == yyss) YYABORT; ++ yyvsp--; ++ yystate = *--yyssp; ++#ifdef YYLSP_NEEDED ++ yylsp--; ++#endif ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ { ++ short *ssp1 = yyss - 1; ++ fprintf (stderr, "Error: state stack now"); ++ while (ssp1 != yyssp) ++ fprintf (stderr, " %d", *++ssp1); ++ fprintf (stderr, "\n"); ++ } ++#endif ++ ++yyerrhandle: ++ ++ yyn = yypact[yystate]; ++ if (yyn == YYFLAG) ++ goto yyerrdefault; ++ ++ yyn += YYTERROR; ++ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) ++ goto yyerrdefault; ++ ++ yyn = yytable[yyn]; ++ if (yyn < 0) ++ { ++ if (yyn == YYFLAG) ++ goto yyerrpop; ++ yyn = -yyn; ++ goto yyreduce; ++ } ++ else if (yyn == 0) ++ goto yyerrpop; ++ ++ if (yyn == YYFINAL) ++ YYACCEPT; ++ ++#if YYDEBUG != 0 ++ if (yydebug) ++ fprintf(stderr, "Shifting error token, "); ++#endif ++ ++ *++yyvsp = yylval; ++#ifdef YYLSP_NEEDED ++ *++yylsp = yylloc; ++#endif ++ ++ yystate = yyn; ++ goto yynewstate; ++} ++#line 203 "./cexp.y" ++ ++ ++/* During parsing of a C expression, the pointer to the next character ++ is in this variable. */ ++ ++static char *lexptr; ++ ++/* Take care of parsing a number (anything that starts with a digit). ++ Set yylval and return the token type; update lexptr. ++ LEN is the number of characters in it. */ ++ ++/* maybe needs to actually deal with floating point numbers */ ++ ++int ++parse_number (olen) ++ int olen; ++{ ++ register char *p = lexptr; ++ register long n = 0; ++ register int c; ++ register int base = 10; ++ register int len = olen; ++ ++ for (c = 0; c < len; c++) ++ if (p[c] == '.') { ++ /* It's a float since it contains a point. */ ++ yyerror ("floating point numbers not allowed in #if expressions"); ++ return ERROR; ++ } ++ ++ yylval.integer.unsignedp = 0; ++ ++ if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) { ++ p += 2; ++ base = 16; ++ len -= 2; ++ } ++ else if (*p == '0') ++ base = 8; ++ ++ while (len > 0) { ++ c = *p++; ++ len--; ++ if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; ++ ++ if (c >= '0' && c <= '9') { ++ n *= base; ++ n += c - '0'; ++ } else if (base == 16 && c >= 'a' && c <= 'f') { ++ n *= base; ++ n += c - 'a' + 10; ++ } else { ++ /* `l' means long, and `u' means unsigned. */ ++ while (1) { ++ if (c == 'l' || c == 'L') ++ ; ++ else if (c == 'u' || c == 'U') ++ yylval.integer.unsignedp = 1; ++ else ++ break; ++ ++ if (len == 0) ++ break; ++ c = *p++; ++ len--; ++ } ++ /* Don't look for any more digits after the suffixes. */ ++ break; ++ } ++ } ++ ++ if (len != 0) { ++ yyerror ("Invalid number in #if expression"); ++ return ERROR; ++ } ++ ++ /* If too big to be signed, consider it unsigned. */ ++ if (n < 0) ++ yylval.integer.unsignedp = 1; ++ ++ lexptr = p; ++ yylval.integer.value = n; ++ return INT; ++} ++ ++struct token { ++ char *operator; ++ int token; ++}; ++ ++#ifndef NULL ++#define NULL 0 ++#endif ++ ++static struct token tokentab2[] = { ++ {"&&", AND}, ++ {"||", OR}, ++ {"<<", LSH}, ++ {">>", RSH}, ++ {"==", EQUAL}, ++ {"!=", NOTEQUAL}, ++ {"<=", LEQ}, ++ {">=", GEQ}, ++ {NULL, ERROR} ++}; ++ ++/* Read one token, getting characters through lexptr. */ ++ ++int ++yylex () ++{ ++ register int c; ++ register int namelen; ++ register char *tokstart; ++ register struct token *toktab; ++ ++ retry: ++ ++ tokstart = lexptr; ++ c = *tokstart; ++ /* See if it is a special token of length 2. */ ++ for (toktab = tokentab2; toktab->operator != NULL; toktab++) ++ if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) { ++ lexptr += 2; ++ return toktab->token; ++ } ++ ++ switch (c) { ++ case 0: ++ return 0; ++ ++ case ' ': ++ case '\t': ++ case '\r': ++ case '\n': ++ lexptr++; ++ goto retry; ++ ++ case '\'': ++ lexptr++; ++ c = *lexptr++; ++ if (c == '\\') ++ c = parse_escape (&lexptr); ++ ++ /* Sign-extend the constant if chars are signed on target machine. */ ++ { ++ if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1) ++ || ((c >> (CHAR_TYPE_SIZE - 1)) & 1) == 0) ++ yylval.integer.value = c & ((1 << CHAR_TYPE_SIZE) - 1); ++ else ++ yylval.integer.value = c | ~((1 << CHAR_TYPE_SIZE) - 1); ++ } ++ ++ yylval.integer.unsignedp = 0; ++ c = *lexptr++; ++ if (c != '\'') { ++ yyerror ("Invalid character constant in #if"); ++ return ERROR; ++ } ++ ++ return CHAR; ++ ++ /* some of these chars are invalid in constant expressions; ++ maybe do something about them later */ ++ case '/': ++ case '+': ++ case '-': ++ case '*': ++ case '%': ++ case '|': ++ case '&': ++ case '^': ++ case '~': ++ case '!': ++ case '@': ++ case '<': ++ case '>': ++ case '(': ++ case ')': ++ case '[': ++ case ']': ++ case '.': ++ case '?': ++ case ':': ++ case '=': ++ case '{': ++ case '}': ++ case ',': ++ lexptr++; ++ return c; ++ ++ case '"': ++ yyerror ("double quoted strings not allowed in #if expressions"); ++ return ERROR; ++ } ++ if (c >= '0' && c <= '9') { ++ /* It's a number */ ++ for (namelen = 0; ++ c = tokstart[namelen], is_idchar[c] || c == '.'; ++ namelen++) ++ ; ++ return parse_number (namelen); ++ } ++ ++ if (!is_idstart[c]) { ++ yyerror ("Invalid token in expression"); ++ return ERROR; ++ } ++ ++ /* It is a name. See how long it is. */ ++ ++ for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++) ++ ; ++ ++ lexptr += namelen; ++ return NAME; ++} ++ ++ ++/* Parse a C escape sequence. STRING_PTR points to a variable ++ containing a pointer to the string to parse. That pointer ++ is updated past the characters we use. The value of the ++ escape sequence is returned. ++ ++ A negative value means the sequence \ newline was seen, ++ which is supposed to be equivalent to nothing at all. ++ ++ If \ is followed by a null character, we return a negative ++ value and leave the string pointer pointing at the null character. ++ ++ If \ is followed by 000, we return 0 and leave the string pointer ++ after the zeros. A value of 0 does not mean end of string. */ ++ ++int ++parse_escape (string_ptr) ++ char **string_ptr; ++{ ++ register int c = *(*string_ptr)++; ++ switch (c) ++ { ++ case 'a': ++ return TARGET_BELL; ++ case 'b': ++ return TARGET_BS; ++ case 'e': ++ return 033; ++ case 'f': ++ return TARGET_FF; ++ case 'n': ++ return TARGET_NEWLINE; ++ case 'r': ++ return TARGET_CR; ++ case 't': ++ return TARGET_TAB; ++ case 'v': ++ return TARGET_VT; ++ case '\n': ++ return -2; ++ case 0: ++ (*string_ptr)--; ++ return 0; ++ case '^': ++ c = *(*string_ptr)++; ++ if (c == '\\') ++ c = parse_escape (string_ptr); ++ if (c == '?') ++ return 0177; ++ return (c & 0200) | (c & 037); ++ ++ case '0': ++ case '1': ++ case '2': ++ case '3': ++ case '4': ++ case '5': ++ case '6': ++ case '7': ++ { ++ register int i = c - '0'; ++ register int count = 0; ++ while (++count < 3) ++ { ++ c = *(*string_ptr)++; ++ if (c >= '0' && c <= '7') ++ i = (i << 3) + c - '0'; ++ else ++ { ++ (*string_ptr)--; ++ break; ++ } ++ } ++ if ((i & ~((1 << CHAR_TYPE_SIZE) - 1)) != 0) ++ { ++ i &= (1 << CHAR_TYPE_SIZE) - 1; ++ warning ("octal character constant does not fit in a byte"); ++ } ++ return i; ++ } ++ case 'x': ++ { ++ register int i = 0; ++ register int count = 0; ++ for (;;) ++ { ++ c = *(*string_ptr)++; ++ if (c >= '0' && c <= '9') ++ i = (i << 4) + c - '0'; ++ else if (c >= 'a' && c <= 'f') ++ i = (i << 4) + c - 'a' + 10; ++ else if (c >= 'A' && c <= 'F') ++ i = (i << 4) + c - 'A' + 10; ++ else ++ { ++ (*string_ptr)--; ++ break; ++ } ++ } ++ if ((i & ~((1 << BITS_PER_UNIT) - 1)) != 0) ++ { ++ i &= (1 << BITS_PER_UNIT) - 1; ++ warning ("hex character constant does not fit in a byte"); ++ } ++ return i; ++ } ++ default: ++ return c; ++ } ++} ++ ++void ++yyerror (s) ++ char *s; ++{ ++ error (s); ++ longjmp (parse_return_error, 1); ++} ++ ++/* This page contains the entry point to this file. */ ++ ++/* Parse STRING as an expression, and complain if this fails ++ to use up all of the contents of STRING. */ ++/* We do not support C comments. They should be removed before ++ this function is called. */ ++ ++int ++parse_c_expression (string) ++ char *string; ++{ ++ lexptr = string; ++ ++ if (lexptr == 0 || *lexptr == 0) { ++ error ("empty #if expression"); ++ return 0; /* don't include the #if group */ ++ } ++ ++ /* if there is some sort of scanning error, just return 0 and assume ++ the parsing routine has printed an error message somewhere. ++ there is surely a better thing to do than this. */ ++ if (setjmp (parse_return_error)) ++ return 0; ++ ++ if (yyparse ()) ++ return 0; /* actually this is never reached ++ the way things stand. */ ++ if (*lexptr) ++ error ("Junk after end of expression."); ++ ++ return expression_value; /* set by yyparse () */ ++} ++ ++#ifdef TEST_EXP_READER ++/* main program, for testing purposes. */ ++main () ++{ ++ int n, c; ++ char buf[1024]; ++ extern int yydebug; ++/* ++ yydebug = 1; ++*/ ++ initialize_random_junk (); ++ ++ for (;;) { ++ printf ("enter expression: "); ++ n = 0; ++ while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF) ++ n++; ++ if (buf[n] == EOF) ++ break; ++ buf[n] = '\0'; ++ printf ("parser returned %d\n", parse_c_expression (buf)); ++ } ++} ++ ++/* table to tell if char can be part of a C identifier. */ ++unsigned char is_idchar[256]; ++/* table to tell if char can be first char of a c identifier. */ ++unsigned char is_idstart[256]; ++/* table to tell if c is horizontal space. isspace () thinks that ++ newline is space; this is not a good idea for this program. */ ++char is_hor_space[256]; ++ ++/* ++ * initialize random junk in the hash table and maybe other places ++ */ ++initialize_random_junk () ++{ ++ register int i; ++ ++ /* ++ * Set up is_idchar and is_idstart tables. These should be ++ * faster than saying (is_alpha (c) || c == '_'), etc. ++ * Must do set up these things before calling any routines tthat ++ * refer to them. ++ */ ++ for (i = 'a'; i <= 'z'; i++) { ++ ++is_idchar[i - 'a' + 'A']; ++ ++is_idchar[i]; ++ ++is_idstart[i - 'a' + 'A']; ++ ++is_idstart[i]; ++ } ++ for (i = '0'; i <= '9'; i++) ++ ++is_idchar[i]; ++ ++is_idchar['_']; ++ ++is_idstart['_']; ++#if DOLLARS_IN_IDENTIFIERS ++ ++is_idchar['$']; ++ ++is_idstart['$']; ++#endif ++ ++ /* horizontal space table */ ++ ++is_hor_space[' ']; ++ ++is_hor_space['\t']; ++} ++ ++error (msg) ++{ ++ printf ("error: %s\n", msg); ++} ++ ++warning (msg) ++{ ++ printf ("warning: %s\n", msg); ++} ++ ++struct hashnode * ++lookup (name, len, hash) ++ char *name; ++ int len; ++ int hash; ++{ ++ return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1); ++} ++#endif +diff -Naur alliance-5.0/genview/src/gcc-1.42/cexp.y alliance/genview/src/gcc-1.42/cexp.y +--- alliance-5.0/genview/src/gcc-1.42/cexp.y 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cexp.y 2002-04-11 09:14:42.000000000 +0200 +@@ -0,0 +1,656 @@ ++/* Parse C expressions for CCCP. ++ Copyright (C) 1987 Free Software Foundation. ++ ++This program is free software; you can redistribute it and/or modify it ++under the terms of the GNU General Public License as published by the ++Free Software Foundation; either version 1, or (at your option) any ++later version. ++ ++This program is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; if not, write to the Free Software ++Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++ In other words, you are welcome to use, share and improve this program. ++ You are forbidden to forbid anyone else to use, share and improve ++ what you give them. Help stamp out software-hoarding! ++ ++ Adapted from expread.y of GDB by Paul Rubin, July 1986. ++ ++/* Parse a C expression from text in a string */ ++ ++%{ ++#include "config.h" ++#include ++/* #define YYDEBUG 1 */ ++ ++ int yylex (); ++ void yyerror (); ++ int expression_value; ++ ++ static jmp_buf parse_return_error; ++ ++ /* some external tables of character types */ ++ extern unsigned char is_idstart[], is_idchar[]; ++ ++#ifndef CHAR_TYPE_SIZE ++#define CHAR_TYPE_SIZE BITS_PER_UNIT ++#endif ++%} ++ ++%union { ++ struct constant {long value; int unsignedp;} integer; ++ int voidval; ++ char *sval; ++} ++ ++%type exp exp1 start ++%token INT CHAR ++%token NAME ++%token ERROR ++ ++%right '?' ':' ++%left ',' ++%left OR ++%left AND ++%left '|' ++%left '^' ++%left '&' ++%left EQUAL NOTEQUAL ++%left '<' '>' LEQ GEQ ++%left LSH RSH ++%left '+' '-' ++%left '*' '/' '%' ++%right UNARY ++ ++/* %expect 40 */ ++ ++%% ++ ++start : exp1 ++ { expression_value = $1.value; } ++ ; ++ ++/* Expressions, including the comma operator. */ ++exp1 : exp ++ | exp1 ',' exp ++ { $$ = $3; } ++ ; ++ ++/* Expressions, not including the comma operator. */ ++exp : '-' exp %prec UNARY ++ { $$.value = - $2.value; ++ $$.unsignedp = $2.unsignedp; } ++ | '!' exp %prec UNARY ++ { $$.value = ! $2.value; ++ $$.unsignedp = 0; } ++ | '+' exp %prec UNARY ++ { $$ = $2; } ++ | '~' exp %prec UNARY ++ { $$.value = ~ $2.value; ++ $$.unsignedp = $2.unsignedp; } ++ | '(' exp1 ')' ++ { $$ = $2; } ++ ; ++ ++/* Binary operators in order of decreasing precedence. */ ++exp : exp '*' exp ++ { $$.unsignedp = $1.unsignedp || $3.unsignedp; ++ if ($$.unsignedp) ++ $$.value = (unsigned) $1.value * $3.value; ++ else ++ $$.value = $1.value * $3.value; } ++ | exp '/' exp ++ { if ($3.value == 0) ++ { ++ error ("division by zero in #if"); ++ $3.value = 1; ++ } ++ $$.unsignedp = $1.unsignedp || $3.unsignedp; ++ if ($$.unsignedp) ++ $$.value = (unsigned) $1.value / $3.value; ++ else ++ $$.value = $1.value / $3.value; } ++ | exp '%' exp ++ { if ($3.value == 0) ++ { ++ error ("division by zero in #if"); ++ $3.value = 1; ++ } ++ $$.unsignedp = $1.unsignedp || $3.unsignedp; ++ if ($$.unsignedp) ++ $$.value = (unsigned) $1.value % $3.value; ++ else ++ $$.value = $1.value % $3.value; } ++ | exp '+' exp ++ { $$.value = $1.value + $3.value; ++ $$.unsignedp = $1.unsignedp || $3.unsignedp; } ++ | exp '-' exp ++ { $$.value = $1.value - $3.value; ++ $$.unsignedp = $1.unsignedp || $3.unsignedp; } ++ | exp LSH exp ++ { $$.unsignedp = $1.unsignedp; ++ if ($$.unsignedp) ++ $$.value = (unsigned) $1.value << $3.value; ++ else ++ $$.value = $1.value << $3.value; } ++ | exp RSH exp ++ { $$.unsignedp = $1.unsignedp; ++ if ($$.unsignedp) ++ $$.value = (unsigned) $1.value >> $3.value; ++ else ++ $$.value = $1.value >> $3.value; } ++ | exp EQUAL exp ++ { $$.value = ($1.value == $3.value); ++ $$.unsignedp = 0; } ++ | exp NOTEQUAL exp ++ { $$.value = ($1.value != $3.value); ++ $$.unsignedp = 0; } ++ | exp LEQ exp ++ { $$.unsignedp = 0; ++ if ($1.unsignedp || $3.unsignedp) ++ $$.value = (unsigned) $1.value <= $3.value; ++ else ++ $$.value = $1.value <= $3.value; } ++ | exp GEQ exp ++ { $$.unsignedp = 0; ++ if ($1.unsignedp || $3.unsignedp) ++ $$.value = (unsigned) $1.value >= $3.value; ++ else ++ $$.value = $1.value >= $3.value; } ++ | exp '<' exp ++ { $$.unsignedp = 0; ++ if ($1.unsignedp || $3.unsignedp) ++ $$.value = (unsigned) $1.value < $3.value; ++ else ++ $$.value = $1.value < $3.value; } ++ | exp '>' exp ++ { $$.unsignedp = 0; ++ if ($1.unsignedp || $3.unsignedp) ++ $$.value = (unsigned) $1.value > $3.value; ++ else ++ $$.value = $1.value > $3.value; } ++ | exp '&' exp ++ { $$.value = $1.value & $3.value; ++ $$.unsignedp = $1.unsignedp || $3.unsignedp; } ++ | exp '^' exp ++ { $$.value = $1.value ^ $3.value; ++ $$.unsignedp = $1.unsignedp || $3.unsignedp; } ++ | exp '|' exp ++ { $$.value = $1.value | $3.value; ++ $$.unsignedp = $1.unsignedp || $3.unsignedp; } ++ | exp AND exp ++ { $$.value = ($1.value && $3.value); ++ $$.unsignedp = 0; } ++ | exp OR exp ++ { $$.value = ($1.value || $3.value); ++ $$.unsignedp = 0; } ++ | exp '?' exp ':' exp ++ { $$.value = $1.value ? $3.value : $5.value; ++ $$.unsignedp = $3.unsignedp || $5.unsignedp; } ++ | INT ++ { $$ = yylval.integer; } ++ | CHAR ++ { $$ = yylval.integer; } ++ | NAME ++ { $$.value = 0; ++ $$.unsignedp = 0; } ++ ; ++%% ++ ++/* During parsing of a C expression, the pointer to the next character ++ is in this variable. */ ++ ++static char *lexptr; ++ ++/* Take care of parsing a number (anything that starts with a digit). ++ Set yylval and return the token type; update lexptr. ++ LEN is the number of characters in it. */ ++ ++/* maybe needs to actually deal with floating point numbers */ ++ ++int ++parse_number (olen) ++ int olen; ++{ ++ register char *p = lexptr; ++ register long n = 0; ++ register int c; ++ register int base = 10; ++ register int len = olen; ++ ++ for (c = 0; c < len; c++) ++ if (p[c] == '.') { ++ /* It's a float since it contains a point. */ ++ yyerror ("floating point numbers not allowed in #if expressions"); ++ return ERROR; ++ } ++ ++ yylval.integer.unsignedp = 0; ++ ++ if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) { ++ p += 2; ++ base = 16; ++ len -= 2; ++ } ++ else if (*p == '0') ++ base = 8; ++ ++ while (len > 0) { ++ c = *p++; ++ len--; ++ if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; ++ ++ if (c >= '0' && c <= '9') { ++ n *= base; ++ n += c - '0'; ++ } else if (base == 16 && c >= 'a' && c <= 'f') { ++ n *= base; ++ n += c - 'a' + 10; ++ } else { ++ /* `l' means long, and `u' means unsigned. */ ++ while (1) { ++ if (c == 'l' || c == 'L') ++ ; ++ else if (c == 'u' || c == 'U') ++ yylval.integer.unsignedp = 1; ++ else ++ break; ++ ++ if (len == 0) ++ break; ++ c = *p++; ++ len--; ++ } ++ /* Don't look for any more digits after the suffixes. */ ++ break; ++ } ++ } ++ ++ if (len != 0) { ++ yyerror ("Invalid number in #if expression"); ++ return ERROR; ++ } ++ ++ /* If too big to be signed, consider it unsigned. */ ++ if (n < 0) ++ yylval.integer.unsignedp = 1; ++ ++ lexptr = p; ++ yylval.integer.value = n; ++ return INT; ++} ++ ++struct token { ++ char *operator; ++ int token; ++}; ++ ++#ifndef NULL ++#define NULL 0 ++#endif ++ ++static struct token tokentab2[] = { ++ {"&&", AND}, ++ {"||", OR}, ++ {"<<", LSH}, ++ {">>", RSH}, ++ {"==", EQUAL}, ++ {"!=", NOTEQUAL}, ++ {"<=", LEQ}, ++ {">=", GEQ}, ++ {NULL, ERROR} ++}; ++ ++/* Read one token, getting characters through lexptr. */ ++ ++int ++yylex () ++{ ++ register int c; ++ register int namelen; ++ register char *tokstart; ++ register struct token *toktab; ++ ++ retry: ++ ++ tokstart = lexptr; ++ c = *tokstart; ++ /* See if it is a special token of length 2. */ ++ for (toktab = tokentab2; toktab->operator != NULL; toktab++) ++ if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) { ++ lexptr += 2; ++ return toktab->token; ++ } ++ ++ switch (c) { ++ case 0: ++ return 0; ++ ++ case ' ': ++ case '\t': ++ case '\r': ++ case '\n': ++ lexptr++; ++ goto retry; ++ ++ case '\'': ++ lexptr++; ++ c = *lexptr++; ++ if (c == '\\') ++ c = parse_escape (&lexptr); ++ ++ /* Sign-extend the constant if chars are signed on target machine. */ ++ { ++ if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1) ++ || ((c >> (CHAR_TYPE_SIZE - 1)) & 1) == 0) ++ yylval.integer.value = c & ((1 << CHAR_TYPE_SIZE) - 1); ++ else ++ yylval.integer.value = c | ~((1 << CHAR_TYPE_SIZE) - 1); ++ } ++ ++ yylval.integer.unsignedp = 0; ++ c = *lexptr++; ++ if (c != '\'') { ++ yyerror ("Invalid character constant in #if"); ++ return ERROR; ++ } ++ ++ return CHAR; ++ ++ /* some of these chars are invalid in constant expressions; ++ maybe do something about them later */ ++ case '/': ++ case '+': ++ case '-': ++ case '*': ++ case '%': ++ case '|': ++ case '&': ++ case '^': ++ case '~': ++ case '!': ++ case '@': ++ case '<': ++ case '>': ++ case '(': ++ case ')': ++ case '[': ++ case ']': ++ case '.': ++ case '?': ++ case ':': ++ case '=': ++ case '{': ++ case '}': ++ case ',': ++ lexptr++; ++ return c; ++ ++ case '"': ++ yyerror ("double quoted strings not allowed in #if expressions"); ++ return ERROR; ++ } ++ if (c >= '0' && c <= '9') { ++ /* It's a number */ ++ for (namelen = 0; ++ c = tokstart[namelen], is_idchar[c] || c == '.'; ++ namelen++) ++ ; ++ return parse_number (namelen); ++ } ++ ++ if (!is_idstart[c]) { ++ yyerror ("Invalid token in expression"); ++ return ERROR; ++ } ++ ++ /* It is a name. See how long it is. */ ++ ++ for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++) ++ ; ++ ++ lexptr += namelen; ++ return NAME; ++} ++ ++ ++/* Parse a C escape sequence. STRING_PTR points to a variable ++ containing a pointer to the string to parse. That pointer ++ is updated past the characters we use. The value of the ++ escape sequence is returned. ++ ++ A negative value means the sequence \ newline was seen, ++ which is supposed to be equivalent to nothing at all. ++ ++ If \ is followed by a null character, we return a negative ++ value and leave the string pointer pointing at the null character. ++ ++ If \ is followed by 000, we return 0 and leave the string pointer ++ after the zeros. A value of 0 does not mean end of string. */ ++ ++int ++parse_escape (string_ptr) ++ char **string_ptr; ++{ ++ register int c = *(*string_ptr)++; ++ switch (c) ++ { ++ case 'a': ++ return TARGET_BELL; ++ case 'b': ++ return TARGET_BS; ++ case 'e': ++ return 033; ++ case 'f': ++ return TARGET_FF; ++ case 'n': ++ return TARGET_NEWLINE; ++ case 'r': ++ return TARGET_CR; ++ case 't': ++ return TARGET_TAB; ++ case 'v': ++ return TARGET_VT; ++ case '\n': ++ return -2; ++ case 0: ++ (*string_ptr)--; ++ return 0; ++ case '^': ++ c = *(*string_ptr)++; ++ if (c == '\\') ++ c = parse_escape (string_ptr); ++ if (c == '?') ++ return 0177; ++ return (c & 0200) | (c & 037); ++ ++ case '0': ++ case '1': ++ case '2': ++ case '3': ++ case '4': ++ case '5': ++ case '6': ++ case '7': ++ { ++ register int i = c - '0'; ++ register int count = 0; ++ while (++count < 3) ++ { ++ c = *(*string_ptr)++; ++ if (c >= '0' && c <= '7') ++ i = (i << 3) + c - '0'; ++ else ++ { ++ (*string_ptr)--; ++ break; ++ } ++ } ++ if ((i & ~((1 << CHAR_TYPE_SIZE) - 1)) != 0) ++ { ++ i &= (1 << CHAR_TYPE_SIZE) - 1; ++ warning ("octal character constant does not fit in a byte"); ++ } ++ return i; ++ } ++ case 'x': ++ { ++ register int i = 0; ++ register int count = 0; ++ for (;;) ++ { ++ c = *(*string_ptr)++; ++ if (c >= '0' && c <= '9') ++ i = (i << 4) + c - '0'; ++ else if (c >= 'a' && c <= 'f') ++ i = (i << 4) + c - 'a' + 10; ++ else if (c >= 'A' && c <= 'F') ++ i = (i << 4) + c - 'A' + 10; ++ else ++ { ++ (*string_ptr)--; ++ break; ++ } ++ } ++ if ((i & ~((1 << BITS_PER_UNIT) - 1)) != 0) ++ { ++ i &= (1 << BITS_PER_UNIT) - 1; ++ warning ("hex character constant does not fit in a byte"); ++ } ++ return i; ++ } ++ default: ++ return c; ++ } ++} ++ ++void ++yyerror (s) ++ char *s; ++{ ++ error (s); ++ longjmp (parse_return_error, 1); ++} ++ ++/* This page contains the entry point to this file. */ ++ ++/* Parse STRING as an expression, and complain if this fails ++ to use up all of the contents of STRING. */ ++/* We do not support C comments. They should be removed before ++ this function is called. */ ++ ++int ++parse_c_expression (string) ++ char *string; ++{ ++ lexptr = string; ++ ++ if (lexptr == 0 || *lexptr == 0) { ++ error ("empty #if expression"); ++ return 0; /* don't include the #if group */ ++ } ++ ++ /* if there is some sort of scanning error, just return 0 and assume ++ the parsing routine has printed an error message somewhere. ++ there is surely a better thing to do than this. */ ++ if (setjmp (parse_return_error)) ++ return 0; ++ ++ if (yyparse ()) ++ return 0; /* actually this is never reached ++ the way things stand. */ ++ if (*lexptr) ++ error ("Junk after end of expression."); ++ ++ return expression_value; /* set by yyparse () */ ++} ++ ++#ifdef TEST_EXP_READER ++/* main program, for testing purposes. */ ++main () ++{ ++ int n, c; ++ char buf[1024]; ++ extern int yydebug; ++/* ++ yydebug = 1; ++*/ ++ initialize_random_junk (); ++ ++ for (;;) { ++ printf ("enter expression: "); ++ n = 0; ++ while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF) ++ n++; ++ if (buf[n] == EOF) ++ break; ++ buf[n] = '\0'; ++ printf ("parser returned %d\n", parse_c_expression (buf)); ++ } ++} ++ ++/* table to tell if char can be part of a C identifier. */ ++unsigned char is_idchar[256]; ++/* table to tell if char can be first char of a c identifier. */ ++unsigned char is_idstart[256]; ++/* table to tell if c is horizontal space. isspace () thinks that ++ newline is space; this is not a good idea for this program. */ ++char is_hor_space[256]; ++ ++/* ++ * initialize random junk in the hash table and maybe other places ++ */ ++initialize_random_junk () ++{ ++ register int i; ++ ++ /* ++ * Set up is_idchar and is_idstart tables. These should be ++ * faster than saying (is_alpha (c) || c == '_'), etc. ++ * Must do set up these things before calling any routines tthat ++ * refer to them. ++ */ ++ for (i = 'a'; i <= 'z'; i++) { ++ ++is_idchar[i - 'a' + 'A']; ++ ++is_idchar[i]; ++ ++is_idstart[i - 'a' + 'A']; ++ ++is_idstart[i]; ++ } ++ for (i = '0'; i <= '9'; i++) ++ ++is_idchar[i]; ++ ++is_idchar['_']; ++ ++is_idstart['_']; ++#if DOLLARS_IN_IDENTIFIERS ++ ++is_idchar['$']; ++ ++is_idstart['$']; ++#endif ++ ++ /* horizontal space table */ ++ ++is_hor_space[' ']; ++ ++is_hor_space['\t']; ++} ++ ++error (msg) ++{ ++ printf ("error: %s\n", msg); ++} ++ ++warning (msg) ++{ ++ printf ("warning: %s\n", msg); ++} ++ ++struct hashnode * ++lookup (name, len, hash) ++ char *name; ++ int len; ++ int hash; ++{ ++ return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1); ++} ++#endif +diff -Naur alliance-5.0/genview/src/gcc-1.42/ChangeLog alliance/genview/src/gcc-1.42/ChangeLog +--- alliance-5.0/genview/src/gcc-1.42/ChangeLog 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/ChangeLog 2002-04-11 09:14:40.000000000 +0200 +@@ -0,0 +1,7914 @@ ++Sun Sep 20 02:02:50 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * Version 1.42 released. ++ ++Fri Sep 18 15:58:15 1992 James Van Artsdalen (james at bigtex.cactus.org) ++ ++ * fixinc.new: Don't look for *.h symlinks if the host doesn't ++ have symlinks. ++ ++Fri Sep 18 02:34:02 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * fixinc.new: New file. ++ ++Fri Sep 11 02:58:48 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * cccp.c (main): Handle -DFOO=BAR in predefs. ++ ++Tue Sep 8 02:18:59 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * expr.c (expand_increment): If OP0 is volatile, read it only once. ++ ++ * gcc.c (compilers): Pass -O* to cc1 or cc1plus. ++ ++Wed Sep 2 00:30:49 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * tm-vax.h (LIB_SPEC): Fix unmatched braces. ++ * tm-ultrix.h (CPP_PREDEFINES): Delete leading space. ++ ++Mon Aug 31 04:08:52 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * fold-const.c (const_binop): Delete special case for mult by 3. ++ ++Thu Aug 27 04:20:43 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * version 1.41 released. ++ ++Mon Aug 24 00:20:27 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * sparc.md (floatsisf2, floatsidf2): Make two alternatives; ++ put r for op1 in first, and fm in second. ++ ++ * cse.c (fold_rtx): Don't make a constant that's a sum of two symbols. ++ ++Sun Aug 23 02:45:28 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * cccp.c (handle_directive): When copying directive, copy the char ++ after a \ without otherwise handling it. ++ ++ * c-typeck.c (build_binary_op_nodefault): Don't shorten signed divide. ++ ++Tue Aug 11 10:41:54 1992 Michael Meissner (meissner@osf.org) ++ ++ * config.gcc (mips-*-os5): Add new varients for MIPS computers ++ using RISC-OS revision 5.00, to turn off shared libraries by ++ default, since the MIPS linker complains about the location of the ++ frame pointer that GCC uses when linking against shared libraries. ++ ++ * tm-mips-5.h (new file): Tm file for MIPS RISC-OS, revision 5.00. ++ ++ * tm-mips-5b.h (new file): Tm file for MIPS RISC-OS, revision 5.00 ++ with the BSD4.3 environment as default. ++ ++ * tm-mips-5s.h (new file): Tm file for MIPS RISC-OS, revision 5.00 ++ with the System V.3 environment as default. ++ ++Mon Jul 20 16:07:12 1992 Pat Rankin (rankin@eql.caltech.edu) ++ ++ * tm-vms.h (MAYBE_VMS_FUNCTION_PROLOGUE): change _c$main_args to ++ uppercase instead of relying on gas to make the case translation ++ ++Mon Jul 20 17:39:25 1992 Pat Rankin (rankin@eql.caltech.edu) ++ ++ * tm-vax.h (FUNCTION_PROLOGUE): adjust the stack allocation size by ++ STARTING_FRAME_OFFSET (normally 0, so no change in generated code). ++ * tm-vms.h (STARTING_FRAME_OFFSET): redefine, to reserve an extra ++ longword at top of local stack in case user calls VAXC$ESTABLISH(). ++ ++Sun Jul 12 15:29:46 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * cse.c (canon_hash): ++ Fp and ap regs are not volatile even if SMALL_REGISTER_CLASSES. ++ ++Sat Jul 11 16:21:52 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * expmed.c (expand_divmod): Don't use non-register target. ++ ++Sun Jul 5 13:09:21 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * configure: New file. ++ ++Mon Jun 29 12:54:07 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * toplev.c (main): Accept -O0 (don't optimize). ++ ++Tue Jun 23 06:15:47 1992 Richard Kenner (kenner at vlsi1.ultra.nyu.edu) ++ ++ * stmt.c (expand_return): Add missing emit_queue call in tail ++ recursion case. ++ ++Wed Jun 10 17:56:57 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * c-parse.y (check_newline): After calling yylex, transfer nextchar ++ into finput using ungetc. ++ ++Sat Jun 6 15:00:22 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * toplev.c (main): Accept -O1 and -O2. ++ ++Fri May 29 22:10:58 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * reload.1 (new_spill_reg): Undo Nov 28 change. ++ ++ * emit-rtl.c (gen_highpart): Typo sign-extending CONST_INT. ++ ++ * expr.c (expand_expr): For VAR_DECL inside ARRAY_REF, ++ verify that DECL_INITIAL is really a CONSTRUCTOR. ++ ++Wed May 27 06:44:42 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * dbxout.c (errno): Declare it. ++ ++ * tm-pyr.h (PCC_BITFIELD_TYPE_MATTERS): Define as 1. ++ ++Tue May 26 10:28:19 1992 Michael Meissner (meissner@osf.org) ++ ++ * loop.c (loop_has_volatile): New static variable to record ++ whether the loop has any volatile references in it. ++ (prescan_loop): Set loop_has_volatile. ++ (check_dbra_loop): Don't reverse loop if there are any volatile ++ references in it. ++ ++Fri May 22 23:48:04 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * cccp.c (finclude): Null-terminate input before trigraph_pcp. ++ ++Sun May 17 22:32:22 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * rtlanal.c (dead_or_partially_set_p): New function. ++ * combine.c (move_deaths): Use that. ++ ++Sat Apr 18 17:43:26 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * varasm.c (make_decl_rtl): ++ Don't warn if local explicit reg var has an initial value. ++ ++Sat Apr 18 16:41:01 1992 Richard Kenner (kenner at vlsi1.ultra.nyu.edu) ++ ++ * tree.c (save_expr): Must do something with read-only tree that ++ has side-effects. ++ ++Thu Feb 13 02:34:02 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * cccp.c (skip_if_group): Skip comments after the #. ++ ++ * cccp.c (macarg): Don't assume stringify will compress spaces. ++ (macroexpand): In stringify, compress space only outside tokens. ++ ++Tue Feb 11 16:58:27 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * combine.c (subst): Preserve all bits outside the field ++ when simplifying (set (zero_extend...) (and (zero_extend...) const)). ++ ++Sat Feb 1 01:05:34 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * expr.c: Include recog.h just once. ++ ++ * dbxout.c (dbxout_init): Output current directory in N_SO sym. ++ ++Tue Jan 28 00:39:34 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * fold-const.c (fold_convert): Properly handle real-to-real case. ++ ++ * loop.c (can_jump_outside_range_p): New function. ++ (loop_can_jump_out_p): New function. ++ (check_dbra_loop): Check that. ++ ++Mon Jan 27 22:55:19 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * cccp.c (main): Add terminating null, then call trigraph_pcp. ++ ++Mon Jan 20 00:04:10 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * expr.c (expand_call): When clearing is_integrable, call ++ mark_addressable too. ++ ++ * tm-pyr.h (PCC_BITFFIELD_TYPE_MATTERS): Defined. ++ (STRUCTURE_SIZE_BOUNDARY): Deleted. ++ ++Wed Jan 15 01:16:05 1992 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-sparc.h (FIRST_PARM_OFFSET): Fix typo. ++ ++Mon Jan 13 16:14:12 1992 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Turn off incomplete array element warning. ++ ++Fri Dec 20 19:27:50 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-sparc.h (WORD_SWITCH_TAKES_ARG): Add -assert. ++ (LINK_SPEC): Pass -assert to linker. ++ ++ * expr.c (expand_call): Treat vfork and sigsetjmp like setjmp. ++ ++Thu Dec 19 01:34:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expr.c (store_expr): Handle copying too-short STRING_CST. ++ ++ * gstdarg.h (_VA_LIST): Handle this like _VA_LIST_. ++ ++Sat Dec 14 16:10:11 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-ultrix.h (CPP_PREDEFINED): Add __unix, __ultrix, __bsd4_2. ++ ++Tue Dec 10 16:11:18 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expr.c (move_block_to_reg): No error if block appears unaligned. ++ (move_block_from_reg): Likewise. ++ ++Thu Nov 28 14:18:28 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-mips-news (CPP_SPEC): Added more -D options. ++ (WORDS_BIG_ENDIAN, BYTES_BIG_ENDIAN, MIPS_NEWS): Deleted. ++ ++ * reload1.c (new_spill_reg): Error if spill explicit reg. ++ ++ * out-sparc.c (single_insn_src_p): Do test MINUS for large int arg. ++ ++Sun Nov 24 23:08:13 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-sun3.h (LINK_SPEC): -g no longer sets -Bstatic. ++ ++Tue Nov 19 14:58:56 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * fold-const.c (combine): If result is single-float, truncate to fit. ++ (fold): Don't add 1 to float constant if that doesn't change the value. ++ ++Sun Nov 17 01:38:46 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * config.gcc (i860-gas): Set `machine'. ++ ++Sat Nov 16 14:18:33 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * ecoff-cmp: Use ld to do stripping. ++ ++ * sdbout.c (sdbout_symbol): Do nothing for var if LOCAL is 0. ++ * toplev.c (compile_file): For sdb, output file-scope vars at end. ++ ++Mon Nov 11 09:22:41 1991 Michael Meissner (meissner at osf.org) ++ ++ * cccp.c (make_undef): Fix off by one error in calling do_under. ++ ++Wed Oct 23 17:19:17 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * stddef.h: Conditional on __sys_stdtypes_h. ++ ++ * m68k.md (compare shift right by 24): Don't allow increment addrs. ++ ++Mon Oct 21 23:08:02 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Fix error message for long float. ++ ++Sun Oct 20 22:16:40 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * reload.c (find_reloads): Warning or error for misuse of `&'. ++ (this_insn_is_asm): New variable. ++ (push_reload): Verify specified reg class is at least possible. ++ * toplev.c (warning_for_asm): New function. ++ ++Sat Oct 19 12:22:23 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * tm-sun3.h, tm-sparc.h (WORD_SWITCH_TAKES_ARG): ++ Check for Tdata as well as target. ++ ++Tue Oct 8 13:40:23 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * expr.c (store_expr): All non-static constructors need spec. handling. ++ ++ * tm-sparc.h (LINK_SPEC): -g no longer sets -Bstatic. ++ ++Sat Oct 5 17:47:19 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * expmed.c (expand_mult): Avoid multiple refs to volatile mem. ++ ++Thu Sep 26 20:52:17 1991 Michael Meissner (meissner at osf.org) ++ ++ * integrate.c (expand_inline_function): Make sure all REG_NOTES are ++ copied as needed as well as the normal pattern. ++ ++Sun Sep 22 02:07:55 1991 Richard Stallman (rms@mole.gnu.ai.mit.edu) ++ ++ * c-typeck.c (build_unary_op): Disallow address of cast. ++ ++ * caller-save.c (emit_mult_restore): Fix typo testing sign of offset. ++ ++ * varasm.c (assemble_variable): Prevent overflow in size in bytes. ++ ++ * fixincludes: Redirect cmp output to /dev/null; don't close it. ++ ++ * i386.md (call_value) [FMTOWNS]: Don't use fpregs. ++ * tm-fmtowns.h: New file. ++ ++Wed Sep 11 21:06:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * gvarargs.h, va-mips.h (va_list): Now an alias for __va___list. ++ (__va___list): This is a typedef. ++ ++Sat Sep 7 13:09:51 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * optabs.c (expand_float, expand_fix): Use 0.5, not 1.0, in ldexp. ++ ++Fri Sep 6 00:25:25 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * c-decl.c (init_decl_processing): Set up void_list_node. ++ (get_parm_info): Use that. ++ ++ * reload1.c (eliminate_frame_pointer): If insn becomes unrecognizable, ++ assume it still fits the same pattern as before (but for reloading). ++ ++Thu Sep 5 21:25:21 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * out-sparc.c (output_move_double): Properly unincrement addreg1. ++ ++Wed Sep 4 18:53:16 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * fixincludes : Change `m68k' to `__m68k__' in all #if's. ++ ++Mon Sep 2 15:08:38 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * c-typeck.c (build_array_type): Better error messages. ++ ++Sat Aug 31 01:55:45 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * out-sparc.c (single_insn_src_p): Undo July 29 change ++ as regards everything except shifts. ++ ++Fri Aug 30 04:42:19 1991 James Van Artsdalen (james at bigtex.cactus.org) ++ ++ * tm-i386.h (OUTPUT_JUMP): Use cc_prev_status. ++ ++Thu Aug 29 01:17:06 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-delta68k.h (PUT_SDB_START_DIM): Renamed from PUT_SDB_DIM. ++ ++Wed Aug 28 19:18:43 1991 Richard Stallman (roland@pogo.gnu.ai.mit.edu) ++ ++ * tm-sparc.h: Reverted change of Aug 4; loses with alloca. ++ ++Tue Aug 27 23:20:50 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expr.c (move_block_to_reg, move_block_from_reg): ++ Don't return prematurely after using movsi_unaligned. ++ ++Mon Aug 26 20:59:17 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * c-parse.y (yylex): Cast shorts[n] to long before shifting. ++ * fold-const.c (decode): Likewise. ++ ++ * i386.md (seq, etc.): Clear the cc_status. ++ ++Sat Aug 24 14:31:19 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expr.c (store_constructor): Handle union constructor. ++ ++Sat Aug 17 14:34:35 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * stmt.c (expand_end_case): ++ When filling labelvec from case range, avoid overflow in i. ++ ++Fri Aug 16 18:09:44 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * Makefile (install): Create bindir. Install gcc as $(bindir)/gcc. ++ ++Sat Aug 10 15:18:02 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * ns32k.md (call_value): Consistently realize function is operand 1. ++ ++Thu Aug 8 13:36:25 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * toplev.c (main): Accept -g with warning if not supported. ++ ++ * tm-m68k.h (LEGITIMIZE_ADDRESS): Copy address before changing it. ++ (COPY_ONCE): New macro, subroutine for LEGITIMIZE_ADDRESS. ++ ++ * tm-i386.h (FIX_FRAME_POINTER_ADDRESS): Remove spurious backslash. ++ ++Sun Aug 4 15:39:24 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * Kludge to preallocate stack space for stack args on Sparc. ++ * expr.c (expand_call): Support STACK_SPACE_FOR_CALLS. ++ (init_pending_stack_adjust): Likewise. ++ * stmt.c (frame_offset): No longer static. ++ * tm-sparc.h (STACK_SPACE_FOR_CALLS): Defined. ++ (STACK_ARGS_ADJUST): Defined. ++ ++Thu Aug 1 17:22:40 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-i860.h (MAX_PARM_BOUNDARY): Defined. ++ (GO_IF_LEGITIMATE_ADDRESS): Add parens around & operator. ++ (ASM_OUTPUT_REG_PUSH, ASM_OUTPUT_REG_POP): Use sp, not r3 (that's fp). ++ * i860.md (movsf): Don't reload high address part if already loaded. ++ (cmplesf, cmpledf, cmpgesf, cmpgedf): Set CC_NEGATED; swap operands. ++ * out-i860.c (strict_single_insn_op_p): ++ Fix criterion for loading high half. ++ (output_load_address): #if 0 since not used. ++ ++Wed Jul 31 12:36:37 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * fixincludes: New variable INCLUDES specifies input dir. ++ ++Tue Jul 30 17:24:52 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * stmt.c (expand_end_stmt_expr): Force out the queue. ++ Protect the value from the queue. ++ ++ * stddef.h (WCHAR_T): Also test and define _WCHAR_T_. ++ ++ * expr.c (move_block_to_reg): Check for QUEUED only within MEM. ++ ++Sun Jul 28 16:15:39 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * move-if-change: Use -f with rm and mv. ++ ++Sat Jul 27 13:03:50 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * fixincludes (memvar.h): Make two defs of CAT, one ANSI and one trad. ++ ++ * combine.c (try_combine): Reject if I1DEST used between I2 and I3. ++ ++Wed Jul 24 13:54:41 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * cse.c (cse_insn): Don't use HASHREG. ++ Detect all volatile destinations. ++ (HASHREG): Deleted. ++ ++ * tm-m68k.h (NOTICE_UPDATE_CC): ++ Calls clear status even if value in address reg. ++ ++Fri Jul 19 15:50:46 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * varasm.c (make_decl_rtl): Set EXTERNAL_SYMBOL_P only if TREE_PUBLIC. ++ ++Tue Jul 16 20:16:16 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * Makefile [comments for SCO] (CC, OLDCC): Add some -D options. ++ ++Wed Jul 10 13:18:03 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * cccp.c (hack_vms_include_specification): Fix typos. ++ ++Tue Jul 9 21:17:43 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * fold-const.c (mul_double): Add parens to avoid precedence errors. ++ ++Mon Jul 8 22:17:20 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * c-parse.y (yylex): Pedantic warning here for `asm'. ++ No warning for `__asm__'. ++ (maybe_type_qual, maybeasm, extdef): No warning here. ++ ++Sun Jul 7 15:29:42 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * README-ENCAP: New file. (Actually, it used to exist, and went away.) ++ ++ * emit-rtl.c (gen_highpart): Handle a const_int. ++ ++ * integrate.c (copy_rtx_and_substitute): Avoid change_address. ++ ++ * stmt.c (expand_end_stmt_expr): Instead of 0, use const0_rtx. ++ ++ * c-decl.c (NULL): Undef before defining. ++ ++ * tm-9k320.h (STANDARD_STARTFILE_PREFIX): Let this be overridden. ++ ++Sat Jul 6 14:51:15 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expr.c (expand_assignment): Don't abort for volatile structure field ++ even if the structure is in a register. ++ ++ * fold-const.c (div_and_round_double): Make lnum and lden unsigned. ++ Use the small-denominator algorithm only for denom < 2**24. ++ Fix backward conditionals in ?: operators in general case. ++ Change i + j to i - 1 + j when indexing num. ++ ++Wed Jul 3 11:40:27 1991 Michael Meissner (meissner at osf.org) ++ ++ * expr.c (move_block_from_reg, move_block_to_reg): Protect block ++ addresses from queued memory insns, which occur for things like *p++. ++ ++ * expr.c (move_block_from_reg, move_block_to_reg): Add an alignment ++ field that gives how much alignment the structure has. If the md ++ file provides movsi_unaligned, use it if the structure is not ++ properly aligned. Change all callers to pass the alignment in bits. ++ ++ * stmt.c (assign_params): Pass structure alignment to ++ move_block_from_reg. ++ ++ * mips.md (movsi_unaligned): New define_expand to handle unaligned ++ moves. ++ (movsi_ulw, movsi_usw): New define_insn's to handle unaligned moves ++ to/from a register. ++ ++Tue Jul 2 16:56:28 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * cccp.c: Include descrip.h. ++ ++Mon Jul 1 21:04:54 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * out-ns32k.c (output_move_double): ++ Use CONSTANT_P to check for single-word constant. ++ ++Sun Jun 30 16:12:34 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * gnulib2.c (__builtin_saveregs): ++ For i860, make data structure fit in with va-i860.h. ++ ++ * reload1.c (choose_reload_regs): Don't use reg_reloaded_contents ++ for a reg that has a reg_equiv_address. ++ ++ * gnulib2.c, gnulib.c (abort): Get rid of any macro definition. ++ ++Sat Jun 29 09:27:12 1991 Michael Tiemann (tiemann at cygint.cygnus.com) ++ ++ * out-sparc.c (single_insn_src_p): Reject any ASHIFT patterns with ++ non-REG second operand. ++ ++Sat Jun 29 06:25:19 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-vax.h (CPP_SPEC, LIB_SPEC): New macros. ++ ++ * reload.c (push_reload): Handle two different inmodes, etc. ++ ++ * gcc.c (S_ISREG): Define if not defined. ++ (delete_temp_files): Use it. ++ ++ * limits.h (UCHAR_MAX, CHAR_MAX, USHRT_MAX): Delete `U'. ++ (LONG_MAX, ULONG_MAX): Add `L'. ++ ++Fri Jun 28 22:21:54 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * Makefile (realclean): Delete stage1, stage2, stage3. ++ ++ * gcc.c (fatal) [HAVE_VFPRINTF]: Do print the program name. ++ ++Sat Jun 1 01:10:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * Version 1.40 released. ++ ++ * i386.md (divmodsi4, udivmodsi4): Add separate define_expands ++ to force duplicated args into registers. ++ ++Thu May 30 00:32:18 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expr.c (expand_expr): ++ Don't lose volatility of fields in COMPONENT_REF. ++ ++ * fixincludes (stdtypes.h): Handle wchar_t like the other types. ++ ++Tue May 28 12:34:24 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * cse.c (canon_hash): Don't hash hard regs if SMALL_REGISTER_CLASSES. ++ * tm-i386.h (SMALL_REGISTER_CLASSES): Define it. ++ ++ * expr.c (store_one_arg): Set used after calling push_rounding. ++ ++ * tm-decstatn.h (CPP_PREDEFINES): Add __ versions of macros. ++ ++ * tm-apollo68.h (LIB_SPEC): Renamed from LINK_SPEC. ++ ++Sun May 26 00:52:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * cse.c (refers_to_mem_p): Handle constants as addresses. ++ ++Thu May 23 12:35:25 1991 John Vasta (vasta at apollo.hp.com) ++ ++ * tm-apollo68.h (STARTFILE_SPEC): Remove unneeded ++ conditional and use correct file for ANSI mode. ++ (LIB_SPEC): Deleted. ++ (LINK_SPEC): Specify -e switch. ++ ++Wed May 22 14:35:13 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-i386isc.h (STARTFILE_SPEC): Add missing %s. ++ ++ * tm-vaxv.h (ASM_OUTPUT_LOCAL): Use data_section. ++ ++Mon May 20 12:38:39 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * Makefile (float.h): Pass certain vars down to nested make. ++ ++ * hard-params.c [NO_LONG_DOUBLE]: Inhibit handling of long double. ++ ++ * m68k.md (trunc*): Clear cc if use wider insn. ++ ++Sun May 19 14:45:46 1991 Ron Guilmette (rfg at ncd.com) ++ ++ * Makefile.in (clean): Delete stage1...stage4. ++ (realclean): Delete cexp.output. ++ ++ * fixincludes: Handle BSD43__IO* and BSD43_CTRL like IO* and CTRL. ++ ++Sun May 19 15:00:05 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * fixincludes (machine/cpu.h): ++ Create in proper dir. Fix mips/cpu.h too. ++ ++Fri May 17 15:41:22 1991 James Van Artsdalen (james at bigtex.cactus.org) ++ ++ * tm-i386v4.h (ASM_OUTPUT_COMMON): Don't attempt alignment on a ++ three byte boundary. ++ ++Thu May 16 12:46:37 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expr.c (convert_to_mode): Don't use gen_lowpart on most constants. ++ ++Mon May 13 23:42:03 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expmed.c (store_bit_field, extract_bit_field): ++ Temporarily set volatile_ok when checking predicates. ++ ++ * explow.c (force_not_mem): Do nothing for BLKmode. ++ ++ * tree.c (real_value_from_int_cst): Add parens to fix misparsings. ++ ++Sun May 12 22:39:42 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tree.c (real_value_from_int_cst): Make MASK unsigned. ++ ++Wed May 8 11:19:32 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * rtl.c (reg_note_name): Put in REG_UNSET. Remove dead ones. ++ ++ * tree.c (real_value_from_int_cst): Avoid converting unsigned to float. ++ ++ * stor-layout.c (round_size): Cast to int when comparing modes. ++ ++ * tm-ultrix.h (CPP_PREDEFINES): Define __vax. ++ ++Mon May 6 13:29:48 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * out-i386.c (fp_top_dead_p1): Look past any number of labels. ++ ++ * tm-aix386.h (ASM_FILE_START): Discard directories from .file arg. ++ ++Sat May 4 14:36:26 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-hp9k320.h (CPP_SPEC): Always define _HPUX_SOURCE. ++ Move other standard predefs with underscores here. ++ (CPP_PREDEFINES): Standard predefs moved from here. ++ ++ * hard-params.c (EPROP): Avoid comparing a with out if bad is 1. ++ ++Thu May 2 14:43:48 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * math-68881.h (pow): Negate x if negative when taking log. ++ ++ * c-decl.c (finish_enum): Don't store the enum as the type of any of ++ its enumerator values. ++ ++Wed May 1 15:02:15 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * c-decl.c (finish_enum): Rewrite handling of min and max values. ++ Rewrite handling of flag_short enums. ++ * stor-layout.c (round_size): New subroutine. ++ ++ * out-i386.c (fp_top_dead_p1): Use mentions_fp_top to check dest. ++ ++Tue Apr 30 14:41:58 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expr.c (expand_call): Copy value to mem via a pseudo. ++ ++ * tm-decstatn.h (CPP_PREDEFINES): Define __mips and __LANGUAGE_C. ++ ++ * fixincludes (machine/cpu.h): Delete superfluous `static'. ++ ++ * Makefile (maketest): Don't stop on error in `if' statement. ++ ++Mon Apr 29 12:29:16 1991 (Eric Youngdale at youngdale@v6550c.nrl.navy.mil) ++ ++ * cccp.c (hack_vms_include_specification): Modified conversion of ++ unix filenames to VMS filenames, if no VMS device or directory is ++ present and a unix style directory name is present. In this case, use ++ the first unix directory name as the VMS device spec. This is only ++ used in '#include <...>' type includes, when the include file has ++ not been found in the standard locations. ++ ++Mon Apr 29 22:18:47 1991 James Van Artsdalen (james at bigtex.cactus.org) ++ ++ * tm-att386.h (ASM_OUTPUT_LOCAL): Align static local variables. ++ ++Mon Apr 29 13:50:55 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * reload1.c (emit_reload_insns): When changing the mode, ++ make a REG, not a SUBREG. ++ ++ * out-i386.c (print_operand): For non-'c', print prefix for LABEL_REF. ++ ++ * c-decl.c (pushdecl): Just a warning for type of extern not global. ++ ++Wed Apr 17 12:44:16 1991 Richard Stallman (rms at apple-gunkies) ++ ++ * stmt.c (use_variable, use_variable_after): Handleg subregs. ++ ++Sat Apr 13 10:10:28 1991 Eric Youngdale (youngdale@v6550c.nrl.navy.mil) ++ ++ * cccp.c (hack_vms_include_specification) Made parsing more ++ intelligent when confronted with something like: ++ "SYS$SYSROOT:[SYSLIB.]/foo.h". Previously this routine would ++ return a file specification that had a syntax error. This example ++ will now parsed to "SYS$SYSROOT:[SYSLIB]foo.h". ++ ++Fri Apr 12 02:37:07 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * expmed.c (store_bit_field): Don't die if VALUE is constant ++ for a field bigger than a word. ++ ++ * tm-sparc.h (FUNCTION_BLOCK_PROFILER): Must set %o0 to the address ++ LPBX0 by adding in the low part of the address before calling ++ ___bb_init_func. ++ ++ * cccp.c (skip_to_end_of_comment): Handle warn_comment. ++ ++ * out-m68k.c (output_move_double): Really test HOST_WORDS_BIG_ENDIAN. ++ ++ * config.gcc (i386-isc): New target. ++ * tm-i386isc.h: New file. ++ ++ * m68k.md (dbra patterns): Use `=' in constraint of op 0. ++ ++Sat Mar 30 15:16:16 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * ns32k.md (andcbhi3, andcbqi3): Constraint shouldn't say commutative. ++ ++ * tm-mips.h, tm-sparc.h, tm-spur.h (CONST_DOUBLE_OK_FOR_LETTER_P): ++ Use CONST_DOUBLE_LOW and CONST_DOUBLE_HIGH. ++ ++Fri Mar 29 16:17:59 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-hp9k2bsd.h: New file. ++ * config.h (hp9k200-bsd): New target. ++ ++Thu Mar 28 16:31:50 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * tm-vax.h (CHECK_FLOAT_VALUE): Change float max to ...444e+38. ++ ++Wed Mar 27 19:57:33 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * integrate.c (access_parm_map): Use /, not %, in setting WORD. ++ ++Sun Mar 24 23:47:19 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * gcc.c (store_arg): Use xrealloc. ++ (xrealloc, xmalloc): Change error message. ++ ++Sat Mar 23 03:42:20 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * gnulib.c [GNULIB_NEEDS_DOUBLE]: Override FLOAT_ARG_TYPE, FLOATIFY. ++ ++Fri Mar 22 00:46:42 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * integrate.c (frame_pointer_sum_p): New function. ++ (copy_rtx_and_substitute): Use that. ++ ++ * cccp.c (bzero, etc.): Don't test for BSD--it's never defined. ++ ++Tue Mar 19 21:25:52 1991 Richard Stallman (rms at mole.gnu.ai.mit.edu) ++ ++ * gstab.h: Renamed from stab.h. ++ * dbxout.c, symout.c, final.c: Include under that name. ++ ++ * stddef.h (wchar_t): New typedef. ++ ++Sun Mar 17 21:01:56 1991 Richard Stallman (rms@mole.ai.mit.edu) ++ ++ * fixincludes (dnetdb.h): Fix missing semi in nodeent. ++ (rusers.h): Code to fix this file was duplicated. ++ ++Sat Mar 16 15:25:56 1991 Richard Stallman (rms@mole.ai.mit.edu) ++ ++ * toplev.c (compile_file): Write out all static consts that are used. ++ ++Thu Mar 14 16:56:03 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-att386.h (ASM_OUTPUT_SKIP): Delete duplicate #define. ++ ++ * out-sparc.c (output_block_move): ++ Conditionalize templates at end on NO_UNDERSCORES. ++ ++Tue Mar 12 23:48:11 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * fixincludes: Quote the # in an echo. ++ ++Sun Mar 10 20:11:04 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (emit_library_call): Support GNULIB_NEEDS_DOUBLE. ++ * tm-i860.h (GNULIB_NEEDS_DOUBLE): Define it. ++ ++Sun Mar 3 15:13:50 1991 Michael Meissner (meissner at osf.org) ++ ++ * out-mips.c (function_arg_partial_nregs): Fix passing two ++ structures, each of which contains two doubles to a function which ++ returns a structure -- the problem was caused when the 1.37.1 code ++ was modified to have two fields for the FUNCTION_ARG routines, ++ arg_number which is the number of arguments, and arg_words which is ++ the total number of words passed, instead of the old arg_number ++ which counted the words. The function_arg_partial_nregs routine was ++ returning -1 for the second call. In 1.37.1, the macro ++ FUNCTION_ARG_PARTIAL_NREGS was only called one time, if it returned ++ non-zero. This no longer seems the case for 1.39. ++ ++Sun Mar 10 19:06:36 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-harris.h (ASM_FILE_START): Output a .file. ++ ++ * tm-mips.h (TARGET_MEM_FUNCTIONS): Define on certain systems. ++ ++Fri Mar 8 15:51:15 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * gcc.c (delete_temp_files): Delete only ordinary files. ++ ++Thu Mar 7 17:51:11 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-typeck.c (build_array_ref): Notice if array expression ++ is const or volatile. ++ ++Tue Mar 5 14:21:57 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-decl.c (store_parm_decls): If -traditional, ++ allow unsigned int in prototype in place of int. ++ ++ * stmt.c (fixup_gotos): Handle jumping to end of rtl. ++ ++ * tm-mips-news.h (DECSTATION): Definition deleted. ++ (MIPS_NEWS): Define it. ++ ++ * config.gcc (i860-gas): New target. ++ * tm-i860g.h: New file. ++ ++Mon Mar 4 00:39:11 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * fixincludes: Fix typos handling size_t and ptrdiff_t. ++ ++ * out-mips.c: Include sys/types.h. ++ ++Sun Mar 3 01:11:46 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (include_defaults, cplusplus_include_defaults): ++ Use CC_INCLUDE_DIR. ++ (CC_INCLUDE_DIR): Define by default as /use/include. ++ * tm-mips.h (CC_INCLUDE_DIR): Define, if MIPS_BSD43. ++ (CPP_SPEC): Don't do -I to handle -ZSYSV, -ZBSD43. ++ ++Sat Mar 2 16:22:59 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (expand_call): Use argpos, not i, where appropriate. ++ ++Wed Feb 27 15:46:54 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * gnulib.c (FLOAT_ARG_TYPE, FLOATIFY): New macros. ++ (__*sf*): Use them for `float' args. ++ ++ * stmt.c (fixup_gotos): Check that jump into bindings ++ really comes from before the start of the bindings. ++ Use TREE_REGDECL to indicate error message printed. ++ ++Tue Feb 26 15:46:35 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Check for errors before warnings. ++ ++Mon Feb 25 20:46:43 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * sdbout.c (SDB_NO_FORWARD_REFS): Renamed from MAYBE. ++ (plain_type_1): Don't call sdb_record_type_name if no forward refs. ++ ++ * integrate.c (expand_inline_function): Copy REG_USERVAR_P to new regs. ++ (copy_rtx_and_substitute): Likewise. ++ ++ * c-typeck.c (digest_init): Handle STRING_CST before same-type case. ++ ++ * make-cc1.com, make-cccp.com: Set default dir for batch use. ++ ++Sun Feb 24 17:14:09 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * out-sparc.c (output_fp_move_double): Typo choosing inc_reg. ++ If we use %g1, then put that into the memref. ++ ++ * loop.c (check_dbra_loop): Win if loop biv is used only for counting. ++ ++Sat Feb 23 13:36:13 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * sdbout.c (sdbout_one_type): Changed #ifndef MAYBE controlling ++ call to sdbout_field_types into #ifdef. It seems it was backwards. ++ ++ * c-decl.c (grokdeclarator): Error for `signed void', etc. ++ Warning for `signed my_int', and only if pedantic. ++ ++Fri Feb 22 12:45:06 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-i386sco.h (STRUCT_RETURN_CALLER_POP): Define it. ++ ++ * stmt.c (expand_end_loop): Don't be fooled by notes at loop end. ++ ++Thu Feb 21 21:34:12 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-sun2os4.h (LINK_SPEC): New macro. ++ * tm-sun386i.h (LINK_SPEC): Undef before redefining. ++ ++Mon Feb 11 00:06:19 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * Makefile (libg): Rule deleted. ++ (install): Don't create libg.a. ++ ++ * out-mips.c (mips_asm_file_start, make_temp_file): New functions. ++ * tm-mips.h (ASM_FILE_START): Use those functions. ++ ++ * gcc.c (do_spec_1): Handle %G. ++ (LIBG_SPEC): New macro. ++ (link_spec): Use %G. ++ * tm-mips.h (LIBG_SPEC): Define this as empty string. ++ ++Sun Feb 10 23:03:45 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * integrate.c (copy_parm_decls): Set TREE_INLINE before pushdecl. ++ ++Sat Feb 9 16:31:28 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * loop.c (eliminate_biv, can_eliminate_biv_p): ++ For compare insn and constant coeffs, check for overflow. ++ For variable coeffs, or variable endpoint, don't allow inequality. ++ ++Fri Feb 8 18:04:43 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * Makefile (libg): Put one (null) member in the library. ++ ++Thu Feb 7 22:20:24 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-i386v4.h (ASM_OUTPUT_COMMON): Override; put alignment in output. ++ ++ * tm-news.h (FUNCTION_PROLOGUE): Correct syntax of link insn. ++ (PRINT_OPERAND_ADDRESS): Use period, not colon, before index reg width. ++ ++Wed Feb 6 23:59:42 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * config.gcc (mips-sysv): Use xm-umips.h. ++ * tm-mips-sysv.h (TARGET_MEM_FUNCTIONS): Define it. ++ ++Tue Feb 5 00:45:58 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-parse.y (combine_strings): Finish fixing wide strings. ++ ++ * reload1.c (possible_group_p): New subroutine. ++ (reload): Don't kill last group when looking for a non-group. ++ ++ * expmed.c (expand_divmod): If emit a cmp, must copy op0 to a reg. ++ ++ * expr.c (expand_builtin): For ffs, get mode from TREE_TYPE. ++ ++ * tm-att386.h (ASM_OUTPUT_SKIP): In text seg, make explicit zeros. ++ ++Mon Feb 4 17:39:36 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-typeck.c (digest_init): Error if init array with another array. ++ ++Sun Feb 3 22:05:40 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * m68k.md (extend QI to HI): Typo in clr insn. ++ ++ * c-parse.y (combine_strings): Subtract properly from LEN when copying. ++ (init_lex, yylex): max_wide is now measured in wide chars, not bytes. ++ ++Sat Feb 2 12:32:41 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * xm-m68k.h (HOST_WORDS_BIG_ENDIAN): Define it. ++ ++Thu Jan 31 00:33:33 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-aix386.h (ASM_OUTPUT_LOCAL): Ok to use bss, since no shared libs. ++ (LINK_SPEC): Pass through all -K and -T options. ++ * xm-aix386.h (TRUE, FALSE): Undef if already def, to avoid warning. ++ ++ * c-decl.c (pushdecl): Don't make an extern global for -traditional ++ if it uses any local types. ++ ++ * tm-sun386i.h (PCC_BITFFIELD_TYPE_MATTERS): Use 1 as value. ++ (LINK_SPEC): Copy definition from xm-sun386i.h. ++ * xm-sun386i.h (LINK_SPEC): Definition deleted. ++ ++ * tm-hp9k320.h (STANDARD_STARTFILE_PREFIX): Once again always redefine. ++ ++Wed Jan 30 16:27:14 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * fixincludes (sys/stdtypes.h): Edit this to handle _SIZE_T, etc. ++ ++Mon Jan 28 12:48:20 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * loop.c (loop_reg_used_before_p): Scan explicitly, don't use luids. ++ ++Thu Jan 24 18:15:08 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (expand_expr, case for ARRAY_REF): Use build_pointer_type. ++ ++ * loop.c (strength_reduce): Substitute regs inside some reg notes. ++ ++Wed Jan 16 15:34:38 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * Version 1.39 released. ++ ++ * config.gcc (i386-esix): New alternative. ++ * tm-i386esix.h: New file. ++ ++ * expr.c (expand_call): Don't put libcall notes on const function call ++ unless there is a suitable value-copying insn at the end. ++ ++ * config.gcc (delta68k): New alternative. ++ * tm-delta68k.h, xm-delta68k.h: New files. ++ ++Tue Jan 15 01:37:21 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * loop.c (scan_loop): Condition for movability was wrong. ++ A reg that isn't necessarily set may be unsafe ++ even if used only inside the loop. ++ However, a reg used only in the same basic block after the set is safe. ++ So is a reg that isn't a user-level variable. ++ ++ * combine.c (try_distrib): Don't push + thru negative-count shift. ++ * tm-vax.h (NEGATIVE_SHIFT_COUNT): Define to enable that change. ++ ++Mon Jan 14 18:17:58 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * stmt.c (assign_parms) [FIRST_PARM_CALLER_OFFSET]: ++ If that's negative, adjust first_parm_offset rather than ++ stack_args_size for size of structure value address. ++ (Kludge to make sparc work.) ++ ++ * fixincludes-V4: Handle #lint. ++ ++ * tm-i386sco.h (CPP_PREDEFINES): Get rid of the %-spec. ++ (CPP_SPEC): Override this; handle -scointl here. ++ ++Sun Jan 13 23:06:25 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * fixincludes (sys/file.h): Fix incorrect conditional in Ultrix. ++ ++Sat Jan 12 14:25:02 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * i386.md (movsf, movdf): Change constraints to ensure opt reload. ++ ++Fri Jan 11 13:22:22 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-tower-as.h (ASM_OUTPUT_COMMON, ASM_OUTPUT_LOCAL, ASM_OUTPUT_SKIP): ++ Use %u. ++ (PUT_SDB_START_DIM): New macro. ++ (PUT_SDB_DIM): Deleted. ++ ++ * tm-next.h (LIB_SPEC, STARTFILE_SPEC): Don't support -p. ++ ++Thu Jan 10 13:05:46 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-sun2.h (CC1_SPEC): Define to ignore -sun2 and -target. ++ (WORD_SWITCH_TAKES_ARG): Define to recognize -target. ++ (LIB_SPEC): Define; handle -a. ++ * tm-sun3os4.h: New file. ++ ++ * tm-mips-news.h (CPP_SPEC): Update include directory version. ++ (MACHINE_TYPE): Change this string. ++ ++ * tm-next.h (LIB_SPEC): Use -lsys_s, not -lc. ++ ++ * Makefile (gnulib): Depend on config.status. ++ ++Mon Jan 7 15:03:53 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-typeck.c (process_init_constructor): Error if values ++ provided for an array of empty elements. ++ Rename variable `error' to `error_flag'. ++ ++ * out-i386.c (function_epilogue) [STRUCT_RETURN_CALLER_POP]: ++ Don't pop struct value arg if -fpcc-struct-return. ++ * expr.c (expand_call) [STRUCT_RETURN_CALLER_POP]: ++ Change handling of structure_value_addr. ++ ++ * cse.c (cse_insn): In special case for (set REG0 REG1), ++ change any REG_EQUIV notes to REG_EQUAL. ++ ++Sun Jan 6 13:51:59 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-sun386i.h (PCC_BITFIELD_TYPE_MATTERS): Define it. ++ ++ * out-i386.c (fp_top_dead_p1): Follow jump only if optimizing. ++ ++Fri Jan 4 23:17:41 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-att386.h (ASM_OUTPUT_LOCAL): Change back to data section. ++ ++Thu Jan 3 13:31:41 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * loop.c (move_movables): Do reg substitutions on REG_EQUAL, REG_EQUIV. ++ ++ * out-i386.c (fp_top_dead_p1): Follow one jump or label. ++ ++ * rtl.c (read_rtx): Cast type of NULL vector. ++ ++Wed Jan 2 18:59:34 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * out-i386.c (fp_call_internal): Use fp_top_dead_p1, not top_dead_p. ++ * reload1.c (emit_reload_insns): Undo previous change. ++ ++Tue Jan 1 12:01:43 1991 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * integrate.c (expand_inline_function): ++ Handle parms passed in reg but stored in memory. ++ ++ * ecoff-cmp: Specify `c' in option to tail. ++ ++ * reload1.c (emit_reload_insns) [PRESERVE_DEATH_INFO_REGNO_P]: ++ Move notes to output reload even if dest is reg. ++ Check for notes matching by hard reg, even if different origin. ++ Really scan all the output reload insns. ++ ++Mon Dec 31 16:04:11 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * stupid.c (stupid_find_reg): Don't use reg if OVERLAPPING_REGNO_P. ++ ++ * i386.md (push for SFmode): Operand of fst was missing. ++ * out-i386.c (fp_call_internal): Discard result if unused. ++ ++Sat Dec 29 16:37:10 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * Makefile (install): Use basename on eachfile; BSD make adds dirs. ++ ++ * cccp.c (macroexpand): Test traditional when computing expansion size. ++ ++Thu Dec 27 23:42:42 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * reload.c (find_reloads_address_1): For auto-increment, save the reg ++ before replacing it with something being reloaded. ++ ++Fri Dec 21 18:31:38 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * Version 1.38. ++ ++ * tm-i386vgas.h (STARTFILE_SPEC, LIB_SPEC): Deleted. ++ ++Sun Dec 16 18:10:20 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-i386vgas.h (ASM_OUTPUT_LABELREF): Do prepend `_' again. ++ ++ * tm-sun3.h (ASM_OUTPUT_FLOAT*, ASM_OUTPUT_DOUBLE*): ++ Use double_is_minus_zero to test for -0.0. ++ * out-m68k.c (double_is_minus_zero): New function. ++ ++Fri Dec 14 00:57:30 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-sun3.h (ASM_OUTPUT_FLOAT*, ASM_OUTPUT_DOUBLE*): ++ Use `iszero' and `signbit' to check for -0.0. ++ ++ * recog.c (offsettable_address_p): Use OFFSETTABLE_ADDRESS_P. ++ * tm-i860.h (OFFSETTABLE_ADDRESS_P): Define this. ++ ++Wed Dec 12 16:11:05 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * gvarargs.h: Avoid duplicate inclusion using _VARARGS_H. ++ ++ * c-decl.c (grokdeclarator): Always promote short even if -mshort. ++ ++Tue Dec 11 23:12:51 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (convert_move): Do compare before slt. ++ Handle destination not valid in slt. ++ ++Mon Dec 10 00:27:04 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * out-sparc.c (output_fp_move_double): Bugs in last change: ++ Use adj_offsettable_operand when possible. ++ Choose a reg other than fp to increment. ++ ++Sun Dec 9 23:21:05 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (collect_expansion): Don't check for /* */ concat here. ++ (macroexpand): Always use raw arg if traditional. ++ ++Wed Dec 5 13:52:16 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * optabs.c (expand_binop): Handle insn_before == 0. ++ ++ * Makefile (includes): Export LIB. ++ ++Tue Dec 4 21:27:00 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * loop.c (consec_sets_giv): Give proper type to force, force2. ++ ++Mon Dec 3 15:57:19 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (special_symbol): Use time_t as type of t. ++ ++Sun Dec 2 16:43:31 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * config.gcc (tower): New alternative. ++ * tm-tower.h, tm-tower-as.h, xm-tower.h: New files. ++ ++ * stddef.h (ptrdiff_t): Prevent redefinition, as with size_t. ++ (size_t): Define all the macros used to prevent redefinition. ++ ++Fri Nov 30 14:25:49 1990 Michael Meissner (meissner at osf.org) ++ ++ * out-mips.c (init_cumulative_args, function_arg_advance, ++ function_arg, function_arg_partial_nregs): Type CUMULATIVE_ARGS is ++ now a pointer to a structure instead of a structure. New field ++ arg_words tracks number of words consumed so far and arg_number just ++ tracks physical numbers of arguments. Make four single precision ++ floating point arguments passed via prototypes use $f12, $f14, $6, ++ and $7, just like mips cc. ++ ++ * tm-mips.h (INIT_CUMULATIVE_ARGS, FUNCTION_ARG_ADVANCE, ++ FUNCTION_ARG, FUNCTION_ARG_PARTIAL_NREGS): Type CUMULATIVE_ARGS is ++ now a pointer to a structure instead of a structure, and storage is ++ allocated via alloca. ++ ++Thu Nov 29 22:03:57 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-vax.h (BLOCK_PROFILER, FUNCTION_BLOCK_PROFILER): New macros. ++ ++Tue Nov 27 12:03:36 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-hp9k320.h (STANDARD_STARTFILE_PREFIX): Don't alter if already set. ++ ++Tue Nov 27 12:28:45 1990 Michael Meissner (meissner at osf.org) ++ ++ * out-mips.c (function_arg, function_arg_advance): Pass single ++ precision floating point numbers to prototyped functions by assuming ++ only one word is passed rather than two unless the argument is ++ passed in a floating point register. This behavior matches the MIPS ++ C compiler. ++ ++ * tm-mips.h (CPP_SPEC): Add -D_MIPSEB -D_SYSTYPE_SYSV -D_LANGUAGE_C ++ to SGI's CPP_SPEC. ++ (MIPS_DEBUGGING_INFO): New macro. ++ (PUT_SDB_*): Write debug information to the temporary file that ++ buffers the text section, instead of using the current output file. ++ ++ * tm-iris.h (CPP_PREDEFINES): Move -D_LANGUAGE_C from CPP_PREDEFINES ++ to CPP_SPEC since it's in the compiler name space, -ansi should not ++ disable it. ++ ++Mon Nov 26 18:37:39 1990 Michael Meissner (meissner at osf.org) ++ ++ * mips.md (stack compressor peephole): Remove check against ++ stack_args_preallocated, since nobody sets it. ++ (anonymous add/subtract patterns): Explicitly use the assembler ++ temporary register if adding/subtracting a constant that won't fit ++ in 16 bits -- Silicon Graphics asm complains. ++ (fix_truncdfsi2, fix_truncsfsi2) Rewrite so that optimization of ++ repeated conversions of the same number do not generate an insn not ++ found error message (the generated insn was optimized to a gp->gp ++ register move inside of a parallel with a clobber of a hard fp ++ register). The new insns describe the machine more faithfully, and ++ allow things like clobbering the fp register containing the value, ++ if it is the last use rather than using a specific hard register. ++ (fixuns_truncsfsi2, fixuns_truncdfsi2): New patterns to ++ automatically convert {single,double} precision to unsigned. ++ (anonymous move df/sf patterns): Put the operands to mfc1 in the ++ order the assembler likes them (always put gp reg first, even if ++ moving from gp register to fp register). ++ (wild_insn): Remove bogus insn which is commented out. ++ (jump): Remove TARGET_PIC code for now. ++ ++ * out-mips.c (toplevel, function_epilogue, mips_asm_file_end, ++ mips_output_external): If optimizing for the global pointer, emit ++ all code after processing the entire program, rather than emitting ++ the code at the end of the function. Also, properly sized .extern's ++ are emitted for variables that are not defined in the current ++ module. This is because the MIPS assembler uses single pass ++ semantics, and will emit a 2 instruction sequence for externals it ++ doesn't know anything about, and GCC emits data definitions at the ++ end of the program. You can't just emit a properly sized .extern ++ either, because the assembler will complain if it sees an .extern ++ followed by a definition. The ADDRESSABLE bit in the identifier ++ node for the external name is used to indicate whether a definition ++ for the name exists or not. This replaces code which told the ++ assembler to preprocess the source, and include the same source ++ twice. ++ (sym_lineno): Add a new variable to keep trace of labels emitted ++ after each .loc for Silicon Graphics. ++ (function_prologue, function_epilogue, toplevel): Explicitly use ++ temporary registers for stack frames > 32K, since the Silicon ++ Graphics system doesn't automatically use $at if the value overflows, ++ also save an instruction or two for large stack frames. ++ (init_cumulative_args): Fix to work with the method types G++ ++ produces as well as normal function types. ++ (compare_collect): In debug code, print the mode symbolically. ++ (trace): Take two additional arguments which are passed to fprintf. ++ (override_options): Remove unsupported -mpic code. ++ ++ * tm-decstatn.h (toplevel): Add a GNU copyright. ++ ++ * tm-iris.h (toplevel): Add a GNU copyright. ++ (CPP_SPEC): If -ansi, define __EXTENSIONS__. ++ (SGI_TARGET): Define this for other mips files. ++ (LABEL_AFTER_LOC): New macro to put a label after .loc. ++ (SET_FILE_NUMBER): New macro to force .file/.loc file # to be 1. ++ (ADJUST_STACK_SIZE): Don't deal with variable arguments. ++ ++ * tm-mips.h (*_SPEC): Add #ifdef's so other files can define their ++ own, without #undef. ++ (LINK_SPEC, ASM_SPEC): Pass -EB/-EL to assembler, linker so cross ++ compilers can be made from little endian mips to big endian mips and ++ vica versa. Generate an error message if the wrong flag is used. ++ Do not pass -EB/-EL to Silicon Graphics assembler/linker. ++ (CPP_SPEC, MACHINE_NAME): Add Silicon Graphics defaults. ++ (MIPS_TEMP?_REGNUM): New macros for temporary registers used in the ++ prologue and epilogue if the stack frame is > 32K. ++ (ASM_OUTPUT_LABEL): If optimizing the global pointer, set the ++ addressable bit in the indentifier node, so that mips_asm_file_end ++ and mips_output_external can figure out if a particular identifier ++ really is external to the compiliation unit. ++ (ASM_OUTPUT_COMMON): Same change as ASM_OUTPUT_LABEL. ++ (ASM_OUTPUT_LOCAL): Same change as ASM_OUTPUT_LABEL. ++ (MACHINE_TYPE): Key off of OSF_OS and SGI_TARGET macros. ++ (TARGET_DEFAULT): For OSF/1 make -mgas and -G 0 default. ++ (STACK_POINTER_OFFSET): Define as 0. ++ (external variables): Declare flag_omit_frame_pointer, ++ sdb_label_count, mips_section_threshold, and sym_lineno. ++ (STACK_ARGS_ADJUST): Protect with an #ifndef. ++ (FUNCTION_PROFILER): Talk to the MIPS profiling routines the same ++ way the MIPS compiler does. ++ (INDIRECTABLE_ADDRESS_P): Allow disp+reg in addition to reg+disp. ++ (ASM_FILE_START): If optimizing for the global pointer, create a ++ temporay stream to hold text until program ends. Put gcc_compiled. ++ in the data section. ++ (ASM_DECLARE_FUNCTION_NAME): Switch file streams used to the text ++ stream if optimizing for the global pointer. ++ (ASM_FILE_END): New macro to invoke mips_asm_file_end function. ++ (ASM_OUTPUT_SOURCE_LINE): Invoke macro LABEL_AFTER_LOC after .loc, ++ so that Silicon Graphics can put out a label after each .loc. ++ (ASM_OUTPUT_SOURCE_FILENAME): Invoke macro SET_FILE_NUMBER to set ++ the file number, so Silicon Graphics can hardwire this to 1. ++ (LABEL_AFTER_LOC, SET_FILE_NUMBER): Provide defaults if not Silicon ++ Graphics. ++ (ASM_OUTPUT_ASCII): Assign parameter to local variable, and remove ++ special \a, \v support. ++ (ASM_OUTPUT_IDENT): Dump #ident directives into .data. ++ ++Mon Nov 26 16:50:57 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (main): Handle -w. ++ (warning): Do nothing if -w. ++ * gcc.c (compilers): Pass -w to cpp. ++ ++Sun Nov 25 16:37:10 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (emit_push_insn): Don't pad at all if space already allocated ++ and padding is upward. ++ ++ * gcc.c (do_spec_1): Handle %W{...}. ++ (compilers): Use %W{...} when passing -o option. ++ ++Sat Nov 24 16:50:11 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * va-mips.h (va_list): Don't typedef if _VA_LIST_ is defined. ++ ++Wed Nov 21 15:57:48 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (expand_expr, expand_assignment): ++ Check for TREE_THIS_VOLATILE in ARRAY_REF. ++ expand_assignment failed to handle volstruct at all. ++ ++Tue Nov 20 17:47:22 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * out-sparc.c (output_fp_move_double): Handle reg+reg address ++ when moving each word separately. ++ ++ * ns32k.md (addsi3): Don't use `addr' for very large displacements. ++ ++ * recog.c (address_operand): Don't allow volatile mem as indirect. ++ ++Mon Nov 19 14:55:44 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * out-sparc.c (output_fp_move_double): Don't assume arrays are aligned. ++ ++Sun Nov 18 19:21:10 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (emit_push_insn): set extra to 0 once the padding is done, ++ to avoid padding twice. ++ ++Thu Nov 15 21:56:07 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * math-68881.h (HUGE_VAL): Add extra braces on Sun. ++ ++Wed Nov 14 14:30:29 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Don't ignore prototype if -traditional. ++ ++Tue Nov 13 18:16:47 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * out-i860.c (output_block_move): Move .Lm%3 down one insn. ++ ++Wed Nov 7 00:01:18 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-parse.y (component_decl_list): Allow missing semi at end. ++ ++Tue Nov 6 20:49:57 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (expand_builtin): For ffs, use mode of operand. ++ ++ * xm-iris.h (alloca): Don't define it. ++ * tm-iris.h (CPP_SPEC): Define variant symbols starting with _. ++ Define __EXTENSIONS__. ++ ++ * config.gcc (editing .gdbinit): Search current dir, not just srcdir. ++ ++Sun Nov 4 12:55:03 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * i386.md (extend*): Take out last change. ++ Unix assembler rejects movsx... ++ ++ * expr.c (expand_expr): Special case for ignored volatile ++ failed to return. ++ ++Fri Nov 2 15:30:48 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * va-i860.h (_VA_LIST): New macro avoids duplicate typedefs. ++ ++ * gnulib2.c (__builtin_saveregs): Add version for i860. ++ ++ * out-i860.c (output_block_move): Rearrange the copy loop. ++ Now uses two labels and a more complicated lead-in. ++ ++Thu Nov 1 18:15:11 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * config.gcc (sun3, etc.): Assume os4 as default for Sun 3 and Sun 4. ++ ++ * math-68881.h (HUGE_VAL): Alternate definition for Suns. ++ ++ * tm-i386v.h (STARTFILE_SPEC, LIB_SPEC): Handle -posix. ++ (CPP_SPEC): New macro. ++ (LIB_SPEC): Handle -shlib. ++ ++Wed Oct 31 22:12:33 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * config.gcc (ultrix): New alternative. ++ ++ * i386.md (extend*): Change opcode to movsx. Was movs. ++ ++Tue Oct 30 17:03:46 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-aix386.h (ASM_FILE_START): Don't do .noopt or .optim. ++ ++ * cccp.c (make_definition): Convert newline to newline-newline. ++ ++Mon Oct 29 11:43:46 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * fixincludes: Fix missing semi in rusers.h. ++ ++Sun Oct 28 17:23:50 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (macarg1): Don't skip the char after */. ++ ++ * Makefile: Put an `else' in every shell `if'. ++ ++ * m68k.md (zero-extend QI): Use gen_rtx, not change_address. ++ ++ * Makefile (USER_H): List va-*.h explicitly. ++ (toplev.o): Depend on RTL_H. ++ (expr.o): Depend on typeclass.h. ++ (stamp-*): Depend on move-if-change. ++ (install): Depend on various header files and gcc.1. ++ (gcc.o): Depend on gvarargs.h and obstack.h. ++ ++ * i860.md (movsf): Handle moving CONST_DOUBLE to cpu reg. ++ ++Fri Oct 26 11:16:03 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * Makefile (libg): Add else to the if. ++ ++Thu Oct 25 21:17:05 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * integrate.c (access_parm_map): Handle refs to all words of DF reg. ++ ++Wed Oct 24 13:50:13 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-typeck.c (build_array_ref): Use main variant for value type. ++ ++ * expr.c (expand_expr): For ARRAY_REF, preserve const and volatile. ++ ++ * cccp.c (macarg1): Skip the */ that ends a comment. ++ ++ * cccp.c (rescan): Use newline_fix testing for comments before #. ++ (handle_directive): Likewise, in comments before directive name. ++ (rescan): Process macro when terminated by comment. ++ Ignore backslash-newline in C++ comment. ++ ++Tue Oct 23 20:35:13 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (collect_expansion): Remove newline from error message. ++ Error for ## at beginning or end of definition. ++ ++ * m68k.md (zero-extend QI): When pushing, store value at 1(sp). ++ ++Mon Oct 22 13:07:31 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (rescan): In the loop that handles numbers, discard \newline. ++ ++ * cccp.c (S_ISREG): Fix typo: do use the argument. ++ ++ * xm-sparc.h (alloca.h): Don't include if alloca already defined. ++ ++Sun Oct 21 16:28:04 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * reload.c (find_equiv_regs): Reject reg that overlaps goal. ++ ++ * expmed.c (extract_bit_field): For big fields, make sure ++ value really goes in the target. ++ ++Fri Oct 19 13:21:25 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * fold-const.c (split_tree): Use NEGATE_EXPR to negate *conp. ++ ++ * expr.c (emit_push_insn): Allow const0_rtx for multi-word constant. ++ ++Thu Oct 18 17:38:17 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * reload1.c (choose_reload_regs): Cast reg class used as index. ++ ++Wed Oct 17 00:21:25 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * stmt.c (push_structure_value, pop_structure_value): New fns. ++ * expr.c (expand_call): Use them if structure value needed. ++ ++ * gcc.c (do_spec_1): Null-terminate error message. ++ ++ * sdbout.c (sdbout_symbol): Handle subreg as DECL_RTL. ++ This happens for vars from the parms of inline functions. ++ * dbxout.c (dbxout_symbol): Likewise. ++ ++Tue Oct 16 13:22:05 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expmed.c (extract_bit_field, store_bit_field): ++ Handle fields wider than a word. ++ Restrict special case for word-sized field to aligned words. ++ ++ * stddef.h (size_t): Also inhibit if _SIZE_T_. ++ ++ * cccp.c (macarg1): If traditional, let backslash quote always. ++ ++ * fixincludes (CTRL): Don't put quotes around a quote. ++ ++Sun Oct 14 21:28:32 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * flow.c (life_analysis): No hard regs for any pseudos live at setjmp. ++ ++ * c-decl.c (duplicate_decls): Don't suppress warning for fn defn ++ after implicit declaration, if fn has already been defined. ++ ++Thu Oct 11 13:15:36 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (saveregs_value): New variable. ++ (init_expr): Init the variable. ++ (expand_builtin): Don't call __builtin_saveregs twice in one function. ++ ++ * va-*.h: Rename all structure fields to start with __. ++ * va-pyr.h: Rename variables also. ++ (va_start): Delete the unmatched {. ++ (va_end): Now a nop. ++ ++Wed Oct 10 22:01:59 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * va-sparc.h (__va_ctl): Rename fields to start with __. ++ ++Tue Oct 9 14:47:53 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * flow.c (propagate_block): Include NOTE at end of block in scan. ++ ++ * fixincludes: Fix missing semicolon in rstat.h. ++ ++Mon Oct 8 13:09:40 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * loop.c (eliminate_biv): Handle mult_val < 0 by reversing compare. ++ ++ * cccp.c (main): Handle .S when removing suffix for deps output. ++ ++Sun Oct 7 23:33:24 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-i386v.h (STARTFILE_SPEC): Handle -p here. ++ (LIB_SPEC): Not here. ++ ++Sun Sep 30 21:35:52 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * print-tree.c (print_node_brief): Declare i for printing REAL_CST. ++ ++Sat Sep 29 18:40:08 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * fixincludes: For link pointing outside /usr/include, ++ use $x rather than $dest. ++ ++Wed Sep 26 12:44:54 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-mips-news.h: New file. ++ ++ * out-i860.c (output_size_for_block_move): Don't decrement. ++ (output_block_move): Decrement initial storing address instead. ++ ++ * c-parse.y (yylex): Always try unsigned int if `u' is written. ++ ++ * tm-seq386.h (LINK_SPEC): Define it. ++ ++ * c-typeck.c (build_unary_op): Don't let &* make an lvalue. ++ ++Sun Sep 23 14:59:21 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (S_ISREG): Define it unless overridden. ++ (main, finclude): Use that. ++ ++ * reload1.c (reload): If insn after a function call uses the ++ function value, and that reg is spilled, and the insn might ++ use it for reloading, add an extra need. ++ (reload_as_need): Detect such insns for new arg to choose_reload_regs. ++ (choose_reload_regs): In that case, don't choose function value reg. ++ ++ * tm-convex1.h, tm-convex2.h (CPP_SPEC): Define __NO_INLINE_MATH. ++ ++Sat Sep 22 14:01:00 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tree.c (build_index_type): Don't hash variable-bound type. ++ ++ * tm-aix386.h (LIB_SPEC): Different library name for -p. Always -lc. ++ (LINK_SPEC): Don't pass -lg or -g. ++ (CPP_PREDEFINES): Define _I386 and _AIX; don't define unix. ++ (SDB_DEBUGGING_INFO): Define it. ++ (DBX_DEBUGGING_INFO): Undefine it. ++ (ASM_FILE_START): Output .noopt if not optimizing. ++ (PCC_BITFIELD_TYPE_MATTERS): Define it. ++ (FUNCTION_PROFILER): Add definition. ++ ++Thu Sep 20 13:16:39 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-hp9k320.h (PROFILE_BEFORE_PROLOGUE): Define it. ++ (FUNCTION_PROFILER): Don't redefine if not HPUX_ASM. ++ ++Tue Sep 18 22:46:02 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * sdbout.c (sdbout_one_type): Don't output undefined structs, etc. ++ ++Mon Sep 17 13:35:45 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * mips.md (movdf): Move words in opposite order if overlap. ++ ++Sun Sep 16 16:27:29 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * toplev.c (rest_of_decl_compilation): Output TYPE_DECL here for sdb ++ only if top_level. ++ ++ * expr.c (expand_builtin): Error for __builtin_nextarg ++ if function definition doesn't have `...'. ++ ++ * c-typeck.c (build_conditional_expr): Don't skip arg promotion. ++ ++Fri Sep 14 17:26:59 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * sdbout.c (plain_type_1): Save up array dims on the way out ++ in the reverse order. ++ (plain_type): Print the innermost ones, reversing them. ++ ++Thu Sep 13 16:00:05 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * gstdarg.h: New name for stdarg.h. ++ * Makefile (install): Rename gstdarg.h while installing it. ++ ++ * fixincludes: Discard `.' from value of `files'. ++ ++ * sdbout.c (PUT_SDB_LAST_DIM): Get rid of SDB_DELIM. ++ (plain_type): Output accumulated array dims and size. ++ (plain_type_1): Eliminate arg NOSIZE. Save up dims and size. ++ Call self rather than plain_type for pointers and functions. ++ (sdbout_array_type, sdbout_array_depth): Functions deleted. ++ ++Wed Sep 12 18:47:30 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expmed.c (expand_divmod): Use divmod insn for divide if appro. ++ ++Tue Sep 11 13:24:58 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * gnulib.c (_bb_init_func): Library member now named _bb. ++ ++Mon Sep 10 13:07:39 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * sdbout.c (plain_type_1): New argument NOSIZE. Inhibits size output. ++ (sdbout_array_type): Call plain_type_1 directly; set NOSIZE. ++ ++ * sdbout.c (sdbout_array_type): New argument DEPTH. ++ Don't output more than SDB_MAX_DIM dimensions. ++ (sdbout_array_depth): New function. ++ (plain_type_1): Start DEPTH by calling sdbout_array_depth. ++ ++Sun Sep 9 18:05:56 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-mips.h (CPP_SPEC): Error for -EL and -EB. ++ ++ * sdbout.c (plain_type_1): Test KNOWN_TYPE_TAG with TREE_ASM_WRITTEN. ++ (sdbout_symbol): Call sdbout_one_type before the switch. ++ (sdbout_field_types): Look at targets of pointers. ++ (sdbout_one_type): Call sdbout_field_types. ++ ++ * stor-layout.c (layout_record): Update size_unit adding var to var. ++ ++ * tm-i386v4.h: New file. ++ ++Fri Sep 7 13:10:24 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (STDC_VALUE): New macro, defaulting to 1. ++ (intialize_builtins): Use that. ++ ++ * print-tree.c (print_node): Correct first_rtl for SAVE_EXPR. ++ ++ * m68k.md (movqi): `st' does not set cc's. ++ ++Wed Sep 5 16:18:04 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * Makefile (includes): Use proper directory. ++ ++Tue Sep 4 13:01:37 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-decl.c (store_parm_decls): Let extra_warnings control ++ warnings about parms not declared. ++ ++ * local-alloc.c (block_alloc): Don't try to lower qty_birth ++ if reg_qty is negative. ++ ++ * flow.c (life_analysis): Move code to detect stack-adjust insns. ++ It was unreachable. ++ ++ * reload1.c (reload): Don't complete group with explicitly used reg. ++ ++Mon Sep 3 14:37:41 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * Makefile (RANLIB): Don't specify the directory. ++ ++ * local-alloc.c (reg_classes_overlap_p): Cast enums to ints. ++ ++Fri Aug 31 17:09:38 1990 Michael Meissner (meissner at osf.org) ++ ++ * mips.md (anonymous add insn before addsi3): Allow offsets from the ++ frame pointer to be >16 bits, just like the stack pointer. This is ++ to prevent insn's not found generated when optimizing programs that ++ have stack frames more than 32K, and the optimizer wants to load the ++ address of an array into a register, it does so by generating a PLUS ++ insn with the appropriate offset. This PLUS insn is never checked ++ to see if the machine can handle the offset. ++ (anonymous subtract insn before subsi3): same change as above. ++ (addsi3): Don't accept large constants with a !n constraint. Just ++ reject any large constants, the anonymous add pattern before addsi ++ will catch references to the stack and frame pointers. ++ (subsi3): Same change as addsi3. ++ ++Sat Sep 1 16:14:31 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * expr.c (convert_move): Don't forget to set `target'. ++ ++Fri Aug 31 14:37:36 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * sdbout.c (sdbout_begin_block): Delete excess arg to sdbout_block. ++ ++Wed Aug 29 17:01:55 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * local-alloc.c (combine_regs): Don't combine regs if classes ++ fail to overlap usefully, if either reg says preferred or nothing. ++ (reg_classes_overlap_p): New function. ++ ++Tue Aug 28 21:28:54 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * sdbout.c (plain_type_1): Output .dim X,Y...; for multi-dim array. ++ (sdbout_array_dim): New recursive subroutine. ++ (PUT_SDB_DIM): Macro eliminated. ++ (PUT_SDB_START_DIM, PUT_SDB_NEXT_DIM, PUT_SDB_LAST_DIM): New macros. ++ * tm-3b1.h: Override PUT_SDB_START_DIM. ++ ++Sun Aug 26 21:28:20 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cccp.c (make_definition): Eliminate any backslash-newline. ++ ++Sat Aug 25 17:20:47 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * tm-att386.h (EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS): New macros. ++ (BSS_SECTION_ASM_OP): New macro. ++ (ASM_OUTPUT_LOCAL): Call bss_section, don't just print .bss. ++ ++Fri Aug 24 17:16:28 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * cse.c (rtx_cost): Cost of MEM depends on number of words. ++ ++ * i860.md (movsf, movdf): Allow moving G to m in constraints. ++ * tm-i860.h (CONST_COSTS): Make SFmode constant cheaper. ++ ++Thu Aug 23 14:19:20 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-typeck.c (digest_initializer): No pedantic warning for string ++ and array of unsigned char. ++ ++ * tree.c (get_identifier): Do id_clash_len stuff if length equals that. ++ ++Wed Aug 22 15:06:11 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * loop.c (scan_loop): Don't use REG_EQUAL notes as invariants ++ unless they come with REG_RETVAL notes. ++ ++Tue Aug 21 20:03:51 1990 Michael Meissner (meissner at osf.org) ++ ++ * Makefile (install): Add code to build libg.a if it doesn't exist ++ when installing GCC. ++ ++ * out-mips.c (toplevel): add external declaration for asm_out_file, ++ and 2 new FILE *'s (asm_out_data_file, asm_out_text_file) so we can ++ switch between two files when optimizing for the global pointer. ++ Also add a structure type to hold the linked list of externs that ++ GCC wishes to emit. ++ ++ Everything between the function prologue and epilogue are written to ++ a temporary file, which is written to the normal output file after ++ the entire program is processed. This is needed because the MIPS ++ assembler assumes that all externals should be referenced with a 2 ++ instruction sequence instead of the faster 1 instruction sequence ++ off of the GP, unless a proper .extern proceeds any use. We can't ++ emit the .extern because the assembler will complain if later there ++ is a definition for the variable, such as GCC puts out at the end of ++ the program. ++ ++ (compare_collect): print mode symbolically in debug code. ++ ++ (mips_output_external): Remove code which used the preprocessor to ++ handle the global pointer, and remember all externs in a linked list ++ for use at the end of the program. ++ ++ (mips_asm_file_end): If optimizing the global pointer, emit all ++ externals which don't have definitions as the appropriate sized ++ .extern, and then emit the code for functions that was written to a ++ temporary file, so that the code comes after the appropriate ++ definition or declaration. ++ ++ (function_epilogue): If optimizing for the global pointer, switch ++ the current output file to the data file after all of the epilogue ++ is written out. ++ ++ * tm-mips.h (ASM_SPEC): Duplicate ASM_SPEC into 2 #ifdef sections (one ++ for the little endian DECstation, and the other for everybody else ++ who uses the MIPS in a big endian mode), and pass the appropriate ++ -EL and -EB switches to the assembler. This allows building a cross ++ compiler for a different endian MIPS. ++ ++ (LINK_SPEC): Pass -EL and -EB to linker, just like ASM_SPEC. ++ ++ (MACHINE_TYPE): For DECstation, specify "Ultrix Dec Mips" instead of ++ just "Dec Mips". ++ ++ (FUNCTION_PROFILER): Call _mcount in the appropriate MIPS fashion. ++ ++ (ASM_FILE_START): If optimizing for the global pointer, open a ++ temporary file to write the code to (see out-mips.c above). ++ ++ (ASM_DECLARE_FUNCTION_NAME): If optimizing for the global pointer, ++ switch the current output file to asm_out_text_file. ++ ++ (ASM_OUTPUT_COMMON): Remove the old code which used the preprocessor ++ to optimize for the global pointer. ++ ++Tue Aug 21 17:44:49 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * make-cc1.com: Compile and link version.c. ++ ++ * expr.c (convert_move): Handle expand_unop retval not same as target. ++ ++ * reload.c (find_reloads): For register letters, don't win if BLK. ++ ++ * flow.c (mark_set_1, mark_used_regs): Update reg_first_use. ++ (allocate_for_life_analysis): Allocate and clear it. ++ * local-alloc.c (block_alloc): Calculate INSN_MAP. ++ Get first use of each reg from reg_first_use. ++ ++ * tm-vms.h (MAYBE_VMS_FUNCTION_PROLOGUE): Distinguish C from C++. ++ (EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS): Add a const data section. ++ (ASM_OUTPUT_EXTERNAL): Use that section. ++ (SELECT_SECTION): Go to that section when appropriate. ++ ++Mon Aug 20 13:00:53 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * gcc.c (process_command): Split -oFOO into two arguments. ++ ++ * out-mips.c, tm-mips.h: Changes by Meissner. ++ ++ * stmt.c (expand_asm_operands): Handle COMPONENT_REF and ++ ARRAY_REF directly as output operands. Avoids crash if BLKmode. ++ ++ * tm-i386vgas.h: New file, copied from tm-i386gas.h. ++ (ASM_OUTPUT_LABELREF): Eliminate leading underscores. ++ (STARTFILE_SPEC, LIB_SPEC): Define as in tm-i386v.h. ++ (PCC_BITFIELD_TYPE_MATTERS): Likewise. ++ * config.gcc (i386-sysv-gas): Use the new file. ++ ++ * tm-i860.h (PRINT_OPERAND): Convert double to float ++ for SFmode operand. ++ (PRINT_OPERAND_EXTRACT_FLOAT): New macro. ++ ++Sun Aug 19 17:23:10 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * c-parse.y (lineno): Delete definition--it's in toplev. ++ ++ * output.h: Make all variables extern. ++ ++ * tm-hp9k320bsd.h (CPP_SPEC): Def __HAVE_68881__ like __HAVE_FPU__. ++ ++ * fixincludes: Handle uses of _IO* followed by spaces. ++ Change redirections for cd when testing that directory exists. ++ ++Thu Aug 16 22:44:35 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * out-sparc.c (output_scc_insn): Clear CC_IN_FCCR after ++ operation since setting a register to the result of a ++ floating-point comparision affects the INTEGER condition code ++ register. ++ ++ * stmt.c: fixup_gotos must ignore blocks started after the goto. ++ (block_start_count): New variable, and slot in some structures. ++ (expand_function_start): Initialize it. ++ (expand_start_bindings): Increment it and store in struct nesting. ++ (expand_goto): Store it in struct goto_fixup. ++ (fixup_gotos): Compare fixup's count with block's count. ++ ++Wed Aug 15 16:46:04 1990 Richard Stallman (rms at mole.ai.mit.edu) ++ ++ * out-i860.c (output_size_for_block_move): Do subtract ALIGN. ++ ++Mon Aug 13 17:45:13 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-i860.h (GO_IF_LEGITIMATE_ADDRESS): Typo testing offset alignment. ++ ++ * config.gcc (sun3-mach): New alternative. ++ * tm-sun3mach.h: New file. ++ ++ * m68k.md (bfextu patterns): Set CC_NOT_NEGATIVE. ++ ++Sun Aug 12 14:25:23 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tree.h (enum built_in_function): Delete comma after last name. ++ * c-parse.h (enum rid): Likewise. ++ * expr.h (enum optab_methods): Likewise. ++ ++ * config.gcc (genix): Set target_machine. ++ * tm-genix.h (ASM_OUTPUT_DOUBLE): New overriding definition. ++ ++Thu Aug 9 15:19:17 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-hp9k320.h (CPP_SPEC): Define _HPUX_SOURCE if not ANSI. ++ (CPP_PREDEFINES): Don't define it here. ++ Do define alternatives with __ prepended. ++ ++ * tm-mips.h (CPP_SPEC): Don't do -I if -nostdinc. ++ ++Wed Aug 8 13:35:00 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (do_define, do_undef): Warn if macro name is `defined'. ++ ++ * tm-mips.h (ASM_INT_OP): Add missing space. ++ ++ * tm-sun386i.h (ASM_IDENTIFY_GCC): If profiling, put a NOP after ++ gcc_compiled. ++ ++Tue Aug 7 12:19:46 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-mips.c (need_ent_after_loc): Variable deleted. ++ (function_prologue): Output initial .ent and initial label. ++ * tm-mips.h: Add extern declarations. ++ (ASM_SPEC): No -nocpp if optimizing. ++ (STACK_ARGS_ADJUST): Round size up to 16. Nothing else. ++ (PRINT_OPERAND_ADDRESS): Eliminate irrelevant things ++ such as scaled indexing. ++ (ASM_OUTPUT_SOURCE_FILENAME): Simplify code. ++ (ASM_OUTPUT_SOURCE_LINE): Flush code to handle need_ent_after_loc. ++ (ASM_DECLARE_FUNCTION_NAME): Likewise. ++ (*_SECTION_ASM_OP): Delete the \n. ++ ++ * pyr.md (extendsfdf2, truncsfdf2, float*, fix*): Use `&'. ++ ++Mon Aug 6 12:46:07 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Don't warn if initialized fcn is extern. ++ (start_decl): Don't warn at all for initialized extern. ++ ++ * final.c (final_start_function): Handle PROFILE_BEFORE_PROLOGUE. ++ (profile_function): New subroutine. ++ ++ * tm-i386sco.h: New file. ++ * config.gcc (i386-sco): New alternative. ++ ++Sun Aug 5 12:36:46 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (layout_record, layout_union): Test value of ++ PCC_BITFIELD_TYPE_MATTERS for being nonzero, if it is defined. ++ * tm-*.h: Define with value 1. ++ * tm-vax.h (PCC_BITFIELD_TYPE_MATTERS): Depends on -mvaxc-alignment. ++ ++ * proto.h: New file. ++ * Makefile.in (USER_H): Add that file. ++ ++ * loop.c (other_reg_use_p): Change && to || in test at beginning. ++ ++Fri Aug 3 00:18:35 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (ENDFILE_SPEC): New macro. ++ (do_spec_1): Handle %E. ++ (link_spec): Use %E. ++ ++ * xm-i386.h (alloca): Define without arg. ++ ++ * Makefile (RANLIB): New var, used in various places. ++ ++ * gnulib2.c (__bb_init_func): Add dummy function to prevent warning. ++ ++ * Makefile (install): Look for ranlib in both places. ++ (stage1, ...): Likewise. And run ranlib even after ln. ++ ++Tue Jul 31 23:59:45 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-encore.h (FUNCTION_PROFILER): Override, putting `.' in label. ++ ++Mon Jul 30 13:52:45 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gnulib2.c (__floatdidf): Fix typo. ++ ++Sun Jul 29 16:05:27 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-vms.h (ASM_OUTPUT_EXTERNAL): Check TREE_READONLY. ++ ++ * xm-vms.h (alloca): Use built-in alloca. ++ ++Fri Jul 27 15:07:00 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (subst): Handle (ASHIFT 1 x) in (EQ (AND ... y) 0) ++ only if little-endian. ++ ++Thu Jul 26 17:22:56 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-mips.h (ASM_OUTPUT_SOURCE_LINE): Delete pic stuff (was for v2). ++ ++ * fold-const.c (rshift_double): Reset carry after each shift of ++ one bit. ++ ++Wed Jul 25 16:21:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-vms.h (ASM_OUTPUT_EXTERNAL): Use assemble_name. ++ ++Tue Jul 24 15:35:04 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (build_binary_op_nodefault): Allow compare of any ++ pointer with const void *, etc. ++ ++ * reload1.c (reload): Don't use fixed reg or frame pointer in group. ++ ++ * c-decl.c (grokdeclarator): Error for initialized parm. ++ ++Mon Jul 23 14:33:53 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (install): chmod only the header files. ++ ++Sat Jul 21 13:58:16 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (O_RDONLY): Define it if not defined. ++ ++ * c-decl.c (finish_decl): No error for nonstatic incomplete array. ++ ++Sat Jul 14 14:59:33 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (compilers): Pass -P to cpp. ++ ++ * tm-mips.h (ASM_OUTPUT_SOURCE_LINE): Handle TARGET_GAS, TARGET_PIC. ++ ++Thu Jul 12 12:28:16 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (layout_record): Handle BITFIELD_NBYTES_LIMITED. ++ ++ * stmt.c (group_case_nodes): Don't group across an overflow. ++ ++ * combine.c (subst, case LSHIFT): Use gen_lowpart_for_combine. ++ ++Wed Jul 11 15:17:32 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (subst, case LSHIFT): ++ Fix condition for (lshift ... (sign_extend ...)). ++ ++Tue Jul 10 17:02:54 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (pushdecl): No shadow warning if TREE_INLINE is set. ++ * integrate.c (copy_parm_decls): Set TREE_INLINE in the copies. ++ (copy_decl_tree): Likewise. ++ ++ * c-parse.y (yylex): Terminate token_buf after integer. ++ ++Mon Jul 9 16:56:55 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_call): Don't check args[i].partial when bumping ++ negative args_size up to 0. ++ ++ * sparc.md (call recognizers): Don't allow address arithmetic. ++ ++Sun Jul 8 14:22:22 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (build_c_cast): Reinsert missing default_conversion call. ++ ++ * gnulib.c (__bb_init_func): Ensure this defines >=1 symbol. ++ ++Fri Jul 6 12:28:44 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (build_indirect_ref): ++ No error if result is incomplete array. ++ ++ * m68k.md (casesi2 recognizer): Handle new ASM_RETURN_CASE_JUMP macro. ++ ++ * expmed.c (store_bit_field, extract_bit_field): New arg TOTAL_SIZE. ++ Don't extract a bigger unit from memory than this. ++ * expr.c: Callers changed. ++ (store_field): New arg TOTAL_SIZE; callers changed. ++ ++ * xm-ns32k.h: Use built in alloca. ++ * ns32k.md (movsf): Output float constants only if GAS_SYNTAX. ++ (call, call_value): Support JSR_ALWAYS. ++ Change handling of bsr for GAS_SYNTAX. ++ ++Thu Jul 5 15:05:19 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * mips.md (divdf3): Fix spacing in output. ++ (movdf): Fix bad output storing CPU regs into memory. ++ * out-mips.c (function_prologue): Bug testing fmask. ++ (function_epilogue): Bug in spacing in output. ++ ++ * c-typeck.c (build_conditional_expr): Handle ((void *) 0). ++ Allow 0 versus function pointer. ++ ++Tue Jul 3 21:43:40 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (finish_struct): Lay out any array typedefs now completed. ++ (layout_array_type): New function. ++ (grokdeclarator): Don't warn for incomplete array in typedef. ++ ++ * tm-*.h (ASM_OUTPUT_COMMON): Use %u, not %d. ++ (ASM_OUTPUT_LOCAL, ASM_OUTPUT_SKIP): Likewise. ++ ++Mon Jul 2 12:07:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i386.md (tstsf): Clobber reg 0 in SImode. ++ ++Sun Jul 1 14:28:58 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stddef.h: Check __SIZE_T also. ++ ++ * toplev.c: Include types.h first. ++ ++ * i386.md (trunc*2): Don't allow moving symbolic constant to memory. ++ Use wider move only for symbolic constant. ++ ++ * tm-convex.h (LINK_SPEC): Posix link flags. ++ * tm-convex.h (STARTFILE_SPEC): Posix start files. ++ * tm-convex[12].h (CPP_SPEC): Posix defines. ++ * tm-convex[12].h (LIB_SPEC): Posix libraries. ++ * tm-conv[12]os7.h: New files. ++ * config.gcc: use tm-conv*os7 if /usr/include/stdlib.h isn't there. ++ ++ * xm-convex.h (S_IFMT, S_IFREG): make visible if hidden for posix. ++ * xm-convex.h (_PROTO): define to keep 8.0 includes from screwing up. ++ ++ * tm-convex.h (ASM_OUTPUT_{FLOAT,DOUBLE}, PRINT_OPERAND): ++ use %e instead of %#g, which is broken or non-posix. ++ ++ * tm-convex.h (current_section_is_text): make extern. ++ * out-convex.c (current_section_is_text): define here. ++ * tm-convex.h (OVERRIDE_OPTIONS), out-convex.c (override_options): ++ useless; remove. ++ * tm-convex.h (CPP_PREDEFINES): remove parsec, long gone from ++ system includes. ++ ++Fri Jun 29 12:42:16 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-vax.h (LEGITIMATE_CONSTANT_P): Fix typo. ++ ++ * out-mips.c (function_arg_partial_nregs): Round size up to words. ++ ++Thu Jun 28 12:50:44 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cse.c (cse_insn): Replace src only with general_operand ++ unless moving to a register. ++ ++ * expr.c (expand_expr): Use assign_stack_local for constructors. ++ ++ * Makefile (STAGESTUFF): Change names of stamp files. ++ ++ * pyr.md (tstqi): Change comma to semicolon. ++ ++ * out-mips.c (init_cumulative_args): Fix name of debug_tree. ++ ++ * vax.md (movsi special case): Fix assembler syntax. ++ * tm-vax.h (LEGITIMATE_CONSTANT_P): Add missing backslashes. ++ * tm-ultrix.h (DOLLARS_IN_IDENTIFIERS): Define as 1. ++ ++Wed Jun 27 14:04:51 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (emit_move_insn): Force constants to mem only if predicate ++ fails. ++ * out-vax.c (supergeneral_operand): New function. ++ * vax.md (movsi): Use that predicate. ++ ++ * out-mips.c (function_prologue): Don't use sp_str in .frame. ++ Use sw rather than sd in cases 5 and 7. ++ ++Tue Jun 26 14:21:36 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * rtl.h (EXTERNAL_SYMBOL_P): New macro. ++ * varasm.c (make_decl_rtl): Set it if variable is external. ++ * tm-vms.h (NO_EXTERNAL_INDIRECT_ADDRESS): Define this. ++ * tm-vax.h (INDIRECTABLE_CONSTANT_ADDRESS_P): New macro. ++ Value depends on NO_EXTERNAL_INDIRECT_ADDRESS. ++ (INDIRECTABLE_ADDRESS_P, LEGITIMATE_CONSTANT_P): Value depends... ++ (NONINDIRECT_ADDRESS_P): New macro. ++ (GO_IF_NONINDEXED_ADDRESS): Use NONINDIRECT_ADDRESS_P sometimes. ++ * vax.md (movsi special case): New pattern for loading ++ illegitimate constants. ++ * out-vax.c (print_operand_address): Handle reg+(reg+const). ++ ++ * tm-sparc.h (LINK_SPEC): Delete spurious `-'. ++ * tm-sun386i.h (LINK_SPEC): Define it, handling -Bstatic and aliases. ++ * tm-sun3.h (ASM_OUTPUT_FLOAT_OPERAND): Delete spurious `\n'. ++ (ASM_OUTPUT_DOUBLE_OPERAND): Likewise. ++ ++Mon Jun 25 18:45:51 1990 Michael Meissner (meissner at osf.org) ++ ++ * sdbout.c: If not on a COFF system, define COFF symbols by hand. ++ ++ * out-mips.c (legitimize_constant_expr): Delete unused function. ++ (output_load_immediate, addr_compensate): Delete unused functions. ++ (compare_restore): Redo code based on eliminating peepholes. ++ (function_prologue): New function, emit correct entry sequence. ++ (function_epilogue): New function, emit correct exit sequence. ++ Also output .ent, .frame, .mask, .fmask, and .end, for back tracing. ++ (mips_fix_frame_pointer): New function to eliminate frame. ++ (function_arg_partial_nregs, function_arg, function_arg_advance): ++ (init_cumulative_args): New funtions. ++ ++ * stdarg.h (va_arg): Alternate definition for mips. ++ * va-mips.h: Total rewrite. ++ These changes in tm-mips.h have not yet been done. ++ * tm-mips.h (ASM_OUTPUT_DOUBLE): Put floating point out in hex. ++ (ASM_OUTPUT_FLOAT): Put floating point out in hex. ++ (PRINT_OPERAND): Add 'D', 'L', and 'M' codes. ++ (STRUCTURE_SIZE_BOUNDARY): Set this to 8 for MIPS cc compatibility. ++ (CC1_SPEC): Add -O1 which is same as -O. ++ (CC1_SPEC): Add -O3 which is -O2 + -finline-functions. ++ (TARGET_SWITCHES): Use hex for options. ++ (TARGET_SWITCHES): Rename -munix to -mmips-as. ++ (TARGET_SWITCHES): Add -mgas as oppisite of -mmips-as. ++ (TARGET_SWITCHES): Add -mpic, -mpic-large-object (but no code yet). ++ (TARGET_SWITCHES): Make -mdebug* comments match reality. ++ (PROMOTE_PROTOTYPES): Define this macro. ++ (FIXED_REGISTERS): Allow $f0, $f2, and $f14 to be allocated. ++ (NO_LIBG): Define this macro. ++ (TARGET_VERSION): Be more specific about which vendors MIPS system. ++ (ASM_FILE_START): Call ASM_OUTPUT_SOURCE_FILENAME, print_options. ++ (ASM_OUTPUT_SOURCE_FILENAME): Emit correct .file directive. ++ (ASM_OUTPUT_SOURCE_LINE): Emit correct .loc directive. ++ (EXTRA_SECTIONS): Add rdata_section. ++ (SELECT_SECTION, SELECT_SECTION_MODE): Use .rdata if feasible. ++ (SDB_DEBUGGING): Define this, but only line #'s supported now. ++ (FRAME_POINTER_REQUIRED): Allow no frame ptr in leaf procedures. ++ (GO_IF_LEGITIMATE_ADDRESS): Don't allow REG+70000 as address. ++ (various): Use MIPS profiling (no _mcount). ++ (various): Add new macros to classify registers. ++ (NO_UNDERSCORES): Define this for G++. ++ ++ * mips.md (peepholes): Merge 4 peepholes, delete 24 unneeded ones. ++ Replaced with an anonymous pattern for a test insn. ++ (call_value): Change to a define_insn. ++ (movsi, movhi, movqi): Don't fall through at end, to avoid a warning. ++ (movsf special case for immediate args): Pattern deleted. ++ (movdf special case for immediate args): Pattern deleted. ++ (movsf, movdf): Use new macros to distinguish fp regs. ++ Add letter `y' to constraints. ++ (cmpsi): Allow arith_operand for second operand. ++ (hi and qi tests): Patterns deleted. ++ (jump): Handle TARGET_PIC. ++ (tablejump): Pattern moved. ++ (conditional branches): Align the comments that are output. ++ (call, call_value): Make predicates more specific. ++ Don't output any comments. ++ ++ * out-mips.c: Include flags.h. Include tree.h at beginning. ++ Define numerous variables counting things used in this compilation. ++ (my_print_rtx): Deleted. Callers use debug_rtx. ++ (output_load_immediate): Simply output an li instruction. ++ (print_options): Body rewritten. Now always defined, but body ++ is in an #if 0. ++ (abort_show_logged, my_print_insncode): Functions deleted. ++ (abort_with_insn): Now use `error' to print the message. ++ (mips_section_get): Function deleted. ++ (override_options): Update mips_section_threshold, once and for all. ++ ++Mon Jun 25 16:54:13 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (output_inline_function): Pass dummies for new args ++ to init_function_start. ++ ++ * stddef.h: Check _T_SIZE as well as _SIZE_T. ++ ++Sun Jun 24 17:15:34 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stmt.c (init_function_start): New args give file/line for first note. ++ * c-decl.c (store_parm_decls): Pass them. ++ * final.c (final_start_function): For sdb, don't output a line number, ++ just set last_linenum. ++ ++ * tm-att386.h (ASM_OUTPUT_LOCAL): Put it in .bss section. ++ ++Fri Jun 22 12:40:07 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (handle_directive): Always ignore empty directive. ++ ++ * tree.h (BUILT_IN_NEXT_ARG): Define it. ++ * c-decl.c (init_decl_processing): Declare __builtin_next_arg. ++ * expr.h (current_function_arg_offset_rtx): Declare it. ++ * stmt.c (assign_parms): Set that variable at end. ++ * expr.c (expand_builtin): Implement __builtin_next_arg. ++ * stdarg.h (va_start): Use __builtin_next_arg. ++ * function.c (push_function_context, pop_function_context): ++ Save and restore current_function_arg_offset_rtx. ++ * function.h (struct function): New field for this. ++ ++Wed Jun 20 15:26:16 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-apollo68.h (FUNCTION_ARG_PADDING): Never pad. ++ (STACK_BOUNDARY): Make it 32. ++ (CPP_SPEC): Add spaces. Define _APOLLO_SOURCE if not -ansi. ++ ++ * expr.c (expand_call): If have STACK_BOUNDARY and push insns, ++ compute stack_align when size is rounded, and use later ++ to push the space for the rounding. ++ ++Tue Jun 19 15:41:53 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * genextract.c (gen_peephole): Use sizeof (rtx), not UNITS_PER_WORD. ++ ++ * reload1.c (reload_inheritance_insn): New variable. ++ (reg_reloaded_insn): New variable. ++ (choose_reload_regs): Update those variables. ++ (emit_reload_insns): Use them to remove deaths from insns ++ that used input reloads. ++ (reload_as_needed): Clear reg_reloaded_insn when necessary. ++ ++Mon Jun 18 13:25:59 1990 Michael Meissner (meissner at osf.org) ++ ++ * mips.md (probe): Make a single insn, just a memref. ++ ++ * mips.md (ashlqi3, ashlhi3, one_cmplqi2, one_cmplhi2): Deleted. ++ (ashlsi3, ashrsi3, lshrsi3, neg*, one_cmplsi2): Simplified. ++ Don't output comments. Use more specific predicates. ++ ++ * mips.md (movsf, movdf): Use L, M codes to avoid #ifdef's. ++ Also simplify and don't output comments. ++ (anonymous patterns for those insns): Deleted. ++ (loading floating constant): New patterns added. ++ (move qi to si pattern): Deleted; ridiculous. ++ (movdi, movsi, movhi, movqi): No need to check for moving reg to self. ++ ++ * mips.md (nop): Use .set noreorder to placate assembler. ++ ++Sun Jun 17 01:19:26 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (stamp-*.c, stamp-*.h): Remove .c or .h from names. ++ ++ * tm-i860.h (GO_IF_LEGITIMATE_ADDRESS): Displacement must be multiple ++ of the alignment of the operand. ++ ++ * i860.md (signed bit field recognizers): Don't shift by >31 bits. ++ ++ * out-i860.c (output_delayed_branch): Pass register properly to ++ load_opcode. ++ ++ * sdbout.c (sdbout_symbol): Get right regno for var-length object. ++ ++ * c-decl.c (duplicate_decls): Types don't "match" if one is error. ++ ++ * cexp.y (yylex): Ignore carriage return. ++ * cccp.c (initialize_char_syntax): Likewise. ++ ++Sun Jun 17 01:19:26 1990 Michael Meissner (meissner at osf.org) ++ ++ * mips.md (general/fp reg move patterns): Use codes L, M, D. ++ (movdi): Likewise. And don't output useless comments. ++ Use the assembler temp reg for non-offsettable address. ++ (movsi, movhi, movqi): Output nothing for move from reg to itself. ++ Output li to load a constant. Use `move' instead of `add'. ++ Don't output useless comments. ++ (load-address pattern): Deleted; handled by addsi3 pattern. ++ ++ * mips.md (addsi3, mulsi3): Make both input predicates arith_operand ++ since they are commutative. ++ (andsi3, iorsi3, xorsi3): Likewise. ++ ++ * tm-mips.h (MOST_SIGNIFICANT_WORD, LEAST_SIGNIFICANT_WORD): New. ++ ++ * tm-mips.h (PRINT_OPERAND): New codes D, L, M. ++ * mips.md (anddi3, iordi3, xordi3): Use earlyclobber to stop overlap. ++ Use new print code D. ++ ++ * mips.md (andsi3, iorsi3, xorsi3): Make predicates more specific. ++ (andhi3, ..., andqi3, ...): Patterns deleted. ++ (patterns for nor): New anonymous patterns. ++ * out-mips.c (uns_arith_operand): New function. ++ ++ * mips.md (trunc*, zero_extend*, extend*, fix_trunc*, float*): ++ Use more specific predicates. ++ ++ * mips.md (addhi3, ..., addqi3, ...): Patterns deleted. ++ (addsi3, subsi3, mulsi3, divsi3): Make predicates more specific. ++ Delete useless comments from assembler code. ++ Use more generic op codes rather than special cases such as addiu. ++ (divmodsi4, udivmodsi4, udivsi3, modsi3, umodsi3): New patterns. ++ (abssf2, absdf2): New patterns. ++ ++Sat Jun 16 22:52:44 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (process_init_constructor): Handle unions. ++ (digest_init): Use that for union inits. ++ ++Wed Jun 6 19:20:20 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (move_movables): In insn-deleting loop, check p != 0. ++ ++Sun Jun 3 22:44:12 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Warn about extern with initializer. ++ ++Sat Jun 2 14:46:18 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Handle const and volatile with parm ++ specified as function type. ++ ++ * varasm.c (immed_real_const_1): Don't confuse -0.0 with 0.0. ++ ++ * tm-sun3.h (ASM_OUTPUT_FLOAT, ASM_OUTPUT_DOUBLE): Handle -0.0. ++ (ASM_OUTPUT_FLOAT_OPERAND, ASM_OUTPUT_DOUBLE_OPERAND): Likewise. ++ Note: Sun 4 (under SunOS 4) seems to work okay without this change. ++ Perhaps printf works better in that version. ++ ++Fri Jun 1 13:38:41 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_call): For const function, pop stack before and aft. ++ ++Thu May 31 12:59:28 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_call): Don't round stack block if size negative. ++ ++ * fold-const.c (fold): Preserve sign on constant when other terms ++ cancel (after call to split_tree). ++ ++Wed May 30 20:49:10 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (primary, fndef): Use YYFAIL, since YYERROR was changed. ++ ++ * out-m68k.c (output_move_double): Don't test HOST_WORDS_BIG_ENDIAN ++ since that only exists in version 2. ++ * tm-m68k.h (PRINT_OPERAND_EXTRACT_FLOAT): New macro wasn't mentioned. ++ Don't test HOST_WORDS_BIG_ENDIAN. ++ (PRINT_OPERAND_PRINT_FLOAT): New macro wasn't mentioned before. ++ (PRINT_OPERAND): Use them. ++ ++Tue May 29 21:35:23 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * optabs.c (expand_float): Don't use hard reg for intermediate result. ++ ++ * c-parse.y (yylex): Fix typo in handling of ERANGE. ++ ++ * sparc.md (tstdf, tstsf): Use a CLOBBER, not a USE, on f0. ++ ++ * sparc.md (eager branch peepholes): Fix typos. ++ * tm-sparc.h (OUTPUT_JUMP): Define this. ++ ++ * print-tree.c (print_lang_identifier): New function. ++ ++Sat May 26 13:42:04 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * sdbout.c (sdb_begin_function_line): Now -1 if not in use. ++ (sdbout_end_function): Set it to -1. ++ ++Fri May 25 00:18:29 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * print-tree.c: Total rewrite. ++ ++Thu May 24 21:26:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (macarg): When popping frame, free via free_ptr, not buf. ++ ++Tue May 22 21:41:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (finish_decl): Discard any variable sizes in the decl. ++ ++ * pyr.md (mulsi3, adddi3, ...): Use symmetrical predicates in ++ commutative patterns. ++ (tsthi, tstqi): Set CC_NO_OVERFLOW ++ * out-pyr.c (notice_update_cc): Don't do that here for ++ explicit cc-setting insns. ++ ++Sat May 19 12:41:44 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-i386gas.h (ASM_OUTPUT_ALIGN): Use log as arg to .align. ++ (ASM_OUTPUT_ALIGN_CODE): Likewise. ++ ++Wed May 16 16:09:47 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-pyr.h (FIXED_REGISTERS, CALL_USED_REGISTERS): ++ Reserve register lr15 as fixed, for test instructions. ++ * pyr.md (tsthi, tstqi): Use cvtXw into lr15 rather than test. ++ ++ * expr.c (expand_expr): Make sure a volatile value is referenced ++ even if value is ignored. ++ ++ * c-typeck.c (truthvalue_conversion): Result COND_EXPR gets type int. ++ (invert_truthvalue): Simplify COND_EXPR. ++ ++Tue May 15 16:51:41 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (complete_array_type): Compensate for wide string constants. ++ ++Mon May 14 15:31:07 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (combine_strings): Fix errors computing wide string length. ++ ++Sat May 12 15:17:37 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i386.md (trunc**): Use long move if source is constant. ++ * out-i386.c (PRINT_REG): Handle CODE == 'k'. ++ ++ * ns32k.md (signed bitfield extract): Don't output assembler comment. ++ ++Fri May 11 14:45:06 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-i860.h (ASM_OUTPUT_CASE_LABEL): Align to multiple of 4. ++ ++Thu May 10 23:43:31 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-i860.c (single_insn_src_p, strict_single_insn_src_p): ++ Correct conditions for needing multiple instructions. ++ (output_delayed_branch): Likewise. ++ ++Tue May 8 13:54:37 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-ultrix.h: New file. ++ ++Mon May 7 18:47:47 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i386.md (test... recognizers): Output symbolic constant first. ++ ++Sat May 5 12:18:05 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * rtlanal.c (dead_or_set_p): Compare register numbers, not addresses. ++ ++Thu May 3 16:56:43 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expmed.c (store_bit_field): Maximum size for loading mem struct ++ into reg comes from the mode of the value to be stored. ++ Alignment is no restriction if it matches BIGGEST_ALIGNMENT. ++ Always do the real work in SImode if couldn't use MEM. ++ (extract_bit_field): Likewise. ++ ++ * tm-sparc.h (PRINT_OPERAND): Handle new codes I and U. ++ * sparc.md (delay slot peepholes): Use them to handle CC_NO_OVERFLOW. ++ (negated jump recognizer): Likewise. ++ * sparc.md (addcc and subcc recognizers): Test for validity of ++ ignoring overflow with ignore_overflow_conditional_p. ++ * out-sparc.c (ignore_overflow_conditional_p): New function. ++ ++ * pyr.md (bitw recognizer): Set CC_NO_OVERFLOW. ++ ++Mon Apr 30 01:39:14 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (build_int): Make arg unsigned. ++ ++ * cccp.c (macarg1): `\' not special outside strings. ++ ++ * c-typeck.c (build_unary_op): In increment ops, ++ typo checking for ptr to void/function. ++ Check original type for this and for amount of increment. ++ ++Sat Apr 28 16:43:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (build_indirect_ref): Error if target is incomplete type. ++ ++Fri Apr 27 13:02:10 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (order_regs_for_reload): Count multi-word pseudos right. ++ ++ * flow.c (mark_set_1): Handle nested SUBREG, SIGN_EXTRACT, ++ STRICT_LOW_PART, etc. Also, always set subreg_p when setting ++ a bit field, even if modes are same. ++ ++Thu Apr 26 17:52:17 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (handle_directive): Don't pass directive through if no_output. ++ ++Tue Apr 24 13:40:25 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * pyr.md (addsi3): Use general_operand for both inputs. ++ ++ * i860.md: Add missing = in some output constraints. ++ ++Mon Apr 23 16:37:21 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (subst): When checking reg_last_set, verify nonzero. ++ ++ * ns32k.md (ashlhi3): Avoid using %1. ++ ++Sat Apr 21 21:05:51 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stmt.c (assign_parms): Don't make entry_parm and stack_parm valid. ++ Leave them explicit stack slots. ++ (validize_mem): Copy it, don't alter it. ++ ++Thu Apr 19 15:23:51 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-sparc.c (find_addr_reg): Avoid using frame pointer. ++ ++Sun Apr 15 13:42:24 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (emit_library_call): Precompute reg and partial of all parms, ++ to do it in proper order. ++ ++ * integrate.c (save_for_inline): Copy reg notes after all insns. ++ ++ * final.c (final_scan_insn): No block profiling before jump table. ++ ++Sat Apr 14 00:19:47 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i386.md (tstdf): Clobber reg in SImode, like cmpdf. ++ (blt, ble): New define_expands. RTL like before except, ++ for floats, reverse prev compare or test and do bgt/bge. ++ ++Thu Apr 12 21:27:18 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_call): New variable argpos counts args in the ++ order written. For comparison with n_named_args. ++ ++ * c-decl.c (duplicate_decls): Preserve DECL_INITIAL from old ++ function def to new one. ++ ++ * cccp.c (macroexpand): Count Newline Space as part of whitespace ++ sequence when stringifying. ++ ++Tue Apr 10 21:08:06 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (do_line): No error if string follows number without space. ++ ++Mon Apr 9 15:37:11 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (install): Turn off x bit on headers and man page. ++ ++ * i860.md (cmpeqsf, etc.): Change opcode name to pfeq.ss, etc. ++ ++ * tm-m68k.h (PRINT_OPERAND_PRINT_FLOAT): Delete spurious backslash. ++ ++ * c-decl.c (store_parm_decls): Don't do storedecls in prototype case. ++ That was discarding the enumerators already pushdecl'd. ++ ++ * tm-m68k.h (NOTICE_UPDATE_CC): Undo last change. ++ ++Sun Apr 8 19:00:09 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-m68k.c (output_move_double, standard_68881_constant_p): ++ Do word-swap when cross-compiling from little-endian machine. ++ ++Sat Apr 7 00:45:49 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * sparc.md (addcc and subcc patterns): Set CC_NO_OVERFLOW. ++ ++ * out-mips.c (output_load_immediate): Fix bug for values ++ between -2**15 and -2**16; don't use addi. ++ ++Thu Apr 5 14:00:41 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stdarg.h (va_start): Round initial pointer value down ++ to double boundary. This is to eliminate big-endian adjustment. ++ ++ * c-typeck.c (build_c_cast): Reject array types for result. ++ ++ * fixincludes: Don't ignore errors when making dirs. ++ But check whether dir already exists. ++ ++Wed Apr 4 01:59:03 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Complain if fn defn has `typedef' etc. ++ ++Tue Apr 3 22:09:12 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expmed.c (store_bit_field): Don't do big-endian adjust twice. ++ Do this by changing the mode whenever it is done. ++ Some places must now cope with subregs. ++ (extract_bit_field): Likewise. ++ ++Fri Mar 30 15:54:43 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (c_build_type_variant): New function. ++ (grokdeclarator): Call that, for ARRAY_TYPE only, in fields and vars. ++ * c-decl.c, c-typeck.c: All calls to build_type_variant use that now. ++ ++Wed May 2 16:34:25 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-sun3.h (CC1_SPEC): Ignore -target. ++ (WORD_SWITCH_TAKES_ARG): Define it. ++ * tm-sparc.h (CC1_SPEC): Ignore -target and -dalign. ++ (WORD_SWITCH_TAKES_ARG): Define it. ++ ++Thu Mar 29 15:34:53 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * final.c (end_final): For basic block profiling, don't output ++ source file name. Instead, append ".d", and remove ".c". ++ * gnulib.c (__bb_init_func): New name for __bb_init_function. ++ Conditionalize on mc68000, not m68k. ++ Fix other typos. ++ * Makefile (LIBFUNCS): Add _bb_init_func. ++ ++ * xm-sun386i.h (LINK_SPEC): Handle -static. ++ ++Wed Mar 28 16:21:53 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (duplicate_decls): Preserve DECL_FRAME_SIZE from definition ++ past subsequent declarations. ++ ++ * c-decl.c (xref_tag): If global_binding_level, make nodes permanent. ++ ++ * expr.c (expand_call): Handle STACK_BOUNDARY when using push insns. ++ ++ * stmt.c (assign_parms): Note how PUSH_ROUNDING affects stack ++ parm size. ++ ++ * tm-mips.h (STRUCTURE_SIZE_BOUNDARY): Changed from 16 to 8. ++ ++Tue Mar 27 14:24:00 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * m68k.md (movsi, movhi, movstricthi, movqi, movstrictqi): ++ Avoid both clr and st on volatile mem, but only on 68000. ++ (SImode store 0 recognizer): Likewise. ++ ++Mon Mar 26 15:01:02 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * m68k.md (movqi): Don't use `st' insn on volatile memory. ++ ++ * tm-m68k.h (NOTICE_UPDATE_CC): addq and subq do update cc's ++ even if destination is an address register. ++ ++ * cccp.c (discard_comments): Handle backslash-newline. ++ ++Sun Mar 25 20:21:58 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (handle_directive): Discard backslash-newline within <...>. ++ ++Fri Mar 23 00:52:34 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): Warn if array element is incomplete. ++ ++ * xm-hp9k320.h (USE_C_ALLOCA): Define if not compiling with GCC. ++ ++ * expr.c (emit_call_1): Pass FUNTYPE directly to RETURN_POPS_ARGS. ++ ++Thu Mar 22 22:33:36 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (get_parm_info): Void parm is special only if no name. ++ ++ * loop.c (may_not_optimize): Static var replaces local `may_not_move'. ++ (strength_reduce): Don't accept those regs as givs. ++ ++Wed Mar 21 17:14:00 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * ns32k.md (stack adjust insn): Don't use cmpd or cmpqd on Sequent. ++ * tm-sequent.h (SEQUENT_ADJUST_STACK): Define this. ++ ++ * Makefile (gnulib): Use OLDAR, not AR. ++ (OLDAR): New variable. ++ ++ * expr.c (expand_call): Don't reuse pending_stack_adjust for argblock ++ if inhibit_defer_pop. ++ ++Tue Mar 20 02:41:15 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * va-sparc.h: New file, handles changed calling convention. ++ ++ * expr.c (push_block): New argument EXTRA. All callers changed. ++ (emit_push_insn): Use that for the padding when using push_block. ++ ++ * ns32k.md (ashlsi3): `return' was missing. ++ ++ * tm-sparc.h (FUNCTION_ARG, FUNCTION_INCOMING_ARG): ++ Only word-aligned BLKmodes can go in registers. ++ (FUNCTION_ARG_PARTIAL_NREGS): Likewise. ++ * tm-spur.h (FUNCTION_ARG, FUNCTION_INCOMING_ARG): Likewise. ++ * expr.c (expand_call): If encounter a stack parm before offset ++ gets up to zero, make it zero. ++ * stmt.c (assign_parms): Likewise. ++ ++Mon Mar 19 00:06:35 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * assert.h (__assert) [not __GNUC__]: Rename arg to avoid stringify. ++ ++ * gcc.c (main): Handle SIGPIPE. ++ ++Sat Mar 17 14:13:43 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (general_induction_var): When adding sub-giv to ARG, ++ don't produce an add_val that can't be the source of an add insn. ++ ++Fri Mar 16 15:26:41 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-vms.h (NO_DOLLAR_IN_LABEL): Define this. ++ ++ * sparc.md (andncc, orncc, xorncc patterns): Delete `%' in constraint. ++ ++Thu Mar 15 22:02:02 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expmed.c (extract_bit_field, store_bit_field): ++ When changing mode of a reg to SImode, also do big-endian correction. ++ Consistently use BYTES_BIG_ENDIAN to decide how bits are numbered. ++ Fix stray ref to CODE_FOR_extzv in case for extv. ++ ++ * c-typeck.c (build_unary_op): Allow function type args to `!', ++ since they convert to pointers. ++ ++ * stmt.c (init_function_start): Set max_structure_value_size to -1. ++ ++Sun Mar 11 18:39:40 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (spill_hard_reg): ++ Typo: index regs_explicitly_used with regno. ++ ++ * cse.c (cse_insn): When replacing constant with reg+const, ++ don't make a REG_EQUIV note unless there already is one. ++ ++ * gcc.c (fatal): Flush spurious arg to delete_temp_files. ++ ++ * Makefile (gnulib, stamp-gnulib2): Ignore error in ranlib. ++ ++Sat Mar 10 16:07:27 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (other_reg_use_p): New name for only_reg_use_p. ++ Return 0 if IN == EXPR. ++ (check_eliminate_biv, strength_reduce): Re-invert the test ++ using other_reg_use_p. ++ ++Thu Mar 8 02:17:50 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * ns32k.md (movsi, movdi): Handle floating point registers. ++ ++ * reload.c (find_reloads_toplev): Do BYTES_BIG_ENDIAN offset ++ only within a word. ++ ++ * stdarg.h: Use _VA_LIST_ as macro to indicate already loaded. ++ ++ * tm-alliant.h (FUNCTION_PROLOGUE): Use `linkl' on 68020. ++ ++Tue Mar 6 23:44:15 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (macroexpand): Fix bug in scanning strings for stringify. ++ ++Fri Mar 2 00:27:14 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-mips.c (tree_code_name): Declaration deleted. ++ ++Thu Mar 1 22:59:18 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * assert.h (__assert): Don't call abort; use 0 as value. ++ * gnulib.c (__eprintf): Call abort here. ++ ++Wed Feb 28 13:11:24 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (install): When installing $${eachfile}, use basename. ++ ++Fri Feb 23 13:21:27 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (readescape): For x, avoid overflow when shifting in if. ++ ++Thu Feb 22 19:09:48 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * fixincludes: Delete directories before creating them. ++ When making internal symbolic directory links, chase ++ chain of existing links to the end. ++ ++ * dbxout.c (dbxout_type): Always use main variant. ++ ++Wed Feb 21 00:25:39 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Version 1.37.1 released. ++ ++ * tm-mips.h (ASM_OUTPUT_ADDR_VEC_ELT and ASM_OUTPUT_ADDR_DIFF_ELT): ++ Start label names with $. ++ ++Sun Feb 18 13:58:04 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-mips.h (ASM_GENERATE_INTERNAL_LABEL, ASM_OUTPUT_INTERNAL_LABEL): ++ Start name with $. ++ ++ * integrate.c (expand_inline_function): Round up size of parm_map. ++ ++Sat Feb 17 20:56:05 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-hp9k320.h (CPP_SPEC): Remove _INCLUDE__STDC__. ++ ++Sun Feb 11 20:11:25 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Version 1.37 released. ++ ++ * c-decl.c (complete_array_type): In permanent type, add perm nodes. ++ ++ * out-i386.c (print_operand_address): Handle a MULT by itself. ++ ++Sat Feb 10 14:35:03 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * ns32k.md (movsf): Convert double constant to float. ++ ++Fri Feb 9 00:02:43 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (duplicate_decls): Don't lose alignment of OLDDECL. ++ ++ * cccp.c (handle_directive): Keep comments by copying them explicitly. ++ ++ * cccp.c (rescan): When scanning for open-paren after macro name, ++ discard comments if appropriate. ++ ++Thu Feb 8 14:19:41 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (build_enumerator): Error if value outside range of int. ++ ++ * tm-hp9k320.h (CPP_SPEC): Define _INCLUDE__STDC__ if not traditional. ++ * tm-hp9k310.h: Missing file brought back. ++ ++Mon Feb 5 12:49:36 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (spill_hard_reg): Return 1 if reg is explicitly used. ++ (reload): Cancel dummy reloads using regs subject to spill. ++ ++Sun Feb 4 12:37:00 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-3b1g.h: New file. ++ * config.gcc (3b1g, 3b1-gas): New alternative. ++ ++ * tm-att386.h (ASM_OUTPUT_COMMON): Don't use rounded size. ++ ++Fri Feb 2 17:04:37 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (copy_for_inline): Use real width of rtunion in bcopy. ++ * emit-rtl.c (copy_rtx_if_shared): Likewise. ++ ++ * assert.h (assert) [__STDC__]: Use comma operator to avoid warning. ++ ++ * c-decl.c (grokdeclarator): Traditionally change return type float ++ to double. ++ ++ * cse.c (predecide_loop_entry): Give up unless simple jump enters loop. ++ ++Thu Feb 1 02:02:21 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-convex.h (FASCIST_ASSEMBLER, VTABLE_USES_MASK, VINDEX_MAX): ++ New definitions to control c++ files. ++ ++ * reload1.c (inc_for_reload): Forget reg_last_reload_reg ++ for the reg being inc'd. ++ ++ * limits.h (INT_MIN): Define so it has type `int', not unsigned. ++ (CHAR_MIN, SCHAR_MIN, SHRT_MIN): Put arens around value. ++ ++Wed Jan 31 12:54:07 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-mips.h (FUNCTION_PROLOGUE): Use CONST_OK_FOR_LETTER_P to see ++ if can update fp in one addiu insn. ++ ++ * reload1.c (reload): Reject fixed regs when finding groups to spill. ++ ++ * assert.h (assert) [NDEBUG]: Make value nonempty. ++ (assert) [no NDEBUG]: Split into a version for __STDC__ and one not. ++ (_assert) [__STDC__]: Pass expression and file separately to _eprintf. ++ (_assert) [not __STDC__]: Likewise, but implemented differently. ++ * gnulib.c (__eprintf): Handle 3 args plus format string. ++ ++ * tm-i386.h (STACK_BOUNDARY): Define it. ++ ++Sat Jan 27 17:58:30 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * hard-params.c: Use explicit file name to include self. ++ ++Fri Jan 26 01:38:29 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (rescan): Set beg_of_line when string ends at newline. ++ (skip_quoted_string): Don't swallow newline that ends a string. ++ (handle_directive): No need to back up here. ++ Pass LIMIT as second arg to skip_quoted_string. ++ ++ * cccp.c (rescan): If traditional, end preproc number after expt sign. ++ ++Thu Jan 25 01:57:34 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (general_induction_var): Reject widening multiply. ++ ++ * i860.md (andsi3): Truncate xop2 constant to 16 bits. ++ ++Wed Jan 17 12:33:52 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-mips.h (CC1_SPEC): Don't complain about -g. ++ ++ * c-typeck.c (build_compound_expr): Delete special case ++ that ignores expressions without side effects. ++ ++ * stor-layout.c (layout_type): Struct requires BLKmode if any field ++ crosses a word boundary. ++ ++ * reload1.c (choose_reload_regs): Refix Sequent problem correctly. ++ ++Tue Jan 16 12:03:42 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (unary_expr): If sizeof or alignof gets a comma expr ++ which has array or function type, coerce it to pointer. ++ ++ * fold-const.c (combine): Propagate carry when subtracting from 0. ++ ++ * fold-const.c (fold): For x++==const, do arith in type of const. ++ ++Mon Jan 15 19:24:04 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cexp.y (exp): Accept unary +. ++ ++Sun Jan 14 12:18:49 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * fold-const.c (lshift_double, rshift_double, lrotate_double): ++ (rrotate_double): Don't shift more than width of operand. ++ ++Fri Jan 12 18:50:43 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * recog.c (next_insns_test_no_inequality): Return 1 at end of rtl. ++ ++Thu Jan 11 14:09:47 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (skip_if_group): Skip strings even if -traditional. ++ (handle_directive): Likewise, when handling copy_command. ++ ++ * i860.md (movsf): Ensure F to f is reloaded via r. ++ ++Wed Jan 10 15:03:08 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile [3b1]: Propose redefinition of CCLIBFLAGS. ++ ++ * reload1.c (choose_reload_regs): Break down hairy if expression. ++ ++ * loop.c (loop_skip_over): Do nothing if don't find expected compare. ++ ++Sun Jan 7 00:58:06 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * config.gcc: Add i386-mach. ++ * xm-i386.h: Use built-in alloca if compiling with GCC. ++ ++ * optabs.c (emit_cmp_insn): Set CLASS after MODE. ++ ++Sat Jan 6 15:33:32 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-mips.c (function_arg, function_arg_advance): ++ Define typedef for CUMULATIVE_ARGS, and use it here. ++ ++ * cccp.c (main): Recognize `.C' for -M. ++ ++ * c-parse.y (yylex): Put 0 at end of wide string. ++ ++ * tm-mips.h (CC1_SPEC): Don't distort meaning of -O. ++ ++Fri Jan 5 12:12:31 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (link_command_spec): If LIBS_COMPILED_WITH_GCC, gnulib is last. ++ ++Thu Jan 4 23:58:59 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (c-parse.tab.o): Add explicit compilation cmd. ++ ++Wed Jan 3 00:27:53 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (install): Use nested foreach-loop to expand va*.h. ++ ++Mon Jan 1 19:36:49 1990 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (store_one_arg): Round size up for move_block_to_reg. ++ (expand_call): Round up when emitting USE insns. ++ * stmt.c (assign_parms): Round size up for move_block_from_reg. ++ ++ * reload1.c (alter_reg): Undo big-endian conversion from ++ assign_stack_local. ++ ++Sun Dec 31 20:10:52 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tree.h (struct tree_common): Declare `code' as char, not int. ++ ++Thu Dec 28 13:49:43 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gnulib.c (__fixunsdfsi): Turn large numbers to small for conversion. ++ ++ * Makefile (includes): Set variable LIB. Run from `./'. ++ ++Wed Dec 27 18:54:25 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (CCLIBFLAGS): Add -O. ++ (gnulib): Remove -O here. ++ (HARD_PARAMS_FLAGS): Like CCLIBFLAGS but no -O. ++ (hard-params, hard-params.o): Use that. ++ ++ * loop.c (can_eliminate_biv_p, eliminate_biv): If add_val non zero, ++ it must be a constant or register. ++ ++Mon Dec 25 00:02:31 1989 Torbj|rn Granlund (tege at zevs.sics.se) ++ ++ * tm-pyr.h (FIXUNS_TRUNC_LIKE_FIX_TRUNC): Should not be defined. ++ The cvtdw instruction causes a trap for floating point values ++ that are out-of-range for a signed int. ++ ++ * out-pyr.c (has_direct_base): Don't accept 0 as a base, if there ++ is a register displacement. This is a workaround of a bug in ++ /bin/as. (/bin/as changes things like "cmpw 8(reg),0(reg)" into ++ "cmpw 8(reg),(reg)", which is invalid assembler.) ++ ++Sun Dec 24 11:51:52 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (emit_move_insn): Lossage validating mem addr of constant. ++ ++ * varasm.c (record_constant_1): Missing `return' in ADDR_EXPR case. ++ ++Sat Dec 23 10:54:22 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * ns32k.md (extract byte from register): Delete #if conditionals. ++ Assume 32532 always. ++ (adjust stack): Likewise. ++ ++Thu Dec 21 10:24:05 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i860.md (load DF constant to reg): Typo: extra percent sign. ++ (floatsidf2): Two words of a double were backwards. ++ ++ * reload1.c (alter_reg): ++ Always do big-endian correction on slot address. ++ ++ * gnulib.c (__fixunsdfsi): Don't rely on host compiler for unsigned. ++ ++ * i386.md (float push recognizers): Don't pop fpreg if not dead. ++ ++Sun Dec 17 12:13:37 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-hp9k320.h (CPP_PREDEFINES): Add __hp9000s300, _HPUX_SOURCE. ++ ++Sat Dec 16 17:49:30 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (strength_reduce): When writing insn to init a biv, ++ update life range of reg used to init it. ++ ++ * combine.c (try_combine): Do combine (y = x, x = y). ++ ++ * loop.c (strength_reduce): When finding initial value of a biv, ++ notice assignments to subregs of it, etc. ++ ++Fri Dec 15 00:42:31 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * m68k.md (fpa float and float-trunc): Accept general_operand. ++ ++ * integrate.c (expand_inline_function): ++ Put caller's line number after inline stuff. ++ Put callee's line number before parm manipulation. ++ ++ * If local-alloc assumes a reg does not conflict, ++ don't use it as dummy reload. ++ * local-alloc.c (wipe_dead_reg): Add REG_UNSET note. ++ * reload.c (find_dummy_reload): Check for that note. ++ ++ * vax.md (casesi): New pattern for super-trivial cse case. ++ ++ * jump.c (jump_optimize): Realize that more things can follow ++ the NOTE_INSN_FUNCTION_END note. Change in two places, ++ for optimized and one for unoptimized. ++ ++Sat Dec 9 15:21:07 1989 Richard M. Stallman (rms at ccvi) ++ ++ * expr.c (expand_expr): For conversion ops, copy CONST_INT to reg ++ to avoid lossage on VOIDmode in convert_move or expand_float. ++ * optabs.c (expand_float): Abort if FROM has VOIDmode. ++ ++ * final.c (final_scan_insn): Delete unused label. ++ ++Thu Dec 7 01:42:30 1989 Richard M. Stallman (rms at ccvi) ++ ++ * sdbout.c (MAKE_LINE_SAFE): Ensure arg is > sdb_begin_function_line. ++ (sdbout_begin_block, sdbout_end_block, sdbout_end_function): Use it. ++ ++ * jump.c (jump_optimize): Leave block-beg, block-end notes ++ in old context when swapping two ranges of insns. ++ (squeeze_block_notes): New function. ++ ++ * expr.c (expand_call): For pcc struct, return reg mode is Pmode. ++ ++ * c-typeck.c (build_conditional_expr): ++ Only explicit ints allow predetermined choice. ++ ++Wed Dec 6 19:02:07 1989 Richard M. Stallman (rms at ccvi) ++ ++ * toplev.c: Undef FFS after including param.h. ++ ++Tue Dec 5 16:01:18 1989 Richard M. Stallman (rms at ccvi) ++ ++ * mips.md (movsf): Use mtc1 where needed. ++ ++ * reload1.c (choose_reload_regs): If run out of spill regs, ++ set must_reuse and try again. ++ ++Mon Dec 4 00:18:24 1989 Richard M. Stallman (rms at ambroise) ++ ++ * reload1.c (alter_reg): ++ Don't set spill_stack_slot_width if from_reg is -1. ++ ++ * cse.c (cse_end_of_basic_block): Typos checking NOTE insns. ++ ++ * math-68881.h (pow): Add parens around `&'. ++ ++ * loop.c (can_eliminate_biv_p, eliminate_biv): ++ In COMPARE, verify the biv is one of the arguments. ++ (strength_reduce): When eliminating biv, check for use ++ in a giv in an address, just as in check_eliminate_biv. ++ ++ * stupid.c (reg_order): Make it int, in case reg # is large. ++ (stupid_reg_compare, stupid_life_analysis): Implement this. ++ ++Sun Dec 3 14:17:36 1989 Richard M. Stallman (rms at ambroise) ++ ++ * tm-att386.h (ASM_OUTPUT_LOCAL): Don't generate .lcomm. ++ Go back to putting the variable in the data section. ++ ++ * expr.c (do_jump): Cast XVECLEN to int for subtracting 1. ++ ++ * reload.c (decompose): Handle SUBREGs. ++ ++ * c-typeck.c (build_modify_expr): Prevent -Wall warning ++ when we generate a COMPOUND_EXPR for (?:)=. ++ ++Mon Nov 27 15:39:40 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile [pyramid]: Use CLIB, not ALLOCA, to access libPW.a. ++ Use -lc explicitly first. ++ ++ * pyr.md (SI test recognizer): Fix syntax error, ++ ++ * c-decl.c (grokdeclarator): Don't test size of error_mark_node ++ as type of a field. ++ ++Sun Nov 26 12:36:01 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * tm-mips.h (CONST_OK_FOR_LETTER_P): Delete extra paren. ++ ++Wed Nov 22 12:56:41 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * pyr.md (mode conversion peepholes): Set CC_NO_OVERFLOW. ++ * out-pyr.c (consecutive_operands): Don't expect wrap from reg15 to 16. ++ ++ * Makefile: Fix directions for pyramid. ++ ++ * tm-mips.h (CONST_OK_FOR_LETTER_P): Define `K'. ++ (SMALL_INT): Range is 16 bits, not 17. ++ (SMALL_INT_UNSIGNED): New macro. ++ * mips.md (andsi3, iorsi3, xorsi3): Use `K', not `I'. ++ ++ * mips.md (negsi2): Accept general_operand as input. ++ ++Tue Nov 21 10:57:45 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * mips.md (one_cmpl*): Accept general_operand as input. ++ ++Mon Nov 20 11:18:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_expr): For MINUS_EXPR, don't explicitly negate int ++ constant if it is in a mode too wide for host machine int. ++ ++ * cse.c (fold_rtx): Simulate negative shift counts. ++ ++Sun Nov 19 14:36:18 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-pyr.c (notice_update_cc): Set CC_NO_OVERFLOW in many cases. ++ ++ * cse.c (fold_rtx, fold_cc0): Handle float trap. ++ ++Sat Nov 18 00:17:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varasm.c (output_constant): Handle float trap in fprintf. ++ * toplev.c (float_signal): Don't print message. ++ * fold-const.c (combine): Print it here. ++ ++ * sparc.md (extend patterns): Handle CONST_INT as operand. ++ ++ * out-i386.c (singlemove_string): Fix paren error. ++ ++Fri Nov 17 12:19:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_increment): For pre-increment, copy the rtx to return. ++ ++ * c-parse.y (compstmt): There may be implicit decls, so check ++ and maybe keep the level. ++ ++ * tm-mips.h (FUNCTION_PROLOGUE, FUNCTION_EPILOGUE): ++ Use call_used_regs, not a private copy. ++ ++Thu Nov 16 00:28:29 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c: Keep track of paradoxical subregs of each pseudo, ++ and make extra stack space for their sake. ++ (reload): Record max size paradoxical subreg for each pseudo. ++ (scan_paradoxical_subreg): New subroutine for that. ++ (reload): Make stack slots big enough for that size. ++ ++ * tm-i860.h (ASM_DECLARE_FUNCTION_NAME): Define it, ++ so we can output a no-op before each function. ++ ++ * tm-pyr.h (INIT_CUMULATIVE_ARGS): Simplify. ++ Pass function type to aggregate_value_p. ++ ++ * fold-const.c (fold): ++ For foo++ > const, don't change if foo++ could overflow. ++ ++ * loop.c (eliminate_biv): ++ Fix typo; check both coeffs when comparing givs. ++ ++Wed Nov 15 00:12:59 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (copy_for_inline): Correctly handle RTL type "u". ++ ++ * jump.c (delete_insn): Extra test for PREV != 0. ++ ++Tue Nov 14 17:31:08 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-sun3.h (LINK_SPEC): Specify -L to control choice of -lm. ++ ++ * tm-pyr.h (INIT_CUMULATIVE_ARGS): ++ If -fpcc-struct-return, always do the scalar thing. ++ ++ * function.c (expand_function_end): Use FUNCTION_OUTGOING_VALUE. ++ ++Sat Nov 11 00:18:54 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-sun386.h (ASM_OUTPUT_COMMON): Use ROUNDED, not SIZE. ++ (ASM_OUTPUT_LOCAL): Likewise. Also, generate .lcomm ++ rather than a .data area symbol. ++ * tm-att386.h: Likewise. ++ ++Fri Nov 10 15:04:15 1989 Richard Stallman (rms at rice-chex) ++ ++ * caller-save.c (emit_mult_restore, emit_mult_save): ++ Improve arithmetic for address to save at. ++ ++Thu Nov 9 00:14:19 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-pyr.h (ASM_OUTPUT_REG_PUSH, ASM_OUTPUT_REG_POP): ++ Don't use obsolete pushw and popw insns. ++ (ASM_OUTPUT_ALIGN): Ensure arg in range 2 to 5. ++ * pyr.md (tstdi): Pattern deleted. ++ (SImode test recognizer): Output ucmpw if jump is unsigned. ++ ++ * out-sparc.c (operands_satisfy_eager_branch_peephole): ++ Check for moves between FP and non-FP regs; they take two insns. ++ * sparc.md (eager branch peepholes): Likewise. ++ (Ordinary delayed branch peepholes): Similar check. ++ * out-sparc.c (single_insn_extra_test): New subroutine. ++ ++Wed Nov 8 18:19:51 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (subst): In (sign_extend:M (subreg:N (and:M .. ) 0)) ++ insist that constant be positive in mode N. ++ ++Tue Nov 7 23:25:20 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * rtl.h: Undefine FFS in case it was defined by the system. ++ ++Mon Nov 6 14:43:55 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-i860.h, tm-m88k.h, tm-pyr.h, tm-spur.h (INIT_CUMULATIVE_ARGS): ++ Test aggregate_value_p, not just BLKmode. ++ ++ * gnulib2.c (__builtin_saveregs): Moved from gnulib.c. ++ Code added for mips. ++ ++ * pyr.md (conditional branch recognizers): Don't simplify if not -O. ++ ++ * out-pyr.c (extend_and_branch): Handle two constant operands. ++ ++ * integrate.c (function_cannot_inline_p): Don't inline if alloca used. ++ ++Sun Nov 5 02:59:23 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Always make a LET_STMT and notes for the top level of a function ++ if it has any subblocks. ++ * c-decl.c (struct binding_level): New field keep_if_subblocks. ++ (poplevel): Obey the new field. ++ (keep_next_if_subblocks): New variable. ++ (pushlevel): Use that variable. ++ (store_parm_decls): Set that variable. ++ (compstmt): Pass nonzero to expand_end_bindings ++ for the new kept binding levels. ++ (kept_level_p): New function. ++ ++ * xm-mips.h: Define USE_C_ALLOCA if compiling with CC. ++ ++ * tm-alliant.h (CHECK_FLOAT_VALUE): Define this. ++ ++ * expr.c (expand_call): Make valreg 0 if passing structure address. ++ ++Sat Nov 4 23:27:02 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * caller-save.c (emit_mult_save, emit_mult_restore): ++ Test regs for suitability as address before using as temps. ++ ++ * cccp.c (make_definition, do_define): Better error checks for name. ++ ++Fri Nov 3 01:05:04 1989 Torbj|rn Granlund (tege at echnaton) ++ ++ * pyr.md (tstdi): New pattern. Use 64-bit shift with count zero. ++ ++ * pyr-tm.h: -mretd pops args with the retd insn. ++ ++ * pyr.md (peep-holes for loop optimizations): Use the R output ++ format in PRINT_OPERAND, don't use output_branch. ++ * out-pyr.c: No need for functions output_branch, output_inv_branch. ++ ++ * tm-pyr.h (ASM_OUTPUT_ALIGN): Don't truncate alignment to two. ++ ++Wed Nov 1 00:38:27 1989 Torbj|rn Granlund (tege at echnaton.sics.se) ++ ++ * out-pyr.c (output_inv_branch): When reversing test operands, ne ++ remains ne, and eq eq eq. ++ ++ * pyr.md: Cleanup output code for compare patterns. ++ ++ * pyr.md (return): Adjust frame pointer if ++ current_function_pretend_args_size != 0. ++ ++ * pyr.md (extendsidi2): Use general_operand for the input operand. ++ ++ * pyr.md, out-pyr.c: Output shift insns with output_shift. ++ ++ * tm-pyr.h, out-pyr.c: Make NOTICE_UPDATE_CC understand how ++ condition codes are really set. Define flag CC_VALID_FOR_UNSIGNED ++ with to make it possible not to reset cc after each compare or ++ test. ++ * pyr.md: Don't use CC_STATUS_INIT for most patterns. ++ ++ * out-pyr.c (already_sign_extended): Cleanup, correct, optimize. ++ ++ * out-pyr.c: rename radr_diff to constant_diff. ++ ++ * out-pyr.c (movdi_possible): Don't combine moves from memory to ++ memory, because of possible address aliasing. Don't combine moves ++ with register destination if the source operands are depending on ++ the destination of the first move, as in ++ ++ movw (pr3),pr3 ++ movw 4(pr3),pr4. ++ ++ * out-pyr.c (consecutive_operands): Handle SUBREG in addition to REG. ++ ++ * out-pyr.c (output_move_double): movl of immediate *sign* extends. ++ ++Tue Oct 31 22:51:39 1989 Torbj|rn Granlund (tege at echnaton.sics.se) ++ ++ * pyr.md (cmpsi): Don't expand this. It's just slower. ++ ++ * out-pyr.c (extend_and_branch): Handle only QImode and HImode. ++ Flush code specific for SImode. ++ ++ * out-pyr.c (extend_and_branch): To make zero extensions to HImode ++ of constants not crash: ++ * out-pyr.c (ensure_extended): Call extend_const if it's a ++ CONST_INT. Don't call extend_const from extend_and_branch. ++ * pyr.md, out-pyr.md: Use global variable test_mode to determine the ++ mode of tests and compares. Set in define_expands for tests and ++ compares. Used in extend_and_branch. ++ * out-pyr.c: Pass mode between extend_and_branch and ensure_extended. ++ ++ * out-pyr.c (extend_and_branch): Accept SUBREG whereever REG is ++ accepted. ++ * out-pyr.c (weird_memory_memory): Accept SUBREG whereever REG is ++ accepted. ++ ++Thu Nov 2 13:02:15 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gnulib2.c (lshrdi2, and other shifts): Take second arg as long long. ++ ++ * out-i386.c (fp_pop_int): Use %L0 in fistp insn. ++ ++Wed Nov 1 00:05:59 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stmt.c (init_function_start): Init max_parm_reg. ++ ++ * varasm.c (compare_constant_1): For ADDR_EXPR, compare symbol name. ++ (record_constant_1): Likewise. ++ ++ * out-sparc.c (output_mul_by_constant): Constant zero is legitimate. ++ ++ * caller-save.c (emit_mult_restore, emit_mult_save): ++ Handle stack addresses which are invalid. ++ ++ * cse.c (use_related_value): Don't abort if offset is 0. ++ ++Tue Oct 31 15:08:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * config.gcc (pyramid): Set $machine to pyr. ++ ++ * Makefile: Change temp file names from tmp-insn-* to tmp-*. ++ ++ * expr.c (expand_call): OK_DEFER_POP for is_const was once too many. ++ ++Sun Oct 29 00:53:46 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (yylex): Prevent warning for numbers that underflow. ++ ++ * stmt.c (assign_parms): Convert stack addresses to valid addresses. ++ (validize_mem): New subroutine. ++ ++ * stmt.c (check_for_full_enumeration_handling): Accept enum type ++ as argument (since was finding it incorrectly). ++ Delete special case for constant index. ++ (expand_end_case): Pass enum type; check for constant index. ++ ++ * cexp.y (initialize_random_junk): Test DOLLARS_IN_IDENTIFIERS ++ for nonzeroness. ++ ++Fri Oct 27 16:25:19 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-next.h (__inline): define as macro for old 1.34 Next uses. ++ ++Wed Oct 25 17:59:33 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ * stmt.c: Include recog.h. ++ ++Tue Oct 24 19:23:11 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (try_combine): Don't move a volatile asm. ++ ++Mon Oct 23 01:45:34 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (try_combine): Don't install a subreg relating two modes ++ that aren't tieable. ++ ++ * gnulib2.c (__fixdfdi): Declare __fixunsdfdi. ++ ++ * combine.c: Make uid_cuid an int *. ++ (combine_instructions): Allocate as such. ++ * loop.c: Make uid_luid an int *. ++ (loop_optimize): Allocate as such. ++ ++Sun Oct 22 16:34:28 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stmt.c (fixup_var_refs_1): New insn before a CALL goes before ++ the preceding USEs. ++ ++Sat Oct 21 00:51:49 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-pyr.c (extend_and_branch): Allow SUBREG like REG. ++ * pyr.md (mem-reg and reg-mem HI, QI patterns): ++ Don't match unless one arg is MEM. ++ ++ * out-sparc.c (output_fp_move_double): Use ldd only when safe, ++ on same conditions used for std. ++ ++ * Makefile (gnulib): Fix comments for editing for hpux. ++ ++Fri Oct 20 00:27:00 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-i386.c (singlemove_string): Handle ordinary constants as input. ++ ++ * reload1.c (choose_reload_regs): Arg of HARD_REGNO_MODE_OK ++ was the pseudo; should be the reload reg. ++ ++ * tm-decstatn.h (CPP_PREDEFINES): Add bsd4_2, ultrix, MIPSEL, ++ host_mips, R3000, LANGUAGE_C, SYSTYPE_BSD. ++ * tm-mips.h (CPP_PREDEFINES): Add host_mips, R3000, MIPSEB, LANGUAGE_C. ++ (CPP_SPEC): Remove those from here. ++ Define __SYSTYPE_*__ always. Define SYSTYPE_* only if not -ansi. ++ No CPP_SPEC needed for decstation. ++ Correct typos in option tests. ++ ++Thu Oct 19 18:16:40 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-m68k.h, tm-alliant.h (PRINT_OPERAND): ++ Don't print :l for address if :w was already printed. ++ ++Wed Oct 18 13:03:52 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-mips.h (FUNCTION_PROLOGUE): Get rid of __0__gcc macro. ++ Store that value in frame_stack_difference. ++ (FUNCTION_EPILOGUE): Get rid of __0__gcc macro. ++ (FIX_FRAME_POINTER_ADDRESS): Use frame_stack_difference. ++ * out-mips.c (frame_stack_difference): Define here. ++ ++ * gcc.c (compilers): Define __GNUG__ if g++. ++ ++Tue Oct 17 01:17:07 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-i860.h (HAVE_PRE_INCREMENT): Undefine this. ++ ++ * mips.md (movsf): New alternatives for r registers. ++ * tm-mips.h (FUNCTION_PROLOGUE): Handle big stack frames. ++ * out-mips.c (function_arg): Handle mode distinction for floating args. ++ ++ * pyr.md (mtstsw pattern): Accept general_operand. ++ ++ * i860.md (movsf): New alternatives: allow loading r from F. ++ Prefer f-reg as reload when moving m from F. ++ * tm-i860.h (PRINT_OPERAND): Handle CONST_DOUBLE if SFmode. ++ ++Sun Oct 15 19:45:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i860.md (movhi, movqi): Support moves to/from fp regs. ++ ++ * sparc.md (cse'd multiply): New pattern for mult. by -1. ++ ++ * out-i860.c (load_opcode, store_opcode): Handle DImode and fp reg. ++ ++ * expr.c (emit_library_call, expand_call): Make a SEQUENCE for ++ any needed USE insns and pass them to emit_call_1. ++ (emit_call_1): Place the passed SEQUENCE immediately before the ++ generated CALL_INSN even if gen_call made more than one insn. ++ ++Fri Oct 13 00:12:46 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * recog.c (constrain_operands): Add case for `&'. ++ ++ * expmed.c (extract_bit_field): With structure reg fetched from mem, ++ don't put in subreg if mode already correct. ++ (store_bit_field): Typo: had extzv, wanted insv. ++ ++ * stmt.c (expand_function_start): Call init_recog. ++ ++Thu Oct 12 01:48:30 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (macarg1): Count newlines even after backslash. ++ ++ * c-decl.c (pushdecl): Don't warn for explicit extern ++ followed by static. That case is useful for incomplete arrays. ++ ++ * tm-sparc.h (SELECT_RTX_SECTION): Test was backwards. ++ ++Wed Oct 11 00:35:25 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-seq386.h (DBX_DEBUGGING_INFO): Override this. ++ (HARD_REGNO_MODE_OK): Override this. ++ ++Mon Oct 9 01:09:25 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i860.md (movdi): accept F source in 2nd alternative. ++ Accept G source in 3rd. ++ (adddi3, subdi3): Typo in opcode of output. ++ ++Sun Oct 8 01:38:27 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-mips.h (ASM_SPEC): Pass -nocpp to as. ++ ++ * c-decl.c (grokdeclarator): Ignore variant differences ++ when preserving typedef types from being altered. ++ ++Sat Oct 7 00:46:18 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * xm-mips.h: Use __builtin_alloca. ++ ++Fri Oct 6 00:30:42 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload.c (find_equiv_reg): Do let xregno be a pseudo reg, ++ but don't call HARD_REGNO_NREGS in that case. ++ ++Thu Oct 5 00:30:39 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload.c (find_equiv_reg): Don't let xregno be a non-hard reg. ++ Don't do OVERLAPPING_REGNO_P on a pseudo reg number. ++ ++ * i386.md (trunchiqi2, etc.): Output %1 with size of destination. ++ * out-i386.c (PRINT_REG): Support 'b' as CODE. ++ ++ * combine.c (try_distrib): Make sure we don't move a reg use ++ across a store into that reg. ++ ++ * reload1.c (order_regs_for_reload): Rate fixed regs at LARGE+2, ++ and explicitly used regs at LARGE+1. ++ ++ * stor-layout.c (build_int): When memoizing, make permanent nodes. ++ ++Wed Oct 4 19:40:37 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * xm-i860.h: Missing file added. ++ ++Mon Oct 2 16:26:33 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (emit_reload_insns): Reject any OLDEQUIV that is ++ in use in any other reload of this insn. ++ ++ * expr.c (expand_call): Don't put on notes for const functions ++ if there aren't real insns to hold them. ++ ++Sun Oct 1 19:50:59 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (expand_inline_function): Handle PARALLEL in CALL_INSNs ++ when setting follows_call. ++ ++ * i860.md (pfeq, pfgt and pfle patterns): Add f0 as 3rd arg. ++ ++ * integrate.c (save_for_inline): Don't delete NOTE_INSN_FUNCTION_END. ++ ++Fri Sep 29 08:56:30 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-next.h (LINK_SPEC): Typo for -Z option. ++ ++Thu Sep 28 12:57:11 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload.c (decompose): Handle case of pseudo with no hard reg. ++ ++Wed Sep 27 01:20:36 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * explow.c (round_push): Fix typo: return fast if ALIGN is 1. ++ ++ * varasm.c (in_text_section): New function. ++ * tm-3b1.h (ASM_OUTPUT_SKIP): Use that. ++ ++Tue Sep 26 02:40:23 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (commontype): If one arg is error_mark_node, return other. ++ ++Sun Sep 24 00:21:24 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (poplevel): When popping a local extern decl, ++ save the TREE_USED bit in the identifier. ++ * toplev.c (compile_file): Check that, printing "not used" warnings. ++ ++ * tree.c (make_node): Always put PARM_DECL in saveable_obstack. ++ ++ * Version 1.36 released. ++ ++ * genextract.c (main): Pass `insn' as arg to `fatal_insn_not_found'. ++ ++ * tahoe.md (casel patterns): Use %@ for operand of .align. ++ * tm-tahoe.h (PRINT_OPERAND): %@ prints `1'. ++ * tm-harris.h (PRINT_OPERAND): Redefine it; %@ prints `2'. ++ ++ * config.gcc (decstation): New entry. ++ ++ * tm-harris.h: New file, using tm-tahoe.h. ++ ++ * tm-decstatn.h, tm-mips-bsd.h, tm-mips-sysv.h: New files. ++ ++Sat Sep 23 00:28:14 1989 Alain Lichnewsky (lich at glenlivet) ++ ++ * added -Zxxx flag in tm-mips.h. (-Z stands for systype) ++ ++ used as -ZSYSV or -ZBSD43 on RISC_OS. I suppose ++ that at somepoint -ZPOSIX might be required for Ultrix. ++ ++ * changed command issued to loader to set -systype and to get ++ crt1 crtn instead of crt0. ++ ++ * changed predefines for cpp to agree with RISC-OS ++ ++ * tm-mips.h checks for machine type ( defined(ultrix) == DECSTATION) ++ so that user does not have to go in and change tm-mips.h anymore ++ ++ * cpp defines mips host_mips unix and SYSTYPE_SYSV ++ or SYSTYPE_BSD43. ++ ++Fri Sep 22 00:31:29 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * pyr.md (andsi3): Flush spurious paren. ++ ++ * Makefile (hard-params): Don't use LIBS or LIBDEPS. ++ ++ * rtl.c (init_rtl): ++ Use malloc to allocate the string for format of CONST_DOUBLE. ++ Don't fail to store in rtx_format. ++ ++Thu Sep 21 00:33:13 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * print-tree.c (dump): Move decl of P in REAL_CST case. ++ ++ * fold-const.c (fold): For ABS_EXPR, handle REAL_IS_NOT_DOUBLE. ++ ++ * c-convert.c (convert_to_real): Use REAL_VALUE_ATOF to make 0. ++ ++ * mips.md (movdi): Handle constant with or without WORDS_BIG_ENDIAN. ++ For alternative 2, output just 2 store insns, not 3. ++ ++ * dbxout.c (dbxout_symbol): Optionally go to .data for ++ a static file-scope variable. ++ * tm-vax.h: Define DBX_STATIC_STAB_DATA_SECTION to request this. ++ ++ * varasm.c (output_constant, force_const_mem): ++ ASM_OUTPUT_DOUBLE_INT now takes rtx as argument. ++ ++ * gvarargs.h [__NeXT__]: Undefine macros defined by stdardg.h. ++ Define _VARARGS_H. ++ ++ * stddef.h (size_t): Don't define it if _SIZE_T macro is defined. ++ (NULL): Undef any previous defn. ++ ++ * cexp.y (NULL): Don't define if already defined. ++ ++ * emit-rtl.c (force_next_line_note): New function. ++ * stmt.c (expand_function_start): Call that just before returning. ++ ++Wed Sep 20 01:22:16 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (asm_clobbers): ++ Allow string concatenation: call combine_strings. ++ ++Mon Sep 18 00:04:06 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_call): If calling const function, don't defer ++ pops for this call. ++ ++ * c-parse.y (yylex): When float constant ends in `f', ++ actually truncate to a single-float. ++ ++Sun Sep 17 01:36:43 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (SWITCH_TAKES_ARG): -A takes an arg. ++ (link_spec): Inhibit start files when -A. ++ ++ * convex.md (call, call_value): Supply dummy arg to RETURN_POPS_ARGS. ++ ++ * gnulib2.c (__fixunsdfdi): After removing top half, A can be neg. ++ (__cmpdi2, __ucmpdi2): Was misusing macros HIGH and LOW-- ++ use .s.high and .s.low to extract words from long_long. ++ ++ * Makefile (gnulib2): Run `./gcc'. ++ ++ * Makefile (float.h): Use `make', not `$(MAKE)'. ++ (hard-params.o): Use `$(srcdir)' in deps as in commands. ++ ++ * out-tahoe.c (output_move_double): Handle constant operand 1. ++ ++Sat Sep 16 01:15:24 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (emit_reload_insns): Put death note for input reload reg ++ even if reload was inherited. ++ ++ * out-i860.c (output_block_move): Typo loading size of block. ++ ++ * m68k.md (dbra patterns): Do CC_STATUS_INIT. ++ ++ * cse.c (fold_rtx): Check GET_MODE_CLASS before floating negate. ++ ++Fri Sep 15 00:39:44 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (subst): Don't combine (subreg (mem)) ++ if subreg's mode is wider than mem's mode. ++ ++Thu Sep 14 04:33:51 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (clean): Delete temp files used in making gnulib. ++ ++ * tm-next.h (LINK_SPEC): Pass -Z and -seglinkedit options. ++ ++Tue Sep 12 01:06:39 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (layout_type): Ignore MAX_FIXED_MODE_SIZE for ints. ++ ++ * mips.md (cmpsi + bleu peephole): Should output unsigned insn. ++ ++ * expmed.c (store_bit_field, extract_bit_field): If loading mem ++ into reg for bit field insn, don't use a larger mode than insn wants. ++ ++ * Makefile (stamp-gnulib2): Depend on gcc, cc1, cpp to avoid ++ wrong order of making when parallel. ++ ++ * Makefile (float.h): Do use $(MAKE) to run recursive make. ++ ++Mon Sep 11 00:49:11 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (main): Test for missing arg after -o, etc. ++ ++ * tm-next.h: Nearly completely new. ++ ++ * gcc.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Move after config.h. ++ ++ * cccp.c: Cast some args to strcpy and strcat. ++ ++ * genoutput.c (error): Declare arg S. ++ ++ * tm-pyr.h, pyr.md, out-pyr.c, xm-pyr.h: New files. ++ * config.gcc: New item for pyr. ++ ++ * gvarargs.h: If __pyr__, use va-pyr.h. ++ ++Sun Sep 10 00:48:43 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (inc_for_reload): Really return the first of the insns. ++ ++ * stor-layout.c (build_int): Memoize size nodes for sizes <= 32. ++ ++ * loop.c (check_dbra_loop): Don't reverse a biv that is used ++ in between its update and the loop endtest insn. ++ ++Sat Sep 9 02:10:49 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (genop): Don't use `combine' for nonexplicit constants. ++ Handle some identity elements, etc., directly. ++ (layout_basetypes): Function deleted. ++ (layout_record): Ignore any TYPE_DECLs in the fieldlist. ++ Don't do PCC_BUTFIELD_TYPE_MATTERS hack on field with ERROR_MARK type. ++ (layout_union): Delete error check for base types. ++ Ignore any TYPE_DECLs in the fieldlist. ++ (layout_type): Copy layout info directly into all variants of type. ++ Delete unused local `x'. ++ ++ * mips.md (movdi): Handle constant source operand. ++ (movsi): Some output code moved to output_load_immediate. ++ * out-mips.c (output_load_immediate): New function. ++ ++ * config.gcc (iris): Use tm-iris.h and xm-iris.h. ++ ++ * integrate.c (copy_for_inline): Copy all nonconstant MEM addresses. ++ ++ * tm-3b1.h (ASM_OUTPUT_SPACE): New override defn, to output explicit ++ bytes of 0 if in text segment. ++ ++Fri Sep 8 19:15:08 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (try_combine): Don't do i3dest stuff if i3 isn't a SET. ++ ++Thu Sep 7 00:16:32 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (function_cannot_inline_p): Fn is "not even close" ++ only if > 3 * max_insns. ++ ++ * toplev.c (fatal_insn_not_found): New fn. ++ * genextract.c (main): Make insn_extract call that fn. ++ ++ * integrate.c (expand_inline_function): Don't abort about bad offset ++ in a parm whose type is error_mark_node. ++ Make another syntax level to hold parm destructors. ++ ++ * tm-mips.h (FUNCTION_PROLOGUE, FUNCTION_EPILOGUE): ++ Increment push_loc after, not before, each reg save or restore. ++ When storing reg 9 or 29, use offset tsize-4. ++ Make tsize larger by 4 initially. ++ (STARTING_FRAME_OFFSET): -8, not -4. ++ ++ * gcc.c (choose_temp_base): Make use of TMPDIR and P_tmpdir ++ if they exist. ++ ++ * toplev.c, gcc.c, cccp.c, gen*.c (fancy_abort): ++ New function which can be used to replace `abort'. ++ ++ * toplev.c (main): Save argv, argc in save_argv, save_argc. ++ ++ * jump.c (delete_insn): Always advance NEXT across deleted insns, ++ in case not optimizing. Fixes setting current_function_returns_null. ++ ++ * symout.c: Include stddef.h with <...>. ++ ++Wed Sep 6 00:39:35 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (find_exec_file): Was using `argbuf[0]' where wanted `prog'. ++ ++ * combine.c (combine_instructions): Dont call record_dead_and_set_regs ++ if insn has become a NOTE. ++ ++ * reload.c (combine_reloads): Update reload_when_needed. ++ ++ * jump.c (delete_insn): If delete label on ADDR_VEC, delete table too. ++ (jump_optimize): If ADDR_DIFF_VEC label has 1 ref, delete it and table. ++ ++ * gunlib2.c (__fixunsdfdi, __floatdfdi): Make the long long, ++ and/or its two halves, unsigned. ++ ++ * reload1.c (reload): When setting double_reg_address_ok, ++ require it to be offsettable. ++ * out-sparc.c (output_fp_move_double): Now safe to use std ++ for all reg+reg addresses. ++ ++ * vax.md: Add another simplified-casesi pattern for operand 0 constant. ++ ++ * cse.c (fold_rtx): Don't truncate VAL at end if WIDTH is 0. ++ Don't alter WIDTH for that purpose based on the operands. ++ ++ * stmt.c (warn_if_unused_value): && or || is ok if 2nd op has effect. ++ ++ * c-parse.y (ALIGNOF unary_expr): Find a larger value if possible. ++ ++ * reload.c (combine_reloads): Don't combine an output address reload. ++ (find_reloads): Call combine_reloads after setting reload_when_needed. ++ (find_reloads_address): Update OPERAND if copy the operand. ++ ++ * cccp.c (macroexpand): Missing arg no error in 1-arg macro if -trad. ++ ++Tue Sep 5 14:12:23 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload.c (find_dummy_reload): Don't use the output reg if it is ++ a fixed reg which can overlap with other regs. ++ ++ * cse.c (exp_equiv_p): Two vectors must have same length. ++ ++ * tree.def (WITH_CLEANUP_EXPR): Print-name string was wrong. ++ ++ * optabs.c (expand_fix): Undo previous change (unsigned conversion). ++ It doesn't work. ++ ++ * gcc.c: Pass -i option to cpp. It takes an arg. ++ ++ * cccp.c (cplusplus_include_defaults) [VMS]: Typo in array indices. ++ ++ * Makefile (gnulib): Create it in tmpgnulib, then rename at the end. ++ ++ * i860.md (movdi from constant pattern): Fix `st' opcode typos. ++ ++ * Makefile (hard-params*): Use CCLIBFLAGS, not CFLAGS. ++ ++Fri Sep 1 03:43:50 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-i386gas.h (ASM_OUTPUT_ALIGN): .align arg isn't a log, in gas. ++ (ASM_OUTPUT_ALIGN_CODE): Align labels, etc. to 4-byte boundary. ++ ++ * integrate.c (save_for_inline): Delete NOTE_INSN_DELETED notes. ++ ++ * Makefile (clean): Delete dbr and jump2 dumps. ++ ++ * Makefile (gnulib, gnulib2): Compile in main dir, not libtemp subdir. ++ This avoids trouble with -I options, etc. ++ ++Thu Aug 31 15:07:19 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (emit_reload_insns): ++ Be specific moving REG_DEAD notes to an output reload. ++ Sometimes move them to output-operand-address reloads. ++ ++ * out-sparc.c (output_fp_move_double): Very cautious about std. ++ Use it only for something visibly aligned, or for an array element. ++ ++ * cccp.c (main) [VMS]: Remove dirs and extension from PROGNAME. ++ (pfatal_with_name) [VMS]: Return VMS system call error code as status. ++ (cplusplus_include_defaults) [VMS]: Add GNU_GXX_INCLUDE. ++ ++ * xm-vms.h (FATAL_EXIT_CODE): Now (44 | 0x10000000). ++ ++ * expr.c (do_store_flag): Allow more values of STORE_FLAG_VALUE. ++ ++ * gnulib2.c (__fixunsdfdi): Explicitly cast doubles to `long int' ++ to avoid infinite recursion. ++ ++Wed Aug 30 13:28:54 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (skip_consec_insns): Skip NOTEs. ++ ++ * loop.c (general_induction_var): If G or V is a nonreplaceable giv, ++ give up. If G is allocated here, consider it replaceable. ++ ++ * stupid.c: Make uid_suid, reg_where_born and reg_where_dead ++ vectors of ints, not short. ++ ++Tue Aug 29 00:21:13 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-iris.h: Fix typo in formfeed char. ++ ++ * out-i860.c (singlemove_string): Add missing `.l' to `st', `ld'. ++ ++ * loop.c (general_induction_var): Don't set G from 2nd op. of MINUS, ++ since that would negate the result. ++ ++Mon Aug 28 00:16:36 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * dbxout.c (dbxout_symbol): When we need a pointer type, don't ++ record it in TYPE_POINTER_TO, lest it not live as long as its target. ++ ++ * tm-hp9k320.h (CPP_PREDEFINES): Delete __hp9000s300 and _HPUX_SOURCE. ++ ++ * Makefile (gnulib): Deleted stamp-gnulib2 in wrong dir. ++ (hard-params.o): Copy it into current dir before compiling. ++ (STAGESTUFF): Include the stamp-*.[ch] files. ++ ++Sun Aug 27 13:59:39 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * out-i860.c (output_size_for_block_move): Typo in CC_KNOW_HI_R31. ++ ++ * integrate.c (expand_inline_function): Ignore insns to set value reg ++ if we don't want the value. ++ ++ * varasm.c (make_function_rtl, make_decl_rtl): Use DECL_ASSEMBLER_NAME. ++ ++ * Makefile (stamp-gnulib2): Don't explicitly delete old members, ++ just replace them. ++ ++ * m68k.md, alliant.md (trunchiqi): Use movew if moving from memory ++ or from a const_int. ++ ++ * integrate.c (expand_inline_function): Set first_parm_offset ++ later on, after computing the args, in case those args ++ contain inline function calls. ++ ++ * alliant.md (movqi): Like recent change in m68k.md. ++ ++Sat Aug 26 00:26:03 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * tm-hp9k320.h (CPP_PREDEFINES): Take out m68k and mc68000. ++ * tm-news.h (CPP_PREDEFINES): Add mc68000. ++ ++Fri Aug 25 15:37:35 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * optabs.c (expand_fix): Can convert to unsigned int ++ by subtracting 2**(N-1), converting to signed, and adding 2**(N-1). ++ ++ * reload.c (find_reloads_address): For out-of-range stack slot, ++ reload the displacement into a reg. ++ (find_reloads_toplev): For subreg of a reg with a reg_equiv_address, ++ turn the whole thing into a memref. ++ ++Thu Aug 24 14:07:03 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * c-decl.c (grokdeclarator): If function is declared `extern inline', ++ set current_extern_inline. ++ (start_function): In that case, set TREE_EXTERN in function decl. ++ * toplev.c (rest_of_compilation): In that case, don't really compile. ++ (compile_file): Don't output such functions at the end either. ++ ++ * c-typeck.c (build_function_call): Do set NAME if we have one. ++ ++ * Prevent any variability in results of qsort. ++ * stupid.c (stupid_reg_compare): Compare by regno as last resort. ++ * global-alloc.c (allocno_compare): Same idea. ++ * local-alloc.c (qty_compare_1): Same idea. ++ * reload1.c (hard_reg_use_compare, reload_reg_class_lower): Same idea. ++ ++ * cccp.c (macroexpand): If read one arg, but it's whitespace, ++ consider that 0 args for checking number of args. ++ Improve plurals in error messages. ++ ++ * expr.h (inhibit_defer_pop): New name for current_args_size, ++ now declared here. ++ (NO_DEFER_POP, OK_DEFER_POP): Moved here. ++ * expr.c: Names related to current_args_size renamed. ++ (clear_current_args_size): Deleted. ++ * stmt.c (expand_function_start): Init inhibit_defer_pop here. ++ ++ * stmt.c (expand_start_stmt_expr): Do NO_DEFER_POP. ++ (expand_end_stmt_expr): Do OK_DEFER_POP, and don't do deferred pops. ++ ++ * Makefile (c-parse.tab.c): Pass -o option to Bison. ++ ++Wed Aug 23 23:14:06 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * expmed.c (store_bit_field, extract_bit_field): ++ Use GET_MODE_WIDER_MODE to scan possible modes for bestmode. ++ ++ * Makefile (stamp-gnulib2): Discard error messages from `ar d'. ++ ++Tue Aug 22 00:31:51 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * final.c (output_source_line): In COFF, don't output `.ln 0'. ++ ++ * Makefile (stamp-gnulib2): Depend on gnulib. For parallel make. ++ ++ * stmt.c (uninitialized_vars_warning): Don't crash if DECL_RTL is 0. ++ ++ * i386.md (truncdfsf2): Pay attention whether stack top is dead. ++ ++Mon Aug 21 22:02:40 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * reload1.c (choose_reload_regs): Don't use regno uninitialized, ++ in the code that does find_equiv_reg. ++ ++Sun Aug 20 00:06:47 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * m68k.md (movqi): Was outputting bad code for areg->mem and mem->areg. ++ ++ * explow.c (memory_address): Handle a hard reg in wrong reg class. ++ ++ * stmt.c (expand_function_end): Set REG_FUNCTION_VALUE_P in return ++ reg when returning address of structure value block. ++ ++ * integrate.c (save_for_inline): Preserve integrated bit on insns. ++ ++Sat Aug 19 14:20:07 1989 Richard Stallman (rms at apple-gunkies.ai.mit.edu) ++ ++ * combine.c (subst): Don't change (subreg:M (mem:N ...)) to ++ (mem:M ...) if address is mode-dependent. ++ ++ * config.gcc: Copy and alter Makefile for any srcdir except `.'. ++ In that case, make a .gdbinit as well. ++ ++ * sparc.md (andcbsi3, iorcbsi3, xorcbsi3): These are not commutative. ++ ++ * vax.md (cmpv and cmpzv patterns): Use COMPARE, not MINUS. ++ ++Fri Aug 18 12:24:52 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * alliant.md (movqi): Change move to mov in assembler code. ++ ++ * integrate.c (expand_inline_function): ++ Handle args passed in regs and copied to slots reached via arg ptr. ++ ++ * out-sparc.c (output_delayed_branch): ++ Do alter_subreg on operands of delay insn. ++ ++ * reload1.c (choose_reload_regs): Look for a reg to share ++ before one that we won't share. ++ ++ * expr.h: Define OPTAB_MUST_WIDEN. ++ * optabs.c (expand_binop): Handle that case. ++ * expmed.c (expand_shift): Use that when widening lshift to ashift. ++ ++ * optabs.c (emit_cmp_insn): Use CONST0_RTX, not individual vars. ++ ++ * gnulib2.c (lsh*di3, ash*di3): Return right away if count is zero. ++ Otherwise tried to shift by 32. ++ Also replace constant 32 by something symbolic. ++ ++ * final.c (output_source_line): Output line number in COFF ++ even if wrong file. ++ ++Thu Aug 17 15:16:34 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * Makefile (version.o): Make this a target; specify source file. ++ (obstack.o): Likewise. ++ ++ * config.gcc (i860): New alternative. ++ ++ * i860.md (movstrsi): Record the alignment as operand 3. ++ Renumber following (internal) operands. ++ * out-i860.c (output_block_move): Rewrite as in out-sparc.c. ++ (output_size_for_block_move): Likewise. And don't ++ subtract alignment from the size. ++ ++Wed Aug 16 13:27:12 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * loop.c (combine_movables): Don't combine zero-extend ++ registers that live outside the loop. ++ ++ * integrate.c (expand_inline_function): Use copy_to_mode_reg ++ to set up this_struct_value_rtx, to handle sums right. ++ ++ * Makefile: Use $(srcdir) in bison output files used as deps. ++ Supply some missing deps. ++ (*.info, doc): *.info files go in srcdir. ++ ++Tue Aug 15 00:11:12 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * i860.md, tm-i860.h, out-i860.c: New files. ++ ++ * c-decl.c (duplicate_decls): Fix bug determining whether NEWDECL ++ is a definition or just a decl. ++ Combine code to preserve various things from old definition ++ through a declaration. ++ ++ * config.gcc: Scan all args at beginning, setting variables. ++ Arg of form -srcdir=... sets srcdir explicitly. ++ srcdir now doesn't contain a slash, and is used with a slash. ++ ++ * Makefile (install): Copy header files and gcc.1 from srcdir. ++ But copy float.h from current dir. (Remove that from USER_H.) ++ (various): Use new variable INCLUDES to get the -I options. ++ Add -I. at the beginning of these. ++ (gnulib, gnulib2): Likewise, use SUBDIR_INCLUDES. ++ Also, get source file from srcdir. ++ Also, depend on $(CONFIG_H). ++ (alloca.o): Get alloca.c from srcdir. ++ ++ * reload1.c (emit_reload_insns): Bug in last change: ++ don't fail to set this_reload_insn. ++ ++ * Makefile (Bison rules): Specify $(srcdir) for target and source. ++ (Explicit C rules): Specify $(srcdir)/ for source in commands. ++ Use sed to eliminate `./' in normal case. ++ (insn-*.c): Use $(srcdir) to run move-if-change. ++ ++ * config.gcc: Check . and .. for the sources. ++ If in .., use that when making links. ++ Also, copy Makefile, alter srcdir in it, and add a VPATH. ++ ++ * stmt.c (expand_end_case): When converting CONST_INT index ++ to an INTEGER_CST, sign-extend if signed type. ++ ++Mon Aug 14 13:51:08 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * c-decl.c (duplicate_decls): Warn for qualifier mismatch ++ only if pedantic; don't consider it a type mismatch. ++ Merge the qualifiers of the two decls if the types match. ++ ++ * expmed.c (store_bit_field): For insv, memref displacement ++ always counts in bytes, regardless of unit fetched. ++ When checking predicate of op0, accept any mode. ++ ++ * optabs.c (expand_float): One call to can_float_p had args backwards. ++ ++ * loop.c (check_dbra_loop): Set the JUMP_LABEL of the new jump insn. ++ Increment label's use count rather than storing 2. ++ ++ * Makefile: Instead of $<, which fails in certain makes, ++ use $@ and then substitute in the name with sed. ++ ++ * out-sparc.c (output_scc_insn): Handle CC_REVERSED for ordered tests. ++ Use orcc insns to store the result and set cc's for it. ++ ++ * sparc.md (scc combination patterns): ++ Use operands[0] as basis for recorded cc value. ++ ++ * gnulib2.c (floatdidf, fixdfdi, fixunsdfdi): New functions. ++ ++ * gnulib.c (floatdidf, fixdfdi, fixunsdfdi): Deleted. ++ (union longlong, union double_di): Deleted. ++ (HIGH, LOW): Deleted. ++ These were deleted because most did not handle full range of DI ++ and they didn't use the right calling convention for DI. ++ ++Sun Aug 13 13:06:45 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * c-typeck.c (comptypes): Qualifiers must match. ++ (Was already true for scalars.) ++ Also, array elt qualifiers must match. ++ ++ * tm-apollo68.h (STRUCT_VALUE): Make it 0. ++ (This was done before and lost.) ++ * out-i386.c (function_epilogue): Use ret $4 to pop structure address. ++ (This was done before and lost.) ++ ++ * out-i386.c (call_top_dead_p): Don't fail to check ++ the rtx code of the insns themselves. ++ (This was done before and lost.) ++ ++ * out-sparc.c (output_block_move): If align is 8, make it 4. ++ ++ * typeclass.h: New file. ++ * expr.c: Include it. ++ (expand_builtin): Use those codes in __builtin_classify_type. ++ ++ * Makefile (all, lang-c): Reinstall gnulib2. ++ ++ * Makefile (gnulib2): Don't give up if `ar d' fails. ++ ++ * expr.c (emit_library_call): New 2nd arg NO_QUEUE. ++ All callers changed to pass it. ++ * optabs.c (expand_binop, expand_unop): Don't call emit_queue. ++ Instead, pass 1 for NO_QUEUE to emit_library_call. ++ ++Sat Aug 12 12:05:22 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * reload1.c (emit_reload_insns): Decision for where to put input ++ reload insn is now common to ordinary case and auto-increment. ++ Likewise, updating these positions afterward. ++ ++ * stmt.c (assign_parms): Treat last named arg as nameless. ++ * expr.c (expand_call): Likewise. ++ ++ * explow.c (copy_to_mode_reg): Use force_operand for PLUS or MULT. ++ (copy_addr_to_reg): Use copy_to_mode_reg. ++ ++ * expmed.c (store_bit_field): Handle case where insv rejects memrefs. ++ ++ * tm-convex.h (ASM_OUTPUT_ALIGN): Magic to handle the fact ++ that this is not called when LOG is 0. ++ ++Fri Aug 11 16:39:51 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * emit-rtl.c (get_lowpart): For multi-word, in error check, ++ test the unit size of the containing mode. ++ ++ * cccp.c (macroexpand, dump_all_macros): Return void. ++ (macroexpand): Cast sprintf arg to char*. ++ (error, warning, error_with_line): Declare first arg char*. ++ ++Thu Aug 10 21:42:13 1989 Richard Stallman (rms at hobbes.ai.mit.edu) ++ ++ * expr.c (expand_call): ++ Use force_operand to copy arithmetic to register. ++ ++ * dbxout.c (dbxout_symbol): Go back to N_FUN for const variable. ++ ++ * integrate.c (expand_inline_function): Use proper machine mode ++ for a structure value in memory at address passed by caller. ++ ++Wed Aug 9 15:21:36 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * config.gcc: Delete unnecessary variable assignments in case stmt. ++ (isi68-nfp): New alternative. ++ ++ * combine.c (try_combine): Don't substitute for a register ++ which is being explicitly clobbered. ++ ++ * This change was requested for C++. ++ * varasm.c (decode_reg_name, make_decl_rtl): Arg ASMSPEC now char *. ++ * toplev.c (rest_of_decl_compilation): Likewise. ++ * c-decl.c (finish_decl): Change call to rest_of_decl_compilation. ++ ++ * tree.h (struct tree_decl): Pack machine_mode into 8 bits. ++ ++ * explow.c (memory_address, copy_to_reg): ++ Use force_operand to copy arithmetic to register. ++ ++ * tm-isi68-nfp.h: New file. ++ * tm-isi68.h: Allow overriding TARGET_DEFAULT, and let that ++ change CPP_SPEC and LINK_SPEC. ++ (ASM_FILE_START): No `.globl fltused' if soft-float. ++ ++Tue Aug 8 21:50:52 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varasm.c (const_hash): For constructor, mask TREE_TYPE to HASHBITS ++ bits and take modulo, so we don't get negative numbers. ++ ++ * varasm.c (record_constant_1, compare_constant_1): ++ Record and compare the width of an integer. ++ ++ * varasm.c (assemble_function, assemble_variable, get_or_assign_label): ++ (force_const_mem): Don't call ASM_OUTPUT_ALIGN if boundary is 1. ++ ++ * c-decl.c (duplicate_decls): Consider const and volatile as part of ++ type when checking for match and when installing new type into OLDDECL. ++ ++ * expr.c (do_store_flag): Make sure target fits operand predicate. ++ Also, omit the AND insn when true-value is 1 ++ and the mode we get is wider than the one we want. ++ ++ * genrecog.c (main): Make insn-recog.c include real.h. ++ ++Mon Aug 7 16:58:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * genemit.c (main): Define `operands' as `emit_operands', ++ not `recog_operands'. ++ ++ * reload1.c (emit_reload_insns): Don't copy back a dead output reg. ++ ++Sun Aug 6 13:56:53 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * sdbout.c (plain_type_1, sdbout_one_type): Use the main variant. ++ (sdbout_type_fields): No need to check TREE_ASM_WRITTEN here, ++ since sdbout_one_type does that. ++ ++ * expr.c (do_store_flag): Ensure the CLOBBER doesn't clobber an input. ++ ++ * fold-const.c (fold_convert): Attempt to avoid overflow ++ when converting real to integer. Use unsigned conversion for ++ low part; always convert as positive and then change sign; ++ subtract high part before converting low part. ++ Also, check for real values out of range for chosen int type; ++ warn and do not convert. ++ ++ * tm-hp9k320.h (CPP_SPEC) [not HPUX_ASM]: Don't define mc68000 here. ++ (CPP_PREDEFINES): Remove mc68k, add m68k and mc68000. ++ [HPUX_ASM]: Define CPP_SPEC here as in the other case, ++ but add __HPUX_ASM__ to each alternative. ++ ++ * tm-m68k.h (FUNCTION_EPILOGUE): Call new hook FUNCTION_EXTRA_EPILOGUE. ++ * tm-altos3068.h (FUNCTION_EXTRA_EPILOGUE): Define it. ++ ++ * Makefile: Use $< wherever appropriate. ++ Also put definitions of customization vars before the comments ++ saying how to override them. ++ ++Sat Aug 5 14:15:39 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i386.md (sne): Typo in opcode name. ++ ++ * tree.h (struct tree_identifier): Delete redundant/unused error_locus. ++ ++Fri Aug 4 00:04:10 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varasm.c (const_hash, compare_constant_1, record_constant_1): ++ Compare types only for record constructors, not for array constructors. ++ ++ * dbxout.c (dbxout_parms): When outputing parm from home in local slot, ++ with address from the RTL, don't do big-endian correction on it. ++ ++ * c-typeck.c (build_unary_op): Do default conversion for unary +. ++ ++ * cccp.c (rescan): Accept comments between macro and its args. ++ ++ * c-decl.c (lang_decode_option): -traditional implies writable strings. ++ ++ * cccp.c (trigraph_pcp): Make warning msg more accurate. ++ ++ * c-typeck.c (c_expand_asm_operands): Delete the default promotion ++ which was inserted mysteriously since 1.35. ++ ++ * global-alloc.c (global_conflicts): Allocate regs_set only once. ++ Make it twice as big since clobbers are stored twice. ++ ++ * sparc.md (block move patterns): Record and use alignment operand. ++ * out-sparc.c (output_block_move): Get alignment from there. ++ (output_size_for_block_move): Greatly simplified. ++ ++ * tm-i386v.h (PCC_BITFIELD_TYPE_MATTERS): Define it. ++ ++ * stor-layout.c (layout_record): Anonymous bitfields don't affect ++ overall structure alignment, in PCC_BITFIELD_TYPE_MATTERS case. ++ ++ * loop.c (strength_reduce): Prevent hard reg from becoming biv or giv. ++ ++ * combine.c (subst): Simplify (eq (neg ...) (const_int 0)). ++ ++Thu Aug 3 13:08:05 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cse.c (fold_rtx): For (op var const) special cases, also check ++ for constant as first argument. ++ ++ * c-decl.c (pushtag): For global_binding_level, make permanent nodes. ++ ++ * expr.c (do_store_flag): Put the CLOBBER before the comparison. ++ ++ * expr.c (emit_push_insn): Conditionalize recent changes ++ on no FIRST_PARM_CALLER_OFFSET, so they don't happen on sparc. ++ ++ * out-sparc.c (gen_scc_insn): ++ Don't be confused by CLOBBER emitted by do_store_flag. ++ Skip past such insns looking for last_insn. ++ Don't alter last_insn; instead, patch it to a NOTE and emit new insn. ++ ++ * varasm.c (const_hash, compare_constant_1, record_constant_1): ++ For a CONSTRUCTOR, hash/compare/record type as well as elts. ++ ++ * cse.c (cse_insn): July 18 change was wrong. ++ Now, invalidate at the beginning any regs explicitly clobbered ++ so they will not be substituted for if they appear as inputs. ++ * sparc.md (movstrsi): Copy addresses to temp regs, then use them. ++ ++ * loop.c (record_giv): When comparing life spans for setting ++ ->forces, use luids consistently, not uids. ++ ++ * sparc.md (ashlsi3, ashrsi3, lshrsi3): Truncate constants mod 32. ++ ++Wed Aug 2 17:50:30 1989 Richard Stallman (rms at sugar-bombs) ++ ++ * mips.md (patterns to move a subreg): Deleted. ++ ++Sun Jul 30 19:23:13 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (process_command): Skip `-b' like `-B', in 2nd scan. ++ ++ * xm-sunos4.h: Deleted. ++ * tm-sparc.h, tm-sun3.h: Define LINK_SPEC here instead. ++ * tm-sun4os3.h: Undef it here. ++ * tm-sun3os3.h, tm-sun3os3nf.h: New files to undef LINK_SPEC. ++ * config.gcc: Use those new files where needed. ++ ++ * config.gcc: Delete sun3-fpa and sun3-os4-fpa. ++ * tm-sun3-fpa.h: Deleted. ++ ++ * cccp.c (do_include): Mention even non-ex files for -M. ++ ++ * out-mips.c (addr_compensate): Handle HImode. ++ * mips.md (Set HI from subreg of SI rule): ++ Allow operand in memory. ++ ++ * mips.md (cmpqi, cmphi): Patterns deleted. ++ (cmpsi, cmpsf, cmpdf): Change predicates to register_operand. ++ ++ * cexp.y (rule for ?:): Result is unsigned if either operand is. ++ ++ * expr.c (emit_push_insn): If PARTIAL > 0, load the partial regs ++ at the end, in case the rest of the push does a function call. ++ ++ * reload1.c (alter_frame_pointer_addresses): ++ After altering a PLUS, re-fetch CODE before scanning subexps. ++ ++ * stmt.c (assign_parms): Don't copy the arg pointer value ++ if it is also the frame pointer. If we do copy it, ++ inhibit REG_EQUIV notes for parms copied into pseudo regs ++ ++ * integrate.c (copy_for_inline, copy_rtx_and_substitute): ++ Set up filename and lineno fields of copy of ASM_OPERANDS. ++ ++Sat Jul 29 18:58:49 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (expand_inline_function): Handle struct-value-addr ++ passed in memory just like that passed in reg: ++ in either case, translate the pseudo-reg made in ++ expand_function_start. ++ (function_cannot_inline_p): Permit inlining in that case. ++ But reject it if using pcc-style return convention. ++ ++ * stor-layout.c (layout_type): Consider STRICT_ALIGNMENT ++ for ARRAY_TYPE just as for RECORD_TYPE. ++ ++Wed Jul 26 12:54:59 1989 Richard M. Stallman (rms at mipos3) ++ ++ * cse.c (fold_rtx): If WIDTH is zero for binary operator, ++ look at the modes of the original operands. ++ ++ * cse.c (cse_insn): Set prev_insn_explicit_cc0, for (set (cc0) INT). ++ (predecide_loop_entry): Likewise. ++ (fold_rtx): Look at it, for (if_then_else (cc0) ...). ++ ++ * expr.c (expand_builtin): Pass back return value from ++ __builtin_saveregs. ++ ++ * stmt.c (assign_parms): Allow arg pointer reg not to be fixed. ++ If it is not, copy it to a pseudo reg and use that later on. ++ ++Tue Jul 25 15:42:04 1989 Richard M. Stallman (rms at mipos3) ++ ++ * expr.c (expand_builtin): New builtin __builtin_classify_type. ++ * tree.h, c-decl.c: Additional support. ++ ++ * flow.c (mark_used_regs): Treat arg pointer like stack pointer. ++ ++ * expr.c (emit_library_call): ++ Pass (tree)0 as TYPE arg to FUNCTION_ARG, etc. ++ ++Mon Jul 24 11:18:10 1989 Richard M. Stallman (rms at mipos3) ++ ++ * loop.c (regs_match_p): Fix braino. ++ ++ * integrate.c (copy_for_inline, copy_rtx_and_substitute): ++ Make ASM_OPERANDS constraint vector be shared like operand vector. ++ ++ * xm-iris.h: New file. ++ ++ * Makefile (stage4): New target. ++ ++ * gnulib2.c (badd, bsub, bmul, bdiv): If want long value from ++ arithmetic, widen the operands first. ++ (__div_internal aka bdiv): Rename to __bdiv. ++ ++ * sparc.md (seq combination patterns): Fully initialize cc_status. ++ ++ * expr.c (emit_push_insn): Like July 19 change, for BLKmode. ++ ++ * stmt.c (expand_function_end): Stack-restore for alloca ++ is now done after the return_label. ++ ++ * loop.c (scan_loop): Set MAYBE_NEVER for conditional jump to loopbeg. ++ ++ * integrate.c (copy_rtx_and_substitute): Allow mapping of hard regs. ++ (expand_inline_function): Always create parm_map. ++ Handle structure value that way if nec. even if no parms. ++ Otherwise, find the pseudo used in the function to hold the ++ structure address, and map it to a new pseudo. ++ ++ * expr.c (expand_call): ++ Use mark_addressable to make FNDECL addressable. ++ * c-typeck.c (mark_addressable): No longer static. ++ ++ * cse.c (cse_insn): Modify last change: don't canon_reg ++ for hard regs inside clobbers. ++ ++ * expr.c (expand_assignment): ALIGN arg to store_field comes from ++ the structure, not from the value stored. ++ ++Fri Jul 21 16:23:45 1989 Richard M. Stallman (rms at mipos3) ++ ++ * stmt.c (warn_if_unused_value): Don't warn for a cast ++ around a MODIFY_EXPR. ++ ++ * tm-hp9k320.h (PCC_STATIC_STRUCT_RETURN): Undefine it. ++ (CPP_PREDEFINES): Add some. ++ ++ * combine.c (simplify_and_const_int): ++ Simplify (and (ashiftrt (zero_extend FOO) N) M). ++ ++ * optabs.c (expand_binop): When widening, ++ for some operations we need not actually extend. ++ ++Thu Jul 20 16:16:35 1989 Richard M. Stallman (rms at mipos3) ++ ++ * Makefile (insn-emit.o): Depend on insn-codes.h. ++ ++ * stmt.c (check_for_full_enumeration_handling): ++ Handle all cases for TYPE_NAME of enum type. ++ ++Wed Jul 19 17:00:39 1989 Richard M. Stallman (rms at mipos3) ++ ++ * fold-const.c (fold_convert): Don't fail to force_fit_type. ++ ++ * expr.c (emit_push_insn): When pushing only part of scalar on stack, ++ adjust stack offset not to count the words not pushed. ++ ++ * stmt.c (expand_function_end): Always put return structure address ++ in return register. ++ ++ * c-typeck.c (process_init_constructor): Assume 0 for nameless field. ++ ++ * recog.c (general_operand, memory_operand): ++ Check validity of mem address using the mode of the MEM. ++ ++ * fixincludes: When calling egrep, use redirect, not -s. ++ ++Tue Jul 18 11:18:55 1989 Richard M. Stallman (rms at mipos3) ++ ++ * Makefile (bootstrap*): Pass value of libdir down. ++ ++ * cse.c (cse_insn): Do canon_reg on any CLOBBERs and USEs. ++ ++ * cse.c (cse_insn): Don't use no_labels_between_p to check ++ for jump to following label; find following label and compare. ++ ++ * combine.c (try_combine): Don't substitute into subreg(x)=y ++ if modes of x and y are not tieable. ++ ++ * out-i386.c (call_top_dead_p): Don't fail to check ++ the rtx code of the insns themselves. ++ ++ * i386.md (tstsf, tstdf): Don't discard TOS if not dead. ++ ++ * stupid.c: Don't use regs with PRESERVE_DEATH_INFO_REGNO_P ++ for pseudos which live across jumps or labels. ++ (stupid_life_analysis): Update last_jump_suid, last_label_suid. ++ (stupid_mark_refs): Use those to set reg_crosses_blocks. ++ (stupid_find_reg): Check that data, passed from stupid_life_analysis. ++ ++ * toplev.c (main): Avoid using caddr_t. ++ ++ * mips.md (inverted bgeu peephole): Typo in opcode. ++ ++Mon Jul 17 12:29:45 1989 Richard M. Stallman (rms at mipos3) ++ ++ * i386.md (mulb patterns): Turned off due to assembler bug. ++ ++ * rtl.c (read_name): Use 0, not NULL, for character. ++ ++ * alliant.md (movqi): Typos in mov opcodes. ++ ++ * tm-sparc.h, tm-spur.h (CONST_DOUBLE_OK_FOR_LETTER_P): ++ Use CONST_DOUBLE_LOW, etc. ++ ++ * stmt.c (expand_function_end): Check value of EXIT_IGNORE_STACK, ++ not just whether defined. ++ ++ * i386.md (seq, etc.): New patterns. ++ * expr.c (do_store_flags): If result is wrong mode, ++ ensure rest of bits are cleared. ++ Before storing low part of TARGET, emit a CLOBBER for it. ++ ++ * i386.md (load address): Use an immediate add if possible. ++ ++ * i386.md (ashlsi3): Don't generate leal; shift is faster. ++ ++ * Now struct_value_rtx is 0 to treat it as a parm. ++ * expr.c (expand_call): Implement that. ++ * integrate.c (expand_inline_function): Don't freak out. ++ * tm-apollo68.h (STRUCT_VALUE): Make it 0. ++ ++ * On 386, called function must pop the structure value address. ++ * tm-i386.h (STRUCT_VALUE): Don't change this. ++ Address is now pushed but not counted as a parm. ++ * out-i386.c (function_epilogue): Use ret $4 to pop that address. ++ * output.h: Declare the current_function_... variables. ++ * final.c: Include output.h. ++ ++ * varasm.c (make_decl_rtl): Insert missing `else', validating reg decl. ++ ++Fri Jul 14 14:12:17 1989 Richard M. Stallman (rms at mipos3) ++ ++ * out-sparc.c, out-spur.c (output_move_double): ++ Fixed typo, addreg0 => addreg1. ++ ++ * c-decl.c (lang_decode_option): Handle -fshort-enums. ++ (finish_enum): In that case, give enum minimum number of bytes. ++ * toplev.c (main): Default flag_short_enums. ++ * toplev.c, flags.h (flag_short_enums, flag_signed_char): ++ Define those flags here, not in c-decl.c and c-tree.h. ++ ++ * i386.md (mulqi3, umulqi3): New patterns. ++ ++ * c-convert.c (convert_to_integer): Tighter restrictions on ++ distributing truncation through max, min, and multiplication. ++ If operands were extended from unsigned, make the operation ++ unsigned. ++ ++ * cccp.c (main): Fix bug where #include <...>, when -I- was used, ++ failed to search standard dirs and/or searched some dirs ++ intended only for #include "...". ++ ++ * tm-mips.h (FUNCTION_PROLOGUE,FUNCTION_EPILOGUE): ++ Increment push_loc after store or load, not before. ++ ++Thu Jul 13 11:24:30 1989 Richard M. Stallman (rms at mipos3) ++ ++ * emit-rtl.c (add_insn_after): Don't update last_insn ++ if insn is in a sequence. Instead, update end of sequence. ++ ++ * stmt.c (fixup_var_refs): Update end of stacked sequence. ++ ++ * stmt.c (expand_function_start): Set result rtl before assign_parms. ++ ++ * optabs.c (emit_unop_insn): Set PREV_INSN after preliminaries. ++ ++ * stmt.c (warn_if_unused_value): Do CONVERT_EXPR like NOP_EXPR. ++ ++ * stmt.c (expand_function_start): Make sure parm_birth_insn ++ is a NOTE. ++ ++ * Makefile (clean): Delete tmp-insn-*. ++ ++Wed Jul 12 14:24:12 1989 Richard M. Stallman (rms at mipos3) ++ ++ * i386.md (mulqi3): Restrict operand 2 to `q' reg. ++ ++ * reload1.c (choose_reload_regs): Check HARD_REGNO_MODE_OK ++ for regs to be inherited. ++ Also check HARD_REGNO_MODE_OK at end for modes of both ++ reload_in and reload_out as well as reload_mode. ++ ++ * Makefile (maketest): Update for config subdir. ++ ++Tue Jul 11 16:29:57 1989 Richard M. Stallman (rms at mipos3) ++ ++ * integrate.c (copy_decl_tree): Copy TREE_USED of each LET_STMT. ++ ++ * make-cc1.com: Changes by Angel Li. ++ Define variables CC, CFLAGS, LDFLAGS, LIBS. ++ Use LIBR library, not LIB. Specify a /INC in CFLAGS. ++ Use MCR to run the gen* files. Add some comments. ++ * make-cccp.com: Similar. ++ * config-gcc.com: New file. ++ ++ * stmt.c (assign_parms): Compute parm alignment from passed type. ++ ++ * c-typeck.c (actualparameterlist): Instead of truncating ++ and then promoting for PROMOTE_PROTOTYPES, go straight to int. ++ ++ * c-parse.y (setspecs): Save old current_declspecs on a stack. ++ (decl, component_decl): Restore from that stack. ++ ++Wed Jul 5 15:01:00 1989 Richard Stallman (tiemann at yahi) ++ ++ * tm-aix386.h, xm-aix386.h: New files. ++ ++ * loop.c (check_dbra_loop): Handle either test or compare ++ for insn two before loop end; detect and reject anything else. ++ ++ * expr.c (expand_call, expand_builtin): If alloca is done, ++ set current_function_calls_alloca. ++ * stmt.c (expand_function_end): If so, generate code to save and ++ restore the stack pointer, if not EXIT_IGNORE_STACK. ++ ++ * ns32k.md (movsi): Fixes for moving from fp or sp. ++ ++ * tm-mips.h (ASM_OUTPUT_ASCII): Start new .ascii every 256 chars. ++ ++Tue Jul 4 11:01:00 1989 Richard Stallman (tiemann at yahi) ++ ++ * reload1.c (choose_reload_targets): Don't depend on ++ reload_spill_index when cancelling invalid inheritance. ++ Also, abort if trying to preserve death info ++ on a spill reg used in operand addressing. ++ ++ * fold-const.c (fold): Don't fold "foo"[n] here. ++ * expr.c (expand_expr): Do it here. ++ Handle wide strings correctly. ++ ++ * i386.md (movsf,movdf): Disallow mem-mem moves. ++ Enable mem-to-reg moves. ++ ++ * c-decl.c (finish_{struct,enum}): Warn if inside parm decls. ++ (in_parm_level_p, declare_parm_level): Record when inside. ++ * c-parse.y (parmlist, parmlist_or_identifiers): Call ++ declare_parm_level. ++ ++ * c-decl.c (parmlist_tags_warning): Revise warning message text. ++ ++ * tm-hp9k320.h (ASM_SPEC): Pass -V switch to assembler. ++ ++ * tm-sun386.h (ASM_START_FILE): Truncate filename to 14 chars. ++ ++ * c-typeck.c (decl_constant_value): Use only literal values. ++ ++Sat Jul 1 17:29:54 1989 Richard Stallman (tiemann at yahi) ++ ++ * integrate.c (copy_rtx_and_substitute): Don't make nested SUBREGs. ++ ++ * stmt.c (expand_function_start): Set new global ++ current_function_returns_pointer. ++ ++ * stmt.c (get_frame_size): Return the size, not the offset. ++ * integrate.c (expand_inline_function): When setting FP_DELTA, ++ compensate for this change. ++ * tm-alliant.h,tm-mips.h,tm-sparc.h,tm-tahoe.h ++ (FUNCTION_PROLOGUE,FUNCTION_EPILOGUE): Compensate. ++ ++ * out-mips.c (function_arg): Return 0 for BLKmode. ++ ++ * tm-mips.h (FUNCTION_INCOMING_ARG): Delete; no register windows. ++ * out-mips.c (function_inarg): Delete; no longer used. ++ ++ * mips.md (addsi3): Use register_operand for operands 0,1. ++ (load address): New pattern, following movsi. ++ (fix_trunc*): Use trunc insn, not cvt. ++ (cmpfs + bgt peephole): Operands were backwards in template. ++ ++ * gcc.c (main): Record in explicit_link_files which input files go ++ straight to linker. If linker is not run, complain about them. ++ (execute): Increment execution_count, to show we were called. ++ ++ * gcc.c (validate_all_switches): Check ASM_SPEC, CC1_SPEC, etc., ++ so we find all switches that could be valid. ++ ++ * varasm.c (output_constructor): Position fields according to ++ DECL_OFFSET; don't try to compute alignment here. ++ ++ * tm-sparc.h (PCC_BITFIELD_TYPE_MATTERS): Define this. ++ ++ * reload1.c (emit_reload_insns): Fix stupid error in last change. ++ ++ * c-decl.c (duplicate_decls): If redeclaring builtin, give error is ++ type mismatched; otherwise warn only if -W. ++ ++ * jump.c (jump_back_p): Verify that PREV is not null. ++ ++Mon Jun 26 13:50:28 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (choose_reload_regs): If number of reloads needing ++ spill regs exceeds n_spills, don't inherit any reloads. ++ ++ * sdbout.c (sdbout_record_type_name): Dumb error in last change. ++ ++ * reload1.c (emit_reload_insns): Extend last change: don't use ++ equiv reg if reg is in use at same stage of insn, either. ++ ++Sun Jun 25 00:00:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (emit_reload_insns): Don't use an equivalent register ++ to reload from, if that register was used for reloading ++ earlier in this insn. ++ ++ * sdbout.c (sdbout_record_type_name): Handle a TYPE_DECL as the ++ type name. Get rid of TYPE_TAG_NAME as separate macro. ++ ++ * optabs.c (emit_cmp_insn): Args to memcmp are addresses, not blocks. ++ ++ * reload1.c (choose_reload_regs): Typo, clearing reload_override_in. ++ ++ * tm-i386.h: Add register classes SIREG and DIREG. ++ (enum reg_class, REG_CLASS_NAMES): Define class names. ++ (REGNO_REG_CLASS, REG_CLASS_CONTENTS): Define their contents. ++ (REG_CLASS_FROM_LETTER): Define letters `S' and `D'. ++ ++Sat Jun 24 00:17:16 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (keep_next_level): New function. ++ (struct binding): New slot `keep' says make a LET_STMT for this level. ++ (pushlevel, poplevel): Implement that. ++ * c-parse.y (stmt exprs): Call keep_next_level. ++ ++ * sdbout.c (plain_type_1): Handle REFERENCE_TYPE, METHOD_TYPE. ++ Correct for size less than 0. ++ (plain_type): Correct for size less than 0. ++ ++ * global-alloc.c (mark_reg_set): For CLOBBERs, call mark_reg_clobber. ++ ++ * reload1.c (order_regs_for_reload): Among regs explicitly used, ++ prefer those used less often. ++ ++ * reload1.c (choose_reload_regs): If we find alternate place ++ to reload from, verify it after all reloads assigned. ++ New variable reload_override_in used for this. ++ ++ * combine.c (record_dead_and_set_regs): Look inside SIGN_EXTEND and ++ STRICT_LOW_PART for place being set. ++ (subst): When using reg_last_set to find what a register contains, ++ verify the entire register was set. ++ ++ * toplev.c (rest_of_decl_compilation): Report invalid register name. ++ ++Fri Jun 23 13:19:41 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-hp9k3bsd.h: New file. ++ * config.gcc: New target hp9k320-bsd. ++ ++ * gcc.c (record_temp_file): Don't add a name twice to one queue. ++ ++ * stmt.c (expand_expr_stmt): Call warn_if_unused_value. ++ (warn_if_unused_value): Code extracted from expand_expr_stmt. ++ Recurse to handle COMPOUND_EXPR. Don't warn about COND_EXPR. ++ ++ * tm-encore.h (DBX_REGISTER_NUMBER): Override tm-ns32k.h; ++ return operand unchanged. ++ ++ * reload1.c (emit_reload_insns): Don't use recog_memoized ++ on an asm. ++ ++ * jump.c (delete_insn): Update last_insn. ++ * emit-rtl.c (set_last_insn): New function. ++ ++ * reload1.c (reload): Put a note at end of insn chain. ++ ++ * gcc.c: Put cpp output of .S file into a .s file. ++ ++Thu Jun 22 22:14:35 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * optabs.c (expand_binop, expand_unop): Emit queue before library call. ++ It is done within emit_library_call, and cse screws up if there is a ++ queued insn in the middle of a cse-able sequence. ++ ++Wed Jun 21 11:57:22 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-mips.h (CPP_PREDEFINES): Define -Dunix. ++ ++ * reload.c (combine_reloads): Combined reload needed for entire insn. ++ ++ * c-parse.y (yylex): Braino checking for out-of-range escape seq. ++ ++ * stor-layout.c (layout_union): Handle PCC_BITFIELD_TYPE_MATTERS. ++ (layout_struct): Don't let a bitfield cross the storage unit ++ of its type, if PCC_BITFIELD_TYPE_MATTERS. ++ ++Tue Jun 20 00:03:48 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varasm.c (get_or_assign_label): Let CONSTANT_ALIGNMENT specify ++ alignment of the constant. ++ CONSTANT_ALIGNMENT is a new optional macro. ++ ++ * varasm.c (force_const_mem, get_or_assign_label): ++ Make buffer bigger. ++ ++ * toplev.c (print_target_switch_defaults): New fn called for -version. ++ ++ * toplev.c (compile_file): Detect error closing output file. ++ ++ * stor-layout.c (fixup_unsigned_type): Don't shift by 32. ++ ++ * stmt.c (emit_case_nodes): Pass UNSIGNEDP along to emit_cmp_insn. ++ ++ * stmt.c (expand_end_case): If index is narrow and cannot be ++ directly compared, widen it just once. ++ ++ * c-parse.y (yylex): Support multi-character constants. ++ Thorough rewrite of char constant parsing. ++ ++ * c-decl.c (pushdecl): Replace local extern function decl with ++ previous global decl if latter is inline, or builtin, or has ++ more arg type info. ++ ++ * hard-params.c (xmalloc): Define it, for alloca.c. ++ ++ * tm-hp9k320.h (STANDARD_STARTFILE_PREFIX): Override -D in Makefile. ++ ++ * expmed.c (store_fixed_bit_field): Avoid shift by 32. ++ ++ * stmt.c (expand_function_start): Emit a NOTE_INSN_FUNCTION_BEG. ++ * final.c (final_scan_insn): For SDB output, do the ++ sdbout_begin_function at that note. ++ ++ * reload1.c (choose_reload_regs): If a reload reg inherits ++ from a previous reload, verify safety after all reloads are assigned. ++ ++ * c-decl.c (build_enumerator): Remove no-op casts. ++ ++ * reload.c (find_reloads): If an earlyclobber operand matches ++ an input operand it is constrained to match, that's not a problem. ++ If an earlyclobber operand loses due to earlyclobber, its matching ++ input operand also loses. ++ ++ * reload1.c (choose_reload_regs): Don't use result of find_equiv_reg ++ if that reg is used for reloading in an earlier part of the insn. ++ ++ * cse.c (fold_rtx): If WIDTH is 0, don't try sign-extending ARG0, ARG1. ++ ++ * Makefile (hard-params*): Use $(OLDCC). ++ ++ * c-typeck.c (c_alignof): No warning for -pedantic. ++ ++ * c-parse.y (readescape): Don't have both error and warning ++ on one hex escape. ++ ++ * c-parse.y (yylex): Treat vertical tab as white space. ++ (skip_white_space): Likewise. ++ ++ * c-parse.y (datadef): If pedantic, warn for stray semicolon. ++ ++ * expr.c (expand_increment): Pass accurate unsignedp arg ++ to expand_binary_op. ++ ++Mon Jun 19 13:36:20 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * config.gcc (news, news-gas): Use xm-m68k.h. ++ ++ * final.c (output_asm_label, output_addr_const): Make buf bigger. ++ ++ * cexp.y (main): Handle EOF on input. ++ (lookup, warning): Provide as a dummy. ++ (is_idchar, is_idstart): Declare as unsigned char. ++ ++ * cexp.y (parse_escape): Use TARGET_NEWLINE, etc., as values. ++ Support hex escapes. Warn if octal or hex escape doesn't fit in char. ++ ++ * cexp.y (yylex): Sign-extend char constants if appropriate. ++ ++ * genemit.c: Make insn-emit.c include insn-flags.h. ++ ++ * gcc.c: Move record_temp_file past page which declares vflag. ++ ++ * integrate.c (expand_inline_function): If copying an insn with ++ a REG_EQUIV note, make a similar note. ++ ++ * Allow reload regs to be reused for parts of an insn. ++ * reload.c (find_reloads): Classify each reload for which part ++ of the insn it is needed in. ++ (find_reloads_address, etc.): Pass down the overall operand ++ that this is part of, to record it on address reloads. ++ (push_reload): Record that for each reload. ++ * reload1.c (reload): Compute maximum needs of any part of the insn. ++ (choose_reload_regs): Part of old choose_reload_targets. ++ Hairier criteria for inheriting reloads and for which ones are ++ available for the next insn to inherit. ++ (emit_reload_insns): The rest of old choose_reload_targets. ++ Emit reload insns in proper order according to where they are needed. ++ * Record `reload_reg_in_use' separately for each part of the insn. ++ (mark_reload_reg_in_use): New function. ++ (reload_reg_free_p, reload_reg_free_before_p): New functions. ++ (reload_reg_reaches_end_p): New function. ++ ++ * expr.c (expand_expr): Emit queue in X+=(Y?Z:A) optimization. ++ ++ * rtlanal.c (rtx_equal_p): Check vectors have same length. ++ ++Sun Jun 18 12:16:14 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stmt.c (expand_expr_stmt): Maybe warn if top-level operator ++ makes an unused result. ++ ++ * gcc.c (delete_temp_files, delete_failure_queue): ++ If -v, report failures in unlink. ++ ++ * Makefile (includes): New target to run fixincludes. ++ (install): Swap arms of if-statement. ++ ++Sat Jun 17 12:41:53 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (layout_union): Arg to error_with_decl was missing. ++ ++ * ns32k.md (movsf): Use CONST_DOUBLE_LOW to extract from CONST_DOUBLE. ++ ++ * loop.c (consec_sets_giv): Change type of force, force2. ++ ++ * combine.c (dump*): Declare arg as FILE*. ++ ++ * Makefile (clean): Delete hard-params. ++ ++ * flow.c (life_analysis): Use a special obstack for the temporary ++ regsets. ++ ++ * m68k.md (clr pattern): On 68000, use moveq to clear data reg. ++ ++ * gvarargs.h: File varargs.h renamed. ++ The old name conflicted with , now that -I. is used. ++ * tree.c, expr.c, emit-rtl.c: Change #include commands. ++ * Makefile (install): Install gvarargs.h under name varargs.h. ++ * gcc.c: Include gvarargs.h, not system's varargs.h. ++ ++ * Makefile: Use -I$(srcdir) before -I$(srcdir)/config. ++ * config/tm.h: Deleted; didn't work if config was a symlink. ++ ++ * cse.c (cse_insn): Record location of inner_dest ++ so it can be replaced properly if a new MEM rtx is made. ++ ++Fri Jun 16 14:17:20 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * make-cc1.com: Compile and link rtlanal.c. ++ ++ * c-typeck.c (build_array_ref): Call fold on the array ref. ++ * fold-const.c (fold): Simplify array ref of string constant. ++ ++ * stmt.c (expand_asm_operands): Fix error message. ++ ++ * Makefile (gnulib2): Remove old members before compiling new. ++ Fix stupid errors. ++ * gnulib2.c (__cmpdi2, __ucmpdi2): Typos in names of interface unions. ++ ++ * genconfig.c (main): Don't write MAX_CLOBBERS_PER_INSN; obsolete. ++ Add 3 to MAX_RECOG_OPERANDS. ++ ++ * cse.c (fold_cc0): Extra arg specifies machine mode. ++ Callers changed. ++ (cse_insn): Record original mode of each src for this purpose. ++ ++Thu Jun 15 12:35:18 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gnulib2.c (_cmpdi2, _ucmpdi2): Moved here from gnulib.c. ++ Use long long for argument type. ++ ++ * rtlanal.c (may_trap_p): Moved here from loop.c. ++ Return 1 for division by explicit zero. ++ ++ * reload1.c (eliminate_frame_pointer, alter_frame_pointer_addresses): ++ Rerecognize insns which are changed by this. ++ ++ * i386.md (call_value): Don't return prematurely. ++ ++ * alliant.md (movqi): Handle moving Aregs to mem and vice versa. ++ (bftst -> btst): Restrict to bitpos less than 8 ++ so operand may be non-offsettable. ++ (nop): New pattern. ++ (return): Was disabled; now deleted. ++ * tm-alliant.h (PRINT_OPERAND_PUNCT_VALID_P): Define it. ++ * out-alliant.c (output_btst): Same change as in out-m68k.c ++ ++ * alliant.md, out-alliant.c: Offsetable -> offsettable. ++ ++ * c-parse.y (rule for stmt_exprs): Make the LET_STMT volatile. ++ ++ * c-decl.c (duplicate_decls): Don't save inline function data ++ from previous definition if a new *definition* is seen. ++ ++ * integrate.c (access_parm_map): Handle subregs and constants. ++ ++ * stmt.c (expand_return): Don't crash if DECL_RTL (DECL_RESULT()) is 0. ++ ++ * tm-tahoe.h (LONGJMP_RESTORE_FROM_STACK): Define it. ++ ++ * tm-mips.h (CONSTANT_P): Deleted; duplicates rtl.h. ++ ++Fri Jun 9 01:39:30 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (float.h): Avoid using $(MAKE). ++ ++ * Don't cram two things into STMT_BODY of a LET_STMT. ++ * tree.h (struct bind_stmt): New field, subblocks. ++ (STMT_SUBBLOCKS): New macro to access it. ++ * print-tree.c (walk): Print new field. ++ * tree.c (build_let_stmt): Store the old BODY arg into subblocks field. ++ * c-parse.y (stmt expr rule): Put rtl expr alone into body field. ++ * dbxout.c (dbxout_block): Recurse on subblocks, not body. ++ * sdbout.c, symout.c: Likewise. ++ * integrate.c (copy_decl_tree): Likewise. ++ * stmt.c (setjmp_protect, uninitialized_vars_warning): Likewise. ++ * expr.c (expand_expr): For LET_STMT, simply use its body. ++ ++ * machmode.def: Add sixth arg to each entry. ++ * tree.h, rtl.h, rtl.c: Add arg to DEF_MACHMODE. ++ * rtl.h (GET_WIDER_MODE): New macro; table in rtl.c. ++ * expr.c (expand_expr): Use that for widening multiply. ++ ++ * stmt.c (fixup_var_refs_1): When converting MEM to QImode for ++ bit field, adjust the address if possible to make bitpos ++ less than 8. ++ * m68k.md (bftst -> btst): Restrict to bitpos less than 8 ++ so operand may be non-offsettable. ++ ++ * cccp.c (do_line): Accept and pass on 3rd arg for enter or leave file. ++ ++ * out-m68k.c (output_btst): Handle COUNT bigger than size of unit. ++ ++ * cccp.c (CHECK_DEPTH): Macro to detect instack overflow. ++ (finclude, macroexpand, expand_to_temp_buffer): Use that. ++ ++ * cccp.c (rescan): Don't check for disabled macro if traditional. ++ (macroexpand): Don't disable macro if traditional. ++ ++ * sdbout.c (sdbout_one_type): Take out last change; assembler barfs. ++ ++ * c-parse.y (maybe_attribute): Eliminate #-syntaxes. ++ Make ATTRIBUTE the name for __attribute. ++ ++ * c-parse.gperf: Add __attribute{,__} and __signed{,__}. ++ * c-parse.y: Install results of that change. ++ ++ * Fix bug in sizeof ({...}). ++ * c-decl.c (poplevel): Set TREE_USED. Return the LET_STMT. ++ * c-parse.y (stmt-expr rule): Put the RTL_EXPR in the LET_STMT, ++ clear its TREE_USED, and use it as the result. ++ * expr.c (expand_expr): Allow LET_STMT as an expr. ++ Set its TREE_USED and expand the TREE_VALUE of its body. ++ * dbxout.c (dbxout_block): Ignore LET_STMT if TREE_USED not set. ++ * sdbout.c, symout.c: Likewise. ++ ++Thu Jun 8 00:06:36 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (yylex): Extend ERANGE-inhibitor for 0.0 ++ to 0.0e0 as well. ++ ++ * flow.c (life_analysis): Prevent allocation of regs live at setjmp ++ on certain machines. Controlled by LONGJMP_RESTORE_FROM_STACK. ++ Sets reg_live_length to -1. ++ * local-alloc.c (block_alloc): Be prepared for that. ++ * tm-vax.h (LONGJMP_RESTORE_FROM_STACK): Define it. ++ ++ * gnulib2.c (all interfaces): Declare args and values as long long, ++ and split them using unions. ++ ++ * loop.c (check_dbra_loop): Don't reverse loop if there are two ++ refs to varying addresses. Consider foo[i] = foo[i-1]. ++ (count_nonfixed_refs): Subroutine to count them. ++ ++ * cexp.y: Distinguish signed and unsigned. ++ An integer value is now represented by a struct. ++ All rules for arithmetic changed. ++ (yylex): Adapt to change in yylval data type. ++ ++ * limits.h (LONG_MIN): Make sure it's a signed long. ++ ++ * sdbout.c (sdbout_one_type): Output types of fields first, ++ if they are structs. Don't go through pointers. ++ (sdbout_field_types): Subroutine for that ++ ++Wed Jun 7 13:00:44 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * fixincludes: Switch to /usr/include before doing vuid_event.h. ++ Use $2 as output directory for sed. ++ ++ * tm-i386.h (FUNCTION_PROFILER): Put counter address in %edx. ++ * tm-i386v.h (LIB_SPEC): Use -L/usr/lib/libp if profiling. ++ ++ * expr.c (expand_increment): Typo testing for BImode component. ++ ++ * convex changes from csmith: ++ * tm-convex.h: use EXTRA_SECTIONS to do .bss. ++ out-convex.c: set_section, align_section are now unused. ++ * convex.md: add pattern to pick an A-reg destination for sums ++ whose source involves a dedicated A reg (frame or arg pointer) ++ * convex.md: immediate and, or, xor instructions store a 32-bit ++ result. Fix instructions that assumed it was 64. ++ ++ * mips.md (probe): New pattern to create stack space. ++ ++ * Makefile (float.h): Ignore errors from hard-params. ++ Specify ./ to run it. ++ ++Tue Jun 6 15:45:27 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * out-tahoe.c: Rename `offsetable' to `offsettable'. ++ ++ * tahoe.md (nop): New pattern. ++ ++ * i386.md (umul...): Constrain operand 1 as `0', not `a'. ++ `a' sometimes wanted two a-regs for operands 0 and 1. ++ ++ * cccp.c: Forward-declare some structs. ++ ++ * c-decl.c: Rearrange fcn fwd decls and struct decls. ++ ++ * expr.c: Move some fcn fwd decls after structs their args use. ++ * genpeep.c, genextract.c: Likewise. ++ ++ * loop.c: Forward-declare some structs. ++ ++ * stmt.c: Move decls of structs before those of static functions. ++ ++ * loop.c (strength_reduce): Delete extra arg to check_eliminate_biv. ++ ++ * integrate.c (expand_inline_function): Supply missing arg ++ to convert_to_mode. ++ ++ * gcc.c (handle_braces): Supply missing arg to do_spec_1. ++ ++ * explow.c (lookup_static_chain): Accept a context arg. ++ ++ * expmed.c (store_split_bit_field): Pass ALIGN arg ++ to extract_fixed_bit_field. ++ ++ * expr.c (expand_assignment): Convert TYPE_ALIGN to bytes. ++ (store_constructor, expand_expr): Likewise. ++ ++ * m68k.h: NO_ADDSUB_Q conditionals turn off all addq, subq insns. ++ (Fully supported only with MOTOROLA and HPUX_ASM flags.) ++ ++ * jump.c (do_cross_jump): Don't die if LABEL is 0. ++ ++ * tm-mips.h (PRINT_OPERAND_PUNCT_VALID_P): New macro. ++ * tm-iris.h: New file. Unsplit lines accidentally split. ++ ++Mon Jun 5 15:39:30 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (output_inline_function): Call init_function_start, ++ not expand_function_start. ++ * emit-rtl.c (restore_reg_data): No need to init reg_rtx_no. ++ ++ * stmt.c (init_function_start): Set current_function_returns_struct. ++ ++ * rtlanal.c (reg_set_between_p): New fn analogous to reg_used_between_p ++ * loop.c (strength_reduce): Reject biv initial value which is altered ++ subsequently before actual loop start. ++ ++ * rtlanal.c: New file split out from rtl.c. ++ Has things not used in the gen files. ++ ++ * loop.c (strength_reduce): Reject biv initial value in a hard reg ++ clobbered by an intervening function call. ++ ++ * tree.c (get_identifier): New flag needed to enable id-clash warnings. ++ (start_identifier_warnings): Set that flag. ++ * c-decl.c (init_decl_processing): Call that, after making built-ins. ++ ++Sat Jun 3 14:41:34 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * final.c (final_scan_insn): No basic block profiling at jump tables. ++ ++ * stmt.c (expand_decl): Probe the stack to make pages exist. ++ * expr.c (expand_builtin): Likewise, for alloca. ++ ++ * move-if-change: Specify /bin/sh. ++ ++ * tm-ns32k.h (INDIRECTABLE_2_ADDRESS_P): Don't accept PLUS ++ with constant operands but not inside CONST. ++ ++ * integrate.c (output_inline_function, save_for_inline): ++ Save stack_slot_list, and restore it for actual output. ++ * emit-rtl.c (gen_inline_header_rtx): New arg for this. ++ ++ * emit-rtl.c (restore_reg_data): Initialize reg_rtx_no. ++ (restore_reg_data_1): Handle reg_rtx_no jumping past ++ reg_pointer_flag_length. ++ ++ * reload1.c (alter_reg): Do nothing if regno_reg_rtx has 0. ++ ++ * integrate.c (copy_rtx_and_substitute): Typos for stack parm ++ addresses in PLUS case. ++ ++ * genoutput.c (gen_insn, gen_peephole): Make output_n fns static. ++ (output_prologue): Use new macro DEFAULT_MACHINE_INFO if defined. ++ ++ * tree.h (enum machine_mode): Define MAX_MACHINE_MODE as in rtl.h. ++ ++Fri Jun 2 15:40:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (do_include): A file included via a system header file ++ counts as a system header file for -M. ++ ++ * gnulib2.c: Support boolean ops and shifts. ++ ++ * loop.c (emit_iv_inc): Use emit_iv_init_code. ++ ++ * rtl.h (CONST0_RTX): Don't try to cast abort. ++ ++ * tm-news.h (PRINT_OPERAND_ADDRESS): Fix typo `reg_name'. ++ Delete two garbage lines. ++ ++ * loop.c (eliminate_biv): Use emit_iv_init_code to compute comparison ++ value. If value is constant, recognize the insn, and if that fails, ++ put the value in a register. ++ ++Thu Jun 1 16:56:39 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * print-tree.c (dump): Don't die if rtx components are null. ++ ++ * expmed.c (expand_mult_add): New fn to do A * X + B. ++ (make_tree): New subroutine. ++ * loop.c (emit_iv_init_code): Use that. Much simpler now. ++ ++Tue May 30 17:20:40 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * fold-const.c (fold): Use TREE_SET_CODE to store in tree codes. ++ ++ * tree.h (struct tree_common): Make `code' an unsigned int. ++ (TREE_CODE, TREE_SET_CODE): Put in casts. ++ ++ * optabs.c (emit_cmp_insn): Supply all the args in recursive calls. ++ ++ * toplev.c (report_error_function): Fix typo; METHOD_TYPE missing. ++ ++ * fixincludes: Add code to make internal non-directory links. ++ ++Mon May 29 21:36:28 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (find_exec_file): Try both with and without machine_suffix. ++ (find_file): Use machine_suffix here too. ++ ++Sat May 27 00:02:26 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload.c (decompose): OFFSET wasn't initialized. ++ ++ * cse.c (cse_main): Assign monotonic cuids. ++ (make_regs_eqv, CHEAPER): Use cuids, not uids. ++ (cse_end_of_basic_block): Return a cuid, not a uid. ++ ++ * expr.c (expand_builtin): For BUILTIN_SAVEREGS, range of regs ++ moved included one extra previous insn. ++ ++ * emit-rtl.c (emit_line_note): Don't check -g here. ++ (emit_note): For line number when no -g, increment cur_insn_uid anyway. ++ * stmt.c (expand_start_case): Always output a NOTE_INSN_DELETED. ++ ++ * loop.c (loop_optimize): Don't count line-number NOTEs for luids. ++ Prevents -g from affecting optimization decisions. ++ ++Fri May 26 17:31:15 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * local-alloc.c (block_alloc): Don't count notes in insn_number. ++ Prevents -g from affecting order of allocation. ++ ++Thu May 25 14:12:19 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * local-alloc.c (block_alloc): Clear full length of regs_live_at. ++ ++ * ns32k.md (cmpsi): Make this the first cmp pattern. ++ ++ * jump.c (do_cross_jump): Skip NOTEs while checking for existing label. ++ ++ * cse.c (cse_insn): When no-oping a jump, decrement use count of label. ++ (cse_basic_block): If label use count is 0, go past it. ++ ++ * integrate.c (access_parm_map): New fn, broken out of ++ copy_rtx_and_substitute, handles case of mem ref to stack arg. ++ (copy_rtx_and_substitute): Call it. ++ Also use it for address of a stack arg. ++ ++ * gen*.c (fatal): Declare 1st arg as string. ++ ++Wed May 24 00:13:36 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * optabs.c (init_optabs): Handle movdi and movdf insns. ++ ++ * final.c (end_final): Realign locn ctr after outputting string. ++ ++ * tm-sparc.h (LINK_SPEC): Link bb_link.o before standard lib. ++ ++ * tm-sun386i.h (LINK_SPEC): Accept and ignore -sun386. ++ ++ * gcc.c (find_exec_file): Use machine_suffix. ++ (process_command): Set that for -b option. ++ ++ * integrate.c (function_cannot_inline_p): No size limit ++ for functions declared inline. ++ ++ * loop.c (skip_consec_insns): New fn, skip several insns or libcalls. ++ (force_movables): New fn, part of scan_loop broken out. ++ (ignore_some_movables): New fn, ignore a movable whose insn ++ is within another movable's libcall. ++ (scan_loop): Call those three. ++ Don't handle m->consec for zero-extend movables, since always 0. ++ ++Tue May 23 12:58:24 1989 Joe Weening (weening at gang-of-four.stanford.edu) ++ ++ * config/alliant.md: ++ Removed operand classes 'x', 'y', 'G', 'H'. ++ Added "%." to many opcodes to simplify comparison with m68k.md. ++ Changed TARGET_68881 to TARGET_CE. ++ Changed floating-point insns to better describe the Alliant CE. ++ Most args to floating-point insns are now nonimmediate_operand. ++ Removed special insns for pushing doublewords onto stack. ++ Added non-CE versions of movsf and movdf to avoid using FP ++ registers in this case. ++ (float*i*f2): Don't allow immediate ops. ++ (sne): Fix typo, fsne => fsneq. ++ (call, call_value): Changed to always pop args from stack ++ upon return; this gives better code than before and conforms ++ to Alliant calling standard. ++ Incorporated some recent changes to m68k.md. ++ ++ * config/out-alliant.c: ++ (regno_reg_class): Removed FPA reg classes. ++ (output_move_const_double): Function not needed, removed. ++ ++ * config/tm-alliant.h: ++ Removed FPA registers and reg classes. ++ Target flags: changed TARGET_68881 to TARGET_CE, removed ++ TARGET_RTD, TARGET_REGPARM, TARGET_FPA. ++ Removed TARGET_CE test in several places since we need to ++ use FP regs even for non-CE programs. ++ (TARGET_VERSION, CPP_SPEC): Define for Alliant. ++ (CONDITIONAL_REGISTER_USAGE): Removed, not needed. ++ (FRAME_POINTER_REQUIRED): Defined. ++ (RETURN_POPS_ARGS): Defined. ++ (FUNCTION_VALUE, LIBCALL_VALUE, FUNCTION_VALUE_REGNO_P): ++ Use fp0 to return floating-point values. ++ (FUNCTION_ARG): Remove TARGET_REGPARM code. ++ (FUNCTION_ARG_PARTIAL_NREGS): Always 0. ++ (FUNCTION_PROFILER): Define for Alliant. ++ (FUNCTION_EPILOGUE): Remove use of rtd instruction. ++ Renamed CC_IN_68881 to CC_IN_FP. ++ (NOTICE_UPDATE_CC): Incorporate changes that were made ++ in tm-m68k.h. ++ ++ * config/xm-alliant.h (LINK_SPEC): Pass -X to linker. ++ ++Tue May 23 12:58:24 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * sdbout.c: Don't include c-tree.h. ++ ++ * tree.c (build_index_type): Use sizetype for min and max values. ++ Convert maxval rather than clobbering it. ++ ++ * tm-hp9k320.h: Finish unterminated comment. ++ ++ * sdbout.c (sdbout_parms): Use gen_fake_label for anonymous parm. ++ ++Sun May 21 12:58:06 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stmt.c (aggregate_value_p): New fn says whether expression is a type ++ that functions cannot return as a scalar. ++ (assign_parms, expand_function_start): Use that. ++ * expr.c (expand_call): Likewise. ++ ++ * gcc.c (delete_failure_queue): New subroutine. ++ (delete_temp_files): No longer delete the failure queue. ++ (main): Delete failure queue after each failing compilation. ++ ++Sat May 20 13:16:23 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varasm.c (force_const_mem): New optional macro SELECT_RTX_SECTION. ++ ++ * mips.md: Change %u0 to %:. ++ (movsi): Add constraint alternative accepting address arg. ++ ++ * fold-const.c (mul_double): Special case for 2nd arg 2, 4, 8. ++ (combine): Special case shortcuts for plus, minus, mult, div. ++ ++ * stmt.c (expand_function_start): Simplify hairy statement for 3B1. ++ * expr.c (expand_call): Likewise. ++ ++ * math-68881.h: New file. ++ ++ * m68k.md (movqi): Handle moving aregs to mem and vice versa. ++ ++ * dbxout.c (dbxout_type): Don't test use_gdb_dbx_extensions ++ in cases that occur in C. ++ ++ * stmt.c (expand_function_{start,end}): Make DECL_RESULT's rtl 0 ++ when function returns no value. ++ ++ * tree.c (build_decl): Initialize DECL_PRINT_NAME, DECL_ASSEMBLER_NAME. ++ ++ * c-decl.c (store_parm_decls): Call init_function_start. ++ ++Thu May 18 00:41:37 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stmt.c (expand_null_return_1): New arg USE_GOTO says jump to ++ return_label even if could otherwise use a return insn. ++ Make a return_label if we need one and don't have one already. ++ If have parm cleanups, always jump to cleanup_label. ++ (expand_null_return): Pass 1 for USE_GOTO if cleanups pending. ++ (expand_return): Set LAST_INSN if have local cleanups or parm cleanups. ++ Use that if jumping to tail-recursion label. ++ Optimization for returning a comparison is safe for local cleanups ++ but don't do it if there are parm cleanups. ++ Calling expand_null_return_1, pass 1 for USE_GOTO if local cleanups. ++ (this_contour_has_cleanups_p): New function. ++ ++ * stmt.c (init_function_start): New function, beginning of ++ expand_function_start broken out. ++ Use DECL_PRINT_NAME to get function's name. ++ (expand_function_start): Now two args, function and PARMS_HAVE_CLEANUPS ++ Compute RETURN_LABEL sooner; make one if parm cleanups. ++ If parms have cleanups, put scalar return value in pseudo-reg. ++ Don't mark that pseudo with REG_FUNCTION_VALUE_P. ++ (expand_function_end): Simplify decisions about output of return_label ++ and return insn. ++ If DECL_RESULT is pseudo-reg, copy it to real return reg. ++ ++ * stmt.c (expand_function_end): Handle ordinary struct values ++ like pcc, but only if unoptimized. ++ (expand_function_start): Make a return_label for ordinary struct value. ++ ++ * stor-layout.c (layout_type): Handle METHOD_TYPE like FUNCTION_TYPE. ++ (layout_decl): Allow TYPE_DECL. ++ ++ * stor-layout.c (layout_basetypes): Code for basetypes broken ++ out of layout_record. Sets the type size tentatively. ++ (layout_record): Start with that tentative size. ++ Also, don't do anything with CONST_DECL members. ++ ++ * stor-layout.c (layout_union): Simpler error report for static memb. ++ ++ * reload1.c (eliminate_frame_pointer): Reduce PUSH_ROUNDING ++ conditional to apply only to push instructions. ++ ++ * expr.c (expand_call): Fix stupid errors handling MAX_PARM_BOUNDARY. ++ * stmt.c (assign_parms): Likewise. ++ ++ * toplev.c (announce_function, report_error_function): ++ (error_with_decl, warning_with_decl): Use DECL_PRINT_NAME. ++ ++ * toplev.c (compile_file): Subtract integration_time from parse_time. ++ ++ * toplev.c (compile_file): Don't output read-only static variables ++ at end of compilation if address was not used. ++ ++ * toplev.c (rest_of_compilation): Handle flag_syntax_only. ++ ++ * toplev.c (main): Handle -g0 and -G0 options. ++ For -g and -G, set use_gdb_dbx_extensions. ++ ++ * toplev.c (main): Set `progname'. ++ (pfatal_with_name, fatal_io_error, {error,warning}_with_file_and_line): ++ (sorry): Print value of `progname', not "cc1". ++ ++ * tree.def: Delete FRIEND_DECL. Add PUSH_EXPR and POP_EXPR. ++ ++ * tree.c (simple_cst_equal): Handle INDIRECT_REF. ++ ++ * tree.c (lvalue_p): Handle METHOD_TYPE. Handle NEW_EXPR. ++ ++ * tree.c (copy_list): New function. ++ ++ * tree.h (struct tree_decl): New fields print_name and assembler_name. ++ (DECL_PRINT_NAME, DECL_ASSEMBLER_NAME): New accessors. ++ ++ * c-decl.c (LONG_DOUBLE_TYPE_SIZE): New compilation parameter. ++ ++Wed May 17 22:07:17 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu) ++ ++ * dbranch.c (emit_delay_sequence): Reset insn code to -1 when ++ turning insn into a sequence so that it won't think that it matches ++ something in the md file. ++ ++ * dbranch.c (insn_eligible_p): Call refers_to_regno_p with a ++ non-zero range. ++ ++ * dbranch.c (pnote): Modified to make sure instruction clobbered ++ register is a set, rather than, say, a clobber. ++ ++Wed May 17 14:01:20 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * sdbout.c (sdbout_parms): Handle parm with no name. ++ ++ * loop.c (combine_movables): Test for overlap of zero-extend regs ++ was screwed up. ++ ++ * c-typeck.c (c_sizeof{,_nowarn}): Convert from bytes to chars, ++ since c defines sizeof (char) as 1. ++ (pointer_int_sum, pointer_diff): Use c_sizeof{,_nowarn}. ++ ++Tue May 16 16:27:32 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (choose_reload_targets): Don't reuse regs ++ mentioned in reload_reg_rtx. ++ ++ * tm-tahoe.h, tahoe.md, out-tahoe.c, xm-tahoe.h: New files. ++ ++Mon May 15 16:25:12 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * fixincludes: Exit with explicit status 0 at end. ++ cd to /usr/include before cd to subtree root in case of relative link. ++ Create dir $LIB earlier. ++ When checking for a link, treat .. like an absolute target. ++ ++ * symout.c (symout_block_symbols): Give every local decl a typespec. ++ * cexp.y (parse_number): ++ * flow.c (life_analysis, dump_flow_info): ++ ++ * loop.c (consec_sets_invariant_p): Logic error accepted consec sets ++ of which only one was invariant. ++ ++ * expr.c (expand_expr): Use no subtargets inside loops. ++ * stmt.c (inside_loop): New function. ++ ++Sun May 14 00:11:07 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tree.h: Declare long long types. ++ ++ * c-parse.y (combine_strings): Make string contents saveable. ++ ++ * tree.c (savealloc): New function. ++ ++ * m68k.md (movdi): % missing in fmove%.d. ++ ++ * c-parse.y (yylex): Detect overflow past 64-bits. ++ Detect specially numbers not fitting in signed long long. ++ ++Sat May 13 13:16:05 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (alter_frame_pointer_addresses): Preserve volatility. ++ ++ * varasm.c (output_constructor): Die if BITS_PER_UNIT is too big ++ for this function to work. ++ ++ * genpeep.c (match_rtx): For match_operator, match the operands, too. ++ ++ * varasm.c (output_constant): Use ASM_OUTPUT_DOUBLE_INT for DImode. ++ ++ * stor-layout.c (make_signed_type, make_unsigned_type): ++ (fixup_unsigned_type): Use HOST_BITS_PER_INT. ++ ++ * stor-layout.c (layout_type): Use TFmode if appro. ++ ++ * optabs.c (emit_cmp_insn): Use mode sizes to check cmpstrqi, cmpstrhi. ++ ++ * c-typeck.c (get_floating_type): Compare MODE against modes of types. ++ (signed_type, unsigned_type, signed_or_unsigned_type, type_for_size): ++ Handle long long types. ++ (digest_init): Don't assume width of `char' is BITS_PER_UNIT. ++ ++ * c-parse.y (yylex): For truncating chars, use width of `char' type. ++ Allow `ll' in int constants and make long long. ++ Also make long long if constant won't fit in an int. ++ ++ * c-decl.c (SHORT_TYPE_SIZE): Round up when dividing. ++ ++Fri May 12 22:36:21 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * real.h: Allow multiple inclusion. ++ ++ * tm-sun386i.h (DBX_REGISTER_NUMBER): Bizarre renumbering. ++ ++Thu May 11 00:36:21 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * fixincludes: Fix non-ansi declaration of sprintf in X11/Xmu.h ++ ++ * c-parse.y (stmt from expr): Do default conversion if useful ++ for sake of ({...}). ++ ++ * sparc.md (andcc recognizer): Operand missing in subreg. ++ ++Wed May 10 17:20:38 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * rtl.c (read_name): Error if name is missing. ++ (dump_and_abort): Don't print char args if -1. ++ ++ * i386.md (umulqihi3): Operand numbers were missing. ++ ++ * reload1.c (choose_reload_targets): Allow spill reg in find_equiv_reg ++ if it's free and correct class. ++ ++ * cse.c (canon_hash): Handle empty strings. ++ ++ * cccp.c (macroexpand): Newline newline treated like real white space ++ when stringifying. ++ ++ * Rename *offsetable* to *offsettable*. ++ ++Tue May 9 22:54:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (finish_type): Layout any variants of the type. ++ ++Tue May 9 12:30:28 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu) ++ ++ * final.c (final_scan_insn, final): Added an argument to ++ final_scan_insn to disallow peephole processing (to turn it off ++ during delayed branch scheduling). ++ ++ * final.c (final_scan_insn): Made insn not matching any MD rtl a ++ criteria for delayed branch case. Moved delayed branch case to just ++ before real insn recognition to reduce the number of insns on which ++ recog_memoized is called. ++ ++Mon May 8 15:02:42 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * fixincludes (LIB): Allow overriding. ++ ++ * cccp.c: Don't search /usr/include/CC by default. ++ ++Mon May 8 13:09:21 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu) ++ ++ * print-tree.c (dump): Fixed typo; IDENTIFIER ==> IDENTIFIER_NODE. ++ ++Sun May 7 12:44:53 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * print-tree.c (dump): TYPE_NAME may be IDENTIFIER or TYPE_DECL. ++ ++Sat May 6 00:13:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tree.def: Define EXACT_DIV_EXPR, for when remainder known as 0. ++ * fold-const.c (combine, fold, div_and_round_double): Handle new code. ++ * expr.c (expand_expr): Likewise. ++ * c-typeck.c (pointer_diff): Use EXACT_DIV_EXPR. ++ ++ * integrate.c (expand_inline_function): Use size of passed type ++ for allocating stack slot with that type. ++ ++ * c-parse.y (maybe_attribute, attribute*): New syntax for Apollos. ++ These tokens currently not generated. ++ ++Fri May 5 18:43:01 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * toplev.c [USG]: Undefine FLOAT for sake of sys/param.h on hpux. ++ ++ * optabs.c (expand_binop): If backtracking, don't delete insns made ++ for -fforce-mem. ++ ++Thu May 4 01:57:23 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload.c (find_reloads): Don't compare an earlyclobber operand ++ with itself. ++ ++ * reload.c (immune_p): Constants and stack slots don't overlap. ++ ++ * Put no-ops in front of loops and labels, ++ to prevent confusion in the debugger. ++ * c-parse.y (loops and labels): Call emit_nop. ++ * stmt.c (emit_nop): New function--sometimes emit a no-op. ++ * *.md (nop): New insn. ++ ++ * expr.c (expand_call): Typo in arg to FIRST_PARM_CALLER_OFFSET. ++ ++Wed May 3 01:34:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (scan_loop): Scanning around end of loop ++ should not set maybe_never. ++ ++ * Rename SELECT_VARIABLE_SECTION to SELECT_SECTION. ++ * varasm.c (get_or_assign_label): Use SELECT_SECTION if defined. ++ * varasm.c: Use EXTRA_SECTION_FUNCTIONS if defined (new macro). ++ ++ * mips.md: Change %u to %u0 to avoid error check. ++ ++ * tm-mips.h (TARGET_VERSNUM): Inc. to 1 08. ++ (TARGET_VERSION): Change strings. ++ (AL_DEBUG): Don't define it. ++ (HARD_REGNO_MODE_OK): Add some casts to int. ++ (STACK_ARGS_ADJUST): Name was misspelled. ++ (PRINT_OPERAND_ADDRESS): Just abort for MEM, POST_INC, etc. ++ (EXTRA_SECTIONS, SELECT_VARIABLE_SECTION, SELECTORS_EXTRA_SECTIONS, ++ SELECT_VARIABLE_CONST_SECTION): New macros. ++ (ASM_FILE_END): Change function name. ++ * out-mips.c (function_arg_advance): Delete debugging printfs. ++ (function_inarg, function_arg): Likewise. ++ (compare_collect, compare_restore): Add some. ++ ++ * reload1.c (reload): Fix handling of caller_save_needed. ++ ++ * stmt.c (expand_function_start): Clear caller_save_needed. ++ ++ * stmt.c (emit_case_nodes): Some compiler has trouble with calling ++ a function pointer. ++ * gnulib.c: likewise. ++ ++Tue May 2 15:32:25 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (combine_movables): For zero extend, ++ do each from-mode separately. ++ ++Mon May 1 00:18:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-apollo68.h: New file. ++ ++ * c-parse.y (is_reserved_word, hash): Add keywords `__asm__', etc. ++ * c-parse.gperf: Corresponding changes. ++ ++ * c-parse.y (check_newline): Set main_input_filename before ++ considering optional arguments. ++ ++ * final.c (final_scan_function): Return next insn to process. ++ Usually that's the following insn; occasionally, previous compare. ++ ++ * c-decl.c (DOUBLE_TYPE_SIZE): Wrong value. ++ ++ * reload.c (decompose): Failed to return value. ++ ++ * Support local specified-register variables. ++ * varasm.c (decode_reg_name): New function, cvt asmspec to regnum. ++ (make_decl_rtl): Call that. ++ * toplev.c (rest_of_decl_compilation): Handle local specified-register ++ declarations. ++ ++ * i386.md (tstqi, trunc*qi): Constrain to `q' regs. ++ ++ * loop.c (scan_loop, move_movables): ->global for zero-extend register ++ now means register is used outside range from where it is set ++ to the following label. Non-global zero-extend regs ++ may be entirely cleared. ++ ++ * loop.c (combine_movables): Loop that combines matching movables ++ broken out from scan_loop. ++ Now also combine non-global zero-extend registers with each other ++ if their lifespans don't overlap. ++ ++ * c-typeck.c (build_unary_op, ADDR_EXPR of a COMPONENT_REF): ++ Always convert to desired result type. ++ ++Sun Apr 30 12:58:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (init_decl_processing): New macros parameterize int types. ++ CHAR_TYPE_SIZE, SHORT_TYPE_SIZE, LONG_TYPE_SIZE, LONG_LONG_TYPE_SIZE, ++ FLOAT_TYPE_SIZE, DOUBLE_TYPE_SIZE. ++ ++ * fixincludes: Use sed instead of ex. No problem with split lines. ++ ++ * print-tree.c (dump): Print type's name, if any. ++ ++ * c-parse.y: Use __inline, not plain inline. ++ ++ * toplev.c: New option -fdelayed-branch. ++ (compile_file): Open and close dbranch dump file. ++ Collect and print dbranch time. ++ (rest_of_compilation): Optionally do dbranch scheduling, ++ only if HAVE_DELAYED_BRANCH. ++ (main): Handle -dd. ++ ++ * rtl.c (copy_rtx): Handle null pointers as code `e'. ++ ++ * final.c (dbr_sequence_length): New function. ++ (final_scan_insn): Most of `final' broken out. ++ Add support for SEQUENCE insns. ++ last_ignored_compare and new_block now top-level static. ++ ++ * c-parse.y (MAX_WORD_LENGTH): Long enough for __volatile. ++ ++Sat Apr 29 13:03:20 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (asm statements): Output line numbers. ++ ++ * loop.c (emit_iv_init_code, emit_iv_inc, eliminate_biv): Copy ++ additive term rtx's to prevent sharing between insns. ++ ++ * c-parse.y (check_newline): Increment input_file_stack_tick. ++ * toplev.c (report_error_function): Describe input stack only if ++ changed. ++ ++ * c-decl.c (finish_struct): Reject zero width for named field. ++ ++ * tm-sun3.h (CC1_SPEC): Prevent error on `-sun3'. ++ * tm-sparc.h (CC1_SPEC): Prevent error on `-sun4'. ++ ++ * Makefile (cleanconfig): cleanlinks renamed; also delete gnulib. ++ (gnulib): Delete stamp-gnulib2 since gnulib2 should be redone after. ++ ++Fri Apr 28 00:38:32 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * config.gcc (genix): Correct xm file name. ++ ++ * tm-genix.h: Undefine ASM_SPEC inherited from tm-encore.h. ++ ++ * Makefile: Make float.h using hard-params. ++ (clean): Delete float.h. ++ ++ * hard-params.c: New program. ++ ++ * varasm.c (assemble_variable): Use SELECT_VARIABLE_SECTION if defined. ++ (in_section): Use EXTRA_SECTIONS if defined. ++ ++ * toplev.c (compile_file): Call ASM_FILE_END if defined. ++ ++ * gcc.c (SWITCH_TAKES_ARG, WORD_SWITCH_TAKES_ARG): Let config override. ++ ++ * loop.c (emit_iv_init_code): Force A to a reg if it isn't. ++ ++Thu Apr 27 12:51:14 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-mips.h (ASM_START_FILES): Don't call print_options. ++ Don't call the funny abort-functions. ++ * out-mips.c: Delete funny debugging functions and aborts. ++ (print_options): #if 0. ++ (compare_restore): Test for COMPARE, not MINUS. ++ (mips_section_get, mips_output_external, mips_asm_final): New fns. ++ ++ * input.h: New file with *input_filename, lineno and input_file_stack. ++ Included in toplev.c and c-parse.y. ++ * c-decl.c (finish_function): LINENO is now arg. ++ * c-parse.y: Calls changed. ++ ++ * c-parse.y (check_newline): Handle `1' or `2' from cpp ++ by pushing or popping input_file_stack. ++ * toplev.c (compile_file): Push main input file on input_file_stack. ++ (report_error_function): If in include file, print the chain ++ of include-locations. ++ ++ * cccp.c (output_line_command): New arg says whether entering or ++ leaving a file. Output `1' or `2' on #-line if so. Callers changed. ++ ++ * gnulib2.c: Little-endian fixes from csmith@convex.com. ++ ++ * fixincludes: Wrong quoting in `echo' command. ++ ++ * tm-mips.h (REG_P): Duplicate defn deleted. ++ (PRINT_OPERAND): `\' was missing. ++ ++Wed Apr 26 02:44:59 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (handle_directive): Preprocess even #pragma, but copy ++ to output file afterward. ++ (do_pragma): Use standard calling convention. ++ (install_builtins, special_symbol): Define __INCLUDE_LEVEL__. ++ ++ * cccp.c (do_include): Don't forget to close file. ++ ++ * final.c (output_asm_insn): Use PRINT_OPERAND_PUNCT_VALID_P ++ to validate punctuation after percent. ++ * tm-m68k.h, tm-alliant.h, tm-ns32k.h, tm-vax.h, tm-i386.h: ++ Define PRINT_OPERAND_PUNCT_VALID_P. ++ ++ * Version 1.35 released. ++ ++ * c-decl.c (grokdeclarator): Use INT_CST_LT only on int constants. ++ ++Tue Apr 25 15:47:11 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload.c (find_reloads_address_1): Always return a value. ++ ++ * flow.c (mark_set_1): Look inside zero_extract, sign_extract. ++ ++ * expr.c (emit_library_call) [STACK_ARGS_ADJUST]: ++ Fix typo for `struct args_size'. ++ ++Mon Apr 24 00:12:18 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * flow.c (mark_set_1): Look inside strict_low_part. ++ ++ * c-typeck.c (decl_constant_value): Don't use var's init if volatile. ++ ++ * print-tree.c (dump): Don't call walk on rtx's. ++ ++ * integrate.c (expand_inline_function): Convert expanded arg from ++ passed mode to nominal mode. ++ ++Sun Apr 23 13:14:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * fixincludes: fix _IO macros if split across two lines. ++ Fix typo: EOF was indented. ++ ++ * gnulib2.c: New file with DImode library routines. ++ * Makefile (gnulib2): Put them into gnulib. ++ Must be explicitly requested. ++ ++Fri Apr 21 13:45:45 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (main): Don't turn on trigraphs for -Wtrigraphs or -Wall; ++ use -trigraphs for that. ++ ++ * cccp.c (main): Use -trigraphs to enable trigraphs. ++ * gcc.c: Pass -trigraphs to cpp; don't pass -T. ++ ++ * Makefile: Variable srcdir relates location of sources ++ to current directory. Default is `.'. ++ ++ * integrate.c (expand_inline_function): When copying expanded arg, ++ use mode it's passed in, not arg's nominal mode. ++ ++ * dbxout.c (dbxout_block): Print generated name with assemble_name. ++ ++Thu Apr 20 12:36:09 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stdarg.h: check __sparc__ instead of sparc. ++ ++Tue Apr 18 18:58:03 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-next.h (STARTFILE_SPEC): Define it. ++ ++Mon Apr 17 19:56:05 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * dbxout.c (dbxout_block): Use ASM_GENERATE_INTERNAL_LABEL to format ++ the labels LBB... and LBE... ++ ++Sun Apr 16 23:57:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * mips.md: Change MINUS to COMPARE where appropriate. ++ ++Sat Apr 15 16:11:49 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (finish_struct, redeclaration_error_message): ++ Rename variables named OLD and NEW. ++ ++ * sparc.md (cse'd mult pattern): Handle memory operands. ++ Optimize small integer operands. ++ ++ * stmt.c (expand_decl): On sparc, ensure dynamic arrays of doubles ++ are properly aligned, despite unaligned STACK_POINTER_OFFSET. ++ ++Fri Apr 14 10:59:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_call): Bugs treating struct value address as param: ++ do so only if it's supposed to be pushed; ++ decode value of FUNCTION_ARG properly. ++ ++ * tm-altos3068.h (CPP_SPEC): Some braces were dropped. ++ ++ * gcc.c (pexecute): Print message when exec fails. ++ (perror_exec): New fn. ++ (perror_with_name,pfatal_with_name): Change message syntax. ++ ++ * tm-hp9k320.h (ASM_IDENTIFY_GCC): Define as no-op. ++ ++Wed Apr 12 00:20:31 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cse.c (cse_insn): Can record constant value being stored in ++ a bit field, if we can tell that truncation won't change it. ++ ++ * m68k.md (bfset, bfclr, bfchg insns): Do CC_STATUS_INIT ++ since the cc's are set from the old contents. ++ ++ * gcc.c (compilers): Running `as', put -o option before input file. ++ ++ * gcc.c: Delete output file only if that file's compilation fails. ++ * gcc.c (record_temp_file): Changed args: always_delete, fail_delete. ++ (store_arg): Likewise. Callers changed. ++ (clear_failure_queue): Called after each compilation. ++ ++Tue Apr 11 01:18:53 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (subst): (SET (ZERO_EXTRACT) (OR (ZERO_EXTRACT) const)) ++ optimization was sometimes invalid. ++ ++ * tm-m68k.h (NOTICE_UPDATE_CC): A doubleword move that requires 2 insns ++ does not set the cc's usefully. ++ ++ * Makefile (cleanlinks): Just do `clean', not `realclean'. ++ (realclean): Delete config links also. ++ ++ * expr.c (expand_call): Handle case where return value is in memory ++ but TARGET is a register. ++ ++ * c-typeck.c (build_binary_op_nodefault): New arg ERROR_CODE ++ is passed to binary_op_error instead of CODE. ++ All callers changed. ++ (binary_op_error): CODE = NOP_EXPR is new special case. ++ (truthvalue_conversion): Call build_binary_op_nodefault directly ++ and specify NOP_EXPR for the error code. ++ ++ * c-decl.c (xref_tag): If pedantic, warn on fwd ref to enum. ++ ++Mon Apr 10 19:44:48 1989 Chris Smith (csmith at mozart) ++ ++ * tm-convex.h (PCC_BITFIELD_TYPE_MATTERS): It doesn't, ++ but set it anyway. It makes for better code on this ++ word machine. ++ ++ * convex.md (one_compl*): add not:QI and not:HI, which ++ do get used after all. ++ ++ * tm-convex.h (A_REG_P, S_REG_P): define new macros ++ convex.md: use them ++ ++ * convex.md (addsi3): tidy up constraints. ++ ++ * tm-convex.h (REG_OK_FOR_INDEX_P): stack pointer is not ok. ++ ++ * convex.md: add a pattern to push REG+CONST so we can ++ prefer an A reg. ++ ++ * tm-convex.h (tstqi): should sign extend, not zero extend. ++ ++ * expr.c (convert_move): Extending narrow to DI via SI, ++ operand of extendsidi2 was wrong. ++ ++ * emit-rtl.c (gen_lowpart): Handle CONST_DOUBLE. ++ ++Mon Apr 10 05:19:39 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * recog.c (nonmemory_operand): Test constant operands ++ as general_operand does. ++ ++ * tm-m68k.h (PRINT_OPERAND): Limit effect of code `d' ++ to constant addresses. ++ ++ * loop.c (can_eliminate_biv_p, eliminate_biv): Don't rely on givs with ++ nonconstant coefficients, since the coeffs could be zero. ++ ++ * loop.c (can_eliminate_biv_p): Check each giv for ! ignore ++ before assuming it can be used. ++ (check_eliminate_biv): New fn, a piece of strength_reduce broken out. ++ ++ * cccp.c (error_from_errno): New fn, like error and perror_with_name. ++ (do_include): Call that if open fails. ++ (finclude): Print I/O error msg before closing desc. ++ ++ * c-decl.c (shadow_tag): If more than one tag or structure, ++ or anything other than a tag, warning. ++ ++ * c-parse.y (components): Just warn if memb decl has no member, ++ and only if pedantic. ++ ++ * loop.c (strength_reduce): Print uids, not luids, for dump. ++ (record_giv): giv_count field counts only DEST_REG givs. ++ (check_dbra_loop): src_two_before_end was set wrong. ++ ++ * loop.c (record_giv): New arg LOOP_END; all callers changed. ++ Don't mark giv replaceable if used past LOOP_END. ++ (find_mem_givs): New arg LOOP_END; all callers changed. ++ ++ * out-i386.c (FP_CALL): Make this a `return' stmt. ++ ++Fri Apr 7 11:56:58 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_expr, case ..._DECL): Preserve mode thru ++ calling change_address. ++ ++ * expr.c (emit_library_call): Typo: ARGNUM => COUNT. ++ ++ * expr.c (preexpand_calls, expand_call): Take note of RETURN_IN_MEMORY. ++ * stmt.c (assign_parms): Likewise. ++ * integrate.c (function_cannot_inline_p): Likewise. ++ ++ * STACK_ARGS_ADJUST: Arg is now a `struct arg_data' and it should ++ be updated in place. ++ * tm-mips.h: Define it. ++ * expr.c (expand_call): Adapt to this. Assume padding comes after args ++ so turn off the feature of changing the args' offsets. ++ (emit_library_call): Adapt to this. ++ ++ * tm-mips.h (PRINT_OPERAND): Use CONST_DOUBLE_{LOW,HIGH}. ++ Truncate SFmode constants to single precision. ++ ++ * c-typeck.c (mark_addressable): Fix test for local vs global reg var. ++ ++ * config.gcc: Change `:-' to `-' in var refs. ++ Shell on convex doesn't handle `:-'. ++ ++Thu Apr 6 00:09:01 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (expand_inline_function): Compare actual's mode ++ against formal's DECL_ARG_TYPE's mode, not TREE_TYPE's mode. ++ ++ * c-decl.c (implicitly_declare): Make the decl permanent if ++ in global binding level. (Can happen for certain invalid input.) ++ ++ * c-typeck.c (build_modify_expr): Block path that made a MODIFY_EXPR ++ containing an ERROR_MARK. ++ ++ * config/tm.h: New file. ++ ++ * loop.c (only_reg_use_p): Fix bugs in recursion, add some fast ++ special cases. Comment on return value was backwards. ++ (strength_reduce): Negate the value of only_reg_use_p. ++ ++ * genoutput.c (output_prologue): Output `#include hard-reg-set.h'. ++ * Makefile: insn-output.o depends on that. ++ ++ * toplev.c (main): Typo recognizing -Wswitch. ++ ++ * config.gcc (mips): New alternative. ++ * tm-mips.h, out-mips.c, mips.md, va-mips.h: New files. ++ * varargs.h: Include va-mips.h if on mips. ++ ++Wed Apr 5 16:58:04 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (duplicate_decls): Rename OLD, NEW to OLDDECL, NEWDECL. ++ ++ * stmt.c (expand_function_start): Ref subr instead of ++ current_function_decl; should make no difference. ++ ++ * stmt.c (assign_parms): Do extra padding for some parms, ++ controlled by MAX_PARM_BOUNDARY. ++ * expr.c (expand_call): Same thing for caller side. ++ Note this is implemented only for machines that lack push insns. ++ Also, in both cases, it doesn't handle variable-size args. ++ ++Tue Apr 4 12:22:06 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (find_file): Try STANDARD_EXEC_PREFIX for startfiles too. ++ ++ * varasm.c (make_decl_rtl): Delete never-executed clause. ++ ++ * spur.md (movqi, loadhi, extend*, zero_extendhisi): ++ Make subregs with C code, not RTL patterns, so we can ++ avoid generating subreg of subreg. ++ ++ * optabs.c (emit_cmp_insn): Not all clauses always succeed, ++ so stop using `else' structure. ++ ++ * stmt.c (expand_return): Avoid moving void to void, in cleanups case. ++ ++Mon Apr 3 18:04:33 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * m68k.md (cmphi): Don't allow a-reg vs a-reg, since that sign-extends. ++ If there is one a-reg, make sure it is not last. ++ ++Sun Apr 2 13:02:26 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (agg_mode): Use highest mode that has desired size. ++ Allow all integer modes, but reject sizes > MAX_FIXED_MODE_SIZE. ++ (That defaults to the size of DImode.) ++ ++ * machmode.def: Add PSI, PDI and XF, CXF modes. ++ ++Sat Apr 1 00:50:11 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * ns32k.md (ashd, lshd): Delete patterns that logand the count with 31. ++ The shift count is not truncated on this machine. ++ ++ * combine.c (subst): Simplify nested or's, nested xor's. ++ (try_distrib): XOR doesn't distribute through anything. ++ ++ * rtl.c (rtx_equal_p): Don't die on null pointers. ++ ++ * loop.c (eliminate_biv): Use COMPARE, not MINUS, in generated compare. ++ ++ * loop.c (invariant_p): Mem refs in constant pool are invariant. ++ ++ * c-decl.c (redeclaration_error_message): If -traditional, allow ++ redeclarations of typedef provided they agree. ++ ++ * c-decl.c (start_decl): Do expand_decl on the decl that pushdecl ++ returns. If there was a prev. decl with a different type, ++ we have changed its type and cleared its old rtl, so it need new rtl. ++ ++Sat Apr 1 00:50:11 1989 Matthew Self (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (convert_move): Modified to use mode classes ++ instead of refering to specific machine modes. ++ ++ * expr.c (do_jump): Converted to use CONST0_RTX macro. ++ do_jmp no longer refers to any machine modes directly except ++ for VOIDmode! ++ ++ * expr.c (compare, compare1): Modified to use CONST0_RTX ++ macro. No longer refers to any machine modes directly ++ except VOIDmode and BLKmode! ++ ++ * machmode.def: Documented assumptions made about the order ++ of machine modes during mode widening. ++ ++ * optabs.c (expand_binop, expand_twoval_binop, expand_unop, ++ emit_cmp_insn): Added mode widening which is independent of ++ specific machine modes. It assumes that we may widen to any ++ higher numbered mode of the same mode class. ++ NOTE: the checks for VOIDmode ops which were present in ++ QI and HI to SI widening are now present in all widening. ++ I assume this is correct. Also, widening is now possible ++ from QI to HI. This may or may not be a good thing.... ++ ++ * rtl.h (CONST0_RTX): Added definition of new macro ++ CONST0_RTX (mode). ++ ++ * rtl.h (GET_NOTE_INSN_NAME, GET_REG_NOTE_NAME): New macros. ++ * rtl.c (note_insn_name, reg_note_name): New tables. ++ * rtl.def (NOTE): Change last field from `i' to `n'. ++ * rtl.c (print_rtx): Print mode of INSN_LIST or EXPR_LIST as reg-note. ++ Print operand code `n' as name of kind of note. ++ (read_rtx): treat `n' like `i'. ++ ++ * loop.c (struct induction): Add `mode' field. ++ (strength_reduce, record_giv): Set the `mode' field in V. ++ (can_eliminate_biv_p, eliminate_biv): Use that field. ++ ++ * loop.c (struct iv_class): `init_insn' records what inits the biv. ++ Replaces `init_val_set' flag. ++ (strength_reduce): Update and test `init_insn' instead. ++ Use of a biv between its init and the start of the loop ++ does not preclude its elimination from the loop. ++ Setting a giv is ok for eliminating a biv, even if giv is "ignore", ++ since that just means giv will be combined with another. ++ Handle some DEST_ADDR givs for that purpose. ++ Test for giv-setting before check can_eliminate_biv_p. ++ New error check for replaceable giv whose value needed after loop. ++ (only_reg_use_p): New fn. ++ ++ * expr.c (expand_expr): PLUS, MINUS with EXPAND_SUM: ++ Associate even harder. ++ ++ * loop.c (strength_reduce): Treat all constant biv init vals like ints. ++ ++ * loop.c (strength_reduce): Clear all_reduced when v->ignore is set; ++ the code to check this later didn't always do the job. ++ ++ * loop.c (verify_loop): Set loop_continue. ++ (scan_loop): mention its value. ++ * rtl.h: Define NOTE_INSN_LOOP_CONT. ++ * stmt.c (expand_loop_continue_here): Output one. ++ ++Fri Mar 31 10:08:29 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (pointer_int_sum, pointer_diff): Treat const void * like ++ void *. ++ ++ * rtl.c (rtx_addr_varies_p): Don't die on null exp. ++ * cse.c (refers_to_mem_p, refers_to_p): Likewise. ++ ++ * gcc.c (validate_switches, validate_all_switches): New fns. ++ Mark a switch as valid if any compiler spec or the linker spec ++ matches it, even for languages not being used. ++ ++Thu Mar 30 00:22:14 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * loop.c (loop_optimize, move_movables): when moving a `clr' insn used ++ in zero-extension, sometimes change it to an `and' so that the ++ significant low bits are not clobbered. ++ ++ * cccp.c: Implement __BASE_FILE__ and #once. ++ (savestring): New fn. ++ (struct file_name_list): new name for struct directory_stack. ++ (enum node_type): Add T_ONCE, T_BASE_FILE. ++ (directive_table): Add #pragma once. ++ (initialize_builtins): Add __BASE_FILE__. ++ (special_symbol): Handle __BASE_FILE__, together with __FILE__. ++ (do_include): Ignore the file if it's on the #pragma once list. ++ (do_once): New fn; add current file to #pragma once list. ++ ++ * cccp.c (do_include): Don't add non-ex files to list of deps. ++ ++ * config.gcc: Use {...:-...}, not {...=...}. ++ ++ * c-parse.y: Add precedence for IF/ELSE, and for parens; ++ avoids some conflicts. ++ ++ * tm-newsgas.h: Include tm-news.h and define USE_GAS. ++ ++ * tm-news.h: New name for tm-news800.h. ++ If not USE_GAS, define SONY_ASM. ++ Don't define USE_GAS by default. ++ (CPP_PREDEFINES): Various alternatives depending on processor type. ++ (ASM_FORMAT_PRIVATE_NAME): Override this. ++ (ASM_IDENTIFY_GCC): Override; output nothing. ++ (FUNCTION_PROLOGUE, FUNCTION_EPILOGUE): Round fsize up to % 4. ++ Max for halfword link insn is 32k, not 64k. ++ (FUNCTION_EPILOGUE): Don't output move.l if no regs to restore. ++ (PRINT_OPERAND_ADDRESS): Change handling of tableref pc-rel addresses. ++ * m68k.md (movhi): Add SONY_ASM conditional. ++ ++ * cse.c (cse_insn): If replacing a dest address, preserve MEM_IN_STRUCT ++ ++ * gcc.c (error, fatal): alternate varargs defns if HAVE_VPRINTF. ++ ++Wed Mar 29 09:54:13 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gcc.c (process_command): Check WORD_SWITCH_TAKES_ARG, so that ++ -Tdata can be handled right. ++ ++ * stmt.c (check_for_full_enumeration_handling): new fn, for warn_switch ++ (expand_end_case): Call it, if orig index was enum. ++ * toplev.c (main): Handle -Wswitch. ++ * c-parse.y (SWITCH stmt): Pass orig switch expr to expand_end_case. ++ ++ * tm-*.h, out-*.c: Uniformly use reg_names, not reg_name, and don't ++ define any duplicates. ++ * final.c: Delete reg_name. ++ ++ * c-parse.y (is_reserved_word): Add keywords __asm and __inline; ++ also __const and __volatile. ++ (yylex): Keywords that start with `__' are recognized regardless of ++ -traditional or -ansi. ++ ++ * c-parse.y (check_newline): Always recognize #ident. ++ Macro IDENT_DIRECTIVE is no more. ++ If ASM_OUTPUT_IDENT is undefined, don't output anything for #ident. ++ * tm-3b1.h: Don't define IDENT_DIRECTIVE or ASM_OUTPUT_IDENT. ++ * tm-encore.h, tm-i386gas.h, tm-i368v.h, tm-sun386i.h, tm-vaxv.h: ++ Don't define IDENT_DIRECTIVE; define ASM_OUTPUT_IDENT to output in ++ default way. ++ ++ * expr.h (RETURN_IN_MEMORY): New macro, default defn here. ++ * expr.c (expand_call): Use it to control where to return value. ++ * stmt.c (expand_function_start): Likewise. ++ ++ * out-sparc.c (find_addr_reg): Abort if none found. ++ Eliminate confusion; do only one change between tests for PLUSness. ++ (output_move_double): Arg to find_addr_reg is address, not mem ref. ++ * out-m68k.c, out-spur.c, out-i386.c, out-alliant.c: Likewise. ++ ++ * jump.c (find_cross_jump): Don't let either E1 or E2 be included ++ in the range of matching insns preceding the other (E2 or E1). ++ ++ * c-parse.y (check_newline): No error for `#pragma\n'. ++ ++ * Makefile (gcc.o): Control STANDARD_STARTFILE_PREFIX here. ++ ++ * stmt.c (walk_fixup_memory_subreg): handle null. ++ ++ * tm-sparc.h (FUNCTION_BLOCK_PROFILER): Change LPBnn to LPYnn, ++ to avoid conflict with final.c. ++ ++Tue Mar 28 15:23:17 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (do_include): If fail, print system error message. ++ (perror_with_name): Use more standard error format. Inc. `errors'. ++ ++ * dbxout.c (dbxout_function): Output any temporary types ++ that were made by dbxout itself. ++ ++ * stmt.c: always use an epilogue if pcc-struct-return. ++ (expand_function_start): Compute return_label after testing that. ++ (expand_function_end): Output a return insn after pcc-struct-return ++ processing, if there is a return insn. ++ (expand_null_return): Don't output a return insn, in that case. ++ Simplify the conditions--depends entirely on HAVE_return. ++ ++ * tm-m68k.h (FUNCTION_BLOCK_PROFILER): Use jsr, not call. ++ ++ * reload.c (find_reloads): Certain mem addresses will be offsetable ++ after reloading; in particular, those where reg_equiv_address applies. ++ ++ * loop.c (check_dbra_loop): Change MINUS to COMPARE. ++ ++ * c-typeck.c (convert_for_assignment): Return THE standard error_mark. ++ ++Thu Mar 23 09:39:02 1989 Richard M. Stallman (rms at watson) ++ ++ * c-parse.y (components): Error if empty. ++ ++ * dbxout.c (dbxout_symbol): Output const variables as N_STSYM. ++ ++ * varasm.c (force_const_mem): Use ASM_OUTPUT_DOUBLE_INT if defnd. ++ ++ * c-decl.c (grokdeclarator): Warn about `long long long'. ++ ++ * reload1.c (reload): When changing REG to MEM, clear REG_USERVAR_P. ++ * final.c (alter_subreg): Preserve volatile bit of MEM. ++ ++ * m68k.md (cmpsi, cmphi): Permit cmpm. ++ ++ * gcc.c (find_file): Use standard_startfile_prefix_2. ++ Now search /usr/local/lib/, /lib/ and /usr/lib/. ++ ++ * tm-m68k.h (PRINT_OPERAND): Support code `d'. ++ * m68k.md (cmpsi, cmphi, cmpqi): Use it for all mem addresses. ++ ++ * final.c (output_asm_insn): Don't allow %LETTER without an ++ operand number. ++ * tm-m68k.h, m68k.md, tm-hp9k320.h, tm-news*.h: Use %@ instead of %s. ++ * tm-alliant.h, alliant.md: Likewise. ++ * i386.md, out-i386.h: Put `0' after each %L, %W, %B, %S, %Q, %R. ++ ++ * stmt.c (expand_end_stmt_expr): Pop pending stack args. ++ ++ * varasm.c (assemble_variable): For 0-size common variable, ++ allocate at least 1 byte. ++ ++ * tm-encore.h (ASM_OUTPUT_DOUBLE, PRINT_OPERAND): Use 0f, not 0l, ++ for doubles. ++ ++Mon Mar 13 10:24:56 1989 Richard M. Stallman (rms at ccvi) ++ ++ * out-i386.h (function_prologue, function_epilogue): ++ Use call_used_regs, not a copy, so -f options work. ++ Save regs in the opposite order. ++ Save regs even starting from 0 if they happen to be call-saved. ++ ++ * Bug fixes from Rob McMahon. ++ ++ * loop.c (strength_reduce): When inserting insn to set ++ nonreplaceable giv, put it after all the consecutive insns ++ that compute it. ++ ++ * reload.c (find_reloads): When forcing const to mem, ++ use the insn's operand mode, not the const's mode. ++ ++ * reload1.c (choose_reload_targets): Use wider of inmode and outmode ++ when determining have_groups. ++ ++ * reload1.c (choose_reload_targets): typo checked wrong insn with ++ constraint_accepts_reg_p. ++ ++ * reload1.c (choose_reload_targets): Enable #if-0'd code for ++ forgetting old reloads in case of output reload from a non-spill-reg. ++ ++Sun Mar 12 00:04:49 1989 Richard M. Stallman (rms at ccvi) ++ ++ * c-parse.y (yyerror): Add forward-decl here. ++ * c-tree.h: Delete decl here. ++ ++ * New macro USE_C_ALLOCA. ++ * cse.c (cse_main): Do alloca (0) to clear out C alloca. ++ * flow.c (life_analysis): ++ * local-alloc.c (local_alloc): ++ * reload1.c (reload_as_needed): likewise. ++ ++ * loop.c (emit_iv_init_code, eliminate_biv): ++ Always put constant in a PLUS last. ++ ++ * gcc.c (make_switch): Unused function deleted. ++ ++ *gcc.c (switches): Each switch has a `used' field. ++ (process_command): Init it to 0 when making `switches'. ++ (do_spec_1, handle_braces, give_switch): Set to 1 when switch is used. ++ (main): If it remains 0 at the end, print error message. ++ ++ * expr.c (convert_move, convert_to_mode): Don't truncate a MEM in ++ place if it is volatile. ++ ++ * loop.c (strength_reduce): When reducing a giv, if the biv is ++ incremented between the giv's creation and its use, increment ++ the reduced giv var *after* its use. ++ ++ * c-decl.c (duplicate_decls): Warn about proto vs nonproto ++ only if no other errors apply. ++ ++ * jump.c (invert_exp): Don't crash if arg is null. ++ ++ * alliant.md (float*i*f2): Don't allow immediate ops. ++ (sne): Fix typo, fsne => fsneq. ++ ++ * expr.c (store_one_arg, expand_call): When size doesn't matter, ++ pass const0_rtx, not (rtx) 0. ++ ++ * expr.c (do_jump): Args to invert_exp were missing. ++ ++ * gcc.c (store_arg): Now 2 separate args for delete-on-success ++ and delete-on-failure. All calls changed. ++ (do_spec_1): DELETE_THIS_FILE is meaningful for output files. ++ ++ * config/xm-alliant.h (LINK_SPEC): Pass -X to linker. ++ ++Sat Mar 11 10:30:41 1989 Richard M. Stallman (rms at ccvi) ++ ++ * tm-*.h, xm-*.h, *.md: Moved to subdir `config'. ++ * output-*.c: Moved to `config/out-*.c'. ++ * Makefile (.c.o): Define rule to use -Iconfig when compiling. ++ (various): Delete the commands from some compilation rules. ++ Put -Iconfig in other compilation commands. ++ Also some reordering of variable defs and comments for cleanliness. ++ (realclean): Change a shell comment to a Make comment. ++ ++ * fold-const.c (fold): Simplify and extend TRUTH_... operators ++ knowing that args must be ints and values will be 0 or 1. ++ ++ * gcc.hlp: New file (for VMS). ++ ++ * reload1.c (reload): Don't let two 2-groups overlap. ++ ++ * reload.c (push_reloads): When a plain reg matches a reload ++ for an increment, don't change the reload_in to a plain reg. ++ Leave the increment there. ++ ++ * integrate.c (expand_inline_function): Don't try to inline ++ unless the parm machine modes really match what's expected. ++ ++ * stmt.c (emit_case_nodes): default_label is an rtx, not tree. ++ ++ * tm-next.h (DOLLARS_IN_IDENTIFIERS): Define it as 1. ++ ++ * output-sparc.c (output_move_double): Don't trust random structs ++ to be double-word aligned. ++ ++ * gcc.c: Pass -Wcomments to cpp. ++ ++ * rtl.def (ASM_OPERANDS): New operands, source file and line. ++ * rtl.h (ASM_OPERANDS_*): New macros for components of ASM_OPERANDS. ++ * stmt.c (expand_asm_operands): Use new fields, not REG_ASM_* notes. ++ * toplev.c (error_for_asm): likewise. ++ * rtl.h (enum reg_note): Delete REG_ASM_FILE, REG_ASM_LINE. ++ ++ * combine.c (try_combine): Check explicitly for volatility in I2, I1. ++ ++Fri Mar 10 19:30:10 1989 Richard M. Stallman (rms at ccvi) ++ ++ * c-parse.y (GOTO stmt): Set TREE_USED for the label. ++ * c-decl.c (poplevel): Warn about unused label. ++ ++ * c-decl.c (warn_pointer_arith, warn_strict_prototypes): New vars. ++ (lang_decode_options): Options to set them. ++ * c-typeck.c (pointer_int_sum, c_sizeof): Maybe warn if bad target. ++ * c-decl.c (grokparms): Maybe warn if nonprototype fn decl. ++ ++ * flags.h, toplev.c (warn_shadow): New flag. ++ * toplev.c (main): Decode it. ++ * c-decl.c (pushdecl): Maybe warn about any shadowing. ++ Existing parm-shadowing warning now disabled if shadowing decl ++ is also a parm. ++ ++ * flags.h, toplev.c (warn_id_clash, id_clash_len): New flags. ++ * toplev.c (main): Decode -Wid-clash-LEN. ++ * tree.c (get_identifier): Implement warning if two idents match. ++ ++ * toplev.c (compile_file): Warn about statics defined and unused. ++ ++ * rtl.h (CONST0_RTX): New macro. ++ ++ * recog.c (offsetable_address_p): New 1st arg says whether to demand ++ a strictly valid address. ++ (offsetable_memref_p): Pass nonzero. ++ * stmt.c (optimize_bit_field): Pass zero. ++ ++ * cccp.c (main): Allow -Wcomment like -Wcomments. ++ * c-decl.c (lang_decode_options): Likewise. ++ ++Sun Mar 5 15:02:59 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu) ++ ++ * m68k.md [tstdf, cmp[sd]f, truncdfsf2, floatsi[sd]f2, add[sd]f3, ++ sub[sd]f3, mul[sd]f3, div[sd]f3, neg[sd]f2, abs[sd]f2]: Made sure ++ that the test function's in the match_operands of the define_expand ++ and define_insn's matched, and made that test function ++ "register_operand" when both define_insn's really needed registers ++ in that spot. ++ ++Sat Mar 4 00:25:37 1989 Richard M. Stallman (rms at c2v) ++ ++ * expr.c (emit_push_insn): Don't ever bypass the big-endian ++ padding at the end. ++ ++ * cccp.c (deps_output): Break line if would otherwise exceed 75 chars. ++ Make a name for that value 75. ++ ++ * combine.c (subst): Handle general case of (subreg (sign_extend X)). ++ ++ * tm-sun386i.h (CPP_PREDEFINES): Define `sun'. ++ ++ * fixincludes: change `find' calls to find dirs thru symlinks. ++ ++ * flow.c (mark_set_1): (set (subreg (reg N))...) ++ does make reg N significant for this basic block. ++ ++Fri Mar 3 13:55:25 1989 Richard M. Stallman (rms at c2v) ++ ++ * c-decl.c (parmlist_tags_warning): Print an explanation ++ for the first such warning. ++ ++ * i386.md (extendsfdf): Let op 1 match op0 if that is an fp reg. ++ ++ * expr.c (expand_call): Fix stupid errors copying pcc struct value. ++ ++ * varasm.c (output_constructor): Discard NOP_EXPRs from build_c_cast. ++ ++Thu Feb 23 05:55:57 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Version 1.34 released. ++ ++ * c-typeck.c (build_c_cast): If EXPR is an error mark, return that. ++ ++ * fold-const.c (div_and_round_double): Abort if divisor is 0. ++ (combine): Likewise, for real constants. ++ (real_zerop): New subroutine. ++ (fold): Don't try to fold division if divisor is 0. ++ Don't try to fold reals if can't do arithmetic on them. ++ Don't try to compare reals for TRUTH_..._EXPR if can't do arith. ++ Use real_zerop to test reals for zeroness. ++ For TRUTH_ANDIF_EXPR and TRUTH_ORIF_EXPR, can simplify based on ++ first operand alone. ++ ++ * c-typeck.c (store_init_value): Fix error msg text. ++ ++ * tm-sparc.h (FUNCTION_PROFILER): Use `mcount'. ++ * tm-sun4os3.h (FUNCTION_PROFILER): Override it; use `.mcount'. ++ ++Wed Feb 22 04:33:22 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-hp9k320.h (CPP_SPEC, CPP_PREDEFINES): Make handling of ++ -Dmc68000 depend on TARGET_DEFAULT. ++ ++ * tm-sparc.h (FUNCTION_PROFILER): Missing newline in fprintf. ++ ++ * integrate.c (expand_inline_function): Don't map struct-value-address ++ in memory if fn does not use it. ++ ++ * c-parse.y (check_newline): At skipline, detect eof. ++ ++ * stmt.c (uninitialized_vars_warning): Change text of warning. ++ ++Tue Feb 21 03:58:50 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * output-sparc.c (output_mul_insn): Handle case of both args ++ in reg 8, or both in reg 9. ++ ++ * tm-sparc.h (ASM_SPEC): Define, to handle -pipe. ++ ++ * tm-sparc.h (FUNCTION_PROFILER): Add omitted fprintf args. ++ (BLOCK_PROFILER): Likewise. Use tempvar. ++ ++ * m68k.md (QImode btst): Allow nonoffsetable mem refs. ++ ++Mon Feb 20 00:32:42 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * flow.c (mark_used_regs): Don't record about global reg vars. ++ ++ * config.gcc (convex-*): tm file names are tm-convex1.h, tm-convex2.h. ++ ++ * tm-vax.h, tm-ns32k.h, tm-alliant.h: Define PCC_STATIC_STRUCT_RETURN. ++ ++ * gcc.c (compilers): Pass `-a' to cc1. ++ * tm-sun3.h, tm-sparc.h (LIB_SPEC): Define, to handle `-a'. ++ ++ * expr.c (emit_push_insn): Copy stack addresses to be passed to bcopy; ++ old method of preadjustment is broken by changes in emit_library_call. ++ ++ * c-decl.c (finish_decl): New temp `temporary'; don't get confused ++ about whether allocation was temporary. ++ ++Sun Feb 19 17:03:35 1989 Chris Smith (csmith at mozart) ++ ++ * tm-convex.h: define PCC_STATIC_STRUCT_RETURN ++ ++ * convex.md: ++ remove pshea patterns, movsi does it better. ++ add ashift:DI abs:DF abs:SF ++ (tstdi): use a clobbered register instead of a bogus DImode zero. ++ (trunchiqi2): delete noninstruction cvth.b ++ (udivsi3, udivhi3, udivqi3): deleted, expand_divmod does it now. ++ (call, call_value): delete stupid call/ret -> jump optimization. ++ (call, call_value): flush call_ap_check, use reg_mentioned_p instead. ++ ++ * convex.md: (movxx): swap constraint alternatives so that the ++ leftmost alternative is (set =g r). This makes (set mem const) ++ get combinable input reloads of const instead of uncombinable ++ output reloads to mem. They still do not combine, but wtf, ++ I'll inch up on it. ++ ++ * output-convex.c: (const_double_{high,low}_int): new routines ++ to pick apart const_doubles for assembler. ++ ++Sun Feb 19 01:40:17 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * sparc.md (shift memory right 24 bits): Another `a1' typo. ++ ++ * config.gcc (convex-*): Delete troublesome whitespace. ++ ++ * c-decl.c (grokparms): Delete redundant `parm != 0' tests. ++ ++ * stmt.c (fixup_memory_subreg): Slight simplification. ++ ++ * tm-sparc.h (FUNCTION_PROFILER): Fill delay slot. ++ (FUNCTION_BLOCK_PROFILER): Use sethi. ++ (BLOCK_PROFILER): Use %g2, not %g0. Use sethi. ++ ++Sat Feb 18 02:11:25 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_expr): Ignore const array's initial value ++ if it's an error_mark. ++ * c-decl.c (finish_decl): Set DECL_INITIAL to an error_mark ++ if the decl is a permanent node. ++ ++ * cccp.c (rescan): If traditional, if macro ends inside string, ++ keep scanning for the end of the string. ++ (handle_directive): A line of just `#' becomes blank. ++ (collect_expansion): \ in strings traditionally doesn't hide macro arg. ++ ++ * m68k.md, alliant.md (addsi3): New alternative a=r+a, in addition ++ to old a=a+r, needed since reload-insns are not commuted. ++ ++Fri Feb 17 03:15:23 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-m68k.h (PCC_STATIC_STRUCT_RETURN): Define it. ++ * toplev.c, flags.h: New var flag_pcc_struct_return. ++ * stmt.c (expand_function_start): Obey new flag and new variable. ++ * expr.c (expand_call): Obey new flag and new variable. ++ * varasm.c (assemble_static_space): New function. ++ ++ * stmt.c (expand_return): If we need cleanups, compute retval first ++ into pseudo reg, then do the cleanups, then copy it to return reg. ++ ++Thu Feb 16 02:59:52 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * regclass.c (init_reg_sets_1): Win if STATIC_CHAIN_REGNUM undefined. ++ ++ * expr.c (expand_call): Handle conflict between two precomputed ++ args that are both function calls returning structures. ++ ++ * loop.c (move_movables): Bkwds test of m->partial, for a matching reg. ++ ++ * expr.c (emit_library_call, expand_call): Handle STACK_ARGS_ADJUST. ++ ++Wed Feb 15 01:59:15 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * toplev.c (flag_caller_saves): New var, for -fcaller-saves. ++ DEFAULT_CALLER_SAVES controls initial value. ++ * global-alloc.c (find_reg): Do caller saves only if flag set. ++ * local-alloc.c (find_free_reg): Do caller saves only if flag set. ++ * tm-alliant.h, tm-convex.h: Define DEFAULT_CALLER_SAVES. ++ ++Wed Feb 15 01:59:15 1989 Chris Smith (rms at sugar-bombs.ai.mit.edu) ++ ++ * caller-save.c: New file. ++ * regs.h (CALLER_SAVE_PROFITABLE): New macro. ++ (reg_n_calls_crossed): new int-vector replaces reg_crosses_calls. ++ * flow.c (allocate_for_life_analysis, propagate_block, dump_flow_info): ++ Use reg_n_calls_crossed. ++ * stupid.c (stupid_mark_refs, stupid_life_analysis): Likewise. ++ * global-alloc.c (find_reg): Sometimes allocate call-clobbered regs ++ for call-crossing pseudos. ++ New arg ACCEPT_CALL_CLOBBERED; callers changed. ++ * local-alloc.c (find_free_reg): Similar changes. ++ (qty_n_calls_crossed): New int-vector replaces qty_crosses_calls. ++ (alloc_qty, local_alloc, combine_regs, find_free_reg): change that var. ++ * regclass.c (call_fixed_regs, call_fixed_reg_set): new vars. ++ (init_reg_sets_1): Initialize them. ++ * reload1.c (reload): Call caller-saves processing if needed. ++ ++Wed Feb 15 01:59:15 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (expand_expr): INTEGER_CST for DImode: don't handle ++ endianness here. So CONST_DOUBLE_LOW is always the low word. ++ * varasm.c (force_const_mem): Handle it here. ++ ++ * expr.c (convert_move): widening followed by extendsidi2 had braino. ++ ++ * integrate.c: Don't include ctype.h; not needed and kills Sun cpp. ++ ++ * m68k.md (cmpsf, cmpdf and their recognizers): ++ Replace MINUS with COMPARE. ++ Also, use VOIDmode for COMPAREs, not SF or DF. ++ ++ * optabs.c (sign_expand_binop): Handle ops such as division where ++ an unsigned char could be widened and handled with signed int insns. ++ * expmed.c (expand_divmod): Use that. ++ ++ * c-typeck.c (digest_init): Allow for type variants in validating ++ initialization from a string constant. ++ ++ * c-typeck.c (decl_constant_value): Disable opt. if pedantic or ++ outside functions, so that validity of program is never affected. ++ ++ * fold-const.c (fold): Signedness-test for ABS_EXPR was backwards. ++ ++Tue Feb 14 01:30:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (main): Don't omit normal output, if we want deps on ++ a separate stream. ++ ++ * c-decl.c (grokdeclarator): Don't record any arg types for functions ++ if -traditional. ++ ++ * print-tree.c (prtypeinfo): Mention permanent attribute. ++ ++ * tm-next.h: New file. ++ ++ * c-typeck.c (decl_constant_value): The DECL_INITIAL may be ERROR_MARK. ++ ++ * c-decl.c (duplicate_decls): For fns, new static decl overrides ++ old non-static one. ++ ++ * emit-rtl.c (gen_lowpar, gen_highpart): Use change_address, so we ++ preserve volatility, etc. ++ ++ * stmt.c (expand_expr_stmt): Use emit_filename, emit_lineno ++ as file and line for any warning. ++ * emit-rtl.c (emit_line_note): Set those vars. ++ ++ * c-decl.c (store_parm_decls): If -Wimplicit, warn of arg with no decl. ++ ++ * recog.c (offsetable_address_p): Use strict_memory_address_p, ++ since called from reload.c. ++ ++Mon Feb 13 03:11:50 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * sparc.md (compare-to-reg patterns): Some still had MINUS. ++ ++ * toplev.c (main): Warn if `-a' on system that can't handle it. ++ ++ * stmt.c (expand_asm_operands): Delete unused local `val'. ++ (pushcase_range): Likewise for `value'. ++ (fixup_var_refs): Likewise for `insn'. ++ * emit-rtl.c (start_sequence): Likewise for `save'. ++ * loop.c (scan_loop): Likewise for `before_start'. ++ * expr.c (expand_expr): Delete label `binop1'. ++ ++ * reload1.c (constraint_accepts_reg_p): Handle SUBREGs of REGs. ++ ++Sun Feb 12 05:37:46 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * gnulib.c (__bb_init_func): New function ++ ++ * tm-m68k.h (BLOCK_PROFILER, FUNCTION_BLOCK_PROFILER): Defined. ++ ++Sat Feb 11 00:05:55 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-sparc.h (FUNCTION_PROFILER): Make it really work. ++ (BLOCK_PROFILER, FUNCTION_BLOCK_PROFILER): New macros. ++ ++ * final.c (final): Use BLOCK_PROFILER at start of each basic block. ++ (final_start_function): Use FUNCTION_BLOCK_PROFILER if -a. ++ (end_final): New fn to output the block-profiling tables. ++ * toplev.c (profile_block_flag): Set if -a. ++ (compile_file): Call end_final. ++ ++ * combine.c (try_combine): Avoid combining in most cases if I3 ++ has an inc or dec and I1 or I2 uses the same register. ++ ++ * tree.c (size_in_bytes, int_size_in_bytes): Use type's main variant. ++ ++ * c-typeck.c (actualparameterlist): Error if parm type is incomplete. ++ ++ * expr.c (expand_call): Ignore args that have incomplete type. ++ ++Fri Feb 10 02:26:02 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-parse.y (case stmts): strip dummy NOP_EXPRs. ++ ++ * reload1.c (reload_as_needed): Clear reg_{has,is}_output_reload here, ++ (choose_reload_targets): not here. ++ ++Thu Feb 9 01:35:55 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * output-sparc.c (output_mul_by_constant): Forget cc status. ++ ++ * stmt.c (assign_parms): Don't put volatile parms in regs. ++ ++ * vax.md (jlbs/jlbc recognizers): Move them before jbc/jbs recognizers. ++ ++ * cse.c (fold_rtx): Handle (EQ (COMPARE ...) (CONST_INT 0)). ++ ++ * c-typeck.c (default_conversion, digest_init): For static const ++ nonvolatile scalar variable, use its initial value if known. ++ ++ * expr.c (expand_expr: case COMPONENT_REF): If containing structure ++ comes out volatile, leave the component MEM volatile too. ++ ++ * hard-reg-set.h: Fix multi-word case macros to swallow semicolon. ++ ++ * c-typeck.c (default_conversion): In array=>ptr, volatility ++ of target type comes from TREE_THIS_VOLATILE, not TREE_VOLATILE. ++ ++ * reload1.c (forget_old_reload_1, choose_reload_targets): ++ New array reg_is_output_reload is converse of reg_has_output_reload. ++ forget_old_reload_1 needs both. ++ ++Wed Feb 8 01:26:24 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * reload1.c (forget_old_reloads_1): New fn, guts of forget_old_reloads. ++ Do process a spill reg if it isn't used for reloading in this insn. ++ (forget_old_reloads): Deleted, replaced with note_stores. ++ (reload_as_needed): Undo Feb 1 change. ++ Call forget_old_reloads_1 on pseudos autoincremented and not reloaded. ++ ++ * c-typeck.c (convert_for_assignment): Handle variant types. ++ ++ * c-decl.c (lang_decode_option): -Wall implies -Wunused. ++ ++Tue Feb 7 01:32:28 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * combine.c (try_combine): Don't try adding outputs to an asm_operands. ++ ++ * cse.c (CHEAPER): Don't ever let a hard reg get ahead of a pseudo. ++ ++ * stmt.c (fixup_gotos): Don't crash on undef label if THISBLOCK is 0. ++ ++ * c-decl.c (parmlist_tags_warning): New fn. ++ * c-parse.y (parmlist, parmlist_or_identifiers): Call it, ++ to warn about any tags defined inside the parmlist. ++ * c-decl.c (grokparms): Don't warn about ptr to incomplete type. ++ The new warning is better. ++ ++Mon Feb 6 01:11:36 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (store_constructor): Incorrect ALIGN arg in store_field calls. ++ ++ * c-parse.y (%union): Delete unused alternative. ++ ++ * c-decl.c (grokparms): Use main variant to test for ptr to incomplete. ++ ++ * c-decl.c (finish_enum): Delete superfluous init for `pair'. ++ ++ * cse.c (fold_rtx): Optimize X+0, X-0 in floating point. ++ Fix typo in PLUS case; omitted value to compare GET_MODE_CLASS against. ++ (equiv_constant): Allow CONST_DOUBLE. ++ ++ * cse.c: Optimize past if-statements that are known to fail. ++ (cse_insn): If condjump becomes uncond to end of this block, ++ set cse_skip_to_next_block. ++ (cse_basic_block): If that happens, ignore rest of block, and maybe ++ treat next block as part of this one (if tables have room). ++ Resume insn that starts next basic block to be scanned. ++ (cse_main): Make room for at least 500 qtys. ++ (cse_end_of_basic_block): Subroutine broken out of cse_main. ++ ++ * c-parse.y (hash, is_reserved_word): Rewrite: new hash technique. ++ ++ * c-decl.c (duplicate_decls): Be smart about proto vs nonproto mismatch ++ involving a function definition. ++ ++Sun Feb 5 17:31:12 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * alliant.md (movdi): Typo in `fmoved'. ++ (ftruncsf2): Handle moving into fp reg. ++ ++ * jump.c (jump_optimize): Typo in testing PRESERVE_DEATH_INFO_REGNO_P. ++ ++ * reload1.c (choose_reload_targets): Move all death notes to the ++ output reload insn. ++ ++ * m68k.md (fix_truncsfsi2,fix_truncdfsi2): Use accurate rtl pattern. ++ ++ * loop.c (delete_insn_forces): Use presence of REG_RETVAL to check ++ for value-of-library-call insn. ++ ++Sat Feb 4 18:17:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (expand_inline_function): Make addresses of stack ++ slots valid somehow. ++ ++ * tm-3b1.h (DIVSI3_LIBCALL, etc.): Define these macros; avoid gnulib. ++ ++ * expmed.c (store_bit_field): Avoid (subreg (mem)) when converting ++ VALUE1 to SImode. ++ ++ * jump.c (jump_optimize): Do delete USE and CLOBBER insns. ++ This is needed for proper jump optimization. ++ ++ * rtl.def (COMPARE): New code. ++ * *.md (compare and related patterns): Use COMPARE, not MINUS:VOID. ++ * loop.c (eliminate_biv, can_eliminate_biv_p): Likewise. ++ * cse.c (fold_rtx, fold_cc0, cse_insn): ++ * output-m88k.c (output_{f,}compare, output_store): ++ * output-sparc.c (strict_single_insn_op_p, single_insn_src_p, safe_insn_src_p): ++ * combine.c (subst): ++ * jump.c (jump_back_p): ++ ++Fri Feb 3 18:34:27 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * output-i386.c (notice_update_cc): If arith insn sets the cc's, ++ discard all remnants of previous cc value and flags. ++ ++ * sparc.md (ashiftrt mem by 24): Fix typo `a1'. ++ ++Thu Feb 2 14:55:44 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * output-sparc.c (output_mul_insn): Clear the CC status. ++ ++Wed Feb 1 20:01:54 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Version 1.33 released. ++ ++ * reload1.c (reload_as_needed): On entering new basic block, ++ if it didn't need reload regs, forget all inherited contents of those. ++ ++ * tm-alliant.h (NOTICE_UPDATE_CC): Floating moves don't set the cc's. ++ Also delete the clauses and tests for FPA regs. ++ ++Tue Jan 31 21:51:05 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * config.gcc: Handle convex-c1, convex-c2. ++ * tm-convex1.h, tm-convex2.h: New files that include tm-convex.h. ++ * tm-convex.h: Define switches -mnoc1, -mnoc2. ++ ++ * config.gcc: rename `nofp' to `nfp', to match the file names. ++ ++Mon Jan 30 22:12:15 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * output-sparc.c (output_delay_insn): Extract the operands, ++ call alter_subreg, constrain_operands and NOTICE_UPDATE_CC. ++ So callers other than output_eager_then_insn don't lose. ++ (output_eager_then_insn): No need to do that stuff. ++ ++ * symout.c (symout_block_symbols): Handle (MEM (REG)) for ++ variable-sized arrays. ++ ++ * tm-encore.h (ASM_SPEC): Always pass -j; avoid jump-range lossage. ++ ++Sun Jan 29 17:06:26 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * alliant.md: Fix refs to CONST_DOUBLEs to use CONST_DOUBLE_{HIGH,LOW}. ++ ++ * combine.c (subst): (minus (zero_extend ...) (const_int ...)) opt. ++ now limited to within the context of (set (cc0) ...). ++ ++Sat Jan 28 14:26:08 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cse.c (fold_cc0): Missing `&' extracting CONST_DOUBLEs. ++ (fold_rtx): Don't put CONST_DOUBLEs together into a (CONST (PLUS...)). ++ ++ * output-convex.c (gen_cmp): Recognize CONST_DOUBLE as a constant. ++ ++ * tree.c (build_real_from_int_cst): Typo in REAL_ARITHMETIC case. ++ ++ * Makefile (bootstrap2): Don't use bootstrap3 as subroutine. ++ ++ * varasm.c (force_const_mem): Put the CONST_DOUBLE on the chain ++ if its MEM is stored in it; so it can be cleared at end of function. ++ ++ * stmt.c (emit_case_nodes): Put a compare before each cond-jump. ++ Two cond-jumps after one cond is invalid and makes cse produce garbage. ++ ++Fri Jan 27 01:05:01 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tm-sun2.h (CPP_SPEC): Define __HAVE_68881__ only if -m68881. ++ ++ * c-decl.c (start_decl): Don't expand_decl if DECL already has rtl. ++ (grokparms): If just declaring fcn, incomplete parm type is just ++ a warning, and don't discard the specified type. ++ ++ * expmed.c (expand_divmod): Be smarter about not clobbering args ++ with intermediate results; one mem can clobber another, and a reg ++ can clobber a mem. ++ ++ * tm-i386.h (FUNCTION_PROFILER): Use LPREFIX. May actually work now. ++ * tm-i386gas.h: Include tm-bsd386.h, not tm-att386.h. ++ This means changing asm syntax. ++ #undef DBX_NO_XREFS and DBX_CONTIN_LENGTH. ++ ++ * sparc.md (eager branch peepholes): Don't forget 2nd arg to ++ safe_insn_src_p. ++ Don't print warnings. ++ * output-sparc.c: (strict_single_insn_op_p): Return 0 for floating ++ REG or MEM, since copying that may take 2 insns. ++ (operands_satisfy_eager_branch_peephole): require delay insn to ++ be strict_single_insn_op_p as well as safe_insn_src_p. ++ (operand_clobbered_before_used_after): Don't print warnings. ++ ++ * varasm.c (decode_rtx_const): Clear entire structure incl. gaps. ++ Avoids spurious hash mismatches. ++ (force_const_mem): If CONST_DOUBLE, store its CONST_DOUBLE_MEM field. ++ Also look in that field rather than hashing, to save time. ++ ++ * c-typeck.c (build_c_cast): If value is literal, mark NOP_EXPR as so. ++ (store_init_value): Change error msg. ++ ++ * c-decl.c (duplicate_decls): Classify prototype vs nonprototype ++ mismatches better. ++ ++ * tm-3b1.h: Fix comment. ++ ++Wed Jan 25 12:46:50 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (cleanlinks): Use -f. ++ ++Tue Jan 24 17:54:16 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cse.c (canon_hash): Fix paren error in last change. ++ ++ * varasm.c (immed_real_const_1): Missing arg to bcmp. ++ ++Mon Jan 23 02:43:45 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (layout_type): BLKmode elts force array to be BLKmode. ++ ++ * genpeep.c, genoutput.c, genemit.c: Put `#include "real.h"' in output. ++ ++ * stmt.c (expand_expr_stmt): No "no effect" warning for error-mark. ++ ++ * varargs.h: Rename implicit arg name to __builtin_va_alist ++ which triggers code in assign_parms. Does this really matter? ++ ++ * sparc.md (sne): New define_expand. ++ (seq recognizers): Handle sne as well. ++ * output-sparc.c ({strict_,}single_insn_src_p): ++ Some NEG and MINUS insns are actually 2 asm insns. ++ (safe_insn_src_p): No floating arith is safe; they can trap. ++ (eq_or_neq): New fn, for seq/sne recognizers. ++ ++ * c-decl.c (grokdeclarator, size of array type): ++ Strip from SIZE any NOP_EXPRs that don't change anything. ++ ++ * reload.c, recog.c: Include real.h so constraint macros can examine ++ CONST_DOUBLEs. ++ ++Sun Jan 22 04:12:54 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-decl.c (init_decl_processing): Define __builtin_saveregs. ++ * tree.h: likewise. ++ * expr.c (expand_builtin): Handle it. ++ ++ * tm-sparc.h: Define TARGET_EAGER and -meager. ++ * sparc.md (eager branch peepholes): Reenable, but test TARGET_EAGER. ++ Change fb insns to use %F. Delete `,a' from some of them. ++ * jump.c (jump_optimize): Don't delete USE and CLOBBER insns. ++ ++ * xm-vms.h (const): Define it as empty. ++ ++ * make-cccp.com: Move the rename of cexp_tab.c. ++ Compile cccp.c with no macro definitions. ++ ++ * cccp.c (main): VMS conditional for setting max_include_len. ++ ++Sat Jan 21 12:53:00 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varargs.h (va_start): On sparc, call __builtin_saveregs. ++ Delete the old conditional that used va-sparc.h. ++ Rename macros and locals to start with two underscores. ++ * va-sparc.h: File deleted. ++ ++ * c-decl.c (store_parm_decls): Initialize OTHERS. ++ ++ * stmt.c (assign_parms): Obey layout_decl. ++ ++Fri Jan 20 02:19:32 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cse.c (fold_rtx): For SYMBOL_REF and LABEL_REF, mask address ++ to 16 bits. ++ ++ * tree.h (NUM_TREE_CODES): NUM_TREE_CODE renamed. ++ ++Thu Jan 19 13:53:24 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (mark_addressable): For global reg var, report error. ++ Now returns an int; value of 0 means caller should fail. ++ All calls (in this file) changed. ++ ++ * stor-layout.c (layout_decl): Don't let an more than 1 word ++ of any aggregate go in any 1 register. (Needed for machines whose ++ integer regs are 64 bits). ++ ++ * tm-convex.h, xm-convex.h, convex.md, output-convex.c: new files. ++ ++ * expr.c (convert_move): Use extendqidi2, etc. for converting ++ small ints to double ints. Use zero_extendsidi2 rather than ++ clearing the high half. ++ ++Wed Jan 18 01:20:52 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varasm.c (make_decl_rtl): If global `register' decl is invalid, ++ make ordinary non-register rtl. ++ ++ * output-sparc.c (operand_clobbered_before_used_after): new fn. ++ (reg_clobbered_p, safe_insn_src_p): New fns. ++ (single_insn_src_p): Treat constants all as ok, even though not ++ always literally so. Also accept some SIGN_EXTENDs and ZERO_EXTENDs. ++ (strict_single_insn_src_p): New fn, like above but is strict ++ about constants and constant memory addresses. ++ (relop): New fn. ++ (output_move_double): Don't make a MEM, and don't use %m. ++ (output_delayed_branch): New name for output_delay_insn. ++ Now handle non-small constant operands. ++ Avoid duplicate loads of g1 for constant addresses. ++ Use recog_operand directly for output of the delay insn. ++ (output_delay_insn): Now a completely new fn. ++ (output_eager_then_insn, next_real_insn_no_labels): New fns. ++ (operands_satisfy_eager_branch_peephole): New fn. ++ ++ * sparc.md: New peepholes for testing a recently used operand. ++ New peepholes for delayed branches, incl. conditional ones. ++ ** Some of them commented out because they seem not to work. ++ (andcc recognizer): Fix typo, missing %. ++ (bgt): Change bgt to bg in output. ++ (reversed jumps): Replace with one pattern using match_operand. ++ It uses %F to output the condition. ++ (movsi): For round-valued immed const, use just a sethi. ++ For other immed, use explicit sethi and or. ++ (movhi, movqi): use `move' for reg source or small int source. ++ For other immed, use explicit sethi and or. ++ (movsi, etc.): Handle all constant addresses like SYMBOL_REFs. ++ (movsf): Delete never-used duplicate code for constant addresses. ++ (addsi3, subsi3, cse'd multiply): Use sethi and or, rather than set. ++ (andsi3, iorsi3, xorsi3): Likewise. ++ (jump): Make an annulled branch. ++ ++ * tm-sparc.h (PROMOTE_PROTOTYPES): Define this. ++ (GO_IF_LEGITIMATE_ADDRESS): Now accept all constant addresses; ++ also cleaned up. ++ (NOTICE_UPDATE_CC): Don't change the G1 status when storing in memory. ++ Assume all PARALLEL insns are peepholes. ++ (PRINT_OPERAND): New codes C and N for outputting conditions, ++ either forward or reversed. Also F for reversed floating. ++ ++ * jump.c (delete_for_peephole): New function to delete range of insns. ++ * genpeep.c (gen_peephole): Output code to use this. ++ ++ * Makefile (install): Fix typo, had $${name} for $${file}. ++ ++Tue Jan 17 00:00:12 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * i386.md (ashlsi3): Use addl or leal for special cases. ++ ++ * c-decl.c (grokdeclarator): Make a non-global VAR_DECL public ++ if it is external. ++ ++ * masm386.c: Clean up formatting. ++ ++ * cse.c (fold_rtx): Typo simplifying x|0 or x^0 ++ when the 0 comes second. ++ ++ * expmed.c (store_fixed_bit_field): For halfwords, verify that ++ the field fits in an *aligned* halfword. ++ (extract_fixed_bit_field): likewise. ++ ++ * expmed.c (store_split_bit_field): New arg align, passed in from ++ store_fixed_bit_field and passed back to it. ++ (extract_split_bit_field): likewise. ++ ++ * expr.c: Reinsert changes from Jan 2, mysteriously deleted Jan 3. ++ Also changes from Dec 23, Dec 28 and Dec 29. ++ ++ * tm-i386.h: Likewise for changes from Dec 30. ++ ++ * c-typeck.c (build_component_ref): If field's type is error-mark, ++ return an error-mark. ++ ++Mon Jan 16 14:16:54 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * genpeep.c (main): Output code to exit early if insn is followed ++ by a barrier. ++ (gen_peephole): Reject barriers just like labels. ++ ++ * stmt.c (do_jump_if_equal): New arg UNSIGNEDP, for emit_cmp_insn. ++ Caller changed. Now static. ++ ++ * final.c (final): Set INSN_DELETED_P in insns when output. ++ ++ * final.c (final): Re-set BODY if peephole does anything. ++ ++ * c-decl.c (grokparms): Ignore anything but PARM_DECLs in the list. ++ (store_parm_decls): If we had a prototype, separate out anything other ++ than a PARM_DECL declared in it, and pushdecl those at the end, ++ after DECL_ARGUMENTS is set. ++ ++ * stmt.c (expand_end_case): Do stack adjusts after computing index. ++ ++ * expr.c (store_one_arg): Handle padding for case of BLKmode ++ for which space was preallocated. ++ ++ * integrate.c (copy_rtx_and_substitute): When copying asm insn, ++ preserve sharing of the input-operand vectors. ++ (expand_inline_function): Clear {orig,copy}_asm_operands_vector ++ to make that mechanism work. ++ (save_for_inline, copy_for_inline): Likewise. ++ ++ * stmt.c (expand_asm_operands): Reject `+' in constraints. ++ Every output constraint requires `='; inputs reject it. ++ ++ * stmt.c (expand_function_end): Arg to fixup_gotos was missing. ++ ++Sun Jan 15 00:28:23 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c, gcc.c (main): Handle SIGPIPE. ++ (pipe_closed): New fn; report suitable fatal error. ++ ++ * loop.c (loop_optimize): Initialize moved_once. ++ ++ * gcc.c (do_spec): Don't call `execute' if value != 0. ++ Delete redundant second call to do_spec_1. ++ ++ * toplev.c (compile_file): Make declared-but-not-defined warnings ++ only if -Wunused. ++ ++ * stmt.c (emit_case_nodes): Fix typo setting gen_ble_pat. ++ ++ * tm-sparc.h ({U,}MODSI3_LIBCALL): Name was wrong. ++ ++ * gcc.c (env_exec_prefix refs): Don't try to open via it if it's null. ++ ++ * output-sparc.c (output_store, output_load_{fixed,floating}): ++ Fixed confusions between the mem ref and its address. ++ ++ * cse.c (canon_hash): global_regs has entries only for hard regs. ++ * flow.c (insn_dead_p, mark_set_p, mark_used_regs): Likewise. ++ ++ * cse.c (fold_rtx): More simplifications for MULT, IOR, AND, XOR ++ DIV and shifts with one arg 0 or 1. ++ ++Sat Jan 14 11:41:11 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (build_array_ref): If pedantic, check for regdecl arrays. ++ ++ * fixincludes: Make all subdirs in advance, so no need for `dirname'. ++ ++ * genpeep.c (gen_peephole): Delete code to increment LABEL_NUSES; ++ instead, clear JUMP_LABEL for any jumps being deleted. ++ No need to test INSN1 for being a label, since not called then. ++ [If any of the matched insns is a JUMP_INSN, set want_jump, ++ and in that case make the matched peephole a JUMP_INSN itself.] ++ That's in an #if 0 now; it's good in jump, but not in final. ++ ++ * jump.c (jump_optimize): Don't do peepholes here. ++ * final.c (final): Do them here. ++ ++ * jump.c (jump_optimize): In optimizing `if (foo) bar; else break;', ++ don't try to invert anything but a standard-looking conditional jump. ++ ++ * jump.c (jump_optimize): Do peepholes on ALL BUT the first pass. ++ ++ * gcc.c (env_exec_prefix): New var used like user_exec_prefix ++ but set from envvar GCC_EXEC_PREFIX. ++ ++Fri Jan 13 13:21:59 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * genpeep.c (gen_peephole): Test INSN1 for a label at the very start, ++ then test following insns at the end of the loop. ++ ++ * sparc.md (call recognizers): do CC_STATUS_INIT, for %g1. ++ ++Thu Jan 12 02:13:49 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varasm.c (make_decl_rtl): Recognize more error cases for reg vars: ++ BLKmode, or initializer given. ++ Distinguisn missing asm from invalid name. ++ ++ * expr.c (expand_call): Never return 0; return const0_rtx instead. ++ This makes expand_expr more uniform. ++ ++ * c-decl.c (grokparms): For ptr to incomplete type, just warn; ++ don't change the parm's type. ++ ++ * stmt.c (expand_return): Set RETVAL_RHS so as to recognize ++ tail-recursive fcn returning void. ++ Unconditionally test value of expand_expr for being a REG. ++ ++ * reload.c (find_reloads): Don't process insns that have ++ no constraint alternatives. No more need for have_constraints. ++ ++ * recog.c (constrain_operands): New local var nalternatives. ++ Don't bother checking the insn if nalternatives is 0. ++ ++Wed Jan 11 01:27:48 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Implement global register decls. ++ ++ * varasm.c (make_decl_rtl): Handle global register vars. ++ (make_function_rtl): Set function_defined: after 1st function dfn. ++ (assemble_variable): Ignore global register vars. ++ ++ * c-decl.c (grokdeclarator): Don't reject global register decls. ++ (builtin_function): Use make_decl_rtl, not make_function_rtl, ++ to avoid setting function_defined. ++ ++ * regclass.c (init_reg_class{,_1}): Init and process global_regs. ++ They are fixed, and call-clobbered. ++ ++ * flow.c (insn_dead_p): Storing one of global_regs is never dead. ++ (mark_used_regs, mark_set_1): A global reg is never dead. ++ ++ * cse.c (canon_hash): Consider global regs volatile. ++ ++ ++ * expr.c (do_jump): Know how to invert jumps which are sequences. ++ ++ * dbxout.c, symout.c, final.c: On USG, use our own stab.h. ++ ++ * tm-i386gas.h: New file for GAS on sysV (with DBX debugging info). ++ ++ * m68k.md (bfchg and bfins patterns): Make # alternatives uniform. ++ * alliant.md: Likewise; also in movdf patterns. ++ ++ * genoutput.c (output_epilogue): Spurious `break' disabled ++ error check for mismatched # of alternatives. ++ (output_epilogue, scan_operands): Errors in input are not fatal. ++ ++ * flow.c (regno_uninitialized): Avoid crash if no basic blocks. ++ ++ * sparc.md (move insns): Delete special patterns that handled ++ symbolic constant addresses. The main move patterns now do this. ++ * output-sparc.c (output_store, output_load_{fixed,floating}): ++ Subroutines to do the work for this; has the code from those ++ special patterns. Also fixed bugs in testing against cc_status.mdep. ++ ++ * output-sparc.c (output_delay_insn): Clear the CC status. ++ This is necessary for %g1 in the case of a call insn. ++ ++ * tm-i386.h (REG_CLASS_CONTENTS): INDEX_REGS is now all but ESP. ++ (REGNO_REG_CLASS): Corresponding change. ++ (REG_CLASS_FROM_LETTER): Eliminate `x' letter since not used. ++ ++ * optabs.c (emit_cmp_insn): New arg ALIGN, used for BLKmode. ++ All callers changed. ++ Pass alignment (as rtx) as 4th arg to cmpstr gen functions. ++ Use cmpstrhi if available. ++ * expr.c (compare): Only this call passes a nonzero ALIGN. ++ ++ * expr.c (emit_push_insn, emit_block_move): Pass alignment (as rtx) ++ as 4th arg to movstr gen functions. ++ ++Tue Jan 10 23:43:05 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stor-layout.c (layout_type): Use BLKmode, if a struct isn't ++ aligned well enough for a scalar mode. ++ ++ * expr.c (expand_expr): For static CONSTRUCTOR, ensure memory ++ address is made valid. ++ ++ * genpeep.c (match_rtx): For MATCH_OPERATOR, set max_opno, n_operands. ++ ++Mon Jan 9 17:07:56 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * varasm.c (output_constant): Split strings every 2000 chars. ++ ++ * stmt.c (expand_end_case): Test bkwds, handling constant switch arg. ++ ++Fri Jan 6 09:11:20 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * output-sparc.c (output_delay_insn): Add parens to first if test. ++ (output_move_double): Turn addr for `sethi' into MEM for %m. ++ ++ * c-typeck.c (convert_for_assignment): move test for ERROR_MARK. ++ ++ * c-parse.y (unary_expr): Allow cast_expr as arg of unary op. ++ ++ * stmt.c (expand_decl): Don't abort if FUNCTION_DECL lacks rtl; ++ assemble_variable is called after this. ++ ++ * c-parse.y (primary -> identifier): Separate case for undeclared ++ identifier outside of functions; avoids confusing error msgs. ++ ++Thu Jan 5 01:24:47 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * Makefile (install): Ignore errors in all `if' commands. ++ Create $(libdir) if nec. ++ ++ * Makefile (insn-*.[ch]): Put in empty commands. May help Ultrix Make. ++ ++ * stmt.c (emit_case_nodes): New arg UNSIGNEDP says do unsigned jumps. ++ Arg INDEX is an rtx, not a tree. ++ (expand_end_case): Pass that arg. ++ (node_has_{low,high}_bound): check for overflow, avoid confusion. ++ ++Wed Jan 4 02:24:21 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * sparc.md (movdi, movdf): Use `&' constraint when loading reg from; ++ otherwise can lose on (set (reg X) (mem (plus (reg X) (reg X+1)))). ++ ++ * expr.c (emit_push_insn): For memory scalar partially going in regs, ++ copy each word to reg before pushing. Avoids memory-to-memory move. ++ Make the displaced address valid. ++ Also delete unfinished STACK_OFFSET variable. ++ ++ * c-parse.y (check_newline): Read just one #-directive and return. ++ This prevents lossage when toplev.c calls it to get the main input file ++ name, and it gets a following #ident as well. ++ ++ * c-decl.c (lang_decode_option): Set warn_cast_qual for -Wcast-qual. ++ * c-typeck.c (build_c_cast): Issue some warnings if set. ++ ++ * tm-3b1.h (ASM_OUTPUT_CASE_LABEL): Missing `;'. ++ ++Tue Jan 3 18:07:31 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (emit_library_call): Do force_operand on each operand ++ if it isn't a REG, MEM or constant. ++ Do this, or mode conversions, earlier, before loading any hard regs. ++ ++ * m68k.md (addsi3) [SGS]: Put a zero displacement in the `lea'. ++ ++ * c-typeck.c (default_conversion): Don't lose `const' or `volatile' ++ when converting array type to pointer. ++ ++Mon Jan 2 01:18:01 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expmed.c (store_bit_field, store_fixed_bit_field): New arg, ++ alignment in bytes the structure is known to have. ++ (store_fixed_bit_field): Handle working in halfwords, ++ in case the pointer isn't known to have fullword alignment. ++ * expmed.c (extract_bit_field, extract_fixed_bit_field): likewise. ++ (extract_bit_field): fix unsignedp arg to extract_fixed_bit_field. ++ * expr.c (store_field): New arg, passed to {store,extract}_bit_field ++ (expand_assignment, store_constructor): Pass that arg. ++ (expand_expr): Pass new arg to extract_bit_field. ++ ++ * m68k.md (casesi_2 recognizer): Offset always 6 for 3b1. ++ ++ * c-typeck.c (convert_for_assignment): Strip from rhs no-op NOP_EXPRs ++ put on by build_c_cast (to make the result not an lvalue). ++ (build_modify_expr, build_compound_expr): likewise. ++ (build_conditional_expr): likewise. ++ (actualparameterlist, build_function_call): likewise. ++ (default_conversion, truthvalue_conversion): likewise. ++ ++ * loop.c (move_movables): If reg has moved out of one loop, ++ divide `savings' by 2. ++ ++Sun Jan 1 03:00:07 1989 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * c-typeck.c (truthvalue_conversion): Distribute the conversion ++ into the arms of a COND_EXPR. ++ ++ * cse.c (fold_rtx): Don't fold a MINUS with VOIDmode ++ into a symbolic constant--it's incorrect. ++ ++ * cse.c (cse_insn): If SRC is a subreg with known value, simplify it. ++ ++ * integrate.c (copy_rtx_and_substitute): Allow a ref to a part of ++ MEM parm whose actual parm is a reg, provided it refs ++ the low part of the MEM. ++ (function_cannot_inline_p): Don't inline functions which have ++ aggregate parameters and take their addresses. This could produce ++ refs to non-low-parts, which copy_rtx_and_substitute can't handle. ++ ++ * c-typeck.c (build_modify_expr): If lhs is COND_EXPR, ++ make a COMPOUND_EXPR to ensure the rhs is computed before the branch. ++ ++ * Implement -pipe. ++ * gcc.c (do_spec_1): `|' is now a special delimiter ++ which goes in the argbuf. ++ When a newline is preceded by a `|', delete it if no -pipe. ++ Otherwise, don't execute yet, and keep scanning. ++ (do_spec): At end, if we have stuff with no newline, execute it. ++ (handle_braces): Implement %{|foo:...}. ++ (execute): If argbuf contains some `|'s, run several processes ++ and pipe them together. ++ (pexecute): new subroutine to make one of the processes. ++ (find_exec_file): new fn to search for program to execute. ++ (record_temp_file): new arg FAIL_ONLY. ++ (store_arg): 2nd arg == 3 means delete file on failure. ++ This is used for output files. ++ (delete_temp_files): delete certain files only if fail. ++ ++ * cccp.c (include_defaults): /usr/include before /usr/local/include. ++ ++ * recog.c (asm_noperands): 1-off in loop checking CLOBBERS ++ when no output operands and PARALLEL. ++ ++ * expmed.c (negate_rtx): Sign-extend the high bits rather than clear. ++ ++ * cse.c (fold_rtx): fold negation of real values. ++ (fold_cc0): fold comparisons on real values. ++ ++ * Makefile (install): Use $(INSTALL) for gcc.1 and files in USER_H. ++ ++ * Handle floating-point problems for cross-compilation. ++ ++ * real.h (CONST_DOUBLE_LOW, etc.): new macros to access CONST_DOUBLE. ++ * varasm.c (immed_double_const, decode_rtx_const): Use these. ++ ({force,clear}_const_double_mem): Likewise. ++ * output-*.c (output_move_double): Use these. ++ * output-m68k.c (standard_{68881,sun_fpa}_constant_p): Likewise. ++ * tm-*.h (PRINT_OPERAND): Use these. ++ * output-i386.c (print_operand): Use these. ++ * final.c (output_addr_const): Likewise. ++ * emit-rtl.c (gen_rtx): Delete special code for CONST_DOUBLE. ++ ++ * real.h (union real_extract): Portable type for storing real as ints. ++ * varasm.c (immed_double_const, decode_rtx_const): Use these. ++ ++ * varasm.c (immed_real_const_1, decode_rtx_const): ++ Don't assume REAL_VALUE_TYPE is 2 ints long. ++ * emit-rtl.c (init_emit_once): Likewise. ++ ++ * real.h (REAL_VALUE_TYPE): Define as `double' if not defined. ++ (REAL_IS_NOT_DOUBLE): Define this if default REAL_VALUE_TYPE not used. ++ (REAL_VALUES_EQUAL, REAL_VALUES_LESS): Define, if not already defined. ++ (REAL_VALUE_LDEXP, REAL_VALUE_ATOF): Likewise. ++ * tree.h (struct tree_real_cst): Use REAL_VALUE_TYPE for the value. ++ ++ * rtl.c (init_rtl): Increase length of CONST_DOUBLE if REAL_VALUE_TYPE ++ needs more space. Change the rtx_format element to match. ++ * varasm.c (immed_real_const_1): 1st arg now has REAL_VALUE_TYPE. ++ (force_const_mem): Assume a CONST_DOUBLE contains REAL_VALUE_TYPE. ++ * emit-rtl.c (init_emit_once): Likewise. ++ And use REAL_VALUE_ATOF to get a floating zero. ++ * optabs.c (expand_float): Use REAL_VALUE_TYPE, REAL_VALUE_LDEXP. ++ * c-parse.y (yylex): Likewise, and use REAL_VALUE_ATOF. ++ * fold-const.c (split_tree): Don't accept REAL_CSTs. ++ (combine, fold_convert, fold): Use REAL_ARITHMETIC if defined; ++ else don't fold reals if they are not doubles. ++ * tree.c (build_real_from_int_cst): Likewise. ++ * print-tree.c (dump) [REAL_IS_NOT_DOUBLE]: output float value ++ in hex, since we don't know how to do it right. ++ ++Sat Dec 31 14:15:13 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * optabs.c (init_optabs): Handle new macros {U,}MULSI3_LIBCALL, ++ DIVSI3_LIBCALL, MODSI3_LIBCALL. ++ * tm-sparc.h: Define {,U}{MUL,DIV,MOD}SI3 to call Sun's library direct. ++ ++ * tm-sun3-nfp.h, tm-sun3-fpa.h: New files. ++ ++Fri Dec 30 00:14:36 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * cccp.c (main): Certain envvars specify a file to write deps info to. ++ ++ * toplev.c (compile_file): Warn about undefined fns declared static. ++ ++ * m68k.md (casesi_2 recognizer) [SGS] RTX_INTEGRATED_P test backwards. ++ * tm-3b1.h (ASM_OUTPUT_CASE_LABEL): Likewise. Also missing `\'. ++ ++ * reload1.c (count_occurrences): New function. ++ (choose_reload_targets): Don't delete a reload if the same reg ++ is used elsewhere in the current insn. ++ (delete_output_reload): code split out from choose_reload_targets. ++ ++ * c-typeck.c (build_c_cast): Always put on some operator, ++ so the cast is never an lvalue for strict ANSI. ++ ++ * c-typeck.c (initializer_constant_valid_p): Don't depend on ++ distinction between NOP_EXPR and CONVERT_EXPR. ++ ++ * c-convert.c: Fns reordered; new comments. ++ ++ * fold-const.c (fold): If simplifying a NOP_EXPR within a BIT_AND_EXPR, ++ return a NOP_EXPR. ++ New var TYPE holds type of expr. ++ ++ * c-parse.y (expr_no_commas): Split off cast_expr and unary_expr, ++ to reject `sizeof (int) foo'. ++ ++ * toplev.c (main): Treat plain `-' as input filename. ++ ++ * final.c (final): If an insn's output routine returns 0, ++ it means to output the deleted compare insn immediately preceding. ++ ++ * m68k.md (branch insns): Use 0 as 3rd arg for OUTPUT_JUMP ++ rather than explicitly clearing the overflow flag. ++ ++ * tm-i386.h (OUTPUT_JUMP): Really use NO_OV; don't abort. ++ * i386.md (branch insns): Put real data (sometimes 0) in 3rd arg ++ of OUTPUT_JUMP. 0 means preceding test may not be deleted. ++ (lea pattern): Clear the cc's. ++ * output-i386.c (notice_update_cc): various arith insns set the cc's. ++ ++Thu Dec 29 13:22:01 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * stmt.c (expand_decl_init): Do nothing for static decls. ++ ++ * reload.c (find_reloads_address{,_1}): Return 1 iff entire arg ++ was reloaded as a whole, else 0. ++ (find_reload): If find_reloads_address returns 1, don't let that MEM ++ satisfy a `>' or `<' constraint. ++ ++ * m68k.md (cmpmb): Delete special pattern, make cmpqi handle it. ++ The special pattern couldn't handle reloading the incremented register. ++ ++ * integrate.c (copy_rtx_and_substitute): Test BYTES_BIG_ENDIAN, ++ not BITS... ++ ++ * combine.c (subst): Consider big-endian correction ++ when simplifying (subreg (mem ...) ...). ++ ++ * reload.c (find_reloads): Don't crash if matching operands in `asm' ++ are both read or both write. ++ ++ * expr.c (emit_push_insn): Address for movstr must be XINNER, not X. ++ ++ * toplev.c (main): Typo parsing `-fno...'. ++ ++Wed Dec 28 13:07:21 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * toplev.c (rest_of_compilation): `volatile' fns need jump_optimize ++ for warnings, as if -Wreturn-type. ++ * c-typeck.c (c_expand_return): Warn about `return' in a `volatile' fn. ++ * c-decl.c (finish_function): Warn if `volatile' fn can drop thru end. ++ ++ * cse.c (canon_reg): Handle nulls as subexpressions. ++ (fold_rtx, canon_hash, mention_regs, exp_equiv_p): Likewise. ++ * loop.c (invariant_p, replace_regs, replace_call_address, may_trap_p, ++ {basic,general}_induction_var): Likewise. ++ ++ * expr.c (expand_call): Handle `const' functions: ++ Local IS_CONST is 1 if function is const. ++ Attach REG_RETVAL and REG_LIBCALL notes around the call. ++ Copy fn address to register outside of those notes. ++ Likewise precompute all parms outside them. ++ ++ * expr.c (expand_call): If fn is volatile, emit barrier after the call. ++ ++ * c-decl.c (grokdeclarator): Allow function declared const or volatile. ++ ++Sat Dec 24 18:40:12 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * integrate.c (function_cannot_inline_p): If STRUCT_VALUE_INCOMING ++ or STRUCT_VALUE is defined, can't inline functions returning BLKmode. ++ ++Fri Dec 23 13:26:26 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * expr.c (store_constructor): Compute array's size ++ with int_size_in_bytes. ++ ++ * varasm.c (assemble_variable): If shared data, go to data section ++ before outputting an uninitialized symbol. ++ ++ * tm-sequent.h (ASM_OUTPUT_ALIGN_CODE): Missing backslash. ++ (SHARED_SECTION_ASM_OP): Macro defined. ++ * tm-seq386.h (SHARED_SECTION_ASM_OP): Macro defined. ++ ++ * c-typeck.c (c_expand_asm_operands): Warn if output op is `const'. ++ ++ * Fix problem where a stmt expr in an initialization ++ refers to the variable it is initializing. ++ * stmt.c (expand_decl_init): New fn split out from `expand_decl'. ++ * c-decl.c (finish_decl): Call that. ++ Don't call expand_decl if already done. ++ (start_decl): Call expand_decl if type is complete already. ++ ++ * Makefile (install): Typo in ranlib command. ++ ++Thu Dec 22 15:57:12 1988 Richard Stallman (rms at sugar-bombs.ai.mit.edu) ++ ++ * tree.h (tree_identifier): New field. ++ (IDENTIFIER_ERROR_LOCUS): Accessor for it. ++ * c-parse.y (primary => IDENTIFIER): ++ Undeclared variable gets one err msg per function it appears in. ++ ++ * ns32k.md (andsi3): Delete extra brace. ++ ++ * alliant.md, xm-alliant.h, tm-alliant.h, output-alliant.c: New files. ++ ++ * combine.c (SUBST, SUBST_INT): Store new field `is_int'. ++ (copy_substitutions): Don't copy an int as an rtx. ++ ++ * Makefile (INSTALL): Install gcc.1 properly. ++ ++ * tm-ns32k.h (FUNCTION_PROLOGUE, ASM_OUTPUT_ALIGN_CODE): ++ Add missing backslashes. ++ ++See file OChangeLog. +diff -Naur alliance-5.0/genview/src/gcc-1.42/combine.c alliance/genview/src/gcc-1.42/combine.c +--- alliance-5.0/genview/src/gcc-1.42/combine.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/combine.c 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,2827 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Optimize by combining instructions for GNU compiler. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* This module is essentially the "combiner" phase of the U. of Arizona ++ Portable Optimizer, but redone to work on our list-structured ++ representation for RTL instead of their string representation. ++ ++ The LOG_LINKS of each insn identify the most recent assignment ++ to each REG used in the insn. It is a list of previous insns, ++ each of which contains a SET for a REG that is used in this insn ++ and not used or set in between. LOG_LINKs never cross basic blocks. ++ They were set up by the preceding pass (lifetime analysis). ++ ++ We try to combine each pair of insns joined by a logical link. ++ We also try to combine triples of insns A, B and C when ++ C has a link back to B and B has a link back to A. ++ ++ LOG_LINKS does not have links for use of the CC0. They don't ++ need to, because the insn that sets the CC0 is always immediately ++ before the insn that tests it. So we always regard a branch ++ insn as having a logical link to the preceding insn. ++ ++ We check (with use_crosses_set_p) to avoid combining in such a way ++ as to move a computation to a place where its value would be different. ++ ++ Combination is done by mathematically substituting the previous ++ insn(s) values for the regs they set into the expressions in ++ the later insns that refer to these regs. If the result is a valid insn ++ for our target machine, according to the machine description, ++ we install it, delete the earlier insns, and update the data flow ++ information (LOG_LINKS and REG_NOTES) for what we did. ++ ++ To simplify substitution, we combine only when the earlier insn(s) ++ consist of only a single assignment. To simplify updating afterward, ++ we never combine when a subroutine call appears in the middle. ++ ++ Since we do not represent assignments to CC0 explicitly except when that ++ is all an insn does, there is no LOG_LINKS entry in an insn that uses ++ the condition code for the insn that set the condition code. ++ Fortunately, these two insns must be consecutive. ++ Therefore, every JUMP_INSN is taken to have an implicit logical link ++ to the preceding insn. This is not quite right, since non-jumps can ++ also use the condition code; but in practice such insns would not ++ combine anyway. */ ++ ++#include ++ ++#include "config.h" ++#include "rtl.h" ++#include "flags.h" ++#include "regs.h" ++#include "basic-block.h" ++#include "insn-config.h" ++#include "recog.h" ++ ++#define max(A,B) ((A) > (B) ? (A) : (B)) ++#define min(A,B) ((A) < (B) ? (A) : (B)) ++ ++/* It is not safe to use ordinary gen_lowpart in combine. ++ Use gen_lowpart_for_combine instead. See comments there. */ ++#define gen_lowpart dont_use_gen_lowpart_you_dummy ++ ++/* Number of attempts to combine instructions in this function. */ ++ ++static int combine_attempts; ++static int distrib_attempts; ++ ++/* Number of attempts that got as far as substitution in this function. */ ++ ++static int combine_merges; ++static int distrib_merges_1, distrib_merges_2; ++ ++/* Number of instructions combined with added SETs in this function. */ ++ ++static int combine_extras; ++ ++/* Number of instructions combined in this function. */ ++ ++static int combine_successes; ++static int distrib_successes; ++ ++/* Totals over entire compilation. */ ++ ++static int total_attempts, total_merges, total_extras, total_successes; ++static int total_distrib_attempts, total_distrib_merges_1, total_distrib_merges_2, total_distrib_successes; ++ ++ ++/* Vector mapping INSN_UIDs to cuids. ++ The cuids are like uids but increase monononically always. ++ Combine always uses cuids so that it can compare them. ++ But actually renumbering the uids, which we used to do, ++ proves to be a bad idea because it makes it hard to compare ++ the dumps produced by earlier passes with those from later passes. */ ++ ++static int *uid_cuid; ++ ++/* Get the cuid of an insn. */ ++ ++#define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)]) ++ ++ ++/* Record last point of death of (hard or pseudo) register n. */ ++ ++static rtx *reg_last_death; ++ ++/* Record last point of modification of (hard or pseudo) register n. */ ++ ++static rtx *reg_last_set; ++ ++/* Record the cuid of the last insn that invalidated memory ++ (anything that writes memory, and subroutine calls). */ ++ ++static int mem_last_set; ++ ++/* Record the cuid of the last CALL_INSN ++ so we can tell whether a potential combination crosses any calls. */ ++ ++static int last_call_cuid; ++ ++/* When `subst' is called, this is the insn that is being modified ++ (by combining in a previous insn). The PATTERN of this insn ++ is still the old pattern partially modified and it should not be ++ looked at, but this may be used to examine the successors of the insn ++ to judge whether a simplification is valid. */ ++ ++static rtx subst_insn; ++ ++/* Record one modification to rtl structure ++ to be undone by storing old_contents into *where. ++ is_int is 1 if the contents are an int. */ ++ ++struct undo ++{ ++ rtx *where; ++ rtx old_contents; ++ int is_int; ++}; ++ ++struct undo_int ++{ ++ int *where; ++ int old_contents; ++ int is_int; ++}; ++ ++/* Record a bunch of changes to be undone, up to MAX_UNDO of them. ++ num_undo says how many are currently recorded. ++ storage is nonzero if we must undo the allocation of new storage. ++ The value of storage is what to pass to obfree. */ ++ ++#define MAX_UNDO 10 ++ ++struct undobuf ++{ ++ int num_undo; ++ char *storage; ++ struct undo undo[MAX_UNDO]; ++}; ++ ++static struct undobuf undobuf; ++ ++/* Number of times the pseudo being substituted for ++ was found and replaced. */ ++ ++static int n_occurrences; ++ ++static void move_deaths (); ++static void move_deaths_2 (); ++void remove_death (); ++static void record_dead_and_set_regs (); ++int regno_dead_p (); ++static int use_crosses_set_p (); ++static int try_combine (); ++static rtx try_distrib (); ++static rtx subst (); ++static void undo_all (); ++static void copy_substitutions (); ++static void add_links (); ++static void remove_links (); ++static void add_incs (); ++static int adjacent_insns_p (); ++static int check_asm_operands (); ++static rtx simplify_and_const_int (); ++static rtx gen_lowpart_for_combine (); ++static void simplify_set_cc0_and (); ++ ++/* Main entry point for combiner. F is the first insn of the function. ++ NREGS is the first unused pseudo-reg number. */ ++ ++void ++combine_instructions (f, nregs) ++ rtx f; ++ int nregs; ++{ ++ register rtx insn; ++ register int i; ++ register rtx links, nextlinks; ++ rtx prev; ++ ++ combine_attempts = 0; ++ combine_merges = 0; ++ combine_extras = 0; ++ combine_successes = 0; ++ distrib_attempts = 0; ++ distrib_merges_1 = 0; ++ distrib_merges_2 = 0; ++ distrib_successes = 0; ++ ++ reg_last_death = (rtx *) alloca (nregs * sizeof (rtx)); ++ reg_last_set = (rtx *) alloca (nregs * sizeof (rtx)); ++ bzero (reg_last_death, nregs * sizeof (rtx)); ++ bzero (reg_last_set, nregs * sizeof (rtx)); ++ ++ init_recog (); ++ ++ /* Compute maximum uid value so uid_cuid can be allocated. */ ++ ++ for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ++ if (INSN_UID (insn) > i) ++ i = INSN_UID (insn); ++ ++ uid_cuid = (int *) alloca ((i + 1) * sizeof (int)); ++ ++ /* Compute the mapping from uids to cuids. ++ Cuids are numbers assigned to insns, like uids, ++ except that cuids increase monotonically through the code. */ ++ ++ for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ++ INSN_CUID (insn) = ++i; ++ ++ /* Now scan all the insns in forward order. */ ++ ++ last_call_cuid = 0; ++ mem_last_set = 0; ++ prev = 0; ++ ++ for (insn = f; insn; insn = NEXT_INSN (insn)) ++ { ++ if (GET_CODE (insn) == INSN ++ || GET_CODE (insn) == CALL_INSN ++ || GET_CODE (insn) == JUMP_INSN) ++ { ++ retry: ++ /* Try this insn with each insn it links back to. */ ++ ++ for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) ++ if (try_combine (insn, XEXP (links, 0), 0)) ++ goto retry; ++ ++ /* Try each sequence of three linked insns ending with this one. */ ++ ++ for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) ++ if (GET_CODE (XEXP (links, 0)) != NOTE) ++ for (nextlinks = LOG_LINKS (XEXP (links, 0)); nextlinks; ++ nextlinks = XEXP (nextlinks, 1)) ++ if (try_combine (insn, XEXP (links, 0), XEXP (nextlinks, 0))) ++ goto retry; ++ ++ /* Try to combine a jump insn that uses CC0 ++ with a preceding insn that sets CC0, and maybe with its ++ logical predecessor as well. ++ This is how we make decrement-and-branch insns. ++ We need this special code because data flow connections ++ via CC0 do not get entered in LOG_LINKS. */ ++ ++ if (GET_CODE (insn) == JUMP_INSN ++ && prev != 0 ++ && GET_CODE (prev) == INSN ++ && GET_CODE (PATTERN (prev)) == SET ++ && GET_CODE (SET_DEST (PATTERN (prev))) == CC0) ++ { ++ if (try_combine (insn, prev, 0)) ++ goto retry; ++ ++ if (GET_CODE (prev) != NOTE) ++ for (nextlinks = LOG_LINKS (prev); nextlinks; ++ nextlinks = XEXP (nextlinks, 1)) ++ if (try_combine (insn, prev, XEXP (nextlinks, 0))) ++ goto retry; ++ } ++ ++ /* Try to apply the distributive law to this insn ++ and two insns that compute the operands of this one. */ ++ for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) ++ if (GET_CODE (XEXP (links, 0)) != NOTE) ++ for (nextlinks = XEXP (links, 1); nextlinks; nextlinks = XEXP (nextlinks, 1)) ++ if (GET_CODE (XEXP (nextlinks, 0)) != NOTE) ++ { ++ rtx try_from = 0; ++ ++ if (GET_CODE (PATTERN (XEXP (links, 0))) == SET ++ && find_reg_note (insn, REG_DEAD, SET_DEST (PATTERN (XEXP (links, 0)))) ++ && GET_CODE (PATTERN (XEXP (nextlinks, 0))) == SET ++ && find_reg_note (insn, REG_DEAD, SET_DEST (PATTERN (XEXP (nextlinks, 0))))) ++ try_from = try_distrib (insn, XEXP (links, 0), XEXP (nextlinks, 0)); ++ if (try_from != 0) ++ { ++ insn = try_from; ++ goto retry; ++ } ++ } ++#if 0 ++/* Turned off because on 68020 it takes four insns to make ++ something like (a[b / 32] & (1 << (31 - (b % 32)))) != 0 ++ that could actually be optimized, and that's an unlikely piece of code. */ ++ /* If an insn gets or sets a bit field, try combining it ++ with two different insns whose results it uses. */ ++ if (GET_CODE (insn) == INSN ++ && GET_CODE (PATTERN (insn)) == SET ++ && (GET_CODE (SET_DEST (PATTERN (insn))) == ZERO_EXTRACT ++ || GET_CODE (SET_DEST (PATTERN (insn))) == SIGN_EXTRACT ++ || GET_CODE (SET_SRC (PATTERN (insn))) == ZERO_EXTRACT ++ || GET_CODE (SET_SRC (PATTERN (insn))) == SIGN_EXTRACT)) ++ { ++ for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) ++ if (GET_CODE (XEXP (links, 0)) != NOTE) ++ for (nextlinks = XEXP (links, 1); nextlinks; ++ nextlinks = XEXP (nextlinks, 1)) ++ if (try_combine (insn, XEXP (links, 0), XEXP (nextlinks, 0))) ++ goto retry; ++ } ++#endif ++ if (GET_CODE (insn) != NOTE) ++ record_dead_and_set_regs (insn); ++ prev = insn; ++ } ++ else if (GET_CODE (insn) != NOTE) ++ prev = 0; ++ } ++ total_attempts += combine_attempts; ++ total_merges += combine_merges; ++ total_extras += combine_extras; ++ total_successes += combine_successes; ++} ++ ++/* Try to combine the insns I1 and I2 into I3. ++ Here I1 appears earlier than I2, which is earlier than I3. ++ I1 can be zero; then we combine just I2 into I3. ++ ++ Return 1 if successful; if that happens, I1 and I2 are pseudo-deleted ++ by turning them into NOTEs, and I3 is modified. ++ Return 0 if the combination does not work. Then nothing is changed. */ ++ ++static int ++try_combine (i3, i2, i1) ++ register rtx i3, i2, i1; ++{ ++ register rtx newpat; ++ int added_sets_1 = 0; ++ int added_sets_2 = 0; ++ int total_sets; ++ int i2_is_used; ++ register rtx link; ++ int insn_code_number; ++ rtx i2dest, i2src; ++ rtx i1dest, i1src; ++ int maxreg; ++ rtx temp; ++ int i; ++ ++ combine_attempts++; ++ ++ /* Don't combine with something already used up by combination. */ ++ ++ if (GET_CODE (i2) == NOTE ++ || (i1 && GET_CODE (i1) == NOTE)) ++ return 0; ++ ++ /* Don't combine across a CALL_INSN, because that would possibly ++ change whether the life span of some REGs crosses calls or not, ++ and it is a pain to update that information. */ ++ ++ if (INSN_CUID (i2) < last_call_cuid ++ || (i1 && INSN_CUID (i1) < last_call_cuid)) ++ return 0; ++ ++ /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0. ++ That REG must be either set or dead by the final instruction ++ (so that we can safely forget about setting it). ++ Also test use_crosses_set_p to make sure that the value ++ that is to be substituted for the register ++ does not use any registers whose values alter in between. ++ Do not try combining with moves from one register to another ++ since it is better to let them be tied by register allocation. ++ (There is a switch to permit such combination; except the insns ++ that copy a function value into another register are never combined ++ because moving that too far away from the function call could cause ++ something else to be stored in that register in the interim.) ++ ++ A set of a SUBREG is considered as if it were a set from ++ SUBREG. Thus, (SET (SUBREG:X (REG:Y...)) (something:X...)) ++ is handled by substituting (SUBREG:Y (something:X...)) for (REG:Y...). */ ++ ++ if (GET_CODE (PATTERN (i2)) != SET) ++ return 0; ++ i2dest = SET_DEST (PATTERN (i2)); ++ i2src = SET_SRC (PATTERN (i2)); ++ if (GET_CODE (i2dest) == SUBREG) ++ { ++ i2dest = SUBREG_REG (i2dest); ++ i2src = gen_rtx (SUBREG, GET_MODE (i2dest), i2src, 0); ++ } ++ /* Don't eliminate a store in the stack pointer. */ ++ if (i2dest == stack_pointer_rtx) ++ return 0; ++ /* Don't install a subreg involving two modes not tieable. ++ It can worsen register allocation, and can even make invalid reload insns, ++ since the reg inside may need to be copied from in the outside mode, ++ and that may be invalid if it is an fp reg copied in integer mode. */ ++ if (GET_CODE (i2src) == SUBREG ++ && ! MODES_TIEABLE_P (GET_MODE (i2src), GET_MODE (SUBREG_REG (i2src)))) ++ return 0; ++ if (GET_CODE (i2dest) != CC0 ++ && (GET_CODE (i2dest) != REG ++ || (GET_CODE (i2src) == REG ++ /* Do allow the combination of y = x; x = y; (with x dead) ++ because the result will turn into nothing. */ ++ && !(GET_CODE (PATTERN (i3)) == SET ++ && i2src == SET_DEST (PATTERN (i3))) ++ && (!flag_combine_regs ++ /* Don't substitute a function value reg for any other. */ ++ || FUNCTION_VALUE_REGNO_P (REGNO (i2src)))) ++ || GET_CODE (i2src) == CALL ++ /* Don't substitute into an incremented register. */ ++ || find_reg_note (i3, REG_INC, i2dest) ++ || use_crosses_set_p (i2src, INSN_CUID (i2)))) ++ return 0; ++ if (GET_CODE (i2src) == ASM_OPERANDS && MEM_VOLATILE_P (i2src)) ++ return 0; ++ /* Don't substitute for a register intended as a clobberable operand. */ ++ if (GET_CODE (PATTERN (i3)) == PARALLEL) ++ for (i = 0; i < XVECLEN (PATTERN (i3), 0); i++) ++ if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER ++ && XEXP (XVECEXP (PATTERN (i3), 0, i), 0) == i2dest) ++ return 0; ++ ++ if (i1 != 0) ++ { ++ if (GET_CODE (PATTERN (i1)) != SET) ++ return 0; ++ i1dest = SET_DEST (PATTERN (i1)); ++ i1src = SET_SRC (PATTERN (i1)); ++ if (GET_CODE (i1dest) == SUBREG) ++ { ++ i1dest = SUBREG_REG (i1dest); ++ i1src = gen_rtx (SUBREG, GET_MODE (i1dest), i1src, 0); ++ } ++ if (i1dest == stack_pointer_rtx) ++ return 0; ++ if (GET_CODE (i1src) == SUBREG ++ && ! MODES_TIEABLE_P (GET_MODE (i1src), ++ GET_MODE (SUBREG_REG (i1src)))) ++ return 0; ++ if (GET_CODE (i1dest) != CC0 ++ && (GET_CODE (i1dest) != REG ++ || (GET_CODE (i1src) == REG ++ && (!flag_combine_regs ++ || FUNCTION_VALUE_REGNO_P (REGNO (i1src)))) ++ || GET_CODE (i1src) == CALL ++ || find_reg_note (i3, REG_INC, i1dest) ++ || find_reg_note (i2, REG_INC, i1dest) ++ || use_crosses_set_p (i1src, INSN_CUID (i1)))) ++ return 0; ++ if (GET_CODE (i1src) == ASM_OPERANDS && MEM_VOLATILE_P (i1src)) ++ return 0; ++ /* Don't substitute for a register intended as a clobberable operand. */ ++ if (GET_CODE (PATTERN (i3)) == PARALLEL) ++ for (i = 0; i < XVECLEN (PATTERN (i3), 0); i++) ++ if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER ++ && XEXP (XVECEXP (PATTERN (i3), 0, i), 0) == i1dest) ++ return 0; ++ } ++ ++ /* If it is better that two different modes keep two different pseudos, ++ avoid combining them. */ ++ if (GET_CODE (PATTERN (i3)) == SET) ++ { ++ rtx i3dest = SET_DEST (PATTERN (i3)); ++ while (GET_CODE (i3dest) == SUBREG ++ || GET_CODE (i3dest) == STRICT_LOW_PART ++ || GET_CODE (i3dest) == SIGN_EXTRACT ++ || GET_CODE (i3dest) == ZERO_EXTRACT) ++ i3dest = SUBREG_REG (i3dest); ++ ++ if (SET_SRC (PATTERN (i3)) == i2dest ++ && GET_CODE (i3dest) == REG ++ && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (i3dest))) ++ return 0; ++ } ++ ++ /* If I2 contains anything volatile, reject, unless nothing ++ volatile comes between it and I3. */ ++ if (volatile_refs_p (PATTERN (i2))) ++ { ++ rtx insn; ++ for (insn = NEXT_INSN (i2); insn != i3; insn = NEXT_INSN (insn)) ++ if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN ++ || GET_CODE (insn) == JUMP_INSN) ++ if (volatile_refs_p (PATTERN (insn))) ++ return 0; ++ } ++ /* Likewise for I1; nothing volatile can come between it and I3, ++ except optionally I2. */ ++ if (i1 && volatile_refs_p (PATTERN (i1))) ++ { ++ rtx insn; ++ rtx end = (volatile_refs_p (PATTERN (i2)) ? i2 : i3); ++ for (insn = NEXT_INSN (i1); insn != end; insn = NEXT_INSN (insn)) ++ if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN ++ || GET_CODE (insn) == JUMP_INSN) ++ if (volatile_refs_p (PATTERN (insn))) ++ return 0; ++ } ++ ++ /* If I1 or I2 contains an autoincrement or autodecrement, ++ make sure that register is not used between there and I3, ++ and not already used in I3 either. ++ Also insist that I3 not be a jump; if it were one ++ and the incremented register were spilled, we would lose. */ ++ for (link = REG_NOTES (i2); link; link = XEXP (link, 1)) ++ if (REG_NOTE_KIND (link) == REG_INC ++ && (GET_CODE (i3) == JUMP_INSN ++ || reg_used_between_p (XEXP (link, 0), i2, i3) ++ || reg_mentioned_p (XEXP (link, 0), PATTERN (i3)))) ++ return 0; ++ ++ if (i1) ++ for (link = REG_NOTES (i1); link; link = XEXP (link, 1)) ++ if (REG_NOTE_KIND (link) == REG_INC ++ && (GET_CODE (i3) == JUMP_INSN ++ || reg_used_between_p (XEXP (link, 0), i1, i3) ++ || reg_mentioned_p (XEXP (link, 0), PATTERN (i3)))) ++ return 0; ++ ++ /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd, ++ EXCEPT in one case: I3 has a post-inc in an output operand. */ ++ if (!(GET_CODE (PATTERN (i3)) == SET ++ && GET_CODE (SET_SRC (PATTERN (i3))) == REG ++ && GET_CODE (SET_DEST (PATTERN (i3))) == MEM ++ && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC ++ || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC))) ++ /* It's not the exception. */ ++ for (link = REG_NOTES (i3); link; link = XEXP (link, 1)) ++ if (REG_NOTE_KIND (link) == REG_INC ++ && (reg_mentioned_p (XEXP (link, 0), PATTERN (i2)) ++ || (i1 != 0 ++ && reg_mentioned_p (XEXP (link, 0), PATTERN (i1))))) ++ return 0; ++ ++ /* Make sure that I1DEST is not used between I2 and I3. */ ++ if (i1 && reg_used_between_p (i1dest, i2, i3)) ++ return 0; ++ ++ /* Don't combine an insn I1 or I2 that follows a CC0-setting insn. ++ An insn that uses CC0 must not be separated from the one that sets it. ++ It would be more logical to test whether CC0 occurs inside I1 or I2, ++ but that would be much slower, and this ought to be equivalent. */ ++ temp = PREV_INSN (i2); ++ while (temp && GET_CODE (temp) == NOTE) ++ temp = PREV_INSN (temp); ++ if (temp && GET_CODE (temp) == INSN && sets_cc0_p (PATTERN (temp))) ++ return 0; ++ if (i1) ++ { ++ temp = PREV_INSN (i2); ++ while (temp && GET_CODE (temp) == NOTE) ++ temp = PREV_INSN (temp); ++ if (temp && GET_CODE (temp) == INSN && sets_cc0_p (PATTERN (temp))) ++ return 0; ++ } ++ ++ /* See if the SETs in i1 or i2 need to be kept around in the merged ++ instruction: whenever the value set there is still needed past i3. */ ++ added_sets_2 = (GET_CODE (i2dest) != CC0 ++ && ! dead_or_set_p (i3, i2dest)); ++ if (i1) ++ added_sets_1 = ! (dead_or_set_p (i3, i1dest) ++ || dead_or_set_p (i2, i1dest)); ++ ++ combine_merges++; ++ ++ undobuf.num_undo = 0; ++ undobuf.storage = 0; ++ ++ /* Substitute in the latest insn for the regs set by the earlier ones. */ ++ ++ maxreg = max_reg_num (); ++ ++ subst_insn = i3; ++ n_occurrences = 0; /* `subst' counts here */ ++ ++ newpat = subst (PATTERN (i3), i2dest, i2src); ++ /* Record whether i2's body now appears within i3's body. */ ++ i2_is_used = n_occurrences; ++ ++ if (i1) ++ { ++ n_occurrences = 0; ++ newpat = subst (newpat, i1dest, i1src); ++ } ++ ++ if (GET_CODE (PATTERN (i3)) == SET ++ && SET_DEST (PATTERN (i3)) == cc0_rtx ++ && (GET_CODE (SET_SRC (PATTERN (i3))) == AND ++ || GET_CODE (SET_SRC (PATTERN (i3))) == LSHIFTRT) ++ && next_insn_tests_no_inequality (i3)) ++ simplify_set_cc0_and (i3); ++ ++ if (max_reg_num () != maxreg) ++ abort (); ++ ++ /* If the actions of the earler insns must be kept ++ in addition to substituting them into the latest one, ++ we must make a new PARALLEL for the latest insn ++ to hold additional the SETs. */ ++ ++ if (added_sets_1 || added_sets_2) ++ { ++ combine_extras++; ++ ++ /* Arrange to free later what we allocate now ++ if we don't accept this combination. */ ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ ++ if (GET_CODE (newpat) == PARALLEL) ++ { ++ rtvec old = XVEC (newpat, 0); ++ total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2; ++ newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets)); ++ bcopy (&old->elem[0], &XVECEXP (newpat, 0, 0), ++ sizeof (old->elem[0]) * old->num_elem); ++ } ++ else ++ { ++ rtx old = newpat; ++ total_sets = 1 + added_sets_1 + added_sets_2; ++ newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets)); ++ XVECEXP (newpat, 0, 0) = old; ++ } ++ if (added_sets_1) ++ { ++ XVECEXP (newpat, 0, --total_sets) = PATTERN (i1); ++ } ++ if (added_sets_2) ++ { ++ /* If there is no I1, use I2's body as is. */ ++ if (i1 == 0 ++ /* If I2 was stuck into I3, then anything within it has ++ already had I1 substituted into it when that was done to I3. */ ++ || i2_is_used) ++ { ++ XVECEXP (newpat, 0, --total_sets) = PATTERN (i2); ++ } ++ else ++ XVECEXP (newpat, 0, --total_sets) ++ = subst (PATTERN (i2), i1dest, i1src); ++ } ++ } ++ ++ /* Fail if an autoincrement side-effect has been duplicated. */ ++ if ((i2_is_used > 1 && find_reg_note (i2, REG_INC, 0) != 0) ++ || (i1 != 0 && n_occurrences > 1 && find_reg_note (i1, REG_INC, 0) != 0)) ++ { ++ undo_all (); ++ return 0; ++ } ++ ++ /* Is the result of combination a valid instruction? */ ++ insn_code_number = recog (newpat, i3); ++ ++ if (insn_code_number >= 0 ++ /* Is the result a reasonable ASM_OPERANDS? */ ++ || (check_asm_operands (newpat) && ! added_sets_1 && ! added_sets_2)) ++ { ++ /* Yes. Install it. */ ++ register int regno; ++ INSN_CODE (i3) = insn_code_number; ++ PATTERN (i3) = newpat; ++ /* If anything was substituted more than once, ++ copy it to avoid invalid shared rtl structure. */ ++ copy_substitutions (); ++ /* The data flowing into I2 now flows into I3. ++ But we cannot always move all of I2's LOG_LINKS into I3, ++ since they must go to a setting of a REG from the ++ first use following. If I2 was the first use following a set, ++ I3 is now a use, but it is not the first use ++ if some instruction between I2 and I3 is also a use. ++ Here, for simplicity, we move all the links only if ++ there are no real insns between I2 and I3. ++ Otherwise, we move only links that correspond to regs ++ that used to die in I2. They are always safe to move. */ ++ add_links (i3, i2, adjacent_insns_p (i2, i3)); ++ /* Most REGs that previously died in I2 now die in I3. */ ++ move_deaths (i2src, INSN_CUID (i2), i3); ++ if (GET_CODE (i2dest) == REG) ++ { ++ /* If the reg formerly set in I2 died only once and that was in I3, ++ zero its use count so it won't make `reload' do any work. */ ++ regno = REGNO (i2dest); ++ if (! added_sets_2) ++ { ++ reg_n_sets[regno]--; ++ /* Used to check && regno_dead_p (regno, i3) also here. */ ++ if (reg_n_sets[regno] == 0 ++ && ! (basic_block_live_at_start[0][regno / HOST_BITS_PER_INT] ++ & (1 << (regno % HOST_BITS_PER_INT)))) ++ reg_n_refs[regno] = 0; ++ } ++ /* If a ref to REGNO was substituted into I3 from I2, ++ then it still dies there if it previously did. ++ Otherwise either REGNO never did die in I3 so remove_death is safe ++ or this entire life of REGNO is gone so remove its death. */ ++ if (!added_sets_2 ++ && ! reg_mentioned_p (i2dest, PATTERN (i3))) ++ remove_death (regno, i3); ++ } ++ /* Any registers previously autoincremented in I2 ++ are now incremented in I3. */ ++ add_incs (i3, REG_NOTES (i2)); ++ if (i1) ++ { ++ /* Likewise, merge the info from I1 and get rid of it. */ ++ add_links (i3, i1, ++ adjacent_insns_p (i1, i2) && adjacent_insns_p (i2, i3)); ++ move_deaths (i1src, INSN_CUID (i1), i3); ++ if (GET_CODE (i1dest) == REG) ++ { ++ regno = REGNO (i1dest); ++ if (! added_sets_1) ++ { ++ reg_n_sets[regno]--; ++ /* Used to also check && regno_dead_p (regno, i3) here. */ ++ ++ if (reg_n_sets[regno] == 0 ++ && ! (basic_block_live_at_start[0][regno / HOST_BITS_PER_INT] ++ & (1 << (regno % HOST_BITS_PER_INT)))) ++ ++ reg_n_refs[regno] = 0; ++ } ++ /* If a ref to REGNO was substituted into I3 from I1, ++ then it still dies there if it previously did. ++ Else either REGNO never did die in I3 so remove_death is safe ++ or this entire life of REGNO is gone so remove its death. */ ++ if (! added_sets_1 ++ && ! reg_mentioned_p (i1dest, PATTERN (i3))) ++ remove_death (regno, i3); ++ } ++ add_incs (i3, REG_NOTES (i1)); ++ LOG_LINKS (i1) = 0; ++ PUT_CODE (i1, NOTE); ++ NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (i1) = 0; ++ } ++ /* Get rid of I2. */ ++ LOG_LINKS (i2) = 0; ++ PUT_CODE (i2, NOTE); ++ NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (i2) = 0; ++ ++ combine_successes++; ++ return 1; ++ } ++ ++ /* Failure: change I3 back the way it was. */ ++ undo_all (); ++ ++ return 0; ++} ++ ++/* Undo all the modifications recorded in undobuf. */ ++ ++static void ++undo_all () ++{ ++ register int i; ++ if (undobuf.num_undo > MAX_UNDO) ++ undobuf.num_undo = MAX_UNDO; ++ for (i = undobuf.num_undo - 1; i >= 0; i--) ++ *undobuf.undo[i].where = undobuf.undo[i].old_contents; ++ if (undobuf.storage) ++ obfree (undobuf.storage); ++ undobuf.num_undo = 0; ++ undobuf.storage = 0; ++} ++ ++/* If this insn had more than one substitution, ++ copy all but one, so that no invalid shared substructure is introduced. */ ++ ++static void ++copy_substitutions () ++{ ++ register int i; ++ if (undobuf.num_undo > 1) ++ { ++ for (i = undobuf.num_undo - 1; i >= 1; i--) ++ if (! undobuf.undo[i].is_int) ++ *undobuf.undo[i].where = copy_rtx (*undobuf.undo[i].where); ++ } ++} ++ ++/* Throughout X, replace FROM with TO, and return the result. ++ The result is TO if X is FROM; ++ otherwise the result is X, but its contents may have been modified. ++ If they were modified, a record was made in undobuf so that ++ undo_all will (among other things) return X to its original state. ++ ++ If the number of changes necessary is too much to record to undo, ++ the excess changes are not made, so the result is invalid. ++ The changes already made can still be undone. ++ undobuf.num_undo is incremented for such changes, so by testing that ++ the caller can tell whether the result is valid. ++ ++ `n_occurrences' is incremented each time FROM is replaced. */ ++ ++static rtx ++subst (x, from, to) ++ register rtx x, from, to; ++{ ++ register char *fmt; ++ register int len, i; ++ register enum rtx_code code; ++ char was_replaced[2]; ++ ++#define SUBST(INTO, NEWVAL) \ ++ do { if (undobuf.num_undo < MAX_UNDO) \ ++ { \ ++ undobuf.undo[undobuf.num_undo].where = &INTO; \ ++ undobuf.undo[undobuf.num_undo].old_contents = INTO; \ ++ undobuf.undo[undobuf.num_undo].is_int = 0; \ ++ INTO = NEWVAL; \ ++ } \ ++ undobuf.num_undo++; } while (0) ++ ++#define SUBST_INT(INTO, NEWVAL) \ ++ do { if (undobuf.num_undo < MAX_UNDO) \ ++ { \ ++ struct undo_int *u = (struct undo_int *)&undobuf.undo[undobuf.num_undo];\ ++ u->where = &INTO; \ ++ u->old_contents = INTO; \ ++ u->is_int = 1; \ ++ INTO = NEWVAL; \ ++ } \ ++ undobuf.num_undo++; } while (0) ++ ++/* FAKE_EXTEND_SAFE_P (MODE, FROM) is 1 if (subreg:MODE FROM 0) is a safe ++ replacement for (zero_extend:MODE FROM) or (sign_extend:MODE FROM). ++ If it is 0, that cannot be done. We can now do this for any MEM ++ because (SUBREG (MEM...)) is guaranteed to cause the MEM to be reloaded. ++ If not for that, MEM's would very rarely be safe. */ ++ ++/* Reject MODEs bigger than a word, because we might not be able ++ to reference a two-register group starting with an arbitrary register ++ (and currently gen_lowpart might crash for a SUBREG). */ ++ ++#define FAKE_EXTEND_SAFE_P(MODE, FROM) \ ++ (GET_MODE_SIZE (MODE) <= UNITS_PER_WORD \ ++ && (GET_CODE (FROM) == REG || GET_CODE (FROM) == SUBREG \ ++ || GET_CODE (FROM) == MEM)) ++ ++ if (x == from) ++ return to; ++ ++ /* It is possible to have a subexpression appear twice in the insn. ++ Suppose that FROM is a register that appears within TO. ++ Then, after that subexpression has been scanned once by `subst', ++ the second time it is scanned, TO may be found. If we were ++ to scan TO here, we would find FROM within it and create a ++ self-referent rtl structure which is completely wrong. */ ++ if (x == to) ++ return to; ++ ++ code = GET_CODE (x); ++ ++ /* A little bit of algebraic simplification here. */ ++ switch (code) ++ { ++ /* This case has no effect except to speed things up. */ ++ case REG: ++ case CONST_INT: ++ case CONST: ++ case SYMBOL_REF: ++ case LABEL_REF: ++ case PC: ++ case CC0: ++ return x; ++ } ++ ++ was_replaced[0] = 0; ++ was_replaced[1] = 0; ++ ++ len = GET_RTX_LENGTH (code); ++ fmt = GET_RTX_FORMAT (code); ++ ++ /* Don't replace FROM where it is being stored in rather than used. */ ++ if (code == SET && SET_DEST (x) == from) ++ fmt = "ie"; ++ if (code == SET && GET_CODE (SET_DEST (x)) == SUBREG ++ && SUBREG_REG (SET_DEST (x)) == from) ++ fmt = "ie"; ++ ++ for (i = 0; i < len; i++) ++ { ++ if (fmt[i] == 'E') ++ { ++ register int j; ++ for (j = XVECLEN (x, i) - 1; j >= 0; j--) ++ { ++ register rtx new; ++ if (XVECEXP (x, i, j) == from) ++ new = to, n_occurrences++; ++ else ++ new = subst (XVECEXP (x, i, j), from, to); ++ if (new != XVECEXP (x, i, j)) ++ SUBST (XVECEXP (x, i, j), new); ++ } ++ } ++ else if (fmt[i] == 'e') ++ { ++ register rtx new; ++ ++ if (XEXP (x, i) == from) ++ { ++ new = to; ++ n_occurrences++; ++ if (i < 2) ++ was_replaced[i] = 1; ++ } ++ else ++ new = subst (XEXP (x, i), from, to); ++ ++ if (new != XEXP (x, i)) ++ SUBST (XEXP (x, i), new); ++ } ++ } ++ ++ /* A little bit of algebraic simplification here. */ ++ switch (code) ++ { ++ case SUBREG: ++ /* Changing mode twice with SUBREG => just change it once, ++ or not at all if changing back to starting mode. */ ++ if (SUBREG_REG (x) == to ++ && GET_CODE (to) == SUBREG) ++ { ++ if (GET_MODE (x) == GET_MODE (SUBREG_REG (to))) ++ if (SUBREG_WORD (x) == 0 && SUBREG_WORD (to) == 0) ++ return SUBREG_REG (to); ++ SUBST (SUBREG_REG (x), SUBREG_REG (to)); ++ if (SUBREG_WORD (to) != 0) ++ SUBST_INT (SUBREG_WORD (x), SUBREG_WORD (x) + SUBREG_WORD (to)); ++ } ++ if (SUBREG_REG (x) == to ++ && (GET_CODE (to) == SIGN_EXTEND || GET_CODE (to) == ZERO_EXTEND) ++ && subreg_lowpart_p (x)) ++ { ++ /* (subreg (sign_extend X)) is X, if it has same mode as X. */ ++ if (GET_MODE (x) == GET_MODE (XEXP (to, 0))) ++ return XEXP (to, 0); ++ /* (subreg (sign_extend X)), if it has a mode wider than X, ++ can be done with (sign_extend X). */ ++ if (GET_MODE_SIZE (GET_MODE (x)) > GET_MODE_SIZE (GET_MODE (XEXP (to, 0)))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (GET_CODE (to), GET_MODE (x), XEXP (to, 0)); ++ } ++ /* Extend and then truncate smaller than it was to start with: ++ no need to extend. */ ++ if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (GET_MODE (XEXP (to, 0)))) ++ { ++ SUBST (XEXP (x, 0), XEXP (to, 0)); ++ } ++ } ++ /* (subreg:A (mem:B X) N) becomes a modified MEM. ++ If we can't do that safely, then it becomes something nonsensical ++ so that this combination won't take place. ++ This avoids producing any (subreg (mem))s except in the special ++ paradoxical case where gen_lowpart_for_combine makes them. */ ++ if (SUBREG_REG (x) == to ++ && GET_CODE (to) == MEM) ++ { ++ int endian_offset = 0; ++ /* Don't combine this if mode A is wider than B. */ ++ if (GET_MODE_SIZE (GET_MODE (x)) > GET_MODE_SIZE (GET_MODE (to))) ++ return gen_rtx (CLOBBER, VOIDmode, const0_rtx); ++ /* Don't change the mode of the MEM ++ if that would change the meaning of the address. */ ++ if (mode_dependent_address_p (XEXP (to, 0))) ++ return gen_rtx (CLOBBER, VOIDmode, const0_rtx); ++#ifdef BYTES_BIG_ENDIAN ++ if (GET_MODE_SIZE (GET_MODE (x)) < UNITS_PER_WORD) ++ endian_offset += UNITS_PER_WORD - GET_MODE_SIZE (GET_MODE (x)); ++ if (GET_MODE_SIZE (GET_MODE (to)) < UNITS_PER_WORD) ++ endian_offset -= UNITS_PER_WORD - GET_MODE_SIZE (GET_MODE (to)); ++#endif ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ /* Note if the plus_constant doesn't make a valid address ++ then this combination won't be accepted. */ ++ return gen_rtx (MEM, GET_MODE (x), ++ plus_constant (XEXP (to, 0), ++ (SUBREG_WORD (x) * UNITS_PER_WORD ++ + endian_offset))); ++ } ++ break; ++ ++ case NOT: ++ /* (not (minus X 1)) can become (neg X). */ ++ if (was_replaced[0] ++ && ((GET_CODE (to) == PLUS && INTVAL (XEXP (to, 1)) == -1) ++ || (GET_CODE (to) == MINUS && XEXP (to, 1) == const1_rtx))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (NEG, GET_MODE (to), XEXP (to, 0)); ++ } ++ /* Don't let substitution introduce double-negatives. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == code) ++ return XEXP (to, 0); ++ break; ++ ++ case NEG: ++ /* (neg (minus X Y)) can become (minus Y X). */ ++ if (was_replaced[0] && GET_CODE (to) == MINUS) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (MINUS, GET_MODE (to), ++ XEXP (to, 1), XEXP (to, 0)); ++ } ++ /* Don't let substitution introduce double-negatives. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == code) ++ return XEXP (to, 0); ++ break; ++ ++ case FLOAT_TRUNCATE: ++ /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == FLOAT_EXTEND ++ && GET_MODE (XEXP (to, 0)) == GET_MODE (x)) ++ return XEXP (to, 0); ++ break; ++ ++#if 0 ++ case COMPARE: ++ /* -x>0 if 0>x. */ ++ if (GET_CODE (XEXP (x, 0)) == NEG && XEXP (x, 1) == const0_rtx) ++ { ++ SUBST (XEXP (x, 1), XEXP (XEXP (x, 0), 0)); ++ SUBST (XEXP (x, 0), const0_rtx); ++ } ++ if (GET_CODE (XEXP (x, 1)) == NEG && XEXP (x, 0) == const0_rtx) ++ { ++ SUBST (XEXP (x, 0), XEXP (XEXP (x, 1), 0)); ++ SUBST (XEXP (x, 1), const0_rtx); ++ } ++ break; ++#endif ++ ++ case PLUS: ++#if 0 /* Turned off for caution: turn it on after 1.36. */ ++ /* Identify constant sums as such. */ ++ if ((was_replaced[0] || was_replaced[1]) ++ && CONSTANT_P (XEXP (x, 0)) ++ && CONSTANT_P (XEXP (x, 1))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (CONST, GET_MODE (x), x); ++ } ++#endif ++ /* In (plus (ashift )) ++ change the shift to a multiply so we can recognize ++ scaled indexed addresses. */ ++ if ((was_replaced[0] ++ || was_replaced[1]) ++ && GET_CODE (to) == ASHIFT ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && INTVAL (XEXP (to, 1)) < HOST_BITS_PER_INT) ++ { ++ rtx temp; ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ temp = gen_rtx (MULT, GET_MODE (to), ++ XEXP (to, 0), ++ gen_rtx (CONST_INT, VOIDmode, ++ 1 << INTVAL (XEXP (to, 1)))); ++ if (was_replaced[0]) ++ SUBST (XEXP (x, 0), temp); ++ else ++ SUBST (XEXP (x, 1), temp); ++ } ++ /* (plus X (neg Y)) becomes (minus X Y). */ ++ if (GET_CODE (XEXP (x, 1)) == NEG) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (MINUS, GET_MODE (x), ++ XEXP (x, 0), XEXP (XEXP (x, 1), 0)); ++ } ++ /* (plus (neg X) Y) becomes (minus Y X). */ ++ if (GET_CODE (XEXP (x, 0)) == NEG) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (MINUS, GET_MODE (x), ++ XEXP (x, 1), XEXP (XEXP (x, 0), 0)); ++ } ++ /* (plus (plus x c1) c2) => (plus x c1+c2) */ ++ if (GET_CODE (XEXP (x, 1)) == CONST_INT ++ && GET_CODE (XEXP (x, 0)) == PLUS ++ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT) ++ { ++ int sum = (INTVAL (XEXP (x, 1)) ++ + INTVAL (XEXP (XEXP (x, 0), 1))); ++ if (sum == 0) ++ return XEXP (XEXP (x, 0), 0); ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ SUBST (XEXP (x, 1), gen_rtx (CONST_INT, VOIDmode, sum)); ++ SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); ++ break; ++ } ++ /* If we have something (putative index) being added to a sum, ++ associate it so that any constant term is outermost. ++ That's because that's the way indexed addresses are ++ now supposed to appear. */ ++ if (((was_replaced[0] && GET_CODE (XEXP (x, 1)) == PLUS) ++ || (was_replaced[1] && GET_CODE (XEXP (x, 0)) == PLUS)) ++ || ++ ((was_replaced[0] || was_replaced[1]) ++ && GET_CODE (to) == PLUS)) ++ { ++ rtx offset = 0, base, index; ++ if (GET_CODE (to) != PLUS) ++ { ++ index = to; ++ base = was_replaced[0] ? XEXP (x, 1) : XEXP (x, 0); ++ } ++ else ++ { ++ index = was_replaced[0] ? XEXP (x, 1) : XEXP (x, 0); ++ base = to; ++ } ++ if (CONSTANT_ADDRESS_P (XEXP (base, 0))) ++ { ++ offset = XEXP (base, 0); ++ base = XEXP (base, 1); ++ } ++ else if (CONSTANT_ADDRESS_P (XEXP (base, 1))) ++ { ++ offset = XEXP (base, 1); ++ base = XEXP (base, 0); ++ } ++ if (offset != 0) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ if (GET_CODE (offset) == CONST_INT) ++ return plus_constant (gen_rtx (PLUS, GET_MODE (index), ++ base, index), ++ INTVAL (offset)); ++ if (GET_CODE (index) == CONST_INT) ++ return plus_constant (gen_rtx (PLUS, GET_MODE (offset), ++ base, offset), ++ INTVAL (index)); ++ return gen_rtx (PLUS, GET_MODE (index), ++ gen_rtx (PLUS, GET_MODE (index), ++ base, index), ++ offset); ++ } ++ } ++ break; ++ ++ case EQ: ++ case NE: ++ /* If comparing a subreg against zero, discard the subreg. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == SUBREG ++ && SUBREG_WORD (to) == 0 ++ && XEXP (x, 1) == const0_rtx) ++ SUBST (XEXP (x, 0), SUBREG_REG (to)); ++ ++ /* If comparing a ZERO_EXTRACT against zero, ++ canonicalize to a SIGN_EXTRACT, ++ since the two are equivalent here. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == ZERO_EXTRACT ++ && XEXP (x, 1) == const0_rtx) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ SUBST (XEXP (x, 0), ++ gen_rtx (SIGN_EXTRACT, GET_MODE (to), ++ XEXP (to, 0), XEXP (to, 1), ++ XEXP (to, 2))); ++ } ++#ifndef BITS_BIG_ENDIAN ++ /* If we are putting (ASHIFT 1 x) into (EQ (AND ... y) 0), ++ arrange to return (EQ (SIGN_EXTRACT y 1 x) 0), ++ which is what jump-on-bit instructions are written with. */ ++ else if (XEXP (x, 1) == const0_rtx ++ && GET_CODE (XEXP (x, 0)) == AND ++ && (XEXP (XEXP (x, 0), 0) == to ++ || XEXP (XEXP (x, 0), 1) == to) ++ && GET_CODE (to) == ASHIFT ++ && XEXP (to, 0) == const1_rtx) ++ { ++ register rtx y = XEXP (XEXP (x, 0), ++ XEXP (XEXP (x, 0), 0) == to); ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ SUBST (XEXP (x, 0), ++ gen_rtx (SIGN_EXTRACT, GET_MODE (to), ++ y, ++ const1_rtx, XEXP (to, 1))); ++ } ++#endif /* not BITS_BIG_ENDIAN */ ++ /* Negation is a no-op before equality test against zero. */ ++ if (GET_CODE (XEXP (x, 0)) == NEG && XEXP (x, 1) == const0_rtx) ++ { ++ SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); ++ } ++ if (GET_CODE (XEXP (x, 1)) == NEG && XEXP (x, 0) == const0_rtx) ++ { ++ SUBST (XEXP (x, 1), XEXP (XEXP (x, 1), 0)); ++ } ++ break; ++ ++ case ZERO_EXTEND: ++ /* Nested zero-extends are equivalent to just one. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == ZERO_EXTEND) ++ SUBST (XEXP (x, 0), XEXP (to, 0)); ++ /* Zero extending a constant int can be replaced ++ by a zero-extended constant. */ ++ if (was_replaced[0] ++ && HOST_BITS_PER_INT >= GET_MODE_BITSIZE (GET_MODE (from)) ++ && GET_CODE (to) == CONST_INT) ++ { ++ int intval = INTVAL (to) & GET_MODE_MASK (GET_MODE (from)); ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (CONST_INT, VOIDmode, intval); ++ } ++ /* Zero-extending the result of an and with a constant can be done ++ with a wider and. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == AND ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && FAKE_EXTEND_SAFE_P (GET_MODE (x), XEXP (to, 0)) ++ /* Avoid getting wrong result if the constant has high bits set ++ that are irrelevant in the narrow mode where it is being used. */ ++ && 0 == (INTVAL (XEXP (to, 1)) ++ & ~ GET_MODE_MASK (GET_MODE (to)))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (AND, GET_MODE (x), ++ gen_lowpart_for_combine (GET_MODE (x), XEXP (to, 0)), ++ XEXP (to, 1)); ++ } ++ /* Change (zero_extend:M (subreg:N (zero_extract:M ...) 0)) ++ to (zero_extract:M ...) if the field extracted fits in mode N. */ ++ if (GET_CODE (XEXP (x, 0)) == SUBREG ++ && GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTRACT ++ && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT ++ && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)) ++ <= GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))) ++ { ++ return XEXP (XEXP (x, 0), 0); ++ } ++ /* Change (zero_extend:M (subreg:N (and:M ... ) 0)) ++ to (and:M ...) if the significant bits fit in mode N. */ ++ if (GET_CODE (XEXP (x, 0)) == SUBREG ++ && SUBREG_REG (XEXP (x, 0)) == to ++ && SUBREG_WORD (XEXP (x, 0)) == 0 ++ && GET_CODE (to) == AND ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && FAKE_EXTEND_SAFE_P (GET_MODE (x), XEXP (to, 0)) ++ /* Avoid getting wrong result if the constant has high bits set ++ that are irrelevant in the narrow mode where it is being used. */ ++ && 0 == (INTVAL (XEXP (to, 1)) ++ & ~ GET_MODE_MASK (GET_MODE (to)))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (AND, GET_MODE (x), ++ gen_lowpart_for_combine (GET_MODE (x), XEXP (to, 0)), ++ XEXP (to, 1)); ++ } ++ /* In (zero_extend:M (subreg:N (lshiftrt:M REG))), ++ where REG was assigned from (zero_extend:M (any:N ...)), ++ remove the outer zero extension. */ ++ if (GET_CODE (XEXP (x, 0)) == SUBREG ++ && SUBREG_REG (XEXP (x, 0)) == to ++ && SUBREG_WORD (XEXP (x, 0)) == 0 ++ && GET_CODE (to) == LSHIFTRT) ++ { ++ rtx tmp = XEXP (to, 0); ++ ++ /* See if arg of LSHIFTRT is a register whose value we can find. */ ++ if (GET_CODE (tmp) == REG) ++ if (reg_n_sets[REGNO (tmp)] == 1 ++ && reg_last_set[REGNO (tmp)] != 0 ++ && SET_DEST (PATTERN (reg_last_set[REGNO (tmp)])) == tmp) ++ tmp = SET_SRC (PATTERN (reg_last_set[REGNO (tmp)])); ++ else ++ break; ++ ++ if (GET_CODE (tmp) == ZERO_EXTEND ++ && GET_MODE (tmp) == GET_MODE (x) ++ && GET_MODE (XEXP (tmp, 0)) == GET_MODE (XEXP (x, 0))) ++ return SUBREG_REG (XEXP (x, 0)); ++ } ++ break; ++ ++ case SIGN_EXTEND: ++ /* Nested sign-extends are equivalent to just one. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == SIGN_EXTEND) ++ SUBST (XEXP (x, 0), XEXP (to, 0)); ++ /* Sign extending a constant int can be replaced ++ by a sign-extended constant. */ ++ if (was_replaced[0] ++ && HOST_BITS_PER_INT >= GET_MODE_BITSIZE (GET_MODE (from)) ++ && GET_CODE (to) == CONST_INT) ++ { ++ int intval = INTVAL (to); ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ if (intval > 0 ++ && (intval & (1 << (GET_MODE_BITSIZE (GET_MODE (from)) - 1)))) ++ intval |= ~ GET_MODE_MASK (GET_MODE (from)); ++ return gen_rtx (CONST_INT, VOIDmode, intval); ++ } ++ /* Sign-extending the result of an and with a constant can be done ++ with a wider and, provided the high bit of the constant is 0. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == AND ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && FAKE_EXTEND_SAFE_P (GET_MODE (x), XEXP (to, 0)) ++ && ((INTVAL (XEXP (to, 1)) ++ & (-1 << (GET_MODE_BITSIZE (GET_MODE (to)) - 1))) ++ == 0)) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (AND, GET_MODE (x), ++ gen_lowpart_for_combine (GET_MODE (x), XEXP (to, 0)), ++ XEXP (to, 1)); ++ } ++ /* hacks added by tiemann. */ ++ /* Change (sign_extend:M (subreg:N (and:M ... ) 0)) ++ to (and:M ...), provided the result fits in mode N, ++ and the high bit of the constant is 0 in mode N. */ ++ if (GET_CODE (XEXP (x, 0)) == SUBREG ++ && SUBREG_REG (XEXP (x, 0)) == to ++ && SUBREG_WORD (XEXP (x, 0)) == 0 ++ && GET_CODE (to) == AND ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && FAKE_EXTEND_SAFE_P (GET_MODE (x), XEXP (to, 0)) ++ && ((INTVAL (XEXP (to, 1)) ++ & (-1 << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))) ++ == 0)) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (AND, GET_MODE (x), ++ gen_lowpart_for_combine (GET_MODE (x), XEXP (to, 0)), ++ XEXP (to, 1)); ++ } ++ /* In (sign_extend:M (subreg:N (ashiftrt:M REG))), ++ where REG was assigned from (sign_extend:M (any:N ...)), ++ remove the outer sign extension. */ ++ if (GET_CODE (XEXP (x, 0)) == SUBREG ++ && SUBREG_REG (XEXP (x, 0)) == to ++ && SUBREG_WORD (XEXP (x, 0)) == 0 ++ && GET_CODE (to) == ASHIFTRT) ++ { ++ rtx tmp = XEXP (to, 0); ++ ++ /* See if arg of LSHIFTRT is a register whose value we can find. */ ++ if (GET_CODE (tmp) == REG) ++ if (reg_n_sets[REGNO (tmp)] == 1 ++ && reg_last_set[REGNO (tmp)] != 0 ++ && SET_DEST (PATTERN (reg_last_set[REGNO (tmp)])) == tmp) ++ tmp = SET_SRC (PATTERN (reg_last_set[REGNO (tmp)])); ++ else ++ break; ++ ++ if (GET_CODE (tmp) == SIGN_EXTEND ++ && GET_MODE (tmp) == GET_MODE (x) ++ && GET_MODE (XEXP (tmp, 0)) == GET_MODE (XEXP (x, 0))) ++ return SUBREG_REG (XEXP (x, 0)); ++ } ++ break; ++ ++ case SET: ++ /* In (set (zero-extract ) (and <(2**n-1) | anything>)) ++ the `and' can be deleted. This can happen when storing a bit ++ that came from a set-flag insn followed by masking to one bit. */ ++ if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT ++ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ++ && was_replaced[1] ++ && GET_CODE (to) == AND ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && 0 == (((1 << INTVAL (XEXP (XEXP (x, 0), 1))) - 1) ++ & ~ INTVAL (XEXP (to, 1)))) ++ { ++ SUBST (XEXP (x, 1), XEXP (to, 0)); ++ } ++ /* In (set (zero-extract ) ++ (subreg (and <(2**n-1) | anything>))) ++ the `and' can be deleted. */ ++ if (GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT ++ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ++ && GET_CODE (XEXP (x, 1)) == SUBREG ++ && SUBREG_WORD (XEXP (x, 1)) == 0 ++ && GET_CODE (SUBREG_REG (XEXP (x, 1))) == AND ++ && GET_CODE (XEXP (SUBREG_REG (XEXP (x, 1)), 1)) == CONST_INT ++ && 0 == (((1 << INTVAL (XEXP (XEXP (x, 0), 1))) - 1) ++ & ~ INTVAL (XEXP (SUBREG_REG (XEXP (x, 1)), 1)))) ++ { ++ SUBST (SUBREG_REG (XEXP (x, 1)), XEXP (SUBREG_REG (XEXP (x, 1)), 0)); ++ } ++ /* (set (zero_extract ...) (and/or/xor (zero_extract ...) const)), ++ if both zero_extracts have the same location, size and position, ++ can be changed to avoid the byte extracts. */ ++ if ((GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT ++ || GET_CODE (XEXP (x, 0)) == SIGN_EXTRACT) ++ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ++ && (GET_CODE (XEXP (x, 1)) == AND ++ || GET_CODE (XEXP (x, 1)) == IOR ++ || GET_CODE (XEXP (x, 1)) == XOR) ++ && rtx_equal_p (XEXP (x, 0), XEXP (XEXP (x, 1), 0)) ++ && GET_CODE (XEXP (XEXP (x, 1), 0)) == GET_CODE (XEXP (x, 0)) ++ && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT ++ /* zero_extract can apply to a QImode even if the bits extracted ++ don't fit inside that byte. In such a case, we may not do this ++ optimization, since the OR or AND insn really would need ++ to fit in a byte. */ ++ && (INTVAL (XEXP (XEXP (x, 0), 1)) + INTVAL (XEXP (XEXP (x, 0), 2)) ++ < GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0))))) ++ { ++ int shiftcount; ++ int fieldsize; ++ int newmask; ++#ifdef BITS_BIG_ENDIAN ++ shiftcount ++ = GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0))) ++ - INTVAL (XEXP (XEXP (x, 0), 1)) - INTVAL (XEXP (XEXP (x, 0), 2)); ++#else ++ shiftcount ++ = INTVAL (XEXP (XEXP (x, 0), 2)); ++#endif ++ fieldsize = INTVAL (XEXP (XEXP (x, 0), 1)); ++ newmask = ((INTVAL (XEXP (XEXP (x, 1), 1)) << shiftcount) ++ + (GET_CODE (XEXP (x, 1)) == AND ++ /* For AND, preserve the bits outside this field. */ ++ ? ((1 << shiftcount) - 1 ++ + (-1 << (shiftcount + fieldsize))) ++ : 0)); ++ if (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0))) ++ < HOST_BITS_PER_INT) ++ newmask &= (1 << GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (x, 0), 0)))) - 1; ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return ++ gen_rtx (SET, VOIDmode, ++ XEXP (XEXP (x, 0), 0), ++ gen_rtx (GET_CODE (XEXP (x, 1)), ++ GET_MODE (XEXP (XEXP (x, 0), 0)), ++ XEXP (XEXP (XEXP (x, 1), 0), 0), ++ gen_rtx (CONST_INT, VOIDmode, newmask))); ++ } ++ /* Can simplify (set (cc0) (compare (zero/sign_extend FOO) CONST)) ++ to (set (cc0) (compare FOO CONST)) if CONST fits in FOO's mode ++ and we are only testing equality. ++ In fact, this is valid for zero_extend if what follows is an ++ unsigned comparison, and for sign_extend with a signed comparison. */ ++ if (SET_DEST (x) == cc0_rtx ++ && GET_CODE (SET_SRC (x)) == COMPARE ++ && (GET_CODE (XEXP (SET_SRC (x), 0)) == ZERO_EXTEND ++ || GET_CODE (XEXP (SET_SRC (x), 0)) == SIGN_EXTEND) ++ && next_insn_tests_no_inequality (subst_insn) ++ && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT ++ /* This is overly cautious by one bit, but saves worrying about ++ whether it is zero-extension or sign extension. */ ++ && ((unsigned) INTVAL (XEXP (SET_SRC (x), 1)) ++ < (1 << (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (SET_SRC (x), 0), 0))) - 1)))) ++ SUBST (XEXP (SET_SRC (x), 0), XEXP (XEXP (SET_SRC (x), 0), 0)); ++ break; ++ ++ case AND: ++ if (GET_CODE (XEXP (x, 1)) == CONST_INT) ++ { ++ rtx tem = simplify_and_const_int (x, to); ++ if (tem) ++ return tem; ++ } ++ break; ++ ++ case IOR: ++ case XOR: ++ /* (ior (ior x c1) c2) => (ior x c1|c2); likewise for xor. */ ++ if (GET_CODE (XEXP (x, 1)) == CONST_INT ++ && GET_CODE (XEXP (x, 0)) == code ++ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT) ++ { ++ int c0 = INTVAL (XEXP (x, 1)); ++ int c1 = INTVAL (XEXP (XEXP (x, 0), 1)); ++ int combined = (code == IOR ? c0 | c1 : c0 ^ c1); ++ ++ if (combined == 0) ++ return XEXP (XEXP (x, 0), 0); ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ SUBST (XEXP (x, 1), gen_rtx (CONST_INT, VOIDmode, combined)); ++ SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); ++ break; ++ } ++ ++ case FLOAT: ++ /* (float (sign_extend )) = (float ). */ ++ if (was_replaced[0] ++ && GET_CODE (to) == SIGN_EXTEND) ++ SUBST (XEXP (x, 0), XEXP (to, 0)); ++ break; ++ ++ case ZERO_EXTRACT: ++ /* (ZERO_EXTRACT (TRUNCATE x)...) ++ can become (ZERO_EXTRACT x ...). */ ++ if (was_replaced[0] ++ && GET_CODE (to) == TRUNCATE) ++ { ++#ifdef BITS_BIG_ENDIAN ++ if (GET_CODE (XEXP (x, 2)) == CONST_INT) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ /* On a big-endian machine, must increment the bit-number ++ since sign bit is farther away in the pre-truncated value. */ ++ return gen_rtx (ZERO_EXTRACT, GET_MODE (x), ++ XEXP (to, 0), ++ XEXP (x, 1), ++ gen_rtx (CONST_INT, VOIDmode, ++ (INTVAL (XEXP (x, 2)) ++ + GET_MODE_BITSIZE (GET_MODE (XEXP (to, 0))) ++ - GET_MODE_BITSIZE (GET_MODE (to))))); ++ } ++#else ++ SUBST (XEXP (x, 0), XEXP (to, 0)); ++#endif ++ } ++ /* Extracting a single bit from the result of a shift: ++ see which bit it was before the shift and extract that directly. */ ++ if (was_replaced[0] ++ && (GET_CODE (to) == ASHIFTRT || GET_CODE (to) == LSHIFTRT ++ || GET_CODE (to) == ASHIFT || GET_CODE (to) == LSHIFT) ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && XEXP (x, 1) == const1_rtx ++ && GET_CODE (XEXP (x, 2)) == CONST_INT) ++ { ++ int shift = INTVAL (XEXP (to, 1)); ++ int newpos; ++ if (GET_CODE (to) == ASHIFT || GET_CODE (to) == LSHIFT) ++ shift = - shift; ++#ifdef BITS_BIG_ENDIAN ++ shift = - shift; ++#endif ++ newpos = INTVAL (XEXP (x, 2)) + shift; ++ if (newpos >= 0 && ++ newpos < GET_MODE_BITSIZE (GET_MODE (to))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (ZERO_EXTRACT, GET_MODE (x), ++ XEXP (to, 0), const1_rtx, ++ gen_rtx (CONST_INT, VOIDmode, newpos)); ++ } ++ } ++ break; ++ ++ case LSHIFTRT: ++ case ASHIFTRT: ++ case ROTATE: ++ case ROTATERT: ++#ifdef SHIFT_COUNT_TRUNCATED ++ /* (lshift (sign_extend )) = (lshift ) (most machines). ++ True for all kinds of shifts and also for zero_extend. */ ++ if (was_replaced[1] ++ && (GET_CODE (to) == SIGN_EXTEND ++ || GET_CODE (to) == ZERO_EXTEND) ++ && FAKE_EXTEND_SAFE_P (GET_MODE (to), XEXP (to, 0))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ SUBST (XEXP (x, 1), ++ /* This is a perverse SUBREG, wider than its base. */ ++ gen_lowpart_for_combine (GET_MODE (to), XEXP (to, 0))); ++ } ++#endif ++ /* Two shifts in a row of same kind ++ in same direction with constant counts ++ may be combined. */ ++ if (was_replaced[0] ++ && GET_CODE (to) == GET_CODE (x) ++ && GET_CODE (XEXP (x, 1)) == CONST_INT ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && INTVAL (XEXP (to, 1)) > 0 ++ && INTVAL (XEXP (x, 1)) > 0 ++ && (INTVAL (XEXP (x, 1)) + INTVAL (XEXP (to, 1)) ++ < GET_MODE_BITSIZE (GET_MODE (x)))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (GET_CODE (x), GET_MODE (x), ++ XEXP (to, 0), ++ gen_rtx (CONST_INT, VOIDmode, ++ INTVAL (XEXP (x, 1)) ++ + INTVAL (XEXP (to, 1)))); ++ } ++ break; ++ ++ case LSHIFT: ++ case ASHIFT: ++#ifdef SHIFT_COUNT_TRUNCATED ++ /* (lshift (sign_extend )) = (lshift ) (most machines). ++ True for all kinds of shifts and also for zero_extend. */ ++ if (was_replaced[1] ++ && (GET_CODE (to) == SIGN_EXTEND ++ || GET_CODE (to) == ZERO_EXTEND) ++ && FAKE_EXTEND_SAFE_P (GET_MODE (to), XEXP (to, 0))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ SUBST (XEXP (x, 1), ++ /* This is a perverse SUBREG, wider than its base. */ ++ gen_lowpart_for_combine (GET_MODE (to), XEXP (to, 0))); ++ } ++#endif ++ /* (lshift (and (lshiftrt ) ) ) ++ happens copying between bit fields in similar structures. ++ It can be replaced by one and instruction. ++ It does not matter whether the shifts are logical or arithmetic. */ ++ if (GET_CODE (XEXP (x, 0)) == AND ++ && GET_CODE (XEXP (x, 1)) == CONST_INT ++ && INTVAL (XEXP (x, 1)) > 0 ++ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ++ && XEXP (XEXP (x, 0), 0) == to ++ && (GET_CODE (to) == LSHIFTRT ++ || GET_CODE (to) == ASHIFTRT) ++#if 0 ++/* I now believe this restriction is unnecessary. ++ The outer shift will discard those bits in any case, right? */ ++ ++ /* If inner shift is arithmetic, either it shifts left or ++ the bits it shifts the sign into are zeroed by the and. */ ++ && (INTVAL (XEXP (x, 1)) < 0 ++ || ((unsigned) INTVAL (XEXP (XEXP (x, 0), 1)) ++ < 1 << (GET_MODE_BITSIZE (GET_MODE (x)) ++ - INTVAL (XEXP (x, 0))))) ++#endif ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && INTVAL (XEXP (x, 1)) == INTVAL (XEXP (to, 1))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ /* The constant in the new `and' is << ++ but clear out all bits that don't belong in our mode. */ ++ return gen_rtx (AND, GET_MODE (x), XEXP (to, 0), ++ gen_rtx (CONST_INT, VOIDmode, ++ (GET_MODE_MASK (GET_MODE (x)) ++ & ((GET_MODE_MASK (GET_MODE (x)) ++ & INTVAL (XEXP (XEXP (x, 0), 1))) ++ << INTVAL (XEXP (x, 1)))))); ++ } ++ /* Two shifts in a row in same direction with constant counts ++ may be combined. */ ++ if (was_replaced[0] ++ && (GET_CODE (to) == ASHIFT || GET_CODE (to) == LSHIFT) ++ && GET_CODE (XEXP (x, 1)) == CONST_INT ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && INTVAL (XEXP (to, 1)) > 0 ++ && INTVAL (XEXP (x, 1)) > 0 ++ && (INTVAL (XEXP (x, 1)) + INTVAL (XEXP (to, 1)) ++ < GET_MODE_BITSIZE (GET_MODE (x)))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (GET_CODE (x), GET_MODE (x), ++ XEXP (to, 0), ++ gen_rtx (CONST_INT, VOIDmode, ++ INTVAL (XEXP (x, 1)) ++ + INTVAL (XEXP (to, 1)))); ++ } ++ /* (ashift (ashiftrt ) ) ++ (or, on some machines, (ashift (ashift <-X>) ) instead) ++ happens if you divide by 2**N and then multiply by 2**N. ++ It can be replaced by one `and' instruction. ++ It does not matter whether the shifts are logical or arithmetic. */ ++ if (GET_CODE (XEXP (x, 1)) == CONST_INT ++ && INTVAL (XEXP (x, 1)) > 0 ++ && was_replaced[0] ++ && (((GET_CODE (to) == LSHIFTRT || GET_CODE (to) == ASHIFTRT) ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && INTVAL (XEXP (x, 1)) == INTVAL (XEXP (to, 1))) ++ || ++ ((GET_CODE (to) == LSHIFT || GET_CODE (to) == ASHIFT) ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && INTVAL (XEXP (x, 1)) == - INTVAL (XEXP (to, 1))))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ /* The constant in the new `and' is -1 << ++ but clear out all bits that don't belong in our mode. */ ++ return gen_rtx (AND, GET_MODE (x), XEXP (to, 0), ++ gen_rtx (CONST_INT, VOIDmode, ++ (GET_MODE_MASK (GET_MODE (x)) ++ & (GET_MODE_MASK (GET_MODE (x)) ++ << INTVAL (XEXP (x, 1)))))); ++ } ++ ++ } ++ ++ return x; ++} ++ ++/* This is the AND case of the function subst. */ ++ ++static rtx ++simplify_and_const_int (x, to) ++ rtx x, to; ++{ ++ register rtx varop = XEXP (x, 0); ++ register int constop = INTVAL (XEXP (x, 1)); ++ ++ /* (and (subreg (and ) 0) ) ++ results from an andsi followed by an andqi, ++ which happens frequently when storing bit-fields ++ on something whose result comes from an andsi. */ ++ if (GET_CODE (varop) == SUBREG ++ && XEXP (varop, 0) == to ++ && subreg_lowpart_p (varop) ++ && GET_CODE (to) == AND ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ /* Verify that the result of the outer `and' ++ is not affected by any bits not defined in the inner `and'. ++ True if the outer mode is narrower, or if the outer constant ++ masks to zero all the bits that the inner mode doesn't have. */ ++ && (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (GET_MODE (to)) ++ || (constop & ~ GET_MODE_MASK (GET_MODE (to))) == 0)) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (AND, GET_MODE (x), ++ gen_lowpart_for_combine (GET_MODE (x), XEXP (to, 0)), ++ gen_rtx (CONST_INT, VOIDmode, ++ constop ++ /* Remember that the bits outside that mode ++ are not being changed, so the effect ++ is as if they were all 1. */ ++ & INTVAL (XEXP (to, 1)))); ++ } ++ /* (and:SI (zero_extract:SI ...) ) ++ results from an andsi following a byte-fetch on risc machines. ++ When the constant includes all bits extracted, eliminate the `and'. */ ++ if (GET_CODE (varop) == ZERO_EXTRACT ++ && GET_CODE (XEXP (varop, 1)) == CONST_INT ++ /* The `and' must not clear any bits that the extract can give. */ ++ && (~ constop & ((1 << INTVAL (XEXP (varop, 1))) - 1)) == 0) ++ return varop; ++ /* (and (zero_extend ) ) ++ often results from storing in a bit-field something ++ that was calculated as a short. Replace with a single `and' ++ in whose constant all bits not in 's mode are zero. */ ++ if (varop == to ++ && GET_CODE (to) == ZERO_EXTEND ++ && FAKE_EXTEND_SAFE_P (GET_MODE (x), XEXP (to, 0))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (AND, GET_MODE (x), ++ /* This is a perverse SUBREG, wider than its base. */ ++ gen_lowpart_for_combine (GET_MODE (x), XEXP (to, 0)), ++ gen_rtx (CONST_INT, VOIDmode, ++ constop & GET_MODE_MASK (GET_MODE (XEXP (to, 0))))); ++ } ++ /* (and (sign_extend ) ) ++ can be replaced with (and (subreg ) ) ++ if is narrower than 's mode, ++ or with (zero_extend ) if is a mask for that mode. */ ++ if (varop == to ++ && GET_CODE (to) == SIGN_EXTEND ++ && ((unsigned) constop <= GET_MODE_MASK (GET_MODE (XEXP (to, 0)))) ++ && FAKE_EXTEND_SAFE_P (GET_MODE (x), XEXP (to, 0))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ if (constop == GET_MODE_MASK (GET_MODE (XEXP (to, 0)))) ++ return gen_rtx (ZERO_EXTEND, GET_MODE (x), XEXP (to, 0)); ++ return gen_rtx (AND, GET_MODE (x), ++ /* This is a perverse SUBREG, wider than its base. */ ++ gen_lowpart_for_combine (GET_MODE (x), XEXP (to, 0)), ++ XEXP (x, 1)); ++ } ++ /* (and (and ) ) ++ comes from two and instructions in a row. */ ++ if (varop == to ++ && GET_CODE (to) == AND ++ && GET_CODE (XEXP (to, 1)) == CONST_INT) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (AND, GET_MODE (x), ++ XEXP (to, 0), ++ gen_rtx (CONST_INT, VOIDmode, ++ constop ++ & INTVAL (XEXP (to, 1)))); ++ } ++ /* (and (ashiftrt (ashift FOO N) N) CONST) ++ may be simplified to (and FOO CONST) if CONST masks off the bits ++ changed by the two shifts. */ ++ if (GET_CODE (varop) == ASHIFTRT ++ && GET_CODE (XEXP (varop, 1)) == CONST_INT ++ && XEXP (varop, 0) == to ++ && GET_CODE (to) == ASHIFT ++ && GET_CODE (XEXP (to, 1)) == CONST_INT ++ && INTVAL (XEXP (varop, 1)) == INTVAL (XEXP (to, 1)) ++ && ((unsigned) constop >> INTVAL (XEXP (varop, 1))) == 0) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ /* If CONST is a mask for the low byte, ++ change this into a zero-extend instruction ++ from just the low byte of FOO. */ ++ if (constop == GET_MODE_MASK (QImode)) ++ { ++ rtx temp = gen_lowpart_for_combine (QImode, XEXP (to, 0)); ++ if (GET_CODE (temp) != CLOBBER) ++ return gen_rtx (ZERO_EXTEND, GET_MODE (x), temp); ++ } ++ return gen_rtx (AND, GET_MODE (x), ++ XEXP (to, 0), XEXP (x, 1)); ++ } ++ /* (and (ashiftrt (zero_extend FOO) N) CONST) ++ may be simplified to (and (ashiftrt (subreg FOO) N) CONST) ++ if CONST masks off the bits changed by extension. */ ++ if ((GET_CODE (varop) == ASHIFTRT || GET_CODE (varop) == LSHIFTRT) ++ && GET_CODE (XEXP (varop, 1)) == CONST_INT ++ && XEXP (varop, 0) == to ++ && (GET_CODE (to) == ZERO_EXTEND || GET_CODE (to) == SIGN_EXTEND) ++ /* Verify the and discards all the extended bits. */ ++ && (((unsigned) constop << INTVAL (XEXP (varop, 1))) ++ >> GET_MODE_BITSIZE (GET_MODE (XEXP (to, 0)))) == 0 ++ && FAKE_EXTEND_SAFE_P (GET_MODE (x), XEXP (to, 0))) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ SUBST (XEXP (varop, 0), ++ gen_lowpart_for_combine (GET_MODE (x), XEXP (to, 0))); ++ return x; ++ } ++ /* (and x const) may be converted to (zero_extend (subreg x 0)). */ ++ if (constop == GET_MODE_MASK (QImode) ++ && GET_CODE (varop) == REG) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (ZERO_EXTEND, GET_MODE (x), ++ gen_rtx (SUBREG, QImode, varop, 0)); ++ } ++ if (constop == GET_MODE_MASK (HImode) ++ && GET_CODE (varop) == REG) ++ { ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ return gen_rtx (ZERO_EXTEND, GET_MODE (x), ++ gen_rtx (SUBREG, HImode, varop, 0)); ++ } ++ /* No simplification applies. */ ++ return 0; ++} ++ ++/* Like gen_lowpart but for use by combine. In combine it is not possible ++ to create any new pseudoregs. However, it is safe to create ++ invalid memory addresses, because combine will try to recognize ++ them and all they will do is make the combine attempt fail. ++ ++ If for some reason this cannot do its job, an rtx ++ (clobber (const_int 0)) is returned. ++ An insn containing that will not be recognized. */ ++ ++#undef gen_lowpart ++ ++static rtx ++gen_lowpart_for_combine (mode, x) ++ enum machine_mode mode; ++ register rtx x; ++{ ++ if (GET_CODE (x) == SUBREG || GET_CODE (x) == REG) ++ return gen_lowpart (mode, x); ++ if (GET_MODE (x) == mode) ++ return gen_rtx (CLOBBER, VOIDmode, const0_rtx); ++ if (GET_CODE (x) == MEM) ++ { ++ register int offset = 0; ++ ++ /* Refuse to work on a volatile memory ref. */ ++ if (MEM_VOLATILE_P (x)) ++ return gen_rtx (CLOBBER, VOIDmode, const0_rtx); ++ ++ /* If we want to refer to something bigger than the original memref, ++ generate a perverse subreg instead. That will force a reload ++ of the original memref X. */ ++ if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)) ++ return gen_rtx (SUBREG, mode, x, 0); ++ ++#ifdef WORDS_BIG_ENDIAN ++ offset = (max (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD) ++ - max (GET_MODE_SIZE (mode), UNITS_PER_WORD)); ++#endif ++#ifdef BYTES_BIG_ENDIAN ++ /* Adjust the address so that the address-after-the-data ++ is unchanged. */ ++ offset -= (min (UNITS_PER_WORD, GET_MODE_SIZE (mode)) ++ - min (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); ++#endif ++ return gen_rtx (MEM, mode, plus_constant (XEXP (x, 0), ++ offset)); ++ } ++ else ++ return gen_rtx (CLOBBER, VOIDmode, const0_rtx); ++} ++ ++/* After substitution, if the resulting pattern looks like ++ (set (cc0) (and ...)) or (set (cc0) (lshiftrt ...)), ++ this function is called to simplify the ++ pattern into a bit-field operation if possible. */ ++ ++static void ++simplify_set_cc0_and (insn) ++ rtx insn; ++{ ++ register rtx value = XEXP (PATTERN (insn), 1); ++ register rtx op0 = XEXP (value, 0); ++ register rtx op1 = XEXP (value, 1); ++ int offset = 0; ++ rtx var = 0; ++ rtx bitnum = 0; ++ int temp; ++ int unit; ++ rtx newpat; ++ ++ if (GET_CODE (value) == AND) ++ { ++ op0 = XEXP (value, 0); ++ op1 = XEXP (value, 1); ++ } ++ else if (GET_CODE (value) == LSHIFTRT) ++ { ++ /* If there is no AND, but there is a shift that discards ++ all but the sign bit, we can pretend that the shift result ++ is ANDed with 1. Otherwise we cannot handle just a shift. */ ++ if (GET_CODE (XEXP (value, 1)) == CONST_INT ++ && (INTVAL (XEXP (value, 1)) ++ == GET_MODE_BITSIZE (GET_MODE (value)) - 1)) ++ { ++ op0 = value; ++ op1 = const1_rtx; ++ } ++ else ++ return; ++ } ++ else ++ abort (); ++ ++ /* Look for a constant power of 2 or a shifted 1 ++ on either side of the AND. Set VAR to the other side. ++ Set BITNUM to the shift count of the 1 (as an rtx). ++ Or, if bit number is constant, set OFFSET to the bit number. */ ++ ++ switch (GET_CODE (op0)) ++ { ++ case CONST_INT: ++ temp = exact_log2 (INTVAL (op0)); ++ if (temp < 0) ++ return; ++ offset = temp; ++ var = op1; ++ break; ++ ++ case ASHIFT: ++ case LSHIFT: ++ if (XEXP (op0, 0) == const1_rtx) ++ { ++ bitnum = XEXP (op0, 1); ++ var = op1; ++ } ++ } ++ if (var == 0) ++ switch (GET_CODE (op1)) ++ { ++ case CONST_INT: ++ temp = exact_log2 (INTVAL (op1)); ++ if (temp < 0) ++ return; ++ offset = temp; ++ var = op0; ++ break; ++ ++ case ASHIFT: ++ case LSHIFT: ++ if (XEXP (op1, 0) == const1_rtx) ++ { ++ bitnum = XEXP (op1, 1); ++ var = op0; ++ } ++ } ++ ++ /* If VAR is 0, we didn't find something recognizable. */ ++ if (var == 0) ++ return; ++ ++ if (!undobuf.storage) ++ undobuf.storage = (char *) oballoc (0); ++ ++ /* If the bit position is currently exactly 0, ++ extract a right-shift from the variable portion. */ ++ if (offset == 0 ++ && (GET_CODE (var) == ASHIFTRT || GET_CODE (var) == LSHIFTRT)) ++ { ++ bitnum = XEXP (var, 1); ++ var = XEXP (var, 0); ++ } ++ ++ if (GET_CODE (var) == SUBREG && SUBREG_WORD (var) == 0) ++ var = SUBREG_REG (var); ++ ++ /* Note that BITNUM and OFFSET are always little-endian thru here ++ even on a big-endian machine. */ ++ ++#ifdef BITS_BIG_ENDIAN ++ unit = GET_MODE_BITSIZE (GET_MODE (var)) - 1; ++ ++ if (bitnum != 0) ++ bitnum = gen_rtx (MINUS, SImode, ++ gen_rtx (CONST_INT, VOIDmode, unit), bitnum); ++ else ++ offset = unit - offset; ++#endif ++ ++ if (bitnum == 0) ++ bitnum = gen_rtx (CONST_INT, VOIDmode, offset); ++ ++ newpat = gen_rtx (SET, VOIDmode, cc0_rtx, ++ gen_rtx (ZERO_EXTRACT, VOIDmode, var, const1_rtx, bitnum)); ++ if (recog (newpat, insn) >= 0) ++ { ++ if (undobuf.num_undo < MAX_UNDO) ++ { ++ undobuf.undo[undobuf.num_undo].where = &XEXP (PATTERN (insn), 1); ++ undobuf.undo[undobuf.num_undo].old_contents = value; ++ XEXP (PATTERN (insn), 1) = XEXP (newpat, 1); ++ } ++ undobuf.num_undo++; ++ } ++} ++ ++/* Update the records of when each REG was most recently set or killed ++ for the things done by INSN. This is the last thing done in processing ++ INSN in the combiner loop. ++ ++ We update reg_last_set, reg_last_death, and also the similar information ++ mem_last_set (which insn most recently modified memory) ++ and last_call_cuid (which insn was the most recent subroutine call). */ ++ ++static void ++record_dead_and_set_regs (insn) ++ rtx insn; ++{ ++ register rtx link; ++ for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ++ { ++ if (REG_NOTE_KIND (link) == REG_DEAD) ++ reg_last_death[REGNO (XEXP (link, 0))] = insn; ++ else if (REG_NOTE_KIND (link) == REG_INC) ++ reg_last_set[REGNO (XEXP (link, 0))] = insn; ++ } ++ ++ if (GET_CODE (insn) == CALL_INSN) ++ last_call_cuid = mem_last_set = INSN_CUID (insn); ++ ++ if (GET_CODE (PATTERN (insn)) == PARALLEL) ++ { ++ register int i; ++ for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--) ++ { ++ register rtx elt = XVECEXP (PATTERN (insn), 0, i); ++ register enum rtx_code code = GET_CODE (elt); ++ if (code == SET || code == CLOBBER) ++ { ++ rtx dest = XEXP (elt, 0); ++ while (GET_CODE (dest) == SUBREG ++ || GET_CODE (dest) == STRICT_LOW_PART ++ || GET_CODE (dest) == SIGN_EXTRACT ++ || GET_CODE (dest) == ZERO_EXTRACT) ++ dest = XEXP (dest, 0); ++ ++ if (GET_CODE (dest) == REG) ++ reg_last_set[REGNO (dest)] = insn; ++ else if (GET_CODE (dest) == MEM) ++ mem_last_set = INSN_CUID (insn); ++ } ++ } ++ } ++ else if (GET_CODE (PATTERN (insn)) == SET ++ || GET_CODE (PATTERN (insn)) == CLOBBER) ++ { ++ register rtx dest = XEXP (PATTERN (insn), 0); ++ ++ while (GET_CODE (dest) == SUBREG ++ || GET_CODE (dest) == STRICT_LOW_PART ++ || GET_CODE (dest) == SIGN_EXTRACT ++ || GET_CODE (dest) == ZERO_EXTRACT) ++ dest = XEXP (dest, 0); ++ ++ if (GET_CODE (dest) == REG) ++ reg_last_set[REGNO (dest)] = insn; ++ else if (GET_CODE (dest) == MEM) ++ mem_last_set = INSN_CUID (insn); ++ } ++} ++ ++/* Return nonzero if expression X refers to a REG or to memory ++ that is set in an instruction more recent than FROM_CUID. */ ++ ++static int ++use_crosses_set_p (x, from_cuid) ++ register rtx x; ++ int from_cuid; ++{ ++ register char *fmt; ++ register int i; ++ register enum rtx_code code = GET_CODE (x); ++ ++ if (code == REG) ++ { ++ register int regno = REGNO (x); ++#ifdef PUSH_ROUNDING ++ /* Don't allow uses of the stack pointer to be moved, ++ because we don't know whether the move crosses a push insn. */ ++ if (regno == STACK_POINTER_REGNUM) ++ return 1; ++#endif ++ return (reg_last_set[regno] ++ && INSN_CUID (reg_last_set[regno]) > from_cuid); ++ } ++ ++ if (code == MEM && mem_last_set > from_cuid) ++ return 1; ++ ++ fmt = GET_RTX_FORMAT (code); ++ ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ { ++ if (fmt[i] == 'E') ++ { ++ register int j; ++ for (j = XVECLEN (x, i) - 1; j >= 0; j--) ++ if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid)) ++ return 1; ++ } ++ else if (fmt[i] == 'e' ++ && use_crosses_set_p (XEXP (x, i), from_cuid)) ++ return 1; ++ } ++ return 0; ++} ++ ++/* Return nonzero if reg REGNO is marked as dying in INSN. */ ++ ++int ++regno_dead_p (regno, insn) ++ int regno; ++ rtx insn; ++{ ++ register rtx link; ++ ++ for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ++ if ((REG_NOTE_KIND (link) == REG_DEAD ++ || REG_NOTE_KIND (link) == REG_INC) ++ && REGNO (XEXP (link, 0)) == regno) ++ return 1; ++ ++ return 0; ++} ++ ++/* Return nonzero if J is the first insn following I, ++ not counting labels, line numbers, etc. ++ We assume that J follows I. */ ++ ++static int ++adjacent_insns_p (i, j) ++ rtx i, j; ++{ ++ register rtx insn; ++ for (insn = NEXT_INSN (i); insn != j; insn = NEXT_INSN (insn)) ++ if (GET_CODE (insn) == INSN ++ || GET_CODE (insn) == CALL_INSN ++ || GET_CODE (insn) == JUMP_INSN) ++ return 0; ++ return 1; ++} ++ ++/* Check that X is an insn-body for an `asm' with operands ++ and that the operands mentioned in it are legitimate. */ ++ ++static int ++check_asm_operands (x) ++ rtx x; ++{ ++ int noperands = asm_noperands (x); ++ rtx *operands; ++ int i; ++ ++ if (noperands < 0) ++ return 0; ++ if (noperands == 0) ++ return 1; ++ ++ operands = (rtx *) alloca (noperands * sizeof (rtx)); ++ decode_asm_operands (x, operands, 0, 0, 0); ++ ++ for (i = 0; i < noperands; i++) ++ if (!general_operand (operands[i], VOIDmode)) ++ return 0; ++ ++ return 1; ++} ++ ++/* Concatenate the list of logical links of OINSN ++ into INSN's list of logical links. ++ Modifies OINSN destructively. ++ ++ If ALL_LINKS is nonzero, move all the links that OINSN has. ++ Otherwise, move only those that point to insns that set regs ++ that die in the insn OINSN. ++ Other links are clobbered so that they are no longer effective. */ ++ ++static void ++add_links (insn, oinsn, all_links) ++ rtx insn, oinsn; ++ int all_links; ++{ ++ register rtx links = LOG_LINKS (oinsn); ++ if (! all_links) ++ { ++ rtx tail; ++ for (tail = links; tail; tail = XEXP (tail, 1)) ++ { ++ rtx target = XEXP (tail, 0); ++ if (GET_CODE (target) != INSN ++ || GET_CODE (PATTERN (target)) != SET ++ || GET_CODE (SET_DEST (PATTERN (target))) != REG ++ || ! dead_or_set_p (oinsn, SET_DEST (PATTERN (target)))) ++ /* OINSN is going to become a NOTE ++ so a link pointing there will have no effect. */ ++ XEXP (tail, 0) = oinsn; ++ } ++ } ++ if (LOG_LINKS (insn) == 0) ++ LOG_LINKS (insn) = links; ++ else ++ { ++ register rtx next, prev = LOG_LINKS (insn); ++ while (next = XEXP (prev, 1)) ++ prev = next; ++ XEXP (prev, 1) = links; ++ } ++} ++ ++/* Delete any LOG_LINKS of INSN which point at OINSN. */ ++ ++static void ++remove_links (insn, oinsn) ++ rtx insn, oinsn; ++{ ++ register rtx next = LOG_LINKS (insn), prev = 0; ++ while (next) ++ { ++ if (XEXP (next, 0) == oinsn) ++ { ++ if (prev) ++ XEXP (prev, 1) = XEXP (next, 1); ++ else ++ LOG_LINKS (insn) = XEXP (next, 1); ++ } ++ else ++ prev = next; ++ next = XEXP (next, 1); ++ } ++} ++ ++/* Concatenate the any elements of the list of reg-notes INCS ++ which are of type REG_INC ++ into INSN's list of reg-notes. */ ++ ++static void ++add_incs (insn, incs) ++ rtx insn, incs; ++{ ++ register rtx tail; ++ ++ for (tail = incs; tail; tail = XEXP (tail, 1)) ++ if (REG_NOTE_KIND (tail) == REG_INC) ++ REG_NOTES (insn) ++ = gen_rtx (EXPR_LIST, REG_INC, XEXP (tail, 0), REG_NOTES (insn)); ++} ++ ++/* Remove register number REGNO from the dead registers list of INSN. */ ++ ++void ++remove_death (regno, insn) ++ int regno; ++ rtx insn; ++{ ++ register rtx link, next; ++ while ((link = REG_NOTES (insn)) ++ && REG_NOTE_KIND (link) == REG_DEAD ++ && REGNO (XEXP (link, 0)) == regno) ++ REG_NOTES (insn) = XEXP (link, 1); ++ ++ if (link) ++ while (next = XEXP (link, 1)) ++ { ++ if (REG_NOTE_KIND (next) == REG_DEAD ++ && REGNO (XEXP (next, 0)) == regno) ++ XEXP (link, 1) = XEXP (next, 1); ++ else ++ link = next; ++ } ++} ++ ++/* For each register (hardware or pseudo) used within expression X, ++ if its death is in an instruction with cuid ++ between FROM_CUID (inclusive) and TO_INSN (exclusive), ++ mark it as dead in TO_INSN instead. ++ ++ This is done when X is being merged by combination into TO_INSN. */ ++ ++static void ++move_deaths (x, from_cuid, to_insn) ++ rtx x; ++ int from_cuid; ++ rtx to_insn; ++{ ++ register char *fmt; ++ register int len, i; ++ register enum rtx_code code = GET_CODE (x); ++ ++ if (code == REG) ++ { ++ register rtx where_dead = reg_last_death[REGNO (x)]; ++ ++ if (where_dead && INSN_CUID (where_dead) >= from_cuid ++ && INSN_CUID (where_dead) < INSN_CUID (to_insn)) ++ { ++ remove_death (REGNO (x), reg_last_death[REGNO (x)]); ++ if (! dead_or_partially_set_p (to_insn, x)) ++ REG_NOTES (to_insn) ++ = gen_rtx (EXPR_LIST, REG_DEAD, x, REG_NOTES (to_insn)); ++ } ++ return; ++ } ++ ++ len = GET_RTX_LENGTH (code); ++ fmt = GET_RTX_FORMAT (code); ++ ++ for (i = 0; i < len; i++) ++ { ++ if (fmt[i] == 'E') ++ { ++ register int j; ++ for (j = XVECLEN (x, i) - 1; j >= 0; j--) ++ move_deaths (XVECEXP (x, i, j), from_cuid, to_insn); ++ } ++ else if (fmt[i] == 'e') ++ move_deaths (XEXP (x, i), from_cuid, to_insn); ++ } ++} ++ ++/* Like move_deaths, but deaths are moving both forward ++ (from FROM_CUID to TO_INSN), and backwards ++ (from FROM_INSN to TO_INSN). This is what happens ++ when an insn is removed after applying the distributive law. */ ++ ++static void ++move_deaths_2 (x, from_cuid, from_insn, to_insn) ++ rtx x; ++ int from_cuid; ++ rtx from_insn, to_insn; ++{ ++ register char *fmt; ++ register int len, i; ++ register enum rtx_code code = GET_CODE (x); ++ ++ if (code == REG) ++ { ++ register rtx where_dead = reg_last_death[REGNO (x)]; ++ ++ if (where_dead && INSN_CUID (where_dead) >= from_cuid ++ && INSN_CUID (where_dead) < INSN_CUID (to_insn)) ++ { ++ remove_death (REGNO (x), reg_last_death[REGNO (x)]); ++ if (! dead_or_set_p (to_insn, x)) ++ REG_NOTES (to_insn) ++ = gen_rtx (EXPR_LIST, REG_DEAD, x, REG_NOTES (to_insn)); ++ } ++ /* Can't use where_dead for from_insn because it has ++ not been computed yet. */ ++ else if (dead_or_set_p (from_insn, x)) ++ { ++ remove_death (REGNO (x), from_insn); ++ if (! dead_or_set_p (to_insn, x)) ++ REG_NOTES (to_insn) ++ = gen_rtx (EXPR_LIST, REG_DEAD, x, REG_NOTES (to_insn)); ++ } ++ return; ++ } ++ ++ len = GET_RTX_LENGTH (code); ++ fmt = GET_RTX_FORMAT (code); ++ ++ for (i = 0; i < len; i++) ++ { ++ if (fmt[i] == 'E') ++ { ++ register int j; ++ for (j = XVECLEN (x, i) - 1; j >= 0; j--) ++ move_deaths_2 (XVECEXP (x, i, j), from_cuid, from_insn, to_insn); ++ } ++ else if (fmt[i] == 'e') ++ move_deaths_2 (XEXP (x, i), from_cuid, from_insn, to_insn); ++ } ++} ++ ++/* The distrib combiner rewrites groups of insns so that optimizations ++ can be more easily recognized. The front-end does not know how to ++ group certain kinds of operations for efficient execution, and the ++ resulting code can be quite poor. For example, on a machine without ++ bitfield instructions, bitfield references look like ++ ++ (and (lshiftrt ... n) m) ++ ++ When combining two bitfield operations, such as with ||, this can ++ yield code like ++ ++ (set z ++ (or (and (lshiftrt x n) 1) ++ (and (lshiftrt y n) 1))) ++ ++ which can be more efficiently executed as ++ ++ (set z ++ (lshiftrt (and (or x y) ++ (1 << m)) n)) ++ ++ From there, the combiner attempts to rewrite the insns, ++ keeping flow information accurate for later passes, ++ and reducing the total number of insns executed. ++ ++ This function returns the point at which we should try ++ looking for more simplifications. This will be before ++ INSN if the call succeeds. We do not need to fear ++ infinite loops, since this function is guaranteed to ++ eliminate at least one (non-note) instruction if it returns ++ successfully. */ ++ ++static rtx ++try_distrib (insn, xprev1, xprev2) ++ rtx insn, xprev1, xprev2; ++{ ++ rtx pat = PATTERN (insn); ++ rtx prev1, prev2, pat1, pat2, src1, src2; ++ rtx to_prev, to_insn; ++ enum rtx_code code; ++ int insn_code_number, prev_code_number, regno; ++ rtx new_insn_pat, new_prev_pat; ++ ++ distrib_attempts++; ++ ++ /* ??? Need to implement a test that PREV2 and PREV1 ++ are completely independent. Right now their ++ recognition ability is sufficiently limited that ++ it should not be necessary, but better safe than sorry. */ ++ ++ /* Let PREV1 be the later of the two insns, and PREV2 the earlier. */ ++ if (INSN_CUID (xprev1) > INSN_CUID (xprev2)) ++ { ++ prev1 = xprev1; ++ prev2 = xprev2; ++ } ++ else ++ { ++ prev1 = xprev2; ++ prev2 = xprev1; ++ } ++ ++ pat1 = PATTERN (prev1); ++ pat2 = PATTERN (prev2); ++ ++ /* First, see if INSN, PREV1, and PREV2 have patterns we can expect ++ to simplify. */ ++ ++ if (GET_CODE (pat) != SET ++ || GET_CODE (pat1) != SET ++ || GET_CODE (pat2) != SET) ++ return 0; ++ ++ code = GET_CODE (SET_SRC (pat)); ++ src1 = SET_SRC (pat1); ++ src2 = SET_SRC (pat2); ++ ++ if (GET_CODE (SET_DEST (pat1)) != REG ++ || GET_CODE (SET_DEST (pat2)) != REG) ++ return 0; ++ ++ switch (code) ++ { ++ default: ++ return 0; ++ ++ case IOR: ++ case AND: ++ case XOR: ++ case PLUS: ++ ; ++ } ++ ++ /* Insns PREV1 and PREV2 must provide the two operands of the arithmetic ++ that is done in INSN. */ ++ if (! ((XEXP (SET_SRC (pat), 0) == SET_DEST (pat1) ++ && XEXP (SET_SRC (pat), 1) == SET_DEST (pat2)) ++ || ++ (XEXP (SET_SRC (pat), 0) == SET_DEST (pat2) ++ && XEXP (SET_SRC (pat), 1) == SET_DEST (pat1)))) ++ return 0; ++ ++ /* They must not be used in any other way in INSN. ++ In particular, they must not be used in a result memory address. */ ++ if (reg_mentioned_p (SET_DEST (pat1), SET_DEST (pat)) ++ || reg_mentioned_p (SET_DEST (pat2), SET_DEST (pat))) ++ return 0; ++ ++ /* Give up if the two operands' modes don't match. */ ++ if (GET_MODE (src1) != GET_MODE (src2)) ++ return 0; ++ ++ /* PREV1 and PREV2 must compute the same operation. ++ Actually, there are other cases that could be handled, ++ but are not implemented. For example: ++ ++ (set (reg:SI 94) ++ (and:SI (reg:SI 73) ++ (const_int 223))) ++ ++ (set (reg:SI 95) ++ (zero_extend:SI (subreg:QI (reg:SI 91) 0))) ++ ++ (set (reg:SI 96) ++ (ior:SI (reg:SI 94) ++ (reg:SI 95))) ++ ++ In this case, we know that because (reg:SI 94) has ++ been anded with 223, there is no need to zero_extend ++ (reg:SI 91), and we could eliminate (reg:SI 95). */ ++ ++ if (GET_CODE (src1) != GET_CODE (src2)) ++ return 0; ++ ++ /* The SETs in PREV1 and PREV2 do not need to be kept around. */ ++ ++ undobuf.num_undo = 0; ++ undobuf.storage = 0; ++ ++ /* Substitute in the latest insn for the regs set by the earlier ones. */ ++ subst_insn = insn; ++ n_occurrences = 0; /* `subst' counts here */ ++ ++ switch (GET_CODE (src1)) ++ { ++ /* case XOR: Does not distribute through anything! */ ++ case LSHIFTRT: ++ case ASHIFTRT: ++ /* Right-shift can't distribute through addition ++ since the round-off would happen differently. */ ++ case AND: ++ case IOR: ++ /* Boolean ops don't distribute through addition. */ ++ if (code == PLUS) ++ return 0; ++ goto do_distrib; ++ ++ case LSHIFT: ++ case ASHIFT: ++ /* Left shifts are multiplication; they distribute through ++ addition. Also, since they work bitwise, they ++ distribute through boolean operations. */ ++#ifdef NEGATIVE_SHIFT_COUNTS ++ /* Negative count is really a right-shift. */ ++ if (NEGATIVE_SHIFT_COUNTS ++ && code == PLUS ++ && !(GET_CODE (XEXP (src1, 1)) ++ == CONST_INT && INTVAL (XEXP (src1, 1)) >= 0)) ++ return 0; ++#endif ++ goto do_distrib; ++ ++ case MULT: ++ /* Multiplication distributes through addition only. */ ++ if (code != PLUS) ++ return 0; ++ ++ do_distrib: ++ if (GET_CODE (XEXP (src1, 1)) != CONST_INT ++ || GET_CODE (XEXP (src2, 1)) != CONST_INT ++ || INTVAL (XEXP (src1, 1)) != INTVAL (XEXP (src2, 1))) ++ return 0; ++ ++ /* Give up if we would move a use of a reg across an alteration. ++ Note this is unnecessarily conservative, since a problem really ++ happens only if this reg is set *between* PREV2 and PREV1 ++ But this test is easier. */ ++ if (use_crosses_set_p (XEXP (src2, 0), INSN_CUID (prev2))) ++ return 0; ++ ++ /* Try changing (+ (* x c) (* y c)) to (* (+ x y) c). */ ++ to_prev = gen_rtx (code, GET_MODE (src1), ++ XEXP (src1, 0), XEXP (src2, 0)); ++ to_insn = gen_rtx (GET_CODE (src1), GET_MODE (src1), SET_DEST (pat1), XEXP (src1, 1)); ++ break; ++ ++ case ZERO_EXTEND: ++ case SIGN_EXTEND: ++ /* Extension can't distribute through addition; ++ the carries could be changed. */ ++ if (code == PLUS) ++ return 0; ++ { ++ rtx inner1 = XEXP (src1, 0), inner2 = XEXP (src2, 0); ++ int subreg_needed = 0; ++ ++ /* Try changing (& (extend x) (extend y)) to (extend (& x y)). */ ++ /* But keep extend insns together with their subregs. */ ++ if (GET_CODE (inner1) == SUBREG) ++ { ++ if (SUBREG_WORD (inner1) != 0) ++ return 0; ++ else ++ { ++ subreg_needed = 1; ++ inner1 = SUBREG_REG (inner1); ++ } ++ } ++ ++ if (GET_CODE (inner2) == SUBREG) ++ { ++ if (SUBREG_WORD (inner2) != 0) ++ return 0; ++ else ++ { ++ subreg_needed = 1; ++ inner2 = SUBREG_REG (inner2); ++ } ++ } ++ ++ /* Give up if we would move a use of a reg across an alteration. ++ Note this is unnecessarily conservative, since a problem really ++ happens only if this reg is set *between* PREV2 and PREV1 ++ But this test is easier. */ ++ if (use_crosses_set_p (inner2, INSN_CUID (prev2))) ++ return 0; ++ ++ to_prev = gen_rtx (code, GET_MODE (src1), inner1, inner2); ++ to_insn = gen_rtx (GET_CODE (src1), GET_MODE (src1), ++ subreg_needed ++ ? gen_rtx (SUBREG, GET_MODE (XEXP (src1, 0)), ++ SET_DEST (pat1), 0) ++ : SET_DEST (pat1)); ++ } ++ break; ++ ++ default: ++ return 0; ++ } ++ ++ /* Are the results of this "substitution" a valid instruction? */ ++ ++ new_insn_pat = subst (PATTERN (insn), SET_SRC (PATTERN (insn)), to_insn); ++ distrib_merges_1++; ++ ++ insn_code_number = recog (new_insn_pat, insn); ++ if (insn_code_number < 0) ++ { ++ undo_all (); ++ return 0; ++ } ++ ++ subst_insn = prev1; ++ new_prev_pat = subst (pat1, src1, to_prev); ++ distrib_merges_2++; ++ ++ prev_code_number = recog (new_prev_pat, prev1); ++ if (prev_code_number < 0) ++ { ++ undo_all (); ++ return 0; ++ } ++ ++ /* Everything worked; install the new patterns. */ ++ INSN_CODE (insn) = insn_code_number; ++ PATTERN (insn) = new_insn_pat; ++ ++ INSN_CODE (prev1) = prev_code_number; ++ PATTERN (prev1) = new_prev_pat; ++ ++ /* Need to change LOG_LINKS around...PREV1 now gets ++ whatever flowed into PREV2. PREV2 is going to ++ become a NOTE, so we clear out its LOG_LINKS. */ ++ remove_links (insn, prev2); ++ add_links (prev1, prev2, adjacent_insns_p (prev2, prev1)); ++ ++ /* Registers which died in PREV2 now die in PREV1. ++ Also, registers born in PREV2 dying in INSN now die in PREV1. */ ++ move_deaths_2 (src2, INSN_CUID (prev2), insn, prev1); ++ ++ regno = REGNO (SET_DEST (pat2)); ++ ++ reg_n_sets[regno]--; ++ if (reg_n_sets[regno] == 0 ++ && ! (basic_block_live_at_start[0][regno / HOST_BITS_PER_INT] ++ & (1 << (regno % HOST_BITS_PER_INT)))) ++ reg_n_refs[regno] = 0; ++ remove_death (regno, insn); ++ ++ PUT_CODE (prev2, NOTE); ++ NOTE_LINE_NUMBER (prev2) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (prev2) = 0; ++ ++ distrib_successes++; ++ return prev1; ++} ++ ++void ++dump_combine_stats (file) ++ FILE *file; ++{ ++ fprintf ++ (file, ++ ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n", ++ combine_attempts, combine_merges, combine_extras, combine_successes); ++ fprintf ++ (file, ++ ";; Distributer statistics: %d attempts, %d:%d substitutions,\n;; %d successes.\n\n", ++ distrib_attempts, distrib_merges_1, ++ distrib_merges_2, distrib_successes); ++} ++ ++void ++dump_combine_total_stats (file) ++ FILE *file; ++{ ++ fprintf ++ (file, ++ "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n", ++ total_attempts, total_merges, total_extras, total_successes); ++ fprintf ++ (file, ++ "\n;; Distributer totals: %d attempts, %d:%d substitutions,\n;; %d successes.\n", ++ total_distrib_attempts, total_distrib_merges_1, ++ total_distrib_merges_2, total_distrib_successes); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/conditions.h alliance/genview/src/gcc-1.42/conditions.h +--- alliance-5.0/genview/src/gcc-1.42/conditions.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/conditions.h 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,122 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Definitions for condition code handling in final.c and output routines. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* The variable cc_status says how to interpret the condition code. ++ It is set by output routines for an instruction that sets the cc's ++ and examined by output routines for jump instructions. ++ ++ cc_status contains two components named `value1' and `value2' ++ that record two equivalent expressions for the values that the ++ condition codes were set from. (Either or both may be null if ++ there is no useful expression to record.) These fields are ++ used for eliminating redundant test and compare instructions ++ in the cases where the condition codes were already set by the ++ previous instruction. ++ ++ cc_status.flags contains flags which say that the condition codes ++ were set in a nonstandard manner. The output of jump instructions ++ uses these flags to compensate and produce the standard result ++ with the nonstandard condition codes. Standard flags are defined here. ++ The tm- file can also define other machine-dependent flags. ++ ++ cc_status also contains a machine-dependent component `mdep' ++ whose type, `CC_STATUS_MDEP', may be defined as a macro in the ++ tm- file. */ ++ ++#ifndef CC_STATUS_MDEP ++#define CC_STATUS_MDEP int ++#endif ++ ++#ifndef CC_STATUS_MDEP_INIT ++#define CC_STATUS_MDEP_INIT 0 ++#endif ++ ++typedef struct {int flags; rtx value1, value2; CC_STATUS_MDEP mdep;} CC_STATUS; ++ ++/* While outputting an insn as assembler code, ++ this is the status BEFORE that insn. */ ++extern CC_STATUS cc_prev_status; ++ ++/* While outputting an insn as assembler code, ++ this is being altered to the status AFTER that insn. */ ++extern CC_STATUS cc_status; ++ ++/* These are the machine-independent flags: */ ++ ++/* Set if the sign of the cc value is inverted: ++ output a following jump-if-less as a jump-if-greater, etc. */ ++#define CC_REVERSED 1 ++ ++/* This bit means that the current setting of the N bit is bogus ++ and conditional jumps should use the Z bit in its place. ++ This state obtains when an extraction of a signed single-bit field ++ or an arithmetic shift right of a byte by 7 bits ++ is turned into a btst, because btst does not set the N bit. */ ++#define CC_NOT_POSITIVE 2 ++ ++/* This bit means that the current setting of the N bit is bogus ++ and conditional jumps should pretend that the N bit is clear. ++ Used after extraction of an unsigned bit ++ or logical shift right of a byte by 7 bits is turned into a btst. ++ The btst does not alter the N bit, but the result of that shift ++ or extract is never negative. */ ++#define CC_NOT_NEGATIVE 4 ++ ++/* This bit means that the current setting of the overflow flag ++ is bogus and conditional jumps should pretend there is no overflow. */ ++#define CC_NO_OVERFLOW 010 ++ ++/* This bit means that what ought to be in the Z bit ++ should be tested as the complement of the N bit. */ ++#define CC_Z_IN_NOT_N 020 ++ ++/* This bit means that what ought to be in the Z bit ++ should be tested as the N bit. */ ++#define CC_Z_IN_N 040 ++ ++/* This is how to initialize the variable cc_status. ++ final does this at appropriate moments. */ ++ ++#define CC_STATUS_INIT \ ++ (cc_status.flags = 0, cc_status.value1 = 0, cc_status.value2 = 0, \ ++ CC_STATUS_MDEP_INIT) +diff -Naur alliance-5.0/genview/src/gcc-1.42/config/mu.md alliance/genview/src/gcc-1.42/config/mu.md +--- alliance-5.0/genview/src/gcc-1.42/config/mu.md 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/config/mu.md 2002-04-11 09:14:50.000000000 +0200 +@@ -0,0 +1,869 @@ ++;; ------------------------------------------------------------- ++ ++;; ++;; Description de la machine universelle ++;; ++ ++;; ++;; Ecrit par Arnaud COMPAN & Francois PECHEUX ** avril-juin 1990 ++;; Quelques modifs par Frederic Petrot, 91/92 ++ ++;; ------------------------------------------------------------- ++ ++(define_insn "cmpqi" ++ [(set (cc0) ++ (compare (match_operand:QI 0 "general_operand" "g") ++ (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "cmp.qi %0,%1") ++ ++(define_insn "cmphi" ++ [(set (cc0) ++ (compare (match_operand:HI 0 "general_operand" "g") ++ (match_operand:HI 1 "general_operand" "g")))] ++ "" ++ "cmp.hi %0,%1") ++ ++(define_insn "cmpsi" ++ [(set (cc0) ++ (compare (match_operand:SI 0 "general_operand" "g") ++ (match_operand:SI 1 "general_operand" "g")))] ++ "" ++ "cmp.si %0,%1") ++ ++(define_insn "cmpsf" ++ [(set (cc0) ++ (compare (match_operand:SF 0 "general_operand" "g") ++ (match_operand:SF 1 "general_operand" "g")))] ++ "" ++ "cmp.sf %0,%1") ++ ++(define_insn "cmpdf" ++ [(set (cc0) ++ (compare (match_operand:DF 0 "general_operand" "g") ++ (match_operand:DF 1 "general_operand" "g")))] ++ "" ++ "cmp.df %0,%1") ++ ++(define_insn "tstqi" ++ [(set (cc0) ++ (match_operand:QI 0 "general_operand" "g"))] ++ "" ++ "cmp.qi %0,#0") ++ ++(define_insn "tsthi" ++ [(set (cc0) ++ (match_operand:HI 0 "general_operand" "g"))] ++ "" ++ "cmp.hi %0,#0") ++ ++(define_insn "tstsi" ++ [(set (cc0) ++ (match_operand:SI 0 "general_operand" "g"))] ++ "" ++ "cmp.si %0,#0") ++ ++(define_insn "tstsf" ++ [(set (cc0) ++ (match_operand:SF 0 "general_operand" "g"))] ++ "" ++ "cmp.sf %0,#0") ++ ++(define_insn "tstdf" ++ [(set (cc0) ++ (match_operand:DF 0 "general_operand" "g"))] ++ "" ++ "cmp.df %0,#0") ++ ++(define_insn "movqi" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (match_operand:QI 1 "general_operand" "g"))] ++ "" ++ "mov.qi %0,%1") ++ ++(define_insn "movhi" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (match_operand:HI 1 "general_operand" "g"))] ++ "" ++ "mov.hi %0,%1") ++ ++(define_insn "movsi" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (match_operand:SI 1 "general_operand" "g"))] ++ "" ++ "mov.si %0,%1") ++ ++(define_insn "movsf" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (match_operand:SF 1 "general_operand" "g"))] ++ "" ++ "mov.sf %0,%1") ++ ++(define_insn "movdf" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (match_operand:DF 1 "general_operand" "g"))] ++ "" ++ "mov.df %0,%1") ++ ++(define_insn "extendqihi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (sign_extend:HI ++ (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "ext.qi.hi %1,%0") ++ ++(define_insn "extendqisi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (sign_extend:SI ++ (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "ext.qi.si %1,%0") ++ ++(define_insn "extendhisi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (sign_extend:SI ++ (match_operand:HI 1 "general_operand" "g")))] ++ "" ++ "ext.hi.si %1,%0") ++ ++(define_insn "zero_extendhisi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (zero_extend:SI ++ (match_operand:HI 1 "general_operand" "g")))] ++ "" ++ "ext0.hi.si %1,%0") ++ ++(define_insn "zero_extendqihi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (zero_extend:HI ++ (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "ext0.qi.hi %1,%0") ++ ++(define_insn "zero_extendqisi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (zero_extend:SI ++ (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "ext0.qi.si %1,%0") ++ ++(define_insn "extendsfdf2" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (float_extend:DF ++ (match_operand:SF 1 "general_operand" "g")))] ++ "" ++ "ext.sf.df %1,%0") ++ ++(define_insn "truncsiqi2" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (truncate:QI ++ (match_operand:SI 1 "general_operand" "g")))] ++ "" ++ "trunc.si.qi %1,%0") ++ ++(define_insn "truncsihi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (truncate:HI ++ (match_operand:SI 1 "general_operand" "g")))] ++ "" ++ "trunc.si.hi %1,%0") ++ ++(define_insn "trunchiqi2" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (truncate:QI ++ (match_operand:HI 1 "general_operand" "g")))] ++ "" ++ "trunc.hi.qi %1,%0") ++ ++(define_insn "truncdfsf2" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (float_truncate:SF ++ (match_operand:DF 1 "general_operand" "g")))] ++ "" ++ "trunc.df.sf %1,%0") ++ ++(define_insn "floatqisf2" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (float:SF (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "float.qi.sf %1,%0") ++ ++(define_insn "floathisf2" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (float:SF (match_operand:HI 1 "general_operand" "g")))] ++ "" ++ "float.hi.sf %1,%0") ++ ++(define_insn "floatsisf2" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (float:SF (match_operand:SI 1 "general_operand" "g")))] ++ "" ++ "float.si.sf %1,%0") ++ ++(define_insn "floatqidf2" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (float:DF (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "float.qi.df %1,%0") ++ ++(define_insn "floathidf2" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (float:DF (match_operand:HI 1 "general_operand" "g")))] ++ "" ++ "float.hi.df %1,%0") ++ ++(define_insn "floatsidf2" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (float:DF (match_operand:SI 1 "general_operand" "g")))] ++ "" ++ "float.si.df %1,%0") ++ ++(define_insn "fix_truncsfqi2" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (fix:QI (fix:SF (match_operand:SF 1 "general_operand" "g"))))] ++ "" ++ "fix_trunc.sf.qi %1,%0") ++ ++(define_insn "fix_truncsfhi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (fix:HI (fix:SF (match_operand:SF 1 "general_operand" "g"))))] ++ "" ++ "fix_trunc.sf.hi %1,%0") ++ ++(define_insn "fix_truncsfsi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "g"))))] ++ "" ++ "fix_trunc.sf.si %1,%0") ++ ++(define_insn "fix_truncdfqi2" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (fix:QI (fix:DF (match_operand:DF 1 "general_operand" "g"))))] ++ "" ++ "fix_trunc.df.qi %1,%0") ++ ++(define_insn "fix_truncdfhi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (fix:HI (fix:DF (match_operand:DF 1 "general_operand" "g"))))] ++ "" ++ "fix_trunc.df.hi %1,%0") ++ ++(define_insn "fix_truncdfsi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "g"))))] ++ "" ++ "fix_trunc.df.si %1,%0") ++ ++(define_insn "fixunssfqi2" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (unsigned_fix:QI (fix:SF (match_operand:SF 1 "general_operand" "g"))))] ++ "" ++ "fixuns.sf.qi %1,%0") ++ ++(define_insn "fixunssfhi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (unsigned_fix:HI (fix:SF (match_operand:SF 1 "general_operand" "g"))))] ++ "" ++ "fixuns.sf.hi %1,%0") ++ ++(define_insn "fixunssfsi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (unsigned_fix:SI (fix:SF (match_operand:SF 1 "general_operand" "g"))))] ++ "" ++ "fixuns.sf.si %1,%0") ++ ++(define_insn "fixunsdfqi2" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (unsigned_fix:QI (fix:DF (match_operand:DF 1 "general_operand" "g"))))] ++ "" ++ "fixuns.df.qi %1,%0") ++ ++(define_insn "fixunsdfhi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (unsigned_fix:HI (fix:DF (match_operand:DF 1 "general_operand" "g"))))] ++ "" ++ "fixuns.df.hi %1,%0") ++ ++(define_insn "fixunsdfsi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (unsigned_fix:SI (fix:DF (match_operand:DF 1 "general_operand" "g"))))] ++ "" ++ "fixuns.df.si %1,%0") ++ ++(define_insn "addqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (plus:QI (match_operand:QI 1 "general_operand" "%g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "add.qi %0,%1,%2") ++ ++(define_insn "addhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (plus:HI (match_operand:HI 1 "general_operand" "%g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "add.hi %0,%1,%2") ++ ++(define_insn "addsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (plus:SI (match_operand:SI 1 "general_operand" "%g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "add.si %0,%1,%2") ++ ++(define_insn "addsf3" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (plus:SF (match_operand:SF 1 "general_operand" "%g") ++ (match_operand:SF 2 "general_operand" "g")))] ++ "" ++ "add.sf %0,%1,%2") ++ ++(define_insn "adddf3" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (plus:DF (match_operand:DF 1 "general_operand" "%g") ++ (match_operand:DF 2 "general_operand" "g")))] ++ "" ++ "add.df %0,%1,%2") ++ ++(define_insn "mulqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (mult:QI (match_operand:QI 1 "general_operand" "%g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "mul.qi %0,%1,%2") ++ ++(define_insn "mulhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (mult:HI (match_operand:HI 1 "general_operand" "%g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "mul.hi %0,%1,%2") ++ ++(define_insn "mulsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (mult:SI (match_operand:SI 1 "general_operand" "%g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "mul.si %0,%1,%2") ++ ++(define_insn "mulsf3" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (mult:SF (match_operand:SF 1 "general_operand" "%g") ++ (match_operand:SF 2 "general_operand" "g")))] ++ "" ++ "mul.sf %0,%1,%2") ++ ++(define_insn "muldf3" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (mult:DF (match_operand:DF 1 "general_operand" "%g") ++ (match_operand:DF 2 "general_operand" "g")))] ++ "" ++ "mul.df %0,%1,%2") ++ ++(define_insn "divqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (div:QI (match_operand:QI 1 "general_operand" "g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "div.qi %0,%1,%2") ++ ++(define_insn "divhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (div:HI (match_operand:HI 1 "general_operand" "g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "div.hi %0,%1,%2") ++ ++(define_insn "divsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (div:SI (match_operand:SI 1 "general_operand" "g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "div.si %0,%1,%2") ++ ++(define_insn "divsf3" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (div:SF (match_operand:SF 1 "general_operand" "g") ++ (match_operand:SF 2 "general_operand" "g")))] ++ "" ++ "div.sf %0,%1,%2") ++ ++(define_insn "divdf3" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (div:DF (match_operand:DF 1 "general_operand" "g") ++ (match_operand:DF 2 "general_operand" "g")))] ++ "" ++ "div.df %0,%1,%2") ++ ++(define_insn "subqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (minus:QI (match_operand:QI 1 "general_operand" "g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "sub.qi %0,%1,%2") ++ ++(define_insn "subhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (minus:HI (match_operand:HI 1 "general_operand" "g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "sub.hi %0,%1,%2") ++ ++(define_insn "subsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (minus:SI (match_operand:SI 1 "general_operand" "g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "sub.si %0,%1,%2") ++ ++(define_insn "subsf3" ++ [(set (match_operand:SF 0 "general_operand" "=g") ++ (minus:SF (match_operand:SF 1 "general_operand" "g") ++ (match_operand:SF 2 "general_operand" "g")))] ++ "" ++ "sub.sf %0,%1,%2") ++ ++(define_insn "subdf3" ++ [(set (match_operand:DF 0 "general_operand" "=g") ++ (minus:DF (match_operand:DF 1 "general_operand" "g") ++ (match_operand:DF 2 "general_operand" "g")))] ++ "" ++ "sub.df %0,%1,%2") ++ ++(define_insn "andqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (and:QI (match_operand:QI 1 "general_operand" "%g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "and.qi %0,%1,%2") ++ ++(define_insn "andhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (and:HI (match_operand:HI 1 "general_operand" "%g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "and.hi %0,%1,%2") ++ ++(define_insn "andsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (and:SI (match_operand:SI 1 "general_operand" "%g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "and.si %0,%1,%2") ++ ++(define_insn "iorqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (ior:QI (match_operand:QI 1 "general_operand" "%g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "or.qi %0,%1,%2") ++ ++(define_insn "iorhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (ior:HI (match_operand:HI 1 "general_operand" "%g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "or.hi %0,%1,%2") ++ ++(define_insn "iorsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (ior:SI (match_operand:SI 1 "general_operand" "%g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "or.si %0,%1,%2") ++ ++(define_insn "xorqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (xor:QI (match_operand:QI 1 "general_operand" "%g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "xor.qi %0,%1,%2") ++ ++(define_insn "xorhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (xor:HI (match_operand:HI 1 "general_operand" "%g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "xor.hi %0,%1,%2") ++ ++(define_insn "xorsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (xor:SI (match_operand:SI 1 "general_operand" "%g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "xor.si %0,%1,%2") ++ ++(define_insn "negqi2" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (neg:QI (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "neg.qi %0,%1") ++ ++(define_insn "neghi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (neg:HI (match_operand:HI 1 "general_operand" "g")))] ++ "" ++ "neg.hi %0,%1") ++ ++(define_insn "negsi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (neg:SI (match_operand:SI 1 "general_operand" "g")))] ++ "" ++ "neg.si %0,%1") ++ ++(define_insn "one_cmplqi2" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (not:QI (match_operand:QI 1 "general_operand" "g")))] ++ "" ++ "not.qi %0,%1") ++ ++(define_insn "one_cmplhi2" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (not:HI (match_operand:HI 1 "general_operand" "g")))] ++ "" ++ "not.hi %0,%1") ++ ++(define_insn "one_cmplsi2" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (not:SI (match_operand:SI 1 "general_operand" "g")))] ++ "" ++ "not.si %0,%1") ++ ++(define_insn "ashlqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (ashift:QI (match_operand:QI 1 "general_operand" "g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "asl.qi %0,%1,%2") ++ ++(define_insn "ashlhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (ashift:HI (match_operand:HI 1 "general_operand" "g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "asl.hi %0,%1,%2") ++ ++(define_insn "ashlsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (ashift:SI (match_operand:SI 1 "general_operand" "g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "asl.si %0,%1,%2") ++ ++(define_insn "ashrqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (ashiftrt:QI (match_operand:QI 1 "general_operand" "g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "asr.qi %0,%1,%2") ++ ++(define_insn "ashrhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (ashiftrt:HI (match_operand:HI 1 "general_operand" "g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "asr.hi %0,%1,%2") ++ ++(define_insn "ashrsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (ashiftrt:SI (match_operand:SI 1 "general_operand" "g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "asr.si %0,%1,%2") ++ ++(define_insn "lshlqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (lshift:QI (match_operand:QI 1 "general_operand" "g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "lsl.qi %0,%1,%2") ++ ++(define_insn "lshlhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (lshift:HI (match_operand:HI 1 "general_operand" "g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "lsl.hi %0,%1,%2") ++ ++(define_insn "lshlsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (lshift:SI (match_operand:SI 1 "general_operand" "g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "lsl.si %0,%1,%2") ++ ++(define_insn "lshrqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (lshiftrt:QI (match_operand:QI 1 "general_operand" "g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "lsr.qi %0,%1,%2") ++ ++(define_insn "lshrhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (lshiftrt:HI (match_operand:HI 1 "general_operand" "g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "lsr.hi %0,%1,%2") ++ ++(define_insn "lshrsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (lshiftrt:SI (match_operand:SI 1 "general_operand" "g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "lsr.si %0,%1,%2") ++ ++/* ++(define_insn "rotlqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (rotate:QI (match_operand:QI 1 "general_operand" "g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "rotl.qi %0,%1,%2") ++ ++(define_insn "rotlhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (rotate:HI (match_operand:HI 1 "general_operand" "g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "rotl.hi %0,%1,%2") ++ ++(define_insn "rotlsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (rotate:SI (match_operand:SI 1 "general_operand" "g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "rotl.si %0,%1,%2") ++ ++(define_insn "rotrqi3" ++ [(set (match_operand:QI 0 "general_operand" "=g") ++ (rotatert:QI (match_operand:QI 1 "general_operand" "g") ++ (match_operand:QI 2 "general_operand" "g")))] ++ "" ++ "rotr.qi %0,%1,%2") ++ ++(define_insn "rotrhi3" ++ [(set (match_operand:HI 0 "general_operand" "=g") ++ (rotatert:HI (match_operand:HI 1 "general_operand" "g") ++ (match_operand:HI 2 "general_operand" "g")))] ++ "" ++ "rotr.hi %0,%1,%2") ++ ++(define_insn "rotrsi3" ++ [(set (match_operand:SI 0 "general_operand" "=g") ++ (rotatert:SI (match_operand:SI 1 "general_operand" "g") ++ (match_operand:SI 2 "general_operand" "g")))] ++ "" ++ "rotr.si %0,%1,%2") ++*/ ++ ++(define_insn "beq" ++ [(set (pc) ++ (if_then_else (eq (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "beq %l0") ++ ++(define_insn "bne" ++ [(set (pc) ++ (if_then_else (ne (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "bne %l0") ++ ++(define_insn "bgt" ++ [(set (pc) ++ (if_then_else (gt (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "bgt %l0") ++ ++(define_insn "bgtu" ++ [(set (pc) ++ (if_then_else (gtu (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "bgtu %l0") ++ ++(define_insn "blt" ++ [(set (pc) ++ (if_then_else (lt (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "blt %l0") ++ ++(define_insn "bltu" ++ [(set (pc) ++ (if_then_else (ltu (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "bltu %l0") ++ ++(define_insn "bge" ++ [(set (pc) ++ (if_then_else (ge (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "bge %l0") ++ ++(define_insn "bgeu" ++ [(set (pc) ++ (if_then_else (geu (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "bgeu %l0") ++ ++(define_insn "ble" ++ [(set (pc) ++ (if_then_else (le (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "ble %l0") ++ ++(define_insn "bleu" ++ [(set (pc) ++ (if_then_else (leu (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++ "bleu %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (eq (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "bne %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (ne (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "beq %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (gt (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "ble %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (gtu (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "bleu %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (lt (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "bge %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (ltu (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "bgeu %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (ge (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "blt %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (geu (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "bltu %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (le (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "bgt %l0") ++ ++(define_insn "" ++ [(set (pc) ++ (if_then_else (leu (cc0) ++ (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" ""))))] ++ "" ++ "bgtu %l0") ++ ++(define_insn "jump" ++ [(set (pc) ++ (label_ref (match_operand 0 "" "")))] ++ "" ++ "bra %l0") ++ ++(define_insn "tablejump" ++ [(set (pc) (match_operand:SI 0 "general_operand" "g")) ++ (use (label_ref (match_operand 1 "" "")))] ++ "" ++ "bra %0") ++ ++(define_insn "call" ++ [(call (match_operand:SI 0 "ever_good" "g") ++ (match_operand:SI 1 "ever_good" "g"))] ++ "" ++ "call %0") ++ ++(define_insn "call_value" ++ [(set (match_operand 0 "" "g") ++ (call (match_operand:SI 1 "ever_good" "g") ++ (match_operand:SI 2 "ever_good" "g")))] ++ "" ++ "call %1") ++ ++(define_insn "nop" ++ [(const_int 0)] ++ "" ++ "nop") ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/config/out-mu.c alliance/genview/src/gcc-1.42/config/out-mu.c +--- alliance-5.0/genview/src/gcc-1.42/config/out-mu.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/config/out-mu.c 2002-09-30 18:20:29.000000000 +0200 +@@ -0,0 +1,157 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* ++ * Description de la machine virtuelle ++ * ++ * Ecrit par Arnaud COMPAN & Francois PECHEUX ** avril-juin 1990 ++ * Avec quelques modifications par Frederic Petrot. ++ */ ++ ++#ifndef FILE ++#include ++#endif ++ ++#define AT_SP(mode) (gen_rtx (MEM, (mode), stack_pointer_rtx)) ++#define AT_BP(mode) (gen_rtx (MEM, (mode), frame_pointer_rtx)) ++ ++#define RET return "" ++ ++#define RETCOM(X) return "" ++ ++extern FILE *asm_out_file; ++static char *singlemove_string (); ++static void output_movf (); ++static void replace_float_constant (); ++static int mentions_fp_top (); ++static int call_top_dead_p (); ++static int fp_top_dead_p1 (); ++static rtx via_memory (); ++static void output_asm_insn_double_reg_op (); ++ ++#define PRINT_REG(X, CODE, FILE) fprintf (FILE, "%s", reg_name[REGNO (X)]) ++ ++notice_update_cc(exp) ++rtx exp; ++{ ++ if (GET_CODE (exp) == SET) { ++ if (SET_DEST (exp) == pc_rtx) ++ return; ++ if (REG_P (SET_DEST (exp)) ++ && (REG_P (SET_SRC (exp)) || GET_CODE (SET_SRC (exp)) == MEM)) { ++ if (cc_status.value1 ++ && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value1)) ++ cc_status.value1 = 0; ++ if (cc_status.value2 ++ && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value2)) ++ cc_status.value2 = 0; ++ return; ++ } ++ if (GET_CODE (SET_DEST (exp)) == MEM && REG_P (SET_SRC (exp))) { ++ if (cc_status.value1 && GET_CODE (cc_status.value1) == MEM) ++ cc_status.value1 = 0; ++ if (cc_status.value2 && GET_CODE (cc_status.value2) == MEM) ++ cc_status.value2 = 0; ++ return; ++ } else if (GET_CODE (SET_SRC (exp)) == CALL) { ++ CC_STATUS_INIT; ++ return; ++ } else if (SET_DEST (exp) == cc0_rtx) { ++ CC_STATUS_INIT; ++ cc_status.value1 = SET_SRC (exp); ++ return; ++ } else if (GET_MODE (SET_SRC (exp)) == SImode) ++ switch (GET_CODE (SET_SRC (exp))) { ++ case ASHIFTRT: ++ case LSHIFTRT: ++ case ASHIFT: ++ case LSHIFT: ++ if (GET_CODE (XEXP (SET_SRC (exp), 1)) != CONST_INT) { ++ CC_STATUS_INIT; ++ break; ++ } ++ case PLUS: ++ case MINUS: ++ case NEG: ++ case AND: ++ case IOR: ++ case XOR: ++ cc_status.flags = CC_NO_OVERFLOW; ++ cc_status.value1 = SET_SRC (exp); ++ cc_status.value2 = SET_DEST (exp); ++ break; ++ default: ++ CC_STATUS_INIT; ++ } ++ else ++ CC_STATUS_INIT; ++ } else if (GET_CODE (exp) == PARALLEL ++ && GET_CODE (XVECEXP (exp, 0, 0)) == SET) { ++ if (SET_DEST (XVECEXP (exp, 0, 0)) == pc_rtx) ++ return; ++ if (SET_DEST (XVECEXP (exp, 0, 0)) == cc0_rtx) { ++ CC_STATUS_INIT; ++ cc_status.value1 = SET_SRC (XVECEXP (exp, 0, 0)); ++ return; ++ } ++ CC_STATUS_INIT; ++ } else ++ CC_STATUS_INIT; ++} ++ ++output_ascii(file, p, size) ++FILE *file; ++char *p; ++int size; ++{ ++int i; ++ ++ fprintf (file, "\t.string \""); ++ for (i = 0; i < size; i++) { ++ register int c = p[i]; ++ if (c == '\"' || c == '\\') ++ putc ('\\', file); ++ if (c >= ' ' && c < 0177) ++ putc (c, file); ++ else { ++ fprintf (file, "\\%03o", c); ++ if (i < size - 1 && p[i + 1] >= '0' && p[i + 1] <= '9') ++ fprintf (file, "\"\n\tstring \""); ++ } ++ } ++ fprintf (file, "\"\n"); ++} ++ ++int ever_good(op, mode) ++register rtx op; ++enum machine_mode mode; ++{ ++ return 1; ++} ++ ++int no_good(op, mode) ++register rtx op; ++enum machine_mode mode; ++{ ++ return 0; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/config/tm-mu.h alliance/genview/src/gcc-1.42/config/tm-mu.h +--- alliance-5.0/genview/src/gcc-1.42/config/tm-mu.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/config/tm-mu.h 2002-09-30 18:20:30.000000000 +0200 +@@ -0,0 +1,494 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* ++ * Description de la machine virtuelle ++ * ++ * Ecrit par Arnaud COMPAN & Francois PECHEUX ** avril-juin 1990 ++ * ++ */ ++ ++#define DBX_DEBUGGING_INFO ++ ++#ifdef MY_SUN ++#define CPP_PREDEFINES "-Dsun -Dunix" ++#endif ++ ++#ifdef MY_VAX ++#define CPP_PREDEFINES "-Dvax -Dunix" ++#endif ++ ++extern int target_flags; ++ ++#define TARGET_DEFAULT 1 ++#define TARGET_SWITCHES {{ "", TARGET_DEFAULT}} ++ ++#define BITS_BIG_ENDIAN ++#define BYTES_BIG_ENDIAN ++#define BITS_PER_UNIT 8 ++#define BITS_PER_WORD 32 ++#define UNITS_PER_WORD 4 ++#define POINTER_SIZE 32 ++#define POINTER_BOUNDARY 32 ++#define PARM_BOUNDARY 32 ++#define STACK_BOUNDARY 32 ++#define FUNCTION_BOUNDARY 32 ++#define BIGGEST_ALIGNMENT 32 ++#define EMPTY_FIELD_BOUNDARY 32 ++#define STRUCTURE_SIZE_BOUNDARY 32 ++#define STRICT_ALIGNMENT ++ ++#define MAX_FIXED_MODE_SIZE BITS_PER_WORD ++ ++#define FIRST_PSEUDO_REGISTER 32 ++ ++#define FIXED_REGISTERS \ ++ { \ ++ 0, 0, 0, 0, 0, 0, 0, 0, \ ++ 0, 0, 0, 0, 0, 0, 0, 0, \ ++ 0, 0, 0, 0, 0, 0, 0, 0, \ ++ 0, 0, 0, 0, 0, 0, 0, 1 \ ++ } ++ ++#define CALL_USED_REGISTERS \ ++ { \ ++ 1, 1, 1, 1, 1, 1, 1, 1, \ ++ 0, 0, 0, 0, 0, 0, 0, 0, \ ++ 0, 0, 0, 0, 0, 0, 0, 0, \ ++ 0, 1, 0, 0, 1, 1, 0, 1 \ ++ } ++ ++#define HARD_REGNO_NREGS(REGNO, MODE) \ ++ ((GET_MODE_SIZE(MODE) + UNITS_PER_WORD -1) / UNITS_PER_WORD) ++ ++#define HARD_REGNO_MODE_OK(REGNO, MODE) 1 ++ ++#define MODES_TIEABLE_P(MODE1, MODE2) ( (MODE1) == (MODE2) ) ++ ++#define STACK_POINTER_REGNUM 31 ++#define FRAME_POINTER_REGNUM 30 ++#define FRAME_POINTER_REQUIRED 0 ++#define ARG_POINTER_REGNUM 30 ++#define STATIC_CHAIN_REGNUM 29 ++#define STRUCT_VALUE_REGNUM 28 ++ ++enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES }; ++#define N_REG_CLASSES (int) LIM_REG_CLASSES ++#define GENERAL_REGS ALL_REGS ++#define REG_CLASS_NAMES {"NO_REGS", "ALL_REGS" } ++#define REG_CLASS_CONTENTS {0, -1} ++#define REGNO_REG_CLASS(REGNO) ALL_REGS ++#define INDEX_REG_CLASS ALL_REGS ++#define BASE_REG_CLASS ALL_REGS ++#define REG_CLASS_FROM_LETTER(C) NO_REGS ++#define REGNO_OK_FOR_INDEX_P(REGNO) \ ++ ((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32) ++#define REGNO_OK_FOR_BASE_P(REGNO) \ ++ ((REGNO) < 32 || (unsigned) reg_renumber[REGNO] < 32) ++#define PREFERRED_RELOAD_CLASS(X,CLASS) (CLASS) ++#define CLASS_MAX_NREGS(CLASS, MODE) \ ++ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) ++#define CONST_OK_FOR_LETTER_P(VALUE, C) (0) ++#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) (0) ++ ++#define STACK_GROWS_DOWNWARD 1 ++#define FRAME_GROWS_DOWNWARD 1 ++ ++#define FIRST_PARM_OFFSET(FNDECL) (8) ++#define RETURN_POPS_ARGS(FUNTYPE) (0) ++ ++#define FUNCTION_VALUE(VALTYPE, FUNC) \ ++ gen_rtx (REG, TYPE_MODE (VALTYPE), 25) ++#define LIBCALL_VALUE(MODE) gen_rtx (REG, MODE, 25) ++#define FUNCTION_VALUE_REGNO_P(N) ((N)==25) ++#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) (0) ++#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) 0 ++#define CUMULATIVE_ARGS int ++#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE) ((CUM) = 0) ++#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ ++ ((CUM) += ((MODE) != BLKmode \ ++ ? (GET_MODE_SIZE (MODE) + 3) / 4 \ ++ : (int_size_in_bytes (TYPE) + 3) / 4)) ++#define FUNCTION_ARG_REGNO_P(N) (0) ++ ++#define FUNCTION_PROLOGUE(FILE, SIZE) \ ++{ \ ++extern char call_used_regs[]; \ ++int i; \ ++ \ ++ fprintf(FILE, "\tsub.si d31,d31,#4\n"); \ ++ fprintf(FILE, "\tmov.si (d31),d30\n"); \ ++ fprintf(FILE, "\tmov.si d30,d31\n"); \ ++ if (SIZE != 0) \ ++ fprintf(FILE, "\tsub.si d31,d31,#%d\n",SIZE); \ ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \ ++ if (regs_ever_live[i] && !call_used_regs[i] && \ ++ i != FRAME_POINTER_REGNUM) { \ ++ fprintf(FILE, "\tsub.si d31,d31,#4\n"); \ ++ fprintf(FILE, "\tmov.si (d31),%s\n",reg_names[i]); \ ++ } \ ++} ++ ++#define FUNCTION_PROFILER(FILE, LABELNO) \ ++ fprintf(FILE,"\t; ----- Profiler\n") ; ++ ++#define EXIT_IGNORE_STACK 0 ++ ++#define FUNCTION_EPILOGUE(FILE, SIZE) \ ++{ \ ++extern char call_used_regs[]; \ ++int i; \ ++ \ ++ for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--) \ ++ if (regs_ever_live[i] && !call_used_regs[i] && \ ++ i!=FRAME_POINTER_REGNUM) { \ ++ fprintf(FILE, "\tmov.si %s,(d31)\n",reg_names[i]); \ ++ fprintf(FILE, "\tadd.si d31,d31,#4\n"); \ ++ } \ ++ if (SIZE != 0) \ ++ fprintf(FILE, "\tadd.si d31,d31,#%d\n", SIZE); \ ++ fprintf(FILE, "\tmov.si d30,(d31)\n"); \ ++ fprintf(FILE, "\tadd.si d31,d31,#4\n"); \ ++ fprintf(FILE, "\tret\n"); \ ++} ++ ++#define FIX_FRAME_POINTER_ADDRESS(ADDR,DEPTH) \ ++{ \ ++ puts("Ah que schisme dans FIX_FRAME_POINTER_ADDRESS"); \ ++ abort(); \ ++} ++ ++#define CONSTANT_ADDRESS_P(X) CONSTANT_P (X) ++ ++#define MAX_REGS_PER_ADDRESS 1 ++ ++#ifndef REG_OK_STRICT ++#define REG_OK_FOR_INDEX_P(X) (1) ++#define REG_OK_FOR_BASE_P(X) (1) ++#else ++#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X)) ++#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X)) ++#endif ++ ++#define REG_OK_FOR_P(X) (REG_OK_FOR_INDEX_P(X) || REG_OK_FOR_BASE_P(X)) ++ ++#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ ++{ \ ++ if (CONSTANT_ADDRESS_P(X)) \ ++ goto ADDR ; \ ++ else if (GET_CODE(X) == CONST_INT) \ ++ goto ADDR ; \ ++ else if (REG_P(X) && REG_OK_FOR_P(X)) \ ++ goto ADDR ; \ ++ else if (GET_CODE(X) == SYMBOL_REF) \ ++ goto ADDR ; \ ++ else if (GET_CODE(X) == PLUS) { \ ++ if (REG_P(XEXP(X,0)) && REG_OK_FOR_P(XEXP(X,0)) && \ ++ GET_CODE(XEXP(X,1))==CONST_INT) \ ++ goto ADDR ; \ ++ if (REG_P(XEXP(X,1)) && REG_OK_FOR_P(XEXP(X,1)) \ ++ && GET_CODE(XEXP(X,0))==CONST_INT) \ ++ goto ADDR ; \ ++ } \ ++} ++ ++#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) { } ++ ++#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) ++ ++#define LEGITIMATE_CONSTANT_P(X) (1) ++ ++#define CASE_VECTOR_MODE SImode ++#define CASE_TAKES_INDEX_RAW ++ ++/* #define CASE_VECTOR_PC_RELATIVE */ ++ ++#define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR ++ ++#define EASY_DIV_EXPR TRUNC_DIV_EXPR ++ ++#define DEFAULT_SIGNED_CHAR 1 ++ ++#define MOVE_MAX 4 ++ ++#define SLOW_BYTE_ACCESS 0 ++ ++#define SHIFT_COUNT_TRUNCATED ++ ++#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 ++ ++#define STORE_FLAG_VALUE 1 ++ ++#define Pmode SImode ++ ++#define FUNCTION_MODE SImode ++ ++#define NO_FUNCTION_CSE ++ ++#define CONST_COSTS(RTX,CODE) \ ++ case CONST_INT: \ ++ case CONST: \ ++ case LABEL_REF: \ ++ case SYMBOL_REF: \ ++ case CONST_DOUBLE: \ ++ case PLUS: \ ++ return 1; ++ ++#define CC_IN_FCCR 04000 ++ ++#define NOTICE_UPDATE_CC(EXP, INSN) notice_update_cc((EXP)) ++ ++#define TEXT_SECTION_ASM_OP "\n\t.text" ++#define DATA_SECTION_ASM_OP "\n\t.data" ++#define ASM_APP_ON "" ++#define ASM_APP_OFF "" ++ ++#define ASM_FILE_START(FILE) \ ++ do { \ ++ extern char *version_string, *language_string; \ ++ { \ ++ int len = strlen(dump_base_name); \ ++ char *na = dump_base_name + len; \ ++ char shorter[15]; \ ++ while (na > dump_base_name) { \ ++ if (na[-1] == '/') \ ++ break; \ ++ na--; \ ++ } \ ++ strncpy (shorter, na, 14); \ ++ shorter[14] = '\0'; \ ++ fprintf(FILE, "\t.file\t\"%s\"\n", shorter); \ ++ } \ ++ fprintf(FILE, "\t.version\t\"%s %s\"\n", \ ++ language_string, version_string); \ ++ } while (0) ++ ++#define REGISTER_NAMES \ ++{ \ ++ "d0","d1","d2","d3","d4","d5","d6","d7","d8","d9", \ ++ "d10","d11","d12","d13","d14","d15","d16","d17","d18","d19", \ ++ "d20","d21","d22","d23","d24","d25","d26","d27","d28","d29", \ ++ "d30","d31" \ ++} ++ ++#define DBX_REGISTER_NUMBER(REGNO) (REGNO) ++ ++#define ASM_OUTPUT_LABEL(FILE,NAME) \ ++ (assemble_name(FILE, NAME), fputs (":\n", FILE)) ++ ++#define ASM_GLOBALIZE_LABEL(FILE,NAME) \ ++{ \ ++ fputs("\t.global\t", FILE); \ ++ assemble_name(FILE, NAME); \ ++ fputs("\n", FILE); \ ++} ++ ++#define ASM_OUTPUT_LABELREF(FILE,NAME) \ ++ fprintf(FILE, "_%s", NAME) ++ ++#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ ++ fprintf(FILE, ".%s%d:\n", PREFIX, NUM) ++ ++#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ ++ sprintf(LABEL, "*#.%s%d", PREFIX, NUM) ++ ++#define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ ++ fprintf(FILE, "\t.double %.20e\n", (VALUE)) ++ ++#define ASM_OUTPUT_FLOAT(FILE,VALUE) \ ++ fprintf(FILE, "\t.float %.12e\n", (VALUE)) ++ ++#define ASM_OUTPUT_INT(FILE,VALUE) \ ++( fprintf(FILE, "\t.int "), \ ++ output_addr_const(FILE, (VALUE)), \ ++ fprintf(FILE, "\n") \ ++) ++ ++#define ASM_OUTPUT_SHORT(FILE,VALUE) \ ++( fprintf(FILE, "\t.short "), \ ++ output_addr_const(FILE, (VALUE)), \ ++ fprintf(FILE, "\n") \ ++) ++ ++#define ASM_OUTPUT_CHAR(FILE,VALUE) \ ++( fprintf(FILE, "\t.char "), \ ++ output_addr_const(FILE, (VALUE)), \ ++ fprintf(FILE, "\n") \ ++) ++ ++#define ASM_OUTPUT_BYTE(FILE,VALUE) \ ++ fprintf(FILE, "\t.byte 0x%x\n", (VALUE)) ++ ++#define ASM_OUTPUT_ASCII(FILE, P, SIZE) output_ascii(FILE, P, SIZE) ++ ++#define ASM_OUTPUT_ADDR_VEC_PROLOGUE(FILE, MODE, LEN) \ ++ fprintf(FILE, "\tjmp r1\n"); ++ ++#define ASM_OUTPUT_REG_PUSH(FILE,REGNO) \ ++ fprintf(FILE, "push \n", \ ++ ((REGNO) < 32 ? "" : "f"), reg_names[REGNO]) ++ ++#define ASM_OUTPUT_REG_POP(FILE,REGNO) \ ++ fprintf(FILE, "pop \n", \ ++ ((REGNO) < 32 ? "" : "f"), reg_names[REGNO]) ++ ++#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ ++ fprintf(FILE, "\t.L%d\n", VALUE) ++ ++#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \ ++ fprintf(FILE, "\tword .L%d-.L%d\n", VALUE, REL) ++ ++#define ASM_OUTPUT_ALIGN(FILE,LOG) \ ++ if ((LOG) != 0) \ ++ fprintf (FILE, "\t.align %d\n", 1<<(LOG)) ++ ++#define ASM_OUTPUT_SKIP(FILE,SIZE) \ ++ fprintf(FILE, "\t.skip %d\n", (SIZE)) ++ ++#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \ ++( fputs ("\t.comm ", (FILE)), \ ++ assemble_name ((FILE), (NAME)), \ ++ fprintf ((FILE), ",%d\n", (ROUNDED)) \ ++) ++ ++#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \ ++( fprintf ((FILE), "\t.data\n"), \ ++ fprintf ((FILE), "\t.align %d\n", (SIZE) <= 4 ? 4 : 8), \ ++ assemble_name ((FILE), (NAME)), \ ++ fprintf ((FILE), ":\n\t.skip %d\n", (ROUNDED)), \ ++ fprintf ((FILE), "\t.text\n") \ ++) ++ ++#define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \ ++( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10), \ ++ sprintf ((OUTPUT), "%s_%d", (NAME), (LABELNO)) \ ++) ++ ++#define ASM_OPEN_PAREN "(" ++#define ASM_CLOSE_PAREN ")" ++ ++/* Define results of standard character escape sequences. */ ++#define TARGET_BELL 007 ++#define TARGET_BS 010 ++#define TARGET_TAB 011 ++#define TARGET_NEWLINE 012 ++#define TARGET_VT 013 ++#define TARGET_FF 014 ++#define TARGET_CR 015 ++ ++#define PRINT_OPERAND(FILE, X, CODE) \ ++{ \ ++ /* fprintf(FILE,"'%d'",GET_CODE(X)) ; */ \ ++ if (GET_CODE (X) == REG) \ ++ fprintf (FILE, "%s", reg_names[REGNO (X)]); \ ++ else if (GET_CODE (X) == MEM) \ ++ output_address (XEXP (X, 0)); \ ++ else if (GET_CODE (X) == SYMBOL_REF) \ ++ output_addr_const (FILE, X); \ ++ else if (GET_CODE (X) == LABEL_REF) \ ++ output_addr_const (FILE, X); \ ++ else if (GET_CODE (X) == CONST) \ ++ { \ ++ fprintf(FILE,"$") ; \ ++ output_addr_const (FILE, XEXP(X,0)); \ ++ } \ ++ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode) \ ++ { \ ++ union { double d; int i[2]; } u; \ ++ union { float f; int i; } u1; \ ++ u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \ ++ u1.f = u.d; \ ++ if (CODE == 'f') \ ++ fprintf (FILE, "#%f", u1.f); \ ++ else \ ++ fprintf (FILE, "#%x", u1.i); \ ++ } \ ++ else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != DImode) \ ++ { \ ++ union { double d; int i[2]; } u; \ ++ u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \ ++ fprintf (FILE, "#%f", u.d); \ ++ } \ ++ else if (GET_CODE(X) == CONST_INT) \ ++ { \ ++ fprintf(FILE,"#") ; \ ++ output_addr_const (FILE, X); \ ++ } \ ++ else if (GET_CODE(X) == PLUS) \ ++ { \ ++ if (GET_CODE(XEXP(X,0)) == CONST_INT) \ ++ output_addr_const (FILE, XEXP(X,0)); \ ++ if (GET_CODE(XEXP(X,1)) == CONST_INT) \ ++ output_addr_const (FILE, XEXP(X,1)); \ ++ if (GET_CODE(XEXP(X,0)) == REG) \ ++ fprintf (FILE, "(%s)", reg_names[REGNO (XEXP(X,0))]); \ ++ if (GET_CODE(XEXP(X,1)) == REG) \ ++ fprintf (FILE, "(%s)", reg_names[REGNO (XEXP(X,1))]); \ ++ } \ ++ else \ ++ fprintf(FILE, "*print_operand %d*",GET_CODE(X)) ; \ ++} ++ ++#define PRINT_OPERAND_ADDRESS(FILE, ADDR) \ ++{ \ ++ switch (GET_CODE (ADDR)) \ ++ { \ ++ case REG: \ ++ fprintf (FILE, "(%s)", reg_names[REGNO (ADDR)]); \ ++ break; \ ++ case MEM: \ ++ output_address (XEXP (ADDR, 0)); \ ++ break; \ ++ case CONST_INT: \ ++ fprintf(FILE,"#") ; \ ++ output_addr_const (FILE, ADDR); \ ++ break; \ ++ case SYMBOL_REF: \ ++ fprintf(FILE,"$") ; \ ++ output_addr_const (FILE, ADDR); \ ++ break; \ ++ case CONST: /* on suppose que c'est une addition */ \ ++ fprintf(FILE,"$") ; \ ++ output_addr_const (FILE, XEXP(ADDR,0)); \ ++ break ; \ ++ case PLUS: \ ++ if (GET_CODE(XEXP(ADDR,0)) == CONST_INT) \ ++ output_addr_const (FILE, XEXP(ADDR,0)); \ ++ if (GET_CODE(XEXP(ADDR,1)) == CONST_INT) \ ++ output_addr_const (FILE, XEXP(ADDR,1)); \ ++ if (GET_CODE(XEXP(ADDR,0)) == REG) \ ++ fprintf (FILE, "(%s)", reg_names[REGNO (XEXP(ADDR,0))]); \ ++ if (GET_CODE(XEXP(ADDR,1)) == REG) \ ++ fprintf (FILE, "(%s)", reg_names[REGNO (XEXP(ADDR,1))]); \ ++ break; \ ++ default: \ ++ fprintf (FILE, "*print_operand_address %d*",GET_CODE(ADDR)); \ ++ break; \ ++ } \ ++} ++ ++#define SFVALUE float ++#define INTIFY(FLOATVAL) FLOATVAL ++ ++#define ASM_OPERAND_LETTER '#' ++#define STARTING_FRAME_OFFSET 0 +diff -Naur alliance-5.0/genview/src/gcc-1.42/config/xm-mu.h alliance/genview/src/gcc-1.42/config/xm-mu.h +--- alliance-5.0/genview/src/gcc-1.42/config/xm-mu.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/config/xm-mu.h 2002-09-30 18:20:30.000000000 +0200 +@@ -0,0 +1,59 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* ++ * Description de la machine virtuelle ++ * ++ * Ecrit par Arnaud COMPAN & Francois PECHEUX ** avril-juin 1990 ++ * ++ */ ++ ++#define MY_SUN ++ ++#define FALSE 0 ++#define TRUE 1 ++ ++#define HOST_BITS_PER_CHAR 8 ++#define HOST_BITS_PER_SHORT 16 ++#define HOST_BITS_PER_INT 32 ++#define HOST_BITS_PER_LONG 32 ++ ++#define SUCCESS_EXIT_CODE 0 ++#define FATAL_EXIT_CODE 33 ++ ++#ifdef MY_SUN ++#define USG ++#endif ++ ++#include "tm.h" ++ ++#ifdef MY_SUN ++#define bcopy(a,b,c) memcpy (b,a,c) ++#define bzero(a,b) memset (a,0,b) ++#define bcmp(a,b,c) memcmp (a,b,c) ++#endif ++ ++#ifdef __GNUC__ ++#define alloca(n) __builtin_alloca(n) ++#endif ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/config.gcc alliance/genview/src/gcc-1.42/config.gcc +--- alliance-5.0/genview/src/gcc-1.42/config.gcc 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/config.gcc 2002-04-11 09:14:42.000000000 +0200 +@@ -0,0 +1,440 @@ ++#!/bin/sh ++# Configuration script for GNU CC ++# Copyright (C) 1988 Free Software Foundation, Inc. ++ ++#This file is part of GNU CC. ++ ++#GNU CC is free software; you can redistribute it and/or modify ++#it under the terms of the GNU General Public License as published by ++#the Free Software Foundation; either version 1, or (at your option) ++#any later version. ++ ++#GNU CC is distributed in the hope that it will be useful, ++#but WITHOUT ANY WARRANTY; without even the implied warranty of ++#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++#GNU General Public License for more details. ++ ++#You should have received a copy of the GNU General Public License ++#along with GNU CC; see the file COPYING. If not, write to ++#the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++# ++# Shell script to create proper links to machine-dependent files in ++# preparation for compiling gcc. ++# ++# Usage: config.gcc [vint] [-srcdir=DIR] machine ++# ++# If config.gcc succeeds, it leaves its status in config.status. ++# If config.gcc fails after disturbing the status quo, ++# config.status is removed. ++# ++ ++progname=$0 ++ ++remove=rm ++hard_link=ln ++symbolic_link='ln -s' ++ ++#for Test ++#remove="echo rm" ++#hard_link="echo ln" ++#symbolic_link="echo ln -s" ++ ++for arg in $*; ++do ++ case $arg in ++ -srcdir=*) ++ srcdir=`echo $arg | sed s/-srcdir=//` ++ ;; ++ -vint) ++ vint=on ++ ;; ++ *) ++ machine=$arg ++ ;; ++ esac ++done ++ ++# Find the source files, if location was not specified. ++if [ x$srcdir = x ] ++then ++ srcdirdefaulted=1 ++ srcdir=. ++ if [ ! -r tree.c ] ++ then ++ srcdir=.. ++ fi ++fi ++ ++if [ ! -r ${srcdir}/tree.c ] ++then ++ if [ x$srcdirdefaulted = x ] ++ then ++ echo "$progname: Can't find compiler sources in \`${srcdir}'." 1>&2 ++ else ++ echo "$progname: Can't find compiler sources in \`.' or \`..'." 1>&2 ++ fi ++ exit 1 ++fi ++ ++if [ x$machine != x ]; ++then ++ case $machine in ++ vax) # for vaxen running bsd ++ ;; ++ ultrix) # for vaxen running ultrix ++ cpu_type=vax ++ ;; ++ tahoe) # for tahoe's running bsd ++ ;; ++ harris) # for harris tahoe, using COFF. ++ cpu_type=tahoe ++ ;; ++ vms) # for vaxen running VMS ++ cpu_type=vax ++ configuration_file=xm-${machine}.h ++ target_machine=tm-${machine}.h ++ ;; ++ vax-sysv | vaxv) # for vaxen running system V ++ cpu_type=vax ++ configuration_file=xm-vaxv.h ++ target_machine=tm-vaxv.h ++ ;; ++ sequent-i386) # for Intel 80386's on Sequent Symmetry ++ cpu_type=i386 ++ configuration_file=xm-i386.h ++ target_machine=tm-seq386.h ++ ;; ++ fmtowns) ++ cpu_type=i386 ++ configuration_file=xm-i386.h ++ target_machine=tm-fmtowns.h ++ ;; ++ i386-mach) ++ cpu_type=i386 ++ configuration_file=xm-i386.h ++ target_machine=tm-i386gas.h ++ ;; ++ i386-sysv | i386v) # for Intel 80386's running system V ++ machine=i386v ++ cpu_type=i386 ++ configuration_file=xm-${machine}.h ++ ;; ++ i386-sysv4 | i386v4) # for Intel 80386's running system V.4 ++ machine=i386v4 ++ cpu_type=i386 ++ configuration_file=xm-i386v.h ++ ;; ++ i386-sysv-gas | i386g) ++ cpu_type=i386 ++ configuration_file=xm-i386v.h ++ target_machine=tm-i386vgas.h ++ ;; ++ i386-sco) # for Intel 80386's running SCO system ++ machine=i386sco ++ cpu_type=i386 ++ configuration_file=xm-i386v.h ++ ;; ++ i386-esix) # for Intel 80386's running ESIX system ++ machine=i386esix ++ cpu_type=i386 ++ configuration_file=xm-i386v.h ++ ;; ++ i386-isc) # for Intel 80386's running ISC ++ machine=i386isc ++ cpu_type=i386 ++ configuration_file=xm-i386v.h ++ ;; ++ i386-aix | ps2-aix | aix386 | ps2aix ) # for IBM PS/2 running AIX ++ machine=aix386 ++ cpu_type=i386 ++ configuration_file=xm-${machine}.h ++ ;; ++ i860) ++ ;; ++ i860-gas) ++ machine=i860 ++ target_machine=tm-i860g.h ++ ;; ++ next ) ++ cpu_type=m68k ++ target_machine=tm-next.h ++ ;; ++ sun4-os3 | sun-4-os3) ++ cpu_type=sparc ++ target_machine=tm-sun4os3.h ++ ;; ++ sun3-os3 | sun-3-os3) ++ cpu_type=m68k ++ target_machine=tm-sun3os3.h ++ ;; ++ sun3-nfp-os3 | sun-3-nfp-os3) ++ cpu_type=m68k ++ target_machine=tm-sun3os3nf.h ++ ;; ++ sun3-mach) ++ cpu_type=m68k ++ target_machine=tm-sun3mach.h ++ ;; ++ sun2 | sun-2 | sun2-os3 | sun-2-os3) ++ cpu_type=m68k ++ target_machine=tm-sun2.h ++ ;; ++ sun2-os4 | sun-2-os4) ++ cpu_type=m68k ++ target_machine=tm-sun2os4.h ++ ;; ++ sun386 | sun386i | roadrunner) ++ cpu_type=i386 ++ configuration_file=xm-sun386i.h ++ target_machine=tm-sun386i.h ++ ;; ++ sun4 | sun-4 | sun4-os4 | sun-4-os4) ++ cpu_type=sparc ++ target_machine=tm-sparc.h ++ ;; ++ sun3 | sun-3 | sun3-os4 | sun-3-os4) ++ cpu_type=m68k ++ target_machine=tm-sun3.h ++ ;; ++ sun3-nfp | sun-3-nfp | sun3-nfp-os4 | sun-3-nfp-os4) ++ cpu_type=m68k ++ target_machine=tm-sun3-nfp.h ++ ;; ++ sun2-os4 |sun-2-os4) ++ cpu_type=m68k ++ target_machine=tm-sun2.h ++ ;; ++ hp9k320) # HP 9000 series 300 with gcc alone ++ cpu_type=m68k ++ configuration_file=xm-hp9k320.h ++ ;; ++ hp9k320-old) # HP 9000 series 300 with gcc alone ++ cpu_type=m68k ++ target_machine=tm-hp9k32old.h ++ configuration_file=xm-hp9k320.h ++ ;; ++ hp9k320-gas | hp9k320g) # with gnu as, ld and gdb ++ cpu_type=m68k ++ configuration_file=xm-hp9k320.h ++ target_machine=tm-hp9k320g.h ++ ;; ++ hp9k320-bsd) # HP 9000/3xx running Berkeley Unix ++ cpu_type=m68k ++ target_machine=tm-hp9k3bsd.h ++ ;; ++ hp9k200-bsd) # HP 9000/2xx running Berkeley Unix ++ cpu_type=m68k ++ target_machine=tm-hp9k2bsd.h ++ ;; ++ isi68) ++ cpu_type=m68k ++ ;; ++ isi68-nfp) ++ cpu_type=m68k ++ ;; ++ news | news800) ++ configuration_file=xm-m68k.h ++ target_machine=tm-news.h ++ cpu_type=m68k ++ ;; ++ news-gas | news-g) ++ configuration_file=xm-m68k.h ++ target_machine=tm-newsgas.h ++ cpu_type=m68k ++ ;; ++ altos | altos3068) # Altos 3068 with gnu as, ld and gdb ++ cpu_type=m68k ++ configuration_file=xm-altos3068.h ++ target_machine=tm-altos3068.h ++ ;; ++ 3b1) ++ cpu_type=m68k ++ configuration_file=xm-${machine}.h ++ ;; ++ 3b1g | 3b1-gas) ++ machine=3b1g ++ cpu_type=m68k ++ configuration_file=xm-3b1.h ++ ;; ++ delta68k | motorola-3300 | delta) ++ cpu_type=m68k ++ configuration_file=xm-delta68k.h ++ target_machine=tm-delta68k.h ++ ;; ++ sequent-ns32k | sequent) ++ machine=sequent ++ cpu_type=ns32k ++ ;; ++ encore) ++ cpu_type=ns32k ++ ;; ++ genix) ++ target_machine=tm-genix.h ++ machine=ns32k ++ cpu_type=ns32k ++ configuration_file=xm-genix.h ++ ;; ++ 88000) ++ cpu_type=m88k ++ target_machine=tm-${cpu_type}.h ++ ;; ++ alliant) # Alliant FX/8 ++ ;; ++ convex-c1) # Convex C1 ++ if [ -r /usr/include/stdlib.h ] ++ then ++ target_machine=tm-convex1.h ++ else ++ target_machine=tm-conv1os7.h ++ fi ++ cpu_type=convex ++ ;; ++ convex-c2) # Convex C2 ++ if [ -r /usr/include/stdlib.h ] ++ then ++ target_machine=tm-convex2.h ++ else ++ target_machine=tm-conv2os7.h ++ fi ++ cpu_type=convex ++ ;; ++ iris) # Mostly like a MIPS. ++ cpu_type=mips ++ target_machine=tm-iris.h ++ configuration_file=xm-iris.h ++ ;; ++ mips) # Default MIPS environment ++ ;; ++ mips-os5) # SYSV variant of MIPS system. ++ cpu_type=mips ++ target_machine=tm-mips-5.h ++ ;; ++ mips-os4) # Default MIPS environment on RISC-OS 4.00 ++ cpu_type=mips ++ ;; ++ mips-sysv-os5) # SYSV variant of MIPS system, RISC-OS 5.00 ++ cpu_type=mips ++ target_machine=tm-mips-5s.h ++ configuration_file=xm-umips.h ++ ;; ++ mips-bsd43-os5) # BSD 4.3 variant of MIPS system, RISC-OS 5.00 ++ cpu_type=mips ++ target_machine=tm-mips-5b.h ++ ;; ++ mips-sysv | mips-sysv-os4) # SYSV variant of MIPS system, RISC-OS 4.00 ++ cpu_type=mips ++ target_machine=tm-mips-sysv.h ++ configuration_file=xm-umips.h ++ ;; ++ mips-bsd43 | mips-bsd43-os4) # BSD 4.3 variant of MIPS system, RISC-OS 4.00 ++ cpu_type=mips ++ target_machine=tm-mips-bsd.h ++ ;; ++ mips-news | news-3600 | risc-news) # Sony NEWS 3600 or risc/news. ++ cpu_type=mips ++ target_machine=tm-mips-news.h ++ ;; ++ dec-3100 | decstation) # Decstation or pmax. ++ cpu_type=mips ++ target_machine=tm-decstatn.h ++ ;; ++ apollo68) ++ cpu_type=m68k ++ ;; ++ tower) # NCR Tower 32 SVR3. as with sdb debugging. ++ cpu_type=m68k ++ target_machine=tm-tower-as.h ++ configuration_file=xm-tower.h ++ ;; ++ pyr | pyramid) ++ machine=pyr ++ ;; ++# 370) ++# machine=370 ++# ;; ++ esac ++ ++ # if cpu_type is not set, define cpu_type to machine. ++ # ++ cpu_type=${cpu_type-$machine} ++ configuration_file=${configuration_file-xm-$cpu_type.h} ++ target_machine=${target_machine-tm-$machine.h} ++ machine_description=${cpu_type}.md ++ aux_output=${aux_output-out-$cpu_type.c} ++ ++ if [ xx${vint} = xx ] ++ then ++ files="$configuration_file $target_machine ++ $machine_description $aux_output" ++ links="config.h tm.h md aux-output.c" ++ else ++ files="$configuration_file tm-vmc.h $target_machine ++ $machine_description $aux_output" ++ links="config.h tm.h tm-pre.h md aux-output.c" ++ fi ++ ++ while [ -n "$files" ] ++ do ++ # set file to car of files, files to cdr of files ++ set $files; file=$1; shift; files=$* ++ set $links; link=$1; shift; links=$* ++ ++ if [ ! -r ${srcdir}/config/$file ] ++ then ++ echo "$progname: cannot create a link \`$link'," 1>&2 ++ echo "since the file \`config/$file' does not exist." 1>&2 ++ exit 1 ++ fi ++ ++ $remove -f $link ++ rm -f config.status ++ # Make a symlink if possible, otherwise try a hard link ++ $symbolic_link ${srcdir}/config/$file $link 2>/dev/null || $hard_link ${srcdir}/config/$file $link ++ ++ if [ ! -r $link ] ++ then ++ echo "$progname: unable to link \`$link' to \`${srcdir}/config/$file'." 1>&2 ++ exit 1 ++ fi ++ echo "Linked \`$link' to \`${srcdir}/config/$file'." ++ done ++ ++ if [ xx${vint} = xx ] ++ then ++ echo "Links are now set up for use with a $machine." \ ++ | tee config.status ++ else ++ echo "Links are now set up for use with a $machine (vint)." \ ++ | tee config.status ++ fi ++ ++ # Install a makefile, and make it set VPATH ++ # if necessary so that the sources are found. ++ # Also change its value of srcdir. ++ # Also create a .gdbinit file which runs the one in srcdir ++ # and tells GDB to look there for source files. ++ case $srcdir in ++ .) ++ ;; ++ *) ++ echo "VPATH = ${srcdir}" > x ++ cat x ${srcdir}/Makefile | sed "s@^srcdir = \.@srcdir = ${srcdir}@" > Makefile ++ rm x ++ echo "dir ." > .gdbinit ++ echo "dir ${srcdir}" >> .gdbinit ++ echo "source ${srcdir}/.gdbinit" >> .gdbinit ++ ;; ++ esac ++ ++ exit 0 ++else ++ echo "Usage: $progname machine" ++ echo -n "Where \`machine' is something like " ++ echo "\`vax', \`sun3', \`encore', etc." ++ if [ -r config.status ] ++ then ++ cat config.status ++ fi ++ exit 1 ++fi +diff -Naur alliance-5.0/genview/src/gcc-1.42/config-gcc.com alliance/genview/src/gcc-1.42/config-gcc.com +--- alliance-5.0/genview/src/gcc-1.42/config-gcc.com 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/config-gcc.com 2002-04-11 09:14:42.000000000 +0200 +@@ -0,0 +1,26 @@ ++$ ! ++$ ! Set up to compile GCC on VMS ++$ ! ++$ echo = "write sys$output" ++$ ! ++$ if f$search("config.h") .nes. "" then delete config.h.* ++$ copy [.config]xm-vms.h []config.h ++$ echo "Linked `config.h' to `[.config]xm-vms.h'. ++$ ! ++$ if f$search("tm.h") .nes. "" then delete tm.h.* ++$ copy [.config]tm-vms.h []tm.h ++$ echo "Linked `tm.h' to `[.config]tm-vms.h'. ++$ ! ++$ if f$search("md.") .nes. "" then delete md..* ++$ copy [.config]vax.md []md. ++$ echo "Linked `md' to `[.config]vax.md'. ++$ ! ++$ if f$search("aux-output.c") .nes. "" then delete aux-output.c.* ++$ copy [.config]out-vax.c []aux-output.c ++$ echo "Linked `aux-output.c' to `[.config]out-vax.c'. ++$ ! ++$ if f$search("config.status") .nes. "" then delete config.status.* ++$ open/write file config.status ++$ write file "Links are now set up for use with a vax running VMS." ++$ close file ++$ type config.status +diff -Naur alliance-5.0/genview/src/gcc-1.42/config.h alliance/genview/src/gcc-1.42/config.h +--- alliance-5.0/genview/src/gcc-1.42/config.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/config.h 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,59 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* ++ * Description de la machine virtuelle ++ * ++ * Ecrit par Arnaud COMPAN & Francois PECHEUX ** avril-juin 1990 ++ * ++ */ ++ ++#define MY_SUN ++ ++#define FALSE 0 ++#define TRUE 1 ++ ++#define HOST_BITS_PER_CHAR 8 ++#define HOST_BITS_PER_SHORT 16 ++#define HOST_BITS_PER_INT 32 ++#define HOST_BITS_PER_LONG 32 ++ ++#define SUCCESS_EXIT_CODE 0 ++#define FATAL_EXIT_CODE 33 ++ ++#ifdef MY_SUN ++#define USG ++#endif ++ ++#include "tm.h" ++ ++#ifdef MY_SUN ++#define bcopy(a,b,c) memcpy (b,a,c) ++#define bzero(a,b) memset (a,0,b) ++#define bcmp(a,b,c) memcmp (a,b,c) ++#endif ++ ++#ifdef __GNUC__ ++#define alloca(n) __builtin_alloca(n) ++#endif ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/config.status alliance/genview/src/gcc-1.42/config.status +--- alliance-5.0/genview/src/gcc-1.42/config.status 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/config.status 2002-04-11 09:14:42.000000000 +0200 +@@ -0,0 +1 @@ ++Links are now set up for use with a mu. +diff -Naur alliance-5.0/genview/src/gcc-1.42/COPYING alliance/genview/src/gcc-1.42/COPYING +--- alliance-5.0/genview/src/gcc-1.42/COPYING 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/COPYING 2002-04-11 09:14:40.000000000 +0200 +@@ -0,0 +1,249 @@ ++ ++ GNU GENERAL PUBLIC LICENSE ++ Version 1, February 1989 ++ ++ Copyright (C) 1989 Free Software Foundation, Inc. ++ 675 Mass Ave, Cambridge, MA 02139, USA ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The license agreements of most software companies try to keep users ++at the mercy of those companies. By contrast, our General Public ++License is intended to guarantee your freedom to share and change free ++software--to make sure the software is free for all its users. The ++General Public License applies to the Free Software Foundation's ++software and to any other program whose authors commit to using it. ++You can use it for your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Specifically, the General Public License is designed to make ++sure that you have the freedom to give away or sell copies of free ++software, that you receive source code or can get it if you want it, ++that you can change the software or use pieces of it in new free ++programs; and that you know you can do these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++anyone to deny you these rights or to ask you to surrender the rights. ++These restrictions translate to certain responsibilities for you if you ++distribute copies of the software, or if you modify it. ++ ++ For example, if you distribute copies of a such a program, whether ++gratis or for a fee, you must give the recipients all the rights that ++you have. You must make sure that they, too, receive or can get the ++source code. And you must tell them their rights. ++ ++ We protect your rights with two steps: (1) copyright the software, and ++(2) offer you this license which gives you legal permission to copy, ++distribute and/or modify the software. ++ ++ Also, for each author's protection and ours, we want to make certain ++that everyone understands that there is no warranty for this free ++software. If the software is modified by someone else and passed on, we ++want its recipients to know that what they have is not the original, so ++that any problems introduced by others will not reflect on the original ++authors' reputations. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ GNU GENERAL PUBLIC LICENSE ++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ++ ++ 0. This License Agreement applies to any program or other work which ++contains a notice placed by the copyright holder saying it may be ++distributed under the terms of this General Public License. The ++"Program", below, refers to any such program or work, and a "work based ++on the Program" means either the Program or any work containing the ++Program or a portion of it, either verbatim or with modifications. Each ++licensee is addressed as "you". ++ ++ 1. You may copy and distribute verbatim copies of the Program's source ++code as you receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice and ++disclaimer of warranty; keep intact all the notices that refer to this ++General Public License and to the absence of any warranty; and give any ++other recipients of the Program a copy of this General Public License ++along with the Program. You may charge a fee for the physical act of ++transferring a copy. ++ ++ 2. You may modify your copy or copies of the Program or any portion of ++it, and copy and distribute such modifications under the terms of Paragraph ++1 above, provided that you also do the following: ++ ++ a) cause the modified files to carry prominent notices stating that ++ you changed the files and the date of any change; and ++ ++ b) cause the whole of any work that you distribute or publish, that ++ in whole or in part contains the Program or any part thereof, either ++ with or without modifications, to be licensed at no charge to all ++ third parties under the terms of this General Public License (except ++ that you may choose to grant warranty protection to some or all ++ third parties, at your option). ++ ++ c) If the modified program normally reads commands interactively when ++ run, you must cause it, when started running for such interactive use ++ in the simplest and most usual way, to print or display an ++ announcement including an appropriate copyright notice and a notice ++ that there is no warranty (or else, saying that you provide a ++ warranty) and that users may redistribute the program under these ++ conditions, and telling the user how to view a copy of this General ++ Public License. ++ ++ d) You may charge a fee for the physical act of transferring a ++ copy, and you may at your option offer warranty protection in ++ exchange for a fee. ++ ++Mere aggregation of another independent work with the Program (or its ++derivative) on a volume of a storage or distribution medium does not bring ++the other work under the scope of these terms. ++ ++ 3. You may copy and distribute the Program (or a portion or derivative of ++it, under Paragraph 2) in object code or executable form under the terms of ++Paragraphs 1 and 2 above provided that you also do one of the following: ++ ++ a) accompany it with the complete corresponding machine-readable ++ source code, which must be distributed under the terms of ++ Paragraphs 1 and 2 above; or, ++ ++ b) accompany it with a written offer, valid for at least three ++ years, to give any third party free (except for a nominal charge ++ for the cost of distribution) a complete machine-readable copy of the ++ corresponding source code, to be distributed under the terms of ++ Paragraphs 1 and 2 above; or, ++ ++ c) accompany it with the information you received as to where the ++ corresponding source code may be obtained. (This alternative is ++ allowed only for noncommercial distribution and only if you ++ received the program in object code or executable form alone.) ++ ++Source code for a work means the preferred form of the work for making ++modifications to it. For an executable file, complete source code means ++all the source code for all modules it contains; but, as a special ++exception, it need not include source code for modules which are standard ++libraries that accompany the operating system on which the executable ++file runs, or for standard header files or definitions files that ++accompany that operating system. ++ ++ 4. You may not copy, modify, sublicense, distribute or transfer the ++Program except as expressly provided under this General Public License. ++Any attempt otherwise to copy, modify, sublicense, distribute or transfer ++the Program is void, and will automatically terminate your rights to use ++the Program under this License. However, parties who have received ++copies, or rights to use copies, from you under this General Public ++License will not have their licenses terminated so long as such parties ++remain in full compliance. ++ ++ 5. By copying, distributing or modifying the Program (or any work based ++on the Program) you indicate your acceptance of this license to do so, ++and all its terms and conditions. ++ ++ 6. Each time you redistribute the Program (or any work based on the ++Program), the recipient automatically receives a license from the original ++licensor to copy, distribute or modify the Program subject to these ++terms and conditions. You may not impose any further restrictions on the ++recipients' exercise of the rights granted herein. ++ ++ 7. The Free Software Foundation may publish revised and/or new versions ++of the General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++Each version is given a distinguishing version number. If the Program ++specifies a version number of the license which applies to it and "any ++later version", you have the option of following the terms and conditions ++either of that version or of any later version published by the Free ++Software Foundation. If the Program does not specify a version number of ++the license, you may choose any version ever published by the Free Software ++Foundation. ++ ++ 8. If you wish to incorporate parts of the Program into other free ++programs whose distribution conditions are different, write to the author ++to ask for permission. For software which is copyrighted by the Free ++Software Foundation, write to the Free Software Foundation; we sometimes ++make exceptions for this. Our decision will be guided by the two goals ++of preserving the free status of all derivatives of our free software and ++of promoting the sharing and reuse of software generally. ++ ++ NO WARRANTY ++ ++ 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY ++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN ++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES ++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED ++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS ++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, ++REPAIR OR CORRECTION. ++ ++ 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR ++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, ++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING ++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED ++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY ++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER ++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE ++POSSIBILITY OF SUCH DAMAGES. ++ ++ END OF TERMS AND CONDITIONS ++ ++ Appendix: How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to humanity, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these ++terms. ++ ++ To do so, attach the following notices to the program. It is safest to ++attach them to the start of each source file to most effectively convey ++the exclusion of warranty; and each file should have at least the ++"copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) 19yy ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 1, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++If the program is interactive, make it output a short notice like this ++when it starts in an interactive mode: ++ ++ Gnomovision version 69, Copyright (C) 19xx name of author ++ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the ++appropriate parts of the General Public License. Of course, the ++commands you use may be called something other than `show w' and `show ++c'; they could even be mouse-clicks or menu items--whatever suits your ++program. ++ ++You should also get your employer (if you work as a programmer) or your ++school, if any, to sign a "copyright disclaimer" for the program, if ++necessary. Here a sample; alter the names: ++ ++ Yoyodyne, Inc., hereby disclaims all copyright interest in the ++ program `Gnomovision' (a program to direct compilers to make passes ++ at assemblers) written by James Hacker. ++ ++ , 1 April 1989 ++ Ty Coon, President of Vice ++ ++That's all there is to it! +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-parse.gperf alliance/genview/src/gcc-1.42/c-parse.gperf +--- alliance-5.0/genview/src/gcc-1.42/c-parse.gperf 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-parse.gperf 2002-04-11 09:14:42.000000000 +0200 +@@ -0,0 +1,56 @@ ++%{ ++/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ ++%} ++struct resword { char *name; short token; enum rid rid; }; ++%% ++__alignof, ALIGNOF, NORID ++__alignof__, ALIGNOF, NORID ++__asm, ASM, NORID ++__asm__, ASM, NORID ++__attribute, ATTRIBUTE, NORID ++__attribute__, ATTRIBUTE, NORID ++__const, TYPE_QUAL, RID_CONST ++__const__, TYPE_QUAL, RID_CONST ++__inline, SCSPEC, RID_INLINE ++__inline__, SCSPEC, RID_INLINE ++__signed, TYPESPEC, RID_SIGNED ++__signed__, TYPESPEC, RID_SIGNED ++__typeof, TYPEOF, NORID ++__typeof__, TYPEOF, NORID ++__volatile, TYPE_QUAL, RID_VOLATILE ++__volatile__, TYPE_QUAL, RID_VOLATILE ++asm, ASM, NORID ++auto, SCSPEC, RID_AUTO ++break, BREAK, NORID ++case, CASE, NORID ++char, TYPESPEC, RID_CHAR ++const, TYPE_QUAL, RID_CONST ++continue, CONTINUE, NORID ++default, DEFAULT, NORID ++do, DO, NORID ++double, TYPESPEC, RID_DOUBLE ++else, ELSE, NORID ++enum, ENUM, NORID ++extern, SCSPEC, RID_EXTERN ++float, TYPESPEC, RID_FLOAT ++for, FOR, NORID ++goto, GOTO, NORID ++if, IF, NORID ++inline, SCSPEC, RID_INLINE ++int, TYPESPEC, RID_INT ++long, TYPESPEC, RID_LONG ++register, SCSPEC, RID_REGISTER ++return, RETURN, NORID ++short, TYPESPEC, RID_SHORT ++signed, TYPESPEC, RID_SIGNED ++sizeof, SIZEOF, NORID ++static, SCSPEC, RID_STATIC ++struct, STRUCT, NORID ++switch, SWITCH, NORID ++typedef, SCSPEC, RID_TYPEDEF ++typeof, TYPEOF, NORID ++union, UNION, NORID ++unsigned, TYPESPEC, RID_UNSIGNED ++void, TYPESPEC, RID_VOID ++volatile, TYPE_QUAL, RID_VOLATILE ++while, WHILE, NORID +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-parse.h alliance/genview/src/gcc-1.42/c-parse.h +--- alliance-5.0/genview/src/gcc-1.42/c-parse.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-parse.h 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,72 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Define constants for communication with parse.y. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++ ++enum rid ++{ ++ RID_UNUSED, ++ RID_INT, ++ RID_CHAR, ++ RID_FLOAT, ++ RID_DOUBLE, ++ RID_VOID, ++ RID_UNUSED1, ++ ++ RID_UNSIGNED, ++ RID_SHORT, ++ RID_LONG, ++ RID_AUTO, ++ RID_STATIC, ++ RID_EXTERN, ++ RID_REGISTER, ++ RID_TYPEDEF, ++ RID_SIGNED, ++ RID_CONST, ++ RID_VOLATILE, ++ RID_INLINE, ++ RID_NOALIAS, ++ ++ RID_MAX ++}; ++ ++#define RID_FIRST_MODIFIER RID_UNSIGNED +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-parse.output alliance/genview/src/gcc-1.42/c-parse.output +--- alliance-5.0/genview/src/gcc-1.42/c-parse.output 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-parse.output 2002-04-11 09:14:42.000000000 +0200 +@@ -0,0 +1,8620 @@ ++Conflict in state 172 between rule 160 and token '(' resolved as shift. ++Conflict in state 172 between rule 160 and token '[' resolved as shift. ++Conflict in state 220 between rule 71 and token ASSIGN resolved as shift. ++Conflict in state 220 between rule 71 and token '=' resolved as shift. ++Conflict in state 220 between rule 71 and token '?' resolved as shift. ++Conflict in state 220 between rule 71 and token OROR resolved as shift. ++Conflict in state 220 between rule 71 and token ANDAND resolved as shift. ++Conflict in state 220 between rule 71 and token '|' resolved as shift. ++Conflict in state 220 between rule 71 and token '^' resolved as shift. ++Conflict in state 220 between rule 71 and token '&' resolved as shift. ++Conflict in state 220 between rule 71 and token EQCOMPARE resolved as shift. ++Conflict in state 220 between rule 71 and token ARITHCOMPARE resolved as shift. ++Conflict in state 220 between rule 71 and token LSHIFT resolved as shift. ++Conflict in state 220 between rule 71 and token RSHIFT resolved as shift. ++Conflict in state 220 between rule 71 and token '+' resolved as shift. ++Conflict in state 220 between rule 71 and token '-' resolved as shift. ++Conflict in state 220 between rule 71 and token '*' resolved as shift. ++Conflict in state 220 between rule 71 and token '/' resolved as shift. ++Conflict in state 220 between rule 71 and token '%' resolved as shift. ++Conflict in state 221 between rule 70 and token ASSIGN resolved as shift. ++Conflict in state 221 between rule 70 and token '=' resolved as shift. ++Conflict in state 221 between rule 70 and token '?' resolved as shift. ++Conflict in state 221 between rule 70 and token OROR resolved as shift. ++Conflict in state 221 between rule 70 and token ANDAND resolved as shift. ++Conflict in state 221 between rule 70 and token '|' resolved as shift. ++Conflict in state 221 between rule 70 and token '^' resolved as shift. ++Conflict in state 221 between rule 70 and token '&' resolved as shift. ++Conflict in state 221 between rule 70 and token EQCOMPARE resolved as shift. ++Conflict in state 221 between rule 70 and token ARITHCOMPARE resolved as shift. ++Conflict in state 221 between rule 70 and token LSHIFT resolved as shift. ++Conflict in state 221 between rule 70 and token RSHIFT resolved as shift. ++Conflict in state 221 between rule 70 and token '+' resolved as shift. ++Conflict in state 221 between rule 70 and token '-' resolved as shift. ++Conflict in state 221 between rule 70 and token '*' resolved as shift. ++Conflict in state 221 between rule 70 and token '/' resolved as shift. ++Conflict in state 221 between rule 70 and token '%' resolved as shift. ++Conflict in state 224 between rule 68 and token ASSIGN resolved as reduce. ++Conflict in state 224 between rule 68 and token '=' resolved as reduce. ++Conflict in state 224 between rule 68 and token '?' resolved as reduce. ++Conflict in state 224 between rule 68 and token OROR resolved as reduce. ++Conflict in state 224 between rule 68 and token ANDAND resolved as shift. ++Conflict in state 224 between rule 68 and token '|' resolved as shift. ++Conflict in state 224 between rule 68 and token '^' resolved as shift. ++Conflict in state 224 between rule 68 and token '&' resolved as shift. ++Conflict in state 224 between rule 68 and token EQCOMPARE resolved as shift. ++Conflict in state 224 between rule 68 and token ARITHCOMPARE resolved as shift. ++Conflict in state 224 between rule 68 and token LSHIFT resolved as shift. ++Conflict in state 224 between rule 68 and token RSHIFT resolved as shift. ++Conflict in state 224 between rule 68 and token '+' resolved as shift. ++Conflict in state 224 between rule 68 and token '-' resolved as shift. ++Conflict in state 224 between rule 68 and token '*' resolved as shift. ++Conflict in state 224 between rule 68 and token '/' resolved as shift. ++Conflict in state 224 between rule 68 and token '%' resolved as shift. ++Conflict in state 225 between rule 67 and token ASSIGN resolved as reduce. ++Conflict in state 225 between rule 67 and token '=' resolved as reduce. ++Conflict in state 225 between rule 67 and token '?' resolved as reduce. ++Conflict in state 225 between rule 67 and token OROR resolved as reduce. ++Conflict in state 225 between rule 67 and token ANDAND resolved as reduce. ++Conflict in state 225 between rule 67 and token '|' resolved as shift. ++Conflict in state 225 between rule 67 and token '^' resolved as shift. ++Conflict in state 225 between rule 67 and token '&' resolved as shift. ++Conflict in state 225 between rule 67 and token EQCOMPARE resolved as shift. ++Conflict in state 225 between rule 67 and token ARITHCOMPARE resolved as shift. ++Conflict in state 225 between rule 67 and token LSHIFT resolved as shift. ++Conflict in state 225 between rule 67 and token RSHIFT resolved as shift. ++Conflict in state 225 between rule 67 and token '+' resolved as shift. ++Conflict in state 225 between rule 67 and token '-' resolved as shift. ++Conflict in state 225 between rule 67 and token '*' resolved as shift. ++Conflict in state 225 between rule 67 and token '/' resolved as shift. ++Conflict in state 225 between rule 67 and token '%' resolved as shift. ++Conflict in state 226 between rule 65 and token ASSIGN resolved as reduce. ++Conflict in state 226 between rule 65 and token '=' resolved as reduce. ++Conflict in state 226 between rule 65 and token '?' resolved as reduce. ++Conflict in state 226 between rule 65 and token OROR resolved as reduce. ++Conflict in state 226 between rule 65 and token ANDAND resolved as reduce. ++Conflict in state 226 between rule 65 and token '|' resolved as reduce. ++Conflict in state 226 between rule 65 and token '^' resolved as shift. ++Conflict in state 226 between rule 65 and token '&' resolved as shift. ++Conflict in state 226 between rule 65 and token EQCOMPARE resolved as shift. ++Conflict in state 226 between rule 65 and token ARITHCOMPARE resolved as shift. ++Conflict in state 226 between rule 65 and token LSHIFT resolved as shift. ++Conflict in state 226 between rule 65 and token RSHIFT resolved as shift. ++Conflict in state 226 between rule 65 and token '+' resolved as shift. ++Conflict in state 226 between rule 65 and token '-' resolved as shift. ++Conflict in state 226 between rule 65 and token '*' resolved as shift. ++Conflict in state 226 between rule 65 and token '/' resolved as shift. ++Conflict in state 226 between rule 65 and token '%' resolved as shift. ++Conflict in state 227 between rule 66 and token ASSIGN resolved as reduce. ++Conflict in state 227 between rule 66 and token '=' resolved as reduce. ++Conflict in state 227 between rule 66 and token '?' resolved as reduce. ++Conflict in state 227 between rule 66 and token OROR resolved as reduce. ++Conflict in state 227 between rule 66 and token ANDAND resolved as reduce. ++Conflict in state 227 between rule 66 and token '|' resolved as reduce. ++Conflict in state 227 between rule 66 and token '^' resolved as reduce. ++Conflict in state 227 between rule 66 and token '&' resolved as shift. ++Conflict in state 227 between rule 66 and token EQCOMPARE resolved as shift. ++Conflict in state 227 between rule 66 and token ARITHCOMPARE resolved as shift. ++Conflict in state 227 between rule 66 and token LSHIFT resolved as shift. ++Conflict in state 227 between rule 66 and token RSHIFT resolved as shift. ++Conflict in state 227 between rule 66 and token '+' resolved as shift. ++Conflict in state 227 between rule 66 and token '-' resolved as shift. ++Conflict in state 227 between rule 66 and token '*' resolved as shift. ++Conflict in state 227 between rule 66 and token '/' resolved as shift. ++Conflict in state 227 between rule 66 and token '%' resolved as shift. ++Conflict in state 228 between rule 64 and token ASSIGN resolved as reduce. ++Conflict in state 228 between rule 64 and token '=' resolved as reduce. ++Conflict in state 228 between rule 64 and token '?' resolved as reduce. ++Conflict in state 228 between rule 64 and token OROR resolved as reduce. ++Conflict in state 228 between rule 64 and token ANDAND resolved as reduce. ++Conflict in state 228 between rule 64 and token '|' resolved as reduce. ++Conflict in state 228 between rule 64 and token '^' resolved as reduce. ++Conflict in state 228 between rule 64 and token '&' resolved as reduce. ++Conflict in state 228 between rule 64 and token EQCOMPARE resolved as shift. ++Conflict in state 228 between rule 64 and token ARITHCOMPARE resolved as shift. ++Conflict in state 228 between rule 64 and token LSHIFT resolved as shift. ++Conflict in state 228 between rule 64 and token RSHIFT resolved as shift. ++Conflict in state 228 between rule 64 and token '+' resolved as shift. ++Conflict in state 228 between rule 64 and token '-' resolved as shift. ++Conflict in state 228 between rule 64 and token '*' resolved as shift. ++Conflict in state 228 between rule 64 and token '/' resolved as shift. ++Conflict in state 228 between rule 64 and token '%' resolved as shift. ++Conflict in state 229 between rule 63 and token ASSIGN resolved as reduce. ++Conflict in state 229 between rule 63 and token '=' resolved as reduce. ++Conflict in state 229 between rule 63 and token '?' resolved as reduce. ++Conflict in state 229 between rule 63 and token OROR resolved as reduce. ++Conflict in state 229 between rule 63 and token ANDAND resolved as reduce. ++Conflict in state 229 between rule 63 and token '|' resolved as reduce. ++Conflict in state 229 between rule 63 and token '^' resolved as reduce. ++Conflict in state 229 between rule 63 and token '&' resolved as reduce. ++Conflict in state 229 between rule 63 and token EQCOMPARE resolved as reduce. ++Conflict in state 229 between rule 63 and token ARITHCOMPARE resolved as shift. ++Conflict in state 229 between rule 63 and token LSHIFT resolved as shift. ++Conflict in state 229 between rule 63 and token RSHIFT resolved as shift. ++Conflict in state 229 between rule 63 and token '+' resolved as shift. ++Conflict in state 229 between rule 63 and token '-' resolved as shift. ++Conflict in state 229 between rule 63 and token '*' resolved as shift. ++Conflict in state 229 between rule 63 and token '/' resolved as shift. ++Conflict in state 229 between rule 63 and token '%' resolved as shift. ++Conflict in state 230 between rule 62 and token ASSIGN resolved as reduce. ++Conflict in state 230 between rule 62 and token '=' resolved as reduce. ++Conflict in state 230 between rule 62 and token '?' resolved as reduce. ++Conflict in state 230 between rule 62 and token OROR resolved as reduce. ++Conflict in state 230 between rule 62 and token ANDAND resolved as reduce. ++Conflict in state 230 between rule 62 and token '|' resolved as reduce. ++Conflict in state 230 between rule 62 and token '^' resolved as reduce. ++Conflict in state 230 between rule 62 and token '&' resolved as reduce. ++Conflict in state 230 between rule 62 and token EQCOMPARE resolved as reduce. ++Conflict in state 230 between rule 62 and token ARITHCOMPARE resolved as reduce. ++Conflict in state 230 between rule 62 and token LSHIFT resolved as shift. ++Conflict in state 230 between rule 62 and token RSHIFT resolved as shift. ++Conflict in state 230 between rule 62 and token '+' resolved as shift. ++Conflict in state 230 between rule 62 and token '-' resolved as shift. ++Conflict in state 230 between rule 62 and token '*' resolved as shift. ++Conflict in state 230 between rule 62 and token '/' resolved as shift. ++Conflict in state 230 between rule 62 and token '%' resolved as shift. ++Conflict in state 231 between rule 60 and token ASSIGN resolved as reduce. ++Conflict in state 231 between rule 60 and token '=' resolved as reduce. ++Conflict in state 231 between rule 60 and token '?' resolved as reduce. ++Conflict in state 231 between rule 60 and token OROR resolved as reduce. ++Conflict in state 231 between rule 60 and token ANDAND resolved as reduce. ++Conflict in state 231 between rule 60 and token '|' resolved as reduce. ++Conflict in state 231 between rule 60 and token '^' resolved as reduce. ++Conflict in state 231 between rule 60 and token '&' resolved as reduce. ++Conflict in state 231 between rule 60 and token EQCOMPARE resolved as reduce. ++Conflict in state 231 between rule 60 and token ARITHCOMPARE resolved as reduce. ++Conflict in state 231 between rule 60 and token LSHIFT resolved as reduce. ++Conflict in state 231 between rule 60 and token RSHIFT resolved as reduce. ++Conflict in state 231 between rule 60 and token '+' resolved as shift. ++Conflict in state 231 between rule 60 and token '-' resolved as shift. ++Conflict in state 231 between rule 60 and token '*' resolved as shift. ++Conflict in state 231 between rule 60 and token '/' resolved as shift. ++Conflict in state 231 between rule 60 and token '%' resolved as shift. ++Conflict in state 232 between rule 61 and token ASSIGN resolved as reduce. ++Conflict in state 232 between rule 61 and token '=' resolved as reduce. ++Conflict in state 232 between rule 61 and token '?' resolved as reduce. ++Conflict in state 232 between rule 61 and token OROR resolved as reduce. ++Conflict in state 232 between rule 61 and token ANDAND resolved as reduce. ++Conflict in state 232 between rule 61 and token '|' resolved as reduce. ++Conflict in state 232 between rule 61 and token '^' resolved as reduce. ++Conflict in state 232 between rule 61 and token '&' resolved as reduce. ++Conflict in state 232 between rule 61 and token EQCOMPARE resolved as reduce. ++Conflict in state 232 between rule 61 and token ARITHCOMPARE resolved as reduce. ++Conflict in state 232 between rule 61 and token LSHIFT resolved as reduce. ++Conflict in state 232 between rule 61 and token RSHIFT resolved as reduce. ++Conflict in state 232 between rule 61 and token '+' resolved as shift. ++Conflict in state 232 between rule 61 and token '-' resolved as shift. ++Conflict in state 232 between rule 61 and token '*' resolved as shift. ++Conflict in state 232 between rule 61 and token '/' resolved as shift. ++Conflict in state 232 between rule 61 and token '%' resolved as shift. ++Conflict in state 233 between rule 55 and token ASSIGN resolved as reduce. ++Conflict in state 233 between rule 55 and token '=' resolved as reduce. ++Conflict in state 233 between rule 55 and token '?' resolved as reduce. ++Conflict in state 233 between rule 55 and token OROR resolved as reduce. ++Conflict in state 233 between rule 55 and token ANDAND resolved as reduce. ++Conflict in state 233 between rule 55 and token '|' resolved as reduce. ++Conflict in state 233 between rule 55 and token '^' resolved as reduce. ++Conflict in state 233 between rule 55 and token '&' resolved as reduce. ++Conflict in state 233 between rule 55 and token EQCOMPARE resolved as reduce. ++Conflict in state 233 between rule 55 and token ARITHCOMPARE resolved as reduce. ++Conflict in state 233 between rule 55 and token LSHIFT resolved as reduce. ++Conflict in state 233 between rule 55 and token RSHIFT resolved as reduce. ++Conflict in state 233 between rule 55 and token '+' resolved as reduce. ++Conflict in state 233 between rule 55 and token '-' resolved as reduce. ++Conflict in state 233 between rule 55 and token '*' resolved as shift. ++Conflict in state 233 between rule 55 and token '/' resolved as shift. ++Conflict in state 233 between rule 55 and token '%' resolved as shift. ++Conflict in state 234 between rule 56 and token ASSIGN resolved as reduce. ++Conflict in state 234 between rule 56 and token '=' resolved as reduce. ++Conflict in state 234 between rule 56 and token '?' resolved as reduce. ++Conflict in state 234 between rule 56 and token OROR resolved as reduce. ++Conflict in state 234 between rule 56 and token ANDAND resolved as reduce. ++Conflict in state 234 between rule 56 and token '|' resolved as reduce. ++Conflict in state 234 between rule 56 and token '^' resolved as reduce. ++Conflict in state 234 between rule 56 and token '&' resolved as reduce. ++Conflict in state 234 between rule 56 and token EQCOMPARE resolved as reduce. ++Conflict in state 234 between rule 56 and token ARITHCOMPARE resolved as reduce. ++Conflict in state 234 between rule 56 and token LSHIFT resolved as reduce. ++Conflict in state 234 between rule 56 and token RSHIFT resolved as reduce. ++Conflict in state 234 between rule 56 and token '+' resolved as reduce. ++Conflict in state 234 between rule 56 and token '-' resolved as reduce. ++Conflict in state 234 between rule 56 and token '*' resolved as shift. ++Conflict in state 234 between rule 56 and token '/' resolved as shift. ++Conflict in state 234 between rule 56 and token '%' resolved as shift. ++Conflict in state 235 between rule 57 and token ASSIGN resolved as reduce. ++Conflict in state 235 between rule 57 and token '=' resolved as reduce. ++Conflict in state 235 between rule 57 and token '?' resolved as reduce. ++Conflict in state 235 between rule 57 and token OROR resolved as reduce. ++Conflict in state 235 between rule 57 and token ANDAND resolved as reduce. ++Conflict in state 235 between rule 57 and token '|' resolved as reduce. ++Conflict in state 235 between rule 57 and token '^' resolved as reduce. ++Conflict in state 235 between rule 57 and token '&' resolved as reduce. ++Conflict in state 235 between rule 57 and token EQCOMPARE resolved as reduce. ++Conflict in state 235 between rule 57 and token ARITHCOMPARE resolved as reduce. ++Conflict in state 235 between rule 57 and token LSHIFT resolved as reduce. ++Conflict in state 235 between rule 57 and token RSHIFT resolved as reduce. ++Conflict in state 235 between rule 57 and token '+' resolved as reduce. ++Conflict in state 235 between rule 57 and token '-' resolved as reduce. ++Conflict in state 235 between rule 57 and token '*' resolved as reduce. ++Conflict in state 235 between rule 57 and token '/' resolved as reduce. ++Conflict in state 235 between rule 57 and token '%' resolved as reduce. ++Conflict in state 236 between rule 58 and token ASSIGN resolved as reduce. ++Conflict in state 236 between rule 58 and token '=' resolved as reduce. ++Conflict in state 236 between rule 58 and token '?' resolved as reduce. ++Conflict in state 236 between rule 58 and token OROR resolved as reduce. ++Conflict in state 236 between rule 58 and token ANDAND resolved as reduce. ++Conflict in state 236 between rule 58 and token '|' resolved as reduce. ++Conflict in state 236 between rule 58 and token '^' resolved as reduce. ++Conflict in state 236 between rule 58 and token '&' resolved as reduce. ++Conflict in state 236 between rule 58 and token EQCOMPARE resolved as reduce. ++Conflict in state 236 between rule 58 and token ARITHCOMPARE resolved as reduce. ++Conflict in state 236 between rule 58 and token LSHIFT resolved as reduce. ++Conflict in state 236 between rule 58 and token RSHIFT resolved as reduce. ++Conflict in state 236 between rule 58 and token '+' resolved as reduce. ++Conflict in state 236 between rule 58 and token '-' resolved as reduce. ++Conflict in state 236 between rule 58 and token '*' resolved as reduce. ++Conflict in state 236 between rule 58 and token '/' resolved as reduce. ++Conflict in state 236 between rule 58 and token '%' resolved as reduce. ++Conflict in state 237 between rule 59 and token ASSIGN resolved as reduce. ++Conflict in state 237 between rule 59 and token '=' resolved as reduce. ++Conflict in state 237 between rule 59 and token '?' resolved as reduce. ++Conflict in state 237 between rule 59 and token OROR resolved as reduce. ++Conflict in state 237 between rule 59 and token ANDAND resolved as reduce. ++Conflict in state 237 between rule 59 and token '|' resolved as reduce. ++Conflict in state 237 between rule 59 and token '^' resolved as reduce. ++Conflict in state 237 between rule 59 and token '&' resolved as reduce. ++Conflict in state 237 between rule 59 and token EQCOMPARE resolved as reduce. ++Conflict in state 237 between rule 59 and token ARITHCOMPARE resolved as reduce. ++Conflict in state 237 between rule 59 and token LSHIFT resolved as reduce. ++Conflict in state 237 between rule 59 and token RSHIFT resolved as reduce. ++Conflict in state 237 between rule 59 and token '+' resolved as reduce. ++Conflict in state 237 between rule 59 and token '-' resolved as reduce. ++Conflict in state 237 between rule 59 and token '*' resolved as reduce. ++Conflict in state 237 between rule 59 and token '/' resolved as reduce. ++Conflict in state 237 between rule 59 and token '%' resolved as reduce. ++Conflict in state 243 between rule 209 and token '(' resolved as shift. ++Conflict in state 243 between rule 209 and token '[' resolved as shift. ++Conflict in state 274 between rule 151 and token '(' resolved as shift. ++Conflict in state 274 between rule 151 and token '[' resolved as shift. ++Conflict in state 304 between rule 208 and token '(' resolved as shift. ++Conflict in state 304 between rule 208 and token '[' resolved as shift. ++Conflict in state 366 between rule 235 and token ELSE resolved as shift. ++Conflict in state 373 between rule 69 and token ASSIGN resolved as reduce. ++Conflict in state 373 between rule 69 and token '=' resolved as reduce. ++Conflict in state 373 between rule 69 and token '?' resolved as shift. ++Conflict in state 373 between rule 69 and token OROR resolved as shift. ++Conflict in state 373 between rule 69 and token ANDAND resolved as shift. ++Conflict in state 373 between rule 69 and token '|' resolved as shift. ++Conflict in state 373 between rule 69 and token '^' resolved as shift. ++Conflict in state 373 between rule 69 and token '&' resolved as shift. ++Conflict in state 373 between rule 69 and token EQCOMPARE resolved as shift. ++Conflict in state 373 between rule 69 and token ARITHCOMPARE resolved as shift. ++Conflict in state 373 between rule 69 and token LSHIFT resolved as shift. ++Conflict in state 373 between rule 69 and token RSHIFT resolved as shift. ++Conflict in state 373 between rule 69 and token '+' resolved as shift. ++Conflict in state 373 between rule 69 and token '-' resolved as shift. ++Conflict in state 373 between rule 69 and token '*' resolved as shift. ++Conflict in state 373 between rule 69 and token '/' resolved as shift. ++Conflict in state 373 between rule 69 and token '%' resolved as shift. ++Conflict in state 377 between rule 209 and token '(' resolved as shift. ++Conflict in state 377 between rule 209 and token '[' resolved as shift. ++Conflict in state 380 between rule 209 and token '(' resolved as shift. ++Conflict in state 380 between rule 209 and token '[' resolved as shift. ++Conflict in state 423 between rule 156 and token '(' resolved as shift. ++Conflict in state 423 between rule 156 and token '[' resolved as shift. ++State 41 contains 1 shift/reduce conflict. ++State 93 contains 1 shift/reduce conflict. ++State 100 contains 1 shift/reduce conflict. ++State 104 contains 1 shift/reduce conflict. ++State 120 contains 1 shift/reduce conflict. ++State 184 contains 1 shift/reduce conflict. ++State 195 contains 1 shift/reduce conflict. ++State 201 contains 1 shift/reduce conflict. ++ ++Grammar ++rule 1 program -> /* empty */ ++rule 2 program -> extdefs ++rule 3 @1 -> /* empty */ ++rule 4 extdefs -> @1 extdef ++rule 5 @2 -> /* empty */ ++rule 6 extdefs -> extdefs @2 extdef ++rule 7 extdef -> fndef ++rule 8 extdef -> datadef ++rule 9 extdef -> ASM '(' string ')' ';' ++rule 10 datadef -> setspecs notype_initdecls ';' ++rule 11 datadef -> declmods setspecs notype_initdecls ';' ++rule 12 datadef -> typed_declspecs setspecs initdecls ';' ++rule 13 datadef -> declmods ';' ++rule 14 datadef -> typed_declspecs ';' ++rule 15 datadef -> error ';' ++rule 16 datadef -> error '}' ++rule 17 datadef -> ';' ++rule 18 @3 -> /* empty */ ++rule 19 @4 -> /* empty */ ++rule 20 fndef -> typed_declspecs setspecs declarator @3 xdecls @4 compstmt_or_error ++rule 21 fndef -> typed_declspecs setspecs declarator error ++rule 22 @5 -> /* empty */ ++rule 23 @6 -> /* empty */ ++rule 24 fndef -> declmods setspecs notype_declarator @5 xdecls @6 compstmt_or_error ++rule 25 fndef -> declmods setspecs notype_declarator error ++rule 26 @7 -> /* empty */ ++rule 27 @8 -> /* empty */ ++rule 28 fndef -> setspecs notype_declarator @7 xdecls @8 compstmt_or_error ++rule 29 fndef -> setspecs notype_declarator error ++rule 30 identifier -> IDENTIFIER ++rule 31 identifier -> TYPENAME ++rule 32 unop -> '&' ++rule 33 unop -> '-' ++rule 34 unop -> '+' ++rule 35 unop -> PLUSPLUS ++rule 36 unop -> MINUSMINUS ++rule 37 unop -> '~' ++rule 38 unop -> '!' ++rule 39 expr -> nonnull_exprlist ++rule 40 exprlist -> /* empty */ ++rule 41 exprlist -> nonnull_exprlist ++rule 42 nonnull_exprlist -> expr_no_commas ++rule 43 nonnull_exprlist -> nonnull_exprlist ',' expr_no_commas ++rule 44 unary_expr -> primary ++rule 45 unary_expr -> '*' cast_expr ++rule 46 unary_expr -> unop cast_expr ++rule 47 unary_expr -> SIZEOF unary_expr ++rule 48 unary_expr -> SIZEOF '(' typename ')' ++rule 49 unary_expr -> ALIGNOF unary_expr ++rule 50 unary_expr -> ALIGNOF '(' typename ')' ++rule 51 cast_expr -> unary_expr ++rule 52 cast_expr -> '(' typename ')' cast_expr ++rule 53 cast_expr -> '(' typename ')' '{' initlist maybecomma '}' ++rule 54 expr_no_commas -> cast_expr ++rule 55 expr_no_commas -> expr_no_commas '+' expr_no_commas ++rule 56 expr_no_commas -> expr_no_commas '-' expr_no_commas ++rule 57 expr_no_commas -> expr_no_commas '*' expr_no_commas ++rule 58 expr_no_commas -> expr_no_commas '/' expr_no_commas ++rule 59 expr_no_commas -> expr_no_commas '%' expr_no_commas ++rule 60 expr_no_commas -> expr_no_commas LSHIFT expr_no_commas ++rule 61 expr_no_commas -> expr_no_commas RSHIFT expr_no_commas ++rule 62 expr_no_commas -> expr_no_commas ARITHCOMPARE expr_no_commas ++rule 63 expr_no_commas -> expr_no_commas EQCOMPARE expr_no_commas ++rule 64 expr_no_commas -> expr_no_commas '&' expr_no_commas ++rule 65 expr_no_commas -> expr_no_commas '|' expr_no_commas ++rule 66 expr_no_commas -> expr_no_commas '^' expr_no_commas ++rule 67 expr_no_commas -> expr_no_commas ANDAND expr_no_commas ++rule 68 expr_no_commas -> expr_no_commas OROR expr_no_commas ++rule 69 expr_no_commas -> expr_no_commas '?' xexpr ':' expr_no_commas ++rule 70 expr_no_commas -> expr_no_commas '=' expr_no_commas ++rule 71 expr_no_commas -> expr_no_commas ASSIGN expr_no_commas ++rule 72 primary -> IDENTIFIER ++rule 73 primary -> CONSTANT ++rule 74 primary -> string ++rule 75 primary -> '(' expr ')' ++rule 76 primary -> '(' error ')' ++rule 77 @9 -> /* empty */ ++rule 78 primary -> '(' @9 compstmt ')' ++rule 79 primary -> primary '(' exprlist ')' ++rule 80 primary -> primary '[' expr ']' ++rule 81 primary -> primary '.' identifier ++rule 82 primary -> primary POINTSAT identifier ++rule 83 primary -> primary PLUSPLUS ++rule 84 primary -> primary MINUSMINUS ++rule 85 string -> STRING ++rule 86 string -> string STRING ++rule 87 xdecls -> /* empty */ ++rule 88 xdecls -> decls ++rule 89 decls -> decl ++rule 90 decls -> errstmt ++rule 91 decls -> decls decl ++rule 92 decls -> decl errstmt ++rule 93 setspecs -> /* empty */ ++rule 94 decl -> typed_declspecs setspecs initdecls ';' ++rule 95 decl -> declmods setspecs notype_initdecls ';' ++rule 96 decl -> typed_declspecs ';' ++rule 97 decl -> declmods ';' ++rule 98 typed_declspecs -> typespec reserved_declspecs ++rule 99 typed_declspecs -> declmods typespec reserved_declspecs ++rule 100 reserved_declspecs -> /* empty */ ++rule 101 reserved_declspecs -> reserved_declspecs typespecqual_reserved ++rule 102 reserved_declspecs -> reserved_declspecs SCSPEC ++rule 103 declmods -> TYPE_QUAL ++rule 104 declmods -> SCSPEC ++rule 105 declmods -> declmods TYPE_QUAL ++rule 106 declmods -> declmods SCSPEC ++rule 107 typed_typespecs -> typespec reserved_typespecquals ++rule 108 typed_typespecs -> nonempty_type_quals typespec reserved_typespecquals ++rule 109 reserved_typespecquals -> /* empty */ ++rule 110 reserved_typespecquals -> reserved_typespecquals typespecqual_reserved ++rule 111 typespec -> TYPESPEC ++rule 112 typespec -> structsp ++rule 113 typespec -> TYPENAME ++rule 114 typespec -> TYPEOF '(' expr ')' ++rule 115 typespec -> TYPEOF '(' typename ')' ++rule 116 typespecqual_reserved -> TYPESPEC ++rule 117 typespecqual_reserved -> TYPE_QUAL ++rule 118 typespecqual_reserved -> structsp ++rule 119 initdecls -> initdcl ++rule 120 initdecls -> initdecls ',' initdcl ++rule 121 notype_initdecls -> notype_initdcl ++rule 122 notype_initdecls -> notype_initdecls ',' initdcl ++rule 123 maybeasm -> /* empty */ ++rule 124 maybeasm -> ASM '(' string ')' ++rule 125 @10 -> /* empty */ ++rule 126 initdcl -> declarator maybeasm maybe_attribute '=' @10 init ++rule 127 initdcl -> declarator maybeasm maybe_attribute ++rule 128 @11 -> /* empty */ ++rule 129 notype_initdcl -> notype_declarator maybeasm maybe_attribute '=' @11 init ++rule 130 notype_initdcl -> notype_declarator maybeasm maybe_attribute ++rule 131 maybe_attribute -> /* empty */ ++rule 132 maybe_attribute -> ATTRIBUTE '(' '(' attribute_list ')' ')' ++rule 133 attribute_list -> attrib ++rule 134 attribute_list -> attribute_list ',' attrib ++rule 135 attrib -> IDENTIFIER ++rule 136 attrib -> IDENTIFIER '(' CONSTANT ')' ++rule 137 attrib -> IDENTIFIER '(' identifiers ')' ++rule 138 init -> expr_no_commas ++rule 139 init -> '{' '}' ++rule 140 init -> '{' initlist '}' ++rule 141 init -> '{' initlist ',' '}' ++rule 142 init -> error ++rule 143 initlist -> init ++rule 144 initlist -> initlist ',' init ++rule 145 declarator -> after_type_declarator ++rule 146 declarator -> notype_declarator ++rule 147 after_type_declarator -> '(' after_type_declarator ')' ++rule 148 after_type_declarator -> after_type_declarator '(' parmlist_or_identifiers ++rule 149 after_type_declarator -> after_type_declarator '[' expr ']' ++rule 150 after_type_declarator -> after_type_declarator '[' ']' ++rule 151 after_type_declarator -> '*' type_quals after_type_declarator ++rule 152 after_type_declarator -> TYPENAME ++rule 153 parm_declarator -> parm_declarator '(' parmlist_or_identifiers ++rule 154 parm_declarator -> parm_declarator '[' expr ']' ++rule 155 parm_declarator -> parm_declarator '[' ']' ++rule 156 parm_declarator -> '*' type_quals parm_declarator ++rule 157 parm_declarator -> TYPENAME ++rule 158 notype_declarator -> notype_declarator '(' parmlist_or_identifiers ++rule 159 notype_declarator -> '(' notype_declarator ')' ++rule 160 notype_declarator -> '*' type_quals notype_declarator ++rule 161 notype_declarator -> notype_declarator '[' expr ']' ++rule 162 notype_declarator -> notype_declarator '[' ']' ++rule 163 notype_declarator -> IDENTIFIER ++rule 164 @12 -> /* empty */ ++rule 165 structsp -> STRUCT identifier '{' @12 component_decl_list '}' ++rule 166 structsp -> STRUCT '{' component_decl_list '}' ++rule 167 structsp -> STRUCT identifier ++rule 168 @13 -> /* empty */ ++rule 169 structsp -> UNION identifier '{' @13 component_decl_list '}' ++rule 170 structsp -> UNION '{' component_decl_list '}' ++rule 171 structsp -> UNION identifier ++rule 172 @14 -> /* empty */ ++rule 173 structsp -> ENUM identifier '{' @14 enumlist maybecomma_warn '}' ++rule 174 @15 -> /* empty */ ++rule 175 structsp -> ENUM '{' @15 enumlist maybecomma_warn '}' ++rule 176 structsp -> ENUM identifier ++rule 177 maybecomma -> /* empty */ ++rule 178 maybecomma -> ',' ++rule 179 maybecomma_warn -> /* empty */ ++rule 180 maybecomma_warn -> ',' ++rule 181 component_decl_list -> component_decl_list2 ++rule 182 component_decl_list -> component_decl_list2 component_decl ++rule 183 component_decl_list2 -> /* empty */ ++rule 184 component_decl_list2 -> component_decl_list2 component_decl ';' ++rule 185 component_decl_list2 -> component_decl_list2 ';' ++rule 186 component_decl -> typed_typespecs setspecs components ++rule 187 component_decl -> nonempty_type_quals setspecs components ++rule 188 component_decl -> error ++rule 189 components -> /* empty */ ++rule 190 components -> component_declarator ++rule 191 components -> components ',' component_declarator ++rule 192 component_declarator -> declarator maybe_attribute ++rule 193 component_declarator -> declarator ':' expr_no_commas maybe_attribute ++rule 194 component_declarator -> ':' expr_no_commas ++rule 195 enumlist -> enumerator ++rule 196 enumlist -> enumlist ',' enumerator ++rule 197 enumerator -> identifier ++rule 198 enumerator -> identifier '=' expr_no_commas ++rule 199 typename -> typed_typespecs absdcl ++rule 200 typename -> nonempty_type_quals absdcl ++rule 201 absdcl -> /* empty */ ++rule 202 absdcl -> absdcl1 ++rule 203 nonempty_type_quals -> TYPE_QUAL ++rule 204 nonempty_type_quals -> nonempty_type_quals TYPE_QUAL ++rule 205 type_quals -> /* empty */ ++rule 206 type_quals -> type_quals TYPE_QUAL ++rule 207 absdcl1 -> '(' absdcl1 ')' ++rule 208 absdcl1 -> '*' type_quals absdcl1 ++rule 209 absdcl1 -> '*' type_quals ++rule 210 absdcl1 -> absdcl1 '(' parmlist ++rule 211 absdcl1 -> absdcl1 '[' expr ']' ++rule 212 absdcl1 -> absdcl1 '[' ']' ++rule 213 absdcl1 -> '(' parmlist ++rule 214 absdcl1 -> '[' expr ']' ++rule 215 absdcl1 -> '[' ']' ++rule 216 stmts -> stmt ++rule 217 stmts -> stmts stmt ++rule 218 stmts -> stmts errstmt ++rule 219 xstmts -> /* empty */ ++rule 220 xstmts -> stmts ++rule 221 errstmt -> error ';' ++rule 222 pushlevel -> /* empty */ ++rule 223 compstmt_or_error -> compstmt ++rule 224 compstmt_or_error -> error compstmt ++rule 225 compstmt -> '{' '}' ++rule 226 compstmt -> '{' pushlevel decls xstmts '}' ++rule 227 compstmt -> '{' pushlevel error '}' ++rule 228 compstmt -> '{' pushlevel stmts '}' ++rule 229 @16 -> /* empty */ ++rule 230 simple_if -> IF '(' expr ')' @16 stmt ++rule 231 stmt -> compstmt ++rule 232 stmt -> expr ';' ++rule 233 @17 -> /* empty */ ++rule 234 stmt -> simple_if ELSE @17 stmt ++rule 235 stmt -> simple_if ++rule 236 @18 -> /* empty */ ++rule 237 @19 -> /* empty */ ++rule 238 stmt -> WHILE @18 '(' expr ')' @19 stmt ++rule 239 @20 -> /* empty */ ++rule 240 @21 -> /* empty */ ++rule 241 stmt -> DO @20 stmt WHILE @21 '(' expr ')' ';' ++rule 242 @22 -> /* empty */ ++rule 243 @23 -> /* empty */ ++rule 244 @24 -> /* empty */ ++rule 245 stmt -> FOR '(' xexpr ';' @22 xexpr ';' @23 xexpr ')' @24 stmt ++rule 246 @25 -> /* empty */ ++rule 247 stmt -> SWITCH '(' expr ')' @25 stmt ++rule 248 @26 -> /* empty */ ++rule 249 stmt -> CASE expr ':' @26 stmt ++rule 250 @27 -> /* empty */ ++rule 251 stmt -> DEFAULT ':' @27 stmt ++rule 252 stmt -> BREAK ';' ++rule 253 stmt -> CONTINUE ';' ++rule 254 stmt -> RETURN ';' ++rule 255 stmt -> RETURN expr ';' ++rule 256 stmt -> ASM maybe_type_qual '(' string ')' ';' ++rule 257 stmt -> ASM maybe_type_qual '(' string ':' asm_operands ')' ';' ++rule 258 stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ')' ';' ++rule 259 stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' ++rule 260 stmt -> GOTO identifier ';' ++rule 261 @28 -> /* empty */ ++rule 262 stmt -> identifier ':' @28 stmt ++rule 263 stmt -> ';' ++rule 264 maybe_type_qual -> /* empty */ ++rule 265 maybe_type_qual -> TYPE_QUAL ++rule 266 xexpr -> /* empty */ ++rule 267 xexpr -> expr ++rule 268 asm_operands -> /* empty */ ++rule 269 asm_operands -> nonnull_asm_operands ++rule 270 nonnull_asm_operands -> asm_operand ++rule 271 nonnull_asm_operands -> nonnull_asm_operands ',' asm_operand ++rule 272 asm_operand -> STRING '(' expr ')' ++rule 273 asm_clobbers -> string ++rule 274 asm_clobbers -> asm_clobbers ',' string ++rule 275 @29 -> /* empty */ ++rule 276 parmlist -> @29 parmlist_1 ++rule 277 @30 -> /* empty */ ++rule 278 parmlist_or_identifiers -> @30 parmlist_or_identifiers_1 ++rule 279 parmlist_or_identifiers_1 -> parmlist_2 ')' ++rule 280 parmlist_or_identifiers_1 -> identifiers ')' ++rule 281 parmlist_or_identifiers_1 -> error ')' ++rule 282 parmlist_1 -> parmlist_2 ')' ++rule 283 parmlist_1 -> error ')' ++rule 284 parmlist_2 -> /* empty */ ++rule 285 parmlist_2 -> parms ++rule 286 parmlist_2 -> parms ',' ELLIPSIS ++rule 287 parms -> parm ++rule 288 parms -> parms ',' parm ++rule 289 parm -> typed_declspecs parm_declarator ++rule 290 parm -> typed_declspecs notype_declarator ++rule 291 parm -> typed_declspecs absdcl ++rule 292 parm -> declmods notype_declarator ++rule 293 parm -> declmods absdcl ++rule 294 identifiers -> IDENTIFIER ++rule 295 identifiers -> identifiers ',' IDENTIFIER ++ ++Terminals, with rules where they appear ++ ++$ (-1) ++'!' (33) 38 ++'%' (37) 59 ++'&' (38) 32 64 ++'(' (40) 9 48 50 52 53 75 76 78 79 114 115 124 132 136 137 147 148 ++ 153 158 159 207 210 213 230 238 241 245 247 256 257 258 259 272 ++')' (41) 9 48 50 52 53 75 76 78 79 114 115 124 132 136 137 147 159 ++ 207 230 238 241 245 247 256 257 258 259 272 279 280 281 282 283 ++'*' (42) 45 57 151 156 160 208 209 ++'+' (43) 34 55 ++',' (44) 43 120 122 134 141 144 178 180 191 196 271 274 286 288 295 ++'-' (45) 33 56 ++'.' (46) 81 ++'/' (47) 58 ++':' (58) 69 193 194 249 251 257 258 259 262 ++';' (59) 9 10 11 12 13 14 15 17 94 95 96 97 184 185 221 232 241 245 ++ 252 253 254 255 256 257 258 259 260 263 ++'=' (61) 70 126 129 198 ++'?' (63) 69 ++'[' (91) 80 149 150 154 155 161 162 211 212 214 215 ++']' (93) 80 149 150 154 155 161 162 211 212 214 215 ++'^' (94) 66 ++'{' (123) 53 139 140 141 165 166 169 170 173 175 225 226 227 228 ++'|' (124) 65 ++'}' (125) 16 53 139 140 141 165 166 169 170 173 175 225 226 227 228 ++'~' (126) 37 ++error (256) 15 16 21 25 29 76 142 188 221 224 227 281 283 ++IDENTIFIER (258) 30 72 135 136 137 163 294 295 ++TYPENAME (259) 31 113 152 157 ++SCSPEC (260) 102 104 106 ++TYPESPEC (261) 111 116 ++TYPE_QUAL (262) 103 105 117 203 204 206 265 ++CONSTANT (263) 73 136 ++STRING (264) 85 86 272 ++ELLIPSIS (265) 286 ++SIZEOF (266) 47 48 ++ENUM (267) 173 175 176 ++STRUCT (268) 165 166 167 ++UNION (269) 169 170 171 ++IF (270) 230 ++ELSE (271) 234 ++WHILE (272) 238 241 ++DO (273) 241 ++FOR (274) 245 ++SWITCH (275) 247 ++CASE (276) 249 ++DEFAULT (277) 251 ++BREAK (278) 252 ++CONTINUE (279) 253 ++RETURN (280) 254 255 ++GOTO (281) 260 ++ASM (282) 9 124 256 257 258 259 ++TYPEOF (283) 114 115 ++ALIGNOF (284) 49 50 ++ATTRIBUTE (285) 132 ++ASSIGN (286) 71 ++OROR (287) 68 ++ANDAND (288) 67 ++EQCOMPARE (289) 63 ++ARITHCOMPARE (290) 62 ++LSHIFT (291) 60 ++RSHIFT (292) 61 ++UNARY (293) ++PLUSPLUS (294) 35 83 ++MINUSMINUS (295) 36 84 ++HYPERUNARY (296) ++POINTSAT (297) 82 ++ ++Nonterminals, with rules where they appear ++ ++program (65) ++ on left: 1 2 ++extdefs (66) ++ on left: 4 6, on right: 2 6 ++@1 (67) ++ on left: 3, on right: 4 ++@2 (68) ++ on left: 5, on right: 6 ++extdef (69) ++ on left: 7 8 9, on right: 4 6 ++datadef (70) ++ on left: 10 11 12 13 14 15 16 17, on right: 8 ++fndef (71) ++ on left: 20 21 24 25 28 29, on right: 7 ++@3 (72) ++ on left: 18, on right: 20 ++@4 (73) ++ on left: 19, on right: 20 ++@5 (74) ++ on left: 22, on right: 24 ++@6 (75) ++ on left: 23, on right: 24 ++@7 (76) ++ on left: 26, on right: 28 ++@8 (77) ++ on left: 27, on right: 28 ++identifier (78) ++ on left: 30 31, on right: 81 82 165 167 169 171 173 176 197 198 ++ 260 262 ++unop (79) ++ on left: 32 33 34 35 36 37 38, on right: 46 ++expr (80) ++ on left: 39, on right: 75 80 114 149 154 161 211 214 230 232 238 ++ 241 247 249 255 267 272 ++exprlist (81) ++ on left: 40 41, on right: 79 ++nonnull_exprlist (82) ++ on left: 42 43, on right: 39 41 43 ++unary_expr (83) ++ on left: 44 45 46 47 48 49 50, on right: 47 49 51 ++cast_expr (84) ++ on left: 51 52 53, on right: 45 46 52 54 ++expr_no_commas (85) ++ on left: 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 ++ , on right: 42 43 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 ++ 71 138 193 194 198 ++primary (86) ++ on left: 72 73 74 75 76 78 79 80 81 82 83 84, on right: 44 79 80 ++ 81 82 83 84 ++@9 (87) ++ on left: 77, on right: 78 ++string (88) ++ on left: 85 86, on right: 9 74 86 124 256 257 258 259 273 274 ++xdecls (89) ++ on left: 87 88, on right: 20 24 28 ++decls (90) ++ on left: 89 90 91 92, on right: 88 91 226 ++setspecs (91) ++ on left: 93, on right: 10 11 12 20 21 24 25 28 29 94 95 186 187 ++decl (92) ++ on left: 94 95 96 97, on right: 89 91 92 ++typed_declspecs (93) ++ on left: 98 99, on right: 12 14 20 21 94 96 289 290 291 ++reserved_declspecs (94) ++ on left: 100 101 102, on right: 98 99 101 102 ++declmods (95) ++ on left: 103 104 105 106, on right: 11 13 24 25 95 97 99 105 106 ++ 292 293 ++typed_typespecs (96) ++ on left: 107 108, on right: 186 199 ++reserved_typespecquals (97) ++ on left: 109 110, on right: 107 108 110 ++typespec (98) ++ on left: 111 112 113 114 115, on right: 98 99 107 108 ++typespecqual_reserved (99) ++ on left: 116 117 118, on right: 101 110 ++initdecls (100) ++ on left: 119 120, on right: 12 94 120 ++notype_initdecls (101) ++ on left: 121 122, on right: 10 11 95 122 ++maybeasm (102) ++ on left: 123 124, on right: 126 127 129 130 ++initdcl (103) ++ on left: 126 127, on right: 119 120 122 ++@10 (104) ++ on left: 125, on right: 126 ++notype_initdcl (105) ++ on left: 129 130, on right: 121 ++@11 (106) ++ on left: 128, on right: 129 ++maybe_attribute (107) ++ on left: 131 132, on right: 126 127 129 130 192 193 ++attribute_list (108) ++ on left: 133 134, on right: 132 134 ++attrib (109) ++ on left: 135 136 137, on right: 133 134 ++init (110) ++ on left: 138 139 140 141 142, on right: 126 129 143 144 ++initlist (111) ++ on left: 143 144, on right: 53 140 141 144 ++declarator (112) ++ on left: 145 146, on right: 20 21 126 127 192 193 ++after_type_declarator (113) ++ on left: 147 148 149 150 151 152, on right: 145 147 148 149 150 ++ 151 ++parm_declarator (114) ++ on left: 153 154 155 156 157, on right: 153 154 155 156 289 ++notype_declarator (115) ++ on left: 158 159 160 161 162 163, on right: 24 25 28 29 129 130 ++ 146 158 159 160 161 162 290 292 ++structsp (116) ++ on left: 165 166 167 169 170 171 173 175 176, on right: 112 118 ++@12 (117) ++ on left: 164, on right: 165 ++@13 (118) ++ on left: 168, on right: 169 ++@14 (119) ++ on left: 172, on right: 173 ++@15 (120) ++ on left: 174, on right: 175 ++maybecomma (121) ++ on left: 177 178, on right: 53 ++maybecomma_warn (122) ++ on left: 179 180, on right: 173 175 ++component_decl_list (123) ++ on left: 181 182, on right: 165 166 169 170 ++component_decl_list2 (124) ++ on left: 183 184 185, on right: 181 182 184 185 ++component_decl (125) ++ on left: 186 187 188, on right: 182 184 ++components (126) ++ on left: 189 190 191, on right: 186 187 191 ++component_declarator (127) ++ on left: 192 193 194, on right: 190 191 ++enumlist (128) ++ on left: 195 196, on right: 173 175 196 ++enumerator (129) ++ on left: 197 198, on right: 195 196 ++typename (130) ++ on left: 199 200, on right: 48 50 52 53 115 ++absdcl (131) ++ on left: 201 202, on right: 199 200 291 293 ++nonempty_type_quals (132) ++ on left: 203 204, on right: 108 187 200 204 ++type_quals (133) ++ on left: 205 206, on right: 151 156 160 206 208 209 ++absdcl1 (134) ++ on left: 207 208 209 210 211 212 213 214 215, on right: 202 207 ++ 208 210 211 212 ++stmts (135) ++ on left: 216 217 218, on right: 217 218 220 228 ++xstmts (136) ++ on left: 219 220, on right: 226 ++errstmt (137) ++ on left: 221, on right: 90 92 218 ++pushlevel (138) ++ on left: 222, on right: 226 227 228 ++compstmt_or_error (139) ++ on left: 223 224, on right: 20 24 28 ++compstmt (140) ++ on left: 225 226 227 228, on right: 78 223 224 231 ++simple_if (141) ++ on left: 230, on right: 234 235 ++@16 (142) ++ on left: 229, on right: 230 ++stmt (143) ++ on left: 231 232 234 235 238 241 245 247 249 251 252 253 254 255 ++ 256 257 258 259 260 262 263, on right: 216 217 230 234 238 241 ++ 245 247 249 251 262 ++@17 (144) ++ on left: 233, on right: 234 ++@18 (145) ++ on left: 236, on right: 238 ++@19 (146) ++ on left: 237, on right: 238 ++@20 (147) ++ on left: 239, on right: 241 ++@21 (148) ++ on left: 240, on right: 241 ++@22 (149) ++ on left: 242, on right: 245 ++@23 (150) ++ on left: 243, on right: 245 ++@24 (151) ++ on left: 244, on right: 245 ++@25 (152) ++ on left: 246, on right: 247 ++@26 (153) ++ on left: 248, on right: 249 ++@27 (154) ++ on left: 250, on right: 251 ++@28 (155) ++ on left: 261, on right: 262 ++maybe_type_qual (156) ++ on left: 264 265, on right: 256 257 258 259 ++xexpr (157) ++ on left: 266 267, on right: 69 245 ++asm_operands (158) ++ on left: 268 269, on right: 257 258 259 ++nonnull_asm_operands (159) ++ on left: 270 271, on right: 269 271 ++asm_operand (160) ++ on left: 272, on right: 270 271 ++asm_clobbers (161) ++ on left: 273 274, on right: 259 274 ++parmlist (162) ++ on left: 276, on right: 210 213 ++@29 (163) ++ on left: 275, on right: 276 ++parmlist_or_identifiers (164) ++ on left: 278, on right: 148 153 158 ++@30 (165) ++ on left: 277, on right: 278 ++parmlist_or_identifiers_1 (166) ++ on left: 279 280 281, on right: 278 ++parmlist_1 (167) ++ on left: 282 283, on right: 276 ++parmlist_2 (168) ++ on left: 284 285 286, on right: 279 282 ++parms (169) ++ on left: 287 288, on right: 285 286 288 ++parm (170) ++ on left: 289 290 291 292 293, on right: 287 288 ++identifiers (171) ++ on left: 294 295, on right: 137 280 295 ++ ++ ++state 0 ++ ++ $ reduce using rule 1 (program) ++ $default reduce using rule 3 (@1) ++ ++ program go to state 513 ++ extdefs go to state 1 ++ @1 go to state 2 ++ ++ ++ ++state 1 ++ ++ program -> extdefs . (rule 2) ++ extdefs -> extdefs . @2 extdef (rule 6) ++ ++ $ reduce using rule 2 (program) ++ $default reduce using rule 5 (@2) ++ ++ @2 go to state 3 ++ ++ ++ ++state 2 ++ ++ extdefs -> @1 . extdef (rule 4) ++ ++ error shift, and go to state 4 ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ ASM shift, and go to state 12 ++ TYPEOF shift, and go to state 13 ++ ';' shift, and go to state 14 ++ ++ IDENTIFIER reduce using rule 93 (setspecs) ++ '*' [reduce using rule 93 (setspecs)] ++ '(' reduce using rule 93 (setspecs) ++ ++ extdef go to state 15 ++ datadef go to state 16 ++ fndef go to state 17 ++ setspecs go to state 18 ++ typed_declspecs go to state 19 ++ declmods go to state 20 ++ typespec go to state 21 ++ structsp go to state 22 ++ ++ ++ ++state 3 ++ ++ extdefs -> extdefs @2 . extdef (rule 6) ++ ++ error shift, and go to state 4 ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ ASM shift, and go to state 12 ++ TYPEOF shift, and go to state 13 ++ ';' shift, and go to state 14 ++ ++ IDENTIFIER reduce using rule 93 (setspecs) ++ '*' [reduce using rule 93 (setspecs)] ++ '(' reduce using rule 93 (setspecs) ++ ++ extdef go to state 23 ++ datadef go to state 16 ++ fndef go to state 17 ++ setspecs go to state 18 ++ typed_declspecs go to state 19 ++ declmods go to state 20 ++ typespec go to state 21 ++ structsp go to state 22 ++ ++ ++ ++state 4 ++ ++ datadef -> error . ';' (rule 15) ++ datadef -> error . '}' (rule 16) ++ ++ ';' shift, and go to state 24 ++ '}' shift, and go to state 25 ++ ++ ++ ++state 5 ++ ++ typespec -> TYPENAME . (rule 113) ++ ++ $default reduce using rule 113 (typespec) ++ ++ ++ ++state 6 ++ ++ declmods -> SCSPEC . (rule 104) ++ ++ $default reduce using rule 104 (declmods) ++ ++ ++ ++state 7 ++ ++ typespec -> TYPESPEC . (rule 111) ++ ++ $default reduce using rule 111 (typespec) ++ ++ ++ ++state 8 ++ ++ declmods -> TYPE_QUAL . (rule 103) ++ ++ $default reduce using rule 103 (declmods) ++ ++ ++ ++state 9 ++ ++ structsp -> ENUM . identifier '{' @14 enumlist maybecomma_warn '}' (rule 173) ++ structsp -> ENUM . '{' @15 enumlist maybecomma_warn '}' (rule 175) ++ structsp -> ENUM . identifier (rule 176) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ '{' shift, and go to state 28 ++ ++ identifier go to state 29 ++ ++ ++ ++state 10 ++ ++ structsp -> STRUCT . identifier '{' @12 component_decl_list '}' (rule 165) ++ structsp -> STRUCT . '{' component_decl_list '}' (rule 166) ++ structsp -> STRUCT . identifier (rule 167) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ '{' shift, and go to state 30 ++ ++ identifier go to state 31 ++ ++ ++ ++state 11 ++ ++ structsp -> UNION . identifier '{' @13 component_decl_list '}' (rule 169) ++ structsp -> UNION . '{' component_decl_list '}' (rule 170) ++ structsp -> UNION . identifier (rule 171) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ '{' shift, and go to state 32 ++ ++ identifier go to state 33 ++ ++ ++ ++state 12 ++ ++ extdef -> ASM . '(' string ')' ';' (rule 9) ++ ++ '(' shift, and go to state 34 ++ ++ ++ ++state 13 ++ ++ typespec -> TYPEOF . '(' expr ')' (rule 114) ++ typespec -> TYPEOF . '(' typename ')' (rule 115) ++ ++ '(' shift, and go to state 35 ++ ++ ++ ++state 14 ++ ++ datadef -> ';' . (rule 17) ++ ++ $default reduce using rule 17 (datadef) ++ ++ ++ ++state 15 ++ ++ extdefs -> @1 extdef . (rule 4) ++ ++ $default reduce using rule 4 (extdefs) ++ ++ ++ ++state 16 ++ ++ extdef -> datadef . (rule 8) ++ ++ $default reduce using rule 8 (extdef) ++ ++ ++ ++state 17 ++ ++ extdef -> fndef . (rule 7) ++ ++ $default reduce using rule 7 (extdef) ++ ++ ++ ++state 18 ++ ++ datadef -> setspecs . notype_initdecls ';' (rule 10) ++ fndef -> setspecs . notype_declarator @7 xdecls @8 compstmt_or_error (rule 28) ++ fndef -> setspecs . notype_declarator error (rule 29) ++ ++ IDENTIFIER shift, and go to state 36 ++ '*' shift, and go to state 37 ++ '(' shift, and go to state 38 ++ ++ notype_initdecls go to state 39 ++ notype_initdcl go to state 40 ++ notype_declarator go to state 41 ++ ++ ++ ++state 19 ++ ++ datadef -> typed_declspecs . setspecs initdecls ';' (rule 12) ++ datadef -> typed_declspecs . ';' (rule 14) ++ fndef -> typed_declspecs . setspecs declarator @3 xdecls @4 compstmt_or_error (rule 20) ++ fndef -> typed_declspecs . setspecs declarator error (rule 21) ++ ++ ';' shift, and go to state 42 ++ ++ $default reduce using rule 93 (setspecs) ++ ++ setspecs go to state 43 ++ ++ ++ ++state 20 ++ ++ datadef -> declmods . setspecs notype_initdecls ';' (rule 11) ++ datadef -> declmods . ';' (rule 13) ++ fndef -> declmods . setspecs notype_declarator @5 xdecls @6 compstmt_or_error (rule 24) ++ fndef -> declmods . setspecs notype_declarator error (rule 25) ++ typed_declspecs -> declmods . typespec reserved_declspecs (rule 99) ++ declmods -> declmods . TYPE_QUAL (rule 105) ++ declmods -> declmods . SCSPEC (rule 106) ++ ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 44 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 45 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ';' shift, and go to state 46 ++ ++ $default reduce using rule 93 (setspecs) ++ ++ setspecs go to state 47 ++ typespec go to state 48 ++ structsp go to state 22 ++ ++ ++ ++state 21 ++ ++ typed_declspecs -> typespec . reserved_declspecs (rule 98) ++ ++ $default reduce using rule 100 (reserved_declspecs) ++ ++ reserved_declspecs go to state 49 ++ ++ ++ ++state 22 ++ ++ typespec -> structsp . (rule 112) ++ ++ $default reduce using rule 112 (typespec) ++ ++ ++ ++state 23 ++ ++ extdefs -> extdefs @2 extdef . (rule 6) ++ ++ $default reduce using rule 6 (extdefs) ++ ++ ++ ++state 24 ++ ++ datadef -> error ';' . (rule 15) ++ ++ $default reduce using rule 15 (datadef) ++ ++ ++ ++state 25 ++ ++ datadef -> error '}' . (rule 16) ++ ++ $default reduce using rule 16 (datadef) ++ ++ ++ ++state 26 ++ ++ identifier -> IDENTIFIER . (rule 30) ++ ++ $default reduce using rule 30 (identifier) ++ ++ ++ ++state 27 ++ ++ identifier -> TYPENAME . (rule 31) ++ ++ $default reduce using rule 31 (identifier) ++ ++ ++ ++state 28 ++ ++ structsp -> ENUM '{' . @15 enumlist maybecomma_warn '}' (rule 175) ++ ++ $default reduce using rule 174 (@15) ++ ++ @15 go to state 50 ++ ++ ++ ++state 29 ++ ++ structsp -> ENUM identifier . '{' @14 enumlist maybecomma_warn '}' (rule 173) ++ structsp -> ENUM identifier . (rule 176) ++ ++ '{' shift, and go to state 51 ++ ++ $default reduce using rule 176 (structsp) ++ ++ ++ ++state 30 ++ ++ structsp -> STRUCT '{' . component_decl_list '}' (rule 166) ++ ++ $default reduce using rule 183 (component_decl_list2) ++ ++ component_decl_list go to state 52 ++ component_decl_list2 go to state 53 ++ ++ ++ ++state 31 ++ ++ structsp -> STRUCT identifier . '{' @12 component_decl_list '}' (rule 165) ++ structsp -> STRUCT identifier . (rule 167) ++ ++ '{' shift, and go to state 54 ++ ++ $default reduce using rule 167 (structsp) ++ ++ ++ ++state 32 ++ ++ structsp -> UNION '{' . component_decl_list '}' (rule 170) ++ ++ $default reduce using rule 183 (component_decl_list2) ++ ++ component_decl_list go to state 55 ++ component_decl_list2 go to state 53 ++ ++ ++ ++state 33 ++ ++ structsp -> UNION identifier . '{' @13 component_decl_list '}' (rule 169) ++ structsp -> UNION identifier . (rule 171) ++ ++ '{' shift, and go to state 56 ++ ++ $default reduce using rule 171 (structsp) ++ ++ ++ ++state 34 ++ ++ extdef -> ASM '(' . string ')' ';' (rule 9) ++ ++ STRING shift, and go to state 57 ++ ++ string go to state 58 ++ ++ ++ ++state 35 ++ ++ typespec -> TYPEOF '(' . expr ')' (rule 114) ++ typespec -> TYPEOF '(' . typename ')' (rule 115) ++ ++ IDENTIFIER shift, and go to state 59 ++ TYPENAME shift, and go to state 5 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 60 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 74 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ typed_typespecs go to state 81 ++ typespec go to state 82 ++ structsp go to state 22 ++ typename go to state 83 ++ nonempty_type_quals go to state 84 ++ ++ ++ ++state 36 ++ ++ notype_declarator -> IDENTIFIER . (rule 163) ++ ++ $default reduce using rule 163 (notype_declarator) ++ ++ ++ ++state 37 ++ ++ notype_declarator -> '*' . type_quals notype_declarator (rule 160) ++ ++ $default reduce using rule 205 (type_quals) ++ ++ type_quals go to state 85 ++ ++ ++ ++state 38 ++ ++ notype_declarator -> '(' . notype_declarator ')' (rule 159) ++ ++ IDENTIFIER shift, and go to state 36 ++ '*' shift, and go to state 37 ++ '(' shift, and go to state 38 ++ ++ notype_declarator go to state 86 ++ ++ ++ ++state 39 ++ ++ datadef -> setspecs notype_initdecls . ';' (rule 10) ++ notype_initdecls -> notype_initdecls . ',' initdcl (rule 122) ++ ++ ';' shift, and go to state 87 ++ ',' shift, and go to state 88 ++ ++ ++ ++state 40 ++ ++ notype_initdecls -> notype_initdcl . (rule 121) ++ ++ $default reduce using rule 121 (notype_initdecls) ++ ++ ++ ++state 41 ++ ++ fndef -> setspecs notype_declarator . @7 xdecls @8 compstmt_or_error (rule 28) ++ fndef -> setspecs notype_declarator . error (rule 29) ++ notype_initdcl -> notype_declarator . maybeasm maybe_attribute '=' @11 init (rule 129) ++ notype_initdcl -> notype_declarator . maybeasm maybe_attribute (rule 130) ++ notype_declarator -> notype_declarator . '(' parmlist_or_identifiers (rule 158) ++ notype_declarator -> notype_declarator . '[' expr ']' (rule 161) ++ notype_declarator -> notype_declarator . '[' ']' (rule 162) ++ ++ error shift, and go to state 89 ++ ASM shift, and go to state 90 ++ '(' shift, and go to state 91 ++ '[' shift, and go to state 92 ++ ++ error [reduce using rule 26 (@7)] ++ TYPENAME reduce using rule 26 (@7) ++ SCSPEC reduce using rule 26 (@7) ++ TYPESPEC reduce using rule 26 (@7) ++ TYPE_QUAL reduce using rule 26 (@7) ++ ENUM reduce using rule 26 (@7) ++ STRUCT reduce using rule 26 (@7) ++ UNION reduce using rule 26 (@7) ++ TYPEOF reduce using rule 26 (@7) ++ ATTRIBUTE reduce using rule 123 (maybeasm) ++ '=' reduce using rule 123 (maybeasm) ++ ';' reduce using rule 123 (maybeasm) ++ ',' reduce using rule 123 (maybeasm) ++ '{' reduce using rule 26 (@7) ++ ++ @7 go to state 93 ++ maybeasm go to state 94 ++ ++ ++ ++state 42 ++ ++ datadef -> typed_declspecs ';' . (rule 14) ++ ++ $default reduce using rule 14 (datadef) ++ ++ ++ ++state 43 ++ ++ datadef -> typed_declspecs setspecs . initdecls ';' (rule 12) ++ fndef -> typed_declspecs setspecs . declarator @3 xdecls @4 compstmt_or_error (rule 20) ++ fndef -> typed_declspecs setspecs . declarator error (rule 21) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ initdecls go to state 98 ++ initdcl go to state 99 ++ declarator go to state 100 ++ after_type_declarator go to state 101 ++ notype_declarator go to state 102 ++ ++ ++ ++state 44 ++ ++ declmods -> declmods SCSPEC . (rule 106) ++ ++ $default reduce using rule 106 (declmods) ++ ++ ++ ++state 45 ++ ++ declmods -> declmods TYPE_QUAL . (rule 105) ++ ++ $default reduce using rule 105 (declmods) ++ ++ ++ ++state 46 ++ ++ datadef -> declmods ';' . (rule 13) ++ ++ $default reduce using rule 13 (datadef) ++ ++ ++ ++state 47 ++ ++ datadef -> declmods setspecs . notype_initdecls ';' (rule 11) ++ fndef -> declmods setspecs . notype_declarator @5 xdecls @6 compstmt_or_error (rule 24) ++ fndef -> declmods setspecs . notype_declarator error (rule 25) ++ ++ IDENTIFIER shift, and go to state 36 ++ '*' shift, and go to state 37 ++ '(' shift, and go to state 38 ++ ++ notype_initdecls go to state 103 ++ notype_initdcl go to state 40 ++ notype_declarator go to state 104 ++ ++ ++ ++state 48 ++ ++ typed_declspecs -> declmods typespec . reserved_declspecs (rule 99) ++ ++ $default reduce using rule 100 (reserved_declspecs) ++ ++ reserved_declspecs go to state 105 ++ ++ ++ ++state 49 ++ ++ typed_declspecs -> typespec reserved_declspecs . (rule 98) ++ reserved_declspecs -> reserved_declspecs . typespecqual_reserved (rule 101) ++ reserved_declspecs -> reserved_declspecs . SCSPEC (rule 102) ++ ++ SCSPEC shift, and go to state 106 ++ TYPESPEC shift, and go to state 107 ++ TYPE_QUAL shift, and go to state 108 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ ++ $default reduce using rule 98 (typed_declspecs) ++ ++ typespecqual_reserved go to state 109 ++ structsp go to state 110 ++ ++ ++ ++state 50 ++ ++ structsp -> ENUM '{' @15 . enumlist maybecomma_warn '}' (rule 175) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ ++ identifier go to state 111 ++ enumlist go to state 112 ++ enumerator go to state 113 ++ ++ ++ ++state 51 ++ ++ structsp -> ENUM identifier '{' . @14 enumlist maybecomma_warn '}' (rule 173) ++ ++ $default reduce using rule 172 (@14) ++ ++ @14 go to state 114 ++ ++ ++ ++state 52 ++ ++ structsp -> STRUCT '{' component_decl_list . '}' (rule 166) ++ ++ '}' shift, and go to state 115 ++ ++ ++ ++state 53 ++ ++ component_decl_list -> component_decl_list2 . (rule 181) ++ component_decl_list -> component_decl_list2 . component_decl (rule 182) ++ component_decl_list2 -> component_decl_list2 . component_decl ';' (rule 184) ++ component_decl_list2 -> component_decl_list2 . ';' (rule 185) ++ ++ error shift, and go to state 116 ++ TYPENAME shift, and go to state 5 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 60 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ';' shift, and go to state 117 ++ ++ '}' reduce using rule 181 (component_decl_list) ++ ++ typed_typespecs go to state 118 ++ typespec go to state 82 ++ structsp go to state 22 ++ component_decl go to state 119 ++ nonempty_type_quals go to state 120 ++ ++ ++ ++state 54 ++ ++ structsp -> STRUCT identifier '{' . @12 component_decl_list '}' (rule 165) ++ ++ $default reduce using rule 164 (@12) ++ ++ @12 go to state 121 ++ ++ ++ ++state 55 ++ ++ structsp -> UNION '{' component_decl_list . '}' (rule 170) ++ ++ '}' shift, and go to state 122 ++ ++ ++ ++state 56 ++ ++ structsp -> UNION identifier '{' . @13 component_decl_list '}' (rule 169) ++ ++ $default reduce using rule 168 (@13) ++ ++ @13 go to state 123 ++ ++ ++ ++state 57 ++ ++ string -> STRING . (rule 85) ++ ++ $default reduce using rule 85 (string) ++ ++ ++ ++state 58 ++ ++ extdef -> ASM '(' string . ')' ';' (rule 9) ++ string -> string . STRING (rule 86) ++ ++ STRING shift, and go to state 124 ++ ')' shift, and go to state 125 ++ ++ ++ ++state 59 ++ ++ primary -> IDENTIFIER . (rule 72) ++ ++ $default reduce using rule 72 (primary) ++ ++ ++ ++state 60 ++ ++ nonempty_type_quals -> TYPE_QUAL . (rule 203) ++ ++ $default reduce using rule 203 (nonempty_type_quals) ++ ++ ++ ++state 61 ++ ++ primary -> CONSTANT . (rule 73) ++ ++ $default reduce using rule 73 (primary) ++ ++ ++ ++state 62 ++ ++ unary_expr -> SIZEOF . unary_expr (rule 47) ++ unary_expr -> SIZEOF . '(' typename ')' (rule 48) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 126 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 127 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 63 ++ ++ unary_expr -> ALIGNOF . unary_expr (rule 49) ++ unary_expr -> ALIGNOF . '(' typename ')' (rule 50) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 128 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 129 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 64 ++ ++ unop -> '&' . (rule 32) ++ ++ $default reduce using rule 32 (unop) ++ ++ ++ ++state 65 ++ ++ unop -> '+' . (rule 34) ++ ++ $default reduce using rule 34 (unop) ++ ++ ++ ++state 66 ++ ++ unop -> '-' . (rule 33) ++ ++ $default reduce using rule 33 (unop) ++ ++ ++ ++state 67 ++ ++ unary_expr -> '*' . cast_expr (rule 45) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 130 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 68 ++ ++ unop -> PLUSPLUS . (rule 35) ++ ++ $default reduce using rule 35 (unop) ++ ++ ++ ++state 69 ++ ++ unop -> MINUSMINUS . (rule 36) ++ ++ $default reduce using rule 36 (unop) ++ ++ ++ ++state 70 ++ ++ cast_expr -> '(' . typename ')' cast_expr (rule 52) ++ cast_expr -> '(' . typename ')' '{' initlist maybecomma '}' (rule 53) ++ primary -> '(' . expr ')' (rule 75) ++ primary -> '(' . error ')' (rule 76) ++ primary -> '(' . @9 compstmt ')' (rule 78) ++ ++ error shift, and go to state 131 ++ IDENTIFIER shift, and go to state 59 ++ TYPENAME shift, and go to state 5 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 60 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ '{' reduce using rule 77 (@9) ++ ++ unop go to state 73 ++ expr go to state 132 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ @9 go to state 133 ++ string go to state 80 ++ typed_typespecs go to state 81 ++ typespec go to state 82 ++ structsp go to state 22 ++ typename go to state 134 ++ nonempty_type_quals go to state 84 ++ ++ ++ ++state 71 ++ ++ unop -> '~' . (rule 37) ++ ++ $default reduce using rule 37 (unop) ++ ++ ++ ++state 72 ++ ++ unop -> '!' . (rule 38) ++ ++ $default reduce using rule 38 (unop) ++ ++ ++ ++state 73 ++ ++ unary_expr -> unop . cast_expr (rule 46) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 135 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 74 ++ ++ typespec -> TYPEOF '(' expr . ')' (rule 114) ++ ++ ')' shift, and go to state 136 ++ ++ ++ ++state 75 ++ ++ expr -> nonnull_exprlist . (rule 39) ++ nonnull_exprlist -> nonnull_exprlist . ',' expr_no_commas (rule 43) ++ ++ ',' shift, and go to state 137 ++ ++ $default reduce using rule 39 (expr) ++ ++ ++ ++state 76 ++ ++ cast_expr -> unary_expr . (rule 51) ++ ++ $default reduce using rule 51 (cast_expr) ++ ++ ++ ++state 77 ++ ++ expr_no_commas -> cast_expr . (rule 54) ++ ++ $default reduce using rule 54 (expr_no_commas) ++ ++ ++ ++state 78 ++ ++ nonnull_exprlist -> expr_no_commas . (rule 42) ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ ASSIGN shift, and go to state 138 ++ '=' shift, and go to state 139 ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 42 (nonnull_exprlist) ++ ++ ++ ++state 79 ++ ++ unary_expr -> primary . (rule 44) ++ primary -> primary . '(' exprlist ')' (rule 79) ++ primary -> primary . '[' expr ']' (rule 80) ++ primary -> primary . '.' identifier (rule 81) ++ primary -> primary . POINTSAT identifier (rule 82) ++ primary -> primary . PLUSPLUS (rule 83) ++ primary -> primary . MINUSMINUS (rule 84) ++ ++ PLUSPLUS shift, and go to state 155 ++ MINUSMINUS shift, and go to state 156 ++ POINTSAT shift, and go to state 157 ++ '.' shift, and go to state 158 ++ '(' shift, and go to state 159 ++ '[' shift, and go to state 160 ++ ++ $default reduce using rule 44 (unary_expr) ++ ++ ++ ++state 80 ++ ++ primary -> string . (rule 74) ++ string -> string . STRING (rule 86) ++ ++ STRING shift, and go to state 124 ++ ++ $default reduce using rule 74 (primary) ++ ++ ++ ++state 81 ++ ++ typename -> typed_typespecs . absdcl (rule 199) ++ ++ '*' shift, and go to state 161 ++ '(' shift, and go to state 162 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 201 (absdcl) ++ ++ absdcl go to state 164 ++ absdcl1 go to state 165 ++ ++ ++ ++state 82 ++ ++ typed_typespecs -> typespec . reserved_typespecquals (rule 107) ++ ++ $default reduce using rule 109 (reserved_typespecquals) ++ ++ reserved_typespecquals go to state 166 ++ ++ ++ ++state 83 ++ ++ typespec -> TYPEOF '(' typename . ')' (rule 115) ++ ++ ')' shift, and go to state 167 ++ ++ ++ ++state 84 ++ ++ typed_typespecs -> nonempty_type_quals . typespec reserved_typespecquals (rule 108) ++ typename -> nonempty_type_quals . absdcl (rule 200) ++ nonempty_type_quals -> nonempty_type_quals . TYPE_QUAL (rule 204) ++ ++ TYPENAME shift, and go to state 5 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 168 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ '*' shift, and go to state 161 ++ '(' shift, and go to state 162 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 201 (absdcl) ++ ++ typespec go to state 169 ++ structsp go to state 22 ++ absdcl go to state 170 ++ absdcl1 go to state 165 ++ ++ ++ ++state 85 ++ ++ notype_declarator -> '*' type_quals . notype_declarator (rule 160) ++ type_quals -> type_quals . TYPE_QUAL (rule 206) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPE_QUAL shift, and go to state 171 ++ '*' shift, and go to state 37 ++ '(' shift, and go to state 38 ++ ++ notype_declarator go to state 172 ++ ++ ++ ++state 86 ++ ++ notype_declarator -> notype_declarator . '(' parmlist_or_identifiers (rule 158) ++ notype_declarator -> '(' notype_declarator . ')' (rule 159) ++ notype_declarator -> notype_declarator . '[' expr ']' (rule 161) ++ notype_declarator -> notype_declarator . '[' ']' (rule 162) ++ ++ '(' shift, and go to state 91 ++ '[' shift, and go to state 92 ++ ')' shift, and go to state 173 ++ ++ ++ ++state 87 ++ ++ datadef -> setspecs notype_initdecls ';' . (rule 10) ++ ++ $default reduce using rule 10 (datadef) ++ ++ ++ ++state 88 ++ ++ notype_initdecls -> notype_initdecls ',' . initdcl (rule 122) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ initdcl go to state 174 ++ declarator go to state 175 ++ after_type_declarator go to state 101 ++ notype_declarator go to state 102 ++ ++ ++ ++state 89 ++ ++ fndef -> setspecs notype_declarator error . (rule 29) ++ ++ $default reduce using rule 29 (fndef) ++ ++ ++ ++state 90 ++ ++ maybeasm -> ASM . '(' string ')' (rule 124) ++ ++ '(' shift, and go to state 176 ++ ++ ++ ++state 91 ++ ++ notype_declarator -> notype_declarator '(' . parmlist_or_identifiers (rule 158) ++ ++ $default reduce using rule 277 (@30) ++ ++ parmlist_or_identifiers go to state 177 ++ @30 go to state 178 ++ ++ ++ ++state 92 ++ ++ notype_declarator -> notype_declarator '[' . expr ']' (rule 161) ++ notype_declarator -> notype_declarator '[' . ']' (rule 162) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ']' shift, and go to state 179 ++ ++ unop go to state 73 ++ expr go to state 180 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 93 ++ ++ fndef -> setspecs notype_declarator @7 . xdecls @8 compstmt_or_error (rule 28) ++ ++ error shift, and go to state 181 ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ++ error [reduce using rule 87 (xdecls)] ++ '{' reduce using rule 87 (xdecls) ++ ++ xdecls go to state 182 ++ decls go to state 183 ++ decl go to state 184 ++ typed_declspecs go to state 185 ++ declmods go to state 186 ++ typespec go to state 21 ++ structsp go to state 22 ++ errstmt go to state 187 ++ ++ ++ ++state 94 ++ ++ notype_initdcl -> notype_declarator maybeasm . maybe_attribute '=' @11 init (rule 129) ++ notype_initdcl -> notype_declarator maybeasm . maybe_attribute (rule 130) ++ ++ ATTRIBUTE shift, and go to state 188 ++ ++ $default reduce using rule 131 (maybe_attribute) ++ ++ maybe_attribute go to state 189 ++ ++ ++ ++state 95 ++ ++ after_type_declarator -> TYPENAME . (rule 152) ++ ++ $default reduce using rule 152 (after_type_declarator) ++ ++ ++ ++state 96 ++ ++ after_type_declarator -> '*' . type_quals after_type_declarator (rule 151) ++ notype_declarator -> '*' . type_quals notype_declarator (rule 160) ++ ++ $default reduce using rule 205 (type_quals) ++ ++ type_quals go to state 190 ++ ++ ++ ++state 97 ++ ++ after_type_declarator -> '(' . after_type_declarator ')' (rule 147) ++ notype_declarator -> '(' . notype_declarator ')' (rule 159) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ after_type_declarator go to state 191 ++ notype_declarator go to state 86 ++ ++ ++ ++state 98 ++ ++ datadef -> typed_declspecs setspecs initdecls . ';' (rule 12) ++ initdecls -> initdecls . ',' initdcl (rule 120) ++ ++ ';' shift, and go to state 192 ++ ',' shift, and go to state 193 ++ ++ ++ ++state 99 ++ ++ initdecls -> initdcl . (rule 119) ++ ++ $default reduce using rule 119 (initdecls) ++ ++ ++ ++state 100 ++ ++ fndef -> typed_declspecs setspecs declarator . @3 xdecls @4 compstmt_or_error (rule 20) ++ fndef -> typed_declspecs setspecs declarator . error (rule 21) ++ initdcl -> declarator . maybeasm maybe_attribute '=' @10 init (rule 126) ++ initdcl -> declarator . maybeasm maybe_attribute (rule 127) ++ ++ error shift, and go to state 194 ++ ASM shift, and go to state 90 ++ ++ error [reduce using rule 18 (@3)] ++ TYPENAME reduce using rule 18 (@3) ++ SCSPEC reduce using rule 18 (@3) ++ TYPESPEC reduce using rule 18 (@3) ++ TYPE_QUAL reduce using rule 18 (@3) ++ ENUM reduce using rule 18 (@3) ++ STRUCT reduce using rule 18 (@3) ++ UNION reduce using rule 18 (@3) ++ TYPEOF reduce using rule 18 (@3) ++ ATTRIBUTE reduce using rule 123 (maybeasm) ++ '=' reduce using rule 123 (maybeasm) ++ ';' reduce using rule 123 (maybeasm) ++ ',' reduce using rule 123 (maybeasm) ++ '{' reduce using rule 18 (@3) ++ ++ @3 go to state 195 ++ maybeasm go to state 196 ++ ++ ++ ++state 101 ++ ++ declarator -> after_type_declarator . (rule 145) ++ after_type_declarator -> after_type_declarator . '(' parmlist_or_identifiers (rule 148) ++ after_type_declarator -> after_type_declarator . '[' expr ']' (rule 149) ++ after_type_declarator -> after_type_declarator . '[' ']' (rule 150) ++ ++ '(' shift, and go to state 197 ++ '[' shift, and go to state 198 ++ ++ $default reduce using rule 145 (declarator) ++ ++ ++ ++state 102 ++ ++ declarator -> notype_declarator . (rule 146) ++ notype_declarator -> notype_declarator . '(' parmlist_or_identifiers (rule 158) ++ notype_declarator -> notype_declarator . '[' expr ']' (rule 161) ++ notype_declarator -> notype_declarator . '[' ']' (rule 162) ++ ++ '(' shift, and go to state 91 ++ '[' shift, and go to state 92 ++ ++ $default reduce using rule 146 (declarator) ++ ++ ++ ++state 103 ++ ++ datadef -> declmods setspecs notype_initdecls . ';' (rule 11) ++ notype_initdecls -> notype_initdecls . ',' initdcl (rule 122) ++ ++ ';' shift, and go to state 199 ++ ',' shift, and go to state 88 ++ ++ ++ ++state 104 ++ ++ fndef -> declmods setspecs notype_declarator . @5 xdecls @6 compstmt_or_error (rule 24) ++ fndef -> declmods setspecs notype_declarator . error (rule 25) ++ notype_initdcl -> notype_declarator . maybeasm maybe_attribute '=' @11 init (rule 129) ++ notype_initdcl -> notype_declarator . maybeasm maybe_attribute (rule 130) ++ notype_declarator -> notype_declarator . '(' parmlist_or_identifiers (rule 158) ++ notype_declarator -> notype_declarator . '[' expr ']' (rule 161) ++ notype_declarator -> notype_declarator . '[' ']' (rule 162) ++ ++ error shift, and go to state 200 ++ ASM shift, and go to state 90 ++ '(' shift, and go to state 91 ++ '[' shift, and go to state 92 ++ ++ error [reduce using rule 22 (@5)] ++ TYPENAME reduce using rule 22 (@5) ++ SCSPEC reduce using rule 22 (@5) ++ TYPESPEC reduce using rule 22 (@5) ++ TYPE_QUAL reduce using rule 22 (@5) ++ ENUM reduce using rule 22 (@5) ++ STRUCT reduce using rule 22 (@5) ++ UNION reduce using rule 22 (@5) ++ TYPEOF reduce using rule 22 (@5) ++ ATTRIBUTE reduce using rule 123 (maybeasm) ++ '=' reduce using rule 123 (maybeasm) ++ ';' reduce using rule 123 (maybeasm) ++ ',' reduce using rule 123 (maybeasm) ++ '{' reduce using rule 22 (@5) ++ ++ @5 go to state 201 ++ maybeasm go to state 94 ++ ++ ++ ++state 105 ++ ++ typed_declspecs -> declmods typespec reserved_declspecs . (rule 99) ++ reserved_declspecs -> reserved_declspecs . typespecqual_reserved (rule 101) ++ reserved_declspecs -> reserved_declspecs . SCSPEC (rule 102) ++ ++ SCSPEC shift, and go to state 106 ++ TYPESPEC shift, and go to state 107 ++ TYPE_QUAL shift, and go to state 108 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ ++ $default reduce using rule 99 (typed_declspecs) ++ ++ typespecqual_reserved go to state 109 ++ structsp go to state 110 ++ ++ ++ ++state 106 ++ ++ reserved_declspecs -> reserved_declspecs SCSPEC . (rule 102) ++ ++ $default reduce using rule 102 (reserved_declspecs) ++ ++ ++ ++state 107 ++ ++ typespecqual_reserved -> TYPESPEC . (rule 116) ++ ++ $default reduce using rule 116 (typespecqual_reserved) ++ ++ ++ ++state 108 ++ ++ typespecqual_reserved -> TYPE_QUAL . (rule 117) ++ ++ $default reduce using rule 117 (typespecqual_reserved) ++ ++ ++ ++state 109 ++ ++ reserved_declspecs -> reserved_declspecs typespecqual_reserved . (rule 101) ++ ++ $default reduce using rule 101 (reserved_declspecs) ++ ++ ++ ++state 110 ++ ++ typespecqual_reserved -> structsp . (rule 118) ++ ++ $default reduce using rule 118 (typespecqual_reserved) ++ ++ ++ ++state 111 ++ ++ enumerator -> identifier . (rule 197) ++ enumerator -> identifier . '=' expr_no_commas (rule 198) ++ ++ '=' shift, and go to state 202 ++ ++ $default reduce using rule 197 (enumerator) ++ ++ ++ ++state 112 ++ ++ structsp -> ENUM '{' @15 enumlist . maybecomma_warn '}' (rule 175) ++ enumlist -> enumlist . ',' enumerator (rule 196) ++ ++ ',' shift, and go to state 203 ++ ++ $default reduce using rule 179 (maybecomma_warn) ++ ++ maybecomma_warn go to state 204 ++ ++ ++ ++state 113 ++ ++ enumlist -> enumerator . (rule 195) ++ ++ $default reduce using rule 195 (enumlist) ++ ++ ++ ++state 114 ++ ++ structsp -> ENUM identifier '{' @14 . enumlist maybecomma_warn '}' (rule 173) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ ++ identifier go to state 111 ++ enumlist go to state 205 ++ enumerator go to state 113 ++ ++ ++ ++state 115 ++ ++ structsp -> STRUCT '{' component_decl_list '}' . (rule 166) ++ ++ $default reduce using rule 166 (structsp) ++ ++ ++ ++state 116 ++ ++ component_decl -> error . (rule 188) ++ ++ $default reduce using rule 188 (component_decl) ++ ++ ++ ++state 117 ++ ++ component_decl_list2 -> component_decl_list2 ';' . (rule 185) ++ ++ $default reduce using rule 185 (component_decl_list2) ++ ++ ++ ++state 118 ++ ++ component_decl -> typed_typespecs . setspecs components (rule 186) ++ ++ $default reduce using rule 93 (setspecs) ++ ++ setspecs go to state 206 ++ ++ ++ ++state 119 ++ ++ component_decl_list -> component_decl_list2 component_decl . (rule 182) ++ component_decl_list2 -> component_decl_list2 component_decl . ';' (rule 184) ++ ++ ';' shift, and go to state 207 ++ ++ $default reduce using rule 182 (component_decl_list) ++ ++ ++ ++state 120 ++ ++ typed_typespecs -> nonempty_type_quals . typespec reserved_typespecquals (rule 108) ++ component_decl -> nonempty_type_quals . setspecs components (rule 187) ++ nonempty_type_quals -> nonempty_type_quals . TYPE_QUAL (rule 204) ++ ++ TYPENAME shift, and go to state 5 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 168 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ++ TYPENAME [reduce using rule 93 (setspecs)] ++ $default reduce using rule 93 (setspecs) ++ ++ setspecs go to state 208 ++ typespec go to state 169 ++ structsp go to state 22 ++ ++ ++ ++state 121 ++ ++ structsp -> STRUCT identifier '{' @12 . component_decl_list '}' (rule 165) ++ ++ $default reduce using rule 183 (component_decl_list2) ++ ++ component_decl_list go to state 209 ++ component_decl_list2 go to state 53 ++ ++ ++ ++state 122 ++ ++ structsp -> UNION '{' component_decl_list '}' . (rule 170) ++ ++ $default reduce using rule 170 (structsp) ++ ++ ++ ++state 123 ++ ++ structsp -> UNION identifier '{' @13 . component_decl_list '}' (rule 169) ++ ++ $default reduce using rule 183 (component_decl_list2) ++ ++ component_decl_list go to state 210 ++ component_decl_list2 go to state 53 ++ ++ ++ ++state 124 ++ ++ string -> string STRING . (rule 86) ++ ++ $default reduce using rule 86 (string) ++ ++ ++ ++state 125 ++ ++ extdef -> ASM '(' string ')' . ';' (rule 9) ++ ++ ';' shift, and go to state 211 ++ ++ ++ ++state 126 ++ ++ unary_expr -> SIZEOF '(' . typename ')' (rule 48) ++ primary -> '(' . expr ')' (rule 75) ++ primary -> '(' . error ')' (rule 76) ++ primary -> '(' . @9 compstmt ')' (rule 78) ++ ++ error shift, and go to state 131 ++ IDENTIFIER shift, and go to state 59 ++ TYPENAME shift, and go to state 5 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 60 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ '{' reduce using rule 77 (@9) ++ ++ unop go to state 73 ++ expr go to state 132 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ @9 go to state 133 ++ string go to state 80 ++ typed_typespecs go to state 81 ++ typespec go to state 82 ++ structsp go to state 22 ++ typename go to state 212 ++ nonempty_type_quals go to state 84 ++ ++ ++ ++state 127 ++ ++ unary_expr -> SIZEOF unary_expr . (rule 47) ++ ++ $default reduce using rule 47 (unary_expr) ++ ++ ++ ++state 128 ++ ++ unary_expr -> ALIGNOF '(' . typename ')' (rule 50) ++ primary -> '(' . expr ')' (rule 75) ++ primary -> '(' . error ')' (rule 76) ++ primary -> '(' . @9 compstmt ')' (rule 78) ++ ++ error shift, and go to state 131 ++ IDENTIFIER shift, and go to state 59 ++ TYPENAME shift, and go to state 5 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 60 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ '{' reduce using rule 77 (@9) ++ ++ unop go to state 73 ++ expr go to state 132 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ @9 go to state 133 ++ string go to state 80 ++ typed_typespecs go to state 81 ++ typespec go to state 82 ++ structsp go to state 22 ++ typename go to state 213 ++ nonempty_type_quals go to state 84 ++ ++ ++ ++state 129 ++ ++ unary_expr -> ALIGNOF unary_expr . (rule 49) ++ ++ $default reduce using rule 49 (unary_expr) ++ ++ ++ ++state 130 ++ ++ unary_expr -> '*' cast_expr . (rule 45) ++ ++ $default reduce using rule 45 (unary_expr) ++ ++ ++ ++state 131 ++ ++ primary -> '(' error . ')' (rule 76) ++ ++ ')' shift, and go to state 214 ++ ++ ++ ++state 132 ++ ++ primary -> '(' expr . ')' (rule 75) ++ ++ ')' shift, and go to state 215 ++ ++ ++ ++state 133 ++ ++ primary -> '(' @9 . compstmt ')' (rule 78) ++ ++ '{' shift, and go to state 216 ++ ++ compstmt go to state 217 ++ ++ ++ ++state 134 ++ ++ cast_expr -> '(' typename . ')' cast_expr (rule 52) ++ cast_expr -> '(' typename . ')' '{' initlist maybecomma '}' (rule 53) ++ ++ ')' shift, and go to state 218 ++ ++ ++ ++state 135 ++ ++ unary_expr -> unop cast_expr . (rule 46) ++ ++ $default reduce using rule 46 (unary_expr) ++ ++ ++ ++state 136 ++ ++ typespec -> TYPEOF '(' expr ')' . (rule 114) ++ ++ $default reduce using rule 114 (typespec) ++ ++ ++ ++state 137 ++ ++ nonnull_exprlist -> nonnull_exprlist ',' . expr_no_commas (rule 43) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 219 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 138 ++ ++ expr_no_commas -> expr_no_commas ASSIGN . expr_no_commas (rule 71) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 220 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 139 ++ ++ expr_no_commas -> expr_no_commas '=' . expr_no_commas (rule 70) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 221 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 140 ++ ++ expr_no_commas -> expr_no_commas '?' . xexpr ':' expr_no_commas (rule 69) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ $default reduce using rule 266 (xexpr) ++ ++ unop go to state 73 ++ expr go to state 222 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ xexpr go to state 223 ++ ++ ++ ++state 141 ++ ++ expr_no_commas -> expr_no_commas OROR . expr_no_commas (rule 68) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 224 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 142 ++ ++ expr_no_commas -> expr_no_commas ANDAND . expr_no_commas (rule 67) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 225 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 143 ++ ++ expr_no_commas -> expr_no_commas '|' . expr_no_commas (rule 65) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 226 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 144 ++ ++ expr_no_commas -> expr_no_commas '^' . expr_no_commas (rule 66) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 227 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 145 ++ ++ expr_no_commas -> expr_no_commas '&' . expr_no_commas (rule 64) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 228 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 146 ++ ++ expr_no_commas -> expr_no_commas EQCOMPARE . expr_no_commas (rule 63) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 229 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 147 ++ ++ expr_no_commas -> expr_no_commas ARITHCOMPARE . expr_no_commas (rule 62) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 230 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 148 ++ ++ expr_no_commas -> expr_no_commas LSHIFT . expr_no_commas (rule 60) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 231 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 149 ++ ++ expr_no_commas -> expr_no_commas RSHIFT . expr_no_commas (rule 61) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 232 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 150 ++ ++ expr_no_commas -> expr_no_commas '+' . expr_no_commas (rule 55) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 233 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 151 ++ ++ expr_no_commas -> expr_no_commas '-' . expr_no_commas (rule 56) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 234 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 152 ++ ++ expr_no_commas -> expr_no_commas '*' . expr_no_commas (rule 57) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 235 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 153 ++ ++ expr_no_commas -> expr_no_commas '/' . expr_no_commas (rule 58) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 236 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 154 ++ ++ expr_no_commas -> expr_no_commas '%' . expr_no_commas (rule 59) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 237 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 155 ++ ++ primary -> primary PLUSPLUS . (rule 83) ++ ++ $default reduce using rule 83 (primary) ++ ++ ++ ++state 156 ++ ++ primary -> primary MINUSMINUS . (rule 84) ++ ++ $default reduce using rule 84 (primary) ++ ++ ++ ++state 157 ++ ++ primary -> primary POINTSAT . identifier (rule 82) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ ++ identifier go to state 238 ++ ++ ++ ++state 158 ++ ++ primary -> primary '.' . identifier (rule 81) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ ++ identifier go to state 239 ++ ++ ++ ++state 159 ++ ++ primary -> primary '(' . exprlist ')' (rule 79) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ $default reduce using rule 40 (exprlist) ++ ++ unop go to state 73 ++ exprlist go to state 240 ++ nonnull_exprlist go to state 241 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 160 ++ ++ primary -> primary '[' . expr ']' (rule 80) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 242 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 161 ++ ++ absdcl1 -> '*' . type_quals absdcl1 (rule 208) ++ absdcl1 -> '*' . type_quals (rule 209) ++ ++ $default reduce using rule 205 (type_quals) ++ ++ type_quals go to state 243 ++ ++ ++ ++state 162 ++ ++ absdcl1 -> '(' . absdcl1 ')' (rule 207) ++ absdcl1 -> '(' . parmlist (rule 213) ++ ++ '*' shift, and go to state 161 ++ '(' shift, and go to state 162 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 275 (@29) ++ ++ absdcl1 go to state 244 ++ parmlist go to state 245 ++ @29 go to state 246 ++ ++ ++ ++state 163 ++ ++ absdcl1 -> '[' . expr ']' (rule 214) ++ absdcl1 -> '[' . ']' (rule 215) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ']' shift, and go to state 247 ++ ++ unop go to state 73 ++ expr go to state 248 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 164 ++ ++ typename -> typed_typespecs absdcl . (rule 199) ++ ++ $default reduce using rule 199 (typename) ++ ++ ++ ++state 165 ++ ++ absdcl -> absdcl1 . (rule 202) ++ absdcl1 -> absdcl1 . '(' parmlist (rule 210) ++ absdcl1 -> absdcl1 . '[' expr ']' (rule 211) ++ absdcl1 -> absdcl1 . '[' ']' (rule 212) ++ ++ '(' shift, and go to state 249 ++ '[' shift, and go to state 250 ++ ++ $default reduce using rule 202 (absdcl) ++ ++ ++ ++state 166 ++ ++ typed_typespecs -> typespec reserved_typespecquals . (rule 107) ++ reserved_typespecquals -> reserved_typespecquals . typespecqual_reserved (rule 110) ++ ++ TYPESPEC shift, and go to state 107 ++ TYPE_QUAL shift, and go to state 108 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ ++ $default reduce using rule 107 (typed_typespecs) ++ ++ typespecqual_reserved go to state 251 ++ structsp go to state 110 ++ ++ ++ ++state 167 ++ ++ typespec -> TYPEOF '(' typename ')' . (rule 115) ++ ++ $default reduce using rule 115 (typespec) ++ ++ ++ ++state 168 ++ ++ nonempty_type_quals -> nonempty_type_quals TYPE_QUAL . (rule 204) ++ ++ $default reduce using rule 204 (nonempty_type_quals) ++ ++ ++ ++state 169 ++ ++ typed_typespecs -> nonempty_type_quals typespec . reserved_typespecquals (rule 108) ++ ++ $default reduce using rule 109 (reserved_typespecquals) ++ ++ reserved_typespecquals go to state 252 ++ ++ ++ ++state 170 ++ ++ typename -> nonempty_type_quals absdcl . (rule 200) ++ ++ $default reduce using rule 200 (typename) ++ ++ ++ ++state 171 ++ ++ type_quals -> type_quals TYPE_QUAL . (rule 206) ++ ++ $default reduce using rule 206 (type_quals) ++ ++ ++ ++state 172 ++ ++ notype_declarator -> notype_declarator . '(' parmlist_or_identifiers (rule 158) ++ notype_declarator -> '*' type_quals notype_declarator . (rule 160) ++ notype_declarator -> notype_declarator . '[' expr ']' (rule 161) ++ notype_declarator -> notype_declarator . '[' ']' (rule 162) ++ ++ '(' shift, and go to state 91 ++ '[' shift, and go to state 92 ++ ++ $default reduce using rule 160 (notype_declarator) ++ ++ ++ ++state 173 ++ ++ notype_declarator -> '(' notype_declarator ')' . (rule 159) ++ ++ $default reduce using rule 159 (notype_declarator) ++ ++ ++ ++state 174 ++ ++ notype_initdecls -> notype_initdecls ',' initdcl . (rule 122) ++ ++ $default reduce using rule 122 (notype_initdecls) ++ ++ ++ ++state 175 ++ ++ initdcl -> declarator . maybeasm maybe_attribute '=' @10 init (rule 126) ++ initdcl -> declarator . maybeasm maybe_attribute (rule 127) ++ ++ ASM shift, and go to state 90 ++ ++ $default reduce using rule 123 (maybeasm) ++ ++ maybeasm go to state 196 ++ ++ ++ ++state 176 ++ ++ maybeasm -> ASM '(' . string ')' (rule 124) ++ ++ STRING shift, and go to state 57 ++ ++ string go to state 253 ++ ++ ++ ++state 177 ++ ++ notype_declarator -> notype_declarator '(' parmlist_or_identifiers . (rule 158) ++ ++ $default reduce using rule 158 (notype_declarator) ++ ++ ++ ++state 178 ++ ++ parmlist_or_identifiers -> @30 . parmlist_or_identifiers_1 (rule 278) ++ ++ error shift, and go to state 254 ++ IDENTIFIER shift, and go to state 255 ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ++ ')' reduce using rule 284 (parmlist_2) ++ ++ typed_declspecs go to state 256 ++ declmods go to state 257 ++ typespec go to state 21 ++ structsp go to state 22 ++ parmlist_or_identifiers_1 go to state 258 ++ parmlist_2 go to state 259 ++ parms go to state 260 ++ parm go to state 261 ++ identifiers go to state 262 ++ ++ ++ ++state 179 ++ ++ notype_declarator -> notype_declarator '[' ']' . (rule 162) ++ ++ $default reduce using rule 162 (notype_declarator) ++ ++ ++ ++state 180 ++ ++ notype_declarator -> notype_declarator '[' expr . ']' (rule 161) ++ ++ ']' shift, and go to state 263 ++ ++ ++ ++state 181 ++ ++ errstmt -> error . ';' (rule 221) ++ ++ ';' shift, and go to state 264 ++ ++ ++ ++state 182 ++ ++ fndef -> setspecs notype_declarator @7 xdecls . @8 compstmt_or_error (rule 28) ++ ++ $default reduce using rule 27 (@8) ++ ++ @8 go to state 265 ++ ++ ++ ++state 183 ++ ++ xdecls -> decls . (rule 88) ++ decls -> decls . decl (rule 91) ++ ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ++ $default reduce using rule 88 (xdecls) ++ ++ decl go to state 266 ++ typed_declspecs go to state 185 ++ declmods go to state 186 ++ typespec go to state 21 ++ structsp go to state 22 ++ ++ ++ ++state 184 ++ ++ decls -> decl . (rule 89) ++ decls -> decl . errstmt (rule 92) ++ ++ error shift, and go to state 181 ++ ++ error [reduce using rule 89 (decls)] ++ IDENTIFIER reduce using rule 89 (decls) ++ TYPENAME reduce using rule 89 (decls) ++ SCSPEC reduce using rule 89 (decls) ++ TYPESPEC reduce using rule 89 (decls) ++ TYPE_QUAL reduce using rule 89 (decls) ++ CONSTANT reduce using rule 89 (decls) ++ STRING reduce using rule 89 (decls) ++ SIZEOF reduce using rule 89 (decls) ++ ENUM reduce using rule 89 (decls) ++ STRUCT reduce using rule 89 (decls) ++ UNION reduce using rule 89 (decls) ++ IF reduce using rule 89 (decls) ++ WHILE reduce using rule 89 (decls) ++ DO reduce using rule 89 (decls) ++ FOR reduce using rule 89 (decls) ++ SWITCH reduce using rule 89 (decls) ++ CASE reduce using rule 89 (decls) ++ DEFAULT reduce using rule 89 (decls) ++ BREAK reduce using rule 89 (decls) ++ CONTINUE reduce using rule 89 (decls) ++ RETURN reduce using rule 89 (decls) ++ GOTO reduce using rule 89 (decls) ++ ASM reduce using rule 89 (decls) ++ TYPEOF reduce using rule 89 (decls) ++ ALIGNOF reduce using rule 89 (decls) ++ '&' reduce using rule 89 (decls) ++ '+' reduce using rule 89 (decls) ++ '-' reduce using rule 89 (decls) ++ '*' reduce using rule 89 (decls) ++ PLUSPLUS reduce using rule 89 (decls) ++ MINUSMINUS reduce using rule 89 (decls) ++ '(' reduce using rule 89 (decls) ++ ';' reduce using rule 89 (decls) ++ '}' reduce using rule 89 (decls) ++ '~' reduce using rule 89 (decls) ++ '!' reduce using rule 89 (decls) ++ '{' reduce using rule 89 (decls) ++ ++ errstmt go to state 267 ++ ++ ++ ++state 185 ++ ++ decl -> typed_declspecs . setspecs initdecls ';' (rule 94) ++ decl -> typed_declspecs . ';' (rule 96) ++ ++ ';' shift, and go to state 268 ++ ++ $default reduce using rule 93 (setspecs) ++ ++ setspecs go to state 269 ++ ++ ++ ++state 186 ++ ++ decl -> declmods . setspecs notype_initdecls ';' (rule 95) ++ decl -> declmods . ';' (rule 97) ++ typed_declspecs -> declmods . typespec reserved_declspecs (rule 99) ++ declmods -> declmods . TYPE_QUAL (rule 105) ++ declmods -> declmods . SCSPEC (rule 106) ++ ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 44 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 45 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ';' shift, and go to state 270 ++ ++ $default reduce using rule 93 (setspecs) ++ ++ setspecs go to state 271 ++ typespec go to state 48 ++ structsp go to state 22 ++ ++ ++ ++state 187 ++ ++ decls -> errstmt . (rule 90) ++ ++ $default reduce using rule 90 (decls) ++ ++ ++ ++state 188 ++ ++ maybe_attribute -> ATTRIBUTE . '(' '(' attribute_list ')' ')' (rule 132) ++ ++ '(' shift, and go to state 272 ++ ++ ++ ++state 189 ++ ++ notype_initdcl -> notype_declarator maybeasm maybe_attribute . '=' @11 init (rule 129) ++ notype_initdcl -> notype_declarator maybeasm maybe_attribute . (rule 130) ++ ++ '=' shift, and go to state 273 ++ ++ $default reduce using rule 130 (notype_initdcl) ++ ++ ++ ++state 190 ++ ++ after_type_declarator -> '*' type_quals . after_type_declarator (rule 151) ++ notype_declarator -> '*' type_quals . notype_declarator (rule 160) ++ type_quals -> type_quals . TYPE_QUAL (rule 206) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ TYPE_QUAL shift, and go to state 171 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ after_type_declarator go to state 274 ++ notype_declarator go to state 172 ++ ++ ++ ++state 191 ++ ++ after_type_declarator -> '(' after_type_declarator . ')' (rule 147) ++ after_type_declarator -> after_type_declarator . '(' parmlist_or_identifiers (rule 148) ++ after_type_declarator -> after_type_declarator . '[' expr ']' (rule 149) ++ after_type_declarator -> after_type_declarator . '[' ']' (rule 150) ++ ++ '(' shift, and go to state 197 ++ '[' shift, and go to state 198 ++ ')' shift, and go to state 275 ++ ++ ++ ++state 192 ++ ++ datadef -> typed_declspecs setspecs initdecls ';' . (rule 12) ++ ++ $default reduce using rule 12 (datadef) ++ ++ ++ ++state 193 ++ ++ initdecls -> initdecls ',' . initdcl (rule 120) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ initdcl go to state 276 ++ declarator go to state 175 ++ after_type_declarator go to state 101 ++ notype_declarator go to state 102 ++ ++ ++ ++state 194 ++ ++ fndef -> typed_declspecs setspecs declarator error . (rule 21) ++ ++ $default reduce using rule 21 (fndef) ++ ++ ++ ++state 195 ++ ++ fndef -> typed_declspecs setspecs declarator @3 . xdecls @4 compstmt_or_error (rule 20) ++ ++ error shift, and go to state 181 ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ++ error [reduce using rule 87 (xdecls)] ++ '{' reduce using rule 87 (xdecls) ++ ++ xdecls go to state 277 ++ decls go to state 183 ++ decl go to state 184 ++ typed_declspecs go to state 185 ++ declmods go to state 186 ++ typespec go to state 21 ++ structsp go to state 22 ++ errstmt go to state 187 ++ ++ ++ ++state 196 ++ ++ initdcl -> declarator maybeasm . maybe_attribute '=' @10 init (rule 126) ++ initdcl -> declarator maybeasm . maybe_attribute (rule 127) ++ ++ ATTRIBUTE shift, and go to state 188 ++ ++ $default reduce using rule 131 (maybe_attribute) ++ ++ maybe_attribute go to state 278 ++ ++ ++ ++state 197 ++ ++ after_type_declarator -> after_type_declarator '(' . parmlist_or_identifiers (rule 148) ++ ++ $default reduce using rule 277 (@30) ++ ++ parmlist_or_identifiers go to state 279 ++ @30 go to state 178 ++ ++ ++ ++state 198 ++ ++ after_type_declarator -> after_type_declarator '[' . expr ']' (rule 149) ++ after_type_declarator -> after_type_declarator '[' . ']' (rule 150) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ']' shift, and go to state 280 ++ ++ unop go to state 73 ++ expr go to state 281 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 199 ++ ++ datadef -> declmods setspecs notype_initdecls ';' . (rule 11) ++ ++ $default reduce using rule 11 (datadef) ++ ++ ++ ++state 200 ++ ++ fndef -> declmods setspecs notype_declarator error . (rule 25) ++ ++ $default reduce using rule 25 (fndef) ++ ++ ++ ++state 201 ++ ++ fndef -> declmods setspecs notype_declarator @5 . xdecls @6 compstmt_or_error (rule 24) ++ ++ error shift, and go to state 181 ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ++ error [reduce using rule 87 (xdecls)] ++ '{' reduce using rule 87 (xdecls) ++ ++ xdecls go to state 282 ++ decls go to state 183 ++ decl go to state 184 ++ typed_declspecs go to state 185 ++ declmods go to state 186 ++ typespec go to state 21 ++ structsp go to state 22 ++ errstmt go to state 187 ++ ++ ++ ++state 202 ++ ++ enumerator -> identifier '=' . expr_no_commas (rule 198) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 283 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 203 ++ ++ maybecomma_warn -> ',' . (rule 180) ++ enumlist -> enumlist ',' . enumerator (rule 196) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ ++ $default reduce using rule 180 (maybecomma_warn) ++ ++ identifier go to state 111 ++ enumerator go to state 284 ++ ++ ++ ++state 204 ++ ++ structsp -> ENUM '{' @15 enumlist maybecomma_warn . '}' (rule 175) ++ ++ '}' shift, and go to state 285 ++ ++ ++ ++state 205 ++ ++ structsp -> ENUM identifier '{' @14 enumlist . maybecomma_warn '}' (rule 173) ++ enumlist -> enumlist . ',' enumerator (rule 196) ++ ++ ',' shift, and go to state 203 ++ ++ $default reduce using rule 179 (maybecomma_warn) ++ ++ maybecomma_warn go to state 286 ++ ++ ++ ++state 206 ++ ++ component_decl -> typed_typespecs setspecs . components (rule 186) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ ':' shift, and go to state 287 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ $default reduce using rule 189 (components) ++ ++ declarator go to state 288 ++ after_type_declarator go to state 101 ++ notype_declarator go to state 102 ++ components go to state 289 ++ component_declarator go to state 290 ++ ++ ++ ++state 207 ++ ++ component_decl_list2 -> component_decl_list2 component_decl ';' . (rule 184) ++ ++ $default reduce using rule 184 (component_decl_list2) ++ ++ ++ ++state 208 ++ ++ component_decl -> nonempty_type_quals setspecs . components (rule 187) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ ':' shift, and go to state 287 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ $default reduce using rule 189 (components) ++ ++ declarator go to state 288 ++ after_type_declarator go to state 101 ++ notype_declarator go to state 102 ++ components go to state 291 ++ component_declarator go to state 290 ++ ++ ++ ++state 209 ++ ++ structsp -> STRUCT identifier '{' @12 component_decl_list . '}' (rule 165) ++ ++ '}' shift, and go to state 292 ++ ++ ++ ++state 210 ++ ++ structsp -> UNION identifier '{' @13 component_decl_list . '}' (rule 169) ++ ++ '}' shift, and go to state 293 ++ ++ ++ ++state 211 ++ ++ extdef -> ASM '(' string ')' ';' . (rule 9) ++ ++ $default reduce using rule 9 (extdef) ++ ++ ++ ++state 212 ++ ++ unary_expr -> SIZEOF '(' typename . ')' (rule 48) ++ ++ ')' shift, and go to state 294 ++ ++ ++ ++state 213 ++ ++ unary_expr -> ALIGNOF '(' typename . ')' (rule 50) ++ ++ ')' shift, and go to state 295 ++ ++ ++ ++state 214 ++ ++ primary -> '(' error ')' . (rule 76) ++ ++ $default reduce using rule 76 (primary) ++ ++ ++ ++state 215 ++ ++ primary -> '(' expr ')' . (rule 75) ++ ++ $default reduce using rule 75 (primary) ++ ++ ++ ++state 216 ++ ++ compstmt -> '{' . '}' (rule 225) ++ compstmt -> '{' . pushlevel decls xstmts '}' (rule 226) ++ compstmt -> '{' . pushlevel error '}' (rule 227) ++ compstmt -> '{' . pushlevel stmts '}' (rule 228) ++ ++ '}' shift, and go to state 296 ++ ++ $default reduce using rule 222 (pushlevel) ++ ++ pushlevel go to state 297 ++ ++ ++ ++state 217 ++ ++ primary -> '(' @9 compstmt . ')' (rule 78) ++ ++ ')' shift, and go to state 298 ++ ++ ++ ++state 218 ++ ++ cast_expr -> '(' typename ')' . cast_expr (rule 52) ++ cast_expr -> '(' typename ')' . '{' initlist maybecomma '}' (rule 53) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 299 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 300 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 219 ++ ++ nonnull_exprlist -> nonnull_exprlist ',' expr_no_commas . (rule 43) ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ ASSIGN shift, and go to state 138 ++ '=' shift, and go to state 139 ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 43 (nonnull_exprlist) ++ ++ ++ ++state 220 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ expr_no_commas -> expr_no_commas ASSIGN expr_no_commas . (rule 71) ++ ++ ASSIGN shift, and go to state 138 ++ '=' shift, and go to state 139 ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 71 (expr_no_commas) ++ ++ ++ ++state 221 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas '=' expr_no_commas . (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ ASSIGN shift, and go to state 138 ++ '=' shift, and go to state 139 ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 70 (expr_no_commas) ++ ++ ++ ++state 222 ++ ++ xexpr -> expr . (rule 267) ++ ++ $default reduce using rule 267 (xexpr) ++ ++ ++ ++state 223 ++ ++ expr_no_commas -> expr_no_commas '?' xexpr . ':' expr_no_commas (rule 69) ++ ++ ':' shift, and go to state 301 ++ ++ ++ ++state 224 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas OROR expr_no_commas . (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 68 (expr_no_commas) ++ ++ ++ ++state 225 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas ANDAND expr_no_commas . (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 67 (expr_no_commas) ++ ++ ++ ++state 226 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas '|' expr_no_commas . (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 65 (expr_no_commas) ++ ++ ++ ++state 227 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas '^' expr_no_commas . (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 66 (expr_no_commas) ++ ++ ++ ++state 228 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas '&' expr_no_commas . (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 64 (expr_no_commas) ++ ++ ++ ++state 229 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas EQCOMPARE expr_no_commas . (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 63 (expr_no_commas) ++ ++ ++ ++state 230 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas ARITHCOMPARE expr_no_commas . (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 62 (expr_no_commas) ++ ++ ++ ++state 231 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas LSHIFT expr_no_commas . (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 60 (expr_no_commas) ++ ++ ++ ++state 232 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas RSHIFT expr_no_commas . (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 61 (expr_no_commas) ++ ++ ++ ++state 233 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas '+' expr_no_commas . (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 55 (expr_no_commas) ++ ++ ++ ++state 234 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas '-' expr_no_commas . (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 56 (expr_no_commas) ++ ++ ++ ++state 235 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas '*' expr_no_commas . (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ ++ $default reduce using rule 57 (expr_no_commas) ++ ++ ++ ++state 236 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas '/' expr_no_commas . (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ ++ $default reduce using rule 58 (expr_no_commas) ++ ++ ++ ++state 237 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas '%' expr_no_commas . (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ ++ $default reduce using rule 59 (expr_no_commas) ++ ++ ++ ++state 238 ++ ++ primary -> primary POINTSAT identifier . (rule 82) ++ ++ $default reduce using rule 82 (primary) ++ ++ ++ ++state 239 ++ ++ primary -> primary '.' identifier . (rule 81) ++ ++ $default reduce using rule 81 (primary) ++ ++ ++ ++state 240 ++ ++ primary -> primary '(' exprlist . ')' (rule 79) ++ ++ ')' shift, and go to state 302 ++ ++ ++ ++state 241 ++ ++ exprlist -> nonnull_exprlist . (rule 41) ++ nonnull_exprlist -> nonnull_exprlist . ',' expr_no_commas (rule 43) ++ ++ ',' shift, and go to state 137 ++ ++ $default reduce using rule 41 (exprlist) ++ ++ ++ ++state 242 ++ ++ primary -> primary '[' expr . ']' (rule 80) ++ ++ ']' shift, and go to state 303 ++ ++ ++ ++state 243 ++ ++ type_quals -> type_quals . TYPE_QUAL (rule 206) ++ absdcl1 -> '*' type_quals . absdcl1 (rule 208) ++ absdcl1 -> '*' type_quals . (rule 209) ++ ++ TYPE_QUAL shift, and go to state 171 ++ '*' shift, and go to state 161 ++ '(' shift, and go to state 162 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 209 (absdcl1) ++ ++ absdcl1 go to state 304 ++ ++ ++ ++state 244 ++ ++ absdcl1 -> '(' absdcl1 . ')' (rule 207) ++ absdcl1 -> absdcl1 . '(' parmlist (rule 210) ++ absdcl1 -> absdcl1 . '[' expr ']' (rule 211) ++ absdcl1 -> absdcl1 . '[' ']' (rule 212) ++ ++ '(' shift, and go to state 249 ++ '[' shift, and go to state 250 ++ ')' shift, and go to state 305 ++ ++ ++ ++state 245 ++ ++ absdcl1 -> '(' parmlist . (rule 213) ++ ++ $default reduce using rule 213 (absdcl1) ++ ++ ++ ++state 246 ++ ++ parmlist -> @29 . parmlist_1 (rule 276) ++ ++ error shift, and go to state 306 ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ++ ')' reduce using rule 284 (parmlist_2) ++ ++ typed_declspecs go to state 256 ++ declmods go to state 257 ++ typespec go to state 21 ++ structsp go to state 22 ++ parmlist_1 go to state 307 ++ parmlist_2 go to state 308 ++ parms go to state 260 ++ parm go to state 261 ++ ++ ++ ++state 247 ++ ++ absdcl1 -> '[' ']' . (rule 215) ++ ++ $default reduce using rule 215 (absdcl1) ++ ++ ++ ++state 248 ++ ++ absdcl1 -> '[' expr . ']' (rule 214) ++ ++ ']' shift, and go to state 309 ++ ++ ++ ++state 249 ++ ++ absdcl1 -> absdcl1 '(' . parmlist (rule 210) ++ ++ $default reduce using rule 275 (@29) ++ ++ parmlist go to state 310 ++ @29 go to state 246 ++ ++ ++ ++state 250 ++ ++ absdcl1 -> absdcl1 '[' . expr ']' (rule 211) ++ absdcl1 -> absdcl1 '[' . ']' (rule 212) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ']' shift, and go to state 311 ++ ++ unop go to state 73 ++ expr go to state 312 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 251 ++ ++ reserved_typespecquals -> reserved_typespecquals typespecqual_reserved . (rule 110) ++ ++ $default reduce using rule 110 (reserved_typespecquals) ++ ++ ++ ++state 252 ++ ++ typed_typespecs -> nonempty_type_quals typespec reserved_typespecquals . (rule 108) ++ reserved_typespecquals -> reserved_typespecquals . typespecqual_reserved (rule 110) ++ ++ TYPESPEC shift, and go to state 107 ++ TYPE_QUAL shift, and go to state 108 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ ++ $default reduce using rule 108 (typed_typespecs) ++ ++ typespecqual_reserved go to state 251 ++ structsp go to state 110 ++ ++ ++ ++state 253 ++ ++ string -> string . STRING (rule 86) ++ maybeasm -> ASM '(' string . ')' (rule 124) ++ ++ STRING shift, and go to state 124 ++ ')' shift, and go to state 313 ++ ++ ++ ++state 254 ++ ++ parmlist_or_identifiers_1 -> error . ')' (rule 281) ++ ++ ')' shift, and go to state 314 ++ ++ ++ ++state 255 ++ ++ identifiers -> IDENTIFIER . (rule 294) ++ ++ $default reduce using rule 294 (identifiers) ++ ++ ++ ++state 256 ++ ++ parm -> typed_declspecs . parm_declarator (rule 289) ++ parm -> typed_declspecs . notype_declarator (rule 290) ++ parm -> typed_declspecs . absdcl (rule 291) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 315 ++ '*' shift, and go to state 316 ++ '(' shift, and go to state 317 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 201 (absdcl) ++ ++ parm_declarator go to state 318 ++ notype_declarator go to state 319 ++ absdcl go to state 320 ++ absdcl1 go to state 165 ++ ++ ++ ++state 257 ++ ++ typed_declspecs -> declmods . typespec reserved_declspecs (rule 99) ++ declmods -> declmods . TYPE_QUAL (rule 105) ++ declmods -> declmods . SCSPEC (rule 106) ++ parm -> declmods . notype_declarator (rule 292) ++ parm -> declmods . absdcl (rule 293) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 44 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 45 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ '*' shift, and go to state 321 ++ '(' shift, and go to state 317 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 201 (absdcl) ++ ++ typespec go to state 48 ++ notype_declarator go to state 322 ++ structsp go to state 22 ++ absdcl go to state 323 ++ absdcl1 go to state 165 ++ ++ ++ ++state 258 ++ ++ parmlist_or_identifiers -> @30 parmlist_or_identifiers_1 . (rule 278) ++ ++ $default reduce using rule 278 (parmlist_or_identifiers) ++ ++ ++ ++state 259 ++ ++ parmlist_or_identifiers_1 -> parmlist_2 . ')' (rule 279) ++ ++ ')' shift, and go to state 324 ++ ++ ++ ++state 260 ++ ++ parmlist_2 -> parms . (rule 285) ++ parmlist_2 -> parms . ',' ELLIPSIS (rule 286) ++ parms -> parms . ',' parm (rule 288) ++ ++ ',' shift, and go to state 325 ++ ++ $default reduce using rule 285 (parmlist_2) ++ ++ ++ ++state 261 ++ ++ parms -> parm . (rule 287) ++ ++ $default reduce using rule 287 (parms) ++ ++ ++ ++state 262 ++ ++ parmlist_or_identifiers_1 -> identifiers . ')' (rule 280) ++ identifiers -> identifiers . ',' IDENTIFIER (rule 295) ++ ++ ')' shift, and go to state 326 ++ ',' shift, and go to state 327 ++ ++ ++ ++state 263 ++ ++ notype_declarator -> notype_declarator '[' expr ']' . (rule 161) ++ ++ $default reduce using rule 161 (notype_declarator) ++ ++ ++ ++state 264 ++ ++ errstmt -> error ';' . (rule 221) ++ ++ $default reduce using rule 221 (errstmt) ++ ++ ++ ++state 265 ++ ++ fndef -> setspecs notype_declarator @7 xdecls @8 . compstmt_or_error (rule 28) ++ ++ error shift, and go to state 328 ++ '{' shift, and go to state 216 ++ ++ compstmt_or_error go to state 329 ++ compstmt go to state 330 ++ ++ ++ ++state 266 ++ ++ decls -> decls decl . (rule 91) ++ ++ $default reduce using rule 91 (decls) ++ ++ ++ ++state 267 ++ ++ decls -> decl errstmt . (rule 92) ++ ++ $default reduce using rule 92 (decls) ++ ++ ++ ++state 268 ++ ++ decl -> typed_declspecs ';' . (rule 96) ++ ++ $default reduce using rule 96 (decl) ++ ++ ++ ++state 269 ++ ++ decl -> typed_declspecs setspecs . initdecls ';' (rule 94) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ initdecls go to state 331 ++ initdcl go to state 99 ++ declarator go to state 175 ++ after_type_declarator go to state 101 ++ notype_declarator go to state 102 ++ ++ ++ ++state 270 ++ ++ decl -> declmods ';' . (rule 97) ++ ++ $default reduce using rule 97 (decl) ++ ++ ++ ++state 271 ++ ++ decl -> declmods setspecs . notype_initdecls ';' (rule 95) ++ ++ IDENTIFIER shift, and go to state 36 ++ '*' shift, and go to state 37 ++ '(' shift, and go to state 38 ++ ++ notype_initdecls go to state 332 ++ notype_initdcl go to state 40 ++ notype_declarator go to state 333 ++ ++ ++ ++state 272 ++ ++ maybe_attribute -> ATTRIBUTE '(' . '(' attribute_list ')' ')' (rule 132) ++ ++ '(' shift, and go to state 334 ++ ++ ++ ++state 273 ++ ++ notype_initdcl -> notype_declarator maybeasm maybe_attribute '=' . @11 init (rule 129) ++ ++ $default reduce using rule 128 (@11) ++ ++ @11 go to state 335 ++ ++ ++ ++state 274 ++ ++ after_type_declarator -> after_type_declarator . '(' parmlist_or_identifiers (rule 148) ++ after_type_declarator -> after_type_declarator . '[' expr ']' (rule 149) ++ after_type_declarator -> after_type_declarator . '[' ']' (rule 150) ++ after_type_declarator -> '*' type_quals after_type_declarator . (rule 151) ++ ++ '(' shift, and go to state 197 ++ '[' shift, and go to state 198 ++ ++ $default reduce using rule 151 (after_type_declarator) ++ ++ ++ ++state 275 ++ ++ after_type_declarator -> '(' after_type_declarator ')' . (rule 147) ++ ++ $default reduce using rule 147 (after_type_declarator) ++ ++ ++ ++state 276 ++ ++ initdecls -> initdecls ',' initdcl . (rule 120) ++ ++ $default reduce using rule 120 (initdecls) ++ ++ ++ ++state 277 ++ ++ fndef -> typed_declspecs setspecs declarator @3 xdecls . @4 compstmt_or_error (rule 20) ++ ++ $default reduce using rule 19 (@4) ++ ++ @4 go to state 336 ++ ++ ++ ++state 278 ++ ++ initdcl -> declarator maybeasm maybe_attribute . '=' @10 init (rule 126) ++ initdcl -> declarator maybeasm maybe_attribute . (rule 127) ++ ++ '=' shift, and go to state 337 ++ ++ $default reduce using rule 127 (initdcl) ++ ++ ++ ++state 279 ++ ++ after_type_declarator -> after_type_declarator '(' parmlist_or_identifiers . (rule 148) ++ ++ $default reduce using rule 148 (after_type_declarator) ++ ++ ++ ++state 280 ++ ++ after_type_declarator -> after_type_declarator '[' ']' . (rule 150) ++ ++ $default reduce using rule 150 (after_type_declarator) ++ ++ ++ ++state 281 ++ ++ after_type_declarator -> after_type_declarator '[' expr . ']' (rule 149) ++ ++ ']' shift, and go to state 338 ++ ++ ++ ++state 282 ++ ++ fndef -> declmods setspecs notype_declarator @5 xdecls . @6 compstmt_or_error (rule 24) ++ ++ $default reduce using rule 23 (@6) ++ ++ @6 go to state 339 ++ ++ ++ ++state 283 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ enumerator -> identifier '=' expr_no_commas . (rule 198) ++ ++ ASSIGN shift, and go to state 138 ++ '=' shift, and go to state 139 ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 198 (enumerator) ++ ++ ++ ++state 284 ++ ++ enumlist -> enumlist ',' enumerator . (rule 196) ++ ++ $default reduce using rule 196 (enumlist) ++ ++ ++ ++state 285 ++ ++ structsp -> ENUM '{' @15 enumlist maybecomma_warn '}' . (rule 175) ++ ++ $default reduce using rule 175 (structsp) ++ ++ ++ ++state 286 ++ ++ structsp -> ENUM identifier '{' @14 enumlist maybecomma_warn . '}' (rule 173) ++ ++ '}' shift, and go to state 340 ++ ++ ++ ++state 287 ++ ++ component_declarator -> ':' . expr_no_commas (rule 194) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 341 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 288 ++ ++ component_declarator -> declarator . maybe_attribute (rule 192) ++ component_declarator -> declarator . ':' expr_no_commas maybe_attribute (rule 193) ++ ++ ATTRIBUTE shift, and go to state 188 ++ ':' shift, and go to state 342 ++ ++ $default reduce using rule 131 (maybe_attribute) ++ ++ maybe_attribute go to state 343 ++ ++ ++ ++state 289 ++ ++ component_decl -> typed_typespecs setspecs components . (rule 186) ++ components -> components . ',' component_declarator (rule 191) ++ ++ ',' shift, and go to state 344 ++ ++ $default reduce using rule 186 (component_decl) ++ ++ ++ ++state 290 ++ ++ components -> component_declarator . (rule 190) ++ ++ $default reduce using rule 190 (components) ++ ++ ++ ++state 291 ++ ++ component_decl -> nonempty_type_quals setspecs components . (rule 187) ++ components -> components . ',' component_declarator (rule 191) ++ ++ ',' shift, and go to state 344 ++ ++ $default reduce using rule 187 (component_decl) ++ ++ ++ ++state 292 ++ ++ structsp -> STRUCT identifier '{' @12 component_decl_list '}' . (rule 165) ++ ++ $default reduce using rule 165 (structsp) ++ ++ ++ ++state 293 ++ ++ structsp -> UNION identifier '{' @13 component_decl_list '}' . (rule 169) ++ ++ $default reduce using rule 169 (structsp) ++ ++ ++ ++state 294 ++ ++ unary_expr -> SIZEOF '(' typename ')' . (rule 48) ++ ++ $default reduce using rule 48 (unary_expr) ++ ++ ++ ++state 295 ++ ++ unary_expr -> ALIGNOF '(' typename ')' . (rule 50) ++ ++ $default reduce using rule 50 (unary_expr) ++ ++ ++ ++state 296 ++ ++ compstmt -> '{' '}' . (rule 225) ++ ++ $default reduce using rule 225 (compstmt) ++ ++ ++ ++state 297 ++ ++ compstmt -> '{' pushlevel . decls xstmts '}' (rule 226) ++ compstmt -> '{' pushlevel . error '}' (rule 227) ++ compstmt -> '{' pushlevel . stmts '}' (rule 228) ++ ++ error shift, and go to state 345 ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 347 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ TYPEOF shift, and go to state 13 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ decls go to state 363 ++ decl go to state 184 ++ typed_declspecs go to state 185 ++ declmods go to state 186 ++ typespec go to state 21 ++ structsp go to state 22 ++ stmts go to state 364 ++ errstmt go to state 187 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 367 ++ ++ ++ ++state 298 ++ ++ primary -> '(' @9 compstmt ')' . (rule 78) ++ ++ $default reduce using rule 78 (primary) ++ ++ ++ ++state 299 ++ ++ cast_expr -> '(' typename ')' '{' . initlist maybecomma '}' (rule 53) ++ ++ error shift, and go to state 368 ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 369 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 370 ++ primary go to state 79 ++ string go to state 80 ++ init go to state 371 ++ initlist go to state 372 ++ ++ ++ ++state 300 ++ ++ cast_expr -> '(' typename ')' cast_expr . (rule 52) ++ ++ $default reduce using rule 52 (cast_expr) ++ ++ ++ ++state 301 ++ ++ expr_no_commas -> expr_no_commas '?' xexpr ':' . expr_no_commas (rule 69) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 373 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 302 ++ ++ primary -> primary '(' exprlist ')' . (rule 79) ++ ++ $default reduce using rule 79 (primary) ++ ++ ++ ++state 303 ++ ++ primary -> primary '[' expr ']' . (rule 80) ++ ++ $default reduce using rule 80 (primary) ++ ++ ++ ++state 304 ++ ++ absdcl1 -> '*' type_quals absdcl1 . (rule 208) ++ absdcl1 -> absdcl1 . '(' parmlist (rule 210) ++ absdcl1 -> absdcl1 . '[' expr ']' (rule 211) ++ absdcl1 -> absdcl1 . '[' ']' (rule 212) ++ ++ '(' shift, and go to state 249 ++ '[' shift, and go to state 250 ++ ++ $default reduce using rule 208 (absdcl1) ++ ++ ++ ++state 305 ++ ++ absdcl1 -> '(' absdcl1 ')' . (rule 207) ++ ++ $default reduce using rule 207 (absdcl1) ++ ++ ++ ++state 306 ++ ++ parmlist_1 -> error . ')' (rule 283) ++ ++ ')' shift, and go to state 374 ++ ++ ++ ++state 307 ++ ++ parmlist -> @29 parmlist_1 . (rule 276) ++ ++ $default reduce using rule 276 (parmlist) ++ ++ ++ ++state 308 ++ ++ parmlist_1 -> parmlist_2 . ')' (rule 282) ++ ++ ')' shift, and go to state 375 ++ ++ ++ ++state 309 ++ ++ absdcl1 -> '[' expr ']' . (rule 214) ++ ++ $default reduce using rule 214 (absdcl1) ++ ++ ++ ++state 310 ++ ++ absdcl1 -> absdcl1 '(' parmlist . (rule 210) ++ ++ $default reduce using rule 210 (absdcl1) ++ ++ ++ ++state 311 ++ ++ absdcl1 -> absdcl1 '[' ']' . (rule 212) ++ ++ $default reduce using rule 212 (absdcl1) ++ ++ ++ ++state 312 ++ ++ absdcl1 -> absdcl1 '[' expr . ']' (rule 211) ++ ++ ']' shift, and go to state 376 ++ ++ ++ ++state 313 ++ ++ maybeasm -> ASM '(' string ')' . (rule 124) ++ ++ $default reduce using rule 124 (maybeasm) ++ ++ ++ ++state 314 ++ ++ parmlist_or_identifiers_1 -> error ')' . (rule 281) ++ ++ $default reduce using rule 281 (parmlist_or_identifiers_1) ++ ++ ++ ++state 315 ++ ++ parm_declarator -> TYPENAME . (rule 157) ++ ++ $default reduce using rule 157 (parm_declarator) ++ ++ ++ ++state 316 ++ ++ parm_declarator -> '*' . type_quals parm_declarator (rule 156) ++ notype_declarator -> '*' . type_quals notype_declarator (rule 160) ++ absdcl1 -> '*' . type_quals absdcl1 (rule 208) ++ absdcl1 -> '*' . type_quals (rule 209) ++ ++ $default reduce using rule 205 (type_quals) ++ ++ type_quals go to state 377 ++ ++ ++ ++state 317 ++ ++ notype_declarator -> '(' . notype_declarator ')' (rule 159) ++ absdcl1 -> '(' . absdcl1 ')' (rule 207) ++ absdcl1 -> '(' . parmlist (rule 213) ++ ++ IDENTIFIER shift, and go to state 36 ++ '*' shift, and go to state 321 ++ '(' shift, and go to state 317 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 275 (@29) ++ ++ notype_declarator go to state 86 ++ absdcl1 go to state 244 ++ parmlist go to state 245 ++ @29 go to state 246 ++ ++ ++ ++state 318 ++ ++ parm_declarator -> parm_declarator . '(' parmlist_or_identifiers (rule 153) ++ parm_declarator -> parm_declarator . '[' expr ']' (rule 154) ++ parm_declarator -> parm_declarator . '[' ']' (rule 155) ++ parm -> typed_declspecs parm_declarator . (rule 289) ++ ++ '(' shift, and go to state 378 ++ '[' shift, and go to state 379 ++ ++ $default reduce using rule 289 (parm) ++ ++ ++ ++state 319 ++ ++ notype_declarator -> notype_declarator . '(' parmlist_or_identifiers (rule 158) ++ notype_declarator -> notype_declarator . '[' expr ']' (rule 161) ++ notype_declarator -> notype_declarator . '[' ']' (rule 162) ++ parm -> typed_declspecs notype_declarator . (rule 290) ++ ++ '(' shift, and go to state 91 ++ '[' shift, and go to state 92 ++ ++ $default reduce using rule 290 (parm) ++ ++ ++ ++state 320 ++ ++ parm -> typed_declspecs absdcl . (rule 291) ++ ++ $default reduce using rule 291 (parm) ++ ++ ++ ++state 321 ++ ++ notype_declarator -> '*' . type_quals notype_declarator (rule 160) ++ absdcl1 -> '*' . type_quals absdcl1 (rule 208) ++ absdcl1 -> '*' . type_quals (rule 209) ++ ++ $default reduce using rule 205 (type_quals) ++ ++ type_quals go to state 380 ++ ++ ++ ++state 322 ++ ++ notype_declarator -> notype_declarator . '(' parmlist_or_identifiers (rule 158) ++ notype_declarator -> notype_declarator . '[' expr ']' (rule 161) ++ notype_declarator -> notype_declarator . '[' ']' (rule 162) ++ parm -> declmods notype_declarator . (rule 292) ++ ++ '(' shift, and go to state 91 ++ '[' shift, and go to state 92 ++ ++ $default reduce using rule 292 (parm) ++ ++ ++ ++state 323 ++ ++ parm -> declmods absdcl . (rule 293) ++ ++ $default reduce using rule 293 (parm) ++ ++ ++ ++state 324 ++ ++ parmlist_or_identifiers_1 -> parmlist_2 ')' . (rule 279) ++ ++ $default reduce using rule 279 (parmlist_or_identifiers_1) ++ ++ ++ ++state 325 ++ ++ parmlist_2 -> parms ',' . ELLIPSIS (rule 286) ++ parms -> parms ',' . parm (rule 288) ++ ++ TYPENAME shift, and go to state 5 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ ELLIPSIS shift, and go to state 381 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ TYPEOF shift, and go to state 13 ++ ++ typed_declspecs go to state 256 ++ declmods go to state 257 ++ typespec go to state 21 ++ structsp go to state 22 ++ parm go to state 382 ++ ++ ++ ++state 326 ++ ++ parmlist_or_identifiers_1 -> identifiers ')' . (rule 280) ++ ++ $default reduce using rule 280 (parmlist_or_identifiers_1) ++ ++ ++ ++state 327 ++ ++ identifiers -> identifiers ',' . IDENTIFIER (rule 295) ++ ++ IDENTIFIER shift, and go to state 383 ++ ++ ++ ++state 328 ++ ++ compstmt_or_error -> error . compstmt (rule 224) ++ ++ '{' shift, and go to state 216 ++ ++ compstmt go to state 384 ++ ++ ++ ++state 329 ++ ++ fndef -> setspecs notype_declarator @7 xdecls @8 compstmt_or_error . (rule 28) ++ ++ $default reduce using rule 28 (fndef) ++ ++ ++ ++state 330 ++ ++ compstmt_or_error -> compstmt . (rule 223) ++ ++ $default reduce using rule 223 (compstmt_or_error) ++ ++ ++ ++state 331 ++ ++ decl -> typed_declspecs setspecs initdecls . ';' (rule 94) ++ initdecls -> initdecls . ',' initdcl (rule 120) ++ ++ ';' shift, and go to state 385 ++ ',' shift, and go to state 193 ++ ++ ++ ++state 332 ++ ++ decl -> declmods setspecs notype_initdecls . ';' (rule 95) ++ notype_initdecls -> notype_initdecls . ',' initdcl (rule 122) ++ ++ ';' shift, and go to state 386 ++ ',' shift, and go to state 88 ++ ++ ++ ++state 333 ++ ++ notype_initdcl -> notype_declarator . maybeasm maybe_attribute '=' @11 init (rule 129) ++ notype_initdcl -> notype_declarator . maybeasm maybe_attribute (rule 130) ++ notype_declarator -> notype_declarator . '(' parmlist_or_identifiers (rule 158) ++ notype_declarator -> notype_declarator . '[' expr ']' (rule 161) ++ notype_declarator -> notype_declarator . '[' ']' (rule 162) ++ ++ ASM shift, and go to state 90 ++ '(' shift, and go to state 91 ++ '[' shift, and go to state 92 ++ ++ $default reduce using rule 123 (maybeasm) ++ ++ maybeasm go to state 94 ++ ++ ++ ++state 334 ++ ++ maybe_attribute -> ATTRIBUTE '(' '(' . attribute_list ')' ')' (rule 132) ++ ++ IDENTIFIER shift, and go to state 387 ++ ++ attribute_list go to state 388 ++ attrib go to state 389 ++ ++ ++ ++state 335 ++ ++ notype_initdcl -> notype_declarator maybeasm maybe_attribute '=' @11 . init (rule 129) ++ ++ error shift, and go to state 368 ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 369 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 370 ++ primary go to state 79 ++ string go to state 80 ++ init go to state 390 ++ ++ ++ ++state 336 ++ ++ fndef -> typed_declspecs setspecs declarator @3 xdecls @4 . compstmt_or_error (rule 20) ++ ++ error shift, and go to state 328 ++ '{' shift, and go to state 216 ++ ++ compstmt_or_error go to state 391 ++ compstmt go to state 330 ++ ++ ++ ++state 337 ++ ++ initdcl -> declarator maybeasm maybe_attribute '=' . @10 init (rule 126) ++ ++ $default reduce using rule 125 (@10) ++ ++ @10 go to state 392 ++ ++ ++ ++state 338 ++ ++ after_type_declarator -> after_type_declarator '[' expr ']' . (rule 149) ++ ++ $default reduce using rule 149 (after_type_declarator) ++ ++ ++ ++state 339 ++ ++ fndef -> declmods setspecs notype_declarator @5 xdecls @6 . compstmt_or_error (rule 24) ++ ++ error shift, and go to state 328 ++ '{' shift, and go to state 216 ++ ++ compstmt_or_error go to state 393 ++ compstmt go to state 330 ++ ++ ++ ++state 340 ++ ++ structsp -> ENUM identifier '{' @14 enumlist maybecomma_warn '}' . (rule 173) ++ ++ $default reduce using rule 173 (structsp) ++ ++ ++ ++state 341 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ component_declarator -> ':' expr_no_commas . (rule 194) ++ ++ ASSIGN shift, and go to state 138 ++ '=' shift, and go to state 139 ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 194 (component_declarator) ++ ++ ++ ++state 342 ++ ++ component_declarator -> declarator ':' . expr_no_commas maybe_attribute (rule 193) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 394 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 343 ++ ++ component_declarator -> declarator maybe_attribute . (rule 192) ++ ++ $default reduce using rule 192 (component_declarator) ++ ++ ++ ++state 344 ++ ++ components -> components ',' . component_declarator (rule 191) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 95 ++ ':' shift, and go to state 287 ++ '*' shift, and go to state 96 ++ '(' shift, and go to state 97 ++ ++ declarator go to state 288 ++ after_type_declarator go to state 101 ++ notype_declarator go to state 102 ++ component_declarator go to state 395 ++ ++ ++ ++state 345 ++ ++ errstmt -> error . ';' (rule 221) ++ compstmt -> '{' pushlevel error . '}' (rule 227) ++ ++ ';' shift, and go to state 264 ++ '}' shift, and go to state 396 ++ ++ ++ ++state 346 ++ ++ identifier -> IDENTIFIER . (rule 30) ++ primary -> IDENTIFIER . (rule 72) ++ ++ ':' reduce using rule 30 (identifier) ++ $default reduce using rule 72 (primary) ++ ++ ++ ++state 347 ++ ++ identifier -> TYPENAME . (rule 31) ++ typespec -> TYPENAME . (rule 113) ++ ++ ':' reduce using rule 31 (identifier) ++ $default reduce using rule 113 (typespec) ++ ++ ++ ++state 348 ++ ++ simple_if -> IF . '(' expr ')' @16 stmt (rule 230) ++ ++ '(' shift, and go to state 397 ++ ++ ++ ++state 349 ++ ++ stmt -> WHILE . @18 '(' expr ')' @19 stmt (rule 238) ++ ++ $default reduce using rule 236 (@18) ++ ++ @18 go to state 398 ++ ++ ++ ++state 350 ++ ++ stmt -> DO . @20 stmt WHILE @21 '(' expr ')' ';' (rule 241) ++ ++ $default reduce using rule 239 (@20) ++ ++ @20 go to state 399 ++ ++ ++ ++state 351 ++ ++ stmt -> FOR . '(' xexpr ';' @22 xexpr ';' @23 xexpr ')' @24 stmt (rule 245) ++ ++ '(' shift, and go to state 400 ++ ++ ++ ++state 352 ++ ++ stmt -> SWITCH . '(' expr ')' @25 stmt (rule 247) ++ ++ '(' shift, and go to state 401 ++ ++ ++ ++state 353 ++ ++ stmt -> CASE . expr ':' @26 stmt (rule 249) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 402 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 354 ++ ++ stmt -> DEFAULT . ':' @27 stmt (rule 251) ++ ++ ':' shift, and go to state 403 ++ ++ ++ ++state 355 ++ ++ stmt -> BREAK . ';' (rule 252) ++ ++ ';' shift, and go to state 404 ++ ++ ++ ++state 356 ++ ++ stmt -> CONTINUE . ';' (rule 253) ++ ++ ';' shift, and go to state 405 ++ ++ ++ ++state 357 ++ ++ stmt -> RETURN . ';' (rule 254) ++ stmt -> RETURN . expr ';' (rule 255) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 406 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 407 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 358 ++ ++ stmt -> GOTO . identifier ';' (rule 260) ++ ++ IDENTIFIER shift, and go to state 26 ++ TYPENAME shift, and go to state 27 ++ ++ identifier go to state 408 ++ ++ ++ ++state 359 ++ ++ stmt -> ASM . maybe_type_qual '(' string ')' ';' (rule 256) ++ stmt -> ASM . maybe_type_qual '(' string ':' asm_operands ')' ';' (rule 257) ++ stmt -> ASM . maybe_type_qual '(' string ':' asm_operands ':' asm_operands ')' ';' (rule 258) ++ stmt -> ASM . maybe_type_qual '(' string ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' (rule 259) ++ ++ TYPE_QUAL shift, and go to state 409 ++ ++ $default reduce using rule 264 (maybe_type_qual) ++ ++ maybe_type_qual go to state 410 ++ ++ ++ ++state 360 ++ ++ stmt -> ';' . (rule 263) ++ ++ $default reduce using rule 263 (stmt) ++ ++ ++ ++state 361 ++ ++ stmt -> identifier . ':' @28 stmt (rule 262) ++ ++ ':' shift, and go to state 411 ++ ++ ++ ++state 362 ++ ++ stmt -> expr . ';' (rule 232) ++ ++ ';' shift, and go to state 412 ++ ++ ++ ++state 363 ++ ++ decls -> decls . decl (rule 91) ++ compstmt -> '{' pushlevel decls . xstmts '}' (rule 226) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 347 ++ SCSPEC shift, and go to state 6 ++ TYPESPEC shift, and go to state 7 ++ TYPE_QUAL shift, and go to state 8 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ENUM shift, and go to state 9 ++ STRUCT shift, and go to state 10 ++ UNION shift, and go to state 11 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ TYPEOF shift, and go to state 13 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ $default reduce using rule 219 (xstmts) ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ decl go to state 266 ++ typed_declspecs go to state 185 ++ declmods go to state 186 ++ typespec go to state 21 ++ structsp go to state 22 ++ stmts go to state 413 ++ xstmts go to state 414 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 367 ++ ++ ++ ++state 364 ++ ++ stmts -> stmts . stmt (rule 217) ++ stmts -> stmts . errstmt (rule 218) ++ compstmt -> '{' pushlevel stmts . '}' (rule 228) ++ ++ error shift, and go to state 181 ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '}' shift, and go to state 415 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ errstmt go to state 416 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 417 ++ ++ ++ ++state 365 ++ ++ stmt -> compstmt . (rule 231) ++ ++ $default reduce using rule 231 (stmt) ++ ++ ++ ++state 366 ++ ++ stmt -> simple_if . ELSE @17 stmt (rule 234) ++ stmt -> simple_if . (rule 235) ++ ++ ELSE shift, and go to state 418 ++ ++ $default reduce using rule 235 (stmt) ++ ++ ++ ++state 367 ++ ++ stmts -> stmt . (rule 216) ++ ++ $default reduce using rule 216 (stmts) ++ ++ ++ ++state 368 ++ ++ init -> error . (rule 142) ++ ++ $default reduce using rule 142 (init) ++ ++ ++ ++state 369 ++ ++ init -> '{' . '}' (rule 139) ++ init -> '{' . initlist '}' (rule 140) ++ init -> '{' . initlist ',' '}' (rule 141) ++ ++ error shift, and go to state 368 ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '}' shift, and go to state 419 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 369 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 370 ++ primary go to state 79 ++ string go to state 80 ++ init go to state 371 ++ initlist go to state 420 ++ ++ ++ ++state 370 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ init -> expr_no_commas . (rule 138) ++ ++ ASSIGN shift, and go to state 138 ++ '=' shift, and go to state 139 ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 138 (init) ++ ++ ++ ++state 371 ++ ++ initlist -> init . (rule 143) ++ ++ $default reduce using rule 143 (initlist) ++ ++ ++ ++state 372 ++ ++ cast_expr -> '(' typename ')' '{' initlist . maybecomma '}' (rule 53) ++ initlist -> initlist . ',' init (rule 144) ++ ++ ',' shift, and go to state 421 ++ ++ $default reduce using rule 177 (maybecomma) ++ ++ maybecomma go to state 422 ++ ++ ++ ++state 373 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas '?' xexpr ':' expr_no_commas . (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 69 (expr_no_commas) ++ ++ ++ ++state 374 ++ ++ parmlist_1 -> error ')' . (rule 283) ++ ++ $default reduce using rule 283 (parmlist_1) ++ ++ ++ ++state 375 ++ ++ parmlist_1 -> parmlist_2 ')' . (rule 282) ++ ++ $default reduce using rule 282 (parmlist_1) ++ ++ ++ ++state 376 ++ ++ absdcl1 -> absdcl1 '[' expr ']' . (rule 211) ++ ++ $default reduce using rule 211 (absdcl1) ++ ++ ++ ++state 377 ++ ++ parm_declarator -> '*' type_quals . parm_declarator (rule 156) ++ notype_declarator -> '*' type_quals . notype_declarator (rule 160) ++ type_quals -> type_quals . TYPE_QUAL (rule 206) ++ absdcl1 -> '*' type_quals . absdcl1 (rule 208) ++ absdcl1 -> '*' type_quals . (rule 209) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPENAME shift, and go to state 315 ++ TYPE_QUAL shift, and go to state 171 ++ '*' shift, and go to state 316 ++ '(' shift, and go to state 317 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 209 (absdcl1) ++ ++ parm_declarator go to state 423 ++ notype_declarator go to state 172 ++ absdcl1 go to state 304 ++ ++ ++ ++state 378 ++ ++ parm_declarator -> parm_declarator '(' . parmlist_or_identifiers (rule 153) ++ ++ $default reduce using rule 277 (@30) ++ ++ parmlist_or_identifiers go to state 424 ++ @30 go to state 178 ++ ++ ++ ++state 379 ++ ++ parm_declarator -> parm_declarator '[' . expr ']' (rule 154) ++ parm_declarator -> parm_declarator '[' . ']' (rule 155) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ']' shift, and go to state 425 ++ ++ unop go to state 73 ++ expr go to state 426 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 380 ++ ++ notype_declarator -> '*' type_quals . notype_declarator (rule 160) ++ type_quals -> type_quals . TYPE_QUAL (rule 206) ++ absdcl1 -> '*' type_quals . absdcl1 (rule 208) ++ absdcl1 -> '*' type_quals . (rule 209) ++ ++ IDENTIFIER shift, and go to state 36 ++ TYPE_QUAL shift, and go to state 171 ++ '*' shift, and go to state 321 ++ '(' shift, and go to state 317 ++ '[' shift, and go to state 163 ++ ++ $default reduce using rule 209 (absdcl1) ++ ++ notype_declarator go to state 172 ++ absdcl1 go to state 304 ++ ++ ++ ++state 381 ++ ++ parmlist_2 -> parms ',' ELLIPSIS . (rule 286) ++ ++ $default reduce using rule 286 (parmlist_2) ++ ++ ++ ++state 382 ++ ++ parms -> parms ',' parm . (rule 288) ++ ++ $default reduce using rule 288 (parms) ++ ++ ++ ++state 383 ++ ++ identifiers -> identifiers ',' IDENTIFIER . (rule 295) ++ ++ $default reduce using rule 295 (identifiers) ++ ++ ++ ++state 384 ++ ++ compstmt_or_error -> error compstmt . (rule 224) ++ ++ $default reduce using rule 224 (compstmt_or_error) ++ ++ ++ ++state 385 ++ ++ decl -> typed_declspecs setspecs initdecls ';' . (rule 94) ++ ++ $default reduce using rule 94 (decl) ++ ++ ++ ++state 386 ++ ++ decl -> declmods setspecs notype_initdecls ';' . (rule 95) ++ ++ $default reduce using rule 95 (decl) ++ ++ ++ ++state 387 ++ ++ attrib -> IDENTIFIER . (rule 135) ++ attrib -> IDENTIFIER . '(' CONSTANT ')' (rule 136) ++ attrib -> IDENTIFIER . '(' identifiers ')' (rule 137) ++ ++ '(' shift, and go to state 427 ++ ++ $default reduce using rule 135 (attrib) ++ ++ ++ ++state 388 ++ ++ maybe_attribute -> ATTRIBUTE '(' '(' attribute_list . ')' ')' (rule 132) ++ attribute_list -> attribute_list . ',' attrib (rule 134) ++ ++ ')' shift, and go to state 428 ++ ',' shift, and go to state 429 ++ ++ ++ ++state 389 ++ ++ attribute_list -> attrib . (rule 133) ++ ++ $default reduce using rule 133 (attribute_list) ++ ++ ++ ++state 390 ++ ++ notype_initdcl -> notype_declarator maybeasm maybe_attribute '=' @11 init . (rule 129) ++ ++ $default reduce using rule 129 (notype_initdcl) ++ ++ ++ ++state 391 ++ ++ fndef -> typed_declspecs setspecs declarator @3 xdecls @4 compstmt_or_error . (rule 20) ++ ++ $default reduce using rule 20 (fndef) ++ ++ ++ ++state 392 ++ ++ initdcl -> declarator maybeasm maybe_attribute '=' @10 . init (rule 126) ++ ++ error shift, and go to state 368 ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 369 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 370 ++ primary go to state 79 ++ string go to state 80 ++ init go to state 430 ++ ++ ++ ++state 393 ++ ++ fndef -> declmods setspecs notype_declarator @5 xdecls @6 compstmt_or_error . (rule 24) ++ ++ $default reduce using rule 24 (fndef) ++ ++ ++ ++state 394 ++ ++ expr_no_commas -> expr_no_commas . '+' expr_no_commas (rule 55) ++ expr_no_commas -> expr_no_commas . '-' expr_no_commas (rule 56) ++ expr_no_commas -> expr_no_commas . '*' expr_no_commas (rule 57) ++ expr_no_commas -> expr_no_commas . '/' expr_no_commas (rule 58) ++ expr_no_commas -> expr_no_commas . '%' expr_no_commas (rule 59) ++ expr_no_commas -> expr_no_commas . LSHIFT expr_no_commas (rule 60) ++ expr_no_commas -> expr_no_commas . RSHIFT expr_no_commas (rule 61) ++ expr_no_commas -> expr_no_commas . ARITHCOMPARE expr_no_commas (rule 62) ++ expr_no_commas -> expr_no_commas . EQCOMPARE expr_no_commas (rule 63) ++ expr_no_commas -> expr_no_commas . '&' expr_no_commas (rule 64) ++ expr_no_commas -> expr_no_commas . '|' expr_no_commas (rule 65) ++ expr_no_commas -> expr_no_commas . '^' expr_no_commas (rule 66) ++ expr_no_commas -> expr_no_commas . ANDAND expr_no_commas (rule 67) ++ expr_no_commas -> expr_no_commas . OROR expr_no_commas (rule 68) ++ expr_no_commas -> expr_no_commas . '?' xexpr ':' expr_no_commas (rule 69) ++ expr_no_commas -> expr_no_commas . '=' expr_no_commas (rule 70) ++ expr_no_commas -> expr_no_commas . ASSIGN expr_no_commas (rule 71) ++ component_declarator -> declarator ':' expr_no_commas . maybe_attribute (rule 193) ++ ++ ATTRIBUTE shift, and go to state 188 ++ ASSIGN shift, and go to state 138 ++ '=' shift, and go to state 139 ++ '?' shift, and go to state 140 ++ OROR shift, and go to state 141 ++ ANDAND shift, and go to state 142 ++ '|' shift, and go to state 143 ++ '^' shift, and go to state 144 ++ '&' shift, and go to state 145 ++ EQCOMPARE shift, and go to state 146 ++ ARITHCOMPARE shift, and go to state 147 ++ LSHIFT shift, and go to state 148 ++ RSHIFT shift, and go to state 149 ++ '+' shift, and go to state 150 ++ '-' shift, and go to state 151 ++ '*' shift, and go to state 152 ++ '/' shift, and go to state 153 ++ '%' shift, and go to state 154 ++ ++ $default reduce using rule 131 (maybe_attribute) ++ ++ maybe_attribute go to state 431 ++ ++ ++ ++state 395 ++ ++ components -> components ',' component_declarator . (rule 191) ++ ++ $default reduce using rule 191 (components) ++ ++ ++ ++state 396 ++ ++ compstmt -> '{' pushlevel error '}' . (rule 227) ++ ++ $default reduce using rule 227 (compstmt) ++ ++ ++ ++state 397 ++ ++ simple_if -> IF '(' . expr ')' @16 stmt (rule 230) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 432 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 398 ++ ++ stmt -> WHILE @18 . '(' expr ')' @19 stmt (rule 238) ++ ++ '(' shift, and go to state 433 ++ ++ ++ ++state 399 ++ ++ stmt -> DO @20 . stmt WHILE @21 '(' expr ')' ';' (rule 241) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 434 ++ ++ ++ ++state 400 ++ ++ stmt -> FOR '(' . xexpr ';' @22 xexpr ';' @23 xexpr ')' @24 stmt (rule 245) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ $default reduce using rule 266 (xexpr) ++ ++ unop go to state 73 ++ expr go to state 222 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ xexpr go to state 435 ++ ++ ++ ++state 401 ++ ++ stmt -> SWITCH '(' . expr ')' @25 stmt (rule 247) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 436 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 402 ++ ++ stmt -> CASE expr . ':' @26 stmt (rule 249) ++ ++ ':' shift, and go to state 437 ++ ++ ++ ++state 403 ++ ++ stmt -> DEFAULT ':' . @27 stmt (rule 251) ++ ++ $default reduce using rule 250 (@27) ++ ++ @27 go to state 438 ++ ++ ++ ++state 404 ++ ++ stmt -> BREAK ';' . (rule 252) ++ ++ $default reduce using rule 252 (stmt) ++ ++ ++ ++state 405 ++ ++ stmt -> CONTINUE ';' . (rule 253) ++ ++ $default reduce using rule 253 (stmt) ++ ++ ++ ++state 406 ++ ++ stmt -> RETURN ';' . (rule 254) ++ ++ $default reduce using rule 254 (stmt) ++ ++ ++ ++state 407 ++ ++ stmt -> RETURN expr . ';' (rule 255) ++ ++ ';' shift, and go to state 439 ++ ++ ++ ++state 408 ++ ++ stmt -> GOTO identifier . ';' (rule 260) ++ ++ ';' shift, and go to state 440 ++ ++ ++ ++state 409 ++ ++ maybe_type_qual -> TYPE_QUAL . (rule 265) ++ ++ $default reduce using rule 265 (maybe_type_qual) ++ ++ ++ ++state 410 ++ ++ stmt -> ASM maybe_type_qual . '(' string ')' ';' (rule 256) ++ stmt -> ASM maybe_type_qual . '(' string ':' asm_operands ')' ';' (rule 257) ++ stmt -> ASM maybe_type_qual . '(' string ':' asm_operands ':' asm_operands ')' ';' (rule 258) ++ stmt -> ASM maybe_type_qual . '(' string ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' (rule 259) ++ ++ '(' shift, and go to state 441 ++ ++ ++ ++state 411 ++ ++ stmt -> identifier ':' . @28 stmt (rule 262) ++ ++ $default reduce using rule 261 (@28) ++ ++ @28 go to state 442 ++ ++ ++ ++state 412 ++ ++ stmt -> expr ';' . (rule 232) ++ ++ $default reduce using rule 232 (stmt) ++ ++ ++ ++state 413 ++ ++ stmts -> stmts . stmt (rule 217) ++ stmts -> stmts . errstmt (rule 218) ++ xstmts -> stmts . (rule 220) ++ ++ error shift, and go to state 181 ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ '}' [reduce using rule 220 (xstmts)] ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ errstmt go to state 416 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 417 ++ ++ ++ ++state 414 ++ ++ compstmt -> '{' pushlevel decls xstmts . '}' (rule 226) ++ ++ '}' shift, and go to state 443 ++ ++ ++ ++state 415 ++ ++ compstmt -> '{' pushlevel stmts '}' . (rule 228) ++ ++ $default reduce using rule 228 (compstmt) ++ ++ ++ ++state 416 ++ ++ stmts -> stmts errstmt . (rule 218) ++ ++ $default reduce using rule 218 (stmts) ++ ++ ++ ++state 417 ++ ++ stmts -> stmts stmt . (rule 217) ++ ++ $default reduce using rule 217 (stmts) ++ ++ ++ ++state 418 ++ ++ stmt -> simple_if ELSE . @17 stmt (rule 234) ++ ++ $default reduce using rule 233 (@17) ++ ++ @17 go to state 444 ++ ++ ++ ++state 419 ++ ++ init -> '{' '}' . (rule 139) ++ ++ $default reduce using rule 139 (init) ++ ++ ++ ++state 420 ++ ++ init -> '{' initlist . '}' (rule 140) ++ init -> '{' initlist . ',' '}' (rule 141) ++ initlist -> initlist . ',' init (rule 144) ++ ++ '}' shift, and go to state 445 ++ ',' shift, and go to state 446 ++ ++ ++ ++state 421 ++ ++ initlist -> initlist ',' . init (rule 144) ++ maybecomma -> ',' . (rule 178) ++ ++ error shift, and go to state 368 ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 369 ++ ++ '}' reduce using rule 178 (maybecomma) ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 370 ++ primary go to state 79 ++ string go to state 80 ++ init go to state 447 ++ ++ ++ ++state 422 ++ ++ cast_expr -> '(' typename ')' '{' initlist maybecomma . '}' (rule 53) ++ ++ '}' shift, and go to state 448 ++ ++ ++ ++state 423 ++ ++ parm_declarator -> parm_declarator . '(' parmlist_or_identifiers (rule 153) ++ parm_declarator -> parm_declarator . '[' expr ']' (rule 154) ++ parm_declarator -> parm_declarator . '[' ']' (rule 155) ++ parm_declarator -> '*' type_quals parm_declarator . (rule 156) ++ ++ '(' shift, and go to state 378 ++ '[' shift, and go to state 379 ++ ++ $default reduce using rule 156 (parm_declarator) ++ ++ ++ ++state 424 ++ ++ parm_declarator -> parm_declarator '(' parmlist_or_identifiers . (rule 153) ++ ++ $default reduce using rule 153 (parm_declarator) ++ ++ ++ ++state 425 ++ ++ parm_declarator -> parm_declarator '[' ']' . (rule 155) ++ ++ $default reduce using rule 155 (parm_declarator) ++ ++ ++ ++state 426 ++ ++ parm_declarator -> parm_declarator '[' expr . ']' (rule 154) ++ ++ ']' shift, and go to state 449 ++ ++ ++ ++state 427 ++ ++ attrib -> IDENTIFIER '(' . CONSTANT ')' (rule 136) ++ attrib -> IDENTIFIER '(' . identifiers ')' (rule 137) ++ ++ IDENTIFIER shift, and go to state 255 ++ CONSTANT shift, and go to state 450 ++ ++ identifiers go to state 451 ++ ++ ++ ++state 428 ++ ++ maybe_attribute -> ATTRIBUTE '(' '(' attribute_list ')' . ')' (rule 132) ++ ++ ')' shift, and go to state 452 ++ ++ ++ ++state 429 ++ ++ attribute_list -> attribute_list ',' . attrib (rule 134) ++ ++ IDENTIFIER shift, and go to state 387 ++ ++ attrib go to state 453 ++ ++ ++ ++state 430 ++ ++ initdcl -> declarator maybeasm maybe_attribute '=' @10 init . (rule 126) ++ ++ $default reduce using rule 126 (initdcl) ++ ++ ++ ++state 431 ++ ++ component_declarator -> declarator ':' expr_no_commas maybe_attribute . (rule 193) ++ ++ $default reduce using rule 193 (component_declarator) ++ ++ ++ ++state 432 ++ ++ simple_if -> IF '(' expr . ')' @16 stmt (rule 230) ++ ++ ')' shift, and go to state 454 ++ ++ ++ ++state 433 ++ ++ stmt -> WHILE @18 '(' . expr ')' @19 stmt (rule 238) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 455 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 434 ++ ++ stmt -> DO @20 stmt . WHILE @21 '(' expr ')' ';' (rule 241) ++ ++ WHILE shift, and go to state 456 ++ ++ ++ ++state 435 ++ ++ stmt -> FOR '(' xexpr . ';' @22 xexpr ';' @23 xexpr ')' @24 stmt (rule 245) ++ ++ ';' shift, and go to state 457 ++ ++ ++ ++state 436 ++ ++ stmt -> SWITCH '(' expr . ')' @25 stmt (rule 247) ++ ++ ')' shift, and go to state 458 ++ ++ ++ ++state 437 ++ ++ stmt -> CASE expr ':' . @26 stmt (rule 249) ++ ++ $default reduce using rule 248 (@26) ++ ++ @26 go to state 459 ++ ++ ++ ++state 438 ++ ++ stmt -> DEFAULT ':' @27 . stmt (rule 251) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 460 ++ ++ ++ ++state 439 ++ ++ stmt -> RETURN expr ';' . (rule 255) ++ ++ $default reduce using rule 255 (stmt) ++ ++ ++ ++state 440 ++ ++ stmt -> GOTO identifier ';' . (rule 260) ++ ++ $default reduce using rule 260 (stmt) ++ ++ ++ ++state 441 ++ ++ stmt -> ASM maybe_type_qual '(' . string ')' ';' (rule 256) ++ stmt -> ASM maybe_type_qual '(' . string ':' asm_operands ')' ';' (rule 257) ++ stmt -> ASM maybe_type_qual '(' . string ':' asm_operands ':' asm_operands ')' ';' (rule 258) ++ stmt -> ASM maybe_type_qual '(' . string ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' (rule 259) ++ ++ STRING shift, and go to state 57 ++ ++ string go to state 461 ++ ++ ++ ++state 442 ++ ++ stmt -> identifier ':' @28 . stmt (rule 262) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 462 ++ ++ ++ ++state 443 ++ ++ compstmt -> '{' pushlevel decls xstmts '}' . (rule 226) ++ ++ $default reduce using rule 226 (compstmt) ++ ++ ++ ++state 444 ++ ++ stmt -> simple_if ELSE @17 . stmt (rule 234) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 463 ++ ++ ++ ++state 445 ++ ++ init -> '{' initlist '}' . (rule 140) ++ ++ $default reduce using rule 140 (init) ++ ++ ++ ++state 446 ++ ++ init -> '{' initlist ',' . '}' (rule 141) ++ initlist -> initlist ',' . init (rule 144) ++ ++ error shift, and go to state 368 ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '}' shift, and go to state 464 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 369 ++ ++ unop go to state 73 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 370 ++ primary go to state 79 ++ string go to state 80 ++ init go to state 447 ++ ++ ++ ++state 447 ++ ++ initlist -> initlist ',' init . (rule 144) ++ ++ $default reduce using rule 144 (initlist) ++ ++ ++ ++state 448 ++ ++ cast_expr -> '(' typename ')' '{' initlist maybecomma '}' . (rule 53) ++ ++ $default reduce using rule 53 (cast_expr) ++ ++ ++ ++state 449 ++ ++ parm_declarator -> parm_declarator '[' expr ']' . (rule 154) ++ ++ $default reduce using rule 154 (parm_declarator) ++ ++ ++ ++state 450 ++ ++ attrib -> IDENTIFIER '(' CONSTANT . ')' (rule 136) ++ ++ ')' shift, and go to state 465 ++ ++ ++ ++state 451 ++ ++ attrib -> IDENTIFIER '(' identifiers . ')' (rule 137) ++ identifiers -> identifiers . ',' IDENTIFIER (rule 295) ++ ++ ')' shift, and go to state 466 ++ ',' shift, and go to state 327 ++ ++ ++ ++state 452 ++ ++ maybe_attribute -> ATTRIBUTE '(' '(' attribute_list ')' ')' . (rule 132) ++ ++ $default reduce using rule 132 (maybe_attribute) ++ ++ ++ ++state 453 ++ ++ attribute_list -> attribute_list ',' attrib . (rule 134) ++ ++ $default reduce using rule 134 (attribute_list) ++ ++ ++ ++state 454 ++ ++ simple_if -> IF '(' expr ')' . @16 stmt (rule 230) ++ ++ $default reduce using rule 229 (@16) ++ ++ @16 go to state 467 ++ ++ ++ ++state 455 ++ ++ stmt -> WHILE @18 '(' expr . ')' @19 stmt (rule 238) ++ ++ ')' shift, and go to state 468 ++ ++ ++ ++state 456 ++ ++ stmt -> DO @20 stmt WHILE . @21 '(' expr ')' ';' (rule 241) ++ ++ $default reduce using rule 240 (@21) ++ ++ @21 go to state 469 ++ ++ ++ ++state 457 ++ ++ stmt -> FOR '(' xexpr ';' . @22 xexpr ';' @23 xexpr ')' @24 stmt (rule 245) ++ ++ $default reduce using rule 242 (@22) ++ ++ @22 go to state 470 ++ ++ ++ ++state 458 ++ ++ stmt -> SWITCH '(' expr ')' . @25 stmt (rule 247) ++ ++ $default reduce using rule 246 (@25) ++ ++ @25 go to state 471 ++ ++ ++ ++state 459 ++ ++ stmt -> CASE expr ':' @26 . stmt (rule 249) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 472 ++ ++ ++ ++state 460 ++ ++ stmt -> DEFAULT ':' @27 stmt . (rule 251) ++ ++ $default reduce using rule 251 (stmt) ++ ++ ++ ++state 461 ++ ++ string -> string . STRING (rule 86) ++ stmt -> ASM maybe_type_qual '(' string . ')' ';' (rule 256) ++ stmt -> ASM maybe_type_qual '(' string . ':' asm_operands ')' ';' (rule 257) ++ stmt -> ASM maybe_type_qual '(' string . ':' asm_operands ':' asm_operands ')' ';' (rule 258) ++ stmt -> ASM maybe_type_qual '(' string . ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' (rule 259) ++ ++ STRING shift, and go to state 124 ++ ':' shift, and go to state 473 ++ ')' shift, and go to state 474 ++ ++ ++ ++state 462 ++ ++ stmt -> identifier ':' @28 stmt . (rule 262) ++ ++ $default reduce using rule 262 (stmt) ++ ++ ++ ++state 463 ++ ++ stmt -> simple_if ELSE @17 stmt . (rule 234) ++ ++ $default reduce using rule 234 (stmt) ++ ++ ++ ++state 464 ++ ++ init -> '{' initlist ',' '}' . (rule 141) ++ ++ $default reduce using rule 141 (init) ++ ++ ++ ++state 465 ++ ++ attrib -> IDENTIFIER '(' CONSTANT ')' . (rule 136) ++ ++ $default reduce using rule 136 (attrib) ++ ++ ++ ++state 466 ++ ++ attrib -> IDENTIFIER '(' identifiers ')' . (rule 137) ++ ++ $default reduce using rule 137 (attrib) ++ ++ ++ ++state 467 ++ ++ simple_if -> IF '(' expr ')' @16 . stmt (rule 230) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 475 ++ ++ ++ ++state 468 ++ ++ stmt -> WHILE @18 '(' expr ')' . @19 stmt (rule 238) ++ ++ $default reduce using rule 237 (@19) ++ ++ @19 go to state 476 ++ ++ ++ ++state 469 ++ ++ stmt -> DO @20 stmt WHILE @21 . '(' expr ')' ';' (rule 241) ++ ++ '(' shift, and go to state 477 ++ ++ ++ ++state 470 ++ ++ stmt -> FOR '(' xexpr ';' @22 . xexpr ';' @23 xexpr ')' @24 stmt (rule 245) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ $default reduce using rule 266 (xexpr) ++ ++ unop go to state 73 ++ expr go to state 222 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ xexpr go to state 478 ++ ++ ++ ++state 471 ++ ++ stmt -> SWITCH '(' expr ')' @25 . stmt (rule 247) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 479 ++ ++ ++ ++state 472 ++ ++ stmt -> CASE expr ':' @26 stmt . (rule 249) ++ ++ $default reduce using rule 249 (stmt) ++ ++ ++ ++state 473 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' . asm_operands ')' ';' (rule 257) ++ stmt -> ASM maybe_type_qual '(' string ':' . asm_operands ':' asm_operands ')' ';' (rule 258) ++ stmt -> ASM maybe_type_qual '(' string ':' . asm_operands ':' asm_operands ':' asm_clobbers ')' ';' (rule 259) ++ ++ STRING shift, and go to state 480 ++ ++ $default reduce using rule 268 (asm_operands) ++ ++ asm_operands go to state 481 ++ nonnull_asm_operands go to state 482 ++ asm_operand go to state 483 ++ ++ ++ ++state 474 ++ ++ stmt -> ASM maybe_type_qual '(' string ')' . ';' (rule 256) ++ ++ ';' shift, and go to state 484 ++ ++ ++ ++state 475 ++ ++ simple_if -> IF '(' expr ')' @16 stmt . (rule 230) ++ ++ $default reduce using rule 230 (simple_if) ++ ++ ++ ++state 476 ++ ++ stmt -> WHILE @18 '(' expr ')' @19 . stmt (rule 238) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 485 ++ ++ ++ ++state 477 ++ ++ stmt -> DO @20 stmt WHILE @21 '(' . expr ')' ';' (rule 241) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 486 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 478 ++ ++ stmt -> FOR '(' xexpr ';' @22 xexpr . ';' @23 xexpr ')' @24 stmt (rule 245) ++ ++ ';' shift, and go to state 487 ++ ++ ++ ++state 479 ++ ++ stmt -> SWITCH '(' expr ')' @25 stmt . (rule 247) ++ ++ $default reduce using rule 247 (stmt) ++ ++ ++ ++state 480 ++ ++ asm_operand -> STRING . '(' expr ')' (rule 272) ++ ++ '(' shift, and go to state 488 ++ ++ ++ ++state 481 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands . ')' ';' (rule 257) ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands . ':' asm_operands ')' ';' (rule 258) ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands . ':' asm_operands ':' asm_clobbers ')' ';' (rule 259) ++ ++ ':' shift, and go to state 489 ++ ')' shift, and go to state 490 ++ ++ ++ ++state 482 ++ ++ asm_operands -> nonnull_asm_operands . (rule 269) ++ nonnull_asm_operands -> nonnull_asm_operands . ',' asm_operand (rule 271) ++ ++ ',' shift, and go to state 491 ++ ++ $default reduce using rule 269 (asm_operands) ++ ++ ++ ++state 483 ++ ++ nonnull_asm_operands -> asm_operand . (rule 270) ++ ++ $default reduce using rule 270 (nonnull_asm_operands) ++ ++ ++ ++state 484 ++ ++ stmt -> ASM maybe_type_qual '(' string ')' ';' . (rule 256) ++ ++ $default reduce using rule 256 (stmt) ++ ++ ++ ++state 485 ++ ++ stmt -> WHILE @18 '(' expr ')' @19 stmt . (rule 238) ++ ++ $default reduce using rule 238 (stmt) ++ ++ ++ ++state 486 ++ ++ stmt -> DO @20 stmt WHILE @21 '(' expr . ')' ';' (rule 241) ++ ++ ')' shift, and go to state 492 ++ ++ ++ ++state 487 ++ ++ stmt -> FOR '(' xexpr ';' @22 xexpr ';' . @23 xexpr ')' @24 stmt (rule 245) ++ ++ $default reduce using rule 243 (@23) ++ ++ @23 go to state 493 ++ ++ ++ ++state 488 ++ ++ asm_operand -> STRING '(' . expr ')' (rule 272) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ unop go to state 73 ++ expr go to state 494 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ ++ ++ ++state 489 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' . asm_operands ')' ';' (rule 258) ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' . asm_operands ':' asm_clobbers ')' ';' (rule 259) ++ ++ STRING shift, and go to state 480 ++ ++ $default reduce using rule 268 (asm_operands) ++ ++ asm_operands go to state 495 ++ nonnull_asm_operands go to state 482 ++ asm_operand go to state 483 ++ ++ ++ ++state 490 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ')' . ';' (rule 257) ++ ++ ';' shift, and go to state 496 ++ ++ ++ ++state 491 ++ ++ nonnull_asm_operands -> nonnull_asm_operands ',' . asm_operand (rule 271) ++ ++ STRING shift, and go to state 480 ++ ++ asm_operand go to state 497 ++ ++ ++ ++state 492 ++ ++ stmt -> DO @20 stmt WHILE @21 '(' expr ')' . ';' (rule 241) ++ ++ ';' shift, and go to state 498 ++ ++ ++ ++state 493 ++ ++ stmt -> FOR '(' xexpr ';' @22 xexpr ';' @23 . xexpr ')' @24 stmt (rule 245) ++ ++ IDENTIFIER shift, and go to state 59 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ ++ $default reduce using rule 266 (xexpr) ++ ++ unop go to state 73 ++ expr go to state 222 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ xexpr go to state 499 ++ ++ ++ ++state 494 ++ ++ asm_operand -> STRING '(' expr . ')' (rule 272) ++ ++ ')' shift, and go to state 500 ++ ++ ++ ++state 495 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands . ')' ';' (rule 258) ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands . ':' asm_clobbers ')' ';' (rule 259) ++ ++ ':' shift, and go to state 501 ++ ')' shift, and go to state 502 ++ ++ ++ ++state 496 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ')' ';' . (rule 257) ++ ++ $default reduce using rule 257 (stmt) ++ ++ ++ ++state 497 ++ ++ nonnull_asm_operands -> nonnull_asm_operands ',' asm_operand . (rule 271) ++ ++ $default reduce using rule 271 (nonnull_asm_operands) ++ ++ ++ ++state 498 ++ ++ stmt -> DO @20 stmt WHILE @21 '(' expr ')' ';' . (rule 241) ++ ++ $default reduce using rule 241 (stmt) ++ ++ ++ ++state 499 ++ ++ stmt -> FOR '(' xexpr ';' @22 xexpr ';' @23 xexpr . ')' @24 stmt (rule 245) ++ ++ ')' shift, and go to state 503 ++ ++ ++ ++state 500 ++ ++ asm_operand -> STRING '(' expr ')' . (rule 272) ++ ++ $default reduce using rule 272 (asm_operand) ++ ++ ++ ++state 501 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ':' . asm_clobbers ')' ';' (rule 259) ++ ++ STRING shift, and go to state 57 ++ ++ string go to state 504 ++ asm_clobbers go to state 505 ++ ++ ++ ++state 502 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ')' . ';' (rule 258) ++ ++ ';' shift, and go to state 506 ++ ++ ++ ++state 503 ++ ++ stmt -> FOR '(' xexpr ';' @22 xexpr ';' @23 xexpr ')' . @24 stmt (rule 245) ++ ++ $default reduce using rule 244 (@24) ++ ++ @24 go to state 507 ++ ++ ++ ++state 504 ++ ++ string -> string . STRING (rule 86) ++ asm_clobbers -> string . (rule 273) ++ ++ STRING shift, and go to state 124 ++ ++ $default reduce using rule 273 (asm_clobbers) ++ ++ ++ ++state 505 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ':' asm_clobbers . ')' ';' (rule 259) ++ asm_clobbers -> asm_clobbers . ',' string (rule 274) ++ ++ ')' shift, and go to state 508 ++ ',' shift, and go to state 509 ++ ++ ++ ++state 506 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ')' ';' . (rule 258) ++ ++ $default reduce using rule 258 (stmt) ++ ++ ++ ++state 507 ++ ++ stmt -> FOR '(' xexpr ';' @22 xexpr ';' @23 xexpr ')' @24 . stmt (rule 245) ++ ++ IDENTIFIER shift, and go to state 346 ++ TYPENAME shift, and go to state 27 ++ CONSTANT shift, and go to state 61 ++ STRING shift, and go to state 57 ++ SIZEOF shift, and go to state 62 ++ IF shift, and go to state 348 ++ WHILE shift, and go to state 349 ++ DO shift, and go to state 350 ++ FOR shift, and go to state 351 ++ SWITCH shift, and go to state 352 ++ CASE shift, and go to state 353 ++ DEFAULT shift, and go to state 354 ++ BREAK shift, and go to state 355 ++ CONTINUE shift, and go to state 356 ++ RETURN shift, and go to state 357 ++ GOTO shift, and go to state 358 ++ ASM shift, and go to state 359 ++ ALIGNOF shift, and go to state 63 ++ '&' shift, and go to state 64 ++ '+' shift, and go to state 65 ++ '-' shift, and go to state 66 ++ '*' shift, and go to state 67 ++ PLUSPLUS shift, and go to state 68 ++ MINUSMINUS shift, and go to state 69 ++ '(' shift, and go to state 70 ++ ';' shift, and go to state 360 ++ '~' shift, and go to state 71 ++ '!' shift, and go to state 72 ++ '{' shift, and go to state 216 ++ ++ identifier go to state 361 ++ unop go to state 73 ++ expr go to state 362 ++ nonnull_exprlist go to state 75 ++ unary_expr go to state 76 ++ cast_expr go to state 77 ++ expr_no_commas go to state 78 ++ primary go to state 79 ++ string go to state 80 ++ compstmt go to state 365 ++ simple_if go to state 366 ++ stmt go to state 510 ++ ++ ++ ++state 508 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ':' asm_clobbers ')' . ';' (rule 259) ++ ++ ';' shift, and go to state 511 ++ ++ ++ ++state 509 ++ ++ asm_clobbers -> asm_clobbers ',' . string (rule 274) ++ ++ STRING shift, and go to state 57 ++ ++ string go to state 512 ++ ++ ++ ++state 510 ++ ++ stmt -> FOR '(' xexpr ';' @22 xexpr ';' @23 xexpr ')' @24 stmt . (rule 245) ++ ++ $default reduce using rule 245 (stmt) ++ ++ ++ ++state 511 ++ ++ stmt -> ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' . (rule 259) ++ ++ $default reduce using rule 259 (stmt) ++ ++ ++ ++state 512 ++ ++ string -> string . STRING (rule 86) ++ asm_clobbers -> asm_clobbers ',' string . (rule 274) ++ ++ STRING shift, and go to state 124 ++ ++ $default reduce using rule 274 (asm_clobbers) ++ ++ ++ ++state 513 ++ ++ $ go to state 514 ++ ++ ++ ++state 514 ++ ++ $ go to state 515 ++ ++ ++ ++state 515 ++ ++ $default accept +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-parse.tab.c alliance/genview/src/gcc-1.42/c-parse.tab.c +--- alliance-5.0/genview/src/gcc-1.42/c-parse.tab.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-parse.tab.c 2002-04-11 09:14:42.000000000 +0200 +@@ -0,0 +1,4550 @@ ++ ++/* A Bison parser, made from c-parse.y ++ by GNU bison 1.30. */ ++ ++#define YYBISON 1 /* Identify Bison output. */ ++ ++# define IDENTIFIER 257 ++# define TYPENAME 258 ++# define SCSPEC 259 ++# define TYPESPEC 260 ++# define TYPE_QUAL 261 ++# define CONSTANT 262 ++# define STRING 263 ++# define ELLIPSIS 264 ++# define SIZEOF 265 ++# define ENUM 266 ++# define STRUCT 267 ++# define UNION 268 ++# define IF 269 ++# define ELSE 270 ++# define WHILE 271 ++# define DO 272 ++# define FOR 273 ++# define SWITCH 274 ++# define CASE 275 ++# define DEFAULT 276 ++# define BREAK 277 ++# define CONTINUE 278 ++# define RETURN 279 ++# define GOTO 280 ++# define ASM 281 ++# define TYPEOF 282 ++# define ALIGNOF 283 ++# define ATTRIBUTE 284 ++# define ASSIGN 285 ++# define OROR 286 ++# define ANDAND 287 ++# define EQCOMPARE 288 ++# define ARITHCOMPARE 289 ++# define LSHIFT 290 ++# define RSHIFT 291 ++# define UNARY 292 ++# define PLUSPLUS 293 ++# define MINUSMINUS 294 ++# define HYPERUNARY 295 ++# define POINTSAT 296 ++ ++#line 39 "c-parse.y" ++ ++#include "config.h" ++#include "tree.h" ++#include "input.h" ++#include "c-parse.h" ++#include "c-tree.h" ++ ++#include ++#include ++ ++#ifndef errno ++extern int errno; ++#endif ++ ++void yyerror (); ++ ++/* Cause the `yydebug' variable to be defined. */ ++#define YYDEBUG 1 ++ ++#line 61 "c-parse.y" ++typedef union {long itype; tree ttype; enum tree_code code; } YYSTYPE; ++#line 154 "c-parse.y" ++ ++/* the declaration found for the last IDENTIFIER token read in. ++ yylex must look this up to detect typedefs, which get token type TYPENAME, ++ so it is left around in case the identifier is not a typedef but is ++ used in a context which makes it a reference to a variable. */ ++static tree lastiddecl; ++ ++static tree make_pointer_declarator (); ++static tree combine_strings (); ++static void reinit_parse_for_function (); ++ ++/* List of types and structure classes of the current declaration. */ ++tree current_declspecs; ++ ++/* Stack of saved values of current_declspecs. */ ++tree declspec_stack; ++ ++int undeclared_variable_notice; /* 1 if we explained undeclared var errors. */ ++ ++static int yylex (); ++#include ++ ++ ++ ++#define YYFINAL 515 ++#define YYFLAG -32768 ++#define YYNTBASE 65 ++ ++/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */ ++#define YYTRANSLATE(x) ((unsigned)(x) <= 296 ? yytranslate[x] : 172) ++ ++/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */ ++static const char yytranslate[] = ++{ ++ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 61, 2, 2, 2, 48, 39, 2, ++ 55, 57, 46, 44, 62, 45, 54, 47, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 34, 58, ++ 2, 32, 2, 33, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 56, 2, 64, 38, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 63, 37, 59, 60, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 1, 3, 4, 5, ++ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ++ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, ++ 26, 27, 28, 29, 30, 31, 35, 36, 40, 41, ++ 42, 43, 49, 50, 51, 52, 53 ++}; ++ ++#if YYDEBUG != 0 ++static const short yyprhs[] = ++{ ++ 0, 0, 1, 3, 4, 7, 8, 12, 14, 16, ++ 22, 26, 31, 36, 39, 42, 45, 48, 50, 51, ++ 52, 60, 65, 66, 67, 75, 80, 81, 82, 89, ++ 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, ++ 113, 114, 116, 118, 122, 124, 127, 130, 133, 138, ++ 141, 146, 148, 153, 161, 163, 167, 171, 175, 179, ++ 183, 187, 191, 195, 199, 203, 207, 211, 215, 219, ++ 225, 229, 233, 235, 237, 239, 243, 247, 248, 253, ++ 258, 263, 267, 271, 274, 277, 279, 282, 283, 285, ++ 287, 289, 292, 295, 296, 301, 306, 309, 312, 315, ++ 319, 320, 323, 326, 328, 330, 333, 336, 339, 343, ++ 344, 347, 349, 351, 353, 358, 363, 365, 367, 369, ++ 371, 375, 377, 381, 382, 387, 388, 395, 399, 400, ++ 407, 411, 412, 419, 421, 425, 427, 432, 437, 439, ++ 442, 446, 451, 453, 455, 459, 461, 463, 467, 471, ++ 476, 480, 484, 486, 490, 495, 499, 503, 505, 509, ++ 513, 517, 522, 526, 528, 529, 536, 541, 544, 545, ++ 552, 557, 560, 561, 569, 570, 577, 580, 581, 583, ++ 584, 586, 588, 591, 592, 596, 599, 603, 607, 609, ++ 610, 612, 616, 619, 624, 627, 629, 633, 635, 639, ++ 642, 645, 646, 648, 650, 653, 654, 657, 661, 665, ++ 668, 672, 677, 681, 684, 688, 691, 693, 696, 699, ++ 700, 702, 705, 706, 708, 711, 714, 720, 725, 730, ++ 731, 738, 740, 743, 744, 749, 751, 752, 753, 761, ++ 762, 763, 773, 774, 775, 776, 789, 790, 797, 798, ++ 804, 805, 810, 813, 816, 819, 823, 830, 839, 850, ++ 863, 867, 868, 873, 875, 876, 878, 879, 881, 882, ++ 884, 886, 890, 895, 897, 901, 902, 905, 906, 909, ++ 912, 915, 918, 921, 924, 925, 927, 931, 933, 937, ++ 940, 943, 946, 949, 952, 954 ++}; ++static const short yyrhs[] = ++{ ++ -1, 66, 0, 0, 67, 69, 0, 0, 66, 68, ++ 69, 0, 71, 0, 70, 0, 27, 55, 88, 57, ++ 58, 0, 91, 101, 58, 0, 95, 91, 101, 58, ++ 0, 93, 91, 100, 58, 0, 95, 58, 0, 93, ++ 58, 0, 1, 58, 0, 1, 59, 0, 58, 0, ++ 0, 0, 93, 91, 112, 72, 89, 73, 139, 0, ++ 93, 91, 112, 1, 0, 0, 0, 95, 91, 115, ++ 74, 89, 75, 139, 0, 95, 91, 115, 1, 0, ++ 0, 0, 91, 115, 76, 89, 77, 139, 0, 91, ++ 115, 1, 0, 3, 0, 4, 0, 39, 0, 45, ++ 0, 44, 0, 50, 0, 51, 0, 60, 0, 61, ++ 0, 82, 0, 0, 82, 0, 85, 0, 82, 62, ++ 85, 0, 86, 0, 46, 84, 0, 79, 84, 0, ++ 11, 83, 0, 11, 55, 130, 57, 0, 29, 83, ++ 0, 29, 55, 130, 57, 0, 83, 0, 55, 130, ++ 57, 84, 0, 55, 130, 57, 63, 111, 121, 59, ++ 0, 84, 0, 85, 44, 85, 0, 85, 45, 85, ++ 0, 85, 46, 85, 0, 85, 47, 85, 0, 85, ++ 48, 85, 0, 85, 42, 85, 0, 85, 43, 85, ++ 0, 85, 41, 85, 0, 85, 40, 85, 0, 85, ++ 39, 85, 0, 85, 37, 85, 0, 85, 38, 85, ++ 0, 85, 36, 85, 0, 85, 35, 85, 0, 85, ++ 33, 157, 34, 85, 0, 85, 32, 85, 0, 85, ++ 31, 85, 0, 3, 0, 8, 0, 88, 0, 55, ++ 80, 57, 0, 55, 1, 57, 0, 0, 55, 87, ++ 140, 57, 0, 86, 55, 81, 57, 0, 86, 56, ++ 80, 64, 0, 86, 54, 78, 0, 86, 53, 78, ++ 0, 86, 50, 0, 86, 51, 0, 9, 0, 88, ++ 9, 0, 0, 90, 0, 92, 0, 137, 0, 90, ++ 92, 0, 92, 137, 0, 0, 93, 91, 100, 58, ++ 0, 95, 91, 101, 58, 0, 93, 58, 0, 95, ++ 58, 0, 98, 94, 0, 95, 98, 94, 0, 0, ++ 94, 99, 0, 94, 5, 0, 7, 0, 5, 0, ++ 95, 7, 0, 95, 5, 0, 98, 97, 0, 132, ++ 98, 97, 0, 0, 97, 99, 0, 6, 0, 116, ++ 0, 4, 0, 28, 55, 80, 57, 0, 28, 55, ++ 130, 57, 0, 6, 0, 7, 0, 116, 0, 103, ++ 0, 100, 62, 103, 0, 105, 0, 101, 62, 103, ++ 0, 0, 27, 55, 88, 57, 0, 0, 112, 102, ++ 107, 32, 104, 110, 0, 112, 102, 107, 0, 0, ++ 115, 102, 107, 32, 106, 110, 0, 115, 102, 107, ++ 0, 0, 30, 55, 55, 108, 57, 57, 0, 109, ++ 0, 108, 62, 109, 0, 3, 0, 3, 55, 8, ++ 57, 0, 3, 55, 171, 57, 0, 85, 0, 63, ++ 59, 0, 63, 111, 59, 0, 63, 111, 62, 59, ++ 0, 1, 0, 110, 0, 111, 62, 110, 0, 113, ++ 0, 115, 0, 55, 113, 57, 0, 113, 55, 164, ++ 0, 113, 56, 80, 64, 0, 113, 56, 64, 0, ++ 46, 133, 113, 0, 4, 0, 114, 55, 164, 0, ++ 114, 56, 80, 64, 0, 114, 56, 64, 0, 46, ++ 133, 114, 0, 4, 0, 115, 55, 164, 0, 55, ++ 115, 57, 0, 46, 133, 115, 0, 115, 56, 80, ++ 64, 0, 115, 56, 64, 0, 3, 0, 0, 13, ++ 78, 63, 117, 123, 59, 0, 13, 63, 123, 59, ++ 0, 13, 78, 0, 0, 14, 78, 63, 118, 123, ++ 59, 0, 14, 63, 123, 59, 0, 14, 78, 0, ++ 0, 12, 78, 63, 119, 128, 122, 59, 0, 0, ++ 12, 63, 120, 128, 122, 59, 0, 12, 78, 0, ++ 0, 62, 0, 0, 62, 0, 124, 0, 124, 125, ++ 0, 0, 124, 125, 58, 0, 124, 58, 0, 96, ++ 91, 126, 0, 132, 91, 126, 0, 1, 0, 0, ++ 127, 0, 126, 62, 127, 0, 112, 107, 0, 112, ++ 34, 85, 107, 0, 34, 85, 0, 129, 0, 128, ++ 62, 129, 0, 78, 0, 78, 32, 85, 0, 96, ++ 131, 0, 132, 131, 0, 0, 134, 0, 7, 0, ++ 132, 7, 0, 0, 133, 7, 0, 55, 134, 57, ++ 0, 46, 133, 134, 0, 46, 133, 0, 134, 55, ++ 162, 0, 134, 56, 80, 64, 0, 134, 56, 64, ++ 0, 55, 162, 0, 56, 80, 64, 0, 56, 64, ++ 0, 143, 0, 135, 143, 0, 135, 137, 0, 0, ++ 135, 0, 1, 58, 0, 0, 140, 0, 1, 140, ++ 0, 63, 59, 0, 63, 138, 90, 136, 59, 0, ++ 63, 138, 1, 59, 0, 63, 138, 135, 59, 0, ++ 0, 15, 55, 80, 57, 142, 143, 0, 140, 0, ++ 80, 58, 0, 0, 141, 16, 144, 143, 0, 141, ++ 0, 0, 0, 17, 145, 55, 80, 57, 146, 143, ++ 0, 0, 0, 18, 147, 143, 17, 148, 55, 80, ++ 57, 58, 0, 0, 0, 0, 19, 55, 157, 58, ++ 149, 157, 58, 150, 157, 57, 151, 143, 0, 0, ++ 20, 55, 80, 57, 152, 143, 0, 0, 21, 80, ++ 34, 153, 143, 0, 0, 22, 34, 154, 143, 0, ++ 23, 58, 0, 24, 58, 0, 25, 58, 0, 25, ++ 80, 58, 0, 27, 156, 55, 88, 57, 58, 0, ++ 27, 156, 55, 88, 34, 158, 57, 58, 0, 27, ++ 156, 55, 88, 34, 158, 34, 158, 57, 58, 0, ++ 27, 156, 55, 88, 34, 158, 34, 158, 34, 161, ++ 57, 58, 0, 26, 78, 58, 0, 0, 78, 34, ++ 155, 143, 0, 58, 0, 0, 7, 0, 0, 80, ++ 0, 0, 159, 0, 160, 0, 159, 62, 160, 0, ++ 9, 55, 80, 57, 0, 88, 0, 161, 62, 88, ++ 0, 0, 163, 167, 0, 0, 165, 166, 0, 168, ++ 57, 0, 171, 57, 0, 1, 57, 0, 168, 57, ++ 0, 1, 57, 0, 0, 169, 0, 169, 62, 10, ++ 0, 170, 0, 169, 62, 170, 0, 93, 114, 0, ++ 93, 115, 0, 93, 131, 0, 95, 115, 0, 95, ++ 131, 0, 3, 0, 171, 62, 3, 0 ++}; ++ ++#endif ++ ++#if YYDEBUG != 0 ++/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ ++static const short yyrline[] = ++{ ++ 0, 177, 178, 185, 187, 187, 188, 190, 192, 193, ++ 198, 204, 206, 208, 210, 212, 213, 214, 219, 225, ++ 227, 228, 230, 235, 237, 238, 240, 245, 247, 248, ++ 252, 254, 257, 259, 261, 263, 265, 267, 269, 273, ++ 277, 280, 283, 286, 290, 292, 294, 296, 309, 311, ++ 344, 348, 350, 353, 367, 369, 371, 373, 375, 377, ++ 379, 381, 383, 385, 387, 389, 391, 393, 395, 397, ++ 399, 401, 405, 454, 455, 457, 459, 461, 469, 481, ++ 483, 485, 487, 489, 491, 496, 498, 502, 504, 507, ++ 509, 510, 511, 518, 525, 530, 534, 536, 544, 547, ++ 551, 553, 555, 563, 566, 568, 570, 579, 582, 586, ++ 588, 596, 597, 598, 599, 601, 607, 608, 609, 612, ++ 614, 617, 619, 622, 625, 631, 636, 637, 642, 647, ++ 648, 654, 657, 662, 663, 667, 671, 679, 685, 687, ++ 691, 693, 695, 701, 704, 711, 713, 718, 721, 726, ++ 728, 730, 732, 740, 746, 748, 750, 752, 758, 764, ++ 766, 768, 770, 772, 775, 780, 784, 787, 789, 791, ++ 793, 796, 798, 801, 804, 807, 810, 814, 816, 819, ++ 821, 825, 828, 833, 835, 837, 851, 857, 862, 866, ++ 871, 872, 876, 879, 881, 890, 892, 897, 900, 904, ++ 907, 911, 914, 917, 920, 924, 927, 931, 935, 937, ++ 939, 941, 943, 945, 947, 949, 957, 959, 960, 963, ++ 965, 968, 971, 980, 983, 986, 988, 992, 996, 1002, ++ 1007, 1009, 1011, 1021, 1024, 1025, 1027, 1031, 1035, 1036, ++ 1040, 1042, 1047, 1053, 1057, 1063, 1069, 1076, 1078, 1110, ++ 1110, 1121, 1121, 1125, 1129, 1132, 1135, 1140, 1147, 1154, ++ 1161, 1167, 1173, 1173, 1178, 1181, 1185, 1188, 1193, 1195, ++ 1198, 1200, 1204, 1209, 1212, 1218, 1222, 1229, 1233, 1238, ++ 1240, 1242, 1246, 1248, 1254, 1256, 1258, 1262, 1265, 1271, ++ 1274, 1276, 1278, 1280, 1285, 1288 ++}; ++#endif ++ ++ ++#if YYDEBUG != 0 || defined YYERROR_VERBOSE ++ ++/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */ ++static const char *const yytname[] = ++{ ++ "$", "error", "$undefined.", "IDENTIFIER", "TYPENAME", "SCSPEC", ++ "TYPESPEC", "TYPE_QUAL", "CONSTANT", "STRING", "ELLIPSIS", "SIZEOF", ++ "ENUM", "STRUCT", "UNION", "IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", ++ "CASE", "DEFAULT", "BREAK", "CONTINUE", "RETURN", "GOTO", "ASM", ++ "TYPEOF", "ALIGNOF", "ATTRIBUTE", "ASSIGN", "'='", "'?'", "':'", "OROR", ++ "ANDAND", "'|'", "'^'", "'&'", "EQCOMPARE", "ARITHCOMPARE", "LSHIFT", ++ "RSHIFT", "'+'", "'-'", "'*'", "'/'", "'%'", "UNARY", "PLUSPLUS", ++ "MINUSMINUS", "HYPERUNARY", "POINTSAT", "'.'", "'('", "'['", "')'", ++ "';'", "'}'", "'~'", "'!'", "','", "'{'", "']'", "program", "extdefs", ++ "@1", "@2", "extdef", "datadef", "fndef", "@3", "@4", "@5", "@6", "@7", ++ "@8", "identifier", "unop", "expr", "exprlist", "nonnull_exprlist", ++ "unary_expr", "cast_expr", "expr_no_commas", "primary", "@9", "string", ++ "xdecls", "decls", "setspecs", "decl", "typed_declspecs", ++ "reserved_declspecs", "declmods", "typed_typespecs", ++ "reserved_typespecquals", "typespec", "typespecqual_reserved", ++ "initdecls", "notype_initdecls", "maybeasm", "initdcl", "@10", ++ "notype_initdcl", "@11", "maybe_attribute", "attribute_list", "attrib", ++ "init", "initlist", "declarator", "after_type_declarator", ++ "parm_declarator", "notype_declarator", "structsp", "@12", "@13", "@14", ++ "@15", "maybecomma", "maybecomma_warn", "component_decl_list", ++ "component_decl_list2", "component_decl", "components", ++ "component_declarator", "enumlist", "enumerator", "typename", "absdcl", ++ "nonempty_type_quals", "type_quals", "absdcl1", "stmts", "xstmts", ++ "errstmt", "pushlevel", "compstmt_or_error", "compstmt", "simple_if", ++ "@16", "stmt", "@17", "@18", "@19", "@20", "@21", "@22", "@23", "@24", ++ "@25", "@26", "@27", "@28", "maybe_type_qual", "xexpr", "asm_operands", ++ "nonnull_asm_operands", "asm_operand", "asm_clobbers", "parmlist", ++ "@29", "parmlist_or_identifiers", "@30", "parmlist_or_identifiers_1", ++ "parmlist_1", "parmlist_2", "parms", "parm", "identifiers", NULL ++}; ++#endif ++ ++/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ ++static const short yyr1[] = ++{ ++ 0, 65, 65, 67, 66, 68, 66, 69, 69, 69, ++ 70, 70, 70, 70, 70, 70, 70, 70, 72, 73, ++ 71, 71, 74, 75, 71, 71, 76, 77, 71, 71, ++ 78, 78, 79, 79, 79, 79, 79, 79, 79, 80, ++ 81, 81, 82, 82, 83, 83, 83, 83, 83, 83, ++ 83, 84, 84, 84, 85, 85, 85, 85, 85, 85, ++ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, ++ 85, 85, 86, 86, 86, 86, 86, 87, 86, 86, ++ 86, 86, 86, 86, 86, 88, 88, 89, 89, 90, ++ 90, 90, 90, 91, 92, 92, 92, 92, 93, 93, ++ 94, 94, 94, 95, 95, 95, 95, 96, 96, 97, ++ 97, 98, 98, 98, 98, 98, 99, 99, 99, 100, ++ 100, 101, 101, 102, 102, 104, 103, 103, 106, 105, ++ 105, 107, 107, 108, 108, 109, 109, 109, 110, 110, ++ 110, 110, 110, 111, 111, 112, 112, 113, 113, 113, ++ 113, 113, 113, 114, 114, 114, 114, 114, 115, 115, ++ 115, 115, 115, 115, 117, 116, 116, 116, 118, 116, ++ 116, 116, 119, 116, 120, 116, 116, 121, 121, 122, ++ 122, 123, 123, 124, 124, 124, 125, 125, 125, 126, ++ 126, 126, 127, 127, 127, 128, 128, 129, 129, 130, ++ 130, 131, 131, 132, 132, 133, 133, 134, 134, 134, ++ 134, 134, 134, 134, 134, 134, 135, 135, 135, 136, ++ 136, 137, 138, 139, 139, 140, 140, 140, 140, 142, ++ 141, 143, 143, 144, 143, 143, 145, 146, 143, 147, ++ 148, 143, 149, 150, 151, 143, 152, 143, 153, 143, ++ 154, 143, 143, 143, 143, 143, 143, 143, 143, 143, ++ 143, 155, 143, 143, 156, 156, 157, 157, 158, 158, ++ 159, 159, 160, 161, 161, 163, 162, 165, 164, 166, ++ 166, 166, 167, 167, 168, 168, 168, 169, 169, 170, ++ 170, 170, 170, 170, 171, 171 ++}; ++ ++/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ ++static const short yyr2[] = ++{ ++ 0, 0, 1, 0, 2, 0, 3, 1, 1, 5, ++ 3, 4, 4, 2, 2, 2, 2, 1, 0, 0, ++ 7, 4, 0, 0, 7, 4, 0, 0, 6, 3, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 0, 1, 1, 3, 1, 2, 2, 2, 4, 2, ++ 4, 1, 4, 7, 1, 3, 3, 3, 3, 3, ++ 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, ++ 3, 3, 1, 1, 1, 3, 3, 0, 4, 4, ++ 4, 3, 3, 2, 2, 1, 2, 0, 1, 1, ++ 1, 2, 2, 0, 4, 4, 2, 2, 2, 3, ++ 0, 2, 2, 1, 1, 2, 2, 2, 3, 0, ++ 2, 1, 1, 1, 4, 4, 1, 1, 1, 1, ++ 3, 1, 3, 0, 4, 0, 6, 3, 0, 6, ++ 3, 0, 6, 1, 3, 1, 4, 4, 1, 2, ++ 3, 4, 1, 1, 3, 1, 1, 3, 3, 4, ++ 3, 3, 1, 3, 4, 3, 3, 1, 3, 3, ++ 3, 4, 3, 1, 0, 6, 4, 2, 0, 6, ++ 4, 2, 0, 7, 0, 6, 2, 0, 1, 0, ++ 1, 1, 2, 0, 3, 2, 3, 3, 1, 0, ++ 1, 3, 2, 4, 2, 1, 3, 1, 3, 2, ++ 2, 0, 1, 1, 2, 0, 2, 3, 3, 2, ++ 3, 4, 3, 2, 3, 2, 1, 2, 2, 0, ++ 1, 2, 0, 1, 2, 2, 5, 4, 4, 0, ++ 6, 1, 2, 0, 4, 1, 0, 0, 7, 0, ++ 0, 9, 0, 0, 0, 12, 0, 6, 0, 5, ++ 0, 4, 2, 2, 2, 3, 6, 8, 10, 12, ++ 3, 0, 4, 1, 0, 1, 0, 1, 0, 1, ++ 1, 3, 4, 1, 3, 0, 2, 0, 2, 2, ++ 2, 2, 2, 2, 0, 1, 3, 1, 3, 2, ++ 2, 2, 2, 2, 1, 3 ++}; ++ ++/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE ++ doesn't specify something else to do. Zero means the default is an ++ error. */ ++static const short yydefact[] = ++{ ++ 3, 5, 0, 0, 0, 113, 104, 111, 103, 0, ++ 0, 0, 0, 0, 17, 4, 8, 7, 0, 93, ++ 93, 100, 112, 6, 15, 16, 30, 31, 174, 176, ++ 183, 167, 183, 171, 0, 0, 163, 205, 0, 0, ++ 121, 0, 14, 0, 106, 105, 13, 0, 100, 98, ++ 0, 172, 0, 0, 164, 0, 168, 85, 0, 72, ++ 203, 73, 0, 0, 32, 34, 33, 0, 35, 36, ++ 0, 37, 38, 0, 0, 39, 51, 54, 42, 44, ++ 74, 201, 109, 0, 201, 0, 0, 10, 0, 29, ++ 0, 277, 0, 0, 131, 152, 205, 0, 0, 119, ++ 0, 145, 146, 0, 0, 99, 102, 116, 117, 101, ++ 118, 197, 179, 195, 0, 166, 188, 185, 93, 182, ++ 93, 183, 170, 183, 86, 0, 0, 47, 0, 49, ++ 45, 0, 0, 0, 0, 46, 114, 0, 0, 0, ++ 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 83, 84, 0, 0, 40, ++ 0, 205, 275, 0, 199, 202, 107, 115, 204, 109, ++ 200, 206, 160, 159, 122, 123, 0, 158, 0, 162, ++ 0, 0, 27, 88, 0, 93, 93, 90, 0, 130, ++ 0, 0, 12, 0, 21, 0, 131, 277, 0, 11, ++ 25, 0, 0, 180, 0, 179, 189, 184, 189, 0, ++ 0, 9, 0, 0, 76, 75, 222, 0, 0, 43, ++ 71, 70, 267, 0, 68, 67, 65, 66, 64, 63, ++ 62, 60, 61, 55, 56, 57, 58, 59, 82, 81, ++ 0, 41, 0, 209, 0, 213, 0, 215, 0, 275, ++ 0, 110, 108, 0, 0, 294, 201, 201, 278, 0, ++ 285, 287, 0, 161, 221, 0, 91, 92, 96, 0, ++ 97, 0, 0, 128, 151, 147, 120, 19, 127, 148, ++ 150, 0, 23, 198, 196, 175, 0, 0, 131, 186, ++ 190, 187, 165, 169, 48, 50, 225, 0, 78, 0, ++ 52, 0, 79, 80, 208, 207, 0, 276, 0, 214, ++ 210, 212, 0, 124, 281, 157, 205, 275, 289, 290, ++ 291, 205, 292, 293, 279, 0, 280, 0, 0, 28, ++ 223, 0, 0, 123, 0, 0, 0, 125, 149, 0, ++ 173, 194, 0, 192, 0, 0, 72, 113, 0, 236, ++ 239, 0, 0, 0, 0, 0, 0, 0, 0, 264, ++ 263, 0, 0, 219, 0, 231, 235, 216, 142, 0, ++ 138, 143, 177, 69, 283, 282, 211, 209, 277, 0, ++ 209, 286, 288, 295, 224, 94, 95, 135, 0, 133, ++ 129, 20, 0, 24, 131, 191, 227, 0, 0, 0, ++ 266, 0, 0, 250, 252, 253, 254, 0, 0, 265, ++ 0, 261, 232, 0, 0, 228, 218, 217, 233, 139, ++ 0, 0, 0, 156, 153, 155, 0, 0, 0, 0, ++ 126, 193, 0, 0, 0, 0, 0, 248, 0, 255, ++ 260, 0, 0, 226, 0, 140, 0, 144, 53, 154, ++ 0, 0, 132, 134, 229, 0, 240, 242, 246, 0, ++ 251, 0, 262, 234, 141, 136, 137, 0, 237, 0, ++ 266, 0, 249, 268, 0, 230, 0, 0, 0, 247, ++ 0, 0, 269, 270, 256, 238, 0, 243, 0, 268, ++ 0, 0, 0, 266, 0, 0, 257, 271, 241, 0, ++ 272, 0, 0, 244, 273, 0, 258, 0, 0, 0, ++ 245, 259, 274, 0, 0, 0 ++}; ++ ++static const short yydefgoto[] = ++{ ++ 513, 1, 2, 3, 15, 16, 17, 195, 336, 201, ++ 339, 93, 265, 361, 73, 362, 240, 75, 76, 77, ++ 78, 79, 133, 80, 182, 183, 18, 184, 185, 49, ++ 186, 81, 166, 21, 109, 98, 39, 94, 99, 392, ++ 40, 335, 189, 388, 389, 371, 372, 175, 101, 318, ++ 102, 22, 121, 123, 114, 50, 422, 204, 52, 53, ++ 119, 289, 290, 112, 113, 83, 164, 84, 85, 165, ++ 364, 414, 187, 297, 329, 365, 366, 467, 367, 444, ++ 398, 476, 399, 469, 470, 493, 507, 471, 459, 438, ++ 442, 410, 223, 481, 482, 483, 505, 245, 246, 177, ++ 178, 258, 307, 259, 260, 261, 262 ++}; ++ ++static const short yypact[] = ++{ ++ 61, 71, 1439, 1439, 210,-32768,-32768,-32768,-32768, 35, ++ 37, 39, 79, 109,-32768,-32768,-32768,-32768, 86, 36, ++ 131,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 53, ++ -32768, 63,-32768, 84, 163, 1292,-32768,-32768, 86, 19, ++ -32768, 731,-32768, 267,-32768,-32768,-32768, 86,-32768, 467, ++ 338,-32768, 116, 389,-32768, 122,-32768,-32768, 76,-32768, ++ -32768,-32768, 1359, 1372,-32768,-32768,-32768, 1426,-32768,-32768, ++ 369,-32768,-32768, 1426, 135, 158,-32768,-32768, 1495, 844, ++ 227, 124,-32768, 187, 1450, 273, 190,-32768, 267,-32768, ++ 220,-32768, 947, 51, 223,-32768,-32768, 267, 26,-32768, ++ 932, 306, 310, 29, 768, 467,-32768,-32768,-32768,-32768, ++ -32768, 245, 217,-32768, 338,-32768,-32768,-32768,-32768, 229, ++ 515,-32768,-32768,-32768,-32768, 240, 369,-32768, 369,-32768, ++ -32768, 247, 264, 239, 266,-32768,-32768, 1426, 1426, 1426, ++ 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, ++ 1426, 1426, 1426, 1426, 1426,-32768,-32768, 338, 338, 1426, ++ 1426,-32768, 124, 970,-32768, 349, 154,-32768,-32768,-32768, ++ -32768,-32768, 310,-32768,-32768, 308, 163,-32768, 302,-32768, ++ 261, 287,-32768, 457, 487, 292, 260,-32768, 314, 325, ++ 46, 298,-32768, 267,-32768, 51, 223,-32768, 1015,-32768, ++ -32768, 51, 1426, 338, 312, 217, 182,-32768, 182, 315, ++ 328,-32768, 334, 337,-32768,-32768, 347, 361, 1231, 1495, ++ 1495, 1495,-32768, 382, 1524, 832, 1535, 707, 538, 598, ++ 923, 237, 237, 246, 246,-32768,-32768,-32768,-32768,-32768, ++ 366, 158, 363, 102, 329,-32768, 699,-32768, 364,-32768, ++ 1038,-32768, 154, 112, 368,-32768, 100, 806,-32768, 374, ++ 376,-32768, 10,-32768,-32768, 33,-32768,-32768,-32768, 267, ++ -32768, 86, 385,-32768, 306,-32768,-32768,-32768, 413,-32768, ++ -32768, 386,-32768, 1495,-32768,-32768, 387, 1426, 189, 390, ++ -32768, 390,-32768,-32768,-32768,-32768,-32768, 548,-32768, 880, ++ -32768, 1426,-32768,-32768, 349,-32768, 394,-32768, 396,-32768, ++ -32768,-32768, 392,-32768,-32768,-32768,-32768, 107, 354, 310, ++ -32768,-32768, 310,-32768,-32768, 429,-32768, 451, 239,-32768, ++ -32768, 193, 198, 27, 455, 880, 33,-32768,-32768, 33, ++ -32768, 1495, 1426,-32768, 182, 353, 425, 431, 411,-32768, ++ -32768, 421, 422, 1426, 434, 424, 426, 1305, 338, 476, ++ -32768, 452, 439, 1145, 609,-32768, 471,-32768,-32768, 288, ++ 1495,-32768, 427, 1511,-32768,-32768,-32768, 333,-32768, 1083, ++ 255,-32768,-32768,-32768,-32768,-32768,-32768, 462, 92,-32768, ++ -32768,-32768, 880,-32768, 1477,-32768,-32768, 1426, 463, 1206, ++ 1426, 1426, 486,-32768,-32768,-32768,-32768, 465, 466,-32768, ++ 470,-32768,-32768, 670, 475,-32768,-32768,-32768,-32768,-32768, ++ -11, 796, 477, 354,-32768,-32768, 480, 219, 473, 455, ++ -32768,-32768, 478, 1426, 522, 482, 484,-32768, 1206,-32768, ++ -32768, 163, 1206,-32768, 1206,-32768, 857,-32768,-32768,-32768, ++ 501, 176,-32768,-32768,-32768, 507,-32768,-32768,-32768, 1206, ++ -32768, 65,-32768,-32768,-32768,-32768,-32768, 1206,-32768, 533, ++ 1426, 1206,-32768, 580, 532,-32768, 1206, 1426, 537,-32768, ++ 536, 12, 534,-32768,-32768,-32768, 540,-32768, 1426, 580, ++ 542, 580, 543, 1426, 545, 13,-32768,-32768,-32768, 547, ++ -32768, 163, 549,-32768, 227, 186,-32768, 1206, 556, 163, ++ -32768,-32768, 227, 605, 615,-32768 ++}; ++ ++static const short yypgoto[] = ++{ ++ -32768,-32768,-32768,-32768, 613,-32768,-32768,-32768,-32768,-32768, ++ -32768,-32768,-32768, -6,-32768, -33,-32768, 460, 359, -41, ++ 57,-32768,-32768, -34, -135, 324, 5, -148, 4, 574, ++ 6, 570, 456, -8, -147, 378, -30, -64, -65,-32768, ++ -32768,-32768, -182,-32768, 208, -306, 280, -32, -66, 274, ++ -17, -27,-32768,-32768,-32768,-32768,-32768, 445, -4,-32768, ++ -32768, 444, 313, 544, 453, 3, -69, 608, -86, -146, ++ 299,-32768, -171,-32768, -110, -115,-32768,-32768, -181,-32768, ++ -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, ++ -32768,-32768, -380, 174,-32768, 175,-32768, 416,-32768, -164, ++ -32768,-32768,-32768, 430,-32768, 350, 250 ++}; ++ ++ ++#define YYLAST 1583 ++ ++ ++static const short yytable[] = ++{ ++ 58, 41, 74, 29, 31, 33, 19, 19, 20, 20, ++ 190, 100, 48, 267, 278, 170, 244, 103, 217, 251, ++ 435, 86, 110, 174, 43, 47, 130, 82, 55, 390, ++ 104, 191, 135, 279, 328, 266, 196, 132, 26, 27, ++ 26, 27, 26, 27, 111, 82, 489, 501, 445, 36, ++ 95, 446, 181, 171, 90, 5, 6, 7, 8, 180, ++ 277, -1, 82, 9, 10, 11, 282, 326, 172, 490, ++ 502, -2, 327, 134, 124, 243, 169, 87, 110, 13, ++ 86, 88, 91, 92, 192, 124, 430, 199, 193, 36, ++ 478, 88, 96, 132, 42, 132, 216, 304, 28, 473, ++ 30, 97, 32, 36, 315, 251, 343, 222, 111, 171, ++ 36, 196, 169, 499, -87, 447, 51, 209, 82, 210, ++ 82, 124, 474, 206, 274, 208, 54, 242, 276, 212, ++ 248, 213, 37, 125, 34, 5, 44, 7, 45, 110, ++ 447, 38, 253, 9, 10, 11, 316, 56, 161, 428, ++ 330, 238, 239, 321, 429, 317, 163, 162, 163, 13, ++ 107, 108, 317, 163, 35, 281, 9, 10, 11, 313, ++ 161, 244, 57, 172, 288, 115, 288, 300, 48, 162, ++ 163, 122, 256, 417, 257, 36, 95, 320, 323, 46, ++ 269, 271, 136, 416, 219, 220, 221, 111, 224, 225, ++ 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, ++ 236, 237, 431, 384, 424, 266, 287, 312, 434, 188, ++ 137, 330, 255, 342, 330, 110, 391, 450, 96, 393, ++ 377, 304, 417, 466, 304, 380, 124, 97, 327, 319, ++ 322, 332, 416, 508, 167, 91, 92, 173, 509, 48, ++ 256, 385, 257, 188, 333, 193, 386, 460, 36, 283, ++ 88, 462, 171, 463, 5, 44, 7, 45, 24, 25, ++ 36, 95, 9, 10, 11, 176, 36, 202, 472, 203, ++ 171, 150, 151, 152, 153, 154, 475, 207, 13, 368, ++ 479, 59, 152, 153, 154, 485, 61, 57, 211, 62, ++ 86, 321, 216, 254, 214, 255, 5, 6, 7, 8, ++ 317, 163, 288, 96, 9, 10, 11, 63, 270, 37, ++ 402, 215, 97, 218, 407, 263, 510, 64, 38, 256, ++ 13, 257, 65, 66, 67, 90, 36, 315, 68, 69, ++ 171, 26, 27, 70, 341, 264, 426, 419, 71, 72, ++ 268, 369, 408, 197, 198, 275, 370, 273, 373, -284, ++ 172, 197, 198, 172, 432, 91, 92, 222, 436, 272, ++ 131, 285, 59, 5, 292, 7, 60, 61, 57, 316, ++ 62, 9, 10, 11, 249, 250, 305, 293, 317, 163, ++ 116, 294, 370, 5, 295, 7, 60, 13, 63, 394, ++ 455, 9, 10, 11, 249, 250, 296, 461, 64, 378, ++ 379, 264, 396, 65, 66, 67, 301, 13, 298, 68, ++ 69, 127, 129, 302, 70, 314, 370, 303, 309, 71, ++ 72, 324, -77, 5, 6, 7, 8, 222, 325, 381, ++ 334, 9, 10, 11, 486, 337, 340, 117, -181, 370, ++ 338, 374, 344, 375, 383, 494, 376, 13, 387, -30, ++ 222, 5, 6, 7, 8, -31, 397, 504, 403, 9, ++ 10, 11, 106, 107, 108, 512, 400, 401, 370, 9, ++ 10, 11, 404, 409, 405, 13, 411, 418, 181, 421, ++ -89, -89, -89, -89, -89, -89, -89, 412, -89, -89, ++ -89, -89, -89, 370, -89, -89, -89, -89, -89, -89, ++ -89, -89, -89, -89, -89, -89, -89, 427, 433, 5, ++ 437, 7, 168, 439, 440, 441, -89, 9, 10, 11, ++ 452, -89, -89, -89, 443, 454, 448, -89, -89, 456, ++ 457, 458, -89, 13, 449, -89, -89, -89, -89, 345, ++ -89, 346, 347, 6, 7, 8, 61, 57, 465, 62, ++ 9, 10, 11, 348, 468, 349, 350, 351, 352, 353, ++ 354, 355, 356, 357, 358, 359, 13, 63, 146, 147, ++ 148, 149, 150, 151, 152, 153, 154, 64, 477, 480, ++ 484, 488, 65, 66, 67, 487, 491, 492, 68, 69, ++ 496, 498, 500, 70, 503, 514, 360, 506, 71, 72, ++ 181, 216, 346, 27, 511, 515, 23, 61, 57, 241, ++ 62, 363, 105, 118, 348, 252, 349, 350, 351, 352, ++ 353, 354, 355, 356, 357, 358, 359, 453, 63, 147, ++ 148, 149, 150, 151, 152, 153, 154, 331, 64, 420, ++ 286, 423, 291, 65, 66, 67, 284, 395, 205, 68, ++ 69, 120, 413, 495, 70, 310, 497, 360, 415, 71, ++ 72, 181, 216, 346, 27, 382, 308, 451, 61, 57, ++ 0, 62, 0, 0, 0, 348, 0, 349, 350, 351, ++ 352, 353, 354, 355, 356, 357, 358, 359, 0, 63, ++ 306, 0, 0, 5, 6, 7, 8, 0, 0, 64, ++ 0, 9, 10, 11, 65, 66, 67, 0, 0, 0, ++ 68, 69, 0, 0, 0, 70, 0, 13, 360, -220, ++ 71, 72, 89, 216, 0, -26, -26, -26, -26, 0, ++ 0, 0, 0, -26, -26, -26, 145, 146, 147, 148, ++ 149, 150, 151, 152, 153, 154, -284, 0, 90, -26, ++ 0, -123, 0, -123, 0, 0, 0, 0, 0, 200, ++ 0, 0, -22, -22, -22, -22, 0, 0, 0, 0, ++ -22, -22, -22, 0, 0, 0, 91, 92, 0, -123, ++ 0, 0, 0, -123, -26, 90, -22, 368, -123, 59, ++ -123, 0, 0, 0, 61, 57, 0, 62, 0, 36, ++ 5, 44, 7, 45, 0, 0, 0, 0, 9, 10, ++ 11, 0, 0, 91, 92, 63, -123, 0, 0, 0, ++ -123, -22, 0, 0, 13, 64, 0, 0, 0, 0, ++ 65, 66, 67, 0, 0, 0, 68, 69, 0, 0, ++ 0, 70, 321, 0, 0, -178, 71, 72, 368, 369, ++ 59, 317, 163, 0, 0, 61, 57, 0, 62, 143, ++ 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, ++ 154, 368, 0, 59, 0, 0, 63, 0, 61, 57, ++ 0, 62, 0, 0, 155, 156, 64, 157, 158, 159, ++ 160, 65, 66, 67, 0, 0, 0, 68, 69, 63, ++ 0, 0, 70, 0, 0, 0, 464, 71, 72, 64, ++ 369, 0, 0, 0, 65, 66, 67, 0, 0, 0, ++ 68, 69, 0, 194, 0, 70, -18, -18, -18, -18, ++ 71, 72, 0, 369, -18, -18, -18, 0, 0, 0, ++ 59, 0, 0, 0, 0, 61, 57, 0, 62, 90, ++ -18, 0, -123, 0, -123, 148, 149, 150, 151, 152, ++ 153, 154, 0, 59, 0, 0, 63, 0, 61, 57, ++ 0, 62, 0, 0, 0, 0, 64, 0, 0, 0, ++ -123, 65, 66, 67, -123, -18, 0, 68, 69, 63, ++ 0, 0, 70, 0, 0, 0, 0, 71, 72, 64, ++ 0, 179, 0, 0, 65, 66, 67, 0, 59, 0, ++ 68, 69, 0, 61, 57, 70, 62, 0, 0, 0, ++ 71, 72, 0, 0, 247, 0, 0, 0, 0, 0, ++ 0, 59, 0, 0, 63, 0, 61, 57, 0, 62, ++ 0, 0, 0, 0, 64, 0, 0, 0, 0, 65, ++ 66, 67, 0, 0, 0, 68, 69, 63, 0, 0, ++ 70, 0, 0, 0, 0, 71, 72, 64, 0, 280, ++ 0, 0, 65, 66, 67, 0, 59, 0, 68, 69, ++ 0, 61, 57, 70, 62, 0, 0, 0, 71, 72, ++ 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 64, 0, 0, 0, 0, 65, 66, 67, ++ 0, 0, 0, 68, 69, 0, 0, 0, 70, 0, ++ 0, 0, 0, 71, 72, 0, 0, 425, 346, 347, ++ 6, 7, 8, 61, 57, 0, 62, 9, 10, 11, ++ 348, 0, 349, 350, 351, 352, 353, 354, 355, 356, ++ 357, 358, 359, 13, 63, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 64, 0, 0, 0, 0, 65, ++ 66, 67, 0, 0, 0, 68, 69, 0, 0, 0, ++ 70, 0, 0, 360, 0, 71, 72, 0, 216, 346, ++ 27, 0, 0, 0, 61, 57, 0, 62, 0, 0, ++ 0, 348, 0, 349, 350, 351, 352, 353, 354, 355, ++ 356, 357, 358, 359, 59, 63, 0, 0, 0, 61, ++ 57, 0, 62, 0, 0, 64, 0, 0, 0, 0, ++ 65, 66, 67, 0, 0, 0, 68, 69, 0, 0, ++ 63, 70, 0, 0, 360, 0, 71, 72, 0, 216, ++ 64, 0, 0, 0, 0, 65, 66, 67, 0, 0, ++ 0, 68, 69, 0, 0, 0, 70, 0, 0, 0, ++ 0, 71, 72, 0, 299, 59, 5, 0, 7, 60, ++ 61, 57, 0, 62, 9, 10, 11, 0, 59, 0, ++ 0, 0, 0, 61, 57, 0, 62, 0, 0, 0, ++ 13, 63, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 64, 0, 0, 63, 0, 65, 66, 67, 0, ++ 0, 0, 68, 69, 64, 0, 0, 70, 0, 65, ++ 66, 67, 71, 72, 0, 68, 69, 0, 0, 0, ++ 70, 0, 59, 406, 0, 71, 72, 61, 57, 0, ++ 62, 0, 0, 0, 0, 59, 0, 0, 0, 0, ++ 61, 57, 0, 62, 0, 0, 0, 0, 63, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, ++ 0, 63, 0, 65, 66, 67, 0, 0, 0, 68, ++ 69, 64, 0, 0, 126, 0, 65, 66, 67, 71, ++ 72, 0, 68, 69, 0, 0, 0, 128, 0, 59, ++ 0, 0, 71, 72, 61, 57, 0, 62, 0, 0, ++ 4, 0, -93, 5, 6, 7, 8, 0, 0, 0, ++ 0, 9, 10, 11, 5, 63, 7, 168, 0, 0, ++ 0, 0, 9, 10, 11, 64, 12, 13, 0, 0, ++ 65, 66, 67, 0, 0, 0, 68, 69, 13, 0, ++ 0, 70, 0, 0, 0, -93, 71, 72, 0, 0, ++ 0, 0, 0, 0, -93, 0, 161, 14, 0, 0, ++ 0, 0, 0, 0, 0, 162, 163, 188, 138, 139, ++ 140, 0, 141, 142, 143, 144, 145, 146, 147, 148, ++ 149, 150, 151, 152, 153, 154, 138, 139, 140, 0, ++ 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, ++ 151, 152, 153, 154, 140, 0, 141, 142, 143, 144, ++ 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, ++ 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, ++ 152, 153, 154, 144, 145, 146, 147, 148, 149, 150, ++ 151, 152, 153, 154 ++}; ++ ++static const short yycheck[] = ++{ ++ 34, 18, 35, 9, 10, 11, 2, 3, 2, 3, ++ 96, 43, 20, 184, 196, 84, 162, 47, 133, 166, ++ 400, 38, 49, 88, 19, 20, 67, 35, 32, 335, ++ 47, 97, 73, 197, 1, 183, 100, 70, 3, 4, ++ 3, 4, 3, 4, 50, 53, 34, 34, 59, 3, ++ 4, 62, 1, 7, 27, 4, 5, 6, 7, 92, ++ 195, 0, 70, 12, 13, 14, 201, 57, 85, 57, ++ 57, 0, 62, 70, 9, 161, 84, 58, 105, 28, ++ 97, 62, 55, 56, 58, 9, 392, 58, 62, 3, ++ 470, 62, 46, 126, 58, 128, 63, 243, 63, 34, ++ 63, 55, 63, 3, 4, 252, 288, 140, 114, 7, ++ 3, 175, 120, 493, 63, 421, 63, 121, 126, 123, ++ 128, 9, 57, 118, 190, 120, 63, 160, 193, 126, ++ 163, 128, 46, 57, 55, 4, 5, 6, 7, 166, ++ 446, 55, 176, 12, 13, 14, 46, 63, 46, 57, ++ 265, 157, 158, 46, 62, 55, 56, 55, 56, 28, ++ 6, 7, 55, 56, 55, 198, 12, 13, 14, 57, ++ 46, 317, 9, 190, 206, 59, 208, 218, 186, 55, ++ 56, 59, 178, 364, 178, 3, 4, 256, 257, 58, ++ 185, 186, 57, 364, 137, 138, 139, 203, 141, 142, ++ 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, ++ 153, 154, 394, 328, 378, 363, 34, 250, 399, 30, ++ 62, 336, 3, 34, 339, 252, 336, 8, 46, 339, ++ 316, 377, 413, 57, 380, 321, 9, 55, 62, 256, ++ 257, 271, 413, 57, 57, 55, 56, 57, 62, 257, ++ 246, 58, 246, 30, 271, 62, 58, 438, 3, 202, ++ 62, 442, 7, 444, 4, 5, 6, 7, 58, 59, ++ 3, 4, 12, 13, 14, 55, 3, 32, 459, 62, ++ 7, 44, 45, 46, 47, 48, 467, 58, 28, 1, ++ 471, 3, 46, 47, 48, 476, 8, 9, 58, 11, ++ 317, 46, 63, 1, 57, 3, 4, 5, 6, 7, ++ 55, 56, 344, 46, 12, 13, 14, 29, 58, 46, ++ 353, 57, 55, 57, 357, 64, 507, 39, 55, 325, ++ 28, 325, 44, 45, 46, 27, 3, 4, 50, 51, ++ 7, 3, 4, 55, 287, 58, 379, 59, 60, 61, ++ 58, 63, 358, 55, 56, 57, 299, 32, 301, 57, ++ 377, 55, 56, 380, 397, 55, 56, 400, 401, 55, ++ 1, 59, 3, 4, 59, 6, 7, 8, 9, 46, ++ 11, 12, 13, 14, 55, 56, 57, 59, 55, 56, ++ 1, 57, 335, 4, 57, 6, 7, 28, 29, 342, ++ 433, 12, 13, 14, 55, 56, 59, 441, 39, 55, ++ 56, 58, 59, 44, 45, 46, 34, 28, 57, 50, ++ 51, 62, 63, 57, 55, 57, 369, 64, 64, 60, ++ 61, 57, 63, 4, 5, 6, 7, 470, 62, 10, ++ 55, 12, 13, 14, 477, 32, 59, 58, 59, 392, ++ 64, 57, 62, 57, 3, 488, 64, 28, 3, 34, ++ 493, 4, 5, 6, 7, 34, 55, 501, 34, 12, ++ 13, 14, 5, 6, 7, 509, 55, 55, 421, 12, ++ 13, 14, 58, 7, 58, 28, 34, 16, 1, 62, ++ 3, 4, 5, 6, 7, 8, 9, 58, 11, 12, ++ 13, 14, 15, 446, 17, 18, 19, 20, 21, 22, ++ 23, 24, 25, 26, 27, 28, 29, 55, 55, 4, ++ 34, 6, 7, 58, 58, 55, 39, 12, 13, 14, ++ 57, 44, 45, 46, 59, 57, 59, 50, 51, 17, ++ 58, 57, 55, 28, 64, 58, 59, 60, 61, 1, ++ 63, 3, 4, 5, 6, 7, 8, 9, 57, 11, ++ 12, 13, 14, 15, 57, 17, 18, 19, 20, 21, ++ 22, 23, 24, 25, 26, 27, 28, 29, 40, 41, ++ 42, 43, 44, 45, 46, 47, 48, 39, 55, 9, ++ 58, 55, 44, 45, 46, 58, 62, 57, 50, 51, ++ 58, 58, 57, 55, 57, 0, 58, 58, 60, 61, ++ 1, 63, 3, 4, 58, 0, 3, 8, 9, 159, ++ 11, 297, 48, 53, 15, 169, 17, 18, 19, 20, ++ 21, 22, 23, 24, 25, 26, 27, 429, 29, 41, ++ 42, 43, 44, 45, 46, 47, 48, 269, 39, 369, ++ 205, 377, 208, 44, 45, 46, 203, 344, 114, 50, ++ 51, 53, 363, 489, 55, 249, 491, 58, 59, 60, ++ 61, 1, 63, 3, 4, 325, 246, 427, 8, 9, ++ -1, 11, -1, -1, -1, 15, -1, 17, 18, 19, ++ 20, 21, 22, 23, 24, 25, 26, 27, -1, 29, ++ 1, -1, -1, 4, 5, 6, 7, -1, -1, 39, ++ -1, 12, 13, 14, 44, 45, 46, -1, -1, -1, ++ 50, 51, -1, -1, -1, 55, -1, 28, 58, 59, ++ 60, 61, 1, 63, -1, 4, 5, 6, 7, -1, ++ -1, -1, -1, 12, 13, 14, 39, 40, 41, 42, ++ 43, 44, 45, 46, 47, 48, 57, -1, 27, 28, ++ -1, 30, -1, 32, -1, -1, -1, -1, -1, 1, ++ -1, -1, 4, 5, 6, 7, -1, -1, -1, -1, ++ 12, 13, 14, -1, -1, -1, 55, 56, -1, 58, ++ -1, -1, -1, 62, 63, 27, 28, 1, 30, 3, ++ 32, -1, -1, -1, 8, 9, -1, 11, -1, 3, ++ 4, 5, 6, 7, -1, -1, -1, -1, 12, 13, ++ 14, -1, -1, 55, 56, 29, 58, -1, -1, -1, ++ 62, 63, -1, -1, 28, 39, -1, -1, -1, -1, ++ 44, 45, 46, -1, -1, -1, 50, 51, -1, -1, ++ -1, 55, 46, -1, -1, 59, 60, 61, 1, 63, ++ 3, 55, 56, -1, -1, 8, 9, -1, 11, 37, ++ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, ++ 48, 1, -1, 3, -1, -1, 29, -1, 8, 9, ++ -1, 11, -1, -1, 50, 51, 39, 53, 54, 55, ++ 56, 44, 45, 46, -1, -1, -1, 50, 51, 29, ++ -1, -1, 55, -1, -1, -1, 59, 60, 61, 39, ++ 63, -1, -1, -1, 44, 45, 46, -1, -1, -1, ++ 50, 51, -1, 1, -1, 55, 4, 5, 6, 7, ++ 60, 61, -1, 63, 12, 13, 14, -1, -1, -1, ++ 3, -1, -1, -1, -1, 8, 9, -1, 11, 27, ++ 28, -1, 30, -1, 32, 42, 43, 44, 45, 46, ++ 47, 48, -1, 3, -1, -1, 29, -1, 8, 9, ++ -1, 11, -1, -1, -1, -1, 39, -1, -1, -1, ++ 58, 44, 45, 46, 62, 63, -1, 50, 51, 29, ++ -1, -1, 55, -1, -1, -1, -1, 60, 61, 39, ++ -1, 64, -1, -1, 44, 45, 46, -1, 3, -1, ++ 50, 51, -1, 8, 9, 55, 11, -1, -1, -1, ++ 60, 61, -1, -1, 64, -1, -1, -1, -1, -1, ++ -1, 3, -1, -1, 29, -1, 8, 9, -1, 11, ++ -1, -1, -1, -1, 39, -1, -1, -1, -1, 44, ++ 45, 46, -1, -1, -1, 50, 51, 29, -1, -1, ++ 55, -1, -1, -1, -1, 60, 61, 39, -1, 64, ++ -1, -1, 44, 45, 46, -1, 3, -1, 50, 51, ++ -1, 8, 9, 55, 11, -1, -1, -1, 60, 61, ++ -1, -1, 64, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 29, -1, -1, -1, -1, -1, -1, -1, ++ -1, -1, 39, -1, -1, -1, -1, 44, 45, 46, ++ -1, -1, -1, 50, 51, -1, -1, -1, 55, -1, ++ -1, -1, -1, 60, 61, -1, -1, 64, 3, 4, ++ 5, 6, 7, 8, 9, -1, 11, 12, 13, 14, ++ 15, -1, 17, 18, 19, 20, 21, 22, 23, 24, ++ 25, 26, 27, 28, 29, -1, -1, -1, -1, -1, ++ -1, -1, -1, -1, 39, -1, -1, -1, -1, 44, ++ 45, 46, -1, -1, -1, 50, 51, -1, -1, -1, ++ 55, -1, -1, 58, -1, 60, 61, -1, 63, 3, ++ 4, -1, -1, -1, 8, 9, -1, 11, -1, -1, ++ -1, 15, -1, 17, 18, 19, 20, 21, 22, 23, ++ 24, 25, 26, 27, 3, 29, -1, -1, -1, 8, ++ 9, -1, 11, -1, -1, 39, -1, -1, -1, -1, ++ 44, 45, 46, -1, -1, -1, 50, 51, -1, -1, ++ 29, 55, -1, -1, 58, -1, 60, 61, -1, 63, ++ 39, -1, -1, -1, -1, 44, 45, 46, -1, -1, ++ -1, 50, 51, -1, -1, -1, 55, -1, -1, -1, ++ -1, 60, 61, -1, 63, 3, 4, -1, 6, 7, ++ 8, 9, -1, 11, 12, 13, 14, -1, 3, -1, ++ -1, -1, -1, 8, 9, -1, 11, -1, -1, -1, ++ 28, 29, -1, -1, -1, -1, -1, -1, -1, -1, ++ -1, 39, -1, -1, 29, -1, 44, 45, 46, -1, ++ -1, -1, 50, 51, 39, -1, -1, 55, -1, 44, ++ 45, 46, 60, 61, -1, 50, 51, -1, -1, -1, ++ 55, -1, 3, 58, -1, 60, 61, 8, 9, -1, ++ 11, -1, -1, -1, -1, 3, -1, -1, -1, -1, ++ 8, 9, -1, 11, -1, -1, -1, -1, 29, -1, ++ -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, ++ -1, 29, -1, 44, 45, 46, -1, -1, -1, 50, ++ 51, 39, -1, -1, 55, -1, 44, 45, 46, 60, ++ 61, -1, 50, 51, -1, -1, -1, 55, -1, 3, ++ -1, -1, 60, 61, 8, 9, -1, 11, -1, -1, ++ 1, -1, 3, 4, 5, 6, 7, -1, -1, -1, ++ -1, 12, 13, 14, 4, 29, 6, 7, -1, -1, ++ -1, -1, 12, 13, 14, 39, 27, 28, -1, -1, ++ 44, 45, 46, -1, -1, -1, 50, 51, 28, -1, ++ -1, 55, -1, -1, -1, 46, 60, 61, -1, -1, ++ -1, -1, -1, -1, 55, -1, 46, 58, -1, -1, ++ -1, -1, -1, -1, -1, 55, 56, 30, 31, 32, ++ 33, -1, 35, 36, 37, 38, 39, 40, 41, 42, ++ 43, 44, 45, 46, 47, 48, 31, 32, 33, -1, ++ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48, 33, -1, 35, 36, 37, 38, ++ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, ++ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, ++ 46, 47, 48, 38, 39, 40, 41, 42, 43, 44, ++ 45, 46, 47, 48 ++}; ++/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ ++#line 3 "/usr/lib/bison/bison.simple" ++ ++/* Skeleton output parser for bison, ++ Copyright 1984, 1989, 1990, 2000, 2001 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. */ ++ ++/* As a special exception, when this file is copied by Bison into a ++ Bison output file, you may use that output file without restriction. ++ This special exception was added by the Free Software Foundation ++ in version 1.24 of Bison. */ ++ ++/* This is the parser code that is written into each bison parser when ++ the %semantic_parser declaration is not specified in the grammar. ++ It was written by Richard Stallman by simplifying the hairy parser ++ used when %semantic_parser is specified. */ ++ ++#ifndef YYSTACK_USE_ALLOCA ++# ifdef alloca ++# define YYSTACK_USE_ALLOCA 1 ++# else /* alloca not defined */ ++# ifdef __GNUC__ ++# define YYSTACK_USE_ALLOCA 1 ++# define alloca __builtin_alloca ++# else /* not GNU C. */ ++# if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) ++# define YYSTACK_USE_ALLOCA 1 ++# include ++# else /* not sparc */ ++ /* We think this test detects Watcom and Microsoft C. */ ++ /* This used to test MSDOS, but that is a bad idea since that ++ symbol is in the user namespace. */ ++# if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) ++# if 0 ++ /* No need for malloc.h, which pollutes the namespace; instead, ++ just don't use alloca. */ ++# include ++# endif ++# else /* not MSDOS, or __TURBOC__ */ ++# if defined(_AIX) ++ /* I don't know what this was needed for, but it pollutes the ++ namespace. So I turned it off. rms, 2 May 1997. */ ++ /* #include */ ++ #pragma alloca ++# define YYSTACK_USE_ALLOCA 1 ++# else /* not MSDOS, or __TURBOC__, or _AIX */ ++# if 0 ++ /* haible@ilog.fr says this works for HPUX 9.05 and up, and on ++ HPUX 10. Eventually we can turn this on. */ ++# ifdef __hpux ++# define YYSTACK_USE_ALLOCA 1 ++# define alloca __builtin_alloca ++# endif /* __hpux */ ++# endif ++# endif /* not _AIX */ ++# endif /* not MSDOS, or __TURBOC__ */ ++# endif /* not sparc */ ++# endif /* not GNU C */ ++# endif /* alloca not defined */ ++#endif /* YYSTACK_USE_ALLOCA not defined */ ++ ++#ifndef YYSTACK_USE_ALLOCA ++# define YYSTACK_USE_ALLOCA 0 ++#endif ++ ++#if YYSTACK_USE_ALLOCA ++# define YYSTACK_ALLOC alloca ++#else ++# define YYSTACK_ALLOC malloc ++#endif ++ ++#define yyerrok (yyerrstatus = 0) ++#define yyclearin (yychar = YYEMPTY) ++#define YYEMPTY -2 ++#define YYEOF 0 ++#define YYACCEPT goto yyacceptlab ++#define YYABORT goto yyabortlab ++#define YYERROR goto yyerrlab1 ++/* Like YYERROR except do call yyerror. This remains here temporarily ++ to ease the transition to the new meaning of YYERROR, for GCC. ++ Once GCC version 2 has supplanted version 1, this can go. */ ++#define YYFAIL goto yyerrlab ++#define YYRECOVERING() (!!yyerrstatus) ++#define YYBACKUP(Token, Value) \ ++do \ ++ if (yychar == YYEMPTY && yylen == 1) \ ++ { \ ++ yychar = (Token); \ ++ yylval = (Value); \ ++ yychar1 = YYTRANSLATE (yychar); \ ++ YYPOPSTACK; \ ++ goto yybackup; \ ++ } \ ++ else \ ++ { \ ++ yyerror ("syntax error: cannot back up"); \ ++ YYERROR; \ ++ } \ ++while (0) ++ ++#define YYTERROR 1 ++#define YYERRCODE 256 ++ ++ ++/* YYLLOC_DEFAULT -- Compute the default location (before the actions ++ are run). ++ ++ When YYLLOC_DEFAULT is run, CURRENT is set the location of the ++ first token. By default, to implement support for ranges, extend ++ its range to the last symbol. */ ++ ++#ifndef YYLLOC_DEFAULT ++# define YYLLOC_DEFAULT(Current, Rhs, N) \ ++ Current.last_line = Rhs[N].last_line; \ ++ Current.last_column = Rhs[N].last_column; ++#endif ++ ++ ++/* YYLEX -- calling `yylex' with the right arguments. */ ++ ++#if YYPURE ++# if YYLSP_NEEDED ++# ifdef YYLEX_PARAM ++# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) ++# else ++# define YYLEX yylex (&yylval, &yylloc) ++# endif ++# else /* !YYLSP_NEEDED */ ++# ifdef YYLEX_PARAM ++# define YYLEX yylex (&yylval, YYLEX_PARAM) ++# else ++# define YYLEX yylex (&yylval) ++# endif ++# endif /* !YYLSP_NEEDED */ ++#else /* !YYPURE */ ++# define YYLEX yylex () ++#endif /* !YYPURE */ ++ ++ ++/* Enable debugging if requested. */ ++#if YYDEBUG ++# define YYDPRINTF(Args) \ ++do { \ ++ if (yydebug) \ ++ fprintf Args; \ ++} while (0) ++/* Nonzero means print parse trace. [The following comment makes no ++ sense to me. Could someone clarify it? --akim] Since this is ++ uninitialized, it does not stop multiple parsers from coexisting. ++ */ ++int yydebug; ++#else /* !YYDEBUG */ ++# define YYDPRINTF(Args) ++#endif /* !YYDEBUG */ ++ ++/* YYINITDEPTH -- initial size of the parser's stacks. */ ++#ifndef YYINITDEPTH ++# define YYINITDEPTH 200 ++#endif ++ ++/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only ++ if the built-in stack extension method is used). */ ++#if YYMAXDEPTH == 0 ++# undef YYMAXDEPTH ++#endif ++ ++#ifndef YYMAXDEPTH ++# define YYMAXDEPTH 10000 ++#endif ++ ++/* Define __yy_memcpy. Note that the size argument ++ should be passed with type unsigned int, because that is what the non-GCC ++ definitions require. With GCC, __builtin_memcpy takes an arg ++ of type size_t, but it can handle unsigned int. */ ++ ++#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ ++# define __yy_memcpy(To, From, Count) __builtin_memcpy (To, From, Count) ++#else /* not GNU C or C++ */ ++ ++/* This is the most reliable way to avoid incompatibilities ++ in available built-in functions on various systems. */ ++static void ++# ifndef __cplusplus ++__yy_memcpy (to, from, count) ++ char *to; ++ const char *from; ++ unsigned int count; ++# else /* __cplusplus */ ++__yy_memcpy (char *to, const char *from, unsigned int count) ++# endif ++{ ++ register const char *f = from; ++ register char *t = to; ++ register int i = count; ++ ++ while (i-- > 0) ++ *t++ = *f++; ++} ++ ++#endif ++ ++#line 216 "/usr/lib/bison/bison.simple" ++ ++ ++/* The user can define YYPARSE_PARAM as the name of an argument to be passed ++ into yyparse. The argument should have type void *. ++ It should actually point to an object. ++ Grammar actions can access the variable by casting it ++ to the proper pointer type. */ ++ ++#ifdef YYPARSE_PARAM ++# ifdef __cplusplus ++# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM ++# define YYPARSE_PARAM_DECL ++# else /* !__cplusplus */ ++# define YYPARSE_PARAM_ARG YYPARSE_PARAM ++# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; ++# endif /* !__cplusplus */ ++#else /* !YYPARSE_PARAM */ ++# define YYPARSE_PARAM_ARG ++# define YYPARSE_PARAM_DECL ++#endif /* !YYPARSE_PARAM */ ++ ++/* Prevent warning if -Wstrict-prototypes. */ ++#ifdef __GNUC__ ++# ifdef YYPARSE_PARAM ++int yyparse (void *); ++# else ++int yyparse (void); ++# endif ++#endif ++ ++/* YY_DECL_VARIABLES -- depending whether we use a pure parser, ++ variables are global, or local to YYPARSE. */ ++ ++#define _YY_DECL_VARIABLES \ ++/* The lookahead symbol. */ \ ++int yychar; \ ++ \ ++/* The semantic value of the lookahead symbol. */ \ ++YYSTYPE yylval; \ ++ \ ++/* Number of parse errors so far. */ \ ++int yynerrs; ++ ++#if YYLSP_NEEDED ++# define YY_DECL_VARIABLES \ ++_YY_DECL_VARIABLES \ ++ \ ++/* Location data for the lookahead symbol. */ \ ++YYLTYPE yylloc; ++#else ++# define YY_DECL_VARIABLES \ ++_YY_DECL_VARIABLES ++#endif ++ ++ ++/* If nonreentrant, generate the variables here. */ ++ ++#if !YYPURE ++YY_DECL_VARIABLES ++#endif /* !YYPURE */ ++ ++int ++yyparse (YYPARSE_PARAM_ARG) ++ YYPARSE_PARAM_DECL ++{ ++ /* If reentrant, generate the variables here. */ ++#if YYPURE ++ YY_DECL_VARIABLES ++#endif /* !YYPURE */ ++ ++ register int yystate; ++ register int yyn; ++ /* Number of tokens to shift before error messages enabled. */ ++ int yyerrstatus; ++ /* Lookahead token as an internal (translated) token number. */ ++ int yychar1 = 0; ++ ++ /* Three stacks and their tools: ++ `yyss': related to states, ++ `yysv': related to semantic values, ++ `yyls': related to locations. ++ ++ Refer to the stacks thru separate pointers, to allow yyoverflow ++ to reallocate them elsewhere. */ ++ ++ /* The state stack. */ ++ short yyssa[YYINITDEPTH]; ++ short *yyss = yyssa; ++ register short *yyssp; ++ ++ /* The semantic value stack. */ ++ YYSTYPE yyvsa[YYINITDEPTH]; ++ YYSTYPE *yyvs = yyvsa; ++ register YYSTYPE *yyvsp; ++ ++#if YYLSP_NEEDED ++ /* The location stack. */ ++ YYLTYPE yylsa[YYINITDEPTH]; ++ YYLTYPE *yyls = yylsa; ++ YYLTYPE *yylsp; ++#endif ++ ++#if YYLSP_NEEDED ++# define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) ++#else ++# define YYPOPSTACK (yyvsp--, yyssp--) ++#endif ++ ++ int yystacksize = YYINITDEPTH; ++ int yyfree_stacks = 0; ++ ++ ++ /* The variables used to return semantic value and location from the ++ action routines. */ ++ YYSTYPE yyval; ++# if YYLSP_NEEDED ++ YYLTYPE yyloc; ++# endif ++ ++ /* When reducing, the number of symbols on the RHS of the reduced ++ rule. */ ++ int yylen; ++ ++ YYDPRINTF ((stderr, "Starting parse\n")); ++ ++ yystate = 0; ++ yyerrstatus = 0; ++ yynerrs = 0; ++ yychar = YYEMPTY; /* Cause a token to be read. */ ++ ++ /* Initialize stack pointers. ++ Waste one element of value and location stack ++ so that they stay on the same level as the state stack. ++ The wasted elements are never initialized. */ ++ ++ yyssp = yyss; ++ yyvsp = yyvs; ++#if YYLSP_NEEDED ++ yylsp = yyls; ++#endif ++ goto yysetstate; ++ ++/*------------------------------------------------------------. ++| yynewstate -- Push a new state, which is found in yystate. | ++`------------------------------------------------------------*/ ++ yynewstate: ++ /* In all cases, when you get here, the value and location stacks ++ have just been pushed. so pushing a state here evens the stacks. ++ */ ++ yyssp++; ++ ++ yysetstate: ++ *yyssp = yystate; ++ ++ if (yyssp >= yyss + yystacksize - 1) ++ { ++ /* Give user a chance to reallocate the stack. Use copies of ++ these so that the &'s don't force the real ones into memory. ++ */ ++ YYSTYPE *yyvs1 = yyvs; ++ short *yyss1 = yyss; ++#if YYLSP_NEEDED ++ YYLTYPE *yyls1 = yyls; ++#endif ++ ++ /* Get the current used size of the three stacks, in elements. */ ++ int size = yyssp - yyss + 1; ++ ++#ifdef yyoverflow ++ /* Each stack pointer address is followed by the size of the ++ data in use in that stack, in bytes. */ ++# if YYLSP_NEEDED ++ /* This used to be a conditional around just the two extra args, ++ but that might be undefined if yyoverflow is a macro. */ ++ yyoverflow ("parser stack overflow", ++ &yyss1, size * sizeof (*yyssp), ++ &yyvs1, size * sizeof (*yyvsp), ++ &yyls1, size * sizeof (*yylsp), ++ &yystacksize); ++# else ++ yyoverflow ("parser stack overflow", ++ &yyss1, size * sizeof (*yyssp), ++ &yyvs1, size * sizeof (*yyvsp), ++ &yystacksize); ++# endif ++ ++ yyss = yyss1; yyvs = yyvs1; ++# if YYLSP_NEEDED ++ yyls = yyls1; ++# endif ++#else /* no yyoverflow */ ++ /* Extend the stack our own way. */ ++ if (yystacksize >= YYMAXDEPTH) ++ { ++ yyerror ("parser stack overflow"); ++ if (yyfree_stacks) ++ { ++ free (yyss); ++ free (yyvs); ++# if YYLSP_NEEDED ++ free (yyls); ++# endif ++ } ++ return 2; ++ } ++ yystacksize *= 2; ++ if (yystacksize > YYMAXDEPTH) ++ yystacksize = YYMAXDEPTH; ++# if !YYSTACK_USE_ALLOCA ++ yyfree_stacks = 1; ++# endif ++ yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); ++ __yy_memcpy ((char *)yyss, (char *)yyss1, ++ size * (unsigned int) sizeof (*yyssp)); ++ yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); ++ __yy_memcpy ((char *)yyvs, (char *)yyvs1, ++ size * (unsigned int) sizeof (*yyvsp)); ++# if YYLSP_NEEDED ++ yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); ++ __yy_memcpy ((char *)yyls, (char *)yyls1, ++ size * (unsigned int) sizeof (*yylsp)); ++# endif ++#endif /* no yyoverflow */ ++ ++ yyssp = yyss + size - 1; ++ yyvsp = yyvs + size - 1; ++#if YYLSP_NEEDED ++ yylsp = yyls + size - 1; ++#endif ++ ++ YYDPRINTF ((stderr, "Stack size increased to %d\n", yystacksize)); ++ ++ if (yyssp >= yyss + yystacksize - 1) ++ YYABORT; ++ } ++ ++ YYDPRINTF ((stderr, "Entering state %d\n", yystate)); ++ ++ goto yybackup; ++ ++ ++/*-----------. ++| yybackup. | ++`-----------*/ ++yybackup: ++ ++/* Do appropriate processing given the current state. */ ++/* Read a lookahead token if we need one and don't already have one. */ ++/* yyresume: */ ++ ++ /* First try to decide what to do without reference to lookahead token. */ ++ ++ yyn = yypact[yystate]; ++ if (yyn == YYFLAG) ++ goto yydefault; ++ ++ /* Not known => get a lookahead token if don't already have one. */ ++ ++ /* yychar is either YYEMPTY or YYEOF ++ or a valid token in external form. */ ++ ++ if (yychar == YYEMPTY) ++ { ++ YYDPRINTF ((stderr, "Reading a token: ")); ++ yychar = YYLEX; ++ } ++ ++ /* Convert token to internal form (in yychar1) for indexing tables with */ ++ ++ if (yychar <= 0) /* This means end of input. */ ++ { ++ yychar1 = 0; ++ yychar = YYEOF; /* Don't call YYLEX any more */ ++ ++ YYDPRINTF ((stderr, "Now at end of input.\n")); ++ } ++ else ++ { ++ yychar1 = YYTRANSLATE (yychar); ++ ++#if YYDEBUG ++ /* We have to keep this `#if YYDEBUG', since we use variables ++ which are defined only if `YYDEBUG' is set. */ ++ if (yydebug) ++ { ++ fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); ++ /* Give the individual parser a way to print the precise ++ meaning of a token, for further debugging info. */ ++# ifdef YYPRINT ++ YYPRINT (stderr, yychar, yylval); ++# endif ++ fprintf (stderr, ")\n"); ++ } ++#endif ++ } ++ ++ yyn += yychar1; ++ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) ++ goto yydefault; ++ ++ yyn = yytable[yyn]; ++ ++ /* yyn is what to do for this token type in this state. ++ Negative => reduce, -yyn is rule number. ++ Positive => shift, yyn is new state. ++ New state is final state => don't bother to shift, ++ just return success. ++ 0, or most negative number => error. */ ++ ++ if (yyn < 0) ++ { ++ if (yyn == YYFLAG) ++ goto yyerrlab; ++ yyn = -yyn; ++ goto yyreduce; ++ } ++ else if (yyn == 0) ++ goto yyerrlab; ++ ++ if (yyn == YYFINAL) ++ YYACCEPT; ++ ++ /* Shift the lookahead token. */ ++ YYDPRINTF ((stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1])); ++ ++ /* Discard the token being shifted unless it is eof. */ ++ if (yychar != YYEOF) ++ yychar = YYEMPTY; ++ ++ *++yyvsp = yylval; ++#if YYLSP_NEEDED ++ *++yylsp = yylloc; ++#endif ++ ++ /* Count tokens shifted since error; after three, turn off error ++ status. */ ++ if (yyerrstatus) ++ yyerrstatus--; ++ ++ yystate = yyn; ++ goto yynewstate; ++ ++ ++/*-----------------------------------------------------------. ++| yydefault -- do the default action for the current state. | ++`-----------------------------------------------------------*/ ++yydefault: ++ yyn = yydefact[yystate]; ++ if (yyn == 0) ++ goto yyerrlab; ++ goto yyreduce; ++ ++ ++/*-----------------------------. ++| yyreduce -- Do a reduction. | ++`-----------------------------*/ ++yyreduce: ++ /* yyn is the number of a rule to reduce with. */ ++ yylen = yyr2[yyn]; ++ ++ /* If YYLEN is nonzero, implement the default value of the action: ++ `$$ = $1'. ++ ++ Otherwise, the following line sets YYVAL to the semantic value of ++ the lookahead token. This behavior is undocumented and Bison ++ users should not rely upon it. Assigning to YYVAL ++ unconditionally makes the parser a bit smaller, and it avoids a ++ GCC warning that YYVAL may be used uninitialized. */ ++ yyval = yyvsp[1-yylen]; ++ ++#if YYLSP_NEEDED ++ /* Similarly for the default location. Let the user run additional ++ commands if for instance locations are ranges. */ ++ yyloc = yylsp[1-yylen]; ++ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); ++#endif ++ ++#if YYDEBUG ++ /* We have to keep this `#if YYDEBUG', since we use variables which ++ are defined only if `YYDEBUG' is set. */ ++ if (yydebug) ++ { ++ int i; ++ ++ fprintf (stderr, "Reducing via rule %d (line %d), ", ++ yyn, yyrline[yyn]); ++ ++ /* Print the symbols being reduced, and their result. */ ++ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) ++ fprintf (stderr, "%s ", yytname[yyrhs[i]]); ++ fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); ++ } ++#endif ++ ++ switch (yyn) { ++ ++case 3: ++#line 186 "c-parse.y" ++{yyval.ttype = NULL_TREE; ; ++ break;} ++case 5: ++#line 187 "c-parse.y" ++{yyval.ttype = NULL_TREE; ; ++ break;} ++case 9: ++#line 194 "c-parse.y" ++{ if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype); ++ assemble_asm (yyvsp[-2].ttype); ; ++ break;} ++case 10: ++#line 200 "c-parse.y" ++{ if (pedantic) ++ error ("ANSI C forbids data definition lacking type or storage class"); ++ else if (!flag_traditional) ++ warning ("data definition lacks type or storage class"); ; ++ break;} ++case 11: ++#line 205 "c-parse.y" ++{; ++ break;} ++case 12: ++#line 207 "c-parse.y" ++{; ++ break;} ++case 13: ++#line 209 "c-parse.y" ++{ error ("empty declaration"); ; ++ break;} ++case 14: ++#line 211 "c-parse.y" ++{ shadow_tag (yyvsp[-1].ttype); ; ++ break;} ++case 17: ++#line 215 "c-parse.y" ++{ if (pedantic) ++ warning ("ANSI C does not allow extra `;' outside of a function"); ; ++ break;} ++case 18: ++#line 221 "c-parse.y" ++{ if (! start_function (yyvsp[-2].ttype, yyvsp[0].ttype)) ++ YYFAIL; ++ reinit_parse_for_function (); ; ++ break;} ++case 19: ++#line 225 "c-parse.y" ++{ store_parm_decls (); ; ++ break;} ++case 20: ++#line 227 "c-parse.y" ++{ finish_function (lineno); ; ++ break;} ++case 21: ++#line 229 "c-parse.y" ++{ ; ++ break;} ++case 22: ++#line 231 "c-parse.y" ++{ if (! start_function (yyvsp[-2].ttype, yyvsp[0].ttype)) ++ YYFAIL; ++ reinit_parse_for_function (); ; ++ break;} ++case 23: ++#line 235 "c-parse.y" ++{ store_parm_decls (); ; ++ break;} ++case 24: ++#line 237 "c-parse.y" ++{ finish_function (lineno); ; ++ break;} ++case 25: ++#line 239 "c-parse.y" ++{ ; ++ break;} ++case 26: ++#line 241 "c-parse.y" ++{ if (! start_function (0, yyvsp[0].ttype)) ++ YYFAIL; ++ reinit_parse_for_function (); ; ++ break;} ++case 27: ++#line 245 "c-parse.y" ++{ store_parm_decls (); ; ++ break;} ++case 28: ++#line 247 "c-parse.y" ++{ finish_function (lineno); ; ++ break;} ++case 29: ++#line 249 "c-parse.y" ++{ ; ++ break;} ++case 32: ++#line 258 "c-parse.y" ++{ yyval.code = ADDR_EXPR; ; ++ break;} ++case 33: ++#line 260 "c-parse.y" ++{ yyval.code = NEGATE_EXPR; ; ++ break;} ++case 34: ++#line 262 "c-parse.y" ++{ yyval.code = CONVERT_EXPR; ; ++ break;} ++case 35: ++#line 264 "c-parse.y" ++{ yyval.code = PREINCREMENT_EXPR; ; ++ break;} ++case 36: ++#line 266 "c-parse.y" ++{ yyval.code = PREDECREMENT_EXPR; ; ++ break;} ++case 37: ++#line 268 "c-parse.y" ++{ yyval.code = BIT_NOT_EXPR; ; ++ break;} ++case 38: ++#line 270 "c-parse.y" ++{ yyval.code = TRUTH_NOT_EXPR; ; ++ break;} ++case 39: ++#line 274 "c-parse.y" ++{ yyval.ttype = build_compound_expr (yyvsp[0].ttype); ; ++ break;} ++case 40: ++#line 279 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 42: ++#line 285 "c-parse.y" ++{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; ++ break;} ++case 43: ++#line 287 "c-parse.y" ++{ chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; ++ break;} ++case 45: ++#line 293 "c-parse.y" ++{ yyval.ttype = build_indirect_ref (yyvsp[0].ttype, "unary *"); ; ++ break;} ++case 46: ++#line 295 "c-parse.y" ++{ yyval.ttype = build_unary_op (yyvsp[-1].code, yyvsp[0].ttype, 0); ; ++ break;} ++case 47: ++#line 297 "c-parse.y" ++{ if (TREE_CODE (yyvsp[0].ttype) == COMPONENT_REF ++ && TREE_PACKED (TREE_OPERAND (yyvsp[0].ttype, 1))) ++ error ("`sizeof' applied to a bit-field"); ++ /* ANSI says arrays and functions are converted inside comma. ++ But we can't really convert them in build_compound_expr ++ because that would break commas in lvalues. ++ So do the conversion here if operand was a comma. */ ++ if (TREE_CODE (yyvsp[0].ttype) == COMPOUND_EXPR ++ && (TREE_CODE (TREE_TYPE (yyvsp[0].ttype)) == ARRAY_TYPE ++ || TREE_CODE (TREE_TYPE (yyvsp[0].ttype)) == FUNCTION_TYPE)) ++ yyvsp[0].ttype = default_conversion (yyvsp[0].ttype); ++ yyval.ttype = c_sizeof (TREE_TYPE (yyvsp[0].ttype)); ; ++ break;} ++case 48: ++#line 310 "c-parse.y" ++{ yyval.ttype = c_sizeof (groktypename (yyvsp[-1].ttype)); ; ++ break;} ++case 49: ++#line 312 "c-parse.y" ++{ if (TREE_CODE (yyvsp[0].ttype) == COMPONENT_REF ++ && TREE_PACKED (TREE_OPERAND (yyvsp[0].ttype, 1))) ++ error ("`__alignof' applied to a bit-field"); ++ if (TREE_CODE (yyvsp[0].ttype) == INDIRECT_REF) ++ { ++ tree t = TREE_OPERAND (yyvsp[0].ttype, 0); ++ tree best = t; ++ int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); ++ while (TREE_CODE (t) == NOP_EXPR ++ && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE) ++ { ++ int thisalign; ++ t = TREE_OPERAND (t, 0); ++ thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); ++ if (thisalign > bestalign) ++ best = t, bestalign = thisalign; ++ } ++ yyval.ttype = c_alignof (TREE_TYPE (TREE_TYPE (best))); ++ } ++ else ++ { ++ /* ANSI says arrays and fns are converted inside comma. ++ But we can't convert them in build_compound_expr ++ because that would break commas in lvalues. ++ So do the conversion here if operand was a comma. */ ++ if (TREE_CODE (yyvsp[0].ttype) == COMPOUND_EXPR ++ && (TREE_CODE (TREE_TYPE (yyvsp[0].ttype)) == ARRAY_TYPE ++ || TREE_CODE (TREE_TYPE (yyvsp[0].ttype)) == FUNCTION_TYPE)) ++ yyvsp[0].ttype = default_conversion (yyvsp[0].ttype); ++ yyval.ttype = c_alignof (TREE_TYPE (yyvsp[0].ttype)); ++ } ++ ; ++ break;} ++case 50: ++#line 345 "c-parse.y" ++{ yyval.ttype = c_alignof (groktypename (yyvsp[-1].ttype)); ; ++ break;} ++case 52: ++#line 351 "c-parse.y" ++{ tree type = groktypename (yyvsp[-2].ttype); ++ yyval.ttype = build_c_cast (type, yyvsp[0].ttype); ; ++ break;} ++case 53: ++#line 354 "c-parse.y" ++{ tree type = groktypename (yyvsp[-5].ttype); ++ if (pedantic) ++ warning ("ANSI C forbids constructor expressions"); ++ yyval.ttype = digest_init (type, build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)), 0); ++ if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0) ++ { ++ int failure = complete_array_type (type, yyval.ttype, 1); ++ if (failure) ++ abort (); ++ } ++ ; ++ break;} ++case 55: ++#line 370 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 56: ++#line 372 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 57: ++#line 374 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 58: ++#line 376 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 59: ++#line 378 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 60: ++#line 380 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 61: ++#line 382 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 62: ++#line 384 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 63: ++#line 386 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 64: ++#line 388 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 65: ++#line 390 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 66: ++#line 392 "c-parse.y" ++{ yyval.ttype = build_binary_op (yyvsp[-1].code, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 67: ++#line 394 "c-parse.y" ++{ yyval.ttype = build_binary_op (TRUTH_ANDIF_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 68: ++#line 396 "c-parse.y" ++{ yyval.ttype = build_binary_op (TRUTH_ORIF_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 69: ++#line 398 "c-parse.y" ++{ yyval.ttype = build_conditional_expr (yyvsp[-4].ttype, yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 70: ++#line 400 "c-parse.y" ++{ yyval.ttype = build_modify_expr (yyvsp[-2].ttype, NOP_EXPR, yyvsp[0].ttype); ; ++ break;} ++case 71: ++#line 402 "c-parse.y" ++{ yyval.ttype = build_modify_expr (yyvsp[-2].ttype, yyvsp[-1].code, yyvsp[0].ttype); ; ++ break;} ++case 72: ++#line 407 "c-parse.y" ++{ yyval.ttype = lastiddecl; ++ if (!yyval.ttype || yyval.ttype == error_mark_node) ++ { ++ if (yychar == YYEMPTY) ++ yychar = YYLEX; ++ if (yychar == '(') ++ { ++ yyval.ttype = implicitly_declare (yyvsp[0].ttype); ++ assemble_external (yyval.ttype); ++ TREE_USED (yyval.ttype) = 1; ++ } ++ else if (current_function_decl == 0) ++ { ++ error ("`%s' undeclared, outside of functions", ++ IDENTIFIER_POINTER (yyvsp[0].ttype)); ++ yyval.ttype = error_mark_node; ++ } ++ else ++ { ++ if (IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype) != error_mark_node ++ || IDENTIFIER_ERROR_LOCUS (yyvsp[0].ttype) != current_function_decl) ++ { ++ error ("`%s' undeclared (first use this function)", ++ IDENTIFIER_POINTER (yyvsp[0].ttype)); ++ ++ if (! undeclared_variable_notice) ++ { ++ error ("(Each undeclared identifier is reported only once"); ++ error ("for each function it appears in.)"); ++ undeclared_variable_notice = 1; ++ } ++ } ++ yyval.ttype = error_mark_node; ++ /* Prevent repeated error messages. */ ++ IDENTIFIER_GLOBAL_VALUE (yyvsp[0].ttype) = error_mark_node; ++ IDENTIFIER_ERROR_LOCUS (yyvsp[0].ttype) = current_function_decl; ++ } ++ } ++ else if (! TREE_USED (yyval.ttype)) ++ { ++ if (TREE_EXTERNAL (yyval.ttype)) ++ assemble_external (yyval.ttype); ++ TREE_USED (yyval.ttype) = 1; ++ } ++ if (TREE_CODE (yyval.ttype) == CONST_DECL) ++ yyval.ttype = DECL_INITIAL (yyval.ttype); ++ ; ++ break;} ++case 74: ++#line 456 "c-parse.y" ++{ yyval.ttype = combine_strings (yyvsp[0].ttype); ; ++ break;} ++case 75: ++#line 458 "c-parse.y" ++{ yyval.ttype = yyvsp[-1].ttype; ; ++ break;} ++case 76: ++#line 460 "c-parse.y" ++{ yyval.ttype = error_mark_node; ; ++ break;} ++case 77: ++#line 462 "c-parse.y" ++{ if (current_function_decl == 0) ++ { ++ error ("braced-group within expression allowed only inside a function"); ++ YYFAIL; ++ } ++ keep_next_level (); ++ yyval.ttype = expand_start_stmt_expr (); ; ++ break;} ++case 78: ++#line 470 "c-parse.y" ++{ tree rtl_exp; ++ if (pedantic) ++ warning ("ANSI C forbids braced-groups within expressions"); ++ rtl_exp = expand_end_stmt_expr (yyvsp[-2].ttype); ++ yyval.ttype = yyvsp[-1].ttype; ++ TREE_USED (yyval.ttype) = 0; ++ /* Since the statements have side effects, ++ consider this volatile. */ ++ TREE_VOLATILE (yyval.ttype) = 1; ++ TREE_TYPE (yyval.ttype) = TREE_TYPE (rtl_exp); ++ STMT_BODY (yyval.ttype) = rtl_exp; ; ++ break;} ++case 79: ++#line 482 "c-parse.y" ++{ yyval.ttype = build_function_call (yyvsp[-3].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 80: ++#line 484 "c-parse.y" ++{ yyval.ttype = build_array_ref (yyvsp[-3].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 81: ++#line 486 "c-parse.y" ++{ yyval.ttype = build_component_ref (yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 82: ++#line 488 "c-parse.y" ++{ yyval.ttype = build_component_ref (build_indirect_ref (yyvsp[-2].ttype, "->"), yyvsp[0].ttype); ; ++ break;} ++case 83: ++#line 490 "c-parse.y" ++{ yyval.ttype = build_unary_op (POSTINCREMENT_EXPR, yyvsp[-1].ttype, 0); ; ++ break;} ++case 84: ++#line 492 "c-parse.y" ++{ yyval.ttype = build_unary_op (POSTDECREMENT_EXPR, yyvsp[-1].ttype, 0); ; ++ break;} ++case 86: ++#line 499 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 93: ++#line 519 "c-parse.y" ++{ yyval.itype = suspend_momentary (); ++ declspec_stack = tree_cons (0, current_declspecs, ++ declspec_stack); ++ current_declspecs = yyvsp[0].ttype; ; ++ break;} ++case 94: ++#line 527 "c-parse.y" ++{ current_declspecs = TREE_VALUE (declspec_stack); ++ declspec_stack = TREE_CHAIN (declspec_stack); ++ resume_momentary (yyvsp[-2].itype); ; ++ break;} ++case 95: ++#line 531 "c-parse.y" ++{ current_declspecs = TREE_VALUE (declspec_stack); ++ declspec_stack = TREE_CHAIN (declspec_stack); ++ resume_momentary (yyvsp[-2].itype); ; ++ break;} ++case 96: ++#line 535 "c-parse.y" ++{ shadow_tag (yyvsp[-1].ttype); ; ++ break;} ++case 97: ++#line 537 "c-parse.y" ++{ warning ("empty declaration"); ; ++ break;} ++case 98: ++#line 546 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 99: ++#line 548 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ; ++ break;} ++case 100: ++#line 552 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 101: ++#line 554 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 102: ++#line 556 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 103: ++#line 565 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 104: ++#line 567 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 105: ++#line 569 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 106: ++#line 571 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 107: ++#line 581 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 108: ++#line 583 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[0].ttype, tree_cons (NULL_TREE, yyvsp[-1].ttype, yyvsp[-2].ttype)); ; ++ break;} ++case 109: ++#line 587 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 110: ++#line 589 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 114: ++#line 600 "c-parse.y" ++{ yyval.ttype = TREE_TYPE (yyvsp[-1].ttype); ; ++ break;} ++case 115: ++#line 602 "c-parse.y" ++{ yyval.ttype = groktypename (yyvsp[-1].ttype); ; ++ break;} ++case 123: ++#line 624 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 124: ++#line 626 "c-parse.y" ++{ if (TREE_CHAIN (yyvsp[-1].ttype)) yyvsp[-1].ttype = combine_strings (yyvsp[-1].ttype); ++ yyval.ttype = yyvsp[-1].ttype; ++ ; ++ break;} ++case 125: ++#line 633 "c-parse.y" ++{ yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1); ; ++ break;} ++case 126: ++#line 636 "c-parse.y" ++{ finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; ++ break;} ++case 127: ++#line 638 "c-parse.y" ++{ tree d = start_decl (yyvsp[-2].ttype, current_declspecs, 0); ++ finish_decl (d, NULL_TREE, yyvsp[-1].ttype); ; ++ break;} ++case 128: ++#line 644 "c-parse.y" ++{ yyval.ttype = start_decl (yyvsp[-3].ttype, current_declspecs, 1); ; ++ break;} ++case 129: ++#line 647 "c-parse.y" ++{ finish_decl (yyvsp[-1].ttype, yyvsp[0].ttype, yyvsp[-4].ttype); ; ++ break;} ++case 130: ++#line 649 "c-parse.y" ++{ tree d = start_decl (yyvsp[-2].ttype, current_declspecs, 0); ++ finish_decl (d, NULL_TREE, yyvsp[-1].ttype); ; ++ break;} ++case 131: ++#line 656 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 132: ++#line 658 "c-parse.y" ++{ yyval.ttype = yyvsp[-2].ttype; ; ++ break;} ++case 135: ++#line 668 "c-parse.y" ++{ warning ("`%s' attribute directive ignored", ++ IDENTIFIER_POINTER (yyvsp[0].ttype)); ++ yyval.ttype = yyvsp[0].ttype; ; ++ break;} ++case 136: ++#line 672 "c-parse.y" ++{ /* if not "aligned(1)", then issue warning */ ++ if (strcmp (IDENTIFIER_POINTER (yyvsp[-3].ttype), "aligned") != 0 ++ || TREE_CODE (yyvsp[-1].ttype) != INTEGER_CST ++ || TREE_INT_CST_LOW (yyvsp[-1].ttype) != 1) ++ warning ("`%s' attribute directive ignored", ++ IDENTIFIER_POINTER (yyvsp[-3].ttype)); ++ yyval.ttype = yyvsp[-3].ttype; ; ++ break;} ++case 137: ++#line 680 "c-parse.y" ++{ warning ("`%s' attribute directive ignored", ++ IDENTIFIER_POINTER (yyvsp[-3].ttype)); ++ yyval.ttype = yyvsp[-3].ttype; ; ++ break;} ++case 139: ++#line 688 "c-parse.y" ++{ yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); ++ if (pedantic) ++ warning ("ANSI C forbids empty initializer braces"); ; ++ break;} ++case 140: ++#line 692 "c-parse.y" ++{ yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-1].ttype)); ; ++ break;} ++case 141: ++#line 694 "c-parse.y" ++{ yyval.ttype = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (yyvsp[-2].ttype)); ; ++ break;} ++case 142: ++#line 696 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 143: ++#line 703 "c-parse.y" ++{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; ++ break;} ++case 144: ++#line 705 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-2].ttype); ; ++ break;} ++case 147: ++#line 720 "c-parse.y" ++{ yyval.ttype = yyvsp[-1].ttype; ; ++ break;} ++case 148: ++#line 722 "c-parse.y" ++{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 149: ++#line 727 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 150: ++#line 729 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; ++ break;} ++case 151: ++#line 731 "c-parse.y" ++{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 153: ++#line 742 "c-parse.y" ++{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 154: ++#line 747 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 155: ++#line 749 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; ++ break;} ++case 156: ++#line 751 "c-parse.y" ++{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 158: ++#line 760 "c-parse.y" ++{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 159: ++#line 765 "c-parse.y" ++{ yyval.ttype = yyvsp[-1].ttype; ; ++ break;} ++case 160: ++#line 767 "c-parse.y" ++{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 161: ++#line 769 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 162: ++#line 771 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; ++ break;} ++case 164: ++#line 777 "c-parse.y" ++{ yyval.ttype = start_struct (RECORD_TYPE, yyvsp[-1].ttype); ++ /* Start scope of tag before parsing components. */ ++ ; ++ break;} ++case 165: ++#line 781 "c-parse.y" ++{ yyval.ttype = finish_struct (yyvsp[-2].ttype, yyvsp[-1].ttype); ++ /* Really define the structure. */ ++ ; ++ break;} ++case 166: ++#line 785 "c-parse.y" ++{ yyval.ttype = finish_struct (start_struct (RECORD_TYPE, NULL_TREE), ++ yyvsp[-1].ttype); ; ++ break;} ++case 167: ++#line 788 "c-parse.y" ++{ yyval.ttype = xref_tag (RECORD_TYPE, yyvsp[0].ttype); ; ++ break;} ++case 168: ++#line 790 "c-parse.y" ++{ yyval.ttype = start_struct (UNION_TYPE, yyvsp[-1].ttype); ; ++ break;} ++case 169: ++#line 792 "c-parse.y" ++{ yyval.ttype = finish_struct (yyvsp[-2].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 170: ++#line 794 "c-parse.y" ++{ yyval.ttype = finish_struct (start_struct (UNION_TYPE, NULL_TREE), ++ yyvsp[-1].ttype); ; ++ break;} ++case 171: ++#line 797 "c-parse.y" ++{ yyval.ttype = xref_tag (UNION_TYPE, yyvsp[0].ttype); ; ++ break;} ++case 172: ++#line 799 "c-parse.y" ++{ yyvsp[0].itype = suspend_momentary (); ++ yyval.ttype = start_enum (yyvsp[-1].ttype); ; ++ break;} ++case 173: ++#line 802 "c-parse.y" ++{ yyval.ttype = finish_enum (yyvsp[-3].ttype, nreverse (yyvsp[-2].ttype)); ++ resume_momentary (yyvsp[-4].itype); ; ++ break;} ++case 174: ++#line 805 "c-parse.y" ++{ yyvsp[0].itype = suspend_momentary (); ++ yyval.ttype = start_enum (NULL_TREE); ; ++ break;} ++case 175: ++#line 808 "c-parse.y" ++{ yyval.ttype = finish_enum (yyvsp[-3].ttype, nreverse (yyvsp[-2].ttype)); ++ resume_momentary (yyvsp[-4].itype); ; ++ break;} ++case 176: ++#line 811 "c-parse.y" ++{ yyval.ttype = xref_tag (ENUMERAL_TYPE, yyvsp[0].ttype); ; ++ break;} ++case 180: ++#line 822 "c-parse.y" ++{ if (pedantic) warning ("comma at end of enumerator list"); ; ++ break;} ++case 181: ++#line 827 "c-parse.y" ++{ yyval.ttype = yyvsp[0].ttype; ; ++ break;} ++case 182: ++#line 829 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[-1].ttype, yyvsp[0].ttype); ++ warning ("no semicolon at end of struct or union"); ; ++ break;} ++case 183: ++#line 834 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 184: ++#line 836 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 185: ++#line 838 "c-parse.y" ++{ if (pedantic) ++ warning ("extra semicolon in struct or union specified"); ; ++ break;} ++case 186: ++#line 853 "c-parse.y" ++{ yyval.ttype = yyvsp[0].ttype; ++ current_declspecs = TREE_VALUE (declspec_stack); ++ declspec_stack = TREE_CHAIN (declspec_stack); ++ resume_momentary (yyvsp[-1].itype); ; ++ break;} ++case 187: ++#line 858 "c-parse.y" ++{ yyval.ttype = yyvsp[0].ttype; ++ current_declspecs = TREE_VALUE (declspec_stack); ++ declspec_stack = TREE_CHAIN (declspec_stack); ++ resume_momentary (yyvsp[-1].itype); ; ++ break;} ++case 188: ++#line 863 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 189: ++#line 868 "c-parse.y" ++{ if (pedantic) ++ warning ("ANSI C forbids member declarations with no members"); ++ yyval.ttype = NULL_TREE; ; ++ break;} ++case 191: ++#line 873 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 192: ++#line 878 "c-parse.y" ++{ yyval.ttype = grokfield (input_filename, lineno, yyvsp[-1].ttype, current_declspecs, NULL_TREE); ; ++ break;} ++case 193: ++#line 880 "c-parse.y" ++{ yyval.ttype = grokfield (input_filename, lineno, yyvsp[-3].ttype, current_declspecs, yyvsp[-1].ttype); ; ++ break;} ++case 194: ++#line 882 "c-parse.y" ++{ yyval.ttype = grokfield (input_filename, lineno, NULL_TREE, current_declspecs, yyvsp[0].ttype); ; ++ break;} ++case 196: ++#line 893 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[0].ttype, yyvsp[-2].ttype); ; ++ break;} ++case 197: ++#line 899 "c-parse.y" ++{ yyval.ttype = build_enumerator (yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 198: ++#line 901 "c-parse.y" ++{ yyval.ttype = build_enumerator (yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 199: ++#line 906 "c-parse.y" ++{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 200: ++#line 908 "c-parse.y" ++{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 201: ++#line 913 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 203: ++#line 919 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 204: ++#line 921 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 205: ++#line 926 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 206: ++#line 928 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, yyvsp[0].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 207: ++#line 933 "c-parse.y" ++{ yyval.ttype = yyvsp[-1].ttype; ; ++ break;} ++case 208: ++#line 936 "c-parse.y" ++{ yyval.ttype = make_pointer_declarator (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 209: ++#line 938 "c-parse.y" ++{ yyval.ttype = make_pointer_declarator (yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 210: ++#line 940 "c-parse.y" ++{ yyval.ttype = build_nt (CALL_EXPR, yyvsp[-2].ttype, yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 211: ++#line 942 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-3].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 212: ++#line 944 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, yyvsp[-2].ttype, NULL_TREE); ; ++ break;} ++case 213: ++#line 946 "c-parse.y" ++{ yyval.ttype = build_nt (CALL_EXPR, NULL_TREE, yyvsp[0].ttype, NULL_TREE); ; ++ break;} ++case 214: ++#line 948 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, yyvsp[-1].ttype); ; ++ break;} ++case 215: ++#line 950 "c-parse.y" ++{ yyval.ttype = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); ; ++ break;} ++case 222: ++#line 972 "c-parse.y" ++{ pushlevel (0); ++ clear_last_expr (); ++ push_momentary (); ++ expand_start_bindings (0); ; ++ break;} ++case 223: ++#line 982 "c-parse.y" ++{; ++ break;} ++case 225: ++#line 987 "c-parse.y" ++{ yyval.ttype = 0; ; ++ break;} ++case 226: ++#line 989 "c-parse.y" ++{ expand_end_bindings (getdecls (), 1, 0); ++ yyval.ttype = poplevel (1, 1, 0); ++ pop_momentary (); ; ++ break;} ++case 227: ++#line 993 "c-parse.y" ++{ expand_end_bindings (getdecls (), kept_level_p (), 0); ++ yyval.ttype = poplevel (kept_level_p (), 0, 0); ++ pop_momentary (); ; ++ break;} ++case 228: ++#line 997 "c-parse.y" ++{ expand_end_bindings (getdecls (), kept_level_p (), 0); ++ yyval.ttype = poplevel (kept_level_p (), 0, 0); ++ pop_momentary (); ; ++ break;} ++case 229: ++#line 1004 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ expand_start_cond (truthvalue_conversion (yyvsp[-1].ttype), 0); ; ++ break;} ++case 231: ++#line 1010 "c-parse.y" ++{; ++ break;} ++case 232: ++#line 1012 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ /* Do default conversion if safe and possibly important, ++ in case within ({...}). */ ++ if ((TREE_CODE (TREE_TYPE (yyvsp[-1].ttype)) == ARRAY_TYPE ++ && lvalue_p (yyvsp[-1].ttype)) ++ || TREE_CODE (TREE_TYPE (yyvsp[-1].ttype)) == FUNCTION_TYPE) ++ yyvsp[-1].ttype = default_conversion (yyvsp[-1].ttype); ++ expand_expr_stmt (yyvsp[-1].ttype); ++ clear_momentary (); ; ++ break;} ++case 233: ++#line 1022 "c-parse.y" ++{ expand_start_else (); ; ++ break;} ++case 234: ++#line 1024 "c-parse.y" ++{ expand_end_else (); ; ++ break;} ++case 235: ++#line 1026 "c-parse.y" ++{ expand_end_cond (); ; ++ break;} ++case 236: ++#line 1028 "c-parse.y" ++{ emit_nop (); ++ emit_line_note (input_filename, lineno); ++ expand_start_loop (1); ; ++ break;} ++case 237: ++#line 1032 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ expand_exit_loop_if_false (truthvalue_conversion (yyvsp[-1].ttype)); ; ++ break;} ++case 238: ++#line 1035 "c-parse.y" ++{ expand_end_loop (); ; ++ break;} ++case 239: ++#line 1037 "c-parse.y" ++{ emit_nop (); ++ emit_line_note (input_filename, lineno); ++ expand_start_loop_continue_elsewhere (1); ; ++ break;} ++case 240: ++#line 1041 "c-parse.y" ++{ expand_loop_continue_here (); ; ++ break;} ++case 241: ++#line 1043 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ expand_exit_loop_if_false (truthvalue_conversion (yyvsp[-2].ttype)); ++ expand_end_loop (); ++ clear_momentary (); ; ++ break;} ++case 242: ++#line 1049 "c-parse.y" ++{ emit_nop (); ++ emit_line_note (input_filename, lineno); ++ if (yyvsp[-1].ttype) expand_expr_stmt (yyvsp[-1].ttype); ++ expand_start_loop_continue_elsewhere (1); ; ++ break;} ++case 243: ++#line 1054 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ if (yyvsp[-1].ttype) ++ expand_exit_loop_if_false (truthvalue_conversion (yyvsp[-1].ttype)); ; ++ break;} ++case 244: ++#line 1060 "c-parse.y" ++{ push_momentary (); ++ yyvsp[0].itype = lineno; ; ++ break;} ++case 245: ++#line 1063 "c-parse.y" ++{ emit_line_note (input_filename, yyvsp[-2].itype); ++ expand_loop_continue_here (); ++ if (yyvsp[-3].ttype) ++ expand_expr_stmt (yyvsp[-3].ttype); ++ pop_momentary (); ++ expand_end_loop (); ; ++ break;} ++case 246: ++#line 1070 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ c_expand_start_case (yyvsp[-1].ttype); ++ /* Don't let the tree nodes for $3 be discarded by ++ clear_momentary during the parsing of the next stmt. */ ++ push_momentary (); ; ++ break;} ++case 247: ++#line 1076 "c-parse.y" ++{ expand_end_case (yyvsp[-3].ttype); ++ pop_momentary (); ; ++ break;} ++case 248: ++#line 1079 "c-parse.y" ++{ register tree value = fold (yyvsp[-1].ttype); ++ register tree label ++ = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ++ ++ /* build_c_cast puts on a NOP_EXPR to make a non-lvalue. ++ Strip such NOP_EXPRs. */ ++ if (TREE_CODE (value) == NOP_EXPR ++ && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0))) ++ value = TREE_OPERAND (value, 0); ++ ++ if (TREE_CODE (value) != INTEGER_CST ++ && value != error_mark_node) ++ { ++ error ("case label does not reduce to an integer constant"); ++ value = error_mark_node; ++ } ++ else ++ /* Promote char or short to int. */ ++ value = default_conversion (value); ++ if (value != error_mark_node) ++ { ++ int success = pushcase (value, label); ++ if (success == 1) ++ error ("case label not within a switch statement"); ++ else if (success == 2) ++ error ("duplicate case value"); ++ else if (success == 3) ++ warning ("case value out of range"); ++ } ++ ; ++ break;} ++case 250: ++#line 1111 "c-parse.y" ++{ ++ register tree label ++ = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ++ int success = pushcase (NULL_TREE, label); ++ if (success == 1) ++ error ("default label not within a switch statement"); ++ else if (success == 2) ++ error ("multiple default labels in one switch"); ++ ; ++ break;} ++case 252: ++#line 1122 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ if ( ! expand_exit_something ()) ++ error ("break statement not within loop or switch"); ; ++ break;} ++case 253: ++#line 1126 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ if (! expand_continue_loop ()) ++ error ("continue statement not within a loop"); ; ++ break;} ++case 254: ++#line 1130 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ c_expand_return (NULL_TREE); ; ++ break;} ++case 255: ++#line 1133 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ++ c_expand_return (yyvsp[-1].ttype); ; ++ break;} ++case 256: ++#line 1136 "c-parse.y" ++{ if (TREE_CHAIN (yyvsp[-2].ttype)) yyvsp[-2].ttype = combine_strings (yyvsp[-2].ttype); ++ emit_line_note (input_filename, lineno); ++ expand_asm (yyvsp[-2].ttype); ; ++ break;} ++case 257: ++#line 1141 "c-parse.y" ++{ if (TREE_CHAIN (yyvsp[-4].ttype)) yyvsp[-4].ttype = combine_strings (yyvsp[-4].ttype); ++ emit_line_note (input_filename, lineno); ++ c_expand_asm_operands (yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, NULL_TREE, ++ yyvsp[-6].ttype == ridpointers[(int)RID_VOLATILE], ++ input_filename, lineno); ; ++ break;} ++case 258: ++#line 1148 "c-parse.y" ++{ if (TREE_CHAIN (yyvsp[-6].ttype)) yyvsp[-6].ttype = combine_strings (yyvsp[-6].ttype); ++ emit_line_note (input_filename, lineno); ++ c_expand_asm_operands (yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, NULL_TREE, ++ yyvsp[-8].ttype == ridpointers[(int)RID_VOLATILE], ++ input_filename, lineno); ; ++ break;} ++case 259: ++#line 1156 "c-parse.y" ++{ if (TREE_CHAIN (yyvsp[-8].ttype)) yyvsp[-8].ttype = combine_strings (yyvsp[-8].ttype); ++ emit_line_note (input_filename, lineno); ++ c_expand_asm_operands (yyvsp[-8].ttype, yyvsp[-6].ttype, yyvsp[-4].ttype, yyvsp[-2].ttype, ++ yyvsp[-10].ttype == ridpointers[(int)RID_VOLATILE], ++ input_filename, lineno); ; ++ break;} ++case 260: ++#line 1162 "c-parse.y" ++{ tree decl; ++ emit_line_note (input_filename, lineno); ++ decl = lookup_label (yyvsp[-1].ttype); ++ TREE_USED (decl) = 1; ++ expand_goto (decl); ; ++ break;} ++case 261: ++#line 1168 "c-parse.y" ++{ tree label = define_label (input_filename, lineno, yyvsp[-1].ttype); ++ emit_nop (); ++ if (label) ++ expand_label (label); ; ++ break;} ++case 264: ++#line 1180 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ; ++ break;} ++case 265: ++#line 1182 "c-parse.y" ++{ emit_line_note (input_filename, lineno); ; ++ break;} ++case 266: ++#line 1187 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 268: ++#line 1194 "c-parse.y" ++{ yyval.ttype = NULL_TREE; ; ++ break;} ++case 271: ++#line 1201 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[-2].ttype, yyvsp[0].ttype); ; ++ break;} ++case 272: ++#line 1206 "c-parse.y" ++{ yyval.ttype = build_tree_list (yyvsp[-3].ttype, yyvsp[-1].ttype); ; ++ break;} ++case 273: ++#line 1211 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), NULL_TREE); ; ++ break;} ++case 274: ++#line 1213 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, combine_strings (yyvsp[0].ttype), yyvsp[-2].ttype); ; ++ break;} ++case 275: ++#line 1219 "c-parse.y" ++{ pushlevel (0); ++ declare_parm_level (); ; ++ break;} ++case 276: ++#line 1222 "c-parse.y" ++{ yyval.ttype = yyvsp[0].ttype; ++ parmlist_tags_warning (); ++ poplevel (0, 0, 0); ; ++ break;} ++case 277: ++#line 1230 "c-parse.y" ++{ pushlevel (0); ++ declare_parm_level (); ; ++ break;} ++case 278: ++#line 1233 "c-parse.y" ++{ yyval.ttype = yyvsp[0].ttype; ++ parmlist_tags_warning (); ++ poplevel (0, 0, 0); ; ++ break;} ++case 280: ++#line 1241 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, yyvsp[-1].ttype); ; ++ break;} ++case 281: ++#line 1243 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); ; ++ break;} ++case 283: ++#line 1249 "c-parse.y" ++{ yyval.ttype = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); ; ++ break;} ++case 284: ++#line 1255 "c-parse.y" ++{ yyval.ttype = get_parm_info (0); ; ++ break;} ++case 285: ++#line 1257 "c-parse.y" ++{ yyval.ttype = get_parm_info (1); ; ++ break;} ++case 286: ++#line 1259 "c-parse.y" ++{ yyval.ttype = get_parm_info (0); ; ++ break;} ++case 287: ++#line 1264 "c-parse.y" ++{ push_parm_decl (yyvsp[0].ttype); ; ++ break;} ++case 288: ++#line 1266 "c-parse.y" ++{ push_parm_decl (yyvsp[0].ttype); ; ++ break;} ++case 289: ++#line 1273 "c-parse.y" ++{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ; ++ break;} ++case 290: ++#line 1275 "c-parse.y" ++{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ; ++ break;} ++case 291: ++#line 1277 "c-parse.y" ++{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 292: ++#line 1279 "c-parse.y" ++{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype) ; ; ++ break;} ++case 293: ++#line 1281 "c-parse.y" ++{ yyval.ttype = build_tree_list (yyvsp[-1].ttype, yyvsp[0].ttype); ; ++ break;} ++case 294: ++#line 1287 "c-parse.y" ++{ yyval.ttype = build_tree_list (NULL_TREE, yyvsp[0].ttype); ; ++ break;} ++case 295: ++#line 1289 "c-parse.y" ++{ yyval.ttype = chainon (yyvsp[-2].ttype, build_tree_list (NULL_TREE, yyvsp[0].ttype)); ; ++ break;} ++} ++ ++#line 610 "/usr/lib/bison/bison.simple" ++ ++ ++ yyvsp -= yylen; ++ yyssp -= yylen; ++#if YYLSP_NEEDED ++ yylsp -= yylen; ++#endif ++ ++#if YYDEBUG ++ if (yydebug) ++ { ++ short *ssp1 = yyss - 1; ++ fprintf (stderr, "state stack now"); ++ while (ssp1 != yyssp) ++ fprintf (stderr, " %d", *++ssp1); ++ fprintf (stderr, "\n"); ++ } ++#endif ++ ++ *++yyvsp = yyval; ++#if YYLSP_NEEDED ++ *++yylsp = yyloc; ++#endif ++ ++ /* Now `shift' the result of the reduction. Determine what state ++ that goes to, based on the state we popped back to and the rule ++ number reduced by. */ ++ ++ yyn = yyr1[yyn]; ++ ++ yystate = yypgoto[yyn - YYNTBASE] + *yyssp; ++ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) ++ yystate = yytable[yystate]; ++ else ++ yystate = yydefgoto[yyn - YYNTBASE]; ++ ++ goto yynewstate; ++ ++ ++/*------------------------------------. ++| yyerrlab -- here on detecting error | ++`------------------------------------*/ ++yyerrlab: ++ /* If not already recovering from an error, report this error. */ ++ if (!yyerrstatus) ++ { ++ ++yynerrs; ++ ++#ifdef YYERROR_VERBOSE ++ yyn = yypact[yystate]; ++ ++ if (yyn > YYFLAG && yyn < YYLAST) ++ { ++ int size = 0; ++ char *msg; ++ int x, count; ++ ++ count = 0; ++ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ ++ for (x = (yyn < 0 ? -yyn : 0); ++ x < (int) (sizeof (yytname) / sizeof (char *)); x++) ++ if (yycheck[x + yyn] == x) ++ size += strlen (yytname[x]) + 15, count++; ++ size += strlen ("parse error, unexpected `") + 1; ++ size += strlen (yytname[YYTRANSLATE (yychar)]); ++ msg = (char *) malloc (size); ++ if (msg != 0) ++ { ++ strcpy (msg, "parse error, unexpected `"); ++ strcat (msg, yytname[YYTRANSLATE (yychar)]); ++ strcat (msg, "'"); ++ ++ if (count < 5) ++ { ++ count = 0; ++ for (x = (yyn < 0 ? -yyn : 0); ++ x < (int) (sizeof (yytname) / sizeof (char *)); x++) ++ if (yycheck[x + yyn] == x) ++ { ++ strcat (msg, count == 0 ? ", expecting `" : " or `"); ++ strcat (msg, yytname[x]); ++ strcat (msg, "'"); ++ count++; ++ } ++ } ++ yyerror (msg); ++ free (msg); ++ } ++ else ++ yyerror ("parse error; also virtual memory exceeded"); ++ } ++ else ++#endif /* YYERROR_VERBOSE */ ++ yyerror ("parse error"); ++ } ++ goto yyerrlab1; ++ ++ ++/*--------------------------------------------------. ++| yyerrlab1 -- error raised explicitly by an action | ++`--------------------------------------------------*/ ++yyerrlab1: ++ if (yyerrstatus == 3) ++ { ++ /* If just tried and failed to reuse lookahead token after an ++ error, discard it. */ ++ ++ /* return failure if at end of input */ ++ if (yychar == YYEOF) ++ YYABORT; ++ YYDPRINTF ((stderr, "Discarding token %d (%s).\n", ++ yychar, yytname[yychar1])); ++ yychar = YYEMPTY; ++ } ++ ++ /* Else will try to reuse lookahead token after shifting the error ++ token. */ ++ ++ yyerrstatus = 3; /* Each real token shifted decrements this */ ++ ++ goto yyerrhandle; ++ ++ ++/*-------------------------------------------------------------------. ++| yyerrdefault -- current state does not do anything special for the | ++| error token. | ++`-------------------------------------------------------------------*/ ++yyerrdefault: ++#if 0 ++ /* This is wrong; only states that explicitly want error tokens ++ should shift them. */ ++ ++ /* If its default is to accept any token, ok. Otherwise pop it. */ ++ yyn = yydefact[yystate]; ++ if (yyn) ++ goto yydefault; ++#endif ++ ++ ++/*---------------------------------------------------------------. ++| yyerrpop -- pop the current state because it cannot handle the | ++| error token | ++`---------------------------------------------------------------*/ ++yyerrpop: ++ if (yyssp == yyss) ++ YYABORT; ++ yyvsp--; ++ yystate = *--yyssp; ++#if YYLSP_NEEDED ++ yylsp--; ++#endif ++ ++#if YYDEBUG ++ if (yydebug) ++ { ++ short *ssp1 = yyss - 1; ++ fprintf (stderr, "Error: state stack now"); ++ while (ssp1 != yyssp) ++ fprintf (stderr, " %d", *++ssp1); ++ fprintf (stderr, "\n"); ++ } ++#endif ++ ++/*--------------. ++| yyerrhandle. | ++`--------------*/ ++yyerrhandle: ++ yyn = yypact[yystate]; ++ if (yyn == YYFLAG) ++ goto yyerrdefault; ++ ++ yyn += YYTERROR; ++ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) ++ goto yyerrdefault; ++ ++ yyn = yytable[yyn]; ++ if (yyn < 0) ++ { ++ if (yyn == YYFLAG) ++ goto yyerrpop; ++ yyn = -yyn; ++ goto yyreduce; ++ } ++ else if (yyn == 0) ++ goto yyerrpop; ++ ++ if (yyn == YYFINAL) ++ YYACCEPT; ++ ++ YYDPRINTF ((stderr, "Shifting error token, ")); ++ ++ *++yyvsp = yylval; ++#if YYLSP_NEEDED ++ *++yylsp = yylloc; ++#endif ++ ++ yystate = yyn; ++ goto yynewstate; ++ ++ ++/*-------------------------------------. ++| yyacceptlab -- YYACCEPT comes here. | ++`-------------------------------------*/ ++yyacceptlab: ++ if (yyfree_stacks) ++ { ++ free (yyss); ++ free (yyvs); ++#if YYLSP_NEEDED ++ free (yyls); ++#endif ++ } ++ return 0; ++ ++ ++/*-----------------------------------. ++| yyabortlab -- YYABORT comes here. | ++`-----------------------------------*/ ++yyabortlab: ++ if (yyfree_stacks) ++ { ++ free (yyss); ++ free (yyvs); ++#if YYLSP_NEEDED ++ free (yyls); ++#endif ++ } ++ return 1; ++} ++#line 1291 "c-parse.y" ++ ++ ++/* Return something to represent absolute declarators containing a *. ++ TARGET is the absolute declarator that the * contains. ++ TYPE_QUALS is a list of modifiers such as const or volatile ++ to apply to the pointer type, represented as identifiers. ++ ++ We return an INDIRECT_REF whose "contents" are TARGET ++ and whose type is the modifier list. */ ++ ++static tree ++make_pointer_declarator (type_quals, target) ++ tree type_quals, target; ++{ ++ return build (INDIRECT_REF, type_quals, target); ++} ++ ++/* Given a chain of STRING_CST nodes, ++ concatenate them into one STRING_CST ++ and give it a suitable array-of-chars data type. */ ++ ++static tree ++combine_strings (strings) ++ tree strings; ++{ ++ register tree value, t; ++ register int length = 1; ++ int wide_length = 0; ++ int wide_flag = 0; ++ int nchars; ++ ++ if (TREE_CHAIN (strings)) ++ { ++ /* More than one in the chain, so concatenate. */ ++ register char *p, *q; ++ ++ /* Don't include the \0 at the end of each substring, ++ except for the last one. ++ Count wide strings and ordinary strings separately. */ ++ for (t = strings; t; t = TREE_CHAIN (t)) ++ { ++ if (TREE_TYPE (t) == int_array_type_node) ++ { ++ wide_length += (TREE_STRING_LENGTH (t) - UNITS_PER_WORD); ++ wide_flag = 1; ++ } ++ else ++ length += (TREE_STRING_LENGTH (t) - 1); ++ } ++ ++ /* If anything is wide, the non-wides will be converted, ++ which makes them take more space. */ ++ if (wide_flag) ++ length = length * UNITS_PER_WORD + wide_length; ++ ++ p = (char *) savealloc (length); ++ ++ /* Copy the individual strings into the new combined string. ++ If the combined string is wide, convert the chars to ints ++ for any individual strings that are not wide. */ ++ ++ q = p; ++ for (t = strings; t; t = TREE_CHAIN (t)) ++ { ++ int len = (TREE_STRING_LENGTH (t) ++ - ((TREE_TYPE (t) == int_array_type_node) ++ ? UNITS_PER_WORD : 1)); ++ if ((TREE_TYPE (t) == int_array_type_node) == wide_flag) ++ { ++ bcopy (TREE_STRING_POINTER (t), q, len); ++ q += len; ++ } ++ else ++ { ++ int i; ++ for (i = 0; i < len; i++) ++ ((int *) q)[i] = TREE_STRING_POINTER (t)[i]; ++ q += len * UNITS_PER_WORD; ++ } ++ } ++ if (wide_flag) ++ { ++ int i; ++ for (i = 0; i < UNITS_PER_WORD; i++) ++ *q++ = 0; ++ } ++ else ++ *q = 0; ++ ++ value = make_node (STRING_CST); ++ TREE_STRING_POINTER (value) = p; ++ TREE_STRING_LENGTH (value) = length; ++ TREE_LITERAL (value) = 1; ++ } ++ else ++ { ++ value = strings; ++ length = TREE_STRING_LENGTH (value); ++ if (TREE_TYPE (value) == int_array_type_node) ++ wide_flag = 1; ++ } ++ ++ /* Compute the number of elements, for the array type. */ ++ nchars = wide_flag ? length / UNITS_PER_WORD : length; ++ ++ /* Create the array type for the string constant. ++ -Wwrite-strings says make the string constant an array of const char ++ so that copying it to a non-const pointer will get a warning. */ ++ if (warn_write_strings) ++ { ++ tree elements ++ = build_type_variant (wide_flag ? integer_type_node : char_type_node, ++ 1, 0); ++ TREE_TYPE (value) ++ = build_array_type (elements, ++ build_index_type (build_int_2 (nchars - 1, 0))); ++ } ++ else ++ TREE_TYPE (value) ++ = build_array_type (wide_flag ? integer_type_node : char_type_node, ++ build_index_type (build_int_2 (nchars - 1, 0))); ++ TREE_LITERAL (value) = 1; ++ TREE_STATIC (value) = 1; ++ return value; ++} ++ ++FILE *finput; /* input file. ++ Normally a pipe from the preprocessor. */ ++ ++/* lexical analyzer */ ++ ++static int maxtoken; /* Current nominal length of token buffer. */ ++static char *token_buffer; /* Pointer to token buffer. ++ Actual allocated length is maxtoken + 2. */ ++static int max_wide; /* Current nominal length of wide_buffer. */ ++static int *wide_buffer; /* Pointer to wide-string buffer. ++ Actual allocated length is max_wide + 1. */ ++ ++/* Nonzero if end-of-file has been seen on input. */ ++static int end_of_file; ++ ++/* Buffered character to reread. ++ I'm not sure why ungetc is not used. */ ++static int nextchar = -1; ++ ++/* Data type that represents the GNU C reserved words. */ ++struct resword { char *name; short token; enum rid rid; }; ++ ++#define MIN_WORD_LENGTH 2 /* minimum size for C keyword */ ++#define MAX_WORD_LENGTH 13 /* maximum size for C keyword */ ++#define MIN_HASH_VALUE 7 /* range of the hash keys values */ ++#define MAX_HASH_VALUE 91 /* for the perfect hash generator */ ++#define NORID RID_UNUSED ++ ++/* This function performs the minimum-perfect hash mapping from input ++ string to reswords table index. It only looks at the first and ++ last characters in the string, thus assuring the O(1) lookup time ++ (this keeps our constant down to an insignificant amount!). Compiling ++ the following 2 functions as inline removes all overhead of the ++ function calls. */ ++ ++#ifdef __GNUC__ ++__inline ++#endif ++static int ++hash (str, len) ++ register char *str; ++ register int len; ++{ ++/* This table is used to build the hash table index that recognizes ++ reserved words in 0(1) steps. It is larger than strictly necessary, ++ but I'm trading off the space for the time-saving luxury of avoiding ++ subtraction of an offset. All those ``91's'' (actually just a ++ short-hand for MAX_HASH_VALUE #defined above) are used to speed up ++ the search when the string found on the input stream doesn't have a ++ first or last character that is part of the set of alphabetic ++ characters that comprise the first or last characters in C ++ reserved words. */ ++ ++ static int hash_table[] = ++ { ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 1, 91, 2, 1, 32, ++ 7, 5, 18, 20, 1, 17, 91, 1, 18, 1, ++ 28, 1, 23, 91, 12, 20, 1, 41, 7, 15, ++ 91, 91, 10, 91, 91, 91, 91, 91, ++ }; ++ register int hval = len ; ++ ++ switch (hval) ++ { ++ default: ++ case 3: ++ hval += hash_table[str[2]]; ++ case 2: ++ case 1: ++ return hval + hash_table[str[0]] + hash_table[str[len - 1]]; ++ } ++} ++ ++/* This routine attempts to match the string found in the reswords table ++ with the one from the input stream. If all the relevant details ++ match then an actual strcmp comparison is performed and the address of ++ correct struct resword entry is returned. Otherwise, a NULL ++ pointer is returned. */ ++ ++#ifdef __GNUC__ ++__inline ++#endif ++struct resword * ++is_reserved_word (str, len) ++ register char *str; ++ register int len; ++{ ++ /* This is the hash table of keywords. ++ The order of keywords has been chosen for perfect hashing. ++ Therefore, this table cannot be updated by hand. ++ Use the program ``gperf,'' available with the latest libg++ ++ distribution, to generate an updated table. A file called ++ c-parse.gperf, distributed with GNU C, contains the keyword file. */ ++ ++ static struct resword reswords[] = ++ { ++ { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, ++ {"asm", ASM, NORID }, ++ {"auto", SCSPEC, RID_AUTO }, ++ {"__asm", ASM, NORID }, ++ {"do", DO, NORID }, ++ {"__asm__", ASM, NORID }, ++ {"break", BREAK, NORID }, ++ {"__typeof__", TYPEOF, NORID }, ++ { "", }, ++ {"__alignof__", ALIGNOF, NORID }, ++ { "", }, ++ {"__attribute__", ATTRIBUTE, NORID }, ++ { "", }, ++ {"__attribute", ATTRIBUTE, NORID }, ++ { "", }, ++ {"__volatile__", TYPE_QUAL, RID_VOLATILE }, ++ {"int", TYPESPEC, RID_INT }, ++ {"__volatile", TYPE_QUAL, RID_VOLATILE }, ++ { "", }, ++ {"float", TYPESPEC, RID_FLOAT }, ++ {"goto", GOTO, NORID }, ++ {"short", TYPESPEC, RID_SHORT }, ++ {"__typeof", TYPEOF, NORID }, ++ {"__inline__", SCSPEC, RID_INLINE }, ++ {"__alignof", ALIGNOF, NORID }, ++ {"__inline", SCSPEC, RID_INLINE }, ++ {"__signed__", TYPESPEC, RID_SIGNED }, ++ {"default", DEFAULT, NORID }, ++ {"else", ELSE, NORID }, ++ {"void", TYPESPEC, RID_VOID }, ++ {"__signed", TYPESPEC, RID_SIGNED }, ++ {"if", IF, NORID }, ++ {"volatile", TYPE_QUAL, RID_VOLATILE }, ++ {"struct", STRUCT, NORID }, ++ {"extern", SCSPEC, RID_EXTERN }, ++ {"__const", TYPE_QUAL, RID_CONST }, ++ {"while", WHILE, NORID }, ++ {"__const__", TYPE_QUAL, RID_CONST }, ++ {"switch", SWITCH, NORID }, ++ {"for", FOR, NORID }, ++ {"inline", SCSPEC, RID_INLINE }, ++ {"return", RETURN, NORID }, ++ {"typeof", TYPEOF, NORID }, ++ {"typedef", SCSPEC, RID_TYPEDEF }, ++ {"char", TYPESPEC, RID_CHAR }, ++ {"enum", ENUM, NORID }, ++ {"register", SCSPEC, RID_REGISTER }, ++ {"signed", TYPESPEC, RID_SIGNED }, ++ {"sizeof", SIZEOF, NORID }, ++ { "", }, { "", }, { "", }, { "", }, ++ {"double", TYPESPEC, RID_DOUBLE }, ++ {"static", SCSPEC, RID_STATIC }, ++ {"case", CASE, NORID }, ++ { "", }, { "", }, { "", }, { "", }, ++ {"const", TYPE_QUAL, RID_CONST }, ++ { "", }, { "", }, { "", }, ++ {"long", TYPESPEC, RID_LONG }, ++ { "", }, { "", }, ++ {"continue", CONTINUE, NORID }, ++ { "", }, { "", }, ++ {"unsigned", TYPESPEC, RID_UNSIGNED }, ++ { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, ++ { "", }, { "", }, { "", }, { "", }, { "", }, ++ {"union", UNION, NORID }, ++ }; ++ ++ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) ++ { ++ register int key = hash (str, len); ++ ++ if (key <= MAX_HASH_VALUE) ++ { ++ register char *s = reswords[key].name; ++ ++ if (*s == *str && !strcmp (str + 1, s + 1)) ++ return &reswords[key]; ++ } ++ } ++ return 0; ++} ++ ++/* The elements of `ridpointers' are identifier nodes ++ for the reserved type names and storage classes. ++ It is indexed by a RID_... value. */ ++ ++tree ridpointers[(int) RID_MAX]; ++ ++int check_newline (); ++ ++void ++init_lex () ++{ ++ /* Start it at 0, because check_newline is called at the very beginning ++ and will increment it to 1. */ ++ lineno = 0; ++ ++ maxtoken = 40; ++ token_buffer = (char *) xmalloc (maxtoken + 2); ++ max_wide = 40; ++ wide_buffer = (int *) xmalloc ((max_wide + 1) * UNITS_PER_WORD); ++ ++ ridpointers[(int) RID_INT] = get_identifier ("int"); ++ ridpointers[(int) RID_CHAR] = get_identifier ("char"); ++ ridpointers[(int) RID_VOID] = get_identifier ("void"); ++ ridpointers[(int) RID_FLOAT] = get_identifier ("float"); ++ ridpointers[(int) RID_DOUBLE] = get_identifier ("double"); ++ ridpointers[(int) RID_SHORT] = get_identifier ("short"); ++ ridpointers[(int) RID_LONG] = get_identifier ("long"); ++ ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned"); ++ ridpointers[(int) RID_SIGNED] = get_identifier ("signed"); ++ ridpointers[(int) RID_INLINE] = get_identifier ("inline"); ++ ridpointers[(int) RID_CONST] = get_identifier ("const"); ++ ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile"); ++ ridpointers[(int) RID_AUTO] = get_identifier ("auto"); ++ ridpointers[(int) RID_STATIC] = get_identifier ("static"); ++ ridpointers[(int) RID_EXTERN] = get_identifier ("extern"); ++ ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef"); ++ ridpointers[(int) RID_REGISTER] = get_identifier ("register"); ++} ++ ++static void ++reinit_parse_for_function () ++{ ++} ++ ++/* If C is not whitespace, return C. ++ Otherwise skip whitespace and return first nonwhite char read. */ ++ ++static int ++skip_white_space (c) ++ register int c; ++{ ++#if 0 ++ register int inside; ++#endif ++ ++ for (;;) ++ { ++ switch (c) ++ { ++ /* Don't recognize comments in cc1: all comments are removed by cpp, ++ and cpp output can include / and * consecutively as operators. */ ++#if 0 ++ case '/': ++ c = getc (finput); ++ if (c != '*') ++ { ++ ungetc (c, finput); ++ return '/'; ++ } ++ ++ c = getc (finput); ++ ++ inside = 1; ++ while (inside) ++ { ++ if (c == '*') ++ { ++ while (c == '*') ++ c = getc (finput); ++ ++ if (c == '/') ++ { ++ inside = 0; ++ c = getc (finput); ++ } ++ } ++ else if (c == '\n') ++ { ++ lineno++; ++ c = getc (finput); ++ } ++ else if (c == EOF) ++ { ++ error ("unterminated comment"); ++ break; ++ } ++ else ++ c = getc (finput); ++ } ++ ++ break; ++#endif ++ ++ case '\n': ++ c = check_newline (); ++ break; ++ ++ case ' ': ++ case '\t': ++ case '\f': ++ case '\r': ++ case '\v': ++ case '\b': ++ c = getc (finput); ++ break; ++ ++ case '\\': ++ c = getc (finput); ++ if (c == '\n') ++ lineno++; ++ else ++ error ("stray '\\' in program"); ++ c = getc (finput); ++ break; ++ ++ default: ++ return (c); ++ } ++ } ++} ++ ++ ++ ++/* Make the token buffer longer, preserving the data in it. ++ P should point to just beyond the last valid character in the old buffer. ++ The value we return is a pointer to the new buffer ++ at a place corresponding to P. */ ++ ++static char * ++extend_token_buffer (p) ++ char *p; ++{ ++ int offset = p - token_buffer; ++ ++ maxtoken = maxtoken * 2 + 10; ++ token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2); ++ ++ return token_buffer + offset; ++} ++ ++/* At the beginning of a line, increment the line number ++ and process any #-directive on this line. ++ If the line is a #-directive, read the entire line and return a newline. ++ Otherwise, return the line's first non-whitespace character. */ ++ ++int ++check_newline () ++{ ++ register int c; ++ register int token; ++ ++ lineno++; ++ ++ /* Read first nonwhite char on the line. */ ++ ++ c = getc (finput); ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ ++ if (c != '#') ++ { ++ /* If not #, return it so caller will use it. */ ++ return c; ++ } ++ ++ /* Read first nonwhite char after the `#'. */ ++ ++ c = getc (finput); ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ ++ /* If a letter follows, then if the word here is `line', skip ++ it and ignore it; otherwise, ignore the line, with an error ++ if the word isn't `pragma'. */ ++ ++ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) ++ { ++ if (c == 'p') ++ { ++ if (getc (finput) == 'r' ++ && getc (finput) == 'a' ++ && getc (finput) == 'g' ++ && getc (finput) == 'm' ++ && getc (finput) == 'a' ++ && ((c = getc (finput)) == ' ' || c == '\t' || c == '\n')) ++ goto skipline; ++ } ++ ++ else if (c == 'l') ++ { ++ if (getc (finput) == 'i' ++ && getc (finput) == 'n' ++ && getc (finput) == 'e' ++ && ((c = getc (finput)) == ' ' || c == '\t')) ++ goto linenum; ++ } ++ else if (c == 'i') ++ { ++ if (getc (finput) == 'd' ++ && getc (finput) == 'e' ++ && getc (finput) == 'n' ++ && getc (finput) == 't' ++ && ((c = getc (finput)) == ' ' || c == '\t')) ++ { ++ extern FILE *asm_out_file; ++ ++ if (pedantic) ++ error ("ANSI C does not allow #ident"); ++ ++ /* Here we have just seen `#ident '. ++ A string constant should follow. */ ++ ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ ++ /* If no argument, ignore the line. */ ++ if (c == '\n') ++ return c; ++ ++ ungetc (c, finput); ++ token = yylex (); ++ if (nextchar >= 0) ++ ungetc (nextchar, finput), nextchar = -1; ++ if (token != STRING ++ || TREE_CODE (yylval.ttype) != STRING_CST) ++ { ++ error ("invalid #ident"); ++ goto skipline; ++ } ++ ++#ifdef ASM_OUTPUT_IDENT ++ ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (yylval.ttype)); ++#endif ++ ++ /* Skip the rest of this line. */ ++ goto skipline; ++ } ++ } ++ ++ error ("undefined or invalid # directive"); ++ goto skipline; ++ } ++ ++linenum: ++ /* Here we have either `#line' or `# '. ++ In either case, it should be a line number; a digit should follow. */ ++ ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ ++ /* If the # is the only nonwhite char on the line, ++ just ignore it. Check the new newline. */ ++ if (c == '\n') ++ return c; ++ ++ /* Something follows the #; read a token. */ ++ ++ ungetc (c, finput); ++ token = yylex (); ++ if (nextchar >= 0) ++ ungetc (nextchar, finput), nextchar = -1; ++ ++ if (token == CONSTANT ++ && TREE_CODE (yylval.ttype) == INTEGER_CST) ++ { ++ int old_lineno = lineno; ++ /* subtract one, because it is the following line that ++ gets the specified number */ ++ ++ int l = TREE_INT_CST_LOW (yylval.ttype) - 1; ++ ++ /* Is this the last nonwhite stuff on the line? */ ++ c = getc (finput); ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ if (c == '\n') ++ { ++ /* No more: store the line number and check following line. */ ++ lineno = l; ++ return c; ++ } ++ ungetc (c, finput); ++ ++ /* More follows: it must be a string constant (filename). */ ++ ++ token = yylex (); ++ if (nextchar >= 0) ++ ungetc (nextchar, finput), nextchar = -1; ++ if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST) ++ { ++ error ("invalid #line"); ++ goto skipline; ++ } ++ ++ input_filename ++ = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1); ++ strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype)); ++ lineno = l; ++ ++ if (main_input_filename == 0) ++ main_input_filename = input_filename; ++ ++ /* Is this the last nonwhite stuff on the line? */ ++ c = getc (finput); ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ if (c == '\n') ++ return c; ++ ungetc (c, finput); ++ ++ token = yylex (); ++ if (nextchar >= 0) ++ ungetc (nextchar, finput), nextchar = -1; ++ ++ /* `1' after file name means entering new file. ++ `2' after file name means just left a file. */ ++ ++ if (token == CONSTANT ++ && TREE_CODE (yylval.ttype) == INTEGER_CST) ++ { ++ if (TREE_INT_CST_LOW (yylval.ttype) == 1) ++ { ++ struct file_stack *p ++ = (struct file_stack *) xmalloc (sizeof (struct file_stack)); ++ input_file_stack->line = old_lineno; ++ p->next = input_file_stack; ++ p->name = input_filename; ++ input_file_stack = p; ++ input_file_stack_tick++; ++ } ++ else if (input_file_stack->next) ++ { ++ struct file_stack *p = input_file_stack; ++ input_file_stack = p->next; ++ free (p); ++ input_file_stack_tick++; ++ } ++#if 0 ++ else ++ error ("#-lines for entering and leaving files don't match"); ++#endif ++ } ++ } ++ else ++ error ("invalid #-line"); ++ ++ /* skip the rest of this line. */ ++ skipline: ++ if (c == '\n') ++ return c; ++ while ((c = getc (finput)) != EOF && c != '\n'); ++ return c; ++} ++ ++#define isalnum(char) ((char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z') || (char >= '0' && char <= '9')) ++#define isdigit(char) (char >= '0' && char <= '9') ++#define ENDFILE -1 /* token that represents end-of-file */ ++ ++ ++static int ++readescape () ++{ ++ register int c = getc (finput); ++ register int count, code; ++ int firstdig; ++ ++ switch (c) ++ { ++ case 'x': ++ code = 0; ++ count = 0; ++ while (1) ++ { ++ c = getc (finput); ++ if (!(c >= 'a' && c <= 'f') ++ && !(c >= 'A' && c <= 'F') ++ && !(c >= '0' && c <= '9')) ++ { ++ ungetc (c, finput); ++ break; ++ } ++ code *= 16; ++ if (c >= 'a' && c <= 'f') ++ code += c - 'a' + 10; ++ if (c >= 'A' && c <= 'F') ++ code += c - 'A' + 10; ++ if (c >= '0' && c <= '9') ++ code += c - '0'; ++ if (count == 0) ++ firstdig = code; ++ count++; ++ } ++ if (count == 0) ++ error ("\\x used with no following hex digits"); ++ else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node) ++ || (count > 1 ++ && ((1 << (TYPE_PRECISION (integer_type_node) - (count - 1) * 4)) ++ <= firstdig))) ++ warning ("hex escape out of range"); ++ return code; ++ ++ case '0': case '1': case '2': case '3': case '4': ++ case '5': case '6': case '7': ++ code = 0; ++ count = 0; ++ while ((c <= '7') && (c >= '0') && (count++ < 3)) ++ { ++ code = (code * 8) + (c - '0'); ++ c = getc (finput); ++ } ++ ungetc (c, finput); ++ return code; ++ ++ case '\\': case '\'': case '"': ++ return c; ++ ++ case '\n': ++ lineno++; ++ return -1; ++ ++ case 'n': ++ return TARGET_NEWLINE; ++ ++ case 't': ++ return TARGET_TAB; ++ ++ case 'r': ++ return TARGET_CR; ++ ++ case 'f': ++ return TARGET_FF; ++ ++ case 'b': ++ return TARGET_BS; ++ ++ case 'a': ++ return TARGET_BELL; ++ ++ case 'v': ++ return TARGET_VT; ++ ++ case 'E': ++ return 033; ++ ++ case '?': ++ /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */ ++ case '(': ++ case '{': ++ case '[': ++ return c; ++ } ++ if (c >= 040 && c <= 0177) ++ warning ("unknown escape sequence `\\%c'", c); ++ else ++ warning ("unknown escape sequence: `\\' followed by char code 0x%x", c); ++ return c; ++} ++ ++void ++yyerror (string) ++ char *string; ++{ ++ char buf[200]; ++ ++ strcpy (buf, string); ++ ++ /* We can't print string and character constants well ++ because the token_buffer contains the result of processing escapes. */ ++ if (end_of_file) ++ strcat (buf, " at end of input"); ++ else if (token_buffer[0] == 0) ++ strcat (buf, " at null character"); ++ else if (token_buffer[0] == '"') ++ strcat (buf, " before string constant"); ++ else if (token_buffer[0] == '\'') ++ strcat (buf, " before character constant"); ++ else if (token_buffer[0] < 040 || token_buffer[0] >= 0177) ++ sprintf (buf + strlen (buf), " before character 0%o", token_buffer[0]); ++ else ++ strcat (buf, " before `%s'"); ++ ++ error (buf, token_buffer); ++} ++ ++static int ++yylex () ++{ ++ register int c; ++ register char *p; ++ register int value; ++ int wide_flag = 0; ++ ++ if (nextchar >= 0) ++ c = nextchar, nextchar = -1; ++ else ++ c = getc (finput); ++ ++ /* Effectively do c = skip_white_space (c) ++ but do it faster in the usual cases. */ ++ while (1) ++ switch (c) ++ { ++ case ' ': ++ case '\t': ++ case '\f': ++ case '\r': ++ case '\v': ++ case '\b': ++ c = getc (finput); ++ break; ++ ++ case '\n': ++ case '/': ++ case '\\': ++ c = skip_white_space (c); ++ default: ++ goto found_nonwhite; ++ } ++ found_nonwhite: ++ ++ token_buffer[0] = c; ++ token_buffer[1] = 0; ++ ++/* yylloc.first_line = lineno; */ ++ ++ switch (c) ++ { ++ case EOF: ++ end_of_file = 1; ++ token_buffer[0] = 0; ++ value = ENDFILE; ++ break; ++ ++ case '$': ++ if (dollars_in_ident) ++ goto letter; ++ return '$'; ++ ++ case 'L': ++ /* Capital L may start a wide-string or wide-character constant. */ ++ { ++ register int c = getc (finput); ++ if (c == '\'') ++ { ++ wide_flag = 1; ++ goto char_constant; ++ } ++ if (c == '"') ++ { ++ wide_flag = 1; ++ goto string_constant; ++ } ++ ungetc (c, finput); ++ } ++ ++ case 'A': case 'B': case 'C': case 'D': case 'E': ++ case 'F': case 'G': case 'H': case 'I': case 'J': ++ case 'K': case 'M': case 'N': case 'O': ++ case 'P': case 'Q': case 'R': case 'S': case 'T': ++ case 'U': case 'V': case 'W': case 'X': case 'Y': ++ case 'Z': ++ case 'a': case 'b': case 'c': case 'd': case 'e': ++ case 'f': case 'g': case 'h': case 'i': case 'j': ++ case 'k': case 'l': case 'm': case 'n': case 'o': ++ case 'p': case 'q': case 'r': case 's': case 't': ++ case 'u': case 'v': case 'w': case 'x': case 'y': ++ case 'z': ++ case '_': ++ letter: ++ p = token_buffer; ++ while (isalnum (c) || c == '_' || c == '$') ++ { ++ if (p >= token_buffer + maxtoken) ++ p = extend_token_buffer (p); ++ if (c == '$' && ! dollars_in_ident) ++ break; ++ ++ *p++ = c; ++ c = getc (finput); ++ } ++ ++ *p = 0; ++ nextchar = c; ++ ++ value = IDENTIFIER; ++ yylval.itype = 0; ++ ++ /* Try to recognize a keyword. Uses minimum-perfect hash function */ ++ ++ { ++ register struct resword *ptr; ++ ++ if (ptr = is_reserved_word (token_buffer, p - token_buffer)) ++ { ++ if (ptr->rid) ++ yylval.ttype = ridpointers[(int) ptr->rid]; ++ if ((! flag_no_asm ++ /* -fno-asm means don't recognize the non-ANSI keywords. */ ++ || ((int) ptr->token != ASM ++ && (int) ptr->token != TYPEOF ++ && ptr->rid != RID_INLINE) ++ /* Recognize __asm and __inline despite -fno-asm. */ ++ || token_buffer[0] == '_') ++ /* -ftraditional means don't recognize nontraditional keywords ++ typeof, const, volatile, signed or inline. */ ++ && (! flag_traditional ++ || ((int) ptr->token != TYPE_QUAL ++ && (int) ptr->token != TYPEOF ++ && ptr->rid != RID_SIGNED ++ && ptr->rid != RID_INLINE) ++ /* Recognize __inline, etc. despite -ftraditional. */ ++ || token_buffer[0] == '_')) ++ { ++ value = (int) ptr->token; ++ /* Even if we decided to recognize asm, still perhaps warn. */ ++ if (pedantic ++ && (value == ASM || value == TYPEOF ++ || ptr->rid == RID_INLINE) ++ && token_buffer[0] != '_') ++ warning ("ANSI does not permit the keyword `%s'", ++ token_buffer); ++ } ++ } ++ } ++ ++ /* If we did not find a keyword, look for an identifier ++ (or a typename). */ ++ ++ if (value == IDENTIFIER) ++ { ++ yylval.ttype = get_identifier (token_buffer); ++ lastiddecl = lookup_name (yylval.ttype); ++ ++ if (lastiddecl != 0 && TREE_CODE (lastiddecl) == TYPE_DECL) ++ value = TYPENAME; ++ } ++ ++ break; ++ ++ case '0': case '1': case '2': case '3': case '4': ++ case '5': case '6': case '7': case '8': case '9': ++ case '.': ++ { ++ int base = 10; ++ int count = 0; ++ int largest_digit = 0; ++ int numdigits = 0; ++ /* for multi-precision arithmetic, ++ we store only 8 live bits in each short, ++ giving us 64 bits of reliable precision */ ++ short shorts[8]; ++ int overflow = 0; ++ ++ enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag ++ = NOT_FLOAT; ++ ++ for (count = 0; count < 8; count++) ++ shorts[count] = 0; ++ ++ p = token_buffer; ++ *p++ = c; ++ ++ if (c == '0') ++ { ++ *p++ = (c = getc (finput)); ++ if ((c == 'x') || (c == 'X')) ++ { ++ base = 16; ++ *p++ = (c = getc (finput)); ++ } ++ else ++ { ++ base = 8; ++ numdigits++; ++ } ++ } ++ ++ /* Read all the digits-and-decimal-points. */ ++ ++ while (c == '.' ++ || (isalnum (c) && (c != 'l') && (c != 'L') ++ && (c != 'u') && (c != 'U') ++ && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F'))))) ++ { ++ if (c == '.') ++ { ++ if (base == 16) ++ error ("floating constant may not be in radix 16"); ++ if (floatflag == AFTER_POINT) ++ { ++ error ("malformed floating constant"); ++ floatflag = TOO_MANY_POINTS; ++ } ++ else ++ floatflag = AFTER_POINT; ++ ++ base = 10; ++ *p++ = c = getc (finput); ++ /* Accept '.' as the start of a floating-point number ++ only when it is followed by a digit. ++ Otherwise, unread the following non-digit ++ and use the '.' as a structural token. */ ++ if (p == token_buffer + 2 && !isdigit (c)) ++ { ++ if (c == '.') ++ { ++ c = getc (finput); ++ if (c == '.') ++ { ++ *p++ = c; ++ *p = 0; ++ return ELLIPSIS; ++ } ++ error ("parse error at `..'"); ++ } ++ ungetc (c, finput); ++ token_buffer[1] = 0; ++ value = '.'; ++ goto done; ++ } ++ } ++ else ++ { ++ /* It is not a decimal point. ++ It should be a digit (perhaps a hex digit). */ ++ ++ if (isdigit (c)) ++ { ++ c = c - '0'; ++ } ++ else if (base <= 10) ++ { ++ if ((c&~040) == 'E') ++ { ++ base = 10; ++ floatflag = AFTER_POINT; ++ break; /* start of exponent */ ++ } ++ error ("nondigits in number and not hexadecimal"); ++ c = 0; ++ } ++ else if (c >= 'a') ++ { ++ c = c - 'a' + 10; ++ } ++ else ++ { ++ c = c - 'A' + 10; ++ } ++ if (c >= largest_digit) ++ largest_digit = c; ++ numdigits++; ++ ++ for (count = 0; count < 8; count++) ++ { ++ shorts[count] *= base; ++ if (count) ++ { ++ shorts[count] += (shorts[count-1] >> 8); ++ shorts[count-1] &= (1<<8)-1; ++ } ++ else shorts[0] += c; ++ } ++ ++ if (shorts[7] >= 1<<8 ++ || shorts[7] < - (1 << 8)) ++ overflow = TRUE; ++ ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = (c = getc (finput)); ++ } ++ } ++ ++ if (numdigits == 0) ++ error ("numeric constant with no digits"); ++ ++ if (largest_digit >= base) ++ error ("numeric constant contains digits beyond the radix"); ++ ++ /* Remove terminating char from the token buffer and delimit the string */ ++ *--p = 0; ++ ++ if (floatflag != NOT_FLOAT) ++ { ++ tree type = double_type_node; ++ char f_seen = 0; ++ char l_seen = 0; ++ REAL_VALUE_TYPE value; ++ ++ /* Read explicit exponent if any, and put it in tokenbuf. */ ++ ++ if ((c == 'e') || (c == 'E')) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ if ((c == '+') || (c == '-')) ++ { ++ *p++ = c; ++ c = getc (finput); ++ } ++ if (! isdigit (c)) ++ error ("floating constant exponent has no digits"); ++ while (isdigit (c)) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ } ++ ++ *p = 0; ++ errno = 0; ++ value = REAL_VALUE_ATOF (token_buffer); ++#ifdef ERANGE ++ if (errno == ERANGE && !flag_traditional) ++ { ++ char *p1 = token_buffer; ++ /* Check for "0.0" and variants; ++ Sunos 4 spuriously returns ERANGE for them. */ ++ while (*p1 == '0') p1++; ++ if (*p1 == '.') ++ { ++ p1++; ++ while (*p1 == '0') p1++; ++ } ++ if (*p1 == 'e' || *p1 == 'E') ++ { ++ /* with significand==0, ignore the exponent */ ++ p1++; ++ while (*p1 != 0) p1++; ++ } ++ /* ERANGE is also reported for underflow, ++ so test the value to distinguish overflow from that. */ ++ if (*p1 != 0 && (value > 1.0 || value < -1.0)) ++ warning ("floating point number exceeds range of `double'"); ++ } ++#endif ++ ++ /* Read the suffixes to choose a data type. */ ++ while (1) ++ { ++ if (c == 'f' || c == 'F') ++ { ++ float floater; ++ if (f_seen) ++ error ("two `f's in floating constant"); ++ f_seen = 1; ++ type = float_type_node; ++ floater = value; ++ value = floater; ++ } ++ else if (c == 'l' || c == 'L') ++ { ++ if (l_seen) ++ error ("two `l's in floating constant"); ++ l_seen = 1; ++ type = long_double_type_node; ++ } ++ else ++ { ++ if (isalnum (c)) ++ { ++ error ("garbage at end of number"); ++ while (isalnum (c)) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ } ++ break; ++ } ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ ++ /* Create a node with determined type and value. */ ++ yylval.ttype = build_real (type, value); ++ ++ ungetc (c, finput); ++ *p = 0; ++ } ++ else ++ { ++ tree type; ++ int spec_unsigned = 0; ++ int spec_long = 0; ++ int spec_long_long = 0; ++ ++ while (1) ++ { ++ if (c == 'u' || c == 'U') ++ { ++ if (spec_unsigned) ++ error ("two `u's in integer constant"); ++ spec_unsigned = 1; ++ } ++ else if (c == 'l' || c == 'L') ++ { ++ if (spec_long) ++ { ++ if (spec_long_long) ++ error ("three `l's in integer constant"); ++ else if (pedantic) ++ warning ("ANSI C forbids long long integer constants"); ++ spec_long_long = 1; ++ } ++ spec_long = 1; ++ } ++ else ++ { ++ if (isalnum (c)) ++ { ++ error ("garbage at end of number"); ++ while (isalnum (c)) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ } ++ break; ++ } ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ ++ ungetc (c, finput); ++ ++ if ((overflow || shorts[7] || shorts[6] || shorts[5] || shorts[4]) ++ && !spec_long_long) ++ warning ("integer constant out of range"); ++ ++ /* If it won't fit in a signed long long, make it unsigned. ++ We can't distinguish based on the tree node because ++ any integer constant fits any long long type. */ ++ if (shorts[7] >= (1<<8)) ++ spec_unsigned = 1; ++ ++ /* This is simplified by the fact that our constant ++ is always positive. */ ++ /* The casts in the following statement should not be ++ needed, but they get around bugs in some C compilers. */ ++ yylval.ttype ++ = (build_int_2 ++ ((((long)shorts[3]<<24) + ((long)shorts[2]<<16) ++ + ((long)shorts[1]<<8) + (long)shorts[0]), ++ (spec_long_long ++ ? (((long)shorts[7]<<24) + ((long)shorts[6]<<16) ++ + ((long)shorts[5]<<8) + (long)shorts[4]) ++ : 0))); ++ ++ if (!spec_long && !spec_unsigned ++ && int_fits_type_p (yylval.ttype, integer_type_node)) ++ type = integer_type_node; ++ ++ else if (!spec_long && (base != 10 || spec_unsigned) ++ && int_fits_type_p (yylval.ttype, unsigned_type_node)) ++ type = unsigned_type_node; ++ ++ else if (!spec_unsigned && !spec_long_long ++ && int_fits_type_p (yylval.ttype, long_integer_type_node)) ++ type = long_integer_type_node; ++ ++ else if (! spec_long_long ++ && int_fits_type_p (yylval.ttype, ++ long_unsigned_type_node)) ++ type = long_unsigned_type_node; ++ ++ else if (! spec_unsigned ++ && int_fits_type_p (yylval.ttype, ++ long_long_integer_type_node)) ++ type = long_long_integer_type_node; ++ ++ else if (int_fits_type_p (yylval.ttype, ++ long_long_unsigned_type_node)) ++ type = long_long_unsigned_type_node; ++ ++ else ++ { ++ type = long_long_integer_type_node; ++ warning ("integer constant out of range"); ++ } ++ ++ TREE_TYPE (yylval.ttype) = type; ++ *p = 0; ++ } ++ ++ value = CONSTANT; break; ++ } ++ ++ case '\'': ++ char_constant: ++ { ++ register int result = 0; ++ register num_chars = 0; ++ int width = TYPE_PRECISION (char_type_node); ++ int max_chars; ++ ++ if (wide_flag) width = TYPE_PRECISION (integer_type_node); ++ ++ max_chars = TYPE_PRECISION (integer_type_node) / width; ++ ++ while (1) ++ { ++ tryagain: ++ ++ c = getc (finput); ++ ++ if (c == '\'' || c == EOF) ++ break; ++ ++ if (c == '\\') ++ { ++ c = readescape (); ++ if (c < 0) ++ goto tryagain; ++ if (width < HOST_BITS_PER_INT ++ && (unsigned) c >= (1 << width)) ++ warning ("escape sequence out of range for character"); ++ } ++ else if (c == '\n') ++ { ++ if (pedantic) ++ warning ("ANSI C forbids newline in character constant"); ++ lineno++; ++ } ++ ++ num_chars++; ++ if (num_chars > maxtoken - 4) ++ extend_token_buffer (token_buffer); ++ ++ token_buffer[num_chars] = c; ++ ++ /* Merge character into result; ignore excess chars. */ ++ if (num_chars < max_chars + 1) ++ { ++ if (width < HOST_BITS_PER_INT) ++ result = (result << width) | (c & ((1 << width) - 1)); ++ else ++ result = c; ++ } ++ } ++ ++ token_buffer[num_chars + 1] = '\''; ++ token_buffer[num_chars + 2] = 0; ++ ++ if (c != '\'') ++ error ("malformatted character constant"); ++ else if (num_chars == 0) ++ error ("empty character constant"); ++ else if (num_chars > max_chars) ++ { ++ num_chars = max_chars; ++ error ("character constant too long"); ++ } ++ else if (num_chars != 1 && ! flag_traditional) ++ warning ("multi-character character constant"); ++ ++ /* If char type is signed, sign-extend the constant. */ ++ if (! wide_flag) ++ { ++ int num_bits = num_chars * width; ++ if (TREE_UNSIGNED (char_type_node) ++ || ((result >> (num_bits - 1)) & 1) == 0) ++ yylval.ttype ++ = build_int_2 (result & ((unsigned) ~0 ++ >> (HOST_BITS_PER_INT - num_bits)), ++ 0); ++ else ++ yylval.ttype ++ = build_int_2 (result | ~((unsigned) ~0 ++ >> (HOST_BITS_PER_INT - num_bits)), ++ -1); ++ } ++ else ++ yylval.ttype = build_int_2 (result, 0); ++ ++ TREE_TYPE (yylval.ttype) = integer_type_node; ++ value = CONSTANT; break; ++ } ++ ++ case '"': ++ string_constant: ++ { ++ int *widep; ++ ++ c = getc (finput); ++ p = token_buffer + 1; ++ ++ if (wide_flag) ++ widep = wide_buffer; ++ ++ while (c != '"' && c >= 0) ++ { ++ if (c == '\\') ++ { ++ c = readescape (); ++ if (c < 0) ++ goto skipnewline; ++ if (!wide_flag && c >= (1 << TYPE_PRECISION (char_type_node))) ++ warning ("escape sequence out of range for character"); ++ } ++ else if (c == '\n') ++ { ++ if (pedantic) ++ warning ("ANSI C forbids newline in string constant"); ++ lineno++; ++ } ++ ++ /* Store the char in C into the appropriate buffer. */ ++ ++ if (wide_flag) ++ { ++ if (widep == wide_buffer + max_wide) ++ { ++ int n = widep - wide_buffer; ++ max_wide *= 2; ++ wide_buffer ++ = (int *) xrealloc (wide_buffer, ++ (max_wide + 1) * UNITS_PER_WORD); ++ widep = wide_buffer + n; ++ } ++ *widep++ = c; ++ } ++ else ++ { ++ if (p == token_buffer + maxtoken) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ } ++ ++ skipnewline: ++ c = getc (finput); ++ } ++ ++ /* We have read the entire constant. ++ Construct a STRING_CST for the result. */ ++ ++ if (wide_flag) ++ { ++ /* If this is a L"..." wide-string, make a vector ++ of the ints in wide_buffer. */ ++ *widep = 0; ++ /* We have not implemented the case where `int' ++ on the target and on the execution machine differ in size. */ ++ if (TYPE_PRECISION (integer_type_node) ++ != sizeof (int) * BITS_PER_UNIT) ++ abort (); ++ yylval.ttype ++ = build_string ((widep - wide_buffer + 1) * sizeof (int), ++ wide_buffer); ++ TREE_TYPE (yylval.ttype) = int_array_type_node; ++ } ++ else ++ { ++ *p = 0; ++ yylval.ttype = build_string (p - token_buffer, token_buffer + 1); ++ TREE_TYPE (yylval.ttype) = char_array_type_node; ++ } ++ ++ *p++ = '"'; ++ *p = 0; ++ ++ value = STRING; break; ++ } ++ ++ case '+': ++ case '-': ++ case '&': ++ case '|': ++ case '<': ++ case '>': ++ case '*': ++ case '/': ++ case '%': ++ case '^': ++ case '!': ++ case '=': ++ { ++ register int c1; ++ ++ combine: ++ ++ switch (c) ++ { ++ case '+': ++ yylval.code = PLUS_EXPR; break; ++ case '-': ++ yylval.code = MINUS_EXPR; break; ++ case '&': ++ yylval.code = BIT_AND_EXPR; break; ++ case '|': ++ yylval.code = BIT_IOR_EXPR; break; ++ case '*': ++ yylval.code = MULT_EXPR; break; ++ case '/': ++ yylval.code = TRUNC_DIV_EXPR; break; ++ case '%': ++ yylval.code = TRUNC_MOD_EXPR; break; ++ case '^': ++ yylval.code = BIT_XOR_EXPR; break; ++ case LSHIFT: ++ yylval.code = LSHIFT_EXPR; break; ++ case RSHIFT: ++ yylval.code = RSHIFT_EXPR; break; ++ case '<': ++ yylval.code = LT_EXPR; break; ++ case '>': ++ yylval.code = GT_EXPR; break; ++ } ++ ++ token_buffer[1] = c1 = getc (finput); ++ token_buffer[2] = 0; ++ ++ if (c1 == '=') ++ { ++ switch (c) ++ { ++ case '<': ++ value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done; ++ case '>': ++ value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done; ++ case '!': ++ value = EQCOMPARE; yylval.code = NE_EXPR; goto done; ++ case '=': ++ value = EQCOMPARE; yylval.code = EQ_EXPR; goto done; ++ } ++ value = ASSIGN; goto done; ++ } ++ else if (c == c1) ++ switch (c) ++ { ++ case '+': ++ value = PLUSPLUS; goto done; ++ case '-': ++ value = MINUSMINUS; goto done; ++ case '&': ++ value = ANDAND; goto done; ++ case '|': ++ value = OROR; goto done; ++ case '<': ++ c = LSHIFT; ++ goto combine; ++ case '>': ++ c = RSHIFT; ++ goto combine; ++ } ++ else if ((c == '-') && (c1 == '>')) ++ { value = POINTSAT; goto done; } ++ ungetc (c1, finput); ++ token_buffer[1] = 0; ++ ++ if ((c == '<') || (c == '>')) ++ value = ARITHCOMPARE; ++ else value = c; ++ goto done; ++ } ++ ++ case 0: ++ /* Don't make yyparse think this is eof. */ ++ value = 1; ++ break; ++ ++ default: ++ value = c; ++ } ++ ++done: ++/* yylloc.last_line = lineno; */ ++ ++ return value; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-parse.y alliance/genview/src/gcc-1.42/c-parse.y +--- alliance-5.0/genview/src/gcc-1.42/c-parse.y 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-parse.y 2002-04-11 09:14:42.000000000 +0200 +@@ -0,0 +1,2895 @@ ++/* YACC parser for C syntax. ++ Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* To whomever it may concern: I have heard that such a thing was once ++written by AT&T, but I have never seen it. */ ++ ++%expect 8 ++ ++/* These are the 8 conflicts you should get in parse.output; ++ the state numbers may vary if minor changes in the grammar are made. ++ ++State 41 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 92 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 99 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 103 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 119 contains 1 shift/reduce conflict. (See comment at component_decl.) ++State 183 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 193 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++State 199 contains 1 shift/reduce conflict. (Two ways to recover from error.) ++*/ ++ ++%{ ++#include "config.h" ++#include "tree.h" ++#include "input.h" ++#include "c-parse.h" ++#include "c-tree.h" ++ ++#include ++#include ++ ++#ifndef errno ++extern int errno; ++#endif ++ ++void yyerror (); ++ ++/* Cause the `yydebug' variable to be defined. */ ++#define YYDEBUG 1 ++%} ++ ++%start program ++ ++%union {long itype; tree ttype; enum tree_code code; } ++ ++/* All identifiers that are not reserved words ++ and are not declared typedefs in the current block */ ++%token IDENTIFIER ++ ++/* All identifiers that are declared typedefs in the current block. ++ In some contexts, they are treated just like IDENTIFIER, ++ but they can also serve as typespecs in declarations. */ ++%token TYPENAME ++ ++/* Reserved words that specify storage class. ++ yylval contains an IDENTIFIER_NODE which indicates which one. */ ++%token SCSPEC ++ ++/* Reserved words that specify type. ++ yylval contains an IDENTIFIER_NODE which indicates which one. */ ++%token TYPESPEC ++ ++/* Reserved words that qualify type: "const" or "volatile". ++ yylval contains an IDENTIFIER_NODE which indicates which one. */ ++%token TYPE_QUAL ++ ++/* Character or numeric constants. ++ yylval is the node for the constant. */ ++%token CONSTANT ++ ++/* String constants in raw form. ++ yylval is a STRING_CST node. */ ++%token STRING ++ ++/* "...", used for functions with variable arglists. */ ++%token ELLIPSIS ++ ++/* the reserved words */ ++%token SIZEOF ENUM STRUCT UNION IF ELSE WHILE DO FOR SWITCH CASE DEFAULT ++%token BREAK CONTINUE RETURN GOTO ASM TYPEOF ALIGNOF ++%token ATTRIBUTE ++ ++/* Add precedence rules to solve dangling else s/r conflict */ ++%nonassoc IF ++%nonassoc ELSE ++ ++/* Define the operator tokens and their precedences. ++ The value is an integer because, if used, it is the tree code ++ to use in the expression made from the operator. */ ++ ++%right ASSIGN '=' ++%right '?' ':' ++%left OROR ++%left ANDAND ++%left '|' ++%left '^' ++%left '&' ++%left EQCOMPARE ++%left ARITHCOMPARE ++%left LSHIFT RSHIFT ++%left '+' '-' ++%left '*' '/' '%' ++%right UNARY PLUSPLUS MINUSMINUS ++%left HYPERUNARY ++%left POINTSAT '.' '(' '[' ++ ++%type unop ++ ++%type identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist exprlist ++%type expr_no_commas cast_expr unary_expr primary string STRING ++%type typed_declspecs reserved_declspecs ++%type typed_typespecs reserved_typespecquals ++%type declmods typespec typespecqual_reserved ++%type SCSPEC TYPESPEC TYPE_QUAL nonempty_type_quals maybe_type_qual ++%type initdecls notype_initdecls initdcl notype_initdcl ++%type init initlist maybeasm ++%type asm_operands nonnull_asm_operands asm_operand asm_clobbers ++%type maybe_attribute attribute_list attrib ++ ++%type compstmt ++ ++%type declarator ++%type notype_declarator after_type_declarator ++%type parm_declarator ++ ++%type structsp component_decl_list component_decl_list2 ++%type component_decl components component_declarator ++%type enumlist enumerator ++%type typename absdcl absdcl1 type_quals ++%type xexpr parms parm identifiers ++ ++%type parmlist parmlist_1 parmlist_2 ++%type parmlist_or_identifiers parmlist_or_identifiers_1 ++ ++%type setspecs ++ ++%{ ++/* the declaration found for the last IDENTIFIER token read in. ++ yylex must look this up to detect typedefs, which get token type TYPENAME, ++ so it is left around in case the identifier is not a typedef but is ++ used in a context which makes it a reference to a variable. */ ++static tree lastiddecl; ++ ++static tree make_pointer_declarator (); ++static tree combine_strings (); ++static void reinit_parse_for_function (); ++ ++/* List of types and structure classes of the current declaration. */ ++tree current_declspecs; ++ ++/* Stack of saved values of current_declspecs. */ ++tree declspec_stack; ++ ++int undeclared_variable_notice; /* 1 if we explained undeclared var errors. */ ++ ++static int yylex (); ++%} ++ ++%% ++program: /* empty */ ++ | extdefs ++ ; ++ ++/* the reason for the strange actions in this rule ++ is so that notype_initdecls when reached via datadef ++ can find a valid list of type and sc specs in $0. */ ++ ++extdefs: ++ {$$ = NULL_TREE; } extdef ++ | extdefs {$$ = NULL_TREE; } extdef ++ ; ++ ++extdef: ++ fndef ++ | datadef ++ | ASM '(' string ')' ';' ++ { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); ++ assemble_asm ($3); } ++ ; ++ ++datadef: ++ setspecs notype_initdecls ';' ++ { if (pedantic) ++ error ("ANSI C forbids data definition lacking type or storage class"); ++ else if (!flag_traditional) ++ warning ("data definition lacks type or storage class"); } ++ | declmods setspecs notype_initdecls ';' ++ {} ++ | typed_declspecs setspecs initdecls ';' ++ {} ++ | declmods ';' ++ { error ("empty declaration"); } ++ | typed_declspecs ';' ++ { shadow_tag ($1); } ++ | error ';' ++ | error '}' ++ | ';' ++ { if (pedantic) ++ warning ("ANSI C does not allow extra `;' outside of a function"); } ++ ; ++ ++fndef: ++ typed_declspecs setspecs declarator ++ { if (! start_function ($1, $3)) ++ YYFAIL; ++ reinit_parse_for_function (); } ++ xdecls ++ { store_parm_decls (); } ++ compstmt_or_error ++ { finish_function (lineno); } ++ | typed_declspecs setspecs declarator error ++ { } ++ | declmods setspecs notype_declarator ++ { if (! start_function ($1, $3)) ++ YYFAIL; ++ reinit_parse_for_function (); } ++ xdecls ++ { store_parm_decls (); } ++ compstmt_or_error ++ { finish_function (lineno); } ++ | declmods setspecs notype_declarator error ++ { } ++ | setspecs notype_declarator ++ { if (! start_function (0, $2)) ++ YYFAIL; ++ reinit_parse_for_function (); } ++ xdecls ++ { store_parm_decls (); } ++ compstmt_or_error ++ { finish_function (lineno); } ++ | setspecs notype_declarator error ++ { } ++ ; ++ ++identifier: ++ IDENTIFIER ++ | TYPENAME ++ ; ++ ++unop: '&' ++ { $$ = ADDR_EXPR; } ++ | '-' ++ { $$ = NEGATE_EXPR; } ++ | '+' ++ { $$ = CONVERT_EXPR; } ++ | PLUSPLUS ++ { $$ = PREINCREMENT_EXPR; } ++ | MINUSMINUS ++ { $$ = PREDECREMENT_EXPR; } ++ | '~' ++ { $$ = BIT_NOT_EXPR; } ++ | '!' ++ { $$ = TRUTH_NOT_EXPR; } ++ ; ++ ++expr: nonnull_exprlist ++ { $$ = build_compound_expr ($1); } ++ ; ++ ++exprlist: ++ /* empty */ ++ { $$ = NULL_TREE; } ++ | nonnull_exprlist ++ ; ++ ++nonnull_exprlist: ++ expr_no_commas ++ { $$ = build_tree_list (NULL_TREE, $1); } ++ | nonnull_exprlist ',' expr_no_commas ++ { chainon ($1, build_tree_list (NULL_TREE, $3)); } ++ ; ++ ++unary_expr: ++ primary ++ | '*' cast_expr %prec UNARY ++ { $$ = build_indirect_ref ($2, "unary *"); } ++ | unop cast_expr %prec UNARY ++ { $$ = build_unary_op ($1, $2, 0); } ++ | SIZEOF unary_expr %prec UNARY ++ { if (TREE_CODE ($2) == COMPONENT_REF ++ && TREE_PACKED (TREE_OPERAND ($2, 1))) ++ error ("`sizeof' applied to a bit-field"); ++ /* ANSI says arrays and functions are converted inside comma. ++ But we can't really convert them in build_compound_expr ++ because that would break commas in lvalues. ++ So do the conversion here if operand was a comma. */ ++ if (TREE_CODE ($2) == COMPOUND_EXPR ++ && (TREE_CODE (TREE_TYPE ($2)) == ARRAY_TYPE ++ || TREE_CODE (TREE_TYPE ($2)) == FUNCTION_TYPE)) ++ $2 = default_conversion ($2); ++ $$ = c_sizeof (TREE_TYPE ($2)); } ++ | SIZEOF '(' typename ')' %prec HYPERUNARY ++ { $$ = c_sizeof (groktypename ($3)); } ++ | ALIGNOF unary_expr %prec UNARY ++ { if (TREE_CODE ($2) == COMPONENT_REF ++ && TREE_PACKED (TREE_OPERAND ($2, 1))) ++ error ("`__alignof' applied to a bit-field"); ++ if (TREE_CODE ($2) == INDIRECT_REF) ++ { ++ tree t = TREE_OPERAND ($2, 0); ++ tree best = t; ++ int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); ++ while (TREE_CODE (t) == NOP_EXPR ++ && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE) ++ { ++ int thisalign; ++ t = TREE_OPERAND (t, 0); ++ thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); ++ if (thisalign > bestalign) ++ best = t, bestalign = thisalign; ++ } ++ $$ = c_alignof (TREE_TYPE (TREE_TYPE (best))); ++ } ++ else ++ { ++ /* ANSI says arrays and fns are converted inside comma. ++ But we can't convert them in build_compound_expr ++ because that would break commas in lvalues. ++ So do the conversion here if operand was a comma. */ ++ if (TREE_CODE ($2) == COMPOUND_EXPR ++ && (TREE_CODE (TREE_TYPE ($2)) == ARRAY_TYPE ++ || TREE_CODE (TREE_TYPE ($2)) == FUNCTION_TYPE)) ++ $2 = default_conversion ($2); ++ $$ = c_alignof (TREE_TYPE ($2)); ++ } ++ } ++ | ALIGNOF '(' typename ')' %prec HYPERUNARY ++ { $$ = c_alignof (groktypename ($3)); } ++ ; ++ ++cast_expr: ++ unary_expr ++ | '(' typename ')' cast_expr %prec UNARY ++ { tree type = groktypename ($2); ++ $$ = build_c_cast (type, $4); } ++ | '(' typename ')' '{' initlist maybecomma '}' %prec UNARY ++ { tree type = groktypename ($2); ++ if (pedantic) ++ warning ("ANSI C forbids constructor expressions"); ++ $$ = digest_init (type, build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($5)), 0); ++ if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0) ++ { ++ int failure = complete_array_type (type, $$, 1); ++ if (failure) ++ abort (); ++ } ++ } ++ ; ++ ++expr_no_commas: ++ cast_expr ++ | expr_no_commas '+' expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas '-' expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas '*' expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas '/' expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas '%' expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas LSHIFT expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas RSHIFT expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas ARITHCOMPARE expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas EQCOMPARE expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas '&' expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas '|' expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas '^' expr_no_commas ++ { $$ = build_binary_op ($2, $1, $3); } ++ | expr_no_commas ANDAND expr_no_commas ++ { $$ = build_binary_op (TRUTH_ANDIF_EXPR, $1, $3); } ++ | expr_no_commas OROR expr_no_commas ++ { $$ = build_binary_op (TRUTH_ORIF_EXPR, $1, $3); } ++ | expr_no_commas '?' xexpr ':' expr_no_commas ++ { $$ = build_conditional_expr ($1, $3, $5); } ++ | expr_no_commas '=' expr_no_commas ++ { $$ = build_modify_expr ($1, NOP_EXPR, $3); } ++ | expr_no_commas ASSIGN expr_no_commas ++ { $$ = build_modify_expr ($1, $2, $3); } ++ ; ++ ++primary: ++ IDENTIFIER ++ { $$ = lastiddecl; ++ if (!$$ || $$ == error_mark_node) ++ { ++ if (yychar == YYEMPTY) ++ yychar = YYLEX; ++ if (yychar == '(') ++ { ++ $$ = implicitly_declare ($1); ++ assemble_external ($$); ++ TREE_USED ($$) = 1; ++ } ++ else if (current_function_decl == 0) ++ { ++ error ("`%s' undeclared, outside of functions", ++ IDENTIFIER_POINTER ($1)); ++ $$ = error_mark_node; ++ } ++ else ++ { ++ if (IDENTIFIER_GLOBAL_VALUE ($1) != error_mark_node ++ || IDENTIFIER_ERROR_LOCUS ($1) != current_function_decl) ++ { ++ error ("`%s' undeclared (first use this function)", ++ IDENTIFIER_POINTER ($1)); ++ ++ if (! undeclared_variable_notice) ++ { ++ error ("(Each undeclared identifier is reported only once"); ++ error ("for each function it appears in.)"); ++ undeclared_variable_notice = 1; ++ } ++ } ++ $$ = error_mark_node; ++ /* Prevent repeated error messages. */ ++ IDENTIFIER_GLOBAL_VALUE ($1) = error_mark_node; ++ IDENTIFIER_ERROR_LOCUS ($1) = current_function_decl; ++ } ++ } ++ else if (! TREE_USED ($$)) ++ { ++ if (TREE_EXTERNAL ($$)) ++ assemble_external ($$); ++ TREE_USED ($$) = 1; ++ } ++ if (TREE_CODE ($$) == CONST_DECL) ++ $$ = DECL_INITIAL ($$); ++ } ++ | CONSTANT ++ | string ++ { $$ = combine_strings ($1); } ++ | '(' expr ')' ++ { $$ = $2; } ++ | '(' error ')' ++ { $$ = error_mark_node; } ++ | '(' ++ { if (current_function_decl == 0) ++ { ++ error ("braced-group within expression allowed only inside a function"); ++ YYFAIL; ++ } ++ keep_next_level (); ++ $$ = expand_start_stmt_expr (); } ++ compstmt ')' ++ { tree rtl_exp; ++ if (pedantic) ++ warning ("ANSI C forbids braced-groups within expressions"); ++ rtl_exp = expand_end_stmt_expr ($2); ++ $$ = $3; ++ TREE_USED ($$) = 0; ++ /* Since the statements have side effects, ++ consider this volatile. */ ++ TREE_VOLATILE ($$) = 1; ++ TREE_TYPE ($$) = TREE_TYPE (rtl_exp); ++ STMT_BODY ($$) = rtl_exp; } ++ | primary '(' exprlist ')' %prec '.' ++ { $$ = build_function_call ($1, $3); } ++ | primary '[' expr ']' %prec '.' ++ { $$ = build_array_ref ($1, $3); } ++ | primary '.' identifier ++ { $$ = build_component_ref ($1, $3); } ++ | primary POINTSAT identifier ++ { $$ = build_component_ref (build_indirect_ref ($1, "->"), $3); } ++ | primary PLUSPLUS ++ { $$ = build_unary_op (POSTINCREMENT_EXPR, $1, 0); } ++ | primary MINUSMINUS ++ { $$ = build_unary_op (POSTDECREMENT_EXPR, $1, 0); } ++ ; ++ ++/* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it. */ ++string: ++ STRING ++ | string STRING ++ { $$ = chainon ($1, $2); } ++ ; ++ ++xdecls: ++ /* empty */ ++ | decls ++ ; ++ ++decls: ++ decl ++ | errstmt ++ | decls decl ++ | decl errstmt ++ ; ++ ++/* records the type and storage class specs to use for processing ++ the declarators that follow. ++ Maintains a stack of outer-level values of current_declspecs, ++ for the sake of parm declarations nested in function declarators. */ ++setspecs: /* empty */ ++ { $$ = suspend_momentary (); ++ declspec_stack = tree_cons (0, current_declspecs, ++ declspec_stack); ++ current_declspecs = $0; } ++ ; ++ ++decl: ++ typed_declspecs setspecs initdecls ';' ++ { current_declspecs = TREE_VALUE (declspec_stack); ++ declspec_stack = TREE_CHAIN (declspec_stack); ++ resume_momentary ($2); } ++ | declmods setspecs notype_initdecls ';' ++ { current_declspecs = TREE_VALUE (declspec_stack); ++ declspec_stack = TREE_CHAIN (declspec_stack); ++ resume_momentary ($2); } ++ | typed_declspecs ';' ++ { shadow_tag ($1); } ++ | declmods ';' ++ { warning ("empty declaration"); } ++ ; ++ ++/* Declspecs which contain at least one type specifier or typedef name. ++ (Just `const' or `volatile' is not enough.) ++ A typedef'd name following these is taken as a name to be declared. */ ++ ++typed_declspecs: ++ typespec reserved_declspecs ++ { $$ = tree_cons (NULL_TREE, $1, $2); } ++ | declmods typespec reserved_declspecs ++ { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } ++ ; ++ ++reserved_declspecs: /* empty */ ++ { $$ = NULL_TREE; } ++ | reserved_declspecs typespecqual_reserved ++ { $$ = tree_cons (NULL_TREE, $2, $1); } ++ | reserved_declspecs SCSPEC ++ { $$ = tree_cons (NULL_TREE, $2, $1); } ++ ; ++ ++/* List of just storage classes and type modifiers. ++ A declaration can start with just this, but then it cannot be used ++ to redeclare a typedef-name. */ ++ ++declmods: ++ TYPE_QUAL ++ { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } ++ | SCSPEC ++ { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } ++ | declmods TYPE_QUAL ++ { $$ = tree_cons (NULL_TREE, $2, $1); } ++ | declmods SCSPEC ++ { $$ = tree_cons (NULL_TREE, $2, $1); } ++ ; ++ ++ ++/* Used instead of declspecs where storage classes are not allowed ++ (that is, for typenames and structure components). ++ Don't accept a typedef-name if anything but a modifier precedes it. */ ++ ++typed_typespecs: ++ typespec reserved_typespecquals ++ { $$ = tree_cons (NULL_TREE, $1, $2); } ++ | nonempty_type_quals typespec reserved_typespecquals ++ { $$ = chainon ($3, tree_cons (NULL_TREE, $2, $1)); } ++ ; ++ ++reserved_typespecquals: /* empty */ ++ { $$ = NULL_TREE; } ++ | reserved_typespecquals typespecqual_reserved ++ { $$ = tree_cons (NULL_TREE, $2, $1); } ++ ; ++ ++/* A typespec (but not a type qualifier). ++ Once we have seen one of these in a declaration, ++ if a typedef name appears then it is being redeclared. */ ++ ++typespec: TYPESPEC ++ | structsp ++ | TYPENAME ++ | TYPEOF '(' expr ')' ++ { $$ = TREE_TYPE ($3); } ++ | TYPEOF '(' typename ')' ++ { $$ = groktypename ($3); } ++ ; ++ ++/* A typespec that is a reserved word, or a type qualifier. */ ++ ++typespecqual_reserved: TYPESPEC ++ | TYPE_QUAL ++ | structsp ++ ; ++ ++initdecls: ++ initdcl ++ | initdecls ',' initdcl ++ ; ++ ++notype_initdecls: ++ notype_initdcl ++ | notype_initdecls ',' initdcl ++ ; ++ ++maybeasm: ++ /* empty */ ++ { $$ = NULL_TREE; } ++ | ASM '(' string ')' ++ { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); ++ $$ = $3; ++ } ++ ; ++ ++initdcl: ++ declarator maybeasm maybe_attribute '=' ++ { $$ = start_decl ($1, current_declspecs, 1); } ++ init ++/* Note how the declaration of the variable is in effect while its init is parsed! */ ++ { finish_decl ($5, $6, $2); } ++ | declarator maybeasm maybe_attribute ++ { tree d = start_decl ($1, current_declspecs, 0); ++ finish_decl (d, NULL_TREE, $2); } ++ ; ++ ++notype_initdcl: ++ notype_declarator maybeasm maybe_attribute '=' ++ { $$ = start_decl ($1, current_declspecs, 1); } ++ init ++/* Note how the declaration of the variable is in effect while its init is parsed! */ ++ { finish_decl ($5, $6, $2); } ++ | notype_declarator maybeasm maybe_attribute ++ { tree d = start_decl ($1, current_declspecs, 0); ++ finish_decl (d, NULL_TREE, $2); } ++ ; ++/* the * rules are dummies to accept the Apollo extended syntax ++ so that the header files compile. */ ++maybe_attribute: ++ /* empty */ ++ { $$ = NULL_TREE; } ++ | ATTRIBUTE '(' '(' attribute_list ')' ')' ++ { $$ = $4; } ++ ; ++ ++attribute_list ++ : attrib ++ | attribute_list ',' attrib ++ ; ++ ++attrib ++ : IDENTIFIER ++ { warning ("`%s' attribute directive ignored", ++ IDENTIFIER_POINTER ($1)); ++ $$ = $1; } ++ | IDENTIFIER '(' CONSTANT ')' ++ { /* if not "aligned(1)", then issue warning */ ++ if (strcmp (IDENTIFIER_POINTER ($1), "aligned") != 0 ++ || TREE_CODE ($3) != INTEGER_CST ++ || TREE_INT_CST_LOW ($3) != 1) ++ warning ("`%s' attribute directive ignored", ++ IDENTIFIER_POINTER ($1)); ++ $$ = $1; } ++ | IDENTIFIER '(' identifiers ')' ++ { warning ("`%s' attribute directive ignored", ++ IDENTIFIER_POINTER ($1)); ++ $$ = $1; } ++ ; ++ ++init: ++ expr_no_commas ++ | '{' '}' ++ { $$ = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); ++ if (pedantic) ++ warning ("ANSI C forbids empty initializer braces"); } ++ | '{' initlist '}' ++ { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2)); } ++ | '{' initlist ',' '}' ++ { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2)); } ++ | error ++ { $$ = NULL_TREE; } ++ ; ++ ++/* This chain is built in reverse order, ++ and put in forward order where initlist is used. */ ++initlist: ++ init ++ { $$ = build_tree_list (NULL_TREE, $1); } ++ | initlist ',' init ++ { $$ = tree_cons (NULL_TREE, $3, $1); } ++ ; ++ ++/* Any kind of declarator (thus, all declarators allowed ++ after an explicit typespec). */ ++ ++declarator: ++ after_type_declarator ++ | notype_declarator ++ ; ++ ++/* A declarator that is allowed only after an explicit typespec. */ ++ ++after_type_declarator: ++ '(' after_type_declarator ')' ++ { $$ = $2; } ++ | after_type_declarator '(' parmlist_or_identifiers %prec '.' ++ { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } ++/* | after_type_declarator '(' error ')' %prec '.' ++ { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); ++ poplevel (0, 0, 0); } */ ++ | after_type_declarator '[' expr ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, $1, $3); } ++ | after_type_declarator '[' ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } ++ | '*' type_quals after_type_declarator %prec UNARY ++ { $$ = make_pointer_declarator ($2, $3); } ++ | TYPENAME ++ ; ++ ++/* Kinds of declarator that can appear in a parameter list ++ in addition to notype_declarator. This is like after_type_declarator ++ but does not allow a typedef name in parentheses as an identifier ++ (because it would conflict with a function with that typedef as arg). */ ++ ++parm_declarator: ++ parm_declarator '(' parmlist_or_identifiers %prec '.' ++ { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } ++/* | parm_declarator '(' error ')' %prec '.' ++ { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); ++ poplevel (0, 0, 0); } */ ++ | parm_declarator '[' expr ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, $1, $3); } ++ | parm_declarator '[' ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } ++ | '*' type_quals parm_declarator %prec UNARY ++ { $$ = make_pointer_declarator ($2, $3); } ++ | TYPENAME ++ ; ++ ++/* A declarator allowed whether or not there has been ++ an explicit typespec. These cannot redeclare a typedef-name. */ ++ ++notype_declarator: ++ notype_declarator '(' parmlist_or_identifiers %prec '.' ++ { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } ++/* | notype_declarator '(' error ')' %prec '.' ++ { $$ = build_nt (CALL_EXPR, $1, NULL_TREE, NULL_TREE); ++ poplevel (0, 0, 0); } */ ++ | '(' notype_declarator ')' ++ { $$ = $2; } ++ | '*' type_quals notype_declarator %prec UNARY ++ { $$ = make_pointer_declarator ($2, $3); } ++ | notype_declarator '[' expr ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, $1, $3); } ++ | notype_declarator '[' ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } ++ | IDENTIFIER ++ ; ++ ++structsp: ++ STRUCT identifier '{' ++ { $$ = start_struct (RECORD_TYPE, $2); ++ /* Start scope of tag before parsing components. */ ++ } ++ component_decl_list '}' ++ { $$ = finish_struct ($4, $5); ++ /* Really define the structure. */ ++ } ++ | STRUCT '{' component_decl_list '}' ++ { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE), ++ $3); } ++ | STRUCT identifier ++ { $$ = xref_tag (RECORD_TYPE, $2); } ++ | UNION identifier '{' ++ { $$ = start_struct (UNION_TYPE, $2); } ++ component_decl_list '}' ++ { $$ = finish_struct ($4, $5); } ++ | UNION '{' component_decl_list '}' ++ { $$ = finish_struct (start_struct (UNION_TYPE, NULL_TREE), ++ $3); } ++ | UNION identifier ++ { $$ = xref_tag (UNION_TYPE, $2); } ++ | ENUM identifier '{' ++ { $3 = suspend_momentary (); ++ $$ = start_enum ($2); } ++ enumlist maybecomma_warn '}' ++ { $$ = finish_enum ($4, nreverse ($5)); ++ resume_momentary ($3); } ++ | ENUM '{' ++ { $2 = suspend_momentary (); ++ $$ = start_enum (NULL_TREE); } ++ enumlist maybecomma_warn '}' ++ { $$ = finish_enum ($3, nreverse ($4)); ++ resume_momentary ($2); } ++ | ENUM identifier ++ { $$ = xref_tag (ENUMERAL_TYPE, $2); } ++ ; ++ ++maybecomma: ++ /* empty */ ++ | ',' ++ ; ++ ++maybecomma_warn: ++ /* empty */ ++ | ',' ++ { if (pedantic) warning ("comma at end of enumerator list"); } ++ ; ++ ++component_decl_list: ++ component_decl_list2 ++ { $$ = $1; } ++ | component_decl_list2 component_decl ++ { $$ = chainon ($1, $2); ++ warning ("no semicolon at end of struct or union"); } ++ ; ++ ++component_decl_list2: /* empty */ ++ { $$ = NULL_TREE; } ++ | component_decl_list2 component_decl ';' ++ { $$ = chainon ($1, $2); } ++ | component_decl_list2 ';' ++ { if (pedantic) ++ warning ("extra semicolon in struct or union specified"); } ++ ; ++ ++/* There is a shift-reduce conflict here, because `components' may ++ start with a `typename'. It happens that shifting (the default resolution) ++ does the right thing, because it treats the `typename' as part of ++ a `typed_typespecs'. ++ ++ It is possible that this same technique would allow the distinction ++ between `notype_initdecls' and `initdecls' to be eliminated. ++ But I am being cautious and not trying it. */ ++ ++component_decl: ++ typed_typespecs setspecs components ++ { $$ = $3; ++ current_declspecs = TREE_VALUE (declspec_stack); ++ declspec_stack = TREE_CHAIN (declspec_stack); ++ resume_momentary ($2); } ++ | nonempty_type_quals setspecs components ++ { $$ = $3; ++ current_declspecs = TREE_VALUE (declspec_stack); ++ declspec_stack = TREE_CHAIN (declspec_stack); ++ resume_momentary ($2); } ++ | error ++ { $$ = NULL_TREE; } ++ ; ++ ++components: ++ /* empty */ ++ { if (pedantic) ++ warning ("ANSI C forbids member declarations with no members"); ++ $$ = NULL_TREE; } ++ | component_declarator ++ | components ',' component_declarator ++ { $$ = chainon ($1, $3); } ++ ; ++ ++component_declarator: ++ declarator maybe_attribute ++ { $$ = grokfield (input_filename, lineno, $1, current_declspecs, NULL_TREE); } ++ | declarator ':' expr_no_commas maybe_attribute ++ { $$ = grokfield (input_filename, lineno, $1, current_declspecs, $3); } ++ | ':' expr_no_commas ++ { $$ = grokfield (input_filename, lineno, NULL_TREE, current_declspecs, $2); } ++ ; ++ ++/* We chain the enumerators in reverse order. ++ They are put in forward order where enumlist is used. ++ (The order used to be significant, but no longer is so. ++ However, we still maintain the order, just to be clean.) */ ++ ++enumlist: ++ enumerator ++ | enumlist ',' enumerator ++ { $$ = chainon ($3, $1); } ++ ; ++ ++ ++enumerator: ++ identifier ++ { $$ = build_enumerator ($1, NULL_TREE); } ++ | identifier '=' expr_no_commas ++ { $$ = build_enumerator ($1, $3); } ++ ; ++ ++typename: ++ typed_typespecs absdcl ++ { $$ = build_tree_list ($1, $2); } ++ | nonempty_type_quals absdcl ++ { $$ = build_tree_list ($1, $2); } ++ ; ++ ++absdcl: /* an absolute declarator */ ++ /* empty */ ++ { $$ = NULL_TREE; } ++ | absdcl1 ++ ; ++ ++nonempty_type_quals: ++ TYPE_QUAL ++ { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); } ++ | nonempty_type_quals TYPE_QUAL ++ { $$ = tree_cons (NULL_TREE, $2, $1); } ++ ; ++ ++type_quals: ++ /* empty */ ++ { $$ = NULL_TREE; } ++ | type_quals TYPE_QUAL ++ { $$ = tree_cons (NULL_TREE, $2, $1); } ++ ; ++ ++absdcl1: /* a nonempty absolute declarator */ ++ '(' absdcl1 ')' ++ { $$ = $2; } ++ /* `(typedef)1' is `int'. */ ++ | '*' type_quals absdcl1 %prec UNARY ++ { $$ = make_pointer_declarator ($2, $3); } ++ | '*' type_quals %prec UNARY ++ { $$ = make_pointer_declarator ($2, NULL_TREE); } ++ | absdcl1 '(' parmlist %prec '.' ++ { $$ = build_nt (CALL_EXPR, $1, $3, NULL_TREE); } ++ | absdcl1 '[' expr ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, $1, $3); } ++ | absdcl1 '[' ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, $1, NULL_TREE); } ++ | '(' parmlist %prec '.' ++ { $$ = build_nt (CALL_EXPR, NULL_TREE, $2, NULL_TREE); } ++ | '[' expr ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, NULL_TREE, $2); } ++ | '[' ']' %prec '.' ++ { $$ = build_nt (ARRAY_REF, NULL_TREE, NULL_TREE); } ++ ; ++ ++/* at least one statement, the first of which parses without error. */ ++/* stmts is used only after decls, so an invalid first statement ++ is actually regarded as an invalid decl and part of the decls. */ ++ ++stmts: ++ stmt ++ | stmts stmt ++ | stmts errstmt ++ ; ++ ++xstmts: ++ /* empty */ ++ | stmts ++ ; ++ ++errstmt: error ';' ++ ; ++ ++pushlevel: /* empty */ ++ { pushlevel (0); ++ clear_last_expr (); ++ push_momentary (); ++ expand_start_bindings (0); } ++ ; ++ ++/* This is the body of a function definition. ++ It causes syntax errors to ignore to the next openbrace. */ ++compstmt_or_error: ++ compstmt ++ {} ++ | error compstmt ++ ; ++ ++compstmt: '{' '}' ++ { $$ = 0; } ++ | '{' pushlevel decls xstmts '}' ++ { expand_end_bindings (getdecls (), 1, 0); ++ $$ = poplevel (1, 1, 0); ++ pop_momentary (); } ++ | '{' pushlevel error '}' ++ { expand_end_bindings (getdecls (), kept_level_p (), 0); ++ $$ = poplevel (kept_level_p (), 0, 0); ++ pop_momentary (); } ++ | '{' pushlevel stmts '}' ++ { expand_end_bindings (getdecls (), kept_level_p (), 0); ++ $$ = poplevel (kept_level_p (), 0, 0); ++ pop_momentary (); } ++ ; ++ ++simple_if: ++ IF '(' expr ')' ++ { emit_line_note (input_filename, lineno); ++ expand_start_cond (truthvalue_conversion ($3), 0); } ++ stmt ++ ; ++ ++stmt: ++ compstmt {} ++ | expr ';' ++ { emit_line_note (input_filename, lineno); ++ /* Do default conversion if safe and possibly important, ++ in case within ({...}). */ ++ if ((TREE_CODE (TREE_TYPE ($1)) == ARRAY_TYPE ++ && lvalue_p ($1)) ++ || TREE_CODE (TREE_TYPE ($1)) == FUNCTION_TYPE) ++ $1 = default_conversion ($1); ++ expand_expr_stmt ($1); ++ clear_momentary (); } ++ | simple_if ELSE ++ { expand_start_else (); } ++ stmt ++ { expand_end_else (); } ++ | simple_if %prec IF ++ { expand_end_cond (); } ++ | WHILE ++ { emit_nop (); ++ emit_line_note (input_filename, lineno); ++ expand_start_loop (1); } ++ '(' expr ')' ++ { emit_line_note (input_filename, lineno); ++ expand_exit_loop_if_false (truthvalue_conversion ($4)); } ++ stmt ++ { expand_end_loop (); } ++ | DO ++ { emit_nop (); ++ emit_line_note (input_filename, lineno); ++ expand_start_loop_continue_elsewhere (1); } ++ stmt WHILE ++ { expand_loop_continue_here (); } ++ '(' expr ')' ';' ++ { emit_line_note (input_filename, lineno); ++ expand_exit_loop_if_false (truthvalue_conversion ($7)); ++ expand_end_loop (); ++ clear_momentary (); } ++ | FOR ++ '(' xexpr ';' ++ { emit_nop (); ++ emit_line_note (input_filename, lineno); ++ if ($3) expand_expr_stmt ($3); ++ expand_start_loop_continue_elsewhere (1); } ++ xexpr ';' ++ { emit_line_note (input_filename, lineno); ++ if ($6) ++ expand_exit_loop_if_false (truthvalue_conversion ($6)); } ++ xexpr ')' ++ /* Don't let the tree nodes for $9 be discarded ++ by clear_momentary during the parsing of the next stmt. */ ++ { push_momentary (); ++ $10 = lineno; } ++ stmt ++ { emit_line_note (input_filename, $10); ++ expand_loop_continue_here (); ++ if ($9) ++ expand_expr_stmt ($9); ++ pop_momentary (); ++ expand_end_loop (); } ++ | SWITCH '(' expr ')' ++ { emit_line_note (input_filename, lineno); ++ c_expand_start_case ($3); ++ /* Don't let the tree nodes for $3 be discarded by ++ clear_momentary during the parsing of the next stmt. */ ++ push_momentary (); } ++ stmt ++ { expand_end_case ($3); ++ pop_momentary (); } ++ | CASE expr ':' ++ { register tree value = fold ($2); ++ register tree label ++ = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ++ ++ /* build_c_cast puts on a NOP_EXPR to make a non-lvalue. ++ Strip such NOP_EXPRs. */ ++ if (TREE_CODE (value) == NOP_EXPR ++ && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0))) ++ value = TREE_OPERAND (value, 0); ++ ++ if (TREE_CODE (value) != INTEGER_CST ++ && value != error_mark_node) ++ { ++ error ("case label does not reduce to an integer constant"); ++ value = error_mark_node; ++ } ++ else ++ /* Promote char or short to int. */ ++ value = default_conversion (value); ++ if (value != error_mark_node) ++ { ++ int success = pushcase (value, label); ++ if (success == 1) ++ error ("case label not within a switch statement"); ++ else if (success == 2) ++ error ("duplicate case value"); ++ else if (success == 3) ++ warning ("case value out of range"); ++ } ++ } ++ stmt ++ | DEFAULT ':' ++ { ++ register tree label ++ = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ++ int success = pushcase (NULL_TREE, label); ++ if (success == 1) ++ error ("default label not within a switch statement"); ++ else if (success == 2) ++ error ("multiple default labels in one switch"); ++ } ++ stmt ++ | BREAK ';' ++ { emit_line_note (input_filename, lineno); ++ if ( ! expand_exit_something ()) ++ error ("break statement not within loop or switch"); } ++ | CONTINUE ';' ++ { emit_line_note (input_filename, lineno); ++ if (! expand_continue_loop ()) ++ error ("continue statement not within a loop"); } ++ | RETURN ';' ++ { emit_line_note (input_filename, lineno); ++ c_expand_return (NULL_TREE); } ++ | RETURN expr ';' ++ { emit_line_note (input_filename, lineno); ++ c_expand_return ($2); } ++ | ASM maybe_type_qual '(' string ')' ';' ++ { if (TREE_CHAIN ($4)) $4 = combine_strings ($4); ++ emit_line_note (input_filename, lineno); ++ expand_asm ($4); } ++ /* This is the case with just output operands. */ ++ | ASM maybe_type_qual '(' string ':' asm_operands ')' ';' ++ { if (TREE_CHAIN ($4)) $4 = combine_strings ($4); ++ emit_line_note (input_filename, lineno); ++ c_expand_asm_operands ($4, $6, NULL_TREE, NULL_TREE, ++ $2 == ridpointers[(int)RID_VOLATILE], ++ input_filename, lineno); } ++ /* This is the case with input operands as well. */ ++ | ASM maybe_type_qual '(' string ':' asm_operands ':' asm_operands ')' ';' ++ { if (TREE_CHAIN ($4)) $4 = combine_strings ($4); ++ emit_line_note (input_filename, lineno); ++ c_expand_asm_operands ($4, $6, $8, NULL_TREE, ++ $2 == ridpointers[(int)RID_VOLATILE], ++ input_filename, lineno); } ++ /* This is the case with clobbered registers as well. */ ++ | ASM maybe_type_qual '(' string ':' asm_operands ':' ++ asm_operands ':' asm_clobbers ')' ';' ++ { if (TREE_CHAIN ($4)) $4 = combine_strings ($4); ++ emit_line_note (input_filename, lineno); ++ c_expand_asm_operands ($4, $6, $8, $10, ++ $2 == ridpointers[(int)RID_VOLATILE], ++ input_filename, lineno); } ++ | GOTO identifier ';' ++ { tree decl; ++ emit_line_note (input_filename, lineno); ++ decl = lookup_label ($2); ++ TREE_USED (decl) = 1; ++ expand_goto (decl); } ++ | identifier ':' ++ { tree label = define_label (input_filename, lineno, $1); ++ emit_nop (); ++ if (label) ++ expand_label (label); } ++ stmt ++ | ';' ++ ; ++ ++/* Either a type-qualifier or nothing. First thing in an `asm' statement. */ ++ ++maybe_type_qual: ++ /* empty */ ++ { emit_line_note (input_filename, lineno); } ++ | TYPE_QUAL ++ { emit_line_note (input_filename, lineno); } ++ ; ++ ++xexpr: ++ /* empty */ ++ { $$ = NULL_TREE; } ++ | expr ++ ; ++ ++/* These are the operands other than the first string and colon ++ in asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x)) */ ++asm_operands: /* empty */ ++ { $$ = NULL_TREE; } ++ | nonnull_asm_operands ++ ; ++ ++nonnull_asm_operands: ++ asm_operand ++ | nonnull_asm_operands ',' asm_operand ++ { $$ = chainon ($1, $3); } ++ ; ++ ++asm_operand: ++ STRING '(' expr ')' ++ { $$ = build_tree_list ($1, $3); } ++ ; ++ ++asm_clobbers: ++ string ++ { $$ = tree_cons (NULL_TREE, combine_strings ($1), NULL_TREE); } ++ | asm_clobbers ',' string ++ { $$ = tree_cons (NULL_TREE, combine_strings ($3), $1); } ++ ; ++ ++/* This is what appears inside the parens in a function declarator. ++ Its value is a list of ..._TYPE nodes. */ ++parmlist: ++ { pushlevel (0); ++ declare_parm_level (); } ++ parmlist_1 ++ { $$ = $2; ++ parmlist_tags_warning (); ++ poplevel (0, 0, 0); } ++ ; ++ ++/* This is referred to where either a parmlist or an identifier list is ok. ++ Its value is a list of ..._TYPE nodes or a list of identifiers. */ ++parmlist_or_identifiers: ++ { pushlevel (0); ++ declare_parm_level (); } ++ parmlist_or_identifiers_1 ++ { $$ = $2; ++ parmlist_tags_warning (); ++ poplevel (0, 0, 0); } ++ ; ++ ++parmlist_or_identifiers_1: ++ parmlist_2 ')' ++ | identifiers ')' ++ { $$ = tree_cons (NULL_TREE, NULL_TREE, $1); } ++ | error ')' ++ { $$ = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); } ++ ; ++ ++parmlist_1: ++ parmlist_2 ')' ++ | error ')' ++ { $$ = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE); } ++ ; ++ ++/* This is what appears inside the parens in a function declarator. ++ Is value is represented in the format that grokdeclarator expects. */ ++parmlist_2: /* empty */ ++ { $$ = get_parm_info (0); } ++ | parms ++ { $$ = get_parm_info (1); } ++ | parms ',' ELLIPSIS ++ { $$ = get_parm_info (0); } ++ ; ++ ++parms: ++ parm ++ { push_parm_decl ($1); } ++ | parms ',' parm ++ { push_parm_decl ($3); } ++ ; ++ ++/* A single parameter declaration or parameter type name, ++ as found in a parmlist. */ ++parm: ++ typed_declspecs parm_declarator ++ { $$ = build_tree_list ($1, $2) ; } ++ | typed_declspecs notype_declarator ++ { $$ = build_tree_list ($1, $2) ; } ++ | typed_declspecs absdcl ++ { $$ = build_tree_list ($1, $2); } ++ | declmods notype_declarator ++ { $$ = build_tree_list ($1, $2) ; } ++ | declmods absdcl ++ { $$ = build_tree_list ($1, $2); } ++ ; ++ ++/* A nonempty list of identifiers. */ ++identifiers: ++ IDENTIFIER ++ { $$ = build_tree_list (NULL_TREE, $1); } ++ | identifiers ',' IDENTIFIER ++ { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); } ++ ; ++%% ++ ++/* Return something to represent absolute declarators containing a *. ++ TARGET is the absolute declarator that the * contains. ++ TYPE_QUALS is a list of modifiers such as const or volatile ++ to apply to the pointer type, represented as identifiers. ++ ++ We return an INDIRECT_REF whose "contents" are TARGET ++ and whose type is the modifier list. */ ++ ++static tree ++make_pointer_declarator (type_quals, target) ++ tree type_quals, target; ++{ ++ return build (INDIRECT_REF, type_quals, target); ++} ++ ++/* Given a chain of STRING_CST nodes, ++ concatenate them into one STRING_CST ++ and give it a suitable array-of-chars data type. */ ++ ++static tree ++combine_strings (strings) ++ tree strings; ++{ ++ register tree value, t; ++ register int length = 1; ++ int wide_length = 0; ++ int wide_flag = 0; ++ int nchars; ++ ++ if (TREE_CHAIN (strings)) ++ { ++ /* More than one in the chain, so concatenate. */ ++ register char *p, *q; ++ ++ /* Don't include the \0 at the end of each substring, ++ except for the last one. ++ Count wide strings and ordinary strings separately. */ ++ for (t = strings; t; t = TREE_CHAIN (t)) ++ { ++ if (TREE_TYPE (t) == int_array_type_node) ++ { ++ wide_length += (TREE_STRING_LENGTH (t) - UNITS_PER_WORD); ++ wide_flag = 1; ++ } ++ else ++ length += (TREE_STRING_LENGTH (t) - 1); ++ } ++ ++ /* If anything is wide, the non-wides will be converted, ++ which makes them take more space. */ ++ if (wide_flag) ++ length = length * UNITS_PER_WORD + wide_length; ++ ++ p = (char *) savealloc (length); ++ ++ /* Copy the individual strings into the new combined string. ++ If the combined string is wide, convert the chars to ints ++ for any individual strings that are not wide. */ ++ ++ q = p; ++ for (t = strings; t; t = TREE_CHAIN (t)) ++ { ++ int len = (TREE_STRING_LENGTH (t) ++ - ((TREE_TYPE (t) == int_array_type_node) ++ ? UNITS_PER_WORD : 1)); ++ if ((TREE_TYPE (t) == int_array_type_node) == wide_flag) ++ { ++ bcopy (TREE_STRING_POINTER (t), q, len); ++ q += len; ++ } ++ else ++ { ++ int i; ++ for (i = 0; i < len; i++) ++ ((int *) q)[i] = TREE_STRING_POINTER (t)[i]; ++ q += len * UNITS_PER_WORD; ++ } ++ } ++ if (wide_flag) ++ { ++ int i; ++ for (i = 0; i < UNITS_PER_WORD; i++) ++ *q++ = 0; ++ } ++ else ++ *q = 0; ++ ++ value = make_node (STRING_CST); ++ TREE_STRING_POINTER (value) = p; ++ TREE_STRING_LENGTH (value) = length; ++ TREE_LITERAL (value) = 1; ++ } ++ else ++ { ++ value = strings; ++ length = TREE_STRING_LENGTH (value); ++ if (TREE_TYPE (value) == int_array_type_node) ++ wide_flag = 1; ++ } ++ ++ /* Compute the number of elements, for the array type. */ ++ nchars = wide_flag ? length / UNITS_PER_WORD : length; ++ ++ /* Create the array type for the string constant. ++ -Wwrite-strings says make the string constant an array of const char ++ so that copying it to a non-const pointer will get a warning. */ ++ if (warn_write_strings) ++ { ++ tree elements ++ = build_type_variant (wide_flag ? integer_type_node : char_type_node, ++ 1, 0); ++ TREE_TYPE (value) ++ = build_array_type (elements, ++ build_index_type (build_int_2 (nchars - 1, 0))); ++ } ++ else ++ TREE_TYPE (value) ++ = build_array_type (wide_flag ? integer_type_node : char_type_node, ++ build_index_type (build_int_2 (nchars - 1, 0))); ++ TREE_LITERAL (value) = 1; ++ TREE_STATIC (value) = 1; ++ return value; ++} ++ ++FILE *finput; /* input file. ++ Normally a pipe from the preprocessor. */ ++ ++/* lexical analyzer */ ++ ++static int maxtoken; /* Current nominal length of token buffer. */ ++static char *token_buffer; /* Pointer to token buffer. ++ Actual allocated length is maxtoken + 2. */ ++static int max_wide; /* Current nominal length of wide_buffer. */ ++static int *wide_buffer; /* Pointer to wide-string buffer. ++ Actual allocated length is max_wide + 1. */ ++ ++/* Nonzero if end-of-file has been seen on input. */ ++static int end_of_file; ++ ++/* Buffered character to reread. ++ I'm not sure why ungetc is not used. */ ++static int nextchar = -1; ++ ++/* Data type that represents the GNU C reserved words. */ ++struct resword { char *name; short token; enum rid rid; }; ++ ++#define MIN_WORD_LENGTH 2 /* minimum size for C keyword */ ++#define MAX_WORD_LENGTH 13 /* maximum size for C keyword */ ++#define MIN_HASH_VALUE 7 /* range of the hash keys values */ ++#define MAX_HASH_VALUE 91 /* for the perfect hash generator */ ++#define NORID RID_UNUSED ++ ++/* This function performs the minimum-perfect hash mapping from input ++ string to reswords table index. It only looks at the first and ++ last characters in the string, thus assuring the O(1) lookup time ++ (this keeps our constant down to an insignificant amount!). Compiling ++ the following 2 functions as inline removes all overhead of the ++ function calls. */ ++ ++#ifdef __GNUC__ ++__inline ++#endif ++static int ++hash (str, len) ++ register char *str; ++ register int len; ++{ ++/* This table is used to build the hash table index that recognizes ++ reserved words in 0(1) steps. It is larger than strictly necessary, ++ but I'm trading off the space for the time-saving luxury of avoiding ++ subtraction of an offset. All those ``91's'' (actually just a ++ short-hand for MAX_HASH_VALUE #defined above) are used to speed up ++ the search when the string found on the input stream doesn't have a ++ first or last character that is part of the set of alphabetic ++ characters that comprise the first or last characters in C ++ reserved words. */ ++ ++ static int hash_table[] = ++ { ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, ++ 91, 91, 91, 91, 91, 1, 91, 2, 1, 32, ++ 7, 5, 18, 20, 1, 17, 91, 1, 18, 1, ++ 28, 1, 23, 91, 12, 20, 1, 41, 7, 15, ++ 91, 91, 10, 91, 91, 91, 91, 91, ++ }; ++ register int hval = len ; ++ ++ switch (hval) ++ { ++ default: ++ case 3: ++ hval += hash_table[str[2]]; ++ case 2: ++ case 1: ++ return hval + hash_table[str[0]] + hash_table[str[len - 1]]; ++ } ++} ++ ++/* This routine attempts to match the string found in the reswords table ++ with the one from the input stream. If all the relevant details ++ match then an actual strcmp comparison is performed and the address of ++ correct struct resword entry is returned. Otherwise, a NULL ++ pointer is returned. */ ++ ++#ifdef __GNUC__ ++__inline ++#endif ++struct resword * ++is_reserved_word (str, len) ++ register char *str; ++ register int len; ++{ ++ /* This is the hash table of keywords. ++ The order of keywords has been chosen for perfect hashing. ++ Therefore, this table cannot be updated by hand. ++ Use the program ``gperf,'' available with the latest libg++ ++ distribution, to generate an updated table. A file called ++ c-parse.gperf, distributed with GNU C, contains the keyword file. */ ++ ++ static struct resword reswords[] = ++ { ++ { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, ++ {"asm", ASM, NORID }, ++ {"auto", SCSPEC, RID_AUTO }, ++ {"__asm", ASM, NORID }, ++ {"do", DO, NORID }, ++ {"__asm__", ASM, NORID }, ++ {"break", BREAK, NORID }, ++ {"__typeof__", TYPEOF, NORID }, ++ { "", }, ++ {"__alignof__", ALIGNOF, NORID }, ++ { "", }, ++ {"__attribute__", ATTRIBUTE, NORID }, ++ { "", }, ++ {"__attribute", ATTRIBUTE, NORID }, ++ { "", }, ++ {"__volatile__", TYPE_QUAL, RID_VOLATILE }, ++ {"int", TYPESPEC, RID_INT }, ++ {"__volatile", TYPE_QUAL, RID_VOLATILE }, ++ { "", }, ++ {"float", TYPESPEC, RID_FLOAT }, ++ {"goto", GOTO, NORID }, ++ {"short", TYPESPEC, RID_SHORT }, ++ {"__typeof", TYPEOF, NORID }, ++ {"__inline__", SCSPEC, RID_INLINE }, ++ {"__alignof", ALIGNOF, NORID }, ++ {"__inline", SCSPEC, RID_INLINE }, ++ {"__signed__", TYPESPEC, RID_SIGNED }, ++ {"default", DEFAULT, NORID }, ++ {"else", ELSE, NORID }, ++ {"void", TYPESPEC, RID_VOID }, ++ {"__signed", TYPESPEC, RID_SIGNED }, ++ {"if", IF, NORID }, ++ {"volatile", TYPE_QUAL, RID_VOLATILE }, ++ {"struct", STRUCT, NORID }, ++ {"extern", SCSPEC, RID_EXTERN }, ++ {"__const", TYPE_QUAL, RID_CONST }, ++ {"while", WHILE, NORID }, ++ {"__const__", TYPE_QUAL, RID_CONST }, ++ {"switch", SWITCH, NORID }, ++ {"for", FOR, NORID }, ++ {"inline", SCSPEC, RID_INLINE }, ++ {"return", RETURN, NORID }, ++ {"typeof", TYPEOF, NORID }, ++ {"typedef", SCSPEC, RID_TYPEDEF }, ++ {"char", TYPESPEC, RID_CHAR }, ++ {"enum", ENUM, NORID }, ++ {"register", SCSPEC, RID_REGISTER }, ++ {"signed", TYPESPEC, RID_SIGNED }, ++ {"sizeof", SIZEOF, NORID }, ++ { "", }, { "", }, { "", }, { "", }, ++ {"double", TYPESPEC, RID_DOUBLE }, ++ {"static", SCSPEC, RID_STATIC }, ++ {"case", CASE, NORID }, ++ { "", }, { "", }, { "", }, { "", }, ++ {"const", TYPE_QUAL, RID_CONST }, ++ { "", }, { "", }, { "", }, ++ {"long", TYPESPEC, RID_LONG }, ++ { "", }, { "", }, ++ {"continue", CONTINUE, NORID }, ++ { "", }, { "", }, ++ {"unsigned", TYPESPEC, RID_UNSIGNED }, ++ { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, { "", }, ++ { "", }, { "", }, { "", }, { "", }, { "", }, ++ {"union", UNION, NORID }, ++ }; ++ ++ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) ++ { ++ register int key = hash (str, len); ++ ++ if (key <= MAX_HASH_VALUE) ++ { ++ register char *s = reswords[key].name; ++ ++ if (*s == *str && !strcmp (str + 1, s + 1)) ++ return &reswords[key]; ++ } ++ } ++ return 0; ++} ++ ++/* The elements of `ridpointers' are identifier nodes ++ for the reserved type names and storage classes. ++ It is indexed by a RID_... value. */ ++ ++tree ridpointers[(int) RID_MAX]; ++ ++int check_newline (); ++ ++void ++init_lex () ++{ ++ /* Start it at 0, because check_newline is called at the very beginning ++ and will increment it to 1. */ ++ lineno = 0; ++ ++ maxtoken = 40; ++ token_buffer = (char *) xmalloc (maxtoken + 2); ++ max_wide = 40; ++ wide_buffer = (int *) xmalloc ((max_wide + 1) * UNITS_PER_WORD); ++ ++ ridpointers[(int) RID_INT] = get_identifier ("int"); ++ ridpointers[(int) RID_CHAR] = get_identifier ("char"); ++ ridpointers[(int) RID_VOID] = get_identifier ("void"); ++ ridpointers[(int) RID_FLOAT] = get_identifier ("float"); ++ ridpointers[(int) RID_DOUBLE] = get_identifier ("double"); ++ ridpointers[(int) RID_SHORT] = get_identifier ("short"); ++ ridpointers[(int) RID_LONG] = get_identifier ("long"); ++ ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned"); ++ ridpointers[(int) RID_SIGNED] = get_identifier ("signed"); ++ ridpointers[(int) RID_INLINE] = get_identifier ("inline"); ++ ridpointers[(int) RID_CONST] = get_identifier ("const"); ++ ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile"); ++ ridpointers[(int) RID_AUTO] = get_identifier ("auto"); ++ ridpointers[(int) RID_STATIC] = get_identifier ("static"); ++ ridpointers[(int) RID_EXTERN] = get_identifier ("extern"); ++ ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef"); ++ ridpointers[(int) RID_REGISTER] = get_identifier ("register"); ++} ++ ++static void ++reinit_parse_for_function () ++{ ++} ++ ++/* If C is not whitespace, return C. ++ Otherwise skip whitespace and return first nonwhite char read. */ ++ ++static int ++skip_white_space (c) ++ register int c; ++{ ++#if 0 ++ register int inside; ++#endif ++ ++ for (;;) ++ { ++ switch (c) ++ { ++ /* Don't recognize comments in cc1: all comments are removed by cpp, ++ and cpp output can include / and * consecutively as operators. */ ++#if 0 ++ case '/': ++ c = getc (finput); ++ if (c != '*') ++ { ++ ungetc (c, finput); ++ return '/'; ++ } ++ ++ c = getc (finput); ++ ++ inside = 1; ++ while (inside) ++ { ++ if (c == '*') ++ { ++ while (c == '*') ++ c = getc (finput); ++ ++ if (c == '/') ++ { ++ inside = 0; ++ c = getc (finput); ++ } ++ } ++ else if (c == '\n') ++ { ++ lineno++; ++ c = getc (finput); ++ } ++ else if (c == EOF) ++ { ++ error ("unterminated comment"); ++ break; ++ } ++ else ++ c = getc (finput); ++ } ++ ++ break; ++#endif ++ ++ case '\n': ++ c = check_newline (); ++ break; ++ ++ case ' ': ++ case '\t': ++ case '\f': ++ case '\r': ++ case '\v': ++ case '\b': ++ c = getc (finput); ++ break; ++ ++ case '\\': ++ c = getc (finput); ++ if (c == '\n') ++ lineno++; ++ else ++ error ("stray '\\' in program"); ++ c = getc (finput); ++ break; ++ ++ default: ++ return (c); ++ } ++ } ++} ++ ++ ++ ++/* Make the token buffer longer, preserving the data in it. ++ P should point to just beyond the last valid character in the old buffer. ++ The value we return is a pointer to the new buffer ++ at a place corresponding to P. */ ++ ++static char * ++extend_token_buffer (p) ++ char *p; ++{ ++ int offset = p - token_buffer; ++ ++ maxtoken = maxtoken * 2 + 10; ++ token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2); ++ ++ return token_buffer + offset; ++} ++ ++/* At the beginning of a line, increment the line number ++ and process any #-directive on this line. ++ If the line is a #-directive, read the entire line and return a newline. ++ Otherwise, return the line's first non-whitespace character. */ ++ ++int ++check_newline () ++{ ++ register int c; ++ register int token; ++ ++ lineno++; ++ ++ /* Read first nonwhite char on the line. */ ++ ++ c = getc (finput); ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ ++ if (c != '#') ++ { ++ /* If not #, return it so caller will use it. */ ++ return c; ++ } ++ ++ /* Read first nonwhite char after the `#'. */ ++ ++ c = getc (finput); ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ ++ /* If a letter follows, then if the word here is `line', skip ++ it and ignore it; otherwise, ignore the line, with an error ++ if the word isn't `pragma'. */ ++ ++ if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) ++ { ++ if (c == 'p') ++ { ++ if (getc (finput) == 'r' ++ && getc (finput) == 'a' ++ && getc (finput) == 'g' ++ && getc (finput) == 'm' ++ && getc (finput) == 'a' ++ && ((c = getc (finput)) == ' ' || c == '\t' || c == '\n')) ++ goto skipline; ++ } ++ ++ else if (c == 'l') ++ { ++ if (getc (finput) == 'i' ++ && getc (finput) == 'n' ++ && getc (finput) == 'e' ++ && ((c = getc (finput)) == ' ' || c == '\t')) ++ goto linenum; ++ } ++ else if (c == 'i') ++ { ++ if (getc (finput) == 'd' ++ && getc (finput) == 'e' ++ && getc (finput) == 'n' ++ && getc (finput) == 't' ++ && ((c = getc (finput)) == ' ' || c == '\t')) ++ { ++ extern FILE *asm_out_file; ++ ++ if (pedantic) ++ error ("ANSI C does not allow #ident"); ++ ++ /* Here we have just seen `#ident '. ++ A string constant should follow. */ ++ ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ ++ /* If no argument, ignore the line. */ ++ if (c == '\n') ++ return c; ++ ++ ungetc (c, finput); ++ token = yylex (); ++ if (nextchar >= 0) ++ ungetc (nextchar, finput), nextchar = -1; ++ if (token != STRING ++ || TREE_CODE (yylval.ttype) != STRING_CST) ++ { ++ error ("invalid #ident"); ++ goto skipline; ++ } ++ ++#ifdef ASM_OUTPUT_IDENT ++ ASM_OUTPUT_IDENT (asm_out_file, TREE_STRING_POINTER (yylval.ttype)); ++#endif ++ ++ /* Skip the rest of this line. */ ++ goto skipline; ++ } ++ } ++ ++ error ("undefined or invalid # directive"); ++ goto skipline; ++ } ++ ++linenum: ++ /* Here we have either `#line' or `# '. ++ In either case, it should be a line number; a digit should follow. */ ++ ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ ++ /* If the # is the only nonwhite char on the line, ++ just ignore it. Check the new newline. */ ++ if (c == '\n') ++ return c; ++ ++ /* Something follows the #; read a token. */ ++ ++ ungetc (c, finput); ++ token = yylex (); ++ if (nextchar >= 0) ++ ungetc (nextchar, finput), nextchar = -1; ++ ++ if (token == CONSTANT ++ && TREE_CODE (yylval.ttype) == INTEGER_CST) ++ { ++ int old_lineno = lineno; ++ /* subtract one, because it is the following line that ++ gets the specified number */ ++ ++ int l = TREE_INT_CST_LOW (yylval.ttype) - 1; ++ ++ /* Is this the last nonwhite stuff on the line? */ ++ c = getc (finput); ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ if (c == '\n') ++ { ++ /* No more: store the line number and check following line. */ ++ lineno = l; ++ return c; ++ } ++ ungetc (c, finput); ++ ++ /* More follows: it must be a string constant (filename). */ ++ ++ token = yylex (); ++ if (nextchar >= 0) ++ ungetc (nextchar, finput), nextchar = -1; ++ if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST) ++ { ++ error ("invalid #line"); ++ goto skipline; ++ } ++ ++ input_filename ++ = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1); ++ strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype)); ++ lineno = l; ++ ++ if (main_input_filename == 0) ++ main_input_filename = input_filename; ++ ++ /* Is this the last nonwhite stuff on the line? */ ++ c = getc (finput); ++ while (c == ' ' || c == '\t') ++ c = getc (finput); ++ if (c == '\n') ++ return c; ++ ungetc (c, finput); ++ ++ token = yylex (); ++ if (nextchar >= 0) ++ ungetc (nextchar, finput), nextchar = -1; ++ ++ /* `1' after file name means entering new file. ++ `2' after file name means just left a file. */ ++ ++ if (token == CONSTANT ++ && TREE_CODE (yylval.ttype) == INTEGER_CST) ++ { ++ if (TREE_INT_CST_LOW (yylval.ttype) == 1) ++ { ++ struct file_stack *p ++ = (struct file_stack *) xmalloc (sizeof (struct file_stack)); ++ input_file_stack->line = old_lineno; ++ p->next = input_file_stack; ++ p->name = input_filename; ++ input_file_stack = p; ++ input_file_stack_tick++; ++ } ++ else if (input_file_stack->next) ++ { ++ struct file_stack *p = input_file_stack; ++ input_file_stack = p->next; ++ free (p); ++ input_file_stack_tick++; ++ } ++#if 0 ++ else ++ error ("#-lines for entering and leaving files don't match"); ++#endif ++ } ++ } ++ else ++ error ("invalid #-line"); ++ ++ /* skip the rest of this line. */ ++ skipline: ++ if (c == '\n') ++ return c; ++ while ((c = getc (finput)) != EOF && c != '\n'); ++ return c; ++} ++ ++#define isalnum(char) ((char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z') || (char >= '0' && char <= '9')) ++#define isdigit(char) (char >= '0' && char <= '9') ++#define ENDFILE -1 /* token that represents end-of-file */ ++ ++ ++static int ++readescape () ++{ ++ register int c = getc (finput); ++ register int count, code; ++ int firstdig; ++ ++ switch (c) ++ { ++ case 'x': ++ code = 0; ++ count = 0; ++ while (1) ++ { ++ c = getc (finput); ++ if (!(c >= 'a' && c <= 'f') ++ && !(c >= 'A' && c <= 'F') ++ && !(c >= '0' && c <= '9')) ++ { ++ ungetc (c, finput); ++ break; ++ } ++ code *= 16; ++ if (c >= 'a' && c <= 'f') ++ code += c - 'a' + 10; ++ if (c >= 'A' && c <= 'F') ++ code += c - 'A' + 10; ++ if (c >= '0' && c <= '9') ++ code += c - '0'; ++ if (count == 0) ++ firstdig = code; ++ count++; ++ } ++ if (count == 0) ++ error ("\\x used with no following hex digits"); ++ else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node) ++ || (count > 1 ++ && ((1 << (TYPE_PRECISION (integer_type_node) - (count - 1) * 4)) ++ <= firstdig))) ++ warning ("hex escape out of range"); ++ return code; ++ ++ case '0': case '1': case '2': case '3': case '4': ++ case '5': case '6': case '7': ++ code = 0; ++ count = 0; ++ while ((c <= '7') && (c >= '0') && (count++ < 3)) ++ { ++ code = (code * 8) + (c - '0'); ++ c = getc (finput); ++ } ++ ungetc (c, finput); ++ return code; ++ ++ case '\\': case '\'': case '"': ++ return c; ++ ++ case '\n': ++ lineno++; ++ return -1; ++ ++ case 'n': ++ return TARGET_NEWLINE; ++ ++ case 't': ++ return TARGET_TAB; ++ ++ case 'r': ++ return TARGET_CR; ++ ++ case 'f': ++ return TARGET_FF; ++ ++ case 'b': ++ return TARGET_BS; ++ ++ case 'a': ++ return TARGET_BELL; ++ ++ case 'v': ++ return TARGET_VT; ++ ++ case 'E': ++ return 033; ++ ++ case '?': ++ /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */ ++ case '(': ++ case '{': ++ case '[': ++ return c; ++ } ++ if (c >= 040 && c <= 0177) ++ warning ("unknown escape sequence `\\%c'", c); ++ else ++ warning ("unknown escape sequence: `\\' followed by char code 0x%x", c); ++ return c; ++} ++ ++void ++yyerror (string) ++ char *string; ++{ ++ char buf[200]; ++ ++ strcpy (buf, string); ++ ++ /* We can't print string and character constants well ++ because the token_buffer contains the result of processing escapes. */ ++ if (end_of_file) ++ strcat (buf, " at end of input"); ++ else if (token_buffer[0] == 0) ++ strcat (buf, " at null character"); ++ else if (token_buffer[0] == '"') ++ strcat (buf, " before string constant"); ++ else if (token_buffer[0] == '\'') ++ strcat (buf, " before character constant"); ++ else if (token_buffer[0] < 040 || token_buffer[0] >= 0177) ++ sprintf (buf + strlen (buf), " before character 0%o", token_buffer[0]); ++ else ++ strcat (buf, " before `%s'"); ++ ++ error (buf, token_buffer); ++} ++ ++static int ++yylex () ++{ ++ register int c; ++ register char *p; ++ register int value; ++ int wide_flag = 0; ++ ++ if (nextchar >= 0) ++ c = nextchar, nextchar = -1; ++ else ++ c = getc (finput); ++ ++ /* Effectively do c = skip_white_space (c) ++ but do it faster in the usual cases. */ ++ while (1) ++ switch (c) ++ { ++ case ' ': ++ case '\t': ++ case '\f': ++ case '\r': ++ case '\v': ++ case '\b': ++ c = getc (finput); ++ break; ++ ++ case '\n': ++ case '/': ++ case '\\': ++ c = skip_white_space (c); ++ default: ++ goto found_nonwhite; ++ } ++ found_nonwhite: ++ ++ token_buffer[0] = c; ++ token_buffer[1] = 0; ++ ++/* yylloc.first_line = lineno; */ ++ ++ switch (c) ++ { ++ case EOF: ++ end_of_file = 1; ++ token_buffer[0] = 0; ++ value = ENDFILE; ++ break; ++ ++ case '$': ++ if (dollars_in_ident) ++ goto letter; ++ return '$'; ++ ++ case 'L': ++ /* Capital L may start a wide-string or wide-character constant. */ ++ { ++ register int c = getc (finput); ++ if (c == '\'') ++ { ++ wide_flag = 1; ++ goto char_constant; ++ } ++ if (c == '"') ++ { ++ wide_flag = 1; ++ goto string_constant; ++ } ++ ungetc (c, finput); ++ } ++ ++ case 'A': case 'B': case 'C': case 'D': case 'E': ++ case 'F': case 'G': case 'H': case 'I': case 'J': ++ case 'K': case 'M': case 'N': case 'O': ++ case 'P': case 'Q': case 'R': case 'S': case 'T': ++ case 'U': case 'V': case 'W': case 'X': case 'Y': ++ case 'Z': ++ case 'a': case 'b': case 'c': case 'd': case 'e': ++ case 'f': case 'g': case 'h': case 'i': case 'j': ++ case 'k': case 'l': case 'm': case 'n': case 'o': ++ case 'p': case 'q': case 'r': case 's': case 't': ++ case 'u': case 'v': case 'w': case 'x': case 'y': ++ case 'z': ++ case '_': ++ letter: ++ p = token_buffer; ++ while (isalnum (c) || c == '_' || c == '$') ++ { ++ if (p >= token_buffer + maxtoken) ++ p = extend_token_buffer (p); ++ if (c == '$' && ! dollars_in_ident) ++ break; ++ ++ *p++ = c; ++ c = getc (finput); ++ } ++ ++ *p = 0; ++ nextchar = c; ++ ++ value = IDENTIFIER; ++ yylval.itype = 0; ++ ++ /* Try to recognize a keyword. Uses minimum-perfect hash function */ ++ ++ { ++ register struct resword *ptr; ++ ++ if (ptr = is_reserved_word (token_buffer, p - token_buffer)) ++ { ++ if (ptr->rid) ++ yylval.ttype = ridpointers[(int) ptr->rid]; ++ if ((! flag_no_asm ++ /* -fno-asm means don't recognize the non-ANSI keywords. */ ++ || ((int) ptr->token != ASM ++ && (int) ptr->token != TYPEOF ++ && ptr->rid != RID_INLINE) ++ /* Recognize __asm and __inline despite -fno-asm. */ ++ || token_buffer[0] == '_') ++ /* -ftraditional means don't recognize nontraditional keywords ++ typeof, const, volatile, signed or inline. */ ++ && (! flag_traditional ++ || ((int) ptr->token != TYPE_QUAL ++ && (int) ptr->token != TYPEOF ++ && ptr->rid != RID_SIGNED ++ && ptr->rid != RID_INLINE) ++ /* Recognize __inline, etc. despite -ftraditional. */ ++ || token_buffer[0] == '_')) ++ { ++ value = (int) ptr->token; ++ /* Even if we decided to recognize asm, still perhaps warn. */ ++ if (pedantic ++ && (value == ASM || value == TYPEOF ++ || ptr->rid == RID_INLINE) ++ && token_buffer[0] != '_') ++ warning ("ANSI does not permit the keyword `%s'", ++ token_buffer); ++ } ++ } ++ } ++ ++ /* If we did not find a keyword, look for an identifier ++ (or a typename). */ ++ ++ if (value == IDENTIFIER) ++ { ++ yylval.ttype = get_identifier (token_buffer); ++ lastiddecl = lookup_name (yylval.ttype); ++ ++ if (lastiddecl != 0 && TREE_CODE (lastiddecl) == TYPE_DECL) ++ value = TYPENAME; ++ } ++ ++ break; ++ ++ case '0': case '1': case '2': case '3': case '4': ++ case '5': case '6': case '7': case '8': case '9': ++ case '.': ++ { ++ int base = 10; ++ int count = 0; ++ int largest_digit = 0; ++ int numdigits = 0; ++ /* for multi-precision arithmetic, ++ we store only 8 live bits in each short, ++ giving us 64 bits of reliable precision */ ++ short shorts[8]; ++ int overflow = 0; ++ ++ enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag ++ = NOT_FLOAT; ++ ++ for (count = 0; count < 8; count++) ++ shorts[count] = 0; ++ ++ p = token_buffer; ++ *p++ = c; ++ ++ if (c == '0') ++ { ++ *p++ = (c = getc (finput)); ++ if ((c == 'x') || (c == 'X')) ++ { ++ base = 16; ++ *p++ = (c = getc (finput)); ++ } ++ else ++ { ++ base = 8; ++ numdigits++; ++ } ++ } ++ ++ /* Read all the digits-and-decimal-points. */ ++ ++ while (c == '.' ++ || (isalnum (c) && (c != 'l') && (c != 'L') ++ && (c != 'u') && (c != 'U') ++ && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F'))))) ++ { ++ if (c == '.') ++ { ++ if (base == 16) ++ error ("floating constant may not be in radix 16"); ++ if (floatflag == AFTER_POINT) ++ { ++ error ("malformed floating constant"); ++ floatflag = TOO_MANY_POINTS; ++ } ++ else ++ floatflag = AFTER_POINT; ++ ++ base = 10; ++ *p++ = c = getc (finput); ++ /* Accept '.' as the start of a floating-point number ++ only when it is followed by a digit. ++ Otherwise, unread the following non-digit ++ and use the '.' as a structural token. */ ++ if (p == token_buffer + 2 && !isdigit (c)) ++ { ++ if (c == '.') ++ { ++ c = getc (finput); ++ if (c == '.') ++ { ++ *p++ = c; ++ *p = 0; ++ return ELLIPSIS; ++ } ++ error ("parse error at `..'"); ++ } ++ ungetc (c, finput); ++ token_buffer[1] = 0; ++ value = '.'; ++ goto done; ++ } ++ } ++ else ++ { ++ /* It is not a decimal point. ++ It should be a digit (perhaps a hex digit). */ ++ ++ if (isdigit (c)) ++ { ++ c = c - '0'; ++ } ++ else if (base <= 10) ++ { ++ if ((c&~040) == 'E') ++ { ++ base = 10; ++ floatflag = AFTER_POINT; ++ break; /* start of exponent */ ++ } ++ error ("nondigits in number and not hexadecimal"); ++ c = 0; ++ } ++ else if (c >= 'a') ++ { ++ c = c - 'a' + 10; ++ } ++ else ++ { ++ c = c - 'A' + 10; ++ } ++ if (c >= largest_digit) ++ largest_digit = c; ++ numdigits++; ++ ++ for (count = 0; count < 8; count++) ++ { ++ shorts[count] *= base; ++ if (count) ++ { ++ shorts[count] += (shorts[count-1] >> 8); ++ shorts[count-1] &= (1<<8)-1; ++ } ++ else shorts[0] += c; ++ } ++ ++ if (shorts[7] >= 1<<8 ++ || shorts[7] < - (1 << 8)) ++ overflow = TRUE; ++ ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = (c = getc (finput)); ++ } ++ } ++ ++ if (numdigits == 0) ++ error ("numeric constant with no digits"); ++ ++ if (largest_digit >= base) ++ error ("numeric constant contains digits beyond the radix"); ++ ++ /* Remove terminating char from the token buffer and delimit the string */ ++ *--p = 0; ++ ++ if (floatflag != NOT_FLOAT) ++ { ++ tree type = double_type_node; ++ char f_seen = 0; ++ char l_seen = 0; ++ REAL_VALUE_TYPE value; ++ ++ /* Read explicit exponent if any, and put it in tokenbuf. */ ++ ++ if ((c == 'e') || (c == 'E')) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ if ((c == '+') || (c == '-')) ++ { ++ *p++ = c; ++ c = getc (finput); ++ } ++ if (! isdigit (c)) ++ error ("floating constant exponent has no digits"); ++ while (isdigit (c)) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ } ++ ++ *p = 0; ++ errno = 0; ++ value = REAL_VALUE_ATOF (token_buffer); ++#ifdef ERANGE ++ if (errno == ERANGE && !flag_traditional) ++ { ++ char *p1 = token_buffer; ++ /* Check for "0.0" and variants; ++ Sunos 4 spuriously returns ERANGE for them. */ ++ while (*p1 == '0') p1++; ++ if (*p1 == '.') ++ { ++ p1++; ++ while (*p1 == '0') p1++; ++ } ++ if (*p1 == 'e' || *p1 == 'E') ++ { ++ /* with significand==0, ignore the exponent */ ++ p1++; ++ while (*p1 != 0) p1++; ++ } ++ /* ERANGE is also reported for underflow, ++ so test the value to distinguish overflow from that. */ ++ if (*p1 != 0 && (value > 1.0 || value < -1.0)) ++ warning ("floating point number exceeds range of `double'"); ++ } ++#endif ++ ++ /* Read the suffixes to choose a data type. */ ++ while (1) ++ { ++ if (c == 'f' || c == 'F') ++ { ++ float floater; ++ if (f_seen) ++ error ("two `f's in floating constant"); ++ f_seen = 1; ++ type = float_type_node; ++ floater = value; ++ value = floater; ++ } ++ else if (c == 'l' || c == 'L') ++ { ++ if (l_seen) ++ error ("two `l's in floating constant"); ++ l_seen = 1; ++ type = long_double_type_node; ++ } ++ else ++ { ++ if (isalnum (c)) ++ { ++ error ("garbage at end of number"); ++ while (isalnum (c)) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ } ++ break; ++ } ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ ++ /* Create a node with determined type and value. */ ++ yylval.ttype = build_real (type, value); ++ ++ ungetc (c, finput); ++ *p = 0; ++ } ++ else ++ { ++ tree type; ++ int spec_unsigned = 0; ++ int spec_long = 0; ++ int spec_long_long = 0; ++ ++ while (1) ++ { ++ if (c == 'u' || c == 'U') ++ { ++ if (spec_unsigned) ++ error ("two `u's in integer constant"); ++ spec_unsigned = 1; ++ } ++ else if (c == 'l' || c == 'L') ++ { ++ if (spec_long) ++ { ++ if (spec_long_long) ++ error ("three `l's in integer constant"); ++ else if (pedantic) ++ warning ("ANSI C forbids long long integer constants"); ++ spec_long_long = 1; ++ } ++ spec_long = 1; ++ } ++ else ++ { ++ if (isalnum (c)) ++ { ++ error ("garbage at end of number"); ++ while (isalnum (c)) ++ { ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ } ++ break; ++ } ++ if (p >= token_buffer + maxtoken - 3) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ c = getc (finput); ++ } ++ ++ ungetc (c, finput); ++ ++ if ((overflow || shorts[7] || shorts[6] || shorts[5] || shorts[4]) ++ && !spec_long_long) ++ warning ("integer constant out of range"); ++ ++ /* If it won't fit in a signed long long, make it unsigned. ++ We can't distinguish based on the tree node because ++ any integer constant fits any long long type. */ ++ if (shorts[7] >= (1<<8)) ++ spec_unsigned = 1; ++ ++ /* This is simplified by the fact that our constant ++ is always positive. */ ++ /* The casts in the following statement should not be ++ needed, but they get around bugs in some C compilers. */ ++ yylval.ttype ++ = (build_int_2 ++ ((((long)shorts[3]<<24) + ((long)shorts[2]<<16) ++ + ((long)shorts[1]<<8) + (long)shorts[0]), ++ (spec_long_long ++ ? (((long)shorts[7]<<24) + ((long)shorts[6]<<16) ++ + ((long)shorts[5]<<8) + (long)shorts[4]) ++ : 0))); ++ ++ if (!spec_long && !spec_unsigned ++ && int_fits_type_p (yylval.ttype, integer_type_node)) ++ type = integer_type_node; ++ ++ else if (!spec_long && (base != 10 || spec_unsigned) ++ && int_fits_type_p (yylval.ttype, unsigned_type_node)) ++ type = unsigned_type_node; ++ ++ else if (!spec_unsigned && !spec_long_long ++ && int_fits_type_p (yylval.ttype, long_integer_type_node)) ++ type = long_integer_type_node; ++ ++ else if (! spec_long_long ++ && int_fits_type_p (yylval.ttype, ++ long_unsigned_type_node)) ++ type = long_unsigned_type_node; ++ ++ else if (! spec_unsigned ++ && int_fits_type_p (yylval.ttype, ++ long_long_integer_type_node)) ++ type = long_long_integer_type_node; ++ ++ else if (int_fits_type_p (yylval.ttype, ++ long_long_unsigned_type_node)) ++ type = long_long_unsigned_type_node; ++ ++ else ++ { ++ type = long_long_integer_type_node; ++ warning ("integer constant out of range"); ++ } ++ ++ TREE_TYPE (yylval.ttype) = type; ++ *p = 0; ++ } ++ ++ value = CONSTANT; break; ++ } ++ ++ case '\'': ++ char_constant: ++ { ++ register int result = 0; ++ register num_chars = 0; ++ int width = TYPE_PRECISION (char_type_node); ++ int max_chars; ++ ++ if (wide_flag) width = TYPE_PRECISION (integer_type_node); ++ ++ max_chars = TYPE_PRECISION (integer_type_node) / width; ++ ++ while (1) ++ { ++ tryagain: ++ ++ c = getc (finput); ++ ++ if (c == '\'' || c == EOF) ++ break; ++ ++ if (c == '\\') ++ { ++ c = readescape (); ++ if (c < 0) ++ goto tryagain; ++ if (width < HOST_BITS_PER_INT ++ && (unsigned) c >= (1 << width)) ++ warning ("escape sequence out of range for character"); ++ } ++ else if (c == '\n') ++ { ++ if (pedantic) ++ warning ("ANSI C forbids newline in character constant"); ++ lineno++; ++ } ++ ++ num_chars++; ++ if (num_chars > maxtoken - 4) ++ extend_token_buffer (token_buffer); ++ ++ token_buffer[num_chars] = c; ++ ++ /* Merge character into result; ignore excess chars. */ ++ if (num_chars < max_chars + 1) ++ { ++ if (width < HOST_BITS_PER_INT) ++ result = (result << width) | (c & ((1 << width) - 1)); ++ else ++ result = c; ++ } ++ } ++ ++ token_buffer[num_chars + 1] = '\''; ++ token_buffer[num_chars + 2] = 0; ++ ++ if (c != '\'') ++ error ("malformatted character constant"); ++ else if (num_chars == 0) ++ error ("empty character constant"); ++ else if (num_chars > max_chars) ++ { ++ num_chars = max_chars; ++ error ("character constant too long"); ++ } ++ else if (num_chars != 1 && ! flag_traditional) ++ warning ("multi-character character constant"); ++ ++ /* If char type is signed, sign-extend the constant. */ ++ if (! wide_flag) ++ { ++ int num_bits = num_chars * width; ++ if (TREE_UNSIGNED (char_type_node) ++ || ((result >> (num_bits - 1)) & 1) == 0) ++ yylval.ttype ++ = build_int_2 (result & ((unsigned) ~0 ++ >> (HOST_BITS_PER_INT - num_bits)), ++ 0); ++ else ++ yylval.ttype ++ = build_int_2 (result | ~((unsigned) ~0 ++ >> (HOST_BITS_PER_INT - num_bits)), ++ -1); ++ } ++ else ++ yylval.ttype = build_int_2 (result, 0); ++ ++ TREE_TYPE (yylval.ttype) = integer_type_node; ++ value = CONSTANT; break; ++ } ++ ++ case '"': ++ string_constant: ++ { ++ int *widep; ++ ++ c = getc (finput); ++ p = token_buffer + 1; ++ ++ if (wide_flag) ++ widep = wide_buffer; ++ ++ while (c != '"' && c >= 0) ++ { ++ if (c == '\\') ++ { ++ c = readescape (); ++ if (c < 0) ++ goto skipnewline; ++ if (!wide_flag && c >= (1 << TYPE_PRECISION (char_type_node))) ++ warning ("escape sequence out of range for character"); ++ } ++ else if (c == '\n') ++ { ++ if (pedantic) ++ warning ("ANSI C forbids newline in string constant"); ++ lineno++; ++ } ++ ++ /* Store the char in C into the appropriate buffer. */ ++ ++ if (wide_flag) ++ { ++ if (widep == wide_buffer + max_wide) ++ { ++ int n = widep - wide_buffer; ++ max_wide *= 2; ++ wide_buffer ++ = (int *) xrealloc (wide_buffer, ++ (max_wide + 1) * UNITS_PER_WORD); ++ widep = wide_buffer + n; ++ } ++ *widep++ = c; ++ } ++ else ++ { ++ if (p == token_buffer + maxtoken) ++ p = extend_token_buffer (p); ++ *p++ = c; ++ } ++ ++ skipnewline: ++ c = getc (finput); ++ } ++ ++ /* We have read the entire constant. ++ Construct a STRING_CST for the result. */ ++ ++ if (wide_flag) ++ { ++ /* If this is a L"..." wide-string, make a vector ++ of the ints in wide_buffer. */ ++ *widep = 0; ++ /* We have not implemented the case where `int' ++ on the target and on the execution machine differ in size. */ ++ if (TYPE_PRECISION (integer_type_node) ++ != sizeof (int) * BITS_PER_UNIT) ++ abort (); ++ yylval.ttype ++ = build_string ((widep - wide_buffer + 1) * sizeof (int), ++ wide_buffer); ++ TREE_TYPE (yylval.ttype) = int_array_type_node; ++ } ++ else ++ { ++ *p = 0; ++ yylval.ttype = build_string (p - token_buffer, token_buffer + 1); ++ TREE_TYPE (yylval.ttype) = char_array_type_node; ++ } ++ ++ *p++ = '"'; ++ *p = 0; ++ ++ value = STRING; break; ++ } ++ ++ case '+': ++ case '-': ++ case '&': ++ case '|': ++ case '<': ++ case '>': ++ case '*': ++ case '/': ++ case '%': ++ case '^': ++ case '!': ++ case '=': ++ { ++ register int c1; ++ ++ combine: ++ ++ switch (c) ++ { ++ case '+': ++ yylval.code = PLUS_EXPR; break; ++ case '-': ++ yylval.code = MINUS_EXPR; break; ++ case '&': ++ yylval.code = BIT_AND_EXPR; break; ++ case '|': ++ yylval.code = BIT_IOR_EXPR; break; ++ case '*': ++ yylval.code = MULT_EXPR; break; ++ case '/': ++ yylval.code = TRUNC_DIV_EXPR; break; ++ case '%': ++ yylval.code = TRUNC_MOD_EXPR; break; ++ case '^': ++ yylval.code = BIT_XOR_EXPR; break; ++ case LSHIFT: ++ yylval.code = LSHIFT_EXPR; break; ++ case RSHIFT: ++ yylval.code = RSHIFT_EXPR; break; ++ case '<': ++ yylval.code = LT_EXPR; break; ++ case '>': ++ yylval.code = GT_EXPR; break; ++ } ++ ++ token_buffer[1] = c1 = getc (finput); ++ token_buffer[2] = 0; ++ ++ if (c1 == '=') ++ { ++ switch (c) ++ { ++ case '<': ++ value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done; ++ case '>': ++ value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done; ++ case '!': ++ value = EQCOMPARE; yylval.code = NE_EXPR; goto done; ++ case '=': ++ value = EQCOMPARE; yylval.code = EQ_EXPR; goto done; ++ } ++ value = ASSIGN; goto done; ++ } ++ else if (c == c1) ++ switch (c) ++ { ++ case '+': ++ value = PLUSPLUS; goto done; ++ case '-': ++ value = MINUSMINUS; goto done; ++ case '&': ++ value = ANDAND; goto done; ++ case '|': ++ value = OROR; goto done; ++ case '<': ++ c = LSHIFT; ++ goto combine; ++ case '>': ++ c = RSHIFT; ++ goto combine; ++ } ++ else if ((c == '-') && (c1 == '>')) ++ { value = POINTSAT; goto done; } ++ ungetc (c1, finput); ++ token_buffer[1] = 0; ++ ++ if ((c == '<') || (c == '>')) ++ value = ARITHCOMPARE; ++ else value = c; ++ goto done; ++ } ++ ++ case 0: ++ /* Don't make yyparse think this is eof. */ ++ value = 1; ++ break; ++ ++ default: ++ value = c; ++ } ++ ++done: ++/* yylloc.last_line = lineno; */ ++ ++ return value; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/cpp.aux alliance/genview/src/gcc-1.42/cpp.aux +--- alliance-5.0/genview/src/gcc-1.42/cpp.aux 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cpp.aux 2002-04-11 09:14:43.000000000 +0200 +@@ -0,0 +1,82 @@ ++'xrdef {Top-pg}{1} ++'xrdef {Top-snt}{chapter'tie1} ++'xrdef {Global Actions-pg}{1} ++'xrdef {Global Actions-snt}{section'tie1.1} ++'xrdef {Commands-pg}{3} ++'xrdef {Commands-snt}{section'tie1.2} ++'xrdef {Header Files-pg}{3} ++'xrdef {Header Files-snt}{section'tie1.3} ++'xrdef {Header Uses-pg}{3} ++'xrdef {Header Uses-snt}{section'tie1.3.1} ++'xrdef {Include Syntax-pg}{4} ++'xrdef {Include Syntax-snt}{section'tie1.3.2} ++'xrdef {Include Operation-pg}{5} ++'xrdef {Include Operation-snt}{section'tie1.3.3} ++'xrdef {Once-Only-pg}{6} ++'xrdef {Once-Only-snt}{section'tie1.3.4} ++'xrdef {Macros-pg}{7} ++'xrdef {Macros-snt}{section'tie1.4} ++'xrdef {Simple Macros-pg}{7} ++'xrdef {Simple Macros-snt}{section'tie1.4.1} ++'xrdef {Argument Macros-pg}{9} ++'xrdef {Argument Macros-snt}{section'tie1.4.2} ++'xrdef {Predefined-pg}{11} ++'xrdef {Predefined-snt}{section'tie1.4.3} ++'xrdef {Standard Predefined-pg}{11} ++'xrdef {Standard Predefined-snt}{section'tie1.4.3.1} ++'xrdef {Nonstandard Predefined-pg}{13} ++'xrdef {Nonstandard Predefined-snt}{section'tie1.4.3.2} ++'xrdef {Stringification-pg}{15} ++'xrdef {Stringification-snt}{section'tie1.4.4} ++'xrdef {Concatenation-pg}{16} ++'xrdef {Concatenation-snt}{section'tie1.4.5} ++'xrdef {Undefining-pg}{17} ++'xrdef {Undefining-snt}{section'tie1.4.6} ++'xrdef {Redefining-pg}{18} ++'xrdef {Redefining-snt}{section'tie1.4.7} ++'xrdef {Macro Pitfalls-pg}{19} ++'xrdef {Macro Pitfalls-snt}{section'tie1.4.8} ++'xrdef {Misnesting-pg}{19} ++'xrdef {Misnesting-snt}{section'tie1.4.8.1} ++'xrdef {Macro Parentheses-pg}{19} ++'xrdef {Macro Parentheses-snt}{section'tie1.4.8.2} ++'xrdef {Swallow Semicolon-pg}{21} ++'xrdef {Swallow Semicolon-snt}{section'tie1.4.8.3} ++'xrdef {Side Effects-pg}{22} ++'xrdef {Side Effects-snt}{section'tie1.4.8.4} ++'xrdef {Self-Reference-pg}{23} ++'xrdef {Self-Reference-snt}{section'tie1.4.8.5} ++'xrdef {Argument Prescan-pg}{24} ++'xrdef {Argument Prescan-snt}{section'tie1.4.8.6} ++'xrdef {Cascaded Macros-pg}{27} ++'xrdef {Cascaded Macros-snt}{section'tie1.4.8.7} ++'xrdef {Conditionals-pg}{27} ++'xrdef {Conditionals-snt}{section'tie1.5} ++'xrdef {Conditional Uses-pg}{28} ++'xrdef {Conditional Uses-snt}{section'tie1.5.1} ++'xrdef {Conditional Syntax-pg}{28} ++'xrdef {Conditional Syntax-snt}{section'tie1.5.2} ++'xrdef {#if Command-pg}{28} ++'xrdef {#if Command-snt}{section'tie1.5.2.1} ++'xrdef {#else Command-pg}{29} ++'xrdef {#else Command-snt}{section'tie1.5.2.2} ++'xrdef {#elif Command-pg}{30} ++'xrdef {#elif Command-snt}{section'tie1.5.2.3} ++'xrdef {Deleted Code-pg}{31} ++'xrdef {Deleted Code-snt}{section'tie1.5.3} ++'xrdef {Conditionals-Macros-pg}{31} ++'xrdef {Conditionals-Macros-snt}{section'tie1.5.4} ++'xrdef {#error Command-pg}{32} ++'xrdef {#error Command-snt}{section'tie1.5.5} ++'xrdef {Combining Sources-pg}{33} ++'xrdef {Combining Sources-snt}{section'tie1.6} ++'xrdef {Other Commands-pg}{34} ++'xrdef {Other Commands-snt}{section'tie1.7} ++'xrdef {Output-pg}{35} ++'xrdef {Output-snt}{section'tie1.8} ++'xrdef {Invocation-pg}{35} ++'xrdef {Invocation-snt}{section'tie1.9} ++'xrdef {Concept Index-pg}{39} ++'xrdef {Concept Index-snt}{} ++'xrdef {Index-pg}{41} ++'xrdef {Index-snt}{} +diff -Naur alliance-5.0/genview/src/gcc-1.42/cpp.cps alliance/genview/src/gcc-1.42/cpp.cps +--- alliance-5.0/genview/src/gcc-1.42/cpp.cps 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cpp.cps 2002-04-11 09:14:43.000000000 +0200 +@@ -0,0 +1,30 @@ ++\initial {C} ++\entry {cascaded macros}{27} ++\entry {commands}{3} ++\entry {concatenation}{16} ++\entry {conditionals}{27} ++\initial {H} ++\entry {header file}{3} ++\initial {L} ++\entry {line control}{33} ++\initial {M} ++\entry {macro body uses macro}{27} ++\initial {N} ++\entry {null command}{34} ++\initial {O} ++\entry {options}{35} ++\entry {output format}{35} ++\initial {P} ++\entry {predefined macros}{11} ++\entry {preprocessor commands}{3} ++\initial {R} ++\entry {redefining macros}{18} ++\entry {repeated inclusion}{6} ++\initial {S} ++\entry {self-reference}{23} ++\entry {semicolons (after macro calls)}{21} ++\entry {side effects (in macro arguments)}{22} ++\entry {stringification}{15} ++\initial {U} ++\entry {undefining macros}{17} ++\entry {unsafe macros}{22} +diff -Naur alliance-5.0/genview/src/gcc-1.42/cpp.fns alliance/genview/src/gcc-1.42/cpp.fns +--- alliance-5.0/genview/src/gcc-1.42/cpp.fns 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cpp.fns 2002-04-11 09:14:43.000000000 +0200 +@@ -0,0 +1,51 @@ ++\initial {#} ++\entry {\code {#elif}}{30} ++\entry {\code {#else}}{29} ++\entry {\code {#error}}{32} ++\entry {\code {#ident}}{34} ++\entry {\code {#if}}{28} ++\entry {\code {#ifdef}}{32} ++\entry {\code {#ifndef}}{32} ++\entry {\code {#include}}{4} ++\entry {\code {#line}}{33} ++\entry {\code {#pragma}}{34} ++\initial {-} ++\entry {\code {-C}}{36} ++\entry {\code {-d}}{37} ++\entry {\code {-D}}{36} ++\entry {\code {-i}}{37} ++\entry {\code {-I}}{36} ++\entry {\code {-M}}{37} ++\entry {\code {-MM}}{37} ++\entry {\code {-P}}{35} ++\entry {\code {-pedantic}}{36} ++\entry {\code {-trigraphs}}{36} ++\entry {\code {-U}}{37} ++\entry {\code {-undef}}{37} ++\initial {{@fam @ttfam @tentt @char '137}} ++\entry {\code {{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}BASE{@fam @ttfam @tentt @char '137}FILE{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}}}{12} ++\entry {\code {{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}DATE{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}}}{12} ++\entry {\code {{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}FILE{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}}}{12} ++\entry {\code {{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}LINE{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}}}{12} ++\entry {\code {{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}STDC{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}}}{12} ++\entry {\code {{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}TIME{@fam @ttfam @tentt @char '137}{@fam @ttfam @tentt @char '137}}}{12} ++\initial {B} ++\entry {\code {BSD}}{13} ++\initial {D} ++\entry {\code {defined}}{31} ++\initial {M} ++\entry {\code {M68020}}{14} ++\entry {\code {m68k}}{13} ++\entry {\code {mc68000}}{13} ++\initial {N} ++\entry {\code {ns32000}}{14} ++\initial {P} ++\entry {\code {pyr}}{14} ++\initial {S} ++\entry {\code {sequent}}{14} ++\entry {\code {sun}}{14} ++\entry {\code {system header files}}{4} ++\initial {U} ++\entry {\code {unix}}{13} ++\initial {V} ++\entry {\code {vax}}{13} +diff -Naur alliance-5.0/genview/src/gcc-1.42/cpp.info alliance/genview/src/gcc-1.42/cpp.info +--- alliance-5.0/genview/src/gcc-1.42/cpp.info 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cpp.info 2002-04-11 09:14:43.000000000 +0200 +@@ -0,0 +1,69 @@ ++Info file cpp.info, produced by Makeinfo, -*- Text -*- from input ++file cpp.texinfo. ++ ++This file documents the GNU C Preprocessor. ++ ++Copyright (C) 1987, 1989 Free Software Foundation, Inc. ++ ++Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the entire resulting derived work is distributed under the terms ++of a permission notice identical to this one. ++ ++Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions. ++ ++Indirect: ++cpp.info-1: 748 ++cpp.info-2: 48706 ++ ++Tag Table: ++(Indirect) ++Node: Top750 ++Node: Global Actions3306 ++Node: Commands5809 ++Node: Header Files7414 ++Node: Header Uses7990 ++Node: Include Syntax9377 ++Node: Include Operation12390 ++Node: Once-Only14056 ++Node: Macros15867 ++Node: Simple Macros16779 ++Node: Argument Macros19826 ++Node: Predefined24914 ++Node: Standard Predefined25342 ++Node: Nonstandard Predefined29545 ++Node: Stringification32827 ++Node: Concatenation35666 ++Node: Undefining38922 ++Node: Redefining39944 ++Node: Macro Pitfalls41230 ++Node: Misnesting42273 ++Node: Macro Parentheses43281 ++Node: Swallow Semicolon45136 ++Node: Side Effects47024 ++Node: Self-Reference48708 ++Node: Argument Prescan50953 ++Node: Cascaded Macros55914 ++Node: Conditionals56935 ++Node: Conditional Uses58223 ++Node: Conditional Syntax59610 ++Node: #if Command60179 ++Node: #else Command62430 ++Node: #elif Command63077 ++Node: Deleted Code64418 ++Node: Conditionals-Macros64949 ++Node: #error Command68171 ++Node: Combining Sources69215 ++Node: Other Commands71829 ++Node: Output73062 ++Node: Invocation73993 ++Node: Concept Index79417 ++Node: Index80219 ++ ++End Tag Table +diff -Naur alliance-5.0/genview/src/gcc-1.42/cpp.info-1 alliance/genview/src/gcc-1.42/cpp.info-1 +--- alliance-5.0/genview/src/gcc-1.42/cpp.info-1 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cpp.info-1 2002-04-11 09:14:43.000000000 +0200 +@@ -0,0 +1,1254 @@ ++Info file cpp.info, produced by Makeinfo, -*- Text -*- from input ++file cpp.texinfo. ++ ++This file documents the GNU C Preprocessor. ++ ++Copyright (C) 1987, 1989 Free Software Foundation, Inc. ++ ++Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the entire resulting derived work is distributed under the terms ++of a permission notice identical to this one. ++ ++Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions. ++ ++ ++ ++File: cpp.info, Node: Top, Next: Global Actions, Up: (DIR) ++ ++The C Preprocessor ++****************** ++ ++The C preprocessor is a "macro processor" that is used automatically ++by the C compiler to transform your program before actual ++compilation. It is called a macro processor because it allows you to ++define "macros", which are brief abbreviations for longer constructs. ++ ++The C preprocessor provides four separate facilities that you can use ++as you see fit: ++ ++ * Inclusion of header files. These are files of declarations that ++ can be substituted into your program. ++ ++ * Macro expansion. You can define "macros", which are ++ abbreviations for arbitrary fragments of C code, and then the C ++ preprocessor will replace the macros with their definitions ++ throughout the program. ++ ++ * Conditional compilation. Using special preprocessor commands, ++ you can include or exclude parts of the program according to ++ various conditions. ++ ++ * Line control. If you use a program to combine or rearrange ++ source files into an intermediate file which is then compiled, ++ you can use line control to inform the compiler of where each ++ source line originally came from. ++ ++C preprocessors vary in some details. This manual discusses the GNU ++C preprocessor, the C Compatible Compiler Preprocessor. The GNU C ++preprocessor provides a superset of the features of ANSI Standard C. ++ ++ANSI Standard C requires the rejection of many harmless constructs ++commonly used by today's C programs. Such incompatibility would be ++inconvenient for users, so the GNU C preprocessor is configured to ++accept these constructs by default. Strictly speaking, to get ANSI ++Standard C, you must use the options `-trigraphs', `-undef' and ++`-pedantic', but in practice the consequences of having strict ANSI ++Standard C make it undesirable to do this. *Note Invocation::. ++ ++* Menu: ++ ++* Global Actions:: Actions made uniformly on all input files. ++* Commands:: General syntax of preprocessor commands. ++* Header Files:: How and why to use header files. ++* Macros:: How and why to use macros. ++* Conditionals:: How and why to use conditionals. ++* Combining Sources:: Use of line control when you combine source files. ++* Other Commands:: Miscellaneous preprocessor commands. ++* Output:: Format of output from the C preprocessor. ++* Invocation:: How to invoke the preprocessor; command options. ++* Concept Index:: Index of concepts and terms. ++* Index:: Index of commands, predefined macros and options. ++ ++ ++ ++File: cpp.info, Node: Global Actions, Next: Commands, Prev: Top, Up: Top ++ ++Transformations Made Globally ++============================= ++ ++Most C preprocessor features are inactive unless you give specific ++commands to request their use. (Preprocessor commands are lines ++starting with `#'; *note Commands::.). But there are three ++transformations that the preprocessor always makes on all the input ++it receives, even in the absence of commands. ++ ++ * All C comments are replaced with single spaces. ++ ++ * Backslash-Newline sequences are deleted, no matter where. This ++ feature allows you to break long lines for cosmetic purposes ++ without changing their meaning. ++ ++ * Predefined macro names are replaced with their expansions (*note ++ Predefined::.). ++ ++The first two transformations are done *before* nearly all other ++parsing and before preprocessor commands are recognized. Thus, for ++example, you can split a line cosmetically with Backslash-Newline ++anywhere (except when trigraphs are in use; see below). ++ ++ /* ++ */ # /* ++ */ defi\ ++ ne FO\ ++ O 10\ ++ 20 ++ ++is equivalent into `#define FOO 1020'. You can split even an escape ++sequence with Backslash-Newline. For example, you can split ++`"foo\bar"' between the `\' and the `b' to get ++ ++ "foo\\ ++ bar" ++ ++This behavior is unclean: in all other contexts, a Backslash can be ++inserted in a string constant as an ordinary character by writing a ++double Backslash, and this creates an exception. But the ANSI C ++standard requires it. (Strict ANSI C does not allow Newlines in ++string constants, so they do not consider this a problem.) ++ ++But there are a few exceptions to all three transformations. ++ ++ * C comments and predefined macro names are not recognized inside ++ a `#include' command in which the file name is delimited with ++ `<' and `>'. ++ ++ * C comments and predefined macro names are never recognized ++ within a character or string constant. (Strictly speaking, this ++ is the rule, not an exception, but it is worth noting here ++ anyway.) ++ ++ * Backslash-Newline may not safely be used within an ANSI ++ "trigraph". Trigraphs are converted before Backslash-Newline is ++ deleted. If you write what looks like a trigraph with a ++ Backslash-Newline inside, the Backslash-Newline is deleted as ++ usual, but it is then too late to recognize the trigraph. ++ ++ This exception is relevant only if you use the `-trigraphs' ++ option to enable trigraph processing. *Note Invocation::. ++ ++ ++ ++File: cpp.info, Node: Commands, Next: Header Files, Prev: Global Actions, Up: Top ++ ++Preprocessor Commands ++===================== ++ ++Most preprocessor features are active only if you use preprocessor ++commands to request their use. ++ ++Preprocessor commands are lines in your program that start with `#'. ++The `#' is followed by an identifier that is the "command name". For ++example, `#define' is the command that defines a macro. Whitespace ++is also allowed before and after the `#'. ++ ++The set of valid command names is fixed. Programs cannot define new ++preprocessor commands. ++ ++Some command names require arguments; these make up the rest of the ++command line and must be separated from the command name by ++whitespace. For example, `#define' must be followed by a macro name ++and the intended expansion of the macro. ++ ++A preprocessor command cannot be more than one line in normal ++circumstances. It may be split cosmetically with Backslash-Newline, ++but that has no effect on its meaning. Comments containing Newlines ++can also divide the command into multiple lines, but the comments are ++changed to Spaces before the command is interpreted. The only way a ++significant Newline can occur in a preprocessor command is within a ++string constant or character constant. Note that most C compilers ++that might be applied to the output from the preprocessor do not ++accept string or character constants containing Newlines. ++ ++The `#' and the command name cannot come from a macro expansion. For ++example, if `foo' is defined as a macro expanding to `define', that ++does not make `#foo' a valid preprocessor command. ++ ++ ++ ++File: cpp.info, Node: Header Files, Next: Macros, Prev: Commands, Up: Top ++ ++Header Files ++============ ++ ++A header file is a file containing C declarations and macro ++definitions (*note Macros::.) to be shared between several source ++files. You request the use of a header file in your program with the ++C preprocessor command `#include'. ++ ++* Menu: ++ ++* Header Uses:: What header files are used for. ++* Include Syntax:: How to write `#include' commands. ++* Include Operation:: What `#include' does. ++* Once-Only:: Preventing multiple inclusion of one header file. ++ ++ ++ ++File: cpp.info, Node: Header Uses, Next: Include Syntax, Prev: Header Files, Up: Header Files ++ ++Uses of Header Files ++-------------------- ++ ++Header files serve two kinds of purposes. ++ ++ * System header files declare the interfaces to parts of the ++ operating system. You include them in your program to supply ++ the definitions you need to invoke system calls and libraries. ++ ++ * Your own header files contain declarations for interfaces ++ between the source files of your program. Each time you have a ++ group of related declarations and macro definitions all or most ++ of which are needed in several different source files, it is a ++ good idea to create a header file for them. ++ ++Including a header file produces the same results in C compilation as ++copying the header file into each source file that needs it. But ++such copying would be time-consuming and error-prone. With a header ++file, the related declarations appear in only one place. If they ++need to be changed, they can be changed in one place, and programs ++that include the header file will automatically use the new version ++when next recompiled. The header file eliminates the labor of ++finding and changing all the copies as well as the risk that a ++failure to find one copy will result in inconsistencies within a ++program. ++ ++The usual convention is to give header files names that end with `.h'. ++ ++ ++ ++File: cpp.info, Node: Include Syntax, Next: Include Operation, Prev: Header Uses, Up: Header Files ++ ++The `#include' Command ++---------------------- ++ ++Both user and system header files are included using the preprocessor ++command `#include'. It has three variants: ++ ++`#include ' ++ This variant is used for system header files. It searches for a ++ file named FILE in a list of directories specified by you, then ++ in a standard list of system directories. You specify ++ directories to search for header files with the command option ++ `-I' (*note Invocation::.). The option `-nostdinc' inhibits ++ searching the standard system directories; in this case only the ++ directories you specify are searched. ++ ++ The parsing of this form of `#include' is slightly special ++ because comments are not recognized within the `<...>'. Thus, ++ in `#include ' the `/*' does not start a comment and the ++ command specifies inclusion of a system header file named ++ `x/*y'. Of course, a header file with such a name is unlikely ++ to exist on Unix, where shell wildcard features would make it ++ hard to manipulate. ++ ++ The argument FILE may not contain a `>' character. It may, ++ however, contain a `<' character. ++ ++`#include "FILE"' ++ This variant is used for header files of your own program. It ++ searches for a file named FILE first in the current directory, ++ then in the same directories used for system header files. The ++ current directory is the directory of the current input file. ++ It is tried first because it is presumed to be the location of ++ the files that the current input file refers to. (If the `-I-' ++ option is used, the special treatment of the current directory ++ is inhibited.) ++ ++ The argument FILE may not contain `"' characters. If ++ backslashes occur within FILE, they are considered ordinary text ++ characters, not escape characters. None of the character escape ++ sequences appropriate to string constants in C are processed. ++ Thus, `#include "x\n\\y"' specifies a filename containing three ++ backslashes. It is not clear why this behavior is ever useful, ++ but the ANSI standard specifies it. ++ ++`#include ANYTHING ELSE' ++ This variant is called a "computed #include". Any `#include' ++ command whose argument does not fit the above two forms is a ++ computed include. The text ANYTHING ELSE is checked for macro ++ calls, which are expanded (*note Macros::.). When this is done, ++ the result must fit one of the above two variants. ++ ++ This feature allows you to define a macro which controls the ++ file name to be used at a later point in the program. One ++ application of this is to allow a site-configuration file for ++ your program to specify the names of the system include files to ++ be used. This can help in porting the program to various ++ operating systems in which the necessary system header files are ++ found in different places. ++ ++ ++ ++File: cpp.info, Node: Include Operation, Next: Once-Only, Prev: Include Syntax, Up: Header Files ++ ++How `#include' Works ++-------------------- ++ ++The `#include' command works by directing the C preprocessor to scan ++the specified file as input before continuing with the rest of the ++current file. The output from the preprocessor contains the output ++already generated, followed by the output resulting from the included ++file, followed by the output that comes from the text after the ++`#include' command. For example, given two files as follows: ++ ++ /* File program.c */ ++ int x; ++ #include "header.h" ++ ++ main () ++ { ++ printf (test ()); ++ } ++ ++ ++ /* File header.h */ ++ char *test (); ++ ++the output generated by the C preprocessor for `program.c' as input ++would be ++ ++ int x; ++ char *test (); ++ ++ main () ++ { ++ printf (test ()); ++ } ++ ++Included files are not limited to declarations and macro definitions; ++they are merely the typical use. Any fragment of a C program can be ++included from another file. The include file could even contain the ++beginning of a statement that is concluded in the containing file, or ++the end of a statement that was started in the including file. ++However, a comment or a string or character constant may not start in ++the included file and finish in the including file. An unterminated ++comment, string constant or character constant in an included file is ++considered to end (with an error message) at the end of the file. ++ ++The line following the `#include' command is always treated as a ++separate line by the C preprocessor even if the included file lacks a ++final newline. ++ ++ ++ ++File: cpp.info, Node: Once-Only, Prev: Include Operation, Up: Header Files ++ ++Once-Only Include Files ++----------------------- ++ ++Very often, one header file includes another. It can easily result ++that a certain header file is included more than once. This may lead ++to errors, if the header file defines structure types or typedefs, ++and is certainly wasteful. Therefore, we often wish to prevent ++multiple inclusion of a header file. ++ ++The standard way to do this is to enclose the entire real contents of ++the file in a conditional, like this: ++ ++ #ifndef __FILE_FOO_SEEN__ ++ #define __FILE_FOO_SEEN__ ++ ++ THE ENTIRE FILE ++ ++ #endif /* __FILE_FOO_SEEN__ */ ++ ++The macro `__FILE_FOO_SEEN__' indicates that the file has been ++included once already; its name should begin with `__', and should ++contain the name of the file to avoid accidental conflicts. ++ ++One drawback of this method is that the preprocessor must scan the ++input file completely in order to determine that all of it is to be ++ignored. This makes compilation slower. You can avoid the delay by ++inserting the following command near the beginning of file *in ++addition to the conditionals described above*: ++ ++ #pragma once ++ ++This command tells the GNU C preprocessor to ignore any future ++commands to include the same file (whichever file the `#pragma' ++appears in). ++ ++You should not *rely* on `#pragma once' to prevent multiple inclusion ++of the file. It is just a hint, and a nonstandard one at that. Most ++C compilers will ignore it entirely. For this reason, you still need ++the conditionals if you want to make certain that the file's contents ++are not included twice. ++ ++Note that `#pragma once' works by file name; if a file has more than ++one name, it can be included once under each name, even in GNU CC, ++despite `#pragma once'. ++ ++ ++ ++File: cpp.info, Node: Macros, Next: Conditionals, Prev: Header Files, Up: Top ++ ++Macros ++====== ++ ++A macro is a sort of abbreviation which you can define once and then ++use later. There are many complicated features associated with ++macros in the C preprocessor. ++ ++* Menu: ++ ++* Simple Macros:: Macros that always expand the same way. ++* Argument Macros:: Macros that accept arguments that are substituted ++ into the macro expansion. ++* Predefined:: Predefined macros that are always available. ++* Stringification:: Macro arguments converted into string constants. ++* Concatenation:: Building tokens from parts taken from macro arguments. ++* Undefining:: Cancelling a macro's definition. ++* Redefining:: Changing a macro's definition. ++* Macro Pitfalls:: Macros can confuse the unwary. Here we explain ++ several common problems and strange features. ++ ++ ++ ++File: cpp.info, Node: Simple Macros, Next: Argument Macros, Prev: Macros, Up: Macros ++ ++Simple Macros ++------------- ++ ++A "simple macro" is a kind of abbreviation. It is a name which ++stands for a fragment of code. ++ ++Before you can use a macro, you must "define" it explicitly with the ++`#define' command. `#define' is followed by the name of the macro ++and then the code it should be an abbreviation for. For example, ++ ++ #define BUFFER_SIZE 1020 ++ ++defines a macro named `BUFFER_SIZE' as an abbreviation for the text ++`1020'. Therefore, if somewhere after this `#define' command there ++comes a C statement of the form ++ ++ foo = (char *) xmalloc (BUFFER_SIZE); ++ ++then the C preprocessor will recognize and "expand" the macro ++`BUFFER_SIZE', resulting in ++ ++ foo = (char *) xmalloc (1020); ++ ++the definition must be a single line; however, it may not end in the ++middle of a multi-line string constant or character constant. ++ ++The use of all upper case for macro names is a standard convention. ++Programs are easier to read when it is possible to tell at a glance ++which names are macros. ++ ++Normally, a macro definition must be a single line, like all C ++preprocessor commands. (You can split a long macro definition ++cosmetically with Backslash-Newline.) There is one exception: ++Newlines can be included in the macro definition if within a string ++or character constant. By the same token, it is not possible for a ++macro definition to contain an unbalanced quote character; the ++definition automatically extends to include the matching quote ++character that ends the string or character constant. Comments ++within a macro definition may contain Newlines, which make no ++difference since the comments are entirely replaced with Spaces ++regardless of their contents. ++ ++Aside from the above, there is no restriction on what can go in a ++macro body. Parentheses need not balance. The body need not ++resemble valid C code. (Of course, you might get error messages from ++the C compiler when you use the macro.) ++ ++The C preprocessor scans your program sequentially, so macro ++definitions take effect at the place you write them. Therefore, the ++following input to the C preprocessor ++ ++ foo = X; ++ #define X 4 ++ bar = X; ++ ++produces as output ++ ++ foo = X; ++ ++ bar = 4; ++ ++After the preprocessor expands a macro name, the macro's definition ++body is appended to the front of the remaining input, and the check ++for macro calls continues. Therefore, the macro body can contain ++calls to other macros. For example, after ++ ++ #define BUFSIZE 1020 ++ #define TABLESIZE BUFSIZE ++ ++the name `TABLESIZE' when used in the program would go through two ++stages of expansion, resulting ultimately in `1020'. ++ ++This is not at all the same as defining `TABLESIZE' to be `1020'. ++The `#define' for `TABLESIZE' uses exactly the body you specify--in ++this case, `BUFSIZE'--and does not check to see whether it too is the ++name of a macro. It's only when you *use* `TABLESIZE' that the ++result of its expansion is checked for more macro names. *Note ++Cascaded Macros::. ++ ++ ++ ++File: cpp.info, Node: Argument Macros, Next: Predefined, Prev: Simple Macros, Up: Macros ++ ++Macros with Arguments ++--------------------- ++ ++A simple macro always stands for exactly the same text, each time it ++is used. Macros can be more flexible when they accept "arguments". ++Arguments are fragments of code that you supply each time the macro ++is used. These fragments are included in the expansion of the macro ++according to the directions in the macro definition. ++ ++To define a macro that uses arguments, you write a `#define' command ++with a list of "argument names" in parentheses after the name of the ++macro. The argument names may be any valid C identifiers, separated ++by commas and optionally whitespace. The open-parenthesis must ++follow the macro name immediately, with no space in between. ++ ++For example, here is a macro that computes the minimum of two numeric ++values, as it is defined in many C programs: ++ ++ #define min(X, Y) ((X) < (Y) ? (X) : (Y)) ++ ++(This is not the best way to define a "minimum" macro in GNU C. ++*Note Side Effects::, for more information.) ++ ++To use a macro that expects arguments, you write the name of the ++macro followed by a list of "actual arguments" in parentheses. ++separated by commas. The number of actual arguments you give must ++match the number of arguments the macro expects. Examples of use of ++the macro `min' include `min (1, 2)' and `min (x + 28, *p)'. ++ ++The expansion text of the macro depends on the arguments you use. ++Each of the argument names of the macro is replaced, throughout the ++macro definition, with the corresponding actual argument. Using the ++same macro `min' defined above, `min (1, 2)' expands into ++ ++ ((1) < (2) ? (1) : (2)) ++ ++where `1' has been substituted for `X' and `2' for `Y'. ++ ++Likewise, `min (x + 28, *p)' expands into ++ ++ ((x + 28) < (*p) ? (x + 28) : (*p)) ++ ++Parentheses in the actual arguments must balance; a comma within ++parentheses does not end an argument. However, there is no ++requirement for brackets or braces to balance; thus, if you want to ++supply `array[x = y, x + 1]' as an argument, you must write it as ++`array[(x = y, x + 1)]', which is equivalent C code. ++ ++After the actual arguments are substituted into the macro body, the ++entire result is appended to the front of the remaining input, and ++the check for macro calls continues. Therefore, the actual arguments ++can contain calls to other macros, either with or without arguments, ++or even to the same macro. The macro body can also contain calls to ++other macros. For example, `min (min (a, b), c)' expands into ++ ++ ((((a) < (b) ? (a) : (b))) < (c) ++ ? (((a) < (b) ? (a) : (b))) ++ : (c)) ++ ++(Line breaks shown here for clarity would not actually be generated.) ++ ++If you use the macro name followed by something other than an ++open-parenthesis (after ignoring any spaces, tabs and comments that ++follow), it is not a call to the macro, and the preprocessor leaves ++the name unaltered. Therefore, it is possible for the same name to ++be a variable or function in your program as well as a macro, and you ++can choose in each instance whether to refer to the macro (if an ++actual argument list follows) or the variable or function (if an ++argument list does not follow). ++ ++Such dual use of one name could be confusing and should be avoided ++except when the two meanings are effectively synonymous: that is, ++when the name is both a macro and a function and the two have similar ++effects. You can think of the name simply as a function; use of the ++name for purposes other than calling it (such as, to take the ++address) will refer to the function, while calls will expand the ++macro and generate better but equivalent code. For example, you can ++use a function named `min' in the same source file that defines the ++macro. If you write `&min' with no argument list, you refer to the ++function. If you write `min (x, bb)', with an argument list, the ++macro is expanded. If you write `(min) (a, bb)', where the name ++`min' is not followed by an open-parenthesis, the macro is not ++expanded, so you wind up with a call to the function `min'. ++ ++It is not allowed to define the same name as both a simple macro and ++a macro with arguments. ++ ++In the definition of a macro with arguments, the list of argument ++names must follow the macro name immediately with no space in ++between. If there is a space after the macro name, the macro is ++defined as taking no arguments, and all the rest of the name is taken ++to be the expansion. The reason for this is that it is often useful ++to define a macro that takes no arguments and whose definition begins ++with an identifier in parentheses. This rule about spaces makes it ++possible for you to do either this: ++ ++ #define FOO(x) - 1 / (x) ++ ++(which defines `FOO' to take an argument and expand into minus the ++reciprocal of that argument) or this: ++ ++ #define BAR (x) - 1 / (x) ++ ++(which defines `BAR' to take no argument and always expand into `(x) ++- 1 / (x)'). ++ ++Note that the *uses* of a macro with arguments can have spaces before ++the left parenthesis; it's the *definition* where it matters whether ++there is a space. ++ ++ ++ ++File: cpp.info, Node: Predefined, Next: Stringification, Prev: Argument Macros, Up: Macros ++ ++Predefined Macros ++----------------- ++ ++Several simple macros are predefined. You can use them without ++giving definitions for them. They fall into two classes: standard ++macros and system-specific macros. ++ ++* Menu: ++ ++* Standard Predefined:: Standard predefined macros. ++* Nonstandard Predefined:: Nonstandard predefined macros. ++ ++ ++ ++File: cpp.info, Node: Standard Predefined, Next: Nonstandard Predefined, Prev: Predefined, Up: Predefined ++ ++Standard Predefined Macros ++.......................... ++ ++ The standard predefined macros are available with the same meanings ++regardless of the machine or operating system on which you are using ++GNU C. Their names all start and end with double underscores. Those ++preceding `__GNUC__' in this table are standardized by ANSI C; the ++rest are GNU C extensions. ++ ++`__FILE__' ++ This macro expands to the name of the current input file, in the ++ form of a C string constant. ++ ++`__BASE_FILE__' ++ This macro expands to the name of the main input file, in the ++ form of a C string constant. This is the source file that was ++ specified as an argument when the C compiler was invoked. ++ ++`__LINE__' ++ This macro expands to the current input line number, in the form ++ of a decimal integer constant. While we call it a predefined ++ macro, it's a pretty strange macro, since its "definition" ++ changes with each new line of source code. ++ ++ This and `__FILE__' are useful in generating an error message to ++ report an inconsistency detected by the program; the message can ++ state the source line at which the inconsistency was detected. ++ For example, ++ ++ fprintf (stderr, "Internal error: negative string length " ++ "%d at %s, line %d.", ++ length, __FILE__, __LINE__); ++ ++ A `#include' command changes the expansions of `__FILE__' and ++ `__LINE__' to correspond to the included file. At the end of ++ that file, when processing resumes on the input file that ++ contained the `#include' command, the expansions of `__FILE__' ++ and `__LINE__' revert to the values they had before the ++ `#include' (but `__LINE__' is then incremented by one as ++ processing moves to the line after the `#include'). ++ ++ The expansions of both `__FILE__' and `__LINE__' are altered if ++ a `#line' command is used. *Note Combining Sources::. ++ ++`__DATE__' ++ This macro expands to a string constant that describes the date ++ on which the preprocessor is being run. The string constant ++ contains eleven characters and looks like `"Jan 29 1987"' or ++ `"Apr 1 1905"'. ++ ++`__TIME__' ++ This macro expands to a string constant that describes the time ++ at which the preprocessor is being run. The string constant ++ contains eight characters and looks like `"23:59:01"'. ++ ++`__STDC__' ++ This macro expands to the constant 1, to signify that this is ++ ANSI Standard C. (Whether that is actually true depends on what ++ C compiler will operate on the output from the preprocessor.) ++ ++`__GNUC__' ++ This macro is defined if and only if this is GNU C. This macro ++ is defined only when the entire GNU C compiler is in use; if you ++ invoke the preprocessor directly, `__GNUC__' is undefined. ++ ++`__STRICT_ANSI__' ++ This macro is defined if and only if the `-ansi' switch was ++ specified when GNU C was invoked. Its definition is the null ++ string. This macro exists primarily to direct certain GNU ++ header files not to define certain traditional Unix constructs ++ which are incompatible with ANSI C. ++ ++`__VERSION__' ++ This macro expands to a string which describes the version ++ number of GNU C. The string is normally a sequence of decimal ++ numbers separated by periods, such as `"1.18"'. The only ++ reasonable use of this macro is to incorporate it into a string ++ constant. ++ ++`__OPTIMIZE__' ++ This macro is defined in optimizing compilations. It causes ++ certain GNU header files to define alternative macro definitions ++ for some system library functions. It is unwise to refer to or ++ test the definition of this macro unless you make very sure that ++ programs will execute with the same effect regardless. ++ ++`__CHAR_UNSIGNED__' ++ This macro is defined if and only if the data type `char' is ++ unsigned on the target machine. It exists to cause the standard ++ header file `limit.h' to work correctly. It is bad practice to ++ refer to this macro yourself; instead, refer to the standard ++ macros defined in `limit.h'. ++ ++ ++ ++File: cpp.info, Node: Nonstandard Predefined, Prev: Standard Predefined, Up: Predefined ++ ++Nonstandard Predefined Macros ++............................. ++ ++ The C preprocessor normally has several predefined macros that vary ++between machines because their purpose is to indicate what type of ++system and machine is in use. This manual, being for all systems and ++machines, cannot tell you exactly what their names are; instead, we ++offer a list of some typical ones. ++ ++Some nonstandard predefined macros describe the operating system in ++use, with more or less specificity. For example, ++ ++`unix' ++ `unix' is normally predefined on all Unix systems. ++ ++`BSD' ++ `BSD' is predefined on recent versions of Berkeley Unix (perhaps ++ only in version 4.3). ++ ++Other nonstandard predefined macros describe the kind of CPU, with ++more or less specificity. For example, ++ ++`vax' ++ `vax' is predefined on Vax computers. ++ ++`mc68000' ++ `mc68000' is predefined on most computers whose CPU is a ++ Motorola 68000, 68010 or 68020. ++ ++`m68k' ++ `m68k' is also predefined on most computers whose CPU is a ++ 68000, 68010 or 68020; however, some makers use `mc68000' and ++ some use `m68k'. Some predefine both names. What happens in ++ GNU C depends on the system you are using it on. ++ ++`M68020' ++ `M68020' has been observed to be predefined on some systems that ++ use 68020 CPUs--in addition to `mc68000' and `m68k' that are ++ less specific. ++ ++`ns32000' ++ `ns32000' is predefined on computers which use the National ++ Semiconductor 32000 series CPU. ++ ++Yet other nonstandard predefined macros describe the manufacturer of ++the system. For example, ++ ++`sun' ++ `sun' is predefined on all models of Sun computers. ++ ++`pyr' ++ `pyr' is predefined on all models of Pyramid computers. ++ ++`sequent' ++ `sequent' is predefined on all models of Sequent computers. ++ ++These predefined symbols are not only nonstandard, they are contrary ++to the ANSI standard because their names do not start with underscores. ++Therefore, the option `-ansi' inhibits the definition of these symbols. ++ ++This tends to make `-ansi' useless, since many programs depend on the ++customary nonstandard predefined symbols. Even system header files ++check them and will generate incorrect declarations if they do not ++find the names that are expected. You might think that the header ++files supplied for the Uglix computer would not need to test what ++machine they are running on, because they can simply assume it is the ++Uglix; but often they do, and they do so using the customary names. ++As a result, very few C programs will compile with `-ansi'. We ++intend to avoid such problems on the GNU system. ++ ++What, then, should you do in an ANSI C program to test the type of ++machine it is to run on? ++ ++GNU C offers a parallel series of symbols for this purpose, whose ++names are made from the customary ones by adding `__' at the ++beginning and end. Thus, the symbol `__vax__' would be available on ++a vax, and so on. ++ ++The set of nonstandard predefined names in the GNU C preprocessor is ++controlled by the macro `CPP_PREDEFINES', which should be a string ++containing `-D' options, separated by spaces. For example, on the ++Sun 3, we use the following definition: ++ ++ #define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k" ++ ++ ++ ++File: cpp.info, Node: Stringification, Next: Concatenation, Prev: Predefined, Up: Macros ++ ++Stringification ++--------------- ++ ++"Stringification" means turning a code fragment into a string ++constant whose contents are the text for the code fragment. For ++example, stringifying `foo (z)' results in `"foo (z)"'. ++ ++In the C preprocessor, stringification is an option available when ++macro arguments are substituted into the macro definition. In the ++body of the definition, when an argument name appears, the character ++`#' before the name specifies stringification of the corresponding ++actual argument when it is substituted at that point in the ++definition. The same argument may be substituted in other places in ++the definition without stringification if the argument name appears ++in those places with no `#'. ++ ++Here is an example of a macro definition that uses stringification: ++ ++ #define WARN_IF(EXP) \ ++ do { if (EXP) fprintf (stderr, "Warning: " #EXP "\n"); } while (0) ++ ++Here the actual argument for `EXP' is substituted once as given, into ++the `if' statement, and once as stringified, into the argument to ++`fprintf'. The `do' and `while (0)' are a kludge to make it possible ++to write `WARN_IF (ARG);', which the resemblance of `WARN_IF' to a ++function would make C programmers want to do; *note Swallow ++Semicolon::.). ++ ++The stringification feature is limited to transforming one macro ++argument into one string constant: there is no way to combine the ++argument with other text and then stringify it all together. But the ++example above shows how an equivalent result can be obtained in ANSI ++Standard C using the feature that adjacent string constants are ++concatenated as one string constant. The preprocessor stringifies ++`EXP''s actual argument into a separate string constant, resulting in ++text like ++ ++ do { if (x == 0) fprintf (stderr, "Warning: " "x == 0" "\n"); } while (0) ++ ++but the C compiler then sees three consecutive string constants and ++concatenates them into one, producing effectively ++ ++ do { if (x == 0) fprintf (stderr, "Warning: x == 0\n"); } while (0) ++ ++Stringification in C involves more than putting doublequote ++characters around the fragment; it is necessary to put backslashes in ++front of all doublequote characters, and all backslashes in string ++and character constants, in order to get a valid C string constant ++with the proper contents. Thus, stringifying `p = "foo\n";' results ++in `"p = \"foo\\n\";"'. However, backslashes that are not inside of ++string or character constants are not duplicated: `\n' by itself ++stringifies to `"\n"'. ++ ++Whitespace (including comments) in the text being stringified is ++handled according to precise rules. All leading and trailing ++whitespace is ignored. Any sequence of whitespace in the middle of ++the text is converted to a single space in the stringified result. ++ ++ ++ ++File: cpp.info, Node: Concatenation, Next: Undefining, Prev: Stringification, Up: Macros ++ ++Concatenation ++------------- ++ ++"Concatenation" means joining two strings into one. In the context ++of macro expansion, concatenation refers to joining two lexical units ++into one longer one. Specifically, an actual argument to the macro ++can be concatenated with another actual argument or with fixed text ++to produce a longer name. The longer name might be the name of a ++function, variable or type, or a C keyword; it might even be the name ++of another macro, in which case it will be expanded. ++ ++When you define a macro, you request concatenation with the special ++operator `##' in the macro body. When the macro is called, after ++actual arguments are substituted, all `##' operators are deleted, and ++so is any whitespace next to them (including whitespace that was part ++of an actual argument). The result is to concatenate the syntactic ++tokens on either side of the `##'. ++ ++Consider a C program that interprets named commands. There probably ++needs to be a table of commands, perhaps an array of structures ++declared as follows: ++ ++ struct command ++ { ++ char *name; ++ void (*function) (); ++ }; ++ ++ struct command commands[] = ++ { ++ { "quit", quit_command}, ++ { "help", help_command}, ++ ... ++ }; ++ ++It would be cleaner not to have to give each command name twice, once ++in the string constant and once in the function name. A macro which ++takes the name of a command as an argument can make this unnecessary. ++The string constant can be created with stringification, and the ++function name by concatenating the argument with `_command'. Here is ++how it is done: ++ ++ #define COMMAND(NAME) { #NAME, NAME ## _command } ++ ++ struct command commands[] = ++ { ++ COMMAND (quit), ++ COMMAND (help), ++ ... ++ }; ++ ++The usual case of concatenation is concatenating two names (or a name ++and a number) into a longer name. But this isn't the only valid ++case. It is also possible to concatenate two numbers (or a number ++and a name, such as `1.5' and `e3') into a number. Also, ++multi-character operators such as `+=' can be formed by ++concatenation. In some cases it is even possible to piece together a ++string constant. However, two pieces of text that don't together ++form a valid lexical unit cannot be concatenated. For example, ++concatenation with `x' on one side and `+' on the other is not ++meaningful because those two characters can't fit together in any ++lexical unit of C. The ANSI standard says that such attempts at ++concatenation are undefined, but in the GNU C preprocessor it is well ++defined: it puts the `x' and `+' side by side with no particular ++special results. ++ ++Keep in mind that the C preprocessor converts comments to whitespace ++before macros are even considered. Therefore, you cannot create a ++comment by concatenating `/' and `*': the `/*' sequence that starts a ++comment is not a lexical unit, but rather the beginning of a "long" ++space character. Also, you can freely use comments next to a `##' in ++a macro definition, or in actual arguments that will be concatenated, ++because the comments will be converted to spaces at first sight, and ++concatenation will later discard the spaces. ++ ++ ++ ++File: cpp.info, Node: Undefining, Next: Redefining, Prev: Concatenation, Up: Macros ++ ++Undefining Macros ++----------------- ++ ++To "undefine" a macro means to cancel its definition. This is done ++with the `#undef' command. `#undef' is followed by the macro name to ++be undefined. ++ ++Like definition, undefinition occurs at a specific point in the ++source file, and it applies starting from that point. The name ++ceases to be a macro name, and from that point on it is treated by ++the preprocessor as if it had never been a macro name. ++ ++For example, ++ ++ #define FOO 4 ++ x = FOO; ++ #undef FOO ++ x = FOO; ++ ++expands into ++ ++ x = 4; ++ ++ x = FOO; ++ ++In this example, `FOO' had better be a variable or function as well ++as (temporarily) a macro, in order for the result of the expansion to ++be valid C code. ++ ++The same form of `#undef' command will cancel definitions with ++arguments or definitions that don't expect arguments. The `#undef' ++command has no effect when used on a name not currently defined as a ++macro. ++ ++ ++ ++File: cpp.info, Node: Redefining, Next: Macro Pitfalls, Prev: Undefining, Up: Macros ++ ++Redefining Macros ++----------------- ++ ++"Redefining" a macro means defining (with `#define') a name that is ++already defined as a macro. ++ ++A redefinition is trivial if the new definition is transparently ++identical to the old one. You probably wouldn't deliberately write a ++trivial redefinition, but they can happen automatically when a header ++file is included more than once (*note Header Files::.), so they are ++accepted silently and without effect. ++ ++Nontrivial redefinition is considered likely to be an error, so it ++provokes a warning message from the preprocessor. However, sometimes ++it is useful to change the definition of a macro in mid-compilation. ++You can inhibit the warning by undefining the macro with `#undef' ++before the second definition. ++ ++In order for a redefinition to be trivial, the new definition must ++exactly match the one already in effect, with two possible exceptions: ++ ++ * Whitespace may be added or deleted at the beginning or the end. ++ ++ * Whitespace may be changed in the middle (but not inside strings). ++ However, it may not be eliminated entirely, and it may not be ++ added where there was no whitespace at all. ++ ++Recall that a comment counts as whitespace. ++ ++ ++ ++File: cpp.info, Node: Macro Pitfalls, Prev: Redefining, Up: Macros ++ ++Pitfalls and Subtleties of Macros ++--------------------------------- ++ ++In this section we describe some special rules that apply to macros ++and macro expansion, and point out certain cases in which the rules ++have counterintuitive consequences that you must watch out for. ++ ++* Menu: ++ ++* Misnesting:: Macros can contain unmatched parentheses. ++* Macro Parentheses:: Why apparently superfluous parentheses ++ may be necessary to avoid incorrect grouping. ++* Swallow Semicolon:: Macros that look like functions ++ but expand into compound statements. ++* Side Effects:: Unsafe macros that cause trouble when ++ arguments contain side effects. ++* Self-Reference:: Macros whose definitions use the macros' own names. ++* Argument Prescan:: Actual arguments are checked for macro calls ++ before they are substituted. ++* Cascaded Macros:: Macros whose definitions use other macros. ++ ++ ++ ++File: cpp.info, Node: Misnesting, Next: Macro Parentheses, Prev: Macro Pitfalls, Up: Macro Pitfalls ++ ++Improperly Nested Constructs ++............................ ++ ++ Recall that when a macro is called with arguments, the arguments are ++substituted into the macro body and the result is checked, together ++with the rest of the input file, for more macro calls. ++ ++It is possible to piece together a macro call coming partially from ++the macro body and partially from the actual arguments. For example, ++ ++ #define double(x) (2*(x)) ++ #define call_with_1(x) x(1) ++ ++would expand `call_with_1 (double)' into `(2*(1))'. ++ ++Macro definitions do not have to have balanced parentheses. By ++writing an unbalanced open parenthesis in a macro body, it is ++possible to create a macro call that begins inside the macro body but ++ends outside of it. For example, ++ ++ #define strange(file) fprintf (file, "%s %d", ++ ... ++ strange(stderr) p, 35) ++ ++This bizarre example expands to `fprintf (stderr, "%s %d", p, 35)'! ++ ++ ++ ++File: cpp.info, Node: Macro Parentheses, Next: Swallow Semicolon, Prev: Misnesting, Up: Macro Pitfalls ++ ++Unintended Grouping of Arithmetic ++................................. ++ ++ You may have noticed that in most of the macro definition examples ++shown above, each occurrence of a macro argument name had parentheses ++around it. In addition, another pair of parentheses usually surround ++the entire macro definition. Here is why it is best to write macros ++that way. ++ ++Suppose you define a macro as follows, ++ ++ #define ceil_div(x, y) (x + y - 1) / y ++ ++whose purpose is to divide, rounding up. (One use for this operation ++is to compute how many `int''s are needed to hold a certain number of ++`char''s.) Then suppose it is used as follows: ++ ++ a = ceil_div (b & c, sizeof (int)); ++ ++This expands into ++ ++ a = (b & c + sizeof (int) - 1) / sizeof (int); ++ ++which does not do what is intended. The operator-precedence rules of ++C make it equivalent to this: ++ ++ a = (b & (c + sizeof (int) - 1)) / sizeof (int); ++ ++But what we want is this: ++ ++ a = ((b & c) + sizeof (int) - 1)) / sizeof (int); ++ ++Defining the macro as ++ ++ #define ceil_div(x, y) ((x) + (y) - 1) / (y) ++ ++provides the desired result. ++ ++However, unintended grouping can result in another way. Consider ++`sizeof ceil_div(1, 2)'. That has the appearance of a C expression ++that would compute the size of the type of `ceil_div (1, 2)', but in ++fact it means something very different. Here is what it expands to: ++ ++ sizeof ((1) + (2) - 1) / (2) ++ ++This would take the size of an integer and divide it by two. The ++precedence rules have put the division outside the `sizeof' when it ++was intended to be inside. ++ ++Parentheses around the entire macro definition can prevent such ++problems. Here, then, is the recommended way to define `ceil_div': ++ ++ #define ceil_div(x, y) (((x) + (y) - 1) / (y)) ++ ++ ++ ++File: cpp.info, Node: Swallow Semicolon, Next: Side Effects, Prev: Macro Parentheses, Up: Macro Pitfalls ++ ++Swallowing the Semicolon ++........................ ++ ++ Often it is desirable to define a macro that expands into a compound ++statement. Consider, for example, the following macro, that advances ++a pointer (the argument `p' says where to find it) across whitespace ++characters: ++ ++ #define SKIP_SPACES (p, limit) \ ++ { register char *lim = (limit); \ ++ while (p != lim) { \ ++ if (*p++ != ' ') { \ ++ p--; break; }}} ++ ++Here Backslash-Newline is used to split the macro definition, which ++must be a single line, so that it resembles the way such C code would ++be laid out if not part of a macro definition. ++ ++A call to this macro might be `SKIP_SPACES (p, lim)'. Strictly ++speaking, the call expands to a compound statement, which is a ++complete statement with no need for a semicolon to end it. But it ++looks like a function call. So it minimizes confusion if you can use ++it like a function call, writing a semicolon afterward, as in ++`SKIP_SPACES (p, lim);' ++ ++But this can cause trouble before `else' statements, because the ++semicolon is actually a null statement. Suppose you write ++ ++ if (*p != 0) ++ SKIP_SPACES (p, lim); ++ else ... ++ ++ The presence of two statements--the compound statement and a null ++statement--in between the `if' condition and the `else' makes invalid ++C code. ++ ++The definition of the macro `SKIP_SPACES' can be altered to solve ++this problem, using a `do ... while' statement. Here is how: ++ ++ #define SKIP_SPACES (p, limit) \ ++ do { register char *lim = (limit); \ ++ while (p != lim) { \ ++ if (*p++ != ' ') { \ ++ p--; break; }}} \ ++ while (0) ++ ++Now `SKIP_SPACES (p, lim);' expands into ++ ++ do {...} while (0); ++ ++which is one statement. ++ ++ ++ ++File: cpp.info, Node: Side Effects, Next: Self-Reference, Prev: Swallow Semicolon, Up: Macro Pitfalls ++ ++Duplication of Side Effects ++........................... ++ ++ Many C programs define a macro `min', for "minimum", like this: ++ ++ #define min(X, Y) ((X) < (Y) ? (X) : (Y)) ++ ++When you use this macro with an argument containing a side effect, as ++shown here, ++ ++ next = min (x + y, foo (z)); ++ ++it expands as follows: ++ ++ next = ((x + y) < (foo (z)) ? (x + y) : (foo (z))); ++ ++where `x + y' has been substituted for `X' and `foo (z)' for `Y'. ++ ++The function `foo' is used only once in the statement as it appears ++in the program, but the expression `foo (z)' has been substituted ++twice into the macro expansion. As a result, `foo' might be called ++two times when the statement is executed. If it has side effects or ++if it takes a long time to compute, the results might not be what you ++intended. We say that `min' is an "unsafe" macro. ++ ++The best solution to this problem is to define `min' in a way that ++computes the value of `foo (z)' only once. The C language offers no ++standard way to do this, but it can be done with GNU C extensions as ++follows: ++ ++ #define min(X, Y) \ ++ ({ typeof (X) __x = (X), __y = (Y); \ ++ (__x < __y) ? __x : __y; }) ++ ++If you do not wish to use GNU C extensions, the only solution is to ++be careful when *using* the macro `min'. For example, you can ++calculate the value of `foo (z)', save it in a variable, and use that ++variable in `min': ++ ++ #define min(X, Y) ((X) < (Y) ? (X) : (Y)) ++ ... ++ { ++ int tem = foo (z); ++ next = min (x + y, tem); ++ } ++ ++(where I assume that `foo' returns type `int'). ++ ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/cpp.info-2 alliance/genview/src/gcc-1.42/cpp.info-2 +--- alliance-5.0/genview/src/gcc-1.42/cpp.info-2 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cpp.info-2 2002-04-11 09:14:43.000000000 +0200 +@@ -0,0 +1,881 @@ ++Info file cpp.info, produced by Makeinfo, -*- Text -*- from input ++file cpp.texinfo. ++ ++This file documents the GNU C Preprocessor. ++ ++Copyright (C) 1987, 1989 Free Software Foundation, Inc. ++ ++Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the entire resulting derived work is distributed under the terms ++of a permission notice identical to this one. ++ ++Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions. ++ ++ ++ ++File: cpp.info, Node: Self-Reference, Next: Argument Prescan, Prev: Side Effects, Up: Macro Pitfalls ++ ++Self-Referential Macros ++....................... ++ ++ A "self-referential" macro is one whose name appears in its definition. ++A special feature of ANSI Standard C is that the self-reference is ++not considered a macro call. It is passed into the preprocessor ++output unchanged. ++ ++Let's consider an example: ++ ++ #define foo (4 + foo) ++ ++where `foo' is also a variable in your program. ++ ++Following the ordinary rules, each reference to `foo' will expand ++into `(4 + foo)'; then this will be rescanned and will expand into ++`(4 + (4 + foo))'; and so on until it causes a fatal error (memory ++full) in the preprocessor. ++ ++However, the special rule about self-reference cuts this process ++short after one step, at `(4 + foo)'. Therefore, this macro ++definition has the possibly useful effect of causing the program to ++add 4 to the value of `foo' wherever `foo' is referred to. ++ ++In most cases, it is a bad idea to take advantage of this feature. A ++person reading the program who sees that `foo' is a variable will not ++expect that it is a macro as well. The reader will come across the ++identifier `foo' in the program and think its value should be that of ++the variable `foo', whereas in fact the value is four greater. ++ ++The special rule for self-reference applies also to "indirect" ++self-reference. This is the case where a macro X expands to use a ++macro `y', and `y''s expansion refers to the macro `x'. The ++resulting reference to `x' comes indirectly from the expansion of ++`x', so it is a self-reference and is not further expanded. Thus, ++after ++ ++ #define x (4 + y) ++ #define y (2 * x) ++ ++`x' would expand into `(4 + (2 * x))'. Clear? ++ ++But suppose `y' is used elsewhere, not from the definition of `x'. ++Then the use of `x' in the expansion of `y' is not a self-reference ++because `x' is not "in progress". So it does expand. However, the ++expansion of `x' contains a reference to `y', and that is an indirect ++self-reference now because `y' is "in progress". The result is that ++`y' expands to `(2 * (4 + y))'. ++ ++It is not clear that this behavior would ever be useful, but it is ++specified by the ANSI C standard, so you need to understand it. ++ ++ ++ ++File: cpp.info, Node: Argument Prescan, Next: Cascaded Macros, Prev: Self-Reference, Up: Macro Pitfalls ++ ++Separate Expansion of Macro Arguments ++..................................... ++ ++ We have explained that the expansion of a macro, including the ++substituted actual arguments, is scanned over again for macro calls ++to be expanded. ++ ++What really happens is more subtle: first each actual argument text ++is scanned separately for macro calls. Then the results of this are ++substituted into the macro body to produce the macro expansion, and ++the macro expansion is scanned again for macros to expand. ++ ++The result is that the actual arguments are scanned *twice* to expand ++macro calls in them. ++ ++Most of the time, this has no effect. If the actual argument ++contained any macro calls, they are expanded during the first scan. ++The result therefore contains no macro calls, so the second scan does ++not change it. If the actual argument were substituted as given, ++with no prescan, the single remaining scan would find the same macro ++calls and produce the same results. ++ ++You might expect the double scan to change the results when a ++self-referential macro is used in an actual argument of another macro ++(*note Self-Reference::.): the self-referential macro would be ++expanded once in the first scan, and a second time in the second ++scan. But this is not what happens. The self-references that do not ++expand in the first scan are marked so that they will not expand in ++the second scan either. ++ ++The prescan is not done when an argument is stringified or ++concatenated. Thus, ++ ++ #define str(s) #s ++ #define foo 4 ++ str (foo) ++ ++expands to `"foo"'. Once more, prescan has been prevented from ++having any noticeable effect. ++ ++More precisely, stringification and concatenation use the argument as ++written, in un-prescanned form. The same actual argument would be ++used in prescanned form if it is substituted elsewhere without ++stringification or concatenation. ++ ++ #define str(s) #s lose(s) ++ #define foo 4 ++ str (foo) ++ ++expands to `"foo" lose(4)'. ++ ++You might now ask, "Why mention the prescan, if it makes no difference? ++And why not skip it and make the preprocessor faster?" The answer is ++that the prescan does make a difference in three special cases: ++ ++ * Nested calls to a macro. ++ ++ * Macros that call other macros that stringify or concatenate. ++ ++ * Macros whose expansions contain unshielded commas. ++ ++We say that "nested" calls to a macro occur when a macro's actual ++argument contains a call to that very macro. For example, if `f' is ++a macro that expects one argument, `f (f (1))' is a nested pair of ++calls to `f'. The desired expansion is made by expanding `f (1)' and ++substituting that into the definition of `f'. The prescan causes the ++expected result to happen. Without the prescan, `f (1)' itself would ++be substituted as an actual argument, and the inner use of `f' would ++appear during the main scan as an indirect self-reference and would ++not be expanded. Here, the prescan cancels an undesirable side ++effect (in the medical, not computational, sense of the term) of the ++special rule for self-referential macros. ++ ++But prescan causes trouble in certain other cases of nested macro ++calls. Here is an example: ++ ++ #define foo a,b ++ #define bar(x) lose(x) ++ #define lose(x) (1 + (x)) ++ ++ bar(foo) ++ ++We would like `bar(foo)' to turn into `(1 + (foo))', which would then ++turn into `(1 + (a,b))'. But instead, `bar(foo)' expands into ++`lose(a,b)', and you get an error because `lose' requires a single ++argument. In this case, the problem is easily solved by the same ++parentheses that ought to be used to prevent misnesting of arithmetic ++operations: ++ ++ #define foo (a,b) ++ #define bar(x) lose((x)) ++ ++The problem is more serious when the operands of the macro are not ++expressions; for example, when they are statements. Then parentheses ++are unacceptable because they would make for invalid C code: ++ ++ #define foo { int a, b; ... } ++ ++In GNU C you can shield the commas using the `({...})' construct ++which turns a compound statement into an expression: ++ ++ #define foo ({ int a, b; ... }) ++ ++Or you can rewrite the macro definition to avoid such commas: ++ ++ #define foo { int a; int b; ... } ++ ++There is also one case where prescan is useful. It is possible to ++use prescan to expand an argument and then stringify it--if you use ++two levels of macros. Let's add a new macro `xstr' to the example ++shown above: ++ ++ #define xstr(s) str(s) ++ #define str(s) #s ++ #define foo 4 ++ xstr (foo) ++ ++This expands into `"4"', not `"foo"'. The reason for the difference ++is that the argument of `xstr' is expanded at prescan (because `xstr' ++does not specify stringification or concatenation of the argument). ++The result of prescan then forms the actual argument for `str'. ++`str' uses its argument without prescan because it performs ++stringification; but it cannot prevent or undo the prescanning ++already done by `xstr'. ++ ++ ++ ++File: cpp.info, Node: Cascaded Macros, Prev: Argument Prescan, Up: Macro Pitfalls ++ ++Cascaded Use of Macros ++...................... ++ ++ A "cascade" of macros is when one macro's body contains a reference ++to another macro. This is very common practice. For example, ++ ++ #define BUFSIZE 1020 ++ #define TABLESIZE BUFSIZE ++ ++This is not at all the same as defining `TABLESIZE' to be `1020'. ++The `#define' for `TABLESIZE' uses exactly the body you specify--in ++this case, `BUFSIZE'--and does not check to see whether it too is the ++name of a macro. ++ ++It's only when you *use* `TABLESIZE' that the result of its expansion ++is checked for more macro names. ++ ++This makes a difference if you change the definition of `BUFSIZE' at ++some point in the source file. `TABLESIZE', defined as shown, will ++always expand using the definition of `BUFSIZE' that is currently in ++effect: ++ ++ #define BUFSIZE 1020 ++ #define TABLESIZE BUFSIZE ++ #undef BUFSIZE ++ #define BUFSIZE 37 ++ ++Now `TABLESIZE' expands (in two stages) to `37'. ++ ++ ++ ++File: cpp.info, Node: Conditionals, Next: Combining Sources, Prev: Macros, Up: Top ++ ++Conditionals ++============ ++ ++In a macro processor, a "conditional" is a command that allows a part ++of the program to be ignored during compilation, on some conditions. ++In the C preprocessor, a conditional can test either an arithmetic ++expression or whether a name is defined as a macro. ++ ++A conditional in the C preprocessor resembles in some ways an `if' ++statement in C, but it is important to understand the difference ++between them. The condition in an `if' statement is tested during ++the execution of your program. Its purpose is to allow your program ++to behave differently from run to run, depending on the data it is ++operating on. The condition in a preprocessor conditional command is ++tested when your program is compiled. Its purpose is to allow ++different code to be included in the program depending on the ++situation at the time of compilation. ++ ++* Menu: ++ ++* Uses: Conditional Uses. What conditionals are for. ++* Syntax: Conditional Syntax. How conditionals are written. ++* Deletion: Deleted Code. Making code into a comment. ++* Macros: Conditionals-Macros. Why conditionals are used with macros. ++* Errors: #error Command. Detecting inconsistent compilation parameters. ++ ++ ++ ++File: cpp.info, Node: Conditional Uses, Next: Conditional Syntax, Prev: Conditionals, Up: Conditionals ++ ++Why Conditionals are Used ++------------------------- ++ ++Generally there are three kinds of reason to use a conditional. ++ ++ * A program may need to use different code depending on the ++ machine or operating system it is to run on. In some cases the ++ code for one operating system may be erroneous on another ++ operating system; for example, it might refer to library ++ routines that do not exist on the other system. When this ++ happens, it is not enough to avoid executing the invalid code: ++ merely having it in the program makes it impossible to link the ++ program and run it. With a preprocessor conditional, the ++ offending code can be effectively excised from the program when ++ it is not valid. ++ ++ * You may want to be able to compile the same source file into two ++ different programs. Sometimes the difference between the ++ programs is that one makes frequent time-consuming consistency ++ checks on its intermediate data while the other does not. ++ ++ * A conditional whose condition is always false is a good way to ++ exclude code from the program but keep it as a sort of comment ++ for future reference. ++ ++Most simple programs that are intended to run on only one machine ++will not need to use preprocessor conditionals. ++ ++ ++ ++File: cpp.info, Node: Conditional Syntax, Next: Deleted Code, Prev: Conditional Uses, Up: Conditionals ++ ++Syntax of Conditionals ++---------------------- ++ ++A conditional in the C preprocessor begins with a "conditional ++command": `#if', `#ifdef' or `#ifndef'. *Note Conditionals-Macros::, ++for info on `#ifdef' and `#ifndef'; only `#if' is explained here. ++ ++* Menu: ++ ++* If: #if Command. Basic conditionals using `#if' and `#endif'. ++* Else: #else Command. Including some text if the condition fails. ++* Elif: #elif Command. Testing several alternative possibilities. ++ ++ ++ ++File: cpp.info, Node: #if Command, Next: #else Command, Prev: Conditional Syntax, Up: Conditional Syntax ++ ++The `#if' Command ++................. ++ ++ The `#if' command in its simplest form consists of ++ ++ #if EXPRESSION ++ CONTROLLED TEXT ++ #endif /* EXPRESSION */ ++ ++The comment following the `#endif' is not required, but it is a good ++practice because it helps people match the `#endif' to the ++corresponding `#if'. Such comments should always be used, except in ++short conditionals that are not nested. In fact, you can put ++anything at all after the `#endif' and it will be ignored by the GNU ++C preprocessor, but only comments are acceptable in ANSI Standard C. ++ ++EXPRESSION is a C expression of integer type, subject to stringent ++restrictions. It may contain ++ ++ * Integer constants, which are all regarded as `long' or `unsigned ++ long'. ++ ++ * Character constants, which are interpreted according to the ++ character set and conventions of the machine and operating ++ system on which the preprocessor is running. The GNU C ++ preprocessor uses the C data type `char' for these character ++ constants; therefore, whether some character codes are negative ++ is determined by the C compiler used to compile the ++ preprocessor. If it treats `char' as signed, then character ++ codes large enough to set the sign bit will be considered ++ negative; otherwise, no character code is considered negative. ++ ++ * Arithmetic operators for addition, subtraction, multiplication, ++ division, bitwise operations, shifts, comparisons, and `&&' and ++ `||'. ++ ++ * Identifiers that are not macros, which are all treated as zero(!). ++ ++ * Macro calls. All macro calls in the expression are expanded ++ before actual computation of the expression's value begins. ++ ++Note that `sizeof' operators and `enum'-type values are not allowed. ++`enum'-type values, like all other identifiers that are not taken as ++macro calls and expanded, are treated as zero. ++ ++The text inside of a conditional can include preprocessor commands. ++Then the commands inside the conditional are obeyed only if that ++branch of the conditional succeeds. The text can also contain other ++conditional groups. However, the `#if''s and `#endif''s must balance. ++ ++ ++ ++File: cpp.info, Node: #else Command, Next: #elif Command, Prev: #if Command, Up: Conditional Syntax ++ ++The `#else' Command ++................... ++ ++ The `#else' command can be added to a conditional to provide ++alternative text to be used if the condition is false. This looks like ++ ++ #if EXPRESSION ++ TEXT-IF-TRUE ++ #else /* Not EXPRESSION */ ++ TEXT-IF-FALSE ++ #endif /* Not EXPRESSION */ ++ ++If EXPRESSION is nonzero, and the TEXT-IF-TRUE is considered ++included, then `#else' acts like a failing conditional and the ++TEXT-IF-FALSE is ignored. Contrariwise, if the `#if' conditional ++fails, the TEXT-IF-FALSE is considered included. ++ ++ ++ ++File: cpp.info, Node: #elif Command, Prev: #else Command, Up: Conditional Syntax ++ ++The `#elif' Command ++................... ++ ++ One common case of nested conditionals is used to check for more than ++two possible alternatives. For example, you might have ++ ++ #if X == 1 ++ ... ++ #else /* X != 1 */ ++ #if X == 2 ++ ... ++ #else /* X != 2 */ ++ ... ++ #endif /* X != 2 */ ++ #endif /* X != 1 */ ++ ++Another conditional command, `#elif', allows this to be abbreviated ++as follows: ++ ++ #if X == 1 ++ ... ++ #elif X == 2 ++ ... ++ #else /* X != 2 and X != 1*/ ++ ... ++ #endif /* X != 2 and X != 1*/ ++ ++`#elif' stands for "else if". Like `#else', it goes in the middle of ++a `#if'-`#endif' pair and subdivides it; it does not require a ++matching `#endif' of its own. Like `#if', the `#elif' command ++includes an expression to be tested. ++ ++The text following the `#elif' is processed only if the original ++`#if'-condition failed and the `#elif' condition succeeeds. More ++than one `#elif' can go in the same `#if'-`#endif' group. Then the ++text after each `#elif' is processed only if the `#elif' condition ++succeeds after the original `#if' and any previous `#elif''s within ++it have failed. `#else' is equivalent to `#elif 1', and `#else' is ++allowed after any number of `#elif''s, but `#elif' may not follow a ++`#else'. ++ ++ ++ ++File: cpp.info, Node: Deleted Code, Next: Conditionals-Macros, Prev: Conditional Syntax, Up: Conditionals ++ ++Keeping Deleted Code for Future Reference ++----------------------------------------- ++ ++If you replace or delete a part of the program but want to keep the ++old code around as a comment for future reference, the easy way to do ++this is to put `#if 0' before it and `#endif' after it. ++ ++This works even if the code being turned off contains conditionals, ++but they must be entire conditionals (balanced `#if' and `#endif'). ++ ++ ++ ++File: cpp.info, Node: Conditionals-Macros, Next: #error Command, Prev: Deleted Code, Up: Conditionals ++ ++Conditionals and Macros ++----------------------- ++ ++Conditionals are rarely useful except in connection with macros. A ++`#if' command whose expression uses no macros is equivalent to `#if ++1' or `#if 0'; you might as well determine which one, by computing ++the value of the expression yourself, and then simplify the program. ++But when the expression uses macros, its value can vary from ++compilation to compilation. ++ ++For example, here is a conditional that tests the expression `BUFSIZE ++== 1020', where `BUFSIZE' must be a macro. ++ ++ #if BUFSIZE == 1020 ++ printf ("Large buffers!\n"); ++ #endif /* BUFSIZE is large */ ++ ++The special operator `defined' may be used in `#if' expressions to ++test whether a certain name is defined as a macro. Either `defined ++NAME' or `defined (NAME)' is an expression whose value is 1 if NAME ++is defined as macro at the current point in the program, and 0 ++otherwise. For the `defined' operator it makes no difference what ++the definition of the macro is; all that matters is whether there is ++a definition. Thus, for example, ++ ++ #if defined (vax) || defined (ns16000) ++ ++would include the following code if either of the names `vax' and ++`ns16000' is defined as a macro. ++ ++If a macro is defined and later undefined with `#undef', subsequent ++use of the `defined' operator will return 0, because the name is no ++longer defined. If the macro is defined again with another ++`#define', `defined' will recommence returning 1. ++ ++Conditionals that test just the definedness of one name are very ++common, so there are two special short conditional commands for this ++case. They are ++ ++`#ifdef NAME' ++ is equivalent to `#if defined (NAME)'. ++ ++`#ifndef NAME' ++ is equivalent to `#if ! defined (NAME)'. ++ ++Macro definitions can vary between compilations for several reasons. ++ ++ * Some macros are predefined on each kind of machine. For ++ example, on a Vax, the name `vax' is a predefined macro. On ++ other machines, it would not be defined. ++ ++ * Many more macros are defined by system header files. Different ++ systems and machines define different macros, or give them ++ different values. It is useful to test these macros with ++ conditionals to avoid using a system feature on a machine where ++ it is not implemented. ++ ++ * Macros are a common way of allowing users to customize a program ++ for different machines or applications. For example, the macro ++ `BUFSIZE' might be defined in a configuration file for your ++ program that is included as a header file in each source file. ++ You would use `BUFSIZE' in a preprocessor conditional in order ++ to generate different code depending on the chosen configuration. ++ ++ * Macros can be defined or undefined with `-D' and `-U' command ++ options when you compile the program. You can arrange to ++ compile the same source file into two different programs by ++ choosing a macro name to specify which program you want, writing ++ conditionals to test whether or how this macro is defined, and ++ then controlling the state of the macro with compiler command ++ options. *Note Invocation::. ++ ++ ++ ++File: cpp.info, Node: #error Command, Prev: Conditionals-Macros, Up: Conditionals ++ ++The `#error' Command ++-------------------- ++ ++The command `#error' causes the preprocessor to report a fatal error. ++The rest of the line that follows `#error' is used as the error ++message. ++ ++You would use `#error' inside of a conditional that detects a ++combination of parameters which you know the program does not ++properly support. For example, if you know that the program will not ++run properly on a Vax, you might write ++ ++ #ifdef vax ++ #error Won't work on Vaxen. See comments at get_last_object. ++ #endif ++ ++*Note Nonstandard Predefined::, for why this works. ++ ++If you have several configuration parameters that must be set up by ++the installation in a consistent way, you can use conditionals to ++detect an inconsistency and report it with `#error'. For example, ++ ++ #if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \ ++ || HASH_TABLE_SIZE % 5 == 0 ++ #error HASH_TABLE_SIZE should not be divisible by a small prime ++ #endif ++ ++ ++ ++File: cpp.info, Node: Combining Sources, Next: Other Commands, Prev: Conditionals, Up: Top ++ ++Combining Source Files ++====================== ++ ++One of the jobs of the C preprocessor is to inform the C compiler of ++where each line of C code came from: which source file and which line ++number. ++ ++C code can come from multiple source files if you use `#include'; ++both `#include' and the use of conditionals and macros can cause the ++line number of a line in the preprocessor output to be different from ++the line's number in the original source file. You will appreciate ++the value of making both the C compiler (in error messages) and ++symbolic debuggers such as GDB use the line numbers in your source ++file. ++ ++The C preprocessor builds on this feature by offering a command by ++which you can control the feature explicitly. This is useful when a ++file for input to the C preprocessor is the output from another ++program such as the `bison' parser generator, which operates on ++another file that is the true source file. Parts of the output from ++`bison' are generated from scratch, other parts come from a standard ++parser file. The rest are copied nearly verbatim from the source ++file, but their line numbers in the `bison' output are not the same ++as their original line numbers. Naturally you would like compiler ++error messages and symbolic debuggers to know the original source ++file and line number of each line in the `bison' output. ++ ++`bison' arranges this by writing `#line' commands into the output ++file. `#line' is a command that specifies the original line number ++and source file name for subsequent input in the current preprocessor ++input file. `#line' has three variants: ++ ++`#line LINENUM' ++ Here LINENUM is a decimal integer constant. This specifies that ++ the line number of the following line of input, in its original ++ source file, was LINENUM. ++ ++`#line LINENUM FILENAME' ++ Here LINENUM is a decimal integer constant and FILENAME is a ++ string constant. This specifies that the following line of ++ input came originally from source file FILENAME and its line ++ number there was LINENUM. Keep in mind that FILENAME is not ++ just a file name; it is surrounded by doublequote characters so ++ that it looks like a string constant. ++ ++`#line ANYTHING ELSE' ++ ANYTHING ELSE is checked for macro calls, which are expanded. ++ The result should be a decimal integer constant followed ++ optionally by a string constant, as described above. ++ ++`#line' commands alter the results of the `__FILE__' and `__LINE__' ++predefined macros from that point on. *Note Standard Predefined::. ++ ++ ++ ++File: cpp.info, Node: Other Commands, Next: Output, Prev: Combining Sources, Up: Top ++ ++Miscellaneous Preprocessor Commands ++=================================== ++ ++This section describes three additional preprocessor commands. They ++are not very useful, but are mentioned for completeness. ++ ++The "null command" consists of a `#' followed by a Newline, with only ++whitespace (including comments) in between. A null command is ++understood as a preprocessor command but has no effect on the ++preprocessor output. The primary significance of the existence of ++the null command is that an input line consisting of just a `#' will ++produce no output, rather than a line of output containing just a ++`#'. Supposedly some old C programs contain such lines. ++ ++The `#pragma' command is specified in the ANSI standard to have an ++arbitrary implementation-defined effect. In the GNU C preprocessor, ++`#pragma' commands are ignored, except for `#pragma once' (*note ++Once-Only::.). ++ ++The `#ident' command is supported for compatibility with certain ++other systems. It is followed by a line of text. On certain ++systems, the text is copied into a special place in the object file; ++on most systems, the text is ignored and this directive has no effect. ++ ++ ++ ++File: cpp.info, Node: Output, Next: Invocation, Prev: Other Commands, Up: Top ++ ++C Preprocessor Output ++===================== ++ ++The output from the C preprocessor looks much like the input, except ++that all preprocessor command lines have been replaced with blank ++lines and all comments with spaces. Whitespace within a line is not ++altered; however, a space is inserted after the expansions of most ++macro calls. ++ ++Source file name and line number information is conveyed by lines of ++the form ++ ++ # LINENUM FILENAME FLAG ++ ++which are inserted as needed into the middle of the input (but never ++within a string or character constant). Such a line means that the ++following line originated in file FILENAME at line LINENUM. ++ ++The third field, FLAG, may be a number, or may be absent. It is `1' ++for the beginning of a new source file, and `2' for return to an old ++source file at the end of an included file. It is absent otherwise. ++ ++ ++ ++File: cpp.info, Node: Invocation, Next: Concept Index, Prev: Output, Up: Top ++ ++Invoking the C Preprocessor ++=========================== ++ ++Most often when you use the C preprocessor you will not have to ++invoke it explicitly: the C compiler will do so automatically. ++However, the preprocessor is sometimes useful individually. ++ ++The C preprocessor expects two file names as arguments, INFILE and ++OUTFILE. The preprocessor reads INFILE together with any other files ++it specifies with `#include'. All the output generated by the ++combined input files is written in OUTFILE. ++ ++Either INFILE or OUTFILE may be `-', which as INFILE means to read ++from standard input and as OUTFILE means to write to standard output. ++Also, if OUTFILE or both file names are omitted, the standard output ++and standard input are used for the omitted file names. ++ ++Here is a table of command options accepted by the C preprocessor. ++Most of them can also be given when compiling a C program; they are ++passed along automatically to the preprocessor when it is invoked by ++the compiler. ++ ++`-P' ++ Inhibit generation of `#'-lines with line-number information in ++ the output from the preprocessor (*note Output::.). This might ++ be useful when running the preprocessor on something that is not ++ C code and will be sent to a program which might be confused by ++ the `#'-lines ++ ++`-C' ++ Do not discard comments: pass them through to the output file. ++ Comments appearing in arguments of a macro call will be copied ++ to the output before the expansion of the macro call. ++ ++`-trigraphs' ++ Process ANSI standard trigraph sequences. These are ++ three-character sequences, all starting with `??', that are ++ defined by ANSI C to stand for single characters. For example, ++ `??/' stands for `\', so `'??/n'' is a character constant for a ++ newline. Strictly speaking, the GNU C preprocessor does not ++ support all programs in ANSI Standard C unless `-trigraphs' is ++ used, but if you ever notice the difference it will be with ++ relief. ++ ++ You don't want to know any more about trigraphs. ++ ++`-pedantic' ++ Issue warnings required by the ANSI C standard in certain cases ++ such as when text other than a comment follows `#else' or ++ `#endif'. ++ ++`-I DIRECTORY' ++ Add the directory DIRECTORY to the end of the list of ++ directories to be searched for header files (*note Include ++ Syntax::.). This can be used to override a system header file, ++ substituting your own version, since these directories are ++ searched before the system header file directories. If you use ++ more than one `-I' option, the directories are scanned in ++ left-to-right order; the standard system directories come after. ++ ++`-I-' ++ Any directories specified with `-I' options before the `-I-' ++ option are searched only for the case of `#include "FILE"'; they ++ are not searched for `#include '. ++ ++ If additional directories are specified with `-I' options after ++ the `-I-', these directories are searched for all `#include' ++ directives. ++ ++ In addition, the `-I-' option inhibits the use of the current ++ directory as the first search directory for `#include "FILE"'. ++ Therefore, the current directory is searched only if it is ++ requested explicitly with `-I.'. Specifying both `-I-' and ++ `-I.' allows you to control precisely which directories are ++ searched before the current one and which are searched after. ++ ++`-nostdinc' ++ Do not search the standard system directories for header files. ++ Only the directories you have specified with `-I' options (and ++ the current directory, if appropriate) are searched. ++ ++`-D NAME' ++ Predefine NAME as a macro, with definition `1'. ++ ++`-D NAME=DEFINITION' ++ Predefine NAME as a macro, with definition DEFINITION. There ++ are no restrictions on the contents of DEFINITION, but if you ++ are invoking the preprocessor from a shell or shell-like program ++ you may need to use the shell's quoting syntax to protect ++ characters such as spaces that have a meaning in the shell syntax. ++ ++`-U NAME' ++ Do not predefine NAME. If both `-U' and `-D' are specified for ++ one name, the `-U' beats the `-D' and the name is not predefined. ++ ++`-undef' ++ Do not predefine any nonstandard macros. ++ ++`-d' ++ Instead of outputting the result of preprocessing, output a list ++ of `#define' commands for all the macros defined during the ++ execution of the preprocessor. ++ ++`-M' ++ Instead of outputting the result of preprocessing, output a rule ++ suitable for `make' describing the dependencies of the main ++ source file. The preprocessor outputs one `make' rule ++ containing the object file name for that source file, a colon, ++ and the names of all the included files. If there are many ++ included files then the rule is split into several lines using ++ `\'-newline. ++ ++ This feature is used in automatic updating of makefiles. ++ ++`-MM' ++ Like `-M' but mention only the files included with `#include ++ "FILE"'. System header files included with `#include ' ++ are omitted. ++ ++`-i FILE' ++ Process FILE as input, discarding the resulting output, before ++ processing the regular input file. Because the output generated ++ from FILE is discarded, the only effect of `-i FILE' is to make ++ the macros defined in FILE available for use in the main input. ++ ++ ++ ++File: cpp.info, Node: Concept Index, Next: Index, Prev: Invocation, Up: Top ++ ++Concept Index ++************* ++ ++* Menu: ++ ++* cascaded macros: Cascaded Macros. ++* commands: Commands. ++* concatenation: Concatenation. ++* conditionals: Conditionals. ++* header file: Header Files. ++* line control: Combining Sources. ++* macro body uses macro: Cascaded Macros. ++* null command: Other Commands. ++* options: Invocation. ++* output format: Output. ++* predefined macros: Predefined. ++* preprocessor commands: Commands. ++* redefining macros: Redefining. ++* repeated inclusion: Once-Only. ++* self-reference: Self-Reference. ++* semicolons (after macro calls): Swallow Semicolon. ++* side effects (in macro arguments): Side Effects. ++* stringification: Stringification. ++* undefining macros: Undefining. ++* unsafe macros: Side Effects. ++ ++ ++ ++ ++File: cpp.info, Node: Index, Prev: Concept Index, Up: Top ++ ++Index of Commands, Macros and Options ++************************************* ++ ++* Menu: ++ ++* #elif: #elif Command. ++* #else: #else Command. ++* #error: #error Command. ++* #ident: Other Commands. ++* #if: Conditional Syntax. ++* #ifdef: Conditionals-Macros. ++* #ifndef: Conditionals-Macros. ++* #include: Include Syntax. ++* #line: Combining Sources. ++* #pragma: Other Commands. ++* -C: Invocation. ++* -D: Invocation. ++* -I: Invocation. ++* -M: Invocation. ++* -MM: Invocation. ++* -P: Invocation. ++* -U: Invocation. ++* -d: Invocation. ++* -i: Invocation. ++* -pedantic: Invocation. ++* -trigraphs: Invocation. ++* -undef: Invocation. ++* BSD: Nonstandard Predefined. ++* M68020: Nonstandard Predefined. ++* __BASE_FILE__: Standard Predefined. ++* __DATE__: Standard Predefined. ++* __FILE__: Standard Predefined. ++* __LINE__: Standard Predefined. ++* __STDC__: Standard Predefined. ++* __TIME__: Standard Predefined. ++* defined: Conditionals-Macros. ++* m68k: Nonstandard Predefined. ++* mc68000: Nonstandard Predefined. ++* ns32000: Nonstandard Predefined. ++* pyr: Nonstandard Predefined. ++* sequent: Nonstandard Predefined. ++* sun: Nonstandard Predefined. ++* system header files: Header Uses. ++* unix: Nonstandard Predefined. ++* vax: Nonstandard Predefined. ++ ++ ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/cpp.texinfo alliance/genview/src/gcc-1.42/cpp.texinfo +--- alliance-5.0/genview/src/gcc-1.42/cpp.texinfo 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cpp.texinfo 2002-04-11 09:14:43.000000000 +0200 +@@ -0,0 +1,2194 @@ ++\input texinfo ++@setfilename cpp.info ++@settitle The C Preprocessor ++@setchapternewpage odd ++@ifinfo ++This file documents the GNU C Preprocessor. ++ ++Copyright (C) 1987, 1989 Free Software Foundation, Inc. ++ ++Permission is granted to make and distribute verbatim copies of ++this manual provided the copyright notice and this permission notice ++are preserved on all copies. ++ ++@ignore ++Permission is granted to process this file through Tex and print the ++results, provided the printed document carries copying permission ++notice identical to this one except for the removal of this paragraph ++(this paragraph not being relevant to the printed manual). ++ ++@end ignore ++Permission is granted to copy and distribute modified versions of this ++manual under the conditions for verbatim copying, provided also that ++the entire resulting derived work is distributed under the terms of a ++permission notice identical to this one. ++ ++Permission is granted to copy and distribute translations of this manual ++into another language, under the above conditions for modified versions. ++@end ifinfo ++ ++@titlepage ++@sp 6 ++@center @titlefont{The C Preprocessor} ++@sp 4 ++@center Last revised July 1990 ++@center for GCC version 1.38 ++@sp 5 ++@center Richard M. Stallman ++@page ++@vskip 0pt plus 1filll ++Copyright @copyright{} 1987, 1989 Free Software Foundation, Inc. ++ ++Permission is granted to make and distribute verbatim copies of ++this manual provided the copyright notice and this permission notice ++are preserved on all copies. ++ ++Permission is granted to copy and distribute modified versions of this ++manual under the conditions for verbatim copying, provided also that ++the entire resulting derived work is distributed under the terms of a ++permission notice identical to this one. ++ ++Permission is granted to copy and distribute translations of this manual ++into another language, under the above conditions for modified versions. ++@end titlepage ++@page ++ ++@node Top, Global Actions,, (DIR) ++@chapter The C Preprocessor ++ ++The C preprocessor is a @dfn{macro processor} that is used automatically by ++the C compiler to transform your program before actual compilation. It is ++called a macro processor because it allows you to define @dfn{macros}, ++which are brief abbreviations for longer constructs. ++ ++The C preprocessor provides four separate facilities that you can use as ++you see fit: ++ ++@itemize @bullet ++@item ++Inclusion of header files. These are files of declarations that can be ++substituted into your program. ++ ++@item ++Macro expansion. You can define @dfn{macros}, which are abbreviations ++for arbitrary fragments of C code, and then the C preprocessor will ++replace the macros with their definitions throughout the program. ++ ++@item ++Conditional compilation. Using special preprocessor commands, you ++can include or exclude parts of the program according to various ++conditions. ++ ++@item ++Line control. If you use a program to combine or rearrange source files into ++an intermediate file which is then compiled, you can use line control ++to inform the compiler of where each source line originally came from. ++@end itemize ++ ++C preprocessors vary in some details. This manual discusses the GNU C ++preprocessor, the C Compatible Compiler Preprocessor. The GNU C ++preprocessor provides a superset of the features of ANSI Standard C. ++ ++ANSI Standard C requires the rejection of many harmless constructs commonly ++used by today's C programs. Such incompatibility would be inconvenient for ++users, so the GNU C preprocessor is configured to accept these constructs ++by default. Strictly speaking, to get ANSI Standard C, you must use the ++options @samp{-trigraphs}, @samp{-undef} and @samp{-pedantic}, but in ++practice the consequences of having strict ANSI Standard C make it ++undesirable to do this. @xref{Invocation}. ++ ++@menu ++* Global Actions:: Actions made uniformly on all input files. ++* Commands:: General syntax of preprocessor commands. ++* Header Files:: How and why to use header files. ++* Macros:: How and why to use macros. ++* Conditionals:: How and why to use conditionals. ++* Combining Sources:: Use of line control when you combine source files. ++* Other Commands:: Miscellaneous preprocessor commands. ++* Output:: Format of output from the C preprocessor. ++* Invocation:: How to invoke the preprocessor; command options. ++* Concept Index:: Index of concepts and terms. ++* Index:: Index of commands, predefined macros and options. ++@end menu ++ ++@node Global Actions, Commands, Top, Top ++@section Transformations Made Globally ++ ++Most C preprocessor features are inactive unless you give specific commands ++to request their use. (Preprocessor commands are lines starting with ++@samp{#}; @pxref{Commands}). But there are three transformations that the ++preprocessor always makes on all the input it receives, even in the absence ++of commands. ++ ++@itemize @bullet ++@item ++All C comments are replaced with single spaces. ++ ++@item ++Backslash-Newline sequences are deleted, no matter where. This ++feature allows you to break long lines for cosmetic purposes without ++changing their meaning. ++ ++@item ++Predefined macro names are replaced with their expansions ++(@pxref{Predefined}). ++@end itemize ++ ++The first two transformations are done @emph{before} nearly all other parsing ++and before preprocessor commands are recognized. Thus, for example, you ++can split a line cosmetically with Backslash-Newline anywhere (except ++when trigraphs are in use; see below). ++ ++@example ++/* ++*/ # /* ++*/ defi\ ++ne FO\ ++O 10\ ++20 ++@end example ++ ++@noindent ++is equivalent into @samp{#define FOO 1020}. You can split even an escape ++sequence with Backslash-Newline. For example, you can split @code{"foo\bar"} ++between the @samp{\} and the @samp{b} to get ++ ++@example ++"foo\\ ++bar" ++@end example ++ ++@noindent ++This behavior is unclean: in all other contexts, a Backslash can be ++inserted in a string constant as an ordinary character by writing a double ++Backslash, and this creates an exception. But the ANSI C standard requires ++it. (Strict ANSI C does not allow Newlines in string constants, so they ++do not consider this a problem.) ++ ++But there are a few exceptions to all three transformations. ++ ++@itemize @bullet ++@item ++C comments and predefined macro names are not recognized inside a ++@samp{#include} command in which the file name is delimited with ++@samp{<} and @samp{>}. ++ ++@item ++C comments and predefined macro names are never recognized within a ++character or string constant. (Strictly speaking, this is the rule, ++not an exception, but it is worth noting here anyway.) ++ ++@item ++Backslash-Newline may not safely be used within an ANSI ``trigraph''. ++Trigraphs are converted before Backslash-Newline is deleted. If you ++write what looks like a trigraph with a Backslash-Newline inside, the ++Backslash-Newline is deleted as usual, but it is then too late to ++recognize the trigraph. ++ ++This exception is relevant only if you use the @samp{-trigraphs} ++option to enable trigraph processing. @xref{Invocation}. ++@end itemize ++ ++@node Commands, Header Files, Global Actions, Top ++@section Preprocessor Commands ++ ++@cindex preprocessor commands ++@cindex commands ++Most preprocessor features are active only if you use preprocessor commands ++to request their use. ++ ++Preprocessor commands are lines in your program that start with @samp{#}. ++The @samp{#} is followed by an identifier that is the @dfn{command name}. ++For example, @samp{#define} is the command that defines a macro. ++Whitespace is also allowed before and after the @samp{#}. ++ ++The set of valid command names is fixed. Programs cannot define new ++preprocessor commands. ++ ++Some command names require arguments; these make up the rest of the command ++line and must be separated from the command name by whitespace. For example, ++@samp{#define} must be followed by a macro name and the intended expansion ++of the macro. ++ ++A preprocessor command cannot be more than one line in normal circumstances. ++It may be split cosmetically with Backslash-Newline, but that has no effect ++on its meaning. Comments containing Newlines can also divide the command into ++multiple lines, but the comments are changed to Spaces before the command ++is interpreted. The only way a significant Newline can occur in a preprocessor ++command is within a string constant or character constant. Note that ++most C compilers that might be applied to the output from the preprocessor ++do not accept string or character constants containing Newlines. ++ ++The @samp{#} and the command name cannot come from a macro expansion. For ++example, if @samp{foo} is defined as a macro expanding to @samp{define}, ++that does not make @samp{#foo} a valid preprocessor command. ++ ++@node Header Files, Macros, Commands, Top ++@section Header Files ++ ++@cindex header file ++A header file is a file containing C declarations and macro definitions ++(@pxref{Macros}) to be shared between several source files. You request ++the use of a header file in your program with the C preprocessor command ++@samp{#include}. ++ ++@menu ++* Header Uses:: What header files are used for. ++* Include Syntax:: How to write @samp{#include} commands. ++* Include Operation:: What @samp{#include} does. ++* Once-Only:: Preventing multiple inclusion of one header file. ++@end menu ++ ++@node Header Uses, Include Syntax, Header Files, Header Files ++@subsection Uses of Header Files ++ ++Header files serve two kinds of purposes. ++ ++@itemize @bullet ++@item ++@findex system header files ++System header files declare the interfaces to parts of the operating ++system. You include them in your program to supply the definitions ++you need to invoke system calls and libraries. ++ ++@item ++Your own header files contain declarations for interfaces between the ++source files of your program. Each time you have a group of related ++declarations and macro definitions all or most of which are needed in ++several different source files, it is a good idea to create a header ++file for them. ++@end itemize ++ ++Including a header file produces the same results in C compilation as ++copying the header file into each source file that needs it. But such ++copying would be time-consuming and error-prone. With a header file, the ++related declarations appear in only one place. If they need to be changed, ++they can be changed in one place, and programs that include the header file ++will automatically use the new version when next recompiled. The header ++file eliminates the labor of finding and changing all the copies as well as ++the risk that a failure to find one copy will result in inconsistencies ++within a program. ++ ++The usual convention is to give header files names that end with @file{.h}. ++ ++@node Include Syntax, Include Operation, Header Uses, Header Files ++@subsection The @samp{#include} Command ++ ++@findex #include ++Both user and system header files are included using the preprocessor ++command @samp{#include}. It has three variants: ++ ++@table @code ++@item #include <@var{file}> ++This variant is used for system header files. It searches for a file ++named @var{file} in a list of directories specified by you, then in a ++standard list of system directories. You specify directories to ++search for header files with the command option @samp{-I} ++(@pxref{Invocation}). The option @samp{-nostdinc} inhibits searching ++the standard system directories; in this case only the directories ++you specify are searched. ++ ++The parsing of this form of @samp{#include} is slightly special ++because comments are not recognized within the @samp{<@dots{}>}. ++Thus, in @samp{#include } the @samp{/*} does not start a comment ++and the command specifies inclusion of a system header file named ++@file{x/*y}. Of course, a header file with such a name is unlikely to ++exist on Unix, where shell wildcard features would make it hard to ++manipulate.@refill ++ ++The argument @var{file} may not contain a @samp{>} character. It may, ++however, contain a @samp{<} character. ++ ++@item #include "@var{file}" ++This variant is used for header files of your own program. It ++searches for a file named @var{file} first in the current directory, ++then in the same directories used for system header files. The ++current directory is the directory of the current input file. It is ++tried first because it is presumed to be the location of the files ++that the current input file refers to. (If the @samp{-I-} option is ++used, the special treatment of the current directory is inhibited.) ++ ++The argument @var{file} may not contain @samp{"} characters. If ++backslashes occur within @var{file}, they are considered ordinary text ++characters, not escape characters. None of the character escape ++sequences appropriate to string constants in C are processed. Thus, ++@samp{#include "x\n\\y"} specifies a filename containing three ++backslashes. It is not clear why this behavior is ever useful, but ++the ANSI standard specifies it. ++ ++@item #include @var{anything else} ++This variant is called a @dfn{computed #include}. Any @samp{#include} ++command whose argument does not fit the above two forms is a computed ++include. The text @var{anything else} is checked for macro calls, ++which are expanded (@pxref{Macros}). When this is done, the result ++must fit one of the above two variants. ++ ++This feature allows you to define a macro which controls the file name ++to be used at a later point in the program. One application of this ++is to allow a site-configuration file for your program to specify the ++names of the system include files to be used. This can help in ++porting the program to various operating systems in which the ++necessary system header files are found in different places. ++@end table ++ ++@node Include Operation, Once-Only, Include Syntax, Header Files ++@subsection How @samp{#include} Works ++ ++The @samp{#include} command works by directing the C preprocessor to scan ++the specified file as input before continuing with the rest of the current ++file. The output from the preprocessor contains the output already ++generated, followed by the output resulting from the included file, ++followed by the output that comes from the text after the @samp{#include} ++command. For example, given two files as follows: ++ ++@example ++/* File program.c */ ++int x; ++#include "header.h" ++ ++main () ++@{ ++ printf (test ()); ++@} ++ ++ ++/* File header.h */ ++char *test (); ++@end example ++ ++@noindent ++the output generated by the C preprocessor for @file{program.c} as input ++would be ++ ++@example ++int x; ++char *test (); ++ ++main () ++@{ ++ printf (test ()); ++@} ++@end example ++ ++Included files are not limited to declarations and macro definitions; they ++are merely the typical use. Any fragment of a C program can be included ++from another file. The include file could even contain the beginning of a ++statement that is concluded in the containing file, or the end of a ++statement that was started in the including file. However, a comment or a ++string or character constant may not start in the included file and finish ++in the including file. An unterminated comment, string constant or ++character constant in an included file is considered to end (with an error ++message) at the end of the file. ++ ++The line following the @samp{#include} command is always treated as a ++separate line by the C preprocessor even if the included file lacks a final ++newline. ++ ++@node Once-Only,, Include Operation, Header Files ++@subsection Once-Only Include Files ++@cindex repeated inclusion ++ ++Very often, one header file includes another. It can easily result that a ++certain header file is included more than once. This may lead to errors, ++if the header file defines structure types or typedefs, and is certainly ++wasteful. Therefore, we often wish to prevent multiple inclusion of a ++header file. ++ ++The standard way to do this is to enclose the entire real contents of the ++file in a conditional, like this: ++ ++@example ++#ifndef __FILE_FOO_SEEN__ ++#define __FILE_FOO_SEEN__ ++ ++@var{the entire file} ++ ++#endif /* __FILE_FOO_SEEN__ */ ++@end example ++ ++The macro @code{__FILE_FOO_SEEN__} indicates that the file has been ++included once already; its name should begin with @samp{__}, and should ++contain the name of the file to avoid accidental conflicts. ++ ++One drawback of this method is that the preprocessor must scan the input ++file completely in order to determine that all of it is to be ignored. ++This makes compilation slower. You can avoid the delay by inserting the ++following command near the beginning of file @emph{in addition to the ++conditionals described above}: ++ ++@example ++#pragma once ++@end example ++ ++This command tells the GNU C preprocessor to ignore any future commands ++to include the same file (whichever file the @samp{#pragma} appears in). ++ ++You should not @emph{rely} on @samp{#pragma once} to prevent multiple ++inclusion of the file. It is just a hint, and a nonstandard one at ++that. Most C compilers will ignore it entirely. For this reason, you ++still need the conditionals if you want to make certain that the file's ++contents are not included twice. ++ ++Note that @samp{#pragma once} works by file name; if a file has more ++than one name, it can be included once under each name, even in GNU CC, ++despite @samp{#pragma once}. ++ ++@node Macros, Conditionals, Header Files, Top ++@section Macros ++ ++A macro is a sort of abbreviation which you can define once and then ++use later. There are many complicated features associated with macros ++in the C preprocessor. ++ ++@menu ++* Simple Macros:: Macros that always expand the same way. ++* Argument Macros:: Macros that accept arguments that are substituted ++ into the macro expansion. ++* Predefined:: Predefined macros that are always available. ++* Stringification:: Macro arguments converted into string constants. ++* Concatenation:: Building tokens from parts taken from macro arguments. ++* Undefining:: Cancelling a macro's definition. ++* Redefining:: Changing a macro's definition. ++* Macro Pitfalls:: Macros can confuse the unwary. Here we explain ++ several common problems and strange features. ++@end menu ++ ++@node Simple Macros, Argument Macros, Macros, Macros ++@subsection Simple Macros ++ ++A @dfn{simple macro} is a kind of abbreviation. It is a name which stands ++for a fragment of code. ++ ++Before you can use a macro, you must @dfn{define} it explicitly with the ++@samp{#define} command. @samp{#define} is followed by the name of the ++macro and then the code it should be an abbreviation for. For example, ++ ++@example ++#define BUFFER_SIZE 1020 ++@end example ++ ++@noindent ++defines a macro named @samp{BUFFER_SIZE} as an abbreviation for the text ++@samp{1020}. Therefore, if somewhere after this @samp{#define} command ++there comes a C statement of the form ++ ++@example ++foo = (char *) xmalloc (BUFFER_SIZE); ++@end example ++ ++@noindent ++then the C preprocessor will recognize and @dfn{expand} the macro ++@samp{BUFFER_SIZE}, resulting in ++ ++@example ++foo = (char *) xmalloc (1020); ++@end example ++ ++@noindent ++the definition must be a single line; however, it may not end in the ++middle of a multi-line string constant or character constant. ++ ++The use of all upper case for macro names is a standard convention. ++Programs are easier to read when it is possible to tell at a glance which ++names are macros. ++ ++Normally, a macro definition must be a single line, like all C preprocessor ++commands. (You can split a long macro definition cosmetically with ++Backslash-Newline.) There is one exception: Newlines can be included in ++the macro definition if within a string or character constant. By the same ++token, it is not possible for a macro definition to contain an unbalanced ++quote character; the definition automatically extends to include the ++matching quote character that ends the string or character constant. ++Comments within a macro definition may contain Newlines, which make no ++difference since the comments are entirely replaced with Spaces regardless ++of their contents. ++ ++Aside from the above, there is no restriction on what can go in a macro ++body. Parentheses need not balance. The body need not resemble valid C ++code. (Of course, you might get error messages from the C compiler when ++you use the macro.) ++ ++The C preprocessor scans your program sequentially, so macro definitions ++take effect at the place you write them. Therefore, the following input to ++the C preprocessor ++ ++@example ++foo = X; ++#define X 4 ++bar = X; ++@end example ++ ++@noindent ++produces as output ++ ++@example ++foo = X; ++ ++bar = 4; ++@end example ++ ++After the preprocessor expands a macro name, the macro's definition body is ++appended to the front of the remaining input, and the check for macro calls ++continues. Therefore, the macro body can contain calls to other macros. ++For example, after ++ ++@example ++#define BUFSIZE 1020 ++#define TABLESIZE BUFSIZE ++@end example ++ ++@noindent ++the name @samp{TABLESIZE} when used in the program would go through two ++stages of expansion, resulting ultimately in @samp{1020}. ++ ++This is not at all the same as defining @samp{TABLESIZE} to be @samp{1020}. ++The @samp{#define} for @samp{TABLESIZE} uses exactly the body you ++specify---in this case, @samp{BUFSIZE}---and does not check to see whether ++it too is the name of a macro. It's only when you @emph{use} @samp{TABLESIZE} ++that the result of its expansion is checked for more macro names. ++@xref{Cascaded Macros}. ++ ++@node Argument Macros, Predefined, Simple Macros, Macros ++@subsection Macros with Arguments ++ ++A simple macro always stands for exactly the same text, each time it is ++used. Macros can be more flexible when they accept @dfn{arguments}. ++Arguments are fragments of code that you supply each time the macro is ++used. These fragments are included in the expansion of the macro according ++to the directions in the macro definition. ++ ++To define a macro that uses arguments, you write a @samp{#define} command ++with a list of @dfn{argument names} in parentheses after the name of the ++macro. The argument names may be any valid C identifiers, separated by ++commas and optionally whitespace. The open-parenthesis must follow the ++macro name immediately, with no space in between. ++ ++For example, here is a macro that computes the minimum of two numeric ++values, as it is defined in many C programs: ++ ++@example ++#define min(X, Y) ((X) < (Y) ? (X) : (Y)) ++@end example ++ ++@noindent ++(This is not the best way to define a ``minimum'' macro in GNU C. ++@xref{Side Effects}, for more information.) ++ ++To use a macro that expects arguments, you write the name of the macro ++followed by a list of @dfn{actual arguments} in parentheses. separated by ++commas. The number of actual arguments you give must match the number of ++arguments the macro expects. Examples of use of the macro @samp{min} ++include @samp{min (1, 2)} and @samp{min (x + 28, *p)}. ++ ++The expansion text of the macro depends on the arguments you use. ++Each of the argument names of the macro is replaced, throughout the ++macro definition, with the corresponding actual argument. Using the ++same macro @samp{min} defined above, @samp{min (1, 2)} expands into ++ ++@example ++((1) < (2) ? (1) : (2)) ++@end example ++ ++@noindent ++where @samp{1} has been substituted for @samp{X} and @samp{2} for @samp{Y}. ++ ++Likewise, @samp{min (x + 28, *p)} expands into ++ ++@example ++((x + 28) < (*p) ? (x + 28) : (*p)) ++@end example ++ ++Parentheses in the actual arguments must balance; a comma within ++parentheses does not end an argument. However, there is no requirement for ++brackets or braces to balance; thus, if you want to supply @samp{array[x = ++y, x + 1]} as an argument, you must write it as @samp{array[(x = y, x + ++1)]}, which is equivalent C code. ++ ++After the actual arguments are substituted into the macro body, the entire ++result is appended to the front of the remaining input, and the check for ++macro calls continues. Therefore, the actual arguments can contain calls ++to other macros, either with or without arguments, or even to the same ++macro. The macro body can also contain calls to other macros. For ++example, @samp{min (min (a, b), c)} expands into ++ ++@example ++((((a) < (b) ? (a) : (b))) < (c) ++ ? (((a) < (b) ? (a) : (b))) ++ : (c)) ++@end example ++ ++@noindent ++(Line breaks shown here for clarity would not actually be generated.) ++ ++If you use the macro name followed by something other than an ++open-parenthesis (after ignoring any spaces, tabs and comments that ++follow), it is not a call to the macro, and the preprocessor leaves the ++name unaltered. Therefore, it is possible for the same name to be a ++variable or function in your program as well as a macro, and you can ++choose in each instance whether to refer to the macro (if an actual ++argument list follows) or the variable or function (if an argument list ++does not follow). ++ ++Such dual use of one name could be confusing and should be avoided ++except when the two meanings are effectively synonymous: that is, when the ++name is both a macro and a function and the two have similar effects. You ++can think of the name simply as a function; use of the name for purposes ++other than calling it (such as, to take the address) will refer to the ++function, while calls will expand the macro and generate better but ++equivalent code. For example, you can use a function named @samp{min} in ++the same source file that defines the macro. If you write @samp{&min} with ++no argument list, you refer to the function. If you write @samp{min (x, ++bb)}, with an argument list, the macro is expanded. If you write ++@samp{(min) (a, bb)}, where the name @samp{min} is not followed by an ++open-parenthesis, the macro is not expanded, so you wind up with a call to ++the function @samp{min}. ++ ++It is not allowed to define the same name as both a simple macro and ++a macro with arguments. ++ ++In the definition of a macro with arguments, the list of argument names ++must follow the macro name immediately with no space in between. If there ++is a space after the macro name, the macro is defined as taking no ++arguments, and all the rest of the name is taken to be the expansion. The ++reason for this is that it is often useful to define a macro that takes no ++arguments and whose definition begins with an identifier in parentheses. ++This rule about spaces makes it possible for you to do either this: ++ ++@example ++#define FOO(x) - 1 / (x) ++@end example ++ ++@noindent ++(which defines @samp{FOO} to take an argument and expand into minus the ++reciprocal of that argument) or this: ++ ++@example ++#define BAR (x) - 1 / (x) ++@end example ++ ++@noindent ++(which defines @samp{BAR} to take no argument and always expand into ++@samp{(x) - 1 / (x)}). ++ ++Note that the @emph{uses} of a macro with arguments can have spaces before ++the left parenthesis; it's the @emph{definition} where it matters whether ++there is a space. ++ ++@node Predefined, Stringification, Argument Macros, Macros ++@subsection Predefined Macros ++ ++@cindex predefined macros ++Several simple macros are predefined. You can use them without giving ++definitions for them. They fall into two classes: standard macros and ++system-specific macros. ++ ++@menu ++* Standard Predefined:: Standard predefined macros. ++* Nonstandard Predefined:: Nonstandard predefined macros. ++@end menu ++ ++@node Standard Predefined, Nonstandard Predefined, Predefined, Predefined ++@subsubsection Standard Predefined Macros ++ ++The standard predefined macros are available with the same meanings ++regardless of the machine or operating system on which you are using GNU C. ++Their names all start and end with double underscores. Those preceding ++@code{__GNUC__} in this table are standardized by ANSI C; the rest are ++GNU C extensions. ++ ++@table @code ++@item __FILE__ ++@findex __FILE__ ++This macro expands to the name of the current input file, in the form ++of a C string constant. ++ ++@item __BASE_FILE__ ++@findex __BASE_FILE__ ++This macro expands to the name of the main input file, in the form ++of a C string constant. This is the source file that was specified ++as an argument when the C compiler was invoked. ++ ++@item __LINE__ ++@findex __LINE__ ++This macro expands to the current input line number, in the form of a ++decimal integer constant. While we call it a predefined macro, it's ++a pretty strange macro, since its ``definition'' changes with each ++new line of source code. ++ ++This and @samp{__FILE__} are useful in generating an error message to ++report an inconsistency detected by the program; the message can state ++the source line at which the inconsistency was detected. For example, ++ ++@example ++fprintf (stderr, "Internal error: negative string length " ++ "%d at %s, line %d.", ++ length, __FILE__, __LINE__); ++@end example ++ ++A @samp{#include} command changes the expansions of @samp{__FILE__} ++and @samp{__LINE__} to correspond to the included file. At the end of ++that file, when processing resumes on the input file that contained ++the @samp{#include} command, the expansions of @samp{__FILE__} and ++@samp{__LINE__} revert to the values they had before the ++@samp{#include} (but @samp{__LINE__} is then incremented by one as ++processing moves to the line after the @samp{#include}). ++ ++The expansions of both @samp{__FILE__} and @samp{__LINE__} are altered ++if a @samp{#line} command is used. @xref{Combining Sources}. ++ ++@item __DATE__ ++@findex __DATE__ ++This macro expands to a string constant that describes the date on ++which the preprocessor is being run. The string constant contains ++eleven characters and looks like @samp{"Jan 29 1987"} or @w{@samp{"Apr ++1 1905"}}. ++ ++@item __TIME__ ++@findex __TIME__ ++This macro expands to a string constant that describes the time at ++which the preprocessor is being run. The string constant contains ++eight characters and looks like @samp{"23:59:01"}. ++ ++@item __STDC__ ++@findex __STDC__ ++This macro expands to the constant 1, to signify that this is ANSI ++Standard C. (Whether that is actually true depends on what C compiler ++will operate on the output from the preprocessor.) ++ ++@item __GNUC__ ++This macro is defined if and only if this is GNU C. This macro is ++defined only when the entire GNU C compiler is in use; if you invoke ++the preprocessor directly, @samp{__GNUC__} is undefined. ++ ++@item __STRICT_ANSI__ ++This macro is defined if and only if the @samp{-ansi} switch was ++specified when GNU C was invoked. Its definition is the null string. ++This macro exists primarily to direct certain GNU header files not to ++define certain traditional Unix constructs which are incompatible with ++ANSI C. ++ ++@item __VERSION__ ++This macro expands to a string which describes the version number of ++GNU C. The string is normally a sequence of decimal numbers separated ++by periods, such as @samp{"1.18"}. The only reasonable use of this ++macro is to incorporate it into a string constant. ++ ++@item __OPTIMIZE__ ++This macro is defined in optimizing compilations. It causes certain ++GNU header files to define alternative macro definitions for some ++system library functions. It is unwise to refer to or test the ++definition of this macro unless you make very sure that programs will ++execute with the same effect regardless. ++ ++@item __CHAR_UNSIGNED__ ++This macro is defined if and only if the data type @code{char} is ++unsigned on the target machine. It exists to cause the standard ++header file @file{limit.h} to work correctly. It is bad practice ++to refer to this macro yourself; instead, refer to the standard ++macros defined in @file{limit.h}. ++@end table ++ ++@node Nonstandard Predefined,, Standard Predefined, Predefined ++@subsubsection Nonstandard Predefined Macros ++ ++The C preprocessor normally has several predefined macros that vary between ++machines because their purpose is to indicate what type of system and ++machine is in use. This manual, being for all systems and machines, cannot ++tell you exactly what their names are; instead, we offer a list of some ++typical ones. ++ ++Some nonstandard predefined macros describe the operating system in use, ++with more or less specificity. For example, ++ ++@table @code ++@item unix ++@findex unix ++@samp{unix} is normally predefined on all Unix systems. ++ ++@item BSD ++@findex BSD ++@samp{BSD} is predefined on recent versions of Berkeley Unix ++(perhaps only in version 4.3). ++@end table ++ ++Other nonstandard predefined macros describe the kind of CPU, with more or ++less specificity. For example, ++ ++@table @code ++@item vax ++@findex vax ++@samp{vax} is predefined on Vax computers. ++ ++@item mc68000 ++@findex mc68000 ++@samp{mc68000} is predefined on most computers whose CPU is a Motorola ++68000, 68010 or 68020. ++ ++@item m68k ++@findex m68k ++@samp{m68k} is also predefined on most computers whose CPU is a 68000, ++68010 or 68020; however, some makers use @samp{mc68000} and some use ++@samp{m68k}. Some predefine both names. What happens in GNU C ++depends on the system you are using it on. ++ ++@item M68020 ++@findex M68020 ++@samp{M68020} has been observed to be predefined on some systems that ++use 68020 CPUs---in addition to @samp{mc68000} and @samp{m68k} that ++are less specific. ++ ++@item ns32000 ++@findex ns32000 ++@samp{ns32000} is predefined on computers which use the National ++Semiconductor 32000 series CPU. ++@end table ++ ++Yet other nonstandard predefined macros describe the manufacturer of ++the system. For example, ++ ++@table @code ++@item sun ++@findex sun ++@samp{sun} is predefined on all models of Sun computers. ++ ++@item pyr ++@findex pyr ++@samp{pyr} is predefined on all models of Pyramid computers. ++ ++@item sequent ++@findex sequent ++@samp{sequent} is predefined on all models of Sequent computers. ++@end table ++ ++These predefined symbols are not only nonstandard, they are contrary to the ++ANSI standard because their names do not start with underscores. ++Therefore, the option @samp{-ansi} inhibits the definition of these ++symbols. ++ ++This tends to make @samp{-ansi} useless, since many programs depend on the ++customary nonstandard predefined symbols. Even system header files check ++them and will generate incorrect declarations if they do not find the names ++that are expected. You might think that the header files supplied for the ++Uglix computer would not need to test what machine they are running on, ++because they can simply assume it is the Uglix; but often they do, and they ++do so using the customary names. As a result, very few C programs will ++compile with @samp{-ansi}. We intend to avoid such problems on the GNU ++system. ++ ++What, then, should you do in an ANSI C program to test the type of machine ++it is to run on? ++ ++GNU C offers a parallel series of symbols for this purpose, whose names ++are made from the customary ones by adding @samp{__} at the beginning ++and end. Thus, the symbol @code{__vax__} would be available on a vax, ++and so on. ++ ++The set of nonstandard predefined names in the GNU C preprocessor is ++controlled by the macro @samp{CPP_PREDEFINES}, which should be a string ++containing @samp{-D} options, separated by spaces. For example, on the ++Sun 3, we use the following definition: ++ ++@example ++#define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k" ++@end example ++ ++@node Stringification, Concatenation, Predefined, Macros ++@subsection Stringification ++ ++@cindex stringification ++@dfn{Stringification} means turning a code fragment into a string constant ++whose contents are the text for the code fragment. For example, ++stringifying @samp{foo (z)} results in @samp{"foo (z)"}. ++ ++In the C preprocessor, stringification is an option available when macro ++arguments are substituted into the macro definition. In the body of the ++definition, when an argument name appears, the character @samp{#} before ++the name specifies stringification of the corresponding actual argument ++when it is substituted at that point in the definition. The same argument ++may be substituted in other places in the definition without ++stringification if the argument name appears in those places with no ++@samp{#}. ++ ++Here is an example of a macro definition that uses stringification: ++ ++@example ++#define WARN_IF(EXP) \ ++do @{ if (EXP) fprintf (stderr, "Warning: " #EXP "\n"); @} while (0) ++@end example ++ ++@noindent ++Here the actual argument for @samp{EXP} is substituted once as given, ++into the @samp{if} statement, and once as stringified, into the ++argument to @samp{fprintf}. The @samp{do} and @samp{while (0)} are ++a kludge to make it possible to write @samp{WARN_IF (@var{arg});}, ++which the resemblance of @samp{WARN_IF} to a function would make ++C programmers want to do; @pxref{Swallow Semicolon}). ++ ++The stringification feature is limited to transforming one macro argument ++into one string constant: there is no way to combine the argument with ++other text and then stringify it all together. But the example above shows ++how an equivalent result can be obtained in ANSI Standard C using the ++feature that adjacent string constants are concatenated as one string ++constant. The preprocessor stringifies @samp{EXP}'s actual argument ++into a separate string constant, resulting in text like ++ ++@example ++do @{ if (x == 0) fprintf (stderr, "Warning: " "x == 0" "\n"); @} while (0) ++@end example ++ ++@noindent ++but the C compiler then sees three consecutive string constants and ++concatenates them into one, producing effectively ++ ++@example ++do @{ if (x == 0) fprintf (stderr, "Warning: x == 0\n"); @} while (0) ++@end example ++ ++Stringification in C involves more than putting doublequote characters ++around the fragment; it is necessary to put backslashes in front of all ++doublequote characters, and all backslashes in string and character ++constants, in order to get a valid C string constant with the proper ++contents. Thus, stringifying @samp{p = "foo\n";} results in @samp{"p = ++\"foo\\n\";"}. However, backslashes that are not inside of string or ++character constants are not duplicated: @samp{\n} by itself stringifies to ++@samp{"\n"}. ++ ++Whitespace (including comments) in the text being stringified is handled ++according to precise rules. All leading and trailing whitespace is ignored. ++Any sequence of whitespace in the middle of the text is converted to ++a single space in the stringified result. ++ ++@node Concatenation, Undefining, Stringification, Macros ++@subsection Concatenation ++ ++@cindex concatenation ++@dfn{Concatenation} means joining two strings into one. In the context ++of macro expansion, concatenation refers to joining two lexical units ++into one longer one. Specifically, an actual argument to the macro can be ++concatenated with another actual argument or with fixed text to produce ++a longer name. The longer name might be the name of a function, ++variable or type, or a C keyword; it might even be the name of another ++macro, in which case it will be expanded. ++ ++When you define a macro, you request concatenation with the special ++operator @samp{##} in the macro body. When the macro is called, ++after actual arguments are substituted, all @samp{##} operators are ++deleted, and so is any whitespace next to them (including whitespace ++that was part of an actual argument). The result is to concatenate ++the syntactic tokens on either side of the @samp{##}. ++ ++Consider a C program that interprets named commands. There probably needs ++to be a table of commands, perhaps an array of structures declared as ++follows: ++ ++@example ++struct command ++@{ ++ char *name; ++ void (*function) (); ++@}; ++ ++struct command commands[] = ++@{ ++ @{ "quit", quit_command@}, ++ @{ "help", help_command@}, ++ @dots{} ++@}; ++@end example ++ ++It would be cleaner not to have to give each command name twice, once in ++the string constant and once in the function name. A macro which takes the ++name of a command as an argument can make this unnecessary. The string ++constant can be created with stringification, and the function name by ++concatenating the argument with @samp{_command}. Here is how it is done: ++ ++@example ++#define COMMAND(NAME) @{ #NAME, NAME ## _command @} ++ ++struct command commands[] = ++@{ ++ COMMAND (quit), ++ COMMAND (help), ++ @dots{} ++@}; ++@end example ++ ++The usual case of concatenation is concatenating two names (or a name and a ++number) into a longer name. But this isn't the only valid case. It is ++also possible to concatenate two numbers (or a number and a name, such as ++@samp{1.5} and @samp{e3}) into a number. Also, multi-character operators ++such as @samp{+=} can be formed by concatenation. In some cases it is even ++possible to piece together a string constant. However, two pieces of text ++that don't together form a valid lexical unit cannot be concatenated. For ++example, concatenation with @samp{x} on one side and @samp{+} on the other ++is not meaningful because those two characters can't fit together in any ++lexical unit of C. The ANSI standard says that such attempts at ++concatenation are undefined, but in the GNU C preprocessor it is well ++defined: it puts the @samp{x} and @samp{+} side by side with no particular ++special results. ++ ++Keep in mind that the C preprocessor converts comments to whitespace before ++macros are even considered. Therefore, you cannot create a comment by ++concatenating @samp{/} and @samp{*}: the @samp{/*} sequence that starts a ++comment is not a lexical unit, but rather the beginning of a ``long'' space ++character. Also, you can freely use comments next to a @samp{##} in a ++macro definition, or in actual arguments that will be concatenated, because ++the comments will be converted to spaces at first sight, and concatenation ++will later discard the spaces. ++ ++@node Undefining, Redefining, Concatenation, Macros ++@subsection Undefining Macros ++ ++@cindex undefining macros ++To @dfn{undefine} a macro means to cancel its definition. This is done ++with the @samp{#undef} command. @samp{#undef} is followed by the macro ++name to be undefined. ++ ++Like definition, undefinition occurs at a specific point in the source ++file, and it applies starting from that point. The name ceases to be a ++macro name, and from that point on it is treated by the preprocessor as if ++it had never been a macro name. ++ ++For example, ++ ++@example ++#define FOO 4 ++x = FOO; ++#undef FOO ++x = FOO; ++@end example ++ ++@noindent ++expands into ++ ++@example ++x = 4; ++ ++x = FOO; ++@end example ++ ++@noindent ++In this example, @samp{FOO} had better be a variable or function as well ++as (temporarily) a macro, in order for the result of the expansion to be ++valid C code. ++ ++The same form of @samp{#undef} command will cancel definitions with ++arguments or definitions that don't expect arguments. The @samp{#undef} ++command has no effect when used on a name not currently defined as a macro. ++ ++@node Redefining, Macro Pitfalls, Undefining, Macros ++@subsection Redefining Macros ++ ++@cindex redefining macros ++@dfn{Redefining} a macro means defining (with @samp{#define}) a name that ++is already defined as a macro. ++ ++A redefinition is trivial if the new definition is transparently identical ++to the old one. You probably wouldn't deliberately write a trivial ++redefinition, but they can happen automatically when a header file is ++included more than once (@pxref{Header Files}), so they are accepted ++silently and without effect. ++ ++Nontrivial redefinition is considered likely to be an error, so ++it provokes a warning message from the preprocessor. However, sometimes it ++is useful to change the definition of a macro in mid-compilation. You can ++inhibit the warning by undefining the macro with @samp{#undef} before the ++second definition. ++ ++In order for a redefinition to be trivial, the new definition must ++exactly match the one already in effect, with two possible exceptions: ++ ++@itemize @bullet ++@item ++Whitespace may be added or deleted at the beginning or the end. ++ ++@item ++Whitespace may be changed in the middle (but not inside strings). ++However, it may not be eliminated entirely, and it may not be added ++where there was no whitespace at all. ++@end itemize ++ ++Recall that a comment counts as whitespace. ++ ++@node Macro Pitfalls,, Redefining, Macros ++@subsection Pitfalls and Subtleties of Macros ++ ++In this section we describe some special rules that apply to macros and ++macro expansion, and point out certain cases in which the rules have ++counterintuitive consequences that you must watch out for. ++ ++@menu ++* Misnesting:: Macros can contain unmatched parentheses. ++* Macro Parentheses:: Why apparently superfluous parentheses ++ may be necessary to avoid incorrect grouping. ++* Swallow Semicolon:: Macros that look like functions ++ but expand into compound statements. ++* Side Effects:: Unsafe macros that cause trouble when ++ arguments contain side effects. ++* Self-Reference:: Macros whose definitions use the macros' own names. ++* Argument Prescan:: Actual arguments are checked for macro calls ++ before they are substituted. ++* Cascaded Macros:: Macros whose definitions use other macros. ++@end menu ++ ++@node Misnesting, Macro Parentheses, Macro Pitfalls, Macro Pitfalls ++@subsubsection Improperly Nested Constructs ++ ++Recall that when a macro is called with arguments, the arguments are ++substituted into the macro body and the result is checked, together with ++the rest of the input file, for more macro calls. ++ ++It is possible to piece together a macro call coming partially from the ++macro body and partially from the actual arguments. For example, ++ ++@example ++#define double(x) (2*(x)) ++#define call_with_1(x) x(1) ++@end example ++ ++@noindent ++would expand @samp{call_with_1 (double)} into @samp{(2*(1))}. ++ ++Macro definitions do not have to have balanced parentheses. By writing an ++unbalanced open parenthesis in a macro body, it is possible to create a ++macro call that begins inside the macro body but ends outside of it. For ++example, ++ ++@example ++#define strange(file) fprintf (file, "%s %d", ++@dots{} ++strange(stderr) p, 35) ++@end example ++ ++@noindent ++This bizarre example expands to @samp{fprintf (stderr, "%s %d", p, 35)}! ++ ++@node Macro Parentheses, Swallow Semicolon, Misnesting, Macro Pitfalls ++@subsubsection Unintended Grouping of Arithmetic ++ ++You may have noticed that in most of the macro definition examples shown ++above, each occurrence of a macro argument name had parentheses around it. ++In addition, another pair of parentheses usually surround the entire macro ++definition. Here is why it is best to write macros that way. ++ ++Suppose you define a macro as follows, ++ ++@example ++#define ceil_div(x, y) (x + y - 1) / y ++@end example ++ ++@noindent ++whose purpose is to divide, rounding up. (One use for this ++operation is to compute how many @samp{int}'s are needed to hold ++a certain number of @samp{char}'s.) Then suppose it is used as follows: ++ ++@example ++a = ceil_div (b & c, sizeof (int)); ++@end example ++ ++@noindent ++This expands into ++ ++@example ++a = (b & c + sizeof (int) - 1) / sizeof (int); ++@end example ++ ++@noindent ++which does not do what is intended. The operator-precedence rules of ++C make it equivalent to this: ++ ++@example ++a = (b & (c + sizeof (int) - 1)) / sizeof (int); ++@end example ++ ++@noindent ++But what we want is this: ++ ++@example ++a = ((b & c) + sizeof (int) - 1)) / sizeof (int); ++@end example ++ ++@noindent ++Defining the macro as ++ ++@example ++#define ceil_div(x, y) ((x) + (y) - 1) / (y) ++@end example ++ ++@noindent ++provides the desired result. ++ ++However, unintended grouping can result in another way. Consider ++@samp{sizeof ceil_div(1, 2)}. That has the appearance of a C expression ++that would compute the size of the type of @samp{ceil_div (1, 2)}, but in ++fact it means something very different. Here is what it expands to: ++ ++@example ++sizeof ((1) + (2) - 1) / (2) ++@end example ++ ++@noindent ++This would take the size of an integer and divide it by two. The precedence ++rules have put the division outside the @samp{sizeof} when it was intended ++to be inside. ++ ++Parentheses around the entire macro definition can prevent such problems. ++Here, then, is the recommended way to define @samp{ceil_div}: ++ ++@example ++#define ceil_div(x, y) (((x) + (y) - 1) / (y)) ++@end example ++ ++@node Swallow Semicolon, Side Effects, Macro Parentheses, Macro Pitfalls ++@subsubsection Swallowing the Semicolon ++ ++@cindex semicolons (after macro calls) ++Often it is desirable to define a macro that expands into a compound ++statement. Consider, for example, the following macro, that advances a ++pointer (the argument @samp{p} says where to find it) across whitespace ++characters: ++ ++@example ++#define SKIP_SPACES (p, limit) \ ++@{ register char *lim = (limit); \ ++ while (p != lim) @{ \ ++ if (*p++ != ' ') @{ \ ++ p--; break; @}@}@} ++@end example ++ ++@noindent ++Here Backslash-Newline is used to split the macro definition, which must ++be a single line, so that it resembles the way such C code would be ++laid out if not part of a macro definition. ++ ++A call to this macro might be @samp{SKIP_SPACES (p, lim)}. Strictly ++speaking, the call expands to a compound statement, which is a complete ++statement with no need for a semicolon to end it. But it looks like a ++function call. So it minimizes confusion if you can use it like a function ++call, writing a semicolon afterward, as in @samp{SKIP_SPACES (p, lim);} ++ ++But this can cause trouble before @samp{else} statements, because the ++semicolon is actually a null statement. Suppose you write ++ ++@example ++if (*p != 0) ++ SKIP_SPACES (p, lim); ++else @dots{} ++@end example ++ ++@noindent ++The presence of two statements---the compound statement and a null ++statement---in between the @samp{if} condition and the @samp{else} ++makes invalid C code. ++ ++The definition of the macro @samp{SKIP_SPACES} can be altered to solve ++this problem, using a @samp{do @dots{} while} statement. Here is how: ++ ++@example ++#define SKIP_SPACES (p, limit) \ ++do @{ register char *lim = (limit); \ ++ while (p != lim) @{ \ ++ if (*p++ != ' ') @{ \ ++ p--; break; @}@}@} \ ++while (0) ++@end example ++ ++Now @samp{SKIP_SPACES (p, lim);} expands into ++ ++@example ++do @{@dots{}@} while (0); ++@end example ++ ++@noindent ++which is one statement. ++ ++@node Side Effects, Self-Reference, Swallow Semicolon, Macro Pitfalls ++@subsubsection Duplication of Side Effects ++ ++@cindex side effects (in macro arguments) ++@cindex unsafe macros ++Many C programs define a macro @samp{min}, for ``minimum'', like this: ++ ++@example ++#define min(X, Y) ((X) < (Y) ? (X) : (Y)) ++@end example ++ ++When you use this macro with an argument containing a side effect, ++as shown here, ++ ++@example ++next = min (x + y, foo (z)); ++@end example ++ ++@noindent ++it expands as follows: ++ ++@example ++next = ((x + y) < (foo (z)) ? (x + y) : (foo (z))); ++@end example ++ ++@noindent ++where @samp{x + y} has been substituted for @samp{X} and @samp{foo (z)} ++for @samp{Y}. ++ ++The function @samp{foo} is used only once in the statement as it appears ++in the program, but the expression @samp{foo (z)} has been substituted ++twice into the macro expansion. As a result, @samp{foo} might be called ++two times when the statement is executed. If it has side effects or ++if it takes a long time to compute, the results might not be what you ++intended. We say that @samp{min} is an @dfn{unsafe} macro. ++ ++The best solution to this problem is to define @samp{min} in a way that ++computes the value of @samp{foo (z)} only once. The C language offers no ++standard way to do this, but it can be done with GNU C extensions as ++follows: ++ ++@example ++#define min(X, Y) \ ++(@{ typeof (X) __x = (X), __y = (Y); \ ++ (__x < __y) ? __x : __y; @}) ++@end example ++ ++If you do not wish to use GNU C extensions, the only solution is to be ++careful when @emph{using} the macro @samp{min}. For example, you can ++calculate the value of @samp{foo (z)}, save it in a variable, and use that ++variable in @samp{min}: ++ ++@example ++#define min(X, Y) ((X) < (Y) ? (X) : (Y)) ++@dots{} ++@{ ++ int tem = foo (z); ++ next = min (x + y, tem); ++@} ++@end example ++ ++@noindent ++(where I assume that @samp{foo} returns type @samp{int}). ++ ++@node Self-Reference, Argument Prescan, Side Effects, Macro Pitfalls ++@subsubsection Self-Referential Macros ++ ++@cindex self-reference ++A @dfn{self-referential} macro is one whose name appears in its definition. ++A special feature of ANSI Standard C is that the self-reference is not ++considered a macro call. It is passed into the preprocessor output ++unchanged. ++ ++Let's consider an example: ++ ++@example ++#define foo (4 + foo) ++@end example ++ ++@noindent ++where @samp{foo} is also a variable in your program. ++ ++Following the ordinary rules, each reference to @samp{foo} will expand into ++@samp{(4 + foo)}; then this will be rescanned and will expand into @samp{(4 +++ (4 + foo))}; and so on until it causes a fatal error (memory full) in the ++preprocessor. ++ ++However, the special rule about self-reference cuts this process short ++after one step, at @samp{(4 + foo)}. Therefore, this macro definition ++has the possibly useful effect of causing the program to add 4 to ++the value of @samp{foo} wherever @samp{foo} is referred to. ++ ++In most cases, it is a bad idea to take advantage of this feature. A ++person reading the program who sees that @samp{foo} is a variable will ++not expect that it is a macro as well. The reader will come across the ++identifier @samp{foo} in the program and think its value should be that ++of the variable @samp{foo}, whereas in fact the value is four greater. ++ ++The special rule for self-reference applies also to @dfn{indirect} ++self-reference. This is the case where a macro @var{x} expands to use a ++macro @samp{y}, and @samp{y}'s expansion refers to the macro @samp{x}. The ++resulting reference to @samp{x} comes indirectly from the expansion of ++@samp{x}, so it is a self-reference and is not further expanded. Thus, ++after ++ ++@example ++#define x (4 + y) ++#define y (2 * x) ++@end example ++ ++@noindent ++@samp{x} would expand into @samp{(4 + (2 * x))}. Clear? ++ ++But suppose @samp{y} is used elsewhere, not from the definition of @samp{x}. ++Then the use of @samp{x} in the expansion of @samp{y} is not a self-reference ++because @samp{x} is not ``in progress''. So it does expand. However, ++the expansion of @samp{x} contains a reference to @samp{y}, and that ++is an indirect self-reference now because @samp{y} is ``in progress''. ++The result is that @samp{y} expands to @samp{(2 * (4 + y))}. ++ ++It is not clear that this behavior would ever be useful, but it is specified ++by the ANSI C standard, so you need to understand it. ++ ++@node Argument Prescan, Cascaded Macros, Self-Reference, Macro Pitfalls ++@subsubsection Separate Expansion of Macro Arguments ++ ++We have explained that the expansion of a macro, including the substituted ++actual arguments, is scanned over again for macro calls to be expanded. ++ ++What really happens is more subtle: first each actual argument text is scanned ++separately for macro calls. Then the results of this are substituted into ++the macro body to produce the macro expansion, and the macro expansion ++is scanned again for macros to expand. ++ ++The result is that the actual arguments are scanned @emph{twice} to expand ++macro calls in them. ++ ++Most of the time, this has no effect. If the actual argument contained ++any macro calls, they are expanded during the first scan. The result ++therefore contains no macro calls, so the second scan does not change it. ++If the actual argument were substituted as given, with no prescan, ++the single remaining scan would find the same macro calls and produce ++the same results. ++ ++You might expect the double scan to change the results when a ++self-referential macro is used in an actual argument of another macro ++(@pxref{Self-Reference}): the self-referential macro would be expanded once ++in the first scan, and a second time in the second scan. But this is not ++what happens. The self-references that do not expand in the first scan are ++marked so that they will not expand in the second scan either. ++ ++The prescan is not done when an argument is stringified or concatenated. ++Thus, ++ ++@example ++#define str(s) #s ++#define foo 4 ++str (foo) ++@end example ++ ++@noindent ++expands to @samp{"foo"}. Once more, prescan has been prevented from ++having any noticeable effect. ++ ++More precisely, stringification and concatenation use the argument as ++written, in un-prescanned form. The same actual argument would be used in ++prescanned form if it is substituted elsewhere without stringification or ++concatenation. ++ ++@example ++#define str(s) #s lose(s) ++#define foo 4 ++str (foo) ++@end example ++ ++expands to @samp{"foo" lose(4)}. ++ ++You might now ask, ``Why mention the prescan, if it makes no difference? ++And why not skip it and make the preprocessor faster?'' The answer is ++that the prescan does make a difference in three special cases: ++ ++@itemize @bullet ++@item ++Nested calls to a macro. ++ ++@item ++Macros that call other macros that stringify or concatenate. ++ ++@item ++Macros whose expansions contain unshielded commas. ++@end itemize ++ ++We say that @dfn{nested} calls to a macro occur when a macro's actual ++argument contains a call to that very macro. For example, if @samp{f} ++is a macro that expects one argument, @samp{f (f (1))} is a nested ++pair of calls to @samp{f}. The desired expansion is made by ++expanding @samp{f (1)} and substituting that into the definition of ++@samp{f}. The prescan causes the expected result to happen. ++Without the prescan, @samp{f (1)} itself would be substituted as ++an actual argument, and the inner use of @samp{f} would appear ++during the main scan as an indirect self-reference and would not ++be expanded. Here, the prescan cancels an undesirable side effect ++(in the medical, not computational, sense of the term) of the special ++rule for self-referential macros. ++ ++But prescan causes trouble in certain other cases of nested macro calls. ++Here is an example: ++ ++@example ++#define foo a,b ++#define bar(x) lose(x) ++#define lose(x) (1 + (x)) ++ ++bar(foo) ++@end example ++ ++@noindent ++We would like @samp{bar(foo)} to turn into @samp{(1 + (foo))}, which ++would then turn into @samp{(1 + (a,b))}. But instead, @samp{bar(foo)} ++expands into @samp{lose(a,b)}, and you get an error because @code{lose} ++requires a single argument. In this case, the problem is easily solved ++by the same parentheses that ought to be used to prevent misnesting of ++arithmetic operations: ++ ++@example ++#define foo (a,b) ++#define bar(x) lose((x)) ++@end example ++ ++The problem is more serious when the operands of the macro are not ++expressions; for example, when they are statements. Then parentheses ++are unacceptable because they would make for invalid C code: ++ ++@example ++#define foo @{ int a, b; @dots{} @} ++@end example ++ ++@noindent ++In GNU C you can shield the commas using the @samp{(@{@dots{}@})} ++construct which turns a compound statement into an expression: ++ ++@example ++#define foo (@{ int a, b; @dots{} @}) ++@end example ++ ++Or you can rewrite the macro definition to avoid such commas: ++ ++@example ++#define foo @{ int a; int b; @dots{} @} ++@end example ++ ++There is also one case where prescan is useful. It is possible ++to use prescan to expand an argument and then stringify it---if you use ++two levels of macros. Let's add a new macro @samp{xstr} to the ++example shown above: ++ ++@example ++#define xstr(s) str(s) ++#define str(s) #s ++#define foo 4 ++xstr (foo) ++@end example ++ ++This expands into @samp{"4"}, not @samp{"foo"}. The reason for the ++difference is that the argument of @samp{xstr} is expanded at prescan ++(because @samp{xstr} does not specify stringification or concatenation of ++the argument). The result of prescan then forms the actual argument for ++@samp{str}. @samp{str} uses its argument without prescan because it ++performs stringification; but it cannot prevent or undo the prescanning ++already done by @samp{xstr}. ++ ++@node Cascaded Macros,, Argument Prescan, Macro Pitfalls ++@subsubsection Cascaded Use of Macros ++ ++@cindex cascaded macros ++@cindex macro body uses macro ++A @dfn{cascade} of macros is when one macro's body contains a reference ++to another macro. This is very common practice. For example, ++ ++@example ++#define BUFSIZE 1020 ++#define TABLESIZE BUFSIZE ++@end example ++ ++This is not at all the same as defining @samp{TABLESIZE} to be @samp{1020}. ++The @samp{#define} for @samp{TABLESIZE} uses exactly the body you ++specify---in this case, @samp{BUFSIZE}---and does not check to see whether ++it too is the name of a macro. ++ ++It's only when you @emph{use} @samp{TABLESIZE} that the result of its expansion ++is checked for more macro names. ++ ++This makes a difference if you change the definition of @samp{BUFSIZE} ++at some point in the source file. @samp{TABLESIZE}, defined as shown, ++will always expand using the definition of @samp{BUFSIZE} that is ++currently in effect: ++ ++@example ++#define BUFSIZE 1020 ++#define TABLESIZE BUFSIZE ++#undef BUFSIZE ++#define BUFSIZE 37 ++@end example ++ ++@noindent ++Now @samp{TABLESIZE} expands (in two stages) to @samp{37}. ++ ++@node Conditionals, Combining Sources, Macros, Top ++@section Conditionals ++ ++@cindex conditionals ++In a macro processor, a @dfn{conditional} is a command that allows a part ++of the program to be ignored during compilation, on some conditions. ++In the C preprocessor, a conditional can test either an arithmetic expression ++or whether a name is defined as a macro. ++ ++A conditional in the C preprocessor resembles in some ways an @samp{if} ++statement in C, but it is important to understand the difference between ++them. The condition in an @samp{if} statement is tested during the execution ++of your program. Its purpose is to allow your program to behave differently ++from run to run, depending on the data it is operating on. The condition ++in a preprocessor conditional command is tested when your program is compiled. ++Its purpose is to allow different code to be included in the program depending ++on the situation at the time of compilation. ++ ++@menu ++* Uses: Conditional Uses. What conditionals are for. ++* Syntax: Conditional Syntax. How conditionals are written. ++* Deletion: Deleted Code. Making code into a comment. ++* Macros: Conditionals-Macros. Why conditionals are used with macros. ++* Errors: #error Command. Detecting inconsistent compilation parameters. ++@end menu ++ ++@node Conditional Uses, Conditional Syntax, Conditionals, Conditionals ++@subsection Why Conditionals are Used ++ ++Generally there are three kinds of reason to use a conditional. ++ ++@itemize @bullet ++@item ++A program may need to use different code depending on the machine or ++operating system it is to run on. In some cases the code for one ++operating system may be erroneous on another operating system; for ++example, it might refer to library routines that do not exist on the ++other system. When this happens, it is not enough to avoid executing ++the invalid code: merely having it in the program makes it impossible ++to link the program and run it. With a preprocessor conditional, the ++offending code can be effectively excised from the program when it is ++not valid. ++ ++@item ++You may want to be able to compile the same source file into two ++different programs. Sometimes the difference between the programs is ++that one makes frequent time-consuming consistency checks on its ++intermediate data while the other does not. ++ ++@item ++A conditional whose condition is always false is a good way to exclude ++code from the program but keep it as a sort of comment for future ++reference. ++@end itemize ++ ++Most simple programs that are intended to run on only one machine will ++not need to use preprocessor conditionals. ++ ++@node Conditional Syntax, Deleted Code, Conditional Uses, Conditionals ++@subsection Syntax of Conditionals ++ ++@findex #if ++A conditional in the C preprocessor begins with a @dfn{conditional ++command}: @samp{#if}, @samp{#ifdef} or @samp{#ifndef}. ++@xref{Conditionals-Macros}, for info on @samp{#ifdef} and ++@samp{#ifndef}; only @samp{#if} is explained here. ++ ++@menu ++* If: #if Command. Basic conditionals using @samp{#if} and @samp{#endif}. ++* Else: #else Command. Including some text if the condition fails. ++* Elif: #elif Command. Testing several alternative possibilities. ++@end menu ++ ++@node #if Command, #else Command, Conditional Syntax, Conditional Syntax ++@subsubsection The @samp{#if} Command ++ ++The @samp{#if} command in its simplest form consists of ++ ++@example ++#if @var{expression} ++@var{controlled text} ++#endif /* @var{expression} */ ++@end example ++ ++The comment following the @samp{#endif} is not required, but it is a good ++practice because it helps people match the @samp{#endif} to the ++corresponding @samp{#if}. Such comments should always be used, except in ++short conditionals that are not nested. In fact, you can put anything at ++all after the @samp{#endif} and it will be ignored by the GNU C preprocessor, ++but only comments are acceptable in ANSI Standard C. ++ ++@var{expression} is a C expression of integer type, subject to stringent ++restrictions. It may contain ++ ++@itemize @bullet ++@item ++Integer constants, which are all regarded as @code{long} or ++@code{unsigned long}. ++ ++@item ++Character constants, which are interpreted according to the character ++set and conventions of the machine and operating system on which the ++preprocessor is running. The GNU C preprocessor uses the C data type ++@samp{char} for these character constants; therefore, whether some ++character codes are negative is determined by the C compiler used to ++compile the preprocessor. If it treats @samp{char} as signed, then ++character codes large enough to set the sign bit will be considered ++negative; otherwise, no character code is considered negative. ++ ++@item ++Arithmetic operators for addition, subtraction, multiplication, ++division, bitwise operations, shifts, comparisons, and @samp{&&} and ++@samp{||}. ++ ++@item ++Identifiers that are not macros, which are all treated as zero(!). ++ ++@item ++Macro calls. All macro calls in the expression are expanded before ++actual computation of the expression's value begins. ++@end itemize ++ ++Note that @samp{sizeof} operators and @code{enum}-type values are not allowed. ++@code{enum}-type values, like all other identifiers that are not taken ++as macro calls and expanded, are treated as zero. ++ ++The text inside of a conditional can include preprocessor commands. Then ++the commands inside the conditional are obeyed only if that branch of the ++conditional succeeds. The text can also contain other conditional groups. ++However, the @samp{#if}'s and @samp{#endif}'s must balance. ++ ++@node #else Command, #elif Command, #if Command, Conditional Syntax ++@subsubsection The @samp{#else} Command ++ ++@findex #else ++The @samp{#else} command can be added to a conditional to provide alternative ++text to be used if the condition is false. This looks like ++ ++@example ++#if @var{expression} ++@var{text-if-true} ++#else /* Not @var{expression} */ ++@var{text-if-false} ++#endif /* Not @var{expression} */ ++@end example ++ ++If @var{expression} is nonzero, and the @var{text-if-true} is considered ++included, then @samp{#else} acts like a failing conditional and the ++@var{text-if-false} is ignored. Contrariwise, if the @samp{#if} ++conditional fails, the @var{text-if-false} is considered included. ++ ++@node #elif Command,, #else Command, Conditional Syntax ++@subsubsection The @samp{#elif} Command ++ ++@findex #elif ++One common case of nested conditionals is used to check for more than two ++possible alternatives. For example, you might have ++ ++@example ++#if X == 1 ++@dots{} ++#else /* X != 1 */ ++#if X == 2 ++@dots{} ++#else /* X != 2 */ ++@dots{} ++#endif /* X != 2 */ ++#endif /* X != 1 */ ++@end example ++ ++Another conditional command, @samp{#elif}, allows this to be abbreviated ++as follows: ++ ++@example ++#if X == 1 ++@dots{} ++#elif X == 2 ++@dots{} ++#else /* X != 2 and X != 1*/ ++@dots{} ++#endif /* X != 2 and X != 1*/ ++@end example ++ ++@samp{#elif} stands for ``else if''. Like @samp{#else}, it goes in the ++middle of a @samp{#if}-@samp{#endif} pair and subdivides it; it does not ++require a matching @samp{#endif} of its own. Like @samp{#if}, the ++@samp{#elif} command includes an expression to be tested. ++ ++The text following the @samp{#elif} is processed only if the original ++@samp{#if}-condition failed and the @samp{#elif} condition succeeeds. More ++than one @samp{#elif} can go in the same @samp{#if}-@samp{#endif} group. ++Then the text after each @samp{#elif} is processed only if the @samp{#elif} ++condition succeeds after the original @samp{#if} and any previous ++@samp{#elif}'s within it have failed. @samp{#else} is equivalent to ++@samp{#elif 1}, and @samp{#else} is allowed after any number of ++@samp{#elif}'s, but @samp{#elif} may not follow a @samp{#else}. ++ ++@node Deleted Code, Conditionals-Macros, Conditional Syntax, Conditionals ++@subsection Keeping Deleted Code for Future Reference ++ ++If you replace or delete a part of the program but want to keep the old ++code around as a comment for future reference, the easy way to do this is ++to put @samp{#if 0} before it and @samp{#endif} after it. ++ ++This works even if the code being turned off contains conditionals, but ++they must be entire conditionals (balanced @samp{#if} and @samp{#endif}). ++ ++@node Conditionals-Macros, #error Command, Deleted Code, Conditionals ++@subsection Conditionals and Macros ++ ++Conditionals are rarely useful except in connection with macros. A ++@samp{#if} command whose expression uses no macros is equivalent to ++@samp{#if 1} or @samp{#if 0}; you might as well determine which one, by ++computing the value of the expression yourself, and then simplify the ++program. But when the expression uses macros, its value can vary from ++compilation to compilation. ++ ++For example, here is a conditional that tests the expression ++@samp{BUFSIZE == 1020}, where @samp{BUFSIZE} must be a macro. ++ ++@example ++#if BUFSIZE == 1020 ++ printf ("Large buffers!\n"); ++#endif /* BUFSIZE is large */ ++@end example ++ ++@findex defined ++The special operator @samp{defined} may be used in @samp{#if} expressions ++to test whether a certain name is defined as a macro. Either @samp{defined ++@var{name}} or @samp{defined (@var{name})} is an expression whose value is ++1 if @var{name} is defined as macro at the current point in the program, ++and 0 otherwise. For the @samp{defined} operator it makes no difference ++what the definition of the macro is; all that matters is whether there is a ++definition. Thus, for example,@refill ++ ++@example ++#if defined (vax) || defined (ns16000) ++@end example ++ ++@noindent ++would include the following code if either of the names @samp{vax} and ++@samp{ns16000} is defined as a macro. ++ ++If a macro is defined and later undefined with @samp{#undef}, ++subsequent use of the @samp{defined} operator will return 0, because ++the name is no longer defined. If the macro is defined again with ++another @samp{#define}, @samp{defined} will recommence returning 1. ++ ++@findex #ifdef ++@findex #ifndef ++Conditionals that test just the definedness of one name are very common, so ++there are two special short conditional commands for this case. They are ++ ++@table @code ++@item #ifdef @var{name} ++is equivalent to @samp{#if defined (@var{name})}. ++ ++@item #ifndef @var{name} ++is equivalent to @samp{#if ! defined (@var{name})}. ++@end table ++ ++Macro definitions can vary between compilations for several reasons. ++ ++@itemize @bullet ++@item ++Some macros are predefined on each kind of machine. For example, on a ++Vax, the name @samp{vax} is a predefined macro. On other machines, it ++would not be defined. ++ ++@item ++Many more macros are defined by system header files. Different ++systems and machines define different macros, or give them different ++values. It is useful to test these macros with conditionals to avoid ++using a system feature on a machine where it is not implemented. ++ ++@item ++Macros are a common way of allowing users to customize a program for ++different machines or applications. For example, the macro ++@samp{BUFSIZE} might be defined in a configuration file for your ++program that is included as a header file in each source file. You ++would use @samp{BUFSIZE} in a preprocessor conditional in order to ++generate different code depending on the chosen configuration. ++ ++@item ++Macros can be defined or undefined with @samp{-D} and @samp{-U} ++command options when you compile the program. You can arrange to ++compile the same source file into two different programs by choosing ++a macro name to specify which program you want, writing conditionals ++to test whether or how this macro is defined, and then controlling ++the state of the macro with compiler command options. ++@xref{Invocation}. ++@end itemize ++ ++@node #error Command,, Conditionals-Macros, Conditionals ++@subsection The @samp{#error} Command ++ ++@findex #error ++The command @samp{#error} causes the preprocessor to report a fatal ++error. The rest of the line that follows @samp{#error} is used as the ++error message. ++ ++You would use @samp{#error} inside of a conditional that detects a ++combination of parameters which you know the program does not properly ++support. For example, if you know that the program will not run ++properly on a Vax, you might write ++ ++@example ++#ifdef vax ++#error Won't work on Vaxen. See comments at get_last_object. ++#endif ++@end example ++ ++@noindent ++@xref{Nonstandard Predefined}, for why this works. ++ ++If you have several configuration parameters that must be set up by ++the installation in a consistent way, you can use conditionals to detect ++an inconsistency and report it with @samp{#error}. For example, ++ ++@example ++#if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \ ++ || HASH_TABLE_SIZE % 5 == 0 ++#error HASH_TABLE_SIZE should not be divisible by a small prime ++#endif ++@end example ++ ++@node Combining Sources, Other Commands, Conditionals, Top ++@section Combining Source Files ++ ++@cindex line control ++@findex #line ++One of the jobs of the C preprocessor is to inform the C compiler of where ++each line of C code came from: which source file and which line number. ++ ++C code can come from multiple source files if you use @samp{#include}; ++both @samp{#include} and the use of conditionals and macros can cause ++the line number of a line in the preprocessor output to be different ++from the line's number in the original source file. You will appreciate ++the value of making both the C compiler (in error messages) and symbolic ++debuggers such as GDB use the line numbers in your source file. ++ ++The C preprocessor builds on this feature by offering a command by which ++you can control the feature explicitly. This is useful when a file for ++input to the C preprocessor is the output from another program such as the ++@code{bison} parser generator, which operates on another file that is the ++true source file. Parts of the output from @code{bison} are generated from ++scratch, other parts come from a standard parser file. The rest are copied ++nearly verbatim from the source file, but their line numbers in the ++@code{bison} output are not the same as their original line numbers. ++Naturally you would like compiler error messages and symbolic debuggers to ++know the original source file and line number of each line in the ++@code{bison} output. ++ ++@code{bison} arranges this by writing @samp{#line} commands into the output ++file. @samp{#line} is a command that specifies the original line number ++and source file name for subsequent input in the current preprocessor input ++file. @samp{#line} has three variants: ++ ++@table @code ++@item #line @var{linenum} ++Here @var{linenum} is a decimal integer constant. This specifies that ++the line number of the following line of input, in its original source file, ++was @var{linenum}. ++ ++@item #line @var{linenum} @var{filename} ++Here @var{linenum} is a decimal integer constant and @var{filename} ++is a string constant. This specifies that the following line of input ++came originally from source file @var{filename} and its line number there ++was @var{linenum}. Keep in mind that @var{filename} is not just a ++file name; it is surrounded by doublequote characters so that it looks ++like a string constant. ++ ++@item #line @var{anything else} ++@var{anything else} is checked for macro calls, which are expanded. ++The result should be a decimal integer constant followed optionally ++by a string constant, as described above. ++@end table ++ ++@samp{#line} commands alter the results of the @samp{__FILE__} and ++@samp{__LINE__} predefined macros from that point on. @xref{Standard ++Predefined}. ++ ++@node Other Commands, Output, Combining Sources, Top ++@section Miscellaneous Preprocessor Commands ++ ++@findex #pragma ++@findex #ident ++@cindex null command ++This section describes three additional preprocessor commands. They are ++not very useful, but are mentioned for completeness. ++ ++The @dfn{null command} consists of a @samp{#} followed by a Newline, with ++only whitespace (including comments) in between. A null command is ++understood as a preprocessor command but has no effect on the preprocessor ++output. The primary significance of the existence of the null command is ++that an input line consisting of just a @samp{#} will produce no output, ++rather than a line of output containing just a @samp{#}. Supposedly ++some old C programs contain such lines. ++ ++The @samp{#pragma} command is specified in the ANSI standard to have an ++arbitrary implementation-defined effect. In the GNU C preprocessor, ++@samp{#pragma} commands are ignored, except for @samp{#pragma once} ++(@pxref{Once-Only}). ++ ++The @samp{#ident} command is supported for compatibility with certain ++other systems. It is followed by a line of text. On certain systems, ++the text is copied into a special place in the object file; on most ++systems, the text is ignored and this directive has no effect. ++ ++@node Output, Invocation, Other Commands, Top ++@section C Preprocessor Output ++ ++@cindex output format ++The output from the C preprocessor looks much like the input, except ++that all preprocessor command lines have been replaced with blank lines ++and all comments with spaces. Whitespace within a line is not altered; ++however, a space is inserted after the expansions of most macro calls. ++ ++Source file name and line number information is conveyed by lines of ++the form ++ ++@example ++# @var{linenum} @var{filename} @var{flag} ++@end example ++ ++@noindent ++which are inserted as needed into the middle of the input (but never ++within a string or character constant). Such a line means that the ++following line originated in file @var{filename} at line @var{linenum}. ++ ++The third field, @var{flag}, may be a number, or may be absent. It is ++@samp{1} for the beginning of a new source file, and @samp{2} for return ++to an old source file at the end of an included file. It is absent ++otherwise. ++ ++@node Invocation, Concept Index, Output, Top ++@section Invoking the C Preprocessor ++ ++Most often when you use the C preprocessor you will not have to invoke it ++explicitly: the C compiler will do so automatically. However, the ++preprocessor is sometimes useful individually. ++ ++The C preprocessor expects two file names as arguments, @var{infile} and ++@var{outfile}. The preprocessor reads @var{infile} together with any other ++files it specifies with @samp{#include}. All the output generated by the ++combined input files is written in @var{outfile}. ++ ++Either @var{infile} or @var{outfile} may be @samp{-}, which as @var{infile} ++means to read from standard input and as @var{outfile} means to write to ++standard output. Also, if @var{outfile} or both file names are omitted, ++the standard output and standard input are used for the omitted file names. ++ ++@cindex options ++Here is a table of command options accepted by the C preprocessor. Most ++of them can also be given when compiling a C program; they are passed along ++automatically to the preprocessor when it is invoked by the compiler. ++ ++@table @samp ++@item -P ++@findex -P ++Inhibit generation of @samp{#}-lines with line-number information in ++the output from the preprocessor (@pxref{Output}). This might be ++useful when running the preprocessor on something that is not C code ++and will be sent to a program which might be confused by the ++@samp{#}-lines ++ ++@item -C ++@findex -C ++Do not discard comments: pass them through to the output file. ++Comments appearing in arguments of a macro call will be copied to the ++output before the expansion of the macro call. ++ ++@item -trigraphs ++@findex -trigraphs ++Process ANSI standard trigraph sequences. These are three-character ++sequences, all starting with @samp{??}, that are defined by ANSI C to ++stand for single characters. For example, @samp{??/} stands for ++@samp{\}, so @samp{'??/n'} is a character constant for a newline. ++Strictly speaking, the GNU C preprocessor does not support all ++programs in ANSI Standard C unless @samp{-trigraphs} is used, but if ++you ever notice the difference it will be with relief. ++ ++You don't want to know any more about trigraphs. ++ ++@item -pedantic ++@findex -pedantic ++Issue warnings required by the ANSI C standard in certain cases such ++as when text other than a comment follows @samp{#else} or @samp{#endif}. ++ ++@item -I @var{directory} ++@findex -I ++Add the directory @var{directory} to the end of the list of ++directories to be searched for header files (@pxref{Include Syntax}). ++This can be used to override a system header file, substituting your ++own version, since these directories are searched before the system ++header file directories. If you use more than one @samp{-I} option, ++the directories are scanned in left-to-right order; the standard ++system directories come after. ++ ++@item -I- ++Any directories specified with @samp{-I} options before the @samp{-I-} ++option are searched only for the case of @samp{#include "@var{file}"}; ++they are not searched for @samp{#include <@var{file}>}. ++ ++If additional directories are specified with @samp{-I} options after ++the @samp{-I-}, these directories are searched for all @samp{#include} ++directives. ++ ++In addition, the @samp{-I-} option inhibits the use of the current ++directory as the first search directory for @samp{#include "@var{file}"}. ++Therefore, the current directory is searched only if it is requested ++explicitly with @samp{-I.}. Specifying both @samp{-I-} and @samp{-I.} ++allows you to control precisely which directories are searched before ++the current one and which are searched after. ++ ++@item -nostdinc ++Do not search the standard system directories for header files. ++Only the directories you have specified with @samp{-I} options ++(and the current directory, if appropriate) are searched. ++ ++@item -D @var{name} ++@findex -D ++Predefine @var{name} as a macro, with definition @samp{1}. ++ ++@item -D @var{name}=@var{definition} ++Predefine @var{name} as a macro, with definition @var{definition}. ++There are no restrictions on the contents of @var{definition}, but if ++you are invoking the preprocessor from a shell or shell-like program ++you may need to use the shell's quoting syntax to protect characters ++such as spaces that have a meaning in the shell syntax. ++ ++@item -U @var{name} ++@findex -U ++Do not predefine @var{name}. If both @samp{-U} and @samp{-D} are ++specified for one name, the @samp{-U} beats the @samp{-D} and the name ++is not predefined. ++ ++@item -undef ++@findex -undef ++Do not predefine any nonstandard macros. ++ ++@item -d ++@findex -d ++Instead of outputting the result of preprocessing, output a list of ++@samp{#define} commands for all the macros defined during the ++execution of the preprocessor. ++ ++@item -M ++@findex -M ++Instead of outputting the result of preprocessing, output a rule ++suitable for @code{make} describing the dependencies of the main ++source file. The preprocessor outputs one @code{make} rule containing ++the object file name for that source file, a colon, and the names of ++all the included files. If there are many included files then the ++rule is split into several lines using @samp{\}-newline. ++ ++This feature is used in automatic updating of makefiles. ++ ++@item -MM ++@findex -MM ++Like @samp{-M} but mention only the files included with @samp{#include ++"@var{file}"}. System header files included with @samp{#include ++<@var{file}>} are omitted. ++ ++@item -i @var{file} ++@findex -i ++Process @var{file} as input, discarding the resulting output, before ++processing the regular input file. Because the output generated from ++@var{file} is discarded, the only effect of @samp{-i @var{file}} is to ++make the macros defined in @var{file} available for use in the main ++input. ++@end table ++ ++@node Concept Index, Index, Invocation, Top ++@unnumbered Concept Index ++@printindex cp ++ ++@node Index,, Concept Index, Top ++@unnumbered Index of Commands, Macros and Options ++@printindex fn ++ ++@contents ++@bye +diff -Naur alliance-5.0/genview/src/gcc-1.42/cse.c alliance/genview/src/gcc-1.42/cse.c +--- alliance-5.0/genview/src/gcc-1.42/cse.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/cse.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,3963 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Common subexpression elimination for GNU compiler. ++ Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include "config.h" ++#include "rtl.h" ++#include "regs.h" ++#include "hard-reg-set.h" ++#include "flags.h" ++#include "real.h" ++ ++#include ++ ++/* The basic idea of common subexpression elimination is to go ++ through the code, keeping a record of expressions that would ++ have the same value at the current scan point, and replacing ++ expressions encountered with the cheapest equivalent expression. ++ ++ It is too complicated to keep track of the different possibilities ++ when control paths merge; so, at each label, we forget all that is ++ known and start fresh. This can be described as processing each ++ basic block separately. Note, however, that these are not quite ++ the same as the basic blocks found by a later pass and used for ++ data flow analysis and register packing. We do not need to start fresh ++ after a conditional jump instruction if there is no label there. ++ ++ We use two data structures to record the equivalent expressions: ++ a hash table for most expressions, and several vectors together ++ with "quantity numbers" to record equivalent (pseudo) registers. ++ ++ The use of the special data structure for registers is desirable ++ because it is faster. It is possible because registers references ++ contain a fairly small number, the register number, taken from ++ a contiguously allocated series, and two register references are ++ identical if they have the same number. General expressions ++ do not have any such thing, so the only way to retrieve the ++ information recorded on an expression other than a register ++ is to keep it in a hash table. ++ ++Registers and "quantity numbers": ++ ++ At the start of each basic block, all of the (hardware and pseudo) ++ registers used in the function are given distinct quantity ++ numbers to indicate their contents. During scan, when the code ++ copies one register into another, we copy the quantity number. ++ When a register is loaded in any other way, we allocate a new ++ quantity number to describe the value generated by this operation. ++ `reg_qty' records what quantity a register is currently thought ++ of as containing. ++ ++ We also maintain a bidirectional chain of registers for each ++ quantity number. `qty_first_reg', `qty_last_reg', ++ `reg_next_eqv' and `reg_prev_eqv' hold these chains. ++ ++ The first register in a chain is the one whose lifespan is least local. ++ Among equals, it is the one that was seen first. ++ We replace any equivalent register with that one. ++ ++Constants and quantity numbers ++ ++ When a quantity has a known constant value, that value is stored ++ in the appropriate element of qty_const. This is in addition to ++ putting the constant in the hash table as is usual for non-regs. ++ ++ Regs are preferred to constants as they are to everything else, ++ but expressions containing constants can be simplified, by fold_rtx. ++ ++ When a quantity has a known nearly constant value (such as an address ++ of a stack slot), that value is stored in the appropriate element ++ of qty_const. ++ ++ Integer constants don't have a machine mode. However, cse ++ determines the intended machine mode from the destination ++ of the instruction that moves the constant. The machine mode ++ is recorded in the hash table along with the actual RTL ++ constant expression so that different modes are kept separate. ++ ++Other expressions: ++ ++ To record known equivalences among expressions in general ++ we use a hash table called `table'. It has a fixed number of buckets ++ that contain chains of `struct table_elt' elements for expressions. ++ These chains connect the elements whose expressions have the same ++ hash codes. ++ ++ Other chains through the same elements connect the elements which ++ currently have equivalent values. ++ ++ Register references in an expression are canonicalized before hashing ++ the expression. This is done using `reg_qty' and `qty_first_reg'. ++ The hash code of a register reference is computed using the quantity ++ number, not the register number. ++ ++ When the value of an expression changes, it is necessary to remove from the ++ hash table not just that expression but all expressions whose values ++ could be different as a result. ++ ++ 1. If the value changing is in memory, except in special cases ++ ANYTHING referring to memory could be changed. That is because ++ nobody knows where a pointer does not point. ++ The function `invalidate_memory' removes what is necessary. ++ ++ The special cases are when the address is constant or is ++ a constant plus a fixed register such as the frame pointer ++ or a static chain pointer. When such addresses are stored in, ++ we can tell exactly which other such addresses must be invalidated ++ due to overlap. `invalidate' does this. ++ All expressions that refer to non-constant ++ memory addresses are also invalidated. `invalidate_memory' does this. ++ ++ 2. If the value changing is a register, all expressions ++ containing references to that register, and only those, ++ must be removed. ++ ++ Because searching the entire hash table for expressions that contain ++ a register is very slow, we try to figure out when it isn't necessary. ++ Precisely, this is necessary only when expressions have been ++ entered in the hash table using this register, and then the value has ++ changed, and then another expression wants to be added to refer to ++ the register's new value. This sequence of circumstances is rare ++ within any one basic block. ++ ++ The vectors `reg_tick' and `reg_in_table' are used to detect this case. ++ reg_tick[i] is incremented whenever a value is stored in register i. ++ reg_in_table[i] holds -1 if no references to register i have been ++ entered in the table; otherwise, it contains the value reg_tick[i] had ++ when the references were entered. If we want to enter a reference ++ and reg_in_table[i] != reg_tick[i], we must scan and remove old references. ++ Until we want to enter a new entry, the mere fact that the two vectors ++ don't match makes the entries be ignored if anyone tries to match them. ++ ++ Registers themselves are entered in the hash table as well as in ++ the equivalent-register chains. However, the vectors `reg_tick' ++ and `reg_in_table' do not apply to expressions which are simple ++ register references. These expressions are removed from the table ++ immediately when they become invalid, and this can be done even if ++ we do not immediately search for all the expressions that refer to ++ the register. ++ ++ A CLOBBER rtx in an instruction invalidates its operand for further ++ reuse. A CLOBBER or SET rtx whose operand is a MEM:BLK ++ invalidates everything that resides in memory. ++ ++Related expressions: ++ ++ Constant expressions that differ only by an additive integer ++ are called related. When a constant expression is put in ++ the table, the related expression with no constant term ++ is also entered. These are made to point at each other ++ so that it is possible to find out if there exists any ++ register equivalent to an expression related to a given expression. */ ++ ++/* One plus largest register number used in this function. */ ++ ++static int max_reg; ++ ++/* Length of vectors indexed by quantity number. ++ We know in advance we will not need a quantity number this big. */ ++ ++static int max_qty; ++ ++/* Next quantity number to be allocated. ++ This is 1 + the largest number needed so far. */ ++ ++static int next_qty; ++ ++/* Indexed by quantity number, gives the first (or last) (pseudo) register ++ in the chain of registers that currently contain this quantity. */ ++ ++static int *qty_first_reg; ++static int *qty_last_reg; ++ ++/* Indexed by quantity number, gives the rtx of the constant value of the ++ quantity, or zero if it does not have a known value. ++ A sum of the frame pointer (or arg pointer) plus a constant ++ can also be entered here. */ ++ ++static rtx *qty_const; ++ ++/* Indexed by qty number, gives the insn that stored the constant value ++ recorded in `qty_const'. */ ++ ++static rtx *qty_const_insn; ++ ++/* Value stored in CC0 by previous insn: ++ 0 if previous insn didn't store in CC0. ++ else 0100 + (M&7)<<3 + (N&7) ++ where M is 1, 0 or -1 if result was >, == or < as signed number ++ and N is 1, 0 or -1 if result was >, == or < as unsigned number. ++ 0200 bit may also be set, meaning that only == and != comparisons ++ have known results. */ ++ ++static int prev_insn_cc0; ++ ++/* For machines where CC0 is one bit, we may see CC0 assigned a ++ constant value (after fold_rtx). ++ Record here the value stored in the previous insn (0 if none). */ ++ ++static rtx prev_insn_explicit_cc0; ++ ++/* Previous actual insn. 0 if at first insn of basic block. */ ++ ++static rtx prev_insn; ++ ++/* Insn being scanned. */ ++ ++static rtx this_insn; ++ ++/* Index by (pseudo) register number, gives the quantity number ++ of the register's current contents. */ ++ ++static int *reg_qty; ++ ++/* Index by (pseudo) register number, gives the number of the next ++ (pseudo) register in the chain of registers sharing the same value. ++ Or -1 if this register is at the end of the chain. */ ++ ++static int *reg_next_eqv; ++ ++/* Index by (pseudo) register number, gives the number of the previous ++ (pseudo) register in the chain of registers sharing the same value. ++ Or -1 if this register is at the beginning of the chain. */ ++ ++static int *reg_prev_eqv; ++ ++/* Index by (pseudo) register number, gives the latest rtx ++ to use to insert a ref to that register. */ ++ ++static rtx *reg_rtx; ++ ++/* Index by (pseudo) register number, gives the number of times ++ that register has been altered in the current basic block. */ ++ ++static int *reg_tick; ++ ++/* Index by (pseudo) register number, gives the reg_tick value at which ++ rtx's containing this register are valid in the hash table. ++ If this does not equal the current reg_tick value, such expressions ++ existing in the hash table are invalid. ++ If this is -1, no expressions containing this register have been ++ entered in the table. */ ++ ++static int *reg_in_table; ++ ++/* Two vectors of max_reg ints: ++ one containing all -1's; in the other, element i contains i. ++ These are used to initialize various other vectors fast. */ ++ ++static int *all_minus_one; ++static int *consec_ints; ++ ++/* Set nonzero in cse_insn to tell cse_basic_block to skip immediately ++ to the next basic block and treat it as a continuation of this one. */ ++ ++static int cse_skip_to_next_block; ++ ++/* CUID of insn that starts the basic block currently being cse-processed. */ ++ ++static int cse_basic_block_start; ++ ++/* CUID of insn that ends the basic block currently being cse-processed. */ ++ ++static int cse_basic_block_end; ++ ++/* Vector mapping INSN_UIDs to cuids. ++ The cuids are like uids but increase monononically always. ++ We use them to see whether a reg is used outside a given basic block. */ ++ ++static short *uid_cuid; ++ ++/* Get the cuid of an insn. */ ++ ++#define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)]) ++ ++/* Nonzero if cse has altered conditional jump insns ++ in such a way that jump optimization should be redone. */ ++ ++static int cse_jumps_altered; ++ ++/* canon_hash stores 1 in do_not_record ++ if it notices a reference to CC0, CC1 or PC. */ ++ ++static int do_not_record; ++ ++/* canon_hash stores 1 in hash_arg_in_memory ++ if it notices a reference to memory within the expression being hashed. */ ++ ++static int hash_arg_in_memory; ++ ++/* canon_hash stores 1 in hash_arg_in_struct ++ if it notices a reference to memory that's part of a structure. */ ++ ++static int hash_arg_in_struct; ++ ++/* The hash table contains buckets which are chains of `struct table_elt's, ++ each recording one expression's information. ++ That expression is in the `exp' field. ++ ++ Those elements with the same hash code are chained in both directions ++ through the `next_same_hash' and `prev_same_hash' fields. ++ ++ Each set of expressions with equivalent values ++ are on a two-way chain through the `next_same_value' ++ and `prev_same_value' fields, and all point with ++ the `first_same_value' field at the first element in ++ that chain. The chain is in order of increasing cost. ++ Each element's cost value is in its `cost' field. ++ ++ The `in_memory' field is nonzero for elements that ++ involve any reference to memory. These elements are removed ++ whenever a write is done to an unidentified location in memory. ++ To be safe, we assume that a memory address is unidentified unless ++ the address is either a symbol constant or a constant plus ++ the frame pointer or argument pointer. ++ ++ The `in_struct' field is nonzero for elements that ++ involve any reference to memory inside a structure or array. ++ ++ The `equivalence_only' field means that this expression came from a ++ REG_EQUIV or REG_EQUAL note; it is not valid for substitution into an insn. ++ ++ The `related_value' field is used to connect related expressions ++ (that differ by adding an integer). ++ The related expressions are chained in a circular fashion. ++ `related_value' is zero for expressions for which this ++ chain is not useful. ++ ++ The `mode' field is usually the same as GET_MODE (`exp'), but ++ if `exp' is a CONST_INT and has no machine mode then the `mode' ++ field is the mode it was being used as. Each constant is ++ recorded separately for each mode it is used with. */ ++ ++ ++struct table_elt ++{ ++ rtx exp; ++ struct table_elt *next_same_hash; ++ struct table_elt *prev_same_hash; ++ struct table_elt *next_same_value; ++ struct table_elt *prev_same_value; ++ struct table_elt *first_same_value; ++ struct table_elt *related_value; ++ int cost; ++ enum machine_mode mode; ++ char in_memory; ++ char in_struct; ++ char equivalence_only; ++}; ++ ++#define HASH(x, m) (canon_hash (x, m) % NBUCKETS) ++/* We don't want a lot of buckets, because we rarely have very many ++ things stored in the hash table, and a lot of buckets slows ++ down a lot of loops that happen frequently. */ ++#define NBUCKETS 31 ++ ++static struct table_elt *table[NBUCKETS]; ++ ++/* Chain of `struct table_elt's made so far for this function ++ but currently removed from the table. */ ++ ++static struct table_elt *free_element_chain; ++ ++/* Number of `struct table_elt' structures made so far for this function. */ ++ ++static int n_elements_made; ++ ++/* Maximum value `n_elements_made' has had so far in this compilation ++ for functions previously processed. */ ++ ++static int max_elements_made; ++ ++/* Bits describing what kind of values in memory must be invalidated ++ for a particular instruction. If all three bits are zero, ++ no memory refs need to be invalidated. Each bit is more powerful ++ than the preceding ones, and if a bit is set then the preceding ++ bits are also set. ++ ++ Here is how the bits are set. ++ Writing at a fixed address invalidates only variable addresses, ++ writing in a structure element at variable address ++ invalidates all but scalar variables, ++ and writing in anything else at variable address invalidates everything. */ ++ ++struct write_data ++{ ++ int var : 1; /* Invalidate variable addresses. */ ++ int nonscalar : 1; /* Invalidate all but scalar variables. */ ++ int all : 1; /* Invalidate all memory refs. */ ++}; ++ ++/* Nonzero if X has the form (PLUS frame-pointer integer). */ ++ ++#define FIXED_BASE_PLUS_P(X) \ ++ (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \ ++ && (XEXP (X, 0) == frame_pointer_rtx || XEXP (X, 0) == arg_pointer_rtx)) ++ ++static struct table_elt *lookup (); ++static void free_element (); ++ ++static void remove_invalid_refs (); ++static int exp_equiv_p (); ++int refers_to_p (); ++int refers_to_mem_p (); ++static void invalidate_from_clobbers (); ++static int safe_hash (); ++static int canon_hash (); ++static rtx equiv_constant (); ++static int get_integer_term (); ++static rtx get_related_value (); ++static void note_mem_written (); ++static int cse_rtx_addr_varies_p (); ++static int fold_cc0 (); ++ ++/* Return an estimate of the cost of computing rtx X. ++ The only use of this is to compare the costs of two expressions ++ to decide whether to replace one with the other. */ ++ ++static int ++rtx_cost (x) ++ rtx x; ++{ ++ register int i, j; ++ register enum rtx_code code; ++ register char *fmt; ++ register int total; ++ ++ if (x == 0) ++ return 0; ++ ++ code = GET_CODE (x); ++ switch (code) ++ { ++ case REG: ++ return 1; ++ case SUBREG: ++ return 2; ++ CONST_COSTS (x, code); ++ } ++ ++ total = 2; ++ if (code == MEM) ++ total = 2 * GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD; ++ ++ /* Sum the costs of the sub-rtx's, plus 2 just put in. */ ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ if (fmt[i] == 'e') ++ total += rtx_cost (XEXP (x, i)); ++ else if (fmt[i] == 'E') ++ for (j = 0; j < XVECLEN (x, i); j++) ++ total += rtx_cost (XVECEXP (x, i, j)); ++ ++ return total; ++} ++ ++/* Clear the hash table and initialize each register with its own quantity, ++ for a new basic block. */ ++ ++static void ++new_basic_block () ++{ ++ register int i; ++ register int vecsize = max_reg * sizeof (rtx); ++ next_qty = max_reg; ++ ++ bzero (reg_rtx, vecsize); ++ bzero (reg_tick, vecsize); ++ ++ bcopy (all_minus_one, reg_in_table, vecsize); ++ bcopy (all_minus_one, reg_next_eqv, vecsize); ++ bcopy (all_minus_one, reg_prev_eqv, vecsize); ++ bcopy (consec_ints, reg_qty, vecsize); ++ ++ for (i = 0; i < max_qty; i++) ++ { ++ qty_first_reg[i] = i; ++ qty_last_reg[i] = i; ++ qty_const[i] = 0; ++ qty_const_insn[i] = 0; ++ } ++ ++ for (i = 0; i < NBUCKETS; i++) ++ { ++ register struct table_elt *this, *next; ++ for (this = table[i]; this; this = next) ++ { ++ next = this->next_same_hash; ++ free_element (this); ++ } ++ } ++ ++ bzero (table, sizeof table); ++ ++ prev_insn_cc0 = 0; ++ prev_insn_explicit_cc0 = 0; ++ prev_insn = 0; ++} ++ ++/* Say that register REG contains a quantity not in any register before. */ ++ ++static void ++make_new_qty (reg) ++ register int reg; ++{ ++ register int q; ++ ++ q = reg_qty[reg] = next_qty++; ++ qty_first_reg[q] = reg; ++ qty_last_reg[q] = reg; ++} ++ ++/* Make reg NEW equivalent to reg OLD. ++ OLD is not changing; NEW is. */ ++ ++static void ++make_regs_eqv (new, old) ++ register int new, old; ++{ ++ register int lastr, firstr; ++ register int q = reg_qty[old]; ++ ++ /* Nothing should become eqv until it has a "non-invalid" qty number. */ ++ if (q == old) ++ abort (); ++ ++ reg_qty[new] = q; ++ firstr = qty_first_reg[q]; ++ lastr = qty_last_reg[q]; ++ ++ /* Prefer pseudo regs to hard regs with the same value. ++ Among pseudos, if NEW will live longer than any other reg of the same qty, ++ and that is beyond the current basic block, ++ make it the new canonical replacement for this qty. */ ++ if (new >= FIRST_PSEUDO_REGISTER ++ && (firstr < FIRST_PSEUDO_REGISTER ++ || ((uid_cuid[regno_last_uid[new]] > cse_basic_block_end ++ || uid_cuid[regno_first_uid[new]] < cse_basic_block_start) ++ && (uid_cuid[regno_last_uid[new]] ++ > uid_cuid[regno_last_uid[firstr]])))) ++ { ++ reg_prev_eqv[firstr] = new; ++ reg_next_eqv[new] = firstr; ++ reg_prev_eqv[new] = -1; ++ qty_first_reg[q] = new; ++ } ++ else ++ { ++ /* If NEW is a hard reg, insert at end. ++ Otherwise, insert before any hard regs that are at the end. */ ++ while (lastr < FIRST_PSEUDO_REGISTER && new >= FIRST_PSEUDO_REGISTER) ++ lastr = reg_prev_eqv[lastr]; ++ reg_next_eqv[new] = reg_next_eqv[lastr]; ++ if (reg_next_eqv[lastr] >= 0) ++ reg_prev_eqv[reg_next_eqv[lastr]] = new; ++ else ++ qty_last_reg[q] = new; ++ reg_next_eqv[lastr] = new; ++ reg_prev_eqv[new] = lastr; ++ } ++} ++ ++/* Discard the records of what is in register REG. */ ++ ++static void ++reg_invalidate (reg) ++ register int reg; ++{ ++ register int n = reg_next_eqv[reg]; ++ register int p = reg_prev_eqv[reg]; ++ register int q = reg_qty[reg]; ++ ++ reg_tick[reg]++; ++ ++ if (q == reg) ++ { ++ /* Save time if already invalid */ ++ /* It shouldn't be linked to anything if it's invalid. */ ++ if (reg_prev_eqv[q] != -1) ++ abort (); ++ if (reg_next_eqv[q] != -1) ++ abort (); ++ return; ++ } ++ ++ if (n != -1) ++ reg_prev_eqv[n] = p; ++ else ++ qty_last_reg[q] = p; ++ if (p != -1) ++ reg_next_eqv[p] = n; ++ else ++ qty_first_reg[q] = n; ++ ++ reg_qty[reg] = reg; ++ qty_first_reg[reg] = reg; ++ qty_last_reg[reg] = reg; ++ reg_next_eqv[reg] = -1; ++ reg_prev_eqv[reg] = -1; ++} ++ ++/* Remove any invalid expressions from the hash table ++ that refer to any of the registers contained in expression X. ++ ++ Make sure that newly inserted references to those registers ++ as subexpressions will be considered valid. ++ ++ mention_regs is not called when a register itself ++ is being stored in the table. */ ++ ++static void ++mention_regs (x) ++ rtx x; ++{ ++ register enum rtx_code code; ++ register int i, j; ++ register char *fmt; ++ ++ if (x == 0) ++ return; ++ ++ code = GET_CODE (x); ++ if (code == REG) ++ { ++ register int regno = REGNO (x); ++ reg_rtx[regno] = x; ++ ++ if (reg_in_table[regno] >= 0 && reg_in_table[regno] != reg_tick[regno]) ++ remove_invalid_refs (regno); ++ ++ reg_in_table[regno] = reg_tick[regno]; ++ ++ return; ++ } ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ if (fmt[i] == 'e') ++ mention_regs (XEXP (x, i)); ++ else if (fmt[i] == 'E') ++ for (j = 0; j < XVECLEN (x, i); j++) ++ mention_regs (XVECEXP (x, i, j)); ++} ++ ++/* Update the register quantities for inserting X into the hash table ++ with a value equivalent to CLASSP. ++ (If CLASSP is not a REG or a SUBREG, it is irrelevant.) ++ If MODIFIED is nonzero, X is a destination; it is being modified. ++ Note that reg_invalidate should be called on a register ++ before insert_regs is done on that register with MODIFIED != 0. ++ ++ Nonzero value means that elements of reg_qty have changed ++ so X's hash code may be different. */ ++ ++static int ++insert_regs (x, classp, modified) ++ rtx x; ++ struct table_elt *classp; ++ int modified; ++{ ++ if (GET_CODE (x) == REG) ++ { ++ register int regno = REGNO (x); ++ reg_rtx[regno] = x; ++ if (modified || reg_qty[regno] == regno) ++ { ++ if (classp && GET_CODE (classp->exp) == REG) ++ { ++ make_regs_eqv (regno, REGNO (classp->exp)); ++ /* Make sure reg_rtx is set up even for regs ++ not explicitly set (such as function value). */ ++ reg_rtx[REGNO (classp->exp)] = classp->exp; ++ } ++ else ++ make_new_qty (regno); ++ return 1; ++ } ++ } ++ /* Copying a subreg into a subreg makes the regs equivalent, ++ but only if the entire regs' mode is within one word. ++ Copying one reg of a DImode into one reg of another DImode ++ does not make them equivalent. */ ++ else if (GET_CODE (x) == SUBREG ++ && GET_CODE (SUBREG_REG (x)) == REG ++ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) <= UNITS_PER_WORD ++ && (modified ++ || reg_qty[REGNO (SUBREG_REG (x))] == REGNO (SUBREG_REG (x)))) ++ { ++ if (classp && GET_CODE (classp->exp) == SUBREG ++ && GET_CODE (SUBREG_REG (classp->exp)) == REG ++ && GET_MODE (SUBREG_REG (classp->exp)) == GET_MODE (SUBREG_REG (x))) ++ { ++ int oregno = REGNO (SUBREG_REG (classp->exp)); ++ make_regs_eqv (REGNO (SUBREG_REG (x)), oregno); ++ /* Make sure reg_rtx is set up even for regs ++ not explicitly set (such as function value). */ ++ reg_rtx[oregno] = SUBREG_REG (classp->exp); ++ } ++ else ++ make_new_qty (REGNO (SUBREG_REG (x))); ++ return 1; ++ } ++ else ++ mention_regs (x); ++ return 0; ++} ++ ++/* Look in or update the hash table. */ ++ ++/* Put the element ELT on the list of free elements. */ ++ ++static void ++free_element (elt) ++ struct table_elt *elt; ++{ ++ elt->next_same_hash = free_element_chain; ++ free_element_chain = elt; ++} ++ ++/* Return an element that is free for use. */ ++ ++static struct table_elt * ++get_element () ++{ ++ struct table_elt *elt = free_element_chain; ++ if (elt) ++ { ++ free_element_chain = elt->next_same_hash; ++ return elt; ++ } ++ n_elements_made++; ++ return (struct table_elt *) oballoc (sizeof (struct table_elt)); ++} ++ ++/* Remove table element ELT from use in the table. ++ HASH is its hash code, made using the HASH macro. ++ It's an argument because often that is known in advance ++ and we save much time not recomputing it. */ ++ ++static void ++remove (elt, hash) ++ register struct table_elt *elt; ++ int hash; ++{ ++ if (elt == 0) ++ return; ++ ++ /* Mark this element as removed. See cse_insn. */ ++ elt->first_same_value = 0; ++ ++ /* Remove the table element from its equivalence class. */ ++ ++ { ++ register struct table_elt *prev = elt->prev_same_value; ++ register struct table_elt *next = elt->next_same_value; ++ ++ if (next) next->prev_same_value = prev; ++ ++ if (prev) ++ prev->next_same_value = next; ++ else ++ { ++ register struct table_elt *newfirst = next; ++ while (next) ++ { ++ next->first_same_value = newfirst; ++ next = next->next_same_value; ++ } ++ } ++ } ++ ++ /* Remove the table element from its hash bucket. */ ++ ++ { ++ register struct table_elt *prev = elt->prev_same_hash; ++ register struct table_elt *next = elt->next_same_hash; ++ ++ if (next) next->prev_same_hash = prev; ++ ++ if (prev) ++ prev->next_same_hash = next; ++ else ++ table[hash] = next; ++ } ++ ++ /* Remove the table element from its related-value circular chain. */ ++ ++ if (elt->related_value != 0 && elt->related_value != elt) ++ { ++ register struct table_elt *p = elt->related_value; ++ while (p->related_value != elt) ++ p = p->related_value; ++ p->related_value = elt->related_value; ++ if (p->related_value == p) ++ p->related_value = 0; ++ } ++ ++ free_element (elt); ++} ++ ++/* Look up X in the hash table and return its table element, ++ or 0 if X is not in the table. ++ ++ MODE is the machine-mode of X, or if X is an integer constant ++ with VOIDmode then MODE is the mode with which X will be used. ++ ++ Here we are satisfied to find an expression whose tree structure ++ looks like X. */ ++ ++static struct table_elt * ++lookup (x, hash, mode) ++ rtx x; ++ int hash; ++ enum machine_mode mode; ++{ ++ register struct table_elt *p; ++ ++ for (p = table[hash]; p; p = p->next_same_hash) ++ if (mode == p->mode && (x == p->exp || exp_equiv_p (x, p->exp, 1))) ++ return p; ++ ++ return 0; ++} ++ ++/* Like `lookup' but don't care whether the table element uses invalid regs. ++ Also ignore discrepancies in the machine mode of a register. */ ++ ++static struct table_elt * ++lookup_for_remove (x, hash, mode) ++ rtx x; ++ int hash; ++ enum machine_mode mode; ++{ ++ register struct table_elt *p; ++ ++ if (GET_CODE (x) == REG) ++ { ++ int regno = REGNO (x); ++ /* Don't check the machine mode when comparing registers; ++ invalidating (REG:SI 0) also invalidates (REG:DF 0). */ ++ for (p = table[hash]; p; p = p->next_same_hash) ++ if (GET_CODE (p->exp) == REG ++ && REGNO (p->exp) == regno) ++ return p; ++ } ++ else ++ { ++ for (p = table[hash]; p; p = p->next_same_hash) ++ if (mode == p->mode && (x == p->exp || exp_equiv_p (x, p->exp, 0))) ++ return p; ++ } ++ ++ return 0; ++} ++ ++/* Look for an expression equivalent to X and with code CODE. ++ If one is found, return that expression. */ ++ ++static rtx ++lookup_as_function (x, code) ++ rtx x; ++ enum rtx_code code; ++{ ++ register struct table_elt *p = lookup (x, safe_hash (x, 0) % NBUCKETS, ++ GET_MODE (x)); ++ if (p == 0) ++ return 0; ++ ++ for (p = p->first_same_value; p; p = p->next_same_value) ++ { ++ if (GET_CODE (p->exp) == code ++ /* Make sure this is a valid entry in the table. */ ++ && (exp_equiv_p (XEXP (p->exp, 0), XEXP (p->exp, 0), 1))) ++ return p->exp; ++ } ++ ++ return 0; ++} ++ ++/* Insert X in the hash table, assuming HASH is its hash code ++ and CLASSP is the current first element of the class it should go in ++ (or 0 if a new class should be made). ++ It is inserted at the proper position to keep the class in ++ the order cheapest first. ++ ++ MODE is the machine-mode of X, or if X is an integer constant ++ with VOIDmode then MODE is the mode with which X will be used. ++ ++ For elements of equal cheapness, the most recent one ++ goes in front, except that the first element in the list ++ remains first unless a cheaper element is added. ++ ++ The in_memory field in the hash table element is set to 0. ++ The caller must set it nonzero if appropriate. ++ ++ You should call insert_regs (X, CLASSP, MODIFY) before calling here, ++ and if insert_regs returns a nonzero value ++ you must then recompute its hash code before calling here. ++ ++ If necessary, update table showing constant values of quantities. */ ++ ++#define CHEAPER(X,Y) \ ++ (((X)->cost < (Y)->cost) || \ ++ ((X)->cost == (Y)->cost \ ++ && GET_CODE ((X)->exp) == REG && GET_CODE ((Y)->exp) == REG \ ++ && (uid_cuid[regno_last_uid[REGNO ((X)->exp)]] > cse_basic_block_end \ ++ || uid_cuid[regno_first_uid[REGNO ((X)->exp)]] < cse_basic_block_start) \ ++ && (uid_cuid[regno_last_uid[REGNO ((X)->exp)]] \ ++ > uid_cuid[regno_last_uid[REGNO ((Y)->exp)]]))) ++ ++static struct table_elt * ++insert (x, classp, hash, mode) ++ register rtx x; ++ register struct table_elt *classp; ++ int hash; ++ enum machine_mode mode; ++{ ++ register struct table_elt *elt; ++ ++ /* Put an element for X into the right hash bucket. */ ++ ++ elt = get_element (); ++ elt->exp = x; ++ elt->cost = rtx_cost (x) * 2; ++ /* Make pseudo regs a little cheaper than hard regs. */ ++ if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER) ++ elt->cost -= 1; ++ elt->next_same_value = 0; ++ elt->prev_same_value = 0; ++ elt->next_same_hash = table[hash]; ++ elt->prev_same_hash = 0; ++ elt->related_value = 0; ++ elt->in_memory = 0; ++ elt->equivalence_only = 0; ++ elt->mode = mode; ++ if (table[hash]) ++ table[hash]->prev_same_hash = elt; ++ table[hash] = elt; ++ ++ /* Put it into the proper value-class. */ ++ if (classp) ++ { ++ if (CHEAPER (elt, classp)) ++ /** Insert at the head of the class */ ++ { ++ register struct table_elt *p; ++ elt->next_same_value = classp; ++ classp->prev_same_value = elt; ++ elt->first_same_value = elt; ++ ++ for (p = classp; p; p = p->next_same_value) ++ p->first_same_value = elt; ++ } ++ else ++ { ++ /* Insert not at head of the class. */ ++ /* Put it after the last element cheaper than X. */ ++ register struct table_elt *p, *next; ++ for (p = classp; (next = p->next_same_value) && CHEAPER (next, elt); ++ p = next); ++ /* Put it after P and before NEXT. */ ++ elt->next_same_value = next; ++ if (next) ++ next->prev_same_value = elt; ++ elt->prev_same_value = p; ++ p->next_same_value = elt; ++ elt->first_same_value = classp; ++ } ++ } ++ else ++ elt->first_same_value = elt; ++ ++ if ((CONSTANT_P (x) || GET_CODE (x) == CONST_DOUBLE || FIXED_BASE_PLUS_P (x)) ++ && GET_CODE (elt->first_same_value->exp) == REG) ++ { ++ qty_const[reg_qty[REGNO (elt->first_same_value->exp)]] = x; ++ qty_const_insn[reg_qty[REGNO (elt->first_same_value->exp)]] = this_insn; ++ } ++ ++ if (GET_CODE (x) == REG) ++ { ++ if (elt->next_same_value != 0 ++ && (CONSTANT_P (elt->next_same_value->exp) ++ || GET_CODE (elt->next_same_value->exp) == CONST_DOUBLE ++ || FIXED_BASE_PLUS_P (elt->next_same_value->exp))) ++ { ++ qty_const[reg_qty[REGNO (x)]] = elt->next_same_value->exp; ++ qty_const_insn[reg_qty[REGNO (x)]] = this_insn; ++ } ++ if (CONSTANT_P (elt->first_same_value->exp) ++ || GET_CODE (elt->first_same_value->exp) == CONST_DOUBLE ++ || FIXED_BASE_PLUS_P (elt->first_same_value->exp)) ++ { ++ qty_const[reg_qty[REGNO (x)]] = elt->first_same_value->exp; ++ qty_const_insn[reg_qty[REGNO (x)]] = this_insn; ++ } ++ } ++ ++ /* If this is a constant with symbolic value, ++ and it has a term with an explicit integer value, ++ link it up with related expressions. */ ++ if (GET_CODE (x) == CONST) ++ { ++ rtx subexp = get_related_value (x); ++ int subhash; ++ struct table_elt *subelt, *subelt_prev; ++ ++ if (subexp != 0) ++ { ++ /* Get the integer-free subexpression in the hash table. */ ++ subhash = safe_hash (subexp, mode) % NBUCKETS; ++ subelt = lookup (subexp, subhash, mode); ++ if (subelt == 0) ++ subelt = insert (subexp, 0, subhash, mode); ++ /* Initialize SUBELT's circular chain if it has none. */ ++ if (subelt->related_value == 0) ++ subelt->related_value = subelt; ++ /* Find the element in the circular chain that precedes SUBELT. */ ++ subelt_prev = subelt; ++ while (subelt_prev->related_value != subelt) ++ subelt_prev = subelt_prev->related_value; ++ /* Put new ELT into SUBELT's circular chain just before SUBELT. ++ This way the element that follows SUBELT is the oldest one. */ ++ elt->related_value = subelt_prev->related_value; ++ subelt_prev->related_value = elt; ++ } ++ } ++ ++ return elt; ++} ++ ++/* Remove from the hash table, or mark as invalid, ++ all expressions whose values could be altered by storing in X. ++ X is a register, a subreg, or a memory reference with nonvarying address ++ (because, when a memory reference with a varying address is stored in, ++ all memory references are removed by invalidate_memory ++ so specific invalidation is superfluous). ++ ++ A nonvarying address may be just a register or just ++ a symbol reference, or it may be either of those plus ++ a numeric offset. */ ++ ++static void ++invalidate (x) ++ rtx x; ++{ ++ register int i; ++ register struct table_elt *p; ++ register rtx base; ++ register int start, end; ++ ++ /* If X is a register, dependencies on its contents ++ are recorded through the qty number mechanism. ++ Just change the qty number of the register, ++ mark it as invalid for expressions that refer to it, ++ and remove it itself. */ ++ ++ if (GET_CODE (x) == REG) ++ { ++ register int hash = HASH (x, 0); ++ reg_invalidate (REGNO (x)); ++ remove (lookup_for_remove (x, hash, GET_MODE (x)), hash); ++ return; ++ } ++ ++ if (GET_CODE (x) == SUBREG) ++ { ++ if (GET_CODE (SUBREG_REG (x)) != REG) ++ abort (); ++ invalidate (SUBREG_REG (x)); ++ return; ++ } ++ ++ /* X is not a register; it must be a memory reference with ++ a nonvarying address. Remove all hash table elements ++ that refer to overlapping pieces of memory. */ ++ ++ if (GET_CODE (x) != MEM) ++ abort (); ++ base = XEXP (x, 0); ++ start = 0; ++ ++ /* Registers with nonvarying addresses usually have constant equivalents; ++ but the frame pointer register is also possible. */ ++ if (GET_CODE (base) == REG ++ && qty_const[reg_qty[REGNO (base)]] != 0) ++ base = qty_const[reg_qty[REGNO (base)]]; ++ ++ if (GET_CODE (base) == CONST) ++ base = XEXP (base, 0); ++ if (GET_CODE (base) == PLUS ++ && GET_CODE (XEXP (base, 1)) == CONST_INT) ++ { ++ start = INTVAL (XEXP (base, 1)); ++ base = XEXP (base, 0); ++ } ++ ++ end = start + GET_MODE_SIZE (GET_MODE (x)); ++ for (i = 0; i < NBUCKETS; i++) ++ { ++ register struct table_elt *next; ++ for (p = table[i]; p; p = next) ++ { ++ next = p->next_same_hash; ++ if (refers_to_mem_p (p->exp, base, start, end)) ++ remove (p, i); ++ } ++ } ++} ++ ++/* Remove all expressions that refer to register REGNO, ++ since they are already invalid, and we are about to ++ mark that register valid again and don't want the old ++ expressions to reappear as valid. */ ++ ++static void ++remove_invalid_refs (regno) ++ int regno; ++{ ++ register int i; ++ register struct table_elt *p, *next; ++ register rtx x = reg_rtx[regno]; ++ ++ for (i = 0; i < NBUCKETS; i++) ++ for (p = table[i]; p; p = next) ++ { ++ next = p->next_same_hash; ++ if (GET_CODE (p->exp) != REG && refers_to_p (p->exp, x)) ++ remove (p, i); ++ } ++} ++ ++/* Remove from the hash table all expressions that reference memory, ++ or some of them as specified by *WRITES. */ ++ ++static void ++invalidate_memory (writes) ++ struct write_data *writes; ++{ ++ register int i; ++ register struct table_elt *p, *next; ++ int all = writes->all; ++ int nonscalar = writes->nonscalar; ++ ++ for (i = 0; i < NBUCKETS; i++) ++ for (p = table[i]; p; p = next) ++ { ++ next = p->next_same_hash; ++ if (p->in_memory ++ && (all ++ || (nonscalar && p->in_struct) ++ || cse_rtx_addr_varies_p (p->exp))) ++ remove (p, i); ++ } ++} ++ ++/* Return the value of the integer term in X, if one is apparent; ++ otherwise return 0. ++ We do not check extremely carefully for the presence of integer terms ++ but rather consider only the cases that `insert' notices ++ for the `related_value' field. */ ++ ++static int ++get_integer_term (x) ++ rtx x; ++{ ++ if (GET_CODE (x) == CONST) ++ x = XEXP (x, 0); ++ ++ if (GET_CODE (x) == MINUS ++ && GET_CODE (XEXP (x, 1)) == CONST_INT) ++ return - INTVAL (XEXP (x, 1)); ++ if (GET_CODE (x) != PLUS) ++ return 0; ++ if (GET_CODE (XEXP (x, 0)) == CONST_INT) ++ return INTVAL (XEXP (x, 0)); ++ if (GET_CODE (XEXP (x, 1)) == CONST_INT) ++ return INTVAL (XEXP (x, 1)); ++ return 0; ++} ++ ++static rtx ++get_related_value (x) ++ rtx x; ++{ ++ if (GET_CODE (x) != CONST) ++ return 0; ++ x = XEXP (x, 0); ++ if (GET_CODE (x) == PLUS) ++ { ++ if (GET_CODE (XEXP (x, 0)) == CONST_INT) ++ return XEXP (x, 1); ++ if (GET_CODE (XEXP (x, 1)) == CONST_INT) ++ return XEXP (x, 0); ++ } ++ else if (GET_CODE (x) == MINUS ++ && GET_CODE (XEXP (x, 1)) == CONST_INT) ++ return XEXP (x, 0); ++ return 0; ++} ++ ++/* Given an expression X of type CONST, ++ and ELT which is its table entry (or 0 if it ++ is not in the hash table), ++ return an alternate expression for X as a register plus integer. ++ If none can be found or it would not be a valid address, return 0. */ ++ ++static rtx ++use_related_value (x, elt) ++ rtx x; ++ struct table_elt *elt; ++{ ++ register struct table_elt *relt = 0; ++ register struct table_elt *p; ++ int offset; ++ rtx addr; ++ ++ /* First, is there anything related known? ++ If we have a table element, we can tell from that. ++ Otherwise, must look it up. */ ++ ++ if (elt != 0 && elt->related_value != 0) ++ relt = elt; ++ else if (elt == 0 && GET_CODE (x) == CONST) ++ { ++ rtx subexp = get_related_value (x); ++ if (subexp != 0) ++ relt = lookup (subexp, ++ safe_hash (subexp, GET_MODE (subexp)) % NBUCKETS, ++ GET_MODE (subexp)); ++ } ++ ++ if (relt == 0) ++ return 0; ++ ++ /* Search all related table entries for one that has an ++ equivalent register. */ ++ ++ p = relt; ++ while (1) ++ { ++ if (p->first_same_value != 0 ++ && GET_CODE (p->first_same_value->exp) == REG) ++ break; ++ p = p->related_value; ++ ++ /* We went all the way around, so there is nothing to be found. ++ Return failure. */ ++ if (p == relt) ++ return 0; ++ /* Perhaps RELT was in the table for some other reason and ++ it has no related values recorded. */ ++ if (p == 0) ++ return 0; ++ } ++ ++ /* Note: OFFSET may be 0 if P->xexp and X are related by commutativity. */ ++ offset = (get_integer_term (x) - get_integer_term (p->exp)); ++ addr = plus_constant (p->first_same_value->exp, offset); ++ if (memory_address_p (QImode, addr)) ++ return addr; ++ return 0; ++} ++ ++/* Hash an rtx. We are careful to make sure the value is never negative. ++ Equivalent registers hash identically. ++ MODE is used in hashing for CONST_INTs only; ++ otherwise the mode of X is used. ++ ++ Store 1 in do_not_record if any subexpression is volatile. ++ ++ Store 1 in hash_arg_in_memory if X contains a MEM rtx ++ which does not have the RTX_UNCHANGING_P bit set. ++ In this case, also store 1 in hash_arg_in_struct ++ if there is a MEM rtx which has the MEM_IN_STRUCT_P bit set. ++ ++ Note that cse_insn knows that the hash code of a MEM expression ++ is just (int) MEM plus the hash code of the address. */ ++ ++#define HASHBITS 16 ++ ++static int ++canon_hash (x, mode) ++ rtx x; ++ enum machine_mode mode; ++{ ++ register int i, j; ++ register int hash = 0; ++ register enum rtx_code code; ++ register char *fmt; ++ ++ /* repeat is used to turn tail-recursion into iteration. */ ++ repeat: ++ if (x == 0) ++ return hash; ++ ++ code = GET_CODE (x); ++ switch (code) ++ { ++ case REG: ++ { ++ /* We do not invalidate anything on pushing or popping ++ because they cannot change anything but the stack pointer; ++ but that means we must consider the stack pointer volatile ++ since it can be changed "mysteriously". */ ++ ++ register int regno = REGNO (x); ++ if (regno == STACK_POINTER_REGNUM ++ || (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])) ++ { ++ do_not_record = 1; ++ return 0; ++ } ++#ifdef SMALL_REGISTER_CLASSES ++ if (regno < FIRST_PSEUDO_REGISTER && regno != FRAME_POINTER_REGNUM ++ && regno != ARG_POINTER_REGNUM) ++ { ++ do_not_record = 1; ++ return 0; ++ } ++#endif ++ return hash + ((int) REG << 7) + reg_qty[regno]; ++ } ++ ++ case CONST_INT: ++ hash += ((int) mode + ((int) CONST_INT << 7) ++ + INTVAL (x) + (INTVAL (x) >> HASHBITS)); ++ return ((1 << HASHBITS) - 1) & hash; ++ ++ case CONST_DOUBLE: ++ /* This is like the general case, except that it only counts ++ the first two elements. */ ++ hash += (int) code + (int) GET_MODE (x); ++ { ++ int i; ++ for (i = 2; i < GET_RTX_LENGTH (CONST_DOUBLE); i++) ++ { ++ int tem = XINT (x, i); ++ hash += ((1 << HASHBITS) - 1) & (tem + (tem >> HASHBITS)); ++ } ++ } ++ return hash; ++ ++ /* Assume there is only one rtx object for any given label. */ ++ case LABEL_REF: ++ /* Use `and' to ensure a positive number. */ ++ return (hash + ((int) LABEL_REF << 7) ++ + ((int) XEXP (x, 0) & ((1 << HASHBITS) - 1))); ++ ++ case SYMBOL_REF: ++ return (hash + ((int) SYMBOL_REF << 7) ++ + ((int) XEXP (x, 0) & ((1 << HASHBITS) - 1))); ++ ++ case MEM: ++ if (MEM_VOLATILE_P (x)) ++ { ++ do_not_record = 1; ++ return 0; ++ } ++ if (! RTX_UNCHANGING_P (x)) ++ { ++ hash_arg_in_memory = 1; ++ if (MEM_IN_STRUCT_P (x)) hash_arg_in_struct = 1; ++ } ++ /* Now that we have already found this special case, ++ might as well speed it up as much as possible. */ ++ hash += (int) MEM; ++ x = XEXP (x, 0); ++ goto repeat; ++ ++ case PRE_DEC: ++ case PRE_INC: ++ case POST_DEC: ++ case POST_INC: ++ case PC: ++ case CC0: ++ case CALL: ++ do_not_record = 1; ++ return 0; ++ ++ case ASM_OPERANDS: ++ if (MEM_VOLATILE_P (x)) ++ { ++ do_not_record = 1; ++ return 0; ++ } ++ } ++ ++ i = GET_RTX_LENGTH (code) - 1; ++ hash += (int) code + (int) GET_MODE (x); ++ fmt = GET_RTX_FORMAT (code); ++ for (; i >= 0; i--) ++ { ++ if (fmt[i] == 'e') ++ { ++ /* If we are about to do the last recursive call ++ needed at this level, change it into iteration. ++ This function is called enough to be worth it. */ ++ if (i == 0) ++ { ++ x = XEXP (x, 0); ++ goto repeat; ++ } ++ hash += canon_hash (XEXP (x, i), 0); ++ } ++ else if (fmt[i] == 'E') ++ for (j = 0; j < XVECLEN (x, i); j++) ++ hash += canon_hash (XVECEXP (x, i, j), 0); ++ else if (fmt[i] == 's') ++ { ++ register char *p = XSTR (x, i); ++ if (p) ++ while (*p) ++ { ++ register int tem = *p++; ++ hash += ((1 << HASHBITS) - 1) & (tem + (tem >> HASHBITS)); ++ } ++ } ++ else ++ { ++ register int tem = XINT (x, i); ++ hash += ((1 << HASHBITS) - 1) & (tem + (tem >> HASHBITS)); ++ } ++ } ++ return hash; ++} ++ ++/* Like canon_hash but with no side effects. */ ++ ++static int ++safe_hash (x, mode) ++ rtx x; ++ enum machine_mode mode; ++{ ++ int save_do_not_record = do_not_record; ++ int save_hash_arg_in_memory = hash_arg_in_memory; ++ int save_hash_arg_in_struct = hash_arg_in_struct; ++ int hash = canon_hash (x, mode); ++ hash_arg_in_memory = save_hash_arg_in_memory; ++ hash_arg_in_struct = save_hash_arg_in_struct; ++ do_not_record = save_do_not_record; ++ return hash; ++} ++ ++/* Return 1 iff X and Y would canonicalize into the same thing, ++ without actually constructing the canonicalization of either one. ++ If VALIDATE is nonzero, ++ we assume X is an expression being processed from the rtl ++ and Y was found in the hash table. We check register refs ++ in Y for being marked as valid. */ ++ ++static int ++exp_equiv_p (x, y, validate) ++ rtx x, y; ++ int validate; ++{ ++ register int i; ++ register enum rtx_code code; ++ register char *fmt; ++ ++ /* Note: it is incorrect to assume an expression is equivalent to itself ++ if VALIDATE is nonzero. */ ++ if (x == y && !validate) ++ return 1; ++ if (x == 0 || y == 0) ++ return x == y; ++ code = GET_CODE (x); ++ if (code != GET_CODE (y)) ++ return 0; ++ ++ switch (code) ++ { ++ case PC: ++ case CC0: ++ return x == y; ++ ++ case CONST_INT: ++ return XINT (x, 0) == XINT (y, 0); ++ ++ case LABEL_REF: ++ case SYMBOL_REF: ++ return XEXP (x, 0) == XEXP (y, 0); ++ ++ case REG: ++ return (reg_qty[REGNO (x)] == reg_qty[REGNO (y)] ++ && (!validate ++ || reg_in_table[REGNO (y)] == reg_tick[REGNO (y)])); ++ } ++ ++ /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */ ++ ++ if (GET_MODE (x) != GET_MODE (y)) ++ return 0; ++ ++ /* Compare the elements. If any pair of corresponding elements ++ fail to match, return 0 for the whole things. */ ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ { ++ if (fmt[i] == 'e') ++ { ++ if (! exp_equiv_p (XEXP (x, i), XEXP (y, i), validate)) ++ return 0; ++ } ++ else if (fmt[i] == 'E') ++ { ++ int j; ++ if (XVECLEN (x, i) != XVECLEN (y, i)) ++ return 0; ++ for (j = 0; j < XVECLEN (x, i); j++) ++ if (! exp_equiv_p (XVECEXP (x, i, j), XVECEXP (y, i, j), validate)) ++ return 0; ++ } ++ else if (fmt[i] == 's') ++ { ++ if (strcmp (XSTR (x, i), XSTR (y, i))) ++ return 0; ++ } ++ else ++ { ++ if (XINT (x, i) != XINT (y, i)) ++ return 0; ++ } ++ } ++ return 1; ++} ++ ++/* Return 1 iff any subexpression of X matches Y. ++ Here we do not require that X or Y be valid (for registers referred to) ++ for being in the hash table. */ ++ ++int ++refers_to_p (x, y) ++ rtx x, y; ++{ ++ register int i; ++ register enum rtx_code code; ++ register char *fmt; ++ ++ repeat: ++ if (x == y) ++ return 1; ++ if (x == 0 || y == 0) ++ return 0; ++ ++ code = GET_CODE (x); ++ /* If X as a whole has the same code as Y, they may match. ++ If so, return 1. */ ++ if (code == GET_CODE (y)) ++ { ++ if (exp_equiv_p (x, y, 0)) ++ return 1; ++ } ++ ++ /* X does not match, so try its subexpressions. */ ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ if (fmt[i] == 'e') ++ { ++ if (i == 0) ++ { ++ x = XEXP (x, 0); ++ goto repeat; ++ } ++ else ++ if (refers_to_p (XEXP (x, i), y)) ++ return 1; ++ } ++ else if (fmt[i] == 'E') ++ { ++ int j; ++ for (j = 0; j < XVECLEN (x, i); j++) ++ if (refers_to_p (XVECEXP (x, i, j), y)) ++ return 1; ++ } ++ ++ return 0; ++} ++ ++/* Return 1 iff any subexpression of X refers to memory ++ at an address of REG plus some offset ++ such that any of the bytes' offsets fall between START (inclusive) ++ and END (exclusive). ++ ++ The value is undefined if X is a varying address. ++ This function is not used in such cases. ++ ++ When used in the cse pass, `qty_const' is nonzero, and it is used ++ to treat an address that is a register with a known constant value ++ as if it were that constant value. ++ In the loop pass, `qty_const' is zero, so this is not done. */ ++ ++int ++refers_to_mem_p (x, reg, start, end) ++ rtx x, reg; ++ int start, end; ++{ ++ register int i; ++ register enum rtx_code code; ++ register char *fmt; ++ ++ if (GET_CODE (reg) == CONST_INT) ++ { ++ start += INTVAL (reg); ++ end += INTVAL (reg); ++ reg = const0_rtx; ++ } ++ ++ repeat: ++ if (x == 0) ++ return 0; ++ ++ code = GET_CODE (x); ++ if (code == MEM) ++ { ++ register rtx addr = XEXP (x, 0); /* Get the address. */ ++ int myend; ++ if (GET_CODE (addr) == REG ++ /* qty_const is 0 when outside the cse pass; ++ at such times, this info is not available. */ ++ && qty_const != 0 ++ && qty_const[reg_qty[REGNO (addr)]] != 0) ++ addr = qty_const[reg_qty[REGNO (addr)]]; ++ if (GET_CODE (addr) == CONST) ++ addr = XEXP (addr, 0); ++ ++ /* If ADDR is BASE, or BASE plus an integer, put ++ the integer in I. */ ++ if (addr == reg) ++ i = 0; ++ else if (GET_CODE (addr) == PLUS ++ && XEXP (addr, 0) == reg ++ && GET_CODE (XEXP (addr, 1)) == CONST_INT) ++ i = INTVAL (XEXP (addr, 1)); ++ else if (GET_CODE (addr) == CONST_INT && reg == const0_rtx) ++ i = INTVAL (addr); ++ else ++ return 0; ++ ++ myend = i + GET_MODE_SIZE (GET_MODE (x)); ++ return myend > start && i < end; ++ } ++ ++ /* X does not match, so try its subexpressions. */ ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ if (fmt[i] == 'e') ++ { ++ if (i == 0) ++ { ++ x = XEXP (x, 0); ++ goto repeat; ++ } ++ else ++ if (refers_to_mem_p (XEXP (x, i), reg, start, end)) ++ return 1; ++ } ++ else if (fmt[i] == 'E') ++ { ++ int j; ++ for (j = 0; j < XVECLEN (x, i); j++) ++ if (refers_to_mem_p (XVECEXP (x, i, j), reg, start, end)) ++ return 1; ++ } ++ ++ return 0; ++} ++ ++/* Nonzero if X refers to memory at a varying address; ++ except that a register which has at the moment a known constant value ++ isn't considered variable. */ ++ ++static int ++cse_rtx_addr_varies_p (x) ++ rtx x; ++{ ++ if (GET_CODE (x) == MEM ++ && GET_CODE (XEXP (x, 0)) == REG ++ && qty_const[reg_qty[REGNO (XEXP (x, 0))]] != 0) ++ return 0; ++ return rtx_addr_varies_p (x); ++} ++ ++/* Canonicalize an expression: ++ replace each register reference inside it ++ with the "oldest" equivalent register. */ ++ ++static rtx ++canon_reg (x) ++ rtx x; ++{ ++ register int i; ++ register enum rtx_code code; ++ register char *fmt; ++ ++ if (x == 0) ++ return x; ++ ++ code = GET_CODE (x); ++ switch (code) ++ { ++ case PC: ++ case CC0: ++ case CONST: ++ case CONST_INT: ++ case CONST_DOUBLE: ++ case SYMBOL_REF: ++ case LABEL_REF: ++ case ADDR_VEC: ++ case ADDR_DIFF_VEC: ++ return x; ++ ++ case REG: ++ { ++ register rtx new; ++ /* Never replace a hard reg, because hard regs can appear ++ in more than one machine mode, and we must preserve the mode ++ of each occurrence. Also, some hard regs appear in ++ MEMs that are shared and mustn't be altered. */ ++ if (REGNO (x) < FIRST_PSEUDO_REGISTER) ++ return x; ++ new = reg_rtx[qty_first_reg[reg_qty[REGNO (x)]]]; ++ return new ? new : x; ++ } ++ } ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ { ++ register int j; ++ ++ if (fmt[i] == 'e') ++ XEXP (x, i) = canon_reg (XEXP (x, i)); ++ else if (fmt[i] == 'E') ++ for (j = 0; j < XVECLEN (x, i); j++) ++ XVECEXP (x, i, j) = canon_reg (XVECEXP (x, i, j)); ++ } ++ ++ return x; ++} ++ ++/* If X is a nontrivial arithmetic operation on an argument ++ for which a constant value can be determined, return ++ the result of operating on that value, as a constant. ++ Otherwise, return X, possibly with one or more operands ++ modified by recursive calls to this function. ++ ++ If X is a register whose contents are known, we do NOT ++ return those contents. This is because an instruction that ++ uses a register is usually faster than one that uses a constant. ++ ++ COPYFLAG is nonzero for memory addresses and subexpressions thereof. ++ If COPYFLAG is nonzero, we avoid altering X itself ++ by creating new structure when necessary. In this case we ++ can risk creating invalid structure because it will be tested. ++ If COPYFLAG is zero, be careful not to substitute constants ++ into expressions that cannot be simplified. */ ++ ++static rtx ++fold_rtx (x, copyflag) ++ rtx x; ++ int copyflag; ++{ ++ register enum rtx_code code; ++ register char *fmt; ++ register int i, val; ++ rtx new = 0; ++ int copied = ! copyflag; ++ int width; ++ ++ /* Constant equivalents of first three operands of X; ++ 0 when no such equivalent is known. */ ++ rtx const_arg0; ++ rtx const_arg1; ++ rtx const_arg2; ++ ++ if (x == 0) ++ return x; ++ ++ width = GET_MODE_BITSIZE (GET_MODE (x)); ++ ++ code = GET_CODE (x); ++ switch (code) ++ { ++ case CONST: ++ case CONST_INT: ++ case CONST_DOUBLE: ++ case SYMBOL_REF: ++ case LABEL_REF: ++ case PC: ++ case CC0: ++ case REG: ++ /* No use simplifying an EXPR_LIST ++ since they are used only for lists of args ++ in a function call's REG_EQUAL note. */ ++ case EXPR_LIST: ++ return x; ++ ++ /* We must be careful when folding a memory address ++ to avoid making it invalid. So fold nondestructively ++ and use the result only if it's valid. */ ++ case MEM: ++ { ++ rtx newaddr = fold_rtx (XEXP (x, 0), 1); ++ /* Save time if no change was made. */ ++ if (XEXP (x, 0) == newaddr) ++ return x; ++ ++ if (! memory_address_p (GET_MODE (x), newaddr) ++ && memory_address_p (GET_MODE (x), XEXP (x, 0))) ++ return x; ++ ++ /* Don't replace a value with a more expensive one. */ ++ if (rtx_cost (XEXP (x, 0)) < rtx_cost (newaddr)) ++ return x; ++ ++ if (copyflag) ++ return gen_rtx (MEM, GET_MODE (x), newaddr); ++ XEXP (x, 0) = newaddr; ++ return x; ++ } ++ } ++ ++ const_arg0 = 0; ++ const_arg1 = 0; ++ const_arg2 = 0; ++ ++ /* Try folding our operands. ++ Then see which ones have constant values known. */ ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ if (fmt[i] == 'e') ++ { ++ register rtx tem = fold_rtx (XEXP (x, i), copyflag); ++ ++ /* If an operand has changed under folding, and we are not supposed to ++ alter the original structure, copy X if we haven't yet done so. */ ++ if (! copied && tem != XEXP (x, i)) ++ { ++ int j; ++ rtx new = rtx_alloc (code); ++ PUT_MODE (new, GET_MODE (x)); ++ for (j = 0; j < GET_RTX_LENGTH (code); j++) ++ XINT (new, j) = XINT (x, j); ++ x = new; ++ copied = 1; ++ } ++ ++ /* Install the possibly altered folded operand. */ ++ XEXP (x, i) = tem; ++ ++ /* For the first three operands, see if the operand ++ is constant or equivalent to a constant. */ ++ if (i < 3) ++ { ++ rtx const_arg = equiv_constant (tem); ++ ++ switch (i) ++ { ++ case 0: ++ const_arg0 = const_arg; ++ break; ++ case 1: ++ const_arg1 = const_arg; ++ break; ++ case 2: ++ const_arg2 = const_arg; ++ break; ++ } ++ } ++ } ++ else if (fmt[i] == 'E') ++ /* Don't try to fold inside of a vector of expressions. ++ Doing nothing is is harmless. */ ++ ; ++ ++ /* If a commutative operation, place a constant integer as the second ++ operand unless the first operand is also a constant integer. Otherwise, ++ place any constant second unless the first operand is also a constant. */ ++ ++ switch (code) ++ { ++ case PLUS: ++ case MULT: ++ case UMULT: ++ case AND: ++ case IOR: ++ case XOR: ++ case NE: ++ case EQ: ++ if (const_arg0 && const_arg0 == XEXP (x, 0) ++ && (! (const_arg1 && const_arg1 == XEXP (x, 1)) ++ || (GET_CODE (const_arg0) == CONST_INT ++ && GET_CODE (const_arg1) != CONST_INT))) ++ { ++ register rtx tem; ++ ++ if (! copied) ++ copied = 1, x = copy_rtx (x); ++ tem = XEXP (x, 0); XEXP (x, 0) = XEXP (x, 1); XEXP (x, 1) = tem; ++ tem = const_arg0; const_arg0 = const_arg1; const_arg1 = tem; ++ } ++ break; ++ } ++ ++ /* Now decode the kind of rtx X is ++ and then return X (if nothing can be done) ++ or return a folded rtx ++ or store a value in VAL and drop through ++ (to return a CONST_INT for the integer VAL). */ ++ ++ if (GET_RTX_LENGTH (code) == 1) ++ { ++ if (const_arg0 == 0) ++ return x; ++ ++ if (GET_CODE (const_arg0) == CONST_INT) ++ { ++ register int arg0 = INTVAL (const_arg0); ++ ++ switch (GET_CODE (x)) ++ { ++ case NOT: ++ val = ~ arg0; ++ break; ++ ++ case NEG: ++ val = - arg0; ++ break; ++ ++ case TRUNCATE: ++ val = arg0; ++ break; ++ ++ case ZERO_EXTEND: ++ { ++ enum machine_mode mode = GET_MODE (XEXP (x, 0)); ++ if (mode == VOIDmode) ++ return x; ++ if (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_INT) ++ val = arg0 & ~((-1) << GET_MODE_BITSIZE (mode)); ++ else ++ return x; ++ break; ++ } ++ ++ case SIGN_EXTEND: ++ { ++ enum machine_mode mode = GET_MODE (XEXP (x, 0)); ++ if (mode == VOIDmode) ++ return x; ++ if (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_INT) ++ { ++ val = arg0 & ~((-1) << GET_MODE_BITSIZE (mode)); ++ if (val & (1 << (GET_MODE_BITSIZE (mode) - 1))) ++ val -= 1 << GET_MODE_BITSIZE (mode); ++ } ++ else ++ return x; ++ break; ++ } ++ ++ default: ++ return x; ++ } ++ } ++#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ else if (GET_CODE (const_arg0) == CONST_DOUBLE ++ && GET_CODE (x) == NEG ++ && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT) ++ { ++ union real_extract u; ++ register REAL_VALUE_TYPE arg0; ++ jmp_buf handler; ++ ++ if (setjmp (handler)) ++ { ++ warning ("floating point trap in constant folding"); ++ return x; ++ } ++ set_float_handler (handler); ++ bcopy (&CONST_DOUBLE_LOW (const_arg0), &u, sizeof u); ++ arg0 = u.d; ++ ++ u.d = REAL_VALUE_NEGATE (arg0); ++ x = immed_real_const_1 (u.d, GET_MODE (x)); ++ set_float_handler (0); ++ return x; ++ } ++#endif ++ else ++ return x; ++ } ++ else if (GET_RTX_LENGTH (code) == 2) ++ { ++ register int arg0, arg1, arg0s, arg1s; ++ int arithwidth = width; ++ ++ /* If 1st arg is the condition codes, 2nd must be zero ++ and this must be a comparison. ++ Decode the info on how the previous insn set the cc0 ++ and use that to deduce result of comparison. */ ++ if (XEXP (x, 0) == cc0_rtx ++ || GET_CODE (XEXP (x, 0)) == COMPARE) ++ { ++ if (XEXP (x, 0) == cc0_rtx) ++ arg0 = prev_insn_cc0; ++ else ++ arg0 = fold_cc0 (VOIDmode, XEXP (x, 0)); ++ ++ if (arg0 == 0 ++ || const_arg1 != const0_rtx ++ /* 0200 bit in arg0 means only zeroness is known, ++ and sign is not known. */ ++ || ((arg0 & 0200) != 0 && code != EQ && code != NE)) ++ return x; ++ ++ /* Extract either the signed or the unsigned digit from ARG0. */ ++ if (code == LEU || code == LTU || code == GEU || code == GTU) ++ arg0 = arg0 & 7; ++ else ++ arg0 = (arg0 >> 3) & 7; ++ if (arg0 == 7) arg0 = -1; ++ ++ switch (code) ++ { ++ case LE: ++ case LEU: ++ return (arg0 <= 0) ? const1_rtx : const0_rtx; ++ case LT: ++ case LTU: ++ return (arg0 < 0) ? const1_rtx : const0_rtx; ++ case GE: ++ case GEU: ++ return (arg0 >= 0) ? const1_rtx : const0_rtx; ++ case GT: ++ case GTU: ++ return (arg0 > 0) ? const1_rtx : const0_rtx; ++ case NE: ++ return (arg0 != 0) ? const1_rtx : const0_rtx; ++ case EQ: ++ return (arg0 == 0) ? const1_rtx : const0_rtx; ++ default: ++ abort (); ++ } ++ } ++ ++ if (const_arg0 == 0 || const_arg1 == 0 ++ || GET_CODE (const_arg0) != CONST_INT ++ || GET_CODE (const_arg1) != CONST_INT) ++ { ++ /* Even if we can't compute a constant result, ++ there are some cases worth simplifying. */ ++ /* Note that we cannot rely on constant args to come last, ++ even for commutative operators, ++ because that happens only when the constant is explicit. */ ++ switch (code) ++ { ++ case PLUS: ++ if (const_arg0 == const0_rtx ++ || const_arg0 == fconst0_rtx ++ || const_arg0 == dconst0_rtx) ++ return XEXP (x, 1); ++ if (const_arg1 == const0_rtx ++ || const_arg1 == fconst0_rtx ++ || const_arg1 == dconst0_rtx) ++ return XEXP (x, 0); ++ ++ /* Handle both-operands-constant cases. */ ++ if (const_arg0 != 0 && const_arg1 != 0 ++ && GET_CODE (const_arg0) != CONST_DOUBLE ++ && GET_CODE (const_arg1) != CONST_DOUBLE ++ && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT) ++ { ++ if (GET_CODE (const_arg1) == CONST_INT) ++ new = plus_constant (const_arg0, INTVAL (const_arg1)); ++#if 0 /* Don't combine two constants if neither is an explicit integer. ++ Assemblers can't handle the sum of two symbols. */ ++ else ++ { ++ new = gen_rtx (PLUS, GET_MODE (x), const0_rtx, const0_rtx); ++ XEXP (new, 0) = const_arg0; ++ if (GET_CODE (const_arg0) == CONST) ++ XEXP (new, 0) = XEXP (const_arg0, 0); ++ XEXP (new, 1) = const_arg1; ++ if (GET_CODE (const_arg1) == CONST) ++ XEXP (new, 1) = XEXP (const_arg1, 0); ++ new = gen_rtx (CONST, GET_MODE (new), new); ++ } ++#endif /* 0 */ ++ } ++ else if (const_arg1 != 0 ++ && GET_CODE (const_arg1) == CONST_INT ++ && GET_CODE (XEXP (x, 0)) == PLUS ++ && (CONSTANT_P (XEXP (XEXP (x, 0), 0)) ++ || CONSTANT_P (XEXP (XEXP (x, 0), 1)))) ++ /* constant + (variable + constant) ++ can result if an index register is made constant. ++ We simplify this by adding the constants. ++ If we did not, it would become an invalid address. */ ++ new = plus_constant (XEXP (x, 0), ++ INTVAL (const_arg1)); ++ break; ++ ++ case COMPARE: ++ if (const_arg1 == const0_rtx) ++ return XEXP (x, 0); ++ ++ if (XEXP (x, 0) == XEXP (x, 1) ++ || (const_arg0 != 0 && const_arg0 == const_arg1)) ++ { ++ /* We can't assume x-x is 0 with IEEE floating point. */ ++ if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT) ++ return const0_rtx; ++ } ++ break; ++ ++ case MINUS: ++ if (const_arg1 == const0_rtx ++ || const_arg1 == fconst0_rtx ++ || const_arg1 == dconst0_rtx) ++ return XEXP (x, 0); ++ ++ if (XEXP (x, 0) == XEXP (x, 1) ++ || (const_arg0 != 0 && const_arg0 == const_arg1)) ++ { ++ /* We can't assume x-x is 0 with IEEE floating point. */ ++ if (GET_MODE_CLASS (GET_MODE (x)) == MODE_INT) ++ return const0_rtx; ++ } ++ ++ /* Change subtraction from zero into negation. */ ++ if (const_arg0 == const0_rtx) ++ return gen_rtx (NEG, GET_MODE (x), XEXP (x, 1)); ++ ++ /* Don't let a relocatable value get a negative coeff. */ ++ if (const_arg0 != 0 && const_arg1 != 0 ++ && GET_CODE (const_arg1) == CONST_INT) ++ new = plus_constant (const_arg0, - INTVAL (const_arg1)); ++ break; ++ ++ case MULT: ++ case UMULT: ++ if (const_arg1 && GET_CODE (const_arg1) == CONST_INT ++ && INTVAL (const_arg1) == -1 ++ /* Don't do this in the case of widening multiplication. */ ++ && GET_MODE (XEXP (x, 0)) == GET_MODE (x)) ++ return gen_rtx (NEG, GET_MODE (x), XEXP (x, 0)); ++ if (const_arg0 && GET_CODE (const_arg0) == CONST_INT ++ && INTVAL (const_arg0) == -1 ++ && GET_MODE (XEXP (x, 1)) == GET_MODE (x)) ++ return gen_rtx (NEG, GET_MODE (x), XEXP (x, 1)); ++ if (const_arg1 == const0_rtx || const_arg0 == const0_rtx) ++ new = const0_rtx; ++ if (const_arg1 == fconst0_rtx || const_arg0 == fconst0_rtx) ++ new = fconst0_rtx; ++ if (const_arg1 == dconst0_rtx || const_arg0 == dconst0_rtx) ++ new = dconst0_rtx; ++ if (const_arg1 == const1_rtx) ++ return XEXP (x, 0); ++ if (const_arg0 == const1_rtx) ++ return XEXP (x, 1); ++ break; ++ ++ case IOR: ++ if (const_arg1 == const0_rtx) ++ return XEXP (x, 0); ++ if (const_arg0 == const0_rtx) ++ return XEXP (x, 1); ++ if (const_arg1 && GET_CODE (const_arg1) == CONST_INT ++ && (INTVAL (const_arg1) & GET_MODE_MASK (GET_MODE (x))) ++ == GET_MODE_MASK (GET_MODE (x))) ++ new = const_arg1; ++ if (const_arg0 && GET_CODE (const_arg0) == CONST_INT ++ && (INTVAL (const_arg0) & GET_MODE_MASK (GET_MODE (x))) ++ == GET_MODE_MASK (GET_MODE (x))) ++ new = const_arg0; ++ break; ++ ++ case XOR: ++ if (const_arg1 == const0_rtx) ++ return XEXP (x, 0); ++ if (const_arg0 == const0_rtx) ++ return XEXP (x, 1); ++ if (const_arg1 && GET_CODE (const_arg1) == CONST_INT ++ && (INTVAL (const_arg1) & GET_MODE_MASK (GET_MODE (x))) ++ == GET_MODE_MASK (GET_MODE (x))) ++ return gen_rtx (NOT, GET_MODE (x), XEXP (x, 0)); ++ if (const_arg0 && GET_CODE (const_arg0) == CONST_INT ++ && (INTVAL (const_arg0) & GET_MODE_MASK (GET_MODE (x))) ++ == GET_MODE_MASK (GET_MODE (x))) ++ return gen_rtx (NOT, GET_MODE (x), XEXP (x, 1)); ++ break; ++ ++ case AND: ++ if (const_arg1 == const0_rtx || const_arg0 == const0_rtx) ++ new = const0_rtx; ++ if (const_arg1 && GET_CODE (const_arg1) == CONST_INT ++ && (INTVAL (const_arg1) & GET_MODE_MASK (GET_MODE (x))) ++ == GET_MODE_MASK (GET_MODE (x))) ++ return XEXP (x, 0); ++ if (const_arg0 && GET_CODE (const_arg0) == CONST_INT ++ && (INTVAL (const_arg0) & GET_MODE_MASK (GET_MODE (x))) ++ == GET_MODE_MASK (GET_MODE (x))) ++ return XEXP (x, 1); ++ break; ++ ++ case DIV: ++ case UDIV: ++ if (const_arg1 == const1_rtx) ++ return XEXP (x, 0); ++ if (const_arg0 == const0_rtx) ++ new = const0_rtx; ++ break; ++ ++ case UMOD: ++ case MOD: ++ if (const_arg0 == const0_rtx || const_arg1 == const1_rtx) ++ new = const0_rtx; ++ break; ++ ++ case LSHIFT: ++ case ASHIFT: ++ case ROTATE: ++ case ASHIFTRT: ++ case LSHIFTRT: ++ case ROTATERT: ++ if (const_arg1 == const0_rtx) ++ return XEXP (x, 0); ++ if (const_arg0 == const0_rtx) ++ new = const_arg0; ++ break; ++ } ++ ++ if (new != 0 && LEGITIMATE_CONSTANT_P (new)) ++ return new; ++ return x; ++ } ++ ++ if (arithwidth == 0) ++ { ++ if (GET_MODE (XEXP (x, 0)) != VOIDmode) ++ arithwidth = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))); ++ if (GET_MODE (XEXP (x, 1)) != VOIDmode) ++ arithwidth = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 1))); ++ } ++ ++ /* Get the integer argument values in two forms: ++ zero-extended in ARG0, ARG1 and sign-extended in ARG0S, ARG1S. */ ++ ++ arg0 = INTVAL (const_arg0); ++ arg1 = INTVAL (const_arg1); ++ ++ if (arithwidth < HOST_BITS_PER_INT && arithwidth > 0) ++ { ++ arg0 &= (1 << arithwidth) - 1; ++ arg1 &= (1 << arithwidth) - 1; ++ ++ arg0s = arg0; ++ if (arg0s & (1 << (arithwidth - 1))) ++ arg0s |= ((-1) << arithwidth); ++ ++ arg1s = arg1; ++ if (arg1s & (1 << (arithwidth - 1))) ++ arg1s |= ((-1) << arithwidth); ++ } ++ else ++ { ++ arg0s = arg0; ++ arg1s = arg1; ++ } ++ ++ /* Compute the value of the arithmetic. */ ++ ++ switch (code) ++ { ++ case PLUS: ++ val = arg0 + arg1; ++ break; ++ ++ case MINUS: ++ val = arg0 - arg1; ++ break; ++ ++ case MULT: ++ val = arg0s * arg1s; ++ break; ++ ++ case DIV: ++ if (arg1s == 0) ++ return x; ++ val = arg0s / arg1s; ++ break; ++ ++ case MOD: ++ if (arg1s == 0) ++ return x; ++ val = arg0s % arg1s; ++ break; ++ ++ case UMULT: ++ val = (unsigned) arg0 * arg1; ++ break; ++ ++ case UDIV: ++ if (arg1 == 0) ++ return x; ++ val = (unsigned) arg0 / arg1; ++ break; ++ ++ case UMOD: ++ if (arg1 == 0) ++ return x; ++ val = (unsigned) arg0 % arg1; ++ break; ++ ++ case AND: ++ val = arg0 & arg1; ++ break; ++ ++ case IOR: ++ val = arg0 | arg1; ++ break; ++ ++ case XOR: ++ val = arg0 ^ arg1; ++ break; ++ ++ case NE: ++ val = arg0 != arg1; ++ break; ++ ++ case EQ: ++ val = arg0 == arg1; ++ break; ++ ++ case LE: ++ val = arg0s <= arg1s; ++ break; ++ ++ case LT: ++ val = arg0s < arg1s; ++ break; ++ ++ case GE: ++ val = arg0s >= arg1s; ++ break; ++ ++ case GT: ++ val = arg0s > arg1s; ++ break; ++ ++ case LEU: ++ val = ((unsigned) arg0) <= ((unsigned) arg1); ++ break; ++ ++ case LTU: ++ val = ((unsigned) arg0) < ((unsigned) arg1); ++ break; ++ ++ case GEU: ++ val = ((unsigned) arg0) >= ((unsigned) arg1); ++ break; ++ ++ case GTU: ++ val = ((unsigned) arg0) > ((unsigned) arg1); ++ break; ++ ++ case LSHIFT: ++ /* If target machine uses negative shift counts ++ but host machine does not, simulate them. */ ++ if (arg1 < 0) ++ val = ((unsigned) arg0) >> -arg1; ++ else ++ val = ((unsigned) arg0) << arg1; ++ break; ++ ++ case ASHIFT: ++ if (arg1 < 0) ++ val = arg0s >> -arg1; ++ else ++ val = arg0s << arg1; ++ break; ++ ++ case ROTATERT: ++ arg1 = - arg1; ++ case ROTATE: ++ { ++ int size = GET_MODE_SIZE (GET_MODE (x)) * BITS_PER_UNIT; ++ if (arg1 > 0) ++ { ++ arg1 %= size; ++ val = ((((unsigned) arg0) << arg1) ++ | (((unsigned) arg0) >> (size - arg1))); ++ } ++ else if (arg1 < 0) ++ { ++ arg1 = (- arg1) % size; ++ val = ((((unsigned) arg0) >> arg1) ++ | (((unsigned) arg0) << (size - arg1))); ++ } ++ else ++ val = arg0; ++ } ++ break; ++ ++ case LSHIFTRT: ++ /* If target machine uses negative shift counts ++ but host machine does not, simulate them. */ ++ if (arg1 < 0) ++ val = ((unsigned) arg0) << -arg1; ++ else ++ val = ((unsigned) arg0) >> arg1; ++ break; ++ ++ case ASHIFTRT: ++ if (arg1 < 0) ++ val = arg0s << -arg1; ++ else ++ val = arg0s >> arg1; ++ break; ++ ++ default: ++ return x; ++ } ++ } ++ else if (code == IF_THEN_ELSE && const_arg0 != 0 ++ && GET_CODE (const_arg0) == CONST_INT) ++ return XEXP (x, ((INTVAL (const_arg0) != 0) ? 1 : 2)); ++ else if (code == IF_THEN_ELSE && XEXP (x, 0) == cc0_rtx ++ && prev_insn_explicit_cc0 != 0) ++ return XEXP (x, ((INTVAL (prev_insn_explicit_cc0) != 0) ? 1 : 2)); ++ else if (code == SIGN_EXTRACT || code == ZERO_EXTRACT) ++ { ++ if (const_arg0 != 0 && const_arg1 != 0 && const_arg2 != 0 ++ && GET_CODE (const_arg0) == CONST_INT ++ && GET_CODE (const_arg1) == CONST_INT ++ && GET_CODE (const_arg2) == CONST_INT) ++ { ++ /* Extracting a bit-field from a constant */ ++ val = INTVAL (const_arg0); ++#ifdef BITS_BIG_ENDIAN ++ val >>= (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) ++ - INTVAL (const_arg2) - INTVAL (const_arg1)); ++#else ++ val >>= INTVAL (const_arg2); ++#endif ++ if (HOST_BITS_PER_INT != INTVAL (const_arg1)) ++ { ++ /* First zero-extend. */ ++ val &= (1 << INTVAL (const_arg1)) - 1; ++ /* If desired, propagate sign bit. */ ++ if (code == SIGN_EXTRACT ++ && (val & (1 << (INTVAL (const_arg1) - 1)))) ++ val |= ~ (1 << INTVAL (const_arg1)); ++ } ++ } ++ else ++ return x; ++ } ++ else ++ return x; ++ ++ /* Clear the bits that don't belong in our mode, ++ unless they and our sign bit are all one. ++ So we get either a reasonable negative value or a reasonable ++ unsigned value for this mode. */ ++ if (width < HOST_BITS_PER_INT && width > 0) ++ { ++ if ((val & ((-1) << (width - 1))) ++ != ((-1) << (width - 1))) ++ val &= (1 << width) - 1; ++ } ++ ++ /* Now make the new constant. */ ++ { ++ rtx new = gen_rtx (CONST_INT, VOIDmode, val); ++ return LEGITIMATE_CONSTANT_P (new) ? new : x; ++ } ++} ++ ++/* Return a constant value currently equivalent to X. ++ Return 0 if we don't know one. */ ++ ++static rtx ++equiv_constant (x) ++ rtx x; ++{ ++ rtx tem1; ++ ++ if (CONSTANT_P (x) || GET_CODE (x) == CONST_DOUBLE) ++ return x; ++ else if (GET_CODE (x) == REG ++ && (tem1 = qty_const[reg_qty[REGNO (x)]]) != 0 ++ /* Make sure it is really a constant */ ++ && GET_CODE (tem1) != REG && GET_CODE (tem1) != PLUS) ++ return tem1; ++ /* If integer truncation is being done with SUBREG, ++ we can compute the result. */ ++ else if (GET_CODE (x) == SUBREG && SUBREG_WORD (x) == 0 ++ && (tem1 = qty_const[reg_qty[REGNO (SUBREG_REG (x))]]) != 0 ++ /* Make sure it is a known integer. */ ++ && GET_CODE (tem1) == CONST_INT ++ && GET_MODE_SIZE (GET_MODE (x)) <= HOST_BITS_PER_INT ++ /* Make sure this SUBREG is truncation. */ ++ && GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) ++ { ++ int value = INTVAL (tem1); ++ if (GET_MODE_BITSIZE (GET_MODE (x)) != HOST_BITS_PER_INT) ++ value &= (1 << GET_MODE_BITSIZE (GET_MODE (x))) - 1; ++ ++ if (value == INTVAL (tem1)) ++ return tem1; ++ else ++ return gen_rtx (CONST_INT, VOIDmode, value); ++ } ++ return 0; ++} ++ ++/* Given an expression X which is used to set CC0, ++ return an integer recording (in the encoding used for prev_insn_cc0) ++ how the condition codes would be set by that expression. ++ Return 0 if the value is not constant ++ or if there is any doubt what condition codes result from it. ++ ++ MODE is the machine mode to use to interpret X if it is a CONST_INT. */ ++ ++static int ++fold_cc0 (mode, x) ++ enum machine_mode mode; ++ rtx x; ++{ ++ if (GET_CODE (x) == COMPARE) ++ { ++ rtx y0 = fold_rtx (XEXP (x, 0), 0); ++ rtx y1 = fold_rtx (XEXP (x, 1), 0); ++ int u0, u1, s0, s1; ++ enum machine_mode m; ++ rtx tem; ++ ++ m = GET_MODE (y0); ++ if (m == VOIDmode) ++ m = GET_MODE (y1); ++ if (m == VOIDmode) ++ return 0; ++ ++ tem = equiv_constant (y0); ++ if (tem != 0) ++ y0 = tem; ++ ++ if (y0 == 0) ++ return 0; ++ ++ tem = equiv_constant (y1); ++ if (tem != 0) ++ y1 = tem; ++ ++ if (y1 == 0) ++ return 0; ++ ++ /* Compare floats; report the result only for signed compares ++ since that's all there are for floats. */ ++ if (GET_CODE (y0) == CONST_DOUBLE ++ && GET_CODE (y1) == CONST_DOUBLE ++ && GET_MODE_CLASS (GET_MODE (y0)) == MODE_FLOAT) ++ { ++ union real_extract u0, u1; ++ int value; ++ jmp_buf handler; ++ ++ if (setjmp (handler)) ++ { ++ warning ("floating point trap in constant folding"); ++ return 0; ++ } ++ set_float_handler (handler); ++ bcopy (&CONST_DOUBLE_LOW (y0), &u0, sizeof u0); ++ bcopy (&CONST_DOUBLE_LOW (y1), &u1, sizeof u1); ++ value = 0100 + (REAL_VALUES_LESS (u0.d, u1.d) ? 7 << 3 ++ : REAL_VALUES_LESS (u1.d, u0.d) ? 1 << 3 : 0); ++ set_float_handler (0); ++ return value; ++ } ++ ++ /* Aside from that, demand explicit integers. */ ++ ++ if (GET_CODE (y0) != CONST_INT) ++ return 0; ++ ++ if (GET_CODE (y1) != CONST_INT) ++ return 0; ++ ++ s0 = u0 = INTVAL (y0); ++ s1 = u1 = INTVAL (y1); ++ ++ { ++ int width = GET_MODE_BITSIZE (m); ++ if (width < HOST_BITS_PER_INT) ++ { ++ s0 = u0 &= ~ ((-1) << width); ++ s1 = u1 &= ~ ((-1) << width); ++ if (u0 & (1 << (width - 1))) ++ s0 |= ((-1) << width); ++ if (u1 & (1 << (width - 1))) ++ s1 |= ((-1) << width); ++ } ++ } ++ ++ return 0100 + ((s0 < s1 ? 7 : s0 > s1) << 3) ++ + (((unsigned) u0 < (unsigned) u1) ? 7 ++ : ((unsigned) u0 > (unsigned) u1)); ++ } ++ { ++ rtx y0; ++ int u0, s0; ++ enum machine_mode m; ++ ++ y0 = fold_rtx (x, 0); ++ ++ m = GET_MODE (y0); ++ if (m == VOIDmode) ++ m = mode; ++ ++ if (GET_CODE (y0) == REG) ++ y0 = qty_const[reg_qty[REGNO (y0)]]; ++ ++ /* Register had no constant equivalent? We can't do anything. */ ++ if (y0 == 0) ++ return 0; ++ ++ /* If we don't know the mode, we can't test the sign. */ ++ if (m == VOIDmode) ++ return 0; ++ ++ /* Value is frame-pointer plus a constant? Or non-explicit constant? ++ That isn't zero, but we don't know its sign. */ ++ if (FIXED_BASE_PLUS_P (y0) ++ || GET_CODE (y0) == SYMBOL_REF || GET_CODE (y0) == CONST ++ || GET_CODE (y0) == LABEL_REF) ++ return 0300 + (1<<3) + 1; ++ ++ /* Otherwise, only integers enable us to optimize. */ ++ if (GET_CODE (y0) != CONST_INT) ++ return 0; ++ ++ s0 = u0 = INTVAL (y0); ++ { ++ int width = GET_MODE_BITSIZE (m); ++ if (width < HOST_BITS_PER_INT) ++ { ++ s0 = u0 &= ~ ((-1) << GET_MODE_BITSIZE (m)); ++ if (u0 & (1 << (GET_MODE_BITSIZE (m) - 1))) ++ s0 |= ((-1) << GET_MODE_BITSIZE (m)); ++ } ++ } ++ return 0100 + ((s0 < 0 ? 7 : s0 > 0) << 3) + (u0 != 0); ++ } ++} ++ ++/* Attempt to prove that a loop will be executed >= 1 times, ++ or prove it will be executed 0 times. ++ If either can be proved, delete some of the code. */ ++ ++static void ++predecide_loop_entry (insn) ++ register rtx insn; ++{ ++ register rtx jump = NEXT_INSN (insn); ++ register rtx p; ++ register rtx loop_top_label = NEXT_INSN (jump); ++ enum anon1 { UNK, DELETE_LOOP, DELETE_JUMP } disposition = UNK; ++ int count = 0; ++ ++ /* Give up if we don't find a jump that enters the loop. */ ++ if (! simplejump_p (jump)) ++ return; ++ ++ /* Find the label at the top of the loop. */ ++ while (GET_CODE (loop_top_label) == BARRIER ++ || GET_CODE (loop_top_label) == NOTE) ++ { ++ loop_top_label = NEXT_INSN (loop_top_label); ++ /* No label? Give up. */ ++ if (loop_top_label == 0) ++ return; ++ } ++ if (GET_CODE (loop_top_label) != CODE_LABEL) ++ abort (); ++ ++ /* Find the label at which the loop is entered. */ ++ p = XEXP (SET_SRC (PATTERN (jump)), 0); ++ if (GET_CODE (p) != CODE_LABEL) ++ abort (); ++ ++ /* Trace the flow of control through the end test, ++ propagating constants, to see if result is determined. */ ++ prev_insn_cc0 = 0; ++ prev_insn_explicit_cc0 = 0; ++ /* Avoid infinite loop if we find a cycle of jumps. */ ++ while (count < 10) ++ { ++ /* At end of function? Means rtl is inconsistent, ++ but this can happen when stmt.c gets confused ++ by a syntax error. */ ++ if (p == 0) ++ break; ++ /* Arriving at end of loop means endtest will drop out. */ ++ if (GET_CODE (p) == NOTE ++ && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END) ++ { ++ disposition = DELETE_LOOP; ++ break; ++ } ++ else if (GET_CODE (p) == CODE_LABEL || GET_CODE (p) == NOTE) ++ ; ++ /* We only know how to handle two kinds of insns: ++ conditional jumps, and those that set the condition codes. */ ++ else if (GET_CODE (p) == INSN && GET_CODE (PATTERN (p)) == SET ++ && SET_DEST (PATTERN (p)) == cc0_rtx) ++ { ++ prev_insn_cc0 = fold_cc0 (GET_MODE (SET_SRC (PATTERN (p))), ++ copy_rtx (SET_SRC (PATTERN (p)))); ++ if (GET_CODE (SET_SRC (PATTERN (p))) == CONST_INT) ++ prev_insn_explicit_cc0 = SET_SRC (PATTERN (p)); ++ } ++ else if (GET_CODE (p) == JUMP_INSN ++ && GET_CODE (PATTERN (p)) == SET ++ && SET_DEST (PATTERN (p)) == pc_rtx) ++ { ++ register rtx target ++ = fold_rtx (SET_SRC (PATTERN (p)), 1); ++ if (GET_CODE (target) == LABEL_REF) ++ p = XEXP (target, 0); ++ else if (target != pc_rtx) ++ /* If destination of jump is not fixed, give up. */ ++ break; ++ count++; ++ } ++ /* Any other kind of insn means we don't know ++ what result the test will have. */ ++ else ++ break; ++ ++ /* Arriving at top of loop means we can drop straight in. ++ Check here because we can arrive only via a jump insn ++ which would have changed P above. */ ++ if (p == loop_top_label) ++ { ++ disposition = DELETE_JUMP; ++ break; ++ } ++ /* We went past one insn; consider the next. */ ++ p = NEXT_INSN (p); ++ } ++ if (disposition == DELETE_JUMP) ++ { ++ /* We know the loop test will succeed the first time, ++ so delete the jump to the test; drop right into loop. ++ Note that one call to delete_insn gets the BARRIER as well. */ ++ delete_insn (jump); ++ } ++ if (disposition == DELETE_LOOP) ++ { ++ /* We know the endtest will fail and drop right out of the loop, ++ but it isn't safe to delete the loop here. ++ There could be jumps into it from outside. ++ So make the entry-jump jump around the loop. ++ This will cause find_basic_blocks to delete it if appropriate. */ ++ register rtx label = gen_label_rtx (); ++ emit_label_after (label, p); ++ redirect_jump (jump, label); ++ } ++} ++ ++/* CSE processing for one instruction. ++ First simplify sources and addresses of all assignments ++ in the instruction, using previously-computed equivalents values. ++ Then install the new sources and destinations in the table ++ of available values. */ ++ ++/* Data on one SET contained in the instruction. */ ++ ++struct set ++{ ++ /* The SET rtx itself. */ ++ rtx rtl; ++ /* The hash-table element for the SET_SRC of the SET. */ ++ struct table_elt *src_elt; ++ /* Hash code for the SET_SRC. */ ++ int src_hash_code; ++ /* Hash code for the SET_DEST. */ ++ int dest_hash_code; ++ /* The SET_DEST, with SUBREG, etc., stripped. */ ++ rtx inner_dest; ++ /* Place where the pointer to the INNER_DEST was found. */ ++ rtx *inner_dest_loc; ++ /* Nonzero if the SET_SRC is in memory. */ ++ char src_in_memory; ++ /* Nonzero if the SET_SRC is in a structure. */ ++ char src_in_struct; ++ /* Nonzero if the SET_SRC contains something ++ whose value cannot be predicted and understood. */ ++ char src_volatile; ++ /* Original machine mode, in case it becomes a CONST_INT. */ ++ enum machine_mode mode; ++}; ++ ++static void ++cse_insn (insn) ++ rtx insn; ++{ ++ register rtx x = PATTERN (insn); ++ register int i; ++ register int n_sets = 0; ++ ++ /* Records what this insn does to set CC0, ++ using same encoding used for prev_insn_cc0. */ ++ int this_insn_cc0 = 0; ++ /* Likewise, what to store in prev_insn_explicit_cc0. */ ++ rtx this_insn_explicit_cc0 = 0; ++ struct write_data writes_memory; ++ static struct write_data init = {0, 0, 0}; ++ ++ rtx src_eqv = 0; ++ struct table_elt *src_eqv_elt = 0; ++ int src_eqv_in_memory; ++ int src_eqv_in_struct; ++ int src_eqv_hash_code; ++ ++ struct set *sets; ++ ++ this_insn = insn; ++ writes_memory = init; ++ ++ /* Find all the SETs and CLOBBERs in this instruction. ++ Record all the SETs in the array `set' and count them. ++ Also determine whether there is a CLOBBER that invalidates ++ all memory references, or all references at varying addresses. */ ++ ++ if (GET_CODE (x) == SET) ++ { ++ rtx tem; ++ n_sets = 1; ++ sets = (struct set *) alloca (sizeof (struct set)); ++ sets[0].rtl = x; ++ ++ if (REG_NOTES (insn) != 0) ++ { ++ /* Store the equivalent value (re REG_EQUAL or REG_EQUIV) in SRC_EQV. */ ++ tem = find_reg_note (insn, REG_EQUIV, 0); ++ if (tem == 0) ++ tem = find_reg_note (insn, REG_EQUAL, 0); ++ if (tem) src_eqv = XEXP (tem, 0); ++ ++ /* Ignore the REG_EQUAL or REG_EQUIV note if its contents ++ are the same as the source. */ ++ if (src_eqv && rtx_equal_p (src_eqv, SET_SRC (x))) ++ src_eqv = 0; ++ } ++ ++ /* Return now for unconditional jumps. ++ They never need cse processing, so this does not hurt. ++ The reason is not efficiency but rather ++ so that we can test at the end for instructions ++ that have been simplified to unconditional jumps ++ and not be misled by unchanged instructions ++ that were unconditional jumps to begin with. */ ++ if (SET_DEST (x) == pc_rtx ++ && GET_CODE (SET_SRC (x)) == LABEL_REF) ++ return; ++ ++ /* Return now for call-insns, (set (reg 0) (call ...)). ++ The hard function value register is used only once, to copy to ++ someplace else, so it isn't worth cse'ing (and on 80386 is unsafe)! */ ++ if (GET_CODE (SET_SRC (x)) == CALL) ++ { ++ canon_reg (SET_SRC (x)); ++ return; ++ } ++ } ++ else if (GET_CODE (x) == PARALLEL) ++ { ++ register int lim = XVECLEN (x, 0); ++ ++ sets = (struct set *) alloca (lim * sizeof (struct set)); ++ ++ /* Find all regs explicitly clobbered in this insn, ++ and ensure they are not replaced with any other regs ++ elsewhere in this insn. ++ When a reg that is clobbered is also used for input, ++ we should presume that that is for a reason, ++ and we should not substitute some other register ++ which is not supposed to be clobbered. */ ++ for (i = 0; i < lim; i++) ++ { ++ register rtx y = XVECEXP (x, 0, i); ++ if (GET_CODE (y) == CLOBBER && GET_CODE (XEXP (y, 0)) == REG) ++ invalidate (XEXP (y, 0)); ++ } ++ ++ for (i = 0; i < lim; i++) ++ { ++ register rtx y = XVECEXP (x, 0, i); ++ if (GET_CODE (y) == SET) ++ sets[n_sets++].rtl = y; ++ else if (GET_CODE (y) == CLOBBER) ++ { ++ /* If we clobber memory, take note of that, ++ and canon the address. ++ This does nothing when a register is clobbered ++ because we have already invalidated the reg. */ ++ canon_reg (y); ++ note_mem_written (XEXP (y, 0), &writes_memory); ++ } ++ else if (GET_CODE (y) == USE ++ && ! (GET_CODE (XEXP (y, 0)) == REG ++ && REGNO (XEXP (y, 0)) < FIRST_PSEUDO_REGISTER)) ++ canon_reg (y); ++ else if (GET_CODE (y) == CALL) ++ canon_reg (y); ++ } ++ } ++ else if (GET_CODE (x) == CLOBBER) ++ note_mem_written (XEXP (x, 0), &writes_memory); ++ else if (GET_CODE (x) == CALL) ++ canon_reg (x); ++ ++ if (n_sets == 0) ++ { ++ invalidate_from_clobbers (&writes_memory, x); ++ return; ++ } ++ ++ /* Canonicalize sources and addresses of destinations. ++ set sets[i].src_elt to the class each source belongs to. ++ Detect assignments from or to volatile things ++ and set set[i] to zero so they will be ignored ++ in the rest of this function. ++ ++ Nothing in this loop changes the hash table or the register chains. */ ++ ++ for (i = 0; i < n_sets; i++) ++ { ++ register rtx src, dest; ++ register struct table_elt *elt; ++ enum machine_mode mode; ++ ++ dest = SET_DEST (sets[i].rtl); ++ src = SET_SRC (sets[i].rtl); ++ ++ /* If SRC is a constant that has no machine mode, ++ hash it with the destination's machine mode. ++ This way we can keep different modes separate. */ ++ ++ mode = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src); ++ sets[i].mode = mode; ++ ++ /* Replace each registers in SRC with oldest equivalent register, ++ but if DEST is a register do not replace it if it appears in SRC. */ ++ ++ if (GET_CODE (dest) == REG) ++ { ++ int tem = reg_qty[REGNO (dest)]; ++ reg_qty[REGNO (dest)] = REGNO (dest); ++ src = canon_reg (src); ++ ++ if (src_eqv) ++ src_eqv = canon_reg (src_eqv); ++ ++ reg_qty[REGNO (dest)] = tem; ++ } ++ else ++ { ++ src = canon_reg (src); ++ ++ if (src_eqv) ++ src_eqv = canon_reg (src_eqv); ++ } ++ ++ if (src_eqv) ++ { ++ enum machine_mode eqvmode = mode; ++ if (GET_CODE (dest) == STRICT_LOW_PART) ++ eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0))); ++ do_not_record = 0; ++ hash_arg_in_memory = 0; ++ hash_arg_in_struct = 0; ++ src_eqv = fold_rtx (src_eqv, 0); ++ src_eqv_hash_code = HASH (src_eqv, eqvmode); ++ ++ /* Replace the src_eqv with its cheapest equivalent. */ ++ ++ if (!do_not_record) ++ { ++ elt = lookup (src_eqv, src_eqv_hash_code, eqvmode); ++ if (elt && elt != elt->first_same_value) ++ { ++ elt = elt->first_same_value; ++ /* Find the cheapest one that is still valid. */ ++ while ((GET_CODE (elt->exp) != REG ++ && !exp_equiv_p (elt->exp, elt->exp, 1)) ++ || elt->equivalence_only) ++ elt = elt->next_same_value; ++ src_eqv = copy_rtx (elt->exp); ++ hash_arg_in_memory = 0; ++ hash_arg_in_struct = 0; ++ src_eqv_hash_code = HASH (src_eqv, elt->mode); ++ } ++ src_eqv_elt = elt; ++ } ++ else ++ src_eqv = 0; ++ ++ src_eqv_in_memory = hash_arg_in_memory; ++ src_eqv_in_struct = hash_arg_in_struct; ++ } ++ ++ /* Compute SRC's hash code, and also notice if it ++ should not be recorded at all. In that case, ++ prevent any further processing of this assignment. */ ++ do_not_record = 0; ++ hash_arg_in_memory = 0; ++ hash_arg_in_struct = 0; ++ src = fold_rtx (src, 0); ++ /* If SRC is a subreg of a reg with a known value, ++ perform the truncation now. */ ++ if (GET_CODE (src) == SUBREG) ++ { ++ rtx temp = equiv_constant (src); ++ if (temp) ++ src = temp; ++ } ++ /* If we have (NOT Y), see if Y is known to be (NOT Z). ++ If so, (NOT Y) simplifies to Z. */ ++ if (GET_CODE (src) == NOT || GET_CODE (src) == NEG) ++ { ++ rtx y = lookup_as_function (XEXP (src, 0), GET_CODE (src)); ++ if (y != 0) ++ src = copy_rtx (XEXP (y, 0)); ++ } ++ ++ /* If storing a constant value in a register that ++ previously held the constant value 0, ++ record this fact with a REG_WAS_0 note on this insn. */ ++ if (GET_CODE (src) == CONST_INT ++ && GET_CODE (dest) == REG ++ && qty_const[reg_qty[REGNO (dest)]] == const0_rtx) ++ REG_NOTES (insn) = gen_rtx (INSN_LIST, REG_WAS_0, ++ qty_const_insn[reg_qty[REGNO (dest)]], ++ REG_NOTES (insn)); ++ ++ sets[i].src_hash_code = HASH (src, mode); ++ ++ sets[i].src_volatile = do_not_record; ++ ++#if 0 ++ /* This code caused multiple hash-table entries ++ to be created for registers. Invalidation ++ would only get one, leaving others that didn't belong. ++ I don't know what good this ever did. */ ++ if (GET_CODE (src) == REG) ++ { ++ sets[i].src_in_memory = 0; ++ sets[i].src_elt = 0; ++ } ++ else ...; ++#endif ++ /* If source is a perverse subreg (such as QI treated as an SI), ++ treat it as volatile. It may do the work of an SI in one context ++ where the extra bits are not being used, but cannot replace an SI ++ in general. */ ++ if (GET_CODE (src) == SUBREG ++ && (GET_MODE_SIZE (GET_MODE (src)) ++ > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))) ++ sets[i].src_volatile = 1; ++ else if (!sets[i].src_volatile) ++ { ++ /* Replace the source with its cheapest equivalent. */ ++ ++ elt = lookup (src, sets[i].src_hash_code, mode); ++ if (elt && elt != elt->first_same_value) ++ { ++ elt = elt->first_same_value; ++ /* Find the cheapest one that is still valid. */ ++ while ((GET_CODE (elt->exp) != REG ++ && !exp_equiv_p (elt->exp, elt->exp, 1)) ++ || elt->equivalence_only) ++ elt = elt->next_same_value; ++ /* Don't replace with things that are not likely to be valid, ++ such as arithmetic expressions, unless the destination is ++ a register. */ ++ if (general_operand (elt->exp, VOIDmode) ++ || GET_CODE (dest) == REG) ++ { ++ src = copy_rtx (elt->exp); ++ hash_arg_in_memory = 0; ++ hash_arg_in_struct = 0; ++ sets[i].src_hash_code = HASH (src, elt->mode); ++ } ++ } ++ ++ /* If ELT is a constant, is there a register ++ linearly related to it? If so, replace it ++ with the sum of that register plus an offset. */ ++ ++ if (GET_CODE (src) == CONST && n_sets == 1 ++ && SET_DEST (sets[i].rtl) != cc0_rtx) ++ { ++ rtx newsrc = use_related_value (src, elt); ++ if (newsrc == 0 && src_eqv != 0) ++ newsrc = use_related_value (src_eqv, src_eqv_elt); ++ if (newsrc) ++ { ++ rtx oldsrc = src; ++ src = newsrc; ++ hash_arg_in_memory = 0; ++ hash_arg_in_struct = 0; ++ sets[i].src_hash_code = HASH (src, GET_MODE (src)); ++ /* The new expression for the SRC has the same value ++ as the previous one; so if the previous one is in ++ the hash table, put the new one in as equivalent. */ ++ if (elt != 0) ++ elt = insert (src, elt->first_same_value, sets[i].src_hash_code, ++ elt->mode); ++ else ++ { ++ /* Maybe the new expression is in the table already. */ ++ elt = lookup (src, sets[i].src_hash_code, mode); ++ /* And maybe a register contains the same value. */ ++ if (elt && elt != elt->first_same_value) ++ { ++ elt = elt->first_same_value; ++ /* Find the cheapest one that is still valid. */ ++ while ((GET_CODE (elt->exp) != REG ++ && !exp_equiv_p (elt->exp, elt->exp, 1)) ++ || elt->equivalence_only) ++ elt = elt->next_same_value; ++ src = copy_rtx (elt->exp); ++ hash_arg_in_memory = 0; ++ hash_arg_in_struct = 0; ++ sets[i].src_hash_code = HASH (src, elt->mode); ++ } ++ } ++ ++ /* This would normally be inhibited by the REG_EQUIV ++ note we are about to make. */ ++#if 0 ++ /* Deleted because the inhibition was deleted. */ ++ SET_SRC (sets[i].rtl) = src; ++#endif ++ ++ /* Record the actual constant value ++ in a REG_EQUIV or REG_EQUAL note. */ ++ if (GET_CODE (SET_DEST (sets[i].rtl)) == REG) ++ { ++ /* A REG_EQUIV note means the dest never changes. ++ Don't put one on unless there is already one. */ ++ rtx note = find_reg_note (insn, REG_EQUIV, 0); ++ if (note != 0) ++ XEXP (note, 0) = oldsrc; ++ else ++ REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL, ++ oldsrc, REG_NOTES (insn)); ++ } ++ } ++ } ++ ++ sets[i].src_elt = elt; ++ sets[i].src_in_memory = hash_arg_in_memory; ++ sets[i].src_in_struct = hash_arg_in_struct; ++ } ++ ++ /* Either canon_reg or the copy_rtx may have changed this. */ ++ /* Note it is not safe to replace the sources if there ++ is more than one set. We could get an insn ++ [(set (reg) (reg)) (set (reg) (reg))], which is probably ++ not in the machine description. ++ This case we could handle by breaking into several insns. ++ Cases of partial substitution cannot win at all. */ ++ /* Also, if this insn is setting a "constant" register, ++ we may not replace the value that is given to it. */ ++ if (n_sets == 1) ++#if 0 ++ /* Now that the REG_EQUIV contains the constant instead of the reg, ++ it should be ok to modify the insn's actual source. */ ++ if (REG_NOTES (insn) == 0 ++ || REG_NOTE_KIND (REG_NOTES (insn)) != REG_EQUIV) ++#endif ++ SET_SRC (sets[0].rtl) = src; ++ ++ do_not_record = 0; ++ sets[i].inner_dest_loc = &SET_DEST (sets[0].rtl); ++ ++ /* Look within any SIGN_EXTRACT or ZERO_EXTRACT ++ to the MEM or REG within it. */ ++ while (1) ++ { ++ if (GET_CODE (dest) == SIGN_EXTRACT ++ || GET_CODE (dest) == ZERO_EXTRACT) ++ { ++ XEXP (dest, 1) = canon_reg (XEXP (dest, 1)); ++ XEXP (dest, 2) = canon_reg (XEXP (dest, 2)); ++ sets[i].inner_dest_loc = &XEXP (dest, 0); ++ dest = XEXP (dest, 0); ++ } ++ else if (GET_CODE (dest) == SUBREG ++ || GET_CODE (dest) == STRICT_LOW_PART) ++ { ++ sets[i].inner_dest_loc = &XEXP (dest, 0); ++ dest = XEXP (dest, 0); ++ } ++ else ++ break; ++ } ++ ++ sets[i].inner_dest = dest; ++ ++ /* If storing into memory, do cse on the memory address. ++ Also compute the hash code of the destination now, ++ before the effects of this instruction are recorded, ++ since the register values used in the address computation ++ are those before this instruction. */ ++ if (GET_CODE (dest) == MEM) ++ { ++ register rtx addr; ++ register int hash; ++ ++ canon_reg (dest); ++ dest = fold_rtx (dest, 0); ++ addr = XEXP (dest, 0); ++ ++ /* Pushing or popping does not invalidate anything. */ ++ if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC ++ || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC) ++ && GET_CODE (XEXP (addr, 0)) == REG ++ && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM) ++ ; ++ else ++ /* Otherwise, decide whether we invalidate ++ everything in memory, or just things at non-fixed places. ++ Writing a large aggregate must invalidate everything ++ because we don't know how long it is. */ ++ note_mem_written (dest, &writes_memory); ++ ++ /* Do not try to replace addresses of local and argument slots. ++ The MEM expressions for args and non-register local variables ++ are made only once and inserted in many instructions, ++ as well as being used to control symbol table output. ++ It is not safe to clobber them. It also doesn't do any good! */ ++ if ((GET_CODE (addr) == PLUS ++ && GET_CODE (XEXP (addr, 0)) == REG ++ && GET_CODE (XEXP (addr, 1)) == CONST_INT ++ && (hash = REGNO (XEXP (addr, 0)), ++ hash == FRAME_POINTER_REGNUM || hash == ARG_POINTER_REGNUM)) ++ || (GET_CODE (addr) == REG ++ && (hash = REGNO (addr), ++ hash == FRAME_POINTER_REGNUM || hash == ARG_POINTER_REGNUM))) ++ sets[i].dest_hash_code = ((int)MEM + canon_hash (addr, GET_MODE (dest))) % NBUCKETS; ++ else ++ { ++ /* Look for a simpler equivalent for the destination address. */ ++ hash = HASH (addr, Pmode); ++ if (! do_not_record) ++ { ++ elt = lookup (addr, hash, Pmode); ++ sets[i].dest_hash_code = ((int) MEM + hash) % NBUCKETS; ++ ++ if (elt && elt != elt->first_same_value) ++ { ++ elt = elt->first_same_value; ++ /* Find the cheapest one that is still valid. */ ++ while ((GET_CODE (elt->exp) != REG ++ && !exp_equiv_p (elt->exp, elt->exp, 1)) ++ || elt->equivalence_only) ++ elt = elt->next_same_value; ++ ++ addr = copy_rtx (elt->exp); ++ /* Create a new MEM rtx, in case the old one ++ is shared somewhere else. */ ++ dest = gen_rtx (MEM, GET_MODE (dest), addr); ++ MEM_VOLATILE_P (dest) ++ = MEM_VOLATILE_P (sets[i].inner_dest); ++ MEM_IN_STRUCT_P (dest) ++ = MEM_IN_STRUCT_P (sets[i].inner_dest); ++ *sets[i].inner_dest_loc = dest; ++ sets[i].inner_dest = dest; ++ } ++ } ++ } ++ } ++ ++ /* Don't enter a bit-field in the hash table ++ because the value in it after the store ++ may not equal what was stored, due to truncation. */ ++ ++ if (GET_CODE (SET_DEST (sets[i].rtl)) == ZERO_EXTRACT ++ || GET_CODE (SET_DEST (sets[i].rtl)) == SIGN_EXTRACT) ++ { ++ rtx width = XEXP (SET_DEST (sets[i].rtl), 1); ++ rtx value = equiv_constant (SET_SRC (sets[i].rtl)); ++ ++ if (value != 0 && GET_CODE (value) == CONST_INT ++ && GET_CODE (width) == CONST_INT ++ && INTVAL (width) < HOST_BITS_PER_INT ++ && ! (INTVAL (value) & (-1) << INTVAL (width))) ++ /* Exception: if the value is constant, ++ we can tell whether truncation would change it. */ ++ ; ++ else ++ sets[i].src_volatile = 1, src_eqv = 0; ++ } ++ ++ /* No further processing for this assignment ++ if destination is volatile or if the source and destination ++ are the same. */ ++ ++ else if (do_not_record ++ || (GET_CODE (dest) == REG ++ ? REGNO (dest) == STACK_POINTER_REGNUM ++ : GET_CODE (dest) != MEM) ++ || rtx_equal_p (SET_SRC (sets[i].rtl), SET_DEST (sets[i].rtl))) ++ sets[i].rtl = 0; ++ ++ if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl)) ++ { ++ sets[i].dest_hash_code = HASH (SET_DEST (sets[i].rtl), mode); ++ if (do_not_record) ++ sets[i].rtl = 0; ++ } ++ ++ if (dest == cc0_rtx ++ && (GET_CODE (src) == COMPARE ++ || CONSTANT_P (src) ++ || GET_CODE (src) == REG)) ++ this_insn_cc0 = fold_cc0 (sets[i].mode, src); ++ ++ if (dest == cc0_rtx && GET_CODE (src) == CONST_INT) ++ this_insn_explicit_cc0 = src; ++ } ++ ++ /* Now enter all non-volatile source expressions in the hash table ++ if they are not already present. ++ Record in src_elt the heads of their equivalence classes. ++ This way we can insert the corresponding destinations into ++ the same classes even if the actual sources are no longer in them ++ (having been invalidated). */ ++ ++ if (src_eqv && src_eqv_elt == 0 && sets[0].rtl != 0) ++ { ++ register struct table_elt *elt; ++ rtx dest = SET_DEST (sets[0].rtl); ++ enum machine_mode eqvmode = GET_MODE (dest); ++ ++ if (GET_CODE (dest) == STRICT_LOW_PART) ++ eqvmode = GET_MODE (SUBREG_REG (XEXP (dest, 0))); ++ if (insert_regs (src_eqv, 0, 0)) ++ src_eqv_hash_code = HASH (src_eqv, eqvmode); ++ elt = insert (src_eqv, 0, src_eqv_hash_code, eqvmode); ++ elt->in_memory = src_eqv_in_memory; ++ elt->in_struct = src_eqv_in_struct; ++ elt->equivalence_only = 1; ++ src_eqv_elt = elt->first_same_value; ++ } ++ ++ for (i = 0; i < n_sets; i++) ++ if (sets[i].rtl && ! sets[i].src_volatile) ++ { ++ if (GET_CODE (SET_DEST (sets[i].rtl)) == STRICT_LOW_PART) ++ { ++ /* REG_EQUAL in setting a STRICT_LOW_PART ++ gives an equivalent for the entire destination register, ++ not just for the subreg being stored in now. ++ This is a more interesting equivalent, so we arrange later ++ to treat the entire reg as the destination. */ ++ sets[i].src_elt = src_eqv_elt; ++ sets[i].src_hash_code = src_eqv_hash_code; ++ } ++ else if (sets[i].src_elt == 0) ++ { ++ register rtx src = SET_SRC (sets[i].rtl); ++ register rtx dest = SET_DEST (sets[i].rtl); ++ register struct table_elt *elt; ++ enum machine_mode mode ++ = GET_MODE (src) == VOIDmode ? GET_MODE (dest) : GET_MODE (src); ++ ++ /* Note that these insert_regs calls cannot remove ++ any of the src_elt's, because they would have failed to match ++ if not still valid. */ ++ if (insert_regs (src, 0, 0)) ++ sets[i].src_hash_code = HASH (src, mode); ++ elt = insert (src, src_eqv_elt, sets[i].src_hash_code, mode); ++ elt->in_memory = sets[i].src_in_memory; ++ elt->in_struct = sets[i].src_in_struct; ++ sets[i].src_elt = elt->first_same_value; ++ } ++ } ++ ++ invalidate_from_clobbers (&writes_memory, x); ++ ++ /* Now invalidate everything set by this instruction. ++ If a SUBREG or other funny destination is being set, ++ sets[i].rtl is still nonzero, so here we invalidate the reg ++ a part of which is being set. */ ++ ++ for (i = 0; i < n_sets; i++) ++ if (sets[i].rtl) ++ { ++ register rtx dest = sets[i].inner_dest; ++ ++ /* Needed for registers to remove the register from its ++ previous quantity's chain. ++ Needed for memory if this is a nonvarying address, unless ++ we have just done an invalidate_memory that covers even those. */ ++ if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG ++ || (! writes_memory.all && ! cse_rtx_addr_varies_p (dest))) ++ invalidate (dest); ++ } ++ ++ /* Make sure registers mentioned in destinations ++ are safe for use in an expression to be inserted. ++ This removes from the hash table ++ any invalid entry that refers to one of these registers. */ ++ ++ for (i = 0; i < n_sets; i++) ++ if (sets[i].rtl && GET_CODE (SET_DEST (sets[i].rtl)) != REG) ++ mention_regs (SET_DEST (sets[i].rtl)); ++ ++ /* We may have just removed some of the src_elt's from the hash table. ++ So replace each one with the current head of the same class. */ ++ ++ for (i = 0; i < n_sets; i++) ++ if (sets[i].rtl) ++ { ++ /* If the source is volatile, its destination goes in ++ a class of its own. */ ++ if (sets[i].src_volatile) ++ sets[i].src_elt = 0; ++ ++ if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0) ++ /* If elt was removed, find current head of same class, ++ or 0 if nothing remains of that class. */ ++ { ++ register struct table_elt *elt = sets[i].src_elt; ++ ++ while (elt && elt->first_same_value == 0) ++ elt = elt->next_same_value; ++ sets[i].src_elt = elt ? elt->first_same_value : 0; ++ } ++ } ++ ++ /* Now insert the destinations into their equivalence classes. */ ++ ++ for (i = 0; i < n_sets; i++) ++ if (sets[i].rtl) ++ { ++ register rtx dest = SET_DEST (sets[i].rtl); ++ register struct table_elt *elt; ++ ++ if (flag_float_store ++ && GET_CODE (dest) == MEM ++ && (GET_MODE (dest) == SFmode || GET_MODE (dest) == DFmode)) ++ continue; ++ ++ /* STRICT_LOW_PART isn't part of the value BEING set, ++ and neither is the SUBREG inside it. ++ Note that in this case SETS[I].SRC_ELT is really SRC_EQV_ELT. */ ++ if (GET_CODE (dest) == STRICT_LOW_PART) ++ dest = SUBREG_REG (XEXP (dest, 0)); ++ ++ if (GET_CODE (dest) == REG) ++ /* Registers must also be inserted into chains for quantities. */ ++ if (insert_regs (dest, sets[i].src_elt, 1)) ++ /* If `insert_regs' changes something, the hash code must be ++ recalculated. */ ++ sets[i].dest_hash_code = HASH (dest, GET_MODE (dest)); ++ ++ if (GET_CODE (dest) == SUBREG) ++ /* Registers must also be inserted into chains for quantities. */ ++ if (insert_regs (dest, sets[i].src_elt, 1)) ++ /* If `insert_regs' changes something, the hash code must be ++ recalculated. */ ++ sets[i].dest_hash_code ++ = canon_hash (dest, GET_MODE (dest)) % NBUCKETS; ++ ++ elt = insert (dest, sets[i].src_elt, sets[i].dest_hash_code, GET_MODE (dest)); ++ elt->in_memory = GET_CODE (sets[i].inner_dest) == MEM; ++ if (elt->in_memory) ++ { ++ elt->in_struct = (MEM_IN_STRUCT_P (sets[i].inner_dest) ++ || sets[i].inner_dest != SET_DEST (sets[i].rtl)); ++ } ++ } ++ ++ /* Special handling for (set REG0 REG1) ++ where REG0 is the "cheapest", cheaper than REG1. ++ After cse, REG1 will probably not be used in the sequel, ++ so (if easily done) change this insn to (set REG1 REG0) and ++ replace REG1 with REG0 in the previous insn that computed their value. ++ Then REG1 will become a dead store and won't cloud the situation ++ for later optimizations. */ ++ if (n_sets == 1 && sets[0].rtl && GET_CODE (SET_DEST (sets[0].rtl)) == REG ++ && GET_CODE (SET_SRC (sets[0].rtl)) == REG ++ && rtx_equal_p (canon_reg (SET_SRC (sets[0].rtl)), SET_DEST (sets[0].rtl))) ++ { ++ rtx prev = PREV_INSN (insn); ++ while (prev && GET_CODE (prev) == NOTE) ++ prev = PREV_INSN (prev); ++ ++ if (prev && GET_CODE (prev) == INSN && GET_CODE (PATTERN (prev)) == SET ++ && SET_DEST (PATTERN (prev)) == SET_SRC (sets[0].rtl)) ++ { ++ rtx dest = SET_DEST (sets[0].rtl); ++ rtx note = find_reg_note (prev, REG_EQUIV, 0); ++ ++ SET_DEST (PATTERN (prev)) = dest; ++ SET_DEST (sets[0].rtl) = SET_SRC (sets[0].rtl); ++ SET_SRC (sets[0].rtl) = dest; ++ /* If REG1 was equivalent to a constant, REG0 is not. */ ++ if (note) ++ PUT_MODE (note, REG_EQUAL); ++ } ++ } ++ ++ /* Did this insn become an unconditional branch or become a no-op? */ ++ if (GET_CODE (insn) == JUMP_INSN ++ && GET_CODE (x) == SET ++ && SET_DEST (x) == pc_rtx) ++ { ++ if (SET_SRC (x) == pc_rtx) ++ { ++ PUT_CODE (insn, NOTE); ++ NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (insn) = 0; ++ cse_jumps_altered = 1; ++ /* If previous insn just set CC0 for us, delete it too. */ ++ if (prev_insn_cc0 != 0 || prev_insn_explicit_cc0 != 0) ++ { ++ PUT_CODE (prev_insn, NOTE); ++ NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (prev_insn) = 0; ++ } ++ /* One less use of the label this insn used to jump to. */ ++ --LABEL_NUSES (JUMP_LABEL (insn)); ++ } ++ else if (GET_CODE (SET_SRC (x)) == LABEL_REF) ++ { ++ rtx label; ++ ++ emit_barrier_after (insn); ++ cse_jumps_altered = 1; ++ /* If previous insn just set CC0 for us, delete it too. */ ++ if (prev_insn_cc0 != 0 || prev_insn_explicit_cc0 != 0) ++ { ++ PUT_CODE (prev_insn, NOTE); ++ NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (prev_insn) = 0; ++ } ++ /* If jump target is the following label, and this is only use of it, ++ skip direct to that label and continue optimizing there. */ ++ label = insn; ++ while (label != 0 && GET_CODE (label) != CODE_LABEL) ++ label = NEXT_INSN (label); ++ if (label == XEXP (SET_SRC (x), 0) ++ && LABEL_NUSES (label) == 1) ++ cse_skip_to_next_block = 1; ++ } ++ } ++ ++ /* If this insn used to store a value based on CC0 but now value is constant, ++ and the previous insn just set CC0 for us, delete previous insn. ++ Here we use the fact that nothing expects CC0 to be valid over an insn, ++ which is true until the final pass. */ ++ if (GET_CODE (x) == SET && prev_insn_cc0 ++ && CONSTANT_P (SET_SRC (x))) ++ { ++ PUT_CODE (prev_insn, NOTE); ++ NOTE_LINE_NUMBER (prev_insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (prev_insn) = 0; ++ } ++ ++ prev_insn_explicit_cc0 = this_insn_explicit_cc0; ++ prev_insn_cc0 = this_insn_cc0; ++ prev_insn = insn; ++} ++ ++/* Store 1 in *WRITES_PTR for those categories of memory ref ++ that must be invalidated when the expression WRITTEN is stored in. ++ If WRITTEN is null, say everything must be invalidated. */ ++ ++static void ++note_mem_written (written, writes_ptr) ++ rtx written; ++ struct write_data *writes_ptr; ++{ ++ static struct write_data everything = {1, 1, 1}; ++ ++ if (written == 0) ++ *writes_ptr = everything; ++ else if (GET_CODE (written) == MEM) ++ { ++ /* Pushing or popping the stack invalidates nothing. */ ++ rtx addr = XEXP (written, 0); ++ if ((GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC ++ || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC) ++ && GET_CODE (XEXP (addr, 0)) == REG ++ && REGNO (XEXP (addr, 0)) == STACK_POINTER_REGNUM) ++ return; ++ if (GET_MODE (written) == BLKmode) ++ *writes_ptr = everything; ++ else if (cse_rtx_addr_varies_p (written)) ++ { ++ /* A varying address that is a sum indicates an array element, ++ and that's just as good as a structure element ++ in implying that we need not invalidate scalar variables. */ ++ if (!(MEM_IN_STRUCT_P (written) ++ || GET_CODE (XEXP (written, 0)) == PLUS)) ++ writes_ptr->all = 1; ++ writes_ptr->nonscalar = 1; ++ } ++ writes_ptr->var = 1; ++ } ++} ++ ++/* Perform invalidation on the basis of everything about an insn ++ except for invalidating the actual places that are SET in it. ++ This includes the places CLOBBERed, and anything that might ++ alias with something that is SET or CLOBBERed. ++ ++ W points to the writes_memory for this insn, a struct write_data ++ saying which kinds of memory references must be invalidated. ++ X is the pattern of the insn. */ ++ ++static void ++invalidate_from_clobbers (w, x) ++ struct write_data *w; ++ rtx x; ++{ ++ /* If W->var is not set, W specifies no action. ++ If W->all is set, this step gets all memory refs ++ so they can be ignored in the rest of this function. */ ++ if (w->var) ++ invalidate_memory (w); ++ ++ if (GET_CODE (x) == CLOBBER) ++ { ++ rtx ref = XEXP (x, 0); ++ if (ref ++ && (GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG ++ || (GET_CODE (ref) == MEM && ! w->all))) ++ invalidate (ref); ++ } ++ else if (GET_CODE (x) == PARALLEL) ++ { ++ register int i; ++ for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ++ { ++ register rtx y = XVECEXP (x, 0, i); ++ if (GET_CODE (y) == CLOBBER) ++ { ++ rtx ref = XEXP (y, 0); ++ if (ref ++ &&(GET_CODE (ref) == REG || GET_CODE (ref) == SUBREG ++ || (GET_CODE (ref) == MEM && !w->all))) ++ invalidate (ref); ++ } ++ } ++ } ++} ++ ++/* Find the end of INSN's basic block, and return the cuid of its last insn ++ and the total number of SETs in all the insns of the block. */ ++ ++struct cse_basic_block_data { int cuid, nsets; rtx last; }; ++ ++static struct cse_basic_block_data ++cse_end_of_basic_block (insn) ++ rtx insn; ++{ ++ rtx p = insn; ++ struct cse_basic_block_data val; ++ int nsets = 0; ++ int last_uid = 0; ++ ++ /* Scan to end of this basic block. */ ++ while (p && GET_CODE (p) != CODE_LABEL) ++ { ++ /* Don't cse out the end of a loop. This makes a difference ++ only for the unusual loops that always execute at least once; ++ all other loops have labels there so we will stop in any case. ++ Cse'ing out the end of the loop is dangerous because it ++ might cause an invariant expression inside the loop ++ to be reused after the end of the loop. This would make it ++ hard to move the expression out of the loop in loop.c, ++ especially if it is one of several equivalent expressions ++ and loop.c would like to eliminate it. ++ The occasional optimizations lost by this will all come back ++ if loop and cse are made to work alternatingly. */ ++ if (GET_CODE (p) == NOTE ++ && NOTE_LINE_NUMBER (p) == NOTE_INSN_LOOP_END) ++ break; ++ ++ /* Don't cse over a call to setjmp; on some machines (eg vax) ++ the regs restored by the longjmp come from ++ a later time than the setjmp. */ ++ if (GET_CODE (p) == NOTE ++ && NOTE_LINE_NUMBER (p) == NOTE_INSN_SETJMP) ++ break; ++ ++ /* A PARALLEL can have lots of SETs in it, ++ especially if it is really an ASM_OPERANDS. */ ++ if (GET_CODE (p) == INSN && GET_CODE (PATTERN (p)) == PARALLEL) ++ nsets += XVECLEN (PATTERN (p), 0); ++ else ++ nsets += 1; ++ ++ last_uid = INSN_UID (p); ++ p = NEXT_INSN (p); ++ } ++ val.cuid = uid_cuid[last_uid]; ++ val.nsets = nsets; ++ val.last = p; ++ ++ return val; ++} ++ ++static rtx cse_basic_block (); ++ ++/* Perform cse on the instructions of a function. ++ F is the first instruction. ++ NREGS is one plus the highest pseudo-reg number used in the instruction. ++ ++ Returns 1 if jump_optimize should be redone due to simplifications ++ in conditional jump instructions. */ ++ ++int ++cse_main (f, nregs) ++ /* f is the first instruction of a chain of insns for one function */ ++ rtx f; ++ /* nregs is the total number of registers used in it */ ++ int nregs; ++{ ++ register rtx insn = f; ++ register int i; ++ ++ cse_jumps_altered = 0; ++ ++ init_recog (); ++ ++ max_reg = nregs; ++ ++ all_minus_one = (int *) alloca (nregs * sizeof (int)); ++ consec_ints = (int *) alloca (nregs * sizeof (int)); ++ for (i = 0; i < nregs; i++) ++ { ++ all_minus_one[i] = -1; ++ consec_ints[i] = i; ++ } ++ ++ reg_next_eqv = (int *) alloca (nregs * sizeof (int)); ++ reg_prev_eqv = (int *) alloca (nregs * sizeof (int)); ++ reg_qty = (int *) alloca (nregs * sizeof (int)); ++ reg_rtx = (rtx *) alloca (nregs * sizeof (rtx)); ++ reg_in_table = (int *) alloca (nregs * sizeof (int)); ++ reg_tick = (int *) alloca (nregs * sizeof (int)); ++ ++ /* Discard all the free elements of the previous function ++ since they are allocated in the temporarily obstack. */ ++ bzero (table, sizeof table); ++ free_element_chain = 0; ++ n_elements_made = 0; ++ ++ /* Find the largest uid. */ ++ ++ for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ++ if (INSN_UID (insn) > i) ++ i = INSN_UID (insn); ++ ++ uid_cuid = (short *) alloca ((i + 1) * sizeof (short)); ++ bzero (uid_cuid, (i + 1) * sizeof (short)); ++ ++ /* Compute the mapping from uids to cuids. ++ CUIDs are numbers assigned to insns, like uids, ++ except that cuids increase monotonically through the code. ++ Don't assign cuids to line-number NOTEs, so that the distance in cuids ++ between two insns is not affected by -g. */ ++ ++ for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ++ { ++ if (GET_CODE (insn) != NOTE ++ || NOTE_LINE_NUMBER (insn) < 0) ++ INSN_CUID (insn) = ++i; ++ else ++ /* Give a line number note the same cuid as preceding insn. */ ++ INSN_CUID (insn) = i; ++ } ++ ++ /* Loop over basic blocks. ++ Compute the maximum number of qty's needed for each basic block ++ (which is 2 for each SET). */ ++ insn = f; ++ while (insn) ++ { ++ struct cse_basic_block_data val; ++ ++ val = cse_end_of_basic_block (insn); ++ ++ cse_basic_block_end = val.cuid; ++ cse_basic_block_start = INSN_CUID (insn); ++ max_qty = val.nsets * 2; ++ ++ /* Make MAX_QTY bigger to give us room to optimize ++ past the end of this basic block, if that should prove useful. */ ++ if (max_qty < 500) ++ max_qty = 500; ++ ++ max_qty += max_reg; ++ ++ insn = cse_basic_block (insn, val.last); ++#ifdef USE_C_ALLOCA ++ alloca (0); ++#endif ++ } ++ ++ /* Tell refers_to_mem_p that qty_const info is not available. */ ++ qty_const = 0; ++ ++ if (max_elements_made < n_elements_made) ++ max_elements_made = n_elements_made; ++ ++ return cse_jumps_altered; ++} ++ ++static rtx ++cse_basic_block (from, to) ++ register rtx from, to; ++{ ++ register rtx insn; ++ int *qv1 = (int *) alloca (max_qty * sizeof (int)); ++ int *qv2 = (int *) alloca (max_qty * sizeof (int)); ++ rtx *qv3 = (rtx *) alloca (max_qty * sizeof (rtx)); ++ ++ qty_first_reg = qv1; ++ qty_last_reg = qv2; ++ qty_const = qv3; ++ qty_const_insn = (rtx *) alloca (max_qty * sizeof (rtx)); ++ ++ new_basic_block (); ++ ++ cse_skip_to_next_block = 0; ++ ++ for (insn = from; insn != to; insn = NEXT_INSN (insn)) ++ { ++ register enum rtx_code code; ++ ++ code = GET_CODE (insn); ++ ++ if (code == INSN || code == JUMP_INSN || code == CALL_INSN) ++ cse_insn (insn); ++ /* Memory, and some registers, are invalidate by subroutine calls. */ ++ if (code == CALL_INSN) ++ { ++ register int i; ++ static struct write_data everything = {1, 1, 1}; ++ invalidate_memory (&everything); ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ if (call_used_regs[i] && reg_rtx[i] ++ && i != FRAME_POINTER_REGNUM ++ && i != ARG_POINTER_REGNUM) ++ invalidate (reg_rtx[i]); ++ } ++ /* Loop beginnings are often followed by jumps ++ (that enter the loop above the endtest). ++ See if we can prove the loop will be executed at least once; ++ if so, delete the jump. Also perhaps we can prove loop ++ will never be executed and delete the entire thing. */ ++ if (code == NOTE ++ && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG ++ && GET_CODE (NEXT_INSN (insn)) == JUMP_INSN) ++ { ++ predecide_loop_entry (insn); ++ /* Whether that jump was deleted or not, ++ it certainly is the end of the basic block. ++ Since the jump is unconditional, ++ it requires no further processing here. */ ++ break; ++ } ++ ++ /* See if it is ok to keep on going past the label ++ which used to end our basic block. */ ++ if (cse_skip_to_next_block ++ || (to != 0 && NEXT_INSN (insn) == to && LABEL_NUSES (to) == 0)) ++ { ++ struct cse_basic_block_data val; ++ ++ /* Skip the remaining insns in this block. */ ++ cse_skip_to_next_block = 0; ++ insn = to; ++ if (insn == 0) ++ break; ++ ++ /* Find the end of the following block. */ ++ val = cse_end_of_basic_block (NEXT_INSN (insn)); ++ ++ /* If the tables we allocated have enough space left ++ to handle all the SETs in the next basic block, ++ continue through it. Otherwise, return, ++ and that block will be scanned individually. */ ++ if (val.nsets * 2 + next_qty > max_qty) ++ break; ++ ++ cse_basic_block_end = val.cuid; ++ to = val.last; ++ } ++ } ++ ++ if (next_qty > max_qty) ++ abort (); ++ ++ return to ? NEXT_INSN (to) : 0; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-tree.h alliance/genview/src/gcc-1.42/c-tree.h +--- alliance-5.0/genview/src/gcc-1.42/c-tree.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-tree.h 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,177 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Definitions for C parsing and type checking. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++/* Language-dependent contents of an identifier. */ ++ ++struct lang_identifier ++{ ++ struct tree_identifier ignore; ++ tree global_value, local_value, label_value, implicit_decl; ++ tree error_locus; ++}; ++ ++/* Macros for access to language-specific slots in an identifier. */ ++ ++#define IDENTIFIER_GLOBAL_VALUE(NODE) \ ++ (((struct lang_identifier *)(NODE))->global_value) ++#define IDENTIFIER_LOCAL_VALUE(NODE) \ ++ (((struct lang_identifier *)(NODE))->local_value) ++#define IDENTIFIER_LABEL_VALUE(NODE) \ ++ (((struct lang_identifier *)(NODE))->label_value) ++#define IDENTIFIER_IMPLICIT_DECL(NODE) \ ++ (((struct lang_identifier *)(NODE))->implicit_decl) ++#define IDENTIFIER_ERROR_LOCUS(NODE) \ ++ (((struct lang_identifier *)(NODE))->error_locus) ++ ++/* Nonzero means reject anything that ANSI standard C forbids. */ ++extern int pedantic; ++ ++/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only. */ ++#define C_TYPE_FIELDS_READONLY(type) TYPE_SEP_UNIT (type) ++ ++/* in c-typecheck.c */ ++extern tree build_component_ref(), build_conditional_expr(), build_compound_expr(); ++extern tree build_unary_op(), build_binary_op(), build_function_call(); ++extern tree build_binary_op_nodefault (); ++extern tree build_indirect_ref(), build_array_ref(), build_c_cast(); ++extern tree build_modify_expr(); ++extern tree c_sizeof (), c_alignof (); ++extern void store_init_value (); ++extern tree digest_init (); ++extern tree c_expand_start_case (); ++extern tree default_conversion (); ++ ++/* Given two integer or real types, return the type for their sum. ++ Given two compatible ANSI C types, returns the merged type. */ ++ ++extern tree commontype (); ++ ++/* in c-decl.c */ ++extern tree build_label (); ++ ++extern int start_function (); ++extern void finish_function (); ++extern void store_parm_decls (); ++extern tree get_parm_info (); ++ ++extern void pushlevel (); ++extern tree poplevel (); ++ ++extern tree groktypename(), lookup_name(); ++ ++extern tree lookup_label(), define_label(); ++ ++extern tree implicitly_declare(), getdecls(), gettags (); ++ ++extern tree start_decl(); ++extern void finish_decl(); ++ ++extern tree start_struct(), finish_struct(), xref_tag(); ++extern tree grokfield(); ++ ++extern tree start_enum(), finish_enum(); ++extern tree build_enumerator(); ++ ++extern tree make_index_type (); ++ ++/* Add qualifiers to a type, in the fashion for C. */ ++extern tree c_build_type_variant (); ++ ++extern tree double_type_node, long_double_type_node, float_type_node; ++extern tree char_type_node, unsigned_char_type_node, signed_char_type_node; ++ ++extern tree short_integer_type_node, short_unsigned_type_node; ++extern tree long_integer_type_node, long_unsigned_type_node; ++extern tree long_long_integer_type_node, long_long_unsigned_type_node; ++extern tree unsigned_type_node; ++extern tree string_type_node, char_array_type_node, int_array_type_node; ++ ++extern int current_function_returns_value; ++extern int current_function_returns_null; ++ ++extern tree ridpointers[]; ++ ++/* Nonzero means `$' can be in an identifier. */ ++ ++extern int dollars_in_ident; ++ ++/* Nonzero means allow type mismatches in conditional expressions; ++ just make their values `void'. */ ++ ++extern int flag_cond_mismatch; ++ ++/* Nonzero means don't recognize the keyword `asm'. */ ++ ++extern int flag_no_asm; ++ ++/* Nonzero means warn about implicit declarations. */ ++ ++extern int warn_implicit; ++ ++/* Nonzero means warn about function definitions that default the return type ++ or that use a null return and have a return-type other than void. */ ++ ++extern int warn_return_type; ++ ++/* Nonzero means give string constants the type `const char *' ++ to get extra warnings from them. These warnings will be too numerous ++ to be useful, except in thoroughly ANSIfied programs. */ ++ ++extern int warn_write_strings; ++ ++/* Nonzero means warn about sizeof(function) or addition/subtraction ++ of function pointers. */ ++ ++extern int warn_pointer_arith; ++ ++/* Nonzero means warn for all old-style non-prototype function decls. */ ++ ++extern int warn_strict_prototypes; ++ ++/* Nonzero means warn about pointer casts that can drop a type qualifier ++ from the pointer target type. */ ++ ++extern int warn_cast_qual; ++ ++/* Nonzero means do some things the same way PCC does. */ ++ ++extern int flag_traditional; +diff -Naur alliance-5.0/genview/src/gcc-1.42/c-typeck.c alliance/genview/src/gcc-1.42/c-typeck.c +--- alliance-5.0/genview/src/gcc-1.42/c-typeck.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/c-typeck.c 2002-09-30 18:20:26.000000000 +0200 +@@ -0,0 +1,3846 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Build expressions with type checking for C compiler. ++ Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* This file is part of the C front end. ++ It contains routines to build C expressions given their operands, ++ including computing the types of the result, C-specific error checks, ++ and some optimization. ++ ++ There are also routines to build RETURN_STMT nodes and CASE_STMT nodes, ++ and to process initializations in declarations (since they work ++ like a strange sort of assignment). */ ++ ++#include "config.h" ++#include ++#include "tree.h" ++#include "c-tree.h" ++#include "flags.h" ++ ++ ++ ++int mark_addressable (); ++static tree convert_for_assignment (); ++static int compparms (); ++int comp_target_types (); ++static tree shorten_compare (); ++static void binary_op_error (); ++static tree pointer_int_sum (); ++static tree pointer_diff (); ++static tree convert_sequence (); ++static tree unary_complex_lvalue (); ++static tree process_init_constructor (); ++tree digest_init (); ++tree truthvalue_conversion (); ++static tree invert_truthvalue (); ++void incomplete_type_error (); ++void readonly_warning (); ++ ++/* Return the _TYPE node describing the data type ++ of the data which NODE represents as a C expression. ++ Arrays and functions are converted to pointers ++ just as they are when they appear as C expressions. */ ++ ++tree ++datatype (node) ++ tree node; ++{ ++ register tree type = TREE_TYPE (node); ++ if (TREE_CODE (type) == ARRAY_TYPE) ++ return TYPE_POINTER_TO (TREE_TYPE (type)); ++ if (TREE_CODE (type) == FUNCTION_TYPE) ++ return build_pointer_type (type); ++ return type; ++} ++ ++/* Do `exp = require_complete_type (exp);' to make sure exp ++ does not have an incomplete type. (That includes void types.) */ ++ ++tree ++require_complete_type (value) ++ tree value; ++{ ++ tree type = TREE_TYPE (value); ++ ++ /* First, detect a valid value with a complete type. */ ++ if (TYPE_SIZE (type) != 0 ++ && type != void_type_node) ++ return value; ++ ++ incomplete_type_error (value, type); ++ return error_mark_node; ++} ++ ++/* Print an error message for invalid use of an incomplete type. ++ VALUE is the expression that was used (or 0 if that isn't known) ++ and TYPE is the type that was invalid. */ ++ ++void ++incomplete_type_error (value, type) ++ tree value; ++ tree type; ++{ ++ char *errmsg; ++ ++ /* Avoid duplicate error message. */ ++ if (TREE_CODE (type) == ERROR_MARK) ++ return; ++ ++ if (value != 0 && (TREE_CODE (value) == VAR_DECL ++ || TREE_CODE (value) == PARM_DECL)) ++ error ("`%s' has an incomplete type", ++ IDENTIFIER_POINTER (DECL_NAME (value))); ++ else ++ { ++ retry: ++ /* We must print an error message. Be clever about what it says. */ ++ ++ switch (TREE_CODE (type)) ++ { ++ case RECORD_TYPE: ++ errmsg = "invalid use of undefined type `struct %s'"; ++ break; ++ ++ case UNION_TYPE: ++ errmsg = "invalid use of undefined type `union %s'"; ++ break; ++ ++ case ENUMERAL_TYPE: ++ errmsg = "invalid use of undefined type `enum %s'"; ++ break; ++ ++ case VOID_TYPE: ++ error ("invalid use of void expression"); ++ return; ++ ++ case ARRAY_TYPE: ++ if (TYPE_DOMAIN (type)) ++ { ++ type = TREE_TYPE (type); ++ goto retry; ++ } ++ error ("invalid use of array with unspecified bounds"); ++ return; ++ ++ default: ++ abort (); ++ } ++ ++ if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) ++ error (errmsg, IDENTIFIER_POINTER (TYPE_NAME (type))); ++ else ++ /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL. */ ++ error ("invalid use of incomplete typedef `%s'", ++ IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))); ++ } ++} ++ ++/* Return a variant of TYPE which has all the type qualifiers of LIKE ++ as well as those of TYPE. */ ++ ++static tree ++qualify_type (type, like) ++ tree type, like; ++{ ++ int constflag = TREE_READONLY (type) || TREE_READONLY (like); ++ int volflag = TREE_VOLATILE (type) || TREE_VOLATILE (like); ++ return c_build_type_variant (type, constflag, volflag); ++} ++ ++/* Return the common type of two types. ++ We assume that comptypes has already been done and returned 1; ++ if that isn't so, this may crash. ++ ++ This is the type for the result of most arithmetic operations ++ if the operands have the given two types. ++ ++ We do not deal with enumeral types here because they have already been ++ converted to integer types. */ ++ ++tree ++commontype (t1, t2) ++ tree t1, t2; ++{ ++ register enum tree_code form1; ++ register enum tree_code form2; ++ ++ /* Save time if the two types are the same. */ ++ ++ if (t1 == t2) return t1; ++ ++ /* If one type is nonsense, use the other. */ ++ if (t1 == error_mark_node) ++ return t2; ++ if (t2 == error_mark_node) ++ return t1; ++ ++ /* Treat an enum type as the unsigned integer type of the same width. */ ++ ++ if (TREE_CODE (t1) == ENUMERAL_TYPE) ++ t1 = type_for_size (TYPE_PRECISION (t1), 1); ++ if (TREE_CODE (t2) == ENUMERAL_TYPE) ++ t2 = type_for_size (TYPE_PRECISION (t2), 1); ++ ++ form1 = TREE_CODE (t1); ++ form2 = TREE_CODE (t2); ++ ++ switch (form1) ++ { ++ case INTEGER_TYPE: ++ case REAL_TYPE: ++ /* If only one is real, use it as the result. */ ++ ++ if (form1 == REAL_TYPE && form2 != REAL_TYPE) ++ return t1; ++ ++ if (form2 == REAL_TYPE && form1 != REAL_TYPE) ++ return t2; ++ ++ /* Both real or both integers; use the one with greater precision. */ ++ ++ if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2)) ++ return t1; ++ else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1)) ++ return t2; ++ ++ /* Same precision. Prefer longs to ints even when same size. */ ++ ++ if (t1 == long_unsigned_type_node ++ || t2 == long_unsigned_type_node) ++ return long_unsigned_type_node; ++ ++ if (t1 == long_integer_type_node ++ || t2 == long_integer_type_node) ++ { ++ /* But preserve unsignedness from the other type, ++ since long cannot hold all the values of an unsigned int. */ ++ if (TREE_UNSIGNED (t1) || TREE_UNSIGNED (t2)) ++ return long_unsigned_type_node; ++ return long_integer_type_node; ++ } ++ ++ /* Otherwise prefer the unsigned one. */ ++ ++ if (TREE_UNSIGNED (t1)) ++ return t1; ++ else return t2; ++ ++ case POINTER_TYPE: ++#if 0 ++ /* For two pointers, do this recursively on the target type, ++ and combine the qualifiers of the two types' targets. */ ++ { ++ tree target = commontype (TYPE_MAIN_VARIANT (TREE_TYPE (t1)), ++ TYPE_MAIN_VARIANT (TREE_TYPE (t2))); ++ int constp ++ = TREE_READ_ONLY (TREE_TYPE (t1)) || TREE_READ_ONLY (TREE_TYPE (t2)); ++ int volatilep ++ = TREE_VOLATILE (TREE_TYPE (t1)) || TREE_VOLATILE (TREE_TYPE (t2)); ++ return build_pointer_type (c_build_type_variant (target, constp, volatilep)); ++ } ++#endif ++ return build_pointer_type (commontype (TREE_TYPE (t1), TREE_TYPE (t2))); ++ ++ case ARRAY_TYPE: ++ { ++ tree elt = commontype (TREE_TYPE (t1), TREE_TYPE (t2)); ++ /* Save space: see if the result is identical to one of the args. */ ++ if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1)) ++ return t1; ++ if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2)) ++ return t2; ++ /* Merge the element types, and have a size if either arg has one. */ ++ return build_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2)); ++ } ++ ++ case FUNCTION_TYPE: ++ /* Function types: prefer the one that specified arg types. ++ If both do, merge the arg types. Also merge the return types. */ ++ { ++ tree valtype = commontype (TREE_TYPE (t1), TREE_TYPE (t2)); ++ tree p1 = TYPE_ARG_TYPES (t1); ++ tree p2 = TYPE_ARG_TYPES (t2); ++ int len; ++ tree newargs, n; ++ int i; ++ ++ /* Save space: see if the result is identical to one of the args. */ ++ if (valtype == TREE_TYPE (t1) && ! TYPE_ARG_TYPES (t2)) ++ return t1; ++ if (valtype == TREE_TYPE (t2) && ! TYPE_ARG_TYPES (t1)) ++ return t2; ++ ++ /* Simple way if one arg fails to specify argument types. */ ++ if (TYPE_ARG_TYPES (t1) == 0) ++ return build_function_type (valtype, TYPE_ARG_TYPES (t2)); ++ if (TYPE_ARG_TYPES (t2) == 0) ++ return build_function_type (valtype, TYPE_ARG_TYPES (t1)); ++ ++ /* If both args specify argument types, we must merge the two ++ lists, argument by argument. */ ++ ++ len = list_length (p1); ++ newargs = 0; ++ ++ for (i = 0; i < len; i++) ++ newargs = tree_cons (0, 0, newargs); ++ ++ n = newargs; ++ ++ for (; p1; ++ p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n)) ++ TREE_VALUE (n) = commontype (TREE_VALUE (p1), TREE_VALUE (p2)); ++ ++ return build_function_type (valtype, newargs); ++ } ++ ++ default: ++ return t1; ++ } ++ ++} ++ ++/* Return 1 if TYPE1 and TYPE2 are compatible types for assignment ++ or various other operations. This is what ANSI C speaks of as ++ "being the same". */ ++ ++int ++comptypes (type1, type2) ++ tree type1, type2; ++{ ++ register tree t1 = type1; ++ register tree t2 = type2; ++ ++ /* Suppress errors caused by previously reported errors */ ++ ++ if (t1 == t2 || TREE_CODE (t1) == ERROR_MARK || TREE_CODE (t2) == ERROR_MARK) ++ return 1; ++ ++ /* Treat an enum type as the unsigned integer type of the same width. */ ++ ++ if (TREE_CODE (t1) == ENUMERAL_TYPE) ++ t1 = type_for_size (TYPE_PRECISION (t1), 1); ++ if (TREE_CODE (t2) == ENUMERAL_TYPE) ++ t2 = type_for_size (TYPE_PRECISION (t2), 1); ++ ++ if (t1 == t2) ++ return 1; ++ ++ /* Different classes of types can't be compatible. */ ++ ++ if (TREE_CODE (t1) != TREE_CODE (t2)) return 0; ++ ++ /* Qualifiers must match. */ ++ ++ if (TREE_READONLY (t1) != TREE_READONLY (t2)) ++ return 0; ++ if (TREE_THIS_VOLATILE (t1) != TREE_THIS_VOLATILE (t2)) ++ return 0; ++ ++ switch (TREE_CODE (t1)) ++ { ++ case POINTER_TYPE: ++ return (TREE_TYPE (t1) == TREE_TYPE (t2) ++ || comptypes (TREE_TYPE (t1), TREE_TYPE (t2))); ++ ++ case FUNCTION_TYPE: ++ return ((TREE_TYPE (t1) == TREE_TYPE (t2) ++ || comptypes (TREE_TYPE (t1), TREE_TYPE (t2))) ++ && compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2))); ++ ++ case ARRAY_TYPE: ++ /* Target types must match incl. qualifiers. */ ++ if (!(TREE_TYPE (t1) == TREE_TYPE (t2) ++ || comptypes (TREE_TYPE (t1), TREE_TYPE (t2)))) ++ return 0; ++ { ++ tree d1 = TYPE_DOMAIN (t1); ++ tree d2 = TYPE_DOMAIN (t2); ++ ++ /* Sizes must match unless one is missing or variable. */ ++ if (d1 == 0 || d2 == 0 || d1 == d2 ++ || TREE_CODE (TYPE_MIN_VALUE (d1)) != INTEGER_CST ++ || TREE_CODE (TYPE_MIN_VALUE (d2)) != INTEGER_CST ++ || TREE_CODE (TYPE_MAX_VALUE (d1)) != INTEGER_CST ++ || TREE_CODE (TYPE_MAX_VALUE (d2)) != INTEGER_CST) ++ return 1; ++ ++ return ((TREE_INT_CST_LOW (TYPE_MIN_VALUE (d1)) ++ == TREE_INT_CST_LOW (TYPE_MIN_VALUE (d2))) ++ && (TREE_INT_CST_HIGH (TYPE_MIN_VALUE (d1)) ++ == TREE_INT_CST_HIGH (TYPE_MIN_VALUE (d2))) ++ && (TREE_INT_CST_LOW (TYPE_MAX_VALUE (d1)) ++ == TREE_INT_CST_LOW (TYPE_MAX_VALUE (d2))) ++ && (TREE_INT_CST_HIGH (TYPE_MAX_VALUE (d1)) ++ == TREE_INT_CST_HIGH (TYPE_MAX_VALUE (d2)))); ++ } ++ } ++ return 0; ++} ++ ++/* Return 1 if TTL and TTR are pointers to types that are equivalent, ++ ignoring their qualifiers. */ ++ ++int ++comp_target_types (ttl, ttr) ++ tree ttl, ttr; ++{ ++ return comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (ttl)), ++ TYPE_MAIN_VARIANT (TREE_TYPE (ttr))); ++} ++ ++/* Subroutines of `comptypes'. */ ++ ++/* Return 1 if two parameter type lists PARMS1 and PARMS2 ++ are equivalent in the sense that functions with those parameter types ++ can have equivalent types. ++ If either list is empty, we win. ++ Otherwise, the two lists must be equivalent, element by element. */ ++ ++static int ++compparms (parms1, parms2) ++ tree parms1, parms2; ++{ ++ register tree t1 = parms1, t2 = parms2; ++ ++ /* An unspecified parmlist matches any specified parmlist ++ whose argument types don't need default promotions. */ ++ ++ if (t1 == 0) ++ return compparms1 (t2); ++ if (t2 == 0) ++ return compparms1 (t1); ++ ++ while (1) ++ { ++ if (t1 == 0 && t2 == 0) ++ return 1; ++ /* If one parmlist is shorter than the other, ++ they fail to match. */ ++ if (t1 == 0 || t2 == 0) ++ return 0; ++ if (! comptypes (TREE_VALUE (t1), TREE_VALUE (t2))) ++ return 0; ++ t1 = TREE_CHAIN (t1); ++ t2 = TREE_CHAIN (t2); ++ } ++} ++ ++/* Return 1 if PARMS specifies a fixed number of parameters ++ and none of their types is affected by default promotions. */ ++ ++int ++compparms1 (parms) ++ tree parms; ++{ ++ register tree t; ++ for (t = parms; t; t = TREE_CHAIN (t)) ++ { ++ register tree type = TREE_VALUE (t); ++ ++ if (TREE_CHAIN (t) == 0 && type != void_type_node) ++ return 0; ++ ++ if (type == float_type_node) ++ return 0; ++ ++ if (TREE_CODE (type) == INTEGER_TYPE ++ && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) ++ return 0; ++ } ++ return 1; ++} ++ ++/* Return an unsigned type the same as TYPE in other respects. */ ++ ++tree ++unsigned_type (type) ++ tree type; ++{ ++ if (type == signed_char_type_node || type == char_type_node) ++ return unsigned_char_type_node; ++ if (type == integer_type_node) ++ return unsigned_type_node; ++ if (type == short_integer_type_node) ++ return short_unsigned_type_node; ++ if (type == long_integer_type_node) ++ return long_unsigned_type_node; ++ if (type == long_long_integer_type_node) ++ return long_long_unsigned_type_node; ++ return type; ++} ++ ++/* Return a signed type the same as TYPE in other respects. */ ++ ++tree ++signed_type (type) ++ tree type; ++{ ++ if (type == unsigned_char_type_node || type == char_type_node) ++ return signed_char_type_node; ++ if (type == unsigned_type_node) ++ return integer_type_node; ++ if (type == short_unsigned_type_node) ++ return short_integer_type_node; ++ if (type == long_unsigned_type_node) ++ return long_integer_type_node; ++ if (type == long_long_unsigned_type_node) ++ return long_long_integer_type_node; ++ return type; ++} ++ ++/* Return a type the same as TYPE except unsigned or ++ signed according to UNSIGNEDP. */ ++ ++tree ++signed_or_unsigned_type (unsignedp, type) ++ int unsignedp; ++ tree type; ++{ ++ if (TREE_CODE (type) != INTEGER_TYPE) ++ return type; ++ if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node)) ++ return unsignedp ? unsigned_char_type_node : signed_char_type_node; ++ if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)) ++ return unsignedp ? unsigned_type_node : integer_type_node; ++ if (TYPE_PRECISION (type) == TYPE_PRECISION (short_integer_type_node)) ++ return unsignedp ? short_unsigned_type_node : short_integer_type_node; ++ if (TYPE_PRECISION (type) == TYPE_PRECISION (long_integer_type_node)) ++ return unsignedp ? long_unsigned_type_node : long_integer_type_node; ++ if (TYPE_PRECISION (type) == TYPE_PRECISION (long_long_integer_type_node)) ++ return (unsignedp ? long_long_unsigned_type_node ++ : long_long_integer_type_node); ++ return type; ++} ++ ++/* Return an integer type with BITS bits of precision, ++ that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */ ++ ++tree ++type_for_size (bits, unsignedp) ++ int bits; ++ int unsignedp; ++{ ++ if (bits <= TYPE_PRECISION (signed_char_type_node)) ++ return unsignedp ? unsigned_char_type_node : signed_char_type_node; ++ ++ if (bits <= TYPE_PRECISION (short_integer_type_node)) ++ return unsignedp ? short_unsigned_type_node : short_integer_type_node; ++ ++ if (bits <= TYPE_PRECISION (integer_type_node)) ++ return unsignedp ? unsigned_type_node : integer_type_node; ++ ++ if (bits <= TYPE_PRECISION (long_integer_type_node)) ++ return unsignedp ? long_unsigned_type_node : long_integer_type_node; ++ ++ if (bits <= TYPE_PRECISION (long_long_integer_type_node)) ++ return (unsignedp ? long_long_unsigned_type_node ++ : long_long_integer_type_node); ++ ++ return 0; ++} ++ ++tree ++get_floating_type (mode) ++ enum machine_mode mode; ++{ ++ if (mode == TYPE_MODE (float_type_node)) ++ return float_type_node; ++ if (mode == TYPE_MODE (double_type_node)) ++ return double_type_node; ++ if (mode == TYPE_MODE (long_double_type_node)) ++ return long_double_type_node; ++ abort (); ++} ++ ++tree ++c_sizeof (type) ++ tree type; ++{ ++ enum tree_code code = TREE_CODE (type); ++ ++ if (code == FUNCTION_TYPE) ++ { ++ if (pedantic || warn_pointer_arith) ++ warning ("sizeof applied to a function type"); ++ return build_int (1); ++ } ++ if (code == VOID_TYPE) ++ { ++ if (pedantic || warn_pointer_arith) ++ warning ("sizeof applied to a void type"); ++ return build_int (1); ++ } ++ ++ /* Convert in case a char is more than one unit. */ ++ return convert_units (size_in_bytes (type), BITS_PER_UNIT, ++ TYPE_PRECISION (char_type_node)); ++} ++ ++tree ++c_sizeof_nowarn (type) ++ tree type; ++{ ++ enum tree_code code = TREE_CODE (type); ++ ++ if (code == FUNCTION_TYPE ++ || code == VOID_TYPE) ++ return build_int (1); ++ ++ /* Convert in case a char is more than one unit. */ ++ return convert_units (size_in_bytes (type), BITS_PER_UNIT, ++ TYPE_PRECISION (char_type_node)); ++} ++ ++/* Implement the __alignof keyword: Return the minimum required ++ alignment of TYPE, measured in bytes. */ ++ ++tree ++c_alignof (type) ++ tree type; ++{ ++ enum tree_code code = TREE_CODE (type); ++ ++ if (code == FUNCTION_TYPE) ++ return build_int (FUNCTION_BOUNDARY / BITS_PER_UNIT); ++ ++ if (code == VOID_TYPE) ++ return build_int (1); ++ ++ return build_int (TYPE_ALIGN (type) / BITS_PER_UNIT); ++} ++ ++/* Return either DECL or its known constant value (if it has one). */ ++ ++static tree ++decl_constant_value (decl) ++ tree decl; ++{ ++ if (! TREE_PUBLIC (decl) ++ /* Don't change a variable array bound or initial value to a constant ++ in a place where a variable is invalid. */ ++ && current_function_decl != 0 ++ && ! pedantic ++ && ! TREE_THIS_VOLATILE (decl) ++ && DECL_INITIAL (decl) != 0 ++ && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK ++ /* This is invalid if initial value is not constant. ++ If it has either a function call, a memory reference, ++ or a variable, then re-evaluating it could give different results. */ ++ && TREE_LITERAL (DECL_INITIAL (decl)) ++ /* Check for cases where this is sub-optimal, even though valid. */ ++ && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR ++ && DECL_MODE (decl) != BLKmode) ++ return DECL_INITIAL (decl); ++ return decl; ++} ++ ++/* Perform default promotions for C data used in expressions. ++ Arrays and functions are converted to pointers; ++ enumeral types or short or char, to int. ++ In addition, manifest constants symbols are replaced by their values. */ ++ ++tree ++default_conversion (exp) ++ tree exp; ++{ ++ register tree dt = TREE_TYPE (exp); ++ register enum tree_code form = TREE_CODE (dt); ++ ++ if (TREE_CODE (exp) == CONST_DECL) ++ exp = DECL_INITIAL (exp); ++ /* Replace a nonvolatile const static variable with its value. */ ++ else if (optimize ++ && TREE_CODE (exp) == VAR_DECL ++ && TREE_READONLY (exp)) ++ exp = decl_constant_value (exp); ++ ++ /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. ++ Strip such NOP_EXPRs, since EXP is being used in non-lvalue context. */ ++ if (TREE_CODE (exp) == NOP_EXPR ++ && TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0))) ++ exp = TREE_OPERAND (exp, 0); ++ ++ if (form == ENUMERAL_TYPE ++ || (form == INTEGER_TYPE ++ && (TYPE_PRECISION (dt) ++ < TYPE_PRECISION (integer_type_node)))) ++ { ++ /* Traditionally, unsignedness is preserved in default promotions. */ ++ if (flag_traditional && TREE_UNSIGNED (dt)) ++ return convert (unsigned_type_node, exp); ++ return convert (integer_type_node, exp); ++ } ++ if (flag_traditional && dt == float_type_node) ++ return convert (double_type_node, exp); ++ if (form == VOID_TYPE) ++ { ++ error ("void value not ignored as it ought to be"); ++ return error_mark_node; ++ } ++ if (form == FUNCTION_TYPE) ++ { ++ return build_unary_op (ADDR_EXPR, exp, 0); ++ } ++ if (form == ARRAY_TYPE) ++ { ++ register tree adr; ++ tree restype = TREE_TYPE (dt); ++ tree ptrtype; ++ ++ if (TREE_CODE (exp) == INDIRECT_REF) ++ return convert (TYPE_POINTER_TO (restype), ++ TREE_OPERAND (exp, 0)); ++ ++ if (TREE_CODE (exp) == COMPOUND_EXPR) ++ { ++ tree op1 = default_conversion (TREE_OPERAND (exp, 1)); ++ return build (COMPOUND_EXPR, TREE_TYPE (op1), ++ TREE_OPERAND (exp, 0), op1); ++ } ++ ++ if (!lvalue_p (exp) ++ && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp))) ++ { ++ error ("invalid use of non-lvalue array"); ++ return error_mark_node; ++ } ++ ++ if (TREE_READONLY (exp) || TREE_THIS_VOLATILE (exp)) ++ restype = c_build_type_variant (restype, TREE_READONLY (exp), ++ TREE_THIS_VOLATILE (exp)); ++ ++ ptrtype = build_pointer_type (restype); ++ ++ if (TREE_CODE (exp) == VAR_DECL) ++ { ++ /* ??? This is not really quite correct ++ in that the type of the operand of ADDR_EXPR ++ is not the target type of the type of the ADDR_EXPR itself. ++ Question is, can this lossage be avoided? */ ++ adr = build (ADDR_EXPR, ptrtype, exp); ++ if (mark_addressable (exp) == 0) ++ return error_mark_node; ++ TREE_LITERAL (adr) = staticp (exp); ++ TREE_VOLATILE (adr) = 0; /* Default would be, same as EXP. */ ++ return adr; ++ } ++ /* This way is better for a COMPONENT_REF since it can ++ simplify the offset for a component. */ ++ adr = build_unary_op (ADDR_EXPR, exp, 1); ++ return convert (ptrtype, adr); ++ } ++ return exp; ++} ++ ++/* Make an expression to refer to the COMPONENT field of ++ structure or union value DATUM. COMPONENT is an IDENTIFIER_NODE. */ ++ ++tree ++build_component_ref (datum, component) ++ tree datum, component; ++{ ++ register tree basename = datum; ++ register tree basetype = TREE_TYPE (basename); ++ register enum tree_code form = TREE_CODE (basetype); ++ register tree field = NULL; ++ register tree ref; ++ ++ /* First, see if there is a field or component with name COMPONENT. */ ++ ++ if (form == RECORD_TYPE || form == UNION_TYPE) ++ { ++ if (TYPE_SIZE (basetype) == 0) ++ { ++ incomplete_type_error (0, basetype); ++ return error_mark_node; ++ } ++ ++ /* Look up component name in the structure type definition. */ ++ ++ for (field = TYPE_FIELDS (basetype); field; field = TREE_CHAIN (field)) ++ { ++ if (DECL_NAME (field) == component) ++ break; ++ } ++ ++ if (!field) ++ { ++ error (form == RECORD_TYPE ++ ? "structure has no member named `%s'" ++ : "union has no member named `%s'", ++ IDENTIFIER_POINTER (component)); ++ return error_mark_node; ++ } ++ if (TREE_TYPE (field) == error_mark_node) ++ return error_mark_node; ++ ++ ref = build (COMPONENT_REF, TREE_TYPE (field), basename, field); ++ ++ if (TREE_READONLY (basename) || TREE_READONLY (field)) ++ TREE_READONLY (ref) = 1; ++ if (TREE_THIS_VOLATILE (basename) || TREE_VOLATILE (field)) ++ TREE_THIS_VOLATILE (ref) = 1; ++ ++ return ref; ++ } ++ else if (form != ERROR_MARK) ++ error ("request for member `%s' in something not a structure or union", ++ IDENTIFIER_POINTER (component)); ++ ++ return error_mark_node; ++} ++ ++/* Given an expression PTR for a pointer, return an expression ++ for the value pointed to. ++ ERRORSTRING is the name of the operator to appear in error messages. */ ++ ++tree ++build_indirect_ref (ptr, errorstring) ++ tree ptr; ++ char *errorstring; ++{ ++ register tree pointer = default_conversion (ptr); ++ register tree dt = TREE_TYPE (pointer); ++ ++ if (TREE_CODE (dt) == POINTER_TYPE) ++ if (TREE_CODE (pointer) == ADDR_EXPR ++ && (TREE_TYPE (TREE_OPERAND (pointer, 0)) ++ == TREE_TYPE (dt))) ++ return TREE_OPERAND (pointer, 0); ++ else ++ { ++ tree t = TREE_TYPE (dt); ++ register tree ref = build (INDIRECT_REF, ++ TYPE_MAIN_VARIANT (t), pointer); ++ ++ if (TREE_CODE (t) == VOID_TYPE ++ || (TYPE_SIZE (t) == 0 && TREE_CODE (t) != ARRAY_TYPE)) ++ { ++ error ("dereferencing pointer to incomplete type"); ++ return error_mark_node; ++ } ++ ++ TREE_READONLY (ref) = TREE_READONLY (t); ++ TREE_VOLATILE (ref) = TREE_VOLATILE (t) || TREE_VOLATILE (pointer); ++ TREE_THIS_VOLATILE (ref) = TREE_VOLATILE (t); ++ return ref; ++ } ++ else if (TREE_CODE (pointer) != ERROR_MARK) ++ error ("invalid type argument of `%s'", errorstring); ++ return error_mark_node; ++} ++ ++/* This handles expressions of the form "a[i]", which denotes ++ an array reference. ++ ++ This is logically equivalent in C to *(a+i), but we may do it differently. ++ If A is a variable or a member, we generate a primitive ARRAY_REF. ++ This avoids forcing the array out of registers, and can work on ++ arrays that are not lvalues (for example, members of structures returned ++ by functions). */ ++ ++tree ++build_array_ref (array, index) ++ tree array, index; ++{ ++ if (index == 0) ++ { ++ error ("subscript missing in array reference"); ++ return error_mark_node; ++ } ++ ++ if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE ++ && TREE_CODE (array) != INDIRECT_REF) ++ { ++ tree rval, type; ++ ++ index = default_conversion (index); ++ if (index != error_mark_node ++ && TREE_CODE (TREE_TYPE (index)) != INTEGER_TYPE) ++ { ++ error ("array subscript is not an integer"); ++ return error_mark_node; ++ } ++ ++ /* An array that is indexed by a non-constant ++ cannot be stored in a register; we must be able to do ++ address arithmetic on its address. ++ Likewise an array of elements of variable size. */ ++ if (TREE_CODE (index) != INTEGER_CST ++ || (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))) != 0 ++ && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array)))) != INTEGER_CST)) ++ { ++ if (mark_addressable (array) == 0) ++ return error_mark_node; ++ } ++ ++ if (pedantic && !lvalue_p (array)) ++ warning ("ANSI C forbids subscripting non-lvalue array"); ++ ++ if (pedantic) ++ { ++ tree foo = array; ++ while (TREE_CODE (foo) == COMPONENT_REF) ++ foo = TREE_OPERAND (foo, 0); ++ if (TREE_CODE (foo) == VAR_DECL && TREE_REGDECL (foo)) ++ warning ("ANSI C forbids subscripting non-lvalue array"); ++ } ++ ++ type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (array))); ++ rval = build (ARRAY_REF, type, array, index); ++ /* Array ref is const/volatile if the array elements are, ++ or if the array object is. */ ++ TREE_READONLY (rval) ++ |= (TREE_READONLY (TREE_TYPE (TREE_TYPE (array))) ++ | TREE_READONLY (array)); ++ TREE_VOLATILE (rval) ++ |= (TREE_VOLATILE (TREE_TYPE (TREE_TYPE (array))) ++ | TREE_VOLATILE (array)); ++ TREE_THIS_VOLATILE (rval) ++ |= TREE_VOLATILE (TREE_TYPE (TREE_TYPE (array))); ++ return require_complete_type (fold (rval)); ++ } ++ ++ { ++ tree ar = default_conversion (array); ++ tree ind = default_conversion (index); ++ ++ /* Put the integer in IND to simplify error checking. */ ++ if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE) ++ { ++ tree temp = ar; ++ ar = ind; ++ ind = temp; ++ } ++ ++ if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE) ++ { ++ error ("subscripted value is neither array nor pointer"); ++ return error_mark_node; ++ } ++ if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE) ++ { ++ error ("array subscript is not an integer"); ++ return error_mark_node; ++ } ++ ++ return build_indirect_ref (build_binary_op_nodefault (PLUS_EXPR, ar, ind, PLUS_EXPR), ++ "array indexing"); ++ } ++} ++ ++/* Build a function call to function FUNCTION with parameters PARAMS. ++ PARAMS is a list--a chain of TREE_LIST nodes--in which the ++ TREE_VALUE of each node is a parameter-expression. ++ FUNCTION's data type may be a function type or a pointer-to-function. */ ++ ++tree ++build_function_call (function, params) ++ tree function, params; ++{ ++ register tree fntype; ++ register tree value_type; ++ register tree coerced_params; ++ tree name = NULL_TREE; ++ tree actualparameterlist (); ++ ++ /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. ++ Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context. */ ++ if (TREE_CODE (function) == NOP_EXPR ++ && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0))) ++ function = TREE_OPERAND (function, 0); ++ ++ /* Convert anything with function type to a pointer-to-function. */ ++ if (TREE_CODE (function) == FUNCTION_DECL) ++ { ++ name = DECL_NAME (function); ++ /* Differs from default_conversion by not setting TREE_ADDRESSABLE ++ (because calling an inline function does not mean the function ++ needs to be separately compiled). */ ++ function = build (ADDR_EXPR, build_pointer_type (TREE_TYPE (function)), ++ function); ++ } ++ else ++ function = default_conversion (function); ++ ++ fntype = TREE_TYPE (function); ++ ++ if (TREE_CODE (fntype) == ERROR_MARK) ++ return error_mark_node; ++ ++ if (!(TREE_CODE (fntype) == POINTER_TYPE ++ && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE)) ++ { ++ error ("called object is not a function"); ++ return error_mark_node; ++ } ++ ++ /* fntype now gets the type of function pointed to. */ ++ fntype = TREE_TYPE (fntype); ++ ++ /* Convert the parameters to the types declared in the ++ function prototype, or apply default promotions. */ ++ ++ coerced_params = actualparameterlist (TYPE_ARG_TYPES (fntype), params, name); ++ ++ /* Recognize certain built-in functions so we can make tree-codes ++ other than CALL_EXPR. We do this when it enables fold-const.c ++ to do something useful. */ ++ ++ if (TREE_CODE (function) == ADDR_EXPR ++ && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL) ++ switch (DECL_FUNCTION_CODE (TREE_OPERAND (function, 0))) ++ { ++ case BUILT_IN_ABS: ++ case BUILT_IN_LABS: ++ case BUILT_IN_FABS: ++ if (coerced_params == 0) ++ return integer_zero_node; ++ return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0); ++ } ++ ++ value_type = TREE_TYPE (fntype) ? TREE_TYPE (fntype) : void_type_node; ++ ++ { ++ register tree result = ++ build (CALL_EXPR, value_type, function, coerced_params, NULL_TREE); ++ ++ TREE_VOLATILE (result) = 1; ++ if (value_type == void_type_node) ++ return result; ++ return require_complete_type (result); ++ } ++} ++ ++/* Convert the actual parameter expressions in the list VALUES ++ to the types in the list TYPELIST. ++ If parmdecls is exhausted, or when an element has NULL as its type, ++ perform the default conversions. ++ ++ NAME is an IDENTIFIER_NODE or 0. It is used only for error messages. ++ ++ This is also where warnings about wrong number of args are generated. ++ ++ Return a list of expressions for the parameters as converted. ++ ++ Both VALUES and the returned value are chains of TREE_LIST nodes ++ with the elements of the list in the TREE_VALUE slots of those nodes. */ ++ ++tree ++actualparameterlist (typelist, values, name) ++ tree typelist, values, name; ++{ ++ register tree typetail, valtail; ++ register tree result = NULL; ++ ++ for (valtail = values, typetail = typelist; ++ valtail; ++ valtail = TREE_CHAIN (valtail)) ++ { ++ register tree type = typetail ? TREE_VALUE (typetail) : 0; ++ register tree val = TREE_VALUE (valtail); ++ register tree parm; ++ ++ if (type == void_type_node) ++ { ++ if (name) ++ error ("too many arguments to function `%s'", ++ IDENTIFIER_POINTER (name)); ++ else ++ error ("too many arguments to function"); ++ break; ++ } ++ ++ /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. ++ Strip such NOP_EXPRs, since VAL is used in non-lvalue context. */ ++ if (TREE_CODE (val) == NOP_EXPR ++ && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))) ++ val = TREE_OPERAND (val, 0); ++ ++ if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE ++ || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE) ++ val = default_conversion (val); ++ ++ val = require_complete_type (val); ++ ++ if (type != 0) ++ { ++ /* Formal parm type is specified by a function prototype. */ ++ tree parmval; ++ ++ if (TYPE_SIZE (type) == 0) ++ { ++ error ("parameter type of called function is incomplete"); ++ parmval = val; ++ } ++ else ++ { ++#ifdef PROMOTE_PROTOTYPES ++ /* Rather than truncating and then reextending, ++ convert directly to int, if that's the type we will want. */ ++ if (! flag_traditional ++ && TREE_CODE (type) == INTEGER_TYPE ++ && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))) ++ type = integer_type_node; ++#endif ++ parmval = convert_for_assignment (type, val, "argument passing"); ++#ifdef PROMOTE_PROTOTYPES ++ if (TREE_CODE (type) == INTEGER_TYPE ++ && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))) ++ parmval = default_conversion (parmval); ++#endif ++ } ++ parm = build_tree_list (0, parmval); ++ } ++ else if (TREE_CODE (TREE_TYPE (val)) == REAL_TYPE ++ && (TYPE_PRECISION (TREE_TYPE (val)) ++ < TYPE_PRECISION (double_type_node))) ++ /* Convert `float' to `double'. */ ++ parm = build_tree_list (NULL_TREE, convert (double_type_node, val)); ++ else ++ /* Convert `short' and `char' to full-size `int'. */ ++ parm = build_tree_list (NULL_TREE, default_conversion (val)); ++ ++ result = chainon (result, parm); ++ if (typetail) ++ typetail = TREE_CHAIN (typetail); ++ } ++ ++ if (typetail != 0 && TREE_VALUE (typetail) != void_type_node) ++ { ++ if (name) ++ error ("too few arguments to function `%s'", ++ IDENTIFIER_POINTER (name)); ++ else ++ error ("too few arguments to function"); ++ } ++ ++ return result; ++} ++ ++/* Build a binary-operation expression, after performing default ++ conversions on the operands. CODE is the kind of expression to build. */ ++ ++tree ++build_binary_op (code, arg1, arg2) ++ enum tree_code code; ++ tree arg1, arg2; ++{ ++ return build_binary_op_nodefault (code, default_conversion (arg1), ++ default_conversion (arg2), code); ++} ++ ++/* Build a binary-operation expression without default conversions. ++ CODE is the kind of expression to build. ++ This function differs from `build' in several ways: ++ the data type of the result is computed and recorded in it, ++ warnings are generated if arg data types are invalid, ++ special handling for addition and subtraction of pointers is known, ++ and some optimization is done (operations on narrow ints ++ are done in the narrower type when that gives the same result). ++ Constant folding is also done before the result is returned. ++ ++ ERROR_CODE is the code that determines what to say in error messages. ++ It is usually, but not always, the same as CODE. ++ ++ Note that the operands will never have enumeral types ++ because either they have just had the default conversions performed ++ or they have both just been converted to some other type in which ++ the arithmetic is to be done. */ ++ ++tree ++build_binary_op_nodefault (code, op0, op1, error_code) ++ enum tree_code code; ++ tree op0, op1; ++ enum tree_code error_code; ++{ ++ tree dt0 = datatype (op0), dt1 = datatype (op1); ++ ++ /* The expression codes of the data types of the arguments tell us ++ whether the arguments are integers, floating, pointers, etc. */ ++ register enum tree_code code0 = TREE_CODE (dt0); ++ register enum tree_code code1 = TREE_CODE (dt1); ++ ++ /* Expression code to give to the expression when it is built. ++ Normally this is CODE, which is what the caller asked for, ++ but in some special cases we change it. */ ++ register enum tree_code resultcode = code; ++ ++ /* Data type in which the computation is to be performed. ++ In the simplest cases this is the common type of the arguments. */ ++ register tree result_type = NULL; ++ ++ /* Nonzero means operands have already been type-converted ++ in whatever way is necessary. ++ Zero means they need to be converted to RESULT_TYPE. */ ++ int converted = 0; ++ ++ /* Nonzero means after finally constructing the expression ++ give it this type. Otherwise, give it type RESULT_TYPE. */ ++ tree final_type = 0; ++ ++ /* Nonzero if this is an operation like MIN or MAX which can ++ safely be computed in short if both args are promoted shorts. ++ Also implies COMMON. ++ -1 indicates a bitwise operation; this makes a difference ++ in the exact conditions for when it is safe to do the operation ++ in a narrower mode. */ ++ int shorten = 0; ++ ++ /* Nonzero if this is a comparison operation; ++ if both args are promoted shorts, compare the original shorts. ++ Also implies COMMON. */ ++ int short_compare = 0; ++ ++ /* Nonzero if this is a right-shift operation, which can be computed on the ++ original short and then promoted if the operand is a promoted short. */ ++ int short_shift = 0; ++ ++ /* Nonzero means set RESULT_TYPE to the common type of the args. */ ++ int common = 0; ++ ++ /* If an error was already reported for one of the arguments, ++ avoid reporting another error. */ ++ ++ if (code0 == ERROR_MARK || code1 == ERROR_MARK) ++ return error_mark_node; ++ ++ switch (code) ++ { ++ case PLUS_EXPR: ++ /* Handle the pointer + int case. */ ++ if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) ++ return pointer_int_sum (PLUS_EXPR, op0, op1); ++ else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE) ++ return pointer_int_sum (PLUS_EXPR, op1, op0); ++ else ++ common = 1; ++ break; ++ ++ case MINUS_EXPR: ++ /* Subtraction of two similar pointers. ++ We must subtract them as integers, then divide by object size. */ ++ if (code0 == POINTER_TYPE && code1 == POINTER_TYPE ++ && comp_target_types (dt0, dt1)) ++ return pointer_diff (op0, op1); ++ /* Handle pointer minus int. Just like pointer plus int. */ ++ else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) ++ return pointer_int_sum (MINUS_EXPR, op0, op1); ++ else ++ common = 1; ++ break; ++ ++ case MULT_EXPR: ++ common = 1; ++ break; ++ ++ case TRUNC_DIV_EXPR: ++ case CEIL_DIV_EXPR: ++ case FLOOR_DIV_EXPR: ++ case ROUND_DIV_EXPR: ++ case EXACT_DIV_EXPR: ++ if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) ++ && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) ++ { ++ if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)) ++ resultcode = RDIV_EXPR; ++ else ++ /* When dividing two signed integers, you have to promote to int. ++ E.g. (short) -32868 / (short) -1 doesn't fit in a short. */ ++ shorten = TREE_UNSIGNED (dt0); ++ common = 1; ++ } ++ break; ++ ++ case BIT_AND_EXPR: ++ case BIT_ANDTC_EXPR: ++ case BIT_IOR_EXPR: ++ case BIT_XOR_EXPR: ++ if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) ++ shorten = -1; ++ /* If one operand is a constant, and the other is a short type ++ that has been converted to an int, ++ really do the work in the short type and then convert the ++ result to int. If we are lucky, the constant will be 0 or 1 ++ in the short type, making the entire operation go away. */ ++ if (TREE_CODE (op0) == INTEGER_CST ++ && TREE_CODE (op1) == NOP_EXPR ++ && TYPE_PRECISION (dt1) > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op1, 0))) ++ && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op1, 0)))) ++ { ++ final_type = result_type; ++ op1 = TREE_OPERAND (op1, 0); ++ result_type = TREE_TYPE (op1); ++ } ++ if (TREE_CODE (op1) == INTEGER_CST ++ && TREE_CODE (op0) == NOP_EXPR ++ && TYPE_PRECISION (dt0) > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op0, 0))) ++ && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0)))) ++ { ++ final_type = result_type; ++ op0 = TREE_OPERAND (op0, 0); ++ result_type = TREE_TYPE (op0); ++ } ++ break; ++ ++ case TRUNC_MOD_EXPR: ++ if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) ++ shorten = 1; ++ break; ++ ++ case TRUTH_ANDIF_EXPR: ++ case TRUTH_ORIF_EXPR: ++ case TRUTH_AND_EXPR: ++ case TRUTH_OR_EXPR: ++ if ((code0 == INTEGER_TYPE || code0 == POINTER_TYPE || code0 == REAL_TYPE) ++ && (code1 == INTEGER_TYPE || code1 == POINTER_TYPE || code1 == REAL_TYPE)) ++ { ++ /* Result of these operations is always an int, ++ but that does not mean the operands should be ++ converted to ints! */ ++ result_type = integer_type_node; ++ op0 = truthvalue_conversion (op0); ++ op1 = truthvalue_conversion (op1); ++ converted = 1; ++ } ++ break; ++ ++ /* Shift operations: result has same type as first operand; ++ always convert second operand to int. ++ Also set SHORT_SHIFT if shifting rightward. */ ++ ++ case RSHIFT_EXPR: ++ if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) ++ { ++ result_type = dt0; ++ if (TREE_CODE (op1) == INTEGER_CST ++ && TREE_INT_CST_LOW (op1) > 0) ++ short_shift = 1; ++ /* Convert the shift-count to an integer, regardless of ++ size of value being shifted. */ ++ if (TREE_TYPE (op1) != integer_type_node) ++ op1 = convert (integer_type_node, op1); ++ } ++ break; ++ ++ case LSHIFT_EXPR: ++ if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) ++ { ++ result_type = dt0; ++ if (TREE_CODE (op1) == INTEGER_CST ++ && TREE_INT_CST_LOW (op1) < 0) ++ short_shift = 1; ++ /* Convert the shift-count to an integer, regardless of ++ size of value being shifted. */ ++ if (TREE_TYPE (op1) != integer_type_node) ++ op1 = convert (integer_type_node, op1); ++ } ++ break; ++ ++ case RROTATE_EXPR: ++ case LROTATE_EXPR: ++ if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) ++ { ++ result_type = dt0; ++ /* Convert the shift-count to an integer, regardless of ++ size of value being shifted. */ ++ if (TREE_TYPE (op1) != integer_type_node) ++ op1 = convert (integer_type_node, op1); ++ } ++ break; ++ ++ case EQ_EXPR: ++ case NE_EXPR: ++ /* Result of comparison is always int, ++ but don't convert the args to int! */ ++ result_type = integer_type_node; ++ converted = 1; ++ if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) ++ && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) ++ short_compare = 1; ++ else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE) ++ { ++ register tree tt0 = TREE_TYPE (dt0); ++ register tree tt1 = TREE_TYPE (dt1); ++ /* Anything compares with void *. void * compares with anything. ++ Otherwise, the targets must be the same. */ ++ if (comp_target_types (dt0, dt1)) ++ ; ++ else if (TYPE_MAIN_VARIANT (tt0) == void_type_node) ++ { ++ if (pedantic && TREE_CODE (tt1) == FUNCTION_TYPE) ++ warning ("ANSI C forbids comparison of `void *' with function pointer"); ++ } ++ else if (TYPE_MAIN_VARIANT (tt1) == void_type_node) ++ { ++ if (pedantic && TREE_CODE (tt0) == FUNCTION_TYPE) ++ warning ("ANSI C forbids comparison of `void *' with function pointer"); ++ } ++ else ++ warning ("comparison of distinct pointer types lacks a cast"); ++ } ++ else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST ++ && integer_zerop (op1)) ++ op1 = null_pointer_node; ++ else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST ++ && integer_zerop (op0)) ++ op0 = null_pointer_node; ++ else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) ++ { ++ if (! flag_traditional) ++ warning ("comparison between pointer and integer"); ++ op1 = convert (TREE_TYPE (op0), op1); ++ } ++ else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE) ++ { ++ if (! flag_traditional) ++ warning ("comparison between pointer and integer"); ++ op0 = convert (TREE_TYPE (op1), op0); ++ } ++ else ++ /* If args are not valid, clear out RESULT_TYPE ++ to cause an error message later. */ ++ result_type = 0; ++ break; ++ ++ case MAX_EXPR: ++ case MIN_EXPR: ++ if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) ++ && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) ++ shorten = 1; ++ else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE) ++ { ++ if (! comp_target_types (dt0, dt1)) ++ warning ("comparison of distinct pointer types lacks a cast"); ++ else if (pedantic ++ && TREE_CODE (TREE_TYPE (dt0)) == FUNCTION_TYPE) ++ warning ("ANSI C forbids ordered comparisons of pointers to functions"); ++ result_type = commontype (dt0, dt1); ++ } ++ break; ++ ++ case LE_EXPR: ++ case GE_EXPR: ++ case LT_EXPR: ++ case GT_EXPR: ++ if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) ++ && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) ++ short_compare = 1; ++ else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE) ++ { ++ if (! comp_target_types (dt0, dt1)) ++ warning ("comparison of distinct pointer types lacks a cast"); ++ else if (pedantic ++ && TREE_CODE (TREE_TYPE (dt0)) == FUNCTION_TYPE) ++ warning ("ANSI C forbids ordered comparisons of pointers to functions"); ++ result_type = integer_type_node; ++ } ++ else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST ++ && integer_zerop (op1)) ++ { ++ result_type = integer_type_node; ++ op1 = null_pointer_node; ++ if (! flag_traditional) ++ warning ("ordered comparison of pointer with integer zero"); ++ } ++ else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST ++ && integer_zerop (op0)) ++ { ++ result_type = integer_type_node; ++ op0 = null_pointer_node; ++ if (pedantic) ++ warning ("ordered comparison of pointer with integer zero"); ++ } ++ else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) ++ { ++ result_type = integer_type_node; ++ if (! flag_traditional) ++ warning ("comparison between pointer and integer"); ++ op1 = convert (TREE_TYPE (op0), op1); ++ } ++ else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE) ++ { ++ result_type = integer_type_node; ++ if (! flag_traditional) ++ warning ("comparison between pointer and integer"); ++ op0 = convert (TREE_TYPE (op1), op0); ++ } ++ converted = 1; ++ break; ++ } ++ ++ if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) ++ && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) ++ { ++ if (shorten || common || short_compare) ++ result_type = commontype (dt0, dt1); ++ ++ /* For certain operations (which identify themselves by shorten != 0) ++ if both args were extended from the same smaller type, ++ do the arithmetic in that type and then extend. ++ ++ shorten !=0 and !=1 indicates a bitwise operation. ++ For them, this optimization is safe only if ++ both args are zero-extended or both are sign-extended. ++ Otherwise, we might change the result. ++ Eg, (short)-1 | (unsigned short)-1 is (int)-1 ++ but calculated in (unsigned short) it would be (unsigned short)-1. */ ++ ++ if (shorten) ++ { ++ int unsigned0, unsigned1; ++ tree arg0 = get_narrower (op0, &unsigned0); ++ tree arg1 = get_narrower (op1, &unsigned1); ++ /* UNS is 1 if the operation to be done is an unsigned one. */ ++ int uns = TREE_UNSIGNED (result_type); ++ tree type; ++ ++ final_type = result_type; ++ ++ /* Handle the case that OP0 does not *contain* a conversion ++ but it *requires* conversion to FINAL_TYPE. */ ++ ++ if (op0 == arg0 && TREE_TYPE (op0) != final_type) ++ unsigned0 = TREE_UNSIGNED (TREE_TYPE (op0)); ++ if (op1 == arg1 && TREE_TYPE (op1) != final_type) ++ unsigned1 = TREE_UNSIGNED (TREE_TYPE (op1)); ++ ++ /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE. */ ++ ++ /* For bitwise operations, signedness of nominal type ++ does not matter. Consider only how operands were extended. */ ++ if (shorten == -1) ++ uns = unsigned0; ++ ++ /* Note that in all three cases below we refrain from optimizing ++ an unsigned operation on sign-extended args. ++ That would not be valid. */ ++ ++ /* Both args variable: if both extended in same way ++ from same width, do it in that width. ++ Do it unsigned if args were zero-extended. */ ++ if ((TYPE_PRECISION (TREE_TYPE (arg0)) ++ < TYPE_PRECISION (result_type)) ++ && (TYPE_PRECISION (TREE_TYPE (arg1)) ++ == TYPE_PRECISION (TREE_TYPE (arg0))) ++ && unsigned0 == unsigned1 ++ && (unsigned0 || !uns)) ++ result_type ++ = signed_or_unsigned_type (unsigned0, ++ commontype (TREE_TYPE (arg0), TREE_TYPE (arg1))); ++ else if (TREE_CODE (arg0) == INTEGER_CST ++ && (unsigned1 || !uns) ++ && (TYPE_PRECISION (TREE_TYPE (arg1)) ++ < TYPE_PRECISION (result_type)) ++ && (type = signed_or_unsigned_type (unsigned1, ++ TREE_TYPE (arg1)), ++ int_fits_type_p (arg0, type))) ++ result_type = type; ++ else if (TREE_CODE (arg1) == INTEGER_CST ++ && (unsigned0 || !uns) ++ && (TYPE_PRECISION (TREE_TYPE (arg0)) ++ < TYPE_PRECISION (result_type)) ++ && (type = signed_or_unsigned_type (unsigned0, ++ TREE_TYPE (arg0)), ++ int_fits_type_p (arg1, type))) ++ result_type = type; ++ } ++ ++ /* Shifts can be shortened if shifting right. */ ++ ++ if (short_shift) ++ { ++ int unsigned_arg; ++ tree arg0 = get_narrower (op0, &unsigned_arg); ++ ++ final_type = result_type; ++ ++ if (arg0 == op0 && final_type == TREE_TYPE (op0)) ++ unsigned_arg = TREE_UNSIGNED (TREE_TYPE (op0)); ++ ++ if (TYPE_PRECISION (TREE_TYPE (arg0)) < TYPE_PRECISION (result_type) ++ /* If arg is sign-extended and then unsigned-shifted, ++ we can simulate this with a signed shift in arg's type ++ only if the extended result is at least twice as wide ++ as the arg. Otherwise, the shift could use up all the ++ ones made by sign-extension and bring in zeros. ++ We can't optimize that case at all, but in most machines ++ it never happens because available widths are 2**N. */ ++ && (!TREE_UNSIGNED (final_type) ++ || unsigned_arg ++ || 2 * TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (result_type))) ++ { ++ /* Do an unsigned shift if the operand was zero-extended. */ ++ result_type ++ = signed_or_unsigned_type (unsigned_arg, ++ TREE_TYPE (arg0)); ++ /* Convert value-to-be-shifted to that type. */ ++ if (TREE_TYPE (op0) != result_type) ++ op0 = convert (result_type, op0); ++ converted = 1; ++ } ++ } ++ ++ /* Comparison operations are shortened too but differently. ++ They identify themselves by setting short_compare = 1. */ ++ ++ if (short_compare) ++ { ++ /* Don't write &op0, etc., because that would prevent op0 ++ from being kept in a register. ++ Instead, make copies of the our local variables and ++ pass the copies by reference, then copy them back afterward. */ ++ tree xop0 = op0, xop1 = op1, xresult_type = result_type; ++ enum tree_code xresultcode = resultcode; ++ tree val ++ = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode); ++ if (val != 0) ++ return val; ++ op0 = xop0, op1 = xop1, result_type = xresult_type; ++ resultcode = xresultcode; ++ } ++ } ++ ++ /* At this point, RESULT_TYPE must be nonzero to avoid an error message. ++ If CONVERTED is zero, both args will be converted to type RESULT_TYPE. ++ Then the expression will be built. ++ It will be given type FINAL_TYPE if that is nonzero; ++ otherwise, it will be given type RESULT_TYPE. */ ++ ++ if (!result_type) ++ { ++ binary_op_error (error_code); ++ return error_mark_node; ++ } ++ ++ if (! converted) ++ { ++ if (TREE_TYPE (op0) != result_type) ++ op0 = convert (result_type, op0); ++ if (TREE_TYPE (op1) != result_type) ++ op1 = convert (result_type, op1); ++ } ++ ++ { ++ register tree result = build (resultcode, result_type, op0, op1); ++ register tree folded; ++ ++ folded = fold (result); ++ if (folded == result) ++ TREE_LITERAL (folded) = TREE_LITERAL (op0) & TREE_LITERAL (op1); ++ if (final_type != 0) ++ return convert (final_type, folded); ++ return folded; ++ } ++} ++ ++/* Return a tree for the sum or difference (RESULTCODE says which) ++ of pointer PTROP and integer INTOP. */ ++ ++static tree ++pointer_int_sum (resultcode, ptrop, intop) ++ enum tree_code resultcode; ++ register tree ptrop, intop; ++{ ++ tree size_exp; ++ ++ register tree result; ++ register tree folded; ++ ++ /* The result is a pointer of the same type that is being added. */ ++ ++ register tree result_type = datatype (ptrop); ++ ++ if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE) ++ { ++ if (pedantic || warn_pointer_arith) ++ warning ("pointer of type `void *' used in arithmetic"); ++ size_exp = integer_one_node; ++ } ++ else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE) ++ { ++ if (pedantic || warn_pointer_arith) ++ warning ("pointer to a function used in arithmetic"); ++ size_exp = integer_one_node; ++ } ++ else ++ size_exp = c_sizeof (TREE_TYPE (result_type)); ++ ++ /* If what we are about to multiply by the size of the elements ++ contains a constant term, apply distributive law ++ and multiply that constant term separately. ++ This helps produce common subexpressions. */ ++ ++ if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR) ++ && ! TREE_LITERAL (intop) ++ && TREE_LITERAL (TREE_OPERAND (intop, 1)) ++ && TREE_LITERAL (size_exp)) ++ { ++ enum tree_code subcode = resultcode; ++ if (TREE_CODE (intop) == MINUS_EXPR) ++ subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR); ++ ptrop = build_binary_op (subcode, ptrop, TREE_OPERAND (intop, 1)); ++ intop = TREE_OPERAND (intop, 0); ++ } ++ ++ /* Convert the integer argument to a type the same size as a pointer ++ so the multiply won't overflow spuriously. */ ++ ++ if (TYPE_PRECISION (TREE_TYPE (intop)) != POINTER_SIZE) ++ intop = convert (type_for_size (POINTER_SIZE, 0), intop); ++ ++ /* Replace the integer argument ++ with a suitable product by the object size. */ ++ ++ intop = build_binary_op (MULT_EXPR, intop, size_exp); ++ ++ /* Create the sum or difference. */ ++ ++ result = build (resultcode, result_type, ptrop, intop); ++ ++ folded = fold (result); ++ if (folded == result) ++ TREE_LITERAL (folded) = TREE_LITERAL (ptrop) & TREE_LITERAL (intop); ++ return folded; ++} ++ ++/* Return a tree for the difference of pointers OP0 and OP1. ++ The resulting tree has type int. */ ++ ++static tree ++pointer_diff (op0, op1) ++ register tree op0, op1; ++{ ++ tree dt0 = datatype (op0); ++ enum tree_code resultcode; ++ register tree result, folded; ++ tree restype = type_for_size (POINTER_SIZE, 0); ++ ++ if (pedantic) ++ { ++ if (TREE_CODE (TREE_TYPE (dt0)) == VOID_TYPE) ++ warning ("pointer of type `void *' used in subtraction"); ++ if (TREE_CODE (TREE_TYPE (dt0)) == FUNCTION_TYPE) ++ warning ("pointer to a function used in subtraction"); ++ } ++ ++ /* First do the subtraction as integers; ++ then drop through to build the divide operator. */ ++ ++ op0 = build_binary_op (MINUS_EXPR, ++ convert (restype, op0), convert (restype, op1)); ++ op1 = c_sizeof_nowarn (TREE_TYPE (dt0)); ++ ++ /* Create the sum or difference. */ ++ ++ result = build (EXACT_DIV_EXPR, restype, op0, op1); ++ ++ folded = fold (result); ++ if (folded == result) ++ TREE_LITERAL (folded) = TREE_LITERAL (op0) & TREE_LITERAL (op1); ++ return folded; ++} ++ ++/* Print an error message for invalid operands to arith operation CODE. ++ NOP_EXPR is used as a special case (see truthvalue_conversion). */ ++ ++static void ++binary_op_error (code) ++ enum tree_code code; ++{ ++ register char *opname; ++ switch (code) ++ { ++ case NOP_EXPR: ++ error ("invalid truth-value expression"); ++ return; ++ ++ case PLUS_EXPR: ++ opname = "+"; break; ++ case MINUS_EXPR: ++ opname = "-"; break; ++ case MULT_EXPR: ++ opname = "*"; break; ++ case MAX_EXPR: ++ opname = "max"; break; ++ case MIN_EXPR: ++ opname = "min"; break; ++ case EQ_EXPR: ++ opname = "=="; break; ++ case NE_EXPR: ++ opname = "!="; break; ++ case LE_EXPR: ++ opname = "<="; break; ++ case GE_EXPR: ++ opname = ">="; break; ++ case LT_EXPR: ++ opname = "<"; break; ++ case GT_EXPR: ++ opname = ">"; break; ++ case LSHIFT_EXPR: ++ opname = "<<"; break; ++ case RSHIFT_EXPR: ++ opname = ">>"; break; ++ case TRUNC_MOD_EXPR: ++ opname = "%"; break; ++ case TRUNC_DIV_EXPR: ++ opname = "/"; break; ++ case BIT_AND_EXPR: ++ opname = "&"; break; ++ case BIT_IOR_EXPR: ++ opname = "|"; break; ++ case TRUTH_ANDIF_EXPR: ++ opname = "&&"; break; ++ case TRUTH_ORIF_EXPR: ++ opname = "||"; break; ++ case BIT_XOR_EXPR: ++ opname = "^"; break; ++ } ++ error ("invalid operands to binary %s", opname); ++} ++ ++/* Subroutine of build_binary_op_nodefault, used for comparison operations. ++ See if the operands have both been converted from subword integer types ++ and, if so, perhaps change them both back to their original type. ++ ++ The arguments of this function are all pointers to local variables ++ of build_binary_op_nodefault: OP0_PTR is &OP0, OP1_PTR is &OP1, ++ RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE. ++ ++ If this function returns nonzero, it means that the comparison has ++ a constant value. What this function returns is an expression for ++ that value. */ ++ ++static tree ++shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr) ++ tree *op0_ptr, *op1_ptr; ++ tree *restype_ptr; ++ enum tree_code *rescode_ptr; ++{ ++ register tree type; ++ tree op0 = *op0_ptr; ++ tree op1 = *op1_ptr; ++ int unsignedp0, unsignedp1; ++ int real1, real2; ++ tree primop0, primop1; ++ enum tree_code code = *rescode_ptr; ++ ++ /* Throw away any conversions to wider types ++ already present in the operands. */ ++ ++ primop0 = get_narrower (op0, &unsignedp0); ++ primop1 = get_narrower (op1, &unsignedp1); ++ ++ /* Handle the case that OP0 does not *contain* a conversion ++ but it *requires* conversion to FINAL_TYPE. */ ++ ++ if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr) ++ unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0)); ++ if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr) ++ unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1)); ++ ++ /* If one of the operands must be floated, we cannot optimize. */ ++ real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE; ++ real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE; ++ ++ /* If first arg is constant, swap the args (changing operation ++ so value is preserved), for canonicalization. */ ++ ++ if (TREE_LITERAL (primop0)) ++ { ++ register tree tem = primop0; ++ register int temi = unsignedp0; ++ primop0 = primop1; ++ primop1 = tem; ++ tem = op0; ++ op0 = op1; ++ op1 = tem; ++ *op0_ptr = op0; ++ *op1_ptr = op1; ++ unsignedp0 = unsignedp1; ++ unsignedp1 = temi; ++ temi = real1; ++ real1 = real2; ++ real2 = temi; ++ ++ switch (code) ++ { ++ case LT_EXPR: ++ code = GT_EXPR; ++ break; ++ case GT_EXPR: ++ code = LT_EXPR; ++ break; ++ case LE_EXPR: ++ code = GE_EXPR; ++ break; ++ case GE_EXPR: ++ code = LE_EXPR; ++ break; ++ } ++ *rescode_ptr = code; ++ } ++ ++ /* If comparing an integer against a constant more bits wide, ++ maybe we can deduce a value of 1 or 0 independent of the data. ++ Or else truncate the constant now ++ rather than extend the variable at run time. ++ ++ This is only interesting if the constant is the wider arg. ++ Also, it is not safe if the constant is unsigned and the ++ variable arg is signed, since in this case the variable ++ would be sign-extended and then regarded as unsigned. ++ Our technique fails in this case because the lowest/highest ++ possible unsigned results don't follow naturally from the ++ lowest/highest possible values of the variable operand. ++ For just EQ_EXPR and NE_EXPR there is another technique that ++ could be used: see if the constant can be faithfully represented ++ in the other operand's type, by truncating it and reextending it ++ and see if that preserves the constant's value. */ ++ ++ if (!real1 && !real2 ++ && TREE_CODE (primop1) == INTEGER_CST ++ && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)) ++ { ++ int min_gt, max_gt, min_lt, max_lt; ++ tree maxval, minval; ++ /* 1 if comparison is nominally unsigned. */ ++ int unsignedp = TREE_UNSIGNED (*restype_ptr); ++ tree val; ++ ++ type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)); ++ ++ maxval = TYPE_MAX_VALUE (type); ++ minval = TYPE_MIN_VALUE (type); ++ ++ if (unsignedp && !unsignedp0) ++ *restype_ptr = signed_type (*restype_ptr); ++ ++ if (TREE_TYPE (primop1) != *restype_ptr) ++ primop1 = convert (*restype_ptr, primop1); ++ if (type != *restype_ptr) ++ { ++ minval = convert (*restype_ptr, minval); ++ maxval = convert (*restype_ptr, maxval); ++ } ++ ++ if (unsignedp && unsignedp0) ++ { ++ min_gt = INT_CST_LT_UNSIGNED (primop1, minval); ++ max_gt = INT_CST_LT_UNSIGNED (primop1, maxval); ++ min_lt = INT_CST_LT_UNSIGNED (minval, primop1); ++ max_lt = INT_CST_LT_UNSIGNED (maxval, primop1); ++ } ++ else ++ { ++ min_gt = INT_CST_LT (primop1, minval); ++ max_gt = INT_CST_LT (primop1, maxval); ++ min_lt = INT_CST_LT (minval, primop1); ++ max_lt = INT_CST_LT (maxval, primop1); ++ } ++ ++ val = 0; ++ /* This used to be a switch, but Genix compiler can't handle that. */ ++ if (code == NE_EXPR) ++ { ++ if (max_lt || min_gt) ++ val = integer_one_node; ++ } ++ else if (code == EQ_EXPR) ++ { ++ if (max_lt || min_gt) ++ val = integer_zero_node; ++ } ++ else if (code == LT_EXPR) ++ { ++ if (max_lt) ++ val = integer_one_node; ++ if (!min_lt) ++ val = integer_zero_node; ++ } ++ else if (code == GT_EXPR) ++ { ++ if (min_gt) ++ val = integer_one_node; ++ if (!max_gt) ++ val = integer_zero_node; ++ } ++ else if (code == LE_EXPR) ++ { ++ if (!max_gt) ++ val = integer_one_node; ++ if (min_gt) ++ val = integer_zero_node; ++ } ++ else if (code == GE_EXPR) ++ { ++ if (!min_lt) ++ val = integer_one_node; ++ if (max_lt) ++ val = integer_zero_node; ++ } ++ ++ /* If primop0 was sign-extended and unsigned comparison specd, ++ we did a signed comparison above using the signed type bounds. ++ But the comparison we output must be unsigned. ++ ++ Also, for inequalities, VAL is no good; but if the signed ++ comparison had *any* fixed result, it follows that the ++ unsigned comparison just tests the sign in reverse ++ (positive values are LE, negative ones GE). ++ So we can generate an unsigned comparison ++ against an extreme value of the signed type. */ ++ ++ if (unsignedp && !unsignedp0) ++ { ++ if (val != 0) ++ switch (code) ++ { ++ case LT_EXPR: ++ case GE_EXPR: ++ primop1 = TYPE_MIN_VALUE (type); ++ val = 0; ++ break; ++ ++ case LE_EXPR: ++ case GT_EXPR: ++ primop1 = TYPE_MAX_VALUE (type); ++ val = 0; ++ break; ++ } ++ type = unsigned_type (type); ++ } ++ ++ if (max_lt && !unsignedp0) ++ { ++ /* This is the case of (char)x >?< 0x80, which people used to use ++ expecting old C compilers to change the 0x80 into -0x80. */ ++ if (val == integer_zero_node) ++ warning ("comparison is always 0 due to limited range of data type"); ++ if (val == integer_one_node) ++ warning ("comparison is always 1 due to limited range of data type"); ++ } ++ ++ if (val != 0) ++ { ++ /* Don't forget to evaluate PRIMOP0 if it has side effects. */ ++ if (TREE_VOLATILE (primop0)) ++ return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val); ++ return val; ++ } ++ ++ /* Value is not predetermined, but do the comparison ++ in the type of the operand that is not constant. ++ TYPE is already properly set. */ ++ } ++ else if (real1 && real2 ++ && TYPE_PRECISION (TREE_TYPE (primop0)) == TYPE_PRECISION (TREE_TYPE (primop1))) ++ type = TREE_TYPE (primop0); ++ ++ /* If args' natural types are both narrower than nominal type ++ and both extend in the same manner, compare them ++ in the type of the wider arg. ++ Otherwise must actually extend both to the nominal ++ common type lest different ways of extending ++ alter the result. ++ (eg, (short)-1 == (unsigned short)-1 should be 0.) */ ++ ++ else if (unsignedp0 == unsignedp1 && real1 == real2 ++ && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr) ++ && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr)) ++ { ++ type = commontype (TREE_TYPE (primop0), TREE_TYPE (primop1)); ++ type = signed_or_unsigned_type (unsignedp0 ++ || TREE_UNSIGNED (*restype_ptr), ++ type); ++ /* Make sure shorter operand is extended the right way ++ to match the longer operand. */ ++ primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)), ++ primop0); ++ primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)), ++ primop1); ++ } ++ else ++ { ++ /* Here we must do the comparison on the nominal type ++ using the args exactly as we received them. */ ++ type = *restype_ptr; ++ primop0 = op0; ++ primop1 = op1; ++ } ++ ++ *op0_ptr = convert (type, primop0); ++ *op1_ptr = convert (type, primop1); ++ ++ *restype_ptr = integer_type_node; ++ ++ return 0; ++} ++ ++/* Construct and perhaps optimize a tree representation ++ for a unary operation. CODE, a tree_code, specifies the operation ++ and XARG is the operand. NOCONVERT nonzero suppresses ++ the default promotions (such as from short to int). */ ++ ++tree ++build_unary_op (code, xarg, noconvert) ++ enum tree_code code; ++ tree xarg; ++ int noconvert; ++{ ++ /* No default_conversion here. It causes trouble for ADDR_EXPR. */ ++ register tree arg = xarg; ++ register tree argtype = 0; ++ register enum tree_code typecode = TREE_CODE (TREE_TYPE (arg)); ++ char *errstring = NULL; ++ tree val; ++ ++ if (typecode == ERROR_MARK) ++ return error_mark_node; ++ if (typecode == ENUMERAL_TYPE) ++ typecode = INTEGER_TYPE; ++ ++ switch (code) ++ { ++ case CONVERT_EXPR: ++ /* This is used for unary plus, because a CONVERT_EXPR ++ is enough to prevent anybody from looking inside for ++ associativity, but won't generate any code. */ ++ if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE)) ++ errstring = "wrong type argument to unary plus"; ++ else if (!noconvert) ++ arg = default_conversion (arg); ++ break; ++ ++ case NEGATE_EXPR: ++ if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE)) ++ errstring = "wrong type argument to unary minus"; ++ else if (!noconvert) ++ arg = default_conversion (arg); ++ break; ++ ++ case BIT_NOT_EXPR: ++ if (typecode != INTEGER_TYPE) ++ errstring = "wrong type argument to bit-complement"; ++ else if (!noconvert) ++ arg = default_conversion (arg); ++ break; ++ ++ case ABS_EXPR: ++ if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE)) ++ errstring = "wrong type argument to abs"; ++ else if (!noconvert) ++ arg = default_conversion (arg); ++ break; ++ ++ case TRUTH_NOT_EXPR: ++ if (typecode != INTEGER_TYPE ++ && typecode != REAL_TYPE && typecode != POINTER_TYPE ++ /* This will convert to a pointer. */ ++ && typecode != ARRAY_TYPE && typecode != FUNCTION_TYPE) ++ { ++ errstring = "wrong type argument to unary exclamation mark"; ++ break; ++ } ++ arg = truthvalue_conversion (arg); ++ val = invert_truthvalue (arg); ++ if (val) return val; ++ break; ++ ++ case NOP_EXPR: ++ break; ++ ++ case PREINCREMENT_EXPR: ++ case POSTINCREMENT_EXPR: ++ case PREDECREMENT_EXPR: ++ case POSTDECREMENT_EXPR: ++ /* Handle complex lvalues (when permitted) ++ by reduction to simpler cases. */ ++ ++ val = unary_complex_lvalue (code, arg); ++ if (val != 0) ++ return val; ++ ++ /* Report invalid types. */ ++ ++ if (typecode != POINTER_TYPE ++ && typecode != INTEGER_TYPE && typecode != REAL_TYPE) ++ { ++ if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR) ++ errstring ="wrong type argument to increment"; ++ else ++ errstring ="wrong type argument to decrement"; ++ break; ++ } ++ ++ /* Report something read-only. */ ++ ++ if (TREE_READONLY (arg)) ++ readonly_warning (arg, ++ ((code == PREINCREMENT_EXPR ++ || code == POSTINCREMENT_EXPR) ++ ? "increment" : "decrement")); ++ ++ { ++ register tree inc; ++ tree result_type = TREE_TYPE (arg); ++ ++ arg = get_unwidened (arg, 0); ++ argtype = TREE_TYPE (arg); ++ ++ /* Compute the increment. */ ++ ++ if (typecode == POINTER_TYPE) ++ { ++ if (pedantic ++ && (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE ++ || TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)) ++ warning ("wrong type argument to %s", ++ ((code == PREINCREMENT_EXPR ++ || code == POSTINCREMENT_EXPR) ++ ? "increment" : "decrement")); ++ inc = c_sizeof_nowarn (TREE_TYPE (result_type)); ++ } ++ else ++ inc = integer_one_node; ++ ++ inc = convert (argtype, inc); ++ ++ /* Handle incrementing a cast-expression. */ ++ ++ if (!pedantic) ++ switch (TREE_CODE (arg)) ++ { ++ case NOP_EXPR: ++ case CONVERT_EXPR: ++ case FLOAT_EXPR: ++ case FIX_TRUNC_EXPR: ++ case FIX_FLOOR_EXPR: ++ case FIX_ROUND_EXPR: ++ case FIX_CEIL_EXPR: ++ { ++ tree incremented, modify, value; ++ arg = stabilize_reference (arg); ++ if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR) ++ value = arg; ++ else ++ value = save_expr (arg); ++ incremented = build (((code == PREINCREMENT_EXPR ++ || code == POSTINCREMENT_EXPR) ++ ? PLUS_EXPR : MINUS_EXPR), ++ argtype, value, inc); ++ TREE_VOLATILE (incremented) = 1; ++ modify = build_modify_expr (arg, NOP_EXPR, incremented); ++ return build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value); ++ } ++ } ++ ++ /* Complain about anything else that is not a true lvalue. */ ++ if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR ++ || code == POSTINCREMENT_EXPR) ++ ? "increment" : "decrement"))) ++ return error_mark_node; ++ ++ val = build (code, TREE_TYPE (arg), arg, inc); ++ TREE_VOLATILE (val) = 1; ++ return convert (result_type, val); ++ } ++ ++ case ADDR_EXPR: ++ /* Note that this operation never does default_conversion ++ regardless of NOCONVERT. */ ++ ++ /* Let &* cancel out to simplify resulting code. */ ++ if (TREE_CODE (arg) == INDIRECT_REF) ++ { ++ /* Don't let this be an lvalue. */ ++ if (lvalue_p (TREE_OPERAND (arg, 0))) ++ return build (NOP_EXPR, TREE_TYPE (TREE_OPERAND (arg, 0)), ++ TREE_OPERAND (arg, 0)); ++ return TREE_OPERAND (arg, 0); ++ } ++ ++ /* For &x[y], return x+y */ ++ if (TREE_CODE (arg) == ARRAY_REF) ++ { ++ if (mark_addressable (TREE_OPERAND (arg, 0)) == 0) ++ return error_mark_node; ++ return build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0), ++ TREE_OPERAND (arg, 1)); ++ } ++ ++ /* Handle complex lvalues (when permitted) ++ by reduction to simpler cases. */ ++ val = unary_complex_lvalue (code, arg); ++ if (val != 0) ++ return val; ++ ++#if 0 /* Turned off because inconsistent; ++ float f; *&(int)f = 3.4 stores in int format ++ whereas (int)f = 3.4 stores in float format. */ ++ /* Address of a cast is just a cast of the address ++ of the operand of the cast. */ ++ switch (TREE_CODE (arg)) ++ { ++ case NOP_EXPR: ++ case CONVERT_EXPR: ++ case FLOAT_EXPR: ++ case FIX_TRUNC_EXPR: ++ case FIX_FLOOR_EXPR: ++ case FIX_ROUND_EXPR: ++ case FIX_CEIL_EXPR: ++ if (pedantic) ++ warning ("ANSI C forbids the address of a cast expression"); ++ return convert (build_pointer_type (TREE_TYPE (arg)), ++ build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), ++ 0)); ++ } ++#endif ++ ++ /* Allow the address of a constructor if all the elements ++ are constant. */ ++ if (TREE_CODE (arg) == CONSTRUCTOR && TREE_LITERAL (arg)) ++ ; ++ /* Anything not already handled and not a true memory reference ++ is an error. */ ++ else if (typecode != FUNCTION_TYPE && !lvalue_or_else (arg, "unary `&'")) ++ return error_mark_node; ++ ++ /* Ordinary case; arg is a COMPONENT_REF or a decl. */ ++ argtype = TREE_TYPE (arg); ++ if (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg)) ++ argtype = c_build_type_variant (argtype, ++ TREE_READONLY (arg), ++ TREE_THIS_VOLATILE (arg)); ++ ++ argtype = build_pointer_type (argtype); ++ ++ if (mark_addressable (arg) == 0) ++ return error_mark_node; ++ ++ { ++ tree addr; ++ ++ if (TREE_CODE (arg) == COMPONENT_REF) ++ { ++ tree field = TREE_OPERAND (arg, 1); ++ ++ addr = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0); ++ ++ if (TREE_PACKED (field)) ++ { ++ error ("attempt to take address of bit-field structure member `%s'", ++ IDENTIFIER_POINTER (DECL_NAME (field))); ++ return error_mark_node; ++ } ++ ++ addr = convert (argtype, addr); ++ ++ if (DECL_OFFSET (field) != 0) ++ { ++ tree offset = build_int_2 ((DECL_OFFSET (field) ++ / BITS_PER_UNIT), ++ 0); ++ TREE_TYPE (offset) = argtype; ++ addr = fold (build (PLUS_EXPR, argtype, addr, offset)); ++ } ++ } ++ else ++ addr = build (code, argtype, arg); ++ ++ /* Address of a static or external variable or ++ function counts as a constant */ ++ TREE_LITERAL (addr) = staticp (arg); ++ return addr; ++ } ++ } ++ ++ if (!errstring) ++ { ++ if (argtype == 0) ++ argtype = TREE_TYPE (arg); ++ return fold (build (code, argtype, arg)); ++ } ++ ++ error (errstring); ++ return error_mark_node; ++} ++ ++/* If CONVERSIONS is a conversion expression or a nested sequence of such, ++ convert ARG with the same conversions in the same order ++ and return the result. */ ++ ++static tree ++convert_sequence (conversions, arg) ++ tree conversions; ++ tree arg; ++{ ++ switch (TREE_CODE (conversions)) ++ { ++ case NOP_EXPR: ++ case CONVERT_EXPR: ++ case FLOAT_EXPR: ++ case FIX_TRUNC_EXPR: ++ case FIX_FLOOR_EXPR: ++ case FIX_ROUND_EXPR: ++ case FIX_CEIL_EXPR: ++ return convert (TREE_TYPE (conversions), ++ convert_sequence (TREE_OPERAND (conversions, 0), ++ arg)); ++ ++ default: ++ return arg; ++ } ++} ++ ++/* Apply unary lvalue-demanding operator CODE to the expression ARG ++ for certain kinds of expressions which are not really lvalues ++ but which we can accept as lvalues. ++ ++ If ARG is not a kind of expression we can handle, return zero. */ ++ ++static tree ++unary_complex_lvalue (code, arg) ++ enum tree_code code; ++ tree arg; ++{ ++ if (pedantic) ++ return 0; ++ ++ /* Handle (a, b) used as an "lvalue". */ ++ if (TREE_CODE (arg) == COMPOUND_EXPR) ++ { ++ tree real_result = build_unary_op (code, TREE_OPERAND (arg, 1), 0); ++ return build (COMPOUND_EXPR, TREE_TYPE (real_result), ++ TREE_OPERAND (arg, 0), real_result); ++ } ++ ++ /* Handle (a ? b : c) used as an "lvalue". */ ++ if (TREE_CODE (arg) == COND_EXPR) ++ return (build_conditional_expr ++ (TREE_OPERAND (arg, 0), ++ build_unary_op (code, TREE_OPERAND (arg, 1), 0), ++ build_unary_op (code, TREE_OPERAND (arg, 2), 0))); ++ ++ return 0; ++} ++ ++/* Warn about storing in something that is `const'. */ ++ ++void ++readonly_warning (arg, string) ++ tree arg; ++ char *string; ++{ ++ char buf[80]; ++ strcpy (buf, string); ++ ++ if (TREE_CODE (arg) == COMPONENT_REF) ++ { ++ if (TREE_READONLY (TREE_OPERAND (arg, 0))) ++ readonly_warning (TREE_OPERAND (arg, 0), string); ++ else ++ { ++ strcat (buf, " of read-only member `%s'"); ++ warning (buf, IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (arg, 1)))); ++ } ++ } ++ else if (TREE_CODE (arg) == VAR_DECL) ++ { ++ strcat (buf, " of read-only variable `%s'"); ++ warning (buf, IDENTIFIER_POINTER (DECL_NAME (arg))); ++ } ++ else ++ { ++ warning ("%s of read-only location", buf); ++ } ++} ++ ++/* Prepare expr to be an argument of a TRUTH_NOT_EXPR, ++ or validate its data type for an `if' or `while' statement or ?..: exp. ++ ++ This preparation consists of taking the ordinary ++ representation of an expression expr and producing a valid tree ++ boolean expression describing whether expr is nonzero. We could ++ simply always do build_binary_op (NE_EXPR, expr, integer_zero_node), ++ but we optimize comparisons, &&, ||, and ! */ ++ ++tree ++truthvalue_conversion (expr) ++ tree expr; ++{ ++ register enum tree_code form; ++ ++ /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. ++ Strip such NOP_EXPRs, since EXPR is being used in non-lvalue context. */ ++ if (TREE_CODE (expr) == NOP_EXPR ++ && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0))) ++ expr = TREE_OPERAND (expr, 0); ++ ++ form = TREE_CODE (expr); ++ ++ if (form == EQ_EXPR && integer_zerop (TREE_OPERAND (expr, 1))) ++ return build_unary_op (TRUTH_NOT_EXPR, TREE_OPERAND (expr, 0), 0); ++ ++ /* A one-bit unsigned bit-field is already acceptable. */ ++ if (form == COMPONENT_REF ++ && 1 == TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (expr, 1))) ++ && 1 == DECL_SIZE_UNIT (TREE_OPERAND (expr, 1)) ++ && TREE_UNSIGNED (TREE_OPERAND (expr, 1))) ++ return expr; ++ ++ if (form == TRUTH_ANDIF_EXPR || form == TRUTH_ORIF_EXPR ++ || form == TRUTH_AND_EXPR || form == TRUTH_OR_EXPR ++ || form == TRUTH_NOT_EXPR ++ || form == EQ_EXPR || form == NE_EXPR ++ || form == LE_EXPR || form == GE_EXPR ++ || form == LT_EXPR || form == GT_EXPR ++ || form == ERROR_MARK) ++ return expr; ++ ++ /* Unary minus has no effect on whether its argument is nonzero. */ ++ if (form == NEGATE_EXPR) ++ return truthvalue_conversion (TREE_OPERAND (expr, 0)); ++ ++ /* Distribute the conversion into the arms of a COND_EXPR. */ ++ if (form == COND_EXPR) ++ return build (COND_EXPR, integer_type_node, ++ TREE_OPERAND (expr, 0), ++ truthvalue_conversion (TREE_OPERAND (expr, 1)), ++ truthvalue_conversion (TREE_OPERAND (expr, 2))); ++ ++ /* Sign-extension and zero-extension has no effect. */ ++ if (form == NOP_EXPR ++ && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE ++ && (TYPE_PRECISION (TREE_TYPE (expr)) ++ > TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))) ++ return truthvalue_conversion (TREE_OPERAND (expr, 0)); ++ ++ return build_binary_op_nodefault (NE_EXPR, default_conversion (expr), ++ integer_zero_node, NOP_EXPR); ++} ++ ++/* Return a simplified tree node for the truth-negation of ARG ++ (perhaps by altering ARG). ++ If it can't be simplified, return 0. */ ++ ++static tree ++invert_truthvalue (arg) ++ tree arg; ++{ ++ switch (TREE_CODE (arg)) ++ { ++ case NE_EXPR: ++ TREE_SET_CODE (arg, EQ_EXPR); ++ return arg; ++ ++ case EQ_EXPR: ++ TREE_SET_CODE (arg, NE_EXPR); ++ return arg; ++ ++ case GE_EXPR: ++ TREE_SET_CODE (arg, LT_EXPR); ++ return arg; ++ ++ case GT_EXPR: ++ TREE_SET_CODE (arg, LE_EXPR); ++ return arg; ++ ++ case LE_EXPR: ++ TREE_SET_CODE (arg, GT_EXPR); ++ return arg; ++ ++ case LT_EXPR: ++ TREE_SET_CODE (arg, GE_EXPR); ++ return arg; ++ ++ case TRUTH_AND_EXPR: ++ return build (TRUTH_OR_EXPR, TREE_TYPE (arg), ++ build_unary_op (TRUTH_NOT_EXPR, ++ TREE_OPERAND (arg, 0), 0), ++ build_unary_op (TRUTH_NOT_EXPR, ++ TREE_OPERAND (arg, 1), 0)); ++ ++ case TRUTH_OR_EXPR: ++ return build (TRUTH_AND_EXPR, TREE_TYPE (arg), ++ build_unary_op (TRUTH_NOT_EXPR, ++ TREE_OPERAND (arg, 0), 0), ++ build_unary_op (TRUTH_NOT_EXPR, ++ TREE_OPERAND (arg, 1), 0)); ++ ++ case TRUTH_ANDIF_EXPR: ++ return build (TRUTH_ORIF_EXPR, TREE_TYPE (arg), ++ build_unary_op (TRUTH_NOT_EXPR, ++ TREE_OPERAND (arg, 0), 0), ++ build_unary_op (TRUTH_NOT_EXPR, ++ TREE_OPERAND (arg, 1), 0)); ++ ++ case TRUTH_ORIF_EXPR: ++ return build (TRUTH_ANDIF_EXPR, TREE_TYPE (arg), ++ build_unary_op (TRUTH_NOT_EXPR, ++ TREE_OPERAND (arg, 0), 0), ++ build_unary_op (TRUTH_NOT_EXPR, ++ TREE_OPERAND (arg, 1), 0)); ++ ++ case TRUTH_NOT_EXPR: ++ return TREE_OPERAND (arg, 0); ++ ++ case COND_EXPR: ++ return build (COND_EXPR, TREE_TYPE (arg), TREE_OPERAND (arg, 0), ++ build_unary_op (TRUTH_NOT_EXPR, TREE_OPERAND (arg, 1), 0), ++ build_unary_op (TRUTH_NOT_EXPR, TREE_OPERAND (arg, 2), 0)); ++ } ++ return 0; ++} ++ ++/* Mark EXP saying that we need to be able to take the ++ address of it; it should not be allocated in a register. ++ Value is 1 if successful. */ ++ ++int ++mark_addressable (exp) ++ tree exp; ++{ ++ register tree x = exp; ++ while (1) ++ switch (TREE_CODE (x)) ++ { ++ case ADDR_EXPR: ++ case COMPONENT_REF: ++ case ARRAY_REF: ++ x = TREE_OPERAND (x, 0); ++ break; ++ ++ case VAR_DECL: ++ case CONST_DECL: ++ case PARM_DECL: ++ case RESULT_DECL: ++ if (TREE_REGDECL (x) && !TREE_ADDRESSABLE (x)) ++ { ++ if (TREE_PUBLIC (x)) ++ { ++ error ("address of global register variable `%s' requested", ++ IDENTIFIER_POINTER (DECL_NAME (x))); ++ return 0; ++ } ++ warning ("address of register variable `%s' requested", ++ IDENTIFIER_POINTER (DECL_NAME (x))); ++ } ++ put_var_into_stack (x); ++ ++ /* drops in */ ++ case FUNCTION_DECL: ++ TREE_ADDRESSABLE (x) = 1; ++ TREE_ADDRESSABLE (DECL_NAME (x)) = 1; ++ ++ default: ++ return 1; ++ } ++} ++ ++/* Build and return a conditional expression IFEXP ? OP1 : OP2. */ ++ ++tree ++build_conditional_expr (ifexp, op1, op2) ++ tree ifexp, op1, op2; ++{ ++ register tree type1; ++ register tree type2; ++ register enum tree_code code1; ++ register enum tree_code code2; ++ register tree result_type = NULL; ++ ++ /* If second operand is omitted, it is the same as the first one; ++ make sure it is calculated only once. */ ++ if (op1 == 0) ++ { ++ if (pedantic) ++ warning ("ANSI C forbids omitting the middle term of a ?: expression"); ++ ifexp = op1 = save_expr (ifexp); ++ } ++ ++ ifexp = truthvalue_conversion (default_conversion (ifexp)); ++ ++ if (TREE_CODE (ifexp) == ERROR_MARK ++ || TREE_CODE (TREE_TYPE (op1)) == ERROR_MARK ++ || TREE_CODE (TREE_TYPE (op2)) == ERROR_MARK) ++ return error_mark_node; ++ ++#if 0 /* Produces wrong result if within sizeof. */ ++ /* Don't promote the operands separately if they promote ++ the same way. Return the unpromoted type and let the combined ++ value get promoted if necessary. */ ++ ++ if (TREE_TYPE (op1) == TREE_TYPE (op2) ++ && TREE_CODE (TREE_TYPE (op1)) != ARRAY_TYPE ++ && TREE_CODE (TREE_TYPE (op1)) != ENUMERAL_TYPE ++ && TREE_CODE (TREE_TYPE (op1)) != FUNCTION_TYPE) ++ { ++ if (TREE_LITERAL (ifexp) ++ && (TREE_CODE (ifexp) == INTEGER_CST ++ || TREE_CODE (ifexp) == ADDR_EXPR)) ++ return (integer_zerop (ifexp) ? op2 : op1); ++ ++ return build (COND_EXPR, TREE_TYPE (op1), ifexp, op1, op2); ++ } ++#endif ++ ++ /* They don't match; promote them both and then try to reconcile them. */ ++ ++ if (TREE_CODE (TREE_TYPE (op1)) != VOID_TYPE) ++ op1 = default_conversion (op1); ++ if (TREE_CODE (TREE_TYPE (op2)) != VOID_TYPE) ++ op2 = default_conversion (op2); ++ ++ type1 = TREE_TYPE (op1); ++ code1 = TREE_CODE (type1); ++ type2 = TREE_TYPE (op2); ++ code2 = TREE_CODE (type2); ++ ++ /* Quickly detect the usual case where op1 and op2 have the same type ++ after promotion. */ ++ if (type1 == type2) ++ result_type = type1; ++ else if ((code1 == INTEGER_TYPE || code1 == REAL_TYPE) ++ && (code2 == INTEGER_TYPE || code2 == REAL_TYPE)) ++ { ++ result_type = commontype (type1, type2); ++ } ++ else if (code1 == VOID_TYPE || code2 == VOID_TYPE) ++ { ++ if (pedantic && (code1 != VOID_TYPE || code2 != VOID_TYPE)) ++ warning ("ANSI C forbids conditional expr with only one void side"); ++ result_type = void_type_node; ++ } ++ else if (code1 == POINTER_TYPE && code2 == POINTER_TYPE) ++ { ++ if (comp_target_types (type1, type2)) ++ result_type = commontype (type1, type2); ++ else if (integer_zerop (op1) && TREE_TYPE (type1) == void_type_node) ++ result_type = qualify_type (type2, type1); ++ else if (integer_zerop (op2) && TREE_TYPE (type2) == void_type_node) ++ result_type = qualify_type (type1, type2); ++ else if (TYPE_MAIN_VARIANT (TREE_TYPE (type1)) == void_type_node) ++ { ++ if (pedantic && TREE_CODE (type2) == FUNCTION_TYPE) ++ warning ("ANSI C forbids conditional expr between `void *' and function pointer"); ++ result_type = qualify_type (type1, type2); ++ } ++ else if (TYPE_MAIN_VARIANT (TREE_TYPE (type2)) == void_type_node) ++ { ++ if (pedantic && TREE_CODE (type1) == FUNCTION_TYPE) ++ warning ("ANSI C forbids conditional expr between `void *' and function pointer"); ++ result_type = qualify_type (type2, type1); ++ } ++ else ++ { ++ warning ("pointer type mismatch in conditional expression"); ++ result_type = build_pointer_type (void_type_node); ++ } ++ } ++ else if (code1 == POINTER_TYPE && code2 == INTEGER_TYPE) ++ { ++ if (!integer_zerop (op2)) ++ warning ("pointer/integer type mismatch in conditional expression"); ++ else ++ { ++ op2 = null_pointer_node; ++#if 0 /* The spec seems to say this is permitted. */ ++ if (pedantic && TREE_CODE (type1) == FUNCTION_TYPE) ++ warning ("ANSI C forbids conditional expr between 0 and function pointer"); ++#endif ++ } ++ result_type = type1; ++ } ++ else if (code2 == POINTER_TYPE && code1 == INTEGER_TYPE) ++ { ++ if (!integer_zerop (op1)) ++ warning ("pointer/integer type mismatch in conditional expression"); ++ else ++ { ++ op1 = null_pointer_node; ++#if 0 /* The spec seems to say this is permitted. */ ++ if (pedantic && TREE_CODE (type2) == FUNCTION_TYPE) ++ warning ("ANSI C forbids conditional expr between 0 and function pointer"); ++#endif ++ } ++ result_type = type2; ++ } ++ ++ if (!result_type) ++ { ++ if (flag_cond_mismatch) ++ result_type = void_type_node; ++ else ++ { ++ error ("type mismatch in conditional expression"); ++ return error_mark_node; ++ } ++ } ++ ++ if (result_type != TREE_TYPE (op1)) ++ op1 = convert (result_type, op1); ++ if (result_type != TREE_TYPE (op2)) ++ op2 = convert (result_type, op2); ++ ++#if 0 ++ if (code1 == RECORD_TYPE || code1 == UNION_TYPE) ++ { ++ result_type = TREE_TYPE (op1); ++ if (TREE_LITERAL (ifexp)) ++ return (integer_zerop (ifexp) ? op2 : op1); ++ ++ if (TYPE_MODE (result_type) == BLKmode) ++ { ++ register tree tempvar ++ = build_decl (VAR_DECL, NULL_TREE, result_type); ++ register tree xop1 = build_modify_expr (tempvar, op1); ++ register tree xop2 = build_modify_expr (tempvar, op2); ++ register tree result = build (COND_EXPR, result_type, ++ ifexp, xop1, xop2); ++ ++ layout_decl (tempvar); ++ /* No way to handle variable-sized objects here. ++ I fear that the entire handling of BLKmode conditional exprs ++ needs to be redone. */ ++ if (! TREE_LITERAL (DECL_SIZE (tempvar))) ++ abort (); ++ DECL_RTL (tempvar) ++ = assign_stack_local (DECL_MODE (tempvar), ++ (TREE_INT_CST_LOW (DECL_SIZE (tempvar)) ++ * DECL_SIZE_UNIT (tempvar) ++ + BITS_PER_UNIT - 1) ++ / BITS_PER_UNIT); ++ ++ TREE_VOLATILE (result) ++ = TREE_VOLATILE (ifexp) | TREE_VOLATILE (op1) ++ | TREE_VOLATILE (op2); ++ return build (COMPOUND_EXPR, result_type, result, tempvar); ++ } ++ } ++#endif /* 0 */ ++ ++ if (TREE_CODE (ifexp) == INTEGER_CST) ++ return (integer_zerop (ifexp) ? op2 : op1); ++ ++ return build (COND_EXPR, result_type, ifexp, op1, op2); ++} ++ ++/* Given a list of expressions, return a compound expression ++ that performs them all and returns the value of the last of them. */ ++ ++tree ++build_compound_expr (list) ++ tree list; ++{ ++ register tree rest; ++ ++ if (TREE_CHAIN (list) == 0) ++ { ++ /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. ++ Strip such NOP_EXPRs, since LIST is used in non-lvalue context. */ ++ if (TREE_CODE (list) == NOP_EXPR ++ && TREE_TYPE (list) == TREE_TYPE (TREE_OPERAND (list, 0))) ++ list = TREE_OPERAND (list, 0); ++ ++ return TREE_VALUE (list); ++ } ++ ++ rest = build_compound_expr (TREE_CHAIN (list)); ++ ++ /* This is patched out so that sizeof (0, array) is distinguishable from ++ sizeof array. */ ++#if 0 ++ if (! TREE_VOLATILE (TREE_VALUE (list))) ++ return rest; ++#endif ++ ++ return build (COMPOUND_EXPR, TREE_TYPE (rest), TREE_VALUE (list), rest); ++} ++ ++/* Build an expression representing a cast to type TYPE of expression EXPR. */ ++ ++tree ++build_c_cast (type, expr) ++ register tree type; ++ tree expr; ++{ ++ register tree value = expr; ++ ++ if (type == error_mark_node || expr == error_mark_node) ++ return error_mark_node; ++ type = TYPE_MAIN_VARIANT (type); ++ ++ /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. ++ Strip such NOP_EXPRs, since VALUE is being used in non-lvalue context. */ ++ if (TREE_CODE (value) == NOP_EXPR ++ && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0))) ++ value = TREE_OPERAND (value, 0); ++ ++ if (TREE_CODE (type) == ARRAY_TYPE) ++ { ++ error ("cast specifies array type"); ++ return error_mark_node; ++ } ++ ++ if (type == TREE_TYPE (value)) ++ { ++ if (pedantic) ++ { ++ if (TREE_CODE (type) == RECORD_TYPE ++ || TREE_CODE (type) == UNION_TYPE) ++ warning ("ANSI C forbids casting nonscalar to the same type"); ++ } ++ } ++ else ++ { ++ tree otype; ++ /* Convert functions and arrays to pointers, ++ but don't convert any other types. */ ++ if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE ++ || TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE) ++ value = default_conversion (value); ++ otype = TREE_TYPE (value); ++ ++ /* Optionally warn about potentially worrysome casts. */ ++ ++ if (warn_cast_qual ++ && TREE_CODE (type) == POINTER_TYPE ++ && TREE_CODE (otype) == POINTER_TYPE) ++ { ++ if (TREE_VOLATILE (TREE_TYPE (otype)) ++ && ! TREE_VOLATILE (TREE_TYPE (type))) ++ warning ("cast discards `volatile' from pointer target type"); ++ if (TREE_READONLY (TREE_TYPE (otype)) ++ && ! TREE_READONLY (TREE_TYPE (type))) ++ warning ("cast discards `const' from pointer target type"); ++ } ++ ++ value = convert (type, value); ++ } ++ ++ if (value == expr) ++ { ++ /* Always produce some operator for an explicit cast, ++ so we can tell (for -pedantic) that the cast is no lvalue. */ ++ tree nvalue = build (NOP_EXPR, type, value); ++ TREE_LITERAL (nvalue) = TREE_LITERAL (value); ++ return nvalue; ++ } ++ return value; ++} ++ ++/* Build an assignment expression of lvalue LHS from value RHS. ++ MODIFYCODE is the code for a binary operator that we use ++ to combine the old value of LHS with RHS to get the new value. ++ Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment. */ ++ ++tree ++build_modify_expr (lhs, modifycode, rhs) ++ tree lhs, rhs; ++ enum tree_code modifycode; ++{ ++ register tree result; ++ tree newrhs; ++ tree lhstype = TREE_TYPE (lhs); ++ tree olhstype = lhstype; ++ ++ /* Types that aren't fully specified cannot be used in assignments. */ ++ lhs = require_complete_type (lhs); ++ ++ /* Avoid duplicate error messages from operands that had errors. */ ++ if (TREE_CODE (lhs) == ERROR_MARK || TREE_CODE (rhs) == ERROR_MARK) ++ return error_mark_node; ++ ++ /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. ++ Strip such NOP_EXPRs, since RHS is being used in non-lvalue context. */ ++ if (TREE_CODE (rhs) == NOP_EXPR ++ && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))) ++ rhs = TREE_OPERAND (rhs, 0); ++ ++ newrhs = rhs; ++ ++ /* Handle control structure constructs used as "lvalues". */ ++ ++ if (!pedantic) ++ switch (TREE_CODE (lhs)) ++ { ++ /* Handle (a, b) used as an "lvalue". */ ++ case COMPOUND_EXPR: ++ return build (COMPOUND_EXPR, lhstype, ++ TREE_OPERAND (lhs, 0), ++ build_modify_expr (TREE_OPERAND (lhs, 1), ++ modifycode, rhs)); ++ ++ /* Handle (a ? b : c) used as an "lvalue". */ ++ case COND_EXPR: ++ rhs = save_expr (rhs); ++ { ++ /* Produce (a ? (b = rhs) : (c = rhs)) ++ except that the RHS goes through a save-expr ++ so the code to compute it is only emitted once. */ ++ tree cond ++ = build_conditional_expr ++ (TREE_OPERAND (lhs, 0), ++ build_modify_expr (TREE_OPERAND (lhs, 1), ++ modifycode, rhs), ++ build_modify_expr (TREE_OPERAND (lhs, 2), ++ modifycode, rhs)); ++ /* Make sure the code to compute the rhs comes out ++ before the split. */ ++ return build (COMPOUND_EXPR, TREE_TYPE (lhs), ++ /* Cast to void to suppress warning ++ from warn_if_unused_value. */ ++ convert (void_type_node, rhs), ++ cond); ++ } ++ } ++ ++ /* If a binary op has been requested, combine the old LHS value with the RHS ++ producing the value we should actually store into the LHS. */ ++ ++ if (modifycode != NOP_EXPR) ++ { ++ lhs = stabilize_reference (lhs); ++ newrhs = build_binary_op (modifycode, lhs, rhs); ++ } ++ ++ /* Handle a cast used as an "lvalue". ++ We have already performed any binary operator using the value as cast. ++ Now convert the result to the true type of the lhs and store there; ++ then cast the result back to the specified type to be the value ++ of the assignment. */ ++ ++ if (!pedantic) ++ switch (TREE_CODE (lhs)) ++ { ++ case NOP_EXPR: ++ case CONVERT_EXPR: ++ case FLOAT_EXPR: ++ case FIX_TRUNC_EXPR: ++ case FIX_FLOOR_EXPR: ++ case FIX_ROUND_EXPR: ++ case FIX_CEIL_EXPR: ++ if (TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE ++ || TREE_CODE (TREE_TYPE (newrhs)) == FUNCTION_TYPE) ++ newrhs = default_conversion (newrhs); ++ { ++ tree inner_lhs = TREE_OPERAND (lhs, 0); ++ tree result = build_modify_expr (inner_lhs, NOP_EXPR, ++ convert (TREE_TYPE (inner_lhs), ++ newrhs)); ++ return convert (TREE_TYPE (lhs), result); ++ } ++ } ++ ++ /* Now we have handled acceptable kinds of LHS that are not truly lvalues. ++ Reject anything strange now. */ ++ ++ if (!lvalue_or_else (lhs, "assignment")) ++ return error_mark_node; ++ ++ /* Warn about storing in something that is `const'. */ ++ ++ if (TREE_READONLY (lhs) ++ || ((TREE_CODE (lhstype) == RECORD_TYPE ++ || TREE_CODE (lhstype) == UNION_TYPE) ++ && C_TYPE_FIELDS_READONLY (lhstype))) ++ readonly_warning (lhs, "assignment"); ++ ++ /* If storing into a structure or union member, ++ it has probably been given type `int'. ++ Compute the type that would go with ++ the actual amount of storage the member occupies. */ ++ ++ if (TREE_CODE (lhs) == COMPONENT_REF ++ && (TREE_CODE (lhstype) == INTEGER_TYPE ++ || TREE_CODE (lhstype) == REAL_TYPE ++ || TREE_CODE (lhstype) == ENUMERAL_TYPE)) ++ lhstype = TREE_TYPE (get_unwidened (lhs, 0)); ++ ++ /* If storing in a field that is in actuality a short or narrower than one, ++ we must store in the field in its actual type. */ ++ ++ if (lhstype != TREE_TYPE (lhs)) ++ { ++ lhs = copy_node (lhs); ++ TREE_TYPE (lhs) = lhstype; ++ } ++ ++ /* Convert new value to destination type. */ ++ ++ newrhs = convert_for_assignment (lhstype, newrhs, "assignment"); ++ if (TREE_CODE (newrhs) == ERROR_MARK) ++ return error_mark_node; ++ ++ result = build (MODIFY_EXPR, lhstype, lhs, newrhs); ++ TREE_VOLATILE (result) = 1; ++ ++ /* If we got the LHS in a different type for storing in, ++ convert the result back to the nominal type of LHS ++ so that the value we return always has the same type ++ as the LHS argument. */ ++ ++ if (olhstype == TREE_TYPE (result)) ++ return result; ++ return convert_for_assignment (olhstype, result, "assignment"); ++} ++ ++/* Return 0 if EXP is not a valid lvalue in this language ++ even though `lvalue_or_else' would accept it. */ ++ ++int ++language_lvalue_valid (exp) ++ tree exp; ++{ ++ return 1; ++} ++ ++/* Convert value RHS to type TYPE as preparation for an assignment ++ to an lvalue of type TYPE. ++ The real work of conversion is done by `convert'. ++ The purpose of this function is to generate error messages ++ for assignments that are not allowed in C. ++ ERRTYPE is a string to use in error messages: ++ "assignment", "return", etc. */ ++ ++static tree ++convert_for_assignment (type, rhs, errtype) ++ tree type, rhs; ++ char *errtype; ++{ ++ register enum tree_code codel = TREE_CODE (type); ++ register tree rhstype; ++ register enum tree_code coder; ++ ++ /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. ++ Strip such NOP_EXPRs, since RHS is used in non-lvalue context. */ ++ if (TREE_CODE (rhs) == NOP_EXPR ++ && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))) ++ rhs = TREE_OPERAND (rhs, 0); ++ ++ if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE ++ || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE) ++ rhs = default_conversion (rhs); ++ ++ rhstype = TREE_TYPE (rhs); ++ coder = TREE_CODE (rhstype); ++ ++ if (coder == ERROR_MARK) ++ return error_mark_node; ++ ++ if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype)) ++ return rhs; ++ ++ if (coder == VOID_TYPE) ++ { ++ error ("void value not ignored as it ought to be"); ++ return error_mark_node; ++ } ++ /* Arithmetic types all interconvert, and enum is treated like int. */ ++ if ((codel == INTEGER_TYPE || codel == REAL_TYPE || codel == ENUMERAL_TYPE) ++ && ++ (coder == INTEGER_TYPE || coder == REAL_TYPE || coder == ENUMERAL_TYPE)) ++ { ++ return convert (type, rhs); ++ } ++ /* Conversions among pointers */ ++ else if (codel == POINTER_TYPE && coder == POINTER_TYPE) ++ { ++ register tree ttl = TREE_TYPE (type); ++ register tree ttr = TREE_TYPE (rhstype); ++ /* Any non-function converts to a [const][volatile] void * ++ and vice versa; otherwise, targets must be the same. ++ Meanwhile, the lhs target must have all the qualifiers of the rhs. */ ++ if (TYPE_MAIN_VARIANT (ttl) == void_type_node ++ || TYPE_MAIN_VARIANT (ttr) == void_type_node ++ || comp_target_types (type, rhstype)) ++ { ++ if (pedantic ++ && ((TYPE_MAIN_VARIANT (ttl) == void_type_node ++ && TREE_CODE (ttr) == FUNCTION_TYPE) ++ || ++ (TYPE_MAIN_VARIANT (ttr) == void_type_node ++ && TREE_CODE (ttl) == FUNCTION_TYPE))) ++ warning ("%s between incompatible pointer types", errtype); ++ else ++ { ++ if (! TREE_READONLY (ttl) && TREE_READONLY (ttr)) ++ warning ("%s of non-const * pointer from const *", errtype); ++ if (! TREE_VOLATILE (ttl) && TREE_VOLATILE (ttr)) ++ warning ("%s of non-volatile * pointer from volatile *", errtype); ++ } ++ } ++ else ++ warning ("%s between incompatible pointer types", errtype); ++ return convert (type, rhs); ++ } ++ else if (codel == POINTER_TYPE && coder == INTEGER_TYPE) ++ { ++ if (! integer_zerop (rhs)) ++ { ++ warning ("%s of pointer from integer lacks a cast", errtype); ++ return convert (type, rhs); ++ } ++ return null_pointer_node; ++ } ++ else if (codel == INTEGER_TYPE && coder == POINTER_TYPE) ++ { ++ warning ("%s of integer from pointer lacks a cast", errtype); ++ return convert (type, rhs); ++ } ++ ++ error ("incompatible types in %s", errtype); ++ return error_mark_node; ++} ++ ++/* Return nonzero if VALUE is a valid constant-valued expression ++ for use in initializing a static variable; one that can be an ++ element of a "constant" initializer. ++ ++ Return 1 if the value is absolute; return 2 if it is relocatable. ++ We assume that VALUE has been folded as much as possible; ++ therefore, we do not need to check for such things as ++ arithmetic-combinations of integers. */ ++ ++static int ++initializer_constant_valid_p (value) ++ tree value; ++{ ++ switch (TREE_CODE (value)) ++ { ++ case CONSTRUCTOR: ++ return TREE_STATIC (value); ++ ++ case INTEGER_CST: ++ case REAL_CST: ++ case STRING_CST: ++ return 1; ++ ++ case ADDR_EXPR: ++ return 2; ++ ++ case CONVERT_EXPR: ++ case NOP_EXPR: ++ /* Allow conversions between types of the same kind. */ ++ if (TREE_CODE (TREE_TYPE (value)) ++ == TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0)))) ++ return initializer_constant_valid_p (TREE_OPERAND (value, 0)); ++ /* Allow (int) &foo. */ ++ if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE ++ && TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == POINTER_TYPE) ++ return initializer_constant_valid_p (TREE_OPERAND (value, 0)); ++ return 0; ++ ++ case PLUS_EXPR: ++ { ++ int valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0)); ++ int valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1)); ++ if (valid0 == 1 && valid1 == 2) ++ return 2; ++ if (valid0 == 2 && valid1 == 1) ++ return 2; ++ return 0; ++ } ++ ++ case MINUS_EXPR: ++ { ++ int valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0)); ++ int valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1)); ++ if (valid0 == 2 && valid1 == 1) ++ return 2; ++ return 0; ++ } ++ } ++ ++ return 0; ++} ++ ++/* Perform appropriate conversions on the initial value of a variable, ++ store it in the declaration DECL, ++ and print any error messages that are appropriate. ++ If the init is invalid, store an ERROR_MARK. */ ++ ++void ++store_init_value (decl, init) ++ tree decl, init; ++{ ++ register tree value, type; ++ ++ /* If variable's type was invalidly declared, just ignore it. */ ++ ++ type = TREE_TYPE (decl); ++ if (TREE_CODE (type) == ERROR_MARK) ++ return; ++ ++ /* Digest the specified initializer into an expression. */ ++ ++ value = digest_init (type, init, 0); ++ ++ /* Store the expression if valid; else report error. */ ++ ++ if (value == error_mark_node) ++ ; ++ else if (TREE_STATIC (decl) && ! TREE_LITERAL (value)) ++ { ++ error ("initializer for static variable is not constant"); ++ value = error_mark_node; ++ } ++ else if (TREE_STATIC (decl) ++ && ! initializer_constant_valid_p (value)) ++ { ++ error ("initializer for static variable uses complicated arithmetic"); ++ value = error_mark_node; ++ } ++ else ++ { ++ if (pedantic && TREE_CODE (value) == CONSTRUCTOR) ++ { ++ if (! TREE_LITERAL (value)) ++ warning ("aggregate initializer is not constant"); ++ else if (! TREE_STATIC (value)) ++ warning ("aggregate initializer uses complicated arithmetic"); ++ } ++ } ++ DECL_INITIAL (decl) = value; ++} ++ ++/* Digest the parser output INIT as an initializer for type TYPE. ++ Return a C expression of type TYPE to represent the initial value. ++ ++ If TAIL is nonzero, it points to a variable holding a list of elements ++ of which INIT is the first. We update the list stored there by ++ removing from the head all the elements that we use. ++ Normally this is only one; we use more than one element only if ++ TYPE is an aggregate and INIT is not a constructor. */ ++ ++tree ++digest_init (type, init, tail) ++ tree type, init, *tail; ++{ ++ enum tree_code code = TREE_CODE (type); ++ tree element = 0; ++ tree old_tail_contents; ++ /* Nonzero if INIT is a braced grouping, which comes in as a CONSTRUCTOR ++ tree node which has no TREE_TYPE. */ ++ int raw_constructor ++ = TREE_CODE (init) == CONSTRUCTOR && TREE_TYPE (init) == 0; ++ ++ /* By default, assume we use one element from a list. ++ We correct this later in the sole case where it is not true. */ ++ ++ if (tail) ++ { ++ old_tail_contents = *tail; ++ *tail = TREE_CHAIN (*tail); ++ } ++ ++ if (init == error_mark_node) ++ return init; ++ ++ if (init && raw_constructor ++ && CONSTRUCTOR_ELTS (init) != 0 ++ && TREE_CHAIN (CONSTRUCTOR_ELTS (init)) == 0) ++ element = TREE_VALUE (CONSTRUCTOR_ELTS (init)); ++ ++ /* Initialization of an array of chars from a string constant ++ optionally enclosed in braces. */ ++ ++ if (code == ARRAY_TYPE) ++ { ++ tree typ1 = TYPE_MAIN_VARIANT (TREE_TYPE (type)); ++ if ((typ1 == char_type_node ++ || typ1 == signed_char_type_node ++ || typ1 == unsigned_char_type_node ++ || typ1 == unsigned_type_node ++ || typ1 == integer_type_node) ++ && ((init && TREE_CODE (init) == STRING_CST) ++ || (element && TREE_CODE (element) == STRING_CST))) ++ { ++ tree string = element ? element : init; ++ ++ if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (string))) ++ != char_type_node) ++ && TYPE_PRECISION (typ1) == TYPE_PRECISION (char_type_node)) ++ { ++ error ("char-array initialized from wide string"); ++ return error_mark_node; ++ } ++ if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (string))) ++ == char_type_node) ++ && TYPE_PRECISION (typ1) == TYPE_PRECISION (integer_type_node)) ++ { ++ error ("int-array initialized from non-wide string"); ++ return error_mark_node; ++ } ++ ++ TREE_TYPE (string) = type; ++ if (TYPE_DOMAIN (type) != 0 ++ && TREE_LITERAL (TYPE_SIZE (type))) ++ { ++ register int size ++ = TREE_INT_CST_LOW (TYPE_SIZE (type)) * TYPE_SIZE_UNIT (type); ++ size = (size + BITS_PER_UNIT - 1) / BITS_PER_UNIT; ++ /* Subtract 1 because it's ok to ignore the terminating null char ++ that is counted in the length of the constant. */ ++ if (size < TREE_STRING_LENGTH (string) - 1) ++ warning ("initializer-string for array of chars is too long"); ++ } ++ return string; ++ } ++ } ++ ++ /* Any type can be initialized from an expression of the same type, ++ optionally with braces. */ ++ ++ if (init && (TREE_TYPE (init) == type ++ || (code == ARRAY_TYPE && TREE_TYPE (init) ++ && comptypes (TREE_TYPE (init), type)))) ++ { ++ if (code == ARRAY_TYPE && TREE_CODE (init) != STRING_CST) ++ { ++ error ("array initialized from non-constant array expression"); ++ return error_mark_node; ++ } ++ if (optimize && TREE_READONLY (init) && TREE_CODE (init) == VAR_DECL) ++ return decl_constant_value (init); ++ return init; ++ } ++ ++ if (element && (TREE_TYPE (element) == type ++ || (code == ARRAY_TYPE && TREE_TYPE (element) ++ && comptypes (TREE_TYPE (element), type)))) ++ { ++ if (code == ARRAY_TYPE) ++ { ++ error ("array initialized from non-constant array expression"); ++ return error_mark_node; ++ } ++ if (pedantic && (code == RECORD_TYPE || code == UNION_TYPE)) ++ warning ("single-expression nonscalar initializer has braces"); ++ if (optimize && TREE_READONLY (element) && TREE_CODE (element) == VAR_DECL) ++ return decl_constant_value (element); ++ return element; ++ } ++ ++ /* Check for initializing a union by its first field. ++ Such an initializer must use braces. */ ++ ++ if (code == UNION_TYPE) ++ { ++ tree result; ++ ++ if (TYPE_FIELDS (type) == 0) ++ { ++ error ("union with no members cannot be initialized"); ++ return error_mark_node; ++ } ++ ++ if (raw_constructor) ++ return process_init_constructor (type, init, 0); ++ else if (tail != 0) ++ { ++ *tail = old_tail_contents; ++ return process_init_constructor (type, 0, tail); ++ } ++ } ++ ++ /* Handle scalar types, including conversions. */ ++ ++ if (code == INTEGER_TYPE || code == REAL_TYPE || code == POINTER_TYPE ++ || code == ENUMERAL_TYPE) ++ { ++ if (raw_constructor) ++ { ++ if (element == 0) ++ { ++ error ("initializer for scalar variable requires one element"); ++ return error_mark_node; ++ } ++ init = element; ++ } ++ ++ if (TREE_CODE (init) == CONSTRUCTOR) ++ { ++ error ("initializer for scalar has extra braces"); ++ return error_mark_node; ++ } ++ ++ return convert_for_assignment (type, default_conversion (init), ++ "initialization"); ++ } ++ ++ /* Come here only for records and arrays. */ ++ ++ if (TYPE_SIZE (type) && ! TREE_LITERAL (TYPE_SIZE (type))) ++ { ++ error ("variable-sized object may not be initialized"); ++ return error_mark_node; ++ } ++ ++ if (code == ARRAY_TYPE || code == RECORD_TYPE) ++ { ++ if (raw_constructor) ++ return process_init_constructor (type, init, 0); ++ else if (tail != 0) ++ { ++ *tail = old_tail_contents; ++ return process_init_constructor (type, 0, tail); ++ } ++ else if (flag_traditional) ++ /* Traditionally one can say `char x[100] = 0;'. */ ++ return process_init_constructor (type, ++ build_nt (CONSTRUCTOR, 0, ++ tree_cons (0, init, 0)), ++ 0); ++ } ++ ++ error ("invalid initializer"); ++ return error_mark_node; ++} ++ ++/* Process a constructor for a variable of type TYPE. ++ The constructor elements may be specified either with INIT or with ELTS, ++ only one of which should be non-null. ++ ++ If INIT is specified, it is a CONSTRUCTOR node which is specifically ++ and solely for initializing this datum. ++ ++ If ELTS is specified, it is the address of a variable containing ++ a list of expressions. We take as many elements as we need ++ from the head of the list and update the list. ++ ++ In the resulting constructor, TREE_LITERAL is set if all elts are ++ constant, and TREE_STATIC is set if, in addition, all elts are simple enough ++ constants that the assembler and linker can compute them. */ ++ ++static tree ++process_init_constructor (type, init, elts) ++ tree type, init, *elts; ++{ ++ register tree tail; ++ /* List of the elements of the result constructor, ++ in reverse order. */ ++ register tree members = NULL; ++ tree result; ++ int allconstant = 1; ++ int allsimple = 1; ++ int error_flag = 0; ++ ++ /* Make TAIL be the list of elements to use for the initialization, ++ no matter how the data was given to us. */ ++ ++ if (elts) ++ tail = *elts; ++ else ++ tail = CONSTRUCTOR_ELTS (init); ++ ++ /* Gobble as many elements as needed, and make a constructor or initial value ++ for each element of this aggregate. Chain them together in result. ++ If there are too few, use 0 for each scalar ultimate component. */ ++ ++ if (TREE_CODE (type) == ARRAY_TYPE) ++ { ++ tree domain = TYPE_DOMAIN (type); ++ register long len; ++ register int i; ++ ++ if (domain) ++ len = TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain)) ++ - TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain)) ++ + 1; ++ else ++ len = -1; /* Take as many as there are */ ++ ++ for (i = 0; (len < 0 || i < len) && tail != 0; i++) ++ { ++ register tree next1; ++ ++ if (TREE_VALUE (tail) != 0) ++ { ++ tree tail1 = tail; ++ next1 = digest_init (TYPE_MAIN_VARIANT (TREE_TYPE (type)), ++ TREE_VALUE (tail), &tail1); ++ if (tail1 != 0 && TREE_CODE (tail1) != TREE_LIST) ++ abort (); ++ if (tail == tail1 && len < 0) ++ { ++ error ("non-empty initializer for array of empty elements"); ++ /* Just ignore what we were supposed to use. */ ++ tail1 = 0; ++ } ++ tail = tail1; ++ } ++ else ++ { ++ next1 = error_mark_node; ++ tail = TREE_CHAIN (tail); ++ } ++ ++ if (next1 == error_mark_node) ++ error_flag = 1; ++ else if (!TREE_LITERAL (next1)) ++ allconstant = 0; ++ else if (! initializer_constant_valid_p (next1)) ++ allsimple = 0; ++ members = tree_cons (NULL_TREE, next1, members); ++ } ++ } ++ if (TREE_CODE (type) == RECORD_TYPE) ++ { ++ register tree field; ++ ++ for (field = TYPE_FIELDS (type); field && tail; ++ field = TREE_CHAIN (field)) ++ { ++ register tree next1; ++ ++ if (! DECL_NAME (field)) ++ { ++ members = tree_cons (field, integer_zero_node, members); ++ continue; ++ } ++ ++ if (TREE_VALUE (tail) != 0) ++ { ++ tree tail1 = tail; ++ next1 = digest_init (TREE_TYPE (field), ++ TREE_VALUE (tail), &tail1); ++ if (tail1 != 0 && TREE_CODE (tail1) != TREE_LIST) ++ abort (); ++ tail = tail1; ++ } ++ else ++ { ++ next1 = error_mark_node; ++ tail = TREE_CHAIN (tail); ++ } ++ ++ if (next1 == error_mark_node) ++ error_flag = 1; ++ else if (!TREE_LITERAL (next1)) ++ allconstant = 0; ++ else if (! initializer_constant_valid_p (next1)) ++ allsimple = 0; ++ members = tree_cons (field, next1, members); ++ } ++ } ++ ++ if (TREE_CODE (type) == UNION_TYPE) ++ { ++ register tree field = TYPE_FIELDS (type); ++ register tree next1; ++ ++ /* For a union, get the initializer for 1 fld. */ ++ ++ if (TREE_VALUE (tail) != 0) ++ { ++ tree tail1 = tail; ++ next1 = digest_init (TREE_TYPE (field), ++ TREE_VALUE (tail), &tail1); ++ if (tail1 != 0 && TREE_CODE (tail1) != TREE_LIST) ++ abort (); ++ tail = tail1; ++ } ++ else ++ { ++ next1 = error_mark_node; ++ tail = TREE_CHAIN (tail); ++ } ++ ++ if (next1 == error_mark_node) ++ error_flag = 1; ++ else if (!TREE_LITERAL (next1)) ++ allconstant = 0; ++ else if (! initializer_constant_valid_p (next1)) ++ allsimple = 0; ++ members = tree_cons (field, next1, members); ++ } ++ ++ /* If arguments were specified as a list, just remove the ones we used. */ ++ if (elts) ++ *elts = tail; ++ /* If arguments were specified as a constructor, ++ complain unless we used all the elements of the constructor. */ ++ else if (tail) ++ warning ("excess elements in aggregate initializer"); ++ ++ if (error_flag) ++ return error_mark_node; ++ ++ result = build (CONSTRUCTOR, type, NULL_TREE, nreverse (members)); ++ if (allconstant) TREE_LITERAL (result) = 1; ++ if (allconstant && allsimple) TREE_STATIC (result) = 1; ++ return result; ++} ++ ++/* Expand an ASM statement with operands, handling output operands ++ that are not variables or INDIRECT_REFS by transforming such ++ cases into cases that expand_asm_operands can handle. ++ ++ Arguments are same as for expand_asm_operands. */ ++ ++void ++c_expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line) ++ tree string, outputs, inputs, clobbers; ++ int vol; ++ char *filename; ++ int line; ++{ ++ int noutputs = list_length (outputs); ++ register int i; ++ /* o[I] is the place that output number I should be written. */ ++ register tree *o = (tree *) alloca (noutputs * sizeof (tree)); ++ register tree tail; ++ ++ /* Record the contents of OUTPUTS before it is modifed. */ ++ for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++) ++ o[i] = TREE_VALUE (tail); ++ ++#if 0 /* Don't do this--it screws up operands expected to be in memory. */ ++ /* Perform default conversions on all inputs. */ ++ for (i = 0, tail = inputs; tail; tail = TREE_CHAIN (tail), i++) ++ TREE_VALUE (tail) = default_conversion (TREE_VALUE (tail)); ++#endif ++ ++ /* Generate the ASM_OPERANDS insn; ++ store into the TREE_VALUEs of OUTPUTS some trees for ++ where the values were actually stored. */ ++ expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line); ++ ++ /* Copy all the intermediate outputs into the specified outputs. */ ++ for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++) ++ { ++ if (o[i] != TREE_VALUE (tail)) ++ expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)), ++ 0, VOIDmode, 0); ++ /* Detect modification of read-only values. ++ (Otherwise done by build_modify_expr.) */ ++ else ++ { ++ tree type = TREE_TYPE (o[i]); ++ if (TREE_READONLY (o[i]) ++ || ((TREE_CODE (type) == RECORD_TYPE ++ || TREE_CODE (type) == UNION_TYPE) ++ && C_TYPE_FIELDS_READONLY (type))) ++ readonly_warning (o[i], "modification by `asm'"); ++ } ++ } ++ ++ /* Those MODIFY_EXPRs could do autoincrements. */ ++ emit_queue (); ++} ++ ++/* Expand a C `return' statement. ++ RETVAL is the expression for what to return, ++ or a null pointer for `return;' with no value. */ ++ ++void ++c_expand_return (retval) ++ tree retval; ++{ ++ tree valtype = TREE_TYPE (TREE_TYPE (current_function_decl)); ++ ++ if (TREE_THIS_VOLATILE (current_function_decl)) ++ warning ("function declared `volatile' has a `return' statement"); ++ ++ if (!retval) ++ { ++ current_function_returns_null = 1; ++ if (warn_return_type && valtype != 0 && TREE_CODE (valtype) != VOID_TYPE) ++ warning ("`return' with no value, in function returning non-void"); ++ expand_null_return (); ++ } ++ else if (valtype == 0 || TREE_CODE (valtype) == VOID_TYPE) ++ { ++ current_function_returns_null = 1; ++ if (pedantic || TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE) ++ warning ("`return' with a value, in function returning void"); ++ expand_return (retval); ++ } ++ else ++ { ++ tree t = convert_for_assignment (valtype, retval, "return"); ++ tree res = DECL_RESULT (current_function_decl); ++ t = build (MODIFY_EXPR, TREE_TYPE (res), ++ res, convert (TREE_TYPE (res), t)); ++ expand_return (t); ++ current_function_returns_value = 1; ++ } ++} ++ ++/* Start a C switch statement, testing expression EXP. ++ Return EXP if it is valid, an error node otherwise. */ ++ ++tree ++c_expand_start_case (exp) ++ tree exp; ++{ ++ register enum tree_code code = TREE_CODE (TREE_TYPE (exp)); ++ tree type = TREE_TYPE (exp); ++ ++ if (code != INTEGER_TYPE && code != ENUMERAL_TYPE && code != ERROR_MARK) ++ { ++ error ("switch quantity not an integer"); ++ exp = error_mark_node; ++ } ++ else ++ { ++ tree index; ++ ++ exp = default_conversion (exp); ++ type = TREE_TYPE (exp); ++ index = get_unwidened (exp, 0); ++ /* We can't strip a conversion from a signed type to an unsigned, ++ because if we did, int_fits_type_p would do the wrong thing ++ when checking case values for being in range, ++ and it's too hard to do the right thing. */ ++ if (TREE_UNSIGNED (TREE_TYPE (exp)) ++ == TREE_UNSIGNED (TREE_TYPE (index))) ++ exp = index; ++ } ++ ++ expand_start_case (1, exp, type); ++ ++ return exp; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/dbranch.c alliance/genview/src/gcc-1.42/dbranch.c +--- alliance-5.0/genview/src/gcc-1.42/dbranch.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/dbranch.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,472 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Delayed branch scheduling pass. ++ Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY. No author or distributor ++accepts responsibility to anyone for the consequences of using it ++or for whether it serves any particular purpose or works at all, ++unless he says so in writing. Refer to the GNU CC General Public ++License for full details. ++ ++Everyone is granted permission to copy, modify and redistribute ++GNU CC, but only under the conditions described in the ++GNU CC General Public License. A copy of this license is ++supposed to have been given to you along with GNU CC so you ++can know your rights and responsibilities. It should be in a ++file named COPYING. Among other things, the copyright notice ++and this notice must be preserved on all copies. */ ++ ++/* Delayed Branch Scheduling Optimization ++ ++If the HAVE_DELAYED_BRANCH macro is defined in the machine ++description, this code is called by toplev.c during optimizing ++compilation immediately after the final jump optimization pass ++and just before assembler output generation, if delayed branch ++scheduling is requested with the -fdelayed-branch switch. ++ ++Machines with delayed branch allow one or more instructions ++placed *after* a branch instruction to be executed while the ++hardware is off fetching the next instruction. These instructions ++are executed after the branch is issued, but before the branch ++actually takes effect. The decision as to whether or not ++the branch is to be taken, and the address of the branch target ++are fixed at the time the branch is issued, so only instructions ++that do not appear in the dependency graphs for computing the ++branch decision and/or target address may be relocated "after" ++the branch. Some machines might have additional restrictions, ++such as not allowing memory instructions or condition code ++modification in the delay sequence. ++ ++Note that this scheduling pass occurs after register allocation, and ++(of course) final jump optimization. This mechanism is *not* intended ++to be hacked to deal with similar memory-latency pipeline scheduling ++(i.e. slots after loads/stores), as tempting as that might be. The ++right place to do load-store latency scheduling is prior to register ++allocation, since allocation may introduce artificial dependencies ++that could have been avoided; note that these artificial dependencies ++are *not* reflected in the flow information, which is one reason for ++the somewhat ad hoc analysis done in this pass. ++ ++The strategy and methods used are as follows. The function DBR_SCHEDULE ++is called from toplev.c if the scheduling pass is to be run. That function ++sets up the dump file, then scans the current function from top to bottom ++for "d-blocks", which are like basic blocks (single-entry, single-exit), ++with the additional condition that the last instruction in the block has ++delay slots. Note that if calls have slots, d-blocks can be smaller than ++basic blocks. If a basic block does not end with a delay-instruction, ++it is skipped. ++ ++To re-order instructions in a d-block (see DBR_DBLOCK_SCHED), the scheduler ++scans backward from the "d-instruction", trying to fill the slots. The ++scheduler is somewhat conservative. Volatile memory references are ++serialized (their order is never changed to avoid possible aliasing ++problems). Definitions of registers are serialized (so there is no ++possibility of deadlock). Since hard register dependencies are ++not noted by flow analysis, the scheduler does its own simplified ++tracking of the registers, memory, and condition code uses/defines ++by the d-instruction and the instructions it depends on). Information ++available from flow analysis is used to shortcut the analysis where ++possible. ++ ++Since only data dependencies are considered by the scheduler, any ++machine-specific restrictions, e.g. to keep memory instructions from ++being scheduled into slots, must be explicit in the definition of ++DBR_INSN_ELIGIBLE_P. ++ ++The scheduler scans backwards over the block, looking for eligible ++insns to fill the slot(s). If none are found, nothing is done, and no ++changes are made to the code. As eligible insns are found, they are ++removed from the chain, and recorded in an INSN_LIST rtx. When all ++slots are full (or the top of the d-block is reached), the *pattern* ++of the d-insn is replaced with a SEQUENCE rtx, which consists of ++a copy of the original d-insn followed by the slot fillers. Slot ++filling instructions remain in the original relative order in the ++sequence. ++ ++When the SEQUENCE pattern is encountered by final, the instructions ++are output "normally", though the output code for the instructions ++may test for this and alter their behavior appropriately. ++ ++*/ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "hard-reg-set.h" ++#include "flags.h" ++ ++FILE *dbr_dump_file; ++ ++/* The number of unfilled delay slots in the current sequence. */ ++static int slots_avail; ++ ++/* A flag, nonzero indicating that some insn that could not ++ go in a slot writes to memory. */ ++ ++static int memw; ++ ++/* A flag, nonzero indicating that the condition code is written ++ by some insn that couldn't go in a delay slot. */ ++ ++static int ccw; ++ ++/* Each bit is nonzero if the corresponding hard register ++ is written by an insn that couldn't go in a delay slot. */ ++ ++static HARD_REG_SET regw; ++ ++/* A flag, set nonzero if ENOTE determines that ++ the current insn can't go in a delay slot because of a ++ data dependency detected by note_stores. */ ++ ++static int eflag; ++ ++/* The insn having delay slots. Global because of the calls through ++ note_stores that need it. */ ++ ++static rtx dinsn; ++ ++/* The insn being currently considered for a delay slot. */ ++ ++static rtx insn; ++ ++/* An INSN_LIST (just like the insn field) that we use to hold ++ LOG_LINKS of ineligible insns. We use what flow analysis ++ stuff we can - this prevents exhaustive searches for write-read ++ dependencies in most cases. This tactic only loses on reloads ++ and code generated with hard regs (instead of pseudos). */ ++ ++static rtx dep_insn_list; ++ ++/* Called by note_stores on "ineligible" insns to keep track of ++ pre-branch dependencies. */ ++static void ++pnote (x, in) ++ rtx x; ++ rtx in; ++{ ++ switch (GET_CODE (x)) ++ { ++ case REG: ++ if (GET_CODE (in) != SET ++ || GET_CODE (SET_SRC (in)) != CALL) ++ SET_HARD_REG_BIT (regw, REGNO (x)); ++ return; ++ case MEM: ++ memw = TRUE; /* this might be relaxed somewhat later */ ++ return; ++ case CC0: ++ ccw = TRUE; ++ return; ++ case PC: ++ return; ++ default: ++ abort (); /* should never happen */ ++ } ++} ++ ++/* The d-block end insn is in DINSN. Initialize the flags to ++ start building the delay sequence. Calls PNOTE from note_stores ++ to track the written registers and memory. */ ++ ++static void ++init_flags () ++{ ++ CLEAR_HARD_REG_SET (regw); ++ memw = ccw = 0; ++ note_stores (PATTERN (dinsn), pnote); ++ if (LOG_LINKS (dinsn)) ++ dep_insn_list = copy_rtx (LOG_LINKS (dinsn)); ++ else ++ dep_insn_list = 0; ++ slots_avail = DBR_SLOTS_AFTER (dinsn); ++} ++ ++ ++/* Called through note_stores on possibly eligible insn patterns. ++ Checks to see if a register written by the pattern is needed by an already ++ ineligible insn. Sets the global EFLAG nonzero if a dependency ++ is found. */ ++ ++static void ++enote (x, p) ++ rtx x; ++ rtx p; ++{ ++ if (eflag == 0) ++ { ++ if (GET_CODE (x) == REG) ++ { ++ if (reg_used_between_p (x, insn, dinsn)) ++ goto lose; ++ if ((!FUNCTION_VALUE_REGNO_P (REGNO (x)) || ++ GET_CODE (dinsn) != CALL_INSN) && ++ reg_mentioned_p (x, (PATTERN (dinsn)))) ++ goto lose; ++ } ++ else if (x == cc0_rtx && ++ reg_used_between_p (x, insn, NEXT_INSN (dinsn))) ++ goto lose; ++ return; ++ lose: ++ eflag = 1; ++ } ++} ++ ++/* Search the current dependency list DEP_INSN_LIST for INSN, ++ return nonzero if found. */ ++ ++static int ++in_dep_list_p (insn) ++ rtx insn; ++{ ++ rtx l; ++ for (l = dep_insn_list; l ; l = XEXP (l, 1)) ++ if (insn == XEXP (l, 0)) return 1; ++ return 0; ++} ++ ++/* Returns zero if INSN is ineligible to be put in a delay slot ++ of DINSN. INSN is ineligible if it: ++ - is in the dependency list of an ineligible insn. ++ - writes a hard register needed by an ineligible insn. ++ - reads a register written by an ineligible insn. ++ - refers to memory. ++ - sets the condition code. ++ - violates a machine-dependent constraint. */ ++ ++static int ++insn_eligible_p () ++{ ++ rtx dest; ++ rtx pat = PATTERN (insn); ++ int i,s; ++ ++ /* See if there are any explicit dependencies on this insn. */ ++ if (in_dep_list_p (insn)) ++ return 0; ++ ++ /* Check for implicit dependencies by calling enote on each ++ store rtx. ENOTE makes sure that no ineligible instruction ++ refers to a register in a way that flow analysis ++ has missed or ignored. */ ++ eflag = 0; ++ note_stores (PATTERN (insn), enote); ++ if (eflag) ++ return 0; ++ ++ /* Check for volatile memory refs if any already ineligible. */ ++ ++ if (memw && volatile_refs_p (pat)) ++ { ++ memw = TRUE; ++ return 0; ++ } ++ ++ /* See if it refers to any regs that are clobbered by ineligibles. */ ++ ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ if (TEST_HARD_REG_BIT (regw, i) ++ && refers_to_regno_p (i, i + 1, pat, 0)) ++ return 0; ++ ++#ifdef DBR_INSN_ELIGIBLE_P ++ /* Check for arbitrary machine constraints if any. */ ++ if (! DBR_INSN_ELIGIBLE_P (insn, dinsn)) ++ return 0; ++#endif ++ ++ return 1; ++} ++ ++/* Add the links in LIST to the dependency list. We put them ++ at the front since this should make searches faster in long ++ d-blocks. ++*/ ++static void ++prepend_to_dep_list (list) ++ rtx list; ++{ ++ rtx l = copy_rtx (list); ++ while (XEXP (l, 1) != 0) ++ l = XEXP (l, 1); ++ XEXP (l, 1) = dep_insn_list; ++ dep_insn_list = l; ++} ++ ++ ++ ++/* Update the flags for ineligible INSN - it can't be put in a delay ++slot. This involves setting bits to indicate the stores of INSN, and ++adding any flow-analysis dependencies of INSN's insn-list to ++the ineligible list. (Should ultimately catch reloads too.) */ ++ ++static void ++update_flags (insn) ++ rtx insn; ++{ ++ rtx l; ++ note_stores (PATTERN (insn), pnote); ++ if (l = LOG_LINKS (insn)) ++ prepend_to_dep_list (l); ++} ++ ++/* Put INSN and LIST together in a SEQUENCE rtx of LENGTH, and replace ++ the pattern of INSN with the SEQUENCE. Include the available ++ slots AVAIL in the SEQUENCE insn. */ ++static void ++emit_delay_sequence (insn, list, length, avail) ++ rtx insn; ++ rtx list; ++ int length; ++ int avail; ++{ ++ register int i = 1; ++ register rtx li, tem; ++ /* Allocate the the rtvec to hold the insns and the SEQUENCE. */ ++ rtvec seqv = rtvec_alloc (length + 1); ++ rtx seq = gen_rtx (SEQUENCE, VOIDmode, seqv); ++ ++ /* Make a copy of the insn having delay slots. */ ++ tem = copy_rtx (insn); ++ NEXT_INSN (tem) = 0; ++ PREV_INSN (tem) = 0; ++ /* Replace the original pattern with a sequence whose ++ first insn is the copy. */ ++ PATTERN (insn) = seq; ++ INSN_CODE (insn) = -1; ++ XVECEXP (seq, 0, 0) = tem; ++ /* Copy in the delay-slot filling insns. */ ++ for (li = list; li; li = XEXP (li, 1)) ++ { ++ XVECEXP (seq, 0, i) = XEXP (li, 0); ++ i++; ++ } ++} ++ ++/* Try to reorganize code in a d-block */ ++ ++static void ++dbr_dblock_sched (first, last) ++ rtx first, last; ++{ ++ rtx delay_insn_list = 0; ++ int seq_len = 0; ++ dinsn = last; ++ if (first == last) return; ++ init_flags (); ++ insn = PREV_INSN (dinsn); ++ while (1) ++ { ++ rtx prev = PREV_INSN (insn); ++ rtx next = NEXT_INSN (insn); ++ if (GET_CODE (insn) == INSN ++ && GET_CODE (PATTERN (insn)) != USE ++ && GET_CODE (PATTERN (insn)) != CLOBBER ++ && GET_CODE (PATTERN (insn)) != ADDR_VEC ++ && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC) ++ { ++ if (slots_avail >= DBR_INSN_SLOTS (insn) && insn_eligible_p ()) ++ { ++ /* Add this insn to the delay sequence and ++ update the number of slots available. */ ++ register rtx t = delay_insn_list; ++ delay_insn_list = gen_rtx (INSN_LIST, VOIDmode, insn, t); ++ seq_len++; ++ slots_avail -= DBR_INSN_SLOTS (insn); ++ ++ /* Now remove it from the chain. */ ++ NEXT_INSN (prev) = next; ++ PREV_INSN (next) = prev; ++ NEXT_INSN (insn) = PREV_INSN (insn) = 0; ++ } ++ else ++ update_flags (insn); ++ } ++ else ++ if (GET_CODE (insn) != NOTE) ++ abort (); ++ if (slots_avail == 0 || insn == first) ++ break; ++ else ++ insn = prev; ++ } ++ /* Done. If the delay list is non-empty, emit a sequence ++ in place of the dinsn. */ ++ if (delay_insn_list != 0) ++ emit_delay_sequence (dinsn, delay_insn_list, seq_len, slots_avail); ++} ++ ++ ++/* ++Identify d-blocks of a function, which are sort of like basic ++blocks, except that any instruction with delay slots defines the end ++of a dblock, and dblocks that do not end in delay-instructions are ++uninteresting degenerate cases. ++ ++This function finds d-blocks in the code for a function, and calls ++dbr_dblock_sched on non-degenerate blocks. Called from toplev.c ++if HAVE_DELAYED_BRANCH is defined and we are doing optimizing ++compilation. F is the first insn of the function, DUMP_FILE ++is the file to output debugging info on if requested. */ ++ ++void ++dbr_schedule (f, dump_file) ++ rtx f; ++ FILE *dump_file; ++{ ++ rtx first = f; ++ rtx insn; ++ /* Dump output if requested */ ++ if (dbr_dump_file = dump_file) ++ fprintf (dbr_dump_file, "Delayed-branch reordering dump.\n"); ++ ++ /* Search for d-blocks by scanning the insns from top to bottom. */ ++ for (insn = first; insn; insn = NEXT_INSN (insn)) ++ { ++ if (DBR_SLOTS_AFTER (insn) > 0) ++ { ++ /* An insn with delay slots always terminates a d-block. ++ Call the scheduler to fill in the slots if possible. */ ++ dbr_dblock_sched (first, insn); ++ ++ /* Resume scanning after the end of the sequence. */ ++ first = NEXT_INSN (dinsn); ++ } ++ else ++ /* Not an end of a real d-block, but need to check ++ if it is the end of a degenerate one. Note that ++ calls or jumps will only reach here if they aren't ++ delayed instructions. */ ++ ++ if (GET_CODE (insn) == CODE_LABEL || ++ GET_CODE (insn) == JUMP_INSN || ++ GET_CODE (insn) == CALL_INSN) ++ first = NEXT_INSN (insn); ++ } ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/dbxout.c alliance/genview/src/gcc-1.42/dbxout.c +--- alliance-5.0/genview/src/gcc-1.42/dbxout.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/dbxout.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,1283 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Output dbx-format symbol table information from GNU compiler. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* Output dbx-format symbol table data. ++ This consists of many symbol table entries, each of them ++ a .stabs assembler pseudo-op with four operands: ++ a "name" which is really a description of one symbol and its type, ++ a "code", which is a symbol defined in stab.h whose name starts with N_, ++ an unused operand always 0, ++ and a "value" which is an address or an offset. ++ The name is enclosed in doublequote characters. ++ ++ Each function, variable, typedef, and structure tag ++ has a symbol table entry to define it. ++ The beginning and end of each level of name scoping within ++ a function are also marked by special symbol table entries. ++ ++ The "name" consists of the symbol name, a colon, a kind-of-symbol letter, ++ and a data type number. The data type number may be followed by ++ "=" and a type definition; normally this will happen the first time ++ the type number is mentioned. The type definition may refer to ++ other types by number, and those type numbers may be followed ++ by "=" and nested definitions. ++ ++ This can make the "name" quite long. ++ When a name is more than 80 characters, we split the .stabs pseudo-op ++ into two .stabs pseudo-ops, both sharing the same "code" and "value". ++ The first one is marked as continued with a double-backslash at the ++ end of its "name". ++ ++ The kind-of-symbol letter distinguished function names from global ++ variables from file-scope variables from parameters from auto ++ variables in memory from typedef names from register variables. ++ See `dbxout_symbol'. ++ ++ The "code" is mostly redundant with the kind-of-symbol letter ++ that goes in the "name", but not entirely: for symbols located ++ in static storage, the "code" says which segment the address is in, ++ which controls how it is relocated. ++ ++ The "value" for a symbol in static storage ++ is the core address of the symbol (actually, the assembler ++ label for the symbol). For a symbol located in a stack slot ++ it is the stack offset; for one in a register, the register number. ++ For a typedef symbol, it is zero. ++ ++ If DEBUG_SYMS_TEXT is defined, all debugging symbols must be ++ output while in the text section. ++ ++ For more on data type definitions, see `dbxout_type'. */ ++ ++#include "config.h" ++#include "tree.h" ++#include "rtl.h" ++#include "flags.h" ++#include ++#include ++#include ++ ++#ifndef errno ++extern int errno; ++#endif ++ ++/* Virtually every UN*X system now in common use (except for pre-4.3-tahoe ++ BSD systems) now provides getcwd as called for by POSIX. Allow for ++ the few exceptions to the general rule here. */ ++ ++#if !(defined (USG) || defined (VMS)) ++extern char *getwd (); ++#define getcwd(buf,len) getwd(buf) ++#define GUESSPATHLEN (MAXPATHLEN + 1) ++#else /* (defined (USG) || defined (VMS)) */ ++extern char *getcwd (); ++/* We actually use this as a starting point, not a limit. */ ++#define GUESSPATHLEN 100 ++#endif /* (defined (USG) || defined (VMS)) */ ++ ++/* Typical USG systems don't have stab.h, and they also have ++ no use for DBX-format debugging info. */ ++ ++#ifdef DBX_DEBUGGING_INFO ++ ++#ifdef DEBUG_SYMS_TEXT ++#define FORCE_TEXT text_section (); ++#else ++#define FORCE_TEXT ++#endif ++ ++#ifdef USG ++#include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */ ++#else ++#include /* On BSD, use the system's stab.h. */ ++#endif /* not USG */ ++ ++/* Stream for writing to assembler file. */ ++ ++static FILE *asmfile; ++ ++enum typestatus {TYPE_UNSEEN, TYPE_XREF, TYPE_DEFINED}; ++ ++/* Vector recording the status of describing C data types. ++ When we first notice a data type (a tree node), ++ we assign it a number using next_type_number. ++ That is its index in this vector. ++ The vector element says whether we have yet output ++ the definition of the type. TYPE_XREF says we have ++ output it as a cross-reference only. */ ++ ++enum typestatus *typevec; ++ ++/* Number of elements of space allocated in `typevec'. */ ++ ++static int typevec_len; ++ ++/* In dbx output, each type gets a unique number. ++ This is the number for the next type output. ++ The number, once assigned, is in the TYPE_SYMTAB_ADDRESS field. */ ++ ++static int next_type_number; ++ ++/* In dbx output, we must assign symbol-blocks id numbers ++ in the order in which their beginnings are encountered. ++ We output debugging info that refers to the beginning and ++ end of the ranges of code in each block ++ with assembler labels LBBn and LBEn, where n is the block number. ++ The labels are generated in final, which assigns numbers to the ++ blocks in the same way. */ ++ ++static int next_block_number; ++ ++/* These variables are for dbxout_symbol to communicate to ++ dbxout_finish_symbol. ++ current_sym_code is the symbol-type-code, a symbol N_... define in stab.h. ++ current_sym_value and current_sym_addr are two ways to address the ++ value to store in the symtab entry. ++ current_sym_addr if nonzero represents the value as an rtx. ++ If that is zero, current_sym_value is used. This is used ++ when the value is an offset (such as for auto variables, ++ register variables and parms). */ ++ ++static int current_sym_code; ++static int current_sym_value; ++static rtx current_sym_addr; ++ ++/* Number of chars of symbol-description generated so far for the ++ current symbol. Used by CHARS and CONTIN. */ ++ ++static int current_sym_nchars; ++ ++/* Report having output N chars of the current symbol-description. */ ++ ++#define CHARS(N) (current_sym_nchars += (N)) ++ ++/* Break the current symbol-description, generating a continuation, ++ if it has become long. */ ++ ++#ifndef DBX_CONTIN_LENGTH ++#define DBX_CONTIN_LENGTH 80 ++#endif ++ ++#if DBX_CONTIN_LENGTH > 0 ++#define CONTIN \ ++ do {if (current_sym_nchars > DBX_CONTIN_LENGTH) dbxout_continue ();} while (0) ++#else ++#define CONTIN ++#endif ++ ++void dbxout_types (); ++void dbxout_tags (); ++void dbxout_args (); ++void dbxout_symbol (); ++static void dbxout_type_name (); ++static void dbxout_type (); ++static void dbxout_finish_symbol (); ++static void dbxout_continue (); ++ ++/* At the beginning of compilation, start writing the symbol table. ++ Initialize `typevec' and output the standard data types of C. */ ++ ++void ++dbxout_init (asm_file, input_file_name) ++ FILE *asm_file; ++ char *input_file_name; ++{ ++ asmfile = asm_file; ++ ++ typevec_len = 100; ++ typevec = (enum typestatus *) xmalloc (typevec_len * sizeof typevec[0]); ++ bzero (typevec, typevec_len * sizeof typevec[0]); ++ ++ /* Put the current working directory in an N_SO symbol. */ ++ { ++ static char *cwd; ++ static enum {not_gotten, gotten, error_getting} cwd_status = not_gotten; ++ int size; ++ ++ if (cwd_status == not_gotten) ++ { ++ char *value; ++ ++ /* Read the working directory, avoiding arbitrary limit. */ ++ size = GUESSPATHLEN; ++ while (1) ++ { ++ cwd = (char *) xmalloc (size); ++ value = getcwd (cwd, size); ++ if (value != 0 || errno != ERANGE) ++ break; ++ free (cwd); ++ size *= 2; ++ } ++ ++ if (value != 0) ++ cwd_status = gotten; ++ else ++ cwd_status = error_getting; ++ } ++ ++ if (cwd_status == gotten) ++ { ++#ifdef ASM_OUTPUT_MAIN_SOURCE_DIRECTORY ++ ASM_OUTPUT_MAIN_SOURCE_DIRECTORY (asmfile, cwd); ++#else /* no ASM_OUTPUT_MAIN_SOURCE_DIRECTORY */ ++ fprintf (asmfile, "%s \"%s/\",%d,0,0,%s\n", ".stabs", ++ cwd, N_SO, "Ltext"); ++#endif /* no ASM_OUTPUT_MAIN_SOURCE_DIRECTORY */ ++ } ++ } ++ ++ /* Used to put `Ltext:' before the reference, but that loses on sun 4. */ ++ fprintf (asmfile, ++ "\t.stabs \"%s\",%d,0,0,Ltext\nLtext:\n", ++ input_file_name, N_SO); ++ ++ next_type_number = 1; ++ next_block_number = 2; ++ ++ /* Make sure that types `int' and `char' have numbers 1 and 2. ++ Definitions of other integer types will refer to those numbers. */ ++ ++ dbxout_symbol (TYPE_NAME (integer_type_node), 0); ++ dbxout_symbol (TYPE_NAME (char_type_node), 0); ++ ++ /* Get all permanent types not yet gotten, and output them. */ ++ ++ dbxout_types (get_permanent_types ()); ++} ++ ++/* Continue a symbol-description that gets too big. ++ End one symbol table entry with a double-backslash ++ and start a new one, eventually producing something like ++ .stabs "start......\\",code,0,value ++ .stabs "...rest",code,0,value */ ++ ++static void ++dbxout_continue () ++{ ++#ifdef DBX_CONTIN_CHAR ++ fprintf (asmfile, "%c", DBX_CONTIN_CHAR); ++#else ++ fprintf (asmfile, "\\\\"); ++#endif ++ dbxout_finish_symbol (); ++ fprintf (asmfile, ".stabs \""); ++ current_sym_nchars = 0; ++} ++ ++/* Output a reference to a type. If the type has not yet been ++ described in the dbx output, output its definition now. ++ For a type already defined, just refer to its definition ++ using the type number. ++ ++ If FULL is nonzero, and the type has been described only with ++ a forward-reference, output the definition now. ++ If FULL is zero in this case, just refer to the forward-reference ++ using the number previously allocated. */ ++ ++static void ++dbxout_type (type, full) ++ tree type; ++ int full; ++{ ++ register tree tem; ++ ++ /* If there was an input error and we don't really have a type, ++ avoid crashing and write something that is at least valid ++ by assuming `int'. */ ++ if (type == error_mark_node) ++ type = integer_type_node; ++ else ++ type = TYPE_MAIN_VARIANT (type); ++ ++ if (TYPE_SYMTAB_ADDRESS (type) == 0) ++ { ++ /* Type has no dbx number assigned. Assign next available number. */ ++ TYPE_SYMTAB_ADDRESS (type) = next_type_number++; ++ ++ /* Make sure type vector is long enough to record about this type. */ ++ ++ if (next_type_number == typevec_len) ++ { ++ typevec = (enum typestatus *) xrealloc (typevec, typevec_len * 2 * sizeof typevec[0]); ++ bzero (typevec + typevec_len, typevec_len * sizeof typevec[0]); ++ typevec_len *= 2; ++ } ++ } ++ ++ /* Output the number of this type, to refer to it. */ ++ fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type)); ++ CHARS (3); ++ ++ /* If this type's definition has been output or is now being output, ++ that is all. */ ++ ++ switch (typevec[TYPE_SYMTAB_ADDRESS (type)]) ++ { ++ case TYPE_UNSEEN: ++ break; ++ case TYPE_XREF: ++ if (! full) ++ return; ++ break; ++ case TYPE_DEFINED: ++ return; ++ } ++ ++#ifdef DBX_NO_XREFS ++ /* For systems where dbx output does not allow the `=xsNAME:' syntax, ++ leave the type-number completely undefined rather than output ++ a cross-reference. */ ++ if (TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE ++ || TREE_CODE (type) == ENUMERAL_TYPE) ++ ++ if ((TYPE_NAME (type) != 0 && !full) ++ || TYPE_SIZE (type) == 0) ++ { ++ typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF; ++ return; ++ } ++#endif ++ ++ /* Output a definition now. */ ++ ++ fprintf (asmfile, "="); ++ CHARS (1); ++ ++ /* Mark it as defined, so that if it is self-referent ++ we will not get into an infinite recursion of definitions. */ ++ ++ typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_DEFINED; ++ ++ switch (TREE_CODE (type)) ++ { ++ case VOID_TYPE: ++ /* For a void type, just define it as itself; ie, "5=5". ++ This makes us consider it defined ++ without saying what it is. The debugger will make it ++ a void type when the reference is seen, and nothing will ++ ever override that default. */ ++ fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type)); ++ CHARS (3); ++ break; ++ ++ case INTEGER_TYPE: ++ if (type == char_type_node && ! TREE_UNSIGNED (type)) ++ /* Output the type `char' as a subrange of itself! ++ I don't understand this definition, just copied it ++ from the output of pcc. */ ++ fprintf (asmfile, "r2;0;127;"); ++ else ++ /* Output other integer types as subranges of `int'. */ ++ fprintf (asmfile, "r1;%d;%d;", ++ TREE_INT_CST_LOW (TYPE_MIN_VALUE (type)), ++ TREE_INT_CST_LOW (TYPE_MAX_VALUE (type))); ++ CHARS (25); ++ break; ++ ++ case REAL_TYPE: ++ /* This must be magic. */ ++ fprintf (asmfile, "r1;%d;0;", ++ TREE_INT_CST_LOW (size_in_bytes (type))); ++ CHARS (16); ++ break; ++ ++ case ARRAY_TYPE: ++ /* Output "a" followed by a range type definition ++ for the index type of the array ++ followed by a reference to the target-type. ++ ar1;0;N;M for an array of type M and size N. */ ++ fprintf (asmfile, "ar1;0;%d;", ++ (TYPE_DOMAIN (type) ++ ? TREE_INT_CST_LOW (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) ++ : -1)); ++ CHARS (17); ++ dbxout_type (TREE_TYPE (type), 0); ++ break; ++ ++ case RECORD_TYPE: ++ case UNION_TYPE: ++ /* Output a structure type. */ ++ if ((TYPE_NAME (type) != 0 && !full) ++ || TYPE_SIZE (type) == 0) ++ { ++ /* If the type is just a cross reference, output one ++ and mark the type as partially described. ++ If it later becomes defined, we will output ++ its real definition. ++ If the type has a name, don't nest its definition within ++ another type's definition; instead, output an xref ++ and let the definition come when the name is defined. */ ++ fprintf (asmfile, (TREE_CODE (type) == RECORD_TYPE) ? "xs" : "xu"); ++ CHARS (3); ++#if 0 /* This assertion is legitimately false in C++. */ ++ /* We shouldn't be outputting a reference to a type before its ++ definition unless the type has a tag name. ++ A typedef name without a tag name should be impossible. */ ++ if (TREE_CODE (TYPE_NAME (type)) != IDENTIFIER_NODE) ++ abort (); ++#endif ++ dbxout_type_name (type); ++ fprintf (asmfile, ":"); ++ typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF; ++ break; ++ } ++ tem = size_in_bytes (type); ++ fprintf (asmfile, (TREE_CODE (type) == RECORD_TYPE) ? "s%d" : "u%d", ++ TREE_INT_CST_LOW (tem)); ++ ++ if (TYPE_BASETYPES (type) && use_gdb_dbx_extensions) ++ { ++ putc ('!', asmfile); ++ putc ((TREE_PUBLIC (TYPE_BASETYPES (type)) ? '2' : '0'), ++ asmfile); ++ dbxout_type (TREE_VALUE (TYPE_BASETYPES (type)), 0); ++ putc (',', asmfile); ++ CHARS (3); ++ } ++ CHARS (11); ++ ++ for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem)) ++ /* Output the name, type, position (in bits), size (in bits) ++ of each field. */ ++ /* Omit here the nameless fields that are used to skip bits. */ ++ if (DECL_NAME (tem) != 0) ++ { ++ /* Continue the line if necessary, ++ but not before the first field. */ ++ if (tem != TYPE_FIELDS (type)) ++ CONTIN; ++ fprintf (asmfile, "%s:", IDENTIFIER_POINTER (DECL_NAME (tem))); ++ CHARS (2 + IDENTIFIER_LENGTH (DECL_NAME (tem))); ++#ifdef TREE_PRIVATE ++ if (use_gdb_dbx_extensions ++ && (TREE_PRIVATE (tem) || TREE_PROTECTED (tem) ++ || TREE_CODE (tem) != FIELD_DECL)) ++ { ++ putc ('/', asmfile); ++ putc ((TREE_PRIVATE (tem) ? '0' ++ : TREE_PROTECTED (tem) ? '1' : '2'), ++ asmfile); ++ CHARS (2); ++ if (TREE_CODE (tem) == FUNCTION_DECL) ++ { ++ putc (':', asmfile); ++ CHARS (1); ++ dbxout_type (TREE_TYPE (tem), 0); /* FUNCTION_TYPE */ ++ dbxout_args (TYPE_ARG_TYPES (TREE_TYPE (tem))); ++#ifdef TREE_VIRTUAL ++ fprintf (asmfile, ":%s;%c", ++ XSTR (XEXP (DECL_RTL (tem), 0), 0), ++ TREE_VIRTUAL (tem) ? '*' : '.'); ++#endif ++ CHARS (3 + strlen (XSTR (XEXP (DECL_RTL (tem), 0), 0))); ++ } ++ else ++ dbxout_type (TREE_TYPE (tem), 0); ++ } ++ else ++#endif ++ dbxout_type (TREE_TYPE (tem), 0); ++ ++ if (TREE_CODE (tem) == VAR_DECL) ++ { ++ if (use_gdb_dbx_extensions) ++ { ++ fprintf (asmfile, ":%s", ++ XSTR (XEXP (DECL_RTL (tem), 0), 0)); ++ CHARS (2 + strlen (XSTR (XEXP (DECL_RTL (tem), 0), 0))); ++ } ++ else ++ { ++ fprintf (asmfile, ",0,0;"); ++ CHARS (5); ++ } ++ } ++ else ++ { ++ fprintf (asmfile, ",%d,%d;", DECL_OFFSET (tem), ++ (TREE_INT_CST_LOW (DECL_SIZE (tem)) ++ * DECL_SIZE_UNIT (tem))); ++ CHARS (23); ++ } ++ } ++ ++ putc (';', asmfile); ++ CHARS (1); ++ break; ++ ++ case ENUMERAL_TYPE: ++ if ((TYPE_NAME (type) != 0 && !full) ++ || TYPE_SIZE (type) == 0) ++ { ++ fprintf (asmfile, "xe"); ++ CHARS (3); ++ dbxout_type_name (type); ++ typevec[TYPE_SYMTAB_ADDRESS (type)] = TYPE_XREF; ++ fprintf (asmfile, ":"); ++ return; ++ } ++ putc ('e', asmfile); ++ CHARS (1); ++ for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem)) ++ { ++ fprintf (asmfile, "%s:%d,", IDENTIFIER_POINTER (TREE_PURPOSE (tem)), ++ TREE_INT_CST_LOW (TREE_VALUE (tem))); ++ CHARS (11 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem))); ++ if (TREE_CHAIN (tem) != 0) ++ CONTIN; ++ } ++ putc (';', asmfile); ++ CHARS (1); ++ break; ++ ++ case POINTER_TYPE: ++ putc ('*', asmfile); ++ CHARS (1); ++ dbxout_type (TREE_TYPE (type), 0); ++ break; ++ ++ case METHOD_TYPE: ++ if (use_gdb_dbx_extensions) ++ { ++ putc ('@', asmfile); ++ CHARS (1); ++ dbxout_type (TYPE_METHOD_BASETYPE (type), 0); ++ putc (',', asmfile); ++ CHARS (1); ++ dbxout_type (TREE_TYPE (type), 0); ++ } ++ else ++ { ++ /* Treat it as a function type. */ ++ dbxout_type (TREE_TYPE (type), 0); ++ } ++ break; ++ ++ case OFFSET_TYPE: ++ if (use_gdb_dbx_extensions) ++ { ++ putc ('@', asmfile); ++ CHARS (1); ++ dbxout_type (TYPE_OFFSET_BASETYPE (type), 0); ++ putc (',', asmfile); ++ CHARS (1); ++ dbxout_type (TREE_TYPE (type), 0); ++ } ++ else ++ { ++ /* Treat it as a function type. */ ++ dbxout_type (TREE_TYPE (type), 0); ++ } ++ break; ++ ++ case REFERENCE_TYPE: ++ putc (use_gdb_dbx_extensions ? '&' : '*', asmfile); ++ CHARS (1); ++ dbxout_type (TREE_TYPE (type), 0); ++ break; ++ ++ case FUNCTION_TYPE: ++ putc ('f', asmfile); ++ CHARS (1); ++ dbxout_type (TREE_TYPE (type), 0); ++ break; ++ ++ default: ++ abort (); ++ } ++} ++ ++/* Output the name of type TYPE, with no punctuation. ++ Such names can be set up either by typedef declarations ++ or by struct, enum and union tags. */ ++ ++static void ++dbxout_type_name (type) ++ register tree type; ++{ ++ tree t; ++ if (TYPE_NAME (type) == 0) ++ abort (); ++ if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) ++ { ++ t = TYPE_NAME (type); ++ } ++ else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL) ++ { ++ t = DECL_NAME (TYPE_NAME (type)); ++ } ++ else ++ abort (); ++ ++ fprintf (asmfile, "%s", IDENTIFIER_POINTER (t)); ++ CHARS (IDENTIFIER_LENGTH (t)); ++} ++ ++/* Output a .stabs for the symbol defined by DECL, ++ which must be a ..._DECL node in the normal namespace. ++ It may be a CONST_DECL, a FUNCTION_DECL, a PARM_DECL or a VAR_DECL. ++ LOCAL is nonzero if the scope is less than the entire file. */ ++ ++void ++dbxout_symbol (decl, local) ++ tree decl; ++ int local; ++{ ++ int letter = 0; ++ tree type = TREE_TYPE (decl); ++ ++ /* If global, first output all types and all ++ struct, enum and union tags that have been created ++ and not yet output. */ ++ ++ if (local == 0) ++ { ++ dbxout_tags (gettags ()); ++ dbxout_types (get_permanent_types ()); ++ } ++ ++ current_sym_code = 0; ++ current_sym_value = 0; ++ current_sym_addr = 0; ++ ++ /* The output will always start with the symbol name, ++ so count that always in the length-output-so-far. */ ++ ++ current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (decl)); ++ ++ switch (TREE_CODE (decl)) ++ { ++ case CONST_DECL: ++ /* Enum values are defined by defining the enum type. */ ++ break; ++ ++ case FUNCTION_DECL: ++ if (DECL_RTL (decl) == 0) ++ return; ++ if (TREE_EXTERNAL (decl)) ++ break; ++ if (GET_CODE (DECL_RTL (decl)) != MEM ++ || GET_CODE (XEXP (DECL_RTL (decl), 0)) != SYMBOL_REF) ++ break; ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:%c", ++ IDENTIFIER_POINTER (DECL_NAME (decl)), ++ TREE_PUBLIC (decl) ? 'F' : 'f'); ++ ++ current_sym_code = N_FUN; ++ current_sym_addr = XEXP (DECL_RTL (decl), 0); ++ ++ if (TREE_TYPE (TREE_TYPE (decl))) ++ dbxout_type (TREE_TYPE (TREE_TYPE (decl)), 0); ++ else ++ dbxout_type (void_type_node, 0); ++ dbxout_finish_symbol (); ++ break; ++ ++ case TYPE_DECL: ++#if 0 ++ /* This seems all wrong. Outputting most kinds of types gives no name ++ at all. A true definition gives no name; a cross-ref for a ++ structure can give the tag name, but not a type name. ++ It seems that no typedef name is defined by outputting a type. */ ++ ++ /* If this typedef name was defined by outputting the type, ++ don't duplicate it. */ ++ if (typevec[TYPE_SYMTAB_ADDRESS (type)] == TYPE_DEFINED ++ && TYPE_NAME (TREE_TYPE (decl)) == decl) ++ return; ++#endif ++ /* Don't output the same typedef twice. */ ++ if (TREE_ASM_WRITTEN (decl)) ++ return; ++ ++ /* Output typedef name. */ ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:t", ++ IDENTIFIER_POINTER (DECL_NAME (decl))); ++ ++ current_sym_code = N_LSYM; ++ ++ dbxout_type (TREE_TYPE (decl), 1); ++ dbxout_finish_symbol (); ++ ++ /* Prevent duplicate output of a typedef. */ ++ TREE_ASM_WRITTEN (decl) = 1; ++ break; ++ ++ case PARM_DECL: ++ /* Parm decls go in their own separate chains ++ and are output by dbxout_reg_parms and dbxout_parms. */ ++ abort (); ++ ++ case VAR_DECL: ++ if (DECL_RTL (decl) == 0) ++ return; ++ /* Don't mention a variable that is external. ++ Let the file that defines it describe it. */ ++ if (TREE_EXTERNAL (decl)) ++ break; ++ ++ /* Don't mention a variable at all ++ if it was completely optimized into nothingness. */ ++ if (GET_CODE (DECL_RTL (decl)) == REG ++ && (REGNO (DECL_RTL (decl)) < 0 ++ || REGNO (DECL_RTL (decl)) >= FIRST_PSEUDO_REGISTER)) ++ break; ++ ++ /* The kind-of-variable letter depends on where ++ the variable is and on the scope of its name: ++ G and N_GSYM for static storage and global scope, ++ S for static storage and file scope, ++ V for static storage and local scope, ++ for those two, use N_LCSYM if data is in bss segment, ++ N_STSYM if in data segment, N_FUN otherwise. ++ (We used N_FUN originally, then changed to N_STSYM ++ to please GDB. However, it seems that confused ld. ++ Now GDB has been fixed to like N_FUN, says Kingdon.) ++ no letter at all, and N_LSYM, for auto variable, ++ r and N_RSYM for register variable. */ ++ ++ if (GET_CODE (DECL_RTL (decl)) == MEM ++ && GET_CODE (XEXP (DECL_RTL (decl), 0)) == SYMBOL_REF) ++ { ++ if (TREE_PUBLIC (decl)) ++ { ++ letter = 'G'; ++ current_sym_code = N_GSYM; ++ } ++ else ++ { ++ current_sym_addr = XEXP (DECL_RTL (decl), 0); ++ ++ letter = TREE_PERMANENT (decl) ? 'S' : 'V'; ++ ++ if (!DECL_INITIAL (decl)) ++ current_sym_code = N_LCSYM; ++ else if (TREE_READONLY (decl) && ! TREE_VOLATILE (decl)) ++ /* This is not quite right, but it's the closest ++ of all the codes that Unix defines. */ ++ current_sym_code = N_FUN; ++ else ++ { ++/* Ultrix `as' seems to need this. */ ++#ifdef DBX_STATIC_STAB_DATA_SECTION ++ data_section (); ++#endif ++ current_sym_code = N_STSYM; ++ } ++ } ++ } ++ else if (GET_CODE (DECL_RTL (decl)) == REG) ++ { ++ letter = 'r'; ++ current_sym_code = N_RSYM; ++ current_sym_value = DBX_REGISTER_NUMBER (REGNO (DECL_RTL (decl))); ++ } ++ else if (GET_CODE (DECL_RTL (decl)) == SUBREG) ++ { ++ rtx value = DECL_RTL (decl); ++ int offset = 0; ++ while (GET_CODE (value) == SUBREG) ++ { ++ offset += SUBREG_WORD (value); ++ value = SUBREG_REG (value); ++ } ++ letter = 'r'; ++ current_sym_code = N_RSYM; ++ current_sym_value = DBX_REGISTER_NUMBER (REGNO (value) + offset); ++ } ++ else if (GET_CODE (DECL_RTL (decl)) == MEM ++ && (GET_CODE (XEXP (DECL_RTL (decl), 0)) == MEM ++ || (GET_CODE (XEXP (DECL_RTL (decl), 0)) == REG ++ && REGNO (XEXP (DECL_RTL (decl), 0)) != FRAME_POINTER_REGNUM))) ++ /* If the value is indirect by memory or by a register ++ that isn't the frame pointer ++ then it means the object is variable-sized and address through ++ that register or stack slot. DBX has no way to represent this ++ so all we can do is output the variable as a pointer. ++ If it's not a parameter, ignore it. ++ (VAR_DECLs like this can be made by integrate.c.) */ ++ { ++ if (GET_CODE (XEXP (DECL_RTL (decl), 0)) == REG) ++ { ++ letter = 'r'; ++ current_sym_code = N_RSYM; ++ current_sym_value = DBX_REGISTER_NUMBER (REGNO (XEXP (DECL_RTL (decl), 0))); ++ } ++ else ++ { ++ current_sym_code = N_LSYM; ++ /* DECL_RTL looks like (MEM (MEM (PLUS (REG...) (CONST_INT...)))). ++ We want the value of that CONST_INT. */ ++ current_sym_value = INTVAL (XEXP (XEXP (XEXP (DECL_RTL (decl), 0), 0), 1)); ++ } ++ ++ /* Effectively do build_pointer_type, but don't cache this type, ++ since it might be temporary whereas the type it points to ++ might have been saved for inlining. */ ++ type = make_node (POINTER_TYPE); ++ TREE_TYPE (type) = TREE_TYPE (decl); ++ } ++ else if (GET_CODE (DECL_RTL (decl)) == MEM ++ && GET_CODE (XEXP (DECL_RTL (decl), 0)) == REG) ++ { ++ current_sym_code = N_LSYM; ++ current_sym_value = 0; ++ } ++ else if (GET_CODE (DECL_RTL (decl)) == MEM ++ && GET_CODE (XEXP (DECL_RTL (decl), 0)) == PLUS ++ && GET_CODE (XEXP (XEXP (DECL_RTL (decl), 0), 1)) == CONST_INT) ++ { ++ current_sym_code = N_LSYM; ++ /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))) ++ We want the value of that CONST_INT. */ ++ current_sym_value = INTVAL (XEXP (XEXP (DECL_RTL (decl), 0), 1)); ++ } ++ else ++ /* Address might be a MEM, when DECL is a variable-sized object. ++ Or it might be const0_rtx, meaning previous passes ++ want us to ignore this variable. */ ++ break; ++ ++ /* Ok, start a symtab entry and output the variable name. */ ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:", ++ IDENTIFIER_POINTER (DECL_NAME (decl))); ++ if (letter) putc (letter, asmfile); ++ dbxout_type (type, 0); ++ dbxout_finish_symbol (); ++ break; ++ } ++} ++ ++static void ++dbxout_finish_symbol () ++{ ++ fprintf (asmfile, "\",%d,0,0,", current_sym_code); ++ if (current_sym_addr) ++ output_addr_const (asmfile, current_sym_addr); ++ else ++ fprintf (asmfile, "%d", current_sym_value); ++ putc ('\n', asmfile); ++} ++ ++/* Output definitions of all the decls in a chain. */ ++ ++static void ++dbxout_syms (syms) ++ tree syms; ++{ ++ while (syms) ++ { ++ dbxout_symbol (syms, 1); ++ syms = TREE_CHAIN (syms); ++ } ++} ++ ++/* The following two functions output definitions of function parameters. ++ Each parameter gets a definition locating it in the parameter list. ++ Each parameter that is a register variable gets a second definition ++ locating it in the register. ++ ++ Printing or argument lists in gdb uses the definitions that ++ locate in the parameter list. But reference to the variable in ++ expressions uses preferentially the definition as a register. */ ++ ++/* Output definitions, referring to storage in the parmlist, ++ of all the parms in PARMS, which is a chain of PARM_DECL nodes. */ ++ ++static void ++dbxout_parms (parms) ++ tree parms; ++{ ++ for (; parms; parms = TREE_CHAIN (parms)) ++ { ++ if (DECL_OFFSET (parms) >= 0) ++ { ++ current_sym_code = N_PSYM; ++ current_sym_value = DECL_OFFSET (parms) / BITS_PER_UNIT; ++ current_sym_addr = 0; ++ current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms))); ++ ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:p", ++ IDENTIFIER_POINTER (DECL_NAME (parms))); ++ ++ if (GET_CODE (DECL_RTL (parms)) == REG ++ && REGNO (DECL_RTL (parms)) >= 0 ++ && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER) ++ dbxout_type (DECL_ARG_TYPE (parms), 0); ++ else ++ { ++ /* This is the case where the parm is passed as an int or double ++ and it is converted to a char, short or float and stored back ++ in the parmlist. In this case, describe the parm ++ with the variable's declared type, and adjust the address ++ if the least significant bytes (which we are using) are not ++ the first ones. */ ++#ifdef BYTES_BIG_ENDIAN ++ if (TREE_TYPE (parms) != DECL_ARG_TYPE (parms)) ++ current_sym_value += (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms))) ++ - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms)))); ++#endif ++ ++ if (GET_CODE (DECL_RTL (parms)) == MEM ++ && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS ++ && GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == CONST_INT ++ && INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == current_sym_value) ++ dbxout_type (TREE_TYPE (parms), 0); ++ else ++ { ++ current_sym_value = DECL_OFFSET (parms) / BITS_PER_UNIT; ++ dbxout_type (DECL_ARG_TYPE (parms), 0); ++ } ++ } ++ dbxout_finish_symbol (); ++ } ++ /* Parm was passed in registers. ++ If it lives in a hard register, output a "regparm" symbol ++ for the register it lives in. */ ++ else if (GET_CODE (DECL_RTL (parms)) == REG ++ && REGNO (DECL_RTL (parms)) >= 0 ++ && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER) ++ { ++ current_sym_code = N_RSYM; ++ current_sym_value = DBX_REGISTER_NUMBER (REGNO (DECL_RTL (parms))); ++ current_sym_addr = 0; ++ current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms))); ++ ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:P", ++ IDENTIFIER_POINTER (DECL_NAME (parms))); ++ ++ dbxout_type (DECL_ARG_TYPE (parms), 0); ++ dbxout_finish_symbol (); ++ } ++ else if (GET_CODE (DECL_RTL (parms)) == MEM ++ && XEXP (DECL_RTL (parms), 0) != const0_rtx) ++ { ++ current_sym_code = N_LSYM; ++ /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))). ++ We want the value of that CONST_INT. */ ++ current_sym_value = INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)); ++ current_sym_addr = 0; ++ current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms))); ++ ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:p", ++ IDENTIFIER_POINTER (DECL_NAME (parms))); ++ ++#if 0 /* This is actually the case in which a parameter ++ is passed in registers but lives on the stack in a local slot. ++ The address we are using is already correct, so don't change it. */ ++ ++ /* This is the case where the parm is passed as an int or double ++ and it is converted to a char, short or float and stored back ++ in the parmlist. In this case, describe the parm ++ with the variable's declared type, and adjust the address ++ if the least significant bytes (which we are using) are not ++ the first ones. */ ++#ifdef BYTES_BIG_ENDIAN ++ if (TREE_TYPE (parms) != DECL_ARG_TYPE (parms)) ++ current_sym_value += (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms))) ++ - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms)))); ++#endif ++#endif /* 0 */ ++ ++ dbxout_type (TREE_TYPE (parms), 0); ++ dbxout_finish_symbol (); ++ } ++ } ++} ++ ++/* Output definitions, referring to registers, ++ of all the parms in PARMS which are stored in registers during the function. ++ PARMS is a chain of PARM_DECL nodes. */ ++ ++static void ++dbxout_reg_parms (parms) ++ tree parms; ++{ ++ while (parms) ++ { ++ /* Report parms that live in registers during the function. */ ++ if (GET_CODE (DECL_RTL (parms)) == REG ++ && REGNO (DECL_RTL (parms)) >= 0 ++ && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER ++ && DECL_OFFSET (parms) >= 0) ++ { ++ current_sym_code = N_RSYM; ++ current_sym_value = DBX_REGISTER_NUMBER (REGNO (DECL_RTL (parms))); ++ current_sym_addr = 0; ++ current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms)); ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:r", ++ IDENTIFIER_POINTER (DECL_NAME (parms))); ++ dbxout_type (TREE_TYPE (parms), 0); ++ dbxout_finish_symbol (); ++ } ++ /* Report parms that live in memory but outside the parmlist. */ ++ else if (GET_CODE (DECL_RTL (parms)) == MEM ++ && GET_CODE (XEXP (DECL_RTL (parms), 0)) == PLUS ++ && GET_CODE (XEXP (XEXP (DECL_RTL (parms), 0), 1)) == CONST_INT) ++ { ++ int offset = DECL_OFFSET (parms) / BITS_PER_UNIT; ++ /* A parm declared char is really passed as an int, ++ so it occupies the least significant bytes. ++ On a big-endian machine those are not the low-numbered ones. */ ++#ifdef BYTES_BIG_ENDIAN ++ if (offset != -1 && TREE_TYPE (parms) != DECL_ARG_TYPE (parms)) ++ offset += (GET_MODE_SIZE (TYPE_MODE (DECL_ARG_TYPE (parms))) ++ - GET_MODE_SIZE (GET_MODE (DECL_RTL (parms)))); ++#endif ++ if (INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)) != offset) ++ { ++ current_sym_code = N_LSYM; ++ current_sym_value = INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1)); ++ current_sym_addr = 0; ++ current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms)); ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:", ++ IDENTIFIER_POINTER (DECL_NAME (parms))); ++ dbxout_type (TREE_TYPE (parms), 0); ++ dbxout_finish_symbol (); ++ } ++ } ++ parms = TREE_CHAIN (parms); ++ } ++} ++ ++/* Given a chain of ..._TYPE nodes (as come in a parameter list), ++ output definitions of those names, in raw form */ ++ ++void ++dbxout_args (args) ++ tree args; ++{ ++ while (args) ++ { ++ putc (',', asmfile); ++ dbxout_type (TREE_VALUE (args), 0); ++ CHARS (1); ++ args = TREE_CHAIN (args); ++ } ++} ++ ++/* Given a chain of ..._TYPE nodes, ++ find those which have typedef names and output those names. ++ This is to ensure those types get output. */ ++ ++void ++dbxout_types (types) ++ register tree types; ++{ ++ while (types) ++ { ++ if (TYPE_NAME (types) ++ && TREE_CODE (TYPE_NAME (types)) == TYPE_DECL ++ && ! TREE_ASM_WRITTEN (TYPE_NAME (types))) ++ dbxout_symbol (TYPE_NAME (types), 1); ++ types = TREE_CHAIN (types); ++ } ++} ++ ++/* Output the tags (struct, union and enum definitions with names) for a block, ++ given a list of them (a chain of TREE_LIST nodes) in TAGS. ++ We must check to include those that have been mentioned already with ++ only a cross-reference. */ ++ ++void ++dbxout_tags (tags) ++ tree tags; ++{ ++ register tree link; ++ for (link = tags; link; link = TREE_CHAIN (link)) ++ { ++ register tree type = TYPE_MAIN_VARIANT (TREE_VALUE (link)); ++ if (TREE_PURPOSE (link) != 0 ++ && ! TREE_ASM_WRITTEN (link) ++ && TYPE_SIZE (type) != 0) ++ { ++ TREE_ASM_WRITTEN (link) = 1; ++ current_sym_code = N_LSYM; ++ current_sym_value = 0; ++ current_sym_addr = 0; ++ current_sym_nchars = 2 + IDENTIFIER_LENGTH (TREE_PURPOSE (link)); ++ ++ FORCE_TEXT; ++ fprintf (asmfile, ".stabs \"%s:T", ++ IDENTIFIER_POINTER (TREE_PURPOSE (link))); ++ dbxout_type (type, 1); ++ dbxout_finish_symbol (); ++ } ++ } ++} ++ ++/* Output everything about a symbol block (that is to say, a LET_STMT node ++ that represents a scope level), ++ including recursive output of contained blocks. ++ ++ STMT is the LET_STMT node. ++ DEPTH is its depth within containing symbol blocks. ++ ARGS is usually zero; but for the outermost block of the ++ body of a function, it is a chain of PARM_DECLs for the function parameters. ++ We output definitions of all the register parms ++ as if they were local variables of that block. ++ ++ Actually, STMT may be several statements chained together. ++ We handle them all in sequence. */ ++ ++static void ++dbxout_block (stmt, depth, args) ++ register tree stmt; ++ int depth; ++ tree args; ++{ ++ int blocknum; ++ ++ while (stmt) ++ { ++ switch (TREE_CODE (stmt)) ++ { ++ case COMPOUND_STMT: ++ case LOOP_STMT: ++ dbxout_block (STMT_BODY (stmt), depth, 0); ++ break; ++ ++ case IF_STMT: ++ dbxout_block (STMT_THEN (stmt), depth, 0); ++ dbxout_block (STMT_ELSE (stmt), depth, 0); ++ break; ++ ++ case LET_STMT: ++ /* Ignore LET_STMTs for blocks never really used to make RTL. */ ++ if (! TREE_USED (stmt)) ++ break; ++ /* In dbx format, the syms of a block come before the N_LBRAC. */ ++ dbxout_tags (STMT_TYPE_TAGS (stmt)); ++ dbxout_syms (STMT_VARS (stmt)); ++ if (args) ++ dbxout_reg_parms (args); ++ ++ /* Now output an N_LBRAC symbol to represent the beginning of ++ the block. Use the block's tree-walk order to generate ++ the assembler symbols LBBn and LBEn ++ that final will define around the code in this block. */ ++ if (depth > 0) ++ { ++ char buf[20]; ++ blocknum = next_block_number++; ++ ASM_GENERATE_INTERNAL_LABEL (buf, "LBB", blocknum); ++ fprintf (asmfile, ".stabn %d,0,0,", N_LBRAC); ++ assemble_name (asmfile, buf); ++ fprintf (asmfile, "\n"); ++ } ++ ++ /* Output the subblocks. */ ++ dbxout_block (STMT_SUBBLOCKS (stmt), depth + 1, 0); ++ ++ /* Refer to the marker for the end of the block. */ ++ if (depth > 0) ++ { ++ char buf[20]; ++ ASM_GENERATE_INTERNAL_LABEL (buf, "LBE", blocknum); ++ fprintf (asmfile, ".stabn %d,0,0,", N_RBRAC); ++ assemble_name (asmfile, buf); ++ fprintf (asmfile, "\n"); ++ } ++ } ++ stmt = TREE_CHAIN (stmt); ++ } ++} ++ ++/* Output dbx data for a function definition. ++ This includes a definition of the function name itself (a symbol), ++ definitions of the parameters (locating them in the parameter list) ++ and then output the block that makes up the function's body ++ (including all the auto variables of the function). */ ++ ++void ++dbxout_function (decl) ++ tree decl; ++{ ++ dbxout_symbol (decl, 0); ++ dbxout_parms (DECL_ARGUMENTS (decl)); ++ dbxout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl)); ++ ++ /* If we made any temporary types in this fn that weren't ++ output, output them now. */ ++ dbxout_types (get_temporary_types ()); ++} ++ ++#else /* not DBX_DEBUGGING_INFO */ ++ ++void ++dbxout_init (asm_file, input_file_name) ++ FILE *asm_file; ++ char *input_file_name; ++{} ++ ++void ++dbxout_symbol (decl, local) ++ tree decl; ++ int local; ++{} ++ ++void ++dbxout_types (types) ++ register tree types; ++{} ++ ++void ++dbxout_tags (tags) ++ tree tags; ++{} ++ ++void ++dbxout_function (decl) ++ tree decl; ++{} ++ ++#endif /* DBX_DEBUGGING_INFO */ +diff -Naur alliance-5.0/genview/src/gcc-1.42/ecoff-cmp alliance/genview/src/gcc-1.42/ecoff-cmp +--- alliance-5.0/genview/src/gcc-1.42/ecoff-cmp 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/ecoff-cmp 2002-04-11 09:14:43.000000000 +0200 +@@ -0,0 +1,10 @@ ++#!/bin/sh ++# ++# ecoff-cmp file1.o file2.o ++# ++ld -s -L -o /tmp/foo1.$$ $1 2>1 > /dev/null ++ld -s -L -o /tmp/foo2.$$ $2 2>1 > /dev/null ++tail +10c /tmp/foo1.$$ > /tmp/foo3.$$ ++tail +10c /tmp/foo2.$$ > /tmp/foo4.$$ ++cmp /tmp/foo3.$$ /tmp/foo4.$$ ++rm -f /tmp/foo[1234].$$ +diff -Naur alliance-5.0/genview/src/gcc-1.42/emit-rtl.c alliance/genview/src/gcc-1.42/emit-rtl.c +--- alliance-5.0/genview/src/gcc-1.42/emit-rtl.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/emit-rtl.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,1662 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Emit RTL for the GNU C-Compiler expander. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* Middle-to-low level generation of rtx code and insns. ++ ++ This file contains the functions `gen_rtx', `gen_reg_rtx' ++ and `gen_label_rtx' that are the usual ways of creating rtl ++ expressions for most purposes. ++ ++ It also has the functions for creating insns and linking ++ them in the doubly-linked chain. ++ ++ The patterns of the insns are created by machine-dependent ++ routines in insn-emit.c, which is generated automatically from ++ the machine description. These routines use `gen_rtx' to make ++ the individual rtx's of the pattern; what is machine dependent ++ is the kind of rtx's they make and what arguments they use. */ ++ ++#include "config.h" ++#include ++#include "gvarargs.h" ++#include "rtl.h" ++#include "regs.h" ++#include "insn-config.h" ++#include "real.h" ++ ++#define max(A,B) ((A) > (B) ? (A) : (B)) ++#define min(A,B) ((A) < (B) ? (A) : (B)) ++ ++/* This is reset to FIRST_PSEUDO_REGISTER at the start each function. ++ After rtl generation, it is 1 plus the largest register number used. */ ++ ++int reg_rtx_no = FIRST_PSEUDO_REGISTER; ++ ++/* This is *not* reset after each function. It gives each CODE_LABEL ++ in the entire compilation a unique label number. */ ++ ++static int label_num = 1; ++ ++/* Value of `label_num' at start of current function. */ ++ ++static int first_label_num; ++ ++/* Nonzero means do not generate NOTEs for source line numbers. */ ++ ++static int no_line_numbers; ++ ++/* Commonly used rtx's, so that we only need space for one copy. ++ These are initialized once for the entire compilation. ++ All of these except perhaps fconst0_rtx and dconst0_rtx ++ are unique; no other rtx-object will be equal to any of these. */ ++ ++rtx pc_rtx; /* (PC) */ ++rtx cc0_rtx; /* (CC0) */ ++rtx cc1_rtx; /* (CC1) (not actually used nowadays) */ ++rtx const0_rtx; /* (CONST_INT 0) */ ++rtx const1_rtx; /* (CONST_INT 1) */ ++rtx fconst0_rtx; /* (CONST_DOUBLE:SF 0) */ ++rtx dconst0_rtx; /* (CONST_DOUBLE:DF 0) */ ++ ++/* All references to the following fixed hard registers go through ++ these unique rtl objects. On machines where the frame-pointer and ++ arg-pointer are the same register, they use the same unique object. ++ ++ After register allocation, other rtl objects which used to be pseudo-regs ++ may be clobbered to refer to the frame-pointer register. ++ But references that were originally to the frame-pointer can be ++ distinguished from the others because they contain frame_pointer_rtx. ++ ++ In an inline procedure, the stack and frame pointer rtxs may not be ++ used for anything else. */ ++rtx stack_pointer_rtx; /* (REG:Pmode STACK_POINTER_REGNUM) */ ++rtx frame_pointer_rtx; /* (REG:Pmode FRAME_POINTER_REGNUM) */ ++rtx arg_pointer_rtx; /* (REG:Pmode ARG_POINTER_REGNUM) */ ++rtx struct_value_rtx; /* (REG:Pmode STRUCT_VALUE_REGNUM) */ ++rtx struct_value_incoming_rtx; /* (REG:Pmode STRUCT_VALUE_INCOMING_REGNUM) */ ++rtx static_chain_rtx; /* (REG:Pmode STATIC_CHAIN_REGNUM) */ ++rtx static_chain_incoming_rtx; /* (REG:Pmode STATIC_CHAIN_INCOMING_REGNUM) */ ++ ++/* The ends of the doubly-linked chain of rtl for the current function. ++ Both are reset to null at the start of rtl generation for the function. ++ ++ start_sequence saves both of these on `sequence_stack' and then ++ starts a new, nested sequence of insns. */ ++ ++static rtx first_insn = NULL; ++static rtx last_insn = NULL; ++ ++/* Stack of pending (incomplete) sequences saved by `start_sequence'. ++ This looks like ++ (INSN_LIST saved-first-insn ++ (INSN_LIST saved-last-insn ...more saved sequences...)). ++ The main insn-chain is saved in the last two links of the chain, ++ unless the chain is empty. */ ++ ++rtx sequence_stack = 0; ++ ++/* INSN_UID for next insn emitted. ++ Reset to 1 for each function compiled. */ ++ ++static int cur_insn_uid = 1; ++ ++/* Line number and source file of the last line-number NOTE emitted. ++ This is used to avoid generating duplicates. */ ++ ++static int last_linenum = 0; ++static char *last_filename = 0; ++ ++/* A vector indexed by pseudo reg number. The allocated length ++ of this vector is regno_pointer_flag_length. Since this ++ vector is needed during the expansion phase when the total ++ number of registers in the function is not yet known, ++ it is copied and made bigger when necessary. */ ++ ++char *regno_pointer_flag; ++int regno_pointer_flag_length; ++ ++/* Indexed by pseudo register number, gives the rtx for that pseudo. ++ Allocated in parallel with regno_pointer_flag. */ ++ ++rtx *regno_reg_rtx; ++ ++/* Filename and line number of last line-number note, ++ whether we actually emitted it or not. */ ++extern char *emit_filename; ++extern int emit_lineno; ++ ++rtx change_address (); ++ ++/* rtx gen_rtx (code, mode, [element1, ..., elementn]) ++** ++** This routine generates an RTX of the size specified by ++** , which is an RTX code. The RTX structure is initialized ++** from the arguments through , which are ++** interpreted according to the specific RTX type's format. The ++** special machine mode associated with the rtx (if any) is specified ++** in . ++** ++** gen_rtx() can be invoked in a way which resembles the lisp-like ++** rtx it will generate. For example, the following rtx structure: ++** ++** (plus:QI (mem:QI (reg:SI 1)) ++** (mem:QI (plusw:SI (reg:SI 2) (reg:SI 3)))) ++** ++** ...would be generated by the following C code: ++** ++** gen_rtx (PLUS, QImode, ++** gen_rtx (MEM, QImode, ++** gen_rtx (REG, SImode, 1)), ++** gen_rtx (MEM, QImode, ++** gen_rtx (PLUS, SImode, ++** gen_rtx (REG, SImode, 2), ++** gen_rtx (REG, SImode, 3)))), ++*/ ++ ++/*VARARGS2*/ ++rtx ++gen_rtx (va_alist) ++ va_dcl ++{ ++ va_list p; ++ enum rtx_code code; ++ enum machine_mode mode; ++ register int i; /* Array indices... */ ++ register char *fmt; /* Current rtx's format... */ ++ register rtx rt_val; /* RTX to return to caller... */ ++ ++ va_start (p); ++ code = va_arg (p, enum rtx_code); ++ mode = va_arg (p, enum machine_mode); ++ ++ if (code == CONST_INT) ++ { ++ int arg = va_arg (p, int); ++ if (arg == 0) ++ return const0_rtx; ++ if (arg == 1) ++ return const1_rtx; ++ rt_val = rtx_alloc (code); ++ INTVAL (rt_val) = arg; ++ } ++ else ++ { ++ rt_val = rtx_alloc (code); /* Allocate the storage space. */ ++ rt_val->mode = mode; /* Store the machine mode... */ ++ ++ fmt = GET_RTX_FORMAT (code); /* Find the right format... */ ++ for (i = 0; i < GET_RTX_LENGTH (code); i++) ++ { ++ switch (*fmt++) ++ { ++ case '0': /* Unused field. */ ++ break; ++ ++ case 'i': /* An integer? */ ++ XINT (rt_val, i) = va_arg (p, int); ++ break; ++ ++ case 's': /* A string? */ ++ XSTR (rt_val, i) = va_arg (p, char *); ++ break; ++ ++ case 'e': /* An expression? */ ++ case 'u': /* An insn? Same except when printing. */ ++ XEXP (rt_val, i) = va_arg (p, rtx); ++ break; ++ ++ case 'E': /* An RTX vector? */ ++ XVEC (rt_val, i) = va_arg (p, rtvec); ++ break; ++ ++ default: ++ abort(); ++ } ++ } ++ } ++ va_end (p); ++ return rt_val; /* Return the new RTX... */ ++} ++ ++/* gen_rtvec (n, [rt1, ..., rtn]) ++** ++** This routine creates an rtvec and stores within it the ++** pointers to rtx's which are its arguments. ++*/ ++ ++/*VARARGS1*/ ++rtvec ++gen_rtvec (va_alist) ++ va_dcl ++{ ++ int n, i; ++ va_list p; ++ rtx *vector; ++ ++ va_start (p); ++ n = va_arg (p, int); ++ ++ if (n == 0) ++ return NULL_RTVEC; /* Don't allocate an empty rtvec... */ ++ ++ vector = (rtx *) alloca (n * sizeof (rtx)); ++ for (i = 0; i < n; i++) ++ vector[i] = va_arg (p, rtx); ++ va_end (p); ++ ++ return gen_rtvec_v (n, vector); ++} ++ ++rtvec ++gen_rtvec_v (n, argp) ++ int n; ++ rtx *argp; ++{ ++ register int i; ++ register rtvec rt_val; ++ ++ if (n == 0) ++ return NULL_RTVEC; /* Don't allocate an empty rtvec... */ ++ ++ rt_val = rtvec_alloc (n); /* Allocate an rtvec... */ ++ ++ for (i = 0; i < n; i++) ++ rt_val->elem[i].rtx = *argp++; ++ ++ return rt_val; ++} ++ ++/* Generate a REG rtx for a new pseudo register of mode MODE. ++ This pseudo is assigned the next sequential register number. */ ++ ++rtx ++gen_reg_rtx (mode) ++ enum machine_mode mode; ++{ ++ register rtx val; ++ ++ /* Make sure regno_pointer_flag and regno_reg_rtx are large ++ enough to have an element for this pseudo reg number. */ ++ ++ if (reg_rtx_no == regno_pointer_flag_length) ++ { ++ rtx *new1; ++ char *new = ++ (char *) oballoc (regno_pointer_flag_length * 2); ++ bzero (new, regno_pointer_flag_length * 2); ++ bcopy (regno_pointer_flag, new, regno_pointer_flag_length); ++ regno_pointer_flag = new; ++ ++ new1 = (rtx *) oballoc (regno_pointer_flag_length * 2 * sizeof (rtx)); ++ bzero (new1, regno_pointer_flag_length * 2 * sizeof (rtx)); ++ bcopy (regno_reg_rtx, new1, regno_pointer_flag_length * sizeof (rtx)); ++ regno_reg_rtx = new1; ++ ++ regno_pointer_flag_length *= 2; ++ } ++ ++ val = gen_rtx (REG, mode, reg_rtx_no); ++ regno_reg_rtx[reg_rtx_no++] = val; ++ return val; ++} ++ ++/* Identify REG as a probable pointer register. */ ++ ++void ++mark_reg_pointer (reg) ++ rtx reg; ++{ ++ REGNO_POINTER_FLAG (REGNO (reg)) = 1; ++} ++ ++/* Return 1 plus largest pseudo reg number used in the current function. */ ++ ++int ++max_reg_num () ++{ ++ return reg_rtx_no; ++} ++ ++/* Return 1 + the largest label number used so far. */ ++ ++int ++max_label_num () ++{ ++ return label_num; ++} ++ ++/* Return first label number used in this function (if any were used). */ ++ ++int ++get_first_label_num () ++{ ++ return first_label_num; ++} ++ ++/* Assuming that X is an rtx (MEM, REG or SUBREG) for a fixed-point number, ++ return a MEM or SUBREG rtx that refers to the least-significant part of X. ++ MODE specifies how big a part of X to return; ++ it must not be larger than a word. ++ If X is a MEM whose address is a QUEUED, the value may be so also. */ ++ ++rtx ++gen_lowpart (mode, x) ++ enum machine_mode mode; ++ register rtx x; ++{ ++ /* This case loses if X is a subreg. To catch bugs early, ++ complain if an invalid MODE is used even in other cases. */ ++ if (GET_MODE_SIZE (mode) > UNITS_PER_WORD ++ && GET_MODE_SIZE (mode) != GET_MODE_UNIT_SIZE (GET_MODE (x))) ++ abort (); ++ if (GET_MODE (x) == mode) ++ return x; ++ if (GET_CODE (x) == CONST_INT) ++ return gen_rtx (CONST_INT, VOIDmode, INTVAL (x) & GET_MODE_MASK (mode)); ++ if (GET_CODE (x) == CONST_DOUBLE) ++/* In version 1.37, try this: */ ++/* if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT) abort (); */ ++ /* Assume it's an int, so ..._LOW means the low-order word. */ ++ return gen_rtx (CONST_INT, VOIDmode, ++ CONST_DOUBLE_LOW (x) & GET_MODE_MASK (mode)); ++ if (GET_CODE (x) == MEM) ++ { ++ register int offset = 0; ++#ifdef WORDS_BIG_ENDIAN ++ offset = (max (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD) ++ - max (GET_MODE_SIZE (mode), UNITS_PER_WORD)); ++#endif ++#ifdef BYTES_BIG_ENDIAN ++ /* Adjust the address so that the address-after-the-data ++ is unchanged. */ ++ offset -= (min (UNITS_PER_WORD, GET_MODE_SIZE (mode)) ++ - min (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); ++#endif ++ return change_address (x, mode, plus_constant (XEXP (x, 0), offset)); ++ } ++ else if (GET_CODE (x) == SUBREG) ++ return (GET_MODE (SUBREG_REG (x)) == mode && SUBREG_WORD (x) == 0 ++ ? SUBREG_REG (x) ++ : gen_rtx (SUBREG, mode, SUBREG_REG (x), SUBREG_WORD (x))); ++ else if (GET_CODE (x) == REG) ++ { ++#ifdef WORDS_BIG_ENDIAN ++ if (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) ++ { ++ return gen_rtx (SUBREG, mode, x, ++ ((GET_MODE_SIZE (GET_MODE (x)) ++ - max (GET_MODE_SIZE (mode), UNITS_PER_WORD)) ++ / UNITS_PER_WORD)); ++ } ++#endif ++ return gen_rtx (SUBREG, mode, x, 0); ++ } ++ else ++ abort (); ++} ++ ++/* Like `gen_lowpart', but refer to the most significant part. */ ++ ++rtx ++gen_highpart (mode, x) ++ enum machine_mode mode; ++ register rtx x; ++{ ++ if (GET_CODE (x) == MEM) ++ { ++ register int offset = 0; ++#ifndef WORDS_BIG_ENDIAN ++ offset = (max (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD) ++ - max (GET_MODE_SIZE (mode), UNITS_PER_WORD)); ++#endif ++#ifndef BYTES_BIG_ENDIAN ++ if (GET_MODE_SIZE (mode) < UNITS_PER_WORD) ++ offset -= (GET_MODE_SIZE (mode) ++ - min (UNITS_PER_WORD, ++ GET_MODE_SIZE (GET_MODE (x)))); ++#endif ++ return change_address (x, mode, plus_constant (XEXP (x, 0), offset)); ++ } ++ else if (GET_CODE (x) == REG) ++ { ++#ifndef WORDS_BIG_ENDIAN ++ if (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) ++ { ++ return gen_rtx (SUBREG, mode, x, ++ ((GET_MODE_SIZE (GET_MODE (x)) ++ - max (GET_MODE_SIZE (mode), UNITS_PER_WORD)) ++ / UNITS_PER_WORD)); ++ } ++#endif ++ return gen_rtx (SUBREG, mode, x, 0); ++ } ++ else if (GET_CODE (x) == CONST_INT) ++ /* Assume that a const_int being used where a double is wanted ++ should be sign-extended. ++ This is right only if the use of const_int is carefully restricted. ++ In fact, I think it can happen only for numbers like 0 and 1. */ ++ return gen_rtx (CONST_INT, VOIDmode, (INTVAL (x) >> (BITS_PER_WORD - 1))); ++ else ++ abort (); ++} ++ ++/* Return 1 iff X, assumed to be a SUBREG, ++ refers to the least significant part of its containing reg. ++ If X is not a SUBREG, always return 1 (it is its own low part!). */ ++ ++int ++subreg_lowpart_p (x) ++ rtx x; ++{ ++ if (GET_CODE (x) != SUBREG) ++ return 1; ++#ifdef WORDS_BIG_ENDIAN ++ if (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) ++ { ++ register enum machine_mode mode = GET_MODE (SUBREG_REG (x)); ++ return (SUBREG_WORD (x) ++ == ((GET_MODE_SIZE (GET_MODE (x)) ++ - max (GET_MODE_SIZE (mode), UNITS_PER_WORD)) ++ / UNITS_PER_WORD)); ++ } ++#endif ++ return SUBREG_WORD (x) == 0; ++} ++ ++/* Return a memory reference like MEMREF, but with its mode changed ++ to MODE and its address changed to ADDR. ++ (VOIDmode means don't change the mode. ++ NULL for ADDR means don't change the address.) */ ++ ++rtx ++change_address (memref, mode, addr) ++ rtx memref; ++ enum machine_mode mode; ++ rtx addr; ++{ ++ rtx new; ++ ++ if (GET_CODE (memref) != MEM) ++ abort (); ++ if (mode == VOIDmode) ++ mode = GET_MODE (memref); ++ if (addr == 0) ++ addr = XEXP (memref, 0); ++ ++ new = gen_rtx (MEM, mode, memory_address (mode, addr)); ++ MEM_VOLATILE_P (new) = MEM_VOLATILE_P (memref); ++ RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (memref); ++ MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (memref); ++ return new; ++} ++ ++/* Return a newly created CODE_LABEL rtx with a unique label number. */ ++ ++rtx ++gen_label_rtx () ++{ ++ register rtx label = gen_rtx (CODE_LABEL, VOIDmode, 0, 0, 0, label_num++); ++ LABEL_NUSES (label) = 0; ++ return label; ++} ++ ++/* For procedure integration. */ ++ ++/* Return a newly created INLINE_HEADER rtx. Should allocate this ++ from a permanent obstack when the opportunity arises. */ ++ ++rtx ++gen_inline_header_rtx (insn, last_insn, ++ first_labelno, last_labelno, ++ max_parm_regnum, max_regnum, args_size, ++ stack_slots) ++ rtx insn, last_insn; ++ int first_labelno, last_labelno, max_parm_regnum, max_regnum, args_size; ++ rtx stack_slots; ++{ ++ rtx header = gen_rtx (INLINE_HEADER, VOIDmode, ++ cur_insn_uid++, NULL, ++ insn, last_insn, ++ first_labelno, last_labelno, ++ max_parm_regnum, max_regnum, args_size, stack_slots); ++ return header; ++} ++ ++/* Install new pointers to the first and last insns in the chain. ++ Used for an inline-procedure after copying the insn chain. */ ++ ++void ++set_new_first_and_last_insn (first, last) ++ rtx first, last; ++{ ++ first_insn = first; ++ last_insn = last; ++} ++ ++/* Go through all the RTL insn bodies and copy any invalid shared structure. ++ It does not work to do this twice, because the mark bits set here ++ are not cleared afterwards. */ ++ ++static int unshare_copies = 0; /* Count rtx's that were copied. */ ++ ++static rtx copy_rtx_if_shared (); ++ ++void ++unshare_all_rtl (insn) ++ register rtx insn; ++{ ++ extern rtx stack_slot_list; ++ ++ for (; insn; insn = NEXT_INSN (insn)) ++ if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN ++ || GET_CODE (insn) == CALL_INSN) ++ { ++ PATTERN (insn) = copy_rtx_if_shared (PATTERN (insn)); ++ REG_NOTES (insn) = copy_rtx_if_shared (REG_NOTES (insn)); ++ LOG_LINKS (insn) = copy_rtx_if_shared (LOG_LINKS (insn)); ++ } ++ ++ /* Make sure the addresses of stack slots are not shared ++ with anything in the insn chain. That could happen if ++ the stack slot is referenced only by its address. */ ++ copy_rtx_if_shared (stack_slot_list); ++} ++ ++/* Mark ORIG as in use, and return a copy of it if it was already in use. ++ Recursively does the same for subexpressions. */ ++ ++static rtx ++copy_rtx_if_shared (orig) ++ rtx orig; ++{ ++ register rtx x = orig; ++ register int i; ++ register enum rtx_code code; ++ register char *format_ptr; ++ int copied = 0; ++ ++ if (x == 0) ++ return 0; ++ ++ code = GET_CODE (x); ++ ++ /* These types may be freely shared. */ ++ ++ switch (code) ++ { ++ case REG: ++ case QUEUED: ++ case CONST_INT: ++ case CONST_DOUBLE: ++ case SYMBOL_REF: ++ case CODE_LABEL: ++ case PC: ++ case CC0: ++ return x; ++ ++ case INSN: ++ case JUMP_INSN: ++ case CALL_INSN: ++ case NOTE: ++ case LABEL_REF: ++ case BARRIER: ++ /* The chain of insns is not being copied. */ ++ return x; ++ ++ case MEM: ++ /* A MEM is allowed to be shared if its address is constant ++ or is a constant plus one of the special registers. */ ++ if (CONSTANT_ADDRESS_P (XEXP (x, 0))) ++ return x; ++ if (GET_CODE (XEXP (x, 0)) == PLUS ++ && (XEXP (XEXP (x, 0), 0) == frame_pointer_rtx ++ || XEXP (XEXP (x, 0), 0) == arg_pointer_rtx) ++ && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1))) ++ { ++ /* This MEM can appear in more than one place, ++ but its address better not be shared with anything else. */ ++ if (! x->used) ++ XEXP (x, 0) = copy_rtx_if_shared (XEXP (x, 0)); ++ x->used = 1; ++ return x; ++ } ++ if (XEXP (x, 0) == frame_pointer_rtx ++ || XEXP (x, 0) == arg_pointer_rtx) ++ return x; ++ } ++ ++ /* This rtx may not be shared. If it has already been seen, ++ replace it with a copy of itself. */ ++ ++ if (x->used) ++ { ++ register rtx copy; ++ ++ unshare_copies++; ++ ++ copy = rtx_alloc (code); ++ bcopy (x, copy, (sizeof (*copy) - sizeof (copy->fld) ++ + sizeof (copy->fld[0]) * GET_RTX_LENGTH (code))); ++ x = copy; ++ copied = 1; ++ } ++ x->used = 1; ++ ++ /* Now scan the subexpressions recursively. ++ We can store any replaced subexpressions directly into X ++ since we know X is not shared! Any vectors in X ++ must be copied if X was copied. */ ++ ++ format_ptr = GET_RTX_FORMAT (code); ++ ++ for (i = 0; i < GET_RTX_LENGTH (code); i++) ++ { ++ switch (*format_ptr++) ++ { ++ case 'e': ++ XEXP (x, i) = copy_rtx_if_shared (XEXP (x, i)); ++ break; ++ ++ case 'E': ++ if (XVEC (x, i) != NULL) ++ { ++ register int j; ++ ++ if (copied) ++ XVEC (x, i) = gen_rtvec_v (XVECLEN (x, i), &XVECEXP (x, i, 0)); ++ for (j = 0; j < XVECLEN (x, i); j++) ++ XVECEXP (x, i, j) ++ = copy_rtx_if_shared (XVECEXP (x, i, j)); ++ } ++ break; ++ } ++ } ++ return x; ++} ++ ++/* Copy X if necessary so that it won't be altered by changes in OTHER. ++ Return X or the rtx for the pseudo reg the value of X was copied into. ++ OTHER must be valid as a SET_DEST. */ ++ ++rtx ++make_safe_from (x, other) ++ rtx x, other; ++{ ++ while (1) ++ switch (GET_CODE (other)) ++ { ++ case SUBREG: ++ other = SUBREG_REG (other); ++ break; ++ case STRICT_LOW_PART: ++ case SIGN_EXTEND: ++ case ZERO_EXTEND: ++ other = XEXP (other, 0); ++ break; ++ default: ++ goto done; ++ } ++ done: ++ if ((GET_CODE (other) == MEM ++ && ! CONSTANT_P (x) ++ && GET_CODE (x) != CONST_DOUBLE ++ && GET_CODE (x) != REG ++ && GET_CODE (x) != SUBREG) ++ || (GET_CODE (other) == REG ++ && (REGNO (other) < FIRST_PSEUDO_REGISTER ++ || reg_mentioned_p (other, x)))) ++ { ++ rtx temp = gen_reg_rtx (GET_MODE (x)); ++ emit_move_insn (temp, x); ++ return temp; ++ } ++ return x; ++} ++ ++/* Emission of insns (adding them to the doubly-linked list). */ ++ ++/* Return the first insn of the current sequence or current function. */ ++ ++rtx ++get_insns () ++{ ++ return first_insn; ++} ++ ++/* Return the last insn emitted in current sequence or current function. */ ++ ++rtx ++get_last_insn () ++{ ++ return last_insn; ++} ++ ++/* Specify a new insn as the last in the chain. */ ++ ++void ++set_last_insn (insn) ++ rtx insn; ++{ ++ if (NEXT_INSN (insn) != 0) ++ abort (); ++ last_insn = insn; ++} ++ ++/* Return a number larger than any instruction's uid in this function. */ ++ ++int ++get_max_uid () ++{ ++ return cur_insn_uid; ++} ++ ++rtx ++next_insn (insn) ++ rtx insn; ++{ ++ if (insn) return NEXT_INSN (insn); ++ return 0; ++} ++ ++rtx ++previous_insn (insn) ++ rtx insn; ++{ ++ if (insn) return PREV_INSN (insn); ++ return 0; ++} ++ ++/* Make and return an INSN rtx, initializing all its slots. ++ Store PATTERN in the pattern slots. ++ PAT_FORMALS is an idea that never really went anywhere. */ ++ ++static rtx ++make_insn_raw (pattern, pat_formals) ++ rtx pattern; ++ rtvec pat_formals; ++{ ++ register rtx insn; ++ ++ insn = rtx_alloc(INSN); ++ INSN_UID(insn) = cur_insn_uid++; ++ ++ PATTERN (insn) = pattern; ++ INSN_CODE (insn) = -1; ++ LOG_LINKS(insn) = NULL; ++ REG_NOTES(insn) = NULL; ++ ++ return insn; ++} ++ ++/* Like `make_insn' but make a JUMP_INSN instead of an insn. */ ++ ++static rtx ++make_jump_insn_raw (pattern, pat_formals) ++ rtx pattern; ++ rtvec pat_formals; ++{ ++ register rtx insn; ++ ++ insn = rtx_alloc(JUMP_INSN); ++ INSN_UID(insn) = cur_insn_uid++; ++ ++ PATTERN (insn) = pattern; ++ INSN_CODE (insn) = -1; ++ LOG_LINKS(insn) = NULL; ++ REG_NOTES(insn) = NULL; ++ JUMP_LABEL(insn) = NULL; ++ ++ return insn; ++} ++ ++/* Add INSN to the end of the doubly-linked list. ++ INSN may be an INSN, JUMP_INSN, CALL_INSN, CODE_LABEL, BARRIER or NOTE. */ ++ ++static void ++add_insn (insn) ++ register rtx insn; ++{ ++ PREV_INSN (insn) = last_insn; ++ NEXT_INSN (insn) = 0; ++ ++ if (NULL != last_insn) ++ NEXT_INSN (last_insn) = insn; ++ ++ if (NULL == first_insn) ++ first_insn = insn; ++ ++ last_insn = insn; ++} ++ ++/* Add INSN, an rtx of code INSN, into the doubly-linked list ++ after insn AFTER. */ ++ ++static void ++add_insn_after (insn, after) ++ rtx insn, after; ++{ ++ NEXT_INSN (insn) = NEXT_INSN (after); ++ PREV_INSN (insn) = after; ++ ++ if (NEXT_INSN (insn)) ++ PREV_INSN (NEXT_INSN (insn)) = insn; ++ else if (last_insn == after) ++ last_insn = insn; ++ else ++ { ++ rtx stack = sequence_stack; ++ /* Scan all pending sequences too. */ ++ for (; stack; stack = XEXP (XEXP (stack, 1), 1)) ++ if (after == XEXP (XEXP (stack, 1), 0)) ++ XEXP (XEXP (stack, 1), 0) = insn; ++ } ++ ++ NEXT_INSN (after) = insn; ++} ++ ++/* Delete all insns made since FROM. ++ FROM becomes the new last instruction. */ ++ ++void ++delete_insns_since (from) ++ rtx from; ++{ ++ if (from == 0) ++ first_insn = 0; ++ else ++ NEXT_INSN (from) = 0; ++ last_insn = from; ++} ++ ++/* Move a consecutive bunch of insns to a different place in the chain. ++ The insns to be moved are those between FROM and TO. ++ They are moved to a new position after the insn AFTER. */ ++ ++void ++reorder_insns (from, to, after) ++ rtx from, to, after; ++{ ++ /* Splice this bunch out of where it is now. */ ++ if (PREV_INSN (from)) ++ NEXT_INSN (PREV_INSN (from)) = NEXT_INSN (to); ++ if (NEXT_INSN (to)) ++ PREV_INSN (NEXT_INSN (to)) = PREV_INSN (from); ++ if (last_insn == to) ++ last_insn = PREV_INSN (from); ++ if (first_insn == from) ++ first_insn = NEXT_INSN (to); ++ ++ /* Make the new neighbors point to it and it to them. */ ++ if (NEXT_INSN (after)) ++ { ++ PREV_INSN (NEXT_INSN (after)) = to; ++ NEXT_INSN (to) = NEXT_INSN (after); ++ } ++ PREV_INSN (from) = after; ++ NEXT_INSN (after) = from; ++ if (after == last_insn) ++ last_insn = to; ++} ++ ++/* Emit an insn of given code and pattern ++ at a specified place within the doubly-linked list. */ ++ ++/* Make an instruction with body PATTERN ++ and output it before the instruction BEFORE. */ ++ ++rtx ++emit_insn_before (pattern, before) ++ register rtx pattern, before; ++{ ++ register rtx insn; ++ ++ if (GET_CODE (pattern) == SEQUENCE) ++ { ++ register int i; ++ /* For an empty sequence, emit nothing. */ ++ if (XVEC (pattern, 0)) ++ for (i = 0; i < XVECLEN (pattern, 0); i++) ++ add_insn_after (XVECEXP (pattern, 0, i), PREV_INSN (before)); ++ return PREV_INSN (before); ++ } ++ ++ insn = make_insn_raw (pattern, 0); ++ ++ PREV_INSN (insn) = PREV_INSN (before); ++ NEXT_INSN (insn) = before; ++ ++ if (PREV_INSN (insn)) ++ NEXT_INSN (PREV_INSN (insn)) = insn; ++ else ++ first_insn = insn; ++ PREV_INSN (before) = insn; ++ ++ return insn; ++} ++ ++/* Make an instruction with body PATTERN and code JUMP_INSN ++ and output it before the instruction BEFORE. */ ++ ++rtx ++emit_jump_insn_before (pattern, before) ++ register rtx pattern, before; ++{ ++ register rtx insn = make_jump_insn_raw (pattern, 0); ++ ++ PREV_INSN (insn) = PREV_INSN (before); ++ NEXT_INSN (insn) = before; ++ ++ if (PREV_INSN (insn)) ++ NEXT_INSN (PREV_INSN (insn)) = insn; ++ else ++ first_insn = insn; ++ PREV_INSN (before) = insn; ++ ++ return insn; ++} ++ ++/* Make an instruction with body PATTERN and code CALL_INSN ++ and output it before the instruction BEFORE. */ ++ ++rtx ++emit_call_insn_before (pattern, before) ++ register rtx pattern, before; ++{ ++ rtx insn = emit_insn_before (pattern, before); ++ PUT_CODE (insn, CALL_INSN); ++ return insn; ++} ++ ++/* Make an insn of code INSN with body PATTERN ++ and output it after the insn AFTER. */ ++ ++rtx ++emit_insn_after (pattern, after) ++ register rtx pattern, after; ++{ ++ if (GET_CODE (pattern) == SEQUENCE) ++ { ++ register int i; ++ /* For an empty sequence, emit nothing. */ ++ if (XVEC (pattern, 0)) ++ for (i = 0; i < XVECLEN (pattern, 0); i++) ++ { ++ add_insn_after (XVECEXP (pattern, 0, i), after); ++ after = NEXT_INSN (after); ++ } ++ return after; ++ } ++ else ++ { ++ register rtx insn = make_insn_raw (pattern, 0); ++ add_insn_after (insn, after); ++ return insn; ++ } ++} ++ ++/* Make an insn of code JUMP_INSN with body PATTERN ++ and output it after the insn AFTER. */ ++ ++rtx ++emit_jump_insn_after (pattern, after) ++ register rtx pattern, after; ++{ ++ register rtx insn = make_jump_insn_raw (pattern, 0); ++ ++ add_insn_after (insn, after); ++ return insn; ++} ++ ++/* Make an insn of code BARRIER ++ and output it after the insn AFTER. */ ++ ++rtx ++emit_barrier_after (after) ++ register rtx after; ++{ ++ register rtx insn = rtx_alloc (BARRIER); ++ ++ INSN_UID (insn) = cur_insn_uid++; ++ ++ add_insn_after (insn, after); ++ return insn; ++} ++ ++/* Emit the label LABEL after the insn AFTER. */ ++ ++void ++emit_label_after (label, after) ++ rtx label, after; ++{ ++ /* This can be called twice for the same label ++ as a result of the confusion that follows a syntax error! ++ So make it harmless. */ ++ if (INSN_UID (label) == 0) ++ { ++ INSN_UID (label) = cur_insn_uid++; ++ add_insn_after (label, after); ++ } ++} ++ ++/* Emit a note of subtype SUBTYPE after the insn AFTER. */ ++ ++void ++emit_note_after (subtype, after) ++ int subtype; ++ rtx after; ++{ ++ register rtx note = rtx_alloc (NOTE); ++ INSN_UID (note) = cur_insn_uid++; ++ XSTR (note, 3) = 0; ++ XINT (note, 4) = subtype; ++ add_insn_after (note, after); ++} ++ ++/* Make an insn of code INSN with pattern PATTERN ++ and add it to the end of the doubly-linked list. ++ If PATTERN is a SEQUENCE, take the elements of it ++ and emit an insn for each element. ++ ++ Returns the last insn emitted. */ ++ ++rtx ++emit_insn (pattern) ++ rtx pattern; ++{ ++ rtx insn; ++ ++ if (GET_CODE (pattern) == SEQUENCE) ++ { ++ register int i; ++ /* For an empty sequence, emit nothing. */ ++ if (XVEC (pattern, 0)) ++ for (i = 0; i < XVECLEN (pattern, 0); i++) ++ add_insn (insn = XVECEXP (pattern, 0, i)); ++ } ++ else ++ { ++ insn = make_insn_raw (pattern, NULL); ++ add_insn (insn); ++ } ++ return insn; ++} ++ ++/* Emit the insns in a chain starting with INSN. */ ++ ++rtx ++emit_insns (insn) ++ rtx insn; ++{ ++ while (insn) ++ { ++ rtx next = NEXT_INSN (insn); ++ add_insn (insn); ++ insn = next; ++ } ++} ++ ++/* Make an insn of code JUMP_INSN with pattern PATTERN ++ and add it to the end of the doubly-linked list. */ ++ ++rtx ++emit_jump_insn (pattern) ++ rtx pattern; ++{ ++ if (GET_CODE (pattern) == SEQUENCE) ++ return emit_insn (pattern); ++ else ++ { ++ register rtx insn = make_jump_insn_raw (pattern, NULL); ++ add_insn (insn); ++ return insn; ++ } ++} ++ ++/* Make an insn of code CALL_INSN with pattern PATTERN ++ and add it to the end of the doubly-linked list. */ ++ ++rtx ++emit_call_insn (pattern) ++ rtx pattern; ++{ ++ if (GET_CODE (pattern) == SEQUENCE) ++ return emit_insn (pattern); ++ else ++ { ++ register rtx insn = make_insn_raw (pattern, NULL); ++ add_insn (insn); ++ PUT_CODE (insn, CALL_INSN); ++ return insn; ++ } ++} ++ ++/* Add the label LABEL to the end of the doubly-linked list. */ ++ ++rtx ++emit_label (label) ++ rtx label; ++{ ++ /* This can be called twice for the same label ++ as a result of the confusion that follows a syntax error! ++ So make it harmless. */ ++ if (INSN_UID (label) == 0) ++ { ++ INSN_UID (label) = cur_insn_uid++; ++ add_insn (label); ++ } ++ return label; ++} ++ ++/* Make an insn of code BARRIER ++ and add it to the end of the doubly-linked list. */ ++ ++rtx ++emit_barrier () ++{ ++ register rtx barrier = rtx_alloc (BARRIER); ++ INSN_UID (barrier) = cur_insn_uid++; ++ add_insn (barrier); ++ return barrier; ++} ++ ++/* Make an insn of code NOTE ++ with data-fields specified by FILE and LINE ++ and add it to the end of the doubly-linked list, ++ but only if line-numbers are desired for debugging info. */ ++ ++rtx ++emit_line_note (file, line) ++ char *file; ++ int line; ++{ ++ emit_filename = file; ++ emit_lineno = line; ++ ++#if 0 ++ if (no_line_numbers) ++ return 0; ++#endif ++ ++ return emit_note (file, line); ++} ++ ++/* Make an insn of code NOTE ++ with data-fields specified by FILE and LINE ++ and add it to the end of the doubly-linked list. ++ If it is a line-number NOTE, omit it if it matches the previous one. */ ++ ++rtx ++emit_note (file, line) ++ char *file; ++ int line; ++{ ++ register rtx note; ++ ++ if (line > 0) ++ { ++ if (file && last_filename && !strcmp (file, last_filename) ++ && line == last_linenum) ++ return 0; ++ last_filename = file; ++ last_linenum = line; ++ } ++ ++ if (no_line_numbers && line > 0) ++ { ++ cur_insn_uid++; ++ return 0; ++ } ++ ++ note = rtx_alloc (NOTE); ++ INSN_UID (note) = cur_insn_uid++; ++ XSTR (note, 3) = file; ++ XINT (note, 4) = line; ++ add_insn (note); ++ return note; ++} ++ ++/* Emit a NOTE, and don't omit it even if LINE it the previous note. */ ++ ++rtx ++emit_line_note_force (file, line) ++ char *file; ++ int line; ++{ ++ last_linenum = -1; ++ return emit_line_note (file, line); ++} ++ ++/* Cause next statement to emit a line note even if the line number ++ has not changed. This is used at the beginning of a function. */ ++ ++void ++force_next_line_note () ++{ ++ last_linenum = -1; ++} ++ ++/* Return an indication of which type of insn should have X as a body. ++ The value is CODE_LABEL, INSN, CALL_INSN or JUMP_INSN. */ ++ ++enum rtx_code ++classify_insn (x) ++ rtx x; ++{ ++ if (GET_CODE (x) == CODE_LABEL) ++ return CODE_LABEL; ++ if (GET_CODE (x) == CALL) ++ return CALL_INSN; ++ if (GET_CODE (x) == RETURN) ++ return JUMP_INSN; ++ if (GET_CODE (x) == SET) ++ { ++ if (SET_DEST (x) == pc_rtx) ++ return JUMP_INSN; ++ else if (GET_CODE (SET_SRC (x)) == CALL) ++ return CALL_INSN; ++ else ++ return INSN; ++ } ++ if (GET_CODE (x) == PARALLEL) ++ { ++ register int j; ++ for (j = XVECLEN (x, 0) - 1; j >= 0; j--) ++ if (GET_CODE (XVECEXP (x, 0, j)) == CALL) ++ return CALL_INSN; ++ else if (GET_CODE (XVECEXP (x, 0, j)) == SET ++ && SET_DEST (XVECEXP (x, 0, j)) == pc_rtx) ++ return JUMP_INSN; ++ else if (GET_CODE (XVECEXP (x, 0, j)) == SET ++ && GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL) ++ return CALL_INSN; ++ } ++ return INSN; ++} ++ ++/* Emit the rtl pattern X as an appropriate kind of insn. ++ If X is a label, it is simply added into the insn chain. */ ++ ++void ++emit (x) ++ rtx x; ++{ ++ enum rtx_code code = classify_insn (x); ++ ++ if (code == CODE_LABEL) ++ emit_label (x); ++ else if (code == INSN) ++ emit_insn (x); ++ else if (code == JUMP_INSN) ++ { ++ register rtx insn = emit_jump_insn (x); ++ if (simplejump_p (insn) || GET_CODE (x) == RETURN) ++ emit_barrier (); ++ } ++ else if (code == CALL_INSN) ++ emit_call_insn (x); ++} ++ ++/* Begin emitting insns to a sequence which can be packaged in an RTL_EXPR. ++ Return an rtx containing data on any sequence already in progress. */ ++ ++rtx ++start_sequence () ++{ ++ sequence_stack ++ = gen_rtx (INSN_LIST, VOIDmode, ++ first_insn, gen_rtx (INSN_LIST, VOIDmode, ++ last_insn, sequence_stack)); ++ first_insn = 0; ++ last_insn = 0; ++ return sequence_stack; ++} ++ ++/* Set up the insn chain starting with FIRST ++ as the current sequence, saving the previously current one. */ ++ ++void ++push_to_sequence (first) ++ rtx first; ++{ ++ rtx last; ++ for (last = first; last && NEXT_INSN (last); last = NEXT_INSN (last)); ++ sequence_stack ++ = gen_rtx (INSN_LIST, VOIDmode, ++ first_insn, gen_rtx (INSN_LIST, VOIDmode, ++ last_insn, sequence_stack)); ++ first_insn = first; ++ last_insn = last; ++} ++ ++/* After emitting to a sequence, restore previous saved state. ++ The argument SAVED is no longer used. ++ ++ To get the contents of the sequence just made, ++ you must call `gen_sequence' *before* calling here. */ ++ ++void ++end_sequence (saved) ++ rtx saved; ++{ ++ first_insn = XEXP (sequence_stack, 0); ++ last_insn = XEXP (XEXP (sequence_stack, 1), 0); ++ sequence_stack = XEXP (XEXP (sequence_stack, 1), 1); ++} ++ ++/* Generate a SEQUENCE rtx containing the insns already emitted ++ to the current sequence. ++ ++ This is how the gen_... function from a DEFINE_EXPAND ++ constructs the SEQUENCE that it returns. */ ++ ++rtx ++gen_sequence () ++{ ++ rtx tem; ++ rtvec newvec; ++ int i; ++ int len; ++ ++ /* Count the insns in the chain. */ ++ len = 0; ++ for (tem = first_insn; tem; tem = NEXT_INSN (tem)) ++ len++; ++ ++ /* For an empty sequence... */ ++ if (len == 0) ++ return gen_rtx (SEQUENCE, VOIDmode, NULL); ++ ++ /* If only one insn, return its pattern rather than a SEQUENCE. */ ++ if (len == 1 ++ && (GET_CODE (first_insn) == INSN ++ || GET_CODE (first_insn) == JUMP_INSN ++ || GET_CODE (first_insn) == CALL_INSN)) ++ return PATTERN (first_insn); ++ ++ /* Put them in a vector. */ ++ newvec = rtvec_alloc (len); ++ i = 0; ++ for (tem = first_insn; tem; tem = NEXT_INSN (tem), i++) ++ newvec->elem[i].rtx = tem; ++ ++ /* Make a SEQUENCE from this vector. */ ++ return gen_rtx (SEQUENCE, VOIDmode, newvec); ++} ++ ++/* Set up regno_reg_rtx, reg_rtx_no and regno_pointer_flag ++ according to the chain of insns starting with FIRST. ++ ++ Also set cur_insn_uid to exceed the largest uid in that chain. ++ ++ This is used when an inline function's rtl is saved ++ and passed to rest_of_compilation later. */ ++ ++static void restore_reg_data_1 (); ++ ++void ++restore_reg_data (first) ++ rtx first; ++{ ++ register rtx insn; ++ int i; ++ register int max_uid = 0; ++ ++ for (insn = first; insn; insn = NEXT_INSN (insn)) ++ { ++ if (INSN_UID (insn) >= max_uid) ++ max_uid = INSN_UID (insn); ++ ++ switch (GET_CODE (insn)) ++ { ++ case NOTE: ++ case CODE_LABEL: ++ case BARRIER: ++ break; ++ ++ case JUMP_INSN: ++ case CALL_INSN: ++ case INSN: ++ restore_reg_data_1 (PATTERN (insn)); ++ break; ++ } ++ } ++ ++ /* Don't duplicate the uids already in use. */ ++ cur_insn_uid = max_uid + 1; ++ ++ /* If any regs are missing, make them up. */ ++ for (i = FIRST_PSEUDO_REGISTER; i < reg_rtx_no; i++) ++ if (regno_reg_rtx[i] == 0) ++ regno_reg_rtx[i] = gen_rtx (REG, SImode, i); ++} ++ ++static void ++restore_reg_data_1 (orig) ++ rtx orig; ++{ ++ register rtx x = orig; ++ register int i; ++ register enum rtx_code code; ++ register char *format_ptr; ++ ++ code = GET_CODE (x); ++ ++ switch (code) ++ { ++ case QUEUED: ++ case CONST_INT: ++ case CONST_DOUBLE: ++ case SYMBOL_REF: ++ case CODE_LABEL: ++ case PC: ++ case CC0: ++ case LABEL_REF: ++ return; ++ ++ case REG: ++ if (REGNO (x) >= FIRST_PSEUDO_REGISTER) ++ { ++ /* Make sure regno_pointer_flag and regno_reg_rtx are large ++ enough to have an element for this pseudo reg number. */ ++ if (REGNO (x) >= reg_rtx_no) ++ { ++ reg_rtx_no = REGNO (x); ++ ++ if (reg_rtx_no >= regno_pointer_flag_length) ++ { ++ int newlen = max (regno_pointer_flag_length * 2, ++ reg_rtx_no + 30); ++ rtx *new1; ++ char *new = (char *) oballoc (newlen); ++ bzero (new, newlen); ++ bcopy (regno_pointer_flag, new, regno_pointer_flag_length); ++ ++ new1 = (rtx *) oballoc (newlen * sizeof (rtx)); ++ bzero (new1, newlen * sizeof (rtx)); ++ bcopy (regno_reg_rtx, new1, regno_pointer_flag_length * sizeof (rtx)); ++ ++ regno_pointer_flag = new; ++ regno_reg_rtx = new1; ++ regno_pointer_flag_length = newlen; ++ } ++ reg_rtx_no ++; ++ } ++ regno_reg_rtx[REGNO (x)] = x; ++ } ++ return; ++ ++ case MEM: ++ if (GET_CODE (XEXP (x, 0)) == REG) ++ mark_reg_pointer (XEXP (x, 0)); ++ restore_reg_data_1 (XEXP (x, 0)); ++ return; ++ } ++ ++ /* Now scan the subexpressions recursively. */ ++ ++ format_ptr = GET_RTX_FORMAT (code); ++ ++ for (i = 0; i < GET_RTX_LENGTH (code); i++) ++ { ++ switch (*format_ptr++) ++ { ++ case 'e': ++ restore_reg_data_1 (XEXP (x, i)); ++ break; ++ ++ case 'E': ++ if (XVEC (x, i) != NULL) ++ { ++ register int j; ++ ++ for (j = 0; j < XVECLEN (x, i); j++) ++ restore_reg_data_1 (XVECEXP (x, i, j)); ++ } ++ break; ++ } ++ } ++} ++ ++/* Initialize data structures and variables in this file ++ before generating rtl for each function. ++ WRITE_SYMBOLS is nonzero if any kind of debugging info ++ is to be generated. */ ++ ++void ++init_emit (write_symbols) ++ int write_symbols; ++{ ++ first_insn = NULL; ++ last_insn = NULL; ++ sequence_stack = NULL; ++ cur_insn_uid = 1; ++ reg_rtx_no = FIRST_PSEUDO_REGISTER; ++ last_linenum = 0; ++ last_filename = 0; ++ first_label_num = label_num; ++ ++ no_line_numbers = ! write_symbols; ++ ++ /* Init the tables that describe all the pseudo regs. */ ++ ++ regno_pointer_flag_length = FIRST_PSEUDO_REGISTER + 100; ++ ++ regno_pointer_flag ++ = (char *) oballoc (regno_pointer_flag_length); ++ bzero (regno_pointer_flag, regno_pointer_flag_length); ++ ++ regno_reg_rtx ++ = (rtx *) oballoc (regno_pointer_flag_length * sizeof (rtx)); ++ bzero (regno_reg_rtx, regno_pointer_flag_length * sizeof (rtx)); ++} ++ ++/* Create some permanent unique rtl objects shared between all functions. */ ++ ++void ++init_emit_once () ++{ ++ /* Create the unique rtx's for certain rtx codes and operand values. */ ++ ++ pc_rtx = gen_rtx (PC, VOIDmode); ++ cc0_rtx = gen_rtx (CC0, VOIDmode); ++ ++ /* Don't use gen_rtx here since gen_rtx in this case ++ tries to use these variables. */ ++ const0_rtx = rtx_alloc (CONST_INT); ++ INTVAL (const0_rtx) = 0; ++ const1_rtx = rtx_alloc (CONST_INT); ++ INTVAL (const1_rtx) = 1; ++ ++ fconst0_rtx = rtx_alloc (CONST_DOUBLE); ++ dconst0_rtx = rtx_alloc (CONST_DOUBLE); ++ { ++ union real_extract u; ++#ifdef REAL_IS_NOT_DOUBLE ++ bzero (&u, sizeof u); ++ u.d = REAL_VALUE_ATOF ("0"); ++#else ++ u.d = 0; ++#endif ++ ++ bcopy (&u, &CONST_DOUBLE_LOW (fconst0_rtx), sizeof u); ++ CONST_DOUBLE_MEM (fconst0_rtx) = cc0_rtx; ++ PUT_MODE (fconst0_rtx, SFmode); ++ ++ bcopy (&u, &CONST_DOUBLE_LOW (dconst0_rtx), sizeof u); ++ CONST_DOUBLE_MEM (dconst0_rtx) = cc0_rtx; ++ PUT_MODE (dconst0_rtx, DFmode); ++ } ++ ++ stack_pointer_rtx = gen_rtx (REG, Pmode, STACK_POINTER_REGNUM); ++ frame_pointer_rtx = gen_rtx (REG, Pmode, FRAME_POINTER_REGNUM); ++#ifdef STRUCT_VALUE ++ struct_value_rtx = STRUCT_VALUE; ++#else ++ struct_value_rtx = gen_rtx (REG, Pmode, STRUCT_VALUE_REGNUM); ++#endif ++ ++#ifdef STRUCT_VALUE_INCOMING ++ struct_value_incoming_rtx = STRUCT_VALUE_INCOMING; ++#else ++#ifdef STRUCT_VALUE_INCOMING_REGNUM ++ struct_value_incoming_rtx ++ = gen_rtx (REG, Pmode, STRUCT_VALUE_INCOMING_REGNUM); ++#else ++ struct_value_incoming_rtx = struct_value_rtx; ++#endif ++#endif ++ ++ static_chain_rtx = gen_rtx (REG, Pmode, STATIC_CHAIN_REGNUM); ++ ++#ifdef STATIC_CHAIN_INCOMING_REGNUM ++ if (STATIC_CHAIN_INCOMING_REGNUM != STATIC_CHAIN_REGNUM) ++ static_chain_incoming_rtx = gen_rtx (REG, Pmode, STATIC_CHAIN_INCOMING_REGNUM); ++ else ++#endif ++ static_chain_incoming_rtx = static_chain_rtx; ++ ++ if (FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM) ++ arg_pointer_rtx = frame_pointer_rtx; ++ else ++ arg_pointer_rtx = gen_rtx (REG, Pmode, ARG_POINTER_REGNUM); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/explow.c alliance/genview/src/gcc-1.42/explow.c +--- alliance-5.0/genview/src/gcc-1.42/explow.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/explow.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,598 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Subroutines for manipulating rtx's in semantically interesting ways. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include "config.h" ++#include "rtl.h" ++#include "tree.h" ++#include "flags.h" ++#include "expr.h" ++ ++/* Return an rtx for the sum of X and the integer C. */ ++ ++rtx ++plus_constant (x, c) ++ register rtx x; ++ register int c; ++{ ++ register RTX_CODE code = GET_CODE (x); ++ register enum machine_mode mode = GET_MODE (x); ++ int all_constant = 0; ++ ++ if (c == 0) ++ return x; ++ ++ if (code == CONST_INT) ++ return gen_rtx (CONST_INT, VOIDmode, (INTVAL (x) + c)); ++ ++ /* If adding to something entirely constant, set a flag ++ so that we can add a CONST around the result. */ ++ if (code == CONST) ++ { ++ x = XEXP (x, 0); ++ all_constant = 1; ++ } ++ else if (code == SYMBOL_REF || code == LABEL_REF) ++ all_constant = 1; ++ ++ /* The interesting case is adding the integer to a sum. ++ Look for constant term in the sum and combine ++ with C. For an integer constant term, we make a combined ++ integer. For a constant term that is not an explicit integer, ++ we cannot really combine, but group them together anyway. */ ++ ++ if (GET_CODE (x) == PLUS) ++ { ++ if (GET_CODE (XEXP (x, 0)) == CONST_INT) ++ { ++ c += INTVAL (XEXP (x, 0)); ++ x = XEXP (x, 1); ++ } ++ else if (GET_CODE (XEXP (x, 1)) == CONST_INT) ++ { ++ c += INTVAL (XEXP (x, 1)); ++ x = XEXP (x, 0); ++ } ++ else if (CONSTANT_P (XEXP (x, 0))) ++ { ++ return gen_rtx (PLUS, mode, ++ plus_constant (XEXP (x, 0), c), ++ XEXP (x, 1)); ++ } ++ else if (CONSTANT_P (XEXP (x, 1))) ++ { ++ return gen_rtx (PLUS, mode, ++ XEXP (x, 0), ++ plus_constant (XEXP (x, 1), c)); ++ } ++#ifdef OLD_INDEXING ++ /* Detect adding a constant to an indexed address ++ of the form (PLUS (MULT (REG) (CONST)) regs-and-constants). ++ Keep the (MULT ...) at the top level of addition so that ++ the result is still suitable for indexing and constants ++ are combined. */ ++ else if (GET_CODE (XEXP (x, 0)) == MULT) ++ { ++ return gen_rtx (PLUS, mode, XEXP (x, 0), ++ plus_constant (XEXP (x, 1), c)); ++ } ++ else if (GET_CODE (XEXP (x, 1)) == MULT) ++ { ++ return gen_rtx (PLUS, mode, plus_constant (XEXP (x, 0), c), ++ XEXP (x, 1)); ++ } ++#endif ++ } ++ if (c != 0) ++ x = gen_rtx (PLUS, mode, x, gen_rtx (CONST_INT, VOIDmode, c)); ++ ++ if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF) ++ return x; ++ else if (all_constant) ++ return gen_rtx (CONST, mode, x); ++ else ++ return x; ++} ++ ++/* If X is a sum, return a new sum like X but lacking any constant terms. ++ Add all the removed constant terms into *CONSTPTR. ++ X itself is not altered. The result != X if and only if ++ it is not isomorphic to X. */ ++ ++rtx ++eliminate_constant_term (x, constptr) ++ rtx x; ++ int *constptr; ++{ ++ int c; ++ register rtx x0, x1; ++ ++ if (GET_CODE (x) != PLUS) ++ return x; ++ ++ /* First handle constants appearing at this level explicitly. */ ++ if (GET_CODE (XEXP (x, 0)) == CONST_INT) ++ { ++ *constptr += INTVAL (XEXP (x, 0)); ++ return eliminate_constant_term (XEXP (x, 1), constptr); ++ } ++ ++ if (GET_CODE (XEXP (x, 1)) == CONST_INT) ++ { ++ *constptr += INTVAL (XEXP (x, 1)); ++ return eliminate_constant_term (XEXP (x, 0), constptr); ++ } ++ ++ c = 0; ++ x0 = eliminate_constant_term (XEXP (x, 0), &c); ++ x1 = eliminate_constant_term (XEXP (x, 1), &c); ++ if (x1 != XEXP (x, 1) || x0 != XEXP (x, 0)) ++ { ++ *constptr += c; ++ return gen_rtx (PLUS, GET_MODE (x), x0, x1); ++ } ++ return x; ++} ++ ++/* Return an rtx for the size in bytes of the value of EXP. */ ++ ++rtx ++expr_size (exp) ++ tree exp; ++{ ++ return expand_expr (size_in_bytes (TREE_TYPE (exp)), 0, SImode, 0); ++} ++ ++/* Not yet really written since C does not need it. */ ++ ++rtx ++lookup_static_chain (context) ++ rtx context; ++{ ++ abort (); ++} ++ ++/* Return a copy of X in which all memory references ++ and all constants that involve symbol refs ++ have been replaced with new temporary registers. ++ Also emit code to load the memory locations and constants ++ into those registers. ++ ++ If X contains no such constants or memory references, ++ X itself (not a copy) is returned. ++ ++ X may contain no arithmetic except addition, subtraction and multiplication. ++ Values returned by expand_expr with 1 for sum_ok fit this constraint. */ ++ ++static rtx ++break_out_memory_refs (x) ++ register rtx x; ++{ ++ if (GET_CODE (x) == MEM || GET_CODE (x) == CONST ++ || GET_CODE (x) == SYMBOL_REF) ++ { ++ register rtx temp = force_reg (Pmode, x); ++ mark_reg_pointer (temp); ++ x = temp; ++ } ++ else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS ++ || GET_CODE (x) == MULT) ++ { ++ register rtx op0 = break_out_memory_refs (XEXP (x, 0)); ++ register rtx op1 = break_out_memory_refs (XEXP (x, 1)); ++ if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1)) ++ x = gen_rtx (GET_CODE (x), Pmode, op0, op1); ++ } ++ return x; ++} ++ ++/* Given a memory address or facsimile X, construct a new address, ++ currently equivalent, that is stable: future stores won't change it. ++ ++ X must be composed of constants, register and memory references ++ combined with addition, subtraction and multiplication: ++ in other words, just what you can get from expand_expr if sum_ok is 1. ++ ++ Works by making copies of all regs and memory locations used ++ by X and combining them the same way X does. ++ You could also stabilize the reference to this address ++ by copying the address to a register with copy_to_reg; ++ but then you wouldn't get indexed addressing in the reference. */ ++ ++rtx ++copy_all_regs (x) ++ register rtx x; ++{ ++ if (GET_CODE (x) == REG) ++ { ++ if (REGNO (x) != FRAME_POINTER_REGNUM) ++ x = copy_to_reg (x); ++ } ++ else if (GET_CODE (x) == MEM) ++ x = copy_to_reg (x); ++ else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS ++ || GET_CODE (x) == MULT) ++ { ++ register rtx op0 = copy_all_regs (XEXP (x, 0)); ++ register rtx op1 = copy_all_regs (XEXP (x, 1)); ++ if (op0 != XEXP (x, 0) || op1 != XEXP (x, 1)) ++ x = gen_rtx (GET_CODE (x), Pmode, op0, op1); ++ } ++ return x; ++} ++ ++/* Return something equivalent to X but valid as a memory address ++ for something of mode MODE. When X is not itself valid, this ++ works by copying X or subexpressions of it into registers. */ ++ ++rtx ++memory_address (mode, x) ++ enum machine_mode mode; ++ register rtx x; ++{ ++ register rtx oldx; ++ ++ /* By passing constant addresses thru registers ++ we get a chance to cse them. */ ++ if (! cse_not_expected && CONSTANT_P (x)) ++ return force_reg (Pmode, x); ++ ++ /* Accept a QUEUED that refers to a REG ++ even though that isn't a valid address. ++ On attempting to put this in an insn we will call protect_from_queue ++ which will turn it into a REG, which is valid. */ ++ if (GET_CODE (x) == QUEUED ++ && GET_CODE (QUEUED_VAR (x)) == REG) ++ return x; ++ ++ /* We get better cse by rejecting indirect addressing at this stage. ++ Let the combiner create indirect addresses where appropriate. ++ For now, generate the code so that the subexpressions useful to share ++ are visible. But not if cse won't be done! */ ++ oldx = x; ++ if (! cse_not_expected && GET_CODE (x) != REG) ++ x = break_out_memory_refs (x); ++ ++ /* At this point, any valid address is accepted. */ ++ GO_IF_LEGITIMATE_ADDRESS (mode, x, win); ++ ++ /* If it was valid before but breaking out memory refs invalidated it, ++ use it the old way. */ ++ if (memory_address_p (mode, oldx)) ++ goto win2; ++ ++ /* Perform machine-dependent transformations on X ++ in certain cases. This is not necessary since the code ++ below can handle all possible cases, but machine-dependent ++ transformations can make better code. */ ++ LEGITIMIZE_ADDRESS (x, oldx, mode, win); ++ ++ /* PLUS and MULT can appear in special ways ++ as the result of attempts to make an address usable for indexing. ++ Usually they are dealt with by calling force_operand, below. ++ But a sum containing constant terms is special ++ if removing them makes the sum a valid address: ++ then we generate that address in a register ++ and index off of it. We do this because it often makes ++ shorter code, and because the addresses thus generated ++ in registers often become common subexpressions. */ ++ if (GET_CODE (x) == PLUS) ++ { ++ int constant_term = 0; ++ rtx y = eliminate_constant_term (x, &constant_term); ++ if (constant_term == 0 ++ || ! memory_address_p (mode, y)) ++ return force_operand (x, 0); ++ ++ y = plus_constant (copy_to_reg (y), constant_term); ++ if (! memory_address_p (mode, y)) ++ return force_operand (x, 0); ++ return y; ++ } ++ if (GET_CODE (x) == MULT || GET_CODE (x) == MINUS) ++ return force_operand (x, 0); ++ ++ /* If we have a register that's an invalid address, ++ it must be a hard reg of the wrong class. Copy it to a pseudo. */ ++ if (GET_CODE (x) == REG) ++ return copy_to_reg (x); ++ ++ /* Last resort: copy the value to a register, since ++ the register is a valid address. */ ++ return force_reg (Pmode, x); ++ ++ win2: ++ x = oldx; ++ win: ++ if (flag_force_addr && optimize && GET_CODE (x) != REG ++ /* Don't copy an addr via a reg if it is one of our stack slots. ++ If we did, it would cause invalid REG_EQUIV notes for parms. */ ++ && ! (GET_CODE (x) == PLUS ++ && (XEXP (x, 0) == frame_pointer_rtx ++ || XEXP (x, 0) == arg_pointer_rtx))) ++ { ++ if (general_operand (x, Pmode)) ++ return force_reg (Pmode, x); ++ else ++ return force_operand (x, 0); ++ } ++ return x; ++} ++ ++/* Like `memory_address' but pretend `flag_force_addr' is 0. */ ++ ++rtx ++memory_address_noforce (mode, x) ++ enum machine_mode mode; ++ rtx x; ++{ ++ int ambient_force_addr = flag_force_addr; ++ rtx val; ++ ++ flag_force_addr = 0; ++ val = memory_address (mode, x); ++ flag_force_addr = ambient_force_addr; ++ return val; ++} ++ ++/* Return a modified copy of X with its memory address copied ++ into a temporary register to protect it from side effects. ++ If X is not a MEM, it is returned unchanged (and not copied). ++ Perhaps even if it is a MEM, if there is no need to change it. */ ++ ++rtx ++stabilize (x) ++ rtx x; ++{ ++ register rtx addr; ++ if (GET_CODE (x) != MEM) ++ return x; ++ addr = XEXP (x, 0); ++ if (rtx_unstable_p (addr)) ++ { ++ rtx temp = copy_all_regs (addr); ++ rtx mem; ++ if (GET_CODE (temp) != REG) ++ temp = copy_to_reg (temp); ++ mem = gen_rtx (MEM, GET_MODE (x), temp); ++ /* Mark returned memref with in_struct ++ if it's in an array or structure. */ ++ if (GET_CODE (addr) == PLUS || MEM_IN_STRUCT_P (x)) ++ MEM_IN_STRUCT_P (mem) = 1; ++ return mem; ++ } ++ return x; ++} ++ ++/* Copy the value or contents of X to a new temp reg and return that reg. */ ++ ++rtx ++copy_to_reg (x) ++ rtx x; ++{ ++ register rtx temp = gen_reg_rtx (GET_MODE (x)); ++ ++ /* If not an operand, must be an address with PLUS and MULT so ++ do the computation. */ ++ if (! general_operand (x, VOIDmode)) ++ x = force_operand (x, temp); ++ ++ if (x != temp) ++ emit_move_insn (temp, x); ++ ++ return temp; ++} ++ ++/* Like copy_to_reg but always give the new register mode Pmode ++ in case X is a constant. */ ++ ++rtx ++copy_addr_to_reg (x) ++ rtx x; ++{ ++ return copy_to_mode_reg (Pmode, x); ++} ++ ++/* Like copy_to_reg but always give the new register mode MODE ++ in case X is a constant. */ ++ ++rtx ++copy_to_mode_reg (mode, x) ++ enum machine_mode mode; ++ rtx x; ++{ ++ register rtx temp = gen_reg_rtx (mode); ++ ++ /* If not an operand, must be an address with PLUS and MULT so ++ do the computation. */ ++ if (! general_operand (x, VOIDmode)) ++ x = force_operand (x, temp); ++ ++ if (GET_MODE (x) != mode && GET_MODE (x) != VOIDmode) ++ abort (); ++ if (x != temp) ++ emit_move_insn (temp, x); ++ return temp; ++} ++ ++/* Load X into a register if it is not already one. ++ Use mode MODE for the register. ++ X should be valid for mode MODE, but it may be a constant which ++ is valid for all integer modes; that's why caller must specify MODE. ++ ++ The caller must not alter the value in the register we return, ++ since we mark it as a "constant" register. */ ++ ++rtx ++force_reg (mode, x) ++ enum machine_mode mode; ++ rtx x; ++{ ++ register rtx temp, insn; ++ ++ if (GET_CODE (x) == REG) ++ return x; ++ temp = gen_reg_rtx (mode); ++ insn = emit_move_insn (temp, x); ++ /* Let optimizers know that TEMP's value never changes ++ and that X can be substituted for it. */ ++ if (CONSTANT_P (x)) ++ REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUIV, x, REG_NOTES (insn)); ++ return temp; ++} ++ ++/* If X is a memory ref, copy its contents to a new temp reg and return ++ that reg. Otherwise, return X. */ ++ ++rtx ++force_not_mem (x) ++ rtx x; ++{ ++ register rtx temp; ++ if (GET_CODE (x) != MEM || GET_MODE (x) == BLKmode) ++ return x; ++ temp = gen_reg_rtx (GET_MODE (x)); ++ emit_move_insn (temp, x); ++ return temp; ++} ++ ++/* Copy X to TARGET (if it's nonzero and a reg) ++ or to a new temp reg and return that reg. */ ++ ++rtx ++copy_to_suggested_reg (x, target) ++ rtx x, target; ++{ ++ register rtx temp; ++ if (target && GET_CODE (target) == REG) ++ temp = target; ++ else ++ temp = gen_reg_rtx (GET_MODE (x)); ++ emit_move_insn (temp, x); ++ return temp; ++} ++ ++/* Adjust the stack pointer by ADJUST (an rtx for a number of bytes). ++ This pops when ADJUST is positive. ADJUST need not be constant. */ ++ ++void ++adjust_stack (adjust) ++ rtx adjust; ++{ ++ adjust = protect_from_queue (adjust, 0); ++ ++#ifdef STACK_GROWS_DOWNWARD ++ emit_insn (gen_add2_insn (stack_pointer_rtx, adjust)); ++#else ++ emit_insn (gen_sub2_insn (stack_pointer_rtx, adjust)); ++#endif ++} ++ ++/* Adjust the stack pointer by minus ADJUST (an rtx for a number of bytes). ++ This pushes when ADJUST is positive. ADJUST need not be constant. */ ++ ++void ++anti_adjust_stack (adjust) ++ rtx adjust; ++{ ++ adjust = protect_from_queue (adjust, 0); ++ ++#ifdef STACK_GROWS_DOWNWARD ++ emit_insn (gen_sub2_insn (stack_pointer_rtx, adjust)); ++#else ++ emit_insn (gen_add2_insn (stack_pointer_rtx, adjust)); ++#endif ++} ++ ++/* Round the size of a block to be pushed up to the boundary required ++ by this machine. SIZE is the desired size, which need not be constant. */ ++ ++rtx ++round_push (size) ++ rtx size; ++{ ++#ifdef STACK_BOUNDARY ++ int align = STACK_BOUNDARY / BITS_PER_UNIT; ++ if (align == 1) ++ return size; ++ if (GET_CODE (size) == CONST_INT) ++ { ++ int new = (INTVAL (size) + align - 1) / align * align; ++ if (INTVAL (size) != new) ++ size = gen_rtx (CONST_INT, VOIDmode, new); ++ } ++ else ++ { ++ size = expand_divmod (0, CEIL_DIV_EXPR, Pmode, size, ++ gen_rtx (CONST_INT, VOIDmode, align), ++ 0, 1); ++ size = expand_mult (Pmode, size, ++ gen_rtx (CONST_INT, VOIDmode, align), ++ 0, 1); ++ } ++#endif /* STACK_BOUNDARY */ ++ return size; ++} ++ ++/* Return an rtx representing the register or memory location ++ in which a scalar value of data type VALTYPE ++ was returned by a function call to function FUNC. ++ FUNC is a FUNCTION_DECL node if the precise function is known, ++ otherwise 0. */ ++ ++rtx ++hard_function_value (valtype, func) ++ tree valtype; ++ tree func; ++{ ++ return FUNCTION_VALUE (valtype, func); ++} ++ ++/* Return an rtx representing the register or memory location ++ in which a scalar value of mode MODE was returned by a library call. */ ++ ++rtx ++hard_libcall_value (mode) ++ enum machine_mode mode; ++{ ++ return LIBCALL_VALUE (mode); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/expmed.c alliance/genview/src/gcc-1.42/expmed.c +--- alliance-5.0/genview/src/gcc-1.42/expmed.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/expmed.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,1921 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Medium-level subroutines: convert bit-field store and extract ++ and shifts, multiplies and divides to rtl instructions. ++ Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include "config.h" ++#include "rtl.h" ++#include "tree.h" ++#include "flags.h" ++#include "insn-flags.h" ++#include "insn-codes.h" ++#include "insn-config.h" ++#include "expr.h" ++#include "recog.h" ++ ++static rtx extract_split_bit_field (); ++static rtx extract_fixed_bit_field (); ++static void store_split_bit_field (); ++static void store_fixed_bit_field (); ++ ++/* Return an rtx representing minus the value of X. ++ MODE is the intended mode of the result, ++ useful if X is a CONST_INT. */ ++ ++rtx ++negate_rtx (mode, x) ++ enum machine_mode mode; ++ rtx x; ++{ ++ if (GET_CODE (x) == CONST_INT) ++ { ++ int val = - INTVAL (x); ++ if (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_INT) ++ { ++ /* Sign extend the value from the bits that are significant. */ ++ if (val & (1 << (GET_MODE_BITSIZE (mode) - 1))) ++ val |= (-1) << GET_MODE_BITSIZE (mode); ++ else ++ val &= (1 << GET_MODE_BITSIZE (mode)) - 1; ++ } ++ return gen_rtx (CONST_INT, VOIDmode, val); ++ } ++ else ++ return expand_unop (GET_MODE (x), neg_optab, x, 0, 0); ++} ++ ++/* Generate code to store value from rtx VALUE ++ into a bit-field within structure STR_RTX ++ containing BITSIZE bits starting at bit BITNUM. ++ FIELDMODE is the machine-mode of the FIELD_DECL node for this field. ++ ALIGN is the alignment that STR_RTX is known to have, measured in bytes. ++ TOTAL_SIZE is the size of the structure in bytes, or -1 if unknown. */ ++ ++rtx ++store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size) ++ rtx str_rtx; ++ register int bitsize; ++ int bitnum; ++ enum machine_mode fieldmode; ++ rtx value; ++ int align; ++ int total_size; ++{ ++ int unit = (GET_CODE (str_rtx) == MEM) ? BITS_PER_UNIT : BITS_PER_WORD; ++ register int offset = bitnum / unit; ++ register int bitpos = bitnum % unit; ++ register rtx op0 = str_rtx; ++ rtx value1; ++ ++ /* At this point, BITPOS counts within UNIT for a memref. ++ For a register or a subreg, it actually counts within the width ++ of the mode of OP0. However, BITNUM never exceeds that width, ++ so the % operation above never really does anything. ++ ++ We will adjust BITPOS later to count properly within UNIT ++ in the case of a register. */ ++ ++ /* Discount the part of the structure before the desired byte. ++ We need to know how many bytes are safe to reference after it. */ ++ if (total_size >= 0) ++ total_size -= (bitpos / BIGGEST_ALIGNMENT ++ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); ++ ++ while (GET_CODE (op0) == SUBREG) ++ { ++#ifdef BYTES_BIG_ENDIAN ++ /* Keep BITPOS counting within the size of op0. */ ++ bitpos += (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) ++ - GET_MODE_BITSIZE (GET_MODE (op0))); ++#endif ++ offset += SUBREG_WORD (op0); ++ op0 = SUBREG_REG (op0); ++ } ++ ++ value = protect_from_queue (value, 0); ++ ++ if (flag_force_mem) ++ value = force_not_mem (value); ++ ++ if (GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD ++ && GET_MODE_BITSIZE (fieldmode) == bitsize ++ && bitpos % BITS_PER_WORD == 0 ++ && GET_CODE (op0) == REG) ++ { ++ /* Storing in a full-word or multi-word field in a register ++ can be done with just SUBREG. */ ++ if (GET_MODE (op0) != fieldmode) ++ op0 = gen_rtx (SUBREG, fieldmode, op0, offset); ++ emit_move_insn (op0, value); ++ return value; ++ } ++ ++#ifdef BYTES_BIG_ENDIAN ++ /* If OP0 is a register, BITPOS must count within UNIT, which should be SI. ++ But as we have it, it counts within whatever size OP0 now has. ++ These are not the same, so convert if big-endian. */ ++ if (GET_CODE (op0) != MEM && unit > GET_MODE_BITSIZE (GET_MODE (op0))) ++ { ++ bitpos += unit - GET_MODE_BITSIZE (GET_MODE (op0)); ++ /* Change the mode now so we don't adjust BITPOS again. */ ++ if (GET_CODE (op0) == SUBREG) ++ PUT_MODE (op0, SImode); ++ else ++ op0 = gen_rtx (SUBREG, SImode, op0, 0); ++ } ++#endif ++ ++ /* Storing an lsb-aligned field in a register ++ can be done with a movestrict instruction. */ ++ ++ if (GET_CODE (op0) != MEM ++#ifdef BYTES_BIG_ENDIAN ++ && bitpos + bitsize == unit ++#else ++ && bitpos == 0 ++#endif ++ && (GET_MODE (op0) == fieldmode ++ || (movstrict_optab->handlers[(int) fieldmode].insn_code ++ != CODE_FOR_nothing))) ++ { ++ /* Get appropriate low part of the value being stored. */ ++ if (GET_CODE (value) == CONST_INT || GET_CODE (value) == REG) ++ value = gen_lowpart (fieldmode, value); ++ else if (!(GET_CODE (value) == SYMBOL_REF ++ || GET_CODE (value) == LABEL_REF ++ || GET_CODE (value) == CONST)) ++ value = convert_to_mode (fieldmode, value, 0); ++ ++ if (GET_MODE (op0) == fieldmode) ++ emit_move_insn (op0, value); ++ else ++ { ++ if (GET_CODE (op0) == SUBREG) ++ PUT_MODE (op0, fieldmode); ++ else ++ op0 = gen_rtx (SUBREG, fieldmode, op0, offset); ++ emit_insn (GEN_FCN (movstrict_optab->handlers[(int) fieldmode].insn_code) ++ (op0, value)); ++ } ++ ++ return value; ++ } ++ ++ /* Handle fields bigger than a word. */ ++ ++ if (bitsize > BITS_PER_WORD) ++ { ++ int low_size = BITS_PER_WORD; ++ int low_pos = bitpos + offset * unit; ++ int high_size = bitsize - low_size; ++ int high_pos; ++#ifdef BYTES_BIG_ENDIAN ++ high_pos = low_pos; ++ low_pos += high_size; ++#else ++ high_pos = low_pos + low_size; ++#endif ++ ++ if (GET_MODE (value) != VOIDmode) ++ value = force_reg (GET_MODE (value), value); ++ store_bit_field (op0, low_size, low_pos, SImode, ++ gen_lowpart (SImode, value), align, total_size); ++ store_bit_field (op0, high_size, high_pos, SImode, ++ gen_highpart (SImode, value), align, total_size); ++ return value; ++ } ++ ++ /* From here on we can assume that the field to be stored in is an integer, ++ since it is shorter than a word. */ ++ ++ /* OFFSET is the number of words or bytes (UNIT says which) ++ from STR_RTX to the first word or byte containing part of the field. */ ++ ++ if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG) ++ { ++ /* If not in memory, merge in the offset now. */ ++ if (offset != 0 ++ || GET_MODE_SIZE (GET_MODE (op0)) > GET_MODE_SIZE (SImode)) ++ { ++ if (GET_CODE (op0) == SUBREG) ++ SUBREG_WORD (op0) += offset; ++ else ++ op0 = gen_rtx (SUBREG, SImode, op0, offset); ++ } ++ offset = 0; ++ } ++ else ++ { ++ op0 = protect_from_queue (op0, 1); ++ } ++ ++ /* Now OFFSET is nonzero only if OP0 is memory ++ and is therefore always measured in bytes. */ ++ ++#ifdef HAVE_insv ++ if (HAVE_insv ++ && !(bitsize == 1 && GET_CODE (value) == CONST_INT)) ++ { ++ int xbitpos = bitpos; ++ rtx xop0 = op0; ++ rtx last = get_last_insn (); ++ rtx pat; ++ extern int volatile_ok; ++ int save_volatile_ok = volatile_ok; ++ volatile_ok = 1; ++ ++ /* If this machine's insv can only insert into a register, ++ copy OP0 into a register and save it back later. */ ++ if (GET_CODE (op0) == MEM ++ && ! (*insn_operand_predicate[(int) CODE_FOR_insv][0]) (op0, VOIDmode)) ++ { ++ rtx tempreg; ++ enum machine_mode trymode, bestmode = VOIDmode, insn_mode; ++ /* Don't use a mode bigger than the one of the value to be stored. ++ That mode must be okay, since a bit field can be that big. */ ++ int maxsize ++ = GET_MODE_SIZE (insn_operand_mode[(int) CODE_FOR_insv][3]); ++ /* This used to use the mode desired for operand 0, ++ but that is normally QImode on most machines, ++ and QImode won't work for fields that cross byte ++ boundaries. */ ++ ++ /* Also don't use a mode bigger than the structure. */ ++ if (total_size >= 0 && maxsize > total_size) ++ maxsize = total_size; ++ ++ /* Find biggest machine mode we can safely use ++ to fetch from this structure. ++ But don't use a bigger mode than the insn wants. */ ++ for (trymode = QImode; ++ trymode && GET_MODE_SIZE (trymode) <= maxsize; ++ trymode = GET_MODE_WIDER_MODE (trymode)) ++ if (GET_MODE_SIZE (trymode) <= align ++ || align == BIGGEST_ALIGNMENT / BITS_PER_UNIT) ++ bestmode = trymode; ++ if (! bestmode) ++ abort (); ++ /* Adjust address to point to the containing unit of that mode. */ ++ unit = GET_MODE_BITSIZE (bestmode); ++ /* Compute offset as multiple of this unit, counting in bytes. */ ++ offset = (bitnum / unit) * GET_MODE_SIZE (bestmode); ++ bitpos = bitnum % unit; ++ op0 = change_address (op0, bestmode, ++ plus_constant (XEXP (op0, 0), offset)); ++ ++ /* Fetch that unit, store the bitfield in it, then store the unit. */ ++ tempreg = copy_to_reg (op0); ++ /* To actually store in TEMPREG, ++ look at it in the mode this insn calls for. ++ (Probably SImode.) */ ++ insn_mode = SImode; ++#ifdef BYTES_BIG_ENDIAN ++ if (GET_MODE_BITSIZE (insn_mode) > unit) ++ bitpos += GET_MODE_BITSIZE (insn_mode) - unit; ++#endif ++ store_bit_field (gen_rtx (SUBREG, insn_mode, tempreg, 0), ++ bitsize, bitpos, fieldmode, value, ++ align, total_size); ++ emit_move_insn (op0, tempreg); ++ return value; ++ } ++ volatile_ok = save_volatile_ok; ++ ++ /* Add OFFSET into OP0's address. */ ++ if (GET_CODE (xop0) == MEM) ++ xop0 = change_address (xop0, QImode, ++ plus_constant (XEXP (xop0, 0), offset)); ++ ++ /* If xop0 is a register, we need it in SImode ++ to make it acceptable to the format of insv. */ ++ if (GET_CODE (xop0) == SUBREG) ++ PUT_MODE (xop0, SImode); ++ if (GET_CODE (xop0) == REG && GET_MODE (xop0) != SImode) ++ { ++#ifdef BYTES_BIG_ENDIAN ++ xbitpos += (GET_MODE_BITSIZE (SImode) ++ - GET_MODE_BITSIZE (GET_MODE (xop0))); ++#endif ++ xop0 = gen_rtx (SUBREG, SImode, xop0, 0); ++ } ++ ++ /* Convert VALUE to SImode (which insv insn wants) in VALUE1. */ ++ value1 = value; ++ if (GET_MODE (value) != SImode) ++ { ++ if (GET_MODE_BITSIZE (GET_MODE (value)) >= bitsize) ++ { ++ /* Optimization: Don't bother really extending VALUE ++ if it has all the bits we will actually use. */ ++ ++ /* Avoid making subreg of a subreg, or of a mem. */ ++ if (GET_CODE (value1) != REG) ++ value1 = copy_to_reg (value1); ++ value1 = gen_rtx (SUBREG, SImode, value1, 0); ++ } ++ else if (!CONSTANT_P (value)) ++ /* Parse phase is supposed to make VALUE's data type ++ match that of the component reference, which is a type ++ at least as wide as the field; so VALUE should have ++ a mode that corresponds to that type. */ ++ abort (); ++ } ++ ++ /* If this machine's insv insists on a register, ++ get VALUE1 into a register. */ ++ if (! (*insn_operand_predicate[(int) CODE_FOR_insv][3]) (value1, SImode)) ++ value1 = force_reg (SImode, value1); ++ ++ /* On big-endian machines, we count bits from the most significant. ++ If the bit field insn does not, we must invert. */ ++ ++#if defined (BITS_BIG_ENDIAN) != defined (BYTES_BIG_ENDIAN) ++ xbitpos = unit - 1 - xbitpos; ++#endif ++ ++ pat = gen_insv (xop0, ++ gen_rtx (CONST_INT, VOIDmode, bitsize), ++ gen_rtx (CONST_INT, VOIDmode, xbitpos), ++ value1); ++ if (pat) ++ emit_insn (pat); ++ else ++ { ++ delete_insns_since (last); ++ store_fixed_bit_field (op0, offset, bitsize, bitpos, value, align); ++ } ++ } ++ else ++#endif ++ /* Insv is not available; store using shifts and boolean ops. */ ++ store_fixed_bit_field (op0, offset, bitsize, bitpos, value, align); ++ return value; ++} ++ ++/* Use shifts and boolean operations to store VALUE ++ into a bit field of width BITSIZE ++ in a memory location specified by OP0 except offset by OFFSET bytes. ++ (OFFSET must be 0 if OP0 is a register.) ++ The field starts at position BITPOS within the byte. ++ (If OP0 is a register, it may be SImode or a narrower mode, ++ but BITPOS still counts within a full word, ++ which is significant on bigendian machines.) ++ STRUCT_ALIGN is the alignment the structure is known to have (in bytes). ++ ++ Note that protect_from_queue has already been done on OP0 and VALUE. */ ++ ++static void ++store_fixed_bit_field (op0, offset, bitsize, bitpos, value, struct_align) ++ register rtx op0; ++ register int offset, bitsize, bitpos; ++ register rtx value; ++ int struct_align; ++{ ++ register enum machine_mode mode; ++ int total_bits = BITS_PER_WORD; ++ rtx subtarget; ++ int all_zero = 0; ++ int all_one = 0; ++ ++ /* Add OFFSET to OP0's address (if it is in memory) ++ and if a single byte contains the whole bit field ++ change OP0 to a byte. */ ++ ++ /* There is a case not handled here: ++ a structure with a known alignment of just a halfword ++ and a field split across two aligned halfwords within the structure. ++ Or likewise a structure with a known alignment of just a byte ++ and a field split across two bytes. ++ Such cases are not supposed to be able to occur. */ ++ ++ if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG) ++ { ++ if (offset != 0) ++ abort (); ++ /* Special treatment for a bit field split across two registers. */ ++ if (bitsize + bitpos > BITS_PER_WORD) ++ { ++ store_split_bit_field (op0, bitsize, bitpos, value, BITS_PER_WORD); ++ return; ++ } ++ } ++ else if (bitsize + bitpos <= BITS_PER_UNIT ++ && (! SLOW_BYTE_ACCESS ++ || (struct_align == 1 ++ && BIGGEST_ALIGNMENT > 1))) ++ { ++ /* It fits in one byte, and either bytes are fast ++ or the alignment won't let us use anything bigger. */ ++ total_bits = BITS_PER_UNIT; ++ op0 = change_address (op0, QImode, ++ plus_constant (XEXP (op0, 0), offset)); ++ } ++ else if ((bitsize + bitpos + (offset % GET_MODE_SIZE (HImode)) * BITS_PER_UNIT ++ <= GET_MODE_BITSIZE (HImode)) ++ /* If halfwords are fast, use them whenever valid. */ ++ && (! SLOW_BYTE_ACCESS ++ /* Use halfwords if larger is invalid due to alignment. */ ++ || (struct_align == GET_MODE_SIZE (HImode) ++ && BIGGEST_ALIGNMENT > GET_MODE_SIZE (HImode)))) ++ { ++ /* It fits in an aligned halfword within the structure, ++ and either halfwords are fast ++ or the alignment won't let us use anything bigger. */ ++ total_bits = GET_MODE_BITSIZE (HImode); ++ ++ /* Get ref to halfword containing the field. */ ++ bitpos += (offset % (total_bits / BITS_PER_UNIT)) * BITS_PER_UNIT; ++ offset -= (offset % (total_bits / BITS_PER_UNIT)); ++ op0 = change_address (op0, HImode, ++ plus_constant (XEXP (op0, 0), offset)); ++ } ++ else ++ { ++ /* Get ref to an aligned word containing the field. */ ++ /* Adjust BITPOS to be position within a word, ++ and OFFSET to be the offset of that word. ++ Then alter OP0 to refer to that word. */ ++ bitpos += (offset % (BITS_PER_WORD / BITS_PER_UNIT)) * BITS_PER_UNIT; ++ offset -= (offset % (BITS_PER_WORD / BITS_PER_UNIT)); ++ op0 = change_address (op0, SImode, ++ plus_constant (XEXP (op0, 0), offset)); ++ ++ /* Special treatment for a bit field split across two aligned words. */ ++ if (bitsize + bitpos > BITS_PER_WORD) ++ { ++ store_split_bit_field (op0, bitsize, bitpos, value, struct_align); ++ return; ++ } ++ } ++ ++ mode = GET_MODE (op0); ++ ++ /* Now MODE is either QImode, HImode or SImode for a MEM as OP0, ++ or is SImode for a REG as OP0. TOTAL_BITS corresponds. ++ The bit field is contained entirely within OP0. ++ BITPOS is the starting bit number within OP0. ++ (OP0's mode may actually be narrower than MODE.) */ ++ ++#ifdef BYTES_BIG_ENDIAN ++ /* BITPOS is the distance between our msb ++ and that of the containing datum. ++ Convert it to the distance from the lsb. */ ++ ++ bitpos = total_bits - bitsize - bitpos; ++#endif ++ /* Now BITPOS is always the distance between our lsb ++ and that of OP0. */ ++ ++ /* Shift VALUE left by BITPOS bits. If VALUE is not constant, ++ we must first convert its mode to MODE. */ ++ ++ if (GET_CODE (value) == CONST_INT) ++ { ++ register int v = INTVAL (value); ++ ++ if (bitsize < HOST_BITS_PER_INT) ++ v &= (1 << bitsize) - 1; ++ ++ if (v == 0) ++ all_zero = 1; ++ else if (bitsize < HOST_BITS_PER_INT && v == (1 << bitsize) - 1) ++ all_one = 1; ++ ++ value = gen_rtx (CONST_INT, VOIDmode, v << bitpos); ++ } ++ else ++ { ++ int must_and = (GET_MODE_BITSIZE (GET_MODE (value)) != bitsize); ++ ++ if (GET_MODE (value) != mode) ++ { ++ if ((GET_CODE (value) == REG || GET_CODE (value) == SUBREG) ++ && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (value))) ++ value = gen_lowpart (mode, value); ++ else ++ value = convert_to_mode (mode, value, 1); ++ } ++ ++ if (must_and && bitsize < HOST_BITS_PER_INT) ++ value = expand_bit_and (mode, value, ++ gen_rtx (CONST_INT, VOIDmode, ++ (1 << bitsize) - 1), ++ 0); ++ if (bitpos > 0) ++ value = expand_shift (LSHIFT_EXPR, mode, value, ++ build_int_2 (bitpos, 0), 0, 1); ++ } ++ ++ /* Now clear the chosen bits in OP0, ++ except that if VALUE is -1 we need not bother. */ ++ ++ subtarget = op0; ++ ++ if (! all_one) ++ subtarget = expand_bit_and (mode, op0, ++ gen_rtx (CONST_INT, VOIDmode, ++ (~ (((unsigned) ~0 ++ >> (HOST_BITS_PER_INT - bitsize)) ++ << bitpos)) ++ & ((GET_MODE_BITSIZE (mode) ++ == HOST_BITS_PER_INT) ++ ? -1 ++ : ((1 << GET_MODE_BITSIZE (mode)) - 1))), ++ subtarget); ++ ++ /* Now logical-or VALUE into OP0, unless it is zero. */ ++ ++ if (! all_zero) ++ subtarget = expand_binop (mode, ior_optab, subtarget, value, ++ op0, 1, OPTAB_LIB_WIDEN); ++ if (op0 != subtarget) ++ emit_move_insn (op0, subtarget); ++} ++ ++/* Store a bit field that is split across two words. ++ ++ OP0 is the REG, SUBREG or MEM rtx for the first of the two words. ++ BITSIZE is the field width; BITPOS the position of its first bit ++ (within the word). ++ VALUE is the value to store. */ ++ ++static void ++store_split_bit_field (op0, bitsize, bitpos, value, align) ++ rtx op0; ++ int bitsize, bitpos; ++ rtx value; ++ int align; ++{ ++ /* BITSIZE_1 is size of the part in the first word. */ ++ int bitsize_1 = BITS_PER_WORD - bitpos; ++ /* BITSIZE_2 is size of the rest (in the following word). */ ++ int bitsize_2 = bitsize - bitsize_1; ++ rtx part1, part2; ++ ++ /* Alignment of VALUE, after conversion. */ ++ int valalign = GET_MODE_SIZE (SImode); ++ ++ if (GET_MODE (value) != VOIDmode) ++ value = convert_to_mode (SImode, value, 1); ++ if (CONSTANT_P (value) && GET_CODE (value) != CONST_INT) ++ value = copy_to_reg (value); ++ ++ /* Split the value into two parts: ++ PART1 gets that which goes in the first word; PART2 the other. */ ++#ifdef BYTES_BIG_ENDIAN ++ /* PART1 gets the more significant part. */ ++ if (GET_CODE (value) == CONST_INT) ++ { ++ part1 = gen_rtx (CONST_INT, VOIDmode, ++ (unsigned) (INTVAL (value)) >> bitsize_2); ++ part2 = gen_rtx (CONST_INT, VOIDmode, ++ (unsigned) (INTVAL (value)) & ((1 << bitsize_2) - 1)); ++ } ++ else ++ { ++ part1 = extract_fixed_bit_field (SImode, value, 0, bitsize_1, ++ BITS_PER_WORD - bitsize, 0, 1, valalign); ++ part2 = extract_fixed_bit_field (SImode, value, 0, bitsize_2, ++ BITS_PER_WORD - bitsize_2, 0, 1, valalign); ++ } ++#else ++ /* PART1 gets the less significant part. */ ++ if (GET_CODE (value) == CONST_INT) ++ { ++ part1 = gen_rtx (CONST_INT, VOIDmode, ++ (unsigned) (INTVAL (value)) & ((1 << bitsize_1) - 1)); ++ part2 = gen_rtx (CONST_INT, VOIDmode, ++ (unsigned) (INTVAL (value)) >> bitsize_1); ++ } ++ else ++ { ++ part1 = extract_fixed_bit_field (SImode, value, 0, bitsize_1, 0, ++ 0, 1, valalign); ++ part2 = extract_fixed_bit_field (SImode, value, 0, bitsize_2, ++ bitsize_1, 0, 1, valalign); ++ } ++#endif ++ ++ /* Store PART1 into the first word. */ ++ store_fixed_bit_field (op0, 0, bitsize_1, bitpos, part1, align); ++ ++ /* Offset op0 to get to the following word. */ ++ if (GET_CODE (op0) == MEM) ++ op0 = change_address (op0, SImode, ++ plus_constant (XEXP (op0, 0), UNITS_PER_WORD)); ++ else if (GET_CODE (op0) == REG) ++ op0 = gen_rtx (SUBREG, SImode, op0, 1); ++ else if (GET_CODE (op0) == SUBREG) ++ op0 = gen_rtx (SUBREG, SImode, SUBREG_REG (op0), SUBREG_WORD (op0) + 1); ++ ++ /* Store PART2 into the second word. */ ++ store_fixed_bit_field (op0, 0, bitsize_2, 0, part2, align); ++} ++ ++/* Generate code to extract a byte-field from STR_RTX ++ containing BITSIZE bits, starting at BITNUM, ++ and put it in TARGET if possible (if TARGET is nonzero). ++ Regardless of TARGET, we return the rtx for where the value is placed. ++ It may be a QUEUED. ++ ++ STR_RTX is the structure containing the byte (a REG or MEM). ++ UNSIGNEDP is nonzero if this is an unsigned bit field. ++ MODE is the natural mode of the field value once extracted. ++ TMODE is the mode the caller would like the value to have; ++ but the value may be returned with type MODE instead. ++ ++ ALIGN is the alignment that STR_RTX is known to have, measured in bytes. ++ TOTAL_SIZE is the total size in bytes of the structure, if known. ++ Otherwise it is -1. ++ ++ If a TARGET is specified and we can store in it at no extra cost, ++ we do so, and return TARGET. ++ Otherwise, we return a REG of mode TMODE or MODE, with TMODE preferred ++ if they are equally easy. */ ++ ++rtx ++extract_bit_field (str_rtx, bitsize, bitnum, unsignedp, ++ target, mode, tmode, align, total_size) ++ rtx str_rtx; ++ register int bitsize; ++ int bitnum; ++ int unsignedp; ++ rtx target; ++ enum machine_mode mode, tmode; ++ int align; ++ int total_size; ++{ ++ int unit = (GET_CODE (str_rtx) == MEM) ? BITS_PER_UNIT : BITS_PER_WORD; ++ register int offset = bitnum / unit; ++ register int bitpos = bitnum % unit; ++ register rtx op0 = str_rtx; ++ rtx spec_target = target; ++ rtx bitsize_rtx, bitpos_rtx; ++ rtx spec_target_subreg = 0; ++ ++ /* Discount the part of the structure before the desired byte. ++ We need to know how many bytes are safe to reference after it. */ ++ if (total_size >= 0) ++ total_size -= (bitpos / BIGGEST_ALIGNMENT ++ * (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); ++ ++ if (tmode == VOIDmode) ++ tmode = mode; ++ ++ while (GET_CODE (op0) == SUBREG) ++ { ++#ifdef BYTES_BIG_ENDIAN ++ /* Keep BITPOS counting within the size of op0. */ ++ bitpos += (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) ++ - GET_MODE_BITSIZE (GET_MODE (op0))); ++#endif ++ offset += SUBREG_WORD (op0); ++ op0 = SUBREG_REG (op0); ++ } ++ ++#ifdef BYTES_BIG_ENDIAN ++ /* If OP0 is a register, BITPOS must count within a word. ++ But as we have it, it counts within whatever size OP0 now has. ++ On a bigendian machine, these are not the same, so convert. */ ++ if (GET_CODE (op0) != MEM && unit > GET_MODE_BITSIZE (GET_MODE (op0))) ++ { ++ bitpos += unit - GET_MODE_BITSIZE (GET_MODE (op0)); ++ /* Change the mode now so we don't adjust BITPOS again. */ ++ if (GET_CODE (op0) == SUBREG) ++ PUT_MODE (op0, SImode); ++ else ++ op0 = gen_rtx (SUBREG, SImode, op0, 0); ++ } ++#endif ++ ++ /* Extracting a full-word or multi-word value ++ from a structure in a register. ++ This can be done with just SUBREG. ++ So too extracting a subword value in ++ the least significant part of the register. */ ++ ++ if (GET_CODE (op0) == REG ++ && ((bitsize >= BITS_PER_WORD && bitsize == GET_MODE_BITSIZE (mode) ++ && bitpos % BITS_PER_WORD == 0) ++ || ((bitsize == GET_MODE_BITSIZE (mode) ++ || bitsize == GET_MODE_BITSIZE (QImode) ++ || bitsize == GET_MODE_BITSIZE (HImode)) ++#ifdef BYTES_BIG_ENDIAN ++ && bitpos + bitsize == BITS_PER_WORD ++#else ++ && bitpos == 0 ++#endif ++ ))) ++ { ++ enum machine_mode mode1 = mode; ++ ++ if (bitsize == GET_MODE_BITSIZE (QImode)) ++ mode1 = QImode; ++ if (bitsize == GET_MODE_BITSIZE (HImode)) ++ mode1 = HImode; ++ ++ if (mode1 != GET_MODE (op0)) ++ { ++ if (GET_CODE (op0) == SUBREG) ++ PUT_MODE (op0, mode1); ++ else ++ op0 = gen_rtx (SUBREG, mode1, op0, offset); ++ } ++ ++ if (mode1 != mode) ++ return convert_to_mode (tmode, op0, unsignedp); ++ return op0; ++ } ++ ++ /* Handle fields bigger than a word. */ ++ ++ if (bitsize > BITS_PER_WORD) ++ { ++ int low_size = BITS_PER_WORD; ++ int low_pos = bitpos + offset * unit; ++ rtx target_low_part, low_part; ++ int high_size = bitsize - low_size; ++ int high_pos; ++ rtx target_high_part, high_part; ++#ifdef BYTES_BIG_ENDIAN ++ high_pos = low_pos; ++ low_pos += high_size; ++#else ++ high_pos = low_pos + low_size; ++#endif ++ ++ if (target == 0 || GET_CODE (target) != REG) ++ target = gen_reg_rtx (mode); ++ ++ /* Extract the low part of the bitfield, and make sure ++ to store it in the low part of TARGET. */ ++ target_low_part = gen_lowpart (SImode, target); ++ low_part = extract_bit_field (op0, low_size, low_pos, 1, ++ target_low_part, SImode, SImode, ++ align, total_size); ++ if (low_part != target_low_part) ++ emit_move_insn (target_low_part, low_part); ++ ++ /* Likewise for the high part. */ ++ target_high_part = gen_highpart (SImode, target); ++ high_part = extract_bit_field (op0, high_size, high_pos, unsignedp, ++ target_high_part, SImode, SImode, ++ align, total_size); ++ if (high_part != target_high_part) ++ emit_move_insn (target_high_part, high_part); ++ ++ return target; ++ } ++ ++ /* From here on we know the desired field is smaller than a word ++ so we can assume it is an integer. So we can safely extract it as one ++ size of integer, if necessary, and then truncate or extend ++ to the size that is wanted. */ ++ ++ /* OFFSET is the number of words or bytes (UNIT says which) ++ from STR_RTX to the first word or byte containing part of the field. */ ++ ++ if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG) ++ { ++ /* If not in memory, merge in the offset now. */ ++ if (offset != 0 ++ || GET_MODE_SIZE (GET_MODE (op0)) > GET_MODE_SIZE (SImode)) ++ { ++ if (GET_CODE (op0) == SUBREG) ++ SUBREG_WORD (op0) += offset; ++ else ++ op0 = gen_rtx (SUBREG, SImode, op0, offset); ++ } ++ offset = 0; ++ } ++ else ++ { ++ op0 = protect_from_queue (str_rtx, 1); ++ } ++ ++ /* Now OFFSET is nonzero only for memory operands. */ ++ ++ if (unsignedp) ++ { ++#ifdef HAVE_extzv ++ if (HAVE_extzv) ++ { ++ int xbitpos = bitpos, xoffset = offset; ++ rtx last = get_last_insn(); ++ rtx xop0 = op0; ++ rtx xtarget = target; ++ rtx xspec_target = spec_target; ++ rtx xspec_target_subreg = spec_target_subreg; ++ rtx pat; ++ ++ if (GET_CODE (xop0) == MEM) ++ { ++ extern int volatile_ok; ++ int save_volatile_ok = volatile_ok; ++ volatile_ok = 1; ++ ++ /* Is the memory operand acceptable? */ ++ if (! ((*insn_operand_predicate[(int) CODE_FOR_extzv][1]) ++ (xop0, GET_MODE (xop0)))) ++ { ++ /* No, load into a reg and extract from there. */ ++ enum machine_mode bestmode = VOIDmode, trymode; ++ /* Don't use a mode bigger than the one of the value ++ to be fetched. That mode must be okay, ++ since a bit field can be that big. */ ++ int maxsize ++ = GET_MODE_SIZE (insn_operand_mode[(int) CODE_FOR_extzv][0]); ++ /* This used to use the mode desired for operand 1, ++ but that is normally QImode on most machines, ++ and QImode won't work for fields that cross byte ++ boundaries. */ ++ ++ /* Also don't use a mode bigger than the structure. */ ++ if (total_size >= 0 && maxsize > total_size) ++ maxsize = total_size; ++ ++ /* Find biggest machine mode we can safely use ++ to fetch from this structure. ++ But don't use a bigger mode than the insn wants. */ ++ for (trymode = QImode; ++ trymode && GET_MODE_SIZE (trymode) <= maxsize; ++ trymode = GET_MODE_WIDER_MODE (trymode)) ++ if (GET_MODE_SIZE (trymode) <= align ++ || align == BIGGEST_ALIGNMENT / BITS_PER_UNIT) ++ bestmode = trymode; ++ if (! bestmode) ++ abort (); ++ unit = GET_MODE_BITSIZE (bestmode); ++ ++ /* Compute offset as multiple of this unit, ++ counting in bytes. */ ++ xoffset = (bitnum / unit) * GET_MODE_SIZE (bestmode); ++ xbitpos = bitnum % unit; ++ xop0 = change_address (xop0, bestmode, ++ plus_constant (XEXP (xop0, 0), ++ xoffset)); ++ /* Fetch it to a register in that size. */ ++ xop0 = force_reg (bestmode, xop0); ++ ++ /* Now ref the register in the mode extzv wants. */ ++ /* We used to use the mode from operand 1 in the md, ++ but that is often QImode because that's needed for MEM. ++ Here we need SImode instead. */ ++ if (bestmode != SImode) ++ xop0 = gen_rtx (SUBREG, SImode, xop0, 0); ++#ifdef BYTES_BIG_ENDIAN ++ if (GET_MODE_BITSIZE (GET_MODE (xop0)) > unit) ++ xbitpos += GET_MODE_BITSIZE (GET_MODE (xop0)) - unit; ++#endif ++ } ++ else ++ /* Get ref to first byte containing part of the field. */ ++ xop0 = change_address (xop0, QImode, ++ plus_constant (XEXP (xop0, 0), xoffset)); ++ ++ volatile_ok = save_volatile_ok; ++ } ++ ++ /* If op0 is a register, we need it in SImode ++ to make it acceptable to the format of extzv. */ ++ if (GET_CODE (xop0) == SUBREG && GET_MODE (xop0) != SImode) ++ abort (); ++ if (GET_CODE (xop0) == REG && GET_MODE (xop0) != SImode) ++ { ++#ifdef BYTES_BIG_ENDIAN ++ xbitpos += (GET_MODE_BITSIZE (SImode) ++ - GET_MODE_BITSIZE (GET_MODE (xop0))); ++#endif ++ xop0 = gen_rtx (SUBREG, SImode, xop0, 0); ++ } ++ ++ if (xtarget == 0 ++ || (flag_force_mem && GET_CODE (xtarget) == MEM)) ++ xtarget = xspec_target = gen_reg_rtx (tmode); ++ ++ if (GET_MODE (xtarget) != SImode) ++ { ++ if (GET_CODE (xtarget) == REG) ++ xspec_target_subreg = xtarget = gen_lowpart (SImode, xtarget); ++ else ++ xtarget = gen_reg_rtx (SImode); ++ } ++ ++ /* If this machine's extzv insists on a register target, ++ make sure we have one. */ ++ if (! (*insn_operand_predicate[(int) CODE_FOR_extzv][0]) (xtarget, SImode)) ++ xtarget = gen_reg_rtx (SImode); ++ ++ /* On big-endian machines, we count bits from the most significant. ++ If the bit field insn does not, we must invert. */ ++#if defined (BITS_BIG_ENDIAN) != defined (BYTES_BIG_ENDIAN) ++ xbitpos = unit - 1 - xbitpos; ++#endif ++ ++ bitsize_rtx = gen_rtx (CONST_INT, VOIDmode, bitsize); ++ bitpos_rtx = gen_rtx (CONST_INT, VOIDmode, xbitpos); ++ ++ pat = gen_extzv (protect_from_queue (xtarget, 1), ++ xop0, bitsize_rtx, bitpos_rtx); ++ if (pat) ++ { ++ emit_insn (pat); ++ target = xtarget; ++ spec_target = xspec_target; ++ spec_target_subreg = xspec_target_subreg; ++ } ++ else ++ { ++ delete_insns_since (last); ++ target = extract_fixed_bit_field (tmode, op0, offset, bitsize, ++ bitpos, target, 1, align); ++ } ++ } ++ else ++#endif ++ target = extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos, ++ target, 1, align); ++ } ++ else ++ { ++#ifdef HAVE_extv ++ if (HAVE_extv) ++ { ++ int xbitpos = bitpos, xoffset = offset; ++ rtx last = get_last_insn(); ++ rtx xop0 = op0, xtarget = target; ++ rtx xspec_target = spec_target; ++ rtx xspec_target_subreg = spec_target_subreg; ++ rtx pat; ++ ++ if (GET_CODE (xop0) == MEM) ++ { ++ /* Is the memory operand acceptable? */ ++ if (! ((*insn_operand_predicate[(int) CODE_FOR_extv][1]) ++ (xop0, GET_MODE (xop0)))) ++ { ++ /* No, load into a reg and extract from there. */ ++ enum machine_mode bestmode = VOIDmode, trymode; ++ /* Don't use a mode bigger than the one of the value ++ to be fetched. That mode must be okay, ++ since a bit field can be that big. */ ++ int maxsize ++ = GET_MODE_SIZE (insn_operand_mode[(int) CODE_FOR_extv][0]); ++ /* This used to use the mode desired for operand 1, ++ but that is normally QImode on most machines, ++ and QImode won't work for fields that cross byte ++ boundaries. */ ++ ++ /* Also don't use a mode bigger than the structure. */ ++ if (total_size >= 0 && maxsize > total_size) ++ maxsize = total_size; ++ ++ /* Find biggest machine mode we can safely use ++ to fetch from this structure. ++ But don't use a bigger mode than the insn wants. */ ++ for (trymode = QImode; ++ trymode && GET_MODE_SIZE (trymode) <= maxsize; ++ trymode = GET_MODE_WIDER_MODE (trymode)) ++ if (GET_MODE_SIZE (trymode) <= align ++ || align == BIGGEST_ALIGNMENT / BITS_PER_UNIT) ++ bestmode = trymode; ++ if (! bestmode) ++ abort (); ++ unit = GET_MODE_BITSIZE (bestmode); ++ ++ /* Compute offset as multiple of this unit, ++ counting in bytes. */ ++ xoffset = (bitnum / unit) * GET_MODE_SIZE (bestmode); ++ xbitpos = bitnum % unit; ++ xop0 = change_address (xop0, bestmode, ++ plus_constant (XEXP (xop0, 0), ++ xoffset)); ++ /* Fetch it to a register in that size. */ ++ xop0 = force_reg (bestmode, xop0); ++ ++ /* Now ref the register in the mode extv wants. */ ++ /* We used to use the mode from operand 1 in the md, ++ but that is often QImode because that's needed for MEM. ++ Here we need SImode instead. */ ++ if (bestmode != SImode) ++ xop0 = gen_rtx (SUBREG, SImode, xop0, 0); ++#ifdef BYTES_BIG_ENDIAN ++ if (GET_MODE_BITSIZE (GET_MODE (xop0)) > unit) ++ xbitpos += GET_MODE_BITSIZE (GET_MODE (xop0)) - unit; ++#endif ++ } ++ else ++ /* Get ref to first byte containing part of the field. */ ++ xop0 = change_address (xop0, QImode, ++ plus_constant (XEXP (xop0, 0), xoffset)); ++ } ++ ++ /* If op0 is a register, we need it in SImode ++ to make it acceptable to the format of extv. */ ++ if (GET_CODE (xop0) == SUBREG && GET_MODE (xop0) != SImode) ++ abort (); ++ if (GET_CODE (xop0) == REG && GET_MODE (xop0) != SImode) ++ { ++#ifdef BYTES_BIG_ENDIAN ++ xbitpos += (GET_MODE_BITSIZE (SImode) ++ - GET_MODE_BITSIZE (GET_MODE (xop0))); ++#endif ++ xop0 = gen_rtx (SUBREG, SImode, xop0, 0); ++ } ++ ++ if (xtarget == 0 ++ || (flag_force_mem && GET_CODE (xtarget) == MEM)) ++ xtarget = xspec_target = gen_reg_rtx (tmode); ++ ++ if (GET_MODE (xtarget) != SImode) ++ { ++ if (GET_CODE (xtarget) == REG) ++ xspec_target_subreg = xtarget = gen_lowpart (SImode, xtarget); ++ else ++ xtarget = gen_reg_rtx (SImode); ++ } ++ ++ /* If this machine's extv insists on a register target, ++ make sure we have one. */ ++ if (! (*insn_operand_predicate[(int) CODE_FOR_extv][0]) (xtarget, SImode)) ++ xtarget = gen_reg_rtx (SImode); ++ ++ /* On big-endian machines, we count bits from the most significant. ++ If the bit field insn does not, we must invert. */ ++#if defined (BITS_BIG_ENDIAN) != defined (BYTES_BIG_ENDIAN) ++ xbitpos = unit - 1 - xbitpos; ++#endif ++ ++ bitsize_rtx = gen_rtx (CONST_INT, VOIDmode, bitsize); ++ bitpos_rtx = gen_rtx (CONST_INT, VOIDmode, xbitpos); ++ ++ pat = gen_extv (protect_from_queue (xtarget, 1), ++ xop0, bitsize_rtx, bitpos_rtx); ++ if (pat) ++ { ++ emit_insn (pat); ++ target = xtarget; ++ spec_target = xspec_target; ++ spec_target_subreg = xspec_target_subreg; ++ } ++ else ++ { ++ delete_insns_since (last); ++ target = extract_fixed_bit_field (tmode, op0, offset, bitsize, ++ bitpos, target, 0, align); ++ } ++ } ++ else ++#endif ++ target = extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos, ++ target, 0, align); ++ } ++ if (target == spec_target) ++ return target; ++ if (target == spec_target_subreg) ++ return spec_target; ++ if (GET_MODE (target) != tmode && GET_MODE (target) != mode) ++ return convert_to_mode (tmode, target, unsignedp); ++ return target; ++} ++ ++/* Extract a bit field using shifts and boolean operations ++ Returns an rtx to represent the value. ++ OP0 addresses a register (word) or memory (byte). ++ BITPOS says which bit within the word or byte the bit field starts in. ++ OFFSET says how many bytes farther the bit field starts; ++ it is 0 if OP0 is a register. ++ BITSIZE says how many bits long the bit field is. ++ (If OP0 is a register, it may be narrower than SImode, ++ but BITPOS still counts within a full word, ++ which is significant on bigendian machines.) ++ ++ UNSIGNEDP is nonzero for an unsigned bit field (don't sign-extend value). ++ If TARGET is nonzero, attempts to store the value there ++ and return TARGET, but this is not guaranteed. ++ If TARGET is not used, create a pseudo-reg of mode TMODE for the value. ++ ++ ALIGN is the alignment that STR_RTX is known to have, measured in bytes. */ ++ ++static rtx ++extract_fixed_bit_field (tmode, op0, offset, bitsize, bitpos, ++ target, unsignedp, align) ++ enum machine_mode tmode; ++ register rtx op0, target; ++ register int offset, bitsize, bitpos; ++ int unsignedp; ++ int align; ++{ ++ int total_bits = BITS_PER_WORD; ++ enum machine_mode mode; ++ ++ if (GET_CODE (op0) == SUBREG || GET_CODE (op0) == REG) ++ { ++ /* Special treatment for a bit field split across two registers. */ ++ if (bitsize + bitpos > BITS_PER_WORD) ++ return extract_split_bit_field (op0, bitsize, bitpos, ++ unsignedp, align); ++ } ++ else if (bitsize + bitpos <= BITS_PER_UNIT ++ && (! SLOW_BYTE_ACCESS ++ || (align == 1 ++ && BIGGEST_ALIGNMENT > 1))) ++ { ++ /* It fits in one byte, and either bytes are fast ++ or the alignment won't let us use anything bigger. */ ++ total_bits = BITS_PER_UNIT; ++ op0 = change_address (op0, QImode, ++ plus_constant (XEXP (op0, 0), offset)); ++ } ++ else if ((bitsize + bitpos + (offset % GET_MODE_SIZE (HImode)) * BITS_PER_UNIT ++ <= GET_MODE_BITSIZE (HImode)) ++ /* If halfwords are fast, use them whenever valid. */ ++ && (! SLOW_BYTE_ACCESS ++ /* Use halfwords if larger is invalid due to alignment. */ ++ || (align == GET_MODE_SIZE (HImode) ++ && BIGGEST_ALIGNMENT > GET_MODE_SIZE (HImode)))) ++ { ++ /* It fits in an aligned halfword, and either halfwords are fast ++ or the alignment won't let us use anything bigger. */ ++ total_bits = GET_MODE_BITSIZE (HImode); ++ ++ /* Get ref to halfword containing the field. */ ++ bitpos += (offset % (total_bits / BITS_PER_UNIT)) * BITS_PER_UNIT; ++ offset -= (offset % (total_bits / BITS_PER_UNIT)); ++ op0 = change_address (op0, HImode, ++ plus_constant (XEXP (op0, 0), offset)); ++ } ++ else ++ { ++ /* Get ref to word containing the field. */ ++ /* Adjust BITPOS to be position within a word, ++ and OFFSET to be the offset of that word. */ ++ bitpos += (offset % (BITS_PER_WORD / BITS_PER_UNIT)) * BITS_PER_UNIT; ++ offset -= (offset % (BITS_PER_WORD / BITS_PER_UNIT)); ++ op0 = change_address (op0, SImode, ++ plus_constant (XEXP (op0, 0), offset)); ++ ++ /* Special treatment for a bit field split across two words. */ ++ if (bitsize + bitpos > BITS_PER_WORD) ++ return extract_split_bit_field (op0, bitsize, bitpos, ++ unsignedp, align); ++ } ++ ++ mode = GET_MODE (op0); ++ ++#ifdef BYTES_BIG_ENDIAN ++ /* BITPOS is the distance between our msb and that of OP0. ++ Convert it to the distance from the lsb. */ ++ ++ bitpos = total_bits - bitsize - bitpos; ++#endif ++ /* Now BITPOS is always the distance between the field's lsb and that of OP0. ++ We have reduced the big-endian case to the little-endian case. */ ++ ++ if (unsignedp) ++ { ++ if (bitpos) ++ { ++ /* If the field does not already start at the lsb, ++ shift it so it does. */ ++ tree amount = build_int_2 (bitpos, 0); ++ /* Maybe propagate the target for the shift. */ ++ /* But not if we will return it--could confuse integrate.c. */ ++ rtx subtarget = (target != 0 && GET_CODE (target) == REG ++ && !REG_FUNCTION_VALUE_P (target) ++ ? target : 0); ++ if (tmode != mode) subtarget = 0; ++ op0 = expand_shift (RSHIFT_EXPR, mode, op0, amount, subtarget, 1); ++ } ++ /* Convert the value to the desired mode. */ ++ if (mode != tmode) ++ op0 = convert_to_mode (tmode, op0, 1); ++ ++ /* Unless the msb of the field used to be the msb when we shifted, ++ mask out the upper bits. */ ++ ++ if ((GET_MODE_BITSIZE (mode) != bitpos + bitsize ++#if 0 ++#ifdef SLOW_ZERO_EXTEND ++ /* Always generate an `and' if ++ we just zero-extended op0 and SLOW_ZERO_EXTEND, since it ++ will combine fruitfully with the zero-extend. */ ++ || tmode != mode ++#endif ++#endif ++ ) ++ && bitsize < HOST_BITS_PER_INT) ++ return expand_bit_and (GET_MODE (op0), op0, ++ gen_rtx (CONST_INT, VOIDmode, (1 << bitsize) - 1), ++ target); ++ return op0; ++ } ++ ++ /* To extract a signed bit-field, first shift its msb to the msb of the word, ++ then arithmetic-shift its lsb to the lsb of the word. */ ++ op0 = force_reg (mode, op0); ++ if (mode != tmode) ++ target = 0; ++ if (GET_MODE_BITSIZE (QImode) < GET_MODE_BITSIZE (mode) ++ && GET_MODE_BITSIZE (QImode) >= bitsize + bitpos) ++ mode = QImode, op0 = convert_to_mode (QImode, op0, 0); ++ if (GET_MODE_BITSIZE (HImode) < GET_MODE_BITSIZE (mode) ++ && GET_MODE_BITSIZE (HImode) >= bitsize + bitpos) ++ mode = HImode, op0 = convert_to_mode (HImode, op0, 0); ++ if (GET_MODE_BITSIZE (mode) != (bitsize + bitpos)) ++ { ++ tree amount = build_int_2 (GET_MODE_BITSIZE (mode) - (bitsize + bitpos), 0); ++ /* Maybe propagate the target for the shift. */ ++ /* But not if we will return the result--could confuse integrate.c. */ ++ rtx subtarget = (target != 0 && GET_CODE (target) == REG ++ && ! REG_FUNCTION_VALUE_P (target) ++ ? target : 0); ++ op0 = expand_shift (LSHIFT_EXPR, mode, op0, amount, subtarget, 1); ++ } ++ ++ return expand_shift (RSHIFT_EXPR, mode, op0, ++ build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0), ++ target, 0); ++} ++ ++/* Extract a bit field that is split across two words ++ and return an RTX for the result. ++ ++ OP0 is the REG, SUBREG or MEM rtx for the first of the two words. ++ BITSIZE is the field width; BITPOS, position of its first bit, in the word. ++ UNSIGNEDP is 1 if should zero-extend the contents; else sign-extend. */ ++ ++static rtx ++extract_split_bit_field (op0, bitsize, bitpos, unsignedp, align) ++ rtx op0; ++ int bitsize, bitpos, unsignedp, align; ++{ ++ /* BITSIZE_1 is size of the part in the first word. */ ++ int bitsize_1 = BITS_PER_WORD - bitpos; ++ /* BITSIZE_2 is size of the rest (in the following word). */ ++ int bitsize_2 = bitsize - bitsize_1; ++ rtx part1, part2, result; ++ ++ /* Get the part of the bit field from the first word. */ ++ part1 = extract_fixed_bit_field (SImode, op0, 0, bitsize_1, bitpos, ++ 0, 1, align); ++ ++ /* Offset op0 by 1 word to get to the following one. */ ++ if (GET_CODE (op0) == MEM) ++ op0 = change_address (op0, SImode, ++ plus_constant (XEXP (op0, 0), UNITS_PER_WORD)); ++ else if (GET_CODE (op0) == REG) ++ op0 = gen_rtx (SUBREG, SImode, op0, 1); ++ else ++ op0 = gen_rtx (SUBREG, SImode, SUBREG_REG (op0), SUBREG_WORD (op0) + 1); ++ ++ /* Get the part of the bit field from the second word. */ ++ part2 = extract_fixed_bit_field (SImode, op0, 0, bitsize_2, 0, 0, 1, align); ++ ++ /* Shift the more significant part up to fit above the other part. */ ++#ifdef BYTES_BIG_ENDIAN ++ part1 = expand_shift (LSHIFT_EXPR, SImode, part1, ++ build_int_2 (bitsize_2, 0), 0, 1); ++#else ++ part2 = expand_shift (LSHIFT_EXPR, SImode, part2, ++ build_int_2 (bitsize_1, 0), 0, 1); ++#endif ++ ++ /* Combine the two parts with bitwise or. This works ++ because we extracted both parts as unsigned bit fields. */ ++ result = expand_binop (SImode, ior_optab, part1, part2, 0, 1, ++ OPTAB_LIB_WIDEN); ++ ++ /* Unsigned bit field: we are done. */ ++ if (unsignedp) ++ return result; ++ /* Signed bit field: sign-extend with two arithmetic shifts. */ ++ result = expand_shift (LSHIFT_EXPR, SImode, result, ++ build_int_2 (BITS_PER_WORD - bitsize, 0), 0, 0); ++ return expand_shift (RSHIFT_EXPR, SImode, result, ++ build_int_2 (BITS_PER_WORD - bitsize, 0), 0, 0); ++} ++ ++/* Add INC into TARGET. */ ++ ++void ++expand_inc (target, inc) ++ rtx target, inc; ++{ ++ rtx value = expand_binop (GET_MODE (target), add_optab, ++ target, inc, ++ target, 0, OPTAB_LIB_WIDEN); ++ if (value != target) ++ emit_move_insn (target, value); ++} ++ ++/* Subtract INC from TARGET. */ ++ ++void ++expand_dec (target, dec) ++ rtx target, dec; ++{ ++ rtx value = expand_binop (GET_MODE (target), sub_optab, ++ target, dec, ++ target, 0, OPTAB_LIB_WIDEN); ++ if (value != target) ++ emit_move_insn (target, value); ++} ++ ++/* Output a shift instruction for expression code CODE, ++ with SHIFTED being the rtx for the value to shift, ++ and AMOUNT the tree for the amount to shift by. ++ Store the result in the rtx TARGET, if that is convenient. ++ If UNSIGNEDP is nonzero, do a logical shift; otherwise, arithmetic. ++ Return the rtx for where the value is. */ ++ ++/* Pastel, for shifts, converts shift count to SImode here ++ independent of the mode being shifted. ++ Should that be done in an earlier pass? ++ It turns out not to matter for C. */ ++ ++rtx ++expand_shift (code, mode, shifted, amount, target, unsignedp) ++ enum tree_code code; ++ register enum machine_mode mode; ++ rtx shifted; ++ tree amount; ++ register rtx target; ++ int unsignedp; ++{ ++ register rtx op1, temp = 0; ++ register int left = (code == LSHIFT_EXPR || code == LROTATE_EXPR); ++ int try; ++ int rotate = code == LROTATE_EXPR || code == RROTATE_EXPR; ++ rtx last; ++ ++ /* Previously detected shift-counts computed by NEGATE_EXPR ++ and shifted in the other direction; but that does not work ++ on all machines. */ ++ ++ op1 = expand_expr (amount, 0, VOIDmode, 0); ++ ++ last = get_last_insn (); ++ ++ for (try = 0; temp == 0 && try < 3; try++) ++ { ++ enum optab_methods methods; ++ delete_insns_since (last); ++ ++ if (try == 0) ++ methods = OPTAB_DIRECT; ++ else if (try == 1) ++ methods = OPTAB_WIDEN; ++ else ++ methods = OPTAB_LIB_WIDEN; ++ ++ if (rotate) ++ { ++ /* Widening does not work for rotation. */ ++ if (methods != OPTAB_DIRECT) ++ methods = OPTAB_LIB; ++ ++ temp = expand_binop (mode, ++ left ? rotl_optab : rotr_optab, ++ shifted, op1, target, -1, methods); ++ } ++ else if (unsignedp) ++ { ++ temp = expand_binop (mode, ++ left ? lshl_optab : lshr_optab, ++ shifted, op1, target, unsignedp, methods); ++ if (temp == 0 && left) ++ temp = expand_binop (mode, ashl_optab, ++ shifted, op1, target, unsignedp, methods); ++ if (temp != 0) ++ return temp; ++ } ++ /* Do arithmetic shifts. ++ Also, if we are going to widen the operand, we can just as well ++ use an arithmetic right-shift instead of a logical one. */ ++ if (! rotate && (! unsignedp || (! left && methods == OPTAB_WIDEN))) ++ { ++ enum optab_methods methods1 = methods; ++ ++ /* If trying to widen a log shift to an arithmetic shift, ++ don't accept an arithmetic shift of the same size. */ ++ if (unsignedp) ++ methods1 = OPTAB_MUST_WIDEN; ++ ++ /* Arithmetic shift */ ++ ++ temp = expand_binop (mode, ++ left ? ashl_optab : ashr_optab, ++ shifted, op1, target, unsignedp, methods1); ++ if (temp != 0) ++ return temp; ++ } ++ ++ if (unsignedp) ++ { ++ /* No logical shift insn in either direction => ++ try a bit-field extract instruction if we have one. */ ++#ifdef HAVE_extzv ++#ifndef BITS_BIG_ENDIAN ++ if (HAVE_extzv && !left ++ && ((methods == OPTAB_DIRECT && mode == SImode) ++ || (methods == OPTAB_WIDEN ++ && GET_MODE_SIZE (mode) < GET_MODE_SIZE (SImode)))) ++ { ++ rtx shifted1 = convert_to_mode (SImode, shifted, 1); ++ rtx target1 = target; ++ ++ /* If -fforce-mem, don't let the operand be in memory. */ ++ if (flag_force_mem && GET_CODE (shifted1) == MEM) ++ shifted1 = force_not_mem (shifted1); ++ ++ /* If this machine's extzv insists on a register for ++ operand 1, arrange for that. */ ++ if (! ((*insn_operand_predicate[(int) CODE_FOR_extzv][1]) ++ (shifted1, SImode))) ++ shifted1 = force_reg (SImode, shifted1); ++ ++ /* If we don't have or cannot use a suggested target, ++ make a place for the result, in the proper mode. */ ++ if (methods == OPTAB_WIDEN || target1 == 0 ++ || ! ((*insn_operand_predicate[(int) CODE_FOR_extzv][0]) ++ (target1, SImode))) ++ target1 = gen_reg_rtx (SImode); ++ ++ op1 = convert_to_mode (SImode, op1, 0); ++ ++ /* If this machine's extzv insists on a register for ++ operand 3, arrange for that. */ ++ if (! ((*insn_operand_predicate[(int) CODE_FOR_extzv][3]) ++ (op1, SImode))) ++ op1 = force_reg (SImode, op1); ++ ++ op1 = protect_from_queue (op1, 1); ++ ++ /* TEMP gets the width of the bit field to extract: ++ wordsize minus # bits to shift by. */ ++ if (GET_CODE (op1) == CONST_INT) ++ temp = gen_rtx (CONST_INT, VOIDmode, ++ (GET_MODE_BITSIZE (mode) - INTVAL (op1))); ++ else ++ temp = expand_binop (SImode, sub_optab, ++ gen_rtx (CONST_INT, VOIDmode, ++ GET_MODE_BITSIZE (mode)), ++ op1, gen_reg_rtx (SImode), ++ 0, OPTAB_LIB_WIDEN); ++ /* Now extract with width TEMP, omitting OP1 least sig bits. */ ++ emit_insn (gen_extzv (protect_from_queue (target1, 1), ++ protect_from_queue (shifted1, 0), ++ temp, op1)); ++ return convert_to_mode (mode, target1, 1); ++ } ++ /* Can also do logical shift with signed bit-field extract ++ followed by inserting the bit-field at a different position. ++ That strategy is not yet implemented. */ ++#endif /* not BITS_BIG_ENDIAN */ ++#endif /* HAVE_extzv */ ++ /* We have failed to generate the logical shift and will abort. */ ++ } ++ } ++ if (temp == 0) ++ abort (); ++ return temp; ++} ++ ++/* Output an instruction or two to bitwise-and OP0 with OP1 ++ in mode MODE, with output to TARGET if convenient and TARGET is not zero. ++ Returns where the result is. */ ++/* This function used to do more; now it could be eliminated. */ ++ ++rtx ++expand_bit_and (mode, op0, op1, target) ++ enum machine_mode mode; ++ rtx op0, op1, target; ++{ ++ register rtx temp; ++ ++ /* First try to open-code it directly. */ ++ temp = expand_binop (mode, and_optab, op0, op1, target, 1, OPTAB_LIB_WIDEN); ++ if (temp == 0) ++ abort (); ++ return temp; ++} ++ ++/* Perform a multiplication and return an rtx for the result. ++ MODE is mode of value; OP0 and OP1 are what to multiply (rtx's); ++ TARGET is a suggestion for where to store the result (an rtx). ++ ++ We check specially for a constant integer as OP1. ++ If you want this check for OP0 as well, then before calling ++ you should swap the two operands if OP0 would be constant. */ ++ ++rtx ++expand_mult (mode, op0, op1, target, unsignedp) ++ enum machine_mode mode; ++ register rtx op0, op1, target; ++ int unsignedp; ++{ ++ /* Don't use the function value register as a target ++ since we have to read it as well as write it, ++ and function-inlining gets confused by this. */ ++ if (target && REG_P (target) && REG_FUNCTION_VALUE_P (target)) ++ target = 0; ++ ++ if (GET_CODE (op1) == CONST_INT) ++ { ++ register int foo; ++ int bar; ++ int negate = INTVAL (op1) < 0; ++ int absval = INTVAL (op1) * (negate ? -1 : 1); ++ ++ /* Is multiplier a power of 2, or minus that? */ ++ foo = exact_log2 (absval); ++ if (foo >= 0) ++ { ++ rtx tem; ++ if (foo == 0) ++ tem = op0; ++ else ++ tem = expand_shift (LSHIFT_EXPR, mode, op0, ++ build_int_2 (foo, 0), ++ target, 0); ++ return (negate ++ ? expand_unop (mode, neg_optab, tem, target, 0) ++ : tem); ++ } ++ /* Is multiplier a sum of two powers of 2, or minus that? */ ++ bar = floor_log2 (absval); ++ foo = exact_log2 (absval - (1 << bar)); ++ if (bar >= 0 && foo >= 0) ++ { ++ rtx tem; ++ /* Prevent multiple refs to a volatile location. */ ++ if (GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0)) ++ op0 = force_reg (mode, op0); ++ tem = ++ force_operand (gen_rtx (PLUS, mode, ++ expand_shift (LSHIFT_EXPR, mode, op0, ++ build_int_2 (bar - foo, 0), ++ 0, 0), ++ op0), ++ ((foo == 0 && ! negate) ? target : 0)); ++ ++ if (foo != 0) ++ tem = expand_shift (LSHIFT_EXPR, mode, tem, ++ build_int_2 (foo, 0), ++ negate ? 0 : target, 0); ++ ++ return negate ? expand_unop (mode, neg_optab, tem, target, 0) : tem; ++ } ++ } ++ /* This used to use umul_optab if unsigned, ++ but I think that for non-widening multiply there is no difference ++ between signed and unsigned. */ ++ op0 = expand_binop (mode, smul_optab, ++ op0, op1, target, unsignedp, OPTAB_LIB_WIDEN); ++ if (op0 == 0) ++ abort (); ++ return op0; ++} ++ ++/* Emit the code to divide OP0 by OP1, putting the result in TARGET ++ if that is convenient, and returning where the result is. ++ You may request either the quotient or the remainder as the result; ++ specify REM_FLAG nonzero to get the remainder. ++ ++ CODE is the expression code for which kind of division this is; ++ it controls how rounding is done. MODE is the machine mode to use. ++ UNSIGNEDP nonzero means do unsigned division. */ ++ ++/* ??? For CEIL_MOD_EXPR, can compute incorrect remainder with ANDI ++ and then correct it by or'ing in missing high bits ++ if result of ANDI is nonzero. ++ For ROUND_MOD_EXPR, can use ANDI and then sign-extend the result. ++ This could optimize to a bfexts instruction. ++ But C doesn't use these operations, so their optimizations are ++ left for later. */ ++ ++rtx ++expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp) ++ int rem_flag; ++ enum tree_code code; ++ enum machine_mode mode; ++ register rtx op0, op1, target; ++ int unsignedp; ++{ ++ register rtx temp; ++ int log = -1; ++ int can_clobber_op0; ++ int mod_insn_no_good = 0; ++ rtx adjusted_op0 = op0; ++ ++ /* Don't use a non-register target. ++ It could cause a crash in copy_to_suggested_reg ++ when the value being copied has VOIDmode. */ ++ if (target && GET_CODE (target) != REG) ++ target = 0; ++ ++ /* Don't use the function value register as a target ++ since we have to read it as well as write it, ++ and function-inlining gets confused by this. */ ++ if (target && REG_P (target) && REG_FUNCTION_VALUE_P (target)) ++ target = 0; ++ ++ /* Don't clobber an operand while doing a multi-step calculation. */ ++ if (target) ++ if ((rem_flag && (reg_mentioned_p (target, op0) ++ || (GET_CODE (op0) == MEM && GET_CODE (target) == MEM))) ++ || reg_mentioned_p (target, op1) ++ || (GET_CODE (op1) == MEM && GET_CODE (target) == MEM)) ++ target = 0; ++ ++ if (target == 0) ++ target = gen_reg_rtx (mode); ++ ++ can_clobber_op0 = (GET_CODE (op0) == REG && op0 == target); ++ ++ if (GET_CODE (op1) == CONST_INT) ++ log = exact_log2 (INTVAL (op1)); ++ ++ /* If log is >= 0, we are dividing by 2**log, and will do it by shifting, ++ which is really floor-division. Otherwise we will really do a divide, ++ and we assume that is trunc-division. ++ ++ We must correct the dividend by adding or subtracting something ++ based on the divisor, in order to do the kind of rounding specified ++ by CODE. The correction depends on what kind of rounding is actually ++ available, and that depends on whether we will shift or divide. */ ++ ++ switch (code) ++ { ++ case TRUNC_MOD_EXPR: ++ case TRUNC_DIV_EXPR: ++ if (log >= 0 && ! unsignedp) ++ { ++ rtx label = gen_label_rtx (); ++ if (! can_clobber_op0) ++ { ++ adjusted_op0 = copy_to_suggested_reg (adjusted_op0, target); ++ /* Copy op0 to a reg, since emit_cmp_insn will call emit_queue ++ which will screw up mem refs for autoincrements. */ ++ op0 = force_reg (mode, op0); ++ } ++ emit_cmp_insn (adjusted_op0, const0_rtx, 0, 0, 0); ++ emit_jump_insn (gen_bge (label)); ++ expand_inc (adjusted_op0, plus_constant (op1, -1)); ++ emit_label (label); ++ mod_insn_no_good = 1; ++ } ++ break; ++ ++ case FLOOR_DIV_EXPR: ++ case FLOOR_MOD_EXPR: ++ if (log < 0 && ! unsignedp) ++ { ++ rtx label = gen_label_rtx (); ++ if (! can_clobber_op0) ++ { ++ adjusted_op0 = copy_to_suggested_reg (adjusted_op0, target); ++ op0 = force_reg (mode, op0); ++ } ++ emit_cmp_insn (adjusted_op0, const0_rtx, 0, 0, 0); ++ emit_jump_insn (gen_bge (label)); ++ expand_dec (adjusted_op0, op1); ++ expand_inc (adjusted_op0, const1_rtx); ++ emit_label (label); ++ mod_insn_no_good = 1; ++ } ++ break; ++ ++ case CEIL_DIV_EXPR: ++ case CEIL_MOD_EXPR: ++ if (! can_clobber_op0) ++ { ++ adjusted_op0 = copy_to_suggested_reg (adjusted_op0, target); ++ op0 = force_reg (mode, op0); ++ } ++ if (log < 0) ++ { ++ rtx label = 0; ++ if (! unsignedp) ++ { ++ label = gen_label_rtx (); ++ emit_cmp_insn (adjusted_op0, const0_rtx, 0, 0, 0); ++ emit_jump_insn (gen_ble (label)); ++ } ++ expand_inc (adjusted_op0, op1); ++ expand_dec (adjusted_op0, const1_rtx); ++ if (! unsignedp) ++ emit_label (label); ++ } ++ else ++ { ++ adjusted_op0 = expand_binop (GET_MODE (target), add_optab, ++ adjusted_op0, plus_constant (op1, -1), ++ 0, 0, OPTAB_LIB_WIDEN); ++ } ++ mod_insn_no_good = 1; ++ break; ++ ++ case ROUND_DIV_EXPR: ++ case ROUND_MOD_EXPR: ++ if (! can_clobber_op0) ++ { ++ adjusted_op0 = copy_to_suggested_reg (adjusted_op0, target); ++ op0 = force_reg (mode, op0); ++ } ++ if (log < 0) ++ { ++ op1 = expand_shift (RSHIFT_EXPR, mode, op1, integer_one_node, 0, 0); ++ if (! unsignedp) ++ { ++ rtx label = gen_label_rtx (); ++ emit_cmp_insn (adjusted_op0, const0_rtx, 0, 0, 0); ++ emit_jump_insn (gen_bge (label)); ++ expand_unop (mode, neg_optab, op1, op1, 0); ++ emit_label (label); ++ } ++ expand_inc (adjusted_op0, op1); ++ } ++ else ++ { ++ op1 = gen_rtx (CONST_INT, VOIDmode, INTVAL (op1) / 2); ++ expand_inc (adjusted_op0, op1); ++ } ++ mod_insn_no_good = 1; ++ break; ++ } ++ ++ if (rem_flag && !mod_insn_no_good) ++ { ++ /* Try to produce the remainder directly */ ++ if (log >= 0) ++ { ++ return expand_bit_and (mode, adjusted_op0, ++ gen_rtx (CONST_INT, VOIDmode, ++ INTVAL (op1) - 1), ++ target); ++ } ++ else ++ { ++ /* See if we can do remainder without a library call. */ ++ temp = sign_expand_binop (mode, umod_optab, smod_optab, ++ adjusted_op0, op1, target, ++ unsignedp, OPTAB_WIDEN); ++ if (temp != 0) ++ return temp; ++ /* No luck there. ++ Can we do remainder and divide at once without a library call? */ ++ temp = gen_reg_rtx (mode); ++ if (expand_twoval_binop (unsignedp ? udivmod_optab : sdivmod_optab, ++ adjusted_op0, op1, ++ 0, temp, unsignedp)) ++ return temp; ++ temp = 0; ++ } ++ } ++ ++ /* Produce the quotient. */ ++ if (log >= 0) ++ temp = expand_shift (RSHIFT_EXPR, mode, adjusted_op0, ++ build_int_2 (exact_log2 (INTVAL (op1)), 0), ++ target, unsignedp); ++ else if (rem_flag && !mod_insn_no_good) ++ /* If producing quotient in order to subtract for remainder, ++ and a remainder subroutine would be ok, ++ don't use a divide subroutine. */ ++ temp = sign_expand_binop (mode, udiv_optab, sdiv_optab, ++ adjusted_op0, op1, target, ++ unsignedp, OPTAB_WIDEN); ++ else ++ { ++ /* Try a quotient insn, but not a library call. */ ++ temp = sign_expand_binop (mode, udiv_optab, sdiv_optab, ++ adjusted_op0, op1, target, ++ unsignedp, OPTAB_WIDEN); ++ if (temp == 0) ++ { ++ /* No luck there. Try a quotient-and-remainder insn, ++ keeping the quotient alone. */ ++ temp = gen_reg_rtx (mode); ++ if (! expand_twoval_binop (unsignedp ? udivmod_optab : sdivmod_optab, ++ adjusted_op0, op1, ++ temp, 0, unsignedp)) ++ temp = 0; ++ } ++ ++ /* If still no luck, use a library call. */ ++ if (temp == 0) ++ temp = sign_expand_binop (mode, udiv_optab, sdiv_optab, ++ adjusted_op0, op1, target, ++ unsignedp, OPTAB_LIB_WIDEN); ++ } ++ ++ /* If we really want the remainder, get it by subtraction. */ ++ if (rem_flag) ++ { ++ if (temp == 0) ++ { ++ /* No divide instruction either. Use library for remainder. */ ++ temp = sign_expand_binop (mode, umod_optab, smod_optab, ++ op0, op1, target, ++ unsignedp, OPTAB_LIB_WIDEN); ++ } ++ else ++ { ++ /* We divided. Now finish doing X - Y * (X / Y). */ ++ temp = expand_mult (mode, temp, op1, temp, unsignedp); ++ if (! temp) abort (); ++ temp = expand_binop (mode, sub_optab, op0, ++ temp, target, unsignedp, OPTAB_LIB_WIDEN); ++ } ++ } ++ ++ if (temp == 0) ++ abort (); ++ return temp; ++} ++ ++/* Return a tree node with data type TYPE, describing the value of X. ++ Usually this is an RTL_EXPR, if there is no obvious better choice. */ ++ ++static tree ++make_tree (type, x) ++ tree type; ++ rtx x; ++{ ++ tree t; ++ switch (GET_CODE (x)) ++ { ++ case CONST_INT: ++ t = build_int_2 (INTVAL (x), 0); ++ TREE_TYPE (t) = type; ++ return fold (t); ++ ++ default: ++ t = make_node (RTL_EXPR); ++ TREE_TYPE (t) = type; ++ RTL_EXPR_RTL (t) = x; ++ /* There are no insns to be output ++ when this rtl_expr is used. */ ++ RTL_EXPR_SEQUENCE (t) = 0; ++ return t; ++ } ++} ++ ++/* Return an rtx representing the value of X * MULT + ADD. ++ MODE is the machine mode for the computation. ++ UNSIGNEDP is non-zero to do unsigned multiplication. ++ This may emit insns. */ ++ ++rtx ++expand_mult_add (x, mult, add, mode, unsignedp) ++ rtx x, mult, add; ++ enum machine_mode mode; ++ int unsignedp; ++{ ++ tree type = type_for_size (GET_MODE_BITSIZE (mode), unsignedp); ++ tree prod = fold (build (MULT_EXPR, type, make_tree (type, x), ++ make_tree (type, mult))); ++ tree sum = fold (build (PLUS_EXPR, type, prod, make_tree (type, add))); ++ return expand_expr (sum, 0, VOIDmode, 0); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/expr.c alliance/genview/src/gcc-1.42/expr.c +--- alliance-5.0/genview/src/gcc-1.42/expr.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/expr.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,5777 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Convert tree expression to rtl instructions, for GNU compiler. ++ Copyright (C) 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include "config.h" ++#include "rtl.h" ++#include "tree.h" ++#include "flags.h" ++#include "insn-flags.h" ++#include "insn-codes.h" ++#include "expr.h" ++#include "insn-config.h" ++#include "recog.h" ++#include "gvarargs.h" ++#include "typeclass.h" ++ ++/* Decide whether a function's arguments should be processed ++ from first to last or from last to first. */ ++ ++#ifdef STACK_GROWS_DOWNWARD ++#ifdef PUSH_ROUNDING ++#define PUSH_ARGS_REVERSED /* If it's last to first */ ++#endif ++#endif ++ ++/* Like STACK_BOUNDARY but in units of bytes, not bits. */ ++#define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT) ++ ++/* If this is nonzero, we do not bother generating VOLATILE ++ around volatile memory references, and we are willing to ++ output indirect addresses. If cse is to follow, we reject ++ indirect addresses so a useful potential cse is generated; ++ if it is used only once, instruction combination will produce ++ the same indirect address eventually. */ ++int cse_not_expected; ++ ++/* Nonzero to generate code for all the subroutines within an ++ expression before generating the upper levels of the expression. ++ Nowadays this is never zero. */ ++int do_preexpand_calls = 1; ++ ++/* Number of units that we should eventually pop off the stack. ++ These are the arguments to function calls that have already returned. */ ++int pending_stack_adjust; ++ ++/* Nonzero means stack pops must not be deferred, and deferred stack ++ pops must not be output. It is nonzero inside a function call, ++ inside a conditional expression, inside a statement expression, ++ and in other cases as well. */ ++int inhibit_defer_pop; ++ ++/* A list of all cleanups which belong to the arguments of ++ function calls being expanded by expand_call. */ ++static tree cleanups_of_this_call; ++ ++/* Nonzero means __builtin_saveregs has already been done in this function. ++ The value is the pseudoreg containing the value __builtin_saveregs ++ returned. */ ++static rtx saveregs_value; ++ ++/* Nonzero means current function may call alloca ++ as a subroutine. (__builtin_alloca does not count.) */ ++int may_call_alloca; ++ ++rtx store_expr (); ++static void store_constructor (); ++static rtx store_field (); ++static rtx expand_call (); ++static void emit_call_1 (); ++static rtx prepare_call_address (); ++static rtx expand_builtin (); ++static rtx compare (); ++static rtx compare_constants (); ++static rtx compare1 (); ++static rtx do_store_flag (); ++static void preexpand_calls (); ++static rtx expand_increment (); ++static void init_queue (); ++ ++void do_pending_stack_adjust (); ++ ++/* MOVE_RATIO is the number of move instructions that is better than ++ a block move. */ ++ ++#ifndef MOVE_RATIO ++#if defined (HAVE_movstrqi) || defined (HAVE_movstrhi) || defined (HAVE_movstrsi) ++#define MOVE_RATIO 2 ++#else ++/* A value of around 6 would minimize code size; infinity would minimize ++ execution time. */ ++#define MOVE_RATIO 15 ++#endif ++#endif ++ ++/* Table indexed by tree code giving 1 if the code is for a ++ comparison operation, or anything that is most easily ++ computed with a conditional branch. ++ ++ We include tree.def to give it the proper length. ++ The contents thus created are irrelevant. ++ The real contents are initialized in init_comparisons. */ ++ ++#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) 0, ++ ++static char comparison_code[] = { ++#include "tree.def" ++}; ++#undef DEFTREECODE ++ ++/* This is run once per compilation. */ ++ ++void ++init_comparisons () ++{ ++ comparison_code[(int) EQ_EXPR] = 1; ++ comparison_code[(int) NE_EXPR] = 1; ++ comparison_code[(int) LT_EXPR] = 1; ++ comparison_code[(int) GT_EXPR] = 1; ++ comparison_code[(int) LE_EXPR] = 1; ++ comparison_code[(int) GE_EXPR] = 1; ++} ++ ++/* This is run at the start of compiling a function. */ ++ ++void ++init_expr () ++{ ++ init_queue (); ++ may_call_alloca = 0; ++ saveregs_value = 0; ++} ++ ++/* Manage the queue of increment instructions to be output ++ for POSTINCREMENT_EXPR expressions, etc. */ ++ ++static rtx pending_chain; ++ ++/* Queue up to increment (or change) VAR later. BODY says how: ++ BODY should be the same thing you would pass to emit_insn ++ to increment right away. It will go to emit_insn later on. ++ ++ The value is a QUEUED expression to be used in place of VAR ++ where you want to guarantee the pre-incrementation value of VAR. */ ++ ++static rtx ++enqueue_insn (var, body) ++ rtx var, body; ++{ ++ pending_chain = gen_rtx (QUEUED, GET_MODE (var), ++ var, 0, 0, body, pending_chain); ++ return pending_chain; ++} ++ ++/* Use protect_from_queue to convert a QUEUED expression ++ into something that you can put immediately into an instruction. ++ If the queued incrementation has not happened yet, ++ protect_from_queue returns the variable itself. ++ If the incrementation has happened, protect_from_queue returns a temp ++ that contains a copy of the old value of the variable. ++ ++ Any time an rtx which might possibly be a QUEUED is to be put ++ into an instruction, it must be passed through protect_from_queue first. ++ QUEUED expressions are not meaningful in instructions. ++ ++ Do not pass a value through protect_from_queue and then hold ++ on to it for a while before putting it in an instruction! ++ If the queue is flushed in between, incorrect code will result. */ ++ ++rtx ++protect_from_queue (x, modify) ++ register rtx x; ++ int modify; ++{ ++ register RTX_CODE code = GET_CODE (x); ++ if (code != QUEUED) ++ { ++ /* A special hack for read access to (MEM (QUEUED ...)) ++ to facilitate use of autoincrement. ++ Make a copy of the contents of the memory location ++ rather than a copy of the address. */ ++ if (code == MEM && GET_CODE (XEXP (x, 0)) == QUEUED && !modify) ++ { ++ register rtx y = XEXP (x, 0); ++ XEXP (x, 0) = QUEUED_VAR (y); ++ if (QUEUED_INSN (y)) ++ { ++ register rtx temp = gen_reg_rtx (GET_MODE (x)); ++ emit_insn_before (gen_move_insn (temp, x), ++ QUEUED_INSN (y)); ++ return temp; ++ } ++ return x; ++ } ++ /* Otherwise, recursively protect the subexpressions of all ++ the kinds of rtx's that can contain a QUEUED. */ ++ if (code == MEM) ++ XEXP (x, 0) = protect_from_queue (XEXP (x, 0), 0); ++ else if (code == PLUS || code == MULT) ++ { ++ XEXP (x, 0) = protect_from_queue (XEXP (x, 0), 0); ++ XEXP (x, 1) = protect_from_queue (XEXP (x, 1), 0); ++ } ++ return x; ++ } ++ /* If the increment has not happened, use the variable itself. */ ++ if (QUEUED_INSN (x) == 0) ++ return QUEUED_VAR (x); ++ /* If the increment has happened and a pre-increment copy exists, ++ use that copy. */ ++ if (QUEUED_COPY (x) != 0) ++ return QUEUED_COPY (x); ++ /* The increment has happened but we haven't set up a pre-increment copy. ++ Set one up now, and use it. */ ++ QUEUED_COPY (x) = gen_reg_rtx (GET_MODE (QUEUED_VAR (x))); ++ emit_insn_before (gen_move_insn (QUEUED_COPY (x), QUEUED_VAR (x)), ++ QUEUED_INSN (x)); ++ return QUEUED_COPY (x); ++} ++ ++/* Return nonzero if X contains a QUEUED expression: ++ if it contains anything that will be altered by a queued increment. ++ We handle only combinations of MEM, PLUS, MINUS and MULT operators ++ since memory addresses generally contain only those. */ ++ ++static int ++queued_subexp_p (x) ++ rtx x; ++{ ++ register enum rtx_code code = GET_CODE (x); ++ switch (code) ++ { ++ case QUEUED: ++ return 1; ++ case MEM: ++ return queued_subexp_p (XEXP (x, 0)); ++ case MULT: ++ case PLUS: ++ case MINUS: ++ return queued_subexp_p (XEXP (x, 0)) ++ || queued_subexp_p (XEXP (x, 1)); ++ } ++ return 0; ++} ++ ++/* Perform all the pending incrementations. */ ++ ++void ++emit_queue () ++{ ++ register rtx p; ++ while (p = pending_chain) ++ { ++ QUEUED_INSN (p) = emit_insn (QUEUED_BODY (p)); ++ pending_chain = QUEUED_NEXT (p); ++ } ++} ++ ++static void ++init_queue () ++{ ++ if (pending_chain) ++ abort (); ++} ++ ++/* Copy data from FROM to TO, where the machine modes are not the same. ++ Both modes may be integer, or both may be floating. ++ UNSIGNEDP should be nonzero if FROM is an unsigned type. ++ This causes zero-extension instead of sign-extension. */ ++ ++void ++convert_move (to, from, unsignedp) ++ register rtx to, from; ++ int unsignedp; ++{ ++ enum machine_mode to_mode = GET_MODE (to); ++ enum machine_mode from_mode = GET_MODE (from); ++ int to_real = GET_MODE_CLASS (to_mode) == MODE_FLOAT; ++ int from_real = GET_MODE_CLASS (from_mode) == MODE_FLOAT; ++ int extending = (int) to_mode > (int) from_mode; ++ ++ to = protect_from_queue (to, 1); ++ from = protect_from_queue (from, 0); ++ ++ if (to_real != from_real) ++ abort (); ++ ++ if (to_mode == from_mode ++ || (from_mode == VOIDmode && CONSTANT_P (from))) ++ { ++ emit_move_insn (to, from); ++ return; ++ } ++ ++ if (to_real) ++ { ++#ifdef HAVE_extendsfdf2 ++ if (HAVE_extendsfdf2 && extending) ++ { ++ emit_unop_insn (CODE_FOR_extendsfdf2, to, from, UNKNOWN); ++ return; ++ } ++#endif ++#ifdef HAVE_truncdfsf2 ++ if (HAVE_truncdfsf2 && ! extending) ++ { ++ emit_unop_insn (CODE_FOR_truncdfsf2, to, from, UNKNOWN); ++ return; ++ } ++#endif ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, (extending ++ ? "__extendsfdf2" ++ : "__truncdfsf2")), 0, ++ GET_MODE (to), 1, ++ from, (extending ? SFmode : DFmode)); ++ emit_move_insn (to, hard_libcall_value (GET_MODE (to))); ++ return; ++ } ++ ++ /* Now both modes are integers. */ ++ ++ if (to_mode == DImode) ++ { ++ if (unsignedp) ++ { ++#ifdef HAVE_zero_extendsidi2 ++ if (HAVE_zero_extendsidi2 && from_mode == SImode) ++ emit_unop_insn (CODE_FOR_zero_extendsidi2, to, from, ZERO_EXTEND); ++ else ++#endif ++#ifdef HAVE_zero_extendhidi2 ++ if (HAVE_zero_extendhidi2 && from_mode == HImode) ++ emit_unop_insn (CODE_FOR_zero_extendhidi2, to, from, ZERO_EXTEND); ++ else ++#endif ++#ifdef HAVE_zero_extendqidi2 ++ if (HAVE_zero_extendqidi2 && from_mode == QImode) ++ emit_unop_insn (CODE_FOR_zero_extendqidi2, to, from, ZERO_EXTEND); ++ else ++#endif ++#ifdef HAVE_zero_extendsidi2 ++ if (HAVE_zero_extendsidi2) ++ { ++ convert_move (gen_lowpart (SImode, to), from, unsignedp); ++ emit_unop_insn (CODE_FOR_zero_extendsidi2, to, ++ gen_lowpart (SImode, to), ZERO_EXTEND); ++ } ++ else ++#endif ++ { ++ emit_insn (gen_rtx (CLOBBER, VOIDmode, to)); ++ convert_move (gen_lowpart (SImode, to), from, unsignedp); ++ emit_clr_insn (gen_highpart (SImode, to)); ++ } ++ } ++#ifdef HAVE_extendsidi2 ++ else if (HAVE_extendsidi2 && from_mode == SImode) ++ emit_unop_insn (CODE_FOR_extendsidi2, to, from, SIGN_EXTEND); ++#endif ++#ifdef HAVE_extendhidi2 ++ else if (HAVE_extendhidi2 && from_mode == HImode) ++ emit_unop_insn (CODE_FOR_extendhidi2, to, from, SIGN_EXTEND); ++#endif ++#ifdef HAVE_extendqidi2 ++ else if (HAVE_extendqidi2 && from_mode == QImode) ++ emit_unop_insn (CODE_FOR_extendqidi2, to, from, SIGN_EXTEND); ++#endif ++#ifdef HAVE_extendsidi2 ++ else if (HAVE_extendsidi2) ++ { ++ convert_move (gen_lowpart (SImode, to), from, unsignedp); ++ emit_unop_insn (CODE_FOR_extendsidi2, to, ++ gen_lowpart (SImode, to), SIGN_EXTEND); ++ } ++#endif ++#ifdef HAVE_slt ++ else if (HAVE_slt && insn_operand_mode[(int) CODE_FOR_slt][0] == SImode) ++ { ++ rtx temp, target; ++ emit_insn (gen_rtx (CLOBBER, VOIDmode, to)); ++ convert_move (gen_lowpart (SImode, to), from, unsignedp); ++ emit_cmp_insn (gen_lowpart (SImode, to), const0_rtx, 0, 0, 0); ++ target = gen_highpart (SImode, to); ++ if (!(*insn_operand_predicate[(int) CODE_FOR_slt][0]) (target, SImode)) ++ temp = gen_reg_rtx (SImode); ++ else ++ temp = target; ++ emit_insn (gen_slt (temp)); ++ if (temp != target) ++ emit_move_insn (target, temp); ++ } ++#endif ++ else ++ { ++ register rtx label = gen_label_rtx (); ++ rtx temp, target; ++ ++ emit_insn (gen_rtx (CLOBBER, VOIDmode, to)); ++ emit_clr_insn (gen_highpart (SImode, to)); ++ convert_move (gen_lowpart (SImode, to), from, unsignedp); ++ emit_cmp_insn (gen_lowpart (SImode, to), ++ gen_rtx (CONST_INT, VOIDmode, 0), ++ 0, 0, 0); ++ NO_DEFER_POP; ++ emit_jump_insn (gen_bge (label)); ++ target = gen_highpart (SImode, to); ++ temp = expand_unop (SImode, one_cmpl_optab, ++ target, gen_highpart (SImode, to), ++ 1); ++ if (temp != target) ++ emit_move_insn (target, temp); ++ emit_label (label); ++ OK_DEFER_POP; ++ } ++ return; ++ } ++ ++ if (from_mode == DImode) ++ { ++ convert_move (to, gen_lowpart (SImode, from), 0); ++ return; ++ } ++ ++ /* Now follow all the conversions between integers ++ no more than a word long. */ ++ ++ /* For truncation, usually we can just refer to FROM in a narrower mode. */ ++ if (GET_MODE_BITSIZE (to_mode) < GET_MODE_BITSIZE (from_mode) ++ && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (to_mode), ++ GET_MODE_BITSIZE (from_mode)) ++ && ((GET_CODE (from) == MEM ++ && ! MEM_VOLATILE_P (from) ++ && ! mode_dependent_address_p (XEXP (from, 0))) ++ || GET_CODE (from) == REG ++ || GET_CODE (from) == SUBREG)) ++ { ++ emit_move_insn (to, gen_lowpart (to_mode, from)); ++ return; ++ } ++ ++ if (to_mode == SImode && from_mode == HImode) ++ { ++ if (unsignedp) ++ { ++#ifdef HAVE_zero_extendhisi2 ++ if (HAVE_zero_extendhisi2) ++ emit_unop_insn (CODE_FOR_zero_extendhisi2, to, from, ZERO_EXTEND); ++ else ++#endif ++ abort (); ++ } ++ else ++ { ++#ifdef HAVE_extendhisi2 ++ if (HAVE_extendhisi2) ++ emit_unop_insn (CODE_FOR_extendhisi2, to, from, SIGN_EXTEND); ++ else ++#endif ++ abort (); ++ } ++ return; ++ } ++ ++ if (to_mode == SImode && from_mode == QImode) ++ { ++ if (unsignedp) ++ { ++#ifdef HAVE_zero_extendqisi2 ++ if (HAVE_zero_extendqisi2) ++ { ++ emit_unop_insn (CODE_FOR_zero_extendqisi2, to, from, ZERO_EXTEND); ++ return; ++ } ++#endif ++#if defined (HAVE_zero_extendqihi2) && defined (HAVE_extendhisi2) ++ if (HAVE_zero_extendqihi2 && HAVE_extendhisi2) ++ { ++ register rtx temp = gen_reg_rtx (HImode); ++ emit_unop_insn (CODE_FOR_zero_extendqihi2, temp, from, ZERO_EXTEND); ++ emit_unop_insn (CODE_FOR_extendhisi2, to, temp, SIGN_EXTEND); ++ return; ++ } ++#endif ++ } ++ else ++ { ++#ifdef HAVE_extendqisi2 ++ if (HAVE_extendqisi2) ++ { ++ emit_unop_insn (CODE_FOR_extendqisi2, to, from, SIGN_EXTEND); ++ return; ++ } ++#endif ++#if defined (HAVE_extendqihi2) && defined (HAVE_extendhisi2) ++ if (HAVE_extendqihi2 && HAVE_extendhisi2) ++ { ++ register rtx temp = gen_reg_rtx (HImode); ++ emit_unop_insn (CODE_FOR_extendqihi2, temp, from, SIGN_EXTEND); ++ emit_unop_insn (CODE_FOR_extendhisi2, to, temp, SIGN_EXTEND); ++ return; ++ } ++#endif ++ } ++ abort (); ++ } ++ ++ if (to_mode == HImode && from_mode == QImode) ++ { ++ if (unsignedp) ++ { ++#ifdef HAVE_zero_extendqihi2 ++ if (HAVE_zero_extendqihi2) ++ { ++ emit_unop_insn (CODE_FOR_zero_extendqihi2, to, from, ZERO_EXTEND); ++ return; ++ } ++#endif ++ } ++ else ++ { ++#ifdef HAVE_extendqihi2 ++ if (HAVE_extendqihi2) ++ { ++ emit_unop_insn (CODE_FOR_extendqihi2, to, from, SIGN_EXTEND); ++ return; ++ } ++#endif ++ } ++ abort (); ++ } ++ ++#if 0 /* This seems to be redundant with code 100 lines up. */ ++ ++ /* Now we are truncating an integer to a smaller one. ++ If the result is a temporary, we might as well just copy it, ++ since only the low-order part of the result needs to be valid ++ and it is valid with no change. */ ++ ++ if (GET_CODE (to) == REG) ++ { ++ if (GET_CODE (from) == REG) ++ { ++ emit_move_insn (to, gen_lowpart (GET_MODE (to), from)); ++ return; ++ } ++ else if (GET_CODE (from) == SUBREG) ++ { ++ from = copy_rtx (from); ++ /* This is safe since FROM is not more than one word. */ ++ PUT_MODE (from, GET_MODE (to)); ++ emit_move_insn (to, from); ++ return; ++ } ++#ifndef BYTES_BIG_ENDIAN ++ else if (GET_CODE (from) == MEM) ++ { ++ register rtx addr = XEXP (from, 0); ++ if (memory_address_p (GET_MODE (to), addr)) ++ { ++ emit_move_insn (to, gen_rtx (MEM, GET_MODE (to), addr)); ++ return; ++ } ++ } ++#endif /* not BYTES_BIG_ENDIAN */ ++ } ++#endif /* 0 */ ++ ++ if (from_mode == SImode && to_mode == HImode) ++ { ++#ifdef HAVE_truncsihi2 ++ if (HAVE_truncsihi2) ++ { ++ emit_unop_insn (CODE_FOR_truncsihi2, to, from, UNKNOWN); ++ return; ++ } ++#endif ++ abort (); ++ } ++ ++ if (from_mode == SImode && to_mode == QImode) ++ { ++#ifdef HAVE_truncsiqi2 ++ if (HAVE_truncsiqi2) ++ { ++ emit_unop_insn (CODE_FOR_truncsiqi2, to, from, UNKNOWN); ++ return; ++ } ++#endif ++ abort (); ++ } ++ ++ if (from_mode == HImode && to_mode == QImode) ++ { ++#ifdef HAVE_trunchiqi2 ++ if (HAVE_trunchiqi2) ++ { ++ emit_unop_insn (CODE_FOR_trunchiqi2, to, from, UNKNOWN); ++ return; ++ } ++#endif ++ abort (); ++ } ++ ++ /* Mode combination is not recognized. */ ++ abort (); ++} ++ ++/* Return an rtx for a value that would result ++ from converting X to mode MODE. ++ Both X and MODE may be floating, or both integer. ++ UNSIGNEDP is nonzero if X is an unsigned value. ++ This can be done by referring to a part of X in place ++ or by copying to a new temporary with conversion. */ ++ ++rtx ++convert_to_mode (mode, x, unsignedp) ++ enum machine_mode mode; ++ rtx x; ++ int unsignedp; ++{ ++ register rtx temp; ++ if (mode == GET_MODE (x)) ++ return x; ++ if (integer_mode_p (mode) ++ && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (x)) ++ && (GET_CODE (x) == REG || GET_CODE (x) == CONST_DOUBLE ++ || (GET_CODE (x) == MEM && ! MEM_VOLATILE_P (x)))) ++ return gen_lowpart (mode, x); ++ temp = gen_reg_rtx (mode); ++ convert_move (temp, x, unsignedp); ++ return temp; ++} ++ ++int ++integer_mode_p (mode) ++ enum machine_mode mode; ++{ ++ return (int) mode > (int) VOIDmode && (int) mode <= (int) TImode; ++} ++ ++/* Generate several move instructions to copy LEN bytes ++ from block FROM to block TO. (These are MEM rtx's with BLKmode). ++ The caller must pass FROM and TO ++ through protect_from_queue before calling. ++ ALIGN (in bytes) is maximum alignment we can assume. */ ++ ++struct move_by_pieces ++{ ++ rtx to; ++ rtx to_addr; ++ int autinc_to; ++ int explicit_inc_to; ++ rtx from; ++ rtx from_addr; ++ int autinc_from; ++ int explicit_inc_from; ++ int len; ++ int offset; ++ int reverse; ++}; ++ ++static void move_by_pieces_1 (); ++static int move_by_pieces_ninsns (); ++ ++static void ++move_by_pieces (to, from, len, align) ++ rtx to, from; ++ int len, align; ++{ ++ struct move_by_pieces data; ++ rtx to_addr = XEXP (to, 0), from_addr = XEXP (from, 0); ++ ++ data.offset = 0; ++ data.to_addr = to_addr; ++ data.from_addr = from_addr; ++ data.to = to; ++ data.from = from; ++ data.autinc_to ++ = (GET_CODE (to_addr) == PRE_INC || GET_CODE (to_addr) == PRE_DEC ++ || GET_CODE (to_addr) == POST_INC || GET_CODE (to_addr) == POST_DEC); ++ data.autinc_from ++ = (GET_CODE (from_addr) == PRE_INC || GET_CODE (from_addr) == PRE_DEC ++ || GET_CODE (from_addr) == POST_INC ++ || GET_CODE (from_addr) == POST_DEC); ++ ++ data.explicit_inc_from = 0; ++ data.explicit_inc_to = 0; ++ data.reverse ++ = (GET_CODE (to_addr) == PRE_DEC || GET_CODE (to_addr) == POST_DEC); ++ if (data.reverse) data.offset = len; ++ data.len = len; ++ ++ /* If copying requires more than two move insns, ++ copy addresses to registers (to make displacements shorter) ++ and use post-increment if available. */ ++ if (!(data.autinc_from && data.autinc_to) ++ && move_by_pieces_ninsns (len, align) > 2) ++ { ++#ifdef HAVE_PRE_DECREMENT ++ if (data.reverse && ! data.autinc_from) ++ { ++ data.from_addr = copy_addr_to_reg (plus_constant (from_addr, len)); ++ data.autinc_from = 1; ++ data.explicit_inc_from = -1; ++ } ++#endif ++#ifdef HAVE_POST_INCREMENT ++ if (! data.autinc_from) ++ { ++ data.from_addr = copy_addr_to_reg (from_addr); ++ data.autinc_from = 1; ++ data.explicit_inc_from = 1; ++ } ++#endif ++ if (!data.autinc_from && CONSTANT_P (from_addr)) ++ data.from_addr = copy_addr_to_reg (from_addr); ++#ifdef HAVE_PRE_DECREMENT ++ if (data.reverse && ! data.autinc_to) ++ { ++ data.to_addr = copy_addr_to_reg (plus_constant (to_addr, len)); ++ data.autinc_to = 1; ++ data.explicit_inc_to = -1; ++ } ++#endif ++#ifdef HAVE_POST_INCREMENT ++ if (! data.reverse && ! data.autinc_to) ++ { ++ data.to_addr = copy_addr_to_reg (to_addr); ++ data.autinc_to = 1; ++ data.explicit_inc_to = 1; ++ } ++#endif ++ if (!data.autinc_to && CONSTANT_P (to_addr)) ++ data.to_addr = copy_addr_to_reg (to_addr); ++ } ++ ++#ifdef STRICT_ALIGNMENT ++ if (align > MOVE_MAX || align >= BIGGEST_ALIGNMENT / BITS_PER_UNIT) ++ align = MOVE_MAX; ++#else ++ align = MOVE_MAX; ++#endif ++ ++#ifdef HAVE_movti ++ if (HAVE_movti && align >= GET_MODE_SIZE (TImode)) ++ move_by_pieces_1 (gen_movti, TImode, &data); ++#endif ++#ifdef HAVE_movdi ++ if (HAVE_movdi && align >= GET_MODE_SIZE (DImode)) ++ move_by_pieces_1 (gen_movdi, DImode, &data); ++#endif ++#ifdef HAVE_movsi ++ if (align >= GET_MODE_SIZE (SImode)) ++ move_by_pieces_1 (gen_movsi, SImode, &data); ++#endif ++#ifdef HAVE_movhi ++ if (HAVE_movhi && align >= GET_MODE_SIZE (HImode)) ++ move_by_pieces_1 (gen_movhi, HImode, &data); ++#endif ++#ifdef HAVE_movqi ++ move_by_pieces_1 (gen_movqi, QImode, &data); ++#else ++ movqi instruction required in machine description ++#endif ++} ++ ++/* Return number of insns required to move L bytes by pieces. ++ ALIGN (in bytes) is maximum alignment we can assume. */ ++ ++static int ++move_by_pieces_ninsns (l, align) ++ unsigned int l; ++ int align; ++{ ++ register int n_insns = 0; ++ ++#ifdef STRICT_ALIGNMENT ++ if (align > MOVE_MAX || align >= BIGGEST_ALIGNMENT / BITS_PER_UNIT) ++ align = MOVE_MAX; ++#else ++ align = MOVE_MAX; ++#endif ++ ++#ifdef HAVE_movti ++ if (HAVE_movti && align >= GET_MODE_SIZE (TImode)) ++ n_insns += l / GET_MODE_SIZE (TImode), l %= GET_MODE_SIZE (TImode); ++#endif ++#ifdef HAVE_movdi ++ if (HAVE_movdi && align >= GET_MODE_SIZE (DImode)) ++ n_insns += l / GET_MODE_SIZE (DImode), l %= GET_MODE_SIZE (DImode); ++#endif ++#ifdef HAVE_movsi ++ if (HAVE_movsi && align >= GET_MODE_SIZE (SImode)) ++ n_insns += l / GET_MODE_SIZE (SImode), l %= GET_MODE_SIZE (SImode); ++#endif ++#ifdef HAVE_movhi ++ if (HAVE_movhi && align >= GET_MODE_SIZE (HImode)) ++ n_insns += l / GET_MODE_SIZE (HImode), l %= GET_MODE_SIZE (HImode); ++#endif ++ n_insns += l; ++ ++ return n_insns; ++} ++ ++/* Subroutine of move_by_pieces. Move as many bytes as appropriate ++ with move instructions for mode MODE. GENFUN is the gen_... function ++ to make a move insn for that mode. DATA has all the other info. */ ++ ++static void ++move_by_pieces_1 (genfun, mode, data) ++ rtx (*genfun) (); ++ enum machine_mode mode; ++ struct move_by_pieces *data; ++{ ++ register int size = GET_MODE_SIZE (mode); ++ register rtx to1, from1; ++ ++ while (data->len >= size) ++ { ++ if (data->reverse) data->offset -= size; ++ ++ to1 = (data->autinc_to ++ ? gen_rtx (MEM, mode, data->to_addr) ++ : change_address (data->to, mode, ++ plus_constant (data->to_addr, data->offset))); ++ from1 = ++ (data->autinc_from ++ ? gen_rtx (MEM, mode, data->from_addr) ++ : change_address (data->from, mode, ++ plus_constant (data->from_addr, data->offset))); ++ ++#ifdef HAVE_PRE_DECREMENT ++ if (data->explicit_inc_to < 0) ++ emit_insn (gen_sub2_insn (data->to_addr, ++ gen_rtx (CONST_INT, VOIDmode, size))); ++ if (data->explicit_inc_from < 0) ++ emit_insn (gen_sub2_insn (data->from_addr, ++ gen_rtx (CONST_INT, VOIDmode, size))); ++#endif ++ ++ emit_insn ((*genfun) (to1, from1)); ++#ifdef HAVE_POST_INCREMENT ++ if (data->explicit_inc_to > 0) ++ emit_insn (gen_add2_insn (data->to_addr, ++ gen_rtx (CONST_INT, VOIDmode, size))); ++ if (data->explicit_inc_from > 0) ++ emit_insn (gen_add2_insn (data->from_addr, ++ gen_rtx (CONST_INT, VOIDmode, size))); ++#endif ++ ++ if (! data->reverse) data->offset += size; ++ ++ data->len -= size; ++ } ++} ++ ++/* Emit code to move a block Y to a block X. ++ This may be done with string-move instructions, ++ with multiple scalar move instructions, or with a library call. ++ ++ Both X and Y must be MEM rtx's (perhaps inside VOLATILE) ++ with mode BLKmode. ++ SIZE is an rtx that says how long they are. ++ ALIGN is the maximum alignment we can assume they have, ++ measured in bytes. */ ++ ++static void ++emit_block_move (x, y, size, align) ++ rtx x, y; ++ rtx size; ++ int align; ++{ ++ if (GET_MODE (x) != BLKmode) ++ abort (); ++ ++ if (GET_MODE (y) != BLKmode) ++ abort (); ++ ++ x = protect_from_queue (x, 1); ++ y = protect_from_queue (y, 0); ++ ++ if (GET_CODE (x) != MEM) ++ abort (); ++ if (GET_CODE (y) != MEM) ++ abort (); ++ if (size == 0) ++ abort (); ++ ++ if (GET_CODE (size) == CONST_INT ++ && (move_by_pieces_ninsns ((unsigned) INTVAL (size), align) ++ < MOVE_RATIO)) ++ move_by_pieces (x, y, INTVAL (size), align); ++ else ++ { ++ /* Try the most limited insn first, because there's no point ++ including more than one in the machine description unless ++ the more limited one has some advantage. */ ++#ifdef HAVE_movstrqi ++ if (HAVE_movstrqi ++ && GET_CODE (size) == CONST_INT ++ && ((unsigned) INTVAL (size) ++ < (1 << (GET_MODE_BITSIZE (QImode) - 1)))) ++ { ++ emit_insn (gen_movstrqi (x, y, size, ++ gen_rtx (CONST_INT, VOIDmode, align))); ++ return; ++ } ++#endif ++#ifdef HAVE_movstrhi ++ if (HAVE_movstrhi ++ && GET_CODE (size) == CONST_INT ++ && ((unsigned) INTVAL (size) ++ < (1 << (GET_MODE_BITSIZE (HImode) - 1)))) ++ { ++ emit_insn (gen_movstrhi (x, y, size, ++ gen_rtx (CONST_INT, VOIDmode, align))); ++ return; ++ } ++#endif ++#ifdef HAVE_movstrsi ++ if (HAVE_movstrsi) ++ { ++ emit_insn (gen_movstrsi (x, y, size, ++ gen_rtx (CONST_INT, VOIDmode, align))); ++ return; ++ } ++#endif ++ ++#ifdef TARGET_MEM_FUNCTIONS ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "memcpy"), 0, ++ VOIDmode, 3, XEXP (x, 0), Pmode, ++ XEXP (y, 0), Pmode, ++ size, Pmode); ++#else ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "bcopy"), 0, ++ VOIDmode, 3, XEXP (y, 0), Pmode, ++ XEXP (x, 0), Pmode, ++ size, Pmode); ++#endif ++ } ++} ++ ++/* Copy all or part of a value X into registers starting at REGNO. ++ The number of registers to be filled is NREGS. */ ++ ++static void ++move_block_to_reg (regno, x, nregs, align) ++ int regno; ++ rtx x; ++ int nregs; ++ int align; ++{ ++ int i; ++ ++ if (GET_CODE (x) == MEM && GET_CODE (XEXP (x, 0)) == QUEUED) ++ XEXP (x, 0) = protect_from_queue (XEXP (x, 0), 0); ++ ++ if (GET_CODE (x) == CONST_DOUBLE && x != dconst0_rtx) ++ x = force_const_double_mem (x); ++ for (i = 0; i < nregs; i++) ++ { ++ if (GET_CODE (x) == REG) ++ emit_move_insn (gen_rtx (REG, SImode, regno + i), ++ gen_rtx (SUBREG, SImode, x, i)); ++ else if (x == dconst0_rtx || x == const0_rtx) ++ emit_move_insn (gen_rtx (REG, SImode, regno + i), ++ const0_rtx); ++ else ++ { ++ int unaligned = (align < BITS_PER_WORD); ++ rtx to = gen_rtx (REG, SImode, regno + i); ++ rtx from = gen_rtx (MEM, SImode, ++ memory_address (SImode, ++ plus_constant (XEXP (x, 0), ++ i * GET_MODE_SIZE (SImode)))); ++ ++#if (defined (HAVE_movsi_unaligned) || defined (STRICT_ALIGNMENT)) && defined (STACK_BOUNDARY) ++ /* If this is a reference to an auto variable, and the structure ++ is aligned appropriately, use normal aligned load. */ ++ ++ if (STACK_BOUNDARY >= BITS_PER_WORD && unaligned) ++ ++ { ++ int offset = 0; ++ rtx x_wo_const = eliminate_constant_term (XEXP (x, 0), &offset); ++ ++ if ((offset & ((BITS_PER_WORD / BITS_PER_UNIT) - 1)) == 0 ++ && (x_wo_const == frame_pointer_rtx ++ || x_wo_const == stack_pointer_rtx ++ || x_wo_const == arg_pointer_rtx)) ++ unaligned = FALSE; ++ } ++#endif ++ ++#ifdef HAVE_movsi_unaligned ++ if (unaligned) ++ { ++ emit_insn (gen_movsi_unaligned (to, from)); ++ return; ++ } ++#else /* not HAVE_movsi_unaligned */ ++#if 0 /* This gives spurious errors. For example, a stack slot ++ whose offset is out of range turns into (mem (plus (reg) (reg))) ++ and gets this error. */ ++#ifdef STRICT_ALIGNMENT ++ if (unaligned) ++ error ("Attempt to move unaligned structure to register"); ++#endif ++#endif /* 0 */ ++#endif /* not HAVE_movsi_unaligned */ ++ ++ emit_move_insn (to, from); ++ } ++ } ++} ++ ++/* Copy all or part of a BLKmode value X out of registers starting at REGNO. ++ The number of registers to be filled is NREGS. */ ++ ++void ++move_block_from_reg (regno, x, nregs, align) ++ int regno; ++ rtx x; ++ int nregs; ++ int align; ++{ ++ int i; ++ ++ if (GET_CODE (XEXP (x, 0)) == QUEUED) ++ XEXP (x, 0) = protect_from_queue (XEXP (x, 0), 1); ++ ++ for (i = 0; i < nregs; i++) ++ { ++ if (GET_CODE (x) == REG) ++ emit_move_insn (gen_rtx (SUBREG, SImode, x, i), ++ gen_rtx (REG, SImode, regno + i)); ++ else ++ { ++ int unaligned = (align < BITS_PER_WORD); ++ rtx from = gen_rtx (REG, SImode, regno + i); ++ rtx to = gen_rtx (MEM, SImode, ++ memory_address (SImode, ++ plus_constant (XEXP (x, 0), ++ i * GET_MODE_SIZE (SImode)))); ++ ++#if (defined(HAVE_movsi_unaligned) || defined(STRICT_ALIGNMENT)) && defined (STACK_BOUNDARY) ++ /* If this is a reference to an auto variable, and the structure ++ is aligned appropriately, use normal aligned load. */ ++ ++ if (STACK_BOUNDARY >= BITS_PER_WORD && unaligned) ++ ++ { ++ int offset = 0; ++ rtx x_wo_const = eliminate_constant_term (XEXP (x, 0), &offset); ++ ++ if ((offset & ((BITS_PER_WORD / BITS_PER_UNIT) - 1)) == 0 ++ && (x_wo_const == frame_pointer_rtx ++ || x_wo_const == stack_pointer_rtx ++ || x_wo_const == arg_pointer_rtx)) ++ unaligned = FALSE; ++ } ++#endif ++ ++#ifdef HAVE_movsi_unaligned ++ if (unaligned) ++ { ++ extern rtx gen_movsi_unaligned (); ++ emit_insn (gen_movsi_unaligned (to, from)); ++ return; ++ } ++#else /* not HAVE_movsi_unaligned */ ++#if 0 /* This is to stay in sync with move_block_to_reg. */ ++#ifdef STRICT_ALIGNMENT ++ if (unaligned) ++ error ("Attempt to move unaligned structure to register"); ++#endif ++#endif /* 0 */ ++#endif /* not HAVE_movsi_unaligned */ ++ ++ emit_move_insn (to, from); ++ } ++ } ++} ++ ++/* Mark NREGS consecutive regs, starting at REGNO, as being live now. */ ++ ++static void ++use_regs (regno, nregs) ++ int regno; ++ int nregs; ++{ ++ int i; ++ for (i = 0; i < nregs; i++) ++ emit_insn (gen_rtx (USE, VOIDmode, gen_rtx (REG, SImode, regno + i))); ++} ++ ++/* Write zeros through the storage of OBJECT. ++ If OBJECT has BLKmode, SIZE is its length in bytes. */ ++ ++void ++clear_storage (object, size) ++ rtx object; ++ int size; ++{ ++ if (GET_MODE (object) == BLKmode) ++ { ++#ifdef TARGET_MEM_FUNCTIONS ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "memset"), 0, ++ VOIDmode, 3, ++ XEXP (object, 0), Pmode, const0_rtx, Pmode, ++ gen_rtx (CONST_INT, VOIDmode, size), Pmode); ++#else ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "bzero"), 0, ++ VOIDmode, 2, ++ XEXP (object, 0), Pmode, ++ gen_rtx (CONST_INT, VOIDmode, size), Pmode); ++#endif ++ } ++ else ++ emit_move_insn (object, const0_rtx); ++} ++ ++/* Generate code to copy Y into X. ++ Both Y and X must have the same mode, except that ++ Y can be a constant with VOIDmode. ++ This mode cannot be BLKmode; use emit_block_move for that. ++ ++ Return the last instruction emitted. */ ++ ++rtx ++emit_move_insn (x, y) ++ rtx x, y; ++{ ++ enum machine_mode mode = GET_MODE (x); ++ x = protect_from_queue (x, 1); ++ y = protect_from_queue (y, 0); ++ ++ if (mode == BLKmode) ++ abort (); ++ if (mov_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing) ++ { ++ int icode = (int) mov_optab->handlers[(int) mode].insn_code; ++ if (! (*insn_operand_predicate[icode][1]) (y, mode) ++ && (CONSTANT_P (y) || GET_CODE (y) == CONST_DOUBLE)) ++ { ++ y = force_const_mem (mode, y); ++ if (! memory_address_p (mode, XEXP (y, 0))) ++ y = gen_rtx (MEM, mode, memory_address (mode, XEXP (y, 0))); ++ } ++ return emit_insn (GEN_FCN (icode) (x, y)); ++ } ++#if 0 ++ /* It turns out you get much better optimization (in cse and flow) ++ if you define movdi and movdf instruction patterns ++ even if they must turn into multiple assembler instructions. */ ++ else if (GET_MODE_SIZE (mode) >= GET_MODE_SIZE (SImode)) ++ { ++ register int count = GET_MODE_SIZE (mode) / GET_MODE_SIZE (SImode); ++ register int i; ++ if (GET_CODE (y) == CONST_DOUBLE && y != dconst0_rtx) ++ y = force_const_double_mem (y); ++ for (i = 0; i < count; i++) ++ { ++ rtx x1, y1; ++ if (GET_CODE (x) == REG) ++ x1 = gen_rtx (SUBREG, SImode, x, i); ++ else ++ x1 = gen_rtx (MEM, SImode, ++ memory_address (SImode, ++ plus_constant (XEXP (x, 0), ++ i * GET_MODE_SIZE (SImode)))); ++ if (GET_CODE (y) == REG) ++ y1 = gen_rtx (SUBREG, SImode, y, i); ++ else if (y == dconst0_rtx) ++ y1 = const0_rtx; ++ else ++ y1 = gen_rtx (MEM, SImode, ++ memory_address (SImode, ++ plus_constant (XEXP (y, 0), ++ i * GET_MODE_SIZE (SImode)))); ++ emit_insn (gen_movsi (protect_from_queue (x1, 1), protect_from_queue (y1, 0))); ++ } ++ } ++#endif ++ else ++ abort (); ++} ++ ++/* Pushing data onto the stack. */ ++ ++/* Push a block of length SIZE (perhaps variable) ++ and return an rtx to address the beginning of the block. ++ Note that it is not possible for the value returned to be a QUEUED. ++ The value may be stack_pointer_rtx. ++ ++ EXTRA is the number of bytes of padding to push in addition to the block. ++ The padding is pushed "after" the specified size. ++ ++ The value we return does take account of STACK_POINTER_OFFSET. */ ++ ++rtx ++push_block (size, extra) ++ rtx size; ++ int extra; ++{ ++ register rtx temp; ++ if (CONSTANT_P (size)) ++ anti_adjust_stack (plus_constant (size, extra)); ++ else if (GET_CODE (size) == REG && extra == 0) ++ anti_adjust_stack (size); ++ else ++ { ++ rtx temp = copy_to_mode_reg (Pmode, size); ++ if (extra != 0) ++ temp = expand_binop (Pmode, add_optab, ++ temp, gen_rtx (CONST_INT, VOIDmode, extra), ++ temp, 0, OPTAB_LIB_WIDEN); ++ anti_adjust_stack (temp); ++ } ++ ++#ifdef STACK_GROWS_DOWNWARD ++ temp = stack_pointer_rtx; ++ if (extra != 0) ++ temp = plus_constant (temp, extra); ++#else ++ temp = gen_rtx (PLUS, Pmode, ++ stack_pointer_rtx, ++ negate_rtx (Pmode, size)); ++ if (GET_CODE (size) != CONST_INT) ++ temp = force_operand (temp, 0); ++ if (extra != 0) ++ temp = plus_constant (temp, -extra); ++#endif ++ ++#ifdef STACK_POINTER_OFFSET ++ temp = plus_constant (temp, STACK_POINTER_OFFSET); ++#endif /* STACK_POINTER_OFFSET */ ++ ++ return memory_address (QImode, temp); ++} ++ ++static rtx ++gen_push_operand () ++{ ++ return gen_rtx ( ++#ifdef STACK_GROWS_DOWNWARD ++ PRE_DEC, ++#else ++ PRE_INC, ++#endif ++ Pmode, ++ stack_pointer_rtx); ++} ++ ++/* Generate code to push X onto the stack, assuming it has mode MODE. ++ MODE is redundant except when X is a CONST_INT (since they don't ++ carry mode info). ++ SIZE is an rtx for the size of data to be copied (in bytes), ++ needed only if X is BLKmode. ++ ++ ALIGN (in bytes) is maximum alignment we can assume. ++ ++ If PARTIAL is nonzero, then copy that many of the first words ++ of X into registers starting with REG, and push the rest of X. ++ The amount of space pushed is decreased by PARTIAL words, ++ rounded *down* to a multiple of PARM_BOUNDARY. ++ REG must be a hard register in this case. ++ ++ EXTRA is the amount in bytes of extra space to leave next to this arg. ++ Within the function, we set EXTRA to zero once the padding is done, ++ to avoid padding twice. ++ ++ On a machine that lacks real push insns, ARGS_ADDR is the address of ++ the bottom of the argument block for this call. We use indexing off there ++ to store the arg. On machines with push insns, ARGS_ADDR is 0. ++ ++ ARGS_SO_FAR is the size of args previously pushed for this call. */ ++ ++static void ++emit_push_insn (x, mode, size, align, partial, reg, extra, args_addr, args_so_far) ++ register rtx x; ++ enum machine_mode mode; ++ rtx size; ++ int align; ++ int partial; ++ rtx reg; ++ int extra; ++ rtx args_addr; ++ rtx args_so_far; ++{ ++ rtx xinner; ++ enum direction stack_direction ++#ifdef STACK_GROWS_DOWNWARD ++ = downward; ++#else ++ = upward; ++#endif ++ ++ /* Decide where to pad the argument: `downward' for below, ++ `upward' for above, or `none' for don't pad it. ++ Default is below for small data on big-endian machines; else above. */ ++ enum direction where_pad = FUNCTION_ARG_PADDING (mode, size); ++ ++ xinner = x = protect_from_queue (x, 0); ++ ++ if (extra) ++ { ++ if (args_addr == 0) ++ { ++ /* Push padding now if padding above and stack grows down, ++ or if padding below and stack grows up. */ ++ if (where_pad != none && where_pad != stack_direction) ++ { ++ anti_adjust_stack (gen_rtx (CONST_INT, VOIDmode, extra)); ++ extra = 0; ++ } ++ } ++ else ++ { ++ /* If space already allocated, just adjust the address we use. */ ++ if (where_pad == downward) ++ { ++ args_so_far = plus_constant (args_so_far, extra); ++ } ++ /* If padding comes after a space already allocated, ++ there is nothing to do. */ ++ extra = 0; ++ } ++ } ++ ++ if (mode == BLKmode) ++ { ++ /* Copy a block into the stack, entirely or partially. */ ++ ++ register rtx temp; ++ int used = partial * UNITS_PER_WORD; ++ int offset = used % (PARM_BOUNDARY / BITS_PER_UNIT); ++ int skip; ++ ++ if (size == 0) ++ abort (); ++ ++ used -= offset; ++ ++ /* USED is now the # of bytes we need not copy to the stack ++ because registers will take care of them. */ ++ ++ if (partial != 0) ++ xinner = change_address (xinner, BLKmode, ++ plus_constant (XEXP (xinner, 0), used)); ++ ++/* If the partial register-part of the arg counts in its stack size, ++ skip the part of stack space corresponding to the registers. ++ Otherwise, start copying to the beginning of the stack space, ++ by setting SKIP to 0. */ ++#ifndef FIRST_PARM_CALLER_OFFSET ++ skip = 0; ++#else ++ skip = used; ++#endif ++ ++#ifdef PUSH_ROUNDING ++ /* Do it with several push insns if that doesn't take lots of insns ++ and if there is no difficulty with push insns that skip bytes ++ on the stack for alignment purposes. */ ++ if (args_addr == 0 ++ && GET_CODE (size) == CONST_INT ++ && args_addr == 0 ++ && skip == 0 ++ && (move_by_pieces_ninsns ((unsigned) INTVAL (size) - used, align) ++ < MOVE_RATIO) ++ && PUSH_ROUNDING (INTVAL (size)) == INTVAL (size)) ++ move_by_pieces (gen_rtx (MEM, BLKmode, gen_push_operand ()), xinner, ++ INTVAL (size) - used, align); ++ else ++#endif /* PUSH_ROUNDING */ ++ { ++ /* Otherwise make space on the stack and copy the data ++ to the address of that space. */ ++ ++ /* Deduct words put into registers from the size we must copy. */ ++ if (partial != 0) ++ { ++ if (GET_CODE (size) == CONST_INT) ++ size = gen_rtx (CONST_INT, VOIDmode, INTVAL (size) - used); ++ else ++ size = expand_binop (GET_MODE (size), sub_optab, size, ++ gen_rtx (CONST_INT, VOIDmode, used), ++ 0, 0, OPTAB_LIB_WIDEN); ++ } ++ ++ /* Get the address of the stack space. */ ++ if (! args_addr) ++ { ++ temp = push_block (size, extra); ++ extra = 0; ++ } ++ else if (GET_CODE (args_so_far) == CONST_INT) ++ temp = memory_address (BLKmode, ++ plus_constant (args_addr, ++ skip + INTVAL (args_so_far))); ++ else ++ temp = memory_address (BLKmode, ++ plus_constant (gen_rtx (PLUS, Pmode, ++ args_addr, args_so_far), ++ skip)); ++ ++ /* TEMP is the address of the block. Copy the data there. */ ++ if (GET_CODE (size) == CONST_INT ++ && (move_by_pieces_ninsns ((unsigned) INTVAL (size), align) ++ < MOVE_RATIO)) ++ { ++ move_by_pieces (gen_rtx (MEM, BLKmode, temp), xinner, ++ INTVAL (size), align); ++ goto ret; ++ } ++ /* Try the most limited insn first, because there's no point ++ including more than one in the machine description unless ++ the more limited one has some advantage. */ ++#ifdef HAVE_movstrqi ++ if (HAVE_movstrqi ++ && GET_CODE (size) == CONST_INT ++ && ((unsigned) INTVAL (size) ++ < (1 << (GET_MODE_BITSIZE (QImode) - 1)))) ++ { ++ emit_insn (gen_movstrqi (gen_rtx (MEM, BLKmode, temp), ++ xinner, size, ++ gen_rtx (CONST_INT, VOIDmode, align))); ++ goto ret; ++ } ++#endif ++#ifdef HAVE_movstrhi ++ if (HAVE_movstrhi ++ && GET_CODE (size) == CONST_INT ++ && ((unsigned) INTVAL (size) ++ < (1 << (GET_MODE_BITSIZE (HImode) - 1)))) ++ { ++ emit_insn (gen_movstrhi (gen_rtx (MEM, BLKmode, temp), ++ xinner, size, ++ gen_rtx (CONST_INT, VOIDmode, align))); ++ goto ret; ++ } ++#endif ++#ifdef HAVE_movstrsi ++ if (HAVE_movstrsi) ++ { ++ emit_insn (gen_movstrsi (gen_rtx (MEM, BLKmode, temp), ++ xinner, size, ++ gen_rtx (CONST_INT, VOIDmode, align))); ++ goto ret; ++ } ++#endif ++ ++ if (reg_mentioned_p (stack_pointer_rtx, temp)) ++ { ++ /* Now that emit_library_call does force_operand ++ before pushing anything, preadjustment does not work. */ ++ temp = copy_to_reg (temp); ++#if 0 ++ /* Correct TEMP so it holds what will be a description of ++ the address to copy to, valid after one arg is pushed. */ ++ int xsize = GET_MODE_SIZE (Pmode); ++#ifdef PUSH_ROUNDING ++ xsize = PUSH_ROUNDING (xsize); ++#endif ++ xsize = ((xsize + PARM_BOUNDARY / BITS_PER_UNIT - 1) ++ / (PARM_BOUNDARY / BITS_PER_UNIT) ++ * (PARM_BOUNDARY / BITS_PER_UNIT)); ++#ifdef TARGET_MEM_FUNCTIONS ++ /* If we are calling bcopy, we push one arg before TEMP. ++ If calling memcpy, we push two. */ ++ xsize *= 2; ++#endif ++#ifdef STACK_GROWS_DOWNWARD ++ temp = plus_constant (temp, xsize); ++#else ++ temp = plus_constant (temp, -xsize); ++#endif /* not STACK_GROWS_DOWNWARD */ ++#endif /* 0 */ ++ } ++ ++ /* Make inhibit_defer_pop nonzero around the library call ++ to force it to pop the bcopy-arguments right away. */ ++ NO_DEFER_POP; ++#ifdef TARGET_MEM_FUNCTIONS ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "memcpy"), 0, ++ VOIDmode, 3, temp, Pmode, XEXP (xinner, 0), Pmode, ++ size, Pmode); ++#else ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "bcopy"), 0, ++ VOIDmode, 3, XEXP (xinner, 0), Pmode, temp, Pmode, ++ size, Pmode); ++#endif ++ OK_DEFER_POP; ++ } ++ } ++ else if (partial > 0) ++ { ++ /* Scalar partly in registers. */ ++ ++ int size = GET_MODE_SIZE (mode) / UNITS_PER_WORD; ++ int i; ++ int not_stack; ++ /* # words of start of argument ++ that we must make space for but need not store. */ ++ int offset = partial % (PARM_BOUNDARY / BITS_PER_WORD); ++ int args_offset = INTVAL (args_so_far); ++ int skip; ++ ++ /* If we make space by pushing it, we might as well push ++ the real data. Otherwise, we can leave OFFSET nonzero ++ and leave the space uninitialized. */ ++ if (args_addr == 0) ++ offset = 0; ++ ++ /* Now NOT_STACK gets the number of words that we don't need to ++ allocate on the stack. */ ++ not_stack = partial - offset; ++ ++/* If the partial register-part of the arg counts in its stack size, ++ skip the part of stack space corresponding to the registers. ++ Otherwise, start copying to the beginning of the stack space, ++ by setting SKIP to 0. */ ++#ifndef FIRST_PARM_CALLER_OFFSET ++ skip = 0; ++#else ++ skip = not_stack; ++#endif ++ ++ if (GET_CODE (x) == CONST_DOUBLE && x != dconst0_rtx) ++ x = force_const_double_mem (x); ++ ++ /* Loop over all the words allocated on the stack for this arg. */ ++ /* We can do it by words, because any scalar bigger than a word ++ has a size a multiple of a word. */ ++#ifndef PUSH_ARGS_REVERSED ++ for (i = not_stack; i < size; i++) ++#else ++ for (i = size - 1; i >= not_stack; i--) ++#endif ++ if (i >= not_stack + offset) ++ { ++ rtx wd; ++ rtx addr; ++ /* Get the next word of the value in WD. */ ++ if (GET_CODE (x) == MEM) ++ { ++ rtx addr = memory_address (SImode, ++ plus_constant (XEXP (x, 0), ++ i * UNITS_PER_WORD)); ++ /* Copy to a reg, since machine may lack ++ memory-to-memory move insns. */ ++ wd = copy_to_reg (gen_rtx (MEM, SImode, addr)); ++ } ++ else if (GET_CODE (x) == REG) ++ wd = gen_rtx (SUBREG, SImode, x, i); ++ else if (x == dconst0_rtx || x == const0_rtx) ++ wd = const0_rtx; ++ else ++ abort (); ++ ++ emit_push_insn (wd, ++ SImode, 0, align, 0, 0, 0, args_addr, ++ gen_rtx (CONST_INT, VOIDmode, ++ args_offset + (i - not_stack + skip) * UNITS_PER_WORD)); ++ } ++ } ++ else ++ { ++ rtx addr; ++#ifdef PUSH_ROUNDING ++ if (args_addr == 0) ++ addr = gen_push_operand (); ++ else ++#endif ++ if (GET_CODE (args_so_far) == CONST_INT) ++ addr ++ = memory_address (mode, ++ plus_constant (args_addr, INTVAL (args_so_far))); ++ else ++ addr = memory_address (mode, gen_rtx (PLUS, Pmode, args_addr, ++ args_so_far)); ++ ++ emit_move_insn (gen_rtx (MEM, mode, addr), x); ++ } ++ ++ ret: ++ /* If part should go in registers, copy that part ++ into the appropriate registers. Do this now, at the end, ++ since mem-to-mem copies above may do function calls. */ ++ if (partial > 0) ++ move_block_to_reg (REGNO (reg), x, partial, align * BITS_PER_UNIT); ++ ++ if (extra) ++ anti_adjust_stack (gen_rtx (CONST_INT, VOIDmode, extra)); ++} ++ ++/* Output a library call to function FUN (a SYMBOL_REF rtx) ++ (emitting the queue unless NO_QUEUE is nonzero), ++ for a value of mode OUTMODE, ++ with NARGS different arguments, passed as alternating rtx values ++ and machine_modes to convert them to. ++ The rtx values should have been passed through protect_from_queue already. */ ++ ++void ++emit_library_call (va_alist) ++ va_dcl ++{ ++ register va_list p; ++ register int args_size = 0; ++ register int argnum; ++ enum machine_mode outmode; ++ int nargs; ++ rtx fun; ++ rtx orgfun; ++ int inc; ++ int count; ++ rtx *regvec; ++ rtx argblock = 0; ++ CUMULATIVE_ARGS args_so_far; ++ struct arg { rtx value; enum machine_mode mode; rtx reg; int partial; }; ++ struct arg *argvec; ++ int old_inhibit_defer_pop = inhibit_defer_pop; ++ int stack_padding = 0; ++ int no_queue = 0; ++ rtx use_insns; ++ ++ va_start (p); ++ orgfun = fun = va_arg (p, rtx); ++ no_queue = va_arg (p, int); ++ outmode = va_arg (p, enum machine_mode); ++ nargs = va_arg (p, int); ++ ++ regvec = (rtx *) alloca (nargs * sizeof (rtx)); ++ ++ /* Copy all the libcall-arguments out of the varargs data ++ and into a vector ARGVEC. */ ++ argvec = (struct arg *) alloca (nargs * sizeof (struct arg)); ++ ++ INIT_CUMULATIVE_ARGS (args_so_far, (tree)0); ++ for (count = 0; count < nargs; count++) ++ { ++ rtx val = va_arg (p, rtx); ++ enum machine_mode mode = va_arg (p, enum machine_mode); ++ int arg_size; ++ ++ argvec[count].value = val; ++ ++ /* Convert the arg value to the mode the library wants. ++ Also make sure it is a reasonable operand ++ for a move or push insn. */ ++ /* ??? It is wrong to do it here; must do it earlier ++ where we know the signedness of the arg. */ ++#ifdef GNULIB_NEEDS_DOUBLE ++ if (GNULIB_NEEDS_DOUBLE && mode == SFmode) ++ mode = DFmode; ++#endif ++ if (GET_MODE (val) != mode && GET_MODE (val) != VOIDmode) ++ { ++ val = gen_reg_rtx (mode); ++ convert_move (val, argvec[count].value, 0); ++ } ++ else if (GET_CODE (val) != REG && GET_CODE (val) != MEM ++ ++ && ! ((CONSTANT_P (val) || GET_CODE (val) == CONST_DOUBLE) ++ && LEGITIMATE_CONSTANT_P (val))) ++ val = force_operand (val, 0); ++ ++ argvec[count].value = val; ++ argvec[count].mode = mode; ++ ++ regvec[count] = FUNCTION_ARG (args_so_far, mode, (tree)0, 1); ++ ++#ifdef FUNCTION_ARG_PARTIAL_NREGS ++ argvec[count].partial ++ = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, mode, (tree)0, 1); ++#else ++ argvec[count].partial = 0; ++#endif ++ ++ FUNCTION_ARG_ADVANCE (args_so_far, mode, (tree)0, 1); ++ } ++ va_end (p); ++ ++ /* If we have no actual push instructions, make space for all the args ++ right now. */ ++#ifndef PUSH_ROUNDING ++ for (count = 0; count < nargs; count++) ++ { ++ register enum machine_mode mode = argvec[count].mode; ++ register rtx reg = regvec[count]; ++ register int partial = argvec[count].partial; ++ ++ if (reg == 0 || partial != 0) ++ args_size += GET_MODE_SIZE (mode); ++ if (partial != 0) ++ args_size -= partial * GET_MODE_SIZE (SImode); ++ } ++ ++ if (args_size != 0) ++ { ++#ifdef STACK_ARGS_ADJUST ++ struct args_size size; ++ size.constant = args_size; ++ size.var = 0; ++ STACK_ARGS_ADJUST (size); ++ args_size = size.constant; ++#endif ++ argblock ++ = push_block (round_push (gen_rtx (CONST_INT, VOIDmode, args_size)), 0); ++ } ++#endif /* no PUSH_ROUNDING */ ++ ++#ifdef PUSH_ARGS_REVERSED ++ inc = -1; ++ argnum = nargs - 1; ++#else ++ inc = 1; ++ argnum = 0; ++#endif ++ args_size = stack_padding; ++ ++ for (count = 0; count < nargs; count++, argnum += inc) ++ { ++ register enum machine_mode mode = argvec[argnum].mode; ++ register rtx val = argvec[argnum].value; ++ rtx reg = regvec[argnum]; ++ int partial = argvec[argnum].partial; ++ int arg_size; ++ ++ if (reg != 0 && partial == 0) ++ emit_move_insn (reg, val); ++ else ++ emit_push_insn (val, mode, 0, 0, partial, reg, 0, argblock, ++ gen_rtx (CONST_INT, VOIDmode, args_size)); ++ ++ /* Compute size of stack space used by this argument. */ ++ if (reg == 0 || partial != 0) ++ arg_size = GET_MODE_SIZE (mode); ++ else ++ arg_size = 0; ++ if (partial != 0) ++ arg_size ++ -= ((partial * UNITS_PER_WORD) ++ / (PARM_BOUNDARY / BITS_PER_UNIT) ++ * (PARM_BOUNDARY / BITS_PER_UNIT)); ++ ++ args_size += arg_size; ++ ++ NO_DEFER_POP; ++ } ++ ++ /* For version 1.37, try deleting this entirely. */ ++ if (! no_queue) ++ emit_queue (); ++ ++ fun = prepare_call_address (fun, 0); ++ ++ /* Any regs containing parms remain in use through the call. */ ++ start_sequence (); ++ for (count = 0; count < nargs; count++) ++ if (regvec[count] != 0) ++ emit_insn (gen_rtx (USE, VOIDmode, regvec[count])); ++ ++ use_insns = gen_sequence (); ++ end_sequence (); ++ ++#ifdef STACK_BOUNDARY ++ args_size = (args_size + STACK_BYTES - 1) / STACK_BYTES * STACK_BYTES; ++#endif ++ ++ /* Don't allow popping to be deferred, since then ++ cse'ing of library calls could delete a call and leave the pop. */ ++ NO_DEFER_POP; ++ emit_call_1 (fun, get_identifier (XSTR (orgfun, 0)), args_size, ++ FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1), ++ outmode != VOIDmode ? hard_libcall_value (outmode) : 0, ++ old_inhibit_defer_pop + 1, use_insns); ++ OK_DEFER_POP; ++} ++ ++/* Expand an assignment that stores the value of FROM into TO. ++ If WANT_VALUE is nonzero, return an rtx for the value of TO. ++ (This may contain a QUEUED rtx.) ++ Otherwise, the returned value is not meaningful. ++ ++ SUGGEST_REG is no longer actually used. ++ It used to mean, copy the value through a register ++ and return that register, if that is possible. ++ But now we do this if WANT_VALUE. ++ ++ If the value stored is a constant, we return the constant. */ ++ ++rtx ++expand_assignment (to, from, want_value, suggest_reg) ++ tree to, from; ++ int want_value; ++ int suggest_reg; ++{ ++ register rtx to_rtx = 0; ++ ++ /* Don't crash if the lhs of the assignment was erroneous. */ ++ ++ if (TREE_CODE (to) == ERROR_MARK) ++ return expand_expr (from, 0, VOIDmode, 0); ++ ++ /* Assignment of a structure component needs special treatment ++ if the structure component's rtx is not simply a MEM. ++ Assignment of an array element at a constant index ++ has the same problem. */ ++ ++ if (TREE_CODE (to) == COMPONENT_REF ++ || (TREE_CODE (to) == ARRAY_REF ++ && TREE_CODE (TREE_OPERAND (to, 1)) == INTEGER_CST ++ && TREE_CODE (TYPE_SIZE (TREE_TYPE (to))) == INTEGER_CST)) ++ { ++ register enum machine_mode mode1; ++ int bitsize; ++ int volstruct = 0; ++ tree tem = to; ++ int bitpos = 0; ++ int unsignedp; ++ ++ if (TREE_CODE (to) == COMPONENT_REF) ++ { ++ tree field = TREE_OPERAND (to, 1); ++ bitsize = TREE_INT_CST_LOW (DECL_SIZE (field)) * DECL_SIZE_UNIT (field); ++ mode1 = DECL_MODE (TREE_OPERAND (to, 1)); ++ unsignedp = TREE_UNSIGNED (field); ++ } ++ else ++ { ++ mode1 = TYPE_MODE (TREE_TYPE (to)); ++ bitsize = GET_MODE_BITSIZE (mode1); ++ unsignedp = TREE_UNSIGNED (TREE_TYPE (to)); ++ } ++ ++ /* Compute cumulative bit-offset for nested component-refs ++ and array-refs, and find the ultimate containing object. */ ++ ++ while (1) ++ { ++ if (TREE_CODE (tem) == COMPONENT_REF) ++ { ++ bitpos += DECL_OFFSET (TREE_OPERAND (tem, 1)); ++ if (TREE_THIS_VOLATILE (tem)) ++ volstruct = 1; ++ } ++ else if (TREE_CODE (tem) == ARRAY_REF ++ && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST ++ && TREE_CODE (TYPE_SIZE (TREE_TYPE (tem))) == INTEGER_CST) ++ { ++ bitpos += (TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)) ++ * TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (tem))) ++ * TYPE_SIZE_UNIT (TREE_TYPE (tem))); ++ if (TREE_THIS_VOLATILE (tem)) ++ volstruct = 1; ++ } ++ else ++ break; ++ tem = TREE_OPERAND (tem, 0); ++ } ++ /* TEM is now the containing data object. */ ++ ++ /* If we are going to use store_bit_field and extract_bit_field, ++ make sure to_rtx will be safe for multiple use. */ ++ if (mode1 == BImode && want_value) ++ tem = stabilize_reference (tem); ++ ++ to_rtx = expand_expr (tem, 0, VOIDmode, 0); ++ if (volstruct) ++ { ++ if (GET_CODE (to_rtx) == MEM) ++ MEM_VOLATILE_P (to_rtx) = 1; ++#if 0 /* This was turned off because, when a field is volatile ++ in an object which is not volatile, the object may be in a register, ++ and then we would abort over here. */ ++ else ++ abort (); ++#endif ++ } ++ ++ return store_field (to_rtx, bitsize, bitpos, mode1, from, ++ (want_value ++ /* Spurious cast makes HPUX compiler happy. */ ++ ? (enum machine_mode) TYPE_MODE (TREE_TYPE (to)) ++ : VOIDmode), ++ unsignedp, ++ /* Required alignment of containing datum. */ ++ TYPE_ALIGN (TREE_TYPE (tem)) / BITS_PER_UNIT, ++ int_size_in_bytes (TREE_TYPE (tem))); ++ } ++ ++ /* Ordinary treatment. Expand TO to get a REG or MEM rtx. ++ Don't re-expand if it was expanded already (in COMPONENT_REF case). */ ++ ++ if (to_rtx == 0) ++ to_rtx = expand_expr (to, 0, VOIDmode, 0); ++ ++ /* Compute FROM and store the value in the rtx we got. */ ++ ++ return store_expr (from, to_rtx, want_value); ++} ++ ++/* Generate code for computing expression EXP, ++ and storing the value into TARGET. ++ Returns TARGET or an equivalent value. ++ TARGET may contain a QUEUED rtx. ++ ++ If SUGGEST_REG is nonzero, copy the value through a register ++ and return that register, if that is possible. ++ ++ If the value stored is a constant, we return the constant. */ ++ ++rtx ++store_expr (exp, target, suggest_reg) ++ register tree exp; ++ register rtx target; ++ int suggest_reg; ++{ ++ register rtx temp; ++ int dont_return_target = 0; ++ ++ /* Copying a non-constant CONSTRUCTOR needs special treatment. */ ++ ++ if (TREE_CODE (exp) == CONSTRUCTOR && ! TREE_STATIC (exp)) ++ { ++ store_constructor (exp, target); ++ return target; ++ } ++ ++ if (suggest_reg && GET_CODE (target) == MEM && GET_MODE (target) != BLKmode) ++ /* If target is in memory and caller wants value in a register instead, ++ arrange that. Pass TARGET as target for expand_expr so that, ++ if EXP is another assignment, SUGGEST_REG will be nonzero for it. ++ We know expand_expr will not use the target in that case. */ ++ { ++ temp = expand_expr (exp, cse_not_expected ? 0 : target, ++ GET_MODE (target), 0); ++ if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode) ++ temp = copy_to_reg (temp); ++ dont_return_target = 1; ++ } ++ else if (queued_subexp_p (target)) ++ /* If target contains a postincrement, it is not safe ++ to use as the returned value. It would access the wrong ++ place by the time the queued increment gets output. ++ So copy the value through a temporary and use that temp ++ as the result. */ ++ { ++ temp = expand_expr (exp, 0, GET_MODE (target), 0); ++ if (GET_MODE (temp) != BLKmode && GET_MODE (temp) != VOIDmode) ++ temp = copy_to_reg (temp); ++ dont_return_target = 1; ++ } ++ else ++ { ++ temp = expand_expr (exp, target, GET_MODE (target), 0); ++ /* DO return TARGET if it's a specified hardware register. ++ expand_return relies on this. */ ++ if (!(target && GET_CODE (target) == REG ++ && REGNO (target) < FIRST_PSEUDO_REGISTER) ++ && (CONSTANT_P (temp) || GET_CODE (temp) == CONST_DOUBLE)) ++ dont_return_target = 1; ++ } ++ ++ /* If value was not generated in the target, store it there. ++ Convert the value to TARGET's type first if nec. */ ++ ++ if (temp != target && TREE_CODE (exp) != ERROR_MARK) ++ { ++ target = protect_from_queue (target, 1); ++ if (GET_MODE (temp) != GET_MODE (target) ++ && GET_MODE (temp) != VOIDmode) ++ { ++ int unsignedp = TREE_UNSIGNED (TREE_TYPE (exp)); ++ if (dont_return_target) ++ { ++ /* In this case, we will return TEMP, ++ so make sure it has the proper mode. ++ But don't forget to store the value into TARGET. */ ++ temp = convert_to_mode (GET_MODE (target), temp, unsignedp); ++ emit_move_insn (target, temp); ++ } ++ else ++ convert_move (target, temp, unsignedp); ++ } ++ ++ else if (GET_MODE (temp) == BLKmode && TREE_CODE (exp) == STRING_CST) ++ { ++ /* Handle copying a string constant into an array. ++ The string constant may be shorter than the array. ++ So copy just the string's actual length, and clear the rest. */ ++ rtx size; ++ ++ emit_block_move (target, temp, ++ gen_rtx (CONST_INT, VOIDmode, ++ TREE_STRING_LENGTH (exp)), ++ TYPE_ALIGN (TREE_TYPE (exp)) / BITS_PER_UNIT); ++ ++ temp = plus_constant (XEXP (target, 0), TREE_STRING_LENGTH (exp)); ++ size = plus_constant (expr_size (exp), - TREE_STRING_LENGTH (exp)); ++#ifdef TARGET_MEM_FUNCTIONS ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "memset"), ++ 0, VOIDmode, 3, ++ temp, Pmode, const0_rtx, Pmode, size, Pmode); ++#else ++ emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "bzero"), ++ 0, VOIDmode, 2, ++ temp, Pmode, size, Pmode); ++#endif ++ } ++ else if (GET_MODE (temp) == BLKmode) ++ emit_block_move (target, temp, expr_size (exp), ++ TYPE_ALIGN (TREE_TYPE (exp)) / BITS_PER_UNIT); ++ else ++ emit_move_insn (target, temp); ++ } ++ if (dont_return_target) ++ return temp; ++ return target; ++} ++ ++/* Store the value of constructor EXP into the rtx TARGET. ++ TARGET is either a REG or a MEM. */ ++ ++static void ++store_constructor (exp, target) ++ tree exp; ++ rtx target; ++{ ++ /* Don't try copying piece by piece into a hard register ++ since that is vulnerable to being clobbered by EXP. ++ Instead, construct in a pseudo register and then copy it all. */ ++ if (GET_CODE (target) == REG && REGNO (target) < FIRST_PSEUDO_REGISTER) ++ { ++ rtx temp = gen_reg_rtx (GET_MODE (target)); ++ store_constructor (exp, temp); ++ emit_move_insn (target, temp); ++ return; ++ } ++ ++ if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE ++ || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE) ++ { ++ register tree elt; ++ ++ if (TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE) ++ /* Inform later passes that the whole union value is dead. */ ++ emit_insn (gen_rtx (CLOBBER, VOIDmode, target)); ++ /* If a record constructor has fewer fields than the structure, ++ clear the whole structure first. */ ++ else if (list_length (CONSTRUCTOR_ELTS (exp)) ++ != list_length (TYPE_FIELDS (TREE_TYPE (exp)))) ++ clear_storage (target, int_size_in_bytes (TREE_TYPE (exp))); ++ else ++ /* Inform later passes that the old value is dead. */ ++ emit_insn (gen_rtx (CLOBBER, VOIDmode, target)); ++ ++ /* Store each element of the constructor into ++ the corresponding field of TARGET. */ ++ ++ for (elt = CONSTRUCTOR_ELTS (exp); elt; elt = TREE_CHAIN (elt)) ++ { ++ register tree field = TREE_PURPOSE (elt); ++ register enum machine_mode mode; ++ int bitsize; ++ int bitpos; ++ int unsignedp; ++ ++ bitsize = TREE_INT_CST_LOW (DECL_SIZE (field)) * DECL_SIZE_UNIT (field); ++ mode = DECL_MODE (field); ++ unsignedp = TREE_UNSIGNED (field); ++ ++ bitpos = DECL_OFFSET (field); ++ ++ store_field (target, bitsize, bitpos, mode, TREE_VALUE (elt), ++ /* The alignment of TARGET is ++ at least what its type requires. */ ++ VOIDmode, 0, ++ TYPE_ALIGN (TREE_TYPE (exp)) / BITS_PER_UNIT, ++ int_size_in_bytes (TREE_TYPE (exp))); ++ } ++ } ++ else if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE) ++ { ++ register tree elt; ++ register int i; ++ tree domain = TYPE_DOMAIN (TREE_TYPE (exp)); ++ int minelt = TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain)); ++ int maxelt = TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain)); ++ tree elttype = TREE_TYPE (TREE_TYPE (exp)); ++ ++ /* If the constructor has fewer fields than the structure, ++ clear the whole structure first. */ ++ ++ if (list_length (CONSTRUCTOR_ELTS (exp)) < maxelt - minelt + 1) ++ clear_storage (target, maxelt - minelt + 1); ++ else ++ /* Inform later passes that the old value is dead. */ ++ emit_insn (gen_rtx (CLOBBER, VOIDmode, target)); ++ ++ /* Store each element of the constructor into ++ the corresponding element of TARGET, determined ++ by counting the elements. */ ++ for (elt = CONSTRUCTOR_ELTS (exp), i = 0; ++ elt; ++ elt = TREE_CHAIN (elt), i++) ++ { ++ register enum machine_mode mode; ++ int bitsize; ++ int bitpos; ++ int unsignedp; ++ ++ mode = TYPE_MODE (elttype); ++ bitsize = GET_MODE_BITSIZE (mode); ++ unsignedp = TREE_UNSIGNED (elttype); ++ ++ bitpos = (i * TREE_INT_CST_LOW (TYPE_SIZE (elttype)) ++ * TYPE_SIZE_UNIT (elttype)); ++ ++ store_field (target, bitsize, bitpos, mode, TREE_VALUE (elt), ++ /* The alignment of TARGET is ++ at least what its type requires. */ ++ VOIDmode, 0, ++ TYPE_ALIGN (TREE_TYPE (exp)) / BITS_PER_UNIT, ++ int_size_in_bytes (TREE_TYPE (exp))); ++ } ++ } ++} ++ ++/* Store the value of EXP (an expression tree) ++ into a subfield of TARGET which has mode MODE and occupies ++ BITSIZE bits, starting BITPOS bits from the start of TARGET. ++ ++ If VALUE_MODE is VOIDmode, return nothing in particular. ++ UNSIGNEDP is not used in this case. ++ ++ Otherwise, return an rtx for the value stored. This rtx ++ has mode VALUE_MODE if that is convenient to do. ++ In this case, UNSIGNEDP must be nonzero if the value is an unsigned type. ++ ++ ALIGN is the alignment that TARGET is known to have, measured in bytes. ++ TOTAL_SIZE is its size in bytes, or -1 if variable. */ ++ ++static rtx ++store_field (target, bitsize, bitpos, mode, exp, value_mode, unsignedp, align, ++ total_size) ++ rtx target; ++ int bitsize, bitpos; ++ enum machine_mode mode; ++ tree exp; ++ enum machine_mode value_mode; ++ int unsignedp; ++ int align; ++ int total_size; ++{ ++ /* If the structure is in a register or if the component ++ is a bit field, we cannot use addressing to access it. ++ Use bit-field techniques or SUBREG to store in it. */ ++ ++ if (mode == BImode || GET_CODE (target) == REG ++ || GET_CODE (target) == SUBREG) ++ { ++ store_bit_field (target, bitsize, bitpos, ++ mode, ++ expand_expr (exp, 0, VOIDmode, 0), ++ align, total_size); ++ if (value_mode != VOIDmode) ++ return extract_bit_field (target, bitsize, bitpos, unsignedp, ++ 0, value_mode, 0, align, total_size); ++ return const0_rtx; ++ } ++ else ++ { ++ rtx addr = XEXP (target, 0); ++ rtx to_rtx; ++ ++ /* If a value is wanted, it must be the lhs; ++ so make the address stable for multiple use. */ ++ ++ if (value_mode != VOIDmode && GET_CODE (addr) != REG ++ && ! CONSTANT_ADDRESS_P (addr)) ++ addr = copy_to_reg (addr); ++ ++ /* Now build a reference to just the desired component. */ ++ ++ to_rtx = change_address (target, mode, ++ plus_constant (addr, ++ (bitpos / BITS_PER_UNIT))); ++ MEM_IN_STRUCT_P (to_rtx) = 1; ++ ++ return store_expr (exp, to_rtx, value_mode != VOIDmode); ++ } ++} ++ ++/* Given an rtx VALUE that may contain additions and multiplications, ++ return an equivalent value that just refers to a register or memory. ++ This is done by generating instructions to perform the arithmetic ++ and returning a pseudo-register containing the value. */ ++ ++rtx ++force_operand (value, target) ++ rtx value, target; ++{ ++ register optab binoptab = 0; ++ register rtx op2; ++ /* Use subtarget as the target for operand 0 of a binary operation. */ ++ register rtx subtarget = (target != 0 && GET_CODE (target) == REG ? target : 0); ++ ++ if (GET_CODE (value) == PLUS) ++ binoptab = add_optab; ++ else if (GET_CODE (value) == MINUS) ++ binoptab = sub_optab; ++ else if (GET_CODE (value) == MULT) ++ { ++ op2 = XEXP (value, 1); ++ if (!CONSTANT_P (op2) ++ && !(GET_CODE (op2) == REG && op2 != subtarget)) ++ subtarget = 0; ++ return expand_mult (GET_MODE (value), ++ force_operand (XEXP (value, 0), subtarget), ++ force_operand (op2, 0), ++ target, 0); ++ } ++ ++ if (binoptab) ++ { ++ op2 = XEXP (value, 1); ++ if (!CONSTANT_P (op2) ++ && !(GET_CODE (op2) == REG && op2 != subtarget)) ++ subtarget = 0; ++ if (binoptab == sub_optab ++ && GET_CODE (op2) == CONST_INT && INTVAL (op2) < 0) ++ { ++ binoptab = add_optab; ++ op2 = gen_rtx (CONST_INT, VOIDmode, - INTVAL (op2)); ++ } ++ return expand_binop (GET_MODE (value), binoptab, ++ force_operand (XEXP (value, 0), subtarget), ++ force_operand (op2, 0), ++ target, 0, OPTAB_LIB_WIDEN); ++ /* We give UNSIGNEP = 0 to expand_binop ++ because the only operations we are expanding here are signed ones. */ ++ } ++ return value; ++} ++ ++/* expand_expr: generate code for computing expression EXP. ++ An rtx for the computed value is returned. The value is never null. ++ In the case of a void EXP, const0_rtx is returned. ++ ++ The value may be stored in TARGET if TARGET is nonzero. ++ TARGET is just a suggestion; callers must assume that ++ the rtx returned may not be the same as TARGET. ++ ++ If TARGET is CONST0_RTX, it means that the value will be ignored. ++ ++ If TMODE is not VOIDmode, it suggests generating the ++ result in mode TMODE. But this is done only when convenient. ++ Otherwise, TMODE is ignored and the value generated in its natural mode. ++ TMODE is just a suggestion; callers must assume that ++ the rtx returned may not have mode TMODE. ++ ++ If MODIFIER is EXPAND_SUM then when EXP is an addition ++ we can return an rtx of the form (MULT (REG ...) (CONST_INT ...)) ++ or a nest of (PLUS ...) and (MINUS ...) where the terms are ++ products as above, or REG or MEM, or constant. ++ Ordinarily in such cases we would output mul or add instructions ++ and then return a pseudo reg containing the sum. ++ ++ If MODIFIER is EXPAND_CONST_ADDRESS then it is ok to return ++ a MEM rtx whose address is a constant that isn't a legitimate address. */ ++ ++/* Subroutine of expand_expr: ++ save the non-copied parts (LIST) of an expr (LHS), and return a list ++ which can restore these values to their previous values, ++ should something modify their storage. */ ++static tree ++save_noncopied_parts (lhs, list) ++ tree lhs; ++ tree list; ++{ ++ tree tail; ++ tree parts = 0; ++ ++ for (tail = list; tail; tail = TREE_CHAIN (tail)) ++ if (TREE_CODE (TREE_VALUE (tail)) == TREE_LIST) ++ parts = chainon (parts, save_noncopied_parts (TREE_VALUE (tail))); ++ else ++ { ++ tree part = TREE_VALUE (tail); ++ tree part_type = TREE_TYPE (part); ++ parts = tree_cons (save_expr (build_component_ref (lhs, part, parts, 0)), ++ build_nt (RTL_EXPR, 0, (tree) assign_stack_local (TYPE_MODE (part_type), int_size_in_bytes (part_type))), ++ parts); ++ store_expr (TREE_PURPOSE (parts), RTL_EXPR_RTL (TREE_VALUE (parts)), 0); ++ } ++ return parts; ++} ++ ++/* Subroutine of expand_expr: ++ return the target to use when recursively expanding ++ the first operand of an arithmetic operation. */ ++ ++static rtx ++validate_subtarget (subtarget, otherop) ++ rtx subtarget; ++ tree otherop; ++{ ++ if (TREE_LITERAL (otherop)) ++ return subtarget; ++ if (TREE_CODE (otherop) == VAR_DECL ++ && DECL_RTL (otherop) != subtarget) ++ return subtarget; ++ return 0; ++} ++ ++rtx ++expand_expr (exp, target, tmode, modifier) ++ register tree exp; ++ rtx target; ++ enum machine_mode tmode; ++ enum expand_modifier modifier; ++{ ++ register rtx op0, op1, temp; ++ tree type = TREE_TYPE (exp); ++ register enum machine_mode mode = TYPE_MODE (type); ++ register enum tree_code code = TREE_CODE (exp); ++ optab this_optab; ++ int negate_1; ++ /* Use subtarget as the target for operand 0 of a binary operation. */ ++ rtx subtarget = (target != 0 && GET_CODE (target) == REG ? target : 0); ++ rtx original_target = target; ++ int ignore = target == const0_rtx; ++ ++ /* Don't use hard regs as subtargets, because the combiner ++ can only handle pseudo regs. */ ++ if (subtarget && REGNO (subtarget) < FIRST_PSEUDO_REGISTER) ++ subtarget = 0; ++ /* Avoid subtargets inside loops, ++ since they hide some invariant expressions. */ ++ if (optimize && inside_loop ()) ++ subtarget = 0; ++ ++ if (ignore) target = 0, original_target = 0; ++ ++ /* If will do cse, generate all results into registers ++ since 1) that allows cse to find more things ++ and 2) otherwise cse could produce an insn the machine ++ cannot support. */ ++ ++ if (! cse_not_expected && mode != BLKmode) ++ target = subtarget; ++ ++ /* No sense saving up arithmetic to be done ++ if it's all in the wrong mode to form part of an address. ++ And force_operand won't know whether to sign-extend or zero-extend. */ ++ ++ if (mode != Pmode && modifier == EXPAND_SUM) ++ modifier = EXPAND_NORMAL; ++ ++ /* Ensure we reference a volatile object even if value is ignored. */ ++ if (ignore && TREE_THIS_VOLATILE (exp) ++ && mode != VOIDmode && mode != BLKmode) ++ { ++ target = gen_reg_rtx (mode); ++ temp = expand_expr (exp, target, VOIDmode, modifier); ++ if (temp != target) ++ emit_move_insn (target, temp); ++ return target; ++ } ++ ++ switch (code) ++ { ++ case PARM_DECL: ++ if (DECL_RTL (exp) == 0) ++ { ++ error_with_decl (exp, "prior parameter's size depends on `%s'"); ++ return const0_rtx; ++ } ++ ++ case FUNCTION_DECL: ++ case VAR_DECL: ++ case RESULT_DECL: ++ if (DECL_RTL (exp) == 0) ++ abort (); ++ /* This is the case of an array whose size is to be determined ++ from its initializer, while the initializer is still being parsed. ++ See expand_decl. */ ++ if (GET_CODE (DECL_RTL (exp)) == MEM ++ && GET_CODE (XEXP (DECL_RTL (exp), 0)) == REG) ++ return change_address (DECL_RTL (exp), GET_MODE (DECL_RTL (exp)), ++ XEXP (DECL_RTL (exp), 0)); ++ if (GET_CODE (DECL_RTL (exp)) == MEM ++ && modifier != EXPAND_CONST_ADDRESS) ++ { ++ /* DECL_RTL probably contains a constant address. ++ On RISC machines where a constant address isn't valid, ++ make some insns to get that address into a register. */ ++ if (!memory_address_p (DECL_MODE (exp), XEXP (DECL_RTL (exp), 0)) ++ || (flag_force_addr ++ && CONSTANT_ADDRESS_P (XEXP (DECL_RTL (exp), 0)))) ++ return change_address (DECL_RTL (exp), VOIDmode, ++ copy_rtx (XEXP (DECL_RTL (exp), 0))); ++ } ++ return DECL_RTL (exp); ++ ++ case INTEGER_CST: ++ if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_INT) ++ return gen_rtx (CONST_INT, VOIDmode, TREE_INT_CST_LOW (exp)); ++ /* Generate immediate CONST_DOUBLE ++ which will be turned into memory by reload if necessary. */ ++ return immed_double_const (TREE_INT_CST_LOW (exp), ++ TREE_INT_CST_HIGH (exp), ++ mode); ++ ++ case CONST_DECL: ++ return expand_expr (DECL_INITIAL (exp), target, VOIDmode, 0); ++ ++ case REAL_CST: ++ /* If optimized, generate immediate CONST_DOUBLE ++ which will be turned into memory by reload if necessary. */ ++ if (!cse_not_expected) ++ return immed_real_const (exp); ++ case COMPLEX_CST: ++ case STRING_CST: ++ if (! TREE_CST_RTL (exp)) ++ output_constant_def (exp); ++ ++ /* TREE_CST_RTL probably contains a constant address. ++ On RISC machines where a constant address isn't valid, ++ make some insns to get that address into a register. */ ++ if (GET_CODE (TREE_CST_RTL (exp)) == MEM ++ && modifier != EXPAND_CONST_ADDRESS ++ && !memory_address_p (mode, XEXP (TREE_CST_RTL (exp), 0))) ++ return change_address (TREE_CST_RTL (exp), VOIDmode, ++ copy_rtx (XEXP (TREE_CST_RTL (exp), 0))); ++ return TREE_CST_RTL (exp); ++ ++ case SAVE_EXPR: ++ if (SAVE_EXPR_RTL (exp) == 0) ++ { ++ rtx reg = gen_reg_rtx (mode); ++ SAVE_EXPR_RTL (exp) = reg; ++ store_expr (TREE_OPERAND (exp, 0), reg, 0); ++ if (!optimize) ++ save_expr_regs = gen_rtx (EXPR_LIST, VOIDmode, reg, ++ save_expr_regs); ++ } ++ /* Don't let the same rtl node appear in two places. */ ++ return SAVE_EXPR_RTL (exp); ++ ++ case LET_STMT: ++ TREE_USED (exp) = 1; ++ temp = expand_expr (STMT_BODY (exp), target, tmode, modifier); ++ return temp; ++ ++ case RTL_EXPR: ++ if (RTL_EXPR_SEQUENCE (exp) == const0_rtx) ++ abort (); ++ emit_insns (RTL_EXPR_SEQUENCE (exp)); ++ RTL_EXPR_SEQUENCE (exp) = const0_rtx; ++ return RTL_EXPR_RTL (exp); ++ ++ case CONSTRUCTOR: ++ /* All elts simple constants => refer to a constant in memory. */ ++ if (TREE_STATIC (exp)) ++ /* For aggregate types with non-BLKmode modes, ++ this should ideally construct a CONST_INT. */ ++ { ++ rtx constructor = output_constant_def (exp); ++ if (! memory_address_p (GET_MODE (constructor), ++ XEXP (constructor, 0))) ++ constructor = change_address (constructor, VOIDmode, ++ XEXP (constructor, 0)); ++ return constructor; ++ } ++ ++ if (ignore) ++ { ++ tree elt; ++ for (elt = CONSTRUCTOR_ELTS (exp); elt; elt = TREE_CHAIN (elt)) ++ expand_expr (TREE_VALUE (elt), const0_rtx, VOIDmode, 0); ++ return const0_rtx; ++ } ++ else ++ { ++ if (target == 0) ++ target ++ = assign_stack_local (TYPE_MODE (TREE_TYPE (exp)), ++ int_size_in_bytes (TREE_TYPE (exp))); ++ store_expr (exp, target, 0); ++ return target; ++ } ++ ++ case INDIRECT_REF: ++ { ++ tree exp1 = TREE_OPERAND (exp, 0); ++ tree exp2; ++ ++ /* A SAVE_EXPR as the address in an INDIRECT_EXPR is generated ++ for *PTR += ANYTHING where PTR is put inside the SAVE_EXPR. ++ This code has the same general effect as simply doing ++ expand_expr on the save expr, except that the expression PTR ++ is computed for use as a memory address. This means different ++ code, suitable for indexing, may be generated. */ ++ if (TREE_CODE (exp1) == SAVE_EXPR ++ && SAVE_EXPR_RTL (exp1) == 0 ++ && TREE_CODE (exp2 = TREE_OPERAND (exp1, 0)) != ERROR_MARK ++ && TYPE_MODE (TREE_TYPE (exp1)) == Pmode ++ && TYPE_MODE (TREE_TYPE (exp2)) == Pmode) ++ { ++ temp = expand_expr (TREE_OPERAND (exp1, 0), 0, VOIDmode, EXPAND_SUM); ++ op0 = memory_address (mode, temp); ++ op0 = copy_all_regs (op0); ++ SAVE_EXPR_RTL (exp1) = op0; ++ } ++ else ++ { ++ op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, EXPAND_SUM); ++ op0 = memory_address (mode, op0); ++ } ++ } ++ temp = gen_rtx (MEM, mode, op0); ++ /* If address was computed by addition, ++ mark this as an element of an aggregate. */ ++ if (TREE_CODE (TREE_OPERAND (exp, 0)) == PLUS_EXPR ++ || (TREE_CODE (TREE_OPERAND (exp, 0)) == SAVE_EXPR ++ && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) == PLUS_EXPR)) ++ MEM_IN_STRUCT_P (temp) = 1; ++ MEM_VOLATILE_P (temp) = TREE_THIS_VOLATILE (exp) || flag_volatile; ++ RTX_UNCHANGING_P (temp) = TREE_READONLY (exp); ++ return temp; ++ ++ case ARRAY_REF: ++ if (TREE_CODE (TREE_OPERAND (exp, 1)) != INTEGER_CST ++ || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST) ++ { ++ /* Nonconstant array index or nonconstant element size. ++ Generate the tree for *(&array+index) and expand that, ++ except do it in a language-independent way ++ and don't complain about non-lvalue arrays. ++ `mark_addressable' should already have been called ++ for any array for which this case will be reached. */ ++ ++ /* Don't forget the const or volatile flag from the array element. */ ++ tree variant_type = build_type_variant (type, ++ TREE_READONLY (exp), ++ TREE_THIS_VOLATILE (exp)); ++ tree array_adr = build (ADDR_EXPR, build_pointer_type (variant_type), ++ TREE_OPERAND (exp, 0)); ++ tree index = TREE_OPERAND (exp, 1); ++ tree elt; ++ ++ /* Convert the integer argument to a type the same size as a pointer ++ so the multiply won't overflow spuriously. */ ++ if (TYPE_PRECISION (TREE_TYPE (index)) != POINTER_SIZE) ++ index = convert (type_for_size (POINTER_SIZE, 0), index); ++ ++ /* The array address isn't volatile even if the array is. */ ++ TREE_VOLATILE (array_adr) = 0; ++ ++ elt = build (INDIRECT_REF, type, ++ fold (build (PLUS_EXPR, TYPE_POINTER_TO (variant_type), ++ array_adr, ++ fold (build (MULT_EXPR, ++ TYPE_POINTER_TO (variant_type), ++ index, size_in_bytes (type)))))); ++ ++ return expand_expr (elt, target, tmode, modifier); ++ } ++ ++ /* Fold an expression like: "foo"[2]. ++ This is not done in fold so it won't happen inside &. */ ++ { ++ int i; ++ tree arg0 = TREE_OPERAND (exp, 0); ++ tree arg1 = TREE_OPERAND (exp, 1); ++ ++ if (TREE_CODE (arg0) == STRING_CST ++ && TREE_CODE (arg1) == INTEGER_CST ++ && !TREE_INT_CST_HIGH (arg1) ++ && (i = TREE_INT_CST_LOW (arg1)) < TREE_STRING_LENGTH (arg0)) ++ { ++ if (TREE_TYPE (TREE_TYPE (arg0)) == integer_type_node) ++ { ++ exp = build_int_2 (((int *)TREE_STRING_POINTER (arg0))[i], 0); ++ TREE_TYPE (exp) = integer_type_node; ++ return expand_expr (exp, target, tmode, modifier); ++ } ++ if (TREE_TYPE (TREE_TYPE (arg0)) == char_type_node) ++ { ++ exp = build_int_2 (TREE_STRING_POINTER (arg0)[i], 0); ++ TREE_TYPE (exp) = integer_type_node; ++ return expand_expr (convert (TREE_TYPE (TREE_TYPE (arg0)), exp), target, tmode, modifier); ++ } ++ } ++ } ++ ++ /* If this is a constant index into a constant array, ++ just get the value from the array. */ ++ if (TREE_READONLY (TREE_OPERAND (exp, 0)) ++ && ! TREE_VOLATILE (TREE_OPERAND (exp, 0)) ++ && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == ARRAY_TYPE ++ && TREE_LITERAL (TREE_OPERAND (exp, 1)) ++ && TREE_CODE (TREE_OPERAND (exp, 0)) == VAR_DECL ++ && DECL_INITIAL (TREE_OPERAND (exp, 0)) ++ && TREE_CODE (DECL_INITIAL (TREE_OPERAND (exp, 0))) == CONSTRUCTOR) ++ { ++ tree index = fold (TREE_OPERAND (exp, 1)); ++ if (TREE_CODE (index) == INTEGER_CST) ++ { ++ int i = TREE_INT_CST_LOW (index); ++ tree init = CONSTRUCTOR_ELTS (DECL_INITIAL (TREE_OPERAND (exp, 0))); ++ ++ while (init && i--) ++ init = TREE_CHAIN (init); ++ if (init) ++ return expand_expr (fold (TREE_VALUE (init)), target, tmode, modifier); ++ } ++ } ++ /* Treat array-ref with constant index as a component-ref. */ ++ ++ case COMPONENT_REF: ++ { ++ register enum machine_mode mode1; ++ int volstruct = 0; ++ int bitsize; ++ tree tem = exp; ++ int bitpos = 0; ++ int unsignedp; ++ ++ if (TREE_CODE (exp) == COMPONENT_REF) ++ { ++ tree field = TREE_OPERAND (exp, 1); ++ bitsize = TREE_INT_CST_LOW (DECL_SIZE (field)) * DECL_SIZE_UNIT (field); ++ mode1 = DECL_MODE (TREE_OPERAND (exp, 1)); ++ unsignedp = TREE_UNSIGNED (field); ++ } ++ else ++ { ++ mode1 = TYPE_MODE (TREE_TYPE (exp)); ++ bitsize = GET_MODE_BITSIZE (mode1); ++ unsignedp = TREE_UNSIGNED (TREE_TYPE (exp)); ++ } ++ ++ /* Compute cumulative bit-offset for nested component-refs ++ and array-refs, and find the ultimate containing object. */ ++ ++ while (1) ++ { ++ if (TREE_CODE (tem) == COMPONENT_REF) ++ { ++ bitpos += DECL_OFFSET (TREE_OPERAND (tem, 1)); ++ if (TREE_THIS_VOLATILE (tem)) ++ volstruct = 1; ++ } ++ else if (TREE_CODE (tem) == ARRAY_REF ++ && TREE_CODE (TREE_OPERAND (tem, 1)) == INTEGER_CST ++ && TREE_CODE (TYPE_SIZE (TREE_TYPE (tem))) == INTEGER_CST) ++ { ++ bitpos += (TREE_INT_CST_LOW (TREE_OPERAND (tem, 1)) ++ * TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (tem))) ++ * TYPE_SIZE_UNIT (TREE_TYPE (tem))); ++ if (TREE_THIS_VOLATILE (tem)) ++ volstruct = 1; ++ } ++ else ++ break; ++ tem = TREE_OPERAND (tem, 0); ++ } ++ ++ op0 = expand_expr (tem, 0, VOIDmode, ++ (modifier == EXPAND_CONST_ADDRESS ++ ? modifier : EXPAND_NORMAL)); ++ ++ /* Don't forget about volatility even if this is a bitfield. */ ++ if (GET_CODE (op0) == MEM && volstruct && ! MEM_VOLATILE_P (op0)) ++ { ++ op0 = copy_rtx (op0); ++ MEM_VOLATILE_P (op0) = 1; ++ } ++ ++ if (mode1 == BImode || GET_CODE (op0) == REG ++ || GET_CODE (op0) == SUBREG) ++ return extract_bit_field (op0, bitsize, bitpos, unsignedp, ++ target, mode, tmode, ++ TYPE_ALIGN (TREE_TYPE (tem)) / BITS_PER_UNIT, ++ int_size_in_bytes (TREE_TYPE (tem))); ++ /* Get a reference to just this component. */ ++ if (modifier == EXPAND_CONST_ADDRESS) ++ op0 = gen_rtx (MEM, mode1, plus_constant (XEXP (op0, 0), ++ (bitpos / BITS_PER_UNIT))); ++ else ++ op0 = change_address (op0, mode1, ++ plus_constant (XEXP (op0, 0), ++ (bitpos / BITS_PER_UNIT))); ++ MEM_IN_STRUCT_P (op0) = 1; ++ MEM_VOLATILE_P (op0) |= volstruct; ++ /* If OP0 is in the shared structure-value stack slot, ++ and it is not BLKmode, copy it into a register. ++ The shared slot may be clobbered at any time by another call. ++ BLKmode is safe because our caller will either copy the value away ++ or take another component and come back here. */ ++ if (mode != BLKmode ++ && TREE_CODE (TREE_OPERAND (exp, 0)) == CALL_EXPR ++ && TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == BLKmode) ++ op0 = copy_to_reg (op0); ++ if (mode == mode1 || mode1 == BLKmode || mode1 == tmode) ++ return op0; ++ if (target == 0) ++ target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode); ++ convert_move (target, op0, unsignedp); ++ return target; ++ } ++ ++ /* Intended for a reference to a buffer of a file-object in Pascal. ++ But it's not certain that a special tree code will really be ++ necessary for these. INDIRECT_REF might work for them. */ ++ case BUFFER_REF: ++ abort (); ++ ++ case WITH_CLEANUP_EXPR: ++ RTL_EXPR_RTL (TREE_OPERAND (exp, 1)) ++ = expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier); ++ cleanups_of_this_call = tree_cons (0, TREE_OPERAND (exp, 2), cleanups_of_this_call); ++ return RTL_EXPR_RTL (TREE_OPERAND (exp, 1)); ++ ++ case CALL_EXPR: ++ /* Check for a built-in function. */ ++ if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR ++ && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) == FUNCTION_DECL ++ && (DECL_FUNCTION_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) ++ != NOT_BUILT_IN)) ++ return expand_builtin (exp, target, subtarget, tmode, ignore); ++ /* If this call was expanded already by preexpand_calls, ++ just return the result we got. */ ++ if (CALL_EXPR_RTL (exp) != 0) ++ return CALL_EXPR_RTL (exp); ++ return expand_call (exp, target, ignore); ++ ++ case NOP_EXPR: ++ case CONVERT_EXPR: ++ case REFERENCE_EXPR: ++ if (TREE_CODE (type) == VOID_TYPE || ignore) ++ { ++ expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier); ++ return const0_rtx; ++ } ++ if (mode == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))) ++ return expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, modifier); ++ op0 = expand_expr (TREE_OPERAND (exp, 0), 0, mode, 0); ++ if (GET_MODE (op0) == mode || GET_MODE (op0) == VOIDmode) ++ return op0; ++ if (flag_force_mem && GET_CODE (op0) == MEM) ++ op0 = copy_to_reg (op0); ++ if (GET_MODE (op0) == VOIDmode) ++ /* Avoid problem in convert_move due to unknown mode of OP0. */ ++ op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))), ++ op0); ++ if (target == 0) ++ target = gen_reg_rtx (mode); ++ convert_move (target, op0, TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))); ++ return target; ++ ++ case PLUS_EXPR: ++ preexpand_calls (exp); ++ if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST ++ && modifier == EXPAND_SUM) ++ { ++ op1 = expand_expr (TREE_OPERAND (exp, 1), subtarget, VOIDmode, EXPAND_SUM); ++ op1 = plus_constant (op1, TREE_INT_CST_LOW (TREE_OPERAND (exp, 0))); ++ return op1; ++ } ++ negate_1 = 1; ++ plus_minus: ++ if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST ++ && modifier == EXPAND_SUM) ++ { ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, EXPAND_SUM); ++ op0 = plus_constant (op0, ++ negate_1 * TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))); ++ return op0; ++ } ++ this_optab = add_optab; ++ if (modifier != EXPAND_SUM) goto binop; ++ subtarget = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, EXPAND_SUM); ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, EXPAND_SUM); ++ /* Put a sum last, to simplify what follows. */ ++#ifdef OLD_INDEXING ++ if (GET_CODE (op1) == MULT) ++ { ++ temp = op0; ++ op0 = op1; ++ op1 = temp; ++ } ++#endif ++#ifndef OLD_INDEXING ++ /* Make sure any term that's a sum with a constant comes last. */ ++ if (GET_CODE (op0) == PLUS ++ && CONSTANT_P (XEXP (op0, 1))) ++ { ++ temp = op0; ++ op0 = op1; ++ op1 = temp; ++ } ++ /* If adding to a sum including a constant, ++ associate it to put the constant outside. */ ++ if (GET_CODE (op1) == PLUS ++ && CONSTANT_P (XEXP (op1, 1))) ++ { ++ rtx tem; ++ int constant_term = 0; ++ ++ op0 = gen_rtx (PLUS, mode, XEXP (op1, 0), op0); ++ /* Let's also eliminate constants from op0 if possible. */ ++ tem = eliminate_constant_term (op0, &constant_term); ++ if (GET_CODE (XEXP (op1, 1)) == CONST_INT) ++ { ++ if (constant_term != 0) ++ return plus_constant (tem, INTVAL (XEXP (op1, 1)) + constant_term); ++ else ++ return plus_constant (op0, INTVAL (XEXP (op1, 1))); ++ } ++ else ++ return gen_rtx (PLUS, mode, op0, XEXP (op1, 1)); ++ } ++#endif ++ return gen_rtx (PLUS, mode, op0, op1); ++ ++ case MINUS_EXPR: ++ preexpand_calls (exp); ++ if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST ++ && GET_MODE_BITSIZE (TYPE_MODE (type)) <= HOST_BITS_PER_INT) ++ { ++ int negated; ++ if (modifier == EXPAND_SUM) ++ { ++ negate_1 = -1; ++ goto plus_minus; ++ } ++ subtarget = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ negated = - TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)); ++ if (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_INT) ++ negated &= (1 << GET_MODE_BITSIZE (mode)) - 1; ++ op1 = gen_rtx (CONST_INT, VOIDmode, negated); ++ this_optab = add_optab; ++ goto binop2; ++ } ++ this_optab = sub_optab; ++ goto binop; ++ ++ case MULT_EXPR: ++ preexpand_calls (exp); ++ /* If first operand is constant, swap them. ++ Thus the following special case checks need only ++ check the second operand. */ ++ if (TREE_CODE (TREE_OPERAND (exp, 0)) == INTEGER_CST) ++ { ++ register tree t1 = TREE_OPERAND (exp, 0); ++ TREE_OPERAND (exp, 0) = TREE_OPERAND (exp, 1); ++ TREE_OPERAND (exp, 1) = t1; ++ } ++ ++ /* Attempt to return something suitable for generating an ++ indexed address, for machines that support that. */ ++ ++ if (modifier == EXPAND_SUM ++ && TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST) ++ { ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, EXPAND_SUM); ++ ++ /* Apply distributive law if OP0 is x+c. */ ++ if (GET_CODE (op0) == PLUS ++ && GET_CODE (XEXP (op0, 1)) == CONST_INT) ++ return gen_rtx (PLUS, mode, ++ gen_rtx (MULT, mode, XEXP (op0, 0), ++ gen_rtx (CONST_INT, VOIDmode, ++ TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)))), ++ gen_rtx (CONST_INT, VOIDmode, ++ (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)) ++ * INTVAL (XEXP (op0, 1))))); ++ ++ if (GET_CODE (op0) != REG) ++ op0 = force_operand (op0, 0); ++ if (GET_CODE (op0) != REG) ++ op0 = copy_to_mode_reg (mode, op0); ++ ++ return gen_rtx (MULT, mode, op0, ++ gen_rtx (CONST_INT, VOIDmode, ++ TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)))); ++ } ++ subtarget = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ /* Check for multiplying things that have been extended ++ from a narrower type. If this machine supports multiplying ++ in that narrower type with a result in the desired type, ++ do it that way, and avoid the explicit type-conversion. */ ++ if (TREE_CODE (TREE_OPERAND (exp, 0)) == NOP_EXPR ++ && TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE ++ && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) ++ < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0)))) ++ && ((TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST ++ && int_fits_type_p (TREE_OPERAND (exp, 1), ++ TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) ++ /* Don't use a widening multiply if a shift will do. */ ++ && exact_log2 (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))) < 0) ++ || ++ (TREE_CODE (TREE_OPERAND (exp, 1)) == NOP_EXPR ++ && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 1), 0))) ++ == ++ TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))) ++ /* If both operands are extended, they must either both ++ be zero-extended or both be sign-extended. */ ++ && (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 1), 0))) ++ == ++ TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))))))) ++ { ++ enum machine_mode innermode ++ = TYPE_MODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))); ++ this_optab = (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) ++ ? umul_widen_optab : smul_widen_optab); ++ if (mode == GET_MODE_WIDER_MODE (innermode) ++ && this_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing) ++ { ++ op0 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 0), 0), ++ 0, VOIDmode, 0); ++ if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST) ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ else ++ op1 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 1), 0), ++ 0, VOIDmode, 0); ++ goto binop2; ++ } ++ } ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ return expand_mult (mode, op0, op1, target, TREE_UNSIGNED (type)); ++ ++ case TRUNC_DIV_EXPR: ++ case FLOOR_DIV_EXPR: ++ case CEIL_DIV_EXPR: ++ case ROUND_DIV_EXPR: ++ case EXACT_DIV_EXPR: ++ preexpand_calls (exp); ++ subtarget = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ /* Possible optimization: compute the dividend with EXPAND_SUM ++ then if the divisor is constant can optimize the case ++ where some terms of the dividend have coeffs divisible by it. */ ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ return expand_divmod (0, code, mode, op0, op1, target, ++ TREE_UNSIGNED (type)); ++ ++ case RDIV_EXPR: ++ preexpand_calls (exp); ++ this_optab = flodiv_optab; ++ goto binop; ++ ++ case TRUNC_MOD_EXPR: ++ case FLOOR_MOD_EXPR: ++ case CEIL_MOD_EXPR: ++ case ROUND_MOD_EXPR: ++ preexpand_calls (exp); ++ subtarget = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ return expand_divmod (1, code, mode, op0, op1, target, ++ TREE_UNSIGNED (type)); ++#if 0 ++#ifdef HAVE_divmoddisi4 ++ if (GET_MODE (op0) != DImode) ++ { ++ temp = gen_reg_rtx (DImode); ++ convert_move (temp, op0, 0); ++ op0 = temp; ++ if (GET_MODE (op1) != SImode && GET_CODE (op1) != CONST_INT) ++ { ++ temp = gen_reg_rtx (SImode); ++ convert_move (temp, op1, 0); ++ op1 = temp; ++ } ++ temp = gen_reg_rtx (SImode); ++ if (target == 0) ++ target = gen_reg_rtx (SImode); ++ emit_insn (gen_divmoddisi4 (temp, protect_from_queue (op0, 0), ++ protect_from_queue (op1, 0), ++ protect_from_queue (target, 1))); ++ return target; ++ } ++#endif ++#endif ++ ++ case FIX_ROUND_EXPR: ++ case FIX_FLOOR_EXPR: ++ case FIX_CEIL_EXPR: ++ abort (); /* Not used for C. */ ++ ++ case FIX_TRUNC_EXPR: ++ op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0); ++ if (target == 0) ++ target = gen_reg_rtx (mode); ++ { ++ int unsignedp = TREE_UNSIGNED (TREE_TYPE (exp)); ++ if (mode == HImode || mode == QImode) ++ { ++ register rtx temp = gen_reg_rtx (SImode); ++ expand_fix (temp, op0, 0); ++ convert_move (target, temp, 0); ++ } ++ else ++ expand_fix (target, op0, unsignedp); ++ } ++ return target; ++ ++ case FLOAT_EXPR: ++ op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0); ++ if (target == 0) ++ target = gen_reg_rtx (mode); ++ if (GET_MODE (op0) == VOIDmode) ++ /* Avoid problem in convert_move due to unknown mode of OP0. */ ++ op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))), ++ op0); ++ { ++ int unsignedp = TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))); ++ if (GET_MODE (op0) == HImode ++ || GET_MODE (op0) == QImode) ++ { ++ register rtx temp = gen_reg_rtx (SImode); ++ convert_move (temp, op0, unsignedp); ++ expand_float (target, temp, 0); ++ } ++ else ++ expand_float (target, op0, unsignedp); ++ } ++ return target; ++ ++ case NEGATE_EXPR: ++ op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, 0); ++ temp = expand_unop (mode, neg_optab, op0, target, 0); ++ if (temp == 0) ++ abort (); ++ return temp; ++ ++ case ABS_EXPR: ++ /* First try to do it with a special abs instruction. ++ If that does not win, use conditional jump and negate. */ ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ temp = expand_unop (mode, abs_optab, op0, target, 0); ++ if (temp != 0) ++ return temp; ++ temp = gen_label_rtx (); ++ if (target == 0 || GET_CODE (target) != REG) ++ target = gen_reg_rtx (mode); ++ emit_move_insn (target, op0); ++ emit_cmp_insn (target, ++ expand_expr (convert (TREE_TYPE (exp), integer_zero_node), ++ 0, VOIDmode, 0), ++ 0, 0, 0); ++ NO_DEFER_POP; ++ emit_jump_insn (gen_bge (temp)); ++ op0 = expand_unop (mode, neg_optab, target, target, 0); ++ if (op0 != target) ++ emit_move_insn (target, op0); ++ emit_label (temp); ++ OK_DEFER_POP; ++ return target; ++ ++ case MAX_EXPR: ++ case MIN_EXPR: ++ mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1))); ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ if (target == 0 || GET_CODE (target) != REG || target == op1) ++ target = gen_reg_rtx (mode); ++ op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, 0); ++ if (target != op0) ++ emit_move_insn (target, op0); ++ op0 = gen_label_rtx (); ++ if (code == MAX_EXPR) ++ temp = (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1))) ++ ? compare1 (target, op1, GEU, LEU, 1, mode) ++ : compare1 (target, op1, GE, LE, 0, mode)); ++ else ++ temp = (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1))) ++ ? compare1 (target, op1, LEU, GEU, 1, mode) ++ : compare1 (target, op1, LE, GE, 0, mode)); ++ if (temp == const0_rtx) ++ emit_move_insn (target, op1); ++ else if (temp != const1_rtx) ++ { ++ if (bcc_gen_fctn[(int) GET_CODE (temp)] != 0) ++ emit_jump_insn ((*bcc_gen_fctn[(int) GET_CODE (temp)]) (op0)); ++ else ++ abort (); ++ emit_move_insn (target, op1); ++ } ++ emit_label (op0); ++ return target; ++ ++/* ??? Can optimize when the operand of this is a bitwise operation, ++ by using a different bitwise operation. */ ++ case BIT_NOT_EXPR: ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ temp = expand_unop (mode, one_cmpl_optab, op0, target, 1); ++ if (temp == 0) ++ abort (); ++ return temp; ++ ++ case FFS_EXPR: ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ temp = expand_unop (mode, ffs_optab, op0, target, 1); ++ if (temp == 0) ++ abort (); ++ return temp; ++ ++/* ??? Can optimize bitwise operations with one arg constant. ++ Pastel optimizes (a bitwise1 n) bitwise2 (a bitwise3 b) ++ and (a bitwise1 b) bitwise2 b (etc) ++ but that is probably not worth while. */ ++ ++/* BIT_AND_EXPR is for bitwise anding. ++ TRUTH_AND_EXPR is for anding two boolean values ++ when we want in all cases to compute both of them. ++ In general it is fastest to do TRUTH_AND_EXPR by ++ computing both operands as actual zero-or-1 values ++ and then bitwise anding. In cases where there cannot ++ be any side effects, better code would be made by ++ treating TRUTH_AND_EXPR like TRUTH_ANDIF_EXPR; ++ but the question is how to recognize those cases. */ ++ ++ case TRUTH_AND_EXPR: ++ case BIT_AND_EXPR: ++ preexpand_calls (exp); ++ subtarget = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ return expand_bit_and (mode, op0, op1, target); ++ ++/* See comment above about TRUTH_AND_EXPR; it applies here too. */ ++ case TRUTH_OR_EXPR: ++ case BIT_IOR_EXPR: ++ preexpand_calls (exp); ++ this_optab = ior_optab; ++ goto binop; ++ ++ case BIT_XOR_EXPR: ++ preexpand_calls (exp); ++ this_optab = xor_optab; ++ goto binop; ++ ++ case LSHIFT_EXPR: ++ case RSHIFT_EXPR: ++ case LROTATE_EXPR: ++ case RROTATE_EXPR: ++ preexpand_calls (exp); ++ subtarget = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ return expand_shift (code, mode, op0, TREE_OPERAND (exp, 1), target, ++ TREE_UNSIGNED (type)); ++ ++/* ??? cv's were used to effect here to combine additive constants ++ and to determine the answer when only additive constants differ. ++ Also, the addition of one can be handled by changing the condition. */ ++ case LT_EXPR: ++ case LE_EXPR: ++ case GT_EXPR: ++ case GE_EXPR: ++ case EQ_EXPR: ++ case NE_EXPR: ++ preexpand_calls (exp); ++ temp = do_store_flag (exp, target, mode); ++ if (temp != 0) ++ return temp; ++ /* For foo != 0, load foo, and if it is nonzero load 1 instead. */ ++ if (code == NE_EXPR && integer_zerop (TREE_OPERAND (exp, 1)) ++ && subtarget ++ && (GET_MODE (subtarget) ++ == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))) ++ { ++ temp = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ if (temp != subtarget) ++ temp = copy_to_reg (temp); ++ op1 = gen_label_rtx (); ++ emit_cmp_insn (temp, const0_rtx, 0, TREE_UNSIGNED (type), 0); ++ emit_jump_insn (gen_beq (op1)); ++ emit_move_insn (temp, const1_rtx); ++ emit_label (op1); ++ return temp; ++ } ++ /* If no set-flag instruction, must generate a conditional ++ store into a temporary variable. Drop through ++ and handle this like && and ||. */ ++ ++ case TRUTH_ANDIF_EXPR: ++ case TRUTH_ORIF_EXPR: ++ temp = gen_reg_rtx (mode); ++ emit_clr_insn (temp); ++ op1 = gen_label_rtx (); ++ jumpifnot (exp, op1); ++ emit_0_to_1_insn (temp); ++ emit_label (op1); ++ return temp; ++ ++ case TRUTH_NOT_EXPR: ++ op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, 0); ++ /* The parser is careful to generate TRUTH_NOT_EXPR ++ only with operands that are always zero or one. */ ++ temp = expand_binop (mode, xor_optab, op0, ++ gen_rtx (CONST_INT, mode, 1), ++ target, 1, OPTAB_LIB_WIDEN); ++ if (temp == 0) ++ abort (); ++ return temp; ++ ++ case COMPOUND_EXPR: ++ expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0); ++ emit_queue (); ++ return expand_expr (TREE_OPERAND (exp, 1), target, VOIDmode, 0); ++ ++ case COND_EXPR: ++ /* Note that COND_EXPRs whose type is a structure or union ++ are required to be constructed to contain assignments of ++ a temporary variable, so that we can evaluate them here ++ for side effect only. If type is void, we must do likewise. */ ++ op0 = gen_label_rtx (); ++ op1 = gen_label_rtx (); ++ ++ if (mode == VOIDmode || ignore) ++ temp = 0; ++ else if (target) ++ temp = target; ++ else if (mode == BLKmode) ++ { ++ if (TYPE_SIZE (type) == 0 || ! TREE_LITERAL (TYPE_SIZE (type))) ++ abort (); ++ temp = assign_stack_local (BLKmode, ++ (TREE_INT_CST_LOW (TYPE_SIZE (type)) ++ * TYPE_SIZE_UNIT (type) ++ + BITS_PER_UNIT - 1) ++ / BITS_PER_UNIT); ++ } ++ else ++ temp = gen_reg_rtx (mode); ++ ++ jumpifnot (TREE_OPERAND (exp, 0), op0); ++ NO_DEFER_POP; ++ if (temp != 0) ++ store_expr (TREE_OPERAND (exp, 1), temp, 0); ++ else ++ expand_expr (TREE_OPERAND (exp, 1), ignore ? const0_rtx : 0, ++ VOIDmode, 0); ++ emit_queue (); ++ emit_jump_insn (gen_jump (op1)); ++ emit_barrier (); ++ emit_label (op0); ++ if (temp != 0) ++ store_expr (TREE_OPERAND (exp, 2), temp, 0); ++ else ++ expand_expr (TREE_OPERAND (exp, 2), ignore ? const0_rtx : 0, ++ VOIDmode, 0); ++ emit_queue (); ++ emit_label (op1); ++ OK_DEFER_POP; ++ return temp; ++ ++ case MODIFY_EXPR: ++ { ++ /* If lhs is complex, expand calls in rhs before computing it. ++ That's so we don't compute a pointer and save it over a call. ++ If lhs is simple, compute it first so we can give it as a ++ target if the rhs is just a call. This avoids an extra temp and copy ++ and that prevents a partial-subsumption which makes bad code. ++ Actually we could treat component_ref's of vars like vars. */ ++ ++ tree lhs = TREE_OPERAND (exp, 0); ++ tree rhs = TREE_OPERAND (exp, 1); ++ tree noncopied_parts; ++ ++ if (TREE_CODE (lhs) != VAR_DECL ++ && TREE_CODE (lhs) != RESULT_DECL ++ && TREE_CODE (lhs) != PARM_DECL) ++ preexpand_calls (exp); ++ ++ noncopied_parts = save_noncopied_parts (lhs, TYPE_NONCOPIED_PARTS (TREE_TYPE (lhs))); ++ temp = expand_assignment (lhs, rhs, ! ignore, original_target != 0); ++ while (noncopied_parts != 0) ++ { ++ store_expr (TREE_VALUE (noncopied_parts), ++ SAVE_EXPR_RTL (TREE_PURPOSE (noncopied_parts)), 0); ++ noncopied_parts = TREE_CHAIN (noncopied_parts); ++ } ++ return temp; ++ } ++ ++ case PREINCREMENT_EXPR: ++ case PREDECREMENT_EXPR: ++ return expand_increment (exp, 0); ++ ++ case POSTINCREMENT_EXPR: ++ case POSTDECREMENT_EXPR: ++ return expand_increment (exp, 1); ++ ++ case ADDR_EXPR: ++ op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, ++ EXPAND_CONST_ADDRESS); ++ if (GET_CODE (op0) != MEM) ++ abort (); ++ if (modifier == EXPAND_SUM) ++ return XEXP (op0, 0); ++ op0 = force_operand (XEXP (op0, 0), target); ++ if (flag_force_addr && GET_CODE (op0) != REG) ++ return force_reg (Pmode, op0); ++ return op0; ++ ++ case ENTRY_VALUE_EXPR: ++ abort (); ++ ++ case ERROR_MARK: ++ return const0_rtx; ++ ++ default: ++ abort (); ++ } ++ ++ /* Here to do an ordinary binary operator, generating an instruction ++ from the optab already placed in `this_optab'. */ ++ binop: ++ /* Detect things like x = y | (a == b) ++ and do them as (x = y), (a == b ? x |= 1 : 0), x. */ ++ /* First, get the comparison or conditional into the second arg. */ ++ if (comparison_code[(int) TREE_CODE (TREE_OPERAND (exp, 0))] ++ || (TREE_CODE (TREE_OPERAND (exp, 0)) == COND_EXPR ++ && (integer_zerop (TREE_OPERAND (TREE_OPERAND (exp, 0), 1)) ++ || integer_zerop (TREE_OPERAND (TREE_OPERAND (exp, 0), 2))))) ++ { ++ if (this_optab == ior_optab || this_optab == add_optab ++ || this_optab == xor_optab) ++ { ++ tree exch = TREE_OPERAND (exp, 1); ++ TREE_OPERAND (exp, 1) = TREE_OPERAND (exp, 0); ++ TREE_OPERAND (exp, 0) = exch; ++ } ++ } ++ /* Optimize X + (Y ? Z : 0) by computing X and maybe adding Z. */ ++ if (comparison_code[(int) TREE_CODE (TREE_OPERAND (exp, 1))] ++ || (TREE_CODE (TREE_OPERAND (exp, 1)) == COND_EXPR ++ && (integer_zerop (TREE_OPERAND (TREE_OPERAND (exp, 1), 1)) ++ || integer_zerop (TREE_OPERAND (TREE_OPERAND (exp, 1), 2))))) ++ { ++ if (this_optab == ior_optab || this_optab == add_optab ++ || this_optab == xor_optab || this_optab == sub_optab ++ || this_optab == lshl_optab || this_optab == ashl_optab ++ || this_optab == lshr_optab || this_optab == ashr_optab ++ || this_optab == rotl_optab || this_optab == rotr_optab) ++ { ++ tree thenexp; ++ rtx thenv = 0; ++ ++ /* TARGET gets a reg in which we can perform the computation. ++ Use the specified target if it's a pseudo reg and safe. */ ++ target = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ if (target == 0) target = gen_reg_rtx (mode); ++ ++ /* Compute X into the target. */ ++ store_expr (TREE_OPERAND (exp, 0), target, 0); ++ op0 = gen_label_rtx (); ++ ++ /* If other operand is a comparison COMP, treat it as COMP ? 1 : 0 */ ++ if (TREE_CODE (TREE_OPERAND (exp, 1)) != COND_EXPR) ++ { ++ do_jump (TREE_OPERAND (exp, 1), op0, 0); ++ thenv = const1_rtx; ++ } ++ else if (integer_zerop (TREE_OPERAND (TREE_OPERAND (exp, 1), 2))) ++ { ++ do_jump (TREE_OPERAND (TREE_OPERAND (exp, 1), 0), op0, 0); ++ thenexp = TREE_OPERAND (TREE_OPERAND (exp, 1), 1); ++ } ++ else ++ { ++ do_jump (TREE_OPERAND (TREE_OPERAND (exp, 1), 0), 0, op0); ++ thenexp = TREE_OPERAND (TREE_OPERAND (exp, 1), 2); ++ } ++ ++ if (thenv == 0) ++ thenv = expand_expr (thenexp, 0, VOIDmode, 0); ++ ++ /* THENV is now Z, the value to operate on, as an rtx. ++ We have already tested that Y isn't zero, so do the operation. */ ++ ++ if (this_optab == rotl_optab || this_optab == rotr_optab) ++ temp = expand_binop (mode, this_optab, target, thenv, target, ++ -1, OPTAB_LIB); ++ else if (this_optab == lshl_optab || this_optab == lshr_optab) ++ temp = expand_binop (mode, this_optab, target, thenv, target, ++ 1, OPTAB_LIB_WIDEN); ++ else ++ temp = expand_binop (mode, this_optab, target, thenv, target, ++ 0, OPTAB_LIB_WIDEN); ++ if (target != temp) ++ emit_move_insn (target, temp); ++ ++ emit_queue (); ++ do_pending_stack_adjust (); ++ emit_label (op0); ++ return target; ++ } ++ } ++ subtarget = validate_subtarget (subtarget, TREE_OPERAND (exp, 1)); ++ op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ binop2: ++ temp = expand_binop (mode, this_optab, op0, op1, target, ++ TREE_UNSIGNED (TREE_TYPE (exp)), OPTAB_LIB_WIDEN); ++ if (temp == 0) ++ abort (); ++ return temp; ++} ++ ++/* Expand an expression EXP that calls a built-in function, ++ with result going to TARGET if that's convenient ++ (and in mode MODE if that's convenient). ++ SUBTARGET may be used as the target for computing one of EXP's operands. ++ IGNORE is nonzero if the value is to be ignored. */ ++ ++static rtx ++expand_builtin (exp, target, subtarget, mode, ignore) ++ tree exp; ++ rtx target; ++ rtx subtarget; ++ enum machine_mode mode; ++ int ignore; ++{ ++ tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx op0; ++ ++ switch (DECL_FUNCTION_CODE (fndecl)) ++ { ++ case BUILT_IN_ABS: ++ case BUILT_IN_LABS: ++ case BUILT_IN_FABS: ++ /* build_function_call changes these into ABS_EXPR. */ ++ abort (); ++ ++ case BUILT_IN_SAVEREGS: ++ if (saveregs_value != 0) ++ return saveregs_value; ++ { ++ /* When this function is called, it means that registers must be ++ saved on entry to this function. So we migrate the ++ call to the first insn of this function. */ ++ rtx last = get_last_insn (); ++ /* Now really call the function. `expand_call' does not call ++ expand_builtin, so there is no danger of infinite recursion here. */ ++ rtx temp = expand_call (exp, target, ignore); ++ reorder_insns (NEXT_INSN (last), get_last_insn (), get_insns ()); ++ saveregs_value = temp; ++ return temp; ++ } ++ ++ case BUILT_IN_NEXT_ARG: ++ { ++ tree fntype = TREE_TYPE (current_function_decl); ++ if (!(TYPE_ARG_TYPES (fntype) != 0 ++ && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype))) ++ != void_type_node))) ++ { ++ error ("`stdarg.h' facilities used, but function has fixed args"); ++ return const0_rtx; ++ } ++ } ++ ++ return expand_binop (Pmode, add_optab, ++ arg_pointer_rtx, current_function_arg_offset_rtx, ++ 0, 0, OPTAB_LIB_WIDEN); ++ ++ case BUILT_IN_CLASSIFY_TYPE: ++ if (arglist != 0) ++ { ++ tree type = TREE_TYPE (TREE_VALUE (arglist)); ++ enum tree_code code = TREE_CODE (type); ++ if (code == VOID_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, void_type_class); ++ if (code == INTEGER_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, integer_type_class); ++ if (code == CHAR_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, char_type_class); ++ if (code == ENUMERAL_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, enumeral_type_class); ++ if (code == BOOLEAN_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, boolean_type_class); ++ if (code == POINTER_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, pointer_type_class); ++ if (code == REFERENCE_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, reference_type_class); ++ if (code == OFFSET_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, offset_type_class); ++ if (code == REAL_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, real_type_class); ++ if (code == COMPLEX_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, complex_type_class); ++ if (code == FUNCTION_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, function_type_class); ++ if (code == METHOD_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, method_type_class); ++ if (code == RECORD_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, record_type_class); ++ if (code == UNION_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, union_type_class); ++ if (code == ARRAY_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, array_type_class); ++ if (code == STRING_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, string_type_class); ++ if (code == SET_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, set_type_class); ++ if (code == FILE_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, file_type_class); ++ if (code == LANG_TYPE) ++ return gen_rtx (CONST_INT, VOIDmode, lang_type_class); ++ } ++ return gen_rtx (CONST_INT, VOIDmode, no_type_class); ++ ++ case BUILT_IN_ALLOCA: ++ if (arglist == 0 ++ /* Arg could be non-integer if user redeclared this fcn wrong. */ ++ || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != INTEGER_TYPE) ++ return const0_rtx; ++ frame_pointer_needed = 1; ++ current_function_calls_alloca = 1; ++ /* Compute the argument. */ ++ op0 = expand_expr (TREE_VALUE (arglist), 0, VOIDmode, 0); ++ if (! CONSTANT_P (op0)) ++ { ++ op0 = force_reg (GET_MODE (op0), op0); ++ if (GET_MODE (op0) != Pmode) ++ op0 = convert_to_mode (Pmode, op0, 1); ++ } ++ /* Push that much space (rounding it up). */ ++ do_pending_stack_adjust (); ++ ++#ifdef STACK_POINTER_OFFSET ++ /* If we will have to round the result down (which is up ++ if stack grows down), make sure we have extra space so the ++ user still gets at least as much space as he asked for. */ ++ if ((STACK_POINTER_OFFSET + STACK_BYTES - 1) / STACK_BYTES ++ != STACK_POINTER_OFFSET / STACK_BYTES) ++ op0 = plus_constant (op0, STACK_BYTES); ++#endif ++ ++#ifdef STACK_GROWS_DOWNWARD ++ anti_adjust_stack (round_push (op0)); ++#endif ++ /* Return a copy of current stack ptr, in TARGET if possible. */ ++ if (target) ++ emit_move_insn (target, stack_pointer_rtx); ++ else ++ target = copy_to_reg (stack_pointer_rtx); ++#ifdef STACK_POINTER_OFFSET ++ /* If the contents of the stack pointer reg are offset from the ++ actual top-of-stack address, add the offset here. */ ++ if (GET_CODE (target) == REG) ++ emit_insn (gen_add2_insn (target, ++ gen_rtx (CONST_INT, VOIDmode, ++ (STACK_POINTER_OFFSET + STACK_BYTES - 1) / STACK_BYTES * STACK_BYTES))); ++ else ++ { ++ rtx temp = ++ expand_binop (GET_MODE (target), add_optab, target, ++ gen_rtx (CONST_INT, VOIDmode, ++ (STACK_POINTER_OFFSET + STACK_BYTES - 1) / STACK_BYTES * STACK_BYTES), ++ target, ++ 1, OPTAB_DIRECT); ++ if (temp == 0) abort (); ++ if (temp != target) ++ emit_move_insn (target, temp); ++ } ++#endif ++#ifndef STACK_GROWS_DOWNWARD ++ anti_adjust_stack (round_push (op0)); ++#endif ++ /* Some systems require a particular insn to refer to the stack ++ to make the pages exist. */ ++#ifdef HAVE_probe ++ if (HAVE_probe) ++ emit_insn (gen_probe ()); ++#endif ++ return target; ++ ++ case BUILT_IN_FFS: ++ if (arglist == 0 ++ /* Arg could be non-integer if user redeclared this fcn wrong. */ ++ || TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != INTEGER_TYPE) ++ return const0_rtx; ++ ++ /* Compute the argument. */ ++ op0 = expand_expr (TREE_VALUE (arglist), subtarget, VOIDmode, 0); ++ /* Compute ffs, into TARGET if possible. ++ Set TARGET to wherever the result comes back. */ ++ target = expand_unop (TYPE_MODE (TREE_TYPE (TREE_VALUE (arglist))), ++ ffs_optab, op0, target, 1); ++ if (target == 0) ++ abort (); ++ return target; ++ ++ default: ++ abort (); ++ } ++} ++ ++/* Expand code for a post- or pre- increment or decrement ++ and return the RTX for the result. ++ POST is 1 for postinc/decrements and 0 for preinc/decrements. */ ++ ++static rtx ++expand_increment (exp, post) ++ register tree exp; ++ int post; ++{ ++ register rtx op0, op1; ++ register rtx temp; ++ register tree incremented = TREE_OPERAND (exp, 0); ++ optab this_optab = add_optab; ++ int icode; ++ enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp)); ++ int op0_is_copy = 0; ++ ++ /* Stabilize any component ref that might need to be ++ evaluated more than once below. */ ++ if (TREE_CODE (incremented) == COMPONENT_REF ++ && (TREE_CODE (TREE_OPERAND (incremented, 0)) != INDIRECT_REF ++ || DECL_MODE (TREE_OPERAND (incremented, 1)) == BImode)) ++ incremented = stabilize_reference (incremented); ++ ++ /* Compute the operands as RTX. ++ Note whether OP0 is the actual lvalue or a copy of it: ++ I believe it is a copy iff it is a register and insns were ++ generated in computing it. */ ++ temp = get_last_insn (); ++ op0 = expand_expr (incremented, 0, VOIDmode, 0); ++ if (temp != get_last_insn ()) ++ op0_is_copy = (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG); ++ op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ ++ /* Decide whether incrementing or decrementing. */ ++ if (TREE_CODE (exp) == POSTDECREMENT_EXPR ++ || TREE_CODE (exp) == PREDECREMENT_EXPR) ++ this_optab = sub_optab; ++ ++ /* If OP0 is not the actual lvalue, but rather a copy in a register, ++ then we cannot just increment OP0. We must ++ therefore contrive to increment the original value. ++ Then we can return OP0 since it is a copy of the old value. */ ++ if (op0_is_copy) ++ { ++ /* This is the easiest way to increment the value wherever it is. ++ Problems with multiple evaluation of INCREMENTED ++ are prevented because either (1) it is a component_ref, ++ in which case it was stabilized above, or (2) it is an array_ref ++ with constant index in an array in a register, which is ++ safe to reevaluate. */ ++ tree newexp = build ((this_optab == add_optab ++ ? PLUS_EXPR : MINUS_EXPR), ++ TREE_TYPE (exp), ++ incremented, ++ TREE_OPERAND (exp, 1)); ++ temp = expand_assignment (incremented, newexp, ! post, 0); ++ return post ? op0 : temp; ++ } ++ ++ /* Convert decrement by a constant into a negative increment. */ ++ if (this_optab == sub_optab ++ && GET_CODE (op1) == CONST_INT) ++ { ++ op1 = gen_rtx (CONST_INT, VOIDmode, - INTVAL (op1)); ++ this_optab = add_optab; ++ } ++ ++ if (post) ++ { ++ /* We have a true reference to the value in OP0. ++ If there is an insn to add or subtract in this mode, queue it. */ ++ ++ /* I'm not sure this is still necessary. */ ++ op0 = stabilize (op0); ++ ++ icode = (int) this_optab->handlers[(int) mode].insn_code; ++ if (icode != (int) CODE_FOR_nothing ++ /* Make sure that OP0 is valid for operands 0 and 1 ++ of the insn we want to queue. */ ++ && (*insn_operand_predicate[icode][0]) (op0, mode) ++ && (*insn_operand_predicate[icode][1]) (op0, mode)) ++ { ++ if (! (*insn_operand_predicate[icode][2]) (op1, mode)) ++ op1 = force_reg (mode, op1); ++ ++ return enqueue_insn (op0, GEN_FCN (icode) (op0, op0, op1)); ++ } ++ } ++ ++ /* Preincrement, or we can't increment with one simple insn. */ ++ if (post) ++ /* Save a copy of the value before inc or dec, to return it later. */ ++ temp = copy_to_reg (op0); ++ else ++ /* Arrange to return the incremented value. */ ++ /* Copy the rtx because expand_binop will protect from the queue, ++ and the results of that would be invalid for us to return ++ if our caller does emit_queue before using our result. */ ++ temp = copy_rtx (op0); ++ ++ /* Increment however we can. */ ++ op1 = expand_binop (mode, this_optab, ++ /* If OP0 is volatile memory, we read it once; ++ avoid reading it again. */ ++ (post && GET_CODE (op0) == MEM && MEM_VOLATILE_P (op0) ++ ? temp : op0), ++ op1, op0, ++ TREE_UNSIGNED (TREE_TYPE (exp)), OPTAB_LIB_WIDEN); ++ /* Make sure the value is stored into OP0. */ ++ if (op1 != op0) ++ emit_move_insn (op0, op1); ++ ++ return temp; ++} ++ ++/* Expand all function calls contained within EXP, innermost ones first. ++ But don't look within expressions that have sequence points. ++ For each CALL_EXPR, record the rtx for its value ++ in the CALL_EXPR_RTL field. ++ ++ Calls that return large structures for which a structure return ++ stack slot is needed are not preexpanded. Preexpanding them loses ++ because if more than one were preexpanded they would try to use the ++ same stack slot. */ ++ ++static void ++preexpand_calls (exp) ++ tree exp; ++{ ++ register int nops, i; ++ ++ if (! do_preexpand_calls) ++ return; ++ ++ /* Only expressions and references can contain calls. */ ++ ++ if (tree_code_type[(int) TREE_CODE (exp)][0] != 'e' ++ && tree_code_type[(int) TREE_CODE (exp)][0] != 'r') ++ return; ++ ++ switch (TREE_CODE (exp)) ++ { ++ case CALL_EXPR: ++ /* Do nothing to built-in functions. */ ++ if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR ++ && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) == FUNCTION_DECL ++ && (DECL_FUNCTION_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) ++ != NOT_BUILT_IN)) ++ return; ++ /* Precompute calls that don't return values in memory. */ ++ if (CALL_EXPR_RTL (exp) == 0 ++ && TYPE_MODE (TREE_TYPE (exp)) != BLKmode ++ && ! RETURN_IN_MEMORY (TREE_TYPE (exp))) ++ CALL_EXPR_RTL (exp) = expand_call (exp, 0, 0); ++ return; ++ ++ case COMPOUND_EXPR: ++ case COND_EXPR: ++ case TRUTH_ANDIF_EXPR: ++ case TRUTH_ORIF_EXPR: ++ /* If we find one of these, then we can be sure ++ the adjust will be done for it (since it makes jumps). ++ Do it now, so that if this is inside an argument ++ of a function, we don't get the stack adjustment ++ after some other args have already been pushed. */ ++ do_pending_stack_adjust (); ++ return; ++ ++ case RTL_EXPR: ++ return; ++ ++ case SAVE_EXPR: ++ if (SAVE_EXPR_RTL (exp) != 0) ++ return; ++ } ++ ++ nops = tree_code_length[(int) TREE_CODE (exp)]; ++ for (i = 0; i < nops; i++) ++ if (TREE_OPERAND (exp, i) != 0) ++ { ++ register int type = *tree_code_type[(int) TREE_CODE (TREE_OPERAND (exp, i))]; ++ if (type == 'e' || type == 'r') ++ preexpand_calls (TREE_OPERAND (exp, i)); ++ } ++} ++ ++/* Force FUNEXP into a form suitable for the address of a CALL, ++ and return that as an rtx. Also load the static chain register ++ from either FUNEXP or CONTEXT. */ ++ ++static rtx ++prepare_call_address (funexp, context) ++ rtx funexp; ++ rtx context; ++{ ++ funexp = protect_from_queue (funexp, 0); ++ if (context != 0) ++ context = protect_from_queue (context, 0); ++ ++ /* Function variable in language with nested functions. */ ++ if (GET_MODE (funexp) == EPmode) ++ { ++ emit_move_insn (static_chain_rtx, gen_highpart (Pmode, funexp)); ++ funexp = memory_address (FUNCTION_MODE, gen_lowpart (Pmode, funexp)); ++ emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx)); ++ } ++ else ++ { ++ if (context != 0) ++ /* Unless function variable in C, or top level function constant */ ++ emit_move_insn (static_chain_rtx, lookup_static_chain (context)); ++ ++ /* Make a valid memory address and copy constants thru pseudo-regs, ++ but not for a constant address if -fno-function-cse. */ ++ if (GET_CODE (funexp) != SYMBOL_REF) ++ funexp = memory_address (FUNCTION_MODE, funexp); ++ else ++ { ++#ifndef NO_FUNCTION_CSE ++ if (optimize && ! flag_no_function_cse) ++ funexp = force_reg (Pmode, funexp); ++#endif ++ } ++ ++ if (context != 0) ++ emit_insn (gen_rtx (USE, VOIDmode, static_chain_rtx)); ++ } ++ return funexp; ++} ++ ++/* Generate instructions to call function FUNEXP, ++ and optionally pop the results. ++ The CALL_INSN is the first insn generated. ++ ++ FUNTYPE is the data type of the function, or, for a library call, ++ the identifier for the name of the call. This is given to the ++ macro RETURN_POPS_ARGS to determine whether this function pops its own args. ++ ++ STACK_SIZE is the number of bytes of arguments on the stack, ++ rounded up to STACK_BOUNDARY; zero if the size is variable. ++ This is both to put into the call insn and ++ to generate explicit popping code if necessary. ++ ++ NEXT_ARG_REG is the rtx that results from executing ++ FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1) ++ just after all the args have had their registers assigned. ++ This could be whatever you like, but normally it is the first ++ arg-register beyond those used for args in this call, ++ or 0 if all the arg-registers are used in this call. ++ It is passed on to `gen_call' so you can put this info in the call insn. ++ ++ VALREG is a hard register in which a value is returned, ++ or 0 if the call does not return a value. ++ ++ OLD_INHIBIT_DEFER_POP is the value that `inhibit_defer_pop' had before ++ the args to this call were processed. ++ We restore `inhibit_defer_pop' to that value. ++ ++ USE_INSNS is a SEQUENCE of USE insns to be emitted immediately before ++ the actual CALL insn. */ ++ ++static void ++emit_call_1 (funexp, funtype, stack_size, next_arg_reg, valreg, old_inhibit_defer_pop, use_insns) ++ rtx funexp; ++ tree funtype; ++ int stack_size; ++ rtx next_arg_reg; ++ rtx valreg; ++ int old_inhibit_defer_pop; ++ rtx use_insns; ++{ ++ rtx stack_size_rtx = gen_rtx (CONST_INT, VOIDmode, stack_size); ++ rtx call_insn; ++ ++ if (valreg) ++ emit_call_insn (gen_call_value (valreg, ++ gen_rtx (MEM, FUNCTION_MODE, funexp), ++ stack_size_rtx, next_arg_reg)); ++ else ++ emit_call_insn (gen_call (gen_rtx (MEM, FUNCTION_MODE, funexp), ++ stack_size_rtx, next_arg_reg)); ++ ++ /* Find the CALL insn we just emitted and write the USE insns before it. */ ++ for (call_insn = get_last_insn(); ++ call_insn && GET_CODE (call_insn) != CALL_INSN; ++ call_insn = PREV_INSN (call_insn)) ++ ; ++ ++ if (! call_insn) ++ abort (); ++ ++ /* Put the USE insns before the CALL. */ ++ emit_insn_before (use_insns, call_insn); ++ ++ inhibit_defer_pop = old_inhibit_defer_pop; ++ ++ /* If returning from the subroutine does not automatically pop the args, ++ we need an instruction to pop them sooner or later. ++ Perhaps do it now; perhaps just record how much space to pop later. */ ++ ++ if (! RETURN_POPS_ARGS (funtype) ++ && stack_size != 0) ++ { ++ if (flag_defer_pop && inhibit_defer_pop == 0) ++ pending_stack_adjust += stack_size; ++ else ++ adjust_stack (stack_size_rtx); ++ } ++} ++ ++/* At the start of a function, record that we have no previously-pushed ++ arguments waiting to be popped. */ ++ ++void ++init_pending_stack_adjust () ++{ ++ pending_stack_adjust = 0; ++#ifdef STACK_SPACE_FOR_CALLS ++ stack_space_for_calls=0; ++#endif ++} ++ ++/* When exiting from function, if safe, clear out any pending stack adjust ++ so the adjustment won't get done. */ ++ ++void ++clear_pending_stack_adjust () ++{ ++#ifdef EXIT_IGNORE_STACK ++ if (!flag_omit_frame_pointer && EXIT_IGNORE_STACK ++ && ! TREE_INLINE (current_function_decl) ++ && ! flag_inline_functions) ++ pending_stack_adjust = 0; ++#endif ++} ++ ++/* Pop any previously-pushed arguments that have not been popped yet. */ ++ ++void ++do_pending_stack_adjust () ++{ ++ if (inhibit_defer_pop == 0) ++ { ++ if (pending_stack_adjust != 0) ++ adjust_stack (gen_rtx (CONST_INT, VOIDmode, pending_stack_adjust)); ++ pending_stack_adjust = 0; ++ } ++} ++ ++/* Data structure and subroutines used within expand_call. */ ++ ++struct arg_data ++{ ++ /* Tree node for this argument. */ ++ tree tree_value; ++ /* Precomputed RTL value, or 0 if it isn't precomputed. */ ++ rtx value; ++ /* Register to pass this argument in, or 0 if passed on stack. */ ++ rtx reg; ++ /* Number of registers to use. 0 means put the whole arg in registers. ++ Also 0 if not passed in registers. */ ++ int partial; ++ /* Offset of this argument from beginning of stack-args. */ ++ struct args_size offset; ++ /* Size of this argument on the stack, rounded up for any padding it gets, ++ parts of the argument passed in registers do not count. ++ If the FIRST_PARM_CALLER_OFFSET is negative, then register parms ++ are counted here as well. */ ++ struct args_size size; ++ /* Nonzero if this arg has already been stored. */ ++ int stored; ++ /* const0_rtx means should preallocate stack space for this arg. ++ Other non0 value is the stack slot, preallocated. ++ Used only for BLKmode. */ ++ rtx stack; ++}; ++ ++static void store_one_arg (); ++static rtx target_for_arg (); ++ ++/* Generate all the code for a function call ++ and return an rtx for its value. ++ Store the value in TARGET (specified as an rtx) if convenient. ++ If the value is stored in TARGET then TARGET is returned. ++ If IGNORE is nonzero, then we ignore the value of the function call. */ ++ ++static rtx ++expand_call (exp, target, ignore) ++ tree exp; ++ rtx target; ++ int ignore; ++{ ++ /* List of actual parameters. */ ++ tree actparms = TREE_OPERAND (exp, 1); ++ /* RTX for the function to be called. */ ++ rtx funexp; ++ /* Data type of the function. */ ++ tree funtype; ++ /* Declaration of the function being called, ++ or 0 if the function is computed (not known by name). */ ++ tree fndecl = 0; ++ ++ /* Register in which non-BLKmode value will be returned, ++ or 0 if no value or if value is BLKmode. */ ++ rtx valreg; ++ /* Address where we should return a BLKmode value; ++ 0 if value not BLKmode. */ ++ rtx structure_value_addr = 0; ++ /* Nonzero if that address is being passed by treating it as ++ an extra, implicit first parameter. Otherwise, ++ it is passed by being copied directly into struct_value_rtx. */ ++ int structure_value_addr_parm = 0; ++ /* Save get_structure_value_addr data to prevent multiple use. */ ++ rtx saved_structure_value_addr; ++ int saved_structure_value_size; ++ /* Nonzero if called function returns an aggregate in memory PCC style, ++ by returning the address of where to find it. */ ++ int pcc_struct_value = 0; ++ /* Insn that was used to copy the result to the specified target, ++ or 0 if no such insn. */ ++ rtx result_copy_insn = 0; ++ ++ /* Number of actual parameters in this call, including struct value addr. */ ++ int num_actuals; ++ /* Number of named args. Args after this are anonymous ones ++ and they must all go on the stack. */ ++ int n_named_args; ++ /* Count arg position in order args appear. */ ++ int argpos; ++ ++ /* Vector of information about each argument. ++ Arguments are numbered in the order they will be pushed, ++ not the order they are written. */ ++ struct arg_data *args; ++ ++ /* Total size in bytes of all the stack-parms scanned so far. */ ++ struct args_size args_size; ++ /* Remember initial value of args_size.constant. */ ++ int starting_args_size; ++ /* Nonzero means count reg-parms' size in ARGS_SIZE. */ ++ int stack_count_regparms = 0; ++ /* Data on reg parms scanned so far. */ ++ CUMULATIVE_ARGS args_so_far; ++ /* Nonzero if a reg parm has been scanned. */ ++ int reg_parm_seen; ++ /* Nonzero if we must avoid push-insns in the args for this call. */ ++ int must_preallocate; ++ /* 1 if scanning parms front to back, -1 if scanning back to front. */ ++ int inc; ++ /* Address of space preallocated for stack parms ++ (on machines that lack push insns), or 0 if space not preallocated. */ ++ rtx argblock = 0; ++ /* Amount to align the stack by before or after we push any args. */ ++ int stack_align = 0; ++ ++ /* Nonzero if it is plausible that this is a call to alloca. */ ++ int may_be_alloca; ++ /* Nonzero if this is a call to setjmp or a related function. */ ++ int is_setjmp; ++ /* Nonzero if this is a call to an inline function. */ ++ int is_integrable = 0; ++ /* Nonzero if this is a call to __builtin_new. */ ++ int is_builtin_new; ++ /* Nonzero if this is a call to a `const' function. */ ++ int is_const = 0; ++ ++ /* Nonzero if there are BLKmode args whose data types require them ++ to be passed in memory, not (even partially) in registers. */ ++ int BLKmode_parms_forced = 0; ++ /* The offset of the first BLKmode parameter which ++ *must* be passed in memory. */ ++ int BLKmode_parms_first_offset = 0; ++ /* Total size of BLKmode parms which could usefully be preallocated. */ ++ int BLKmode_parms_sizes = 0; ++ ++ /* Amount stack was adjusted to protect BLKmode parameters ++ which are below the nominal "stack address" value. */ ++ rtx protected_stack = 0; ++ ++ /* The last insn before the things that are intrinsically part of the call. ++ The beginning reg-note goes on the insn after this one. */ ++ rtx insn_before; ++ ++ rtx old_stack_level = 0; ++ int old_pending_adj; ++ int old_inhibit_defer_pop = inhibit_defer_pop; ++ tree old_cleanups = cleanups_of_this_call; ++ rtx use_insns; ++ ++ register tree p; ++ register int i; ++ ++ /* See if we can find a DECL-node for the actual function. ++ As a result, decide whether this is a call to an integrable function. */ ++ ++ p = TREE_OPERAND (exp, 0); ++ if (TREE_CODE (p) == ADDR_EXPR) ++ { ++ fndecl = TREE_OPERAND (p, 0); ++ if (TREE_CODE (fndecl) != FUNCTION_DECL) ++ fndecl = 0; ++ else ++ { ++ extern tree current_function_decl; ++ ++ if (fndecl != current_function_decl ++ && DECL_SAVED_INSNS (fndecl)) ++ is_integrable = 1; ++ else ++ { ++ /* In case this function later becomes inlineable, ++ record that there was already a non-inline call to it. */ ++ mark_addressable (fndecl); ++ } ++ ++ if (TREE_READONLY (fndecl) && ! TREE_THIS_VOLATILE (fndecl)) ++ is_const = 1; ++ } ++ } ++ ++ /* When calling a const function, we must pop the stack args right away, ++ so that the pop is deleted or moved with the call. */ ++ if (is_const) ++ NO_DEFER_POP; ++ ++ /* Set up a place to return a structure. */ ++ ++ /* Cater to broken compilers. */ ++ if (aggregate_value_p (exp)) ++ { ++ /* This call returns a big structure. */ ++#ifdef PCC_STATIC_STRUCT_RETURN ++ if (flag_pcc_struct_return) ++ { ++ pcc_struct_value = 1; ++ is_integrable = 0; /* Easier than making that case work right. */ ++ /* Make the called function be compiled separately. */ ++ mark_addressable (fndecl); ++ } ++ else ++#endif ++ { ++ if (target && GET_CODE (target) == MEM) ++ { ++ structure_value_addr = XEXP (target, 0); ++ if (reg_mentioned_p (stack_pointer_rtx, structure_value_addr)) ++ structure_value_addr = copy_to_reg (structure_value_addr); ++ } ++ else ++ { ++ push_structure_value (&saved_structure_value_addr, ++ &saved_structure_value_size); ++ /* Make room on the stack to hold the value. */ ++ structure_value_addr ++ = get_structure_value_addr (expr_size (exp)); ++ target = 0; ++ } ++ } ++ } ++ ++ /* If called function is inline, try to integrate it. */ ++ ++ if (is_integrable) ++ { ++ extern rtx expand_inline_function (); ++ rtx temp; ++ ++ temp = expand_inline_function (fndecl, actparms, target, ++ ignore, TREE_TYPE (exp), ++ structure_value_addr); ++ ++ /* If inlining succeeded, return. */ ++ if ((int) temp != -1) ++ return temp; ++ ++ /* If inlining failed, mark FNDECL as needing to be compiled ++ separately after all. */ ++ TREE_ADDRESSABLE (fndecl) = 1; ++ TREE_ADDRESSABLE (DECL_NAME (fndecl)) = 1; ++ } ++ ++#if 0 ++ /* Unless it's a call to a specific function that isn't alloca, ++ if it has one argument, we must assume it might be alloca. */ ++ ++ may_be_alloca = ++ (!(fndecl != 0 ++ && strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), ++ "alloca")) ++ && actparms != 0 ++ && TREE_CHAIN (actparms) == 0); ++#else ++ /* We assume that alloca will always be called by name. It ++ makes no sense to pass it as a pointer-to-function to ++ anything that does not understand its behavior. */ ++ may_be_alloca = ++ (fndecl && (! strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "alloca") ++ || ! strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), ++ "__builtin_alloca"))); ++#endif ++ ++ /* See if this is a call to a function that can return more than once. */ ++ ++ is_setjmp ++ = (fndecl != 0 ++ && (!strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "setjmp") ++ || !strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "_setjmp") ++ || !strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "sigsetjmp") ++ || !strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "vfork"))); ++ ++ is_builtin_new ++ = (fndecl != 0 ++ && (!strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "__builtin_new"))); ++ ++ if (may_be_alloca) ++ { ++ frame_pointer_needed = 1; ++ may_call_alloca = 1; ++ current_function_calls_alloca = 1; ++ } ++ ++ /* Don't let pending stack adjusts add up to too much. ++ Also, do all pending adjustments now ++ if there is any chance this might be a call to alloca ++ or if it is const. */ ++ ++ if (pending_stack_adjust >= 32 || is_const ++ || (pending_stack_adjust > 0 && may_be_alloca)) ++ do_pending_stack_adjust (); ++ ++ /* Operand 0 is a pointer-to-function; get the type of the function. */ ++ funtype = TREE_TYPE (TREE_OPERAND (exp, 0)); ++ if (TREE_CODE (funtype) != POINTER_TYPE) ++ abort (); ++ funtype = TREE_TYPE (funtype); ++ ++ /* If structure_value_addr is set, it means pass the address ++ as if it were an extra parameter. We typically avoid doing ++ so here, which would imply that the caller has to pop it off ++ the stack; but some compilers do expect caller pop. */ ++ if (structure_value_addr ++#ifdef STRUCT_RETURN_CALLER_POP ++ && flag_pcc_struct_return ++#else ++ && struct_value_rtx == 0 ++#endif ++ ) ++ { ++ rtx tem; ++ ++ INIT_CUMULATIVE_ARGS (args_so_far, funtype); ++ tem = FUNCTION_ARG (args_so_far, Pmode, ++ build_pointer_type (TREE_TYPE (funtype)), 1); ++ if (tem == 0) ++ { ++ actparms = tree_cons (error_mark_node, ++ build (SAVE_EXPR, ++ type_for_size (GET_MODE_BITSIZE (Pmode), 0), ++ 0, ++ force_reg (Pmode, structure_value_addr)), ++ actparms); ++ structure_value_addr_parm = 1; ++ } ++#ifdef STRUCT_RETURN_CALLER_POP ++ /* Moved in 1.39 from before the preceding open-brace. ++ Should be safe without the conditional because, ++ if STRUCT_RETURN_CALLER_POP is not defined, ++ this can still happen only if struct_value_rtx is 0, ++ and in that case, we would crash anyway if this weren't done. */ ++ structure_value_addr_parm = 1; ++#endif ++ } ++ ++ /* Count the arguments and set NUM_ACTUALS. */ ++ for (p = actparms, i = 0; p; p = TREE_CHAIN (p)) i++; ++ num_actuals = i; ++ ++ /* Compute number of named args. ++ Don't include the last named arg if anonymous args follow. ++ (If no anonymous args follow, the result of list_length ++ is actually one too large.) */ ++ if (TYPE_ARG_TYPES (funtype) != 0) ++ n_named_args = list_length (TYPE_ARG_TYPES (funtype)) - 1; ++ else ++ /* If we know nothing, treat all args as named. */ ++ n_named_args = num_actuals; ++ ++ /* Make a vector to hold all the information about each arg. */ ++ args = (struct arg_data *) alloca (num_actuals * sizeof (struct arg_data)); ++ bzero (args, num_actuals * sizeof (struct arg_data)); ++ ++ args_size.constant = 0; ++ args_size.var = 0; ++#ifdef FIRST_PARM_CALLER_OFFSET ++ args_size.constant = FIRST_PARM_CALLER_OFFSET (funtype); ++ stack_count_regparms = 1; ++#endif ++ starting_args_size = args_size.constant; ++ ++ /* In this loop, we consider args in the order they are written. ++ We fill up ARGS from the front of from the back if necessary ++ so that in any case the first arg to be pushed ends up at the front. */ ++ ++#ifdef PUSH_ARGS_REVERSED ++ i = num_actuals - 1, inc = -1; ++ /* In this case, must reverse order of args ++ so that we compute and push the last arg first. */ ++#else ++ i = 0, inc = 1; ++#endif ++ ++ INIT_CUMULATIVE_ARGS (args_so_far, funtype); ++ ++ /* I counts args in order (to be) pushed; ARGPOS counts in order written. */ ++ for (p = actparms, argpos = 0; p; p = TREE_CHAIN (p), i += inc, argpos++) ++ { ++ tree type = TREE_TYPE (TREE_VALUE (p)); ++ args[i].tree_value = TREE_VALUE (p); ++ args[i].offset = args_size; ++ ++ if (type == error_mark_node ++ || TYPE_SIZE (type) == 0) ++ continue; ++ ++ /* Decide where to pass this arg. */ ++ /* args[i].reg is nonzero if all or part is passed in registers. ++ args[i].partial is nonzero if part but not all is passed in registers, ++ and the exact value says how many words are passed in registers. */ ++ ++ if (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST ++ && args_size.var == 0 ++ /* error_mark_node here is a flag for the fake argument ++ for a structure value address. */ ++ && TREE_PURPOSE (p) != error_mark_node) ++ { ++ args[i].reg = FUNCTION_ARG (args_so_far, TYPE_MODE (type), type, ++ argpos < n_named_args); ++ /* If this argument needs more than the usual parm alignment, do ++ extrinsic padding to reach that alignment. */ ++ ++#ifdef MAX_PARM_BOUNDARY ++ /* If MAX_PARM_BOUNDARY is not defined, it means that the usual ++ alignment requirements are relaxed for parms, and that no parm ++ needs more than PARM_BOUNDARY, regardless of data type. */ ++ ++ if (PARM_BOUNDARY < TYPE_ALIGN (type)) ++ { ++ int boundary = PARM_BOUNDARY; ++ ++ /* Determine the boundary to pad up to. */ ++ if (TYPE_ALIGN (type) > boundary) ++ boundary = TYPE_ALIGN (type); ++ if (boundary > MAX_PARM_BOUNDARY) ++ boundary = MAX_PARM_BOUNDARY; ++ ++ /* If the previous args don't reach such a boundary, ++ advance to the next one. */ ++ boundary /= BITS_PER_UNIT; ++ args[i].offset.constant += boundary - 1; ++ args[i].offset.constant &= ~(boundary - 1); ++ args_size.constant += boundary - 1; ++ args_size.constant &= ~(boundary - 1); ++ ++ if (args_size.var != 0) ++ abort (); /* This case not implemented yet */ ++ } ++#endif /* MAX_PARM_BOUNDARY */ ++ ++#ifdef FUNCTION_ARG_PARTIAL_NREGS ++ args[i].partial ++ = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, ++ TYPE_MODE (type), type, ++ argpos < n_named_args); ++#endif ++ } ++ ++ /* Compute the stack-size of this argument. */ ++ ++ if (args[i].reg != 0 && args[i].partial == 0 ++ && ! stack_count_regparms) ++ /* On most machines, don't count stack space for a register arg. */ ++ ; ++ else if (TYPE_MODE (type) != BLKmode) ++ { ++ register int size; ++ ++ /* If we are counting "up to zero" and find a stack parm ++ before we reach zero, skip up to zero. ++ Negative offsets correspond to registers. */ ++ if (stack_count_regparms && args_size.constant < 0 ++ /* This used to check args[i].partial != 0, ++ but on the Sparc now that seems to be 0. */ ++ && args[i].reg == 0) ++ { ++ args_size.constant = 0; ++ args[i].offset.constant = 0; ++ } ++ size = GET_MODE_SIZE (TYPE_MODE (type)); ++ /* Compute how much space the push instruction will push. ++ On many machines, pushing a byte will advance the stack ++ pointer by a halfword. */ ++#ifdef PUSH_ROUNDING ++ size = PUSH_ROUNDING (size); ++#endif ++ /* Compute how much space the argument should get: ++ maybe pad to a multiple of the alignment for arguments. */ ++ if (none == FUNCTION_ARG_PADDING (TYPE_MODE (type), const0_rtx)) ++ args[i].size.constant = size; ++ else ++ args[i].size.constant ++ = (((size + PARM_BOUNDARY / BITS_PER_UNIT - 1) ++ / (PARM_BOUNDARY / BITS_PER_UNIT)) ++ * (PARM_BOUNDARY / BITS_PER_UNIT)); ++ } ++ else ++ { ++ register tree size = size_in_bytes (type); ++ ++ /* If we are counting "up to zero" and find a stack parm ++ before we reach zero, skip up to zero. ++ Negative offsets correspond to registers. */ ++ if (stack_count_regparms && args_size.constant < 0 ++ /* This used to check args[i].partial != 0, ++ but on the Sparc now that seems to be 0. */ ++ && args[i].reg == 0) ++ { ++ args_size.constant = 0; ++ args[i].offset.constant = 0; ++ } ++ ++ /* A nonscalar. Round its size up to a multiple ++ of PARM_BOUNDARY bits, unless it is not supposed to be padded. */ ++ if (none ++ != FUNCTION_ARG_PADDING (TYPE_MODE (type), ++ expand_expr (size, 0, VOIDmode, 0))) ++ size = convert_units (convert_units (size, BITS_PER_UNIT, ++ PARM_BOUNDARY), ++ PARM_BOUNDARY, BITS_PER_UNIT); ++ ADD_PARM_SIZE (args[i].size, size); ++ ++ /* Certain data types may not be passed in registers ++ (eg C++ classes with constructors). ++ Also, BLKmode parameters initialized from CALL_EXPRs ++ are treated specially, if it is a win to do so. */ ++ if (TREE_CODE (TREE_VALUE (p)) == CALL_EXPR ++ || TREE_ADDRESSABLE (type)) ++ { ++ if (TREE_ADDRESSABLE (type)) ++ BLKmode_parms_forced = 1; ++ /* This is a marker for such a parameter. */ ++ args[i].stack = const0_rtx; ++ BLKmode_parms_sizes += TREE_INT_CST_LOW (size); ++ ++ /* If this parm's location is "below" the nominal stack pointer, ++ note to decrement the stack pointer while it is computed. */ ++#ifdef FIRST_PARM_CALLER_OFFSET ++ if (BLKmode_parms_first_offset == 0) ++ BLKmode_parms_first_offset ++ /* If parameter's offset is variable, assume the worst. */ ++ = (args[i].offset.var ++ ? FIRST_PARM_CALLER_OFFSET (funtype) ++ : args[i].offset.constant); ++#endif ++ } ++ } ++ ++ /* If a part of the arg was put into registers, ++ don't include that part in the amount pushed. */ ++ if (! stack_count_regparms) ++ args[i].size.constant ++ -= ((args[i].partial * UNITS_PER_WORD) ++ / (PARM_BOUNDARY / BITS_PER_UNIT) ++ * (PARM_BOUNDARY / BITS_PER_UNIT)); ++ ++ /* Update ARGS_SIZE, the total stack space for args so far. */ ++ ++ args_size.constant += args[i].size.constant; ++ if (args[i].size.var) ++ { ++ ADD_PARM_SIZE (args_size, args[i].size.var); ++ } ++ ++ /* Increment ARGS_SO_FAR, which has info about which arg-registers ++ have been used, etc. */ ++ ++ FUNCTION_ARG_ADVANCE (args_so_far, TYPE_MODE (type), type, ++ argpos < n_named_args); ++ } ++ ++ /* If we would have to push a partially-in-regs parm ++ before other stack parms, preallocate stack space instead. */ ++ must_preallocate = 0; ++ { ++ int partial_seen = 0; ++ for (i = 0; i < num_actuals; i++) ++ { ++ if (args[i].partial > 0) ++ partial_seen = 1; ++ else if (partial_seen && args[i].reg == 0) ++ must_preallocate = 1; ++ } ++ } ++ ++ /* Precompute all register parameters. It isn't safe to compute anything ++ once we have started filling any specific hard regs. ++ If this function call is cse'able, precompute all the parameters. */ ++ ++ reg_parm_seen = 0; ++ for (i = 0; i < num_actuals; i++) ++ if (args[i].reg != 0 || is_const) ++ { ++ int j; ++ int struct_value_lossage = 0; ++ ++ /* First, see if this is a precomputed struct-returning function call ++ and other subsequent parms are also such. */ ++ if ((TYPE_MODE (TREE_TYPE (args[i].tree_value)) == BLKmode ++ || RETURN_IN_MEMORY (TREE_TYPE (args[i].tree_value))) ++ && TREE_CODE (args[i].tree_value) == CALL_EXPR) ++ for (j = i + 1; j < num_actuals; j++) ++ if ((TYPE_MODE (TREE_TYPE (args[j].tree_value)) == BLKmode ++ || RETURN_IN_MEMORY (TREE_TYPE (args[j].tree_value))) ++ && TREE_CODE (args[j].tree_value) == CALL_EXPR ++ && args[j].reg != 0 || is_const) ++ { ++ /* We have two precomputed structure-values call expressions ++ in our parm list. Both of them would normally use ++ the structure-value block. To avoid the conflict, ++ compute this parm with a different temporary block. */ ++ int size = int_size_in_bytes (TREE_TYPE (args[i].tree_value)); ++ rtx structval = assign_stack_local (BLKmode, size); ++ args[i].value = expand_expr (args[i].tree_value, structval, ++ VOIDmode, 0); ++ struct_value_lossage = 1; ++ break; ++ } ++ if (!struct_value_lossage) ++ args[i].value = expand_expr (args[i].tree_value, 0, VOIDmode, 0); ++ ++ if (args[i].reg != 0) ++ reg_parm_seen = 1; ++ ++ if (GET_CODE (args[i].value) != MEM ++ && ! CONSTANT_P (args[i].value) ++ && GET_CODE (args[i].value) != CONST_DOUBLE) ++ args[i].value ++ = force_reg (TYPE_MODE (TREE_TYPE (args[i].tree_value)), ++ args[i].value); ++ /* ANSI doesn't require a sequence point here, ++ but PCC has one, so this will avoid some problems. */ ++ emit_queue (); ++ } ++ ++ /* Get the function to call, in the form of RTL, if it is a constant. */ ++ if (fndecl && is_const) ++ { ++ /* Get a SYMBOL_REF rtx for the function address. */ ++ funexp = XEXP (DECL_RTL (fndecl), 0); ++ ++#ifndef NO_FUNCTION_CSE ++ /* Pass the address through a pseudoreg, if desired, ++ before the "beginning" of the library call. ++ So this insn isn't "part of" the library call, in case that ++ is deleted, or cse'd. */ ++ if (! flag_no_function_cse) ++ funexp = copy_to_mode_reg (Pmode, funexp); ++#endif ++ } ++ ++ /* Now we are about to start emitting insns that can be deleted ++ if the libcall is deleted. */ ++ insn_before = get_last_insn (); ++ ++ /* Maybe do additional rounding on the size of the arguments. */ ++#ifdef STACK_ARGS_ADJUST ++ STACK_ARGS_ADJUST (args_size); ++#endif ++ ++ /* If we have no actual push instructions, or shouldn't use them, ++ or we need a variable amount of space, make space for all args right now. ++ Round the needed size up to multiple of STACK_BOUNDARY. */ ++ ++ if (args_size.var != 0) ++ { ++ old_stack_level = copy_to_mode_reg (Pmode, stack_pointer_rtx); ++ old_pending_adj = pending_stack_adjust; ++ argblock = push_block (round_push (ARGS_SIZE_RTX (args_size)), 0); ++ } ++ else if (args_size.constant > 0) ++ { ++ int needed = args_size.constant; ++ ++#ifdef STACK_BOUNDARY ++ needed = (needed + STACK_BYTES - 1) / STACK_BYTES * STACK_BYTES; ++ stack_align = needed - args_size.constant; ++#endif ++ args_size.constant = needed; ++ ++ if ( ++#ifndef PUSH_ROUNDING ++ 1 /* Always preallocate if no push insns. */ ++#else ++ must_preallocate || BLKmode_parms_forced ++ || BLKmode_parms_sizes > (args_size.constant >> 1) ++#endif ++ ) ++ { ++ if (inhibit_defer_pop == 0) ++ { ++ /* Try to reuse some or all of the pending_stack_adjust ++ to get this space. Maybe we can avoid any pushing. */ ++ if (needed > pending_stack_adjust) ++ { ++ needed -= pending_stack_adjust; ++ pending_stack_adjust = 0; ++ } ++ else ++ { ++ pending_stack_adjust -= needed; ++ needed = 0; ++ } ++ } ++ argblock = push_block (gen_rtx (CONST_INT, VOIDmode, needed), 0); ++ } ++ } ++#ifndef PUSH_ROUNDING ++ else if (BLKmode_parms_forced ++#ifdef STACK_SPACE_FOR_CALLS ++ || stack_space_for_calls ++#endif ++ ) ++ { ++ /* If we have reg-parms that need to be temporarily on the stack, ++ set up an arg block address even though there is no space ++ to be allocated for it. */ ++ argblock = push_block (const0_rtx, 0); ++ } ++#endif ++ ++#if 0 ++ /* If stack needs padding below the args, increase all arg offsets ++ so the args are stored above the padding. */ ++ if (stack_padding) ++ for (i = 0; i < num_actuals; i++) ++ args[i].offset.constant += stack_padding; ++#endif ++ ++ /* Don't try to defer pops if preallocating, not even from the first arg, ++ since ARGBLOCK probably refers to the SP. */ ++ if (argblock) ++ NO_DEFER_POP; ++ ++#ifdef STACK_GROWS_DOWNWARD ++ /* If any BLKmode parms need to be preallocated in space ++ below the nominal stack-pointer address, we need to adjust the ++ stack pointer so that this location is temporarily above it. ++ This ensures that computation won't clobber that space. */ ++ if (BLKmode_parms_first_offset < 0 && argblock != 0) ++ { ++ int needed = -BLKmode_parms_first_offset; ++ argblock = copy_to_reg (argblock); ++ ++#ifdef STACK_BOUNDARY ++ needed = (needed + STACK_BYTES - 1) / STACK_BYTES * STACK_BYTES; ++#endif ++ protected_stack = gen_rtx (CONST_INT, VOIDmode, needed); ++ anti_adjust_stack (protected_stack); ++ } ++#endif /* STACK_GROWS_DOWNWARD */ ++ ++#ifdef PUSH_ARGS_REVERSED ++#ifdef STACK_BOUNDARY ++ /* If we push args individually in reverse order, perform stack alignment ++ before the first push (the last arg). */ ++ if (argblock == 0 && stack_align > 0) ++ anti_adjust_stack (gen_rtx (CONST_INT, VOIDmode, stack_align)); ++#endif ++#endif ++ ++ /* Get the function to call, in the form of RTL. */ ++ if (fndecl) ++ /* Get a SYMBOL_REF rtx for the function address. */ ++ funexp = XEXP (DECL_RTL (fndecl), 0); ++ else ++ /* Generate an rtx (probably a pseudo-register) for the address. */ ++ { ++ funexp = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0); ++ emit_queue (); ++ } ++ ++ /* Now compute and store all non-register parms. ++ These come before register parms, since they can require block-moves, ++ which could clobber the registers used for register parms. ++ Parms which have partial registers are not stored here, ++ but we do preallocate space here if they want that. */ ++ ++ for (i = 0; i < num_actuals; i++) ++ { ++ /* Preallocate the stack space for a parm if appropriate ++ so it can be computed directly in the stack space. */ ++ if (args[i].stack != 0 && argblock != 0) ++ args[i].stack = target_for_arg (TREE_TYPE (args[i].tree_value), ++ ARGS_SIZE_RTX (args[i].size), ++ argblock, args[i].offset); ++ else ++ args[i].stack = 0; ++ ++ if (args[i].reg == 0 ++ && TYPE_SIZE (TREE_TYPE (args[i].tree_value)) != 0) ++ store_one_arg (&args[i], argblock, may_be_alloca); ++ } ++ ++ /* Now store any partially-in-registers parm. ++ This is the last place a block-move can happen. */ ++ if (reg_parm_seen) ++ for (i = 0; i < num_actuals; i++) ++ if (args[i].partial != 0) ++ store_one_arg (&args[i], argblock, may_be_alloca); ++ ++ if (protected_stack != 0) ++ adjust_stack (protected_stack); ++ ++#ifndef PUSH_ARGS_REVERSED ++#ifdef STACK_BOUNDARY ++ /* If we pushed args in forward order, perform stack alignment ++ after pushing the last arg. */ ++ if (argblock == 0 && stack_align > 0) ++ anti_adjust_stack (gen_rtx (CONST_INT, VOIDmode, stack_align)); ++#endif ++#endif ++ ++ /* If the function will be returning a structure, and if the address in ++ which to return the value isn't being passed as a parameter, pass it ++ now. This may result in a register move or in a push; if it's a push, ++ we count on the called routine to pop it. */ ++ if (structure_value_addr && ! structure_value_addr_parm) ++ emit_move_insn (struct_value_rtx, ++ force_reg (Pmode, force_operand (structure_value_addr, 0))); ++ ++ /* Now set up any wholly-register parms. They were computed already. */ ++ if (reg_parm_seen) ++ for (i = 0; i < num_actuals; i++) ++ if (args[i].reg != 0 && args[i].partial == 0) ++ store_one_arg (&args[i], argblock, may_be_alloca); ++ ++ /* Perform postincrements before actually calling the function. */ ++ emit_queue (); ++ ++ /* All arguments and registers used for the call must be set up by now! */ ++ ++ /* ??? Other languages need a nontrivial second argument (static chain). */ ++ funexp = prepare_call_address (funexp, 0); ++ ++ /* Mark all register-parms as living through the call. */ ++ start_sequence (); ++ for (i = 0; i < num_actuals; i++) ++ if (args[i].reg != 0) ++ { ++ if (args[i].partial > 0) ++ use_regs (REGNO (args[i].reg), args[i].partial); ++ else if (GET_MODE (args[i].reg) == BLKmode) ++ use_regs (REGNO (args[i].reg), ++ ((int_size_in_bytes (TREE_TYPE (args[i].tree_value)) ++ + UNITS_PER_WORD - 1) ++ / UNITS_PER_WORD)); ++ else ++ emit_insn (gen_rtx (USE, VOIDmode, args[i].reg)); ++ } ++ ++ if (structure_value_addr && ! structure_value_addr_parm ++ && GET_CODE (struct_value_rtx) == REG) ++ emit_insn (gen_rtx (USE, VOIDmode, struct_value_rtx)); ++ ++ use_insns = gen_sequence (); ++ end_sequence (); ++ ++ /* Figure out the register where the value, if any, will come back. */ ++ valreg = 0; ++ if (TYPE_MODE (TREE_TYPE (exp)) != VOIDmode ++ && ! structure_value_addr) ++ { ++ if (pcc_struct_value) ++ valreg = hard_libcall_value (Pmode); ++ else ++ valreg = hard_function_value (TREE_TYPE (exp), fndecl); ++ } ++ ++ /* Generate the actual call instruction. */ ++ /* This also has the effect of turning off any pop-inhibition ++ done in expand_call. */ ++ if (args_size.constant < 0) ++ args_size.constant = 0; ++ emit_call_1 (funexp, funtype, args_size.constant, ++ FUNCTION_ARG (args_so_far, VOIDmode, void_type_node, 1), ++ valreg, old_inhibit_defer_pop, use_insns); ++ ++/* ??? Nothing has been done here to record control flow ++ when contained functions can do nonlocal gotos. */ ++ ++ /* For calls to `setjmp', etc., inform flow.c it should complain ++ if nonvolatile values are live. */ ++ ++ if (is_setjmp) ++ { ++ emit_note (IDENTIFIER_POINTER (DECL_NAME (fndecl)), NOTE_INSN_SETJMP); ++ current_function_calls_setjmp = 1; ++ } ++ ++ /* Notice functions that cannot return. ++ If optimizing, insns emitted below will be dead. ++ If not optimizing, they will exist, which is useful ++ if the user uses the `return' command in the debugger. */ ++ ++ if (fndecl && TREE_THIS_VOLATILE (fndecl)) ++ emit_barrier (); ++ ++ /* If this call is to be cse'd, then make sure it balances the stack. */ ++ if (is_const) ++ do_pending_stack_adjust (); ++ ++ /* For calls to __builtin_new, note that it can never return 0. ++ This is because a new handler will be called, and 0 it not ++ among the numbers it is supposed to return. */ ++#if 0 ++ if (is_builtin_new) ++ emit_note (IDENTIFIER_POINTER (DECL_NAME (fndecl)), NOTE_INSN_BUILTIN_NEW); ++#endif ++ ++ /* If value type not void, return an rtx for the value. */ ++ ++ /* If there are cleanups to be called, don't use a hard reg as target. */ ++ if (cleanups_of_this_call != old_cleanups ++ && target && REG_P (target) ++ && REGNO (target) < FIRST_PSEUDO_REGISTER) ++ target = 0; ++ ++ result_copy_insn = 0; ++ ++ if (TYPE_MODE (TREE_TYPE (exp)) == VOIDmode ++ || ignore) ++ { ++ target = const0_rtx; ++ } ++ else if (structure_value_addr) ++ { ++ if (target == 0 || GET_CODE (target) != MEM) ++ target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)), ++ memory_address (BLKmode, structure_value_addr)); ++ } ++ else if (pcc_struct_value) ++ { ++ valreg = hard_function_value (build_pointer_type (TREE_TYPE (exp)), ++ fndecl); ++ if (target == 0) ++ target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)), ++ copy_to_reg (valreg)); ++ else if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode) ++ result_copy_insn ++ = emit_move_insn (target, gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)), ++ copy_to_reg (valreg))); ++ else ++ emit_block_move (target, gen_rtx (MEM, BLKmode, copy_to_reg (valreg)), ++ expr_size (exp), ++ TYPE_ALIGN (TREE_TYPE (exp)) / BITS_PER_UNIT); ++ } ++ else if (target && GET_MODE (target) == TYPE_MODE (TREE_TYPE (exp))) ++ { ++ if (GET_CODE (target) != REG && !cse_not_expected) ++ result_copy_insn = emit_move_insn (target, copy_to_reg (valreg)); ++ else if (!rtx_equal_p (target, valreg)) ++ result_copy_insn = emit_move_insn (target, valreg); ++ else ++ /* This tells expand_inline_function to copy valreg to its target. */ ++ emit_insn (gen_rtx (USE, VOIDmode, valreg)); ++ } ++ else ++ { ++ target = copy_to_reg (valreg); ++ result_copy_insn = get_last_insn (); ++ } ++ ++ /* Perform all cleanups needed for the arguments of this call ++ (i.e. destructors in C++). */ ++ while (cleanups_of_this_call != old_cleanups) ++ { ++ expand_expr (TREE_VALUE (cleanups_of_this_call), 0, VOIDmode, 0); ++ cleanups_of_this_call = TREE_CHAIN (cleanups_of_this_call); ++ } ++ ++ /* If we pushed this, pop it. */ ++ if (saved_structure_value_addr != 0) ++ pop_structure_value (saved_structure_value_addr, ++ saved_structure_value_size); ++ ++ /* If size of args is variable, restore saved stack-pointer value. */ ++ ++ if (old_stack_level) ++ { ++ emit_move_insn (stack_pointer_rtx, old_stack_level); ++ pending_stack_adjust = old_pending_adj; ++ } ++ ++ /* If call is cse'able, make appropriate pair of reg-notes around it. */ ++ if (is_const) ++ { ++ rtx insn_first = NEXT_INSN (insn_before); ++ rtx insn_last = get_last_insn (); ++ rtx note = 0; ++ ++ /* Don't put the notes on if we don't have insns that can hold them. */ ++ if ((GET_CODE (insn_first) == INSN ++ || GET_CODE (insn_first) == CALL_INSN ++ || GET_CODE (insn_first) == JUMP_INSN) ++ && (GET_CODE (insn_last) == INSN ++ || GET_CODE (insn_last) == CALL_INSN ++ || GET_CODE (insn_last) == JUMP_INSN) ++ && insn_last == result_copy_insn) ++ { ++ /* Construct an "equal form" for the value ++ which mentions all the arguments in order ++ as well as the function name. */ ++ for (i = 0; i < num_actuals; i++) ++ if (args[i].reg != 0 || is_const) ++ note = gen_rtx (EXPR_LIST, VOIDmode, args[i].value, note); ++ note = gen_rtx (EXPR_LIST, VOIDmode, ++ XEXP (DECL_RTL (fndecl), 0), note); ++ ++ REG_NOTES (insn_last) ++ = gen_rtx (EXPR_LIST, REG_EQUAL, note, ++ gen_rtx (INSN_LIST, REG_RETVAL, insn_first, ++ REG_NOTES (insn_last))); ++ REG_NOTES (insn_first) ++ = gen_rtx (INSN_LIST, REG_LIBCALL, insn_last, ++ REG_NOTES (insn_first)); ++ } ++ } ++ ++ return target; ++} ++ ++/* Return an rtx which represents a suitable home on the stack ++ given TYPE, the type of the argument looking for a home. ++ This is called only for BLKmode arguments. ++ ++ SIZE is the size needed for this target. ++ ARGS_ADDR is the address of the bottom of the argument block for this call. ++ OFFSET describes this parameter's offset into ARGS_ADDR. It is meaningless ++ if this machine uses push insns. */ ++ ++static rtx ++target_for_arg (type, size, args_addr, offset) ++ tree type; ++ rtx size; ++ rtx args_addr; ++ struct args_size offset; ++{ ++ rtx target; ++ rtx offset_rtx = ARGS_SIZE_RTX (offset); ++ ++ /* We do not call memory_address if possible, ++ because we want to address as close to the stack ++ as possible. For non-variable sized arguments, ++ this will be stack-pointer relative addressing. */ ++ if (GET_CODE (offset_rtx) == CONST_INT) ++ target = plus_constant (args_addr, INTVAL (offset_rtx)); ++ else ++ { ++ /* I have no idea how to guarantee that this ++ will work in the presence of register parameters. */ ++ target = gen_rtx (PLUS, Pmode, args_addr, offset_rtx); ++ target = memory_address (QImode, target); ++ } ++ ++ return gen_rtx (MEM, BLKmode, target); ++} ++ ++/* Store a single argument for a function call ++ into the register or memory area where it must be passed. ++ *ARG describes the argument value and where to pass it. ++ ARGBLOCK is the address of the stack-block for all the arguments, ++ or 0 on a machine where arguemnts are pushed individually. ++ MAY_BE_ALLOCA nonzero says this could be a call to `alloca' ++ so must be careful about how the stack is used. */ ++ ++static void ++store_one_arg (arg, argblock, may_be_alloca) ++ struct arg_data *arg; ++ rtx argblock; ++ int may_be_alloca; ++{ ++ register tree pval = arg->tree_value; ++ int used = 0; ++ ++ if (TREE_CODE (pval) == ERROR_MARK) ++ return; ++ ++ if (arg->reg != 0 && arg->partial == 0) ++ { ++ /* Being passed entirely in a register. */ ++ if (arg->value != 0) ++ { ++ if (GET_MODE (arg->value) == BLKmode) ++ move_block_to_reg (REGNO (arg->reg), arg->value, ++ ((int_size_in_bytes (TREE_TYPE (pval)) ++ + UNITS_PER_WORD - 1) ++ / UNITS_PER_WORD), ++ TYPE_ALIGN (TREE_TYPE (pval))); ++ else ++ emit_move_insn (arg->reg, arg->value); ++ } ++ else ++ store_expr (pval, arg->reg, 0); ++ ++ /* Don't allow anything left on stack from computation ++ of argument to alloca. */ ++ if (may_be_alloca) ++ do_pending_stack_adjust (); ++ } ++ else if (TYPE_MODE (TREE_TYPE (pval)) != BLKmode) ++ { ++ register int size; ++ rtx tem; ++ ++ /* Argument is a scalar, not entirely passed in registers. ++ (If part is passed in registers, arg->partial says how much ++ and emit_push_insn will take care of putting it there.) ++ ++ Push it, and if its size is less than the ++ amount of space allocated to it, ++ also bump stack pointer by the additional space. ++ Note that in C the default argument promotions ++ will prevent such mismatches. */ ++ ++ size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (pval))); ++ /* Compute how much space the push instruction will push. ++ On many machines, pushing a byte will advance the stack ++ pointer by a halfword. */ ++#ifdef PUSH_ROUNDING ++ size = PUSH_ROUNDING (size); ++#endif ++ used = size; ++ ++ /* Compute how much space the argument should get: ++ round up to a multiple of the alignment for arguments. */ ++ if (none != FUNCTION_ARG_PADDING (TYPE_MODE (TREE_TYPE (pval)), const0_rtx)) ++ used = (((size + PARM_BOUNDARY / BITS_PER_UNIT - 1) ++ / (PARM_BOUNDARY / BITS_PER_UNIT)) ++ * (PARM_BOUNDARY / BITS_PER_UNIT)); ++ ++ tem = arg->value; ++ if (tem == 0) ++ { ++ tem = expand_expr (pval, 0, VOIDmode, 0); ++ /* ANSI doesn't require a sequence point here, ++ but PCC has one, so this will avoid some problems. */ ++ emit_queue (); ++ } ++ ++ /* Don't allow anything left on stack from computation ++ of argument to alloca. */ ++ if (may_be_alloca) ++ do_pending_stack_adjust (); ++ ++ emit_push_insn (tem, TYPE_MODE (TREE_TYPE (pval)), 0, 0, ++ arg->partial, arg->reg, used - size, ++ argblock, ARGS_SIZE_RTX (arg->offset)); ++ } ++ else if (arg->stack != 0) ++ { ++ /* BLKmode parm, not entirely passed in registers, ++ and with space already allocated. */ ++ ++ tree sizetree = size_in_bytes (TREE_TYPE (pval)); ++ /* Round the size up to multiple of PARM_BOUNDARY bits. */ ++ tree s1 = convert_units (sizetree, BITS_PER_UNIT, PARM_BOUNDARY); ++ tree s2 = convert_units (s1, PARM_BOUNDARY, BITS_PER_UNIT); ++ ++ /* Find out if the parm needs padding, and whether above or below. */ ++ enum direction where_pad ++ = FUNCTION_ARG_PADDING (TYPE_MODE (TREE_TYPE (pval)), ++ expand_expr (sizetree, 0, VOIDmode, 0)); ++ ++ /* If it is padded below, adjust the stack address ++ upward over the padding. */ ++ ++ if (where_pad == downward) ++ { ++ rtx offset_rtx; ++ rtx address = XEXP (arg->stack, 0); ++ struct args_size stack_offset; ++ ++ stack_offset.constant = 0; ++ stack_offset.var = 0; ++ ++ /* Compute amount of padding. */ ++ ADD_PARM_SIZE (stack_offset, s2); ++ SUB_PARM_SIZE (stack_offset, sizetree); ++ offset_rtx = ARGS_SIZE_RTX (stack_offset); ++ ++ /* Adjust the address to store at. */ ++ if (GET_CODE (offset_rtx) == CONST_INT) ++ address = plus_constant (address, INTVAL (offset_rtx)); ++ else ++ { ++ address = gen_rtx (PLUS, Pmode, address, offset_rtx); ++ address = memory_address (QImode, address); ++ } ++ arg->stack = change_address (arg->stack, VOIDmode, address); ++ } ++ ++ /* ARG->stack probably refers to the stack-pointer. If so, ++ stabilize it, in case stack-pointer changes during evaluation. */ ++ if (reg_mentioned_p (stack_pointer_rtx, arg->stack)) ++ arg->stack = change_address (arg->stack, VOIDmode, ++ copy_to_reg (XEXP (arg->stack, 0))); ++ /* BLKmode argument that should go in a prespecified stack location. */ ++ if (arg->value == 0) ++ /* Not yet computed => compute it there. */ ++ /* ??? This should be changed to tell expand_expr ++ that it can store directly in the target. */ ++ arg->value = store_expr (arg->tree_value, arg->stack, 0); ++ else if (arg->value != arg->stack) ++ /* It was computed somewhere, but not where we wanted. ++ For example, the value may have come from an official ++ local variable or parameter. In that case, expand_expr ++ does not fill our suggested target. */ ++ emit_block_move (arg->stack, arg->value, ARGS_SIZE_RTX (arg->size), ++ TYPE_ALIGN (TREE_TYPE (pval)) / BITS_PER_UNIT); ++ ++ /* Now, if this value wanted to be partly in registers, ++ move the value from the stack to the registers ++ that are supposed to hold the values. */ ++ if (arg->partial > 0) ++ move_block_to_reg (REGNO (arg->reg), arg->stack, arg->partial, ++ TYPE_ALIGN (TREE_TYPE (pval))); ++ } ++ else ++ { ++ /* BLKmode, at least partly to be pushed. */ ++ ++ register rtx tem ++ = arg->value ? arg->value : expand_expr (pval, 0, VOIDmode, 0); ++ register int excess; ++ rtx size_rtx; ++ ++ /* Pushing a nonscalar. ++ If part is passed in registers, arg->partial says how much ++ and emit_push_insn will take care of putting it there. */ ++ ++ /* Round its size up to a multiple ++ of the allocation unit for arguments. */ ++ ++ if (arg->size.var != 0) ++ { ++ excess = 0; ++ size_rtx = ARGS_SIZE_RTX (arg->size); ++ } ++ else ++ { ++ register tree size = size_in_bytes (TREE_TYPE (pval)); ++ /* PUSH_ROUNDING has no effect on us, because ++ emit_push_insn for BLKmode is careful to avoid it. */ ++ excess = (arg->size.constant - TREE_INT_CST_LOW (size) ++ + arg->partial * UNITS_PER_WORD); ++ size_rtx = expand_expr (size, 0, VOIDmode, 0); ++ } ++ ++ if (arg->stack) ++ abort (); ++ ++ emit_push_insn (tem, TYPE_MODE (TREE_TYPE (pval)), size_rtx, ++ TYPE_ALIGN (TREE_TYPE (pval)) / BITS_PER_UNIT, ++ arg->partial, arg->reg, excess, argblock, ++ ARGS_SIZE_RTX (arg->offset)); ++ } ++ ++ /* Once we have pushed something, pops can't safely ++ be deferred during the rest of the arguments. */ ++ NO_DEFER_POP; ++} ++ ++/* Expand conditional expressions. */ ++ ++/* Generate code to evaluate EXP and jump to LABEL if the value is zero. ++ LABEL is an rtx of code CODE_LABEL, in this function and all the ++ functions here. */ ++ ++void ++jumpifnot (exp, label) ++ tree exp; ++ rtx label; ++{ ++ do_jump (exp, label, 0); ++} ++ ++/* Generate code to evaluate EXP and jump to LABEL if the value is nonzero. */ ++ ++void ++jumpif (exp, label) ++ tree exp; ++ rtx label; ++{ ++ do_jump (exp, 0, label); ++} ++ ++/* Generate code to evaluate EXP and jump to IF_FALSE_LABEL if ++ the result is zero, or IF_TRUE_LABEL if the result is one. ++ Either of IF_FALSE_LABEL and IF_TRUE_LABEL may be zero, ++ meaning fall through in that case. ++ ++ This function is responsible for optimizing cases such as ++ &&, || and comparison operators in EXP. */ ++ ++void ++do_jump (exp, if_false_label, if_true_label) ++ tree exp; ++ rtx if_false_label, if_true_label; ++{ ++ register enum tree_code code = TREE_CODE (exp); ++ /* Some cases need to create a label to jump to ++ in order to properly fall through. ++ These cases set DROP_THROUGH_LABEL nonzero. */ ++ rtx drop_through_label = 0; ++ rtx temp; ++ rtx comparison = 0; ++ ++ emit_queue (); ++ ++ switch (code) ++ { ++ case ERROR_MARK: ++ break; ++ ++ case INTEGER_CST: ++ temp = integer_zerop (exp) ? if_false_label : if_true_label; ++ if (temp) ++ emit_jump (temp); ++ break; ++ ++ case ADDR_EXPR: ++ /* The address of something can never be zero. */ ++ if (if_true_label) ++ emit_jump (if_true_label); ++ break; ++ ++ case NOP_EXPR: ++ do_jump (TREE_OPERAND (exp, 0), if_false_label, if_true_label); ++ break; ++ ++ case TRUTH_NOT_EXPR: ++ do_jump (TREE_OPERAND (exp, 0), if_true_label, if_false_label); ++ break; ++ ++ case TRUTH_ANDIF_EXPR: ++ if (if_false_label == 0) ++ if_false_label = drop_through_label = gen_label_rtx (); ++ do_jump (TREE_OPERAND (exp, 0), if_false_label, 0); ++ do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); ++ break; ++ ++ case TRUTH_ORIF_EXPR: ++ if (if_true_label == 0) ++ if_true_label = drop_through_label = gen_label_rtx (); ++ do_jump (TREE_OPERAND (exp, 0), 0, if_true_label); ++ do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); ++ break; ++ ++ case COMPOUND_EXPR: ++ expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0); ++ emit_queue (); ++ do_jump (TREE_OPERAND (exp, 1), if_false_label, if_true_label); ++ break; ++ ++ case COND_EXPR: ++ { ++ register rtx label1 = gen_label_rtx (); ++ drop_through_label = gen_label_rtx (); ++ do_jump (TREE_OPERAND (exp, 0), label1, 0); ++ /* Now the THEN-expression. */ ++ do_jump (TREE_OPERAND (exp, 1), ++ if_false_label ? if_false_label : drop_through_label, ++ if_true_label ? if_true_label : drop_through_label); ++ emit_label (label1); ++ /* Now the ELSE-expression. */ ++ do_jump (TREE_OPERAND (exp, 2), ++ if_false_label ? if_false_label : drop_through_label, ++ if_true_label ? if_true_label : drop_through_label); ++ } ++ break; ++ ++ case EQ_EXPR: ++ comparison = compare (exp, EQ, EQ, EQ, EQ); ++ break; ++ ++ case NE_EXPR: ++ comparison = compare (exp, NE, NE, NE, NE); ++ break; ++ ++ case LT_EXPR: ++ comparison = compare (exp, LT, LTU, GT, GTU); ++ break; ++ ++ case LE_EXPR: ++ comparison = compare (exp, LE, LEU, GE, GEU); ++ break; ++ ++ case GT_EXPR: ++ comparison = compare (exp, GT, GTU, LT, LTU); ++ break; ++ ++ case GE_EXPR: ++ comparison = compare (exp, GE, GEU, LE, LEU); ++ break; ++ ++ default: ++ temp = expand_expr (exp, 0, VOIDmode, 0); ++ /* Copy to register to avoid generating bad insns by cse ++ from (set (mem ...) (arithop)) (set (cc0) (mem ...)). */ ++ if (!cse_not_expected && GET_CODE (temp) == MEM) ++ temp = copy_to_reg (temp); ++ do_pending_stack_adjust (); ++ { ++ rtx zero = CONST0_RTX (GET_MODE (temp)); ++ ++ if (GET_CODE (temp) == CONST_INT) ++ comparison = compare_constants (NE, 0, ++ INTVAL (temp), 0, BITS_PER_WORD); ++ else if (GET_MODE (temp) != VOIDmode) ++ comparison = compare1 (temp, zero, NE, NE, 0, GET_MODE (temp)); ++ else ++ abort (); ++ } ++ } ++ ++ /* Do any postincrements in the expression that was tested. */ ++ emit_queue (); ++ ++ /* If COMPARISON is nonzero here, it is an rtx that can be substituted ++ straight into a conditional jump instruction as the jump condition. ++ Otherwise, all the work has been done already. */ ++ ++ if (comparison == const1_rtx) ++ { ++ if (if_true_label) ++ emit_jump (if_true_label); ++ } ++ else if (comparison == const0_rtx) ++ { ++ if (if_false_label) ++ emit_jump (if_false_label); ++ } ++ else if (comparison) ++ { ++ if (if_true_label) ++ { ++ if (bcc_gen_fctn[(int) GET_CODE (comparison)] != 0) ++ emit_jump_insn ((*bcc_gen_fctn[(int) GET_CODE (comparison)]) (if_true_label)); ++ else ++ abort (); ++ ++ if (if_false_label) ++ emit_jump (if_false_label); ++ } ++ else if (if_false_label) ++ { ++ rtx pat; ++ ++ if (bcc_gen_fctn[(int) GET_CODE (comparison)] == 0) ++ abort (); ++ ++ pat = (*bcc_gen_fctn[(int) GET_CODE (comparison)]) (if_false_label); ++ /* Now invert the sense of the jump by exchanging the two arms ++ of each IF_THEN_ELSE. Note that inverting the condition ++ would be incorrect for IEEE floating point with nans! */ ++ if (GET_CODE (pat) == SEQUENCE) ++ { ++ int i; ++ /* We can invert a sequence if the only jump is at the end. */ ++ for (i = 0; i < (int) (XVECLEN (pat, 0) - 1); i++) ++ if (GET_CODE (XVECEXP (pat, 0, i)) == JUMP_INSN) ++ abort (); ++ invert_exp (PATTERN (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1)), ++ 0, 0); ++ } ++ else ++ invert_exp (pat, 0, 0); ++ ++ emit_jump_insn (pat); ++ } ++ } ++ ++ if (drop_through_label) ++ emit_label (drop_through_label); ++} ++ ++/* Compare two integer constant rtx's, OP0 and OP1. ++ The comparison operation is OPERATION. ++ Return an rtx representing the value 1 or 0. ++ WIDTH is the width in bits that is significant. */ ++ ++static rtx ++compare_constants (operation, unsignedp, op0, op1, width) ++ enum rtx_code operation; ++ int unsignedp; ++ int op0, op1; ++ int width; ++{ ++ int val; ++ ++ /* Sign-extend or zero-extend the operands to a full word ++ from an initial width of WIDTH bits. */ ++ if (width < HOST_BITS_PER_INT) ++ { ++ op0 &= (1 << width) - 1; ++ op1 &= (1 << width) - 1; ++ ++ if (! unsignedp) ++ { ++ if (op0 & (1 << (width - 1))) ++ op0 |= ((-1) << width); ++ if (op1 & (1 << (width - 1))) ++ op1 |= ((-1) << width); ++ } ++ } ++ ++ switch (operation) ++ { ++ case EQ: ++ val = op0 == op1; ++ break; ++ ++ case NE: ++ val = op0 != op1; ++ break; ++ ++ case GT: ++ case GTU: ++ val = op0 > op1; ++ break; ++ ++ case LT: ++ case LTU: ++ val = op0 < op1; ++ break; ++ ++ case GE: ++ case GEU: ++ val = op0 >= op1; ++ break; ++ ++ case LE: ++ case LEU: ++ val = op0 <= op1; ++ } ++ ++ return val ? const1_rtx : const0_rtx; ++} ++ ++/* Generate code for a comparison expression EXP ++ (including code to compute the values to be compared) ++ and set (CC0) according to the result. ++ SIGNED_FORWARD should be the rtx operation for this comparison for ++ signed data; UNSIGNED_FORWARD, likewise for use if data is unsigned. ++ SIGNED_REVERSE and UNSIGNED_REVERSE are used if it is desirable ++ to interchange the operands for the compare instruction. ++ ++ We force a stack adjustment unless there are currently ++ things pushed on the stack that aren't yet used. */ ++ ++static rtx ++compare (exp, signed_forward, unsigned_forward, ++ signed_reverse, unsigned_reverse) ++ register tree exp; ++ enum rtx_code signed_forward, unsigned_forward; ++ enum rtx_code signed_reverse, unsigned_reverse; ++{ ++ ++ register rtx op0 = expand_expr (TREE_OPERAND (exp, 0), 0, VOIDmode, 0); ++ register rtx op1 = expand_expr (TREE_OPERAND (exp, 1), 0, VOIDmode, 0); ++ register enum machine_mode mode = GET_MODE (op0); ++ int unsignedp; ++ ++ /* If one operand is 0, make it the second one. */ ++ ++ if (op0 == const0_rtx ++ || (GET_MODE_CLASS (mode) == MODE_FLOAT && op0 == CONST0_RTX (mode))) ++ { ++ rtx tem = op0; ++ op0 = op1; ++ op1 = tem; ++ signed_forward = signed_reverse; ++ unsigned_forward = unsigned_reverse; ++ } ++ ++ if (flag_force_mem) ++ { ++ op0 = force_not_mem (op0); ++ op1 = force_not_mem (op1); ++ } ++ ++ do_pending_stack_adjust (); ++ ++ unsignedp = (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))) ++ || TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1)))); ++ ++ if (GET_CODE (op0) == CONST_INT && GET_CODE (op1) == CONST_INT) ++ return compare_constants (signed_forward, unsignedp, ++ INTVAL (op0), INTVAL (op1), ++ GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))))); ++ ++ emit_cmp_insn (op0, op1, ++ (mode == BLKmode) ? expr_size (TREE_OPERAND (exp, 0)) : 0, ++ unsignedp, ++ TYPE_ALIGN (TREE_TYPE (exp)) / BITS_PER_UNIT); ++ ++ return gen_rtx ((unsignedp ? unsigned_forward : signed_forward), ++ VOIDmode, cc0_rtx, const0_rtx); ++} ++ ++/* Like compare but expects the values to compare as two rtx's. ++ The decision as to signed or unsigned comparison must be made by the caller. ++ BLKmode is not allowed. */ ++ ++static rtx ++compare1 (op0, op1, forward_op, reverse_op, unsignedp, mode) ++ register rtx op0, op1; ++ enum rtx_code forward_op, reverse_op; ++ int unsignedp; ++ enum machine_mode mode; ++{ ++ /* If one operand is 0, make it the second one. */ ++ ++ if (op0 == const0_rtx ++ || (GET_MODE_CLASS (mode) == MODE_FLOAT && op0 == CONST0_RTX (mode))) ++ { ++ rtx tem = op0; ++ op0 = op1; ++ op1 = tem; ++ forward_op = reverse_op; ++ } ++ ++ if (flag_force_mem) ++ { ++ op0 = force_not_mem (op0); ++ op1 = force_not_mem (op1); ++ } ++ ++ do_pending_stack_adjust (); ++ ++ if (GET_CODE (op0) == CONST_INT && GET_CODE (op1) == CONST_INT) ++ return compare_constants (forward_op, unsignedp, ++ INTVAL (op0), INTVAL (op1), ++ GET_MODE_BITSIZE (mode)); ++ ++ emit_cmp_insn (op0, op1, 0, unsignedp, 0); ++ ++ return gen_rtx (forward_op, VOIDmode, cc0_rtx, const0_rtx); ++} ++ ++/* Generate code to calculate EXP using a store-flag instruction ++ and return an rtx for the result. ++ If TARGET is nonzero, store the result there if convenient. ++ ++ Return zero if there is no suitable set-flag instruction ++ available on this machine. */ ++ ++static rtx ++do_store_flag (exp, target, mode) ++ tree exp; ++ rtx target; ++ enum machine_mode mode; ++{ ++ register enum tree_code code = TREE_CODE (exp); ++ register rtx comparison = 0; ++ enum machine_mode compare_mode; ++ rtx prev_insn = get_last_insn (); ++ enum insn_code icode; ++ ++ switch (code) ++ { ++#ifdef HAVE_seq ++ case EQ_EXPR: ++ if (HAVE_seq) ++ { ++ comparison = compare (exp, EQ, EQ, EQ, EQ); ++ icode = CODE_FOR_seq; ++ compare_mode = insn_operand_mode[(int) CODE_FOR_seq][0]; ++ } ++ break; ++#endif ++ ++#ifdef HAVE_sne ++ case NE_EXPR: ++ if (HAVE_sne) ++ { ++ comparison = compare (exp, NE, NE, NE, NE); ++ icode = CODE_FOR_sne; ++ compare_mode = insn_operand_mode[(int) CODE_FOR_sne][0]; ++ } ++ break; ++#endif ++ ++#if defined (HAVE_slt) && defined (HAVE_sltu) && defined (HAVE_sgt) && defined (HAVE_sgtu) ++ case LT_EXPR: ++ if (HAVE_slt && HAVE_sltu && HAVE_sgt && HAVE_sgtu) ++ { ++ comparison = compare (exp, LT, LTU, GT, GTU); ++ icode = CODE_FOR_slt; ++ compare_mode = insn_operand_mode[(int) CODE_FOR_slt][0]; ++ } ++ break; ++ ++ case GT_EXPR: ++ if (HAVE_slt && HAVE_sltu && HAVE_sgt && HAVE_sgtu) ++ { ++ comparison = compare (exp, GT, GTU, LT, LTU); ++ icode = CODE_FOR_slt; ++ compare_mode = insn_operand_mode[(int) CODE_FOR_slt][0]; ++ } ++ break; ++#endif ++ ++#if defined (HAVE_sle) && defined (HAVE_sleu) && defined (HAVE_sge) && defined (HAVE_sgeu) ++ case LE_EXPR: ++ if (HAVE_sle && HAVE_sleu && HAVE_sge && HAVE_sgeu) ++ { ++ comparison = compare (exp, LE, LEU, GE, GEU); ++ icode = CODE_FOR_sle; ++ compare_mode = insn_operand_mode[(int) CODE_FOR_sle][0]; ++ } ++ break; ++ ++ case GE_EXPR: ++ if (HAVE_sle && HAVE_sleu && HAVE_sge && HAVE_sgeu) ++ { ++ comparison = compare (exp, GE, GEU, LE, LEU); ++ icode = CODE_FOR_sle; ++ compare_mode = insn_operand_mode[(int) CODE_FOR_sle][0]; ++ } ++ break; ++#endif ++ } ++ if (comparison == 0) ++ return 0; ++ ++ if (target == 0 || GET_MODE (target) != mode ++ /* Don't use specified target unless the insn can handle it. */ ++ || ! (*insn_operand_predicate[(int) icode][0]) (target, mode) ++ /* When modes don't match, don't use specified target, ++ because it might be the same as an operand, ++ and then the CLOBBER output below would screw up. */ ++ || (mode != compare_mode && GET_CODE (comparison) != CONST_INT)) ++ target = gen_reg_rtx (mode); ++ ++ /* Store the comparison in its proper mode. */ ++ if (GET_CODE (comparison) == CONST_INT) ++ emit_move_insn (target, comparison); ++ else if (GET_MODE (target) != compare_mode) ++ { ++ /* We want a different mode: store result in its natural mode. ++ Combine the mode conversion with the truncation we must do anyway. */ ++ /* Put a CLOBBER before the compare, so we don't come between ++ the compare and the insn that uses the result. */ ++ emit_insn_after (gen_rtx (CLOBBER, VOIDmode, target), prev_insn); ++ emit_insn ((*setcc_gen_fctn[(int) GET_CODE (comparison)]) ++ (gen_rtx (SUBREG, compare_mode, target, 0))); ++ /* If the desired mode is wider than what we got, ++ use an AND to convert it, but not if we will do one anyway. */ ++#if STORE_FLAG_VALUE == 1 ++ if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (compare_mode)) ++ expand_bit_and (mode, target, const1_rtx, target); ++#endif ++ } ++ else ++ emit_insn ((*setcc_gen_fctn[(int) GET_CODE (comparison)]) (target)); ++ ++#if STORE_FLAG_VALUE != 1 ++#if STORE_FLAG_VALUE & 1 ++ expand_bit_and (mode, target, const1_rtx, target); ++#else ++ expand_shift (RSHIFT_EXPR, mode, target, ++ build_int_2 (GET_MODE_BITSIZE (mode) - 1, 0), ++ target, TRUE); ++#endif ++#endif ++ return target; ++} ++ ++/* Generate a tablejump instruction (used for switch statements). */ ++ ++#ifdef HAVE_tablejump ++ ++/* INDEX is the value being switched on, with the lowest value ++ in the table already subtracted. ++ RANGE is the length of the jump table. ++ TABLE_LABEL is a CODE_LABEL rtx for the table itself. ++ ++ DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the ++ index value is out of range. */ ++ ++void ++do_tablejump (index, range, table_label, default_label) ++ rtx index, range, table_label, default_label; ++{ ++ register rtx temp; ++ ++ emit_cmp_insn (range, index, 0, 0, 0); ++ emit_jump_insn (gen_bltu (default_label)); ++ /* If flag_force_addr were to affect this address ++ it could interfere with the tricky assumptions made ++ about addresses that contain label-refs, ++ which may be valid only very near the tablejump itself. */ ++ index = memory_address_noforce ++ (CASE_VECTOR_MODE, ++ gen_rtx (PLUS, Pmode, ++ gen_rtx (MULT, Pmode, index, ++ gen_rtx (CONST_INT, VOIDmode, ++ GET_MODE_SIZE (CASE_VECTOR_MODE))), ++ gen_rtx (LABEL_REF, VOIDmode, table_label))); ++ temp = gen_reg_rtx (CASE_VECTOR_MODE); ++ convert_move (temp, gen_rtx (MEM, CASE_VECTOR_MODE, index), 0); ++ ++ emit_jump_insn (gen_tablejump (temp, table_label)); ++} ++ ++#endif /* HAVE_tablejump */ +diff -Naur alliance-5.0/genview/src/gcc-1.42/expr.h alliance/genview/src/gcc-1.42/expr.h +--- alliance-5.0/genview/src/gcc-1.42/expr.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/expr.h 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,409 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Definitions for code generation pass of GNU compiler. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* Macros to access the slots of a QUEUED rtx. ++ Here rather than in rtl.h because only the expansion pass ++ should ever encounter a QUEUED. */ ++ ++/* The variable for which an increment is queued. */ ++#define QUEUED_VAR(P) XEXP (P, 0) ++/* If the increment has been emitted, this is the insn ++ that does the increment. It is zero before the increment is emitted. */ ++#define QUEUED_INSN(P) XEXP (P, 1) ++/* If a pre-increment copy has been generated, this is the copy ++ (it is a temporary reg). Zero if no copy made yet. */ ++#define QUEUED_COPY(P) XEXP (P, 2) ++/* This is the body to use for the insn to do the increment. ++ It is used to emit the increment. */ ++#define QUEUED_BODY(P) XEXP (P, 3) ++/* Next QUEUED in the queue. */ ++#define QUEUED_NEXT(P) XEXP (P, 4) ++ ++/* This is the 4th arg to `expand_expr'. ++ EXPAND_SUM means it is ok to return a PLUS rtx or MULT rtx. ++ EXPND_CONST_ADDRESS means it is ok to return a MEM whose address ++ is a constant that is not a legitimate address. */ ++enum expand_modifier {EXPAND_NORMAL, EXPAND_SUM, EXPAND_CONST_ADDRESS}; ++ ++/* If this is nonzero, we do not bother generating VOLATILE ++ around volatile memory references, and we are willing to ++ output indirect addresses. If cse is to follow, we reject ++ indirect addresses so a useful potential cse is generated; ++ if it is used only once, instruction combination will produce ++ the same indirect address eventually. */ ++extern int cse_not_expected; ++ ++/* List (chain of EXPR_LISTs) of pseudo-regs of SAVE_EXPRs. ++ So we can mark them all live at the end of the function, if stupid. */ ++extern rtx save_expr_regs; ++ ++extern int current_function_calls_alloca; ++ ++/* This is the offset from the arg pointer to the place where the first ++ anonymous arg can be found, if there is one. */ ++extern rtx current_function_arg_offset_rtx; ++ ++/* Nonzero means stack pops must not be deferred, and deferred stack ++ pops must not be output. It is nonzero inside a function call, ++ inside a conditional expression, inside a statement expression, ++ and in other cases as well. */ ++extern int inhibit_defer_pop; ++ ++#define NO_DEFER_POP (inhibit_defer_pop += 1) ++#define OK_DEFER_POP (inhibit_defer_pop -= 1) ++ ++#ifdef TREE_CODE /* Don't lose if tree.h not included. */ ++/* Structure to record the size of a sequence of arguments ++ as the sum of a tree-expression and a constant. */ ++ ++struct args_size ++{ ++ int constant; ++ tree var; ++}; ++#endif ++ ++/* Add the value of the tree INC to the `struct args_size' TO. */ ++ ++#define ADD_PARM_SIZE(TO, INC) \ ++{ tree inc = (INC); \ ++ if (TREE_CODE (inc) == INTEGER_CST) \ ++ (TO).constant += TREE_INT_CST_LOW (inc); \ ++ else if ((TO).var == 0) \ ++ (TO).var = inc; \ ++ else \ ++ (TO).var = genop (PLUS_EXPR, (TO).var, inc); } ++ ++#define SUB_PARM_SIZE(TO, DEC) \ ++{ tree dec = (DEC); \ ++ if (TREE_CODE (dec) == INTEGER_CST) \ ++ (TO).constant -= TREE_INT_CST_LOW (dec); \ ++ else if ((TO).var == 0) \ ++ (TO).var = genop (MINUS_EXPR, integer_zero_node, dec); \ ++ else \ ++ (TO).var = genop (MINUS_EXPR, (TO).var, dec); } ++ ++/* Convert the implicit sum in a `struct args_size' into an rtx. */ ++#define ARGS_SIZE_RTX(SIZE) \ ++((SIZE).var == 0 ? gen_rtx (CONST_INT, VOIDmode, (SIZE).constant) \ ++ : plus_constant (expand_expr ((SIZE).var, 0, VOIDmode, 0), \ ++ (SIZE).constant)) ++ ++/* Supply a default definition for FUNCTION_ARG_PADDING: ++ usually pad upward, but pad short args downward on big-endian machines. */ ++ ++enum direction {none, upward, downward}; /* Value has this type. */ ++ ++#ifndef FUNCTION_ARG_PADDING ++#ifdef BYTES_BIG_ENDIAN ++#define FUNCTION_ARG_PADDING(mode, size) \ ++ (((mode) == BLKmode \ ++ ? (GET_CODE (size) == CONST_INT \ ++ && INTVAL (size) < PARM_BOUNDARY / BITS_PER_UNIT) \ ++ : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY) \ ++ ? downward : upward) ++#else ++#define FUNCTION_ARG_PADDING(mode, size) upward ++#endif ++#endif ++ ++/* Nonzero if type TYPE should be returned in memory ++ (even though its mode is not BLKmode). ++ Most machines can use the following default definition. */ ++ ++#ifndef RETURN_IN_MEMORY ++#define RETURN_IN_MEMORY(type) 0 ++#endif ++ ++/* Optabs are tables saying how to generate insn bodies ++ for various machine modes and numbers of operands. ++ Each optab applies to one operation. ++ For example, add_optab applies to addition. ++ ++ The insn_code slot is the enum insn_code that says how to ++ generate an insn for this operation on a particular machine mode. ++ It is CODE_FOR_nothing if there is no such insn on the target machine. ++ ++ The `lib_call' slot is the name of the library function that ++ can be used to perform the operation. ++ ++ A few optabs, such as move_optab and cmp_optab, are used ++ by special code. */ ++ ++/* Everything that uses expr.h needs to define enum insn_code ++ but we don't list it in the Makefile dependencies just for that. */ ++#include "insn-codes.h" ++ ++typedef struct optab ++{ ++ enum rtx_code code; ++ struct { ++ enum insn_code insn_code; ++ char *lib_call; ++ } handlers [NUM_MACHINE_MODES]; ++} * optab; ++ ++/* Given an enum insn_code, access the function to construct ++ the body of that kind of insn. */ ++#define GEN_FCN(CODE) (*insn_gen_function[(int) (CODE)]) ++extern rtx (*insn_gen_function[]) (); ++ ++extern optab add_optab; ++extern optab sub_optab; ++extern optab smul_optab; /* Signed multiply */ ++extern optab umul_optab; /* Unsigned multiply */ ++extern optab smul_widen_optab; /* Signed multiply with result ++ one machine mode wider than args */ ++extern optab umul_widen_optab; ++extern optab sdiv_optab; /* Signed divide */ ++extern optab sdivmod_optab; /* Signed divide-and-remainder in one */ ++extern optab udiv_optab; ++extern optab udivmod_optab; ++extern optab smod_optab; /* Signed remainder */ ++extern optab umod_optab; ++extern optab flodiv_optab; /* Optab for floating divide. */ ++extern optab ftrunc_optab; /* Convert float to integer in float fmt */ ++extern optab and_optab; /* Logical and */ ++extern optab andcb_optab; /* Logical and with complement of 2nd arg */ ++extern optab ior_optab; /* Logical or */ ++extern optab xor_optab; /* Logical xor */ ++extern optab ashl_optab; /* Arithmetic shift left */ ++extern optab ashr_optab; /* Arithmetic shift right */ ++extern optab lshl_optab; /* Logical shift left */ ++extern optab lshr_optab; /* Logical shift right */ ++extern optab rotl_optab; /* Rotate left */ ++extern optab rotr_optab; /* Rotate right */ ++ ++extern optab mov_optab; /* Move instruction. */ ++extern optab movstrict_optab; /* Move, preserving high part of register. */ ++ ++extern optab cmp_optab; /* Compare insn; two operands. */ ++extern optab tst_optab; /* tst insn; compare one operand against 0 */ ++ ++/* Unary operations */ ++extern optab neg_optab; /* Negation */ ++extern optab abs_optab; /* Abs value */ ++extern optab one_cmpl_optab; /* Bitwise not */ ++extern optab ffs_optab; /* Find first bit set */ ++ ++/* Passed to expand_binop and expand_unop to say which options to try to use ++ if the requested operation can't be open-coded on the requisite mode. ++ Either OPTAB_LIB or OPTAB_LIB_WIDEN says try using a library call. ++ Either OPTAB_WIDEN or OPTAB_LIB_WIDEN says try using a wider mode. ++ OPTAB_MUST_WIDEN says try widening and don't try anything else. */ ++ ++enum optab_methods ++{ ++ OPTAB_DIRECT, ++ OPTAB_LIB, ++ OPTAB_WIDEN, ++ OPTAB_LIB_WIDEN, ++ OPTAB_MUST_WIDEN ++}; ++ ++typedef rtx (*rtxfun) (); ++ ++/* Indexed by the rtx-code for a conditional (eg. EQ, LT,...) ++ gives the gen_function to make a branch to test that condition. */ ++ ++extern rtxfun bcc_gen_fctn[NUM_RTX_CODE]; ++ ++/* Indexed by the rtx-code for a conditional (eg. EQ, LT,...) ++ gives the gen_function to make a store-condition insn ++ to test that condition. */ ++ ++extern rtxfun setcc_gen_fctn[NUM_RTX_CODE]; ++ ++/* Expand a binary operation given optab and rtx operands. */ ++rtx expand_binop (); ++ ++/* Expand a binary operation with both signed and unsigned forms. */ ++rtx sign_expand_binop (); ++ ++/* Expand a unary arithmetic operation given optab rtx operand. */ ++rtx expand_unop (); ++ ++/* Arguments MODE, RTX: return an rtx for the negation of that value. ++ May emit insns. */ ++rtx negate_rtx (); ++ ++/* Initialize the tables that control conversion between fixed and ++ floating values. */ ++void init_fixtab (); ++void init_floattab (); ++ ++/* Generate code for a FIX_EXPR. */ ++void expand_fix (); ++ ++/* Generate code for a FLOAT_EXPR. */ ++void expand_float (); ++ ++/* Create but don't emit one rtl instruction to add one rtx into another. ++ Modes must match. ++ Likewise for subtraction and for just copying. ++ These do not call protect_from_queue; caller must do so. */ ++rtx gen_add2_insn (); ++rtx gen_sub2_insn (); ++rtx gen_move_insn (); ++ ++/* Emit one rtl instruction to store zero in specified rtx. */ ++void emit_clr_insn (); ++ ++/* Emit one rtl insn to store 1 in specified rtx assuming it contains 0. */ ++void emit_0_to_1_insn (); ++ ++/* Emit one rtl insn to compare two rtx's. */ ++void emit_cmp_insn (); ++ ++/* Emit some rtl insns to move data between rtx's, converting machine modes. ++ Both modes must be floating or both fixed. */ ++void convert_move (); ++ ++/* Convert an rtx to specified machine mode and return the result. */ ++rtx convert_to_mode (); ++ ++/* Emit code to push some arguments and call a library routine, ++ storing the value in a specified place. Calling sequence is ++ complicated. */ ++void emit_library_call (); ++ ++/* Given an rtx that may include add and multiply operations, ++ generate them as insns and return a pseudo-reg containing the value. ++ Useful after calling expand_expr with 1 as sum_ok. */ ++rtx force_operand (); ++ ++/* Return an rtx for the size in bytes of the value of an expr. */ ++rtx expr_size (); ++ ++/* Return an rtx for the sum of an rtx and an integer. */ ++rtx plus_constant (); ++ ++rtx lookup_static_chain (); ++ ++/* Return an rtx like arg but sans any constant terms. ++ Returns the original rtx if it has no constant terms. ++ The constant terms are added and stored via a second arg. */ ++rtx eliminate_constant_term (); ++ ++/* Convert arg to a valid memory address for specified machine mode, ++ by emitting insns to perform arithmetic if nec. */ ++rtx memory_address (); ++ ++/* Like `memory_address' but pretent `flag_force_addr' is 0. */ ++rtx memory_address_noforce (); ++ ++/* Return a memory reference like MEMREF, but with its mode changed ++ to MODE and its address changed to ADDR. ++ (VOIDmode means don't change the mode. ++ NULL for ADDR means don't change the address.) */ ++rtx change_address (); ++ ++/* Return 1 if two rtx's are equivalent in structure and elements. */ ++int rtx_equal_p (); ++ ++/* Given rtx, return new rtx whose address won't be affected by ++ any side effects. It has been copied to a new temporary reg. */ ++rtx stabilize (); ++ ++/* Given an rtx, copy all regs it refers to into new temps ++ and return a modified copy that refers to the new temps. */ ++rtx copy_all_regs (); ++ ++/* Copy given rtx to a new temp reg and return that. */ ++rtx copy_to_reg (); ++ ++/* Like copy_to_reg but always make the reg Pmode. */ ++rtx copy_addr_to_reg (); ++ ++/* Like copy_to_reg but always make the reg the specified mode MODE. */ ++rtx copy_to_mode_reg (); ++ ++/* Copy given rtx to given temp reg and return that. */ ++rtx copy_to_suggested_reg (); ++ ++/* Copy a value to a register if it isn't already a register. ++ Args are mode (in case value is a constant) and the value. */ ++rtx force_reg (); ++ ++/* Return given rtx, copied into a new temp reg if it was in memory. */ ++rtx force_not_mem (); ++ ++/* Remove some bytes from the stack. An rtx says how many. */ ++void adjust_stack (); ++ ++/* Add some bytes to the stack. An rtx says how many. */ ++void anti_adjust_stack (); ++ ++/* Emit code to copy function value to a new temp reg and return that reg. */ ++rtx function_value (); ++ ++/* Return an rtx that refers to the value returned by a function ++ in its original home. This becomes invalid if any more code is emitted. */ ++rtx hard_function_value (); ++ ++/* Return an rtx that refers to the value returned by a library call ++ in its original home. This becomes invalid if any more code is emitted. */ ++rtx hard_libcall_value (); ++ ++/* Emit code to copy function value to a specified place. */ ++void copy_function_value (); ++ ++/* Given an rtx, return an rtx for a value rounded up to a multiple ++ of STACK_BOUNDARY / BITS_PER_UNIT. */ ++rtx round_push (); ++ ++rtx store_bit_field (); ++rtx extract_bit_field (); ++rtx expand_shift (); ++rtx expand_bit_and (); ++rtx expand_mult (); ++rtx expand_divmod (); ++rtx expand_mult_add (); ++rtx get_structure_value_addr (); ++rtx expand_stmt_expr (); ++ ++void jumpifnot (); ++void jumpif (); ++void do_jump (); ++ ++rtx assemble_static_space (); +diff -Naur alliance-5.0/genview/src/gcc-1.42/final.c alliance/genview/src/gcc-1.42/final.c +--- alliance-5.0/genview/src/gcc-1.42/final.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/final.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,1675 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Convert RTL to assembler code and output it, for GNU compiler. ++ Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* This is the final pass of the compiler. ++ It looks at the rtl code for a function and outputs assembler code. ++ ++ Call `final_start_function' to output the assembler code for function entry, ++ `final' to output assembler code for some RTL code, ++ `final_end_function' to output assembler code for function exit. ++ If a function is compiled in several pieces, each piece is ++ output separately with `final'. ++ ++ Some optimizations are also done at this level. ++ Move instructions that were made unnecessary by good register allocation ++ are detected and omitted from the output. (Though most of these ++ are removed by the last jump pass.) ++ ++ Instructions to set the condition codes are omitted when it can be ++ seen that the condition codes already had the desired values. ++ ++ In some cases it is sufficient if the inherited condition codes ++ have related values, but this may require the following insn ++ (the one that tests the condition codes) to be modified. ++ ++ The code for the function prologue and epilogue are generated ++ directly as assembler code by the macros FUNCTION_PROLOGUE and ++ FUNCTION_EPILOGUE. Those instructions never exist as rtl. */ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "regs.h" ++#include "insn-config.h" ++#include "recog.h" ++#include "conditions.h" ++#include "gdbfiles.h" ++#include "flags.h" ++#include "real.h" ++#include "output.h" ++ ++/* Get N_SLINE and N_SOL from stab.h if we can expect the file to exist. */ ++#ifdef DBX_DEBUGGING_INFO ++#ifdef USG ++#include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */ ++#else ++#include /* On BSD, use the system's stab.h. */ ++#endif /* not USG */ ++#endif /* DBX_DEBUGGING_INFO */ ++ ++/* .stabd code for line number. */ ++#ifndef N_SLINE ++#define N_SLINE 0x44 ++#endif ++ ++/* .stabs code for included file name. */ ++#ifndef N_SOL ++#define N_SOL 0x84 ++#endif ++ ++#define min(A,B) ((A) < (B) ? (A) : (B)) ++ ++rtx peephole (); ++void output_asm_insn (); ++rtx alter_subreg (); ++static int alter_cond (); ++void output_asm_label (); ++static void output_operand (); ++void output_address (); ++void output_addr_const (); ++static void output_source_line (); ++rtx final_scan_insn (); ++ ++/* the sdb debugger needs the line given as an offset from the beginning ++ of the current function -wfs*/ ++ ++extern int sdb_begin_function_line; ++ ++/* Line number of last NOTE. */ ++static int last_linenum; ++ ++/* Number of basic blocks seen so far; ++ used if profile_block_flag is set. */ ++static int count_basic_blocks; ++ ++/* Nonzero while outputting an `asm' with operands. ++ This means that inconsistencies are the user's fault, so don't abort. ++ The precise value is the insn being output, to pass to error_for_asm. */ ++static rtx this_is_asm_operands; ++ ++/* Number of operands of this insn, for an `asm' with operands. */ ++static int insn_noperands; ++ ++/* File in which assembler code is being written. */ ++ ++extern FILE *asm_out_file; ++ ++/* Compare optimization flag. */ ++ ++static rtx last_ignored_compare = 0; ++ ++/* Flag indicating this insn is the start of a new basic block. */ ++ ++static int new_block = 1; ++ ++/* All the symbol-blocks (levels of scoping) in the compilation ++ are assigned sequence numbers in order of appearance of the ++ beginnings of the symbol-blocks. Both final and dbxout do this, ++ and assume that they will both give the same number to each block. ++ Final uses these sequence numbers to generate assembler label names ++ LBBnnn and LBEnnn for the beginning and end of the symbol-block. ++ Dbxout uses the sequence nunbers to generate references to the same labels ++ from the dbx debugging information. ++ ++ Sdb records this level at the beginning ++ of each function, so that when it recurses down the declarations, it may ++ find the current level, since it outputs the block beginning and endings ++ at the point in the asm file, where the blocks would begin and end. */ ++ ++int next_block_index; ++ ++/* Chain of all `struct gdbfile's. */ ++ ++struct gdbfile *gdbfiles; ++ ++/* `struct gdbfile' for the last file we wrote a line number for. */ ++ ++static struct gdbfile *current_gdbfile; ++ ++/* Filenum to assign to the next distinct source file encountered. */ ++ ++static int next_gdb_filenum; ++ ++/* This variable contains machine-dependent flags (defined in tm-...h) ++ set and examined by output routines ++ that describe how to interpret the condition codes properly. */ ++ ++CC_STATUS cc_status; ++ ++/* During output of an insn, this contains a copy of cc_status ++ from before the insn. */ ++ ++CC_STATUS cc_prev_status; ++ ++/* Last source file name mentioned in a NOTE insn. */ ++ ++static char *lastfile; ++ ++/* Indexed by hardware reg number, is 1 if that register is ever ++ used in the current function. ++ ++ In life_analysis, or in stupid_life_analysis, this is set ++ up to record the hard regs used explicitly. Reload adds ++ in the hard regs used for holding pseudo regs. Final uses ++ it to generate the code in the function prologue and epilogue ++ to save and restore registers as needed. */ ++ ++char regs_ever_live[FIRST_PSEUDO_REGISTER]; ++ ++/* Nonzero means current function must be given a frame pointer. ++ Set in stmt.c if anything is allocated on the stack there. ++ Set in reload1.c if anything is allocated on the stack there. */ ++ ++int frame_pointer_needed; ++ ++/* Assign unique numbers to labels generated for profiling. */ ++ ++int profile_label_no; ++ ++/* Length so far allocated in PENDING_BLOCKS. */ ++ ++static int max_block_depth; ++ ++/* Stack of sequence numbers of symbol-blocks of which we have seen the ++ beginning but not yet the end. Sequence numbers are assigned at ++ the beginning; this stack allows us to find the sequence number ++ of a block that is ending. */ ++ ++static int *pending_blocks; ++ ++/* Number of elements currently in use in PENDING_BLOCKS. */ ++ ++static int block_depth; ++ ++/* Nonzero if have enabled APP processing of our assembler output. */ ++ ++static int app_on; ++ ++/* If we are outputting an insn sequence, this contains the sequence rtx. ++ Zero otherwise. */ ++ ++rtx final_sequence; ++ ++/* Initialize data in final at the beginning of a compilation. */ ++ ++void ++init_final (filename) ++ char *filename; ++{ ++ next_block_index = 2; ++ lastfile = filename; ++ app_on = 0; ++ max_block_depth = 20; ++ pending_blocks = (int *) xmalloc (20 * sizeof *pending_blocks); ++ gdbfiles = 0; ++ next_gdb_filenum = 0; ++ final_sequence = 0; ++} ++ ++/* Called at end of source file, ++ to output the block-profiling table for this entire compilation. */ ++ ++void ++end_final (filename) ++ char *filename; ++{ ++ int i; ++ ++ if (profile_block_flag) ++ { ++ char name[12]; ++ ++ data_section (); ++ ++ /* Output the main header, of 6 words: ++ 0: 1 if this file's initialized, else 0. ++ 1: address of file name. ++ 2: address of table of counts. ++ 4: number of counts in the table. ++ 5: always 0, for compatibility with Sun. ++ 6: extra word added by GNU: address of address table ++ which contains addresses of basic blocks, ++ in parallel with the table of counts. */ ++ ASM_OUTPUT_ALIGN (asm_out_file, ++ exact_log2 (min (UNITS_PER_WORD, ++ BIGGEST_ALIGNMENT / BITS_PER_UNIT))); ++ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LPBX", 0); ++ assemble_integer_zero (); ++ ++ ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 1); ++ ASM_OUTPUT_INT (asm_out_file, gen_rtx (SYMBOL_REF, Pmode, name)); ++ ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 2); ++ ASM_OUTPUT_INT (asm_out_file, gen_rtx (SYMBOL_REF, Pmode, name)); ++ ASM_OUTPUT_INT (asm_out_file, gen_rtx (CONST_INT, VOIDmode, ++ count_basic_blocks)); ++ assemble_integer_zero (); ++ ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 3); ++ ASM_OUTPUT_INT (asm_out_file, gen_rtx (SYMBOL_REF, Pmode, name)); ++ ++ /* Output the file name. */ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LPBX", 1); ++ { ++ int len = strlen (filename); ++ char *data_file = (char *) alloca (len + 3); ++ strcpy (data_file, filename); ++ if (len > 2 && ! strcmp (".c", data_file + len - 2)) ++ data_file[len - 2] = 0; ++ else if (len > 2 && ! strcmp (".i", data_file + len - 2)) ++ data_file[len - 2] = 0; ++ else if (len > 3 && ! strcmp (".co", data_file + len - 3)) ++ data_file[len - 3] = 0; ++ strcat (data_file, ".d"); ++ assemble_string (data_file, strlen (data_file) + 1); ++ } ++ ++ /* Realign data section. */ ++ ASM_OUTPUT_ALIGN (asm_out_file, ++ exact_log2 (min (UNITS_PER_WORD, ++ BIGGEST_ALIGNMENT / BITS_PER_UNIT))); ++ ++ /* Make space for the table of counts. */ ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LPBX", 2); ++ ASM_OUTPUT_SKIP (asm_out_file, UNITS_PER_WORD * count_basic_blocks); ++ ++ /* Output the table of addresses. */ ++ text_section (); ++ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LPBX", 3); ++ for (i = 0; i < count_basic_blocks; i++) ++ { ++ char name[12]; ++ ASM_GENERATE_INTERNAL_LABEL (name, "LPB", i); ++ ASM_OUTPUT_INT (asm_out_file, gen_rtx (SYMBOL_REF, Pmode, name)); ++ } ++ ++ /* End with the address of the table of addresses, ++ so we can find it easily, as the last word in the file's text. */ ++ ASM_GENERATE_INTERNAL_LABEL (name, "LPBX", 3); ++ ASM_OUTPUT_INT (asm_out_file, gen_rtx (SYMBOL_REF, Pmode, name)); ++ } ++} ++ ++/* Enable APP processing of subsequent output. ++ Used before the output from an `asm' statement. */ ++ ++void ++app_enable () ++{ ++ if (! app_on) ++ { ++ fprintf (asm_out_file, ASM_APP_ON); ++ app_on = 1; ++ } ++} ++ ++/* Enable APP processing of subsequent output. ++ Called from varasm.c before most kinds of output. */ ++ ++void ++app_disable () ++{ ++ if (app_on) ++ { ++ fprintf (asm_out_file, ASM_APP_OFF); ++ app_on = 0; ++ } ++} ++ ++/* Return the number of slots filled in the current ++ delayed branch sequence. */ ++ ++#ifdef HAVE_DELAYED_BRANCH ++int ++dbr_sequence_length () ++{ ++ int i; ++ int slots = 0; ++ /* It's zero if we are not scheduling or not in a sequence. ++ (We never count the first insn.) */ ++ if (flag_delayed_branch && final_sequence != 0) ++ { ++ for (i = 1; i < XVECLEN (final_sequence, 0); i++) ++ slots += DBR_INSN_SLOTS (XVECEXP (final_sequence, 0, i)); ++ } ++ return slots; ++} ++#endif ++ ++/* Output assembler code for the start of a function, ++ and initialize some of the variables in this file ++ for the new function. The label for the function and associated ++ assembler pseudo-ops have already been output in `assemble_function'. ++ ++ FIRST is the first insn of the rtl for the function being compiled. ++ FILE is the file to write assembler code to. ++ WRITE_SYMBOLS says which kind of debugging info to write (or none). ++ OPTIMIZE is nonzero if we should eliminate redundant ++ test and compare insns. */ ++ ++void ++final_start_function (first, file, write_symbols, optimize) ++ rtx first; ++ FILE *file; ++ enum debugger write_symbols; ++ int optimize; ++{ ++ block_depth = 0; ++ ++ this_is_asm_operands = 0; ++ ++ /* Record beginning of the symbol-block that's the entire function. */ ++ ++ if (write_symbols == GDB_DEBUG) ++ { ++ pending_blocks[block_depth++] = next_block_index; ++ fprintf (file, "\t.gdbbeg %d\n", next_block_index++); ++ } ++ ++ /* Initial line number is supposed to be output ++ before the function's prologue and label ++ so that the function's address will not appear to be ++ in the last statement of the preceding function. */ ++ if (NOTE_LINE_NUMBER (first) != NOTE_INSN_DELETED) ++ { ++ if (write_symbols == SDB_DEBUG) ++ /* For sdb, let's not, but say we did. ++ We need to set last_linenum for sdbout_function_begin, ++ but we can't have an actual line number before the .bf symbol. ++ (sdb_begin_function_line is not set, ++ and other compilers don't do it.) */ ++ last_linenum = NOTE_LINE_NUMBER (first); ++ else ++ output_source_line (file, first, write_symbols); ++ } ++ ++ /* The Sun386i and perhaps other machines don't work right ++ if the profiling code comes after the prologue. */ ++#ifdef PROFILE_BEFORE_PROLOGUE ++ if (profile_flag) ++ profile_function (file); ++#endif /* PROFILE_BEFORE_PROLOGUE */ ++ ++#ifdef FUNCTION_PROLOGUE ++ /* First output the function prologue: code to set up the stack frame. */ ++ FUNCTION_PROLOGUE (file, get_frame_size ()); ++#endif ++ ++#ifdef SDB_DEBUGGING_INFO ++ next_block_index = 1; ++#endif ++ ++#ifdef FUNCTION_BLOCK_PROFILER ++ if (profile_block_flag) ++ { ++ FUNCTION_BLOCK_PROFILER (file, profile_label_no); ++ } ++#endif /* FUNCTION_BLOCK_PROFILER */ ++ ++#ifndef PROFILE_BEFORE_PROLOGUE ++ if (profile_flag) ++ profile_function (file); ++#endif /* not PROFILE_BEFORE_PROLOGUE */ ++ ++ profile_label_no++; ++} ++ ++profile_function (file) ++ FILE *file; ++{ ++ int align = min (BIGGEST_ALIGNMENT, BITS_PER_WORD); ++ extern int current_function_returns_struct; ++ extern int current_function_needs_context; ++ int sval = current_function_returns_struct; ++ int cxt = current_function_needs_context; ++ ++ data_section (); ++ ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT)); ++ ASM_OUTPUT_INTERNAL_LABEL (file, "LP", profile_label_no); ++ assemble_integer_zero (); ++ ++ text_section (); ++ ++#ifdef STRUCT_VALUE_INCOMING_REGNUM ++ if (sval) ++ ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_INCOMING_REGNUM); ++#else ++#ifdef STRUCT_VALUE_REGNUM ++ if (sval) ++ ASM_OUTPUT_REG_PUSH (file, STRUCT_VALUE_REGNUM); ++#endif ++#endif ++ ++#if 0 ++#ifdef STATIC_CHAIN_INCOMING_REGNUM ++ if (cxt) ++ ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_INCOMING_REGNUM); ++#else ++#ifdef STATIC_CHAIN_REGNUM ++ if (cxt) ++ ASM_OUTPUT_REG_PUSH (file, STATIC_CHAIN_REGNUM); ++#endif ++#endif ++#endif /* 0 */ ++ ++ FUNCTION_PROFILER (file, profile_label_no); ++ ++#if 0 ++#ifdef STATIC_CHAIN_INCOMING_REGNUM ++ if (cxt) ++ ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_INCOMING_REGNUM); ++#else ++#ifdef STATIC_CHAIN_REGNUM ++ if (cxt) ++ ASM_OUTPUT_REG_POP (file, STATIC_CHAIN_REGNUM); ++#endif ++#endif ++#endif /* 0 */ ++ ++#ifdef STRUCT_VALUE_INCOMING_REGNUM ++ if (sval) ++ ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_INCOMING_REGNUM); ++#else ++#ifdef STRUCT_VALUE_REGNUM ++ if (sval) ++ ASM_OUTPUT_REG_POP (file, STRUCT_VALUE_REGNUM); ++#endif ++#endif ++} ++ ++/* Output assembler code for the end of a function. ++ For clarity, args are same as those of `final_start_function' ++ even though not all of them are needed. */ ++ ++void ++final_end_function (first, file, write_symbols, optimize) ++ rtx first; ++ FILE *file; ++ enum debugger write_symbols; ++ int optimize; ++{ ++ if (app_on) ++ { ++ fprintf (file, ASM_APP_OFF); ++ app_on = 0; ++ } ++ ++ if (write_symbols == GDB_DEBUG) ++ fprintf (file, "\t.gdbend %d\n", pending_blocks[0]); ++ ++#ifdef SDB_DEBUGGING_INFO ++ if (write_symbols == SDB_DEBUG) ++ sdbout_end_function (last_linenum); ++#endif ++ ++#ifdef FUNCTION_EPILOGUE ++ /* Finally, output the function epilogue: ++ code to restore the stack frame and return to the caller. */ ++ FUNCTION_EPILOGUE (file, get_frame_size ()); ++#endif ++ ++#ifdef SDB_DEBUGGING_INFO ++ if (write_symbols == SDB_DEBUG) ++ sdbout_end_epilogue (); ++#endif ++ ++ /* If FUNCTION_EPILOGUE is not defined, then the function body ++ itself contains return instructions wherever needed. */ ++} ++ ++/* Output assembler code for some insns: all or part of a function. ++ For description of args, see `final_start_function', above. ++ ++ PRESCAN is 1 if we are not really outputting, ++ just scanning as if we were outputting. ++ Prescanning deletes and rearranges insns just like ordinary output. ++ PRESCAN is -2 if we are outputting after having prescanned. ++ In this case, don't try to delete or rearrange insns ++ because that has already been done. ++ Prescanning is done only on certain machines. */ ++ ++void ++final (first, file, write_symbols, optimize, prescan) ++ rtx first; ++ FILE *file; ++ enum debugger write_symbols; ++ int optimize; ++ int prescan; ++{ ++ register rtx insn; ++ ++ last_ignored_compare = 0; ++ new_block = 1; ++ ++ init_recog (); ++ ++ CC_STATUS_INIT; ++ ++ for (insn = NEXT_INSN (first); insn;) ++ insn = final_scan_insn (insn, file, write_symbols, optimize, ++ prescan, 0); ++} ++ ++/* The final scan for one insn, INSN. ++ Args are same as in `final', except that INSN ++ is the insn being scanned. ++ Value returned is the next insn to be scanned. ++ ++ NOPEEPHOLES is the flag to disallow peephole processing (currently ++ used for within delayed branch sequence output). */ ++ ++rtx ++final_scan_insn (insn, file, write_symbols, optimize, prescan, nopeepholes) ++ rtx insn; ++ FILE *file; ++ enum debugger write_symbols; ++ int optimize; ++ int prescan; ++ int nopeepholes; ++{ ++ register int i; ++ switch (GET_CODE (insn)) ++ { ++ case NOTE: ++ if (prescan > 0) ++ break; ++ if (write_symbols == NO_DEBUG) ++ break; ++ if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG) ++ { ++#ifdef SDB_DEBUGGING_INFO ++ if (write_symbols == SDB_DEBUG) ++ sdbout_begin_function (last_linenum); ++#endif ++ break; ++ } ++ if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG ++ || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END) ++ break; ++ if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED) ++ break; /* An insn that was "deleted" */ ++ if (app_on) ++ { ++ fprintf (file, ASM_APP_OFF); ++ app_on = 0; ++ } ++ if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG) ++ { ++ /* Beginning of a symbol-block. Assign it a sequence number ++ and push the number onto the stack PENDING_BLOCKS. */ ++ ++ if (block_depth == max_block_depth) ++ { ++ /* PENDING_BLOCKS is full; make it longer. */ ++ max_block_depth *= 2; ++ pending_blocks ++ = (int *) xrealloc (pending_blocks, ++ max_block_depth * sizeof (int)); ++ } ++ pending_blocks[block_depth++] = next_block_index; ++ ++ /* Output debugging info about the symbol-block beginning. */ ++ ++#ifdef SDB_DEBUGGING_INFO ++ if (write_symbols == SDB_DEBUG) ++ sdbout_begin_block (file, last_linenum, next_block_index); ++#endif ++#ifdef DBX_DEBUGGING_INFO ++ if (write_symbols == DBX_DEBUG) ++ ASM_OUTPUT_INTERNAL_LABEL (file, "LBB", next_block_index); ++#endif ++ if (write_symbols == GDB_DEBUG) ++ fprintf (file, "\t.gdbbeg %d\n", next_block_index); ++ ++ next_block_index++; ++ } ++ else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END) ++ { ++ /* End of a symbol-block. Pop its sequence number off ++ PENDING_BLOCKS and output debugging info based on that. */ ++ ++ --block_depth; ++ ++#ifdef DBX_DEBUGGING_INFO ++ if (write_symbols == DBX_DEBUG && block_depth >= 0) ++ ASM_OUTPUT_INTERNAL_LABEL (file, "LBE", ++ pending_blocks[block_depth]); ++#endif ++ ++#ifdef SDB_DEBUGGING_INFO ++ if (write_symbols == SDB_DEBUG && block_depth >= 0) ++ sdbout_end_block (file, last_linenum); ++#endif ++ ++ if (write_symbols == GDB_DEBUG) ++ fprintf (file, "\t.gdbend %d\n", pending_blocks[block_depth]); ++ } ++ else if (NOTE_LINE_NUMBER (insn) > 0) ++ /* This note is a line-number. */ ++ output_source_line (file, insn, write_symbols); ++ break; ++ ++ case BARRIER: ++#ifdef ASM_OUTPUT_ALIGN_CODE ++ ASM_OUTPUT_ALIGN_CODE (file); ++#endif ++ break; ++ ++ case CODE_LABEL: ++ CC_STATUS_INIT; ++ if (prescan > 0) ++ break; ++ new_block = 1; ++ if (app_on) ++ { ++ fprintf (file, ASM_APP_OFF); ++ app_on = 0; ++ } ++#ifdef ASM_OUTPUT_CASE_LABEL ++ if (NEXT_INSN (insn) != 0 ++ && GET_CODE (NEXT_INSN (insn)) == JUMP_INSN) ++ { ++ rtx nextbody = PATTERN (NEXT_INSN (insn)); ++ ++ /* If this label is followed by a jump-table, ++ output the two of them together in a special way. */ ++ ++ if (GET_CODE (nextbody) == ADDR_VEC ++ || GET_CODE (nextbody) == ADDR_DIFF_VEC) ++ { ++ ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn), ++ NEXT_INSN (insn)); ++ break; ++ } ++ } ++#endif ++ ++ ASM_OUTPUT_INTERNAL_LABEL (file, "L", CODE_LABEL_NUMBER (insn)); ++ break; ++ ++ default: ++ { ++ register rtx body = PATTERN (insn); ++ int insn_code_number; ++ char *template; ++ ++ /* An INSN, JUMP_INSN or CALL_INSN. ++ First check for special kinds that recog doesn't recognize. */ ++ ++ if (GET_CODE (body) == USE /* These are just declarations */ ++ || GET_CODE (body) == CLOBBER) ++ break; ++ ++ if (profile_block_flag && new_block) ++ { ++ rtx real_body = body; ++ if (GET_CODE (insn) == NOTE) ++ real_body = PATTERN (next_real_insn (insn)); ++ ++ /* Don't add instructions in front of jump tables. */ ++ if (GET_CODE (real_body) != ADDR_VEC ++ && GET_CODE (real_body) != ADDR_DIFF_VEC) ++ { ++ new_block = 0; ++ /* Enable the table of basic-block use counts ++ to point at the code it applies to. */ ++ ASM_OUTPUT_INTERNAL_LABEL (file, "LPB", count_basic_blocks); ++ /* Before first insn of this basic block, increment the ++ count of times it was entered. */ ++#ifdef BLOCK_PROFILER ++ BLOCK_PROFILER (file, count_basic_blocks); ++#endif ++ count_basic_blocks++; ++ } ++ } ++ ++ if (GET_CODE (body) == ASM_INPUT) ++ { ++ /* There's no telling what that did to the condition codes. */ ++ CC_STATUS_INIT; ++ if (prescan > 0) ++ break; ++ if (! app_on) ++ { ++ fprintf (file, ASM_APP_ON); ++ app_on = 1; ++ } ++ fprintf (asm_out_file, "\t%s\n", XSTR (body, 0)); ++ break; ++ } ++ ++ /* Detect `asm' construct with operands. */ ++ if (asm_noperands (body) >= 0) ++ { ++ int noperands = asm_noperands (body); ++ rtx *ops; ++ char *string; ++ ++ /* There's no telling what that did to the condition codes. */ ++ CC_STATUS_INIT; ++ if (prescan > 0) ++ break; ++ ++ /* alloca won't do here, since only return from `final' ++ would free it. */ ++ if (noperands > 0) ++ ops = (rtx *) xmalloc (noperands * sizeof (rtx)); ++ ++ if (! app_on) ++ { ++ fprintf (file, ASM_APP_ON); ++ app_on = 1; ++ } ++ ++ /* Get out the operand values. */ ++ string = decode_asm_operands (body, ops, 0, 0, 0); ++ /* Inhibit aborts on what would otherwise be compiler bugs. */ ++ insn_noperands = noperands; ++ this_is_asm_operands = insn; ++ /* Output the insn using them. */ ++ output_asm_insn (string, ops); ++ this_is_asm_operands = 0; ++ if (noperands > 0) ++ free (ops); ++ break; ++ } ++ ++ if (prescan <= 0 && app_on) ++ { ++ fprintf (file, ASM_APP_OFF); ++ app_on = 0; ++ } ++ ++ /* Detect insns that are really jump-tables ++ and output them as such. */ ++ ++ if (GET_CODE (body) == ADDR_VEC) ++ { ++ register int vlen, idx; ++ ++ if (prescan > 0) ++ break; ++ ++ vlen = XVECLEN (body, 0); ++ for (idx = 0; idx < vlen; idx++) ++ ASM_OUTPUT_ADDR_VEC_ELT (file, ++ CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0))); ++#ifdef ASM_OUTPUT_CASE_END ++ ASM_OUTPUT_CASE_END (file, ++ CODE_LABEL_NUMBER (PREV_INSN (insn)), ++ insn); ++#endif ++ break; ++ } ++ if (GET_CODE (body) == ADDR_DIFF_VEC) ++ { ++ register int vlen, idx; ++ ++ if (prescan > 0) ++ break; ++ ++ vlen = XVECLEN (body, 1); ++ for (idx = 0; idx < vlen; idx++) ++ ASM_OUTPUT_ADDR_DIFF_ELT (file, ++ CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)), ++ CODE_LABEL_NUMBER (XEXP (XEXP (body, 0), 0))); ++#ifdef ASM_OUTPUT_CASE_END ++ ASM_OUTPUT_CASE_END (file, ++ CODE_LABEL_NUMBER (PREV_INSN (insn)), ++ insn); ++#endif ++ break; ++ } ++ ++ if (recog_memoized (insn) == -1 ++ && GET_CODE (body) == SEQUENCE) /* A delayed-branch sequence */ ++ { ++ register int i; ++ if (prescan > 0) ++ break; ++ final_sequence = body; ++ for (i = 0; i < XVECLEN (body, 0); i++) ++ final_scan_insn (XVECEXP (body, 0, i), file, write_symbols, ++ optimize, prescan, 1); ++ final_sequence = 0; ++#ifdef DBR_OUTPUT_SEQEND ++ DBR_OUTPUT_SEQEND (file); ++#endif ++ break; ++ } ++ ++ /* We have a real machine instruction as rtl. */ ++ ++ body = PATTERN (insn); ++ ++ /* Check for redundant test and compare instructions ++ (when the condition codes are already set up as desired). ++ This is done only when optimizing; if not optimizing, ++ it should be possible for the user to alter a variable ++ with the debugger in between statements ++ and the next statement should reexamine the variable ++ to compute the condition codes. */ ++ ++ if (optimize ++ && GET_CODE (body) == SET ++ && GET_CODE (SET_DEST (body)) == CC0 ++ && insn != last_ignored_compare) ++ { ++ if (GET_CODE (SET_SRC (body)) == SUBREG) ++ SET_SRC (body) = alter_subreg (SET_SRC (body)); ++ if ((cc_status.value1 != 0 ++ && rtx_equal_p (SET_SRC (body), cc_status.value1)) ++ || (cc_status.value2 != 0 ++ && rtx_equal_p (SET_SRC (body), cc_status.value2))) ++ { ++ /* Don't delete insn if has an addressing side-effect */ ++ if (! find_reg_note (insn, REG_INC, 0) ++ /* or if anything in it is volatile. */ ++ && ! volatile_refs_p (PATTERN (insn))) ++ { ++ /* We don't really delete the insn; just ignore it. */ ++ last_ignored_compare = insn; ++ break; ++ } ++ } ++ } ++ ++ /* Following a conditional branch, we have a new basic block. */ ++ if (GET_CODE (insn) == JUMP_INSN && GET_CODE (body) == SET ++ && GET_CODE (SET_SRC (body)) != LABEL_REF) ++ new_block = 1; ++ ++ /* If this is a conditional branch, maybe modify it ++ if the cc's are in a nonstandard state ++ so that it accomplishes the same thing that it would ++ do straightforwardly if the cc's were set up normally. */ ++ ++ if (cc_status.flags != 0 ++ && GET_CODE (insn) == JUMP_INSN ++ && GET_CODE (body) == SET ++ && SET_DEST (body) == pc_rtx ++ && GET_CODE (SET_SRC (body)) == IF_THEN_ELSE ++ /* This is done during prescan; it is not done again ++ in final scan when prescan has been done. */ ++ && prescan >= 0) ++ { ++ /* This function may alter the contents of its argument ++ and clear some of the cc_status.flags bits. ++ It may also return 1 meaning condition now always true ++ or -1 meaning condition now always false ++ or 2 meaning condition nontrivial but altered. */ ++ register int result = alter_cond (XEXP (SET_SRC (body), 0)); ++ /* If condition now has fixed value, replace the IF_THEN_ELSE ++ with its then-operand or its else-operand. */ ++ if (result == 1) ++ SET_SRC (body) = XEXP (SET_SRC (body), 1); ++ if (result == -1) ++ SET_SRC (body) = XEXP (SET_SRC (body), 2); ++ /* The jump is now either unconditional or a no-op. ++ If it has become a no-op, don't try to output it. ++ (It would not be recognized.) */ ++ if (SET_SRC (body) == pc_rtx) ++ { ++ PUT_CODE (insn, NOTE); ++ NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (insn) = 0; ++ break; ++ } ++ /* Rerecognize the instruction if it has changed. */ ++ if (result != 0) ++ INSN_CODE (insn) = -1; ++ } ++ ++#ifdef STORE_FLAG_VALUE ++ /* Make same adjustments to instructions that examine the ++ condition codes without jumping (if this machine has them). */ ++ ++ if (cc_status.flags != 0 ++ && GET_CODE (body) == SET) ++ switch (GET_CODE (SET_SRC (body))) ++ { ++ case GTU: ++ case GT: ++ case LTU: ++ case LT: ++ case GEU: ++ case GE: ++ case LEU: ++ case LE: ++ case EQ: ++ case NE: ++ { ++ register int result; ++ if (GET_CODE (XEXP (SET_SRC (body), 0)) != CC0) ++ break; ++ result = alter_cond (SET_SRC (body)); ++ if (result == 1) ++ SET_SRC (body) = gen_rtx (CONST_INT, VOIDmode, ++ STORE_FLAG_VALUE); ++ if (result == -1) ++ SET_SRC (body) = const0_rtx; ++ if (result != 0) ++ INSN_CODE (insn) = -1; ++ } ++ } ++#endif /* STORE_FLAG_VALUE */ ++ ++ /* Do machine-specific peephole optimizations if desired. */ ++ ++ if (optimize && !flag_no_peephole && !nopeepholes) ++ { ++ rtx next = peephole (insn); ++ /* When peepholing, if there were notes within the peephole, ++ emit them before the peephole. */ ++ if (next != 0 && next != NEXT_INSN (insn)) ++ { ++ rtx note = NEXT_INSN (insn); ++ rtx prev = PREV_INSN (insn); ++ while (note != next) ++ { ++ final_scan_insn (note, file, write_symbols, optimize, ++ prescan, nopeepholes); ++ note = NEXT_INSN (note); ++ } ++ /* In case this is prescan, put the notes ++ in proper position for later rescan. */ ++ note = NEXT_INSN (insn); ++ PREV_INSN (note) = prev; ++ NEXT_INSN (prev) = note; ++ NEXT_INSN (PREV_INSN (next)) = insn; ++ PREV_INSN (insn) = PREV_INSN (next); ++ NEXT_INSN (insn) = next; ++ PREV_INSN (next) = insn; ++ } ++ ++ /* PEEPHOLE might have changed this. */ ++ body = PATTERN (insn); ++ } ++ ++ /* Try to recognize the instruction. ++ If successful, verify that the operands satisfy the ++ constraints for the instruction. Crash if they don't, ++ since `reload' should have changed them so that they do. */ ++ ++ insn_code_number = recog_memoized (insn); ++ insn_extract (insn); ++ for (i = 0; i < insn_n_operands[insn_code_number]; i++) ++ { ++ if (GET_CODE (recog_operand[i]) == SUBREG) ++ recog_operand[i] = alter_subreg (recog_operand[i]); ++ } ++ ++#ifdef REGISTER_CONSTRAINTS ++ if (! constrain_operands (insn_code_number)) ++ abort (); ++#endif ++ ++ /* Some target machines need to prescan each insn before ++ it is output. */ ++ ++#ifdef FINAL_PRESCAN_INSN ++ FINAL_PRESCAN_INSN (insn, recog_operand, ++ insn_n_operands[insn_code_number]); ++#endif ++ ++ cc_prev_status = cc_status; ++ ++ /* Update `cc_status' for this instruction. ++ The instruction's output routine may change it further. ++ If the output routine for a jump insn needs to depend ++ on the cc status, it should look at cc_prev_status. */ ++ ++ NOTICE_UPDATE_CC (body, insn); ++ ++ /* If the proper template needs to be chosen by some C code, ++ run that code and get the real template. */ ++ ++ template = insn_template[insn_code_number]; ++ if (template == 0) ++ { ++ template = (*insn_outfun[insn_code_number]) (recog_operand, insn); ++ ++ /* If the C code returns 0, it means that it is a jump insn ++ which follows a deleted test insn, and that test insn ++ needs to be reinserted. */ ++ if (template == 0) ++ { ++ if (PREV_INSN (insn) != last_ignored_compare) ++ abort (); ++ new_block = 0; ++ return PREV_INSN (insn); ++ } ++ } ++ ++ if (prescan > 0) ++ break; ++ ++ /* Output assembler code from the template. */ ++ ++ output_asm_insn (template, recog_operand); ++ ++ /* Mark this insn as having been output. */ ++ INSN_DELETED_P (insn) = 1; ++ } ++ } ++ return NEXT_INSN (insn); ++} ++ ++/* Set up FILENAME as the current file for GDB line-number output. */ ++ ++void ++set_current_gdbfile (filename) ++ char *filename; ++{ ++ register struct gdbfile *f; ++ for (f = gdbfiles; f; f = f->next) ++ if (!strcmp (f->name, filename)) ++ break; ++ ++ if (!f) ++ { ++ f = (struct gdbfile *) permalloc (sizeof (struct gdbfile)); ++ f->next = gdbfiles; ++ gdbfiles = f; ++ f->name = filename; ++ f->filenum = next_gdb_filenum++; ++ f->nlines = 0; ++ } ++ current_gdbfile = f; ++ lastfile = filename; ++} ++ ++/* Output debugging info to the assembler file FILE ++ based on the NOTE-insn INSN, assumed to be a line number. */ ++ ++static void ++output_source_line (file, insn, write_symbols) ++ FILE *file; ++ rtx insn; ++ enum debugger write_symbols; ++{ ++ register char *filename = NOTE_SOURCE_FILE (insn); ++ ++ last_linenum = NOTE_LINE_NUMBER (insn); ++ ++ if (write_symbols == GDB_DEBUG) ++ { ++ /* Output GDB-format line number info. */ ++ ++ /* If this is not the same source file as last time, ++ find or assign a GDB-file-number to this file. */ ++ if (filename && (lastfile == 0 || strcmp (filename, lastfile) ++ || current_gdbfile == 0)) ++ set_current_gdbfile (filename); ++ ++ ++current_gdbfile->nlines; ++ fprintf (file, "\t.gdbline %d,%d\n", ++ current_gdbfile->filenum, NOTE_LINE_NUMBER (insn)); ++ } ++ ++ if (write_symbols == SDB_DEBUG || write_symbols == DBX_DEBUG) ++ { ++#ifdef SDB_DEBUGGING_INFO ++ if (write_symbols == SDB_DEBUG ++#if 0 /* People like having line numbers even in wrong file! */ ++ /* COFF can't handle multiple source files--lose, lose. */ ++ && !strcmp (filename, main_input_filename) ++#endif ++ /* COFF relative line numbers must be positive. */ ++ && last_linenum > sdb_begin_function_line) ++ { ++#ifdef ASM_OUTPUT_SOURCE_LINE ++ ASM_OUTPUT_SOURCE_LINE (file, last_linenum); ++#else ++ fprintf (file, "\t.ln\t%d\n", ++ (sdb_begin_function_line ++ ? last_linenum - sdb_begin_function_line : 1)); ++#endif ++ } ++#endif ++ ++#ifdef DBX_DEBUGGING_INFO ++ if (write_symbols == DBX_DEBUG) ++ { ++ /* Write DBX line number data. */ ++ ++ if (filename && (lastfile == 0 || strcmp (filename, lastfile))) ++ { ++#ifdef ASM_OUTPUT_SOURCE_FILENAME ++ ASM_OUTPUT_SOURCE_FILENAME (file, filename); ++#else ++ fprintf (file, "\t.stabs \"%s\",%d,0,0,Ltext\n", ++ filename, N_SOL); ++#endif ++ lastfile = filename; ++ } ++ } ++ ++#ifdef ASM_OUTPUT_SOURCE_LINE ++ ASM_OUTPUT_SOURCE_LINE (file, NOTE_LINE_NUMBER (insn)); ++#else ++ fprintf (file, "\t.stabd %d,0,%d\n", ++ N_SLINE, NOTE_LINE_NUMBER (insn)); ++#endif ++#endif /* DBX_DEBUGGING_INFO */ ++ } ++} ++ ++/* If X is a SUBREG, replace it with a REG or a MEM, ++ based on the thing it is a subreg of. */ ++ ++rtx ++alter_subreg (x) ++ register rtx x; ++{ ++ register rtx y = SUBREG_REG (x); ++ if (GET_CODE (y) == SUBREG) ++ y = alter_subreg (y); ++ ++ if (GET_CODE (y) == REG) ++ { ++ /* If the containing reg really gets a hard reg, so do we. */ ++ PUT_CODE (x, REG); ++ REGNO (x) = REGNO (y) + SUBREG_WORD (x); ++ } ++ else if (GET_CODE (y) == MEM) ++ { ++ register int offset = SUBREG_WORD (x) * UNITS_PER_WORD; ++#ifdef BYTES_BIG_ENDIAN ++ offset -= (min (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))) ++ - min (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (y)))); ++#endif ++ PUT_CODE (x, MEM); ++ MEM_VOLATILE_P (x) = MEM_VOLATILE_P (y); ++ XEXP (x, 0) = plus_constant (XEXP (y, 0), offset); ++ } ++ else if (GET_CODE (y) == CONST_DOUBLE) ++ return y; ++ ++ return x; ++} ++ ++/* Do alter_subreg on all the SUBREGs contained in X. */ ++ ++static rtx ++walk_alter_subreg (x) ++ rtx x; ++{ ++ switch (GET_CODE (x)) ++ { ++ case PLUS: ++ case MULT: ++ XEXP (x, 0) = walk_alter_subreg (XEXP (x, 0)); ++ XEXP (x, 1) = walk_alter_subreg (XEXP (x, 1)); ++ break; ++ ++ case MEM: ++ XEXP (x, 0) = walk_alter_subreg (XEXP (x, 0)); ++ break; ++ ++ case SUBREG: ++ return alter_subreg (x); ++ } ++ ++ return x; ++} ++ ++/* Given BODY, the body of a jump instruction, alter the jump condition ++ as required by the bits that are set in cc_status.flags. ++ Not all of the bits there can be handled at this level in all cases. ++ ++ The value is normally 0. ++ 1 means that the condition has become always true. ++ -1 means that the condition has become always false. ++ 2 means that COND has been altered. */ ++ ++static int ++alter_cond (cond) ++ register rtx cond; ++{ ++ int value = 0; ++ ++ if (cc_status.flags & CC_REVERSED) ++ { ++ value = 2; ++ switch (GET_CODE (cond)) ++ { ++ case LE: ++ PUT_CODE (cond, GE); ++ break; ++ case GE: ++ PUT_CODE (cond, LE); ++ break; ++ case LT: ++ PUT_CODE (cond, GT); ++ break; ++ case GT: ++ PUT_CODE (cond, LT); ++ break; ++ case LEU: ++ PUT_CODE (cond, GEU); ++ break; ++ case GEU: ++ PUT_CODE (cond, LEU); ++ break; ++ case LTU: ++ PUT_CODE (cond, GTU); ++ break; ++ case GTU: ++ PUT_CODE (cond, LTU); ++ break; ++ } ++ } ++ ++ if (cc_status.flags & CC_NOT_POSITIVE) ++ switch (GET_CODE (cond)) ++ { ++ case LE: ++ case LEU: ++ case GEU: ++ /* Jump becomes unconditional. */ ++ return 1; ++ ++ case GT: ++ case GTU: ++ case LTU: ++ /* Jump becomes no-op. */ ++ return -1; ++ ++ case GE: ++ PUT_CODE (cond, EQ); ++ value = 2; ++ break; ++ ++ case LT: ++ PUT_CODE (cond, NE); ++ value = 2; ++ break; ++ } ++ ++ if (cc_status.flags & CC_NOT_NEGATIVE) ++ switch (GET_CODE (cond)) ++ { ++ case GE: ++ case GEU: ++ /* Jump becomes unconditional. */ ++ return 1; ++ ++ case LT: ++ case LTU: ++ /* Jump becomes no-op. */ ++ return -1; ++ ++ case LE: ++ case LEU: ++ PUT_CODE (cond, EQ); ++ value = 2; ++ break; ++ ++ case GT: ++ case GTU: ++ PUT_CODE (cond, NE); ++ value = 2; ++ break; ++ } ++ ++ if (cc_status.flags & CC_NO_OVERFLOW) ++ switch (GET_CODE (cond)) ++ { ++ case GEU: ++ /* Jump becomes unconditional. */ ++ return 1; ++ ++ case LEU: ++ PUT_CODE (cond, EQ); ++ value = 2; ++ break; ++ ++ case GTU: ++ PUT_CODE (cond, NE); ++ value = 2; ++ break; ++ ++ case LTU: ++ /* Jump becomes no-op. */ ++ return -1; ++ } ++ ++ if (cc_status.flags & (CC_Z_IN_NOT_N | CC_Z_IN_N)) ++ switch (GET_CODE (cond)) ++ { ++ case LE: ++ case LEU: ++ case GE: ++ case GEU: ++ case LT: ++ case LTU: ++ case GT: ++ case GTU: ++ abort (); ++ ++ case NE: ++ PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? GE : LT); ++ value = 2; ++ break; ++ ++ case EQ: ++ PUT_CODE (cond, cc_status.flags & CC_Z_IN_N ? LT : GE); ++ value = 2; ++ break; ++ } ++ ++ return value; ++} ++ ++/* Report inconsistency between the assembler template and the operands. ++ In an `asm', it's the user's fault; otherwise, the compiler's fault. */ ++ ++static void ++output_operand_lossage (str) ++ char *str; ++{ ++ if (this_is_asm_operands) ++ error_for_asm (this_is_asm_operands, "invalid `asm': %s", str); ++ else ++ abort (); ++} ++ ++/* Output of assembler code from a template, and its subroutines. */ ++ ++/* Output text from TEMPLATE to the assembler output file, ++ obeying %-directions to substitute operands taken from ++ the vector OPERANDS. ++ ++ %N (for N a digit) means print operand N in usual manner. ++ %lN means require operand N to be a CODE_LABEL or LABEL_REF ++ and print the label name with no punctuation. ++ %cN means require operand N to be a constant ++ and print the constant expression with no punctuation. ++ %aN means expect operand N to be a memory address ++ (not a memory reference!) and print a reference ++ to that address. ++ %nN means expect operand N to be a constant ++ and print a constant expression for minus the value ++ of the operand, with no other punctuation. */ ++ ++void ++output_asm_insn (template, operands) ++ char *template; ++ rtx *operands; ++{ ++ register char *p; ++ register int c; ++ ++ /* An insn may return a null string template ++ in a case where no assembler code is needed. */ ++ if (*template == 0) ++ return; ++ ++ p = template; ++ putc ('\t', asm_out_file); ++ ++#ifdef ASM_OUTPUT_OPCODE ++ ASM_OUTPUT_OPCODE (asm_out_file, p); ++#endif ++ ++ while (c = *p++) ++ { ++#ifdef ASM_OUTPUT_OPCODE ++ if (c == '\n') ++ { ++ putc (c, asm_out_file); ++ while ((c = *p) == '\t') ++ { ++ putc (c, asm_out_file); ++ p++; ++ } ++ ASM_OUTPUT_OPCODE (asm_out_file, p); ++ } ++ else ++#endif ++ if (c != '%') ++ putc (c, asm_out_file); ++ else ++ { ++ /* %% outputs a single %. */ ++ if (*p == '%') ++ { ++ p++; ++ putc (c, asm_out_file); ++ } ++ /* % followed by a letter and some digits ++ outputs an operand in a special way depending on the letter. ++ Letters `acln' are implemented here. ++ Other letters are passed to `output_operand' so that ++ the PRINT_OPERAND macro can define them. */ ++ else if ((*p >= 'a' && *p <= 'z') ++ || (*p >= 'A' && *p <= 'Z')) ++ { ++ int letter = *p++; ++ c = atoi (p); ++ ++ if (! (*p >= '0' && *p <= '9')) ++ output_operand_lossage ("operand number missing after %-letter"); ++ else if (this_is_asm_operands && c >= (unsigned) insn_noperands) ++ output_operand_lossage ("operand number out of range"); ++ else if (letter == 'l') ++ output_asm_label (operands[c]); ++ else if (letter == 'a') ++ output_address (operands[c]); ++ else if (letter == 'c') ++ { ++ if (CONSTANT_ADDRESS_P (operands[c])) ++ output_addr_const (asm_out_file, operands[c]); ++ else ++ output_operand (operands[c], 'c'); ++ } ++ else if (letter == 'n') ++ { ++ if (GET_CODE (operands[c]) == CONST_INT) ++ fprintf (asm_out_file, "%d", - INTVAL (operands[c])); ++ else ++ { ++ putc ('-', asm_out_file); ++ output_addr_const (asm_out_file, operands[c]); ++ } ++ } ++ else ++ output_operand (operands[c], letter); ++ ++ while ((c = *p) >= '0' && c <= '9') p++; ++ } ++ /* % followed by a digit outputs an operand the default way. */ ++ else if (*p >= '0' && *p <= '9') ++ { ++ c = atoi (p); ++ if (this_is_asm_operands && c >= (unsigned) insn_noperands) ++ output_operand_lossage ("operand number out of range"); ++ else ++ output_operand (operands[c], 0); ++ while ((c = *p) >= '0' && c <= '9') p++; ++ } ++ /* % followed by punctuation: output something for that ++ punctuation character alone, with no operand. ++ The PRINT_OPERAND macro decides what is actually done. */ ++#ifdef PRINT_OPERAND_PUNCT_VALID_P ++ else if (PRINT_OPERAND_PUNCT_VALID_P (*p)) ++ output_operand (0, *p++); ++#endif ++ else ++ output_operand_lossage ("invalid %%-code"); ++ } ++ } ++ ++ putc ('\n', asm_out_file); ++} ++ ++/* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol. */ ++ ++void ++output_asm_label (x) ++ rtx x; ++{ ++ char buf[256]; ++ ++ if (GET_CODE (x) == LABEL_REF) ++ ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (x, 0))); ++ else if (GET_CODE (x) == CODE_LABEL) ++ ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x)); ++ else ++ output_operand_lossage ("`%l' operand isn't a label"); ++ ++ assemble_name (asm_out_file, buf); ++} ++ ++/* Print operand X using machine-dependent assembler syntax. ++ The macro PRINT_OPERAND is defined just to control this function. ++ CODE is a non-digit that preceded the operand-number in the % spec, ++ such as 'z' if the spec was `%z3'. CODE is 0 if there was no char ++ between the % and the digits. ++ When CODE is a non-letter, X is 0. ++ ++ The meanings of the letters are machine-dependent and controlled ++ by PRINT_OPERAND. */ ++ ++static void ++output_operand (x, code) ++ rtx x; ++ int code; ++{ ++ if (x && GET_CODE (x) == SUBREG) ++ x = alter_subreg (x); ++ PRINT_OPERAND (asm_out_file, x, code); ++} ++ ++/* Print a memory reference operand for address X ++ using machine-dependent assembler syntax. ++ The macro PRINT_OPERAND_ADDRESS exists just to control this function. */ ++ ++void ++output_address (x) ++ rtx x; ++{ ++ walk_alter_subreg (x); ++ PRINT_OPERAND_ADDRESS (asm_out_file, x); ++} ++ ++/* Print an integer constant expression in assembler syntax. ++ Addition and subtraction are the only arithmetic ++ that may appear in these expressions. */ ++ ++void ++output_addr_const (file, x) ++ FILE *file; ++ rtx x; ++{ ++ char buf[256]; ++ ++ restart: ++ switch (GET_CODE (x)) ++ { ++ case SYMBOL_REF: ++ assemble_name (file, XSTR (x, 0)); ++ break; ++ ++ case LABEL_REF: ++ ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (XEXP (x, 0))); ++ assemble_name (asm_out_file, buf); ++ break; ++ ++ case CODE_LABEL: ++ ASM_GENERATE_INTERNAL_LABEL (buf, "L", CODE_LABEL_NUMBER (x)); ++ assemble_name (asm_out_file, buf); ++ break; ++ ++ case CONST_INT: ++ fprintf (file, "%d", INTVAL (x)); ++ break; ++ ++ case CONST: ++ x = XEXP (x, 0); ++ goto restart; ++ ++ case CONST_DOUBLE: ++ if (GET_MODE (x) == DImode) ++ { ++ /* We can use %d if the number is <32 bits and positive. */ ++ if (CONST_DOUBLE_HIGH (x) || CONST_DOUBLE_LOW (x) < 0) ++ fprintf (file, "0x%x%08x", ++ CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x)); ++ else ++ fprintf (file, "%d", CONST_DOUBLE_LOW (x)); ++ } ++ else ++ /* We can't handle floating point constants; ++ PRINT_OPERAND must handle them. */ ++ output_operand_lossage ("floating constant misused"); ++ break; ++ ++ case PLUS: ++ /* Some assemblers need integer constants to appear last (eg masm). */ ++ if (GET_CODE (XEXP (x, 0)) == CONST_INT) ++ { ++ output_addr_const (file, XEXP (x, 1)); ++ if (INTVAL (XEXP (x, 0)) >= 0) ++ fprintf (file, "+"); ++ output_addr_const (file, XEXP (x, 0)); ++ } ++ else ++ { ++ output_addr_const (file, XEXP (x, 0)); ++ if (INTVAL (XEXP (x, 1)) >= 0) ++ fprintf (file, "+"); ++ output_addr_const (file, XEXP (x, 1)); ++ } ++ break; ++ ++ case MINUS: ++ output_addr_const (file, XEXP (x, 0)); ++ fprintf (file, "-"); ++ output_addr_const (file, XEXP (x, 1)); ++ break; ++ ++ default: ++ output_operand_lossage ("invalid expression as operand"); ++ } ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/fixcpp alliance/genview/src/gcc-1.42/fixcpp +--- alliance-5.0/genview/src/gcc-1.42/fixcpp 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/fixcpp 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,109 @@ ++#!/bin/sh ++# ++# NAME: ++# fixcpp - fix CPP errors ++# ++# SYNOPSIS: ++# fixcpp [-c][-p patch_file][-b bak_dir][-n new_dir] files(s) ++# ++# DESCRIPTION: ++# For each named file, use sed(1) to fixup any descriptive ++# text after #else or #endif or that is not properly ++# commented as this causes ANSI compilers to generate ++# unnecessary warnings. ++# ++# Naturally this script is not guaranteed to be bullit ++# proof, use of -n or -b is advisable! ++# ++# -c causes fixcpp to make sure that only files that ++# needed changing are affected by returning the original ++# file to its original location if no changes were needed. ++# ++# -p causes fixcpp to append to a patch file the context ++# diffs of the changes wraught. ++# ++# SEE ALSO: ++# sed(1) ++# ++# AMENDED: ++# 90/08/08 22:46:32 (sjg) ++# ++# RELEASED: ++# 90/08/08 22:46:34 v1.4 ++# ++# SCCSID: ++# @(#)fixcpp.sh 1.4 90/08/08 22:46:32 (sjg) ++# ++# @(#)Copyright (c) 1990 Simon J. Gerraty ++# ++# This is free software. It comes with NO WARRANTY. ++# Everyone is granted permission to copy, modify and ++# redistribute this source code provided that all ++# recipients are given similar rights, and that the above ++# copyright notice and this notice are preserved in all ++# copies. ++ ++TMPF=/tmp/fixcpp.$$ ++NEWDIR= ++BAKDIR= ++PATCHF= ++CHECK= ++ ++set -- `getopt "cp:b:n:" $*` ++if [ $? != 0 ]; then ++ echo "$0 [-c][-p patch_file][-b bakup_dir][-n new_dir] file [file ...]" >&2 ++ exit 1 ++fi ++for i in $* ++do ++ case $i in ++ -c) CHECK=yes; shift;; ++ -p) PATCHF=$2; shift 2;; ++ -b) BAKDIR=$2; shift 2;; ++ -n) NEWDIR=$2; shift 2;; ++ --) shift; break;; ++ esac ++done ++NEWDIR=${NEWDIR:-.} ++if [ $BAKDIR ]; then ++ if [ ! -d $BAKDIR ]; then ++ echo "$0: no such directory -- $BAKDIR" >&2 ++ exit 1 ++ fi ++fi ++ ++ ++ ++for i in $* ++do ++ if [ $BAKDIR ]; then ++ mv $i $BAKDIR ++ infile=$BAKDIR/$i ++ else ++ if [ "$NEWDIR" = "." ]; then ++ mv $i ${TMPF} ++ infile=${TMPF} ++ else ++ infile=$i ++ fi ++ fi ++ sed -e 's;^#\([ ]*e[nl][^ ]*[ ][ ]*\)\([^/ ][^\*].*\);#\1/* \2 */;' -e 's;^#\([ ]*e[nl][^ ]*[ ][ ]*\)\([^/ ]\)$;#\1/* \2 */;' $infile >${NEWDIR}/$i ++ if [ "${CHECK}" = "yes" -o ${PATCHF} ]; then ++ if cmp -s $infile ${NEWDIR}/$i ; then ++ if [ "${CHECK}" = "yes" ]; then ++ if [ $BAKDIR ]; then ++ mv $infile ${NEWDIR}/$i ++ else ++ rm ${NEWDIR}/$i ++ fi ++ fi ++ else ++ if [ $PATCHF ]; then ++ diff -c $infile ${NEWDIR}/$i >> ${PATCHF} ++ fi ++ fi ++ fi ++ ++done ++ ++rm -f ${TMPF} +diff -Naur alliance-5.0/genview/src/gcc-1.42/fixincludes alliance/genview/src/gcc-1.42/fixincludes +--- alliance-5.0/genview/src/gcc-1.42/fixincludes 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/fixincludes 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,389 @@ ++#! /bin/sh ++# Install modified versions of certain ANSI-incompatible system header files ++# which are fixed to work correctly with ANSI C ++# and placed in a directory that GNU C will search. ++# This works properly on a Sun in system version 3.4; ++# for other versions, you had better check. ++ ++# Directory containing the original header files. ++INCLUDES=${2-${INCLUDES-/usr/include}} ++ ++# Directory in which to store the results. ++LIB=${LIB-/usr/local/lib/gcc-include} ++ ++# Make sure it exists. ++if [ ! -d $LIB ]; then ++ mkdir $LIB || exit 1 ++fi ++ ++# Determine whether this system has symbolic links. ++if ln -s X $LIB/ShouldNotExist 2>/dev/null; then ++ rm -f $LIB/ShouldNotExist ++ LINKS=true ++else ++ LINKS=false ++fi ++ ++echo 'Making directories:' ++cd ${INCLUDES} ++if $LINKS; then ++ files=`ls -LR | sed -n s/:$//p` ++else ++ files=`find . -type d -print | sed '/^.$/d'` ++fi ++for file in $files; do ++ rm -rf $LIB/$file ++ if [ ! -d $LIB/$file ] ++ then mkdir $LIB/$file ++ fi ++done ++ ++# treetops gets an alternating list ++# of old directories to copy ++# and the new directories to copy to. ++treetops="${INCLUDES} ${LIB}" ++ ++if $LINKS; then ++ echo 'Making internal symbolic directory links' ++ for file in $files; do ++ dest=`ls -ld $file | sed -n 's/.*-> //p'` ++ if [ "$dest" ]; then ++ cwd=`pwd` ++ # In case $dest is relative, get to $file's dir first. ++ cd ${INCLUDES} ++ cd `echo ./$file | sed -n 's&[^/]*$&&p'` ++ # Check that the target directory exists. ++ # Redirections changed to avoid bug in sh on Ultrix. ++ (cd $dest) > /dev/null 2>&1 ++ if [ $? = 0 ]; then ++ cd $dest ++ # X gets the dir that the link actually leads to. ++ x=`pwd` ++ # If link leads back into ${INCLUDES}, ++ # make a similar link here. ++ if expr $x : '${INCLUDES}/.*' > /dev/null; then ++ # Y gets the actual target dir name, relative to ${INCLUDES}. ++ y=`echo $x | sed -n 's&${INCLUDES}/&&p'` ++ echo $file '->' $y ': Making link' ++ rm -fr ${LIB}/$file > /dev/null 2>&1 ++ ln -s ${LIB}/$y ${LIB}/$file > /dev/null 2>&1 ++ else ++ # If the link is to outside ${INCLUDES}, ++ # treat this directory as if it actually contained the files. ++# This line used to have $dest instead of $x. ++# $dest seemed to be wrong for links found in subdirectories ++# of ${INCLUDES}. Does this change break anything? ++ treetops="$treetops $x ${LIB}/$file" ++ fi ++ fi ++ cd $cwd ++ fi ++ done ++fi ++ ++set - $treetops ++while [ $# != 0 ]; do ++ # $1 is an old directory to copy, and $2 is the new directory to copy to. ++ echo "Finding header files in $1:" ++ cd ${INCLUDES} ++ cd $1 ++ files=`find . -name '*.h' -type f -print` ++ echo 'Checking header files:' ++# Note that BSD43_* are used on recent MIPS systems. ++ for file in $files; do ++ if egrep '[ ]_IO[A-Z]*\(|[ ]BSD43__IO[A-Z]*\(|#define._IO|#define.BSD43__IO|CTRL' $file > /dev/null; then ++ echo Fixing $file ++ if [ -r $file ]; then ++ cp $file $2/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w $2/$file ++ sed -e ' ++ :loop ++ /\\$/ N ++ /\\$/ b loop ++ /[ ]_IO[A-Z]*[ ]*(/ s/(\(.\),/('\''\1'\'',/ ++ /[ ]BSD43__IO[A-Z]*[ ]*(/ s/(\(.\),/('\''\1'\'',/ ++ /#define._IO/ s/'\''x'\''/x/g ++ /#define.BSD43__IO/ s/'\''x'\''/x/g ++ /[^A-Z]CTRL[ ]*(/ s/\([^'\'']\))/'\''\1'\'')/ ++ /#define.CTRL/ s/'\''c'\''/c/g ++ /#define._CTRL/ s/'\''c'\''/c/g ++ /#define.BSD43_CTRL/ s/'\''c'\''/c/g ++ /#if.* m68k$/ s/m68k/__m68k__/g ++ /#if.*defined *(m68k)/ s/m68k/__m68k__/g ++ ' $2/$file > $2/$file.sed ++ mv $2/$file.sed $2/$file ++ if cmp $file $2/$file >/dev/null 2>&1; then ++ echo Deleting $2/$file\; no fixes were needed. ++ rm $2/$file ++ fi ++ fi ++ fi ++ done ++ shift; shift ++done ++ ++cd ${INCLUDES} ++ ++# Fix one other error in this file: a mismatched quote not inside a C comment. ++file=sundev/vuid_event.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file comment ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Fix this Sun file to avoid intefering with stddef.h. ++ ++file=sys/stdtypes.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file comment ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Fix an error in this file: a missing semi-colon at the end of the statsswtch ++# structure definition. ++file=rpcsvc/rstat.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, definition of statsswtch ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Fix an error in this file: a missing semi-colon at the end of the nodeent ++# structure definition. ++file=netdnet/dnetdb.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, definition of nodeent ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Check for bad #ifdef line (in Ultrix 4.1) ++ ++file=sys/file.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/rpcsvc 2>&- ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, bad \#ifdef line ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Check for superfluous `static' (in Ultrix 4.2) ++ ++file=machine/cpu.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/machine 2>&- ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, superfluous static ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ else ++# This file has an alternative name, mips/cpu.h. Fix that name, too. ++ if cmp machine/cpu.h mips/cpu.h > /dev/null 2>& 1; then ++ mkdir ${LIB}/mips 2>&- ++ ln ${LIB}/$file ${LIB}/mips/cpu.h ++ fi ++ fi ++fi ++ ++# Deal with yet another challenge, this in X11/Xmu.h ++file=X11/Xmu.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/X11 2>&- ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file sprintf declaration ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Check for missing ';' in struct ++ ++file=netinet/ip.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/netinet 2>&- ++ sed -e '/^struct/,/^};/s/}$/};/' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >/dev/null 2>&1 && rm -f ${LIB}/$file ++ fi ++fi ++ ++# Fix the CAT macro in memvar.h. ++ ++file=pixrect/memvar.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/pixrect 2>&- ++ sed -e '/^#define.CAT(a,b)/ i\ ++#ifdef __STDC__ \ ++#define CAT(a,b) a##b\ ++#else ++/^#define.CAT(a,b)/ a\ ++#endif ++' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >/dev/null 2>&1 && rm -f ${LIB}/$file ++ fi ++fi ++ ++# Check for yet more missing ';' in struct (in SunOS 4.0.x) ++ ++file=rpcsvc/rusers.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/rpcsvc 2>&- ++ sed -e '/^struct/,/^};/s/_cnt$/_cnt;/' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >/dev/null 2>&1 && rm -f ${LIB}/$file ++ fi ++fi ++ ++echo 'Removing unneeded directories:' ++cd $LIB ++files=`find . -type d -print | sort -r` ++for file in $files; do ++ rmdir $LIB/$file > /dev/null 2>&1 ++done ++ ++if $LINKS; then ++ echo 'Making internal symbolic non-directory links' ++ cd ${INCLUDES} ++ files=`find . -type l -print` ++ for file in $files; do ++ dest=`ls -ld $file | sed -n 's/.*-> //p'` ++ if expr "$dest" : '[^/].*' > /dev/null; then ++ target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"` ++ if [ -f $target ]; then ++ ln -s $dest ${LIB}/$file >/dev/null 2>&1 ++ fi ++ fi ++ done ++fi ++ ++exit 0 +diff -Naur alliance-5.0/genview/src/gcc-1.42/fixincludes-V4 alliance/genview/src/gcc-1.42/fixincludes-V4 +--- alliance-5.0/genview/src/gcc-1.42/fixincludes-V4 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/fixincludes-V4 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,261 @@ ++#! /bin/sh ++# Install modified versions of certain ANSI-incompatible system header files ++# which are fixed to work correctly with ANSI C ++# and placed in a directory that GNU C will search. ++# This works properly on a Sun in system version 3.4; ++# for other versions, you had better check. ++ ++# Directory in which to store the results. ++LIB=${LIB-/usr/local/lib/gcc-include} ++ ++# Make sure it exists. ++if [ ! -d $LIB ]; then ++ mkdir $LIB || exit 1 ++fi ++ ++# Determine whether this system has symbolic links. ++if ln -s X $LIB/ShouldNotExist 2>/dev/null; then ++ rm -f $LIB/ShouldNotExist ++ LINKS=true ++else ++ LINKS=false ++fi ++ ++echo 'Making directories:' ++cd /usr/include ++if $LINKS; then ++ files=`ls -LR | sed -n s/:$//p` ++else ++ files=`find . -type d -print | sed '/^.$/d'` ++fi ++for file in $files; do ++ rm -rf $LIB/$file ++ if [ ! -d $LIB/$file ] ++ then mkdir $LIB/$file ++ fi ++done ++ ++# treetops gets an alternating list ++# of old directories to copy ++# and the new directories to copy to. ++treetops="/usr/include ${LIB}" ++ ++if $LINKS; then ++ echo 'Making internal symbolic directory links' ++ for file in $files; do ++ dest=`ls -ld $file | sed -n 's/.*-> //p'` ++ if [ "$dest" ]; then ++ cwd=`pwd` ++ # In case $dest is relative, get to $file's dir first. ++ cd /usr/include ++ cd `echo ./$file | sed -n 's&[^/]*$&&p'` ++ # Check that the target directory exists. ++ # Redirections changed to avoid bug in sh on Ultrix. ++ (cd $dest) > /dev/null 2>&1 ++ if [ $? = 0 ]; then ++ cd $dest ++ # X gets the dir that the link actually leads to. ++ x=`pwd` ++ # If link leads back into /usr/include, ++ # make a similar link here. ++ if expr $x : '/usr/include/.*' > /dev/null; then ++ # Y gets the actual target dir name, relative to /usr/include. ++ y=`echo $x | sed -n 's&/usr/include/&&p'` ++ echo $file '->' $y ': Making link' ++ rm -fr ${LIB}/$file > /dev/null 2>&1 ++ ln -s ${LIB}/$y ${LIB}/$file > /dev/null 2>&1 ++ else ++ # If the link is to outside /usr/include, ++ # treat this directory as if it actually contained the files. ++# This line used to have $dest instead of $x. ++# $dest seemed to be wrong for links found in subdirectories ++# of /usr/include. Does this change break anything? ++ treetops="$treetops $x ${LIB}/$file" ++ fi ++ fi ++ cd $cwd ++ fi ++ done ++fi ++ ++set - $treetops ++while [ $# != 0 ]; do ++ # $1 is an old directory to copy, and $2 is the new directory to copy to. ++ echo "Finding header files in $1:" ++ cd /usr/include ++ cd $1 ++ files=`find . -name '*.h' -type f -print` ++ echo 'Checking header files:' ++ for file in $files; do ++ if egrep '[ ]_IO[A-Z]*\(|#define._IO|CTRL|#machine|#lint' $file > /dev/null; then ++ echo Fixing $file ++ if [ -r $file ]; then ++ cp $file $2/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w $2/$file ++ sed -e ' ++ :loop ++ /\\$/ N ++ /\\$/ b loop ++ /[ ]_IO[A-Z]*[ ]*(/ s/(\(.\),/('\''\1'\'',/ ++ /#define._IO/ s/'\''x'\''/x/g ++ /[^A-Z]CTRL[ ]*(/ s/\([^'\'']\))/'\''\1'\'')/ ++ /#define.CTRL/ s/'\''c'\''/c/g ++ /#define._CTRL/ s/'\''c'\''/c/g ++ /^[ ]*#[ ]*if/ s/#machine/defined/g ++ /^[ ]*#[ ]*elif/ s/#machine/defined/g ++ /^[ ]*#[ ]*if/ s/#lint *(on)/defined(lint)/g ++ /^[ ]*#[ ]*elif/ s/#lint *(on)/defined(lint)/g ++ ' $2/$file > $2/$file.sed ++ mv $2/$file.sed $2/$file ++ if cmp $file $2/$file >/dev/null 2>&1; then ++ echo Deleting $2/$file\; no fixes were needed. ++ rm $2/$file ++ fi ++ fi ++ fi ++ done ++ shift; shift ++done ++ ++cd /usr/include ++ ++# Fix one other error in this file: a mismatched quote not inside a C comment. ++file=sundev/vuid_event.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file comment ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Fix an error in this file: a missing semi-colon at the end of the statsswtch ++# structure definition. ++file=rpcsvc/rstat.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, definition of statsswtch ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting $2/$file\; no fixes were needed. ++ rm $2/$file ++ fi ++fi ++ ++# Deal with yet another challenge, this in X11/Xmu.h ++file=X11/Xmu.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/X11 2>&- ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file sprintf declaration ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Check for missing ';' in struct ++ ++file=netinet/ip.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/netinet 2>&- ++ sed -e '/^struct/,/^};/s/}$/};/' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >&- && rm -f ${LIB}/$file ++ fi ++fi ++ ++# Fix the CAT macro in memvar.h. ++ ++file=pixrect/memvar.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/pixrect 2>&- ++ sed -e '/^#define.CAT(a,b)/ s/IDENT(a)b/a##b/g' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >&- && rm -f ${LIB}/$file ++ fi ++fi ++ ++# Check for yet more missing ';' in struct (in SunOS 4.0.x) ++ ++file=rpcsvc/rusers.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/rpcsvc 2>&- ++ sed -e '/^struct/,/^};/s/_cnt$/_cnt;/' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >&- && rm -f ${LIB}/$file ++ fi ++fi ++ ++# Check for yet more missing ';' in struct (in SunOS 4.0.x) ++ ++file=rpcsvc/rusers.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/rpcsvc 2>&- ++ sed -e '/^struct/,/^};/s/_cnt$/_cnt;/' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >&- && rm -f ${LIB}/$file ++ fi ++fi ++ ++echo 'Removing unneeded directories:' ++cd $LIB ++files=`find . -type d -print | sort -r` ++for file in $files; do ++ rmdir $LIB/$file > /dev/null 2>&1 ++done ++ ++if $LINKS; then ++ echo 'Making internal symbolic non-directory links' ++ cd /usr/include ++ files=`find . -type l -print` ++ for file in $files; do ++ dest=`ls -ld $file | sed -n 's/.*-> //p'` ++ if expr "$dest" : '[^/].*' > /dev/null; then ++ target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"` ++ if [ -f $target ]; then ++ ln -s $dest ${LIB}/$file >/dev/null 2>&1 ++ fi ++ fi ++ done ++fi ++ ++exit 0 +diff -Naur alliance-5.0/genview/src/gcc-1.42/fixinc.new alliance/genview/src/gcc-1.42/fixinc.new +--- alliance-5.0/genview/src/gcc-1.42/fixinc.new 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/fixinc.new 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,481 @@ ++#! /bin/sh ++# Install modified versions of certain ANSI-incompatible system header files ++# which are fixed to work correctly with ANSI C ++# and placed in a directory that GNU C will search. ++# This works properly on a Sun in system version 3.4; ++# for other versions, you had better check. ++ ++# Directory containing the original header files. ++INCLUDES=${2-${INCLUDES-/usr/include}} ++ ++# Directory in which to store the results. ++LIB=${LIB-/usr/local/lib/gcc-include} ++ ++# Make sure it exists. ++if [ ! -d $LIB ]; then ++ mkdir $LIB || exit 1 ++fi ++ ++# Determine whether this system has symbolic links. ++if ln -s X $LIB/ShouldNotExist 2>/dev/null; then ++ rm -f $LIB/ShouldNotExist ++ LINKS=true ++else ++ LINKS=false ++fi ++ ++echo Finding directories and links to directories ++cd ${INCLUDES} ++# Find all directories and all symlinks that point to directories. ++# Put the list in $files. ++# Each time we find a symlink, add it to newdirs ++# so that we do another find within the dir the link points to. ++# Note that $files may have duplicates in it; ++# later parts of this file are supposed to ignore them. ++dirs="." ++levels=2 ++while [ -n "$dirs" ] && [ $levels -gt 0 ] ++do ++ levels=`expr $levels - 1` ++ newdirs= ++ for d in $dirs ++ do ++ echo " Searching $INCLUDES/$d" ++ if [ "$d" != . ] ++ then ++ d=$d/. ++ fi ++ ++ # Find all directories under $d, relative to $d, excluding $d itself. ++ files="$files `find $d -type d -print | \ ++ sed -e '/\/\.$/d' -e '/^\.$/d'`" ++ # Find all links to directories. ++ # Using `-exec test -d' in find fails on some systems, ++ # and trying to run test via sh fails on others, ++ # so this is the simplest alternative left. ++ # First find all the links, then test each one. ++ theselinks= ++ $LINKS && \ ++ theselinks=`find $d -type l -print` ++ for d1 in $theselinks --dummy-- ++ do ++ # If the link points to a directory, ++ # add that dir to $newdirs ++ if [ -d $d1 ] ++ then ++ newdirs="$newdirs $d1" ++ fi ++ done ++ done ++ ++ files="$files $newdirs" ++ dirs="$newdirs" ++done ++ ++dirs= ++echo "All directories (including links to directories):" ++echo $files ++ ++for file in $files; do ++ rm -rf $LIB/$file ++ if [ ! -d $LIB/$file ] ++ then mkdir $LIB/$file ++ fi ++done ++mkdir $LIB/root ++ ++# treetops gets an alternating list ++# of old directories to copy ++# and the new directories to copy to. ++treetops="${INCLUDES} ${LIB}" ++ ++if $LINKS; then ++ echo 'Making symbolic directory links' ++ for file in $files; do ++ dest=`ls -ld $file | sed -n 's/.*-> //p'` ++ if [ "$dest" ]; then ++ cwd=`pwd` ++ # In case $dest is relative, get to $file's dir first. ++ cd ${INCLUDES} ++ cd `echo ./$file | sed -n 's&[^/]*$&&p'` ++ # Check that the target directory exists. ++ # Redirections changed to avoid bug in sh on Ultrix. ++ (cd $dest) > /dev/null 2>&1 ++ if [ $? = 0 ]; then ++ cd $dest ++ # X gets the dir that the link actually leads to. ++ x=`pwd` ++ # If a link points to ., make a similar link to . ++ if [ $x = $INCLUDES ]; then ++ echo $file '->' . ': Making link' ++ rm -fr ${LIB}/$file > /dev/null 2>&1 ++ ln -s . ${LIB}/$file > /dev/null 2>&1 ++ # If link leads back into ${INCLUDES}, ++ # make a similar link here. ++ elif expr $x : "${INCLUDES}/.*" > /dev/null; then ++ # Y gets the actual target dir name, relative to ${INCLUDES}. ++ y=`echo $x | sed -n "s&${INCLUDES}/&&p"` ++ echo $file '->' $y ': Making link' ++ rm -fr ${LIB}/$file > /dev/null 2>&1 ++ ln -s ${LIB}/$y ${LIB}/$file > /dev/null 2>&1 ++ else ++ # If the link is to a dir $target outside ${INCLUDES}, ++ # repoint the link at ${INCLUDES}/root$target ++ # and process $target into ${INCLUDES}/root$target ++ # treat this directory as if it actually contained the files. ++ echo $file '->' root$x ': Making link' ++ if [ -d $LIB/root$x ] ++ then true ++ else ++ dirname=root$x/ ++ dirmade=. ++ cd $LIB ++ while [ x$dirname != x ]; do ++ component=`echo $dirname | sed -e 's|/.*$||'` ++ mkdir $component >/dev/null 2>&1 ++ cd $component ++ dirmade=$dirmade/$component ++ dirname=`echo $dirname | sed -e 's|[^/]*/||'` ++ done ++ fi ++ rm -fr ${LIB}/$file > /dev/null 2>&1 ++ ln -s ${LIB}/root$x ${LIB}/$file > /dev/null 2>&1 ++ treetops="$treetops $x ${LIB}/root$x" ++ fi ++ fi ++ cd $cwd ++ fi ++ done ++fi ++ ++set - $treetops ++while [ $# != 0 ]; do ++ # $1 is an old directory to copy, and $2 is the new directory to copy to. ++ cd ${INCLUDES} ++ cd $1 ++# The same dir can appear more than once in treetops. ++# There's no need to scan it more than once. ++ if [ -f $2/DONE ] ++ then ++ files= ++ else ++ touch $2/DONE ++ echo Fixing directory $1 into $2 ++# Check .h files which are symlinks as well as those which are files. ++# A link to a header file will not be processed by anything but this. ++ if $LINKS; then ++ files=`find . -name '*.h' \( -type f -o -type l \) -print` ++ else ++ files=`find . -name '*.h' -type f -print` ++ fi ++ echo Checking header files ++ fi ++# Note that BSD43_* are used on recent MIPS systems. ++ for file in $files; do ++# This call to egrep is essential, since checking a file with egrep ++# is much faster than actually trying to fix it. ++# It is also essential that most files *not* match! ++# Thus, matching every #endif is unacceptable. ++# But the argument to egrep must be kept small, or many versions of egrep ++# won't be able to handle it. ++# rms: I removed `|#[el].*if.*[^/ ]' because it made egrep fail. ++ if egrep '[ _]_IO|CTRL|#define.NULL|#[el]*if.*([0-9]|sparc|vax|sun|pyr)' $file > /dev/null; then ++ echo Fixing $file ++ if [ -r $file ]; then ++ cp $file $2/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w $2/$file ++# Following two lines removed. ++# s%^\([ ]*#[ ]*endif[ ]*\)\([^/ ].*\)$%\1/* \2 */% ++# s%^\([ ]*#[ ]*else[ ]*\)\([^/ ].*\)$%\1/* \2 */% ++ ++ sed -e ' ++ :loop ++ /\\$/ N ++ /\\$/ b loop ++ /[ ]_IO[A-Z]*[ ]*(/ s/(\(.\),/('\''\1'\'',/ ++ /[ ]BSD43__IO[A-Z]*[ ]*(/ s/(\(.\),/('\''\1'\'',/ ++ /#define._IO/ s/'\''x'\''/x/g ++ /#define.BSD43__IO/ s/'\''x'\''/x/g ++ /[^A-Z]CTRL[ ]*(/ s/\([^'\'']\))/'\''\1'\'')/ ++ /#define.CTRL/ s/'\''c'\''/c/g ++ /#define._CTRL/ s/'\''c'\''/c/g ++ /#define.BSD43_CTRL/ s/'\''c'\''/c/g ++ /#if.* m68k$/ s/m68k/__m68k__/g ++ /#if.*defined *(m68k)/ s/m68k/__m68k__/g ++ ' $2/$file > $2/$file.sed ++ mv $2/$file.sed $2/$file ++ if cmp $file $2/$file >/dev/null 2>&1; then ++ echo Deleting $2/$file\; no fixes were needed. ++ rm $2/$file ++ fi ++ fi ++ fi ++ done ++ shift; shift ++done ++ ++cd ${INCLUDES} ++ ++# Fix one other error in this file: a mismatched quote not inside a C comment. ++file=sundev/vuid_event.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file comment ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Fix this Sun file to avoid intefering with stddef.h. ++ ++file=sys/stdtypes.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file comment ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Fix an error in this file: a missing semi-colon at the end of the statsswtch ++# structure definition. ++file=rpcsvc/rstat.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, definition of statsswtch ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Fix an error in this file: a missing semi-colon at the end of the nodeent ++# structure definition. ++file=netdnet/dnetdb.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, definition of nodeent ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Check for bad #ifdef line (in Ultrix 4.1) ++ ++file=sys/file.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/rpcsvc 2>&- ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, bad \#ifdef line ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Check for superfluous `static' (in Ultrix 4.2) ++ ++file=machine/cpu.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/machine 2>&- ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file, superfluous static ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ else ++# This file has an alternative name, mips/cpu.h. Fix that name, too. ++ if cmp machine/cpu.h mips/cpu.h > /dev/null 2>& 1; then ++ mkdir ${LIB}/mips 2>&- ++ ln ${LIB}/$file ${LIB}/mips/cpu.h ++ fi ++ fi ++fi ++ ++# Deal with yet another challenge, this in X11/Xmu.h ++file=X11/Xmu.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/X11 2>&- ++ cp $file ${LIB}/$file >/dev/null 2>&1 \ ++ || echo "Can't copy $file" ++ chmod +w ${LIB}/$file ++ fi ++fi ++ ++if [ -r ${LIB}/$file ]; then ++ echo Fixing $file sprintf declaration ++ ex ${LIB}/$file </dev/null 2>&1; then ++ echo Deleting ${LIB}/$file\; no fixes were needed. ++ rm ${LIB}/$file ++ fi ++fi ++ ++# Check for missing ';' in struct ++ ++file=netinet/ip.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/netinet 2>&- ++ sed -e '/^struct/,/^};/s/}$/};/' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >/dev/null 2>&1 && rm -f ${LIB}/$file ++ fi ++fi ++ ++# Fix the CAT macro in memvar.h. ++ ++file=pixrect/memvar.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/pixrect 2>&- ++ sed -e '/^#define.CAT(a,b)/ i\ ++#ifdef __STDC__ \ ++#define CAT(a,b) a##b\ ++#else ++/^#define.CAT(a,b)/ a\ ++#endif ++' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >/dev/null 2>&1 && rm -f ${LIB}/$file ++ fi ++fi ++ ++# Check for yet more missing ';' in struct (in SunOS 4.0.x) ++ ++file=rpcsvc/rusers.h ++if [ -r $file ]; then ++ if [ ! -r ${LIB}/$file ]; then ++ mkdir ${LIB}/rpcsvc 2>&- ++ sed -e '/^struct/,/^};/s/_cnt$/_cnt;/' $file > ${LIB}/$file ++ cmp $file ${LIB}/$file >/dev/null 2>&1 && rm -f ${LIB}/$file ++ fi ++fi ++ ++echo 'Removing unneeded directories:' ++cd $LIB ++files=`find . -type d -print | sort -r` ++for file in $files; do ++ rmdir $LIB/$file > /dev/null 2>&1 ++done ++ ++if $LINKS; then ++ echo 'Making internal symbolic non-directory links' ++ cd ${INCLUDES} ++ files=`find . -type l -print` ++ for file in $files; do ++ dest=`ls -ld $file | sed -n 's/.*-> //p'` ++ if expr "$dest" : '[^/].*' > /dev/null; then ++ target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"` ++ if [ -f $target ]; then ++ ln -s $dest ${LIB}/$file >/dev/null 2>&1 ++ fi ++ fi ++ done ++fi ++ ++exit 0 +diff -Naur alliance-5.0/genview/src/gcc-1.42/flags.h alliance/genview/src/gcc-1.42/flags.h +--- alliance-5.0/genview/src/gcc-1.42/flags.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/flags.h 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,214 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Compilation switch flag definitions for GNU CC. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++/* Name of the input .c file being compiled. */ ++extern char *main_input_filename; ++ ++/* 1 => write gdb debugging output (using symout.c). ++ 2 => write dbx debugging output (using dbxout.c). ++ 3 => write sdb debugging output (using sdbout.c). */ ++enum debugger { NO_DEBUG = 0, GDB_DEBUG = 1, DBX_DEBUG = 2, SDB_DEBUG = 3, ++ EXTENDED_DBX_DEBUG = 4 }; ++ ++extern enum debugger write_symbols; ++ ++/* Nonzero means use GDB-only extensions of DBX format. */ ++extern int use_gdb_dbx_extensions; ++ ++/* Nonzero means do optimizations. -opt. */ ++ ++extern int optimize; ++ ++/* Nonzero means do stupid register allocation. -noreg. ++ This and `optimize' are controlled by different switches in cc1, ++ but normally cc controls them both with the -O switch. */ ++ ++extern int obey_regdecls; ++ ++/* Don't print functions as they are compiled and don't print ++ times taken by the various passes. -quiet. */ ++ ++extern int quiet_flag; ++ ++/* Don't print warning messages. -w. */ ++ ++extern int inhibit_warnings; ++ ++/* Do print extra warnings (such as for uninitialized variables). -W. */ ++ ++extern int extra_warnings; ++ ++/* Nonzero to warn about unused local variables. */ ++ ++extern int warn_unused; ++ ++/* Nonzero means warn about all declarations which shadow others. */ ++ ++extern int warn_shadow; ++ ++/* Warn if a switch on an enum fails to have a case for every enum value. */ ++ ++extern int warn_switch; ++ ++/* Nonzero means warn about any identifiers that match in the first N ++ characters. The value N is in `id_clash_len'. */ ++ ++extern int warn_id_clash; ++extern int id_clash_len; ++ ++/* Nonzero if generating code to do profiling. */ ++ ++extern int profile_flag; ++ ++/* Nonzero if generating code to do profiling on the basis of basic blocks. */ ++ ++extern int profile_block_flag; ++ ++/* Nonzero for -pedantic switch: warn about anything ++ that standard C forbids. */ ++ ++extern int pedantic; ++ ++/* Now the symbols that are set with `-f' switches. */ ++ ++/* Nonzero means `char' should be signed. */ ++ ++extern int flag_signed_char; ++ ++/* Nonzero means give an enum type only as many bytes as it needs. */ ++ ++extern int flag_short_enums; ++ ++/* Nonzero for -fcaller-saves: allocate values in regs that need to ++ be saved across function calls, if that produces overall better code. ++ Optional now, so people can test it. */ ++ ++extern int flag_caller_saves; ++ ++/* Nonzero for -fpcc-struct-return: return values the same way PCC does. */ ++ ++extern int flag_pcc_struct_return; ++ ++/* Nonzero for -fforce-mem: load memory value into a register ++ before arithmetic on it. This makes better cse but slower compilation. */ ++ ++extern int flag_force_mem; ++ ++/* Nonzero for -fforce-addr: load memory address into a register before ++ reference to memory. This makes better cse but slower compilation. */ ++ ++extern int flag_force_addr; ++ ++/* Nonzero for -fdefer-pop: don't pop args after each function call; ++ instead save them up to pop many calls' args with one insns. */ ++ ++extern int flag_defer_pop; ++ ++/* Nonzero for -ffloat-store: don't allocate floats and doubles ++ in extended-precision registers. */ ++ ++extern int flag_float_store; ++ ++/* Nonzero for -fcombine-regs: ++ allow instruction combiner to combine an insn ++ that just copies one reg to another. */ ++ ++extern int flag_combine_regs; ++ ++/* Nonzero enables strength-reduction in loop.c. */ ++ ++extern int flag_strength_reduce; ++ ++/* Nonzero for -fwritable-strings: ++ store string constants in data segment and don't uniquize them. */ ++ ++extern int flag_writable_strings; ++ ++/* Nonzero means don't put addresses of constant functions in registers. ++ Used for compiling the Unix kernel, where strange substitutions are ++ done on the assembly output. */ ++ ++extern int flag_no_function_cse; ++ ++/* Nonzero for -fomit-frame-pointer: ++ don't make a frame pointer in simple functions that don't require one. */ ++ ++extern int flag_omit_frame_pointer; ++ ++/* This isn't a flag, but everyone who needs flag_omit_frame_pointer ++ also needs this. ++ Nonzero means current function must be given a frame pointer. ++ Set in stmt.c if anything is allocated on the stack there. ++ Set in reload1.c if anything is allocated on the stack there. */ ++ ++extern int frame_pointer_needed; ++ ++/* Nonzero to inhibit use of define_optimization peephole opts. */ ++ ++extern int flag_no_peephole; ++ ++/* Nonzero means all references through pointers are volatile. */ ++ ++extern int flag_volatile; ++ ++/* Nonzero means make functions that look like good inline candidates ++ go inline. */ ++ ++extern int flag_inline_functions; ++ ++/* Nonzero for -fkeep-inline-functions: even if we make a function ++ go inline everywhere, keep its defintion around for debugging ++ purposes. */ ++ ++extern int flag_keep_inline_functions; ++ ++/* Nonzero if we are only using compiler to check syntax errors. */ ++ ++extern int flag_syntax_only; ++ ++/* Nonzero means make the text shared if supported. */ ++ ++extern int flag_shared_data; ++ ++/* Nonzero means put things in delayed-branch slots if supported. */ ++ ++extern int flag_delayed_branch; +diff -Naur alliance-5.0/genview/src/gcc-1.42/flow.c alliance/genview/src/gcc-1.42/flow.c +--- alliance-5.0/genview/src/gcc-1.42/flow.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/flow.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,2117 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Data flow analysis for GNU compiler. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* This file contains the data flow analysis pass of the compiler. ++ It computes data flow information ++ which tells combine_instructions which insns to consider combining ++ and controls register allocation. ++ ++ Additional data flow information that is too bulky to record ++ is generated during the analysis, and is used at that time to ++ create autoincrement and autodecrement addressing. ++ ++ The first step is dividing the function into basic blocks. ++ find_basic_blocks does this. Then life_analysis determines ++ where each register is live and where it is dead. ++ ++ ** find_basic_blocks ** ++ ++ find_basic_blocks divides the current function's rtl ++ into basic blocks. It records the beginnings and ends of the ++ basic blocks in the vectors basic_block_head and basic_block_end, ++ and the number of blocks in n_basic_blocks. ++ ++ find_basic_blocks also finds any unreachable loops ++ and deletes them. ++ ++ ** life_analysis ** ++ ++ life_analysis is called immediately after find_basic_blocks. ++ It uses the basic block information to determine where each ++ hard or pseudo register is live. ++ ++ ** live-register info ** ++ ++ The information about where each register is live is in two parts: ++ the REG_NOTES of insns, and the vector basic_block_live_at_start. ++ ++ basic_block_live_at_start has an element for each basic block, ++ and the element is a bit-vector with a bit for each hard or pseudo ++ register. The bit is 1 if the register is live at the beginning ++ of the basic block. ++ ++ To each insn's REG_NOTES is added an element for each register ++ that is live before the insn or set by the insn, but is dead ++ after the insn. ++ ++ To determine which registers are live after any insn, one can ++ start from the beginning of the basic block and scan insns, noting ++ which registers are set by each insn and which die there. ++ ++ ** Other actions of life_analysis ** ++ ++ life_analysis sets up the LOG_LINKS fields of insns because the ++ information needed to do so is readily available. ++ ++ life_analysis deletes insns whose only effect is to store a value ++ that is never used. ++ ++ life_analysis notices cases where a reference to a register as ++ a memory address can be combined with a preceding or following ++ incrementation or decrementation of the register. The separate ++ instruction to increment or decrement is deleted and the address ++ is changed to a POST_INC or similar rtx. ++ ++ Each time an incrementing or decrementing address is created, ++ a REG_INC element is added to the insn's REG_NOTES list. ++ ++ life_analysis fills in certain vectors containing information about ++ register usage: reg_n_refs, reg_n_deaths, reg_n_sets, ++ reg_live_length, reg_n_calls_crosses and reg_basic_block. */ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "basic-block.h" ++#include "regs.h" ++#include "hard-reg-set.h" ++#include "flags.h" ++ ++#include "obstack.h" ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++ ++extern int xmalloc (); ++extern void free (); ++ ++/* Get the basic block number of an insn. ++ This info should not be expected to remain available ++ after the end of life_analysis. */ ++ ++#define BLOCK_NUM(INSN) uid_block_number[INSN_UID (INSN)] ++ ++/* This is where the BLOCK_NUM values are really stored. ++ This is set up by find_basic_blocks and used there and in life_analysis, ++ and then freed. */ ++ ++static short *uid_block_number; ++ ++/* INSN_VOLATILE (insn) is 1 if the insn refers to anything volatile. */ ++ ++#define INSN_VOLATILE(INSN) uid_volatile[INSN_UID (INSN)] ++static char *uid_volatile; ++ ++/* Number of basic blocks in the current function. */ ++ ++int n_basic_blocks; ++ ++/* Maximum register number used in this function, plus one. */ ++ ++int max_regno; ++ ++/* Indexed by n, gives number of basic block that (REG n) is used in. ++ If the value is REG_BLOCK_GLOBAL (-2), ++ it means (REG n) is used in more than one basic block. ++ REG_BLOCK_UNKNOWN (-1) means it hasn't been seen yet so we don't know. ++ This information remains valid for the rest of the compilation ++ of the current function; it is used to control register allocation. */ ++ ++short *reg_basic_block; ++ ++/* Indexed by n, gives number of times (REG n) is used or set, each ++ weighted by its loop-depth. ++ This information remains valid for the rest of the compilation ++ of the current function; it is used to control register allocation. */ ++ ++short *reg_n_refs; ++ ++/* Indexed by n, gives number of times (REG n) is set. ++ This information remains valid for the rest of the compilation ++ of the current function; it is used to control register allocation. */ ++ ++short *reg_n_sets; ++ ++/* Indexed by N, gives number of places register N dies. ++ This information remains valid for the rest of the compilation ++ of the current function; it is used to control register allocation. */ ++ ++short *reg_n_deaths; ++ ++/* Indexed by N, gives 1 if that reg is live across any CALL_INSNs. ++ This information remains valid for the rest of the compilation ++ of the current function; it is used to control register allocation. */ ++ ++int *reg_n_calls_crossed; ++ ++/* Indexed by N, gives the uid of the first insn that mentions reg N, ++ provided that reg is local to one basic block. ++ The value here is undefined otherwise. */ ++ ++rtx *reg_first_use; ++ ++/* Total number of instructions at which (REG n) is live. ++ The larger this is, the less priority (REG n) gets for ++ allocation in a real register. ++ This information remains valid for the rest of the compilation ++ of the current function; it is used to control register allocation. ++ ++ local-alloc.c may alter this number to change the priority. ++ ++ Negative values are special. ++ -1 is used to mark a pseudo reg which has a constant or memory equivalent ++ and is used infrequently enough that it should not get a hard register. ++ -2 is used to mark a pseudo reg for a parameter, when a frame pointer ++ is not required. global-alloc.c makes an allocno for this but does ++ not try to assign a hard register to it. */ ++ ++int *reg_live_length; ++ ++/* Element N is the next insn that uses (hard or pseudo) register number N ++ within the current basic block; or zero, if there is no such insn. ++ This is valid only during the final backward scan in propagate_block. */ ++ ++static rtx *reg_next_use; ++ ++/* Size of a regset for the current function, ++ in (1) bytes and (2) elements. */ ++ ++int regset_bytes; ++int regset_size; ++ ++/* Element N is first insn in basic block N. ++ This info lasts until we finish compiling the function. */ ++ ++rtx *basic_block_head; ++ ++/* Element N is last insn in basic block N. ++ This info lasts until we finish compiling the function. */ ++ ++rtx *basic_block_end; ++ ++/* Element N is a regset describing the registers live ++ at the start of basic block N. ++ This info lasts until we finish compiling the function. */ ++ ++regset *basic_block_live_at_start; ++ ++/* Regset of regs live when calls to `setjmp'-like functions happen. */ ++ ++regset regs_live_at_setjmp; ++ ++/* Element N is nonzero if control can drop into basic block N ++ from the preceding basic block. Freed after life_analysis. */ ++ ++static char *basic_block_drops_in; ++ ++/* Element N is depth within loops of basic block number N. ++ Freed after life_analysis. */ ++ ++static short *basic_block_loop_depth; ++ ++/* Element N nonzero if basic block N can actually be reached. ++ Vector exists only during find_basic_blocks. */ ++ ++static char *block_live_static; ++ ++/* Depth within loops of basic block being scanned for lifetime analysis, ++ plus one. This is the weight attached to references to registers. */ ++ ++static int loop_depth; ++ ++/* Define AUTO_INC_DEC if machine has any kind of incrementing ++ or decrementing addressing. */ ++ ++#ifdef HAVE_PRE_DECREMENT ++#define AUTO_INC_DEC ++#endif ++ ++#ifdef HAVE_PRE_INCREMENT ++#define AUTO_INC_DEC ++#endif ++ ++#ifdef HAVE_POST_DECREMENT ++#define AUTO_INC_DEC ++#endif ++ ++#ifdef HAVE_POST_INCREMENT ++#define AUTO_INC_DEC ++#endif ++ ++/* Forward declarations */ ++static void find_basic_blocks (); ++static void life_analysis (); ++static void mark_label_ref (); ++void allocate_for_life_analysis (); /* Used also in stupid_life_analysis */ ++static void init_regset_vector (); ++static void propagate_block (); ++static void mark_set_regs (); ++static void mark_used_regs (); ++static int insn_dead_p (); ++static int libcall_dead_p (); ++static int try_pre_increment (); ++static int try_pre_increment_1 (); ++static rtx find_use_as_address (); ++void dump_flow_info (); ++ ++/* Find basic blocks of the current function and perform data flow analysis. ++ F is the first insn of the function and NREGS the number of register numbers ++ in use. */ ++ ++void ++flow_analysis (f, nregs, file) ++ rtx f; ++ int nregs; ++ FILE *file; ++{ ++ register rtx insn; ++ register int i; ++ register int max_uid = 0; ++ ++ /* Count the basic blocks. Also find maximum insn uid value used. */ ++ ++ { ++ register RTX_CODE prev_code = JUMP_INSN; ++ register RTX_CODE code; ++ ++ for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ++ { ++ code = GET_CODE (insn); ++ if (INSN_UID (insn) > max_uid) ++ max_uid = INSN_UID (insn); ++ if (code == CODE_LABEL ++ || (prev_code != INSN && prev_code != CALL_INSN ++ && prev_code != CODE_LABEL ++ && (code == INSN || code == CALL_INSN || code == JUMP_INSN))) ++ i++; ++ if (code != NOTE) ++ prev_code = code; ++ } ++ } ++ ++ /* Allocate some tables that last till end of compiling this function ++ and some needed only in find_basic_blocks and life_analysis. */ ++ ++ n_basic_blocks = i; ++ basic_block_head = (rtx *) oballoc (n_basic_blocks * sizeof (rtx)); ++ basic_block_end = (rtx *) oballoc (n_basic_blocks * sizeof (rtx)); ++ basic_block_drops_in = (char *) alloca (n_basic_blocks); ++ basic_block_loop_depth = (short *) alloca (n_basic_blocks * sizeof (short)); ++ uid_block_number = (short *) alloca ((max_uid + 1) * sizeof (short)); ++ uid_volatile = (char *) alloca (max_uid + 1); ++ bzero (uid_volatile, max_uid + 1); ++ ++ find_basic_blocks (f); ++ life_analysis (f, nregs); ++ if (file) ++ dump_flow_info (file); ++ ++ basic_block_drops_in = 0; ++ uid_block_number = 0; ++ basic_block_loop_depth = 0; ++} ++ ++/* Find all basic blocks of the function whose first insn is F. ++ Store the correct data in the tables that describe the basic blocks, ++ set up the chains of references for each CODE_LABEL, and ++ delete any entire basic blocks that cannot be reached. */ ++ ++static void ++find_basic_blocks (f) ++ rtx f; ++{ ++ register rtx insn; ++ register int i; ++ ++ /* Initialize the ref chain of each label to 0. */ ++ /* Record where all the blocks start and end and their depth in loops. */ ++ /* For each insn, record the block it is in. */ ++ ++ { ++ register RTX_CODE prev_code = JUMP_INSN; ++ register RTX_CODE code; ++ int depth = 1; ++ ++ for (insn = f, i = -1; insn; insn = NEXT_INSN (insn)) ++ { ++ code = GET_CODE (insn); ++ if (code == NOTE) ++ { ++ if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG) ++ depth++; ++ else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END) ++ depth--; ++ } ++ else if (code == CODE_LABEL ++ || (prev_code != INSN && prev_code != CALL_INSN ++ && prev_code != CODE_LABEL ++ && (code == INSN || code == CALL_INSN || code == JUMP_INSN))) ++ { ++ basic_block_head[++i] = insn; ++ basic_block_end[i] = insn; ++ basic_block_loop_depth[i] = depth; ++ if (code == CODE_LABEL) ++ LABEL_REFS (insn) = insn; ++ } ++ else if (code == INSN || code == CALL_INSN || code == JUMP_INSN) ++ basic_block_end[i] = insn; ++ BLOCK_NUM (insn) = i; ++ if (code != NOTE) ++ prev_code = code; ++ } ++ if (i + 1 != n_basic_blocks) ++ abort (); ++ } ++ ++ /* Record which basic blocks control can drop in to. */ ++ ++ { ++ register int i; ++ for (i = 0; i < n_basic_blocks; i++) ++ { ++ register rtx insn = PREV_INSN (basic_block_head[i]); ++ /* TEMP1 is used to avoid a bug in Sequent's compiler. */ ++ register int temp1; ++ while (insn && GET_CODE (insn) == NOTE) ++ insn = PREV_INSN (insn); ++ temp1 = insn && GET_CODE (insn) != BARRIER; ++ basic_block_drops_in[i] = temp1; ++ } ++ } ++ ++ /* Now find which basic blocks can actually be reached ++ and put all jump insns' LABEL_REFS onto the ref-chains ++ of their target labels. */ ++ ++ if (n_basic_blocks > 0) ++ { ++ register char *block_live = (char *) alloca (n_basic_blocks); ++ register char *block_marked = (char *) alloca (n_basic_blocks); ++ int something_marked = 1; ++ ++ /* Initialize with just block 0 reachable and no blocks marked. */ ++ ++ bzero (block_live, n_basic_blocks); ++ bzero (block_marked, n_basic_blocks); ++ block_live[0] = 1; ++ block_live_static = block_live; ++ ++ /* Pass over all blocks, marking each block that is reachable ++ and has not yet been marked. ++ Keep doing this until, in one pass, no blocks have been marked. ++ Then blocks_live and blocks_marked are identical and correct. ++ In addition, all jumps actually reachable have been marked. */ ++ ++ while (something_marked) ++ { ++ something_marked = 0; ++ for (i = 0; i < n_basic_blocks; i++) ++ if (block_live[i] && !block_marked[i]) ++ { ++ block_marked[i] = 1; ++ something_marked = 1; ++ if (i + 1 < n_basic_blocks && basic_block_drops_in[i + 1]) ++ block_live[i + 1] = 1; ++ insn = basic_block_end[i]; ++ if (GET_CODE (insn) == JUMP_INSN) ++ mark_label_ref (PATTERN (insn), insn, 0); ++ } ++ } ++ ++ /* Now delete the code for any basic blocks that can't be reached. ++ They can occur because jump_optimize does not recognize ++ unreachable loops as unreachable. */ ++ ++ for (i = 0; i < n_basic_blocks; i++) ++ if (!block_live[i]) ++ { ++ insn = basic_block_head[i]; ++ while (1) ++ { ++ if (GET_CODE (insn) == BARRIER) ++ abort (); ++ if (GET_CODE (insn) != NOTE) ++ { ++ PUT_CODE (insn, NOTE); ++ NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (insn) = 0; ++ } ++ if (insn == basic_block_end[i]) ++ { ++ /* BARRIERs are between basic blocks, not part of one. ++ Delete a BARRIER if the preceding jump is deleted. ++ We cannot alter a BARRIER into a NOTE ++ because it is too short; but we can really delete ++ it because it is not part of a basic block. */ ++ if (NEXT_INSN (insn) != 0 ++ && GET_CODE (NEXT_INSN (insn)) == BARRIER) ++ delete_insn (NEXT_INSN (insn)); ++ break; ++ } ++ insn = NEXT_INSN (insn); ++ } ++ /* Each time we delete some basic blocks, ++ see if there is a jump around them that is ++ being turned into a no-op. If so, delete it. */ ++ ++ if (block_live[i - 1]) ++ { ++ register int j; ++ for (j = i; j < n_basic_blocks; j++) ++ if (block_live[j]) ++ { ++ rtx label; ++ insn = basic_block_end[i - 1]; ++ if (GET_CODE (insn) == JUMP_INSN ++ /* An unconditional jump is the only possibility ++ we must check for, since a conditional one ++ would make these blocks live. */ ++ && simplejump_p (insn) ++ && (label = XEXP (SET_SRC (PATTERN (insn)), 0), 1) ++ && INSN_UID (label) != 0 ++ && BLOCK_NUM (label) == j) ++ { ++ PUT_CODE (insn, NOTE); ++ NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (insn) = 0; ++ if (GET_CODE (NEXT_INSN (insn)) != BARRIER) ++ abort (); ++ delete_insn (NEXT_INSN (insn)); ++ } ++ break; ++ } ++ } ++ } ++ } ++} ++ ++/* Check expression X for label references; ++ if one is found, add INSN to the label's chain of references. ++ ++ CHECKDUP means check for and avoid creating duplicate references ++ from the same insn. Such duplicates do no serious harm but ++ can slow life analysis. CHECKDUP is set only when duplicates ++ are likely. */ ++ ++static void ++mark_label_ref (x, insn, checkdup) ++ rtx x, insn; ++ int checkdup; ++{ ++ register RTX_CODE code = GET_CODE (x); ++ register int i; ++ register char *fmt; ++ ++ if (code == LABEL_REF) ++ { ++ register rtx label = XEXP (x, 0); ++ register rtx y; ++ if (GET_CODE (label) != CODE_LABEL) ++ abort (); ++ /* If the label was never emitted, this insn is junk, ++ but avoid a crash trying to refer to BLOCK_NUM (label). ++ This can happen as a result of a syntax error ++ and a diagnostic has already been printed. */ ++ if (INSN_UID (label) == 0) ++ return; ++ CONTAINING_INSN (x) = insn; ++ /* if CHECKDUP is set, check for duplicate ref from same insn ++ and don't insert. */ ++ if (checkdup) ++ for (y = LABEL_REFS (label); y != label; y = LABEL_NEXTREF (y)) ++ if (CONTAINING_INSN (y) == insn) ++ return; ++ LABEL_NEXTREF (x) = LABEL_REFS (label); ++ LABEL_REFS (label) = x; ++ block_live_static[BLOCK_NUM (label)] = 1; ++ return; ++ } ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ { ++ if (fmt[i] == 'e') ++ mark_label_ref (XEXP (x, i), insn, 0); ++ if (fmt[i] == 'E') ++ { ++ register int j; ++ for (j = 0; j < XVECLEN (x, i); j++) ++ mark_label_ref (XVECEXP (x, i, j), insn, 1); ++ } ++ } ++} ++ ++/* Determine the which registers are live at the start of each ++ basic block of the function whose first insn is F. ++ NREGS is the number of registers used in F. ++ We allocate the vector basic_block_live_at_start ++ and the regsets that it points to, and fill them with the data. ++ regset_size and regset_bytes are also set here. */ ++ ++static void ++life_analysis (f, nregs) ++ rtx f; ++ int nregs; ++{ ++ register regset tem; ++ int first_pass; ++ int changed; ++ /* For each basic block, a bitmask of regs ++ live on exit from the block. */ ++ regset *basic_block_live_at_end; ++ /* For each basic block, a bitmask of regs ++ live on entry to a successor-block of this block. ++ If this does not match basic_block_live_at_end, ++ that must be updated, and the block must be rescanned. */ ++ regset *basic_block_new_live_at_end; ++ /* For each basic block, a bitmask of regs ++ whose liveness at the end of the basic block ++ can make a difference in which regs are live on entry to the block. ++ These are the regs that are set within the basic block, ++ possibly excluding those that are used after they are set. */ ++ regset *basic_block_significant; ++ register int i; ++ rtx insn; ++ ++ struct obstack flow_obstack; ++ ++ obstack_init (&flow_obstack); ++ ++ max_regno = nregs; ++ ++ bzero (regs_ever_live, sizeof regs_ever_live); ++ ++ /* Allocate and zero out many data structures ++ that will record the data from lifetime analysis. */ ++ ++ allocate_for_life_analysis (); ++ ++ reg_next_use = (rtx *) alloca (nregs * sizeof (rtx)); ++ bzero (reg_next_use, nregs * sizeof (rtx)); ++ ++ /* Set up several regset-vectors used internally within this function. ++ Their meanings are documented above, with their declarations. */ ++ ++ basic_block_live_at_end = (regset *) alloca (n_basic_blocks * sizeof (regset)); ++ /* Don't use alloca since that leads to a crash rather than an error message ++ if there isn't enough space. ++ Don't use oballoc since we may need to allocate other things during ++ this function on the temporary obstack. */ ++ tem = (regset) obstack_alloc (&flow_obstack, n_basic_blocks * regset_bytes); ++ bzero (tem, n_basic_blocks * regset_bytes); ++ init_regset_vector (basic_block_live_at_end, tem, n_basic_blocks, regset_bytes); ++ ++ basic_block_new_live_at_end = (regset *) alloca (n_basic_blocks * sizeof (regset)); ++ tem = (regset) obstack_alloc (&flow_obstack, n_basic_blocks * regset_bytes); ++ bzero (tem, n_basic_blocks * regset_bytes); ++ init_regset_vector (basic_block_new_live_at_end, tem, n_basic_blocks, regset_bytes); ++ ++ basic_block_significant = (regset *) alloca (n_basic_blocks * sizeof (regset)); ++ tem = (regset) obstack_alloc (&flow_obstack, n_basic_blocks * regset_bytes); ++ bzero (tem, n_basic_blocks * regset_bytes); ++ init_regset_vector (basic_block_significant, tem, n_basic_blocks, regset_bytes); ++ ++ /* Record which insns refer to any volatile memory ++ or for any reason can't be deleted just because they are dead stores. ++ Also, delete any insns that copy a register to itself. */ ++ ++ for (insn = f; insn; insn = NEXT_INSN (insn)) ++ { ++ enum rtx_code code1 = GET_CODE (insn); ++ if (code1 == CALL_INSN) ++ INSN_VOLATILE (insn) = 1; ++ else if (code1 == INSN || code1 == JUMP_INSN) ++ { ++ if (GET_CODE (PATTERN (insn)) == SET ++ && GET_CODE (SET_DEST (PATTERN (insn))) == REG ++ && GET_CODE (SET_SRC (PATTERN (insn))) == REG ++ && REGNO (SET_DEST (PATTERN (insn))) == ++ REGNO (SET_SRC (PATTERN (insn)))) ++ { ++ PUT_CODE (insn, NOTE); ++ NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (insn) = 0; ++ } ++ else if (GET_CODE (PATTERN (insn)) != USE) ++ INSN_VOLATILE (insn) = volatile_refs_p (PATTERN (insn)); ++ /* A SET that makes space on the stack cannot be dead. ++ (Such SETs occur only for allocating variable-size data, ++ so they will always have a PLUS or MINUS according to the ++ direction of stack growth.) ++ Even if this function never uses this stack pointer value, ++ signal handlers do! */ ++ else if (code1 == INSN && GET_CODE (PATTERN (insn)) == SET ++ && SET_DEST (PATTERN (insn)) == stack_pointer_rtx ++#ifdef STACK_GROWS_DOWNWARD ++ && GET_CODE (SET_SRC (PATTERN (insn))) == MINUS ++#else ++ && GET_CODE (SET_SRC (PATTERN (insn))) == PLUS ++#endif ++ && XEXP (SET_SRC (PATTERN (insn)), 0) == stack_pointer_rtx) ++ INSN_VOLATILE (insn) = 1; ++ } ++ } ++ ++ if (n_basic_blocks > 0) ++#ifdef EXIT_IGNORE_STACK ++ if (! (EXIT_IGNORE_STACK) || ! frame_pointer_needed) ++#endif ++ { ++ /* If exiting needs the right stack value, ++ consider the stack pointer live at the end of the function. */ ++ basic_block_live_at_end[n_basic_blocks - 1] ++ [STACK_POINTER_REGNUM / REGSET_ELT_BITS] ++ |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ++ basic_block_new_live_at_end[n_basic_blocks - 1] ++ [STACK_POINTER_REGNUM / REGSET_ELT_BITS] ++ |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ++ } ++ ++ /* Propagate life info through the basic blocks ++ around the graph of basic blocks. ++ ++ This is a relaxation process: each time a new register ++ is live at the end of the basic block, we must scan the block ++ to determine which registers are, as a consequence, live at the beginning ++ of that block. These registers must then be marked live at the ends ++ of all the blocks that can transfer control to that block. ++ The process continues until it reaches a fixed point. */ ++ ++ first_pass = 1; ++ changed = 1; ++ while (changed) ++ { ++ changed = 0; ++ for (i = n_basic_blocks - 1; i >= 0; i--) ++ { ++ int consider = first_pass; ++ int must_rescan = first_pass; ++ register int j; ++ ++ /* Set CONSIDER if this block needs thinking about at all ++ (that is, if the regs live now at the end of it ++ are not the same as were live at the end of it when ++ we last thought about it). ++ Set must_rescan if it needs to be thought about ++ instruction by instruction (that is, if any additional ++ reg that is live at the end now but was not live there before ++ is one of the significant regs of this basic block). */ ++ ++ for (j = 0; j < regset_size; j++) ++ { ++ register int x = basic_block_new_live_at_end[i][j] ++ & ~basic_block_live_at_end[i][j]; ++ if (x) ++ consider = 1; ++ if (x & basic_block_significant[i][j]) ++ { ++ must_rescan = 1; ++ consider = 1; ++ break; ++ } ++ } ++ ++ if (! consider) ++ continue; ++ ++ /* The live_at_start of this block may be changing, ++ so another pass will be required after this one. */ ++ changed = 1; ++ ++ if (! must_rescan) ++ { ++ /* No complete rescan needed; ++ just record those variables newly known live at end ++ as live at start as well. */ ++ for (j = 0; j < regset_size; j++) ++ { ++ register int x = basic_block_new_live_at_end[i][j] ++ & ~basic_block_live_at_end[i][j]; ++ basic_block_live_at_start[i][j] |= x; ++ basic_block_live_at_end[i][j] |= x; ++ } ++ } ++ else ++ { ++ /* Update the basic_block_live_at_start ++ by propagation backwards through the block. */ ++ bcopy (basic_block_new_live_at_end[i], ++ basic_block_live_at_end[i], regset_bytes); ++ bcopy (basic_block_live_at_end[i], ++ basic_block_live_at_start[i], regset_bytes); ++ propagate_block (basic_block_live_at_start[i], ++ basic_block_head[i], basic_block_end[i], 0, ++ first_pass ? basic_block_significant[i] : 0, ++ i); ++ } ++ ++ { ++ register rtx jump, head; ++ /* Update the basic_block_new_live_at_end's of the block ++ that falls through into this one (if any). */ ++ head = basic_block_head[i]; ++ jump = PREV_INSN (head); ++ if (basic_block_drops_in[i]) ++ { ++ register int from_block = BLOCK_NUM (jump); ++ register int j; ++ for (j = 0; j < regset_size; j++) ++ basic_block_new_live_at_end[from_block][j] ++ |= basic_block_live_at_start[i][j]; ++ } ++ /* Update the basic_block_new_live_at_end's of ++ all the blocks that jump to this one. */ ++ if (GET_CODE (head) == CODE_LABEL) ++ for (jump = LABEL_REFS (head); ++ jump != head; ++ jump = LABEL_NEXTREF (jump)) ++ { ++ register int from_block = BLOCK_NUM (CONTAINING_INSN (jump)); ++ register int j; ++ for (j = 0; j < regset_size; j++) ++ basic_block_new_live_at_end[from_block][j] ++ |= basic_block_live_at_start[i][j]; ++ } ++ } ++#ifdef USE_C_ALLOCA ++ alloca (0); ++#endif ++ } ++ first_pass = 0; ++ } ++ ++#if 0 /* This seems unnecessary; life at start of function shouldn't ++ mean that the reg is live in more than one basic block. */ ++ ++ /* Process the regs live at the beginning of the function. ++ Mark them as not local to any one basic block. */ ++ ++ if (n_basic_blocks > 0) ++ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ++ if (basic_block_live_at_start[0][i / REGSET_ELT_BITS] ++ & (1 << (i % REGSET_ELT_BITS))) ++ reg_basic_block[i] = REG_BLOCK_GLOBAL; ++#endif ++ ++ /* Now the life information is accurate. ++ Make one more pass over each basic block ++ to delete dead stores, create autoincrement addressing ++ and record how many times each register is used, is set, or dies. ++ ++ To save time, we operate directly in basic_block_live_at_end[i], ++ thus destroying it (in fact, converting it into a copy of ++ basic_block_live_at_start[i]). This is ok now because ++ basic_block_live_at_end[i] is no longer used past this point. */ ++ ++ for (i = 0; i < n_basic_blocks; i++) ++ { ++ propagate_block (basic_block_live_at_end[i], ++ basic_block_head[i], basic_block_end[i], 1, 0, i); ++#ifdef USE_C_ALLOCA ++ alloca (0); ++#endif ++ } ++ ++#if 0 ++ /* Something live during a setjmp should not be put in a register ++ on certain machines which restore regs from stack frames ++ rather than from the jmpbuf. ++ But we don't need to do this for the user's variables, since ++ ANSI says only volatile variables need this. */ ++#ifdef LONGJMP_RESTORE_FROM_STACK ++ for (i = FIRST_PSEUDO_REGISTER; i < nregs; i++) ++ if (regs_live_at_setjmp[i / REGSET_ELT_BITS] & (1 << (i % REGSET_ELT_BITS)) ++ && regno_reg_rtx[i] != 0 && ! REG_USERVAR_P (regno_reg_rtx[i])) ++ { ++ reg_live_length[i] = -1; ++ reg_basic_block[i] = -1; ++ } ++#endif ++#endif ++ ++ /* We have a problem with any pseudoreg that ++ lives across the setjmp. ANSI says that if a ++ user variable does not change in value ++ between the setjmp and the longjmp, then the longjmp preserves it. ++ This includes longjmp from a place where the pseudo appears dead. ++ (In principle, the value still exists if it is in scope.) ++ If the pseudo goes in a hard reg, some other value may occupy ++ that hard reg where this pseudo is dead, thus clobbering the pseudo. ++ Conclusion: such a pseudo must not go in a hard reg. */ ++ for (i = FIRST_PSEUDO_REGISTER; i < nregs; i++) ++ if (regs_live_at_setjmp[i / REGSET_ELT_BITS] & (1 << (i % REGSET_ELT_BITS)) ++ && regno_reg_rtx[i] != 0) ++ { ++ reg_live_length[i] = -1; ++ reg_basic_block[i] = -1; ++ } ++ ++ obstack_free (&flow_obstack, 0); ++} ++ ++/* Subroutines of life analysis. */ ++ ++/* Allocate the permanent data structures that represent the results ++ of life analysis. Not static since used also for stupid life analysis. */ ++ ++void ++allocate_for_life_analysis () ++{ ++ register int i; ++ register regset tem; ++ ++ regset_size = ((max_regno + REGSET_ELT_BITS - 1) / REGSET_ELT_BITS); ++ regset_bytes = regset_size * sizeof (*(regset)0); ++ ++ reg_n_refs = (short *) oballoc (max_regno * sizeof (short)); ++ bzero (reg_n_refs, max_regno * sizeof (short)); ++ ++ reg_n_sets = (short *) oballoc (max_regno * sizeof (short)); ++ bzero (reg_n_sets, max_regno * sizeof (short)); ++ ++ reg_n_deaths = (short *) oballoc (max_regno * sizeof (short)); ++ bzero (reg_n_deaths, max_regno * sizeof (short)); ++ ++ reg_first_use = (rtx *) oballoc (max_regno * sizeof (rtx)); ++ bzero (reg_first_use, max_regno * sizeof (rtx)); ++ ++ reg_live_length = (int *) oballoc (max_regno * sizeof (int)); ++ bzero (reg_live_length, max_regno * sizeof (int)); ++ ++ reg_n_calls_crossed = (int *) oballoc (max_regno * sizeof (int)); ++ bzero (reg_n_calls_crossed, max_regno * sizeof (int)); ++ ++ reg_basic_block = (short *) oballoc (max_regno * sizeof (short)); ++ for (i = 0; i < max_regno; i++) ++ reg_basic_block[i] = REG_BLOCK_UNKNOWN; ++ ++ basic_block_live_at_start = (regset *) oballoc (n_basic_blocks * sizeof (regset)); ++ tem = (regset) oballoc (n_basic_blocks * regset_bytes); ++ bzero (tem, n_basic_blocks * regset_bytes); ++ init_regset_vector (basic_block_live_at_start, tem, n_basic_blocks, regset_bytes); ++ ++ regs_live_at_setjmp = (regset) oballoc (regset_bytes); ++ bzero (regs_live_at_setjmp, regset_bytes); ++} ++ ++/* Make each element of VECTOR point at a regset, ++ taking the space for all those regsets from SPACE. ++ SPACE is of type regset, but it is really as long as NELTS regsets. ++ BYTES_PER_ELT is the number of bytes in one regset. */ ++ ++static void ++init_regset_vector (vector, space, nelts, bytes_per_elt) ++ regset *vector; ++ regset space; ++ int nelts; ++ int bytes_per_elt; ++{ ++ register int i; ++ register regset p = space; ++ ++ for (i = 0; i < nelts; i++) ++ { ++ vector[i] = p; ++ p += bytes_per_elt / sizeof (*p); ++ } ++} ++ ++/* Compute the registers live at the beginning of a basic block ++ from those live at the end. ++ ++ When called, OLD contains those live at the end. ++ On return, it contains those live at the beginning. ++ FIRST and LAST are the first and last insns of the basic block. ++ ++ FINAL is nonzero if we are doing the final pass which is not ++ for computing the life info (since that has already been done) ++ but for acting on it. On this pass, we delete dead stores, ++ set up the logical links and dead-variables lists of instructions, ++ and merge instructions for autoincrement and autodecrement addresses. ++ ++ SIGNIFICANT is nonzero only the first time for each basic block. ++ If it is nonzero, it points to a regset in which we store ++ a 1 for each register that is set within the block. ++ ++ BNUM is the number of the basic block. */ ++ ++static void ++propagate_block (old, first, last, final, significant, bnum) ++ register regset old; ++ rtx first; ++ rtx last; ++ int final; ++ regset significant; ++ int bnum; ++{ ++ register rtx insn; ++ rtx prev; ++ regset live; ++ regset dead; ++ ++ /* The following variables are used only if FINAL is nonzero. */ ++ /* This vector gets one element for each reg that has been live ++ at any point in the basic block that has been scanned so far. ++ SOMETIMES_MAX says how many elements are in use so far. ++ In each element, OFFSET is the byte-number within a regset ++ for the register described by the element, and BIT is a mask ++ for that register's bit within the byte. */ ++ register struct foo { short offset; short bit; } *regs_sometimes_live; ++ int sometimes_max = 0; ++ /* This regset has 1 for each reg that we have seen live so far. ++ It and REGS_SOMETIMES_LIVE are updated together. */ ++ regset maxlive; ++ ++ loop_depth = basic_block_loop_depth[bnum]; ++ ++ dead = (regset) alloca (regset_bytes); ++ live = (regset) alloca (regset_bytes); ++ ++ if (final) ++ { ++ register int i, offset, bit; ++ ++ maxlive = (regset) alloca (regset_bytes); ++ bcopy (old, maxlive, regset_bytes); ++ regs_sometimes_live ++ = (struct foo *) alloca (max_regno * sizeof (struct foo)); ++ ++ /* Process the regs live at the end of the block. ++ Enter them in MAXLIVE and REGS_SOMETIMES_LIVE. ++ Also mark them as not local to any one basic block. */ ++ ++ for (offset = 0, i = 0; offset < regset_size; offset++) ++ for (bit = 1; bit; bit <<= 1, i++) ++ { ++ if (i == max_regno) ++ break; ++ if (old[offset] & bit) ++ { ++ reg_basic_block[i] = REG_BLOCK_GLOBAL; ++ regs_sometimes_live[sometimes_max].offset = offset; ++ regs_sometimes_live[sometimes_max].bit = i % REGSET_ELT_BITS; ++ sometimes_max++; ++ } ++ } ++ } ++ ++ /* Include any notes at the end of the block in the scan. ++ This is in case the block ends with a call to setjmp. */ ++ ++ while (NEXT_INSN (last) != 0 && GET_CODE (NEXT_INSN (last)) == NOTE) ++ last = NEXT_INSN (last); ++ ++ /* Scan the block an insn at a time from end to beginning. */ ++ ++ for (insn = last; ; insn = prev) ++ { ++ prev = PREV_INSN (insn); ++ ++ /* If this is a call to `setjmp' et al, ++ warn if any non-volatile datum is live. */ ++ ++ if (final && GET_CODE (insn) == NOTE ++ && NOTE_LINE_NUMBER (insn) == NOTE_INSN_SETJMP) ++ { ++ int i; ++ for (i = 0; i < regset_size; i++) ++ regs_live_at_setjmp[i] |= old[i]; ++ } ++ ++ /* Update the life-status of regs for this insn. ++ First DEAD gets which regs are set in this insn ++ then LIVE gets which regs are used in this insn. ++ Then the regs live before the insn ++ are those live after, with DEAD regs turned off, ++ and then LIVE regs turned on. */ ++ ++ if (GET_CODE (insn) == INSN ++ || GET_CODE (insn) == JUMP_INSN ++ || GET_CODE (insn) == CALL_INSN) ++ { ++ register int i; ++ rtx note = find_reg_note (insn, REG_RETVAL, 0); ++ ++ /* If an instruction consists of just dead store(s) on final pass, ++ "delete" it by turning it into a NOTE of type NOTE_INSN_DELETED. ++ We could really delete it with delete_insn, but that ++ can cause trouble for first or last insn in a basic block. */ ++ if (final && insn_dead_p (PATTERN (insn), old, 1) ++ /* Don't delete something that refers to volatile storage! */ ++ && ! INSN_VOLATILE (insn)) ++ { ++ rtx oldpat = PATTERN (insn); ++ PUT_CODE (insn, NOTE); ++ NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (insn) = 0; ++ /* If this insn is copying the return value from a library call, ++ delete the entire library call. */ ++ if (note && libcall_dead_p (oldpat, old)) ++ { ++ rtx first = XEXP (note, 0); ++ rtx prev = insn; ++ while (INSN_DELETED_P (first)) ++ first = NEXT_INSN (first); ++ while (prev != first) ++ { ++ prev = PREV_INSN (prev); ++ PUT_CODE (prev, NOTE); ++ NOTE_LINE_NUMBER (prev) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (prev) = 0; ++ } ++ } ++ goto flushed; ++ } ++ ++ for (i = 0; i < regset_size; i++) ++ { ++ dead[i] = 0; /* Faster than bzero here */ ++ live[i] = 0; /* since regset_size is usually small */ ++ } ++ ++ /* See if this is an increment or decrement that can be ++ merged into a following memory address. */ ++#ifdef AUTO_INC_DEC ++ { ++ register rtx x = PATTERN (insn); ++ /* Does this instruction increment or decrement a register? */ ++ if (final && GET_CODE (x) == SET ++ && GET_CODE (SET_DEST (x)) == REG ++ && (GET_CODE (SET_SRC (x)) == PLUS ++ || GET_CODE (SET_SRC (x)) == MINUS) ++ && XEXP (SET_SRC (x), 0) == SET_DEST (x) ++ && GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT ++ /* Ok, look for a following memory ref we can combine with. ++ If one is found, change the memory ref to a PRE_INC ++ or PRE_DEC, cancel this insn, and return 1. ++ Return 0 if nothing has been done. */ ++ && try_pre_increment_1 (insn)) ++ goto flushed; ++ } ++#endif /* AUTO_INC_DEC */ ++ ++ /* If this is not the final pass, and this insn is copying the ++ value of a library call and it's dead, don't scan the ++ insns that perform the library call, so that the call's ++ arguments are not marked live. */ ++ if (note && insn_dead_p (PATTERN (insn), old, 1) ++ && libcall_dead_p (PATTERN (insn), old)) ++ { ++ /* Mark the dest reg as `significant'. */ ++ mark_set_regs (old, dead, PATTERN (insn), 0, significant); ++ ++ insn = XEXP (note, 0); ++ prev = PREV_INSN (insn); ++ } ++ else if (GET_CODE (PATTERN (insn)) == SET ++ && SET_DEST (PATTERN (insn)) == stack_pointer_rtx ++ && GET_CODE (SET_SRC (PATTERN (insn))) == PLUS ++ && XEXP (SET_SRC (PATTERN (insn)), 0) == stack_pointer_rtx ++ && GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 1)) == CONST_INT) ++ /* We have an insn to pop a constant amount off the stack. ++ (Such insns use PLUS regardless of the direction of the stack, ++ and any insn to adjust the stack by a constant is always a pop.) ++ These insns, if not dead stores, have no effect on life. */ ++ ; ++ else ++ { ++ /* LIVE gets the regs used in INSN; DEAD gets those set by it. */ ++ mark_set_regs (old, dead, PATTERN (insn), final ? insn : 0, ++ significant); ++ mark_used_regs (old, live, PATTERN (insn), final, insn); ++ ++ /* Update OLD for the registers used or set. */ ++ for (i = 0; i < regset_size; i++) ++ { ++ old[i] &= ~dead[i]; ++ old[i] |= live[i]; ++ } ++ ++ if (GET_CODE (insn) == CALL_INSN) ++ { ++ register int i; ++ ++ /* Each call clobbers all call-clobbered regs. ++ Note that the function-value reg is one of these, and ++ mark_set_regs has already had a chance to handle it. */ ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ if (call_used_regs[i]) ++ dead[i / REGSET_ELT_BITS] |= ++ (1 << (i % REGSET_ELT_BITS)); ++ ++ /* The stack ptr is used (honorarily) by a CALL insn. */ ++ live[STACK_POINTER_REGNUM / REGSET_ELT_BITS] ++ |= (1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS)); ++ } ++ ++ /* Update OLD for the registers used or set. */ ++ for (i = 0; i < regset_size; i++) ++ { ++ old[i] &= ~dead[i]; ++ old[i] |= live[i]; ++ } ++ ++ if (GET_CODE (insn) == CALL_INSN && final) ++ { ++ /* Any regs live at the time of a call instruction ++ must not go in a register clobbered by calls. ++ Find all regs now live and record this for them. */ ++ ++ register struct foo *p = regs_sometimes_live; ++ ++ for (i = 0; i < sometimes_max; i++, p++) ++ if (old[p->offset] & (1 << p->bit)) ++ reg_n_calls_crossed[p->offset * REGSET_ELT_BITS + p->bit]+= 1; ++ } ++ } ++ ++ /* On final pass, add any additional sometimes-live regs ++ into MAXLIVE and REGS_SOMETIMES_LIVE. ++ Also update counts of how many insns each reg is live at. */ ++ ++ if (final) ++ { ++ for (i = 0; i < regset_size; i++) ++ { ++ register int diff = live[i] & ~maxlive[i]; ++ ++ if (diff) ++ { ++ register int regno; ++ maxlive[i] |= diff; ++ for (regno = 0; diff && regno < REGSET_ELT_BITS; regno++) ++ if (diff & (1 << regno)) ++ { ++ regs_sometimes_live[sometimes_max].offset = i; ++ regs_sometimes_live[sometimes_max].bit = regno; ++ diff &= ~ (1 << regno); ++ sometimes_max++; ++ } ++ } ++ } ++ ++ { ++ register struct foo *p = regs_sometimes_live; ++ for (i = 0; i < sometimes_max; i++, p++) ++ { ++ if (old[p->offset] & (1 << p->bit)) ++ reg_live_length[p->offset * REGSET_ELT_BITS + p->bit]++; ++ } ++ } ++ } ++ } ++ flushed: ; ++ if (insn == first) ++ break; ++ } ++} ++ ++/* Return 1 if X (the body of an insn, or part of it) is just dead stores ++ (SET expressions whose destinations are registers dead after the insn). ++ NEEDED is the regset that says which regs are alive after the insn. */ ++ ++static int ++insn_dead_p (x, needed, strict_low_ok) ++ rtx x; ++ regset needed; ++ int strict_low_ok; ++{ ++ register RTX_CODE code = GET_CODE (x); ++#if 0 ++ /* Make sure insns to set the stack pointer are never deleted. */ ++ needed[STACK_POINTER_REGNUM / REGSET_ELT_BITS] ++ |= 1 << (STACK_POINTER_REGNUM % REGSET_ELT_BITS); ++#endif ++ ++ /* If setting something that's a reg or part of one, ++ see if that register's altered value will be live. */ ++ ++ if (code == SET) ++ { ++ register rtx r = SET_DEST (x); ++ /* A SET that is a subroutine call cannot be dead. */ ++ if (GET_CODE (SET_SRC (x)) == CALL) ++ return 0; ++ while (GET_CODE (r) == SUBREG ++ || (strict_low_ok && GET_CODE (r) == STRICT_LOW_PART) ++ || GET_CODE (r) == ZERO_EXTRACT ++ || GET_CODE (r) == SIGN_EXTRACT) ++ r = SUBREG_REG (r); ++ if (GET_CODE (r) == REG) ++ { ++ register int regno = REGNO (r); ++ register int offset = regno / REGSET_ELT_BITS; ++ register int bit = 1 << (regno % REGSET_ELT_BITS); ++ return (! (regno < FIRST_PSEUDO_REGISTER && global_regs[regno]) ++ && (needed[offset] & bit) == 0); ++ } ++ } ++ /* If performing several activities, ++ insn is dead if each activity is individually dead. ++ Also, CLOBBERs and USEs can be ignored; a CLOBBER or USE ++ that's inside a PARALLEL doesn't make the insn worth keeping. */ ++ else if (code == PARALLEL) ++ { ++ register int i = XVECLEN (x, 0); ++ for (i--; i >= 0; i--) ++ { ++ rtx elt = XVECEXP (x, 0, i); ++ if (!insn_dead_p (elt, needed, strict_low_ok) ++ && GET_CODE (elt) != CLOBBER ++ && GET_CODE (elt) != USE) ++ return 0; ++ } ++ return 1; ++ } ++ /* We do not check CLOBBER or USE here. ++ An insn consisting of just a CLOBBER or just a USE ++ should not be deleted. */ ++ return 0; ++} ++ ++/* If X is the last insn in a libcall, and assuming X is dead, ++ return 1 if the entire library call is dead. ++ This is true if the source of X is a dead register ++ (as well as the destination, which we tested already). ++ If this insn doesn't just copy a register, then we don't ++ have an ordinary libcall. In that case, cse could not have ++ managed to substitute the source for the dest later on, ++ so we can assume the libcall is dead. */ ++ ++static int ++libcall_dead_p (x, needed) ++ rtx x; ++ regset needed; ++{ ++ register RTX_CODE code = GET_CODE (x); ++ ++ if (code == SET) ++ { ++ register rtx r = SET_SRC (x); ++ if (GET_CODE (r) == REG) ++ { ++ register int regno = REGNO (r); ++ register int offset = regno / REGSET_ELT_BITS; ++ register int bit = 1 << (regno % REGSET_ELT_BITS); ++ return (needed[offset] & bit) == 0; ++ } ++ } ++ return 1; ++} ++ ++/* Return 1 if register REGNO was used before it was set. ++ In other words, if it is live at function entry. */ ++ ++int ++regno_uninitialized (regno) ++ int regno; ++{ ++ if (n_basic_blocks == 0) ++ return 0; ++ ++ return (basic_block_live_at_start[0][regno / REGSET_ELT_BITS] ++ & (1 << (regno % REGSET_ELT_BITS))); ++} ++ ++/* 1 if register REGNO was alive at a place where `setjmp' was called ++ and was set more than once. Such regs may be clobbered by `longjmp'. */ ++ ++int ++regno_clobbered_at_setjmp (regno) ++ int regno; ++{ ++ return (reg_n_sets[regno] > 1 ++ && (regs_live_at_setjmp[regno / REGSET_ELT_BITS] ++ & (1 << (regno % REGSET_ELT_BITS)))); ++} ++ ++/* Process the registers that are set within X. ++ Their bits are set to 1 in the regset DEAD, ++ because they are dead prior to this insn. ++ ++ If INSN is nonzero, it is the insn being processed ++ and the fact that it is nonzero implies this is the FINAL pass ++ in propagate_block. In this case, various info about register ++ usage is stored, LOG_LINKS fields of insns are set up. */ ++ ++static void mark_set_1 (); ++ ++static void ++mark_set_regs (needed, dead, x, insn, significant) ++ regset needed; ++ regset dead; ++ rtx x; ++ rtx insn; ++ regset significant; ++{ ++ register RTX_CODE code = GET_CODE (x); ++ ++ if (code == SET || code == CLOBBER) ++ mark_set_1 (needed, dead, x, insn, significant); ++ else if (code == PARALLEL) ++ { ++ register int i; ++ for (i = XVECLEN (x, 0) - 1; i >= 0; i--) ++ { ++ code = GET_CODE (XVECEXP (x, 0, i)); ++ if (code == SET || code == CLOBBER) ++ mark_set_1 (needed, dead, XVECEXP (x, 0, i), insn, significant); ++ } ++ } ++} ++ ++/* Process a single SET rtx, X. */ ++ ++static void ++mark_set_1 (needed, dead, x, insn, significant) ++ regset needed; ++ regset dead; ++ rtx x; ++ rtx insn; ++ regset significant; ++{ ++ register int regno; ++ register rtx reg = SET_DEST (x); ++ int subreg_p = 0; ++ ++ if (reg == 0) ++ return; ++ /* Modifying just one hardware register of a multi-reg value ++ or just a byte field of a register ++ does not mean the value from before this insn is now dead. ++ But it does mean liveness of that register at the end of the block ++ is significant. */ ++ while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT ++ || GET_CODE (reg) == SIGN_EXTRACT ++ || GET_CODE (reg) == STRICT_LOW_PART) ++ { ++ if (GET_CODE (reg) == ZERO_EXTRACT ++ || GET_CODE (reg) == SIGN_EXTRACT ++ || (GET_CODE (reg) == SUBREG ++ && REG_SIZE (SUBREG_REG (reg)) > REG_SIZE (reg))) ++ subreg_p = 1; ++ ++ reg = XEXP (reg, 0); ++ } ++ ++ if (GET_CODE (reg) == REG ++ && (regno = REGNO (reg), regno != FRAME_POINTER_REGNUM) ++ && regno != ARG_POINTER_REGNUM ++ && ! (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])) ++ /* && regno != STACK_POINTER_REGNUM) -- let's try without this. */ ++ { ++ register int offset = regno / REGSET_ELT_BITS; ++ register int bit = 1 << (regno % REGSET_ELT_BITS); ++ int is_needed = 0; ++ ++ /* Mark it as a significant register for this basic block. */ ++ if (significant) ++ significant[offset] |= bit; ++ /* That's all we do, if we are setting only part of the register. */ ++ if (subreg_p) ++ return; ++ ++ /* If entire register being set, mark it as as dead before this insn. */ ++ dead[offset] |= bit; ++ /* A hard reg in a wide mode may really be multiple registers. ++ If so, mark all of them just like the first. */ ++ if (regno < FIRST_PSEUDO_REGISTER) ++ { ++ int n; ++ ++ /* Nothing below is needed for the stack pointer; get out asap. ++ Eg, log links aren't needed, since combine won't use them. */ ++ if (regno == STACK_POINTER_REGNUM) ++ return; ++ ++ n = HARD_REGNO_NREGS (regno, GET_MODE (reg)); ++ while (--n > 0) ++ { ++ dead[(regno + n) / REGSET_ELT_BITS] ++ |= 1 << ((regno + n) % REGSET_ELT_BITS); ++ if (significant) ++ significant[(regno + n) / REGSET_ELT_BITS] ++ |= 1 << ((regno + n) % REGSET_ELT_BITS); ++ is_needed |= (needed[(regno + n) / REGSET_ELT_BITS] ++ & 1 << ((regno + n) % REGSET_ELT_BITS)); ++ } ++ } ++ /* Additional data to record if this is the final pass. */ ++ if (insn) ++ { ++ register rtx y = reg_next_use[regno]; ++ register int blocknum = BLOCK_NUM (insn); ++ ++ /* If this is a hard reg, record this function uses the reg. ++ `combine.c' will get confused if LOG_LINKs are made ++ for hard regs. */ ++ ++ if (regno < FIRST_PSEUDO_REGISTER) ++ { ++ register int i; ++ i = HARD_REGNO_NREGS (regno, GET_MODE (reg)); ++ if (i == 0) ++ i = 1; ++ do ++ regs_ever_live[regno + --i] = 1; ++ while (i > 0); ++ ++ if (! ((needed[offset] & bit) || is_needed)) ++ { ++ /* Note that dead stores have already been deleted if poss. ++ If we get here, we have found a dead store that cannot ++ be eliminated (because the insn does something useful). ++ Indicate this by marking the reg set as dying here. */ ++ REG_NOTES (insn) ++ = gen_rtx (EXPR_LIST, REG_DEAD, ++ reg, REG_NOTES (insn)); ++ reg_n_deaths[REGNO (reg)]++; ++ } ++ return; ++ } ++ ++ /* Keep track of which basic blocks each reg appears in. */ ++ ++ if (reg_basic_block[regno] == REG_BLOCK_UNKNOWN) ++ reg_basic_block[regno] = blocknum; ++ else if (reg_basic_block[regno] != blocknum) ++ reg_basic_block[regno] = REG_BLOCK_GLOBAL; ++ ++ /* Record first insn to use this reg. */ ++ reg_first_use[regno] = insn; ++ ++ /* Count (weighted) references, stores, etc. */ ++ reg_n_refs[regno] += loop_depth; ++ reg_n_sets[regno]++; ++ /* The next use is no longer "next", since a store intervenes. */ ++ reg_next_use[regno] = 0; ++ /* The insns where a reg is live are normally counted elsewhere, ++ but we want the count to include the insn where the reg is set, ++ and the normal counting mechanism would not count it. */ ++ reg_live_length[regno]++; ++ if ((needed[offset] & bit) || is_needed) ++ { ++ /* Make a logical link from the next following insn ++ that uses this register, back to this insn. ++ The following insns have already been processed. */ ++ if (y && (BLOCK_NUM (y) == blocknum)) ++ LOG_LINKS (y) ++ = gen_rtx (INSN_LIST, VOIDmode, insn, LOG_LINKS (y)); ++ } ++ else ++ { ++ /* Note that dead stores have already been deleted when possible ++ If we get here, we have found a dead store that cannot ++ be eliminated (because the same insn does something useful). ++ Indicate this by marking the reg being set as dying here. */ ++ REG_NOTES (insn) ++ = gen_rtx (EXPR_LIST, REG_DEAD, ++ reg, REG_NOTES (insn)); ++ reg_n_deaths[REGNO (reg)]++; ++ } ++ } ++ } ++} ++ ++/* Scan expression X and store a 1-bit in LIVE for each reg it uses. ++ This is done assuming the registers needed from X ++ are those that have 1-bits in NEEDED. ++ ++ On the final pass, FINAL is 1. This means try for autoincrement ++ and count the uses and deaths of each pseudo-reg. ++ ++ INSN is the containing instruction. */ ++ ++static void ++mark_used_regs (needed, live, x, final, insn) ++ regset needed; ++ regset live; ++ rtx x; ++ rtx insn; ++ int final; ++{ ++ register RTX_CODE code; ++ register int regno; ++ ++ retry: ++ code = GET_CODE (x); ++ switch (code) ++ { ++ case LABEL_REF: ++ case SYMBOL_REF: ++ case CONST_INT: ++ case CONST: ++ case CONST_DOUBLE: ++ case CC0: ++ case PC: ++ case CLOBBER: ++ case ADDR_VEC: ++ case ADDR_DIFF_VEC: ++ case ASM_INPUT: ++ return; ++ ++#if defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) ++ case MEM: ++ /* Here we detect use of an index register which might ++ be good for postincrement or postdecrement. */ ++ if (final) ++ { ++ rtx addr = XEXP (x, 0); ++ register int size = GET_MODE_SIZE (GET_MODE (x)); ++ ++ if (GET_CODE (addr) == REG) ++ { ++ register rtx y; ++ regno = REGNO (addr); ++ /* Is the next use an increment that might make auto-increment? */ ++ y = reg_next_use[regno]; ++ if (y && GET_CODE (PATTERN (y)) == SET ++ && BLOCK_NUM (y) == BLOCK_NUM (insn) ++ /* Can't add side effects to jumps; if reg is spilled and ++ reloaded, there's no way to store back the altered value. */ ++ && GET_CODE (insn) != JUMP_INSN ++ && (y = SET_SRC (PATTERN (y)), ++ (0 ++#ifdef HAVE_POST_INCREMENT ++ || GET_CODE (y) == PLUS ++#endif ++#ifdef HAVE_POST_DECREMENT ++ || GET_CODE (y) == MINUS ++#endif ++ ) ++ && XEXP (y, 0) == addr ++ && GET_CODE (XEXP (y, 1)) == CONST_INT ++ && INTVAL (XEXP (y, 1)) == size) ++ && dead_or_set_p (reg_next_use[regno], addr)) ++ { ++ rtx use = find_use_as_address (PATTERN (insn), addr, 0); ++ ++ /* Make sure this register appears only once in this insn. */ ++ if (use != 0 && use != (rtx) 1) ++ { ++ /* We have found a suitable auto-increment: ++ do POST_INC around the register here, ++ and patch out the increment instruction that follows. */ ++ XEXP (x, 0) ++ = gen_rtx (GET_CODE (y) == PLUS ? POST_INC : POST_DEC, ++ Pmode, addr); ++ /* Record that this insn has an implicit side effect. */ ++ REG_NOTES (insn) ++ = gen_rtx (EXPR_LIST, REG_INC, addr, REG_NOTES (insn)); ++ ++ /* Modify the old increment-insn to simply copy ++ the already-incremented value of our register. */ ++ y = reg_next_use[regno]; ++ SET_SRC (PATTERN (y)) = addr; ++ ++ /* If that makes it a no-op (copying the register ++ into itself) then change it to a simpler no-op ++ so it won't appear to be a "use" and a "set" ++ of this register. */ ++ if (SET_DEST (PATTERN (y)) == addr) ++ PATTERN (y) = gen_rtx (USE, VOIDmode, const0_rtx); ++ ++ /* Count an extra reference to the reg for the increment. ++ When a reg is incremented. ++ spilling it is worse, so we want to make that ++ less likely. */ ++ reg_n_refs[regno] += loop_depth; ++ /* Count the increment as a setting of the register, ++ even though it isn't a SET in rtl. */ ++ reg_n_sets[regno]++; ++ } ++ } ++ } ++ } ++ break; ++#endif /* HAVE_POST_INCREMENT or HAVE_POST_DECREMENT */ ++ ++ case REG: ++ /* See a register other than being set ++ => mark it as needed. */ ++ ++ regno = REGNO (x); ++ if (regno != FRAME_POINTER_REGNUM) ++ /* && regno != ARG_POINTER_REGNUM) -- and without this. */ ++ /* && regno != STACK_POINTER_REGNUM) -- let's try without this. */ ++ { ++ register int offset = regno / REGSET_ELT_BITS; ++ register int bit = 1 << (regno % REGSET_ELT_BITS); ++ int is_needed = 0; ++ ++ live[offset] |= bit; ++ /* A hard reg in a wide mode may really be multiple registers. ++ If so, mark all of them just like the first. */ ++ if (regno < FIRST_PSEUDO_REGISTER) ++ { ++ int n; ++ ++ /* For stack ptr or arg pointer, ++ nothing below can be necessary, so waste no more time. */ ++ if (regno == STACK_POINTER_REGNUM ++ || regno == ARG_POINTER_REGNUM) ++ return; ++ /* No death notes for global register variables; ++ their values are live after this function exits. */ ++ if (global_regs[regno]) ++ return; ++ ++ n = HARD_REGNO_NREGS (regno, GET_MODE (x)); ++ while (--n > 0) ++ { ++ live[(regno + n) / REGSET_ELT_BITS] ++ |= 1 << ((regno + n) % REGSET_ELT_BITS); ++ is_needed |= (needed[(regno + n) / REGSET_ELT_BITS] ++ & 1 << ((regno + n) % REGSET_ELT_BITS)); ++ } ++ } ++ if (final) ++ { ++ if (regno < FIRST_PSEUDO_REGISTER) ++ { ++ /* If a hard reg is being used, ++ record that this function does use it. */ ++ ++ register int i; ++ i = HARD_REGNO_NREGS (regno, GET_MODE (x)); ++ if (i == 0) ++ i = 1; ++ do ++ regs_ever_live[regno + --i] = 1; ++ while (i > 0); ++ } ++ else ++ { ++ /* Keep track of which basic block each reg appears in. */ ++ ++ register int blocknum = BLOCK_NUM (insn); ++ ++ if (reg_basic_block[regno] == REG_BLOCK_UNKNOWN) ++ reg_basic_block[regno] = blocknum; ++ else if (reg_basic_block[regno] != blocknum) ++ reg_basic_block[regno] = REG_BLOCK_GLOBAL; ++ ++ /* Record the earliest insn that uses this reg, ++ provided the reg is used only in one basic block. ++ Do this by recording each insn, and the one that ++ sticks is the last one scanned (the earliest insn). */ ++ ++ reg_first_use[regno] = insn; ++ ++ /* Record where each reg is used, so when the reg ++ is set we know the next insn that uses it. */ ++ ++ reg_next_use[regno] = insn; ++ ++ /* Count (weighted) number of uses of each reg. */ ++ ++ reg_n_refs[regno] += loop_depth; ++ } ++ ++ /* Record and count the insns in which a reg dies. ++ If it is used in this insn and was dead below the insn ++ then it dies in this insn. */ ++ ++ if (!(needed[offset] & bit) && !is_needed ++ && ! find_regno_note (insn, REG_DEAD, regno)) ++ { ++ REG_NOTES (insn) ++ = gen_rtx (EXPR_LIST, REG_DEAD, x, REG_NOTES (insn)); ++ reg_n_deaths[regno]++; ++ } ++ } ++ } ++ return; ++ ++ case SET: ++ { ++ register rtx testreg = SET_DEST (x); ++ int mark_dest = 0; ++ ++ /* Storing in STRICT_LOW_PART is like storing in a reg ++ in that this SET might be dead, so ignore it in TESTREG. ++ but in some other ways it is like using the reg. */ ++ /* Storing in a SUBREG or a bit field is like storing the entire ++ register in that if the register's value is not used ++ then this SET is not needed. */ ++ while (GET_CODE (testreg) == STRICT_LOW_PART ++ || GET_CODE (testreg) == ZERO_EXTRACT ++ || GET_CODE (testreg) == SIGN_EXTRACT ++ || GET_CODE (testreg) == SUBREG) ++ { ++ /* Modifying a single register in an alternate mode ++ does not use any of the old value. But these other ++ ways of storing in a register do use the old value. */ ++ if (GET_CODE (testreg) == SUBREG ++ && !(REG_SIZE (SUBREG_REG (testreg)) > REG_SIZE (testreg))) ++ ; ++ else ++ mark_dest = 1; ++ ++ testreg = XEXP (testreg, 0); ++ } ++ ++ /* If this is a store into a register, ++ recursively scan the only value being stored, ++ and only if the register's value is live after this insn. ++ If the value being computed here would never be used ++ then the values it uses don't need to be computed either. */ ++ ++ if (GET_CODE (testreg) == REG ++ && (regno = REGNO (testreg), regno != FRAME_POINTER_REGNUM) ++ && regno != ARG_POINTER_REGNUM ++ && ! (regno < FIRST_PSEUDO_REGISTER && global_regs[regno])) ++#if 0 /* This was added in 1.25, but screws up death notes for hard regs. ++ It probably isn't really needed anyway. */ ++ && (regno >= FIRST_PSEUDO_REGISTER ++ || INSN_VOLATILE (insn))) ++#endif ++ { ++ register int offset = regno / REGSET_ELT_BITS; ++ register int bit = 1 << (regno % REGSET_ELT_BITS); ++ if ((needed[offset] & bit) ++ /* If insn refers to volatile, we mustn't delete it, ++ so its inputs are all needed. */ ++ || INSN_VOLATILE (insn)) ++ { ++ mark_used_regs (needed, live, SET_SRC (x), final, insn); ++ if (mark_dest) ++ mark_used_regs (needed, live, SET_DEST (x), final, insn); ++ } ++ return; ++ } ++ } ++ break; ++ } ++ ++ /* Recursively scan the operands of this expression. */ ++ ++ { ++ register char *fmt = GET_RTX_FORMAT (code); ++ register int i; ++ ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ { ++ if (fmt[i] == 'e') ++ { ++ /* Tail recursive case: save a function call level. */ ++ if (i == 0) ++ { ++ x = XEXP (x, 0); ++ goto retry; ++ } ++ mark_used_regs (needed, live, XEXP (x, i), final, insn); ++ } ++ else if (fmt[i] == 'E') ++ { ++ register int j; ++ for (j = 0; j < XVECLEN (x, i); j++) ++ mark_used_regs (needed, live, XVECEXP (x, i, j), final, insn); ++ } ++ } ++ } ++} ++ ++#ifdef AUTO_INC_DEC ++ ++static int ++try_pre_increment_1 (insn) ++ rtx insn; ++{ ++ /* Find the next use of this reg. If in same basic block, ++ make it do pre-increment or pre-decrement if appropriate. */ ++ rtx x = PATTERN (insn); ++ int amount = ((GET_CODE (SET_SRC (x)) == PLUS ? 1 : -1) ++ * INTVAL (XEXP (SET_SRC (x), 1))); ++ int regno = REGNO (SET_DEST (x)); ++ rtx y = reg_next_use[regno]; ++ if (y != 0 ++ && BLOCK_NUM (y) == BLOCK_NUM (insn) ++ && try_pre_increment (y, SET_DEST (PATTERN (insn)), ++ amount)) ++ { ++ /* We have found a suitable auto-increment ++ and already changed insn Y to do it. ++ So flush this increment-instruction. */ ++ PUT_CODE (insn, NOTE); ++ NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; ++ NOTE_SOURCE_FILE (insn) = 0; ++ /* Count a reference to this reg for the increment ++ insn we are deleting. When a reg is incremented. ++ spilling it is worse, so we want to make that ++ less likely. */ ++ reg_n_refs[regno] += loop_depth; ++ reg_n_sets[regno]++; ++ return 1; ++ } ++ return 0; ++} ++ ++/* Try to change INSN so that it does pre-increment or pre-decrement ++ addressing on register REG in order to add AMOUNT to REG. ++ AMOUNT is negative for pre-decrement. ++ Returns 1 if the change could be made. ++ This checks all about the validity of the result of modifying INSN. */ ++ ++static int ++try_pre_increment (insn, reg, amount) ++ rtx insn, reg; ++ int amount; ++{ ++ register rtx use; ++ ++ /* Nonzero if we can try to make a pre-increment or pre-decrement. ++ For example, addl $4,r1; movl (r1),... can become movl +(r1),... */ ++ int pre_ok = 0; ++ /* Nonzero if we can try to make a post-increment or post-decrement. ++ For example, addl $4,r1; movl -4(r1),... can become movl (r1)+,... ++ It is possible for both PRE_OK and POST_OK to be nonzero if the machine ++ supports both pre-inc and post-inc, or both pre-dec and post-dec. */ ++ int post_ok = 0; ++ ++ /* Nonzero if the opportunity actually requires post-inc or post-dec. */ ++ int do_post = 0; ++ ++ /* From the sign of increment, see which possibilities are conceivable ++ on this target machine. */ ++#ifdef HAVE_PRE_INCREMENT ++ if (amount > 0) ++ pre_ok = 1; ++#endif ++#ifdef HAVE_POST_INCREMENT ++ if (amount > 0) ++ post_ok = 1; ++#endif ++ ++#ifdef HAVE_PRE_DECREMENT ++ if (amount < 0) ++ pre_ok = 1; ++#endif ++#ifdef HAVE_POST_DECREMENT ++ if (amount < 0) ++ post_ok = 1; ++#endif ++ ++ if (! (pre_ok || post_ok)) ++ return 0; ++ ++ /* It is not safe to add a side effect to a jump insn ++ because if the incremented register is spilled and must be reloaded ++ there would be no way to store the incremented value back in memory. */ ++ ++ if (GET_CODE (insn) == JUMP_INSN) ++ return 0; ++ ++ use = 0; ++ if (pre_ok) ++ use = find_use_as_address (PATTERN (insn), reg, 0); ++ if (post_ok && (use == 0 || use == (rtx) 1)) ++ { ++ use = find_use_as_address (PATTERN (insn), reg, -amount); ++ do_post = 1; ++ } ++ ++ if (use == 0 || use == (rtx) 1) ++ return 0; ++ ++ if (GET_MODE_SIZE (GET_MODE (use)) != (amount > 0 ? amount : - amount)) ++ return 0; ++ ++ XEXP (use, 0) = gen_rtx (amount > 0 ++ ? (do_post ? POST_INC : PRE_INC) ++ : (do_post ? POST_DEC : PRE_DEC), ++ Pmode, reg); ++ ++ /* Record that this insn now has an implicit side effect on X. */ ++ REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_INC, reg, REG_NOTES (insn)); ++ return 1; ++} ++ ++#endif /* AUTO_INC_DEC */ ++ ++/* Find the place in the rtx X where REG is used as a memory address. ++ Return the MEM rtx that so uses it. ++ If PLUSCONST is nonzero, search instead for a memory address equivalent to ++ (plus REG (const_int PLUSCONST)). ++ ++ If such an address does not appear, return 0. ++ If REG appears more than once, or is used other than in such an address, ++ return (rtx)1. */ ++ ++static rtx ++find_use_as_address (x, reg, plusconst) ++ register rtx x; ++ rtx reg; ++ int plusconst; ++{ ++ enum rtx_code code = GET_CODE (x); ++ char *fmt = GET_RTX_FORMAT (code); ++ register int i; ++ register rtx value = 0; ++ register rtx tem; ++ ++ if (code == MEM && XEXP (x, 0) == reg && plusconst == 0) ++ return x; ++ ++ if (code == MEM && GET_CODE (XEXP (x, 0)) == PLUS ++ && XEXP (XEXP (x, 0), 0) == reg ++ && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ++ && INTVAL (XEXP (XEXP (x, 0), 1)) == plusconst) ++ return x; ++ ++ if (code == SIGN_EXTRACT || code == ZERO_EXTRACT) ++ { ++ /* If REG occurs inside a MEM used in a bit-field reference, ++ that is unacceptable. */ ++ if (find_use_as_address (XEXP (x, 0), reg, 0) != 0) ++ return (rtx) 1; ++ } ++ ++ if (x == reg) ++ return (rtx) 1; ++ ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ { ++ if (fmt[i] == 'e') ++ { ++ tem = find_use_as_address (XEXP (x, i), reg, plusconst); ++ if (value == 0) ++ value = tem; ++ else if (tem != 0) ++ return (rtx) 1; ++ } ++ if (fmt[i] == 'E') ++ { ++ register int j; ++ for (j = XVECLEN (x, i) - 1; j >= 0; j--) ++ { ++ tem = find_use_as_address (XVECEXP (x, i, j), reg, plusconst); ++ if (value == 0) ++ value = tem; ++ else if (tem != 0) ++ return (rtx) 1; ++ } ++ } ++ } ++ ++ return value; ++} ++ ++/* Write information about registers and basic blocks into FILE. ++ This is part of making a debugging dump. */ ++ ++void ++dump_flow_info (file) ++ FILE *file; ++{ ++ register int i; ++ static char *reg_class_names[] = REG_CLASS_NAMES; ++ ++ fprintf (file, "%d registers.\n", max_regno); ++ ++ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ++ if (reg_n_refs[i]) ++ { ++ enum reg_class class; ++ fprintf (file, "\nRegister %d used %d times across %d insns", ++ i, reg_n_refs[i], reg_live_length[i]); ++ if (reg_basic_block[i] >= 0) ++ fprintf (file, " in block %d", reg_basic_block[i]); ++ if (reg_n_deaths[i] != 1) ++ fprintf (file, "; dies in %d places", reg_n_deaths[i]); ++ if (reg_n_calls_crossed[i] == 1) ++ fprintf (file, "; crosses 1 call", reg_n_calls_crossed[i]); ++ else if (reg_n_calls_crossed[i]) ++ fprintf (file, "; crosses %d calls", reg_n_calls_crossed[i]); ++ if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD) ++ fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i)); ++ class = reg_preferred_class (i); ++ if (class != GENERAL_REGS) ++ { ++ if (reg_preferred_or_nothing (i)) ++ fprintf (file, "; %s or none", reg_class_names[(int) class]); ++ else ++ fprintf (file, "; pref %s", reg_class_names[(int) class]); ++ } ++ if (REGNO_POINTER_FLAG (i)) ++ fprintf (file, "; pointer"); ++ fprintf (file, ".\n"); ++ } ++ fprintf (file, "\n%d basic blocks.\n", n_basic_blocks); ++ for (i = 0; i < n_basic_blocks; i++) ++ { ++ register rtx head, jump; ++ register int regno; ++ fprintf (file, "\nBasic block %d: first insn %d, last %d.\n", ++ i, ++ INSN_UID (basic_block_head[i]), ++ INSN_UID (basic_block_end[i])); ++ /* The control flow graph's storage is freed ++ now when flow_analysis returns. ++ Don't try to print it if it is gone. */ ++ if (basic_block_drops_in) ++ { ++ fprintf (file, "Reached from blocks: "); ++ head = basic_block_head[i]; ++ if (GET_CODE (head) == CODE_LABEL) ++ for (jump = LABEL_REFS (head); ++ jump != head; ++ jump = LABEL_NEXTREF (jump)) ++ { ++ register int from_block = BLOCK_NUM (CONTAINING_INSN (jump)); ++ fprintf (file, " %d", from_block); ++ } ++ if (basic_block_drops_in[i]) ++ fprintf (file, " previous"); ++ } ++ fprintf (file, "\nRegisters live at start:"); ++ for (regno = 0; regno < max_regno; regno++) ++ { ++ register int offset = regno / REGSET_ELT_BITS; ++ register int bit = 1 << (regno % REGSET_ELT_BITS); ++ if (basic_block_live_at_start[i][offset] & bit) ++ fprintf (file, " %d", regno); ++ } ++ fprintf (file, "\n"); ++ } ++ fprintf (file, "\n"); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/fold-const.c alliance/genview/src/gcc-1.42/fold-const.c +--- alliance-5.0/genview/src/gcc-1.42/fold-const.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/fold-const.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,1900 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Fold a constant sub-tree into a single node for C-compiler ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++/*@@ Fix lossage on folding division of big integers. */ ++ ++/*@@ This file should be rewritten to use an arbitary precision ++ @@ representation for "struct tree_int_cst" and "struct tree_real_cst". ++ @@ Perhaps the routines could also be used for bc/dc, and made a lib. ++ @@ The routines that translate from the ap rep should ++ @@ warn if precision et. al. is lost. ++ @@ This would also make life easier when this technology is used ++ @@ for cross-compilers. */ ++ ++ ++/* There are only two entry points in this file: ++ fold and combine. ++ ++ fold takes a tree as argument and returns a simplified tree. ++ ++ combine takes a tree code for an arithmetic operation ++ and two operands that are trees for constant values ++ and returns the result of the specified operation on those values, ++ also as a tree. */ ++ ++#include ++#include ++#include "config.h" ++#include "tree.h" ++ ++static void lshift_double (); ++static void rshift_double (); ++static void lrotate_double (); ++static void rrotate_double (); ++ ++/* To do constant folding on INTEGER_CST nodes requires 64-bit arithmetic. ++ We do that by representing the 64-bit integer as 8 shorts, ++ with only 8 bits stored in each short, as a positive number. */ ++ ++/* Unpack a 64-bit integer into 8 shorts. ++ LOW and HI are the integer, as two `int' pieces. ++ SHORTS points to the array of shorts. */ ++ ++static void ++encode (shorts, low, hi) ++ short *shorts; ++ int low, hi; ++{ ++ shorts[0] = low & 0xff; ++ shorts[1] = (low >> 8) & 0xff; ++ shorts[2] = (low >> 16) & 0xff; ++ shorts[3] = (low >> 24) & 0xff; ++ shorts[4] = hi & 0xff; ++ shorts[5] = (hi >> 8) & 0xff; ++ shorts[6] = (hi >> 16) & 0xff; ++ shorts[7] = (hi >> 24) & 0xff; ++} ++ ++/* Pack an array of 8 shorts into a 64-bit integer. ++ SHORTS points to the array of shorts. ++ The integer is stored into *LOW and *HI as two `int' pieces. */ ++ ++static void ++decode (shorts, low, hi) ++ short *shorts; ++ int *low, *hi; ++{ ++ /* The casts in the following statement should not be ++ needed, but they get around bugs in some C compilers. */ ++ *low = (((long)shorts[3] << 24) | ((long)shorts[2] << 16) ++ | ((long)shorts[1] << 8) | (long)shorts[0]); ++ *hi = (((long)shorts[7] << 24) | ((long)shorts[6] << 16) ++ | ((long)shorts[5] << 8) | (long)shorts[4]); ++} ++ ++/* Make the integer constant T valid for its type ++ by setting to 0 or 1 all the bits in the constant ++ that don't belong in the type. */ ++ ++static void ++force_fit_type (t) ++ tree t; ++{ ++ register int prec = TYPE_PRECISION (TREE_TYPE (t)); ++ ++ if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE) ++ prec = BITS_PER_WORD; ++ ++ /* First clear all bits that are beyond the type's precision. */ ++ ++ if (prec == 2 * HOST_BITS_PER_INT) ++ ; ++ else if (prec > HOST_BITS_PER_INT) ++ { ++ TREE_INT_CST_HIGH (t) ++ &= ~((-1) << (prec - HOST_BITS_PER_INT)); ++ } ++ else ++ { ++ TREE_INT_CST_HIGH (t) = 0; ++ if (prec < HOST_BITS_PER_INT) ++ TREE_INT_CST_LOW (t) ++ &= ~((-1) << prec); ++ } ++ ++ /* If it's a signed type and value's sign bit is set, extend the sign. */ ++ ++ if (! TREE_UNSIGNED (TREE_TYPE (t)) ++ && prec != 2 * HOST_BITS_PER_INT ++ && (prec > HOST_BITS_PER_INT ++ ? TREE_INT_CST_HIGH (t) & (1 << (prec - HOST_BITS_PER_INT - 1)) ++ : TREE_INT_CST_LOW (t) & (1 << (prec - 1)))) ++ { ++ /* Value is negative: ++ set to 1 all the bits that are outside this type's precision. */ ++ if (prec > HOST_BITS_PER_INT) ++ { ++ TREE_INT_CST_HIGH (t) ++ |= ((-1) << (prec - HOST_BITS_PER_INT)); ++ } ++ else ++ { ++ TREE_INT_CST_HIGH (t) = -1; ++ if (prec < HOST_BITS_PER_INT) ++ TREE_INT_CST_LOW (t) ++ |= ((-1) << prec); ++ } ++ } ++} ++ ++/* Add two 64-bit integers with 64-bit result. ++ Each argument is given as two `int' pieces. ++ One argument is L1 and H1; the other, L2 and H2. ++ The value is stored as two `int' pieces in *LV and *HV. ++ We use the 8-shorts representation internally. */ ++ ++static void ++add_double (l1, h1, l2, h2, lv, hv) ++ int l1, h1, l2, h2; ++ int *lv, *hv; ++{ ++ short arg1[8]; ++ short arg2[8]; ++ register int carry = 0; ++ register int i; ++ ++ encode (arg1, l1, h1); ++ encode (arg2, l2, h2); ++ ++ for (i = 0; i < 8; i++) ++ { ++ carry += arg1[i] + arg2[i]; ++ arg1[i] = carry & 0xff; ++ carry >>= 8; ++ } ++ ++ decode (arg1, lv, hv); ++} ++ ++/* Negate a 64-bit integers with 64-bit result. ++ The argument is given as two `int' pieces in L1 and H1. ++ The value is stored as two `int' pieces in *LV and *HV. ++ We use the 8-shorts representation internally. */ ++ ++static void ++neg_double (l1, h1, lv, hv) ++ int l1, h1; ++ int *lv, *hv; ++{ ++ if (l1 == 0) ++ { ++ *lv = 0; ++ *hv = - h1; ++ } ++ else ++ { ++ *lv = - l1; ++ *hv = ~ h1; ++ } ++} ++ ++/* Multiply two 64-bit integers with 64-bit result. ++ Each argument is given as two `int' pieces. ++ One argument is L1 and H1; the other, L2 and H2. ++ The value is stored as two `int' pieces in *LV and *HV. ++ We use the 8-shorts representation internally. */ ++ ++static void ++mul_double (l1, h1, l2, h2, lv, hv) ++ int l1, h1, l2, h2; ++ int *lv, *hv; ++{ ++ short arg1[8]; ++ short arg2[8]; ++ short prod[16]; ++ register int carry = 0; ++ register int i, j, k; ++ ++ /* These two cases are used extensively, arising from pointer ++ combinations. */ ++ if (h2 == 0) ++ { ++ if (l2 == 2) ++ { ++ unsigned temp = l1 + l1; ++ *hv = h1 * 2 + (temp < l1); ++ *lv = temp; ++ return; ++ } ++ if (l2 == 4) ++ { ++ unsigned temp = l1 + l1; ++ h1 = h1 * 4 + ((temp < l1) << 1); ++ l1 = temp; ++ temp += temp; ++ h1 += (temp < l1); ++ *lv = temp; ++ *hv = h1; ++ return; ++ } ++ if (l2 == 8) ++ { ++ unsigned temp = l1 + l1; ++ h1 = h1 * 8 + ((temp < l1) << 2); ++ l1 = temp; ++ temp += temp; ++ h1 += (temp < l1) << 1; ++ l1 = temp; ++ temp += temp; ++ h1 += (temp < l1); ++ *lv = temp; ++ *hv = h1; ++ return; ++ } ++ } ++ ++ encode (arg1, l1, h1); ++ encode (arg2, l2, h2); ++ ++ bzero (prod, sizeof prod); ++ ++ for (i = 0; i < 8; i++) ++ for (j = 0; j < 8; j++) ++ { ++ k = i + j; ++ carry = arg1[i] * arg2[j]; ++ while (carry) ++ { ++ carry += prod[k]; ++ prod[k] = carry & 0xff; ++ carry >>= 8; ++ k++; ++ } ++ } ++ ++ decode (prod, lv, hv); /* @@decode ignores prod[8] -> prod[15] */ ++} ++ ++/* Shift the 64-bit integer in L1, H1 left by COUNT places ++ keeping only PREC bits of result. ++ Shift right if COUNT is negative. ++ ARITH nonzero specifies arithmetic shifting; otherwise use logical shift. ++ Store the value as two `int' pieces in *LV and *HV. */ ++ ++static void ++lshift_double (l1, h1, count, prec, lv, hv, arith) ++ int l1, h1, count, prec; ++ int *lv, *hv; ++ int arith; ++{ ++ short arg1[8]; ++ register int i; ++ register int carry; ++ ++ if (count < 0) ++ { ++ rshift_double (l1, h1, - count, prec, lv, hv, arith); ++ return; ++ } ++ ++ encode (arg1, l1, h1); ++ ++ if (count > prec) ++ count = prec; ++ ++ while (count > 0) ++ { ++ carry = 0; ++ for (i = 0; i < 8; i++) ++ { ++ carry += arg1[i] << 1; ++ arg1[i] = carry & 0xff; ++ carry >>= 8; ++ } ++ count--; ++ } ++ ++ decode (arg1, lv, hv); ++} ++ ++/* Shift the 64-bit integer in L1, H1 right by COUNT places ++ keeping only PREC bits of result. COUNT must be positive. ++ ARITH nonzero specifies arithmetic shifting; otherwise use logical shift. ++ Store the value as two `int' pieces in *LV and *HV. */ ++ ++static void ++rshift_double (l1, h1, count, prec, lv, hv, arith) ++ int l1, h1, count, prec; ++ int *lv, *hv; ++ int arith; ++{ ++ short arg1[8]; ++ register int i; ++ register int carry; ++ ++ encode (arg1, l1, h1); ++ ++ if (count > prec) ++ count = prec; ++ ++ while (count > 0) ++ { ++ carry = arith && arg1[7] >> 7; ++ for (i = 7; i >= 0; i--) ++ { ++ carry <<= 8; ++ carry += arg1[i]; ++ arg1[i] = (carry >> 1) & 0xff; ++ } ++ count--; ++ } ++ ++ decode (arg1, lv, hv); ++} ++ ++/* Rotate the 64-bit integer in L1, H1 left by COUNT places ++ keeping only PREC bits of result. ++ Rotate right if COUNT is negative. ++ Store the value as two `int' pieces in *LV and *HV. */ ++ ++static void ++lrotate_double (l1, h1, count, prec, lv, hv) ++ int l1, h1, count, prec; ++ int *lv, *hv; ++{ ++ short arg1[8]; ++ register int i; ++ register int carry; ++ ++ if (count < 0) ++ { ++ rrotate_double (l1, h1, - count, prec, lv, hv); ++ return; ++ } ++ ++ encode (arg1, l1, h1); ++ ++ if (count > prec) ++ count = prec; ++ ++ carry = arg1[7] >> 7; ++ while (count > 0) ++ { ++ for (i = 0; i < 8; i++) ++ { ++ carry += arg1[i] << 1; ++ arg1[i] = carry & 0xff; ++ carry >>= 8; ++ } ++ count--; ++ } ++ ++ decode (arg1, lv, hv); ++} ++ ++/* Rotate the 64-bit integer in L1, H1 left by COUNT places ++ keeping only PREC bits of result. COUNT must be positive. ++ Store the value as two `int' pieces in *LV and *HV. */ ++ ++static void ++rrotate_double (l1, h1, count, prec, lv, hv) ++ int l1, h1, count, prec; ++ int *lv, *hv; ++{ ++ short arg1[8]; ++ register int i; ++ register int carry; ++ ++ encode (arg1, l1, h1); ++ ++ if (count > prec) ++ count = prec; ++ ++ carry = arg1[0] & 1; ++ while (count > 0) ++ { ++ for (i = 7; i >= 0; i--) ++ { ++ carry <<= 8; ++ carry += arg1[i]; ++ arg1[i] = (carry >> 1) & 0xff; ++ } ++ count--; ++ } ++ ++ decode (arg1, lv, hv); ++} ++ ++/* Divide 64 bit integer LNUM, HNUM by 64 bit integer LDEN, HDEN ++ for a quotient (stored in *LQUO, *HQUO) and remainder (in *LREM, *HREM). ++ CODE is a tree code for a kind of division, one of ++ TRUNC_DIV_EXPR, FLOOR_DIV_EXPR, CEIL_DIV_EXPR, ROUND_DIV_EXPR ++ or EXACT_DIV_EXPR ++ It controls how the quotient is rounded to a integer. ++ UNS nonzero says do unsigned division. */ ++ ++static void ++div_and_round_double (code, uns, ++ lnum_orig, hnum_orig, lden_orig, hden_orig, ++ lquo, hquo, lrem, hrem) ++ enum tree_code code; ++ int uns; ++ int lnum_orig, hnum_orig; /* num == numerator == dividend */ ++ int lden_orig, hden_orig; /* den == denominator == divisor */ ++ int *lquo, *hquo, *lrem, *hrem; ++{ ++ int quo_neg = 0; ++ short num[9], den[8], quo[8]; /* extra element for scaling. */ ++ register int i, j, work; ++ register int carry = 0; ++ unsigned int lnum = lnum_orig; ++ int hnum = hnum_orig; ++ unsigned int lden = lden_orig; ++ int hden = hden_orig; ++ ++ if ((hden == 0) && (lden == 0)) ++ abort (); ++ ++ /* calculate quotient sign and convert operands to unsigned. */ ++ if (!uns) ++ { ++ if (hden < 0) ++ { ++ quo_neg = ~ quo_neg; ++ neg_double (lden, hden, &lden, &hden); ++ } ++ if (hnum < 0) ++ { ++ quo_neg = ~ quo_neg; ++ neg_double (lnum, hnum, &lnum, &hnum); ++ } ++ } ++ ++ if (hnum == 0 && hden == 0) ++ { /* single precision */ ++ *hquo = *hrem = 0; ++ *lquo = lnum / lden; /* rounds toward zero since positive args */ ++ goto finish_up; ++ } ++ ++ if (hnum == 0) ++ { /* trivial case: dividend < divisor */ ++ /* hden != 0 already checked. */ ++ *hquo = *lquo = 0; ++ *hrem = hnum; ++ *lrem = lnum; ++ goto finish_up; ++ } ++ ++ bzero (quo, sizeof quo); ++ ++ bzero (num, sizeof num); /* to zero 9th element */ ++ bzero (den, sizeof den); ++ ++ encode (num, lnum, hnum); ++ encode (den, lden, hden); ++ ++ /* This code requires more than just hden == 0. ++ We also have to require that we don't need more than three bytes ++ to hold CARRY. If we ever did need four bytes to hold it, we ++ would lose part of it when computing WORK on the next round. */ ++ if (hden == 0 && ((lden << 8) >> 8) == lden) ++ { /* simpler algorithm */ ++ /* hnum != 0 already checked. */ ++ for (i = 7; i >= 0; i--) ++ { ++ work = num[i] + (carry << 8); ++ quo[i] = work / lden; ++ carry = work % lden; ++ } ++ } ++ else { /* full double precision, ++ with thanks to Don Knuth's ++ "Semi-Numericial Algorithms". */ ++#define BASE 256 ++ int quo_est, scale, num_hi_sig, den_hi_sig, quo_hi_sig; ++ ++ /* Find the highest non-zero divisor digit. */ ++ for (i = 7; ; i--) ++ if (den[i] != 0) { ++ den_hi_sig = i; ++ break; ++ } ++ for (i = 7; ; i--) ++ if (num[i] != 0) { ++ num_hi_sig = i; ++ break; ++ } ++ quo_hi_sig = num_hi_sig - den_hi_sig + 1; ++ ++ /* Insure that the first digit of the divisor is at least BASE/2. ++ This is required by the quotient digit estimation algorithm. */ ++ ++ scale = BASE / (den[den_hi_sig] + 1); ++ if (scale > 1) { /* scale divisor and dividend */ ++ carry = 0; ++ for (i = 0; i <= 8; i++) { ++ work = (num[i] * scale) + carry; ++ num[i] = work & 0xff; ++ carry = work >> 8; ++ if (num[i] != 0) num_hi_sig = i; ++ } ++ carry = 0; ++ for (i = 0; i <= 7; i++) { ++ work = (den[i] * scale) + carry; ++ den[i] = work & 0xff; ++ carry = work >> 8; ++ if (den[i] != 0) den_hi_sig = i; ++ } ++ } ++ ++ /* Main loop */ ++ for (i = quo_hi_sig; i > 0; i--) { ++ /* quess the next quotient digit, quo_est, by dividing the first ++ two remaining dividend digits by the high order quotient digit. ++ quo_est is never low and is at most 2 high. */ ++ ++ int num_hi; /* index of highest remaining dividend digit */ ++ ++ num_hi = i + den_hi_sig; ++ ++ work = (num[num_hi] * BASE) + (num_hi > 0 ? num[num_hi - 1] : 0); ++ if (num[num_hi] != den[den_hi_sig]) { ++ quo_est = work / den[den_hi_sig]; ++ } ++ else { ++ quo_est = BASE - 1; ++ } ++ ++ /* refine quo_est so it's usually correct, and at most one high. */ ++ while ((den[den_hi_sig - 1] * quo_est) ++ > (((work - (quo_est * den[den_hi_sig])) * BASE) ++ + ((num_hi - 1) > 0 ? num[num_hi - 2] : 0))) ++ quo_est--; ++ ++ /* Try QUO_EST as the quotient digit, by multiplying the ++ divisor by QUO_EST and subtracting from the remaining dividend. ++ Keep in mind that QUO_EST is the I - 1st digit. */ ++ ++ carry = 0; ++ ++ for (j = 0; j <= den_hi_sig; j++) ++ { ++ int digit; ++ ++ work = num[i + j - 1] - (quo_est * den[j]) + carry; ++ digit = work & 0xff; ++ carry = work >> 8; ++ if (digit < 0) ++ { ++ digit += BASE; ++ carry--; ++ } ++ num[i + j - 1] = digit; ++ } ++ ++ /* if quo_est was high by one, then num[i] went negative and ++ we need to correct things. */ ++ ++ if (num[num_hi] < 0) ++ { ++ quo_est--; ++ carry = 0; /* add divisor back in */ ++ for (j = 0; j <= den_hi_sig; j++) ++ { ++ work = num[i + j - 1] + den[j] + carry; ++ if (work > BASE) ++ { ++ work -= BASE; ++ carry = 1; ++ } ++ else ++ { ++ carry = 0; ++ } ++ num[i + j - 1] = work; ++ } ++ num [num_hi] += carry; ++ } ++ ++ /* store the quotient digit. */ ++ quo[i - 1] = quo_est; ++ } ++ } ++ ++ decode (quo, lquo, hquo); ++ ++ finish_up: ++ /* if result is negative, make it so. */ ++ if (quo_neg) ++ neg_double (*lquo, *hquo, lquo, hquo); ++ ++ /* compute trial remainder: rem = num - (quo * den) */ ++ mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem); ++ neg_double (*lrem, *hrem, lrem, hrem); ++ add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem); ++ ++ switch (code) ++ { ++ case TRUNC_DIV_EXPR: ++ case TRUNC_MOD_EXPR: /* round toward zero */ ++ case EXACT_DIV_EXPR: /* for this one, it shouldn't matter */ ++ return; ++ ++ case FLOOR_DIV_EXPR: ++ case FLOOR_MOD_EXPR: /* round toward negative infinity */ ++ if (quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio < 0 && rem != 0 */ ++ { ++ /* quo = quo - 1; */ ++ add_double (*lquo, *hquo, -1, -1, lquo, hquo); ++ } ++ else return; ++ break; ++ ++ case CEIL_DIV_EXPR: ++ case CEIL_MOD_EXPR: /* round toward positive infinity */ ++ if (!quo_neg && (*lrem != 0 || *hrem != 0)) /* ratio > 0 && rem != 0 */ ++ { ++ add_double (*lquo, *hquo, 1, 0, lquo, hquo); ++ } ++ else return; ++ break; ++ ++ case ROUND_DIV_EXPR: ++ case ROUND_MOD_EXPR: /* round to closest integer */ ++ { ++ int labs_rem = *lrem, habs_rem = *hrem; ++ int labs_den = lden, habs_den = hden, ltwice, htwice; ++ ++ /* get absolute values */ ++ if (*hrem < 0) neg_double (*lrem, *hrem, &labs_rem, &habs_rem); ++ if (hden < 0) neg_double (lden, hden, &labs_den, &habs_den); ++ ++ /* if (2 * abs (lrem) >= abs (lden)) */ ++ mul_double (2, 0, labs_rem, habs_rem, <wice, &htwice); ++ if (((unsigned) habs_den < (unsigned) htwice) ++ || (((unsigned) habs_den == (unsigned) htwice) ++ && ((unsigned) labs_den < (unsigned) ltwice))) ++ { ++ if (*hquo < 0) ++ /* quo = quo - 1; */ ++ add_double (*lquo, *hquo, -1, -1, lquo, hquo); ++ else ++ /* quo = quo + 1; */ ++ add_double (*lquo, *hquo, 1, 0, lquo, hquo); ++ } ++ else return; ++ } ++ break; ++ ++ default: ++ abort (); ++ } ++ ++ /* compute true remainder: rem = num - (quo * den) */ ++ mul_double (*lquo, *hquo, lden_orig, hden_orig, lrem, hrem); ++ neg_double (*lrem, *hrem, lrem, hrem); ++ add_double (lnum_orig, hnum_orig, *lrem, *hrem, lrem, hrem); ++} ++ ++/* Split a tree IN into a constant and a variable part ++ that could be combined with CODE to make IN. ++ CODE must be a commutative arithmetic operation. ++ Store the constant part into *CONP and the variable in &VARP. ++ Return 1 if this was done; zero means the tree IN did not decompose ++ this way. ++ ++ If CODE is PLUS_EXPR we also split trees that use MINUS_EXPR. ++ Therefore, we must tell the caller whether the variable part ++ was subtracted. We do this by storing 1 or -1 into *VARSIGNP. ++ The value stored is the coefficient for the variable term. ++ The constant term we return should always be added; ++ we negate it if necessary. */ ++ ++static int ++split_tree (in, code, varp, conp, varsignp) ++ tree in; ++ enum tree_code code; ++ tree *varp, *conp; ++ int *varsignp; ++{ ++ register tree outtype = TREE_TYPE (in); ++ *varp = 0; ++ *conp = 0; ++ ++ /* Strip any conversions that don't change the machine mode. */ ++ while ((TREE_CODE (in) == NOP_EXPR ++ || TREE_CODE (in) == CONVERT_EXPR) ++ && (TYPE_MODE (TREE_TYPE (in)) ++ == TYPE_MODE (TREE_TYPE (TREE_OPERAND (in, 0))))) ++ in = TREE_OPERAND (in, 0); ++ ++ if (TREE_CODE (in) == code ++ || (TREE_CODE (TREE_TYPE (in)) != REAL_TYPE ++ /* We can associate addition and subtraction together ++ (even though the C standard doesn't say so) ++ for integers because the value is not affected. ++ For reals, the value might be affected, so we can't. */ ++ && ++ ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR) ++ || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR)))) ++ { ++ enum tree_code code = TREE_CODE (TREE_OPERAND (in, 0)); ++ if (code == INTEGER_CST) ++ { ++ *conp = TREE_OPERAND (in, 0); ++ *varp = TREE_OPERAND (in, 1); ++ if (TREE_TYPE (*varp) != outtype) ++ *varp = convert (outtype, *varp); ++ *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1; ++ return 1; ++ } ++ if (TREE_LITERAL (TREE_OPERAND (in, 1))) ++ { ++ *conp = TREE_OPERAND (in, 1); ++ *varp = TREE_OPERAND (in, 0); ++ *varsignp = 1; ++ if (TREE_TYPE (*varp) != outtype) ++ *varp = convert (outtype, *varp); ++ if (TREE_CODE (in) == MINUS_EXPR) ++ { ++ /* If operation is subtraction and constant is second, ++ must negate it to get an additive constant. ++ And this cannot be done unless it is a manifest constant. ++ It could also be the address of a static variable. ++ We cannot negate that, so give up. */ ++ if (TREE_CODE (*conp) == INTEGER_CST) ++ *conp = fold (build (NEGATE_EXPR, TREE_TYPE (*conp), *conp)); ++ else ++ return 0; ++ } ++ return 1; ++ } ++ if (TREE_LITERAL (TREE_OPERAND (in, 0))) ++ { ++ *conp = TREE_OPERAND (in, 0); ++ *varp = TREE_OPERAND (in, 1); ++ if (TREE_TYPE (*varp) != outtype) ++ *varp = convert (outtype, *varp); ++ *varsignp = (TREE_CODE (in) == MINUS_EXPR) ? -1 : 1; ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++/* Combine two constants NUM and ARG2 under operation CODE ++ to produce a new constant. ++ We assume ARG1 and ARG2 have the same data type, ++ or at least are the same kind of constant and the same machine mode. */ ++ ++/* Handle floating overflow for `combine'. */ ++static jmp_buf combine_error; ++ ++tree ++combine (code, arg1, arg2) ++ enum tree_code code; ++ register tree arg1, arg2; ++{ ++ if (TREE_CODE (arg1) == INTEGER_CST) ++ { ++ register int int1l = TREE_INT_CST_LOW (arg1); ++ register int int1h = TREE_INT_CST_HIGH (arg1); ++ int int2l = TREE_INT_CST_LOW (arg2); ++ int int2h = TREE_INT_CST_HIGH (arg2); ++ int low, hi; ++ int garbagel, garbageh; ++ register tree t; ++ int uns = TREE_UNSIGNED (TREE_TYPE (arg1)); ++ ++ switch (code) ++ { ++ case BIT_IOR_EXPR: ++ t = build_int_2 (int1l | int2l, int1h | int2h); ++ break; ++ ++ case BIT_XOR_EXPR: ++ t = build_int_2 (int1l ^ int2l, int1h ^ int2h); ++ break; ++ ++ case BIT_AND_EXPR: ++ t = build_int_2 (int1l & int2l, int1h & int2h); ++ break; ++ ++ case BIT_ANDTC_EXPR: ++ t = build_int_2 (int1l & ~int2l, int1h & ~int2h); ++ break; ++ ++ case RSHIFT_EXPR: ++ int2l = - int2l; ++ case LSHIFT_EXPR: ++ lshift_double (int1l, int1h, int2l, ++ TYPE_PRECISION (TREE_TYPE (arg1)), ++ &low, &hi, ++ !uns); ++ t = build_int_2 (low, hi); ++ break; ++ ++ case RROTATE_EXPR: ++ int2l = - int2l; ++ case LROTATE_EXPR: ++ lrotate_double (int1l, int1h, int2l, ++ TYPE_PRECISION (TREE_TYPE (arg1)), ++ &low, &hi); ++ t = build_int_2 (low, hi); ++ break; ++ ++ case PLUS_EXPR: ++ if (int1h == 0) ++ { ++ int2l += int1l; ++ if ((unsigned) int2l < int1l) ++ int2h += 1; ++ t = build_int_2 (int2l, int2h); ++ break; ++ } ++ if (int2h == 0) ++ { ++ int1l += int2l; ++ if ((unsigned) int1l < int2l) ++ int1h += 1; ++ t = build_int_2 (int1l, int1h); ++ break; ++ } ++ add_double (int1l, int1h, int2l, int2h, &low, &hi); ++ t = build_int_2 (low, hi); ++ break; ++ ++ case MINUS_EXPR: ++ if (int1h == 0 && int1l == 0) ++ { ++ t = build_int_2 (- int2l, - int2h - (int2l != 0)); ++ break; ++ } ++ if (int2h == 0 && int2l == 0) ++ { ++ t = build_int_2 (int1l, int1h); ++ break; ++ } ++ neg_double (int2l, int2h, &int2l, &int2h); ++ add_double (int1l, int1h, int2l, int2h, &low, &hi); ++ t = build_int_2 (low, hi); ++ break; ++ ++ case MULT_EXPR: ++ /* Optimize simple cases. */ ++ if (int1h == 0) ++ { ++ unsigned temp; ++ ++ switch (int1l) ++ { ++ case 0: ++ t = build_int_2 (0, 0); ++ goto got_it; ++ case 1: ++ t = build_int_2 (int2l, int2h); ++ goto got_it; ++ case 2: ++ temp = int2l + int2l; ++ int2h = int2h * 2 + (temp < int2l); ++ t = build_int_2 (temp, int2h); ++ goto got_it; ++#if 0 /* This code can lose carries. */ ++ case 3: ++ temp = int2l + int2l + int2l; ++ int2h = int2h * 3 + (temp < int2l); ++ t = build_int_2 (temp, int2h); ++ goto got_it; ++#endif ++ case 4: ++ temp = int2l + int2l; ++ int2h = int2h * 4 + (temp < int2l) << 1; ++ int2l = temp; ++ temp += temp; ++ int2h += (temp < int2l); ++ t = build_int_2 (temp, int2h); ++ goto got_it; ++ case 8: ++ temp = int2l + int2l; ++ int2h = int2h * 8 + (temp < int2l) << 2; ++ int2l = temp; ++ temp += temp; ++ int2h += (temp < int2l) << 1; ++ int2l = temp; ++ temp += temp; ++ int2h += (temp < int2l); ++ t = build_int_2 (temp, int2h); ++ goto got_it; ++ default: ++ break; ++ } ++ } ++ ++ if (int2h == 0) ++ { ++ if (int2l == 0) ++ { ++ t = build_int_2 (0, 0); ++ break; ++ } ++ if (int2l == 1) ++ { ++ t = build_int_2 (int1l, int1h); ++ break; ++ } ++ } ++ ++ mul_double (int1l, int1h, int2l, int2h, &low, &hi); ++ t = build_int_2 (low, hi); ++ break; ++ ++ case TRUNC_DIV_EXPR: case ROUND_DIV_EXPR: ++ case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR: ++ case EXACT_DIV_EXPR: ++ if (int2h == 0 && int2l == 1) ++ { ++ t = build_int_2 (int1l, int1h); ++ break; ++ } ++ if (int1l == int2l && int1h == int2h) ++ { ++ if ((int1l | int1h) == 0) ++ abort (); ++ t = build_int_2 (1, 0); ++ break; ++ } ++ div_and_round_double (code, uns, int1l, int1h, int2l, int2h, ++ &low, &hi, &garbagel, &garbageh); ++ t = build_int_2 (low, hi); ++ break; ++ ++ case TRUNC_MOD_EXPR: case ROUND_MOD_EXPR: ++ case FLOOR_MOD_EXPR: case CEIL_MOD_EXPR: ++ div_and_round_double (code, uns, int1l, int1h, int2l, int2h, ++ &garbagel, &garbageh, &low, &hi); ++ t = build_int_2 (low, hi); ++ break; ++ ++ case MIN_EXPR: ++ case MAX_EXPR: ++ if (uns) ++ { ++ low = (((unsigned) int1h < (unsigned) int2h) ++ || (((unsigned) int1h == (unsigned) int2h) ++ && ((unsigned) int1l < (unsigned) int2l))); ++ } ++ else ++ { ++ low = ((int1h < int2h) ++ || ((int1h == int2h) ++ && ((unsigned) int1l < (unsigned) int2l))); ++ } ++ if (low == (code == MIN_EXPR)) ++ t = build_int_2 (int1l, int1h); ++ else ++ t = build_int_2 (int2l, int2h); ++ break; ++ ++ default: ++ abort (); ++ } ++ got_it: ++ TREE_TYPE (t) = TREE_TYPE (arg1); ++ force_fit_type (t); ++ return t; ++ } ++#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ if (TREE_CODE (arg1) == REAL_CST) ++ { ++ register REAL_VALUE_TYPE d1 = TREE_REAL_CST (arg1); ++ register REAL_VALUE_TYPE d2 = TREE_REAL_CST (arg2); ++ register REAL_VALUE_TYPE value; ++ ++ if (setjmp (combine_error)) ++ { ++ warning ("floating overflow in constant folding"); ++ return build (code, TREE_TYPE (arg1), arg1, arg2); ++ } ++ set_float_handler (combine_error); ++ ++#ifdef REAL_ARITHMETIC ++ REAL_ARITHMETIC (value, code, d1, d2); ++#else ++ switch (code) ++ { ++ case PLUS_EXPR: ++ value = d1 + d2; ++ break; ++ ++ case MINUS_EXPR: ++ value = d1 - d2; ++ break; ++ ++ case MULT_EXPR: ++ value = d1 * d2; ++ break; ++ ++ case RDIV_EXPR: ++ if (d2 == 0) ++ abort (); ++ ++ value = d1 / d2; ++ break; ++ ++ case MIN_EXPR: ++ value = d1 < d2 ? d1 : d2; ++ break; ++ ++ case MAX_EXPR: ++ value = d1 > d2 ? d1 : d2; ++ break; ++ ++ default: ++ abort (); ++ } ++#endif /* no REAL_ARITHMETIC */ ++ set_float_handler (0); ++ if (TYPE_MODE (TREE_TYPE (arg1)) == SFmode) ++ value = REAL_VALUE_TRUNCATE (value); ++ return build_real (TREE_TYPE (arg1), value); ++ } ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ if (TREE_CODE (arg1) == COMPLEX_CST) ++ { ++ register tree r1 = TREE_REALPART (arg1); ++ register tree i1 = TREE_IMAGPART (arg1); ++ register tree r2 = TREE_REALPART (arg2); ++ register tree i2 = TREE_IMAGPART (arg2); ++ register tree t; ++ ++ switch (code) ++ { ++ case PLUS_EXPR: ++ t = build_complex (combine (PLUS_EXPR, r1, r2), ++ combine (PLUS_EXPR, i1, i2)); ++ break; ++ ++ case MINUS_EXPR: ++ t = build_complex (combine (MINUS_EXPR, r1, r2), ++ combine (MINUS_EXPR, i1, i2)); ++ break; ++ ++ case MULT_EXPR: ++ t = build_complex (combine (MINUS_EXPR, ++ combine (MULT_EXPR, r1, r2), ++ combine (MULT_EXPR, i1, i2)), ++ combine (PLUS_EXPR, ++ combine (MULT_EXPR, r1, i2), ++ combine (MULT_EXPR, i1, r2))); ++ break; ++ ++ case RDIV_EXPR: ++ { ++ register tree magsquared ++ = combine (PLUS_EXPR, ++ combine (MULT_EXPR, r2, r2), ++ combine (MULT_EXPR, i2, i2)); ++ t = build_complex (combine (RDIV_EXPR, ++ combine (PLUS_EXPR, ++ combine (MULT_EXPR, r1, r2), ++ combine (MULT_EXPR, i1, i2)), ++ magsquared), ++ combine (RDIV_EXPR, ++ combine (MINUS_EXPR, ++ combine (MULT_EXPR, i1, r2), ++ combine (MULT_EXPR, r1, i2)), ++ magsquared)); ++ } ++ break; ++ ++ default: ++ abort (); ++ } ++ TREE_TYPE (t) = TREE_TYPE (arg1); ++ return t; ++ } ++ return 0; ++} ++ ++/* Given T, a tree representing type conversion of a constant, ++ return a constant tree representing the result of conversion. */ ++ ++static tree ++fold_convert (t) ++ register tree t; ++{ ++ register tree arg1 = TREE_OPERAND (t, 0); ++ register tree type = TREE_TYPE (t); ++ ++ if (TREE_CODE (type) == POINTER_TYPE ++ || TREE_CODE (type) == INTEGER_TYPE ++ || TREE_CODE (type) == ENUMERAL_TYPE) ++ { ++ if (TREE_CODE (arg1) == INTEGER_CST) ++ { ++ /* Given an integer constant, make new constant with new type, ++ appropriately sign-extended or truncated. */ ++ t = build_int_2 (TREE_INT_CST_LOW (arg1), ++ TREE_INT_CST_HIGH (arg1)); ++ TREE_TYPE (t) = type; ++ force_fit_type (t); ++ } ++#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ else if (TREE_CODE (arg1) == REAL_CST) ++ { ++ if (REAL_VALUES_LESS (real_value_from_int_cst (TYPE_MAX_VALUE (type)), ++ TREE_REAL_CST (arg1)) ++ || REAL_VALUES_LESS (TREE_REAL_CST (arg1), ++ real_value_from_int_cst (TYPE_MIN_VALUE (type)))) ++ { ++ warning ("real constant out of range for integer conversion"); ++ return t; ++ } ++#ifndef REAL_ARITHMETIC ++ { ++ REAL_VALUE_TYPE d; ++ int low, high; ++ int half_word = 1 << (HOST_BITS_PER_INT / 2); ++ ++ d = TREE_REAL_CST (arg1); ++ if (d < 0) ++ d = -d; ++ ++ high = (int) (d / half_word / half_word); ++ d -= (REAL_VALUE_TYPE) high * half_word * half_word; ++ low = (unsigned) d; ++ if (TREE_REAL_CST (arg1) < 0) ++ neg_double (low, high, &low, &high); ++ t = build_int_2 (low, high); ++ } ++#else ++ { ++ int low, high; ++ REAL_VALUE_TO_INT (low, high, TREE_REAL_CST (arg1)); ++ t = build_int_2 (low, high); ++ } ++#endif ++ TREE_TYPE (t) = type; ++ force_fit_type (t); ++ } ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ TREE_TYPE (t) = type; ++ } ++ else if (TREE_CODE (type) == REAL_TYPE) ++ { ++#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ if (TREE_CODE (arg1) == INTEGER_CST) ++ return build_real_from_int_cst (type, arg1); ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ if (TREE_CODE (arg1) == REAL_CST) ++ { ++ REAL_VALUE_TYPE r = TREE_REAL_CST (arg1); ++ /* This handles conversion from double to float, ++ which is the only nontrivial float conversion now supported. */ ++ if (TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (arg1))) ++ r = REAL_VALUE_TRUNCATE (r); ++ return build_real (type, r); ++ } ++ } ++ TREE_LITERAL (t) = 1; ++ return t; ++} ++ ++/* Return nonzero if two constants (that are not manifest constants) ++ are necessarily equal. It detects only the easiest, common case of ++ equality. */ ++ ++static int ++operand_equal_p (arg0, arg1) ++ tree arg0, arg1; ++{ ++ while ((TREE_CODE (arg0) == NOP_EXPR ++ || TREE_CODE (arg0) == CONVERT_EXPR) ++ && TYPE_MODE (TREE_TYPE (arg0)) == TYPE_MODE (TREE_TYPE (TREE_OPERAND (arg0, 0)))) ++ arg0 = TREE_OPERAND (arg0, 0); ++ while ((TREE_CODE (arg1) == NOP_EXPR ++ || TREE_CODE (arg1) == CONVERT_EXPR) ++ && TYPE_MODE (TREE_TYPE (arg1)) == TYPE_MODE (TREE_TYPE (TREE_OPERAND (arg1, 0)))) ++ arg1 = TREE_OPERAND (arg1, 0); ++ ++ if (TREE_CODE (arg0) == TREE_CODE (arg1) ++ && TREE_CODE (arg0) == ADDR_EXPR ++ && TREE_OPERAND (arg0, 0) == TREE_OPERAND (arg1, 0)) ++ return 1; ++ return 0; ++} ++ ++#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ ++/* Return 1 if ARG is a real constant with value zero. ++ This function is not defined in the case where it is impossible ++ to tell whether a real constant is zero (for cross-compilation). */ ++ ++static int ++real_zerop (arg) ++ tree arg; ++{ ++#ifdef REAL_IS_NOT_DOUBLE ++ tree t1 = build_real_from_int_cst (TREE_TYPE (arg), integer_zero_node); ++ return REAL_VALUES_EQUAL (TREE_REAL_CST (arg), TREE_REAL_CST (t1)); ++#else ++ return TREE_REAL_CST (arg) == 0; ++#endif ++} ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ ++/* Perform constant folding and related simplification of EXPR. ++ The related simplifications include x*1 => x, x*0 => 0, etc., ++ and application of the associative law. ++ NOP_EXPR conversions may be removed freely (as long as we ++ are careful not to change the C type of the overall expression) ++ We cannot simplify through a CONVERT_EXPR, FIX_EXPR or FLOAT_EXPR, ++ but we can constant-fold them if they have constant operands. */ ++ ++tree ++fold (expr) ++ tree expr; ++{ ++ register tree t = expr; ++ tree type = TREE_TYPE (expr); ++ register tree arg0, arg1; ++ register enum tree_code code = TREE_CODE (t); ++ register int kind; ++ ++ /* WINS will be nonzero when the switch is done ++ if all operands are constant. ++ ++ LOSES will be nonzero when the switch is done ++ if any operand is volatile. ++ This inhibits optimizations such as (foo () * 0) => 0. ++ But identity-element optimizations such as ++ (foo () * 1) => (foo ()) can be done even if LOSES is set. */ ++ ++ int wins = 1; ++ int loses = 0; ++ ++ /* Return right away if already constant. */ ++ if (TREE_LITERAL (t)) ++ { ++ if (code == CONST_DECL) ++ return DECL_INITIAL (t); ++ return t; ++ } ++ ++ kind = *tree_code_type[(int) code]; ++ if (kind == 'e' || kind == 'r') ++ { ++ register int len = tree_code_length[(int) code]; ++ register int i; ++ for (i = 0; i < len; i++) ++ { ++ if (TREE_OPERAND (t, i) == 0) ++ continue; /* Valid for CALL_EXPR, at least. */ ++ if (TREE_CODE (TREE_OPERAND (t, i)) != INTEGER_CST ++#if ! defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ && TREE_CODE (TREE_OPERAND (t, i)) != REAL_CST ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ ) ++ /* Note that TREE_LITERAL isn't enough: ++ static var addresses are constant but we can't ++ do arithmetic on them. */ ++ wins = 0; ++ if (TREE_VOLATILE (TREE_OPERAND (t, i))) ++ loses = 1; ++ } ++ arg0 = TREE_OPERAND (t, 0); ++ if (len > 1) ++ arg1 = TREE_OPERAND (t, 1); ++ } ++ ++ /* Now WINS and LOSES are set as described above, ++ ARG0 is the first operand of EXPR, ++ and ARG1 is the second operand (if it has more than one operand). */ ++ ++ switch (code) ++ { ++ case INTEGER_CST: ++ case REAL_CST: ++ case STRING_CST: ++ case COMPLEX_CST: ++ case CONSTRUCTOR: ++ return t; ++ ++ case CONST_DECL: ++ return fold (DECL_INITIAL (t)); ++ ++ case NOP_EXPR: ++ case FLOAT_EXPR: ++ case CONVERT_EXPR: ++ case FIX_TRUNC_EXPR: ++ /* Other kinds of FIX are not handled properly by fold_convert. */ ++ if (!wins) ++ { ++ TREE_LITERAL (t) = TREE_LITERAL (arg0); ++ return t; ++ } ++ return fold_convert (t); ++ ++#if 0 /* This loses on &"foo"[0]. */ ++ case ARRAY_REF: ++ { ++ int i; ++ ++ /* Fold an expression like: "foo"[2] */ ++ if (TREE_CODE (arg0) == STRING_CST ++ && TREE_CODE (arg1) == INTEGER_CST ++ && !TREE_INT_CST_HIGH (arg1) ++ && (i = TREE_INT_CST_LOW (arg1)) < TREE_STRING_LENGTH (arg0)) ++ { ++ t = build_int_2 (TREE_STRING_POINTER (arg0)[i], 0); ++ TREE_TYPE (t) = TREE_TYPE (TREE_TYPE (arg0)); ++ force_fit_type (t); ++ } ++ } ++ return t; ++#endif /* 0 */ ++ ++ case RANGE_EXPR: ++ TREE_LITERAL (t) = wins; ++ return t; ++ ++ case NEGATE_EXPR: ++ if (wins) ++ { ++ if (TREE_CODE (arg0) == INTEGER_CST) ++ { ++ if (TREE_INT_CST_LOW (arg0) == 0) ++ t = build_int_2 (0, - TREE_INT_CST_HIGH (arg0)); ++ else ++ t = build_int_2 (- TREE_INT_CST_LOW (arg0), ++ ~ TREE_INT_CST_HIGH (arg0)); ++ TREE_TYPE (t) = type; ++ force_fit_type (t); ++ } ++ else if (TREE_CODE (arg0) == REAL_CST) ++ t = build_real (type, REAL_VALUE_NEGATE (TREE_REAL_CST (arg0))); ++ TREE_TYPE (t) = type; ++ } ++ return t; ++ ++ case ABS_EXPR: ++ if (wins) ++ { ++ if (TREE_CODE (arg0) == INTEGER_CST) ++ { ++ if (! TREE_UNSIGNED (type) ++ && TREE_INT_CST_HIGH (arg0) < 0) ++ { ++ if (TREE_INT_CST_LOW (arg0) == 0) ++ t = build_int_2 (0, - TREE_INT_CST_HIGH (arg0)); ++ else ++ t = build_int_2 (- TREE_INT_CST_LOW (arg0), ++ ~ TREE_INT_CST_HIGH (arg0)); ++ } ++ } ++ else if (TREE_CODE (arg0) == REAL_CST) ++ { ++ if ( ++#if defined (REAL_IS_NOT_DOUBLE) ++ REAL_VALUES_LESS (TREE_REAL_CST (arg0), ++ REAL_VALUE_ATOF ("0.0")) ++#else ++ REAL_VALUES_LESS (TREE_REAL_CST (arg0), 0) ++#endif ++ ) ++ t = build_real (type, ++ REAL_VALUE_NEGATE (TREE_REAL_CST (arg0))); ++ } ++ TREE_TYPE (t) = type; ++ } ++ return t; ++ ++ case BIT_NOT_EXPR: ++ if (wins) ++ { ++ if (TREE_CODE (arg0) == INTEGER_CST) ++ t = build_int_2 (~ TREE_INT_CST_LOW (arg0), ++ ~ TREE_INT_CST_HIGH (arg0)); ++ TREE_TYPE (t) = type; ++ force_fit_type (t); ++ } ++ return t; ++ ++ case PLUS_EXPR: ++ if (integer_zerop (arg0)) ++ return convert (type, arg1); ++ if (integer_zerop (arg1)) ++ return convert (type, arg0); ++ associate: ++ /* In most languages, can't associate operations on floats ++ through parentheses. Rather than remember where the parentheses ++ were, we don't associate floats at all. It shouldn't matter much. */ ++ if (TREE_CODE (type) == REAL_TYPE) ++ goto binary; ++ /* The varsign == -1 cases happen only for addition and subtraction. ++ It says that the arg that was split was really CON minus VAR. ++ The rest of the code applies to all associative operations. */ ++ if (!wins) ++ { ++ tree var, con, tem; ++ int varsign; ++ ++ if (split_tree (arg0, code, &var, &con, &varsign)) ++ { ++ if (varsign == -1) ++ { ++ /* EXPR is (CON-VAR) +- ARG1. */ ++ /* If it is + and VAR==ARG1, return just CONST. */ ++ if (code == PLUS_EXPR && operand_equal_p (var, arg1)) ++ return convert (TREE_TYPE (t), con); ++ ++ /* Otherwise return (CON +- ARG1) - VAR. */ ++ TREE_SET_CODE (t, MINUS_EXPR); ++ TREE_OPERAND (t, 1) = var; ++ TREE_OPERAND (t, 0) ++ = fold (build (code, TREE_TYPE (t), con, arg1)); ++ } ++ else ++ { ++ /* EXPR is (VAR+CON) +- ARG1. */ ++ /* If it is - and VAR==ARG1, return just CONST. */ ++ if (code == MINUS_EXPR && operand_equal_p (var, arg1)) ++ return convert (TREE_TYPE (t), con); ++ ++ /* Otherwise return VAR +- (ARG1 +- CON). */ ++ TREE_OPERAND (t, 1) = tem ++ = fold (build (code, TREE_TYPE (t), arg1, con)); ++ TREE_OPERAND (t, 0) = var; ++ if (integer_zerop (tem) ++ && (code == PLUS_EXPR || code == MINUS_EXPR)) ++ return var; ++ /* If we have x +/- (c - d) [c an explicit integer] ++ change it to x -/+ (d - c) since if d is relocatable ++ then the latter can be a single immediate insn ++ and the former cannot. */ ++ if (TREE_CODE (tem) == MINUS_EXPR ++ && TREE_CODE (TREE_OPERAND (tem, 0)) == INTEGER_CST) ++ { ++ tree tem1 = TREE_OPERAND (tem, 1); ++ TREE_OPERAND (tem, 1) = TREE_OPERAND (tem, 0); ++ TREE_OPERAND (tem, 0) = tem1; ++ TREE_SET_CODE (t, ++ (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR)); ++ } ++ } ++ return t; ++ } ++ ++ if (split_tree (arg1, code, &var, &con, &varsign)) ++ { ++ /* EXPR is ARG0 +- (CON +- VAR). */ ++ if (varsign == -1) ++ TREE_SET_CODE (t, ++ (code == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR)); ++ if (TREE_CODE (t) == MINUS_EXPR && operand_equal_p (var, arg0)) ++ { ++ /* If VAR and ARG0 cancel, return just CON or -CON. */ ++ if (code == PLUS_EXPR) ++ return convert (TREE_TYPE (t), con); ++ return fold (build (NEGATE_EXPR, TREE_TYPE (t), ++ convert (TREE_TYPE (t), con))); ++ } ++ TREE_OPERAND (t, 0) ++ = fold (build (code, TREE_TYPE (t), arg0, con)); ++ TREE_OPERAND (t, 1) = var; ++ if (integer_zerop (TREE_OPERAND (t, 0)) ++ && TREE_CODE (t) == PLUS_EXPR) ++ return convert (TREE_TYPE (t), var); ++ return t; ++ } ++ } ++ binary: ++#if defined (REAL_IS_NOT_DOUBLE) && ! defined (REAL_ARITHMETIC) ++ if (TREE_CODE (arg1) == REAL_CST) ++ return t; ++#endif /* REAL_IS_NOT_DOUBLE, and no REAL_ARITHMETIC */ ++ { ++ register tree t1 = NULL_TREE; ++ if (wins) ++ t1 = combine (code, arg0, arg1); ++ if (t1 != NULL_TREE) return t1; ++ return t; ++ } ++ ++ case MINUS_EXPR: ++ if (! wins && integer_zerop (arg0)) ++ return build (NEGATE_EXPR, type, arg1); ++ if (integer_zerop (arg1)) ++ return convert (type, arg0); ++ /* Fold &x - &x. This can happen from &x.foo - &x. */ ++ if (operand_equal_p (arg0, arg1)) ++ return convert (TREE_TYPE (t), integer_zero_node); ++ goto associate; ++ ++ case MULT_EXPR: ++ if (!loses && integer_zerop (arg0)) ++ return convert (type, arg0); ++ if (!loses && integer_zerop (arg1)) ++ return convert (type, arg1); ++ if (integer_onep (arg0)) ++ return convert (type, arg1); ++ if (integer_onep (arg1)) ++ return convert (type, arg0); ++ goto associate; ++ ++ case BIT_IOR_EXPR: ++ if (!loses && integer_all_onesp (arg0)) ++ return convert (type, arg0); ++ if (!loses && integer_all_onesp (arg1)) ++ return convert (type, arg1); ++ case BIT_XOR_EXPR: ++ if (integer_zerop (arg0)) ++ return convert (type, arg1); ++ if (integer_zerop (arg1)) ++ return convert (type, arg0); ++ goto associate; ++ ++ case BIT_AND_EXPR: ++ if (integer_all_onesp (arg0)) ++ return convert (type, arg1); ++ if (integer_all_onesp (arg1)) ++ return convert (type, arg0); ++ if (!loses && integer_zerop (arg0)) ++ return convert (type, arg0); ++ if (!loses && integer_zerop (arg1)) ++ return convert (type, arg1); ++ /* Simplify ((int)c & 0x377) into (int)c, if c is unsigned char. */ ++ if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == NOP_EXPR ++ && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0)))) ++ { ++ int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0))); ++ if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_INT ++ && (~TREE_INT_CST_LOW (arg0) & ((1 << prec) - 1)) == 0) ++ return build (NOP_EXPR, type, TREE_OPERAND (arg1, 0)); ++ } ++ if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR ++ && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0)))) ++ { ++ int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0))); ++ if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_INT ++ && (~TREE_INT_CST_LOW (arg1) & ((1 << prec) - 1)) == 0) ++ return build (NOP_EXPR, type, TREE_OPERAND (arg0, 0)); ++ } ++ goto associate; ++ ++ case BIT_ANDTC_EXPR: ++ if (integer_all_onesp (arg0)) ++ return convert (type, arg1); ++ if (integer_zerop (arg1)) ++ return convert (type, arg0); ++ if (!loses && integer_zerop (arg0)) ++ return convert (type, arg0); ++ if (!loses && integer_all_onesp (arg1)) ++ return combine (code, arg1, arg1); ++ goto binary; ++ ++ case TRUNC_DIV_EXPR: ++ case ROUND_DIV_EXPR: ++ case FLOOR_DIV_EXPR: ++ case CEIL_DIV_EXPR: ++ case EXACT_DIV_EXPR: ++ case RDIV_EXPR: ++ if (integer_onep (arg1)) ++ return convert (type, arg0); ++ if (integer_zerop (arg1)) ++ return t; ++#if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ++ if (TREE_CODE (arg1) == REAL_CST ++ && real_zerop (arg1)) ++ return t; ++#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ++ ++ goto binary; ++ ++ case CEIL_MOD_EXPR: ++ case FLOOR_MOD_EXPR: ++ case ROUND_MOD_EXPR: ++ case TRUNC_MOD_EXPR: ++ if (!loses && integer_onep (arg1)) ++ return combine (code, arg1, arg1); ++ if (integer_zerop (arg1)) ++ return t; ++ goto binary; ++ ++ case LSHIFT_EXPR: ++ case RSHIFT_EXPR: ++ case LROTATE_EXPR: ++ case RROTATE_EXPR: ++ if (integer_zerop (arg1)) ++ return convert (type, arg0); ++ goto binary; ++ ++ case MIN_EXPR: case MAX_EXPR: ++ goto associate; ++ ++ case TRUTH_NOT_EXPR: ++ /* Note that the operand of this must be an int ++ and its values must be 0 or 1. ++ ("true" is a fixed value perhaps depending on the language, ++ but we don't handle values other than 1 correctly yet.) */ ++ if (TREE_CODE (arg0) == INTEGER_CST) ++ { ++ t = build_int_2 ((TREE_INT_CST_LOW (arg0) == 0 ++ && TREE_INT_CST_HIGH (arg0) == 0), ++ 0); ++ TREE_TYPE (t) = integer_type_node; ++ } ++ return t; ++ ++ case TRUTH_ANDIF_EXPR: ++ /* Note that the operands of this must be ints ++ and their values must be 0 or 1. ++ ("true" is a fixed value perhaps depending on the language.) */ ++ /* If first arg is constant zero, return it. */ ++ if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0)) ++ return arg0; ++ case TRUTH_AND_EXPR: ++ /* If either arg is constant true, drop it. */ ++ if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0)) ++ return arg1; ++ if (TREE_CODE (arg1) == INTEGER_CST && ! integer_zerop (arg1)) ++ return arg0; ++ /* Both known to be zero => return zero. */ ++ if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST) ++ return arg0; ++ return t; ++ ++ case TRUTH_ORIF_EXPR: ++ /* Note that the operands of this must be ints ++ and their values must be 0 or true. ++ ("true" is a fixed value perhaps depending on the language.) */ ++ /* If first arg is constant true, return it. */ ++ if (TREE_CODE (arg0) == INTEGER_CST && ! integer_zerop (arg0)) ++ return arg0; ++ case TRUTH_OR_EXPR: ++ /* If either arg is constant zero, drop it. */ ++ if (TREE_CODE (arg0) == INTEGER_CST && integer_zerop (arg0)) ++ return arg1; ++ if (TREE_CODE (arg1) == INTEGER_CST && integer_zerop (arg1)) ++ return arg0; ++ /* Both known to be true => return true. */ ++ if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST) ++ return arg0; ++ return t; ++ ++ case EQ_EXPR: ++ case NE_EXPR: ++ case LT_EXPR: ++ case GT_EXPR: ++ case LE_EXPR: ++ case GE_EXPR: ++ /* If one arg is a constant integer, put it last. */ ++ if (TREE_CODE (arg0) == INTEGER_CST ++ && TREE_CODE (arg1) != INTEGER_CST) ++ { ++ TREE_OPERAND (t, 0) = arg1; ++ TREE_OPERAND (t, 1) = arg0; ++ arg0 = TREE_OPERAND (t, 0); ++ arg1 = TREE_OPERAND (t, 1); ++ switch (code) ++ { ++ case GT_EXPR: ++ code = LT_EXPR; ++ break; ++ case GE_EXPR: ++ code = LE_EXPR; ++ break; ++ case LT_EXPR: ++ code = GT_EXPR; ++ break; ++ case LE_EXPR: ++ code = GE_EXPR; ++ break; ++ } ++ TREE_SET_CODE (t, code); ++ } ++ ++ /* Convert foo++ == CONST into ++foo == CONST + INCR. ++ First, see if one arg is constant; find the constant arg ++ and the other one. */ ++ { ++ tree constop = 0, varop; ++ tree *constoploc; ++ ++ if (TREE_LITERAL (arg1)) ++ constoploc = &TREE_OPERAND (t, 1), constop = arg1, varop = arg0; ++ if (TREE_LITERAL (arg0)) ++ constoploc = &TREE_OPERAND (t, 0), constop = arg0, varop = arg1; ++ ++ if (constop && TREE_CODE (varop) == POSTINCREMENT_EXPR) ++ { ++ tree newconst ++ = fold (build (PLUS_EXPR, TREE_TYPE (constop), ++ constop, TREE_OPERAND (varop, 1))); ++ /* This optimization is invalid for ordered comparisons ++ if CONST+INCR overflows or if foo+incr might overflow. ++ For pointer types we assume overflow doesn't happen. */ ++ if (TREE_CODE (TREE_TYPE (varop)) == POINTER_TYPE ++ || code == EQ_EXPR || code == NE_EXPR) ++ { ++ /* This optimization is invalid for floating point ++ if adding one to the constant does not change it. */ ++ if (TREE_CODE (TREE_TYPE (newconst)) != REAL_TYPE ++ || !REAL_VALUES_EQUAL (TREE_REAL_CST (newconst), ++ TREE_REAL_CST (constop))) ++ { ++ TREE_SET_CODE (varop, PREINCREMENT_EXPR); ++ *constoploc = newconst; ++ return t; ++ } ++ } ++ } ++ else if (constop && TREE_CODE (varop) == POSTDECREMENT_EXPR) ++ { ++ tree newconst ++ = fold (build (MINUS_EXPR, TREE_TYPE (constop), ++ constop, TREE_OPERAND (varop, 1))); ++ if (TREE_CODE (TREE_TYPE (varop)) == POINTER_TYPE ++ || code == EQ_EXPR || code == NE_EXPR) ++ { ++ if (TREE_CODE (TREE_TYPE (newconst)) != REAL_TYPE ++ || !REAL_VALUES_EQUAL (TREE_REAL_CST (newconst), ++ TREE_REAL_CST (constop))) ++ { ++ TREE_SET_CODE (varop, PREDECREMENT_EXPR); ++ *constoploc = newconst; ++ return t; ++ } ++ } ++ } ++ } ++ ++ /* Change X >= CST to X > (CST - 1) if CST is positive. */ ++ if (TREE_CODE (arg1) == INTEGER_CST ++ && TREE_CODE (arg0) != INTEGER_CST ++ && ! tree_int_cst_lt (arg1, integer_one_node)) ++ { ++ switch (TREE_CODE (t)) ++ { ++ case GE_EXPR: ++ code = GT_EXPR; ++ TREE_SET_CODE (t, code); ++ arg1 = combine (MINUS_EXPR, arg1, integer_one_node); ++ TREE_OPERAND (t, 1) = arg1; ++ break; ++ ++ case LT_EXPR: ++ code = LE_EXPR; ++ TREE_SET_CODE (t, code); ++ arg1 = combine (MINUS_EXPR, arg1, integer_one_node); ++ TREE_OPERAND (t, 1) = arg1; ++ } ++ } ++ ++ /* An unsigned comparison against 0 can be simplified. */ ++ if (integer_zerop (arg1) ++ && (TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE ++ || TREE_CODE (TREE_TYPE (arg1)) == POINTER_TYPE) ++ && TREE_UNSIGNED (TREE_TYPE (arg1))) ++ { ++ switch (TREE_CODE (t)) ++ { ++ case GT_EXPR: ++ TREE_SET_CODE (t, NE_EXPR); ++ break; ++ case LE_EXPR: ++ TREE_SET_CODE (t, EQ_EXPR); ++ break; ++ case GE_EXPR: ++ return build (COMPOUND_EXPR, integer_type_node, ++ arg0, integer_one_node); ++ case LT_EXPR: ++ return build (COMPOUND_EXPR, integer_type_node, ++ arg0, integer_zero_node); ++ } ++ } ++ ++ /* To compute GT, swap the arguments and do LT. ++ To compute GE, do LT and invert the result. ++ To compute LE, swap the arguments, do LT and invert the result. ++ To compute NE, do EQ and invert the result. */ ++ if (code == LE_EXPR || code == GT_EXPR) ++ { ++ register tree temp = arg0; ++ arg0 = arg1; ++ arg1 = temp; ++ } ++ ++ /* Compute a result for LT or EQ if args permit; ++ otherwise return T. */ ++ if (TREE_CODE (arg0) == INTEGER_CST ++ && TREE_CODE (arg1) == INTEGER_CST) ++ { ++ if (code == EQ_EXPR || code == NE_EXPR) ++ t = build_int_2 ++ (TREE_INT_CST_LOW (arg0) == TREE_INT_CST_LOW (arg1) ++ && TREE_INT_CST_HIGH (arg0) == TREE_INT_CST_HIGH (arg1), ++ 0); ++ else ++ t = build_int_2 ((TREE_UNSIGNED (TREE_TYPE (arg0)) ++ ? INT_CST_LT_UNSIGNED (arg0, arg1) ++ : INT_CST_LT (arg0, arg1)), ++ 0); ++ } ++ else if (TREE_CODE (arg1) == INTEGER_CST ++ && TREE_LITERAL (arg0) ++ && TREE_CODE (arg0) == ADDR_EXPR ++ && (code == EQ_EXPR || code == NE_EXPR)) ++ { ++ t = build_int_2 (0, 0); ++ } ++ else if (TREE_CODE (arg0) == REAL_CST ++ && TREE_CODE (arg1) == REAL_CST) ++ { ++ if (code == EQ_EXPR || code == NE_EXPR) ++ t = build_int_2 (REAL_VALUES_EQUAL (TREE_REAL_CST (arg0), ++ TREE_REAL_CST (arg1)), ++ 0); ++ else ++ t = build_int_2 (REAL_VALUES_LESS (TREE_REAL_CST (arg0), ++ TREE_REAL_CST (arg1)), ++ 0); ++ } ++ else ++ return t; ++ ++ /* If what we want is other than LT or EQ, invert the result. */ ++ if (code == GE_EXPR || code == LE_EXPR || code == NE_EXPR) ++ TREE_INT_CST_LOW (t) ^= 1; ++ TREE_TYPE (t) = type; ++ return t; ++ ++ case COND_EXPR: ++ if (TREE_LITERAL (arg0)) ++ return TREE_OPERAND (expr, (integer_zerop (arg0) ? 2 : 1)); ++ return t; ++ ++ default: ++ return t; ++ } /* switch (code) */ ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.1 alliance/genview/src/gcc-1.42/gcc.1 +--- alliance-5.0/genview/src/gcc-1.42/gcc.1 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.1 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,1310 @@ ++.TH GCC 1 "28 November 1990" "Version 1.40" ++.de BP ++.sp ++.ti -.2i ++\(** ++.. ++.SH NAME ++gcc \- GNU project C Compiler ++.SH SYNOPSIS ++.B gcc ++[ options ] files ++.SH WARNING ++This man page is an extract of the documentation of the ++.I GNU C compiler ++and is limited to the meaning of the options. ++.B It is not kept up to date. ++If you want to be certain of the information ++below, check it in the manual "Using and Porting GCC". Refer to the Info file ++.B gcc.info ++or the DVI file ++.B gcc.dvi ++which are made from the Texinfo source file ++.BR gcc.texinfo . ++.SH DESCRIPTION ++The ++.I GNU C compiler ++uses a command syntax much like the Unix C compiler. ++The ++.I gcc ++program accepts options and file names as operands. ++Multiple single-letter options may ++.I not ++be grouped: ++.B \-dr ++is very different from ++.BR "\-d \-r" . ++.P ++When you invoke GNU CC, it normally does preprocessing, compilation, ++assembly and linking. ++File names which end in ++.B .c ++are taken as C source to be preprocessed and compiled; ++file names ending in ++.B .i ++are taken as preprocessor output to be compiled; ++compiler output files plus any input files with names ending in ++.B .s ++are assembled; ++then the resulting object files, plus any other input files, ++are linked together to produce an executable. ++.P ++Command options allow you to stop this process at an intermediate stage. ++For example, the ++.B \-c ++option says not to run the linker. ++Then the output consists of object files output by the assembler. ++.P ++Other command options are passed on to one stage of processing. ++Some options control the preprocessor and others the compiler itself. ++Yet other options control the assembler and linker; ++these are not documented here, but you rarely need to use any of them. ++.SH OPTIONS ++Here are the options to control the overall compilation process, ++including those that say whether to link, whether to assemble, and so on. ++.TP ++.BI \-o " file" ++Place output in file ++.IR file . ++This applies regardless to whatever sort of output is being produced, ++whether it be an executable file, an object file, ++an assembler file or preprocessed C code. ++.sp ++If ++.B \-o ++is not specified, the default is to put an executable file in ++.BR a.out , ++the object file ++.IB source .c ++in ++.IB source .o\fR, ++an assembler file in ++.IB source .s\fR, ++and preprocessed C on standard output. ++.TP ++.B \-c ++Compile or assemble the source files, but do not link. ++Produce object files with names made by replacing ++.B .c ++or ++.B .s ++with ++.B .o ++at the end of the input file names. ++Do nothing at all for object files specified as input. ++.TP ++.B \-S ++Compile into assembler code but do not assemble. ++The assembler output file name is made by replacing ++.B .c ++with ++.B .s ++at the end of the input file name. ++Do nothing at all for assembler source files or ++object files specified as input. ++.TP ++.B \-E ++Run only the C preprocessor. ++Preprocess all the C source files specified and output ++the results to standard output. ++.TP ++.B \-v ++Compiler driver program prints the commands it executes as it runs ++the preprocessor, compiler proper, assembler and linker. ++Some of these are directed to print their own version numbers. ++.TP ++.B \-pipe ++Use pipes rather than temporary files for communication between the ++various stages of compilation. ++This fails to work on some systems where the assembler is unable ++to read from a pipe; but the GNU assembler has no trouble. ++.TP ++.BI \-B prefix ++Compiler driver program tries ++.I prefix ++as a prefix for each program it tries to run. ++These programs are ++.IR cpp , ++.IR cc1 , ++.I as ++and ++.IR ld . ++.sp ++For each subprogram to be run, the compiler driver first tries the ++.B \-B ++prefix, if any. ++If that name is not found, or if ++.B \-B ++was not specified, the driver tries two standard prefixes, which are ++.B /usr/lib/gcc- ++and ++.BR /usr/local/lib/gcc- . ++If neither of those results in a file name that is found, the ++unmodified program name is searched for using the directories ++specified in your ++.B PATH ++environment variable. ++.sp ++The run-time support file ++.B gnulib ++is also searched for using the ++.B \-B ++prefix, if needed. ++If it is not found there, the two standard prefixes above ++are tried, and that is all. ++The file is left out of the link if it is not found by those means. ++Most of the time, on most machines, you can do without it. ++.sp ++You can get a similar result from the environment variable ++.BR GCC_EXEC_PREFIX ; ++if it is defined, its value is used as a prefix in the same way. ++If both the ++.B \-B ++option and the ++.B GCC_EXEC_PREFIX ++variable are present, the ++.B \-B ++option is used first and the environment variable value second. ++.TP ++.BI -b prefix ++The argument ++.I prefix ++is used as a second prefix for the compiler executables and libraries. ++This prefix is optional: the compiler tries each file first with it, ++then without it. ++This prefix follows the prefix specified with ++.B \-B ++or the default prefixes. ++.sp ++Thus, ++.B \-bvax- \-Bcc/ ++in the presence of environment variable ++.B GCC_EXEC_PREFIX ++with definition ++.B /u/foo/ ++causes GNU CC to try the following file names for the preprocessor executable: ++.sp ++ \fBcc/vax-cpp ++.br ++ cc/cpp ++.br ++ /u/foo/vax-cpp ++.br ++ /u/foo/cpp ++.br ++ /usr/local/lib/gcc-vax-cpp ++.br ++ /usr/local/lib/gcc-cpp ++.br ++ /usr/lib/gcc-vax-cpp ++.br ++ /usr/lib/gcc-cpp\fR ++.P ++These options control the details of C compilation itself. ++.TP ++.B \-ansi ++Support all ANSI standard C programs. ++.sp ++This turns off certain features of GNU C that are incompatible with ++ANSI C, such as the ++.BR asm , ++.B inline ++and ++.B typeof ++keywords, and predefined macros such as ++.B unix ++and ++.B vax ++that identify the type of system you are using. ++It also enables the undesirable and rarely used ANSI trigraph feature. ++.sp ++The alternate keywords ++.BR __asm__ , ++.B __inline__ ++and ++.B __typeof__ ++continue to work despite ++.BR \-ansi . ++You would not want to use them in an ANSI C program, of course, ++but it useful to put them in header files that might be included ++in compilations done with ++.BR \-ansi . ++Alternate predefined macros such as ++.B __unix__ ++and ++.B __vax__ ++are also available, with or without ++.BR \-ansi . ++.sp ++The ++.B \-ansi ++option does not cause non-ANSI programs to be rejected gratuitously. ++For that, ++.B \-pedantic ++is required in addition to ++.BR \-ansi . ++.sp ++The macro ++.B __STRICT_ANSI__ ++is predefined when the ++.B \-ansi ++option is used. ++Some header files may notice this macro and refrain from declaring ++certain functions or defining certain macros that the ANSI standard ++doesn't call for; this is to avoid interfering with any programs ++that might use these names for other things. ++.TP ++.B \-traditional ++Attempt to support some aspects of traditional C compilers. ++Specifically: ++.BP ++All ++.B extern ++declarations take effect globally even if they are ++written inside of a function definition. ++This includes implicit declarations of functions. ++.BP ++The keywords ++.BR typeof , ++.BR inline , ++.BR signed , ++.B const ++and ++.B volatile ++are not recognized. ++.BP ++Comparisons between pointers and integers are always allowed. ++.BP ++Integer types ++.B "unsigned short" ++and ++.B "unsigned char" ++promote to ++.BR "unsigned int" . ++.BP ++Out-of-range floating point literals are not an error. ++.BP ++All automatic variables not declared ++.B register ++are preserved by ++.IR longjmp (3C). ++Ordinarily, GNU C follows ANSI C: automatic variables not declared ++.B volatile ++may be clobbered. ++.BP ++In the preprocessor, comments convert to nothing at all, ++rather than to a space. ++This allows traditional token concatenation. ++.BP ++In the preprocessor, macro arguments are recognized within string ++constants in a macro definition (and their values are stringified, though ++without additional quote marks, when they appear in such a context). ++The preprocessor always considers a string constant to end at a newline. ++.BP ++The predefined macro ++.B __STDC__ ++is not defined when you use ++.BR \-traditional , ++but ++.B __GNUC__ ++is (since the GNU extensions which ++.B __GNUC__ ++indicates are not affected by ++.BR \-traditional ). ++If you need to write header files that work differently depending on whether ++.B \-traditional ++is in use, by testing both of these predefined macros you can distinguish ++four situations: GNU C, traditional GNU C, other ANSI C compilers, and ++other old C compilers. ++.TP ++.B \-O ++Optimize. ++Optimizing compilation takes somewhat more time, ++and a lot more memory for a large function. ++.sp ++Without ++.BR \-O , ++the compiler's goal is to reduce the cost of compilation and ++to make debugging produce the expected results. ++Statements are independent: if you stop the program with a breakpoint ++between statements, you can then assign a new value to any variable or ++change the program counter to any other statement in the function and ++get exactly the results you would expect from the source code. ++.sp ++Without ++.BR \-O , ++only variables declared ++.B register ++are allocated in registers. ++The resulting compiled code is a little worse than produced by PCC without ++.BR \-O . ++.sp ++With ++.BR \-O , ++the compiler tries to reduce code size and execution time. ++.sp ++Some of the ++.B \-f ++options described below turn specific kinds of optimization on or off. ++.TP ++.B \-g ++Produce debugging information in the operating system's ++native format (for DBX or SDB). ++GDB also can work with this debugging information. ++.sp ++Unlike most other C compilers, GNU CC allows you to use ++.B \-g ++with ++.BR \-O . ++The shortcuts taken by optimized code may occasionally ++produce surprising results: some variables you declared may not exist ++at all; flow of control may briefly move where you did not expect it; ++some statements may not be executed because they compute constant ++results or their values were already at hand; some statements may ++execute in different places because they were moved out of loops. ++Nevertheless it proves possible to debug optimized output. ++This makes it reasonable to use the optimizer for programs ++that might have bugs. ++.TP ++.B \-w ++Inhibit all warning messages. ++.TP ++.B \-W ++Print extra warning messages for these events: ++.BP ++An automatic variable is used without first being initialized. ++.sp ++These warnings are possible only in optimizing compilation, ++because they require data flow information that is computed only ++when optimizing. ++If you don't specify ++.BR \-O , ++you simply won't get these warnings. ++.sp ++These warnings occur only for variables that are candidates for ++register allocation. ++Therefore, they do not occur for a variable that is declared ++.BR volatile , ++or whose address is taken, or whose size is other than 1, 2, 4 or 8 bytes. ++Also, they do not occur for structures, unions or arrays, even when ++they are in registers. ++.sp ++Note that there may be no warning about a variable that is used only ++to compute a value that itself is never used, because such ++computations may be deleted by data flow analysis before the warnings ++are printed. ++.sp ++These warnings are made optional because GNU CC is not smart ++enough to see all the reasons why the code might be correct ++despite appearing to have an error. ++Here is one example of how this can happen: ++.sp ++ { ++.br ++ \ \ int x; ++.br ++ \ \ switch (y) ++.br ++ \ \ \ \ { ++.br ++ \ \ \ \ case 1: x = 1; ++.br ++ \ \ \ \ \ \ break; ++.br ++ \ \ \ \ case 2: x = 4; ++.br ++ \ \ \ \ \ \ break; ++.br ++ \ \ \ \ case 3: x = 5; ++.br ++ \ \ \ \ } ++.br ++ \ \ foo (x); ++.br ++ } ++.sp ++If the value of ++.I y ++is always 1, 2 or 3, then ++.I x ++is always initialized, but GNU CC doesn't know this. ++Here is another common case: ++.sp ++ { ++.br ++ \ \ int save_y; ++.br ++ \ \ if (change_y) save_y = y, y = new_y; ++.br ++ \ \ ... ++.br ++ \ \ if (change_y) y = save_y; ++.br ++ } ++.sp ++This has no bug because ++.I save_y ++is used only if it is set. ++.sp ++Some spurious warnings can be avoided if you declare as ++.B volatile ++all the functions you use that never return. ++.BP ++A nonvolatile automatic variable might be changed by a call to ++.IR longjmp (3C). ++These warnings as well are possible only in optimizing compilation. ++.sp ++The compiler sees only the calls to ++.IR setjmp (3C). ++It cannot know where ++.IR longjmp (3C) ++will be called; in fact, a signal handler could ++call it at any point in the code. ++As a result, you may get a warning even when there is ++in fact no problem because ++.IR longjmp (3C) ++cannot in fact be called at the place which would cause a problem. ++.BP ++A function can return either with or without a value. ++(Falling off the end of the function body is considered returning without ++a value.) ++For example, this function would evoke such a warning: ++.sp ++ foo (a) ++.br ++ { ++.br ++ \ \ if (a > 0) ++.br ++ \ \ \ \ return a; ++.br ++ } ++.sp ++Spurious warnings can occur because GNU CC does not realize that ++certain functions (including ++.IR abort (3C) ++and ++.IR longjmp (3C)) ++will never return. ++.BP ++An expression-statement contains no side effects. ++.sp ++In the future, other useful warnings may also be enabled by this option. ++.TP ++.B \-Wimplicit ++Warn whenever a function is implicitly declared. ++.TP ++.B \-Wreturn-type ++Warn whenever a function is defined with a return-type that defaults to ++.BR int . ++Also warn about any ++.B return ++statement with no return-value in a function whose return-type is not ++.BR void . ++.TP ++.B \-Wunused ++Warn whenever a local variable is unused aside from its declaration, ++and whenever a function is declared static but never defined. ++.TP ++.B \-Wswitch ++Warn whenever a ++.B switch ++statement has an index of enumeral type and lacks a ++.B case ++for one or more of the named codes of that enumeration. ++(The presence of a ++.B default ++label prevents this warning.) ++.B case ++labels outside the enumeration range also provoke ++warnings when this option is used. ++.TP ++.B \-Wcomment ++Warn whenever a comment-start sequence ++.B /\(** ++appears in a comment. ++.TP ++.B \-Wtrigraphs ++Warn if any trigraphs are encountered (assuming they are enabled). ++.TP ++.B \-Wall ++All of the above ++.B \-W ++options combined. ++These are all the options which pertain to usage that we do not recommend and ++that we believe is always easy to avoid, even in conjunction with macros. ++.sp ++The other ++.BR \-W ... ++options below are not implied by ++.B \-Wall ++because certain kinds of useful macros are almost impossible to write ++without causing those warnings. ++.TP ++.B \-Wshadow ++Warn whenever a local variable shadows another local variable. ++.TP ++.BI \-Wid-clash- len ++Warn whenever two distinct identifiers match in the first ++.I len ++characters. ++This may help you prepare a program that will compile with certain obsolete, ++brain-damaged compilers. ++.TP ++.B \-Wpointer-arith ++Warn about anything that depends on the size of a function type or of ++.BR void . ++GNU C assigns these types a size of 1, for convenience in calculations with ++.B void \(** ++pointers and pointers to functions. ++.TP ++.B \-Wcast-qual ++Warn whenever a pointer is cast so as to remove a type qualifier from ++the target type. ++For example, warn if a ++.B const char \(** ++is cast to an ordinary ++.BR "char \(**" . ++.TP ++.B \-Wwrite-strings ++Give string constants the type ++.B const char[\fIlength\fB] ++so that copying the address of one into a ++.RB non- "const char \(**" ++pointer will get a warning. ++These warnings will help you find at compile time ++code that can try to write into a string constant, ++but only if you have been very careful about using ++.B const ++in declarations and prototypes. ++Otherwise, it will just be a nuisance; this is why we did not make ++.B \-Wall ++request these warnings. ++.TP ++.B \-p ++Generate extra code to write profile information suitable ++for the analysis program ++.IR prof (1). ++.TP ++.B \-pg ++Generate extra code to write profile information suitable for the ++analysis program ++.IR gprof (1). ++.TP ++.B \-a ++Generate extra code to write profile information for basic blocks, ++suitable for the analysis program ++.IR tcov (1). ++Eventually GNU ++.IR gprof (1) ++should be extended to process this data. ++.TP ++.BI \-l library ++Search a standard list of directories for a library named ++.IR library , ++which is actually a file named ++.BR lib\fIlibrary\fB.a . ++The linker uses this file as if it had been specified precisely by name. ++.sp ++The directories searched include several standard system directories ++plus any that you specify with ++.BR \-L . ++.sp ++Normally the files found this way are library files--archive files ++whose members are object files. ++The linker handles an archive file by scanning through it for members ++which define symbols that have so far been referenced but not defined. ++But if the file that is found is an ordinary object file, it is linked ++in the usual fashion. ++The only difference between using an ++.B \-l ++option and specifying a file name is that ++.B \-l ++searches several directories. ++.TP ++.BI \-L dir ++Add directory ++.I dir ++to the list of directories to be searched for ++.BR \-l . ++.TP ++.B \-nostdlib ++Don't use the standard system libraries and startup files when linking. ++Only the files you specify (plus ++.BR gnulib ) ++will be passed to the linker. ++.TP ++.BI \-m machinespec ++Machine-dependent option specifying something about the type of target machine. ++These options are defined by the macro ++.B TARGET_SWITCHES ++in the machine description. ++The default for the options is also defined by that macro, ++which enables you to change the defaults. ++.sp ++These are the ++.B \-m ++options defined in the 68000 machine description: ++.sp ++.B \-m68020 ++.br ++.B \-mc68020 ++.in +.5i ++Generate output for a 68020 (rather than a 68000). ++This is the default if you use the unmodified sources. ++.in -.5i ++.sp ++.B \-m68000 ++.br ++.B \-mc68000 ++.in +.5i ++Generate output for a 68000 (rather than a 68020). ++.in -.5i ++.sp ++.B \-m68881 ++.in +.5i ++Generate output containing 68881 instructions for floating point. ++This is the default if you use the unmodified sources. ++.in -.5i ++.sp ++.B \-mfpa ++.in +.5i ++Generate output containing Sun FPA instructions for floating point. ++.in -.5i ++.sp ++.B \-msoft-float ++.in +.5i ++Generate output containing library calls for floating point. ++.in -.5i ++.sp ++.B \-mshort ++.in +.5i ++Consider type ++.B int ++to be 16 bits wide, like ++.BR "short int" . ++.in -.5i ++.sp ++.B \-mnobitfield ++.in +.5i ++Do not use the bit-field instructions. ++.B \-m68000 ++implies ++.BR \-mnobitfield . ++.in -.5i ++.sp ++.B \-mbitfield ++.in +.5i ++Do use the bit-field instructions. ++.B \-m68020 ++implies ++.BR \-mbitfield . ++This is the default if you use the unmodified sources. ++.in -.5i ++.sp ++.B \-mrtd ++.in +.5i ++Use a different function-calling convention, in which functions ++that take a fixed number of arguments return with the ++.B rtd ++instruction, which pops their arguments while returning. ++This saves one instruction in the caller since there is no need to pop ++the arguments there. ++.sp ++This calling convention is incompatible with the one normally ++used on Unix, so you cannot use it if you need to call libraries ++compiled with the Unix compiler. ++.sp ++Also, you must provide function prototypes for all functions that ++take variable numbers of arguments (including ++.BR printf (3S)); ++otherwise incorrect code will be generated for calls to those functions. ++.sp ++In addition, seriously incorrect code will result if you call a ++function with too many arguments. ++(Normally, extra arguments are harmlessly ignored.) ++.sp ++The ++.B rtd ++instruction is supported by the 68010 and 68020 processors, ++but not by the 68000. ++.in -.5i ++.sp ++These ++.B \-m ++options are defined in the Vax machine description: ++.sp ++.B \-munix ++.in +.5i ++Do not output certain jump instructions ++.RB ( aobleq ++and so on) that the Unix assembler for the Vax ++cannot handle across long ranges. ++.in -.5i ++.sp ++.B \-mgnu ++.in +.5i ++Do output those jump instructions, on the assumption that you ++will assemble with the GNU assembler. ++.in -.5i ++.sp ++.B \-mg ++.in +.5i ++Output code for g-format floating point numbers instead of d-format. ++.in -.5i ++.sp ++These ++.B \-m ++switches are supported on the Sparc: ++.sp ++.B \-mfpu ++.in +.5i ++Generate output containing floating point instructions. ++This is the default if you use the unmodified sources. ++.in -.5i ++.sp ++.B \-msoft-float ++.in +.5i ++Generate output containing library calls for floating point. ++.in -.5i ++.sp ++.B \-mno-epilogue ++.in +.5i ++Generate separate return instructions for ++.B return ++statements. ++This has both advantages and disadvantages; I don't recall what they are. ++.in -.5i ++.sp ++These ++.B \-m ++options are defined in the Convex machine description: ++.sp ++.B \-mc1 ++.in +.5i ++Generate output for a C1. ++This is the default when the compiler is configured for a C1. ++.in -.5i ++.sp ++.B \-mc2 ++.in +.5i ++Generate output for a C2. ++This is the default when the compiler is configured for a C2. ++.in -.5i ++.sp ++.B \-margcount ++.in +.5i ++Generate code which puts an argument count in the word preceding each ++argument list. ++Some nonportable Convex and Vax programs need this word. ++(Debuggers don't; this info is in the symbol table.) ++.in -.5i ++.sp ++.B \-mnoargcount ++.in +.5i ++Omit the argument count word. ++This is the default if you use the unmodified sources. ++.in -.5i ++.TP ++.BI \-f flag ++Specify machine-independent flags. ++Most flags have both positive and negative forms; the negative form of ++.B \-ffoo ++would be ++.BR \-fno-foo . ++In the table below, only one of the forms is listed--the one which ++is not the default. ++You can figure out the other form by either removing ++.B no- ++or adding it. ++.TP ++.B \-fpcc-struct-return ++Use the same convention for returning ++.B struct ++and ++.B union ++values that is used by the usual C compiler on your system. ++This convention is less efficient for small structures, and on many ++machines it fails to be reentrant; but it has the advantage of allowing ++intercallability between GCC-compiled code and PCC-compiled code. ++.TP ++.B \-ffloat-store ++Do not store floating-point variables in registers. ++This prevents undesirable excess precision on machines such as the ++68000 where the floating registers (of the 68881) keep more ++precision than a ++.B double ++is supposed to have. ++.sp ++For most programs, the excess precision does only good, but a few ++programs rely on the precise definition of IEEE floating point. ++Use ++.B \-ffloat-store ++for such programs. ++.TP ++.B \-fno-asm ++Do not recognize ++.BR asm , ++.B inline ++or ++.B typeof ++as a keyword. ++These words may then be used as identifiers. ++You can use ++.BR __asm__ , ++.B __inline__ ++and ++.B __typeof__ ++instead. ++.TP ++.B \-fno-defer-pop ++Always pop the arguments to each function call as soon as that ++function returns. ++Normally the compiler (when optimizing) lets arguments accumulate ++on the stack for several function calls and pops them all at once. ++.TP ++.B \-fstrength-reduce ++Perform the optimizations of loop strength reduction and ++elimination of iteration variables. ++.TP ++.B \-fcombine-regs ++Allow the combine pass to combine an instruction that copies one ++register into another. ++This might or might not produce better code when used in addition to ++.BR \-O . ++I am interested in hearing about the difference this makes. ++.TP ++.B \-fforce-mem ++Force memory operands to be copied into registers before doing ++arithmetic on them. ++This may produce better code by making all memory references ++potential common subexpressions. ++When they are not common subexpressions, instruction combination should ++eliminate the separate register-load. ++I am interested in hearing about the difference this makes. ++.TP ++.B \-fforce-addr ++Force memory address constants to be copied into registers before ++doing arithmetic on them. ++This may produce better code just as ++.B \-fforce-mem ++may. ++I am interested in hearing about the difference this makes. ++.TP ++.B \-fomit-frame-pointer ++Don't keep the frame pointer in a register for functions that ++don't need one. ++This avoids the instructions to save, set up and restore frame pointers; ++it also makes an extra register available in many functions. ++.B "It also makes debugging impossible." ++.sp ++On some machines, such as the Vax, this flag has no effect, because ++the standard calling sequence automatically handles the frame pointer ++and nothing is saved by pretending it doesn't exist. ++The machine-description macro ++.B FRAME_POINTER_REQUIRED ++controls whether a target machine supports this flag. ++.TP ++.B \-finline-functions ++Integrate all simple functions into their callers. ++The compiler heuristically decides which functions are simple ++enough to be worth integrating in this way. ++.sp ++If all calls to a given function are integrated, and the function is declared ++.BR static , ++then the function is normally not output as assembler code in its own right. ++.TP ++.B \-fcaller-saves ++Enable values to be allocated in registers that will be clobbered by ++function calls, by emitting extra instructions to save and restore the ++registers around such calls. ++Such allocation is done only when it seems to result in better code than ++would otherwise be produced. ++.sp ++This option is enabled by default on certain machines, usually those ++which have no call-preserved registers to use instead. ++.TP ++.B \-fkeep-inline-functions ++Even if all calls to a given function are integrated, and the function is ++declared ++.BR static , ++nevertheless output a separate run-time callable version of the function. ++.TP ++.B \-fwritable-strings ++Store string constants in the writable data segment and don't uniquize them. ++This is for compatibility with old programs which assume they can write ++into string constants. ++Writing into string constants is a very bad idea; ++constants should be constant. ++.TP ++.B \-fcond-mismatch ++Allow conditional expressions with mismatched types in the second and ++third arguments. ++The value of such an expression is void. ++.TP ++.B \-fno-function-cse ++Do not put function addresses in registers; make each instruction that ++calls a constant function contain the function's address explicitly. ++.sp ++This option results in less efficient code, but some strange hacks that ++alter the assembler output may be confused by the optimizations performed ++when this option is not used. ++.TP ++.B \-fvolatile ++Consider all memory references through pointers to be volatile. ++.TP ++.B \-fshared-data ++Requests that the data and ++.RB non- const ++variables of this compilation be shared data rather than private data. ++The distinction makes sense only on certain operating systems, where ++shared data is shared between processes running the same program, while ++private data exists in one copy per process. ++.TP ++.B \-funsigned-char ++Let the type ++.B char ++be the unsigned, like ++.BR "unsigned char" . ++.sp ++Each kind of machine has a default for what ++.B char ++should be. ++It is either like ++.B "unsigned char" ++by default or like ++.B "signed char" ++by default. ++(Actually, at present, the default is always signed.) ++.sp ++The type ++.B char ++is always a distinct type from either ++.B "signed char" ++or ++.BR "unsigned char" , ++even though its behavior is always just like one of those two. ++.sp ++Note that this is equivalent to ++.BR \-fno-signed-char , ++which is the negative form of ++.BR \-fsigned-char . ++.TP ++.B \-fsigned-char ++Let the type ++.B char ++be signed, like ++.BR "signed char" . ++.sp ++Note that this is equivalent to ++.BR \-fno-unsigned-char , ++which is the negative form of ++.BR \-funsigned-char . ++.TP ++.B \-fdelayed-branch ++If supported for the target machine, attempt to reorder instructions to ++exploit instruction slots available after delayed branch instructions. ++.TP ++.BI \-ffixed- reg ++Treat the register named ++.I reg ++as a fixed register; generated code should never refer to it ++(except perhaps as a stack pointer, frame pointer or in some other fixed role). ++.sp ++.I reg ++must be the name of a register. ++The register names accepted are machine-specific and are defined in the ++.B REGISTER_NAMES ++macro in the machine description macro file. ++.sp ++This flag does not have a negative form, because it specifies a ++three-way choice. ++.TP ++.BI \-fcall-used- reg ++Treat the register named ++.I reg ++as an allocatable register that is clobbered by function calls. ++It may be allocated for temporaries or variables that do not live ++across a call. ++Functions compiled this way will not save and restore the register REG. ++.sp ++Use of this flag for a register that has a fixed pervasive role ++in the machine's execution model, such as the stack pointer or ++frame pointer, will produce disastrous results. ++.sp ++This flag does not have a negative form, because it specifies a ++three-way choice. ++.TP ++.BI \-fcall-saved- reg ++Treat the register named ++.I reg ++as an allocatable register saved by functions. ++It may be allocated even for temporaries or variables that live across a call. ++Functions compiled this way will save and restore the register ++.I reg ++if they use it. ++.sp ++Use of this flag for a register that has a fixed pervasive role ++in the machine's execution model, such as the stack pointer or ++frame pointer, will produce disastrous results. ++.sp ++A different sort of disaster will result from the use of this ++flag for a register in which function values may be returned. ++.sp ++This flag does not have a negative form, because it specifies a ++three-way choice. ++.TP ++.BI \-d letters ++Says to make debugging dumps at times specified by ++.IR letters . ++Here are the possible letters: ++.sp ++.B r ++.in +.5i ++Dump after RTL generation. ++.in -.5i ++.B j ++.in +.5i ++Dump after first jump optimization. ++.in -.5i ++.B J ++.in +.5i ++Dump after last jump optimization. ++.in -.5i ++.B s ++.in +.5i ++Dump after CSE (including the jump optimization that sometimes follows CSE). ++.in -.5i ++.B L ++.in +.5i ++Dump after loop optimization. ++.in -.5i ++.B f ++.in +.5i ++Dump after flow analysis. ++.in -.5i ++.B c ++.in +.5i ++Dump after instruction combination. ++.in -.5i ++.B l ++.in +.5i ++Dump after local register allocation. ++.in -.5i ++.B g ++.in +.5i ++Dump after global register allocation. ++.in -.5i ++.B d ++.in +.5i ++Dump after delayed branch scheduling. ++.in -.5i ++.B m ++.in +.5i ++Print statistics on memory usage, at the end of the run. ++.in -.5i ++.TP ++.B \-pedantic ++Issue all the warnings demanded by strict ANSI standard C; reject ++all programs that use forbidden extensions. ++.sp ++Valid ANSI standard C programs should compile properly with or without ++this option (though a rare few will require ++.BR \-ansi ). ++However, without this option, certain GNU extensions and traditional C ++features are supported as well. ++With this option, they are rejected. ++There is no reason to use this option; it exists only to satisfy pedants. ++.sp ++.B \-pedantic ++does not cause warning messages for use of the alternate keywords whose ++names begin and end with ++.BR __ . ++.TP ++.B \-static ++On Suns running version 4, this prevents linking with the shared ++libraries. ++.RB ( \-g ++has the same effect.) ++.P ++These options control the C preprocessor, which is run on each C source ++file before actual compilation. If you use the `-E' option, nothing ++is done except C preprocessing. Some of these options make sense only ++together with `-E' because they request preprocessor output that is ++not suitable for actual compilation. ++.TP ++.B \-C ++Tell the preprocessor not to discard comments. ++Used with the ++.B \-E ++option. ++.TP ++.BI \-I dir ++Search directory ++.I dir ++for include files. ++.TP ++.B \-I- ++Any directories specified with ++.B \-I ++options before the ++.B \-I- ++option are searched only for the case of ++.B #include ++\fB"\fIfile\fB"\fR; they are not searched for ++.BR "#include <\fIfile\fB>" . ++.sp ++If additional directories are specified with ++.B \-I ++options after the ++.BR \-I- , ++these directories are searched for all ++.B #include ++directives. ++(Ordinarily ++.I all ++.B \-I ++directories are used this way.) ++.sp ++In addition, the ++.B \-I- ++option inhibits the use of the current directory as the first ++search directory for ++.B #include ++\fB"\fIfile\fB"\fR. ++Therefore, the current directory is searched only if it is requested ++explicitly with ++.BR \-I. . ++Specifying both ++.B \-I- ++and ++.B -I. ++allows you to control precisely which directories are searched before ++the current one and which are searched after. ++.TP ++.B \-nostdinc ++Do not search the standard system directories for header files. ++Only the directories you have specified with ++.B \-I ++options (and the current directory, if appropriate) are searched. ++.sp ++Between ++.B \-nostdinc ++and ++.BR \-I- , ++you can eliminate all directories from the search path ++except those you specify. ++.TP ++.B \-M ++Tell the preprocessor to output a rule suitable for ++.BI make (1) ++describing the dependencies of each source file. ++For each source file, the preprocessor outputs one ++.BR make -rule ++whose target is the object file name for that source file and whose ++dependencies are all the files ++.BR #include d ++in it. ++This rule may be a single line or may be continued with ++.B \\\\-newline ++if it is long. ++.sp ++.B \-M ++implies ++.BR \-E . ++.TP ++.B \-MM ++Like ++.B \-M ++but the output mentions only the user-header files included with ++.B #include ++\fB"\fIfile\fB"\fR. ++System header files included with ++.B "#include <\fIfile\fB>" ++are omitted. ++.sp ++.B \-MM ++implies ++.BR \-E . ++.TP ++.BI \-D macro ++Define macro ++.I macro ++with the empty string as its definition. ++.TP ++.BI \-D macro\fR=\fIdefn ++Define macro ++.I macro ++as ++.IR defn . ++.TP ++.BI \-U macro ++Undefine macro ++.IR macro . ++.TP ++.B \-trigraphs ++Support ANSI C trigraphs. ++You don't want to know about this brain-damage. ++The ++.B \-ansi ++option also has this effect. ++.SH FILES ++.ta \w'LIBDIR/gcc-include 'u ++file.c C source file ++.br ++file.s assembly language file ++.br ++file.o object file ++.br ++a.out link edited output ++.br ++/tmp/cc\(** temporary files ++.br ++\fILIBDIR\fR/gcc-cpp preprocessor ++.br ++\fILIBDIR\fR/gcc-cc1 compiler ++.br ++\fILIBDIR\fR/gcc-gnulib library needed by GCC on some machines ++.br ++/lib/crt[01n].o start-up routine ++.br ++/lib/libc.a standard C library, see ++.IR intro (3) ++.br ++/usr/include standard directory for ++.B #include ++files ++.br ++\fILIBDIR\fR/gcc-include standard gcc directory for ++.B #include ++files ++.sp ++.I LIBDIR ++is usually ++.BR /usr/local/lib . ++.SH "SEE ALSO" ++as(1), ld(1), adb(1), dbx(1), sdb(1). ++.SH BUGS ++Bugs should be reported to ++.BR bug-gcc@prep.ai.mit.edu . ++Bugs tend actually to be fixed if they can be isolated, so it is in your ++interest to report them in such a way that they can be easily reproduced. ++.SH COPYING ++Copyright (c) 1988 Free Software Foundation, Inc. ++.P ++Permission is granted to make and distribute verbatim copies of ++this manual provided the copyright notice and this permission notice ++are preserved on all copies. ++.P ++Permission is granted to copy and distribute modified versions of this ++manual under the conditions for verbatim copying, provided that the ++entire resulting derived work is distributed under the terms of a ++permission notice identical to this one. ++.P ++Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that this permission notice may be included in ++translations approved by the Free Software Foundation instead of in ++the original English. ++.SH AUTHORS ++See the GNU CC Manual for the contributors to GNU CC. +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.aux alliance/genview/src/gcc-1.42/gcc.aux +--- alliance-5.0/genview/src/gcc-1.42/gcc.aux 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.aux 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,192 @@ ++'xrdef {Copying-pg}{1} ++'xrdef {Copying-snt}{} ++'xrdef {Copying-pg}{1} ++'xrdef {Copying-snt}{} ++'xrdef {Copying-pg}{2} ++'xrdef {Copying-snt}{} ++'xrdef {Copying-pg}{5} ++'xrdef {Copying-snt}{} ++'xrdef {Contributors-pg}{7} ++'xrdef {Contributors-snt}{} ++'xrdef {Boycott-pg}{9} ++'xrdef {Boycott-snt}{chapter'tie1} ++'xrdef {Options-pg}{13} ++'xrdef {Options-snt}{chapter'tie2} ++'xrdef {Installation-pg}{27} ++'xrdef {Installation-snt}{chapter'tie3} ++'xrdef {Other Dir-pg}{35} ++'xrdef {Other Dir-snt}{section'tie3.1} ++'xrdef {Sun Install-pg}{35} ++'xrdef {Sun Install-snt}{section'tie3.2} ++'xrdef {3b1 Install-pg}{36} ++'xrdef {3b1 Install-snt}{section'tie3.3} ++'xrdef {SCO Install-pg}{37} ++'xrdef {SCO Install-snt}{section'tie3.4} ++'xrdef {VMS Install-pg}{37} ++'xrdef {VMS Install-snt}{section'tie3.5} ++'xrdef {HPUX Install-pg}{40} ++'xrdef {HPUX Install-snt}{section'tie3.6} ++'xrdef {Tower Install-pg}{41} ++'xrdef {Tower Install-snt}{section'tie3.7} ++'xrdef {Trouble-pg}{43} ++'xrdef {Trouble-snt}{chapter'tie4} ++'xrdef {Service-pg}{45} ++'xrdef {Service-snt}{chapter'tie5} ++'xrdef {Incompatibilities-pg}{47} ++'xrdef {Incompatibilities-snt}{chapter'tie6} ++'xrdef {Extensions-pg}{51} ++'xrdef {Extensions-snt}{chapter'tie7} ++'xrdef {Statement Exprs-pg}{51} ++'xrdef {Statement Exprs-snt}{section'tie7.1} ++'xrdef {Naming Types-pg}{52} ++'xrdef {Naming Types-snt}{section'tie7.2} ++'xrdef {Typeof-pg}{52} ++'xrdef {Typeof-snt}{section'tie7.3} ++'xrdef {Lvalues-pg}{53} ++'xrdef {Lvalues-snt}{section'tie7.4} ++'xrdef {Conditionals-pg}{55} ++'xrdef {Conditionals-snt}{section'tie7.5} ++'xrdef {Zero-Length-pg}{55} ++'xrdef {Zero-Length-snt}{section'tie7.6} ++'xrdef {Variable-Length-pg}{56} ++'xrdef {Variable-Length-snt}{section'tie7.7} ++'xrdef {Subscripting-pg}{57} ++'xrdef {Subscripting-snt}{section'tie7.8} ++'xrdef {Pointer Arith-pg}{57} ++'xrdef {Pointer Arith-snt}{section'tie7.9} ++'xrdef {Initializers-pg}{57} ++'xrdef {Initializers-snt}{section'tie7.10} ++'xrdef {Constructors-pg}{58} ++'xrdef {Constructors-snt}{section'tie7.11} ++'xrdef {Function Attributes-pg}{58} ++'xrdef {Function Attributes-snt}{section'tie7.12} ++'xrdef {Dollar Signs-pg}{59} ++'xrdef {Dollar Signs-snt}{section'tie7.13} ++'xrdef {Alignment-pg}{60} ++'xrdef {Alignment-snt}{section'tie7.14} ++'xrdef {Inline-pg}{60} ++'xrdef {Inline-snt}{section'tie7.15} ++'xrdef {Extended Asm-pg}{62} ++'xrdef {Extended Asm-snt}{section'tie7.16} ++'xrdef {Asm Labels-pg}{65} ++'xrdef {Asm Labels-snt}{section'tie7.17} ++'xrdef {Explicit Reg Vars-pg}{66} ++'xrdef {Explicit Reg Vars-snt}{section'tie7.18} ++'xrdef {Global Reg Vars-pg}{66} ++'xrdef {Global Reg Vars-snt}{section'tie7.18.1} ++'xrdef {Local Reg Vars-pg}{68} ++'xrdef {Local Reg Vars-snt}{section'tie7.18.2} ++'xrdef {Alternate Keywords-pg}{69} ++'xrdef {Alternate Keywords-snt}{section'tie7.19} ++'xrdef {Bugs-pg}{71} ++'xrdef {Bugs-snt}{chapter'tie8} ++'xrdef {Bug Criteria-pg}{71} ++'xrdef {Bug Criteria-snt}{section'tie8.1} ++'xrdef {Bug Reporting-pg}{72} ++'xrdef {Bug Reporting-snt}{section'tie8.2} ++'xrdef {Portability-pg}{77} ++'xrdef {Portability-snt}{chapter'tie9} ++'xrdef {Interface-pg}{79} ++'xrdef {Interface-snt}{chapter'tie10} ++'xrdef {Passes-pg}{81} ++'xrdef {Passes-snt}{chapter'tie11} ++'xrdef {RTL-pg}{87} ++'xrdef {RTL-snt}{chapter'tie12} ++'xrdef {RTL Objects-pg}{87} ++'xrdef {RTL Objects-snt}{section'tie12.1} ++'xrdef {Accessors-pg}{88} ++'xrdef {Accessors-snt}{section'tie12.2} ++'xrdef {Flags-pg}{90} ++'xrdef {Flags-snt}{section'tie12.3} ++'xrdef {Machine Modes-pg}{92} ++'xrdef {Machine Modes-snt}{section'tie12.4} ++'xrdef {Constants-pg}{94} ++'xrdef {Constants-snt}{section'tie12.5} ++'xrdef {Regs and Memory-pg}{96} ++'xrdef {Regs and Memory-snt}{section'tie12.6} ++'xrdef {Arithmetic-pg}{98} ++'xrdef {Arithmetic-snt}{section'tie12.7} ++'xrdef {Comparisons-pg}{100} ++'xrdef {Comparisons-snt}{section'tie12.8} ++'xrdef {Bit Fields-pg}{102} ++'xrdef {Bit Fields-snt}{section'tie12.9} ++'xrdef {Conversions-pg}{102} ++'xrdef {Conversions-snt}{section'tie12.10} ++'xrdef {RTL Declarations-pg}{103} ++'xrdef {RTL Declarations-snt}{section'tie12.11} ++'xrdef {Side Effects-pg}{104} ++'xrdef {Side Effects-snt}{section'tie12.12} ++'xrdef {Incdec-pg}{107} ++'xrdef {Incdec-snt}{section'tie12.13} ++'xrdef {Assembler-pg}{108} ++'xrdef {Assembler-snt}{section'tie12.14} ++'xrdef {Insns-pg}{109} ++'xrdef {Insns-snt}{section'tie12.15} ++'xrdef {Calls-pg}{113} ++'xrdef {Calls-snt}{section'tie12.16} ++'xrdef {Sharing-pg}{114} ++'xrdef {Sharing-snt}{section'tie12.17} ++'xrdef {Machine Desc-pg}{117} ++'xrdef {Machine Desc-snt}{chapter'tie13} ++'xrdef {Patterns-pg}{117} ++'xrdef {Patterns-snt}{section'tie13.1} ++'xrdef {Example-pg}{118} ++'xrdef {Example-snt}{section'tie13.2} ++'xrdef {RTL Template-pg}{119} ++'xrdef {RTL Template-snt}{section'tie13.3} ++'xrdef {Output Template-pg}{122} ++'xrdef {Output Template-snt}{section'tie13.4} ++'xrdef {Output Statement-pg}{123} ++'xrdef {Output Statement-snt}{section'tie13.5} ++'xrdef {Constraints-pg}{124} ++'xrdef {Constraints-snt}{section'tie13.6} ++'xrdef {Simple Constraints-pg}{124} ++'xrdef {Simple Constraints-snt}{section'tie13.6.1} ++'xrdef {Multi-Alternative-pg}{128} ++'xrdef {Multi-Alternative-snt}{section'tie13.6.2} ++'xrdef {Class Preferences-pg}{129} ++'xrdef {Class Preferences-snt}{section'tie13.6.3} ++'xrdef {Modifiers-pg}{130} ++'xrdef {Modifiers-snt}{section'tie13.6.4} ++'xrdef {No Constraints-pg}{131} ++'xrdef {No Constraints-snt}{section'tie13.6.5} ++'xrdef {Standard Names-pg}{131} ++'xrdef {Standard Names-snt}{section'tie13.7} ++'xrdef {Pattern Ordering-pg}{137} ++'xrdef {Pattern Ordering-snt}{section'tie13.8} ++'xrdef {Dependent Patterns-pg}{137} ++'xrdef {Dependent Patterns-snt}{section'tie13.9} ++'xrdef {Jump Patterns-pg}{140} ++'xrdef {Jump Patterns-snt}{section'tie13.10} ++'xrdef {Peephole Definitions-pg}{141} ++'xrdef {Peephole Definitions-snt}{section'tie13.11} ++'xrdef {Expander Definitions-pg}{144} ++'xrdef {Expander Definitions-snt}{section'tie13.12} ++'xrdef {Machine Macros-pg}{149} ++'xrdef {Machine Macros-snt}{chapter'tie14} ++'xrdef {Run-time Target-pg}{149} ++'xrdef {Run-time Target-snt}{section'tie14.1} ++'xrdef {Storage Layout-pg}{150} ++'xrdef {Storage Layout-snt}{section'tie14.2} ++'xrdef {Registers-pg}{152} ++'xrdef {Registers-snt}{section'tie14.3} ++'xrdef {Register Classes-pg}{157} ++'xrdef {Register Classes-snt}{section'tie14.4} ++'xrdef {Stack Layout-pg}{161} ++'xrdef {Stack Layout-snt}{section'tie14.5} ++'xrdef {Library Calls-pg}{169} ++'xrdef {Library Calls-snt}{section'tie14.6} ++'xrdef {Addressing Modes-pg}{170} ++'xrdef {Addressing Modes-snt}{section'tie14.7} ++'xrdef {Delayed Branch-pg}{172} ++'xrdef {Delayed Branch-snt}{section'tie14.8} ++'xrdef {Condition Code-pg}{173} ++'xrdef {Condition Code-snt}{section'tie14.9} ++'xrdef {Cross-compilation-pg}{174} ++'xrdef {Cross-compilation-snt}{section'tie14.10} ++'xrdef {Misc-pg}{176} ++'xrdef {Misc-snt}{section'tie14.11} ++'xrdef {Assembler Format-pg}{179} ++'xrdef {Assembler Format-snt}{section'tie14.12} ++'xrdef {Config-pg}{191} ++'xrdef {Config-snt}{chapter'tie15} +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.c alliance/genview/src/gcc-1.42/gcc.c +--- alliance-5.0/genview/src/gcc-1.42/gcc.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,2165 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Compiler driver program that can handle many languages. ++ Copyright (C) 1987,1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++This paragraph is here to try to keep Sun CC from dying. ++The number of chars here seems crucial!!!! */ ++ ++void record_temp_file (); ++ ++/* This program is the user interface to the C compiler and possibly to ++other compilers. It is used because compilation is a complicated procedure ++which involves running several programs and passing temporary files between ++them, forwarding the users switches to those programs selectively, ++and deleting the temporary files at the end. ++ ++CC recognizes how to compile each input file by suffixes in the file names. ++Once it knows which kind of compilation to perform, the procedure for ++compilation is specified by a string called a "spec". ++ ++Specs are strings containing lines, each of which (if not blank) ++is made up of a program name, and arguments separated by spaces. ++The program name must be exact and start from root, since no path ++is searched and it is unreliable to depend on the current working directory. ++Redirection of input or output is not supported; the subprograms must ++accept filenames saying what files to read and write. ++ ++In addition, the specs can contain %-sequences to substitute variable text ++or for conditional text. Here is a table of all defined %-sequences. ++Note that spaces are not generated automatically around the results of ++expanding these sequences; therefore, you can concatenate them together ++or with constant text in a single argument. ++ ++ %% substitute one % into the program name or argument. ++ %i substitute the name of the input file being processed. ++ %b substitute the basename of the input file being processed. ++ This is the substring up to (and not including) the last period. ++ %g substitute the temporary-file-name-base. This is a string chosen ++ once per compilation. Different temporary file names are made by ++ concatenation of constant strings on the end, as in `%g.s'. ++ %g also has the same effect of %d. ++ %d marks the argument containing or following the %d as a ++ temporary file name, so that that file will be deleted if CC exits ++ successfully. Unlike %g, this contributes no text to the argument. ++ %w marks the argument containing or following the %w as the ++ "output file" of this compilation. This puts the argument ++ into the sequence of arguments that %o will substitute later. ++ %W{...} ++ like %{...} but mark last argument supplied within ++ as a file to be deleted on failure. ++ %o substitutes the names of all the output files, with spaces ++ automatically placed around them. You should write spaces ++ around the %o as well or the results are undefined. ++ %o is for use in the specs for running the linker. ++ Input files whose names have no recognized suffix are not compiled ++ at all, but they are included among the output files, so they will ++ be linked. ++ %p substitutes the standard macro predefinitions for the ++ current target machine. Use this when running cpp. ++ %P like %p, but puts `__' before and after the name of each macro. ++ This is for ANSI C. ++ %s current argument is the name of a library or startup file of some sort. ++ Search for that file in a standard list of directories ++ and substitute the full pathname found. ++ %eSTR Print STR as an error message. STR is terminated by a newline. ++ Use this when inconsistent options are detected. ++ %a process ASM_SPEC as a spec. ++ This allows config.h to specify part of the spec for running as. ++ %l process LINK_SPEC as a spec. ++ %L process LIB_SPEC as a spec. ++ %G process LIBG_SPEC as a spec. A capital G is actually used here. ++ %S process STARTFILE_SPEC as a spec. A capital S is actually used here. ++ %E process ENDFILE_SPEC as a spec. A capital E is actually used here. ++ %c process SIGNED_CHAR_SPEC as a spec. ++ %C process CPP_SPEC as a spec. A capital C is actually used here. ++ %1 process CC1_SPEC as a spec. ++ %{S} substitutes the -S switch, if that switch was given to CC. ++ If that switch was not specified, this substitutes nothing. ++ Here S is a metasyntactic variable. ++ %{S*} substitutes all the switches specified to CC whose names start ++ with -S. This is used for -o, -D, -I, etc; switches that take ++ arguments. CC considers `-o foo' as being one switch whose ++ name starts with `o'. %{o*} would substitute this text, ++ including the space; thus, two arguments would be generated. ++ %{S:X} substitutes X, but only if the -S switch was given to CC. ++ %{!S:X} substitutes X, but only if the -S switch was NOT given to CC. ++ %{|S:X} like %{S:X}, but if no S switch, substitute `-'. ++ %{|!S:X} like %{!S:X}, but if there is an S switch, substitute `-'. ++ ++The conditional text X in a %{S:X} or %{!S:X} construct may contain ++other nested % constructs or spaces, or even newlines. ++They are processed as usual, as described above. ++ ++The character | is used to indicate that a command should be piped to ++the following command, but only if -pipe is specified. ++ ++Note that it is built into CC which switches take arguments and which ++do not. You might think it would be useful to generalize this to ++allow each compiler's spec to say which switches take arguments. But ++this cannot be done in a consistent fashion. CC cannot even decide ++which input files have been specified without knowing which switches ++take arguments, and it must know which input files to compile in order ++to tell which compilers to run. ++ ++CC also knows implicitly that arguments starting in `-l' are to ++be treated as compiler output files, and passed to the linker in their proper ++position among the other output files. ++ ++*/ ++ ++#include ++#include ++#include ++#include ++#include ++ ++ ++#include ++#include ++ ++#ifdef SunOS ++ ++extern char *sys_errlist[]; ++extern int errno, sys_nerr; ++ ++static char * ++strerror(nerr) ++ int nerr; ++{ ++ if (nerr < sys_nerr) ++ return sys_errlist[nerr]; ++ else ++ return "unknown error"; ++} ++ ++#endif ++ ++#include "config.h" ++#include "obstack.h" ++#include "gvarargs.h" ++ ++#ifdef USG ++#ifndef R_OK ++#define R_OK 4 ++#define W_OK 2 ++#define X_OK 1 ++#endif ++ ++#define vfork fork ++#endif /* USG */ ++ ++/* Test if something is a normal file. */ ++#ifndef S_ISREG ++#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) ++#endif ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++/* If a stage of compilation returns an exit status >= 1, ++ compilation of that file ceases. */ ++ ++#define MIN_FATAL_STATUS 1 ++ ++/* This is the obstack which we use to allocate many strings. */ ++ ++struct obstack obstack; ++ ++char *handle_braces (); ++char *save_string (); ++char *concat (); ++int do_spec (); ++int do_spec_1 (); ++char *find_file (); ++static char *find_exec_file (); ++void validate_switches (); ++void validate_all_switches (); ++void fancy_abort (); ++ ++/* config.h can define ASM_SPEC to provide extra args to the assembler ++ or extra switch-translations. */ ++#ifndef ASM_SPEC ++#define ASM_SPEC "" ++#endif ++ ++/* config.h can define CPP_SPEC to provide extra args to the C preprocessor ++ or extra switch-translations. */ ++#ifndef CPP_SPEC ++#define CPP_SPEC "" ++#endif ++ ++/* config.h can define CC1_SPEC to provide extra args to cc1 ++ or extra switch-translations. */ ++#ifndef CC1_SPEC ++#define CC1_SPEC "" ++#endif ++ ++/* config.h can define LINK_SPEC to provide extra args to the linker ++ or extra switch-translations. */ ++#ifndef LINK_SPEC ++#define LINK_SPEC "" ++#endif ++ ++/* config.h can define LIB_SPEC to override the default libraries. */ ++#ifndef LIB_SPEC ++#define LIB_SPEC "%{!p:%{!pg:-lc}}%{p:-lc_p}%{pg:-lc_p}" ++#endif ++ ++/* config.h can define ENDFILE_SPEC to override the default crtn files. */ ++#ifndef ENDFILE_SPEC ++#define ENDFILE_SPEC "" ++#endif ++ ++/* config.h can define LIBG_SPEC to override the default debug libraries. */ ++#ifndef LIBG_SPEC ++#define LIBG_SPEC "%{g:-lg}" ++#endif ++ ++/* config.h can define STARTFILE_SPEC to override the default crt0 files. */ ++#ifndef STARTFILE_SPEC ++#define STARTFILE_SPEC \ ++ "%{pg:gcrt0.o%s}%{!pg:%{p:mcrt0.o%s}%{!p:crt0.o%s}}" ++#endif ++ ++/* This spec is used for telling cpp whether char is signed or not. */ ++#define SIGNED_CHAR_SPEC \ ++ (DEFAULT_SIGNED_CHAR ? "%{funsigned-char:-D__CHAR_UNSIGNED__}" \ ++ : "%{!fsigned-char:-D__CHAR_UNSIGNED__}") ++ ++/* This defines which switch letters take arguments. */ ++ ++#ifndef SWITCH_TAKES_ARG ++#define SWITCH_TAKES_ARG(CHAR) \ ++ ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \ ++ || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \ ++ || (CHAR) == 'I' || (CHAR) == 'Y' || (CHAR) == 'm' \ ++ || (CHAR) == 'L' || (CHAR) == 'i' || (CHAR) == 'A') ++#endif ++ ++/* This defines which multi-letter switches take arguments. */ ++ ++#ifndef WORD_SWITCH_TAKES_ARG ++#define WORD_SWITCH_TAKES_ARG(STR) (!strcmp (STR, "Tdata")) ++#endif ++ ++/* This structure says how to run one compiler, and when to do so. */ ++ ++struct compiler ++{ ++ char *suffix; /* Use this compiler for input files ++ whose names end in this suffix. */ ++ char *spec; /* To use this compiler, pass this spec ++ to do_spec. */ ++}; ++ ++/* Here are the specs for compiling files with various known suffixes. ++ A file that does not end in any of these suffixes will be passed ++ unchanged to the loader and nothing else will be done to it. */ ++ ++struct compiler compilers[] = ++{ ++ {".c", ++ "cpp %{nostdinc} %{C} %{v} %{D*} %{U*} %{I*} %{M*} %{i*} %{trigraphs} -undef \ ++ -D__GNUC__ %{ansi:-trigraphs -$ -D__STRICT_ANSI__} %{!ansi:%p} %P\ ++ %c %{O:-D__OPTIMIZE__} %{traditional} %{pedantic} %{P}\ ++ %{Wcomment*} %{Wtrigraphs} %{Wall} %{w} %C\ ++ %i %{!M*:%{!E:%{!pipe:%g.cpp}}}%{E:%W{o*}}%{M*:%W{o*}} |\n\ ++ %{!M*:%{!E:genview_cc1 %{!pipe:%g.cpp} %1 \ ++ %{!Q:-quiet} -dumpbase %i %{Y*} %{d*} %{m*} %{f*} %{a}\ ++ %{g} %{O*} %{W*} %{w} %{pedantic} %{ansi} %{traditional}\ ++ %{v:-version} %{gg:-symout %g.sym} %{pg:-p} %{p}\ ++ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ ++ %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\ ++ %{!S:as %{R} %{j} %{J} %{h} %{d2} %a %{gg:-G %g.sym}\ ++ %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o}\ ++ %{!pipe:%g.s}\n }}}"}, ++ {".cc", ++ "cpp -+ %{nostdinc} %{C} %{v} %{D*} %{U*} %{I*} %{M*} %{i*} \ ++ -undef -D__GNUC__ -D__GNUG__ %p %P\ ++ %c %{O:-D__OPTIMIZE__} %{traditional} %{pedantic} %{P}\ ++ %{Wcomment*} %{Wtrigraphs} %{Wall} %{w} %C\ ++ %i %{!M*:%{!E:%{!pipe:%g.cpp}}}%{E:%W{o*}}%{M*:%W{o*}} |\n\ ++ %{!M*:%{!E:cc1plus %{!pipe:%g.cpp} %1\ ++ %{!Q:-quiet} -dumpbase %i %{Y*} %{d*} %{m*} %{f*} %{a}\ ++ %{g} %{O*} %{W*} %{w} %{pedantic} %{traditional}\ ++ %{v:-version} %{gg:-symout %g.sym} %{pg:-p} %{p}\ ++ %{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\ ++ %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\ ++ %{!S:as %{R} %{j} %{J} %{h} %{d2} %a %{gg:-G %g.sym}\ ++ %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o}\ ++ %{!pipe:%g.s}\n }}}"}, ++ {".i", ++ "genview_cc1 %i %1 %{!Q:-quiet} %{Y*} %{d*} %{m*} %{f*} %{a}\ ++ %{g} %{O*} %{W*} %{w} %{pedantic} %{ansi} %{traditional}\ ++ %{v:-version} %{gg:-symout %g.sym} %{pg:-p} %{p}\ ++ %{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%g.s}} |\n\ ++ %{!S:as %{R} %{j} %{J} %{h} %{d2} %a %{gg:-G %g.sym}\ ++ %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o} %{!pipe:%g.s}\n }"}, ++ {".s", ++ "%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \ ++ %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o} %i\n }"}, ++ {".S", ++ "cpp %{nostdinc} %{C} %{v} %{D*} %{U*} %{I*} %{M*} %{trigraphs} \ ++ -undef -D__GNUC__ -$ %p %P\ ++ %c %{O:-D__OPTIMIZE__} %{traditional} %{pedantic} %{P}\ ++ %{Wcomment*} %{Wtrigraphs} %{Wall} %{w} %C\ ++ %i %{!M*:%{!E:%{!pipe:%g.s}}}%{E:%W{o*}}%{M*:%W{o*}} |\n\ ++ %{!M*:%{!E:%{!S:as %{R} %{j} %{J} %{h} %{d2} %a \ ++ %{c:%W{o*}%{!o*:-o %w%b.o}}%{!c:-o %d%w%b.o}\ ++ %{!pipe:%g.s}\n }}}"}, ++ /* Mark end of table */ ++ {0, 0} ++}; ++ ++/* Here is the spec for running the linker, after compiling all files. */ ++char *link_spec = "%{!c:%{!M*:%{!E:%{!S:ld %{o*} %l\ ++ %{A} %{d} %{e*} %{N} %{n} %{r} %{s} %{S} %{T*} %{t} %{u*} %{X} %{x} %{z}\ ++ %{y*} %{!A:%{!nostdlib:%S}} \ ++ %{L*} %o %{!nostdlib:%G gnulib%s %L gnulib%s %{!A:%E}}\n }}}}"; ++ ++/* Accumulate a command (program name and args), and run it. */ ++ ++/* Vector of pointers to arguments in the current line of specifications. */ ++ ++char **argbuf; ++ ++/* Number of elements allocated in argbuf. */ ++ ++int argbuf_length; ++ ++/* Number of elements in argbuf currently in use (containing args). */ ++ ++int argbuf_index; ++ ++/* Number of commands executed so far. */ ++ ++int execution_count; ++ ++/* Flag indicating whether we should print the command and arguments */ ++ ++unsigned char vflag; ++ ++/* Name with which this program was invoked. */ ++ ++char *programname; ++ ++/* User-specified -B prefix to attach to command names, ++ or 0 if none specified. */ ++ ++char *user_exec_prefix = 0; ++ ++/* Environment-specified prefix to attach to command names, ++ or 0 if none specified. */ ++ ++char *env_exec_prefix = 0; ++ ++/* Suffix to attach to directories searched for commands. */ ++ ++char *machine_suffix = 0; ++ ++/* Default prefixes to attach to command names. */ ++ ++#ifndef STANDARD_EXEC_PREFIX ++#define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-" ++#endif /* !defined STANDARD_EXEC_PREFIX */ ++ ++char *standard_exec_prefix = STANDARD_EXEC_PREFIX; ++char *standard_exec_prefix_1 = "/usr/lib/gcc-"; ++ ++#ifndef STANDARD_STARTFILE_PREFIX ++#define STANDARD_STARTFILE_PREFIX "/usr/local/lib/" ++#endif /* !defined STANDARD_STARTFILE_PREFIX */ ++ ++char *standard_startfile_prefix = STANDARD_STARTFILE_PREFIX; ++char *standard_startfile_prefix_1 = "/lib/"; ++char *standard_startfile_prefix_2 = "/usr/lib/"; ++ ++/* Clear out the vector of arguments (after a command is executed). */ ++ ++void ++clear_args () ++{ ++ argbuf_index = 0; ++} ++ ++/* Add one argument to the vector at the end. ++ This is done when a space is seen or at the end of the line. ++ If DELETE_ALWAYS is nonzero, the arg is a filename ++ and the file should be deleted eventually. ++ If DELETE_FAILURE is nonzero, the arg is a filename ++ and the file should be deleted if this compilation fails. */ ++ ++void ++store_arg (arg, delete_always, delete_failure) ++ char *arg; ++ int delete_always, delete_failure; ++{ ++ if (argbuf_index + 1 == argbuf_length) ++ argbuf = (char **) xrealloc (argbuf, (argbuf_length *= 2) * sizeof (char *)); ++ ++ argbuf[argbuf_index++] = arg; ++ argbuf[argbuf_index] = 0; ++ ++ if (delete_always || delete_failure) ++ record_temp_file (arg, delete_always, delete_failure); ++} ++ ++/* Record the names of temporary files we tell compilers to write, ++ and delete them at the end of the run. */ ++ ++/* This is the common prefix we use to make temp file names. ++ It is chosen once for each run of this program. ++ It is substituted into a spec by %g. ++ Thus, all temp file names contain this prefix. ++ In practice, all temp file names start with this prefix. ++ ++ This prefix comes from the envvar TMPDIR if it is defined; ++ otherwise, from the P_tmpdir macro if that is defined; ++ otherwise, in /usr/tmp or /tmp. */ ++ ++char *temp_filename; ++ ++/* Length of the prefix. */ ++ ++int temp_filename_length; ++ ++/* Define the list of temporary files to delete. */ ++ ++struct temp_file ++{ ++ char *name; ++ struct temp_file *next; ++}; ++ ++/* Queue of files to delete on success or failure of compilation. */ ++struct temp_file *always_delete_queue; ++/* Queue of files to delete on failure of compilation. */ ++struct temp_file *failure_delete_queue; ++ ++/* Record FILENAME as a file to be deleted automatically. ++ ALWAYS_DELETE nonzero means delete it if all compilation succeeds; ++ otherwise delete it in any case. ++ FAIL_DELETE nonzero means delete it if a compilation step fails; ++ otherwise delete it in any case. */ ++ ++void ++record_temp_file (filename, always_delete, fail_delete) ++ char *filename; ++ int always_delete; ++ int fail_delete; ++{ ++ register char *name; ++ name = (char *) xmalloc (strlen (filename) + 1); ++ strcpy (name, filename); ++ ++ if (always_delete) ++ { ++ register struct temp_file *temp; ++ for (temp = always_delete_queue; temp; temp = temp->next) ++ if (! strcmp (name, temp->name)) ++ goto already1; ++ temp = (struct temp_file *) xmalloc (sizeof (struct temp_file)); ++ temp->next = always_delete_queue; ++ temp->name = name; ++ always_delete_queue = temp; ++ already1:; ++ } ++ ++ if (fail_delete) ++ { ++ register struct temp_file *temp; ++ for (temp = failure_delete_queue; temp; temp = temp->next) ++ if (! strcmp (name, temp->name)) ++ goto already2; ++ temp = (struct temp_file *) xmalloc (sizeof (struct temp_file)); ++ temp->next = failure_delete_queue; ++ temp->name = name; ++ failure_delete_queue = temp; ++ already2:; ++ } ++} ++ ++/* Delete all the temporary files whose names we previously recorded. */ ++ ++void ++delete_temp_files () ++{ ++ register struct temp_file *temp; ++ ++ for (temp = always_delete_queue; temp; temp = temp->next) ++ { ++#ifdef DEBUG ++ int i; ++ printf ("Delete %s? (y or n) ", temp->name); ++ fflush (stdout); ++ i = getchar (); ++ if (i != '\n') ++ while (getchar () != '\n') ; ++ if (i == 'y' || i == 'Y') ++#endif /* DEBUG */ ++ { ++ struct stat st; ++ if (stat (temp->name, &st) >= 0) ++ { ++ /* Delete only ordinary files. */ ++ if (S_ISREG (st.st_mode)) ++ if (unlink (temp->name) < 0) ++ if (vflag) ++ perror_with_name (temp->name); ++ } ++ } ++ } ++ ++ always_delete_queue = 0; ++} ++ ++/* Delete all the files to be deleted on error. */ ++ ++void ++delete_failure_queue () ++{ ++ register struct temp_file *temp; ++ ++ for (temp = failure_delete_queue; temp; temp = temp->next) ++ { ++#ifdef DEBUG ++ int i; ++ printf ("Delete %s? (y or n) ", temp->name); ++ fflush (stdout); ++ i = getchar (); ++ if (i != '\n') ++ while (getchar () != '\n') ; ++ if (i == 'y' || i == 'Y') ++#endif /* DEBUG */ ++ { ++ if (unlink (temp->name) < 0) ++ if (vflag) ++ perror_with_name (temp->name); ++ } ++ } ++} ++ ++void ++clear_failure_queue () ++{ ++ failure_delete_queue = 0; ++} ++ ++/* Compute a string to use as the base of all temporary file names. ++ It is substituted for %g. */ ++ ++void ++choose_temp_base () ++{ ++ extern char *getenv (); ++ char *base = getenv ("TMPDIR"); ++ int len; ++ ++ if (base == (char *)0) ++ { ++#ifdef P_tmpdir ++ if (access (P_tmpdir, R_OK | W_OK) == 0) ++ base = P_tmpdir; ++#endif ++ if (base == (char *)0) ++ { ++ if (access ("/usr/tmp", R_OK | W_OK) == 0) ++ base = "/usr/tmp/"; ++ else ++ base = "/tmp/"; ++ } ++ } ++ ++ len = strlen (base); ++ temp_filename = (char *) xmalloc (len + sizeof("/ccXXXXXX")); ++ strcpy (temp_filename, base); ++ if (len > 0 && temp_filename[len-1] != '/') ++ temp_filename[len++] = '/'; ++ strcpy (temp_filename + len, "ccXXXXXX"); ++ ++ mktemp (temp_filename); ++ temp_filename_length = strlen (temp_filename); ++} ++ ++/* Search for an execute file through our search path. ++ Return 0 if not found, otherwise return its name, allocated with malloc. */ ++ ++static char * ++find_exec_file (prog) ++ char *prog; ++{ ++ int win = 0; ++ char *temp; ++ int size; ++ ++ size = strlen (standard_exec_prefix); ++ if (user_exec_prefix != 0 && strlen (user_exec_prefix) > size) ++ size = strlen (user_exec_prefix); ++ if (env_exec_prefix != 0 && strlen (env_exec_prefix) > size) ++ size = strlen (env_exec_prefix); ++ if (strlen (standard_exec_prefix_1) > size) ++ size = strlen (standard_exec_prefix_1); ++ size += strlen (prog) + 1; ++ if (machine_suffix) ++ size += strlen (machine_suffix) + 1; ++ temp = (char *) xmalloc (size); ++ ++ /* Determine the filename to execute. */ ++ ++ if (user_exec_prefix) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, user_exec_prefix); ++ strcat (temp, machine_suffix); ++ strcat (temp, prog); ++ win = (access (temp, X_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, user_exec_prefix); ++ strcat (temp, prog); ++ win = (access (temp, X_OK) == 0); ++ } ++ } ++ ++ if (!win && env_exec_prefix) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, env_exec_prefix); ++ strcat (temp, machine_suffix); ++ strcat (temp, prog); ++ win = (access (temp, X_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, env_exec_prefix); ++ strcat (temp, prog); ++ win = (access (temp, X_OK) == 0); ++ } ++ } ++ ++ if (!win) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, standard_exec_prefix); ++ strcat (temp, machine_suffix); ++ strcat (temp, prog); ++ win = (access (temp, X_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, standard_exec_prefix); ++ strcat (temp, prog); ++ win = (access (temp, X_OK) == 0); ++ } ++ } ++ ++ if (!win) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, standard_exec_prefix_1); ++ strcat (temp, machine_suffix); ++ strcat (temp, prog); ++ win = (access (temp, X_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, standard_exec_prefix_1); ++ strcat (temp, prog); ++ win = (access (temp, X_OK) == 0); ++ } ++ } ++ ++ if (win) ++ return temp; ++ else ++ return 0; ++} ++ ++/* stdin file number. */ ++#define STDIN_FILE_NO 0 ++ ++/* stdout file number. */ ++#define STDOUT_FILE_NO 1 ++ ++/* value of `pipe': port index for reading. */ ++#define READ_PORT 0 ++ ++/* value of `pipe': port index for writing. */ ++#define WRITE_PORT 1 ++ ++/* Pipe waiting from last process, to be used as input for the next one. ++ Value is STDIN_FILE_NO if no pipe is waiting ++ (i.e. the next command is the first of a group). */ ++ ++int last_pipe_input; ++ ++/* Fork one piped subcommand. FUNC is the system call to use ++ (either execv or execvp). ARGV is the arg vector to use. ++ NOT_LAST is nonzero if this is not the last subcommand ++ (i.e. its output should be piped to the next one.) */ ++ ++static int ++pexecute (func, program, argv, not_last) ++ char *program; ++ int (*func)(); ++ char *argv[]; ++ int not_last; ++{ ++ int pid; ++ int pdes[2]; ++ int input_desc = last_pipe_input; ++ int output_desc = STDOUT_FILE_NO; ++ ++ /* If this isn't the last process, make a pipe for its output, ++ and record it as waiting to be the input to the next process. */ ++ ++ if (not_last) ++ { ++ if (pipe (pdes) < 0) ++ pfatal_with_name ("pipe"); ++ output_desc = pdes[WRITE_PORT]; ++ last_pipe_input = pdes[READ_PORT]; ++ } ++ else ++ last_pipe_input = STDIN_FILE_NO; ++ ++ pid = vfork (); ++ ++ switch (pid) ++ { ++ case -1: ++ pfatal_with_name ("vfork"); ++ break; ++ ++ case 0: /* child */ ++ /* Move the input and output pipes into place, if nec. */ ++ if (input_desc != STDIN_FILE_NO) ++ { ++ close (STDIN_FILE_NO); ++ dup (input_desc); ++ close (input_desc); ++ } ++ if (output_desc != STDOUT_FILE_NO) ++ { ++ close (STDOUT_FILE_NO); ++ dup (output_desc); ++ close (output_desc); ++ } ++ ++ /* Close the parent's descs that aren't wanted here. */ ++ if (last_pipe_input != STDIN_FILE_NO) ++ close (last_pipe_input); ++ ++ /* Exec the program. */ ++ (*func) (program, argv); ++ perror_exec (program); ++ exit (-1); ++ /* NOTREACHED */ ++ ++ default: ++ /* In the parent, after forking. ++ Close the descriptors that we made for this child. */ ++ if (input_desc != STDIN_FILE_NO) ++ close (input_desc); ++ if (output_desc != STDOUT_FILE_NO) ++ close (output_desc); ++ ++ /* Return child's process number. */ ++ return pid; ++ } ++} ++ ++/* Execute the command specified by the arguments on the current line of spec. ++ When using pipes, this includes several piped-together commands ++ with `|' between them. ++ ++ Return 0 if successful, -1 if failed. */ ++ ++int ++execute () ++{ ++ int i, j; ++ int n_commands; /* # of command. */ ++ char *string; ++ struct command ++ { ++ char *prog; /* program name. */ ++ char **argv; /* vector of args. */ ++ int pid; /* pid of process for this command. */ ++ }; ++ ++ struct command *commands; /* each command buffer with above info. */ ++ ++ /* Count # of piped commands. */ ++ for (n_commands = 1, i = 0; i < argbuf_index; i++) ++ if (strcmp (argbuf[i], "|") == 0) ++ n_commands++; ++ ++ /* Get storage for each command. */ ++ commands ++ = (struct command *) alloca (n_commands * sizeof (struct command)); ++ ++ /* Split argbuf into its separate piped processes, ++ and record info about each one. ++ Also search for the programs that are to be run. */ ++ ++ commands[0].prog = argbuf[0]; /* first command. */ ++ commands[0].argv = &argbuf[0]; ++ string = find_exec_file (commands[0].prog); ++ if (string) ++ commands[0].argv[0] = string; ++ ++ for (n_commands = 1, i = 0; i < argbuf_index; i++) ++ if (strcmp (argbuf[i], "|") == 0) ++ { /* each command. */ ++ argbuf[i] = 0; /* termination of command args. */ ++ commands[n_commands].prog = argbuf[i + 1]; ++ commands[n_commands].argv = &argbuf[i + 1]; ++ string = find_exec_file (commands[n_commands].prog); ++ if (string) ++ commands[n_commands].argv[0] = string; ++ n_commands++; ++ } ++ ++ argbuf[argbuf_index] = 0; ++ ++ /* If -v, print what we are about to do, and maybe query. */ ++ ++ if (vflag) ++ { ++ /* Print each piped command as a separate line. */ ++ for (i = 0; i < n_commands ; i++) ++ { ++ char **j; ++ ++ for (j = commands[i].argv; *j; j++) ++ fprintf (stderr, " %s", *j); ++ ++ /* Print a pipe symbol after all but the last command. */ ++ if (i + 1 != n_commands) ++ fprintf (stderr, " |"); ++ fprintf (stderr, "\n"); ++ } ++ fflush (stderr); ++#ifdef DEBUG ++ fprintf (stderr, "\nGo ahead? (y or n) "); ++ fflush (stderr); ++ j = getchar (); ++ if (j != '\n') ++ while (getchar () != '\n') ; ++ if (j != 'y' && j != 'Y') ++ return 0; ++#endif /* DEBUG */ ++ } ++ ++ /* Run each piped subprocess. */ ++ ++ last_pipe_input = STDIN_FILE_NO; ++ for (i = 0; i < n_commands; i++) ++ { ++ extern int execv(), execvp(); ++ char *string = commands[i].argv[0]; ++ ++ commands[i].pid = pexecute ((string != commands[i].prog ? execv : execvp), ++ string, commands[i].argv, ++ i + 1 < n_commands); ++ ++ if (string != commands[i].prog) ++ free (string); ++ } ++ ++ execution_count++; ++ ++ /* Wait for all the subprocesses to finish. ++ We don't care what order they finish in; ++ we know that N_COMMANDS waits will get them all. */ ++ ++ { ++ int ret_code = 0; ++ ++ for (i = 0; i < n_commands; i++) ++ { ++ int status; ++ int pid; ++ char *prog; ++ ++ pid = wait (&status); ++ if (pid < 0) ++ abort (); ++ ++ if (status != 0) ++ { ++ int j; ++ for (j = 0; j < n_commands; j++) ++ if (commands[j].pid == pid) ++ prog = commands[j].prog; ++ ++ if ((status & 0x7F) != 0) ++ fatal ("Program %s got fatal signal %d.", prog, (status & 0x7F)); ++ if (((status & 0xFF00) >> 8) >= MIN_FATAL_STATUS) ++ ret_code = -1; ++ } ++ } ++ return ret_code; ++ } ++} ++ ++/* Find all the switches given to us ++ and make a vector describing them. ++ The elements of the vector a strings, one per switch given. ++ If a switch uses the following argument, then the `part1' field ++ is the switch itself and the `part2' field is the following argument. ++ The `valid' field is nonzero if any spec has looked at this switch; ++ if it remains zero at the end of the run, it must be meaningless. */ ++ ++struct switchstr ++{ ++ char *part1; ++ char *part2; ++ int valid; ++}; ++ ++struct switchstr *switches; ++ ++int n_switches; ++ ++/* Also a vector of input files specified. */ ++ ++char **infiles; ++ ++int n_infiles; ++ ++/* And a vector of corresponding output files is made up later. */ ++ ++char **outfiles; ++ ++/* Create the vector `switches' and its contents. ++ Store its length in `n_switches'. */ ++ ++void ++process_command (argc, argv) ++ int argc; ++ char **argv; ++{ ++ extern char *getenv (); ++ register int i; ++ n_switches = 0; ++ n_infiles = 0; ++ ++ env_exec_prefix = getenv ("GCC_EXEC_PREFIX"); ++ ++ /* Scan argv twice. Here, the first time, just count how many switches ++ there will be in their vector, and how many input files in theirs. ++ Here we also parse the switches that cc itself uses (e.g. -v). */ ++ ++ for (i = 1; i < argc; i++) ++ { ++ if (argv[i][0] == '-' && argv[i][1] != 'l') ++ { ++ register char *p = &argv[i][1]; ++ register int c = *p; ++ ++ switch (c) ++ { ++ case 'b': ++ machine_suffix = p + 1; ++ break; ++ ++ case 'B': ++ user_exec_prefix = p + 1; ++ break; ++ ++ case 'v': /* Print our subcommands and print versions. */ ++ vflag++; ++ n_switches++; ++ break; ++ ++ default: ++ n_switches++; ++ ++ if (SWITCH_TAKES_ARG (c) && p[1] == 0) ++ i++; ++ else if (WORD_SWITCH_TAKES_ARG (p)) ++ i++; ++ } ++ } ++ else ++ n_infiles++; ++ } ++ ++ /* Then create the space for the vectors and scan again. */ ++ ++ switches = ((struct switchstr *) ++ xmalloc ((n_switches + 1) * sizeof (struct switchstr))); ++ infiles = (char **) xmalloc ((n_infiles + 1) * sizeof (char *)); ++ n_switches = 0; ++ n_infiles = 0; ++ ++ /* This, time, copy the text of each switch and store a pointer ++ to the copy in the vector of switches. ++ Store all the infiles in their vector. */ ++ ++ for (i = 1; i < argc; i++) ++ { ++ if (argv[i][0] == '-' && argv[i][1] != 'l') ++ { ++ register char *p = &argv[i][1]; ++ register int c = *p; ++ ++ if (c == 'B' || c == 'b') ++ continue; ++ switches[n_switches].part1 = p; ++ if ((SWITCH_TAKES_ARG (c) && p[1] == 0) ++ || WORD_SWITCH_TAKES_ARG (p)) ++ switches[n_switches].part2 = argv[++i]; ++ else if (c == 'o') { ++ /* On some systems, ld cannot handle -o without space. ++ So split the -o and its argument. */ ++ switches[n_switches].part2 = (char *) xmalloc (strlen (p)); ++ strcpy (switches[n_switches].part2, &p[1]); ++ p[1] = 0; ++ } else ++ switches[n_switches].part2 = 0; ++ switches[n_switches].valid = 0; ++ n_switches++; ++ } ++ else ++ infiles[n_infiles++] = argv[i]; ++ } ++ ++ switches[n_switches].part1 = 0; ++ infiles[n_infiles] = 0; ++} ++ ++/* Process a spec string, accumulating and running commands. */ ++ ++/* These variables describe the input file name. ++ input_file_number is the index on outfiles of this file, ++ so that the output file name can be stored for later use by %o. ++ input_basename is the start of the part of the input file ++ sans all directory names, and basename_length is the number ++ of characters starting there excluding the suffix .c or whatever. */ ++ ++char *input_filename; ++int input_file_number; ++int input_filename_length; ++int basename_length; ++char *input_basename; ++ ++/* These are variables used within do_spec and do_spec_1. */ ++ ++/* Nonzero if an arg has been started and not yet terminated ++ (with space, tab or newline). */ ++int arg_going; ++ ++/* Nonzero means %d or %g has been seen; the next arg to be terminated ++ is a temporary file name. */ ++int delete_this_arg; ++ ++/* Nonzero means %w has been seen; the next arg to be terminated ++ is the output file name of this compilation. */ ++int this_is_output_file; ++ ++/* Nonzero means %s has been seen; the next arg to be terminated ++ is the name of a library file and we should try the standard ++ search dirs for it. */ ++int this_is_library_file; ++ ++/* Process the spec SPEC and run the commands specified therein. ++ Returns 0 if the spec is successfully processed; -1 if failed. */ ++ ++int ++do_spec (spec) ++ char *spec; ++{ ++ int value; ++ ++ clear_args (); ++ arg_going = 0; ++ delete_this_arg = 0; ++ this_is_output_file = 0; ++ this_is_library_file = 0; ++ ++ value = do_spec_1 (spec, 0); ++ ++ /* Force out any unfinished command. ++ If -pipe, this forces out the last command if it ended in `|'. */ ++ if (value == 0) ++ { ++ if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|")) ++ argbuf_index--; ++ ++ if (argbuf_index > 0) ++ value = execute (); ++ } ++ ++ return value; ++} ++ ++/* Process the sub-spec SPEC as a portion of a larger spec. ++ This is like processing a whole spec except that we do ++ not initialize at the beginning and we do not supply a ++ newline by default at the end. ++ INSWITCH nonzero means don't process %-sequences in SPEC; ++ in this case, % is treated as an ordinary character. ++ This is used while substituting switches. ++ INSWITCH nonzero also causes SPC not to terminate an argument. ++ ++ Value is zero unless a line was finished ++ and the command on that line reported an error. */ ++ ++int ++do_spec_1 (spec, inswitch) ++ char *spec; ++ int inswitch; ++{ ++ register char *p = spec; ++ register int c; ++ char *string; ++ ++ while (c = *p++) ++ /* If substituting a switch, treat all chars like letters. ++ Otherwise, NL, SPC, TAB and % are special. */ ++ switch (inswitch ? 'a' : c) ++ { ++ case '\n': ++ /* End of line: finish any pending argument, ++ then run the pending command if one has been started. */ ++ if (arg_going) ++ { ++ obstack_1grow (&obstack, 0); ++ string = obstack_finish (&obstack); ++ if (this_is_library_file) ++ string = find_file (string); ++ store_arg (string, delete_this_arg, this_is_output_file); ++ if (this_is_output_file) ++ outfiles[input_file_number] = string; ++ } ++ arg_going = 0; ++ ++ if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|")) ++ { ++ int i; ++ for (i = 0; i < n_switches; i++) ++ if (!strcmp (switches[i].part1, "pipe")) ++ break; ++ ++ /* A `|' before the newline means use a pipe here, ++ but only if -pipe was specified. ++ Otherwise, execute now and don't pass the `|' as an arg. */ ++ if (i < n_switches) ++ { ++ switches[i].valid = 1; ++ break; ++ } ++ else ++ argbuf_index--; ++ } ++ ++ if (argbuf_index > 0) ++ { ++ int value = execute (); ++ if (value) ++ return value; ++ } ++ /* Reinitialize for a new command, and for a new argument. */ ++ clear_args (); ++ arg_going = 0; ++ delete_this_arg = 0; ++ this_is_output_file = 0; ++ this_is_library_file = 0; ++ break; ++ ++ case '|': ++ /* End any pending argument. */ ++ if (arg_going) ++ { ++ obstack_1grow (&obstack, 0); ++ string = obstack_finish (&obstack); ++ if (this_is_library_file) ++ string = find_file (string); ++ store_arg (string, delete_this_arg, this_is_output_file); ++ if (this_is_output_file) ++ outfiles[input_file_number] = string; ++ } ++ ++ /* Use pipe */ ++ obstack_1grow (&obstack, c); ++ arg_going = 1; ++ break; ++ ++ case '\t': ++ case ' ': ++ /* Space or tab ends an argument if one is pending. */ ++ if (arg_going) ++ { ++ obstack_1grow (&obstack, 0); ++ string = obstack_finish (&obstack); ++ if (this_is_library_file) ++ string = find_file (string); ++ store_arg (string, delete_this_arg, this_is_output_file); ++ if (this_is_output_file) ++ outfiles[input_file_number] = string; ++ } ++ /* Reinitialize for a new argument. */ ++ arg_going = 0; ++ delete_this_arg = 0; ++ this_is_output_file = 0; ++ this_is_library_file = 0; ++ break; ++ ++ case '%': ++ switch (c = *p++) ++ { ++ case 0: ++ fatal ("Invalid specification! Bug in cc."); ++ ++ case 'b': ++ obstack_grow (&obstack, input_basename, basename_length); ++ arg_going = 1; ++ break; ++ ++ case 'd': ++ delete_this_arg = 2; ++ break; ++ ++ case 'e': ++ /* {...:%efoo} means report an error with `foo' as error message ++ and don't execute any more commands for this file. */ ++ { ++ char *q = p; ++ char *buf; ++ while (*p != 0 && *p != '\n') p++; ++ buf = (char *) alloca (p - q + 1); ++ strncpy (buf, q, p - q); ++ buf[p - q] = 0; ++ error ("%s", buf); ++ return -1; ++ } ++ break; ++ ++ case 'g': ++ obstack_grow (&obstack, temp_filename, temp_filename_length); ++ delete_this_arg = 1; ++ arg_going = 1; ++ break; ++ ++ case 'i': ++ obstack_grow (&obstack, input_filename, input_filename_length); ++ arg_going = 1; ++ break; ++ ++ case 'o': ++ { ++ register int f; ++ for (f = 0; f < n_infiles; f++) ++ store_arg (outfiles[f], 0, 0); ++ } ++ break; ++ ++ case 's': ++ this_is_library_file = 1; ++ break; ++ ++ case 'W': ++ { ++ int index = argbuf_index; ++ /* Handle the {...} following the %W. */ ++ if (*p != '{') ++ abort (); ++ p = handle_braces (p + 1); ++ if (p == 0) ++ return -1; ++ /* If any args were output, mark the last one for deletion ++ on failure. */ ++ if (argbuf_index != index) ++ record_temp_file (argbuf[argbuf_index - 1], 0, 1); ++ break; ++ } ++ ++ case 'w': ++ this_is_output_file = 1; ++ break; ++ ++ case '{': ++ p = handle_braces (p); ++ if (p == 0) ++ return -1; ++ break; ++ ++ case '%': ++ obstack_1grow (&obstack, '%'); ++ break; ++ ++/*** The rest just process a certain constant string as a spec. */ ++ ++ case '1': ++ do_spec_1 (CC1_SPEC, 0); ++ break; ++ ++ case 'a': ++ do_spec_1 (ASM_SPEC, 0); ++ break; ++ ++ case 'c': ++ do_spec_1 (SIGNED_CHAR_SPEC, 0); ++ break; ++ ++ case 'C': ++ do_spec_1 (CPP_SPEC, 0); ++ break; ++ ++ case 'l': ++ do_spec_1 (LINK_SPEC, 0); ++ break; ++ ++ case 'L': ++ do_spec_1 (LIB_SPEC, 0); ++ break; ++ ++ case 'G': ++ do_spec_1 (LIBG_SPEC, 0); ++ break; ++ ++ case 'p': ++ do_spec_1 (CPP_PREDEFINES, 0); ++ break; ++ ++ case 'P': ++ { ++ char *x = (char *) alloca (strlen (CPP_PREDEFINES) * 2 + 1); ++ char *buf = x; ++ char *y = CPP_PREDEFINES; ++ ++ /* Copy all of CPP_PREDEFINES into BUF, ++ but put __ after every -D and at the end of each arg, */ ++ while (1) ++ { ++ if (! strncmp (y, "-D", 2)) ++ { ++ *x++ = '-'; ++ *x++ = 'D'; ++ *x++ = '_'; ++ *x++ = '_'; ++ y += 2; ++ } ++ else if (*y == ' ' || *y == 0) ++ { ++ *x++ = '_'; ++ *x++ = '_'; ++ if (*y == 0) ++ break; ++ else ++ *x++ = *y++; ++ } ++ else ++ *x++ = *y++; ++ } ++ *x = 0; ++ ++ do_spec_1 (buf, 0); ++ } ++ break; ++ ++ case 'S': ++ do_spec_1 (STARTFILE_SPEC, 0); ++ break; ++ ++ case 'E': ++ do_spec_1 (ENDFILE_SPEC, 0); ++ break; ++ ++ default: ++ abort (); ++ } ++ break; ++ ++ default: ++ /* Ordinary character: put it into the current argument. */ ++ obstack_1grow (&obstack, c); ++ arg_going = 1; ++ } ++ ++ return 0; /* End of string */ ++} ++ ++/* Return 0 if we call do_spec_1 and that returns -1. */ ++ ++char * ++handle_braces (p) ++ register char *p; ++{ ++ register char *q; ++ char *filter; ++ int pipe = 0; ++ int negate = 0; ++ ++ if (*p == '|') ++ /* A `|' after the open-brace means, ++ if the test fails, output a single minus sign rather than nothing. ++ This is used in %{|!pipe:...}. */ ++ pipe = 1, ++p; ++ ++ if (*p == '!') ++ /* A `!' after the open-brace negates the condition: ++ succeed if the specified switch is not present. */ ++ negate = 1, ++p; ++ ++ filter = p; ++ while (*p != ':' && *p != '}') p++; ++ if (*p != '}') ++ { ++ register int count = 1; ++ q = p + 1; ++ while (count > 0) ++ { ++ if (*q == '{') ++ count++; ++ else if (*q == '}') ++ count--; ++ else if (*q == 0) ++ abort (); ++ q++; ++ } ++ } ++ else ++ q = p + 1; ++ ++ if (p[-1] == '*' && p[0] == '}') ++ { ++ /* Substitute all matching switches as separate args. */ ++ register int i; ++ --p; ++ for (i = 0; i < n_switches; i++) ++ if (!strncmp (switches[i].part1, filter, p - filter)) ++ give_switch (i); ++ } ++ else ++ { ++ /* Test for presence of the specified switch. */ ++ register int i; ++ int present = 0; ++ ++ /* If name specified ends in *, as in {x*:...}, ++ check for presence of any switch name starting with x. */ ++ if (p[-1] == '*') ++ { ++ for (i = 0; i < n_switches; i++) ++ { ++ if (!strncmp (switches[i].part1, filter, p - filter - 1)) ++ { ++ switches[i].valid = 1; ++ present = 1; ++ } ++ } ++ } ++ /* Otherwise, check for presence of exact name specified. */ ++ else ++ { ++ for (i = 0; i < n_switches; i++) ++ { ++ if (!strncmp (switches[i].part1, filter, p - filter) ++ && switches[i].part1[p - filter] == 0) ++ { ++ switches[i].valid = 1; ++ present = 1; ++ break; ++ } ++ } ++ } ++ ++ /* If it is as desired (present for %{s...}, absent for %{-s...}) ++ then substitute either the switch or the specified ++ conditional text. */ ++ if (present != negate) ++ { ++ if (*p == '}') ++ { ++ give_switch (i); ++ } ++ else ++ { ++ if (do_spec_1 (save_string (p + 1, q - p - 2), 0) < 0) ++ return 0; ++ } ++ } ++ else if (pipe) ++ { ++ /* Here if a %{|...} conditional fails: output a minus sign, ++ which means "standard output" or "standard input". */ ++ do_spec_1 ("-", 0); ++ } ++ } ++ ++ return q; ++} ++ ++/* Pass a switch to the current accumulating command ++ in the same form that we received it. ++ SWITCHNUM identifies the switch; it is an index into ++ the vector of switches gcc received, which is `switches'. ++ This cannot fail since it never finishes a command line. */ ++ ++give_switch (switchnum) ++ int switchnum; ++{ ++ do_spec_1 ("-", 0); ++ do_spec_1 (switches[switchnum].part1, 1); ++ do_spec_1 (" ", 0); ++ if (switches[switchnum].part2 != 0) ++ { ++ do_spec_1 (switches[switchnum].part2, 1); ++ do_spec_1 (" ", 0); ++ } ++ switches[switchnum].valid = 1; ++} ++ ++/* Search for a file named NAME trying various prefixes including the ++ user's -B prefix and some standard ones. ++ Return the absolute pathname found. If nothing is found, return NAME. */ ++ ++char * ++find_file (name) ++ char *name; ++{ ++ int size; ++ char *temp; ++ int win = 0; ++ ++ /* Compute maximum size of NAME plus any prefix we will try. */ ++ ++ size = strlen (standard_exec_prefix); ++ if (user_exec_prefix != 0 && strlen (user_exec_prefix) > size) ++ size = strlen (user_exec_prefix); ++ if (env_exec_prefix != 0 && strlen (env_exec_prefix) > size) ++ size = strlen (env_exec_prefix); ++ if (strlen (standard_exec_prefix) > size) ++ size = strlen (standard_exec_prefix); ++ if (strlen (standard_exec_prefix_1) > size) ++ size = strlen (standard_exec_prefix_1); ++ if (strlen (standard_startfile_prefix) > size) ++ size = strlen (standard_startfile_prefix); ++ if (strlen (standard_startfile_prefix_1) > size) ++ size = strlen (standard_startfile_prefix_1); ++ if (strlen (standard_startfile_prefix_2) > size) ++ size = strlen (standard_startfile_prefix_2); ++ if (machine_suffix) ++ size += strlen (machine_suffix) + 1; ++ size += strlen (name) + 1; ++ ++ temp = (char *) alloca (size); ++ ++ if (user_exec_prefix) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, user_exec_prefix); ++ strcat (temp, machine_suffix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, user_exec_prefix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ } ++ ++ if (!win && env_exec_prefix) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, env_exec_prefix); ++ strcat (temp, machine_suffix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, env_exec_prefix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ } ++ ++ if (!win) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, standard_exec_prefix); ++ strcat (temp, machine_suffix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, standard_exec_prefix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ } ++ ++ if (!win) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, standard_exec_prefix_1); ++ strcat (temp, machine_suffix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, standard_exec_prefix_1); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ } ++ ++ if (!win) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, standard_startfile_prefix); ++ strcat (temp, machine_suffix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, standard_startfile_prefix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ } ++ ++ if (!win) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, standard_startfile_prefix_1); ++ strcat (temp, machine_suffix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, standard_startfile_prefix_1); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ } ++ ++ if (!win) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, standard_startfile_prefix_2); ++ strcat (temp, machine_suffix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, standard_startfile_prefix_2); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ } ++ ++ if (!win) ++ { ++ if (machine_suffix) ++ { ++ strcpy (temp, "./"); ++ strcat (temp, machine_suffix); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ if (!win) ++ { ++ strcpy (temp, "./"); ++ strcat (temp, name); ++ win = (access (temp, R_OK) == 0); ++ } ++ } ++ ++ if (win) ++ return save_string (temp, strlen (temp)); ++ return name; ++} ++ ++/* On fatal signals, delete all the temporary files. */ ++ ++void ++fatal_error (signum) ++ int signum; ++{ ++ signal (signum, SIG_DFL); ++ delete_failure_queue (); ++ delete_temp_files (); ++ /* Get the same signal again, this time not handled, ++ so its normal effect occurs. */ ++ kill (getpid (), signum); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ register int i; ++ int value; ++ int error_count = 0; ++ int linker_was_run = 0; ++ char *explicit_link_files; ++ ++ programname = argv[0]; ++ ++ if (signal (SIGINT, SIG_IGN) != SIG_IGN) ++ signal (SIGINT, fatal_error); ++ if (signal (SIGHUP, SIG_IGN) != SIG_IGN) ++ signal (SIGHUP, fatal_error); ++ if (signal (SIGTERM, SIG_IGN) != SIG_IGN) ++ signal (SIGTERM, fatal_error); ++ if (signal (SIGPIPE, SIG_IGN) != SIG_IGN) ++ signal (SIGPIPE, fatal_error); ++ ++ argbuf_length = 10; ++ argbuf = (char **) xmalloc (argbuf_length * sizeof (char *)); ++ ++ obstack_init (&obstack); ++ ++ choose_temp_base (); ++ ++ /* Make a table of what switches there are (switches, n_switches). ++ Make a table of specified input files (infiles, n_infiles). */ ++ ++ process_command (argc, argv); ++ ++ if (vflag) ++ { ++ extern char *version_string; ++ fprintf (stderr, "gcc version %s\n", version_string); ++ if (n_infiles == 0) ++ exit (0); ++ } ++ ++ if (n_infiles == 0) ++ fatal ("No input files specified."); ++ ++ /* Make a place to record the compiler output file names ++ that correspond to the input files. */ ++ ++ outfiles = (char **) xmalloc (n_infiles * sizeof (char *)); ++ bzero (outfiles, n_infiles * sizeof (char *)); ++ ++ /* Record which files were specified explicitly as link input. */ ++ ++ explicit_link_files = (char *) xmalloc (n_infiles); ++ bzero (explicit_link_files, n_infiles); ++ ++ for (i = 0; i < n_infiles; i++) ++ { ++ register struct compiler *cp; ++ int this_file_error = 0; ++ ++ /* Tell do_spec what to substitute for %i. */ ++ ++ input_filename = infiles[i]; ++ input_filename_length = strlen (input_filename); ++ input_file_number = i; ++ ++ /* Use the same thing in %o, unless cp->spec says otherwise. */ ++ ++ outfiles[i] = input_filename; ++ ++ /* Figure out which compiler from the file's suffix. */ ++ ++ for (cp = compilers; cp->spec; cp++) ++ { ++ if (strlen (cp->suffix) < input_filename_length ++ && !strcmp (cp->suffix, ++ infiles[i] + input_filename_length ++ - strlen (cp->suffix))) ++ { ++ /* Ok, we found an applicable compiler. Run its spec. */ ++ /* First say how much of input_filename to substitute for %b */ ++ register char *p; ++ ++ input_basename = input_filename; ++ for (p = input_filename; *p; p++) ++ if (*p == '/') ++ input_basename = p + 1; ++ basename_length = (input_filename_length - strlen (cp->suffix) ++ - (input_basename - input_filename)); ++ value = do_spec (cp->spec); ++ if (value < 0) ++ this_file_error = 1; ++ break; ++ } ++ } ++ ++ /* If this file's name does not contain a recognized suffix, ++ record it as explicit linker input. */ ++ ++ if (! cp->spec) ++ explicit_link_files[i] = 1; ++ ++ /* Clear the delete-on-failure queue, deleting the files in it ++ if this compilation failed. */ ++ ++ if (this_file_error) ++ { ++ delete_failure_queue (); ++ error_count++; ++ } ++ /* If this compilation succeeded, don't delete those files later. */ ++ clear_failure_queue (); ++ } ++ ++ /* Run ld to link all the compiler output files. */ ++ ++ if (error_count == 0) ++ { ++ int tmp = execution_count; ++ value = do_spec (link_spec); ++ if (value < 0) ++ error_count = 1; ++ linker_was_run = (tmp != execution_count); ++ } ++ ++ /* If options said don't run linker, ++ complain about input files to be given to the linker. */ ++ ++ if (! linker_was_run && error_count == 0) ++ for (i = 0; i < n_infiles; i++) ++ if (explicit_link_files[i]) ++ error ("%s: linker input file unused since linking not done", ++ outfiles[i]); ++ ++ /* Set the `valid' bits for switches that match anything in any spec. */ ++ ++ validate_all_switches (); ++ ++ /* Warn about any switches that no pass was interested in. */ ++ ++ for (i = 0; i < n_switches; i++) ++ if (! switches[i].valid) ++ error ("unrecognized option `-%s'", switches[i].part1); ++ ++ /* Delete some or all of the temporary files we made. */ ++ ++ if (error_count) ++ delete_failure_queue (); ++ delete_temp_files (); ++ ++ exit (error_count); ++} ++ ++xmalloc (size) ++ int size; ++{ ++ register int value = malloc (size); ++ if (value == 0) ++ fatal ("virtual memory exhausted"); ++ return value; ++} ++ ++xrealloc (ptr, size) ++ int ptr, size; ++{ ++ register int value = realloc (ptr, size); ++ if (value == 0) ++ fatal ("virtual memory exhausted"); ++ return value; ++} ++ ++/* Return a newly-allocated string whose contents concatenate those of s1, s2, s3. */ ++ ++char * ++concat (s1, s2, s3) ++ char *s1, *s2, *s3; ++{ ++ int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3); ++ char *result = (char *) xmalloc (len1 + len2 + len3 + 1); ++ ++ strcpy (result, s1); ++ strcpy (result + len1, s2); ++ strcpy (result + len1 + len2, s3); ++ *(result + len1 + len2 + len3) = 0; ++ ++ return result; ++} ++ ++char * ++save_string (s, len) ++ char *s; ++ int len; ++{ ++ register char *result = (char *) xmalloc (len + 1); ++ ++ bcopy (s, result, len); ++ result[len] = 0; ++ return result; ++} ++ ++pfatal_with_name (name) ++ char *name; ++{ ++ char *s; ++ ++ s = concat ("%s: ", strerror(errno), ""); ++ fatal (s, name); ++} ++ ++perror_with_name (name) ++ char *name; ++{ ++ char *s; ++ ++ s = concat ("%s: ", strerror(errno), ""); ++ error (s, name); ++} ++ ++perror_exec (name) ++ char *name; ++{ ++ char *s; ++ ++ s = concat ("installation problem, cannot exec %s: ", strerror(errno), ""); ++ error (s, name); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++#ifdef HAVE_VPRINTF ++ ++/* Output an error message and exit */ ++ ++int ++fatal (va_alist) ++ va_dcl ++{ ++ va_list ap; ++ char *format; ++ ++ va_start(ap); ++ format = va_arg (ap, char *); ++ fprintf (stderr, "%s: ", programname); ++ vfprintf (stderr, format, ap); ++ va_end (ap); ++ fprintf (stderr, "\n"); ++ delete_temp_files (); ++ exit (1); ++} ++ ++error (va_alist) ++ va_dcl ++{ ++ va_list ap; ++ char *format; ++ ++ va_start(ap); ++ format = va_arg (ap, char *); ++ fprintf (stderr, "%s: ", programname); ++ vfprintf (stderr, format, ap); ++ va_end (ap); ++ ++ fprintf (stderr, "\n"); ++} ++ ++#else /* not HAVE_VPRINTF */ ++ ++fatal (msg, arg1, arg2) ++ char *msg, *arg1, *arg2; ++{ ++ error (msg, arg1, arg2); ++ delete_temp_files (0); ++ exit (1); ++} ++ ++error (msg, arg1, arg2) ++ char *msg, *arg1, *arg2; ++{ ++ fprintf (stderr, "%s: ", programname); ++ fprintf (stderr, msg, arg1, arg2); ++ fprintf (stderr, "\n"); ++} ++ ++#endif /* not HAVE_VPRINTF */ ++ ++ ++void ++validate_all_switches () ++{ ++ struct compiler *comp; ++ register char *p; ++ register char c; ++ ++ for (comp = compilers; comp->spec; comp++) ++ { ++ p = comp->spec; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++ } ++ ++ p = link_spec; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++ ++ /* Now notice switches mentioned in the machine-specific specs. */ ++ ++#ifdef ASM_SPEC ++ p = ASM_SPEC; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++#endif ++ ++#ifdef CPP_SPEC ++ p = CPP_SPEC; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++#endif ++ ++#ifdef SIGNED_CHAR_SPEC ++ p = SIGNED_CHAR_SPEC; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++#endif ++ ++#ifdef CC1_SPEC ++ p = CC1_SPEC; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++#endif ++ ++#ifdef LINK_SPEC ++ p = LINK_SPEC; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++#endif ++ ++#ifdef LIB_SPEC ++ p = LIB_SPEC; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++#endif ++ ++#ifdef STARTFILE_SPEC ++ p = STARTFILE_SPEC; ++ while (c = *p++) ++ if (c == '%' && *p == '{') ++ /* We have a switch spec. */ ++ validate_switches (p + 1); ++#endif ++} ++ ++/* Look at the switch-name that comes after START ++ and mark as valid all supplied switches that match it. */ ++ ++void ++validate_switches (start) ++ char *start; ++{ ++ register char *p = start; ++ char *filter; ++ register int i; ++ ++ if (*p == '|') ++ ++p; ++ ++ if (*p == '!') ++ ++p; ++ ++ filter = p; ++ while (*p != ':' && *p != '}') p++; ++ ++ if (p[-1] == '*') ++ { ++ /* Mark all matching switches as valid. */ ++ --p; ++ for (i = 0; i < n_switches; i++) ++ if (!strncmp (switches[i].part1, filter, p - filter)) ++ switches[i].valid = 1; ++ } ++ else ++ { ++ /* Mark an exact matching switch as valid. */ ++ for (i = 0; i < n_switches; i++) ++ { ++ if (!strncmp (switches[i].part1, filter, p - filter) ++ && switches[i].part1[p - filter] == 0) ++ switches[i].valid = 1; ++ } ++ } ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.cp alliance/genview/src/gcc-1.42/gcc.cp +--- alliance-5.0/genview/src/gcc-1.42/gcc.cp 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.cp 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1 @@ ++\entry {Installation on SCO systems}{37}{Installation on SCO systems} +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.cps alliance/genview/src/gcc-1.42/gcc.cps +--- alliance-5.0/genview/src/gcc-1.42/gcc.cps 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.cps 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,2 @@ ++\initial {I} ++\entry {Installation on SCO systems}{37} +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.hlp alliance/genview/src/gcc-1.42/gcc.hlp +--- alliance-5.0/genview/src/gcc-1.42/gcc.hlp 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.hlp 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,153 @@ ++1 GCC ++ The GCC command invokes the GNU C compiler. ++ ++ GCC file-spec ++ ++2 Parameters ++ ++ file-spec ++ ++ A C source file. If no input file extension is specified, GNU C ++ assumes .C as the default extension. ++ ++2 Qualifiers ++ ++ GNU C command qualifiers modify the way the compiler handles the ++ compiliation. ++ ++ The following is the list of available qualifiers for GNU C: ++ ++ ++ /CC1_OPTIONS=(option [,option...]]) ++ ++ /DEBUG ++ ++ /DEFINE=(identifier[=definition][,...]) ++ ++ /INCLUDE_DIRECTORY=(path [,path...]]) ++ ++ /MACHINE_CODE ++ ++ /OPTIMIZE ++ ++ /UNDEFINE=(identifier[,identifier,...]) ++ ++ /VERBOSE ++ ++ ++2 Linking ++ ++ When linking programs compiled with GNU C, you should include the GNU ++ C library before the VAX C library. For example, ++ ++ LINK object-file,GNU_CC:[000000]GCCLIB/LIB,SYS$LIBRARY:VAXCRTL/LIB ++ ++ You can also link your program with the shared VAX C library. This ++ can reduce the size of the .EXE file, as well as make it smaller ++ when it's running. For example, ++ ++ $ LINK object-file, GNU_CC:[000000]GCCLIB/LIB,SYS$INPUT:/OPTIONS ++ SYS$SHARE:VAXCRTL/SHARE ++ ++ (If you use the second example and type it in by hand, be sure to type ++ ^Z after the last carriage return) ++ ++2 /DEBUG ++ ++ /DEBUG includes additional information in the object file output so ++ that the program can be debugged with the VAX Symbolic Debugger. ++ This qualifier includes very little information, so using the ++ debugger is somewhat difficult. ++ ++2 /DEFINE=(identifier[=definition][,...]) ++ ++ /DEFINE defines a string or macro ('definition') to be substituted ++ for every occurrence of a given string ('identifier') in a program. ++ It is equivalent to the #define preprocessor directive. ++ ++ All definitions and identifiers are converted to uppercase unless they ++ are in quotation marks. ++ ++ The simple form of the /DEFINE qualifier, ++ ++ /DEFINE=vms ++ ++ results in a definition equivalent to the preprocessor directive ++ ++ #define VMS 1 ++ ++ You must enclose macro definitions in quotation marks, as in this ++ example: ++ ++ /DEFINE="C(x)=((x) & 0xff)" ++ ++ This definition is the same as the preprocessor definition ++ ++ #define C(x) ((x) & 0xff) ++ ++ If more than one /DEFINE is present on the GCC command line, only ++ the last /DEFINE is used. ++ ++ If both /DEFINE and /UNDEFINE are present on a command line, /DEFINE ++ is evaluated before /UNDEFINE ++ ++2 /INCLUDE_DIRECTORY=(path [,path...]) ++ ++ The /INCLUDE_DIRECTORY qualifier provides additional directories to ++ search for user-defined include files. 'path' can be either a ++ logical name or a directory specification. ++ ++ There are two forms for specifying include files - #include "file-spec" ++ and #include . For the #include "file-spec" form, the search ++ order is: ++ ++ 1. The directory containing the source file. ++ ++ 2. The directories in the /INCLUDE qualifier (if any). ++ ++ 3. The directory (or directories) specified in the logical name ++ GNU_CC_INCLUDE. ++ ++ 4. The directory (or directories) specified in the logical name ++ SYS$LIBRARY. ++ ++ For the #include form, the search order is: ++ ++ 1. The directories specified in the /INCLUDE qualifier (if any). ++ ++ 2. The directory (or directories) specified in the logical name ++ GNU_CC_INCLUDE. ++ ++ 3. The directory (or directories) specified in the logical name ++ SYS$LIBRARY. ++ ++2 /MACHINE_CODE ++ ++ Tells GNU C to output the machine code generated by the compiler. Note ++ that no object file is produced when /MACHINE_CODE is specified. The ++ machine code is output to a file with the same name as the input file, ++ with the extension .S. ++ ++2 /OPTIMIZE ++ /NOOPTIMIZE ++ ++ Controls whether optimization is performed by the compiler. By default, ++ optimization is on. /NOOPTIMIZE turns optimization off. ++ ++2 /UNDEFINE ++ ++ /UNDEFINE cancels a macro definition. Thus, it is the same as the ++ #undef preprocessor directive. ++ ++ If more than one /UNDEFINE is present on the GCC command line, only ++ the last /UNDEFINE is used. ++ ++ If both /DEFINE and /UNDEFINE are present on a command line, /DEFINE ++ is evaluated before /UNDEFINE ++ ++2 /VERBOSE ++ ++ Controls whether the user sees the invocation command strings for the ++ preprocessor, compiler, and assembler. The compiler also outputs ++ some statistics on time spent in its various phases. ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info alliance/genview/src/gcc-1.42/gcc.info +--- alliance-5.0/genview/src/gcc-1.42/gcc.info 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,137 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++Indirect: ++gcc.info-1: 1204 ++gcc.info-2: 23290 ++gcc.info-3: 58923 ++gcc.info-4: 106934 ++gcc.info-5: 150408 ++gcc.info-6: 199421 ++gcc.info-7: 247429 ++gcc.info-8: 289141 ++gcc.info-9: 336430 ++gcc.info-10: 385210 ++gcc.info-11: 434739 ++ ++Tag Table: ++(Indirect) ++Node: Top1206 ++Node: Copying2582 ++Node: Contributors15866 ++Node: Boycott18065 ++Node: Options23292 ++Node: Installation58925 ++Node: Other Dir79642 ++Node: Sun Install80880 ++Node: 3b1 Install82740 ++Node: SCO Install84078 ++Node: VMS Install84999 ++Node: HPUX Install92592 ++Node: Tower Install93547 ++Node: Trouble94098 ++Node: Service97090 ++Node: Incompatibilities97667 ++Node: Extensions106936 ++Node: Statement Exprs108942 ++Node: Naming Types110399 ++Node: Typeof111488 ++Node: Lvalues113350 ++Node: Conditionals115614 ++Node: Zero-Length116541 ++Node: Variable-Length117218 ++Node: Subscripting119001 ++Node: Pointer Arith119484 ++Node: Initializers120063 ++Node: Constructors120507 ++Node: Function Attributes122007 ++Node: Dollar Signs123720 ++Node: Alignment124221 ++Node: Inline125558 ++Node: Extended Asm128511 ++Node: Asm Labels137286 ++Node: Explicit Reg Vars138603 ++Node: Global Reg Vars139617 ++Node: Local Reg Vars143848 ++Node: Alternate Keywords145441 ++Node: Bugs146606 ++Node: Bug Criteria147597 ++Node: Bug Reporting150410 ++Node: Portability161105 ++Node: Interface162869 ++Node: Passes167272 ++Node: RTL180116 ++Node: RTL Objects181951 ++Node: Accessors184880 ++Node: Flags188182 ++Node: Machine Modes192771 ++Node: Constants199423 ++Node: Regs and Memory202169 ++Node: Arithmetic209511 ++Node: Comparisons214734 ++Node: Bit Fields217545 ++Node: Conversions218624 ++Node: RTL Declarations221298 ++Node: Side Effects222069 ++Node: Incdec231332 ++Node: Assembler233700 ++Node: Insns235222 ++Node: Calls245311 ++Node: Sharing247431 ++Node: Machine Desc250242 ++Node: Patterns251884 ++Node: Example255164 ++Node: RTL Template256292 ++Node: Output Template264294 ++Node: Output Statement267312 ++Node: Constraints269450 ++Node: Simple Constraints270378 ++Node: Multi-Alternative280768 ++Node: Class Preferences283775 ++Node: Modifiers284653 ++Node: No Constraints288034 ++Node: Standard Names289143 ++Node: Pattern Ordering303968 ++Node: Dependent Patterns305193 ++Node: Jump Patterns309946 ++Node: Peephole Definitions312323 ++Node: Expander Definitions319276 ++Node: Machine Macros326215 ++Node: Run-time Target327452 ++Node: Storage Layout331292 ++Node: Registers336432 ++Node: Register Classes350558 ++Node: Stack Layout360578 ++Node: Library Calls382803 ++Node: Addressing Modes385212 ++Node: Delayed Branch391626 ++Node: Condition Code394697 ++Node: Cross-compilation397402 ++Node: Misc401854 ++Node: Assembler Format409159 ++Node: Config434741 ++ ++End Tag Table +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-1 alliance/genview/src/gcc-1.42/gcc.info-1 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-1 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-1 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,509 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Top, Next: Copying, Up: (DIR) ++ ++Introduction ++************ ++ ++ This manual documents how to run, install and port the GNU C ++compiler, as well as its new features and incompatibilities, and how to ++report bugs. ++ ++* Menu: ++ ++* Copying:: GNU General Public License says ++ how you can copy and share GNU CC. ++* Contributors:: People who have contributed to GNU CC. ++* Boycott:: Protect your freedom--fight "look and feel". ++* Options:: Command options supported by `gcc'. ++* Installation:: How to configure, compile and install GNU CC. ++* Trouble:: If you have trouble installing GNU CC. ++* Service:: How to find suppliers of services for GNU CC users. ++* Incompatibilities:: Incompatibilities of GNU CC. ++* Extensions:: GNU extensions to the C language. ++* Bugs:: How to report bugs (if you want to get them fixed). ++* Portability:: Goals of GNU CC's portability features. ++* Interface:: Function-call interface of GNU CC output. ++* Passes:: Order of passes, what they do, and what each file is for. ++* RTL:: The intermediate representation that most passes work on. ++* Machine Desc:: How to write machine description instruction patterns. ++* Machine Macros:: How to write the machine description C macros. ++* Config:: Writing the `xm-MACHINE.h' file. ++ ++ ++File: gcc.info, Node: Copying, Next: Contributors, Prev: Top, Up: Top ++ ++GNU GENERAL PUBLIC LICENSE ++************************** ++ ++ Version 1, February 1989 ++ ++ Copyright (C) 1989 Free Software Foundation, Inc. ++ 675 Mass Ave, Cambridge, MA 02139, USA ++ ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++Preamble ++======== ++ ++ The license agreements of most software companies try to keep users ++at the mercy of those companies. By contrast, our General Public ++License is intended to guarantee your freedom to share and change free ++software--to make sure the software is free for all its users. The ++General Public License applies to the Free Software Foundation's ++software and to any other program whose authors commit to using it. You ++can use it for your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Specifically, the General Public License is designed to make ++sure that you have the freedom to give away or sell copies of free ++software, that you receive source code or can get it if you want it, ++that you can change the software or use pieces of it in new free ++programs; and that you know you can do these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++anyone to deny you these rights or to ask you to surrender the rights. ++These restrictions translate to certain responsibilities for you if you ++distribute copies of the software, or if you modify it. ++ ++ For example, if you distribute copies of a such a program, whether ++gratis or for a fee, you must give the recipients all the rights that ++you have. You must make sure that they, too, receive or can get the ++source code. And you must tell them their rights. ++ ++ We protect your rights with two steps: (1) copyright the software, ++and (2) offer you this license which gives you legal permission to copy, ++distribute and/or modify the software. ++ ++ Also, for each author's protection and ours, we want to make certain ++that everyone understands that there is no warranty for this free ++software. If the software is modified by someone else and passed on, we ++want its recipients to know that what they have is not the original, so ++that any problems introduced by others will not reflect on the original ++authors' reputations. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ TERMS AND CONDITIONS ++ ++ 1. This License Agreement applies to any program or other work which ++ contains a notice placed by the copyright holder saying it may be ++ distributed under the terms of this General Public License. The ++ "Program", below, refers to any such program or work, and a "work ++ based on the Program" means either the Program or any work ++ containing the Program or a portion of it, either verbatim or with ++ modifications. Each licensee is addressed as "you". ++ ++ 2. You may copy and distribute verbatim copies of the Program's source ++ code as you receive it, in any medium, provided that you ++ conspicuously and appropriately publish on each copy an ++ appropriate copyright notice and disclaimer of warranty; keep ++ intact all the notices that refer to this General Public License ++ and to the absence of any warranty; and give any other recipients ++ of the Program a copy of this General Public License along with ++ the Program. You may charge a fee for the physical act of ++ transferring a copy. ++ ++ 3. You may modify your copy or copies of the Program or any portion of ++ it, and copy and distribute such modifications under the terms of ++ Paragraph 1 above, provided that you also do the following: ++ ++ * cause the modified files to carry prominent notices stating ++ that you changed the files and the date of any change; and ++ ++ * cause the whole of any work that you distribute or publish, ++ that in whole or in part contains the Program or any part ++ thereof, either with or without modifications, to be licensed ++ at no charge to all third parties under the terms of this ++ General Public License (except that you may choose to grant ++ warranty protection to some or all third parties, at your ++ option). ++ ++ * If the modified program normally reads commands interactively ++ when run, you must cause it, when started running for such ++ interactive use in the simplest and most usual way, to print ++ or display an announcement including an appropriate copyright ++ notice and a notice that there is no warranty (or else, ++ saying that you provide a warranty) and that users may ++ redistribute the program under these conditions, and telling ++ the user how to view a copy of this General Public License. ++ ++ * You may charge a fee for the physical act of transferring a ++ copy, and you may at your option offer warranty protection in ++ exchange for a fee. ++ ++ Mere aggregation of another independent work with the Program (or ++ its derivative) on a volume of a storage or distribution medium ++ does not bring the other work under the scope of these terms. ++ ++ 4. You may copy and distribute the Program (or a portion or ++ derivative of it, under Paragraph 2) in object code or executable ++ form under the terms of Paragraphs 1 and 2 above provided that you ++ also do one of the following: ++ ++ * accompany it with the complete corresponding machine-readable ++ source code, which must be distributed under the terms of ++ Paragraphs 1 and 2 above; or, ++ ++ * accompany it with a written offer, valid for at least three ++ years, to give any third party free (except for a nominal ++ charge for the cost of distribution) a complete ++ machine-readable copy of the corresponding source code, to be ++ distributed under the terms of Paragraphs 1 and 2 above; or, ++ ++ * accompany it with the information you received as to where the ++ corresponding source code may be obtained. (This alternative ++ is allowed only for noncommercial distribution and only if you ++ received the program in object code or executable form alone.) ++ ++ Source code for a work means the preferred form of the work for ++ making modifications to it. For an executable file, complete ++ source code means all the source code for all modules it contains; ++ but, as a special exception, it need not include source code for ++ modules which are standard libraries that accompany the operating ++ system on which the executable file runs, or for standard header ++ files or definitions files that accompany that operating system. ++ ++ 5. You may not copy, modify, sublicense, distribute or transfer the ++ Program except as expressly provided under this General Public ++ License. Any attempt otherwise to copy, modify, sublicense, ++ distribute or transfer the Program is void, and will automatically ++ terminate your rights to use the Program under this License. ++ However, parties who have received copies, or rights to use ++ copies, from you under this General Public License will not have ++ their licenses terminated so long as such parties remain in full ++ compliance. ++ ++ 6. By copying, distributing or modifying the Program (or any work ++ based on the Program) you indicate your acceptance of this license ++ to do so, and all its terms and conditions. ++ ++ 7. Each time you redistribute the Program (or any work based on the ++ Program), the recipient automatically receives a license from the ++ original licensor to copy, distribute or modify the Program ++ subject to these terms and conditions. You may not impose any ++ further restrictions on the recipients' exercise of the rights ++ granted herein. ++ ++ 8. The Free Software Foundation may publish revised and/or new ++ versions of the General Public License from time to time. Such ++ new versions will be similar in spirit to the present version, but ++ may differ in detail to address new problems or concerns. ++ ++ Each version is given a distinguishing version number. If the ++ Program specifies a version number of the license which applies to ++ it and "any later version", you have the option of following the ++ terms and conditions either of that version or of any later ++ version published by the Free Software Foundation. If the Program ++ does not specify a version number of the license, you may choose ++ any version ever published by the Free Software Foundation. ++ ++ 9. If you wish to incorporate parts of the Program into other free ++ programs whose distribution conditions are different, write to the ++ author to ask for permission. For software which is copyrighted ++ by the Free Software Foundation, write to the Free Software ++ Foundation; we sometimes make exceptions for this. Our decision ++ will be guided by the two goals of preserving the free status of ++ all derivatives of our free software and of promoting the sharing ++ and reuse of software generally. ++ ++ NO WARRANTY ++ ++ 10. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO ++ WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE ++ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT ++ WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT ++ NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND ++ FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE ++ QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ++ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY ++ SERVICING, REPAIR OR CORRECTION. ++ ++ 11. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN ++ WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY ++ MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE ++ LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, ++ INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR ++ INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU ++ OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY ++ OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ++ ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ++ ++ END OF TERMS AND CONDITIONS ++ ++Appendix: How to Apply These Terms to Your New Programs ++======================================================= ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to humanity, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these ++terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++convey the exclusion of warranty; and each file should have at least the ++"copyright" line and a pointer to where the full notice is found. ++ ++ ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. ++ Copyright (C) 19YY NAME OF AUTHOR ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 1, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++ Also add information on how to contact you by electronic and paper ++mail. ++ ++ If the program is interactive, make it output a short notice like ++this when it starts in an interactive mode: ++ ++ Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR ++ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++ The hypothetical commands `show w' and `show c' should show the ++appropriate parts of the General Public License. Of course, the ++commands you use may be called something other than `show w' and `show ++c'; they could even be mouse-clicks or menu items--whatever suits your ++program. ++ ++ You should also get your employer (if you work as a programmer) or ++your school, if any, to sign a "copyright disclaimer" for the program, ++if necessary. Here a sample; alter the names: ++ ++ Yoyodyne, Inc., hereby disclaims all copyright interest in the ++ program `Gnomovision' (a program to direct compilers to make passes ++ at assemblers) written by James Hacker. ++ ++ SIGNATURE OF TY COON, 1 April 1989 ++ Ty Coon, President of Vice ++ ++ That's all there is to it! ++ ++ ++File: gcc.info, Node: Contributors, Next: Boycott, Prev: Copying, Up: Top ++ ++Contributors to GNU CC ++********************** ++ ++ In addition to Richard Stallman, several people have written parts ++of GNU CC. ++ ++ * The idea of using RTL and some of the optimization ideas came from ++ the U. of Arizona Portable Optimizer, written by Jack Davidson and ++ Christopher Fraser. See "Register Allocation and Exhaustive ++ Peephole Optimization", Software Practice and Experience 14 (9), ++ Sept. 1984, 857-866. ++ ++ * Paul Rubin wrote most of the preprocessor. ++ ++ * Leonard Tower wrote parts of the parser, RTL generator, and RTL ++ definitions, and of the Vax machine description. ++ ++ * Ted Lemon wrote parts of the RTL reader and printer. ++ ++ * Jim Wilson implemented loop strength reduction and some other loop ++ optimizations. ++ ++ * Nobuyuki Hikichi of Software Research Associates, Tokyo, ++ contributed the support for the Sony NEWS machine. ++ ++ * Charles LaBrec contributed the support for the Integrated Solutions ++ 68020 system. ++ ++ * Michael Tiemann of MCC wrote most of the description of the ++ National Semiconductor 32000 series cpu. He also wrote the code ++ for inline function integration and for the SPARC cpu and Motorola ++ 88000 cpu and part of the Sun FPA support. ++ ++ * Jan Stein of the Chalmers Computer Society provided support for ++ Genix, as well as part of the 32000 machine description. ++ ++ * Randy Smith finished the Sun FPA support. ++ ++ * Robert Brown implemented the support for Encore 32000 systems. ++ ++ * David Kashtan of SRI adapted GNU CC to the Vomit-Making System. ++ ++ * Alex Crain provided changes for the 3b1. ++ ++ * Greg Satz and Chris Hanson assisted in making GNU CC work on HP-UX ++ for the 9000 series 300. ++ ++ * William Schelter did most of the work on the Intel 80386 support. ++ ++ * Christopher Smith did the port for Convex machines. ++ ++ * Paul Petersen wrote the machine description for the Alliant FX/8. ++ ++ * Alain Lichnewsky ported GNU CC to the Mips cpu. ++ ++ * Devon Bowen, Dale Wiles and Kevin Zachmann ported GNU CC to the ++ Tahoe. ++ ++ * Jonathan Stone wrote the machine description for the Pyramid ++ computer. ++ ++ ++File: gcc.info, Node: Boycott, Next: Options, Prev: Contributors, Up: Top ++ ++Protect Your Freedom--Fight "Look And Feel" ++******************************************* ++ ++ This section is a political message from the League for Programming ++ Freedom to the users of GNU CC. It is included here as an ++ expression of support for the League on the part of the Free ++ Software Foundation and Richard Stallman. ++ ++ Ashton-Tate, Apple, Lotus and Xerox are trying to create a new form ++of legal monopoly: a copyright on a class of user interfaces. These ++monopolies would cause serious problems for users and developers of ++computer software and systems. ++ ++ Until a few years ago, the law seemed clear: no one could restrict ++others from using a user interface; programmers were free to implement ++any interface they chose. Imitating interfaces, sometimes with changes, ++was standard practice in the computer field. The interfaces we know ++evolved gradually in this way; for example, the Macintosh user interface ++drew ideas from the Xerox interface, which in turn drew on work done at ++Stanford and SRI. 1-2-3 imitated VisiCalc, and dBase imitated a ++database program from JPL. ++ ++ Most computer companies, and nearly all computer users, were happy ++with this state of affairs. The companies that are suing say it does ++not offer "enough incentive" to develop their products, but they must ++have considered it "enough" when they made their decision to do so. It ++seems they are not satisfied with the opportunity to continue to compete ++in the marketplace--not even with a head start. ++ ++ If Xerox, Lotus, Apple and Ashton-Tate are permitted to make law ++through the courts, the precedent will hobble the software industry: ++ ++ * Gratuitous incompatibilities will burden users. Imagine if each ++ car manufacturer had to arrange the pedals in a different order. ++ ++ * Software will become and remain more expensive. Users will be ++ "locked in" to proprietary interfaces, for which there is no real ++ competition. ++ ++ * Large companies have an unfair advantage wherever lawsuits become ++ commonplace. Since they can easily afford to sue, they can ++ intimidate small companies with threats even when they don't ++ really have a case. ++ ++ * User interface improvements will come slower, since incremental ++ evolution through creative imitation will no longer be permitted. ++ ++ * Even Apple, etc., will find it harder to make improvements if they ++ can no longer adapt the good ideas that others introduce, for fear ++ of weakening their own legal positions. Some users suggest that ++ this stagnation may already have started. ++ ++ * If you use GNU software, you might find it of some concern that ++ user interface copyright will make it hard for the Free Software ++ Foundation to develop programs compatible with the interfaces that ++ you already know. ++ ++ To protect our freedom from lawsuits like these, a group of ++programmers and users have formed a new grass-roots political ++organization, the League for Programming Freedom. ++ ++ The purpose of the League is to oppose new monopolistic practices ++such as user-interface copyright and software patents; it calls for a ++return to the legal policies of the recent past, in which these ++practices were not allowed. The League is not concerned with free ++software as an issue, and not affiliated with the Free Software ++Foundation. ++ ++ The League's membership rolls include John McCarthy, inventor of ++Lisp, Marvin Minsky, founder of the Artificial Intelligence lab, Guy L. ++Steele, Jr., author of well-known books on Lisp and C, as well as ++Richard Stallman, the developer of GNU CC. Please join and add your ++name to the list. Membership dues in the League are $42 per year for ++programmers, managers and professionals; $10.50 for students; $21 for ++others. ++ ++ The League needs both activist members and members who only pay their ++dues. ++ ++ To join, or for more information, phone (617) 492-0023 or write to: ++ ++ League for Programming Freedom ++ 1 Kendall Square #143 ++ P.O. Box 9171 ++ Cambridge, MA 02139 league@prep.ai.mit.edu ++ ++ Here are some suggestions from the League for how you can protect ++your freedom to write programs: ++ ++ * Don't buy from Xerox, Lotus, Apple or Ashton-Tate. Buy from their ++ competitors or from the defendants they are suing. ++ ++ * Don't develop software to work with the systems made by these ++ companies. ++ ++ * Port your existing software to competing systems, so that you ++ encourage users to switch. ++ ++ * Write letters to company presidents to let them know their conduct ++ is unacceptable. ++ ++ * Tell your friends and colleagues about this issue and how it ++ threatens to ruin the computer industry. ++ ++ * Above all, don't work for the look-and-feel plaintiffs, and don't ++ accept contracts from them. ++ ++ * Write to Congress to explain the importance of this issue. ++ ++ House Subcommittee on Intellectual Property ++ 2137 Rayburn Bldg ++ Washington, DC 20515 ++ ++ Senate Subcommittee on Patents, Trademarks and Copyrights ++ United States Senate ++ Washington, DC 20510 ++ ++ Express your opinion! You can make a difference. ++ ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-10 alliance/genview/src/gcc-1.42/gcc.info-10 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-10 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-10 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,1137 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Addressing Modes, Next: Delayed Branch, Prev: Library Calls, Up: Machine Macros ++ ++Addressing Modes ++================ ++ ++`HAVE_POST_INCREMENT' ++ Define this macro if the machine supports post-increment ++ addressing. ++ ++`HAVE_PRE_INCREMENT' ++`HAVE_POST_DECREMENT' ++`HAVE_PRE_DECREMENT' ++ Similar for other kinds of addressing. ++ ++`CONSTANT_ADDRESS_P (X)' ++ A C expression that is 1 if the RTX X is a constant whose value is ++ an integer. This includes integers whose values are not explicitly ++ known, such as `symbol_ref' and `label_ref' expressions and ++ `const' arithmetic expressions. ++ ++ On most machines, this can be defined as `CONSTANT_P (X)', but a ++ few machines are more restrictive in which constant addresses are ++ supported. ++ ++`MAX_REGS_PER_ADDRESS' ++ A number, the maximum number of registers that can appear in a ++ valid memory address. Note that it is up to you to specify a ++ value equal to the maximum number that `go_if_legitimate_address' ++ would ever accept. ++ ++`GO_IF_LEGITIMATE_ADDRESS (MODE, X, LABEL)' ++ A C compound statement with a conditional `goto LABEL;' executed ++ if X (an RTX) is a legitimate memory address on the target machine ++ for a memory operand of mode MODE. ++ ++ It usually pays to define several simpler macros to serve as ++ subroutines for this one. Otherwise it may be too complicated to ++ understand. ++ ++ This macro must exist in two variants: a strict variant and a ++ non-strict one. The strict variant is used in the reload pass. It ++ must be defined so that any pseudo-register that has not been ++ allocated a hard register is considered a memory reference. In ++ contexts where some kind of register is required, a pseudo-register ++ with no hard register must be rejected. ++ ++ The non-strict variant is used in other passes. It must be ++ defined to accept all pseudo-registers in every context where some ++ kind of register is required. ++ ++ Compiler source files that want to use the strict variant of this ++ macro define the macro `REG_OK_STRICT'. You should use an `#ifdef ++ REG_OK_STRICT' conditional to define the strict variant in that ++ case and the non-strict variant otherwise. ++ ++ Typically among the subroutines used to define ++ `GO_IF_LEGITIMATE_ADDRESS' are subroutines to check for acceptable ++ registers for various purposes (one for base registers, one for ++ index registers, and so on). Then only these subroutine macros ++ need have two variants; the higher levels of macros may be the same ++ whether strict or not. ++ ++ Normally, constant addresses which are the sum of a `symbol_ref' ++ and an integer are stored inside a `const' RTX to mark them as ++ constant. Therefore, there is no need to recognize such sums as ++ legitimate addresses. ++ ++ Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle constant ++ sums that are not marked with `const'. It assumes that a naked ++ `plus' indicates indexing. If so, then you *must* reject such ++ naked constant sums as illegitimate addresses, so that none of ++ them will be given to `PRINT_OPERAND_ADDRESS'. ++ ++`REG_OK_FOR_BASE_P (X)' ++ A C expression that is nonzero if X (assumed to be a `reg' RTX) is ++ valid for use as a base register. For hard registers, it should ++ always accept those which the hardware permits and reject the ++ others. Whether the macro accepts or rejects pseudo registers ++ must be controlled by `REG_OK_STRICT' as described above. This ++ usually requires two variant definitions, of which `REG_OK_STRICT' ++ controls the one actually used. ++ ++`REG_OK_FOR_INDEX_P (X)' ++ A C expression that is nonzero if X (assumed to be a `reg' RTX) is ++ valid for use as an index register. ++ ++ The difference between an index register and a base register is ++ that the index register may be scaled. If an address involves the ++ sum of two registers, neither one of them scaled, then either one ++ may be labeled the "base" and the other the "index"; but whichever ++ labeling is used must fit the machine's constraints of which ++ registers may serve in each capacity. The compiler will try both ++ labelings, looking for one that is valid, and will reload one or ++ both registers only if neither labeling works. ++ ++`LEGITIMIZE_ADDRESS (X, OLDX, MODE, WIN)' ++ A C compound statement that attempts to replace X with a valid ++ memory address for an operand of mode MODE. WIN will be a C ++ statement label elsewhere in the code; the macro definition may use ++ ++ GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN); ++ ++ to avoid further processing if the address has become legitimate. ++ ++ X will always be the result of a call to `break_out_memory_refs', ++ and OLDX will be the operand that was given to that function to ++ produce X. ++ ++ The code generated by this macro should not alter the substructure ++ of X. If it transforms X into a more legitimate form, it should ++ assign X (which will always be a C variable) a new value. ++ ++ It is not necessary for this macro to come up with a legitimate ++ address. The compiler has standard ways of doing so in all cases. ++ In fact, it is safe for this macro to do nothing. But often a ++ machine-dependent strategy can generate better code. ++ ++`GO_IF_MODE_DEPENDENT_ADDRESS (ADDR, LABEL)' ++ A C statement or compound statement with a conditional `goto ++ LABEL;' executed if memory address X (an RTX) can have different ++ meanings depending on the machine mode of the memory reference it ++ is used for. ++ ++ Autoincrement and autodecrement addresses typically have ++ mode-dependent effects because the amount of the increment or ++ decrement is the size of the operand being addressed. Some ++ machines have other mode-dependent addresses. Many RISC machines ++ have no mode-dependent addresses. ++ ++ You may assume that ADDR is a valid address for the machine. ++ ++`LEGITIMATE_CONSTANT_P (X)' ++ A C expression that is nonzero if X is a legitimate constant for ++ an immediate operand on the target machine. You can assume that ++ either X is a `const_double' or it satisfies `CONSTANT_P', so you ++ need not check these things. In fact, `1' is a suitable ++ definition for this macro on machines where any `const_double' is ++ valid and anything `CONSTANT_P' is valid. ++ ++ ++File: gcc.info, Node: Delayed Branch, Next: Condition Code, Prev: Addressing Modes, Up: Machine Macros ++ ++Parameters for Delayed Branch Optimization ++========================================== ++ ++`HAVE_DELAYED_BRANCH' ++ Define this macro if the target machine has delayed branches, that ++ is, a branch does not take effect immediately, and the actual ++ branch instruction may be followed by one or more instructions ++ that will be issued before the PC is actually changed. ++ ++ If defined, this allows a special scheduling pass to be run after ++ the second jump optimization to attempt to reorder instructions to ++ exploit this. Defining this macro also requires the definition of ++ certain other macros described below. ++ ++`DBR_SLOTS_AFTER (INSN)' ++ This macro must be defined if `HAVE_DELAYED_BRANCH' is defined. ++ Its definition should be a C expression returning the number of ++ available delay slots following the instruction(s) output by the ++ pattern for INSN. The definition of "slot" is machine-dependent, ++ and may denote instructions, bytes, or whatever. ++ ++`DBR_INSN_SLOTS (INSN)' ++ This macro must be defined if `HAVE_DELAYED_BRANCH' is defined. It ++ should be a C expression returning the number of slots (typically ++ the number of machine instructions) consumed by INSN. ++ ++ You may assume that INSN is truly an insn, not a note, label, ++ barrier, dispatch table, `use', or `clobber'. ++ ++`DBR_INSN_ELIGIBLE_P (INSN, DINSN)' ++ A C expression whose value is non-zero if it is legitimate to put ++ INSN in the delay slot following DINSN. ++ ++ You do not need to take account of data flow considerations in the ++ definition of this macro, because the delayed branch optimizer ++ always does that. This macro is needed only when certain insns ++ may not be placed in certain delay slots for reasons not evident ++ from the RTL expressions themselves. If there are no such ++ problems, you don't need to define this macro. ++ ++ You may assume that INSN is truly an insn, not a note, label, ++ barrier, dispatch table, `use', or `clobber'. You may assume that ++ DINSN is a jump insn with a delay slot. ++ ++`DBR_OUTPUT_SEQEND(FILE)' ++ A C statement, to be executed after all slot-filler instructions ++ have been output. If necessary, call `dbr_sequence_length' to ++ determine the number of slots filled in a sequence (zero if not ++ currently outputting a sequence), to decide how many no-ops to ++ output, or whatever. ++ ++ Don't define this macro if it has nothing to do, but it is helpful ++ in reading assembly output if the extent of the delay sequence is ++ made explicit (e.g. with white space). ++ ++ Note that output routines for instructions with delay slots must be ++ prepared to deal with not being output as part of a sequence (i.e. ++ when the scheduling pass is not run, or when no slot fillers could ++ be found.) The variable `final_sequence' is null when not ++ processing a sequence, otherwise it contains the `sequence' rtx ++ being output. ++ ++ ++File: gcc.info, Node: Condition Code, Next: Cross-compilation, Prev: Delayed Branch, Up: Machine Macros ++ ++Condition Code Information ++========================== ++ ++ The file `conditions.h' defines a variable `cc_status' to describe ++how the condition code was computed (in case the interpretation of the ++condition code depends on the instruction that it was set by). This ++variable contains the RTL expressions on which the condition code is ++currently based, and several standard flags. ++ ++ Sometimes additional machine-specific flags must be defined in the ++machine description header file. It can also add additional ++machine-specific information by defining `CC_STATUS_MDEP'. ++ ++`CC_STATUS_MDEP' ++ C code for a data type which is used for declaring the `mdep' ++ component of `cc_status'. It defaults to `int'. ++ ++`CC_STATUS_MDEP_INIT' ++ A C expression to initialize the `mdep' field to "empty". The ++ default definition does nothing, since most machines don't use the ++ field anyway. If you want to use the field, you should probably ++ define this macro to initialize it. ++ ++`NOTICE_UPDATE_CC (EXP, INSN)' ++ A C compound statement to set the components of `cc_status' ++ appropriately for an insn INSN whose body is EXP. It is this ++ macro's responsibility to recognize insns that set the condition ++ code as a byproduct of other activity as well as those that ++ explicitly set `(cc0)'. ++ ++ If there are insn that do not set the condition code but do alter ++ other machine registers, this macro must check to see whether they ++ invalidate the expressions that the condition code is recorded as ++ reflecting. For example, on the 68000, insns that store in address ++ registers do not set the condition code, which means that usually ++ `NOTICE_UPDATE_CC' can leave `cc_status' unaltered for such insns. ++ But suppose that the previous insn set the condition code based ++ on location `a4@(102)' and the current insn stores a new value in ++ `a4'. Although the condition code is not changed by this, it will ++ no longer be true that it reflects the contents of `a4@(102)'. ++ Therefore, `NOTICE_UPDATE_CC' must alter `cc_status' in this case ++ to say that nothing is known about the condition code value. ++ ++ The definition of `NOTICE_UPDATE_CC' must be prepared to deal with ++ the results of peephole optimization: insns whose patterns are ++ `parallel' RTXs containing various `reg', `mem' or constants which ++ are just the operands. The RTL structure of these insns is not ++ sufficient to indicate what the insns actually do. What ++ `NOTICE_UPDATE_CC' should do when it sees one is just to run ++ `CC_STATUS_INIT'. ++ ++ ++File: gcc.info, Node: Cross-compilation, Next: Misc, Prev: Condition Code, Up: Machine Macros ++ ++Cross Compilation and Floating-Point Format ++=========================================== ++ ++ While all modern machines use 2's complement representation for ++integers, there are a variety of representations for floating point ++numbers. This means that in a cross-compiler the representation of ++floating point numbers in the compiled program may be different from ++that used in the machine doing the compilation. ++ ++ Because different representation systems may offer different amounts ++of range and precision, the cross compiler cannot safely use the host ++machine's floating point arithmetic. Therefore, floating point ++constants must be represented in the target machine's format. This ++means that the cross compiler cannot use `atof' to parse a floating ++point constant; it must have its own special routine to use instead. ++Also, constant folding must emulate the target machine's arithmetic (or ++must not be done at all). ++ ++ The macros in the following table should be defined only if you are ++cross compiling between different floating point formats. ++ ++ Otherwise, don't define them. Then default definitions will be set ++up which use `double' as the data type, `==' to test for equality, etc. ++ ++ You don't need to worry about how many times you use an operand of ++any of these macros. The compiler never uses operands which have side ++effects. ++ ++`REAL_VALUE_TYPE' ++ A macro for the C data type to be used to hold a floating point ++ value in the target machine's format. Typically this would be a ++ `struct' containing an array of `int'. ++ ++`REAL_VALUES_EQUAL (X, Y)' ++ A macro for a C expression which compares for equality the two ++ values, X and Y, both of type `REAL_VALUE_TYPE'. ++ ++`REAL_VALUES_LESS (X, Y)' ++ A macro for a C expression which tests whether X is less than Y, ++ both values being of type `REAL_VALUE_TYPE' and interpreted as ++ floating point numbers in the target machine's representation. ++ ++`REAL_VALUE_LDEXP (X, SCALE)' ++ A macro for a C expression which performs the standard library ++ function `ldexp', but using the target machine's floating point ++ representation. Both X and the value of the expression have type ++ `REAL_VALUE_TYPE'. The second argument, SCALE, is an integer. ++ ++`REAL_VALUE_ATOF (STRING)' ++ A macro for a C expression which converts STRING, an expression of ++ type `char *', into a floating point number in the target ++ machine's representation. The value has type `REAL_VALUE_TYPE'. ++ ++ Define the following additional macros if you want to make floating ++point constant folding work while cross compiling. If you don't define ++them, cross compilation is still possible, but constant folding will ++not happen for floating point values. ++ ++`REAL_ARITHMETIC (OUTPUT, CODE, X, Y)' ++ A macro for a C statement which calculates an arithmetic operation ++ of the two floating point values X and Y, both of type ++ `REAL_VALUE_TYPE' in the target machine's representation, to ++ produce a result of the same type and representation which is ++ stored in OUTPUT (which will be a variable). ++ ++ The operation to be performed is specified by CODE, a tree code ++ which will always be one of the following: `PLUS_EXPR', ++ `MINUS_EXPR', `MULT_EXPR', `RDIV_EXPR', `MAX_EXPR', `MIN_EXPR'. ++ ++ The expansion of this macro is responsible for checking for ++ overflow. If overflow happens, the macro expansion should execute ++ the statement `return 0;', which indicates the inability to ++ perform the arithmetic operation requested. ++ ++`REAL_VALUE_NEGATE (X)' ++ A macro for a C expression which returns the negative of the ++ floating point value X. Both X and the value of the expression ++ have type `REAL_VALUE_TYPE' and are in the target machine's ++ floating point representation. ++ ++ There is no way for this macro to report overflow, since overflow ++ can't happen in the negation operation. ++ ++`REAL_VALUE_TO_INT (LOW, HIGH, X)' ++ A macro for a C expression which converts a floating point value X ++ into a double-precision integer which is then stored into LOW and ++ HIGH, two variables of type INT. ++ ++`REAL_VALUE_FROM_INT (X, LOW, HIGH)' ++ A macro for a C expression which converts a double-precision ++ integer found in LOW and HIGH, two variables of type INT, into a ++ floating point value which is then stored into X. ++ ++ ++File: gcc.info, Node: Misc, Next: Assembler Format, Prev: Cross-compilation, Up: Machine Macros ++ ++Miscellaneous Parameters ++======================== ++ ++`CASE_VECTOR_MODE' ++ An alias for a machine mode name. This is the machine mode that ++ elements of a jump-table should have. ++ ++`CASE_VECTOR_PC_RELATIVE' ++ Define this macro if jump-tables should contain relative addresses. ++ ++`CASE_DROPS_THROUGH' ++ Define this if control falls through a `case' insn when the index ++ value is out of range. This means the specified default-label is ++ actually ignored by the `case' insn proper. ++ ++`IMPLICIT_FIX_EXPR' ++ An alias for a tree code that should be used by default for ++ conversion of floating point values to fixed point. Normally, ++ `FIX_ROUND_EXPR' is used. ++ ++`FIXUNS_TRUNC_LIKE_FIX_TRUNC' ++ Define this macro if the same instructions that convert a floating ++ point number to a signed fixed point number also convert validly ++ to an unsigned one. ++ ++`EASY_DIV_EXPR' ++ An alias for a tree code that is the easiest kind of division to ++ compile code for in the general case. It may be `TRUNC_DIV_EXPR', ++ `FLOOR_DIV_EXPR', `CEIL_DIV_EXPR' or `ROUND_DIV_EXPR'. These four ++ division operators differ in how they round the result to an ++ integer. `EASY_DIV_EXPR' is used when it is permissible to use ++ any of those kinds of division and the choice should be made on ++ the basis of efficiency. ++ ++`DEFAULT_SIGNED_CHAR' ++ An expression whose value is 1 or 0, according to whether the type ++ `char' should be signed or unsigned by default. The user can ++ always override this default with the options `-fsigned-char' and ++ `-funsigned-char'. ++ ++`SCCS_DIRECTIVE' ++ Define this if the preprocessor should ignore `#sccs' directives ++ and print no error message. ++ ++`HAVE_VPRINTF' ++ Define this if the library function `vprintf' is available on your ++ system. ++ ++`MOVE_MAX' ++ The maximum number of bytes that a single instruction can move ++ quickly from memory to memory. ++ ++`INT_TYPE_SIZE' ++ A C expression for the size in bits of the type `int' on the ++ target machine. If you don't define this, the default is one word. ++ ++`SHORT_TYPE_SIZE' ++ A C expression for the size in bits of the type `short' on the ++ target machine. If you don't define this, the default is half a ++ word. (If this would be less than one storage unit, it is rounded ++ up to one unit.) ++ ++`LONG_TYPE_SIZE' ++ A C expression for the size in bits of the type `long' on the ++ target machine. If you don't define this, the default is one word. ++ ++`LONG_LONG_TYPE_SIZE' ++ A C expression for the size in bits of the type `long long' on the ++ target machine. If you don't define this, the default is two ++ words. ++ ++`CHAR_TYPE_SIZE' ++ A C expression for the size in bits of the type `char' on the ++ target machine. If you don't define this, the default is one ++ quarter of a word. (If this would be less than one storage unit, ++ it is rounded up to one unit.) ++ ++`FLOAT_TYPE_SIZE' ++ A C expression for the size in bits of the type `float' on the ++ target machine. If you don't define this, the default is one word. ++ ++`DOUBLE_TYPE_SIZE' ++ A C expression for the size in bits of the type `double' on the ++ target machine. If you don't define this, the default is two ++ words. ++ ++`LONG_DOUBLE_TYPE_SIZE' ++ A C expression for the size in bits of the type `long double' on ++ the target machine. If you don't define this, the default is two ++ words. ++ ++`SLOW_BYTE_ACCESS' ++ Define this macro as a C expression which is nonzero if accessing ++ less than a word of memory (i.e. a `char' or a `short') is slow ++ (requires more than one instruction). ++ ++`SLOW_ZERO_EXTEND' ++ Define this macro if zero-extension (of a `char' or `short' to an ++ `int') can be done faster if the destination is a register that is ++ known to be zero. ++ ++ If you define this macro, you must have instruction patterns that ++ recognize RTL structures like this: ++ ++ (set (strict-low-part (subreg:QI (reg:SI ...) 0)) ...) ++ ++ and likewise for `HImode'. ++ ++`SHIFT_COUNT_TRUNCATED' ++ Define this macro if shift instructions ignore all but the lowest ++ few bits of the shift count. It implies that a sign-extend or ++ zero-extend instruction for the shift count can be omitted. ++ ++`TRULY_NOOP_TRUNCATION (OUTPREC, INPREC)' ++ A C expression which is nonzero if on this machine it is safe to ++ "convert" an integer of INPREC bits to one of OUTPREC bits (where ++ OUTPREC is smaller than INPREC) by merely operating on it as if it ++ had only OUTPREC bits. ++ ++ On many machines, this expression can be 1. ++ ++`NO_FUNCTION_CSE' ++ Define this macro if it is as good or better to call a constant ++ function address than to call an address kept in a register. ++ ++`PROMOTE_PROTOTYPES' ++ Define this macro if an argument declared as `char' or `short' in ++ a prototype should actually be passed as an `int'. In addition to ++ avoiding errors in certain cases of mismatch, it also makes for ++ better code on certain machines. ++ ++`STORE_FLAG_VALUE' ++ A C expression for the value stored by a store-flag instruction ++ (`sCOND') when the condition is true. This is usually 1 or -1; it ++ is required to be an odd number or a negative number. ++ ++ Do not define `STORE_FLAG_VALUE' if the machine has no store-flag ++ instructions. ++ ++`Pmode' ++ An alias for the machine mode for pointers. Normally the ++ definition can be ++ ++ #define Pmode SImode ++ ++`FUNCTION_MODE' ++ An alias for the machine mode used for memory references to ++ functions being called, in `call' RTL expressions. On most ++ machines this should be `QImode'. ++ ++`INSN_MACHINE_INFO' ++ This macro should expand into a C structure type to use for the ++ machine-dependent info field specified with the optional last ++ argument in `define_insn' and `define_peephole' patterns. For ++ example, it might expand into `struct machine_info'; then it would ++ be up to you to define this structure in the `tm.h' file. ++ ++ You do not need to define this macro if you do not write the ++ optional last argument in any of the patterns in the machine ++ description. ++ ++`DEFAULT_MACHINE_INFO' ++ This macro should expand into a C initializer to use to initialize ++ the machine-dependent info for one insn pattern. It is used for ++ patterns that do not specify the machine-dependent info. ++ ++ If you do not define this macro, zero is used. ++ ++`CONST_COSTS (X, CODE)' ++ A part of a C `switch' statement that describes the relative costs ++ of constant RTL expressions. It must contain `case' labels for ++ expression codes `const_int', `const', `symbol_ref', `label_ref' ++ and `const_double'. Each case must ultimately reach a `return' ++ statement to return the relative cost of the use of that kind of ++ constant value in an expression. The cost may depend on the ++ precise value of the constant, which is available for examination ++ in X. ++ ++ CODE is the expression code--redundant, since it can be obtained ++ with `GET_CODE (X)'. ++ ++`DOLLARS_IN_IDENTIFIERS' ++ Define this to be nonzero if the character `$' should be allowed ++ by default in identifier names. ++ ++ ++File: gcc.info, Node: Assembler Format, Prev: Misc, Up: Machine Macros ++ ++Output of Assembler Code ++======================== ++ ++`ASM_SPEC' ++ A C string constant that tells the GNU CC driver program options to ++ pass to the assembler. It can also specify how to translate ++ options you give to GNU CC into options for GNU CC to pass to the ++ assembler. See the file `tm-sun3.h' for an example of this. ++ ++ Do not define this macro if it does not need to do anything. ++ ++`LINK_SPEC' ++ A C string constant that tells the GNU CC driver program options to ++ pass to the linker. It can also specify how to translate options ++ you give to GNU CC into options for GNU CC to pass to the linker. ++ ++ Do not define this macro if it does not need to do anything. ++ ++`LIB_SPEC' ++ Another C string constant used much like `LINK_SPEC'. The ++ difference between the two is that `LIBS_SPEC' is used at the end ++ of the command given to the linker. ++ ++ If this macro is not defined, a default is provided that loads the ++ standard C library from the usual place. See `gcc.c'. ++ ++`LIBG_SPEC' ++ Another C string constant used much like `LINK_SPEC'. This ++ controls whether to link `libg.a' when debugging. Some systems ++ expect this; others do not have any `libg.a'. ++ ++ If this macro is not defined, a default is provided that loads the ++ `libg.a' provided `-g' is specified. See `gcc.c'. ++ ++`STARTFILE_SPEC' ++ Another C string constant used much like `LINK_SPEC'. The ++ difference between the two is that `STARTFILE_SPEC' is used at the ++ very beginning of the command given to the linker. ++ ++ If this macro is not defined, a default is provided that loads the ++ standard C startup file from the usual place. See `gcc.c'. ++ ++`STANDARD_EXEC_PREFIX' ++ Define this macro as a C string constant if you wish to override ++ the standard choice of `/usr/local/lib/gcc-' as the default prefix ++ to try when searching for the executable files of the compiler. ++ ++ The prefix specified by the `-B' option, if any, is tried before ++ the default prefix. After the default prefix, if the executable is ++ not found that way, `/usr/lib/gcc-' is tried next; then the ++ directories in your search path for shell commands are searched. ++ ++`STANDARD_STARTFILE_PREFIX' ++ Define this macro as a C string constant if you wish to override ++ the standard choice of `/usr/local/lib/' as the default prefix to ++ try when searching for startup files such as `crt0.o'. ++ ++ In this search, all the prefixes tried for executable files are ++ tried first. Then comes the default startfile prefix specified by ++ this macro, followed by the prefixes `/lib/' and `/usr/lib/' as ++ last resorts. ++ ++`ASM_FILE_START (STREAM)' ++ A C expression which outputs to the stdio stream STREAM some ++ appropriate text to go at the start of an assembler file. ++ ++ Normally this macro is defined to output a line containing ++ `#NO_APP', which is a comment that has no effect on most ++ assemblers but tells the GNU assembler that it can save time by not ++ checking for certain assembler constructs. ++ ++ On systems that use SDB, it is necessary to output certain ++ commands; see `tm-attasm.h'. ++ ++`ASM_FILE_END (STREAM)' ++ A C expression which outputs to the stdio stream STREAM some ++ appropriate text to go at the end of an assembler file. ++ ++ If this macro is not defined, the default is to output nothing ++ special at the end of the file. Most systems don't require any ++ definition. ++ ++ On systems that use SDB, it is necessary to output certain ++ commands; see `tm-attasm.h'. ++ ++`ASM_IDENTIFY_GCC (FILE)' ++ A C statement to output assembler commands which will identify the ++ object file as having been compiled with GNU CC (or another GNU ++ compiler). ++ ++ If you don't define this macro, the string `gcc_compiled.:' is ++ output. This string is calculated to define a symbol which, on ++ BSD systems, will never be defined for any other reason. GDB ++ checks for the presence of this symbol when reading the symbol ++ table of an executable. ++ ++ On non-BSD systems, you must arrange communication with GDB in ++ some other fashion. If GDB is not used on your system, you can ++ define this macro with an empty body. ++ ++`ASM_APP_ON' ++ A C string constant for text to be output before each `asm' ++ statement or group of consecutive ones. Normally this is ++ `"#APP"', which is a comment that has no effect on most assemblers ++ but tells the GNU assembler that it must check the lines that ++ follow for all valid assembler constructs. ++ ++`ASM_APP_OFF' ++ A C string constant for text to be output after each `asm' ++ statement or group of consecutive ones. Normally this is ++ `"#NO_APP"', which tells the GNU assembler to resume making the ++ time-saving assumptions that are valid for ordinary compiler ++ output. ++ ++`TEXT_SECTION_ASM_OP' ++ A C string constant for the assembler operation that should precede ++ instructions and read-only data. Normally `".text"' is right. ++ ++`DATA_SECTION_ASM_OP' ++ A C string constant for the assembler operation to identify the ++ following data as writable initialized data. Normally `".data"' ++ is right. ++ ++`EXTRA_SECTIONS' ++ A list of names for sections other than the standard two, which are ++ `in_text' and `in_data'. You need not define this macro on a ++ system with no other sections (that GCC needs to use). ++ ++`EXTRA_SECTION_FUNCTIONS' ++ One or more functions to be defined in `varasm.c'. These ++ functions should do jobs analogous to those of `text_section' and ++ `data_section', for your additional sections. Do not define this ++ macro if you do not define `EXTRA_SECTIONS'. ++ ++`SELECT_SECTION (EXP)' ++ A C statement or statements to switch to the appropriate section ++ for output of EXP. You can assume that EXP is either a `VAR_DECL' ++ node or a constant of some sort. Select the section by calling ++ `text_section' or one of the alternatives for other sections. ++ ++ Do not define this macro if you use only the standard two sections ++ and put all read-only variables and constants in the text section. ++ ++`SELECT_RTX_SECTION (MODE, RTX)' ++ A C statement or statements to switch to the appropriate section ++ for output of RTX in mode MODE. You can assume that RTX is some ++ kind of constant in RTL. The argument MODE is redundant except in ++ the case of a `const_int' rtx. Select the section by calling ++ `text_section' or one of the alternatives for other sections. ++ ++ Do not define this macro if you use only the standard two sections ++ and put all constants in the text section. ++ ++`REGISTER_NAMES' ++ A C initializer containing the assembler's names for the machine ++ registers, each one as a C string constant. This is what ++ translates register numbers in the compiler into assembler ++ language. ++ ++`DBX_REGISTER_NUMBER (REGNO)' ++ A C expression that returns the DBX register number for the ++ compiler register number REGNO. In simple cases, the value of this ++ expression may be REGNO itself. But sometimes there are some ++ registers that the compiler knows about and DBX does not, or vice ++ versa. In such cases, some register may need to have one number in ++ the compiler and another for DBX. ++ ++`DBX_DEBUGGING_INFO' ++ Define this macro if GNU CC should produce debugging output for DBX ++ in response to the `-g' option. ++ ++`SDB_DEBUGGING_INFO' ++ Define this macro if GNU CC should produce debugging output for SDB ++ in response to the `-g' option. ++ ++`PUT_SDB_OP' ++ Define these macros to override the assembler syntax for the ++ special SDB assembler directives. See `sdbout.c' for a list of ++ these macros and their arguments. If the standard syntax is used, ++ you need not define them yourself. ++ ++`SDB_GENERATE_FAKE' ++ Define this macro to override the usual method of constructing a ++ dummy name for anonymous structure and union types. See ++ `sdbout.c' for more information. ++ ++`DBX_NO_XREFS' ++ Define this macro if DBX on your system does not support the ++ construct `xsTAGNAME'. On some systems, this construct is used to ++ describe a forward reference to a structure named TAGNAME. On ++ other systems, this construct is not supported at all. ++ ++`DBX_CONTIN_LENGTH' ++ A symbol name in DBX-format debugging information is normally ++ continued (split into two separate `.stabs' directives) when it ++ exceeds a certain length (by default, 80 characters). On some ++ operating systems, DBX requires this splitting; on others, ++ splitting must not be done. You can inhibit splitting by defining ++ this macro with the value zero. You can override the default ++ splitting-length by defining this macro as an expression for the ++ length you desire. ++ ++`DBX_CONTIN_CHAR' ++ Normally continuation is indicated by adding a `\' character to ++ the end of a `.stabs' string when a continuation follows. To use ++ a different character instead, define this macro as a character ++ constant for the character you want to use. Do not define this ++ macro if backslash is correct for your system. ++ ++`DBX_STATIC_STAB_DATA_SECTION' ++ Define this macro if it is necessary to go to the data section ++ before outputting the `.stabs' pseudo-op for a non-global static ++ variable. ++ ++`ASM_OUTPUT_LABEL (STREAM, NAME)' ++ A C statement (sans semicolon) to output to the stdio stream ++ STREAM the assembler definition of a label named NAME. Use the ++ expression `assemble_name (STREAM, NAME)' to output the name ++ itself; before and after that, output the additional assembler ++ syntax for defining the name, and a newline. ++ ++`ASM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL)' ++ A C statement (sans semicolon) to output to the stdio stream ++ STREAM any text necessary for declaring the name NAME of a ++ function which is being defined. This macro is responsible for ++ outputting the label definition (perhaps using ++ `ASM_OUTPUT_LABEL'). The argument DECL is the `FUNCTION_DECL' ++ tree node representing the function. ++ ++ If this macro is not defined, then the function name is defined in ++ the usual manner as a label (by means of `ASM_OUTPUT_LABEL'). ++ ++`ASM_GLOBALIZE_LABEL (STREAM, NAME)' ++ A C statement (sans semicolon) to output to the stdio stream ++ STREAM some commands that will make the label NAME global; that ++ is, available for reference from other files. Use the expression ++ `assemble_name (STREAM, NAME)' to output the name itself; before ++ and after that, output the additional assembler syntax for making ++ that name global, and a newline. ++ ++`ASM_OUTPUT_EXTERNAL (STREAM, DECL, NAME)' ++ A C statement (sans semicolon) to output to the stdio stream ++ STREAM any text necessary for declaring the name of an external ++ symbol named NAME which is referenced in this compilation but not ++ defined. The value of DECL is the tree node for the declaration. ++ ++ This macro need not be defined if it does not need to output ++ anything. The GNU assembler and most Unix assemblers don't require ++ anything. ++ ++`ASM_OUTPUT_LABELREF (STREAM, NAME)' ++ A C statement to output to the stdio stream STREAM a reference in ++ assembler syntax to a label named NAME. The character `_' should ++ be added to the front of the name, if that is customary on your ++ operating system, as it is in most Berkeley Unix systems. This ++ macro is used in `assemble_name'. ++ ++`ASM_GENERATE_INTERNAL_LABEL (STRING, PREFIX, NUM)' ++ A C statement to store into the string STRING a label whose name ++ is made from the string PREFIX and the number NUM. ++ ++ This string, when output subsequently by `ASM_OUTPUT_LABELREF', ++ should produce the same output that `ASM_OUTPUT_INTERNAL_LABEL' ++ would produce with the same PREFIX and NUM. ++ ++`ASM_OUTPUT_INTERNAL_LABEL (STREAM, PREFIX, NUM)' ++ A C statement to output to the stdio stream STREAM a label whose ++ name is made from the string PREFIX and the number NUM. These ++ labels are used for internal purposes, and there is no reason for ++ them to appear in the symbol table of the object file. On many ++ systems, the letter `L' at the beginning of a label has this ++ effect. The usual definition of this macro is as follows: ++ ++ fprintf (STREAM, "L%s%d:\n", PREFIX, NUM) ++ ++`ASM_OUTPUT_CASE_LABEL (STREAM, PREFIX, NUM, TABLE)' ++ Define this if the label before a jump-table needs to be output ++ specially. The first three arguments are the same as for ++ `ASM_OUTPUT_INTERNAL_LABEL'; the fourth argument is the jump-table ++ which follows (a `jump_insn' containing an `addr_vec' or ++ `addr_diff_vec'). ++ ++ This feature is used on system V to output a `swbeg' statement for ++ the table. ++ ++ If this macro is not defined, these labels are output with ++ `ASM_OUTPUT_INTERNAL_LABEL'. ++ ++`ASM_OUTPUT_CASE_END (STREAM, NUM, TABLE)' ++ Define this if something special must be output at the end of a ++ jump-table. The definition should be a C statement to be executed ++ after the assembler code for the table is written. It should write ++ the appropriate code to stdio stream STREAM. The argument TABLE ++ is the jump-table insn, and NUM is the label-number of the ++ preceding label. ++ ++ If this macro is not defined, nothing special is output at the end ++ of the jump-table. ++ ++`ASM_OUTPUT_ALIGN_CODE (FILE)' ++ A C expression to output text to align the location counter in the ++ way that is desirable at a point in the code that is reached only ++ by jumping. ++ ++ This macro need not be defined if you don't want any special ++ alignment to be done at such a time. Most machine descriptions do ++ not currently define the macro. ++ ++`ASM_FORMAT_PRIVATE_NAME (OUTVAR, NAME, NUMBER)' ++ A C expression to assign to OUTVAR (which is a variable of type ++ `char *') a newly allocated string made from the string NAME and ++ the number NUMBER, with some suitable punctuation added. Use ++ `alloca' to get space for the string. ++ ++ This string will be used as the argument to `ASM_OUTPUT_LABELREF' ++ to produce an assembler label for an internal static variable whose ++ name is NAME. Therefore, the string must be such as to result in ++ valid assembler code. The argument NUMBER is different each time ++ this macro is executed; it prevents conflicts between ++ similarly-named internal static variables in different scopes. ++ ++ Ideally this string should not be a valid C identifier, to prevent ++ any conflict with the user's own symbols. Most assemblers allow ++ periods or percent signs in assembler symbols; putting at least ++ one of these between the name and the number will suffice. ++ ++`ASM_OUTPUT_REG_PUSH (STREAM, REGNO)' ++ A C expression to output to STREAM some assembler code which will ++ push hard register number REGNO onto the stack. The code need not ++ be optimal, since this macro is used only when profiling. ++ ++`ASM_OUTPUT_REG_POP (STREAM, REGNO)' ++ A C expression to output to STREAM some assembler code which will ++ pop hard register number REGNO off of the stack. The code need not ++ be optimal, since this macro is used only when profiling. ++ ++`ASM_OUTPUT_ADDR_DIFF_ELT (STREAM, VALUE, REL)' ++ This macro should be provided on machines where the addresses in a ++ dispatch table are relative to the table's own address. ++ ++ The definition should be a C statement to output to the stdio ++ stream STREAM an assembler pseudo-instruction to generate a ++ difference between two labels. VALUE and REL are the numbers of ++ two internal labels. The definitions of these labels are output ++ using `ASM_OUTPUT_INTERNAL_LABEL', and they must be printed in the ++ same way here. For example, ++ ++ fprintf (STREAM, "\t.word L%d-L%d\n", ++ VALUE, REL) ++ ++`ASM_OUTPUT_ADDR_VEC_ELT (STREAM, VALUE)' ++ This macro should be provided on machines where the addresses in a ++ dispatch table are absolute. ++ ++ The definition should be a C statement to output to the stdio ++ stream STREAM an assembler pseudo-instruction to generate a ++ reference to a label. VALUE is the number of an internal label ++ whose definition is output using `ASM_OUTPUT_INTERNAL_LABEL'. For ++ example, ++ ++ fprintf (STREAM, "\t.word L%d\n", VALUE) ++ ++`ASM_OUTPUT_DOUBLE (STREAM, VALUE)' ++ A C statement to output to the stdio stream STREAM an assembler ++ instruction to assemble a `double' constant whose value is VALUE. ++ VALUE will be a C expression of type `double'. ++ ++`ASM_OUTPUT_FLOAT (STREAM, VALUE)' ++ A C statement to output to the stdio stream STREAM an assembler ++ instruction to assemble a `float' constant whose value is VALUE. ++ VALUE will be a C expression of type `float'. ++ ++`ASM_OUTPUT_INT (STREAM, EXP)' ++`ASM_OUTPUT_SHORT (STREAM, EXP)' ++`ASM_OUTPUT_CHAR (STREAM, EXP)' ++ A C statement to output to the stdio stream STREAM an assembler ++ instruction to assemble a `int', `short' or `char' constant whose ++ value is VALUE. The argument EXP will be an RTL expression which ++ represents a constant value. Use `output_addr_const (STREAM, ++ EXP)' to output this value as an assembler expression. ++ ++`ASM_OUTPUT_DOUBLE_INT (STREAM, EXP)' ++ A C statement to output to the stdio stream STREAM an assembler ++ instruction to assemble a `long long' constant whose value is EXP. ++ The argument EXP will be an RTL expression which represents a ++ constant value. It may be a `const_double' RTX, or it may be an ++ ordinary single-precision constant. In the latter case, you ++ should zero-extend it. ++ ++`ASM_OUTPUT_BYTE (STREAM, VALUE)' ++ A C statement to output to the stdio stream STREAM an assembler ++ instruction to assemble a single byte containing the number VALUE. ++ ++`ASM_OUTPUT_ASCII (STREAM, PTR, LEN)' ++ A C statement to output to the stdio stream STREAM an assembler ++ instruction to assemble a string constant containing the LEN bytes ++ at PTR. PTR will be a C expression of type `char *' and LEN a C ++ expression of type `int'. ++ ++ If the assembler has a `.ascii' pseudo-op as found in the Berkeley ++ Unix assembler, do not define the macro `ASM_OUTPUT_ASCII'. ++ ++`ASM_OUTPUT_SKIP (STREAM, NBYTES)' ++ A C statement to output to the stdio stream STREAM an assembler ++ instruction to advance the location counter by NBYTES bytes. ++ NBYTES will be a C expression of type `int'. ++ ++`ASM_OUTPUT_ALIGN (STREAM, POWER)' ++ A C statement to output to the stdio stream STREAM an assembler ++ instruction to advance the location counter to a multiple of 2 to ++ the POWER bytes. POWER will be a C expression of type `int'. ++ ++`ASM_OUTPUT_COMMON (STREAM, NAME, SIZE, ROUNDED)' ++ A C statement (sans semicolon) to output to the stdio stream ++ STREAM the assembler definition of a common-label named NAME whose ++ size is SIZE bytes. The variable ROUNDED is the size rounded up ++ to whatever alignment the caller wants. ++ ++ Use the expression `assemble_name (STREAM, NAME)' to output the ++ name itself; before and after that, output the additional ++ assembler syntax for defining the name, and a newline. ++ ++ This macro controls how the assembler definitions of uninitialized ++ global variables are output. ++ ++`ASM_OUTPUT_LOCAL (STREAM, NAME, SIZE, ROUNDED)' ++ A C statement (sans semicolon) to output to the stdio stream ++ STREAM the assembler definition of a local-common-label named NAME ++ whose size is SIZE bytes. The variable ROUNDED is the size ++ rounded up to whatever alignment the caller wants. ++ ++ Use the expression `assemble_name (STREAM, NAME)' to output the ++ name itself; before and after that, output the additional ++ assembler syntax for defining the name, and a newline. ++ ++ This macro controls how the assembler definitions of uninitialized ++ static variables are output. ++ ++`ASM_OUTPUT_SOURCE_FILENAME (STREAM, NAME)' ++ A C statment to output DBX or SDB debugging information which ++ indicates that filename NAME is the current source file to the ++ stdio stream STREAM. ++ ++ This macro need not be defined if the standard form of debugging ++ information for the debugger in use is appropriate. ++ ++`ASM_OUTPUT_SOURCE_LINE (STREAM, LINE)' ++ A C statment to output DBX or SDB debugging information before code ++ for line number LINE of the current source file to the stdio ++ stream STREAM. ++ ++ This macro need not be defined if the standard form of debugging ++ information for the debugger in use is appropriate. ++ ++`ASM_OUTPUT_IDENT (STREAM, STRING)' ++ A C statement to output something to the assembler file to handle a ++ `#ident' directive containing the text STRING. If this macro is ++ not defined, nothing is output for a `#ident' directive. ++ ++`TARGET_BELL' ++ A C constant expression for the integer value for escape sequence ++ `\a'. ++ ++`TARGET_BS' ++`TARGET_TAB' ++`TARGET_NEWLINE' ++ C constant expressions for the integer values for escape sequences ++ `\b', `\t' and `\n'. ++ ++`TARGET_VT' ++`TARGET_FF' ++`TARGET_CR' ++ C constant expressions for the integer values for escape sequences ++ `\v', `\f' and `\r'. ++ ++`ASM_OUTPUT_OPCODE (STREAM, PTR)' ++ Define this macro if you are using an unusual assembler that ++ requires different names for the machine instructions. ++ ++ The definition is a C statement or statements which output an ++ assembler instruction opcode to the stdio stream STREAM. The ++ macro-operand PTR is a variable of type `char *' which points to ++ the opcode name in its "internal" form--the form that is written ++ in the machine description. The definition should output the ++ opcode name to STREAM, performing any translation you desire, and ++ increment the variable PTR to point at the end of the opcode so ++ that it will not be output twice. ++ ++ In fact, your macro definition may process less than the entire ++ opcode name, or more than the opcode name; but if you want to ++ process text that includes `%'-sequences to substitute operands, ++ you must take care of the substitution yourself. Just be sure to ++ increment PTR over whatever text should not be output normally. ++ ++ If you need to look at the operand values, they can be found as the ++ elements of `recog_operand'. ++ ++ If the macro definition does nothing, the instruction is output in ++ the usual way. ++ ++`FINAL_PRESCAN_INSN (INSN, OPVEC, NOPERANDS)' ++ If defined, a C statement to be executed just prior to the output ++ of assembler code for INSN, to modify the extracted operands so ++ they will be output differently. ++ ++ Here the argument OPVEC is the vector containing the operands ++ extracted from INSN, and NOPERANDS is the number of elements of ++ the vector which contain meaningful data for this insn. The ++ contents of this vector are what will be used to convert the insn ++ template into assembler code, so you can change the assembler ++ output by changing the contents of the vector. ++ ++ This macro is useful when various assembler syntaxes share a single ++ file of instruction patterns; by defining this macro differently, ++ you can cause a large class of instructions to be output ++ differently (such as with rearranged operands). Naturally, ++ variations in assembler syntax affecting individual insn patterns ++ ought to be handled by writing conditional output routines in ++ those patterns. ++ ++ If this macro is not defined, it is equivalent to a null statement. ++ ++`PRINT_OPERAND (STREAM, X, CODE)' ++ A C compound statement to output to stdio stream STREAM the ++ assembler syntax for an instruction operand X. X is an RTL ++ expression. ++ ++ CODE is a value that can be used to specify one of several ways of ++ printing the operand. It is used when identical operands must be ++ printed differently depending on the context. CODE comes from the ++ `%' specification that was used to request printing of the ++ operand. If the specification was just `%DIGIT' then CODE is 0; ++ if the specification was `%LTR DIGIT' then CODE is the ASCII code ++ for LTR. ++ ++ If X is a register, this macro should print the register's name. ++ The names can be found in an array `reg_names' whose type is `char ++ *[]'. `reg_names' is initialized from `REGISTER_NAMES'. ++ ++ When the machine description has a specification `%PUNCT' (a `%' ++ followed by a punctuation character), this macro is called with a ++ null pointer for X and the punctuation character for CODE. ++ ++`PRINT_OPERAND_PUNCT_VALID_P (CODE)' ++ A C expression which evaluates to true if CODE is a valid ++ punctuation character for use in the `PRINT_OPERAND' macro. If ++ `PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no ++ punctuation characters (except for the standard one, `%') are used ++ in this way. ++ ++`PRINT_OPERAND_ADDRESS (STREAM, X)' ++ A C compound statement to output to stdio stream STREAM the ++ assembler syntax for an instruction operand that is a memory ++ reference whose address is X. X is an RTL expression. ++ ++`ASM_OPEN_PAREN' ++`ASM_CLOSE_PAREN' ++ These macros are defined as C string constant, describing the ++ syntax in the assembler for grouping arithmetic expressions. The ++ following definitions are correct for most assemblers: ++ ++ #define ASM_OPEN_PAREN "(" ++ #define ASM_CLOSE_PAREN ")" ++ ++ +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-11 alliance/genview/src/gcc-1.42/gcc.info-11 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-11 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-11 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,74 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Config, Prev: Machine Macros, Up: Top ++ ++The Configuration File ++********************** ++ ++ The configuration file `xm-MACHINE.h' contains macro definitions ++that describe the machine and system on which the compiler is running. ++Most of the values in it are actually the same on all machines that GNU ++CC runs on, so large parts of all configuration files are identical. ++But there are some macros that vary: ++ ++`FAILURE_EXIT_CODE' ++ A C expression for the status code to be returned when the compiler ++ exits after serious errors. ++ ++`SUCCESS_EXIT_CODE' ++ A C expression for the status code to be returned when the compiler ++ exits without serious errors. ++ ++`USE_C_ALLOCA' ++ Define this macro to indicate that the compiler is running with the ++ `alloca' implemented in C. This version of `alloca' can be found ++ in the file `alloca.c'; to use it, you must also alter the ++ `Makefile' variable `ALLOCA'. ++ ++ This macro, unlike most, describes the machine that the compiler is ++ running on, rather than the one the compiler is compiling for. ++ Therefore, it should be set in the `xm-MACHINE.h' file rather than ++ in the `tm-MACHINE.h' file. ++ ++ If you do define this macro, you should probably do it as follows: ++ ++ #ifndef __GNUC__ ++ #define USE_C_ALLOCA ++ #else ++ #define alloca __builtin_alloca ++ #endif ++ ++ so that when the compiler is compiled with GNU CC it uses the more ++ efficient built-in `alloca' function. ++ ++ In addition, configuration files for system V define `bcopy', ++`bzero' and `bcmp' as aliases. Some files define `alloca' as a macro ++when compiled with GNU CC, in order to take advantage of the benefit of ++GNU CC's built-in `alloca'. ++ ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-2 alliance/genview/src/gcc-1.42/gcc.info-2 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-2 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-2 2002-04-11 09:14:44.000000000 +0200 +@@ -0,0 +1,900 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Options, Next: Installation, Prev: Boycott, Up: Top ++ ++GNU CC Command Options ++********************** ++ ++ The GNU C compiler uses a command syntax much like the Unix C ++compiler. The `gcc' program accepts options and file names as operands. ++Multiple single-letter options may *not* be grouped: `-dr' is very ++different from `-d -r'. ++ ++ When you invoke GNU CC, it normally does preprocessing, compilation, ++assembly and linking. File names which end in `.c' are taken as C ++source to be preprocessed and compiled; file names ending in `.i' are ++taken as preprocessor output to be compiled; compiler output files plus ++any input files with names ending in `.s' are assembled; then the ++resulting object files, plus any other input files, are linked together ++to produce an executable. ++ ++ Command options allow you to stop this process at an intermediate ++stage. For example, the `-c' option says not to run the linker. Then ++the output consists of object files output by the assembler. ++ ++ Other command options are passed on to one stage of processing. Some ++options control the preprocessor and others the compiler itself. Yet ++other options control the assembler and linker; these are not documented ++here, but you rarely need to use any of them. ++ ++ Here are the options to control the overall compilation process, ++including those that say whether to link, whether to assemble, and so ++on. ++ ++`-o FILE' ++ Place output in file FILE. This applies regardless to whatever ++ sort of output is being produced, whether it be an executable file, ++ an object file, an assembler file or preprocessed C code. ++ ++ If `-o' is not specified, the default is to put an executable file ++ in `a.out', the object file `SOURCE.c' in `SOURCE.o', an assembler ++ file in `SOURCE.s', and preprocessed C on standard output. ++ ++`-c' ++ Compile or assemble the source files, but do not link. Produce ++ object files with names made by replacing `.c' or `.s' with `.o' ++ at the end of the input file names. Do nothing at all for object ++ files specified as input. ++ ++`-S' ++ Compile into assembler code but do not assemble. The assembler ++ output file name is made by replacing `.c' with `.s' at the end of ++ the input file name. Do nothing at all for assembler source files ++ or object files specified as input. ++ ++`-E' ++ Run only the C preprocessor. Preprocess all the C source files ++ specified and output the results to standard output. ++ ++`-v' ++ Compiler driver program prints the commands it executes as it runs ++ the preprocessor, compiler proper, assembler and linker. Some of ++ these are directed to print their own version numbers. ++ ++`-pipe' ++ Use pipes rather than temporary files for communication between the ++ various stages of compilation. This fails to work on some systems ++ where the assembler is unable to read from a pipe; but the GNU ++ assembler has no trouble. ++ ++`-BPREFIX' ++ Compiler driver program tries PREFIX as a prefix for each program ++ it tries to run. These programs are `cpp', `cc1', `as' and `ld'. ++ ++ For each subprogram to be run, the compiler driver first tries the ++ `-B' prefix, if any. If that name is not found, or if `-B' was ++ not specified, the driver tries two standard prefixes, which are ++ `/usr/lib/gcc-' and `/usr/local/lib/gcc-'. If neither of those ++ results in a file name that is found, the unmodified program name ++ is searched for using the directories specified in your `PATH' ++ environment variable. ++ ++ The run-time support file `gnulib' is also searched for using the ++ `-B' prefix, if needed. If it is not found there, the two ++ standard prefixes above are tried, and that is all. The file is ++ left out of the link if it is not found by those means. Most of ++ the time, on most machines, you can do without it. ++ ++ You can get a similar result from the environment variable; ++ `GCC_EXEC_PREFIX' if it is defined, its value is used as a prefix ++ in the same way. If both the `-B' option and the ++ `GCC_EXEC_PREFIX' variable are present, the `-B' option is used ++ first and the environment variable value second. ++ ++`-bPREFIX' ++ The argument PREFIX is used as a second prefix for the compiler ++ executables and libraries. This prefix is optional: the compiler ++ tries each file first with it, then without it. This prefix ++ follows the prefix specified with `-B' or the default prefixes. ++ ++ Thus, `-bvax- -Bcc/' in the presence of environment variable ++ `GCC_EXEC_PREFIX' with definition `/u/foo/' causes GNU CC to try ++ the following file names for the preprocessor executable: ++ ++ cc/vax-cpp ++ cc/cpp ++ /u/foo/vax-cpp ++ /u/foo/cpp ++ /usr/local/lib/gcc-vax-cpp ++ /usr/local/lib/gcc-cpp ++ /usr/lib/gcc-vax-cpp ++ /usr/lib/gcc-cpp ++ ++ These options control the details of C compilation itself. ++ ++`-ansi' ++ Support all ANSI standard C programs. ++ ++ This turns off certain features of GNU C that are incompatible with ++ ANSI C, such as the `asm', `inline' and `typeof' keywords, and ++ predefined macros such as `unix' and `vax' that identify the type ++ of system you are using. It also enables the undesirable and ++ rarely used ANSI trigraph feature. ++ ++ The alternate keywords `__asm__', `__inline__' and `__typeof__' ++ continue to work despite `-ansi'. You would not want to use them ++ in an ANSI C program, of course, but it useful to put them in ++ header files that might be included in compilations done with ++ `-ansi'. Alternate predefined macros such as `__unix__' and ++ `__vax__' are also available, with or without `-ansi'. ++ ++ The `-ansi' option does not cause non-ANSI programs to be rejected ++ gratuitously. For that, `-pedantic' is required in addition to ++ `-ansi'. ++ ++ The macro `__STRICT_ANSI__' is predefined when the `-ansi' option ++ is used. Some header files may notice this macro and refrain from ++ declaring certain functions or defining certain macros that the ++ ANSI standard doesn't call for; this is to avoid interfering with ++ any programs that might use these names for other things. ++ ++`-traditional' ++ Attempt to support some aspects of traditional C compilers. ++ Specifically: ++ ++ * All `extern' declarations take effect globally even if they ++ are written inside of a function definition. This includes ++ implicit declarations of functions. ++ ++ * The keywords `typeof', `inline', `signed', `const' and ++ `volatile' are not recognized. (You can still use the ++ alternative keywords such as `__typeof__', `__inline__', and ++ so on.) ++ ++ * Comparisons between pointers and integers are always allowed. ++ ++ * Integer types `unsigned short' and `unsigned char' promote to ++ `unsigned int'. ++ ++ * Out-of-range floating point literals are not an error. ++ ++ * String "constants" are not necessarily constant; they are ++ stored in writable space, and identical looking constants are ++ allocated separately. ++ ++ * All automatic variables not declared `register' are preserved ++ by `longjmp'. Ordinarily, GNU C follows ANSI C: automatic ++ variables not declared `volatile' may be clobbered. ++ ++ * In the preprocessor, comments convert to nothing at all, ++ rather than to a space. This allows traditional token ++ concatenation. ++ ++ * In the preprocessor, macro arguments are recognized within ++ string constants in a macro definition (and their values are ++ stringified, though without additional quote marks, when they ++ appear in such a context). The preprocessor always considers ++ a string constant to end at a newline. ++ ++ * The predefined macro `__STDC__' is not defined when you use ++ `-traditional', but `__GNUC__' is (since the GNU extensions ++ which `__GNUC__' indicates are not affected by ++ `-traditional'). If you need to write header files that work ++ differently depending on whether `-traditional' is in use, by ++ testing both of these predefined macros you can distinguish ++ four situations: GNU C, traditional GNU C, other ANSI C ++ compilers, and other old C compilers. ++ ++`-O' ++ Optimize. Optimizing compilation takes somewhat more time, and a ++ lot more memory for a large function. ++ ++ Without `-O', the compiler's goal is to reduce the cost of ++ compilation and to make debugging produce the expected results. ++ Statements are independent: if you stop the program with a ++ breakpoint between statements, you can then assign a new value to ++ any variable or change the program counter to any other statement ++ in the function and get exactly the results you would expect from ++ the source code. ++ ++ Without `-O', only variables declared `register' are allocated in ++ registers. The resulting compiled code is a little worse than ++ produced by PCC without `-O'. ++ ++ With `-O', the compiler tries to reduce code size and execution ++ time. ++ ++ Some of the `-f' options described below turn specific kinds of ++ optimization on or off. ++ ++`-g' ++ Produce debugging information in the operating system's native ++ format (for DBX or SDB). GDB also can work with this debugging ++ information. ++ ++ Unlike most other C compilers, GNU CC allows you to use `-g' with ++ `-O'. The shortcuts taken by optimized code may occasionally ++ produce surprising results: some variables you declared may not ++ exist at all; flow of control may briefly move where you did not ++ expect it; some statements may not be executed because they ++ compute constant results or their values were already at hand; ++ some statements may execute in different places because they were ++ moved out of loops. Nevertheless it proves possible to debug ++ optimized output. This makes it reasonable to use the optimizer ++ for programs that might have bugs. ++ ++`-gg' ++ Produce debugging information in the old GDB format. This is ++ obsolete. ++ ++`-w' ++ Inhibit all warning messages. ++ ++`-W' ++ Print extra warning messages for these events: ++ ++ * An automatic variable is used without first being initialized. ++ ++ These warnings are possible only in optimizing compilation, ++ because they require data flow information that is computed ++ only when optimizing. If you don't specify `-O', you simply ++ won't get these warnings. ++ ++ These warnings occur only for variables that are candidates ++ for register allocation. Therefore, they do not occur for a ++ variable that is declared `volatile', or whose address is ++ taken, or whose size is other than 1, 2, 4 or 8 bytes. Also, ++ they do not occur for structures, unions or arrays, even when ++ they are in registers. ++ ++ Note that there may be no warning about a variable that is ++ used only to compute a value that itself is never used, ++ because such computations may be deleted by data flow ++ analysis before the warnings are printed. ++ ++ These warnings are made optional because GNU CC is not smart ++ enough to see all the reasons why the code might be correct ++ despite appearing to have an error. Here is one example of ++ how this can happen: ++ ++ { ++ int x; ++ switch (y) ++ { ++ case 1: x = 1; ++ break; ++ case 2: x = 4; ++ break; ++ case 3: x = 5; ++ } ++ foo (x); ++ } ++ ++ If the value of `y' is always 1, 2 or 3, then `x' is always ++ initialized, but GNU CC doesn't know this. Here is another ++ common case: ++ ++ { ++ int save_y; ++ if (change_y) save_y = y, y = new_y; ++ ... ++ if (change_y) y = save_y; ++ } ++ ++ This has no bug because `save_y' is used only if it is set. ++ ++ Some spurious warnings can be avoided if you declare as ++ `volatile' all the functions you use that never return. *Note ++ Function Attributes::. ++ ++ * A nonvolatile automatic variable might be changed by a call to ++ `longjmp'. These warnings as well are possible only in ++ optimizing compilation. ++ ++ The compiler sees only the calls to `setjmp'. It cannot know ++ where `longjmp' will be called; in fact, a signal handler ++ could call it at any point in the code. As a result, you may ++ get a warning even when there is in fact no problem because ++ `longjmp' cannot in fact be called at the place which would ++ cause a problem. ++ ++ * A function can return either with or without a value. ++ (Falling off the end of the function body is considered ++ returning without a value.) For example, this function would ++ evoke such a warning: ++ ++ foo (a) ++ { ++ if (a > 0) ++ return a; ++ } ++ ++ Spurious warnings can occur because GNU CC does not realize ++ that certain functions (including `abort' and `longjmp') will ++ never return. ++ ++ * An expression-statement contains no side effects. ++ ++ In the future, other useful warnings may also be enabled by this ++ option. ++ ++`-Wimplicit' ++ Warn whenever a function is implicitly declared. ++ ++`-Wreturn-type' ++ Warn whenever a function is defined with a return-type that ++ defaults to `int'. Also warn about any `return' statement with no ++ return-value in a function whose return-type is not `void'. ++ ++`-Wunused' ++ Warn whenever a local variable is unused aside from its ++ declaration, whenever a function is declared static but never ++ defined, and whenever a statement computes a result that is ++ explicitly not used. ++ ++`-Wswitch' ++ Warn whenever a `switch' statement has an index of enumeral type ++ and lacks a `case' for one or more of the named codes of that ++ enumeration. (The presence of a `default' label prevents this ++ warning.) `case' labels outside the enumeration range also ++ provoke warnings when this option is used. ++ ++`-Wcomment' ++ Warn whenever a comment-start sequence `/*' appears in a comment. ++ ++`-Wtrigraphs' ++ Warn if any trigraphs are encountered (assuming they are enabled). ++ ++`-Wall' ++ All of the above `-W' options combined. These are all the options ++ which pertain to usage that we recommend avoiding and that we ++ believe is easy to avoid, even in conjunction with macros. ++ ++ The other `-W...' options below are not implied by `-Wall' because ++ certain kinds of useful macros are almost impossible to write ++ without causing those warnings. ++ ++`-Wshadow' ++ Warn whenever a local variable shadows another local variable. ++ ++`-Wid-clash-LEN' ++ Warn whenever two distinct identifiers match in the first LEN ++ characters. This may help you prepare a program that will compile ++ with certain obsolete, brain-damaged compilers. ++ ++`-Wpointer-arith' ++ Warn about anything that depends on the "size of" a function type ++ or of `void'. GNU C assigns these types a size of 1, for ++ convenience in calculations with `void *' pointers and pointers to ++ functions. ++ ++`-Wcast-qual' ++ Warn whenever a pointer is cast so as to remove a type qualifier ++ from the target type. For example, warn if a `const char *' is ++ cast to an ordinary `char *'. ++ ++`-Wwrite-strings' ++ Give string constants the type `const char[LENGTH]' so that ++ copying the address of one into a non-`const' `char *' pointer ++ will get a warning. These warnings will help you find at compile ++ time code that can try to write into a string constant, but only ++ if you have been very careful about using `const' in declarations ++ and prototypes. Otherwise, it will just be a nuisance; this is ++ why we did not make `-Wall' request these warnings. ++ ++`-p' ++ Generate extra code to write profile information suitable for the ++ analysis program `prof'. ++ ++`-pg' ++ Generate extra code to write profile information suitable for the ++ analysis program `gprof'. ++ ++`-a' ++ Generate extra code to write profile information for basic blocks, ++ which will record the number of times each basic block is ++ executed. This data could be analyzed by a program like `tcov'. ++ Note, however, that the format of the data is not what `tcov' ++ expects. Eventually GNU `gprof' should be extended to process ++ this data. ++ ++`-lLIBRARY' ++ Search a standard list of directories for a library named LIBRARY, ++ which is actually a file named `libLIBRARY.a'. The linker uses ++ this file as if it had been specified precisely by name. ++ ++ The directories searched include several standard system ++ directories plus any that you specify with `-L'. ++ ++ Normally the files found this way are library files--archive files ++ whose members are object files. The linker handles an archive ++ file by scanning through it for members which define symbols that ++ have so far been referenced but not defined. But if the file that ++ is found is an ordinary object file, it is linked in the usual ++ fashion. The only difference between using an `-l' option and ++ specifying a file name is that `-l' searches several directories. ++ ++`-LDIR' ++ Add directory DIR to the list of directories to be searched for ++ `-l'. ++ ++`-nostdlib' ++ Don't use the standard system libraries and startup files when ++ linking. Only the files you specify will be passed to the linker. ++ ++`-mMACHINESPEC' ++ Machine-dependent option specifying something about the type of ++ target machine. These options are defined by the macro ++ `TARGET_SWITCHES' in the machine description. The default for the ++ options is also defined by that macro, which enables you to change ++ the defaults. ++ ++ These are the `-m' options defined in the 68000 machine ++ description: ++ ++ `-m68020' ++ `-mc68020' ++ Generate output for a 68020 (rather than a 68000). This is ++ the default if you use the unmodified sources. ++ ++ `-m68000' ++ `-mc68000' ++ Generate output for a 68000 (rather than a 68020). ++ ++ `-m68881' ++ Generate output containing 68881 instructions for floating ++ point. This is the default if you use the unmodified sources. ++ ++ `-mfpa' ++ Generate output containing Sun FPA instructions for floating ++ point. ++ ++ `-msoft-float' ++ Generate output containing library calls for floating point. ++ ++ `-mshort' ++ Consider type `int' to be 16 bits wide, like `short int'. ++ ++ `-mnobitfield' ++ Do not use the bit-field instructions. `-m68000' implies ++ `-mnobitfield'. ++ ++ `-mbitfield' ++ Do use the bit-field instructions. `-m68020' implies ++ `-mbitfield'. This is the default if you use the unmodified ++ sources. ++ ++ `-mrtd' ++ Use a different function-calling convention, in which ++ functions that take a fixed number of arguments return with ++ the `rtd' instruction, which pops their arguments while ++ returning. This saves one instruction in the caller since ++ there is no need to pop the arguments there. ++ ++ This calling convention is incompatible with the one normally ++ used on Unix, so you cannot use it if you need to call ++ libraries compiled with the Unix compiler. ++ ++ Also, you must provide function prototypes for all functions ++ that take variable numbers of arguments (including `printf'); ++ otherwise incorrect code will be generated for calls to those ++ functions. ++ ++ In addition, seriously incorrect code will result if you call ++ a function with too many arguments. (Normally, extra ++ arguments are harmlessly ignored.) ++ ++ The `rtd' instruction is supported by the 68010 and 68020 ++ processors, but not by the 68000. ++ ++ These `-m' options are defined in the Vax machine description: ++ ++ `-munix' ++ Do not output certain jump instructions (`aobleq' and so on) ++ that the Unix assembler for the Vax cannot handle across long ++ ranges. ++ ++ `-mgnu' ++ Do output those jump instructions, on the assumption that you ++ will assemble with the GNU assembler. ++ ++ `-mg' ++ Output code for g-format floating point numbers instead of ++ d-format. ++ ++ These `-m' switches are supported on the Sparc: ++ ++ `-mfpu' ++ Generate output containing floating point instructions. This ++ is the default if you use the unmodified sources. ++ ++ `-mno-epilogue' ++ Generate separate return instructions for `return' statements. ++ This has both advantages and disadvantages; I don't recall ++ what they are. ++ ++ These `-m' options are defined in the Convex machine description: ++ ++ `-mc1' ++ Generate output for a C1. This is the default when the ++ compiler is configured for a C1. ++ ++ `-mc2' ++ Generate output for a C2. This is the default when the ++ compiler is configured for a C2. ++ ++ `-margcount' ++ Generate code which puts an argument count in the word ++ preceding each argument list. Some nonportable Convex and ++ Vax programs need this word. (Debuggers don't; this info is ++ in the symbol table.) ++ ++ `-mnoargcount' ++ Omit the argument count word. This is the default if you use ++ the unmodified sources. ++ ++`-fFLAG' ++ Specify machine-independent flags. Most flags have both positive ++ and negative forms; the negative form of `-ffoo' would be ++ `-fno-foo'. In the table below, only one of the forms is ++ listed--the one which is not the default. You can figure out the ++ other form by either removing `no-' or adding it. ++ ++ `-fpcc-struct-return' ++ Use the same convention for returning `struct' and `union' ++ values that is used by the usual C compiler on your system. ++ This convention is less efficient for small structures, and ++ on many machines it fails to be reentrant; but it has the ++ advantage of allowing intercallability between GCC-compiled ++ code and PCC-compiled code. ++ ++ `-ffloat-store' ++ Do not store floating-point variables in registers. This ++ prevents undesirable excess precision on machines such as the ++ 68000 where the floating registers (of the 68881) keep more ++ precision than a `double' is supposed to have. ++ ++ For most programs, the excess precision does only good, but a ++ few programs rely on the precise definition of IEEE floating ++ point. Use `-ffloat-store' for such programs. ++ ++ `-fno-asm' ++ Do not recognize `asm', `inline' or `typeof' as a keyword. ++ These words may then be used as identifiers. You can use ++ `__asm__', `__inline__' and `__typeof__' instead. ++ ++ `-fno-defer-pop' ++ Always pop the arguments to each function call as soon as that ++ function returns. Normally the compiler (when optimizing) ++ lets arguments accumulate on the stack for several function ++ calls and pops them all at once. ++ ++ `-fstrength-reduce' ++ Perform the optimizations of loop strength reduction and ++ elimination of iteration variables. ++ ++ `-fcombine-regs' ++ Allow the combine pass to combine an instruction that copies ++ one register into another. This might or might not produce ++ better code when used in addition to `-O'. I am interested in ++ hearing about the difference this makes. ++ ++ `-fforce-mem' ++ Force memory operands to be copied into registers before doing ++ arithmetic on them. This may produce better code by making ++ all memory references potential common subexpressions. When ++ they are not common subexpressions, instruction combination ++ should eliminate the separate register-load. I am interested ++ in hearing about the difference this makes. ++ ++ `-fforce-addr' ++ Force memory address constants to be copied into registers ++ before doing arithmetic on them. This may produce better ++ code just as `-fforce-mem' may. I am interested in hearing ++ about the difference this makes. ++ ++ `-fomit-frame-pointer' ++ Don't keep the frame pointer in a register for functions that ++ don't need one. This avoids the instructions to save, set up ++ and restore frame pointers; it also makes an extra register ++ available in many functions. *It also makes debugging ++ impossible.* ++ ++ On some machines, such as the Vax, this flag has no effect, ++ because the standard calling sequence automatically handles ++ the frame pointer and nothing is saved by pretending it ++ doesn't exist. The machine-description macro ++ `FRAME_POINTER_REQUIRED' controls whether a target machine ++ supports this flag. *Note Registers::. ++ ++ `-finline-functions' ++ Integrate all simple functions into their callers. The ++ compiler heuristically decides which functions are simple ++ enough to be worth integrating in this way. ++ ++ If all calls to a given function are integrated, and the ++ function is declared `static', then the function is normally ++ not output as assembler code in its own right. ++ ++ `-fcaller-saves' ++ Enable values to be allocated in registers that will be ++ clobbered by function calls, by emitting extra instructions ++ to save and restore the registers around such calls. Such ++ allocation is done only when it seems to result in better ++ code than would otherwise be produced. ++ ++ This option is enabled by default on certain machines, ++ usually those which have no call-preserved registers to use ++ instead. ++ ++ Don't use `-fcaller-saves' together with ++ `-fomit-frame-pointer'. This combination does not work. ++ ++ `-fkeep-inline-functions' ++ Even if all calls to a given function are integrated, and the ++ function is declared `static', nevertheless output a separate ++ run-time callable version of the function. ++ ++ `-fwritable-strings' ++ Store string constants in the writable data segment and don't ++ uniquize them. This is for compatibility with old programs ++ which assume they can write into string constants. ++ `-traditional' also has this effect. ++ ++ Writing into string constants is a very bad idea; "constants" ++ should be constant. ++ ++ `-fcond-mismatch' ++ Allow conditional expressions with mismatched types in the ++ second and third arguments. The value of such an expression ++ is void. ++ ++ `-fno-function-cse' ++ Do not put function addresses in registers; make each ++ instruction that calls a constant function contain the ++ function's address explicitly. ++ ++ This option results in less efficient code, but some strange ++ hacks that alter the assembler output may be confused by the ++ optimizations performed when this option is not used. ++ ++ `-fvolatile' ++ Consider all memory references through pointers to be ++ volatile. ++ ++ `-fshared-data' ++ Requests that the data and non-`const' variables of this ++ compilation be shared data rather than private data. The ++ distinction makes sense only on certain operating systems, ++ where shared data is shared between processes running the ++ same program, while private data exists in one copy per ++ process. ++ ++ `-funsigned-char' ++ Let the type `char' be the unsigned, like `unsigned char'. ++ ++ Each kind of machine has a default for what `char' should be. ++ It is either like `unsigned char' by default or like `signed ++ char' by default. (Actually, at present, the default is ++ always signed.) ++ ++ The type `char' is always a distinct type from either `signed ++ char' or `unsigned char', even though its behavior is always ++ just like one of those two. ++ ++ Note that this is equivalent to `-fno-signed-char', which is ++ the negative form of `-fsigned-char'. ++ ++ `-fsigned-char' ++ Let the type `char' be signed, like `signed char'. ++ ++ Note that this is equivalent to `-fno-unsigned-char', which is ++ the negative form of `-funsigned-char'. ++ ++ `-fdelayed-branch' ++ If supported for the target machine, attempt to reorder ++ instructions to exploit instruction slots available after ++ delayed branch instructions. ++ ++ `-ffixed-REG' ++ Treat the register named REG as a fixed register; generated ++ code should never refer to it (except perhaps as a stack ++ pointer, frame pointer or in some other fixed role). ++ ++ REG must be the name of a register. The register names ++ accepted are machine-specific and are defined in the ++ `REGISTER_NAMES' macro in the machine description macro file. ++ ++ This flag does not have a negative form, because it specifies ++ a three-way choice. ++ ++ `-fcall-used-REG' ++ Treat the register named REG as an allocatable register that ++ is clobbered by function calls. It may be allocated for ++ temporaries or variables that do not live across a call. ++ Functions compiled this way will not save and restore the ++ register REG. ++ ++ Use of this flag for a register that has a fixed pervasive ++ role in the machine's execution model, such as the stack ++ pointer or frame pointer, will produce disastrous results. ++ ++ This flag does not have a negative form, because it specifies ++ a three-way choice. ++ ++ `-fcall-saved-REG' ++ Treat the register named REG as an allocatable register saved ++ by functions. It may be allocated even for temporaries or ++ variables that live across a call. Functions compiled this ++ way will save and restore the register REG if they use it. ++ ++ Use of this flag for a register that has a fixed pervasive ++ role in the machine's execution model, such as the stack ++ pointer or frame pointer, will produce disastrous results. ++ ++ A different sort of disaster will result from the use of this ++ flag for a register in which function values may be returned. ++ ++ This flag does not have a negative form, because it specifies ++ a three-way choice. ++ ++`-dLETTERS' ++ Says to make debugging dumps at times specified by LETTERS. Here ++ are the possible letters: ++ ++ `r' ++ Dump after RTL generation. ++ ++ `j' ++ Dump after first jump optimization. ++ ++ `s' ++ Dump after CSE (including the jump optimization that sometimes ++ follows CSE). ++ ++ `L' ++ Dump after loop optimization. ++ ++ `f' ++ Dump after flow analysis. ++ ++ `c' ++ Dump after instruction combination. ++ ++ `l' ++ Dump after local register allocation. ++ ++ `g' ++ Dump after global register allocation. ++ ++ `d' ++ Dump after delayed branch scheduling. ++ ++ `J' ++ Dump after last jump optimization. ++ ++ `m' ++ Print statistics on memory usage, at the end of the run. ++ ++`-pedantic' ++ Issue all the warnings demanded by strict ANSI standard C; reject ++ all programs that use forbidden extensions. ++ ++ Valid ANSI standard C programs should compile properly with or ++ without this option (though a rare few will require `-ansi'). ++ However, without this option, certain GNU extensions and ++ traditional C features are supported as well. With this option, ++ they are rejected. There is no reason to use this option; it ++ exists only to satisfy pedants. ++ ++ `-pedantic' does not cause warning messages for use of the ++ alternate keywords whose names begin and end with `__'. *Note ++ Alternate Keywords::. ++ ++`-static' ++ On Suns running version 4, this prevents linking with the shared ++ libraries. (`-g' has the same effect.) ++ ++ These options control the C preprocessor, which is run on each C ++source file before actual compilation. If you use the `-E' option, ++nothing is done except C preprocessing. Some of these options make ++sense only together with `-E' because they request preprocessor output ++that is not suitable for actual compilation. ++ ++`-C' ++ Tell the preprocessor not to discard comments. Used with the `-E' ++ option. ++ ++`-IDIR' ++ Search directory DIR for include files. ++ ++`-I-' ++ Any directories specified with `-I' options before the `-I-' ++ option are searched only for the case of `#include "FILE"'; they ++ are not searched for `#include '. ++ ++ If additional directories are specified with `-I' options after ++ the `-I-', these directories are searched for all `#include' ++ directives. (Ordinarily *all* `-I' directories are used this way.) ++ ++ In addition, the `-I-' option inhibits the use of the current ++ directory (where the current input file came from) as the first ++ search directory for `#include "FILE"'. There is no way to ++ override this effect of `-I-'. With `-I.' you can specify ++ searching the directory which was current when the compiler was ++ invoked. That is not exactly the same as what the preprocessor ++ does by default, but it is often satisfactory. ++ ++ `-I-' does not inhibit the use of the standard system directories ++ for header files. Thus, `-I-' and `-nostdinc' are independent. ++ ++`-i FILE' ++ Process FILE as input, discarding the resulting output, before ++ processing the regular input file. Because the output generated ++ from FILE is discarded, the only effect of `-i FILE' is to make ++ the macros defined in FILE available for use in the main input. ++ ++`-nostdinc' ++ Do not search the standard system directories for header files. ++ Only the directories you have specified with `-I' options (and the ++ current directory, if appropriate) are searched. ++ ++ Between `-nostdinc' and `-I-', you can eliminate all directories ++ from the search path except those you specify. ++ ++`-M' ++ Tell the preprocessor to output a rule suitable for `make' ++ describing the dependencies of each object file. For each source ++ file, the preprocessor outputs one `make'-rule whose target is the ++ object file name for that source file and whose dependencies are ++ all the files `#include'd in it. This rule may be a single line ++ or may be continued with `\'-newline if it is long. ++ ++ `-M' implies `-E'. ++ ++`-MM' ++ Like `-M' but the output mentions only the user-header files ++ included with `#include "FILE"'. System header files included ++ with `#include ' are omitted. ++ ++ `-MM' implies `-E'. ++ ++`-DMACRO' ++ Define macro MACRO with the string `1' as its definition. ++ ++`-DMACRO=DEFN' ++ Define macro MACRO as DEFN. ++ ++`-UMACRO' ++ Undefine macro MACRO. ++ ++`-trigraphs' ++ Support ANSI C trigraphs. You don't want to know about this ++ brain-damage. The `-ansi' option also has this effect. ++ ++ +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-3 alliance/genview/src/gcc-1.42/gcc.info-3 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-3 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-3 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,1215 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Installation, Next: Trouble, Prev: Options, Up: Top ++ ++Installing GNU CC ++***************** ++ ++ Here is the procedure for installing GNU CC on a Unix system. ++ ++* Menu: ++ ++* Other Dir:: Compiling in a separate directory (not where the source is). ++* Sun Install:: See below for installation on the Sun. ++* 3B1 Install:: See below for installation on the 3B1. ++* SCO Install:: See below for installation on SCO System V 3.2. (Or ESIX.) ++* VMS Install:: See below for installation on VMS. ++* HPUX Install:: See below for installation on HPUX. ++* Tower Install:: See below for installation on an NCR Tower. ++ ++ 1. Edit `Makefile'. If you are using HPUX, or any form of system V, ++ you must make a few changes described in comments at the beginning ++ of the file. Genix requires changes also, and so does the Pyramid. ++ ++ 2. On a Sequent system, go to the Berkeley universe. ++ ++ 3. Choose configuration files. The easy way to do this is to run the ++ command file `config.gcc' with a single argument, which specifies ++ the type of machine (and in some cases which operating system). ++ ++ Here is a list of the possible arguments: ++ ++ `vax' ++ Vaxes running BSD. ++ ++ `vms' ++ Vaxes running VMS. ++ ++ `vax-sysv' ++ Vaxes running system V. ++ ++ `i386-sysv' ++ Intel 386 PCs running system V. ++ ++ `i386-sysv-gas' ++ Intel 386 PCs running system V, using the GNU assembler and ++ GNU linker. ++ ++ `i386-sysv4' ++ Intel 386 PCs running system V.4. You must run the shell ++ script `fixincludes-V4' in order for GNU CC to work properly. ++ You must also uncomment some lines in `Makefile'. ++ ++ `sequent-i386' ++ Sequent with Intel 386 processors. ++ ++ `i386-aix' ++ Intel 386 PCs or PS/2s running AIX. ++ ++ `sun2' ++ Sun 2 running system version 2 or 3. ++ ++ `sun3' ++ Sun 3 running system version 4, with 68881. Note there we do ++ not provide a configuration file to use an FPA by default, ++ because programs that establish signal handlers for floating ++ point traps inherently cannot work with the FPA. ++ ++ `sun3-nfp' ++ Sun 3 running system version 4, without 68881. ++ ++ `sun4' ++ Sun 4 running system version 4. *Note Incompatibilities::, ++ for calling convention incompatibilities on the Sun 4 (sparc). ++ ++ `sun2-os4' ++ Sun 2 running system version 4. ++ ++ `sun3-os3' ++ Sun 3 running system version 2 or 3, with 68881. ++ ++ `sun3-nfp-os3' ++ Sun 3 running system version 2 or 3, without 68881. ++ ++ `sun4-os3' ++ Sun 4 running system version 2 or 3. *Note ++ Incompatibilities::, for calling convention incompatibilities ++ on the Sun 4 (sparc). ++ ++ `sun386' ++ Sun 386 ("roadrunner"). ++ ++ `alliant' ++ Alliant FX/8 computer. Note that the standard installed C ++ compiler in Concentrix 5.0 has a bug which prevent it from ++ compiling GNU CC correctly. You can patch the compiler bug ++ as follows: ++ ++ cp /bin/pcc ./pcc ++ adb -w ./pcc - << EOF ++ 15f6?w 6610 ++ EOF ++ ++ Then you must use the `-ip12' option when compiling GNU CC ++ with the patched compiler, as shown here: ++ ++ make CC="./pcc -ip12" CFLAGS=-w ++ ++ Note also that Alliant's version of DBX does not manage to ++ work with the output from GNU CC. ++ ++ `tahoe' ++ The tahoe computer (running BSD, and using DBX). ++ ++ `decstation' ++ The DEC 3100 Mips machine ("pmax"). Note that GNU CC cannot ++ generate debugging information in the unusual format used on ++ the Mips. ++ ++ `mips-sysv-os5' ++ The Mips computer, RS series, with the System V environment ++ running on revision 5.00 of RISC-OS as default. Note that GNU ++ CC cannot generate debugging information in the unusual ++ format used on the Mips, and also cannot be used to create ++ programs that use shared libraries. ++ ++ `mips-sysv' ++ The Mips computer, RS series, with the System V environment ++ as default. Note that GNU CC cannot generate debugging ++ information in the unusual format used on the Mips. ++ ++ `mips-bsd43-os5' ++ The Mips computer, RS series, with the BSD 4.3 environment ++ running revision 5.00 of RISC-OS as default. Note that GNU CC ++ cannot generate debugging information in the unusual format ++ used on the Mips, and also cannot be used to create programs ++ that use shared libraries. ++ ++ `mips-bsd43' ++ The Mips computer, RS series, with the BSD 4.3 environment as ++ default. Note that GNU CC cannot generate debugging ++ information in the unusual format used on the Mips. ++ ++ `mips-os5' ++ The Mips computer, M series running revision 5.00 of RISC-OS. ++ Note that GNU CC cannot generate debugging information in the ++ unusual format used on the Mips, and also cannot be used to ++ create programs that use shared libraries. ++ ++ `mips' ++ The Mips computer, M series. Note that GNU CC cannot ++ generate debugging information in the unusual format used on ++ the Mips. ++ ++ `iris' ++ Another variant of the Mips computer, the Silicon Graphics ++ Iris 4D. Note that GNU CC cannot generate debugging ++ information in the unusual format used on the Mips. ++ ++ `convex-c1' ++ Convex C1 computer. With operating system version 9, use `cc ++ -pcc' as the compilation command when building stage 1 of GNU ++ CC. ++ ++ `convex-c2' ++ Convex C2 computer. With operating system version 9, use `cc ++ -pcc' as the compilation command when building stage 1 of GNU ++ CC. ++ ++ `pyramid' ++ Pyramid computer. ++ ++ `hp9k320' ++ HP 9000 series 300 using HPUX assembler. Note there is no ++ support in GNU CC for HP's debugger; thus, `-g' is not ++ available in this configuration. ++ ++ `hp9k320-gas' ++ HP 9000 series 300 using GNU assembler, linker and debugger. ++ This requires the HP-adapt package, which is available along ++ with the GNU linker as part of the "binutils" distribution. ++ This is on the GNU CC distribution tape. ++ ++ `hp9k320-old' ++ HP 9000 series 300 using HPUX assembler, in operating system ++ versions older than 6.5. Note there is no support in GNU CC ++ for HP's debugger; thus, `-g' is not available in this ++ configuration. ++ ++ `hp9k320-bsd' ++ HP 9000 series 300 running BSD. ++ ++ `hp9k200-bsd' ++ HP 9000 series 200 running BSD. Note that the C compiler ++ that comes with this system cannot compile GNU CC; contact ++ `law@super.org' to get binaries of GNU CC for bootstrapping. ++ Additionally, a minor patch is necessary if you wish to build ++ kernels with GNU CC; contact `law@super.org' to get a copy of ++ the patch. ++ ++ `isi68' ++ ISI 68000 or 68020 system with a 68881. ++ ++ `isi68-nfp' ++ ISI 68000 or 68020 system without a 68881. ++ ++ `news800' ++ Sony NEWS 68020 system. ++ ++ `next' ++ NeXT system. ++ ++ `tower' ++ NCR Tower 32 system. ++ ++ `altos' ++ Altos 3068. Note that you must use the GNU assembler, linker ++ and debugger, with COFF-encapsulation. Also, you must fix a ++ kernel bug. Details in the file `ALTOS-README'. ++ ++ `3b1' ++ AT&T 3b1, a.k.a. 7300 PC. Note that special procedures are ++ needed to compile GNU CC with this machine's standard C ++ compiler, due to bugs in that compiler. *Note 3b1 Install::. ++ You can bootstrap it more easily with previous versions of ++ GNU CC if you have them. ++ ++ `3b1-gas' ++ AT&T 3b1 using the GNU assembler. ++ ++ `sequent-ns32k' ++ Sequent containing ns32000 processors. ++ ++ `encore' ++ Encore ns32000 system. ++ ++ `genix' ++ National Semiconductor ns32000 system. ++ ++ `88000' ++ Motorola 88000 processor. This port is not finished. ++ ++ Here we spell out what files need to be set up: ++ ++ * Make a symbolic link named `config.h' to the top-level config ++ file for the machine you are using (*note Config::.). This ++ file is responsible for defining information about the host ++ machine. It includes `tm.h'. ++ ++ The file is located in the subdirectory `config'. Its name ++ should be `xm-MACHINE.h', with these exceptions: ++ ++ `xm-vms.h' ++ for vaxen running VMS. ++ ++ `xm-vaxv.h' ++ for vaxen running system V. ++ ++ `xm-i386v.h' ++ for Intel 80386's running system V. ++ ++ `xm-sun386i.h' ++ for Sun roadrunner running any version of the operating ++ system. ++ ++ `xm-hp9k320.h' ++ for the HP 9000 series 300. ++ ++ `xm-genix.h' ++ for the ns32000 running Genix ++ ++ If your system does not support symbolic links, you might ++ want to set up `config.h' to contain a `#include' command ++ which refers to the appropriate file. ++ ++ * Make a symbolic link named `tm.h' to the machine-description ++ macro file for your machine. It should be in the subdirectory ++ `config' and its name should be `tm-MACHINE.h'. ++ ++ If your system is a 68000, don't use the file `tm-m68k.h' ++ directly. Instead, use one of these files: ++ ++ `tm-sun3.h' ++ for Sun 3 machines with 68881. ++ ++ `tm-sun3-nfp.h' ++ for Sun 3 machines with no hardware floating point. ++ ++ `tm-sun3os3.h' ++ for Sun 3 machines with 68881, running Sunos version 3. ++ ++ `tm-sun3os3nf.h' ++ for Sun 3 machines with no hardware floating point, ++ running Sunos version 3. ++ ++ `tm-sun2.h' ++ for Sun 2 machines. ++ ++ `tm-3b1.h' ++ for AT&T 3b1 (aka 7300 Unix PC). ++ ++ `tm-isi68.h' ++ for Integrated Solutions systems. This file assumes you ++ use the GNU assembler. ++ ++ `tm-isi68-nfp.h' ++ for Integrated Solutions systems without a 68881. This ++ file assumes you use the GNU assembler. ++ ++ `tm-news800.h' ++ for Sony NEWS systems. ++ ++ `tm-hp9k320.h' ++ for HPUX systems, if you are using GNU CC with the ++ system's assembler and linker. ++ ++ `tm-hp9k320g.h' ++ for HPUX systems, if you are using the GNU assembler, ++ linker and other utilities. Not all of the pieces of ++ GNU software needed for this mode of operation are as ++ yet in distribution; full instructions will appear here ++ in the future. ++ ++ `tm-tower-as.h' ++ for NCR Tower 32 systems, using the standard system ++ assembler. ++ ++ For the vax, use `tm-vax.h' on BSD Unix, `tm-vaxv.h' on ++ system V, or `tm-vms.h' on VMS. ++ ++ For the Motorola 88000, use `tm-m88k.h'. The support for the ++ 88000 does not currently work; it requires extensive changes ++ which we hope to reconcile in version 2. ++ ++ For the 80386, don't use `tm-i386.h' directly. Use ++ `tm-i386v.h' if the target machine is running system V, ++ `tm-i386gas.h' if it is running system V but you are using the ++ GNU assembler and linker, `tm-seq386.h' for a Sequent 386 ++ system, or `tm-compaq.h' for a Compaq, or `tm-sun386i.h' for ++ a Sun 386 system. ++ ++ For the Mips computer, there are five choices: `tm-mips.h' ++ for the M series, `tm-mips-bsd.h' for the RS series with BSD, ++ `tm-mips-sysv.h' for the RS series with System V, `tm-iris.h' ++ for the Iris version of the machine, and `tm-decstatn.h' for ++ the Decstation. ++ ++ For the 32000, use `tm-sequent.h' if you are using a Sequent ++ machine, or `tm-encore.h' for an Encore machine, or ++ `tm-genix.h' if you are using Genix version 3; otherwise, ++ perhaps `tm-ns32k.h' will work for you. ++ ++ Note that Genix has bugs in `alloca' and `malloc'; you must ++ get the compiled versions of these from GNU Emacs and edit ++ GNU CC's `Makefile' to use them. ++ ++ Note that Encore systems are supported only under BSD. ++ ++ For Sparc (Sun 4) machines, use `tm-sparc.h' with operating ++ system version 4, and `tm-sun4os3.h' with system version 3. ++ ++ For Convex systems before version 8.1, use `tm-conv1os7.h' or ++ `tm-conv2os7.h'. For versions 8.1 and greater, use ++ `tm-convex1.h' or `tm-convex2.h'. You should also bootstrap ++ GCC with `pcc' rather than `cc'; one way to do this is with ++ the following commands. ++ ++ ln -s /bin/pcc ./cc ++ set path = (. $path) ++ ++ * Make a symbolic link named `md' to the machine description ++ pattern file. It should be in the `config' subdirectory and ++ its name should be `MACHINE.md'; but MACHINE is often not the ++ same as the name used in the `tm.h' file because the `md' ++ files are more general. ++ ++ * Make a symbolic link named `aux-output.c' to the output ++ subroutine file for your machine. It should be in the ++ `config' subdirectory and its name should be `out-MACHINE.c'. ++ ++ 4. Make sure the Bison parser generator is installed. (This is ++ unnecessary if the Bison output files `c-parse.tab.c' and `cexp.c' ++ are more recent than `c-parse.y' and `cexp.y' and you do not plan ++ to change the `.y' files.) ++ ++ Bison versions older than Sept 8, 1988 will produce incorrect ++ output for `c-parse.tab.c'. ++ ++ 5. If you have a previous version of GCC installed, then chances are ++ you can compile the new version with that. Do the following: ++ ++ make CC="gcc -O" ++ ++ Since this produces an optimized executable right away, there is ++ no need to bootstrap the result with itself except to test it. ++ Therefore, you can skip directly to the `make install' step below. ++ ++ 6. Build the compiler. Just type `make' in the compiler directory. ++ ++ Ignore any warnings you may see about "statement not reached" in ++ the `insn-emit.c'; they are normal. Any other compilation errors ++ may represent bugs in the port to your machine or operating ++ system, and should be investigated and reported (*note Bugs::.). ++ ++ Some commercial compilers fail to compile GNU CC because they have ++ bugs or limitations. For example, the Microsoft compiler is said ++ to run out of macro space. Some Ultrix compilers run out of ++ expression space; then you need to break up the statement where ++ the problem happens. ++ ++ 7. If you are using COFF-encapsulation, you must convert `gnulib' to ++ a GNU-format library at this point. See the file `README-ENCAP' ++ in the directory containing the GNU binary file utilities, for ++ directions. ++ ++ 8. Move the first-stage object files and executables into a ++ subdirectory with this command: ++ ++ make stage1 ++ ++ The files are moved into a subdirectory named `stage1'. Once ++ installation is complete, you may wish to delete these files with ++ `rm -r stage1'. ++ ++ 9. Recompile the compiler with itself, with this command: ++ ++ make CC=stage1/gcc CFLAGS="-g -O -Bstage1/" ++ ++ This is called making the stage 2 compiler. ++ ++ On a 68000 or 68020 system lacking floating point hardware, unless ++ you have selected a `tm.h' file that expects by default that there ++ is no such hardware, do this instead: ++ ++ make CC=stage1/gcc CFLAGS="-g -O -Bstage1/ -msoft-float" ++ ++ 10. If you wish to test the compiler by compiling it with itself one ++ more time, do this (in C shell): ++ ++ make stage2 ++ make CC=stage2/gcc CFLAGS="-g -O -Bstage2/" ++ foreach file (*.o) ++ cmp $file stage2/$file ++ end ++ ++ This is called making the stage 3 compiler. Aside from the `-B' ++ option, the options should be the same as when you made the stage 2 ++ compiler. ++ ++ The `foreach' command (written in C shell) will notify you if any ++ of these stage 3 object files differs from those of stage 2. On ++ BSD systems, any difference, no matter how innocuous, indicates ++ that the stage 2 compiler has compiled GNU CC incorrectly, and is ++ therefore a potentially serious bug which you should investigate ++ and report (*note Bugs::.). ++ ++ On systems that use COFF object files, bytes 5 to 8 will always be ++ different, since it is a timestamp. On these systems, you can do ++ the comparison as follows (in Bourne shell): ++ ++ for file in *.o; do ++ echo $file ++ tail +10c $file > foo1 ++ tail +10c stage2/$file > foo2 ++ cmp foo1 foo2 ++ done ++ ++ On MIPS machines, you should use the shell script `ecoff-cmp' to ++ compare two object files. ++ ++ 11. Install the compiler driver, the compiler's passes and run-time ++ support. You can use the following command: ++ ++ make install ++ ++ On some machines, you will find that starts to recompile the `.c' ++ files, due to a bug in Make. If that happens, cancel it and try ++ again specifying the same values for Make variables that you used ++ in the last compilation; that may not prevent the spurious ++ recompilation, but will at least do it properly. For example: ++ ++ make CC=stage2/gcc CFLAGS="-g -O -Bstage2/" install ++ ++ The `install' target copies the files `cc1', `cpp' and `gnulib' to ++ files `gcc-cc1', `gcc-cpp' and `gcc-gnulib' in directory ++ `/usr/local/lib', which is where the compiler driver program looks ++ for them. It also copies the driver program `gcc' into the ++ directory `/usr/local/bin', so that it appears in typical ++ execution search paths. ++ ++ *Warning: there is a bug in `alloca' in the Sun library. To avoid ++ this bug, install the binaries of GNU CC that were compiled by GNU ++ CC. They use `alloca' as a built-in function and never the one in ++ the library.* ++ ++ *Warning: the GNU CPP may not work for `ioctl.h', `ttychars.h' and ++ other system header files unless the `-traditional' option is ++ used.* The bug is in the header files: at least on some machines, ++ they rely on behavior that is incompatible with ANSI C. This ++ behavior consists of substituting for macro argument names when ++ they appear inside of character constants. The `-traditional' ++ option tells GNU CC to behave the way these headers expect. ++ ++ Because of this problem, you might prefer to configure GNU CC to ++ use the system's own C preprocessor. To do so, make the file ++ `/usr/local/lib/gcc-cpp' a link to `/lib/cpp'. ++ ++ Alternatively, on Sun systems and 4.3BSD at least, you can correct ++ the include files by running the shell script `fixincludes'. This ++ installs modified, corrected copies of the files `ioctl.h', ++ `ttychars.h' and many others, in a special directory where only ++ GNU CC will normally look for them. This script will work on ++ various systems because it chooses the files by searching all the ++ system headers for the problem cases that we know about. ++ ++ Use the following command to do this: ++ ++ make includes ++ ++ If you selected a different directory for GNU CC installation when ++ you installed it, by specifying the Make variable `prefix' or ++ `libdir', specify it the same way in this command. ++ ++ Note that some systems are starting to come with ANSI C system ++ header files. On these systems, don't run `fixincludes'; it may ++ not work, and is certainly not necessary. ++ ++ *Warning:* `fixincludes' does not work on many MIPS systems, ++ because those systems come with circular symbolic links which cause ++ `ls -lR' to go into an infinite loop. The same problem may occur ++ on some versions of SunOS. If you encounter this problem, try ++ using `fixinc.new' instead opf `fixincludes'. ++ ++ If you cannot install the compiler's passes and run-time support in ++`/usr/local/lib', you can alternatively use the `-B' option to specify ++a prefix by which they may be found. The compiler concatenates the ++prefix with the names `cpp', `cc1' and `gnulib'. Thus, you can put the ++files in a directory `/usr/foo/gcc' and specify `-B/usr/foo/gcc/' when ++you run GNU CC. ++ ++ Also, you can specify an alternative default directory for these ++files by setting the Make variable `libdir' when you make GNU CC. ++ ++ ++File: gcc.info, Node: Other Dir, Next: Sun Install, Prev: Installation, Up: Installation ++ ++Compilation in a Separate Directory ++=================================== ++ ++ If you wish to build the object files and executables in a directory ++other than the one containing the source files, here is what you must ++do differently: ++ ++ 1. Go to that directory before running `config.gcc': ++ ++ mkdir gcc-sun3 ++ cd gcc-sun3 ++ ++ On systems that do not support symbolic links, this directory must ++ be on the same file system as the source code directory. ++ ++ 2. Specify where to find `config.gcc' when you run it: ++ ++ ../gcc-1.36/config.gcc ... ++ ++ 3. Specify where to find the sources, as an argument to `config.gcc': ++ ++ ../gcc-1.36/config.gcc -srcdir=../gcc-1.36 sun3 ++ ++ The `-srcdir=DIR' option is not needed when the source directory ++ is the parent of the current directory, because `config.gcc' ++ detects that case automatically. ++ ++ Now, you can run `make' in that directory. You need not repeat the ++configuration steps shown above, when ordinary source files change. You ++must, however, run `config.gcc' again when the configuration files ++change, if your system does not support symbolic links. ++ ++ ++File: gcc.info, Node: Sun Install, Next: 3b1 Install, Prev: Other Dir, Up: Installation ++ ++Installing GNU CC on the Sun ++============================ ++ ++ Make sure the environment variable `FLOAT_OPTION' is not set when ++you compile `gnulib'. If this option were set to `f68881' when ++`gnulib' is compiled, the resulting code would demand to be linked with ++a special startup file and would not link properly without special ++pains. ++ ++ There is a bug in `alloca' in certain versions of the Sun library. ++To avoid this bug, install the binaries of GNU CC that were compiled by ++GNU CC. They use `alloca' as a built-in function and never the one in ++the library. ++ ++ Some versions of the Sun compiler crash when compiling GNU CC, with a ++segmentation fault in cpp. This can sometimes be due to the bulk of ++data in the environment variables. You may be able to avoid it by using ++the following command to compile GNU CC with Sun CC: ++ ++ make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc" ++ ++ Another problem that often happens on Suns is that you get a crash ++when building stage 2, when `genflags' is run. ++ ++ One reason for such as crash is if you configured GNU CC for the ++wrong version of SunOS. Starting with version 1.38, configurations ++`sun3' and `sun4' are for SunOS 4, so this problem should no longer ++happen. ++ ++ Another cause of the same symptom is having installed the GNU linker ++with an earlier version of SunOS. The version that worked before ++stopped working due to a change in the format of executables in SunOS ++4.1. Many sites have installed the GNU linker as ++`/usr/local/lib/gcc-ld', often as part of installing GNU C++. So if ++you get such crashes and you have used the proper configuration, try ++deleting `/usr/local/lib/gcc-ld'. ++ ++ The current version of the GNU linker, found in the current binutils ++release, does work with SunOS 4.1. ++ ++ ++File: gcc.info, Node: 3b1 Install, Next: SCO Install, Prev: Sun Install, Up: Installation ++ ++Installing GNU CC on the 3b1 ++============================ ++ ++ Installing GNU CC on the 3b1 is difficult if you do not already have ++GNU CC running, due to bugs in the installed C compiler. However, the ++following procedure might work. We are unable to test it. ++ ++ 1. Comment out the `#include "config.h"' line on line 37 of `cccp.c' ++ and do `make cpp'. This makes a preliminary version of GNU cpp. ++ ++ 2. Save the old `/lib/cpp' and copy the preliminary GNU cpp to that ++ file name. ++ ++ 3. Undo your change in `cccp.c', or reinstall the original version, ++ and do `make cpp' again. ++ ++ 4. Copy this final version of GNU cpp into `/lib/cpp'. ++ ++ 5. Replace every occurrence of `obstack_free' in `tree.c' with ++ `_obstack_free'. ++ ++ 6. Run `make' to get the first-stage GNU CC. ++ ++ 7. Reinstall the original version of `/lib/cpp'. ++ ++ 8. Now you can compile GNU CC with itself and install it in the normal ++ fashion. ++ ++ If you have installed an earlier version of GCC, you can compile the ++newer version with that. However, you will run into trouble compiling ++`gnulib', since that is normally compiled with CC. To solve the ++problem, uncomment this line in `Makefile': ++ ++ CCLIBFLAGS = -B/usr/local/lib/gcc- -tp -Wp,-traditional ++ ++ ++File: gcc.info, Node: SCO Install, Next: VMS Install, Prev: 3B1 Install, Up: Installation ++ ++Installing GNU CC on SCO System V 3.2 ++===================================== ++ ++ The compiler that comes with this system does not work properly with ++`-O'. Therefore, you should redefine the Make variable `CCLIBFLAGS' ++not to use `-O'. ++ ++ You should also edit `Makefile' to enable the lines that set `CLIB' ++to `-lPW', and the ones specifically labeled as being for SCO, that set ++`RANLIB', and that set `CC' and `OLDCC' to `rcc -Di386 -DM_UNIX ++-DM_I386 -DM_SYSV -DM_COFF'. ++ ++ Also, edit the definition of `USER_H' to remove the file `limits.h'. ++ ++ Then you can run `config.gcc i386-sco' and finish building GNU CC ++normally. ++ ++ Note that the function `memmove' is broken in 3.2v2; it clobbers ++register `%ebx'. See the file `sco-memmove.s'. ++ ++ The same recipe should work on ESIX, but use `config.gcc i386-esix' ++instead. ++ ++ ++File: gcc.info, Node: VMS Install, Next: HPUX Install, Prev: SCO Install, Up: Installation ++ ++Installing GNU CC on VMS ++======================== ++ ++ The VMS version of GNU CC is distributed in a backup saveset ++containing both source code and precompiled binaries. ++ ++ To install the `gcc' command so you can use the compiler easily, in ++the same manner as you use the VMS C compiler, you must install the VMS ++CLD file for GNU CC as follows: ++ ++ 1. Define the VMS logical names `GNU_CC' and `GNU_CC_INCLUDE' to ++ point to the directories where the GNU CC executables (`gcc-cpp', ++ `gcc-cc1', etc.) and the C include files are kept. This should be ++ done with the commands: ++ ++ $ assign /super /system disk:[gcc.] gnu_cc ++ $ assign /super /system disk:[gcc.include.] gnu_cc_include ++ ++ with the appropriate disk and directory names. These commands can ++ be placed in your system startup file so they will be executed ++ whenever the machine is rebooted. You may, if you choose, do this ++ via the `GCC_INSTALL.COM' script in the `[GCC]' directory. ++ ++ 2. Install the `GCC' command with the command line: ++ ++ $ set command /table=sys$library:dcltables gnu_cc:[000000]gcc ++ ++ 3. To install the help file, do the following: ++ ++ $ lib/help sys$library:helplib.hlb gcc.hlp ++ ++ Now you can invoke the compiler with a command like `gcc /verbose ++ file.c', which is equivalent to the command `gcc -v -c file.c' in ++ Unix. ++ ++ We try to put corresponding binaries and sources on the VMS ++distribution tape. But sometimes the binaries will be from an older ++version that the sources, because we don't always have time to update ++them. (Use the `/verbose' option to determine the version number of ++the binaries and compare it with the source file `version.c' to tell ++whether this is so.) In this case, you should use the binaries you get ++to recompile the sources. If you must recompile, here is how: ++ ++ 1. Copy the file `tm-vms.h' to `tm.h', `xm-vms.h' to `config.h', ++ `vax.md' to `md.' and `out-vax.c' to `aux-output.c'. The files to ++ be copied are found in the subdirectory named `config'; they ++ should be copied to the main directory of GNU CC. ++ ++ 2. Setup the logical names and command tables as defined above. In ++ addition, define the vms logical name `GNU_BISON' to point at the ++ to the directories where the Bison executable is kept. This ++ should be done with the command: ++ ++ $ assign /super /system disk:[bison.] gnu_bison ++ ++ You may, if you choose, use the `INSTALL_BISON.COM' script in the ++ `[BISON]' directory. ++ ++ 3. Install the `BISON' command with the command line: ++ ++ $ set command /table=sys$library:dcltables gnu_bison:[000000]bison ++ ++ 4. Type `@make' to do recompile everything. ++ ++ If you are compiling with a version of GNU CC older than 1.33, ++ specify `/DEFINE=("inline=")' as an option in all the ++ compilations. This requires editing all the `gcc' commands in ++ `make-cc1.com'. (The older versions had problems supporting ++ `inline'.) Once you have a working 1.33 or newer GNU CC, you can ++ change this file back. ++ ++ Due to the differences between the filesystems of Unix and VMS, the ++preprocessor attempts to translate the names of include files into ++something that VMS will understand. The basic strategy is to prepend a ++prefix to the specification of the include file, convert the whole ++filename to a VMS filename, and then try to open the file. The ++preprocessor tries various prefixes until one of them succeeds. ++ ++ The first prefix is the `GNU_CC_INCLUDE:' logical name: this is ++where GNU_C header files are traditionally stored. If a header file is ++not found there, `SYS$SYSROOT:[SYSLIB.]' is tried next. If the ++preprocessor is still unable to locate the file, it then assumes that ++the include file specification is a valid VMS filename all by itself, ++and it uses this filename to attempt to open the include file. If none ++of these strategies succeeds, the preprocessor reports an error. ++ ++ If you wish to store header files in non-standard locations, then you ++can assign the logical `GNU_CC_INCLUDE' to be a search list, where each ++element of the list is suitable for use with a rooted logical. ++ ++ With this version of GNU CC, `const' global variables now work ++properly. Unless, however, the `const' modifier is also specified in ++every external declaration of the variable in all of the source files ++that use that variable, the linker will issue warnings about conflicting ++attributes for the variable, since the linker does not know if the ++variable should be read-only. The program will still work, but the ++variable will be placed in writable storage. ++ ++ Due to an assembler bug, offsets to static constants are sometimes ++incorrectly evaluated. This bug is present in GAS 1.38.1, and should be ++fixed in the next version. ++ ++ Under previous versions of GNU CC, the generated code would ++occasionally give strange results when linked to the sharable `VAXCRTL' ++library. Now this should work. ++ ++ Even with this version, however, GNU CC itself should not be linked ++to the sharable `VAXCRTL'. The `qsort' routine supplied with `VAXCRTL' ++has a bug which can cause a compiler crash. ++ ++ Similarly, the preprocessor should not be linked to the sharable ++`VAXCRTL'. The `strncat' routine supplied with `VAXCRTL' has a bug ++which can cause the preprocessor to go into an infinite loop. ++ ++ It should be pointed out that if you attempt to link to the sharable ++`VAXCRTL', the VMS linker will strongly resist any effort to force it ++to use the `qsort' and `strncat' routines from `gcclib'. Until the ++bugs in `VAXCRTL' have been fixed, linking any of the compiler ++components to the sharable VAXCRTL is not recommended. (These routines ++can be bypassed by placing duplicate copies of `qsort' and `strncat' in ++`gcclib' under different names, and patching the compiler sources to ++use these routines). Both of the bugs in `VAXCRTL' are still present ++in VMS version 5.4-1, which is the most recent version as of this ++writing. ++ ++ The executables that are generated by `make-cc1.com' and ++`make-cccp.com' use the non-shared version of `VAXCRTL' (and thus use ++the `qsort' and `strncat' routines from `gcclib.olb'). ++ ++ Note that GNU CC on VMS now generates debugging information to ++describe the programs symbols to the VMS debugger. However, you need ++version 1.37 or later of GAS in order to output them properly in the ++object file. ++ ++ The VMS linker does not distinguish between upper and lower case ++letters in function and variable names. However, usual practice in C ++is to distinguish case. Normally GNU C (by means of the assembler GAS) ++implements usual C behavior by augmenting each name that is not all ++lower-case. A name is augmented by truncating it to at most 23 ++characters and then adding more characters at the end which encode the ++case pattern the rest. ++ ++ Name augmentation yields bad results for programs that use ++precompiled libraries (such as Xlib) which were generated by another ++compiler. Use the compiler option `/NOCASE_HACK' to inhibits ++augmentation; it makes external C functions and variables ++case-independent as is usual on VMS. Alternatively, you could write ++all references to the functions and variables in such libraries using ++lower case; this will work on VMS, but is not portable to other ++systems. In cases where you need to selectively inhibit augmentation, ++you can define a macro for each mixed case symbol for which you wish to ++inhibit augmentation, where the macro expands into the lower case ++equivalent of the name. ++ ++ ++File: gcc.info, Node: HPUX Install, Next: Tower Install, Prev: VMS Install, Up: Installation ++ ++Installing GNU CC on HPUX ++========================= ++ ++ To install GNU CC on HPUX, you must start by editing the file ++`Makefile'. Search for the string `HPUX' to find comments saying what ++to change. You need to change some variable definitions and (if you ++are using GAS) some lines in the rule for the target `gnulib'. ++ ++ To avoid errors when linking programs with `-g', create an empty ++library named `libg.a'. An easy way to do this is: ++ ++ ar rc /usr/local/lib/libg.a ++ ++ To compile with the HPUX C compiler, you must specify get the file ++`alloca.c' from GNU Emacs. Then, when you run `make', use this ++argument: ++ ++ make ALLOCA=alloca.o ++ ++ When recompiling GNU CC with itself, do not define `ALLOCA'. ++Instead, an `-I' option needs to be added to `CFLAGS' as follows: ++ ++ make CC=stage1/gcc CFLAGS="-g -O -Bstage1/ -I../binutils/hp-include" ++ ++ ++File: gcc.info, Node: Tower Install, Prev: HPUX Install, Up: Installation ++ ++Installing GNU CC on an NCR Tower ++================================= ++ ++ On an NCR Tower model 4x0 or 6x0, you may have trouble because the ++default maximum virtual address size of a process is just 1 Mb. Most ++often you will find this problem while compiling GNU CC with itself. ++ ++ The only way to solve the problem is to reconfigure the kernel. Add ++a line such as this to the configuration file: ++ ++ MAXUMEM = 4096 ++ ++and then relink the kernel and reboot the machine. ++ ++ ++File: gcc.info, Node: Trouble, Next: Service, Prev: Installation, Up: Top ++ ++Known Causes of Trouble with GNU CC ++*********************************** ++ ++ Here are some of the things that have caused trouble for people ++installing or using GNU CC. ++ ++ * On certain systems, defining certain environment variables such as ++ `CC' can interfere with the functioning of `make'. ++ ++ * Cross compilation can run into trouble for certain machines because ++ some target machines' assemblers require floating point numbers to ++ be written as *integer* constants in certain contexts. ++ ++ The compiler writes these integer constants by examining the ++ floating point value as an integer and printing that integer, ++ because this is simple to write and independent of the details of ++ the floating point representation. But this does not work if the ++ compiler is running on a different machine with an incompatible ++ floating point format, or even a different byte-ordering. ++ ++ In addition, correct constant folding of floating point values ++ requires representing them in the target machine's format. (The C ++ standard does not quite require this, but in practice it is the ++ only way to win.) ++ ++ It is now possible to overcome these problems by defining macros ++ such as `REAL_VALUE_TYPE'. But doing so is a substantial amount of ++ work for each target machine. *Note Cross-compilation::. ++ ++ * Users often think it is a bug when GNU CC reports an error for code ++ like this: ++ ++ int foo (short); ++ ++ int foo (x) ++ short x; ++ {...} ++ ++ The error message is correct: this code really is erroneous, ++ because the old-style non-prototype definition passes subword ++ integers in their promoted types. In other words, the argument is ++ really an `int', not a `short'. The correct prototype is this: ++ ++ int foo (int); ++ ++ * Users often think it is a bug when GNU CC reports an error for code ++ like this: ++ ++ int foo (struct mumble *); ++ ++ struct mumble { ... }; ++ ++ int foo (struct mumble *x) ++ { ... } ++ ++ This code really is erroneous, because the scope of `struct ++ mumble' the prototype is limited to the argument list containing ++ it. It does not refer to the `struct mumble' defined with file ++ scope immediately below--they are two unrelated types with similar ++ names in different scopes. ++ ++ But in the definition of `foo', the file-scope type is used ++ because that is available to be inherited. Thus, the definition ++ and the prototype do not match, and you get an error. ++ ++ This behavior may seem silly, but it's what the ANSI standard ++ specifies. It is easy enough for you to make your code work by ++ moving the definition of `struct mumble' above the prototype. I ++ don't think it's worth being incompatible for. ++ ++ Additional problems are described in *Note Incompatibilities::. ++ ++ ++File: gcc.info, Node: Service, Next: Incompatibilities, Prev: Trouble, Up: Top ++ ++How To Get Help with GNU CC ++*************************** ++ ++ If you need help installing, using or changing GNU CC, there are two ++ways to find it: ++ ++ * Send a message to a suitable network mailing list. First try ++ `bug-gcc@prep.ai.mit.edu', and if that brings no response, try ++ `help-gcc@prep.ai.mit.edu'. ++ ++ * Look in the service directory for someone who might help you for a ++ fee. The service directory is found in the file named `SERVICE' in ++ the GNU CC distribution. ++ ++ ++File: gcc.info, Node: Incompatibilities, Next: Extensions, Prev: Service, Up: Top ++ ++Incompatibilities of GNU CC ++*************************** ++ ++ There are several noteworthy incompatibilities between GNU C and most ++existing (non-ANSI) versions of C. The `-traditional' option ++eliminates most of these incompatibilities, *but not all*, by telling ++GNU C to behave like older C compilers. ++ ++ * GNU CC normally makes string constants read-only. If several ++ identical-looking string constants are used, GNU CC stores only one ++ copy of the string. ++ ++ One consequence is that you cannot call `mktemp' with a string ++ constant argument. The function `mktemp' always alters the string ++ its argument points to. ++ ++ Another consequence is that `sscanf' does not work on some systems ++ when passed a string constant as its format control string. This ++ is because `sscanf' incorrectly tries to write into the string ++ constant. Likewise `fscanf' and `scanf'. ++ ++ The best solution to these problems is to change the program to use ++ `char'-array variables with initialization strings for these ++ purposes instead of string constants. But if this is not possible, ++ you can use the `-fwritable-strings' flag, which directs GNU CC to ++ handle string constants the same way most C compilers do. ++ `-traditional' also has this effect, among others. ++ ++ * GNU CC does not substitute macro arguments when they appear inside ++ of string constants. For example, the following macro in GNU CC ++ ++ #define foo(a) "a" ++ ++ will produce output `"a"' regardless of what the argument A is. ++ ++ The `-traditional' option directs GNU CC to handle such cases ++ (among others) in the old-fashioned (non-ANSI) fashion. ++ ++ * When you use `setjmp' and `longjmp', the only automatic variables ++ guaranteed to remain valid are those declared `volatile'. This is ++ a consequence of automatic register allocation. Consider this ++ function: ++ ++ jmp_buf j; ++ ++ foo () ++ { ++ int a, b; ++ ++ a = fun1 (); ++ if (setjmp (j)) ++ return a; ++ ++ a = fun2 (); ++ /* `longjmp (j)' may be occur in `fun3'. */ ++ return a + fun3 (); ++ } ++ ++ Here `a' may or may not be restored to its first value when the ++ `longjmp' occurs. If `a' is allocated in a register, then its ++ first value is restored; otherwise, it keeps the last value stored ++ in it. ++ ++ If you use the `-W' option with the `-O' option, you will get a ++ warning when GNU CC thinks such a problem might be possible. ++ ++ The `-traditional' option directs GNU C to put variables in the ++ stack by default, rather than in registers, in functions that call ++ `setjmp'. This results in the behavior found in traditional C ++ compilers. ++ ++ * Declarations of external variables and functions within a block ++ apply only to the block containing the declaration. In other ++ words, they have the same scope as any other declaration in the ++ same place. ++ ++ In some other C compilers, a `extern' declaration affects all the ++ rest of the file even if it happens within a block. ++ ++ The `-traditional' option directs GNU C to treat all `extern' ++ declarations as global, like traditional compilers. ++ ++ * In traditional C, you can combine `long', etc., with a typedef ++ name, as shown here: ++ ++ typedef int foo; ++ typedef long foo bar; ++ ++ In ANSI C, this is not allowed: `long' and other type modifiers ++ require an explicit `int'. Because this criterion is expressed by ++ Bison grammar rules rather than C code, the `-traditional' flag ++ cannot alter it. ++ ++ * PCC allows typedef names to be used as function parameters. The ++ difficulty described immediately above applies here too. ++ ++ * PCC allows whitespace in the middle of compound assignment ++ operators such as `+='. GNU CC, following the ANSI standard, does ++ not allow this. The difficulty described immediately above ++ applies here too. ++ ++ * GNU CC will flag unterminated character constants inside of ++ preprocessor conditionals that fail. Some programs have English ++ comments enclosed in conditionals that are guaranteed to fail; if ++ these comments contain apostrophes, GNU CC will probably report an ++ error. For example, this code would produce an error: ++ ++ #if 0 ++ You can't expect this to work. ++ #endif ++ ++ The best solution to such a problem is to put the text into an ++ actual C comment delimited by `/*...*/'. However, `-traditional' ++ suppresses these error messages. ++ ++ * When compiling functions that return `float', PCC converts it to a ++ double. GNU CC actually returns a `float'. If you are concerned ++ with PCC compatibility, you should declare your functions to return ++ `double'; you might as well say what you mean. ++ ++ * When compiling functions that return structures or unions, GNU CC ++ output code normally uses a method different from that used on most ++ versions of Unix. As a result, code compiled with GNU CC cannot ++ call a structure-returning function compiled with PCC, and vice ++ versa. ++ ++ The method used by GNU CC is as follows: a structure or union ++ which is 1, 2, 4 or 8 bytes long is returned like a scalar. A ++ structure or union with any other size is stored into an address ++ supplied by the caller in a special, fixed register. ++ ++ PCC usually handles all sizes of structures and unions by returning ++ the address of a block of static storage containing the value. ++ This method is not used in GNU CC because it is slower and ++ nonreentrant. ++ ++ You can tell GNU CC to use the PCC convention with the option ++ `-fpcc-struct-return'. ++ ++ There are also system-specific incompatibilities. ++ ++ * On the Sparc, GNU CC uses an incompatible calling convention for ++ structures and unions. It passes them by including their contents ++ in the argument list, whereas the standard compiler passes them ++ effectively by reference. ++ ++ This is hard to fix in GCC version 1. GNU CC version 2 will use a ++ compatible calling convention. ++ ++ The convention for structure or union returning is also ++ incompatible, and `-fpcc-struct-return' does not help. ++ ++ System functions which can't be called properly from code compiled ++ with GCC include `fetch', `store', `delete', `firstkey', ++ `nextkey', `inet_makeaddr', `inet_lnaof', `inet_netof', ++ `inet_ntoa', `mallinfo', `pmap_rmtcall', `clnt_call', ++ `clntudp_bufcreate' and `clntudp_create'. ++ ++ * One consequence of the unusual calling convention used on the Sparc ++ is that structures with less than word alignment do not work right ++ when passed as arguments to varargs functions. ++ ++ It's not easy to fix this problem. In any case, it will be gone in ++ version 2 as a result of the changed calling convention. ++ ++ * The Sparc version of `setjmp' interacts badly with unexpected stack ++ adjustments. With rare exceptions, you cannot use `setjmp' in a ++ function which moves the stack pointer. ++ ++ In the current version of GNU CC, there are three ways that the ++ stack pointer can change value: (1) calls to `alloca', (2) use of ++ variable-sized objects, and (3) calls to functions with parameters ++ that do not all fit in the argument-passing registers (e.g., more ++ than 6 parameters). You should avoid all three in functions that ++ call `setjmp'. ++ ++ The cause of the problem is the way that Sun implemented register ++ windows. The 64 bytes at addresses `%sp' through `%sp+63' ++ correspond to the register window save area. When a register ++ window must be spilled, its stack pointer is located, and the ++ registers are dumped starting at that address. Similarly, when a ++ register window must be restored, its stack pointer is located, ++ and the registers are restored from that address. ++ ++ When `setjmp' is called, the current register window's registers ++ are saved into the register save area, and when `longjmp' is ++ called, they are restored (actually, *all* register windows are ++ restored from all valid register windows at the time `longjmp' is ++ called). If there is a change in the value of the stack pointer ++ bewteen the `setjmp' and `longjmp' calls, when the registers are ++ restored, they are restored with random values. ++ ++ * On Ultrix, the Fortran compiler expects registers 2 through 5 to ++ be saved by function calls. However, the C compiler uses ++ conventions compatible with BSD Unix: registers 2 through 5 may be ++ clobbered by function calls. ++ ++ GNU CC uses the same convention as the Ultrix C compiler. You can ++ use these options to produce code compatible with the Fortran ++ compiler: ++ ++ -fcall-saved-r2 -fcall-saved-r3 -fcall-saved-r4 -fcall-saved-r5 ++ ++ * DBX rejects some files produced by GNU CC, though it accepts ++ similar constructs in output from PCC. Until someone can supply a ++ coherent description of what is valid DBX input and what is not, ++ there is nothing I can do about these problems. You are on your ++ own. ++ ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-4 alliance/genview/src/gcc-1.42/gcc.info-4 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-4 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-4 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,1085 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Extensions, Next: Bugs, Prev: Incompatibilities, Up: Top ++ ++GNU Extensions to the C Language ++******************************** ++ ++ GNU C provides several language features not found in ANSI standard ++C. (The `-pedantic' option directs GNU CC to print a warning message if ++any of these features is used.) To test for the availability of these ++features in conditional compilation, check for a predefined macro ++`__GNUC__', which is always defined under GNU CC. ++ ++* Menu: ++ ++* Statement Exprs:: Putting statements and declarations inside expressions. ++* Naming Types:: Giving a name to the type of some expression. ++* Typeof:: `typeof': referring to the type of an expression. ++* Lvalues:: Using `?:', `,' and casts in lvalues. ++* Conditionals:: Omitting the middle operand of a `?:' expression. ++* Zero-Length:: Zero-length arrays. ++* Variable-Length:: Arrays whose length is computed at run time. ++* Subscripting:: Any array can be subscripted, even if not an lvalue. ++* Pointer Arith:: Arithmetic on `void'-pointers and function pointers. ++* Initializers:: Non-constant initializers. ++* Constructors:: Constructor expressions give structures, unions ++ or arrays as values. ++* Function Attributes:: Declaring that functions have no side effects, ++ or that they can never return. ++* Dollar Signs:: Dollar sign is allowed in identifiers. ++* Alignment:: Inquiring about the alignment of a type or variable. ++* Inline:: Defining inline functions (as fast as macros). ++* Extended Asm:: Assembler instructions with C expressions as operands. ++ (With them you can define "built-in" functions.) ++* Asm Labels:: Specifying the assembler name to use for a C symbol. ++* Explicit Reg Vars:: Defining variables residing in specified registers. ++* Alternate Keywords:: `__const__', `__asm__', etc., for header files. ++ ++ ++File: gcc.info, Node: Statement Exprs, Next: Naming Types, Prev: Extensions, Up: Extensions ++ ++Statements and Declarations inside of Expressions ++================================================= ++ ++ A compound statement in parentheses may appear inside an expression ++in GNU C. This allows you to declare variables within an expression. ++For example: ++ ++ ({ int y = foo (); int z; ++ if (y > 0) z = y; ++ else z = - y; ++ z; }) ++ ++is a valid (though slightly more complex than necessary) expression for ++the absolute value of `foo ()'. ++ ++ This feature is especially useful in making macro definitions "safe" ++(so that they evaluate each operand exactly once). For example, the ++"maximum" function is commonly defined as a macro in standard C as ++follows: ++ ++ #define max(a,b) ((a) > (b) ? (a) : (b)) ++ ++But this definition computes either A or B twice, with bad results if ++the operand has side effects. In GNU C, if you know the type of the ++operands (here let's assume `int'), you can define the macro safely as ++follows: ++ ++ #define maxint(a,b) \ ++ ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) ++ ++ Embedded statements are not allowed in constant expressions, such as ++the value of an enumeration constant, the width of a bit field, or the ++initial value of a static variable. ++ ++ If you don't know the type of the operand, you can still do this, ++but you must use `typeof' (*note Typeof::.) or type naming (*note ++Naming Types::.). ++ ++ ++File: gcc.info, Node: Naming Types, Next: Typeof, Prev: Statement Exprs, Up: Extensions ++ ++Naming an Expression's Type ++=========================== ++ ++ You can give a name to the type of an expression using a `typedef' ++declaration with an initializer. Here is how to define NAME as a type ++name for the type of EXP: ++ ++ typedef NAME = EXP; ++ ++ This is useful in conjunction with the statements-within-expressions ++feature. Here is how the two together can be used to define a safe ++"maximum" macro that operates on any arithmetic type: ++ ++ #define max(a,b) \ ++ ({typedef _ta = (a), _tb = (b); \ ++ _ta _a = (a); _tb _b = (b); \ ++ _a > _b ? _a : _b; }) ++ ++ The reason for using names that start with underscores for the local ++variables is to avoid conflicts with variable names that occur within ++the expressions that are substituted for `a' and `b'. Eventually we ++hope to design a new form of declaration syntax that allows you to ++declare variables whose scopes start only after their initializers; ++this will be a more reliable way to prevent such conflicts. ++ ++ ++File: gcc.info, Node: Typeof, Next: Lvalues, Prev: Naming Types, Up: Extensions ++ ++Referring to a Type with `typeof' ++================================= ++ ++ Another way to refer to the type of an expression is with `typeof'. ++The syntax of using of this keyword looks like `sizeof', but the ++construct acts semantically like a type name defined with `typedef'. ++ ++ There are two ways of writing the argument to `typeof': with an ++expression or with a type. Here is an example with an expression: ++ ++ typeof (x[0](1)) ++ ++This assumes that `x' is an array of functions; the type described is ++that of the values of the functions. ++ ++ Here is an example with a typename as the argument: ++ ++ typeof (int *) ++ ++Here the type described is that of pointers to `int'. ++ ++ If you are writing a header file that must work when included in ++ANSI C programs, write `__typeof__' instead of `typeof'. *Note ++Alternate Keywords::. ++ ++ A `typeof'-construct can be used anywhere a typedef name could be ++used. For example, you can use it in a declaration, in a cast, or ++inside of `sizeof' or `typeof'. ++ ++ * This declares `y' with the type of what `x' points to. ++ ++ typeof (*x) y; ++ ++ * This declares `y' as an array of such values. ++ ++ typeof (*x) y[4]; ++ ++ * This declares `y' as an array of pointers to characters: ++ ++ typeof (typeof (char *)[4]) y; ++ ++ It is equivalent to the following traditional C declaration: ++ ++ char *y[4]; ++ ++ To see the meaning of the declaration using `typeof', and why it ++ might be a useful way to write, let's rewrite it with these macros: ++ ++ #define pointer(T) typeof(T *) ++ #define array(T, N) typeof(T [N]) ++ ++ Now the declaration can be rewritten this way: ++ ++ array (pointer (char), 4) y; ++ ++ Thus, `array (pointer (char), 4)' is the type of arrays of 4 ++ pointers to `char'. ++ ++ ++File: gcc.info, Node: Lvalues, Next: Conditionals, Prev: Typeof, Up: Extensions ++ ++Generalized Lvalues ++=================== ++ ++ Compound expressions, conditional expressions and casts are allowed ++as lvalues provided their operands are lvalues. This means that you ++can take their addresses or store values into them. ++ ++ For example, a compound expression can be assigned, provided the last ++expression in the sequence is an lvalue. These two expressions are ++equivalent: ++ ++ (a, b) += 5 ++ a, (b += 5) ++ ++ Similarly, the address of the compound expression can be taken. ++These two expressions are equivalent: ++ ++ &(a, b) ++ a, &b ++ ++ A conditional expression is a valid lvalue if its type is not void ++and the true and false branches are both valid lvalues. For example, ++these two expressions are equivalent: ++ ++ (a ? b : c) = 5 ++ (a ? b = 5 : (c = 5)) ++ ++ A cast is a valid lvalue if its operand is an lvalue. A simple ++assignment whose left-hand side is a cast works by converting the ++right-hand side first to the specified type, then to the type of the ++inner left-hand side expression. After this is stored, the value is ++converted back to the specified type to become the value of the ++assignment. Thus, if `a' has type `char *', the following two ++expressions are equivalent: ++ ++ (int)a = 5 ++ (int)(a = (char *)(int)5) ++ ++ An assignment-with-arithmetic operation such as `+=' applied to a ++cast performs the arithmetic using the type resulting from the cast, ++and then continues as in the previous case. Therefore, these two ++expressions are equivalent: ++ ++ (int)a += 5 ++ (int)(a = (char *)(int) ((int)a + 5)) ++ ++ You cannot take the address of an lvalue cast, because the use of its ++address would not work out coherently. Suppose that `&(int)f' were ++permitted, where `f' has type `float'. Then the following statement ++would try to store an integer bit-pattern where a floating point number ++belongs: ++ ++ *&(int)f = 1; ++ ++ This is quite different from what `(int)f = 1' would do--that would ++convert 1 to floating point and store it. Rather than cause this ++inconsistancy, we think it is better to prohibit use of `&' on a cast. ++ ++ If you really do want an `int *' pointer with the address of `f', ++you can simply write `(int *)&f'. ++ ++ ++File: gcc.info, Node: Conditionals, Next: Zero-Length, Prev: Lvalues, Up: Extensions ++ ++Conditional Expressions with Omitted Middle-Operands ++==================================================== ++ ++ The middle operand in a conditional expression may be omitted. Then ++if the first operand is nonzero, its value is the value of the ++conditional expression. ++ ++ Therefore, the expression ++ ++ x ? : y ++ ++has the value of `x' if that is nonzero; otherwise, the value of `y'. ++ ++ This example is perfectly equivalent to ++ ++ x ? x : y ++ ++In this simple case, the ability to omit the middle operand is not ++especially useful. When it becomes useful is when the first operand ++does, or may (if it is a macro argument), contain a side effect. Then ++repeating the operand in the middle would perform the side effect ++twice. Omitting the middle operand uses the value already computed ++without the undesirable effects of recomputing it. ++ ++ ++File: gcc.info, Node: Zero-Length, Next: Variable-Length, Prev: Conditionals, Up: Extensions ++ ++Arrays of Length Zero ++===================== ++ ++ Zero-length arrays are allowed in GNU C. They are very useful as ++the last element of a structure which is really a header for a ++variable-length object: ++ ++ struct line { ++ int length; ++ char contents[0]; ++ }; ++ ++ { ++ struct line *thisline ++ = (struct line *) malloc (sizeof (struct line) + this_length); ++ thisline->length = this_length; ++ } ++ ++ In standard C, you would have to give `contents' a length of 1, which ++means either you waste space or complicate the argument to `malloc'. ++ ++ ++File: gcc.info, Node: Variable-Length, Next: Subscripting, Prev: Zero-Length, Up: Extensions ++ ++Arrays of Variable Length ++========================= ++ ++ Variable-length automatic arrays are allowed in GNU C. These arrays ++are declared like any other automatic arrays, but with a length that is ++not a constant expression. The storage is allocated at that time and ++deallocated when the brace-level is exited. For example: ++ ++ FILE *concat_fopen (char *s1, char *s2, char *mode) ++ { ++ char str[strlen (s1) + strlen (s2) + 1]; ++ strcpy (str, s1); ++ strcat (str, s2); ++ return fopen (str, mode); ++ } ++ ++ You can also use variable-length arrays as arguments to functions: ++ ++ struct entry ++ tester (int len, char data[len]) ++ { ++ ... ++ } ++ ++ The length of an array is computed on entry to the brace-level where ++the array is declared and is remembered for the scope of the array in ++case you access it with `sizeof'. ++ ++ Jumping or breaking out of the scope of the array name will also ++deallocate the storage. Jumping into the scope is not allowed; you ++will get an error message for it. ++ ++ You can use the function `alloca' to get an effect much like ++variable-length arrays. The function `alloca' is available in many ++other C implementations (but not in all). On the other hand, ++variable-length arrays are more elegant. ++ ++ There are other differences between these two methods. Space ++allocated with `alloca' exists until the containing *function* returns. ++The space for a variable-length array is deallocated as soon as the ++array name's scope ends. (If you use both variable-length arrays and ++`alloca' in the same function, deallocation of a variable-length array ++will also deallocate anything more recently allocated with `alloca'.) ++ ++ ++File: gcc.info, Node: Subscripting, Next: Pointer Arith, Prev: Variable-Length, Up: Extensions ++ ++Non-Lvalue Arrays May Have Subscripts ++===================================== ++ ++ Subscripting is allowed on arrays that are not lvalues, even though ++the unary `&' operator is not. For example, this is valid in GNU C ++though not valid in other C dialects: ++ ++ struct foo {int a[4];}; ++ ++ struct foo f(); ++ ++ bar (int index) ++ { ++ return f().a[index]; ++ } ++ ++ ++File: gcc.info, Node: Pointer Arith, Next: Initializers, Prev: Subscripting, Up: Extensions ++ ++Arithmetic on `void'-Pointers and Function Pointers ++=================================================== ++ ++ In GNU C, addition and subtraction operations are supported on ++pointers to `void' and on pointers to functions. This is done by ++treating the size of a `void' or of a function as 1. ++ ++ A consequence of this is that `sizeof' is also allowed on `void' and ++on function types, and returns 1. ++ ++ The option `-Wpointer-arith' requests a warning if these extensions ++are used. ++ ++ ++File: gcc.info, Node: Initializers, Next: Constructors, Prev: Pointer Arith, Up: Extensions ++ ++Non-Constant Initializers ++========================= ++ ++ The elements of an aggregate initializer for an automatic variable ++are not required to be constant expressions in GNU C. Here is an ++example of an initializer with run-time varying elements: ++ ++ foo (float f, float g) ++ { ++ float beat_freqs[2] = { f-g, f+g }; ++ ... ++ } ++ ++ ++File: gcc.info, Node: Constructors, Next: Function Attributes, Prev: Initializers, Up: Extensions ++ ++Constructor Expressions ++======================= ++ ++ GNU C supports constructor expressions. A constructor looks like a ++cast containing an initializer. Its value is an object of the type ++specified in the cast, containing the elements specified in the ++initializer. The type must be a structure, union or array type. ++ ++ Assume that `struct foo' and `structure' are declared as shown: ++ ++ struct foo {int a; char b[2];} structure; ++ ++Here is an example of constructing a `struct foo' with a constructor: ++ ++ structure = ((struct foo) {x + y, 'a', 0}); ++ ++This is equivalent to writing the following: ++ ++ { ++ struct foo temp = {x + y, 'a', 0}; ++ structure = temp; ++ } ++ ++ You can also construct an array. If all the elements of the ++constructor are (made up of) simple constant expressions, suitable for ++use in initializers, then the constructor is an lvalue and can be ++coerced to a pointer to its first element, as shown here: ++ ++ char **foo = (char *[]) { "x", "y", "z" }; ++ ++ Array constructors whose elements are not simple constants are not ++very useful, because the constructor is not an lvalue. There are only ++two valid ways to use it: to subscript it, or initialize an array ++variable with it. The former is probably slower than a `switch' ++statement, while the latter does the same thing an ordinary C ++initializer would do. ++ ++ output = ((int[]) { 2, x, 28 }) [input]; ++ ++ ++File: gcc.info, Node: Function Attributes, Next: Dollar Signs, Prev: Constructors, Up: Extensions ++ ++Declaring Attributes of Functions ++================================= ++ ++ In GNU C, you declare certain things about functions called in your ++program which help the compiler optimize function calls. ++ ++ A few functions, such as `abort' and `exit', cannot return. These ++functions should be declared `volatile'. For example, ++ ++ extern volatile void abort (); ++ ++tells the compiler that it can assume that `abort' will not return. ++This makes slightly better code, but more importantly it helps avoid ++spurious warnings of uninitialized variables. ++ ++ Many functions do not examine any values except their arguments, and ++have no effects except the return value. Such a function can be subject ++to common subexpression elimination and loop optimization just as an ++arithmetic operator would be. These functions should be declared ++`const'. For example, ++ ++ extern const int square (); ++ ++says that the hypothetical function `square' is safe to call fewer ++times than the program says. ++ ++ Note that a function that has pointer arguments and examines the data ++pointed to must *not* be declared `const'. Likewise, a function that ++calls a non-`const' function usually must not be `const'. ++ ++ Some people object to this feature, claiming that ANSI C's `#pragma' ++should be used instead. There are two reasons I did not do this. ++ ++ 1. It is impossible to generate `#pragma' commands from a macro. ++ ++ 2. The `#pragma' command is just as likely as these keywords to mean ++ something else in another compiler. ++ ++ These two reasons apply to *any* application whatever: as far as I ++can see, `#pragma' is never useful. ++ ++ ++File: gcc.info, Node: Dollar Signs, Next: Alignment, Prev: Function Attributes, Up: Extensions ++ ++Dollar Signs in Identifier Names ++================================ ++ ++ In GNU C, you may use dollar signs in identifier names. This is ++because many traditional C implementations allow such identifiers. ++ ++ Dollar signs are allowed if you specify `-traditional'; they are not ++allowed if you specify `-ansi'. Whether they are allowed by default ++depends on the target machine; usually, they are not. ++ ++ ++File: gcc.info, Node: Alignment, Next: Inline, Prev: Dollar Signs, Up: Extensions ++ ++Inquiring about the Alignment of a Type or Variable ++=================================================== ++ ++ The keyword `__alignof__' allows you to inquire about how an object ++is aligned, or the minimum alignment usually required by a type. Its ++syntax is just like `sizeof'. ++ ++ For example, if the target machine requires a `double' value to be ++aligned on an 8-byte boundary, then `__alignof__ (double)' is 8. This ++is true on many RISC machines. On more traditional machine designs, ++`__alignof__ (double)' is 4 or even 2. ++ ++ Some machines never actually require alignment; they allow reference ++to any data type even at an odd addresses. For these machines, ++`__alignof__' reports the *recommended* alignment of a type. ++ ++ When the operand of `__alignof__' is an lvalue rather than a type, ++the value is the largest alignment that the lvalue is known to have. ++It may have this alignment as a result of its data type, or because it ++is part of a structure and inherits alignment from that structure. For ++example, after this declaration: ++ ++ struct foo { int x; char y; } foo1; ++ ++the value of `__alignof__ (foo1.y)' is probably 2 or 4, the same as ++`__alignof__ (int)', even though the data type of `foo1.y' does not ++itself demand any alignment. ++ ++ ++File: gcc.info, Node: Inline, Next: Extended Asm, Prev: Alignment, Up: Extensions ++ ++An Inline Function is As Fast As a Macro ++======================================== ++ ++ By declaring a function `inline', you can direct GNU CC to integrate ++that function's code into the code for its callers. This makes ++execution faster by eliminating the function-call overhead; in ++addition, if any of the actual argument values are constant, their ++known values may permit simplifications at compile time so that not all ++of the inline function's code needs to be included. ++ ++ To declare a function inline, use the `inline' keyword in its ++declaration, like this: ++ ++ inline int ++ inc (int *a) ++ { ++ (*a)++; ++ } ++ ++ (If you are writing a header file to be included in ANSI C programs, ++write `__inline__' instead of `inline'. *Note Alternate Keywords::.) ++ ++ You can also make all "simple enough" functions inline with the ++option `-finline-functions'. Note that certain usages in a function ++definition can make it unsuitable for inline substitution. ++ ++ When a function is both inline and `static', if all calls to the ++function are integrated into the caller, and the function's address is ++never used, then the function's own assembler code is never referenced. ++In this case, GNU CC does not actually output assembler code for the ++function, unless you specify the option `-fkeep-inline-functions'. Some ++calls cannot be integrated for various reasons (in particular, calls ++that precede the function's definition cannot be integrated, and ++neither can recursive calls within the definition). If there is a ++nonintegrated call, then the function is compiled to assembler code as ++usual. The function must also be compiled as usual if the program ++refers to its address, because that can't be inlined. ++ ++ When an inline function is not `static', then the compiler must ++assume that there may be calls from other source files; since a global ++symbol can be defined only once in any program, the function must not ++be defined in the other source files, so the calls therein cannot be ++integrated. Therefore, a non-`static' inline function is always ++compiled on its own in the usual fashion. ++ ++ If you specify both `inline' and `extern' in the function ++definition, then the definition is used only for inlining. In no case ++is the function compiled on its own, not even if you refer to its ++address explicitly. Such an address becomes an external reference, as ++if you had only declared the function, and had not defined it. ++ ++ This combination of `inline' and `extern' has almost the effect of a ++macro. The way to use it is to put a function definition in a header ++file with these keywords, and put another copy of the definition ++(lacking `inline' and `extern') in a library file. The definition in ++the header file will cause most calls to the function to be inlined. ++If any uses of the function remain, they will refer to the single copy ++in the library. ++ ++ ++File: gcc.info, Node: Extended Asm, Next: Asm Labels, Prev: Inline, Up: Extensions ++ ++Assembler Instructions with C Expression Operands ++================================================= ++ ++ In an assembler instruction using `asm', you can now specify the ++operands of the instruction using C expressions. This means no more ++guessing which registers or memory locations will contain the data you ++want to use. ++ ++ You must specify an assembler instruction template much like what ++appears in a machine description, plus an operand constraint string for ++each operand. ++ ++ For example, here is how to use the 68881's `fsinx' instruction: ++ ++ asm ("fsinx %1,%0" : "=f" (result) : "f" (angle)); ++ ++Here `angle' is the C expression for the input operand while `result' ++is that of the output operand. Each has `"f"' as its operand ++constraint, saying that a floating-point register is required. The `=' ++in `=f' indicates that the operand is an output; all output operands' ++constraints must use `='. The constraints use the same language used ++in the machine description (*note Constraints::.). ++ ++ Each operand is described by an operand-constraint string followed ++by the C expression in parentheses. A colon separates the assembler ++template from the first output operand, and another separates the last ++output operand from the first input, if any. Commas separate output ++operands and separate inputs. The total number of operands is limited ++to the maximum number of operands in any instruction pattern in the ++machine description. ++ ++ If there are no output operands, and there are input operands, then ++there must be two consecutive colons surrounding the place where the ++output operands would go. ++ ++ Output operand expressions must be lvalues; the compiler can check ++this. The input operands need not be lvalues. The compiler cannot ++check whether the operands have data types that are reasonable for the ++instruction being executed. It does not parse the assembler ++instruction template and does not know what it means, or whether it is ++valid assembler input. The extended `asm' feature is most often used ++for machine instructions that the compiler itself does not know exist. ++ ++ The output operands must be write-only; GNU CC will assume that the ++values in these operands before the instruction are dead and need not be ++generated. Extended asm does not support input-output or read-write ++operands. For this reason, the constraint character `+', which ++indicates such an operand, may not be used. ++ ++ When the assembler instruction has a read-write operand, or an ++operand in which only some of the bits are to be changed, you must ++logically split its function into two separate operands, one input ++operand and one write-only output operand. The connection between them ++is expressed by constraints which say they need to be in the same ++location when the instruction executes. You can use the same C ++expression for both operands, or different expressions. For example, ++here we write the (fictitious) `combine' instruction with `bar' as its ++read-only source operand and `foo' as its read-write destination: ++ ++ asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar)); ++ ++The constraint `"0"' for operand 1 says that it must occupy the same ++location as operand 0. A digit in constraint is allowed only in an ++input operand, and it must refer to an output operand. ++ ++ Only a digit in the constraint can guarantee that one operand will ++be in the same place as another. The mere fact that `foo' is the value ++of both operands is not enough to guarantee that they will be in the ++same place in the generated assembler code. The following would not ++work: ++ ++ asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar)); ++ ++ Various optimizations or reloading could cause operands 0 and 1 to ++be in different registers; GNU CC knows no reason not to do so. For ++example, the compiler might find a copy of the value of `foo' in one ++register and use it for operand 1, but generate the output operand 0 in ++a different register (copying it afterward to `foo''s own address). Of ++course, since the register for operand 1 is not even mentioned in the ++assembler code, the result will not work, but GNU CC can't tell that. ++ ++ Unless an output operand has the `&' constraint modifier, GNU CC may ++allocate it in the same register as an unrelated input operand, on the ++assumption that the inputs are consumed before the outputs are produced. ++This assumption may be false if the assembler code actually consists of ++more than one instruction. In such a case, use `&' for each output ++operand that may not overlap an input. *Note Modifiers::. ++ ++ Some instructions clobber specific hard registers. To describe ++this, write a third colon after the input operands, followed by the ++names of the clobbered hard registers (given as strings). Here is a ++realistic example for the vax: ++ ++ asm volatile ("movc3 %0,%1,%2" ++ : /* no outputs */ ++ : "g" (from), "g" (to), "g" (count) ++ : "r0", "r1", "r2", "r3", "r4", "r5"); ++ ++ You can put multiple assembler instructions together in a single ++`asm' template, separated either with newlines (written as `\n') or with ++semicolons if the assembler allows such semicolons. The GNU assembler ++allows semicolons and all Unix assemblers seem to do so. The input ++operands are guaranteed not to use any of the clobbered registers, and ++neither will the output operands' addresses, so you can read and write ++the clobbered registers as many times as you like. Here is an example ++of multiple instructions in a template; it assumes that the subroutine ++`_foo' accepts arguments in registers 9 and 10: ++ ++ asm ("movl %0,r9;movl %1,r10;call _foo" ++ : /* no outputs */ ++ : "g" (from), "g" (to) ++ : "r9", "r10"); ++ ++ If you want to test the condition code produced by an assembler ++instruction, you must include a branch and a label in the `asm' ++construct, as follows: ++ ++ asm ("clr %0;frob %1;beq 0f;mov #1,%0;0:" ++ : "g" (result) ++ : "g" (input)); ++ ++This assumes your assembler supports local labels, as the GNU assembler ++and most Unix assemblers do. ++ ++ Usually the most convenient way to use these `asm' instructions is to ++encapsulate them in macros that look like functions. For example, ++ ++ #define sin(x) \ ++ ({ double __value, __arg = (x); \ ++ asm ("fsinx %1,%0": "=f" (__value): "f" (__arg)); \ ++ __value; }) ++ ++Here the variable `__arg' is used to make sure that the instruction ++operates on a proper `double' value, and to accept only those arguments ++`x' which can convert automatically to a `double'. ++ ++ Another way to make sure the instruction operates on the correct ++data type is to use a cast in the `asm'. This is different from using a ++variable `__arg' in that it converts more different types. For ++example, if the desired type were `int', casting the argument to `int' ++would accept a pointer with no complaint, while assigning the argument ++to an `int' variable named `__arg' would warn about using a pointer ++unless the caller explicitly casts it. ++ ++ If an `asm' has output operands, GNU CC assumes for optimization ++purposes that the instruction has no side effects except to change the ++output operands. This does not mean that instructions with a side ++effect cannot be used, but you must be careful, because the compiler ++may eliminate them if the output operands aren't used, or move them out ++of loops, or replace two with one if they constitute a common ++subexpression. Also, if your instruction does have a side effect on a ++variable that otherwise appears not to change, the old value of the ++variable may be reused later if it happens to be found in a register. ++ ++ You can prevent an `asm' instruction from being deleted, moved or ++combined by writing the keyword `volatile' after the `asm'. For ++example: ++ ++ #define set_priority(x) \ ++ asm volatile ("set_priority %0": /* no outputs */ : "g" (x)) ++ ++(However, an instruction without output operands will not be deleted or ++moved, regardless, unless it is unreachable.) ++ ++ It is a natural idea to look for a way to give access to the ++condition code left by the assembler instruction. However, when we ++attempted to implement this, we found no way to make it work reliably. ++The problem is that output operands might need reloading, which would ++result in additional following "store" instructions. On most machines, ++these instructions would alter the condition code before there was time ++to test it. This problem doesn't arise for ordinary "test" and ++"compare" instructions because they don't have any output operands. ++ ++ If you are writing a header file that should be includable in ANSI C ++programs, write `__asm__' instead of `asm'. *Note Alternate Keywords::. ++ ++ ++File: gcc.info, Node: Asm Labels, Next: Explicit Reg Vars, Prev: Extended Asm, Up: Extensions ++ ++Controlling Names Used in Assembler Code ++======================================== ++ ++ You can specify the name to be used in the assembler code for a C ++function or variable by writing the `asm' (or `__asm__') keyword after ++the declarator as follows: ++ ++ int foo asm ("myfoo") = 2; ++ ++This specifies that the name to be used for the variable `foo' in the ++assembler code should be `myfoo' rather than the usual `_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 linker that do not start with an underscore. ++ ++ You cannot use `asm' in this way in a function *definition*; but you ++can get the same effect by writing a declaration for the function ++before its definition and putting `asm' there, like this: ++ ++ extern func () asm ("FUNC"); ++ ++ func (x, y) ++ int x, y; ++ ... ++ ++ 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. ++GNU CC does not as yet have the ability to store static variables in ++registers. Perhaps that will be added. ++ ++ ++File: gcc.info, Node: Explicit Reg Vars, Next: Alternate Keywords, Prev: Asm Labels, Up: Extensions ++ ++Variables in Specified Registers ++================================ ++ ++ GNU C allows you to put a few global variables into specified ++hardware registers. You can also specify the register in which an ++ordinary register variable should be allocated. ++ ++ * Global register variables reserve registers throughout the program. ++ This may be useful in programs such as programming language ++ interpreters which have a couple of global variables that are ++ accessed very often. ++ ++ * Local register variables in specific registers do not reserve the ++ registers. The compiler's data flow analysis is capable of ++ determining where the specified registers contain live values, and ++ where they are available for other uses. These local variables are ++ sometimes convenient for use with the extended `asm' feature ++ (*note Extended Asm::.). ++ ++* Menu: ++ ++* Global Reg Vars:: ++* Local Reg Vars:: ++ ++ ++File: gcc.info, Node: Global Reg Vars, Next: Local Reg Vars, Prev: Explicit Reg Vars, Up: Explicit Reg Vars ++ ++Defining Global Register Variables ++---------------------------------- ++ ++ You can define a global register variable in GNU C like this: ++ ++ register int *foo asm ("a5"); ++ ++Here `a5' is the name of the register which should be used. Choose a ++register which is normally saved and restored by function calls on your ++machine, so that library routines will not clobber it. ++ ++ Naturally the register name is cpu-dependent, so you would need to ++conditionalize your program according to cpu type. The register `a5' ++would be a good choice on a 68000 for a variable of pointer type. On ++machines with register windows, be sure to choose a "global" register ++that is not affected magically by the function call mechanism. ++ ++ In addition, operating systems on one type of cpu may differ in how ++they name the registers; then you would need additional conditionals. ++For example, some 68000 operating systems call this register `%a5'. ++ ++ Eventually there may be a way of asking the compiler to choose a ++register automatically, but first we need to figure out how it should ++choose and how to enable you to guide the choice. No solution is ++evident. ++ ++ Defining a global register variable in a certain register reserves ++that register entirely for this use, at least within the current ++compilation. The register will not be allocated for any other purpose ++in the functions in the current compilation. The register will not be ++saved and restored by these functions. Stores into this register are ++never deleted even if they would appear to be dead, but references may ++be deleted or moved or simplified. ++ ++ It is not safe to access the global register variables from signal ++handlers, or from more than one thread of control, because the system ++library routines may temporarily use the register for other things ++(unless you recompile them specially for the task at hand). ++ ++ It is not safe for one function that uses a global register variable ++to call another such function `foo' by way of a third function `lose' ++that was compiled without knowledge of this variable (i.e. in a ++different source file in which the variable wasn't declared). This is ++because `lose' might save the register and put some other value there. ++For example, you can't expect a global register variable to be ++available in the comparison-function that you pass to `qsort', since ++`qsort' might have put something else in that register. (If you are ++prepared to recompile `qsort' with the same global register variable, ++you can solve this problem.) ++ ++ If you want to recompile `qsort' or other source files which do not ++actually use your global register variable, so that they will not use ++that register for any other purpose, then it suffices to specify the ++compiler option `-ffixed-REG'. You need not actually add a global ++register declaration to their source code. ++ ++ A function which can alter the value of a global register variable ++cannot safely be called from a function compiled without this variable, ++because it could clobber the value the caller expects to find there on ++return. Therefore, the function which is the entry point into the part ++of the program that uses the global register variable must explicitly ++save and restore the value which belongs to its caller. ++ ++ On most machines, `longjmp' will restore to each global register ++variable the value it had at the time of the `setjmp'. On some ++machines, however, `longjmp' will not change the value of global ++register variables. To be portable, the function that called `setjmp' ++should make other arrangements to save the values of the global register ++variables, and to restore them in a `longjmp'. This way, the same ++thing will happen regardless of what `longjmp' does. ++ ++ All global register variable declarations must precede all function ++definitions. If such a declaration could appear after function ++definitions, the declaration would be too late to prevent the register ++from being used for other purposes in the preceding functions. ++ ++ Global register variables may not have initial values, because an ++executable file has no means to supply initial contents for a register. ++ ++ ++File: gcc.info, Node: Local Reg Vars, Prev: Global Reg Vars, Up: Explicit Reg Vars ++ ++Specifying Registers for Local Variables ++---------------------------------------- ++ ++ You can define a local register variable with a specified register ++like this: ++ ++ register int *foo asm ("a5"); ++ ++Here `a5' is the name of the register which should be used. Note that ++this is the same syntax used for defining global register variables, ++but for a local variable it would appear within a function. ++ ++ Naturally the register name is cpu-dependent, but this is not a ++problem, since specific registers are most often useful with explicit ++assembler instructions (*note Extended Asm::.). Both of these things ++generally require that you conditionalize your program according to cpu ++type. ++ ++ In addition, operating systems on one type of cpu may differ in how ++they name the registers; then you would need additional conditionals. ++For example, some 68000 operating systems call this register `%a5'. ++ ++ Eventually there may be a way of asking the compiler to choose a ++register automatically, but first we need to figure out how it should ++choose and how to enable you to guide the choice. No solution is ++evident. ++ ++ Defining such a register variable does not reserve the register; it ++remains available for other uses in places where flow control determines ++the variable's value is not live. However, these registers are made ++unavailable for use in the reload pass. I would not be surprised if ++excessive use of this feature leaves the compiler too few available ++registers to compile certain functions. ++ ++ ++File: gcc.info, Node: Alternate Keywords, Prev: Explicit Reg Vars, Up: Extensions ++ ++Alternate Keywords ++================== ++ ++ The option `-traditional' disables certain keywords; `-ansi' ++disables certain others. This causes trouble when you want to use GNU C ++extensions, or ANSI C features, in a general-purpose header file that ++should be usable by all programs, including ANSI C programs and ++traditional ones. The keywords `asm', `typeof' and `inline' cannot be ++used since they won't work in a program compiled with `-ansi', while ++the keywords `const', `volatile', `signed', `typeof' and `inline' won't ++work in a program compiled with `-traditional'. ++ ++ The way to solve these problems is to put `__' at the beginning and ++end of each problematical keyword. For example, use `__asm__' instead ++of `asm', `__const__' instead of `const', and `__inline__' instead of ++`inline'. ++ ++ Other C compilers won't accept these alternative keywords; if you ++want to compile with another compiler, you can define the alternate ++keywords as macros to replace them with the customary keywords. It ++looks like this: ++ ++ #ifndef __GNUC__ ++ #define __asm__ asm ++ #endif ++ ++ ++File: gcc.info, Node: Bugs, Next: Portability, Prev: Extensions, Up: Top ++ ++Reporting Bugs ++************** ++ ++ Your bug reports play an essential role in making GNU CC reliable. ++ ++ When you encounter a problem, the first thing to do is to see if it ++is already known. *Note Trouble::. Also look in *Note ++Incompatibilities::. If it isn't known, then you should report the ++problem. ++ ++ Reporting a bug may help you by bringing a solution to your problem, ++or it may not. (If it does not, look in the service directory; see ++*Note Service::.) In any case, the principal function of a bug report ++is to help the entire community by making the next version of GNU CC ++work better. Bug reports are your contribution to the maintenance of ++GNU CC. ++ ++ In order for a bug report to serve its purpose, you must include the ++information that makes for fixing the bug. ++ ++* Menu: ++ ++* Criteria: Bug Criteria. Have you really found a bug? ++* Reporting: Bug Reporting. How to report a bug effectively. ++ ++ ++File: gcc.info, Node: Bug Criteria, Next: Bug Reporting, Prev: Bugs, Up: Bugs ++ ++Have You Found a Bug? ++===================== ++ ++ If you are not sure whether you have found a bug, here are some ++guidelines: ++ ++ * If the compiler gets a fatal signal, for any input whatever, that ++ is a compiler bug. Reliable compilers never crash. ++ ++ * 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. ++ ++ However, you must double-check to make sure, because you may have ++ run into an incompatibility between GNU C and traditional C (*note ++ Incompatibilities::.). These incompatibilities might be considered ++ bugs, but they are inescapable consequences of valuable features. ++ ++ Or you may have a program whose behavior is undefined, which ++ happened by chance to give the desired results with another C ++ compiler. ++ ++ For example, in many nonoptimizing compilers, you can write `x;' ++ at the end of a function instead of `return x;', with the same ++ results. But the value of the function is undefined if `return' ++ is omitted; it is not a bug when GNU CC produces different results. ++ ++ Problems often result from expressions with two increment ++ operators, as in `f (*p++, *p++)'. Your previous compiler might ++ have interpreted that expression the way you intended; GNU CC might ++ interpret it another way. Neither compiler is wrong. The bug is ++ in your code. ++ ++ After you have localized the error to a single source line, it ++ should be easy to check for these things. If your program is ++ correct and well defined, you have found a compiler bug. ++ ++ * If the compiler produces an error message for valid input, that is ++ a compiler bug. ++ ++ Note that the following is not valid input, and the error message ++ for it is not a bug: ++ ++ int foo (char); ++ ++ int ++ foo (x) ++ char x; ++ { ... } ++ ++ The prototype says to pass a `char', while the definition says to ++ pass an `int' and treat the value as a `char'. This is what the ++ ANSI standard says, and it makes sense. ++ ++ * If the compiler does not produce an error message for invalid ++ input, that is a compiler bug. However, you should note that your ++ idea of "invalid input" might be my idea of "an extension" or ++ "support for traditional practice". ++ ++ * If you are an experienced user of C compilers, your suggestions ++ for improvement of GNU CC are welcome in any case. ++ ++ +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-5 alliance/genview/src/gcc-1.42/gcc.info-5 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-5 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-5 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,1100 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Bug Reporting, Prev: Bug Criteria, Up: Bugs ++ ++How to Report Bugs ++================== ++ ++ Send bug reports for GNU C to one of these addresses: ++ ++ bug-gcc@prep.ai.mit.edu ++ {ucbvax|mit-eddie|uunet}!prep.ai.mit.edu!bug-gcc ++ ++ *Do not send bug reports to `help-gcc', or to the newsgroup ++`gnu.gcc.help'.* Most users of GNU CC do not want to receive bug ++reports. Those that do, have asked to be on `bug-gcc'. ++ ++ The mailing list `bug-gcc' has a newsgroup which serves as a ++repeater. The mailing list and the newsgroup carry exactly the same ++messages. Often people think of posting bug reports to the newsgroup ++instead of mailing them. This appears to work, but it has one problem ++which can be crucial: a newsgroup posting does not contain a mail path ++back to the sender. Thus, if I need to ask for more information, I may ++be unable to reach you. For this reason, it is better to send bug ++reports to the mailing list. ++ ++ As a last resort, send bug reports on paper to: ++ ++ GNU Compiler Bugs ++ Free Software Foundation ++ 675 Mass Ave ++ Cambridge, MA 02139 ++ ++ The fundamental principle of reporting bugs usefully is this: ++*report all the facts*. If you are not sure whether to state a fact or ++leave it out, state it! ++ ++ Often people omit facts because they think they know what causes the ++problem and they conclude that some details don't matter. Thus, you ++might assume that the name of the variable you use in an example does ++not matter. Well, probably it doesn't, but one cannot be sure. Perhaps ++the bug is a stray memory reference which happens to fetch from the ++location where that name is stored in memory; perhaps, if the name were ++different, the contents of that location would fool the compiler into ++doing the right thing despite the bug. Play it safe and give a ++specific, complete example. That is the easiest thing for you to do, ++and the most helpful. ++ ++ Keep in mind that the purpose of a bug report is to enable me to fix ++the bug if it is not known. It isn't very important what happens if ++the bug is already known. Therefore, always write your bug reports on ++the assumption that the bug is not known. ++ ++ Sometimes people give a few sketchy facts and ask, "Does this ring a ++bell?" Those bug reports are useless, and I urge everyone to *refuse ++to respond to them* except to chide the sender to report bugs properly. ++ ++ To enable me to fix the bug, you should include all these things: ++ ++ * The version of GNU CC. You can get this by running it with the ++ `-v' option. ++ ++ Without this, I won't know whether there is any point in looking ++ for the bug in the current version of GNU CC. ++ ++ * A complete input file that will reproduce the bug. If the bug is ++ in the C preprocessor, send me a source file and any header files ++ that it requires. If the bug is in the compiler proper (`cc1'), ++ run your source file through the C preprocessor by doing `gcc -E ++ SOURCEFILE > OUTFILE', then include the contents of OUTFILE in the ++ bug report. (Any `-I', `-D' or `-U' options that you used in ++ actual compilation should also be used when doing this.) ++ ++ A single statement is not enough of an example. In order to ++ compile it, it must be embedded in a function definition; and the ++ bug might depend on the details of how this is done. ++ ++ Without a real example I can compile, all I can do about your bug ++ report is wish you luck. It would be futile to try to guess how to ++ provoke the bug. For example, bugs in register allocation and ++ reloading frequently depend on every little detail of the function ++ they happen in. ++ ++ * The command arguments you gave GNU CC to compile that example and ++ observe the bug. For example, did you use `-O'? To guarantee you ++ won't omit something important, list them all. ++ ++ If I were to try to guess the arguments, I would probably guess ++ wrong and then I would not encounter the bug. ++ ++ * The names of the files that you used for `tm.h' and `md' when you ++ installed the compiler. ++ ++ * The type of machine you are using, and the operating system name ++ and version number. ++ ++ * A description of what behavior you observe that you believe is ++ incorrect. For example, "It gets a fatal signal," or, "There is an ++ incorrect assembler instruction in the output." ++ ++ Of course, if the bug is that the compiler gets a fatal signal, ++ then I will certainly notice it. But if the bug is incorrect ++ output, I might not notice unless it is glaringly wrong. I won't ++ study all the assembler code from a 50-line C program just on the ++ off chance that it might be wrong. ++ ++ Even if the problem you experience is a fatal signal, you should ++ still say so explicitly. Suppose something strange is going on, ++ such as, your copy of the compiler is out of synch, or you have ++ encountered a bug in the C library on your system. (This has ++ happened!) Your copy might crash and mine would not. If you told ++ me to expect a crash, then when mine fails to crash, I would know ++ that the bug was not happening for me. If you had not told me to ++ expect a crash, then I would not be able to draw any conclusion ++ from my observations. ++ ++ Often the observed symptom is incorrect output when your program ++ is run. Sad to say, this is not enough information for me unless ++ the program is short and simple. If you send me a large program, ++ I don't have time to figure out how it would work if compiled ++ correctly, much less which line of it was compiled wrong. So you ++ will have to do that. Tell me which source line it is, and what ++ incorrect result happens when that line is executed. A person who ++ understands the test program can find this as easily as a bug in ++ the program itself. ++ ++ * If you send me examples of output from GNU CC, please use `-g' ++ when you make them. The debugging information includes source line ++ numbers which are essential for correlating the output with the ++ input. ++ ++ * If you wish to suggest changes to the GNU CC source, send me ++ context diffs. If you even discuss something in the GNU CC ++ source, refer to it by context, not by line number. ++ ++ The line numbers in my development sources don't match those in ++ your sources. Your line numbers would convey no useful ++ information to me. ++ ++ * Additional information from a debugger might enable me to find a ++ problem on a machine which I do not have available myself. ++ However, you need to think when you collect this information if ++ you want it to have any chance of being useful. ++ ++ For example, many people send just a backtrace, but that is never ++ useful by itself. A simple backtrace with arguments conveys little ++ about GNU CC because the compiler is largely data-driven; the same ++ functions are called over and over for different RTL insns, doing ++ different things depending on the details of the insn. ++ ++ Most of the arguments listed in the backtrace are useless because ++ they are pointers to RTL list structure. The numeric values of the ++ pointers, which the debugger prints in the backtrace, have no ++ significance whatever; all that matters is the contents of the ++ objects they point to (and most of the contents are other such ++ pointers). ++ ++ In addition, most compiler passes consist of one or more loops that ++ scan the RTL insn sequence. The most vital piece of information ++ about such a loop--which insn it has reached--is usually in a ++ local variable, not in an argument. ++ ++ What you need to provide in addition to a backtrace are the values ++ of the local variables for several stack frames up. When a local ++ variable or an argument is an RTX, first print its value and then ++ use the GDB command `pr' to print the RTL expression that it points ++ to. (If GDB doesn't run on your machine, use your debugger to call ++ the function `debug_rtx' with the RTX as an argument.) In ++ general, whenever a variable is a pointer, its value is no use ++ without the data it points to. ++ ++ In addition, include a debugging dump from just before the pass in ++ which the crash happens. Most bugs involve a series of insns, not ++ just one. ++ ++ Here are some things that are not necessary: ++ ++ * A description of the envelope of the bug. ++ ++ Often people who encounter a bug spend a lot of time investigating ++ which changes to the input file will make the bug go away and which ++ changes will not affect it. ++ ++ This is often time consuming and not very useful, because the way I ++ will find the bug is by running a single example under the debugger ++ with breakpoints, not by pure deduction from a series of examples. ++ I recommend that you save your time for something else. ++ ++ Of course, if you can find a simpler example to report *instead* ++ of the original one, that is a convenience for me. Errors in the ++ output will be easier to spot, running under the debugger will take ++ less time, etc. Most GNU CC bugs involve just one function, so the ++ most straightforward way to simplify an example is to delete all ++ the function definitions except the one where the bug occurs. ++ Those earlier in the file may be replaced by external declarations ++ if the crucial function depends on them. (Exception: inline ++ functions may affect compilation of functions defined later in the ++ file.) ++ ++ However, simplification is not vital; if you don't want to do this, ++ report the bug anyway and send me the entire test case you used. ++ ++ * A patch for the bug. ++ ++ A patch for the bug does help me if it is a good one. But don't ++ omit the necessary information, such as the test case, on the ++ assumption that a patch is all I need. I might see problems with ++ your patch and decide to fix the problem another way, or I might ++ not understand it at all. ++ ++ Sometimes with a program as complicated as GNU CC it is very hard ++ to construct an example that will make the program follow a ++ certain path through the code. If you don't send me the example, ++ I won't be able to construct one, so I won't be able to verify ++ that the bug is fixed. ++ ++ And if I can't understand what bug you are trying to fix, or why ++ your patch should be an improvement, I won't install it. A test ++ case will help me to understand. ++ ++ * A guess about what the bug is or what it depends on. ++ ++ Such guesses are usually wrong. Even I can't guess right about ++ such things without first using the debugger to find the facts. ++ ++ ++File: gcc.info, Node: Portability, Next: Interface, Prev: Bugs, Up: Top ++ ++GNU CC and Portability ++********************** ++ ++ The main goal of GNU CC was to make a good, fast compiler for ++machines in the class that the GNU system aims to run on: 32-bit ++machines that address 8-bit bytes and have several general registers. ++Elegance, theoretical power and simplicity are only secondary. ++ ++ GNU CC gets most of the information about the target machine from a ++machine description which gives an algebraic formula for each of the ++machine's instructions. This is a very clean way to describe the ++target. But when the compiler needs information that is difficult to ++express in this fashion, I have not hesitated to define an ad-hoc ++parameter to the machine description. The purpose of portability is to ++reduce the total work needed on the compiler; it was not of interest ++for its own sake. ++ ++ GNU CC does not contain machine dependent code, but it does contain ++code that depends on machine parameters such as endianness (whether the ++most significant byte has the highest or lowest address of the bytes in ++a word) and the availability of autoincrement addressing. In the ++RTL-generation pass, it is often necessary to have multiple strategies ++for generating code for a particular kind of syntax tree, strategies ++that are usable for different combinations of parameters. Often I have ++not tried to address all possible cases, but only the common ones or ++only the ones that I have encountered. As a result, a new target may ++require additional strategies. You will know if this happens because ++the compiler will call `abort'. Fortunately, the new strategies can be ++added in a machine-independent fashion, and will affect only the target ++machines that need them. ++ ++ ++File: gcc.info, Node: Interface, Next: Passes, Prev: Portability, Up: Top ++ ++Interfacing to GNU CC Output ++**************************** ++ ++ GNU CC is normally configured to use the same function calling ++convention normally in use on the target system. This is done with the ++machine-description macros described (*note Machine Macros::.). ++ ++ However, returning of structure and union values is done differently ++on some target machines. As a result, functions compiled with PCC ++returning such types cannot be called from code compiled with GNU CC, ++and vice versa. This does not cause trouble often because few Unix ++library routines return structures or unions. ++ ++ GNU CC code returns structures and unions that are 1, 2, 4 or 8 bytes ++long in the same registers used for `int' or `double' return values. ++(GNU CC typically allocates variables of such types in registers also.) ++ Structures and unions of other sizes are returned by storing them into ++an address passed by the caller (usually in a register). The ++machine-description macros `STRUCT_VALUE' and `STRUCT_INCOMING_VALUE' ++tell GNU CC where to pass this address. ++ ++ By contrast, PCC on most target machines returns structures and ++unions of any size by copying the data into an area of static storage, ++and then returning the address of that storage as if it were a pointer ++value. The caller must copy the data from that memory area to the place ++where the value is wanted. This is slower than the method used by GNU ++CC, and fails to be reentrant. ++ ++ On some target machines, such as RISC machines and the 80386, the ++standard system convention is to pass to the subroutine the address of ++where to return the value. On these machines, GNU CC has been ++configured to be compatible with the standard compiler, when this method ++is used. It may not be compatible for structures of 1, 2, 4 or 8 bytes. ++ ++ GNU CC uses the system's standard convention for passing arguments. ++On some machines, the first few arguments are passed in registers; in ++others, all are passed on the stack. It would be possible to use ++registers for argument passing on any machine, and this would probably ++result in a significant speedup. But the result would be complete ++incompatibility with code that follows the standard convention. So this ++change is practical only if you are switching to GNU CC as the sole C ++compiler for the system. We may implement register argument passing on ++certain machines once we have a complete GNU system so that we can ++compile the libraries with GNU CC. ++ ++ If you use `longjmp', beware of automatic variables. ANSI C says ++that automatic variables that are not declared `volatile' have undefined ++values after a `longjmp'. And this is all GNU CC promises to do, ++because it is very difficult to restore register variables correctly, ++and one of GNU CC's features is that it can put variables in registers ++without your asking it to. ++ ++ If you want a variable to be unaltered by `longjmp', and you don't ++want to write `volatile' because old C compilers don't accept it, just ++take the address of the variable. If a variable's address is ever ++taken, even if just to compute it and ignore it, then the variable ++cannot go in a register: ++ ++ { ++ int careful; ++ &careful; ++ ... ++ } ++ ++ Code compiled with GNU CC may call certain library routines. Most of ++them handle arithmetic for which there are no instructions. This ++includes multiply and divide on some machines, and floating point ++operations on any machine for which floating point support is disabled ++with `-msoft-float'. Some standard parts of the C library, such as ++`bcopy' or `memcpy', are also called automatically. The usual function ++call interface is used for calling the library routines. ++ ++ These library routines should be defined in the library `gnulib', ++which GNU CC automatically searches whenever it links a program. On ++machines that have multiply and divide instructions, if hardware ++floating point is in use, normally `gnulib' is not needed, but it is ++searched just in case. ++ ++ Each arithmetic function is defined in `gnulib.c' to use the ++corresponding C arithmetic operator. As long as the file is compiled ++with another C compiler, which supports all the C arithmetic operators, ++this file will work portably. However, `gnulib.c' does not work if ++compiled with GNU CC, because each arithmetic function would compile ++into a call to itself! ++ ++ ++File: gcc.info, Node: Passes, Next: RTL, Prev: Interface, Up: Top ++ ++Passes and Files of the Compiler ++******************************** ++ ++ The overall control structure of the compiler is in `toplev.c'. This ++file is responsible for initialization, decoding arguments, opening and ++closing files, and sequencing the passes. ++ ++ The parsing pass is invoked only once, to parse the entire input. ++The RTL intermediate code for a function is generated as the function ++is parsed, a statement at a time. Each statement is read in as a ++syntax tree and then converted to RTL; then the storage for the tree ++for the statement is reclaimed. Storage for types (and the expressions ++for their sizes), declarations, and a representation of the binding ++contours and how they nest, remains until the function is finished ++being compiled; these are all needed to output the debugging ++information. ++ ++ Each time the parsing pass reads a complete function definition or ++top-level declaration, it calls the function `rest_of_compilation' or ++`rest_of_decl_compilation' in `toplev.c', which are responsible for all ++further processing necessary, ending with output of the assembler ++language. All other compiler passes run, in sequence, within ++`rest_of_compilation'. When that function returns from compiling a ++function definition, the storage used for that function definition's ++compilation is entirely freed, unless it is an inline function (*note ++Inline::.). ++ ++ Here is a list of all the passes of the compiler and their source ++files. Also included is a description of where debugging dumps can be ++requested with `-d' options. ++ ++ * Parsing. This pass reads the entire text of a function definition, ++ constructing partial syntax trees. This and RTL generation are no ++ longer truly separate passes (formerly they were), but it is ++ easier to think of them as separate. ++ ++ The tree representation does not entirely follow C syntax, because ++ it is intended to support other languages as well. ++ ++ C data type analysis is also done in this pass, and every tree node ++ that represents an expression has a data type attached. Variables ++ are represented as declaration nodes. ++ ++ Constant folding and associative-law simplifications are also done ++ during this pass. ++ ++ The source files for parsing are `c-parse.y', `c-decl.c', ++ `c-typeck.c', `c-convert.c', `stor-layout.c', `fold-const.c', and ++ `tree.c'. The last three files are intended to be ++ language-independent. There are also header files `c-parse.h', ++ `c-tree.h', `tree.h' and `tree.def'. The last two define the ++ format of the tree representation. ++ ++ * RTL generation. This is the conversion of syntax tree into RTL ++ code. It is actually done statement-by-statement during parsing, ++ but for most purposes it can be thought of as a separate pass. ++ ++ This is where the bulk of target-parameter-dependent code is found, ++ since often it is necessary for strategies to apply only when ++ certain standard kinds of instructions are available. The purpose ++ of named instruction patterns is to provide this information to ++ the RTL generation pass. ++ ++ Optimization is done in this pass for `if'-conditions that are ++ comparisons, boolean operations or conditional expressions. Tail ++ recursion is detected at this time also. Decisions are made about ++ how best to arrange loops and how to output `switch' statements. ++ ++ The source files for RTL generation are `stmt.c', `expr.c', ++ `explow.c', `expmed.c', `optabs.c' and `emit-rtl.c'. Also, the ++ file `insn-emit.c', generated from the machine description by the ++ program `genemit', is used in this pass. The header files ++ `expr.h' is used for communication within this pass. ++ ++ The header files `insn-flags.h' and `insn-codes.h', generated from ++ the machine description by the programs `genflags' and `gencodes', ++ tell this pass which standard names are available for use and ++ which patterns correspond to them. ++ ++ Aside from debugging information output, none of the following ++ passes refers to the tree structure representation of the function ++ (only part of which is saved). ++ ++ The decision of whether the function can and should be expanded ++ inline in its subsequent callers is made at the end of rtl ++ generation. The function must meet certain criteria, currently ++ related to the size of the function and the types and number of ++ parameters it has. Note that this function may contain loops, ++ recursive calls to itself (tail-recursive functions can be ++ inlined!), gotos, in short, all constructs supported by GNU CC. ++ ++ The option `-dr' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.rtl' to ++ the input file name. ++ ++ * Jump optimization. This pass simplifies jumps to the following ++ instruction, jumps across jumps, and jumps to jumps. It deletes ++ unreferenced labels and unreachable code, except that unreachable ++ code that contains a loop is not recognized as unreachable in this ++ pass. (Such loops are deleted later in the basic block analysis.) ++ ++ Jump optimization is performed two or three times. The first time ++ is immediately following RTL generation. The second time is after ++ CSE, but only if CSE says repeated jump optimization is needed. ++ The last time is right before the final pass. That time, ++ cross-jumping and deletion of no-op move instructions are done ++ together with the optimizations described above. ++ ++ The source file of this pass is `jump.c'. ++ ++ The option `-dj' causes a debugging dump of the RTL code after ++ this pass is run for the first time. This dump file's name is ++ made by appending `.jump' to the input file name. ++ ++ * Register scan. This pass finds the first and last use of each ++ register, as a guide for common subexpression elimination. Its ++ source is in `regclass.c'. ++ ++ * Common subexpression elimination. This pass also does constant ++ propagation. Its source file is `cse.c'. If constant propagation ++ causes conditional jumps to become unconditional or to become ++ no-ops, jump optimization is run again when CSE is finished. ++ ++ The option `-ds' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.cse' to ++ the input file name. ++ ++ * Loop optimization. This pass moves constant expressions out of ++ loops, and optionally does strength-reduction as well. Its source ++ file is `loop.c'. ++ ++ The option `-dL' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.loop' to ++ the input file name. ++ ++ * Stupid register allocation is performed at this point in a ++ nonoptimizing compilation. It does a little data flow analysis as ++ well. When stupid register allocation is in use, the next pass ++ executed is the reloading pass; the others in between are skipped. ++ The source file is `stupid.c'. ++ ++ * Data flow analysis (`flow.c'). This pass divides the program into ++ basic blocks (and in the process deletes unreachable loops); then ++ it computes which pseudo-registers are live at each point in the ++ program, and makes the first instruction that uses a value point at ++ the instruction that computed the value. ++ ++ This pass also deletes computations whose results are never used, ++ and combines memory references with add or subtract instructions ++ to make autoincrement or autodecrement addressing. ++ ++ The option `-df' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.flow' to ++ the input file name. If stupid register allocation is in use, this ++ dump file reflects the full results of such allocation. ++ ++ * Instruction combination (`combine.c'). This pass attempts to ++ combine groups of two or three instructions that are related by ++ data flow into single instructions. It combines the RTL ++ expressions for the instructions by substitution, simplifies the ++ result using algebra, and then attempts to match the result ++ against the machine description. ++ ++ The option `-dc' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.combine' ++ to the input file name. ++ ++ * Register class preferencing. The RTL code is scanned to find out ++ which register class is best for each pseudo register. The source ++ file is `regclass.c'. ++ ++ * Local register allocation (`local-alloc.c'). This pass allocates ++ hard registers to pseudo registers that are used only within one ++ basic block. Because the basic block is linear, it can use fast ++ and powerful techniques to do a very good job. ++ ++ The option `-dl' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.lreg' to ++ the input file name. ++ ++ * Global register allocation (`global-alloc.c'). This pass ++ allocates hard registers for the remaining pseudo registers (those ++ whose life spans are not contained in one basic block). ++ ++ * Reloading. This pass renumbers pseudo registers with the hardware ++ registers numbers they were allocated. Pseudo registers that did ++ not get hard registers are replaced with stack slots. Then it ++ finds instructions that are invalid because a value has failed to ++ end up in a register, or has ended up in a register of the wrong ++ kind. It fixes up these instructions by reloading the ++ problematical values temporarily into registers. Additional ++ instructions are generated to do the copying. ++ ++ Source files are `reload.c' and `reload1.c', plus the header ++ `reload.h' used for communication between them. ++ ++ The option `-dg' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.greg' to ++ the input file name. ++ ++ * Jump optimization is repeated, this time including cross-jumping ++ and deletion of no-op move instructions. ++ ++ The option `-dJ' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.jump2' to ++ the input file name. ++ ++ * Delayed branch scheduling may be done at this point. The source ++ file name is `dbranch.c'. ++ ++ The option `-dd' causes a debugging dump of the RTL code after ++ this pass. This dump file's name is made by appending `.dbr' to ++ the input file name. ++ ++ * Final. This pass outputs the assembler code for the function. It ++ is also responsible for identifying spurious test and compare ++ instructions. Machine-specific peephole optimizations are ++ performed at the same time. The function entry and exit sequences ++ are generated directly as assembler code in this pass; they never ++ exist as RTL. ++ ++ The source files are `final.c' plus `insn-output.c'; the latter is ++ generated automatically from the machine description by the tool ++ `genoutput'. The header file `conditions.h' is used for ++ communication between these files. ++ ++ * Debugging information output. This is run after final because it ++ must output the stack slot offsets for pseudo registers that did ++ not get hard registers. Source files are `dbxout.c' for DBX ++ symbol table format and `symout.c' for GDB's own symbol table ++ format. ++ ++ Some additional files are used by all or many passes: ++ ++ * Every pass uses `machmode.def', which defines the machine modes. ++ ++ * All the passes that work with RTL use the header files `rtl.h' and ++ `rtl.def', and subroutines in file `rtl.c'. The tools `gen*' also ++ use these files to read and work with the machine description RTL. ++ ++ * Several passes refer to the header file `insn-config.h' which ++ contains a few parameters (C macro definitions) generated ++ automatically from the machine description RTL by the tool ++ `genconfig'. ++ ++ * Several passes use the instruction recognizer, which consists of ++ `recog.c' and `recog.h', plus the files `insn-recog.c' and ++ `insn-extract.c' that are generated automatically from the machine ++ description by the tools `genrecog' and `genextract'. ++ ++ * Several passes use the header files `regs.h' which defines the ++ information recorded about pseudo register usage, and ++ `basic-block.h' which defines the information recorded about basic ++ blocks. ++ ++ * `hard-reg-set.h' defines the type `HARD_REG_SET', a bit-vector ++ with a bit for each hard register, and some macros to manipulate ++ it. This type is just `int' if the machine has few enough hard ++ registers; otherwise it is an array of `int' and some of the ++ macros expand into loops. ++ ++ ++File: gcc.info, Node: RTL, Next: Machine Desc, Prev: Passes, Up: Top ++ ++RTL Representation ++****************** ++ ++ Most of the work of the compiler is done on an intermediate ++representation called register transfer language. In this language, ++the instructions to be output are described, pretty much one by one, in ++an algebraic form that describes what the instruction does. ++ ++ RTL is inspired by Lisp lists. It has both an internal form, made ++up of structures that point at other structures, and a textual form ++that is used in the machine description and in printed debugging dumps. ++ The textual form uses nested parentheses to indicate the pointers in ++the internal form. ++ ++* Menu: ++ ++* RTL Objects:: Expressions vs vectors vs strings vs integers. ++* Accessors:: Macros to access expression operands or vector elts. ++* Flags:: Other flags in an RTL expression. ++* Machine Modes:: Describing the size and format of a datum. ++* Constants:: Expressions with constant values. ++* Regs and Memory:: Expressions representing register contents or memory. ++* Arithmetic:: Expressions representing arithmetic on other expressions. ++* Comparisons:: Expressions representing comparison of expressions. ++* Bit Fields:: Expressions representing bit-fields in memory or reg. ++* Conversions:: Extending, truncating, floating or fixing. ++* RTL Declarations:: Declaring volatility, constancy, etc. ++* Side Effects:: Expressions for storing in registers, etc. ++* Incdec:: Embedded side-effects for autoincrement addressing. ++* Assembler:: Representing `asm' with operands. ++* Insns:: Expression types for entire insns. ++* Calls:: RTL representation of function call insns. ++* Sharing:: Some expressions are unique; others *must* be copied. ++ ++ ++File: gcc.info, Node: RTL Objects, Next: Accessors, Prev: RTL, Up: RTL ++ ++RTL Object Types ++================ ++ ++ RTL uses four kinds of objects: expressions, integers, strings and ++vectors. Expressions are the most important ones. An RTL expression ++("RTX", for short) is a C structure, but it is usually referred to with ++a pointer; a type that is given the typedef name `rtx'. ++ ++ An integer is simply an `int', and a string is a `char *'. Within ++RTL code, strings appear only inside `symbol_ref' expressions, but they ++appear in other contexts in the RTL expressions that make up machine ++descriptions. Their written form uses decimal digits. ++ ++ A string is a sequence of characters. In core it is represented as a ++`char *' in usual C fashion, and it is written in C syntax as well. ++However, strings in RTL may never be null. If you write an empty ++string in a machine description, it is represented in core as a null ++pointer rather than as a pointer to a null character. In certain ++contexts, these null pointers instead of strings are valid. ++ ++ A vector contains an arbitrary, specified number of pointers to ++expressions. The number of elements in the vector is explicitly ++present in the vector. The written form of a vector consists of square ++brackets (`[...]') surrounding the elements, in sequence and with ++whitespace separating them. Vectors of length zero are not created; ++null pointers are used instead. ++ ++ Expressions are classified by "expression codes" (also called RTX ++codes). The expression code is a name defined in `rtl.def', which is ++also (in upper case) a C enumeration constant. The possible expression ++codes and their meanings are machine-independent. The code of an RTX ++can be extracted with the macro `GET_CODE (X)' and altered with ++`PUT_CODE (X, NEWCODE)'. ++ ++ The expression code determines how many operands the expression ++contains, and what kinds of objects they are. In RTL, unlike Lisp, you ++cannot tell by looking at an operand what kind of object it is. ++Instead, you must know from its context--from the expression code of ++the containing expression. For example, in an expression of code ++`subreg', the first operand is to be regarded as an expression and the ++second operand as an integer. In an expression of code `plus', there ++are two operands, both of which are to be regarded as expressions. In ++a `symbol_ref' expression, there is one operand, which is to be ++regarded as a string. ++ ++ Expressions are written as parentheses containing the name of the ++expression type, its flags and machine mode if any, and then the ++operands of the expression (separated by spaces). ++ ++ Expression code names in the `md' file are written in lower case, ++but when they appear in C code they are written in upper case. In this ++manual, they are shown as follows: `const_int'. ++ ++ In a few contexts a null pointer is valid where an expression is ++normally wanted. The written form of this is `(nil)'. ++ ++ ++File: gcc.info, Node: Accessors, Next: Flags, Prev: RTL Objects, Up: RTL ++ ++Access to Operands ++================== ++ ++ For each expression type `rtl.def' specifies the number of contained ++objects and their kinds, with four possibilities: `e' for expression ++(actually a pointer to an expression), `i' for integer, `s' for string, ++and `E' for vector of expressions. The sequence of letters for an ++expression code is called its "format". Thus, the format of `subreg' ++is `ei'. ++ ++ Two other format characters are used occasionally: `u' and `0'. `u' ++is equivalent to `e' except that it is printed differently in debugging ++dumps, and `0' means a slot whose contents do not fit any normal ++category. `0' slots are not printed at all in dumps, and are often ++used in special ways by small parts of the compiler. ++ ++ There are macros to get the number of operands and the format of an ++expression code: ++ ++`GET_RTX_LENGTH (CODE)' ++ Number of operands of an RTX of code CODE. ++ ++`GET_RTX_FORMAT (CODE)' ++ The format of an RTX of code CODE, as a C string. ++ ++ Operands of expressions are accessed using the macros `XEXP', `XINT' ++and `XSTR'. Each of these macros takes two arguments: an ++expression-pointer (RTX) and an operand number (counting from zero). ++Thus, ++ ++ XEXP (X, 2) ++ ++accesses operand 2 of expression X, as an expression. ++ ++ XINT (X, 2) ++ ++accesses the same operand as an integer. `XSTR', used in the same ++fashion, would access it as a string. ++ ++ Any operand can be accessed as an integer, as an expression or as a ++string. You must choose the correct method of access for the kind of ++value actually stored in the operand. You would do this based on the ++expression code of the containing expression. That is also how you ++would know how many operands there are. ++ ++ For example, if X is a `subreg' expression, you know that it has two ++operands which can be correctly accessed as `XEXP (X, 0)' and `XINT (X, ++1)'. If you did `XINT (X, 0)', you would get the address of the ++expression operand but cast as an integer; that might occasionally be ++useful, but it would be cleaner to write `(int) XEXP (X, 0)'. `XEXP ++(X, 1)' would also compile without error, and would return the second, ++integer operand cast as an expression pointer, which would probably ++result in a crash when accessed. Nothing stops you from writing `XEXP ++(X, 28)' either, but this will access memory past the end of the ++expression with unpredictable results. ++ ++ Access to operands which are vectors is more complicated. You can ++use the macro `XVEC' to get the vector-pointer itself, or the macros ++`XVECEXP' and `XVECLEN' to access the elements and length of a vector. ++ ++`XVEC (EXP, IDX)' ++ Access the vector-pointer which is operand number IDX in EXP. ++ ++`XVECLEN (EXP, IDX)' ++ Access the length (number of elements) in the vector which is in ++ operand number IDX in EXP. This value is an `int'. ++ ++`XVECEXP (EXP, IDX, ELTNUM)' ++ Access element number ELTNUM in the vector which is in operand ++ number IDX in EXP. This value is an RTX. ++ ++ It is up to you to make sure that ELTNUM is not negative and is ++ less than `XVECLEN (EXP, IDX)'. ++ ++ All the macros defined in this section expand into lvalues and ++therefore can be used to assign the operands, lengths and vector ++elements as well as to access them. ++ ++ ++File: gcc.info, Node: Flags, Next: Machine Modes, Prev: Accessors, Up: RTL ++ ++Flags in an RTL Expression ++========================== ++ ++ RTL expressions contain several flags (one-bit bit-fields) that are ++used in certain types of expression. Most often they are accessed with ++the following macros: ++ ++`EXTERNAL_SYMBOL_P (X)' ++ In a `symbol_ref' expression, nonzero if it corresponds to a ++ variable declared extern in the users code. Zero for all other ++ variables. Stored in the `volatil' field and printed as `/v'. ++ ++`MEM_VOLATILE_P (X)' ++ In `mem' expressions, nonzero for volatile memory references. ++ Stored in the `volatil' field and printed as `/v'. ++ ++`MEM_IN_STRUCT_P (X)' ++ In `mem' expressions, nonzero for reference to an entire ++ structure, union or array, or to a component of one. Zero for ++ references to a scalar variable or through a pointer to a scalar. ++ Stored in the `in_struct' field and printed as `/s'. ++ ++`REG_USER_VAR_P (X)' ++ In a `reg', nonzero if it corresponds to a variable present in the ++ user's source code. Zero for temporaries generated internally by ++ the compiler. Stored in the `volatil' field and printed as `/v'. ++ ++`REG_FUNCTION_VALUE_P (X)' ++ Nonzero in a `reg' if it is the place in which this function's ++ value is going to be returned. (This happens only in a hard ++ register.) Stored in the `integrated' field and printed as `/i'. ++ ++ The same hard register may be used also for collecting the values ++ of functions called by this one, but `REG_FUNCTION_VALUE_P' is zero ++ in this kind of use. ++ ++`RTX_UNCHANGING_P (X)' ++ Nonzero in a `reg' or `mem' if the value is not changed explicitly ++ by the current function. (If it is a memory reference then it may ++ be changed by other functions or by aliasing.) Stored in the ++ `unchanging' field and printed as `/u'. ++ ++`RTX_INTEGRATED_P (INSN)' ++ Nonzero in an insn if it resulted from an in-line function call. ++ Stored in the `integrated' field and printed as `/i'. This may be ++ deleted; nothing currently depends on it. ++ ++`INSN_DELETED_P (INSN)' ++ In an insn, nonzero if the insn has been deleted. Stored in the ++ `volatil' field and printed as `/v'. ++ ++`CONSTANT_POOL_ADDRESS_P (X)' ++ Nonzero in a `symbol_ref' if it refers to part of the current ++ function's "constants pool". These are addresses close to the ++ beginning of the function, and GNU CC assumes they can be addressed ++ directly (perhaps with the help of base registers). Stored in the ++ `unchanging' field and printed as `/u'. ++ ++ These are the fields which the above macros refer to: ++ ++`used' ++ This flag is used only momentarily, at the end of RTL generation ++ for a function, to count the number of times an expression appears ++ in insns. Expressions that appear more than once are copied, ++ according to the rules for shared structure (*note Sharing::.). ++ ++`volatil' ++ This flag is used in `mem',`symbol_ref' and `reg' expressions and ++ in insns. In RTL dump files, it is printed as `/v'. ++ ++ In a `mem' expression, it is 1 if the memory reference is volatile. ++ Volatile memory references may not be deleted, reordered or ++ combined. ++ ++ In a `reg' expression, it is 1 if the value is a user-level ++ variable. 0 indicates an internal compiler temporary. ++ ++ In a `symbol_ref' expression, it is 1 if the symbol is declared ++ `extern'. ++ ++ In an insn, 1 means the insn has been deleted. ++ ++`in_struct' ++ This flag is used in `mem' expressions. It is 1 if the memory ++ datum referred to is all or part of a structure or array; 0 if it ++ is (or might be) a scalar variable. A reference through a C ++ pointer has 0 because the pointer might point to a scalar variable. ++ ++ This information allows the compiler to determine something about ++ possible cases of aliasing. ++ ++ In an RTL dump, this flag is represented as `/s'. ++ ++`unchanging' ++ This flag is used in `reg' and `mem' expressions. 1 means that ++ the value of the expression never changes (at least within the ++ current function). ++ ++ In an RTL dump, this flag is represented as `/u'. ++ ++`integrated' ++ In some kinds of expressions, including insns, this flag means the ++ rtl was produced by procedure integration. ++ ++ In a `reg' expression, this flag indicates the register containing ++ the value to be returned by the current function. On machines ++ that pass parameters in registers, the same register number may be ++ used for parameters as well, but this flag is not set on such uses. ++ ++ ++File: gcc.info, Node: Machine Modes, Next: Constants, Prev: Flags, Up: RTL ++ ++Machine Modes ++============= ++ ++ A machine mode describes a size of data object and the ++representation used for it. In the C code, machine modes are ++represented by an enumeration type, `enum machine_mode', defined in ++`machmode.def'. Each RTL expression has room for a machine mode and so ++do certain kinds of tree expressions (declarations and types, to be ++precise). ++ ++ In debugging dumps and machine descriptions, the machine mode of an ++RTL expression is written after the expression code with a colon to ++separate them. The letters `mode' which appear at the end of each ++machine mode name are omitted. For example, `(reg:SI 38)' is a `reg' ++expression with machine mode `SImode'. If the mode is `VOIDmode', it ++is not written at all. ++ ++ Here is a table of machine modes. ++ ++`QImode' ++ "Quarter-Integer" mode represents a single byte treated as an ++ integer. ++ ++`HImode' ++ "Half-Integer" mode represents a two-byte integer. ++ ++`PSImode' ++ "Partial Single Integer" mode represents an integer which occupies ++ four bytes but which doesn't really use all four. On some ++ machines, this is the right mode to use for pointers. ++ ++`SImode' ++ "Single Integer" mode represents a four-byte integer. ++ ++`PDImode' ++ "Partial Double Integer" mode represents an integer which occupies ++ eight bytes but which doesn't really use all eight. On some ++ machines, this is the right mode to use for certain pointers. ++ ++`DImode' ++ "Double Integer" mode represents an eight-byte integer. ++ ++`TImode' ++ "Tetra Integer" (?) mode represents a sixteen-byte integer. ++ ++`SFmode' ++ "Single Floating" mode represents a single-precision (four byte) ++ floating point number. ++ ++`DFmode' ++ "Double Floating" mode represents a double-precision (eight byte) ++ floating point number. ++ ++`XFmode' ++ "Extended Floating" mode represents a triple-precision (twelve ++ byte) floating point number. This mode is used for IEEE extended ++ floating point. ++ ++`TFmode' ++ "Tetra Floating" mode represents a quadruple-precision (sixteen ++ byte) floating point number. ++ ++`BLKmode' ++ "Block" mode represents values that are aggregates to which none of ++ the other modes apply. In RTL, only memory references can have ++ this mode, and only if they appear in string-move or vector ++ instructions. On machines which have no such instructions, ++ `BLKmode' will not appear in RTL. ++ ++`VOIDmode' ++ Void mode means the absence of a mode or an unspecified mode. For ++ example, RTL expressions of code `const_int' have mode `VOIDmode' ++ because they can be taken to have whatever mode the context ++ requires. In debugging dumps of RTL, `VOIDmode' is expressed by ++ the absence of any mode. ++ ++`EPmode' ++ "Entry Pointer" mode is intended to be used for function variables ++ in Pascal and other block structured languages. Such values ++ contain both a function address and a static chain pointer for ++ access to automatic variables of outer levels. This mode is only ++ partially implemented since C does not use it. ++ ++`CSImode, ...' ++ "Complex Single Integer" mode stands for a complex number ++ represented as a pair of `SImode' integers. Any of the integer ++ and floating modes may have `C' prefixed to its name to obtain a ++ complex number mode. For example, there are `CQImode', `CSFmode', ++ and `CDFmode'. Since C does not support complex numbers, these ++ machine modes are only partially implemented. ++ ++`BImode' ++ This is the machine mode of a bit-field in a structure. It is used ++ only in the syntax tree, never in RTL, and in the syntax tree it ++ appears only in declaration nodes. In C, it appears only in ++ `FIELD_DECL' nodes for structure fields defined with a bit size. ++ ++ The machine description defines `Pmode' as a C macro which expands ++into the machine mode used for addresses. Normally this is `SImode'. ++ ++ The only modes which a machine description must support are ++`QImode', `SImode', `SFmode' and `DFmode'. The compiler will attempt ++to use `DImode' for two-word structures and unions, but this can be ++prevented by overriding the definition of `MAX_FIXED_MODE_SIZE'. ++Likewise, you can arrange for the C type `short int' to avoid using ++`HImode'. In the long term it might be desirable to make the set of ++available machine modes machine-dependent and eliminate all assumptions ++about specific machine modes or their uses from the machine-independent ++code of the compiler. ++ ++ To help begin this process, the machine modes are divided into mode ++classes. These are represented by the enumeration type `enum ++mode_class' defined in `rtl.h'. The possible mode classes are: ++ ++`MODE_INT' ++ Integer modes. By default these are `QImode', `HImode', `SImode', ++ `DImode', `TImode', and also `BImode'. ++ ++`MODE_FLOAT' ++ Floating-point modes. By default these are `QFmode', `HFmode', ++ `SFmode', `DFmode' and `TFmode', but the MC68881 also defines ++ `XFmode' to be an 80-bit extended-precision floating-point mode. ++ ++`MODE_COMPLEX_INT' ++ Complex integer modes. By default these are `CQImode', `CHImode', ++ `CSImode', `CDImode' and `CTImode'. ++ ++`MODE_COMPLEX_FLOAT' ++ Complex floating-point modes. By default these are `CQFmode', ++ `CHFmode', `CSFmode', `CDFmode' and `CTFmode', ++ ++`MODE_FUNCTION' ++ Algol or Pascal function variables including a static chain. ++ (These are not currently implemented). ++ ++`MODE_RANDOM' ++ This is a catchall mode class for modes which don't fit into the ++ above classes. Currently `VOIDmode', `BLKmode' and `EPmode' are ++ in `MODE_RANDOM'. ++ ++ Here are some C macros that relate to machine modes: ++ ++`GET_MODE (X)' ++ Returns the machine mode of the RTX X. ++ ++`PUT_MODE (X, NEWMODE)' ++ Alters the machine mode of the RTX X to be NEWMODE. ++ ++`NUM_MACHINE_MODES' ++ Stands for the number of machine modes available on the target ++ machine. This is one greater than the largest numeric value of any ++ machine mode. ++ ++`GET_MODE_NAME (M)' ++ Returns the name of mode M as a string. ++ ++`GET_MODE_CLASS (M)' ++ Returns the mode class of mode M. ++ ++`GET_MODE_SIZE (M)' ++ Returns the size in bytes of a datum of mode M. ++ ++`GET_MODE_BITSIZE (M)' ++ Returns the size in bits of a datum of mode M. ++ ++`GET_MODE_UNIT_SIZE (M)' ++ Returns the size in bits of the subunits of a datum of mode M. ++ This is the same as `GET_MODE_SIZE' except in the case of complex ++ modes and `EPmode'. For them, the unit size is the size of the ++ real or imaginary part, or the size of the function pointer or the ++ context pointer. ++ ++ +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-6 alliance/genview/src/gcc-1.42/gcc.info-6 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-6 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-6 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,1143 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Constants, Next: Regs and Memory, Prev: Machine Modes, Up: RTL ++ ++Constant Expression Types ++========================= ++ ++ The simplest RTL expressions are those that represent constant ++values. ++ ++`(const_int I)' ++ This type of expression represents the integer value I. I is ++ customarily accessed with the macro `INTVAL' as in `INTVAL (EXP)', ++ which is equivalent to `XINT (EXP, 0)'. ++ ++ There is only one expression object for the integer value zero; it ++ is the value of the variable `const0_rtx'. Likewise, the only ++ expression for integer value one is found in `const1_rtx'. Any ++ attempt to create an expression of code `const_int' and value zero ++ or one will return `const0_rtx' or `const1_rtx' as appropriate. ++ ++`(const_double:M I0 I1)' ++ Represents a 64-bit constant of mode M. All floating point ++ constants are represented in this way, and so are 64-bit `DImode' ++ integer constants. ++ ++ The two integers I0 and I1 together contain the bits of the value. ++ If the constant is floating point (either single or double ++ precision), then they represent a `double'. To convert them to a ++ `double', do ++ ++ union { double d; int i[2];} u; ++ u.i[0] = CONST_DOUBLE_LOW(x); ++ u.i[1] = CONST_DOUBLE_HIGH(x); ++ ++ and then refer to `u.d'. ++ ++ The global variables `dconst0_rtx' and `fconst0_rtx' hold ++ `const_double' expressions with value 0, in modes `DFmode' and ++ `SFmode', respectively. The macro `CONST0_RTX (MODE)' refers to a ++ `const_double' expression with value 0 in mode MODE. The mode ++ MODE must be of mode class `MODE_FLOAT'. ++ ++`(symbol_ref SYMBOL)' ++ Represents the value of an assembler label for data. SYMBOL is a ++ string that describes the name of the assembler label. If it ++ starts with a `*', the label is the rest of SYMBOL not including ++ the `*'. Otherwise, the label is SYMBOL, prefixed with `_'. ++ ++`(label_ref LABEL)' ++ Represents the value of an assembler label for code. It contains ++ one operand, an expression, which must be a `code_label' that ++ appears in the instruction sequence to identify the place where ++ the label should go. ++ ++ The reason for using a distinct expression type for code label ++ references is so that jump optimization can distinguish them. ++ ++`(const EXP)' ++ Represents a constant that is the result of an assembly-time ++ arithmetic computation. The operand, EXP, is an expression that ++ contains only constants (`const_int', `symbol_ref' and `label_ref' ++ expressions) combined with `plus' and `minus'. However, not all ++ combinations are valid, since the assembler cannot do arbitrary ++ arithmetic on relocatable symbols. ++ ++ ++File: gcc.info, Node: Regs and Memory, Next: Arithmetic, Prev: Constants, Up: RTL ++ ++Registers and Memory ++==================== ++ ++ Here are the RTL expression types for describing access to machine ++registers and to main memory. ++ ++`(reg:M N)' ++ For small values of the integer N (less than ++ `FIRST_PSEUDO_REGISTER'), this stands for a reference to machine ++ register number N: a "hard register". For larger values of N, it ++ stands for a temporary value or "pseudo register". The compiler's ++ strategy is to generate code assuming an unlimited number of such ++ pseudo registers, and later convert them into hard registers or ++ into memory references. ++ ++ The symbol `FIRST_PSEUDO_REGISTER' is defined by the machine ++ description, since the number of hard registers on the machine is ++ an invariant characteristic of the machine. Note, however, that ++ not all of the machine registers must be general registers. All ++ the machine registers that can be used for storage of data are ++ given hard register numbers, even those that can be used only in ++ certain instructions or can hold only certain types of data. ++ ++ Each pseudo register number used in a function's RTL code is ++ represented by a unique `reg' expression. ++ ++ M is the machine mode of the reference. It is necessary because ++ machines can generally refer to each register in more than one ++ mode. For example, a register may contain a full word but there ++ may be instructions to refer to it as a half word or as a single ++ byte, as well as instructions to refer to it as a floating point ++ number of various precisions. ++ ++ Even for a register that the machine can access in only one mode, ++ the mode must always be specified. ++ ++ A hard register may be accessed in various modes throughout one ++ function, but each pseudo register is given a natural mode and is ++ accessed only in that mode. When it is necessary to describe an ++ access to a pseudo register using a nonnatural mode, a `subreg' ++ expression is used. ++ ++ A `reg' expression with a machine mode that specifies more than ++ one word of data may actually stand for several consecutive ++ registers. If in addition the register number specifies a hardware ++ register, then it actually represents several consecutive hardware ++ registers starting with the specified one. ++ ++ Such multi-word hardware register `reg' expressions must not be ++ live across the boundary of a basic block. The lifetime analysis ++ pass does not know how to record properly that several consecutive ++ registers are actually live there, and therefore register ++ allocation would be confused. The CSE pass must go out of its way ++ to make sure the situation does not arise. ++ ++`(subreg:M REG WORDNUM)' ++ `subreg' expressions are used to refer to a register in a machine ++ mode other than its natural one, or to refer to one register of a ++ multi-word `reg' that actually refers to several registers. ++ ++ Each pseudo-register has a natural mode. If it is necessary to ++ operate on it in a different mode--for example, to perform a ++ fullword move instruction on a pseudo-register that contains a ++ single byte--the pseudo-register must be enclosed in a `subreg'. ++ In such a case, WORDNUM is zero. ++ ++ The other use of `subreg' is to extract the individual registers ++ of a multi-register value. Machine modes such as `DImode' and ++ `EPmode' indicate values longer than a word, values which usually ++ require two consecutive registers. To access one of the registers, ++ use a `subreg' with mode `SImode' and a WORDNUM that says which ++ register. ++ ++ The compilation parameter `WORDS_BIG_ENDIAN', if defined, says ++ that word number zero is the most significant part; otherwise, it ++ is the least significant part. ++ ++ Between the combiner pass and the reload pass, it is possible to ++ have a `subreg' which contains a `mem' instead of a `reg' as its ++ first operand. The reload pass eliminates these cases by ++ reloading the `mem' into a suitable register. ++ ++ Note that it is not valid to access a `DFmode' value in `SFmode' ++ using a `subreg'. On some machines the most significant part of a ++ `DFmode' value does not have the same format as a single-precision ++ floating value. ++ ++`(cc0)' ++ This refers to the machine's condition code register. It has no ++ operands and may not have a machine mode. There are two ways to ++ use it: ++ ++ * To stand for a complete set of condition code flags. This is ++ best on most machines, where each comparison sets the entire ++ series of flags. ++ ++ With this technique, `(cc0)' may be validly used in only two ++ contexts: as the destination of an assignment (in test and ++ compare instructions) and in comparison operators comparing ++ against zero (`const_int' with value zero; that is to say, ++ `const0_rtx'). ++ ++ * To stand for a single flag that is the result of a single ++ condition. This is useful on machines that have only a single ++ flag bit, and in which comparison instructions must specify ++ the condition to test. ++ ++ With this technique, `(cc0)' may be validly used in only two ++ contexts: as the destination of an assignment (in test and ++ compare instructions) where the source is a comparison ++ operator, and as the first operand of `if_then_else' (in a ++ conditional branch). ++ ++ There is only one expression object of code `cc0'; it is the value ++ of the variable `cc0_rtx'. Any attempt to create an expression of ++ code `cc0' will return `cc0_rtx'. ++ ++ One special thing about the condition code register is that ++ instructions can set it implicitly. On many machines, nearly all ++ instructions set the condition code based on the value that they ++ compute or store. It is not necessary to record these actions ++ explicitly in the RTL because the machine description includes a ++ prescription for recognizing the instructions that do so (by means ++ of the macro `NOTICE_UPDATE_CC'). Only instructions whose sole ++ purpose is to set the condition code, and instructions that use the ++ condition code, need mention `(cc0)'. ++ ++ In some cases, better code may result from recognizing ++ combinations or peepholes that include instructions that set the ++ condition codes, even in cases where some reloading is inevitable. ++ For examples, search for `addcc' and `andcc' in `sparc.md'. ++ ++`(pc)' ++ This represents the machine's program counter. It has no operands ++ and may not have a machine mode. `(pc)' may be validly used only ++ in certain specific contexts in jump instructions. ++ ++ There is only one expression object of code `pc'; it is the value ++ of the variable `pc_rtx'. Any attempt to create an expression of ++ code `pc' will return `pc_rtx'. ++ ++ All instructions that do not jump alter the program counter ++ implicitly by incrementing it, but there is no need to mention ++ this in the RTL. ++ ++`(mem:M ADDR)' ++ This RTX represents a reference to main memory at an address ++ represented by the expression ADDR. M specifies how large a unit ++ of memory is accessed. ++ ++ ++File: gcc.info, Node: Arithmetic, Next: Comparisons, Prev: Regs and Memory, Up: RTL ++ ++RTL Expressions for Arithmetic ++============================== ++ ++`(plus:M X Y)' ++ Represents the sum of the values represented by X and Y carried ++ out in machine mode M. This is valid only if X and Y both are ++ valid for mode M. ++ ++`(minus:M X Y)' ++ Like `plus' but represents subtraction. ++ ++`(compare X Y)' ++ Represents the result of subtracting Y from X for purposes of ++ comparison. The absence of a machine mode in the `compare' ++ expression indicates that the result is computed without overflow, ++ as if with infinite precision. ++ ++ Of course, machines can't really subtract with infinite precision. ++ However, they can pretend to do so when only the sign of the ++ result will be used, which is the case when the result is stored ++ in `(cc0)'. And that is the only way this kind of expression may ++ validly be used: as a value to be stored in the condition codes. ++ ++`(neg:M X)' ++ Represents the negation (subtraction from zero) of the value ++ represented by X, carried out in mode M. X must be valid for mode ++ M. ++ ++`(mult:M X Y)' ++ Represents the signed product of the values represented by X and Y ++ carried out in machine mode M. If X and Y are both valid for mode ++ M, this is ordinary size-preserving multiplication. ++ Alternatively, both X and Y may be valid for a different, narrower ++ mode. This represents the kind of multiplication that generates a ++ product wider than the operands. Widening multiplication and ++ same-size multiplication are completely distinct and supported by ++ different machine instructions; machines may support one but not ++ the other. ++ ++ `mult' may be used for floating point multiplication as well. Then ++ M is a floating point machine mode. ++ ++`(umult:M X Y)' ++ Like `mult' but represents unsigned multiplication. It may be ++ used in both same-size and widening forms, like `mult'. `umult' is ++ used only for fixed-point multiplication. ++ ++`(div:M X Y)' ++ Represents the quotient in signed division of X by Y, carried out ++ in machine mode M. If M is a floating-point mode, it represents ++ the exact quotient; otherwise, the integerized quotient. If X and ++ Y are both valid for mode M, this is ordinary size-preserving ++ division. Some machines have division instructions in which the ++ operands and quotient widths are not all the same; such ++ instructions are represented by `div' expressions in which the ++ machine modes are not all the same. ++ ++`(udiv:M X Y)' ++ Like `div' but represents unsigned division. ++ ++`(mod:M X Y)' ++`(umod:M X Y)' ++ Like `div' and `udiv' but represent the remainder instead of the ++ quotient. ++ ++`(not:M X)' ++ Represents the bitwise complement of the value represented by X, ++ carried out in mode M, which must be a fixed-point machine mode. X ++ must be valid for mode M, which must be a fixed-point mode. ++ ++`(and:M X Y)' ++ Represents the bitwise logical-and of the values represented by X ++ and Y, carried out in machine mode M. This is valid only if X and ++ Y both are valid for mode M, which must be a fixed-point mode. ++ ++`(ior:M X Y)' ++ Represents the bitwise inclusive-or of the values represented by X ++ and Y, carried out in machine mode M. This is valid only if X and ++ Y both are valid for mode M, which must be a fixed-point mode. ++ ++`(xor:M X Y)' ++ Represents the bitwise exclusive-or of the values represented by X ++ and Y, carried out in machine mode M. This is valid only if X and ++ Y both are valid for mode M, which must be a fixed-point mode. ++ ++`(lshift:M X C)' ++ Represents the result of logically shifting X left by C places. X ++ must be valid for the mode M, a fixed-point machine mode. C must ++ be valid for a fixed-point mode; which mode is determined by the ++ mode called for in the machine description entry for the ++ left-shift instruction. For example, on the Vax, the mode of C is ++ `QImode' regardless of M. ++ ++ On some machines, negative values of C may be meaningful; this is ++ why logical left shift and arithmetic left shift are distinguished. ++ For example, Vaxes have no right-shift instructions, and right ++ shifts are represented as left-shift instructions whose counts ++ happen to be negative constants or else computed (in a previous ++ instruction) by negation. ++ ++`(ashift:M X C)' ++ Like `lshift' but for arithmetic left shift. ++ ++`(lshiftrt:M X C)' ++`(ashiftrt:M X C)' ++ Like `lshift' and `ashift' but for right shift. ++ ++`(rotate:M X C)' ++`(rotatert:M X C)' ++ Similar but represent left and right rotate. ++ ++`(abs:M X)' ++ Represents the absolute value of X, computed in mode M. X must be ++ valid for M. ++ ++`(sqrt:M X)' ++ Represents the square root of X, computed in mode M. X must be ++ valid for M. Most often M will be a floating point mode. ++ ++`(ffs:M X)' ++ Represents one plus the index of the least significant 1-bit in X, ++ represented as an integer of mode M. (The value is zero if X is ++ zero.) The mode of X need not be M; depending on the target ++ machine, various mode combinations may be valid. ++ ++ ++File: gcc.info, Node: Comparisons, Next: Bit Fields, Prev: Arithmetic, Up: RTL ++ ++Comparison Operations ++===================== ++ ++ Comparison operators test a relation on two operands and are ++considered to represent a machine-dependent nonzero value ++(`STORE_FLAG_VALUE') if the relation holds, or zero if it does not. ++The mode of the comparison is determined by the operands; they must ++both be valid for a common machine mode. A comparison with both ++operands constant would be invalid as the machine mode could not be ++deduced from it, but such a comparison should never exist in RTL due to ++constant folding. ++ ++ Inequality comparisons come in two flavors, signed and unsigned. ++Thus, there are distinct expression codes `gt' and `gtu' for signed and ++unsigned greater-than. These can produce different results for the same ++pair of integer values: for example, 1 is signed greater-than -1 but not ++unsigned greater-than, because -1 when regarded as unsigned is actually ++`0xffffffff' which is greater than 1. ++ ++ The signed comparisons are also used for floating point values. ++Floating point comparisons are distinguished by the machine modes of ++the operands. ++ ++ The comparison operators may be used to compare the condition codes ++`(cc0)' against zero, as in `(eq (cc0) (const_int 0))'. Such a ++construct actually refers to the result of the preceding instruction in ++which the condition codes were set. The above example stands for 1 if ++the condition codes were set to say "zero" or "equal", 0 otherwise. ++Although the same comparison operators are used for this as may be used ++in other contexts on actual data, no confusion can result since the ++machine description would never allow both kinds of uses in the same ++context. ++ ++`(eq X Y)' ++ 1 if the values represented by X and Y are equal, otherwise 0. ++ ++`(ne X Y)' ++ 1 if the values represented by X and Y are not equal, otherwise 0. ++ ++`(gt X Y)' ++ 1 if the X is greater than Y. If they are fixed-point, the ++ comparison is done in a signed sense. ++ ++`(gtu X Y)' ++ Like `gt' but does unsigned comparison, on fixed-point numbers ++ only. ++ ++`(lt X Y)' ++`(ltu X Y)' ++ Like `gt' and `gtu' but test for "less than". ++ ++`(ge X Y)' ++`(geu X Y)' ++ Like `gt' and `gtu' but test for "greater than or equal". ++ ++`(le X Y)' ++`(leu X Y)' ++ Like `gt' and `gtu' but test for "less than or equal". ++ ++`(if_then_else COND THEN ELSE)' ++ This is not a comparison operation but is listed here because it is ++ always used in conjunction with a comparison operation. To be ++ precise, COND is a comparison expression. This expression ++ represents a choice, according to COND, between the value ++ represented by THEN and the one represented by ELSE. ++ ++ On most machines, `if_then_else' expressions are valid only to ++ express conditional jumps. ++ ++ ++File: gcc.info, Node: Bit Fields, Next: Conversions, Prev: Comparisons, Up: RTL ++ ++Bit-fields ++========== ++ ++ Special expression codes exist to represent bit-field instructions. ++These types of expressions are lvalues in RTL; they may appear on the ++left side of an assignment, indicating insertion of a value into the ++specified bit field. ++ ++`(sign_extract:SI LOC SIZE POS)' ++ This represents a reference to a sign-extended bit-field contained ++ or starting in LOC (a memory or register reference). The bit field ++ is SIZE bits wide and starts at bit POS. The compilation option ++ `BITS_BIG_ENDIAN' says which end of the memory unit POS counts ++ from. ++ ++ Which machine modes are valid for LOC depends on the machine, but ++ typically LOC should be a single byte when in memory or a full ++ word in a register. ++ ++`(zero_extract:SI LOC SIZE POS)' ++ Like `sign_extract' but refers to an unsigned or zero-extended bit ++ field. The same sequence of bits are extracted, but they are ++ filled to an entire word with zeros instead of by sign-extension. ++ ++ ++File: gcc.info, Node: Conversions, Next: RTL Declarations, Prev: Bit Fields, Up: RTL ++ ++Conversions ++=========== ++ ++ All conversions between machine modes must be represented by ++explicit conversion operations. For example, an expression which is ++the sum of a byte and a full word cannot be written as `(plus:SI ++(reg:QI 34) (reg:SI 80))' because the `plus' operation requires two ++operands of the same machine mode. Therefore, the byte-sized operand is ++enclosed in a conversion operation, as in ++ ++ (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80)) ++ ++ The conversion operation is not a mere placeholder, because there ++may be more than one way of converting from a given starting mode to ++the desired final mode. The conversion operation code says how to do ++it. ++ ++`(sign_extend:M X)' ++ Represents the result of sign-extending the value X to machine ++ mode M. M must be a fixed-point mode and X a fixed-point value of ++ a mode narrower than M. ++ ++`(zero_extend:M X)' ++ Represents the result of zero-extending the value X to machine ++ mode M. M must be a fixed-point mode and X a fixed-point value of ++ a mode narrower than M. ++ ++`(float_extend:M X)' ++ Represents the result of extending the value X to machine mode M. ++ M must be a floating point mode and X a floating point value of a ++ mode narrower than M. ++ ++`(truncate:M X)' ++ Represents the result of truncating the value X to machine mode M. ++ M must be a fixed-point mode and X a fixed-point value of a mode ++ wider than M. ++ ++`(float_truncate:M X)' ++ Represents the result of truncating the value X to machine mode M. ++ M must be a floating point mode and X a floating point value of a ++ mode wider than M. ++ ++`(float:M X)' ++ Represents the result of converting fixed point value X, regarded ++ as signed, to floating point mode M. ++ ++`(unsigned_float:M X)' ++ Represents the result of converting fixed point value X, regarded ++ as unsigned, to floating point mode M. ++ ++`(fix:M X)' ++ When M is a fixed point mode, represents the result of converting ++ floating point value X to mode M, regarded as signed. How ++ rounding is done is not specified, so this operation may be used ++ validly in compiling C code only for integer-valued operands. ++ ++`(unsigned_fix:M X)' ++ Represents the result of converting floating point value X to ++ fixed point mode M, regarded as unsigned. How rounding is done is ++ not specified. ++ ++`(fix:M X)' ++ When M is a floating point mode, represents the result of ++ converting floating point value X (valid for mode M) to an ++ integer, still represented in floating point mode M, by rounding ++ towards zero. ++ ++ ++File: gcc.info, Node: RTL Declarations, Next: Side Effects, Prev: Conversions, Up: RTL ++ ++Declarations ++============ ++ ++ Declaration expression codes do not represent arithmetic operations ++but rather state assertions about their operands. ++ ++`(strict_low_part (subreg:M (reg:N R) 0))' ++ This expression code is used in only one context: operand 0 of a ++ `set' expression. In addition, the operand of this expression ++ must be a `subreg' expression. ++ ++ The presence of `strict_low_part' says that the part of the ++ register which is meaningful in mode N, but is not part of mode M, ++ is not to be altered. Normally, an assignment to such a subreg is ++ allowed to have undefined effects on the rest of the register when ++ M is less than a word. ++ ++ ++File: gcc.info, Node: Side Effects, Next: Incdec, Prev: RTL Declarations, Up: RTL ++ ++Side Effect Expressions ++======================= ++ ++ The expression codes described so far represent values, not actions. ++But machine instructions never produce values; they are meaningful only ++for their side effects on the state of the machine. Special expression ++codes are used to represent side effects. ++ ++ The body of an instruction is always one of these side effect codes; ++the codes described above, which represent values, appear only as the ++operands of these. ++ ++`(set LVAL X)' ++ Represents the action of storing the value of X into the place ++ represented by LVAL. LVAL must be an expression representing a ++ place that can be stored in: `reg' (or `subreg' or ++ `strict_low_part'), `mem', `pc' or `cc0'. ++ ++ If LVAL is a `reg', `subreg' or `mem', it has a machine mode; then ++ X must be valid for that mode. ++ ++ If LVAL is a `reg' whose machine mode is less than the full width ++ of the register, then it means that the part of the register ++ specified by the machine mode is given the specified value and the ++ rest of the register receives an undefined value. Likewise, if ++ LVAL is a `subreg' whose machine mode is narrower than `SImode', ++ the rest of the register can be changed in an undefined way. ++ ++ If LVAL is a `strict_low_part' of a `subreg', then the part of the ++ register specified by the machine mode of the `subreg' is given ++ the value X and the rest of the register is not changed. ++ ++ If LVAL is `(cc0)', it has no machine mode, and X may have any ++ mode. This represents a "test" or "compare" instruction. ++ ++ If LVAL is `(pc)', we have a jump instruction, and the ++ possibilities for X are very limited. It may be a `label_ref' ++ expression (unconditional jump). It may be an `if_then_else' ++ (conditional jump), in which case either the second or the third ++ operand must be `(pc)' (for the case which does not jump) and the ++ other of the two must be a `label_ref' (for the case which does ++ jump). X may also be a `mem' or `(plus:SI (pc) Y)', where Y may ++ be a `reg' or a `mem'; these unusual patterns are used to ++ represent jumps through branch tables. ++ ++`(return)' ++ Represents a return from the current function, on machines where ++ this can be done with one instruction, such as Vaxes. On machines ++ where a multi-instruction "epilogue" must be executed in order to ++ return from the function, returning is done by jumping to a label ++ which precedes the epilogue, and the `return' expression code is ++ never used. ++ ++`(call FUNCTION NARGS)' ++ Represents a function call. FUNCTION is a `mem' expression whose ++ address is the address of the function to be called. NARGS is an ++ expression which can be used for two purposes: on some machines it ++ represents the number of bytes of stack argument; on others, it ++ represents the number of argument registers. ++ ++ Each machine has a standard machine mode which FUNCTION must have. ++ The machine description defines macro `FUNCTION_MODE' to expand ++ into the requisite mode name. The purpose of this mode is to ++ specify what kind of addressing is allowed, on machines where the ++ allowed kinds of addressing depend on the machine mode being ++ addressed. ++ ++`(clobber X)' ++ Represents the storing or possible storing of an unpredictable, ++ undescribed value into X, which must be a `reg' or `mem' ++ expression. ++ ++ One place this is used is in string instructions that store ++ standard values into particular hard registers. It may not be ++ worth the trouble to describe the values that are stored, but it ++ is essential to inform the compiler that the registers will be ++ altered, lest it attempt to keep data in them across the string ++ instruction. ++ ++ X may also be null--a null C pointer, no expression at all. Such a ++ `(clobber (null))' expression means that all memory locations must ++ be presumed clobbered. ++ ++ Note that the machine description classifies certain hard ++ registers as "call-clobbered". All function call instructions are ++ assumed by default to clobber these registers, so there is no need ++ to use `clobber' expressions to indicate this fact. Also, each ++ function call is assumed to have the potential to alter any memory ++ location, unless the function is declared `const'. ++ ++ When a `clobber' expression for a register appears inside a ++ `parallel' with other side effects, GNU CC guarantees that the ++ register is unoccupied both before and after that insn. ++ Therefore, it is safe for the assembler code produced by the insn ++ to use the register as a temporary. You can clobber either a ++ specific hard register or a pseudo register; in the latter case, ++ GNU CC will allocate a hard register that is available there for ++ use as a temporary. ++ ++ If you clobber a pseudo register in this way, use a pseudo register ++ which appears nowhere else--generate a new one each time. ++ Otherwise, you may confuse CSE. ++ ++ There is one other known use for clobbering a pseudo register in a ++ `parallel': when one of the input operands of the insn is also ++ clobbered by the insn. In this case, using the same pseudo ++ register in the clobber and elsewhere in the insn produces the ++ expected results. ++ ++`(use X)' ++ Represents the use of the value of X. It indicates that the value ++ in X at this point in the program is needed, even though it may ++ not be apparent why this is so. Therefore, the compiler will not ++ attempt to delete previous instructions whose only effect is to ++ store a value in X. X must be a `reg' expression. ++ ++`(parallel [X0 X1 ...])' ++ Represents several side effects performed in parallel. The square ++ brackets stand for a vector; the operand of `parallel' is a vector ++ of expressions. X0, X1 and so on are individual side effect ++ expressions--expressions of code `set', `call', `return', ++ `clobber' or `use'. ++ ++ "In parallel" means that first all the values used in the ++ individual side-effects are computed, and second all the actual ++ side-effects are performed. For example, ++ ++ (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1))) ++ (set (mem:SI (reg:SI 1)) (reg:SI 1))]) ++ ++ says unambiguously that the values of hard register 1 and the ++ memory location addressed by it are interchanged. In both places ++ where `(reg:SI 1)' appears as a memory address it refers to the ++ value in register 1 *before* the execution of the insn. ++ ++ It follows that it is *incorrect* to use `parallel' and expect the ++ result of one `set' to be available for the next one. For example, ++ people sometimes attempt to represent a jump-if-zero instruction ++ this way: ++ ++ (parallel [(set (cc0) (reg:SI 34)) ++ (set (pc) (if_then_else ++ (eq (cc0) (const_int 0)) ++ (label_ref ...) ++ (pc)))]) ++ ++ But this is incorrect, because it says that the jump condition ++ depends on the condition code value *before* this instruction, not ++ on the new value that is set by this instruction. ++ ++ Peephole optimization, which takes place in together with final ++ assembly code output, can produce insns whose patterns consist of ++ a `parallel' whose elements are the operands needed to output the ++ resulting assembler code--often `reg', `mem' or constant ++ expressions. This would not be well-formed RTL at any other stage ++ in compilation, but it is ok then because no further optimization ++ remains to be done. However, the definition of the macro ++ `NOTICE_UPDATE_CC' must deal with such insns if you define any ++ peephole optimizations. ++ ++`(sequence [INSNS ...])' ++ Represents a sequence of insns. Each of the INSNS that appears in ++ the vector is suitable for appearing in the chain of insns, so it ++ must be an `insn', `jump_insn', `call_insn', `code_label', ++ `barrier' or `note'. ++ ++ A `sequence' RTX never appears in an actual insn. It represents ++ the sequence of insns that result from a `define_expand' *before* ++ those insns are passed to `emit_insn' to insert them in the chain ++ of insns. When actually inserted, the individual sub-insns are ++ separated out and the `sequence' is forgotten. ++ ++ Three expression codes appear in place of a side effect, as the body ++of an insn, though strictly speaking they do not describe side effects ++as such: ++ ++`(asm_input S)' ++ Represents literal assembler code as described by the string S. ++ ++`(addr_vec:M [LR0 LR1 ...])' ++ Represents a table of jump addresses. The vector elements LR0, ++ etc., are `label_ref' expressions. The mode M specifies how much ++ space is given to each address; normally M would be `Pmode'. ++ ++`(addr_diff_vec:M BASE [LR0 LR1 ...])' ++ Represents a table of jump addresses expressed as offsets from ++ BASE. The vector elements LR0, etc., are `label_ref' expressions ++ and so is BASE. The mode M specifies how much space is given to ++ each address-difference. ++ ++ ++File: gcc.info, Node: Incdec, Next: Assembler, Prev: Side Effects, Up: RTL ++ ++Embedded Side-Effects on Addresses ++================================== ++ ++ Four special side-effect expression codes appear as memory addresses. ++ ++`(pre_dec:M X)' ++ Represents the side effect of decrementing X by a standard amount ++ and represents also the value that X has after being decremented. ++ X must be a `reg' or `mem', but most machines allow only a `reg'. ++ M must be the machine mode for pointers on the machine in use. ++ The amount X is decremented by is the length in bytes of the ++ machine mode of the containing memory reference of which this ++ expression serves as the address. Here is an example of its use: ++ ++ (mem:DF (pre_dec:SI (reg:SI 39))) ++ ++ This says to decrement pseudo register 39 by the length of a ++ `DFmode' value and use the result to address a `DFmode' value. ++ ++`(pre_inc:M X)' ++ Similar, but specifies incrementing X instead of decrementing it. ++ ++`(post_dec:M X)' ++ Represents the same side effect as `pre_dec' but a different ++ value. The value represented here is the value X has before being ++ decremented. ++ ++`(post_inc:M X)' ++ Similar, but specifies incrementing X instead of decrementing it. ++ ++ These embedded side effect expressions must be used with care. ++Instruction patterns may not use them. Until the `flow' pass of the ++compiler, they may occur only to represent pushes onto the stack. The ++`flow' pass finds cases where registers are incremented or decremented ++in one instruction and used as an address shortly before or after; ++these cases are then transformed to use pre- or post-increment or ++-decrement. ++ ++ Explicit popping of the stack could be represented with these ++embedded side effect operators, but that would not be safe; the ++instruction combination pass could move the popping past pushes, thus ++changing the meaning of the code. ++ ++ An instruction that can be represented with an embedded side effect ++could also be represented using `parallel' containing an additional ++`set' to describe how the address register is altered. This is not ++done because machines that allow these operations at all typically ++allow them wherever a memory address is called for. Describing them as ++additional parallel stores would require doubling the number of entries ++in the machine description. ++ ++ ++File: gcc.info, Node: Assembler, Next: Insns, Prev: IncDec, Up: RTL ++ ++Assembler Instructions as Expressions ++===================================== ++ ++ The RTX code `asm_operands' represents a value produced by a ++user-specified assembler instruction. It is used to represent an `asm' ++statement with arguments. An `asm' statement with a single output ++operand, like this: ++ ++ asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z)); ++ ++is represented using a single `asm_operands' RTX which represents the ++value that is stored in `outputvar': ++ ++ (set RTX-FOR-OUTPUTVAR ++ (asm_operands "foo %1,%2,%0" "a" 0 ++ [RTX-FOR-ADDITION-RESULT RTX-FOR-*Z] ++ [(asm_input:M1 "g") ++ (asm_input:M2 "di")])) ++ ++Here the operands of the `asm_operands' RTX are the assembler template ++string, the output-operand's constraint, the index-number of the output ++operand among the output operands specified, a vector of input operand ++RTX's, and a vector of input-operand modes and constraints. The mode ++M1 is the mode of the sum `x+y'; M2 is that of `*z'. ++ ++ When an `asm' statement has multiple output values, its insn has ++several such `set' RTX's inside of a `parallel'. Each `set' contains a ++`asm_operands'; all of these share the same assembler template and ++vectors, but each contains the constraint for the respective output ++operand. They are also distinguished by the output-operand index ++number, which is 0, 1, ... for successive output operands. ++ ++ ++File: gcc.info, Node: Insns, Next: Calls, Prev: Assembler, Up: RTL ++ ++Insns ++===== ++ ++ The RTL representation of the code for a function is a doubly-linked ++chain of objects called "insns". Insns are expressions with special ++codes that are used for no other purpose. Some insns are actual ++instructions; others represent dispatch tables for `switch' statements; ++others represent labels to jump to or various sorts of declarative ++information. ++ ++ In addition to its own specific data, each insn must have a unique ++id-number that distinguishes it from all other insns in the current ++function, and chain pointers to the preceding and following insns. ++These three fields occupy the same position in every insn, independent ++of the expression code of the insn. They could be accessed with `XEXP' ++and `XINT', but instead three special macros are always used: ++ ++`INSN_UID (I)' ++ Accesses the unique id of insn I. ++ ++`PREV_INSN (I)' ++ Accesses the chain pointer to the insn preceding I. If I is the ++ first insn, this is a null pointer. ++ ++`NEXT_INSN (I)' ++ Accesses the chain pointer to the insn following I. If I is the ++ last insn, this is a null pointer. ++ ++ The `NEXT_INSN' and `PREV_INSN' pointers must always correspond: if ++INSN is not the first insn, ++ ++ NEXT_INSN (PREV_INSN (INSN)) == INSN ++ ++is always true. ++ ++ Every insn has one of the following six expression codes: ++ ++`insn' ++ The expression code `insn' is used for instructions that do not ++ jump and do not do function calls. Insns with code `insn' have ++ four additional fields beyond the three mandatory ones listed ++ above. These four are described in a table below. ++ ++`jump_insn' ++ The expression code `jump_insn' is used for instructions that may ++ jump (or, more generally, may contain `label_ref' expressions). ++ `jump_insn' insns have the same extra fields as `insn' insns, ++ accessed in the same way. If there is an instruction to return ++ from the current function, it is recorded as a `jump_insn'. ++ ++`call_insn' ++ The expression code `call_insn' is used for instructions that may ++ do function calls. It is important to distinguish these ++ instructions because they imply that certain registers and memory ++ locations may be altered unpredictably. ++ ++ `call_insn' insns have the same extra fields as `insn' insns, ++ accessed in the same way. ++ ++`code_label' ++ A `code_label' insn represents a label that a jump insn can jump ++ to. It contains one special field of data in addition to the three ++ standard ones. It is used to hold the "label number", a number ++ that identifies this label uniquely among all the labels in the ++ compilation (not just in the current function). Ultimately, the ++ label is represented in the assembler output as an assembler label ++ `LN' where N is the label number. ++ ++`barrier' ++ Barriers are placed in the instruction stream after unconditional ++ jump instructions to indicate that the jumps are unconditional. ++ They contain no information beyond the three standard fields. ++ ++`note' ++ `note' insns are used to represent additional debugging and ++ declarative information. They contain two nonstandard fields, an ++ integer which is accessed with the macro `NOTE_LINE_NUMBER' and a ++ string accessed with `NOTE_SOURCE_FILE'. ++ ++ If `NOTE_LINE_NUMBER' is positive, the note represents the ++ position of a source line and `NOTE_SOURCE_FILE' is the source ++ file name that the line came from. These notes control generation ++ of line number data in the assembler output. ++ ++ Otherwise, `NOTE_LINE_NUMBER' is not really a line number but a ++ code with one of the following values (and `NOTE_SOURCE_FILE' must ++ contain a null pointer): ++ ++ `NOTE_INSN_DELETED' ++ Such a note is completely ignorable. Some passes of the ++ compiler delete insns by altering them into notes of this ++ kind. ++ ++ `NOTE_INSN_BLOCK_BEG' ++ `NOTE_INSN_BLOCK_END' ++ These types of notes indicate the position of the beginning ++ and end of a level of scoping of variable names. They ++ control the output of debugging information. ++ ++ `NOTE_INSN_LOOP_BEG' ++ `NOTE_INSN_LOOP_END' ++ These types of notes indicate the position of the beginning ++ and end of a `while' or `for' loop. They enable the loop ++ optimizer to find loops quickly. ++ ++ `NOTE_INSN_FUNCTION_END' ++ Appears near the end of the function body, just before the ++ label that `return' statements jump to (on machine where a ++ single instruction does not suffice for returning). This ++ note may be deleted by jump optimization. ++ ++ `NOTE_INSN_SETJMP' ++ Appears following each call to `setjmp' or a related function. ++ ++ `NOTE_INSN_LOOP_CONT' ++ Appears at the place in a loop that `continue' statements ++ jump to. ++ ++ These codes are printed symbolically when they appear in debugging ++ dumps. ++ ++ The machine mode of an insn is normally zero (`VOIDmode'), but the ++reload pass sets it to `QImode' if the insn needs reloading. ++ ++ Here is a table of the extra fields of `insn', `jump_insn' and ++`call_insn' insns: ++ ++`PATTERN (I)' ++ An expression for the side effect performed by this insn. ++ ++`INSN_CODE (I)' ++ An integer that says which pattern in the machine description ++ matches this insn, or -1 if the matching has not yet been ++ attempted. ++ ++ Such matching is never attempted and this field is not used on an ++ insn whose pattern consists of a single `use', `clobber', `asm', ++ `addr_vec' or `addr_diff_vec' expression. ++ ++`LOG_LINKS (I)' ++ A list (chain of `insn_list' expressions) of previous "related" ++ insns: insns which store into registers values that are used for ++ the first time in this insn. (An additional constraint is that ++ neither a jump nor a label may come between the related insns). ++ This list is set up by the flow analysis pass; it is a null ++ pointer until then. ++ ++`REG_NOTES (I)' ++ A list (chain of `expr_list' expressions) giving information about ++ the usage of registers in this insn. This list is set up by the ++ flow analysis pass; it is a null pointer until then. ++ ++ The `LOG_LINKS' field of an insn is a chain of `insn_list' ++expressions. Each of these has two operands: the first is an insn, and ++the second is another `insn_list' expression (the next one in the ++chain). The last `insn_list' in the chain has a null pointer as second ++operand. The significant thing about the chain is which insns appear ++in it (as first operands of `insn_list' expressions). Their order is ++not significant. ++ ++ The `REG_NOTES' field of an insn is a similar chain but of ++`expr_list' expressions instead of `insn_list'. There are several ++kinds of register notes, which are distinguished by the machine mode of ++the `expr_list', which in a register note is really understood as being ++an `enum reg_note'. The first operand OP of the `expr_list' is data ++whose meaning depends on the kind of note. Here are the kinds of ++register note: ++ ++`REG_DEAD' ++ The register OP dies in this insn; that is to say, altering the ++ value immediately after this insn would not affect the future ++ behavior of the program. ++ ++`REG_INC' ++ The register OP is incremented (or decremented; at this level ++ there is no distinction) by an embedded side effect inside this ++ insn. This means it appears in a `post_inc', `pre_inc', `post_dec' ++ or `pre_dec' RTX. ++ ++`REG_EQUIV' ++ The register that is set by this insn will be equal to OP at run ++ time, and could validly be replaced in all its occurrences by OP. ++ ("Validly" here refers to the data flow of the program; simple ++ replacement may make some insns invalid.) ++ ++ The value which the insn explicitly copies into the register may ++ look different from OP, but they will be equal at run time. ++ ++ For example, when a constant is loaded into a register that is ++ never assigned any other value, this kind of note is used. ++ ++ When a parameter is copied into a pseudo-register at entry to a ++ function, a note of this kind records that the register is ++ equivalent to the stack slot where the parameter was passed. ++ Although in this case the register may be set by other insns, it ++ is still valid to replace the register by the stack slot ++ throughout the function. ++ ++`REG_EQUAL' ++ The register that is set by this insn will be equal to OP at run ++ time at the end of this insn (but not necessarily elsewhere in the ++ function). ++ ++ The RTX OP is typically an arithmetic expression. For example, ++ when a sequence of insns such as a library call is used to perform ++ an arithmetic operation, this kind of note is attached to the insn ++ that produces or copies the final value. It tells the CSE pass ++ how to think of that value. ++ ++`REG_RETVAL' ++ This insn copies the value of a library call, and OP is the first ++ insn that was generated to set up the arguments for the library ++ call. ++ ++ Flow analysis uses this note to delete all of a library call whose ++ result is dead. ++ ++`REG_WAS_0' ++ The register OP contained zero before this insn. You can rely on ++ this note if it is present; its absence implies nothing. ++ ++`REG_LIBCALL' ++ This is the inverse of `REG_RETVAL': it is placed on the first ++ insn of a library call, and it points to the last one. ++ ++ Loop optimization uses this note to move an entire library call out ++ of a loop when its value is constant. ++ ++`REG_NONNEG' ++ The register OP is known to have nonnegative value when this insn ++ is reached. ++ ++ For convenience, the machine mode in an `insn_list' or `expr_list' ++is printed using these symbolic codes in debugging dumps. ++ ++ The only difference between the expression codes `insn_list' and ++`expr_list' is that the first operand of an `insn_list' is assumed to ++be an insn and is printed in debugging dumps as the insn's unique id; ++the first operand of an `expr_list' is printed in the ordinary way as ++an expression. ++ ++ ++File: gcc.info, Node: Calls, Next: Sharing, Prev: Insns, Up: RTL ++ ++RTL Representation of Function-Call Insns ++========================================= ++ ++ Insns that call subroutines have the RTL expression code `call_insn'. ++These insns must satisfy special rules, and their bodies must use a ++special RTL expression code, `call'. ++ ++ A `call' expression has two operands, as follows: ++ ++ (call (mem:FM ADDR) NBYTES) ++ ++Here NBYTES is an operand that represents the number of bytes of ++argument data being passed to the subroutine, FM is a machine mode ++(which must equal as the definition of the `FUNCTION_MODE' macro in the ++machine description) and ADDR represents the address of the subroutine. ++ ++ For a subroutine that returns no value, the `call' RTX as shown above ++is the entire body of the insn. ++ ++ For a subroutine that returns a value whose mode is not `BLKmode', ++the value is returned in a hard register. If this register's number is ++R, then the body of the call insn looks like this: ++ ++ (set (reg:M R) ++ (call (mem:FM ADDR) NBYTES)) ++ ++This RTL expression makes it clear (to the optimizer passes) that the ++appropriate register receives a useful value in this insn. ++ ++ Immediately after RTL generation, if the value of the subroutine is ++actually used, this call insn is always followed closely by an insn ++which refers to the register R. This remains true through all the ++optimizer passes until cross jumping occurs. ++ ++ The following insn has one of two forms. Either it copies the value ++into a pseudo-register, like this: ++ ++ (set (reg:M P) (reg:M R)) ++ ++or (in the case where the calling function will simply return whatever ++value the call produced, and no operation is needed to do this): ++ ++ (use (reg:M R)) ++ ++Between the call insn and this following insn there may intervene only a ++stack-adjustment insn (and perhaps some `note' insns). ++ ++ When a subroutine returns a `BLKmode' value, it is handled by ++passing to the subroutine the address of a place to store the value. So ++the call insn itself does not "return" any value, and it has the same ++RTL form as a call that returns nothing. ++ ++ +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-7 alliance/genview/src/gcc-1.42/gcc.info-7 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-7 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-7 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,952 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Sharing, Prev: Calls, Up: RTL ++ ++Structure Sharing Assumptions ++============================= ++ ++ The compiler assumes that certain kinds of RTL expressions are ++unique; there do not exist two distinct objects representing the same ++value. In other cases, it makes an opposite assumption: that no RTL ++expression object of a certain kind appears in more than one place in ++the containing structure. ++ ++ These assumptions refer to a single function; except for the RTL ++objects that describe global variables and external functions, no RTL ++objects are common to two functions. ++ ++ * Each pseudo-register has only a single `reg' object to represent ++ it, and therefore only a single machine mode. ++ ++ * For any symbolic label, there is only one `symbol_ref' object ++ referring to it. ++ ++ * There is only one `const_int' expression with value zero, and only ++ one with value one. ++ ++ * There is only one `pc' expression. ++ ++ * There is only one `cc0' expression. ++ ++ * There is only one `const_double' expression with mode `SFmode' and ++ value zero, and only one with mode `DFmode' and value zero. ++ ++ * No `label_ref' appears in more than one place in the RTL ++ structure; in other words, it is safe to do a tree-walk of all the ++ insns in the function and assume that each time a `label_ref' is ++ seen it is distinct from all others that are seen. ++ ++ * Only one `mem' object is normally created for each static variable ++ or stack slot, so these objects are frequently shared in all the ++ places they appear. However, separate but equal objects for these ++ variables are occasionally made. ++ ++ * When a single `asm' statement has multiple output operands, a ++ distinct `asm_operands' RTX is made for each output operand. ++ However, these all share the vector which contains the sequence of ++ input operands. Because this sharing is used later on to test ++ whether two `asm_operands' RTX's come from the same statement, the ++ sharing must be guaranteed to be preserved. ++ ++ * No RTL object appears in more than one place in the RTL structure ++ except as described above. Many passes of the compiler rely on ++ this by assuming that they can modify RTL objects in place without ++ unwanted side-effects on other insns. ++ ++ * During initial RTL generation, shared structure is freely ++ introduced. After all the RTL for a function has been generated, ++ all shared structure is copied by `unshare_all_rtl' in ++ `emit-rtl.c', after which the above rules are guaranteed to be ++ followed. ++ ++ * During the combiner pass, shared structure with an insn can exist ++ temporarily. However, the shared structure is copied before the ++ combiner is finished with the insn. This is done by ++ `copy_substitutions' in `combine.c'. ++ ++ ++File: gcc.info, Node: Machine Desc, Next: Machine Macros, Prev: RTL, Up: Top ++ ++Machine Descriptions ++******************** ++ ++ A machine description has two parts: a file of instruction patterns ++(`.md' file) and a C header file of macro definitions. ++ ++ The `.md' file for a target machine contains a pattern for each ++instruction that the target machine supports (or at least each ++instruction that is worth telling the compiler about). It may also ++contain comments. A semicolon causes the rest of the line to be a ++comment, unless the semicolon is inside a quoted string. ++ ++ See the next chapter for information on the C header file. ++ ++* Menu: ++ ++* Patterns:: How to write instruction patterns. ++* Example:: An explained example of a `define_insn' pattern. ++* RTL Template:: The RTL template defines what insns match a pattern. ++* Output Template:: The output template says how to make assembler code ++ from such an insn. ++* Output Statement:: For more generality, write C code to output ++ the assembler code. ++* Constraints:: When not all operands are general operands. ++* Standard Names:: Names mark patterns to use for code generation. ++* Pattern Ordering:: When the order of patterns makes a difference. ++* Dependent Patterns:: Having one pattern may make you need another. ++* Jump Patterns:: Special considerations for patterns for jump insns. ++* Peephole Definitions::Defining machine-specific peephole optimizations. ++* Expander Definitions::Generating a sequence of several RTL insns ++ for a standard operation. ++ ++ ++File: gcc.info, Node: Patterns, Next: Example, Prev: Machine Desc, Up: Machine Desc ++ ++Everything about Instruction Patterns ++===================================== ++ ++ Each instruction pattern contains an incomplete RTL expression, with ++pieces to be filled in later, operand constraints that restrict how the ++pieces can be filled in, and an output pattern or C code to generate ++the assembler output, all wrapped up in a `define_insn' expression. ++ ++ A `define_insn' is an RTL expression containing four or five ++operands: ++ ++ 1. An optional name. The presence of a name indicate that this ++ instruction pattern can perform a certain standard job for the ++ RTL-generation pass of the compiler. This pass knows certain ++ names and will use the instruction patterns with those names, if ++ the names are defined in the machine description. ++ ++ The absence of a name is indicated by writing an empty string ++ where the name should go. Nameless instruction patterns are never ++ used for generating RTL code, but they may permit several simpler ++ insns to be combined later on. ++ ++ Names that are not thus known and used in RTL-generation have no ++ effect; they are equivalent to no name at all. ++ ++ 2. The "RTL template" (*note RTL Template::.) is a vector of ++ incomplete RTL expressions which show what the instruction should ++ look like. It is incomplete because it may contain `match_operand' ++ and `match_dup' expressions that stand for operands of the ++ instruction. ++ ++ If the vector has only one element, that element is the template ++ for the instruction pattern. If the vector has multiple elements, ++ then the instruction pattern is a `parallel' expression containing ++ the elements described. ++ ++ 3. A condition. This is a string which contains a C expression that ++ is the final test to decide whether an insn body matches this ++ pattern. ++ ++ For a named pattern, the condition (if present) may not depend on ++ the data in the insn being matched, but only the ++ target-machine-type flags. The compiler needs to test these ++ conditions during initialization in order to learn exactly which ++ named instructions are available in a particular run. ++ ++ For nameless patterns, the condition is applied only when matching ++ an individual insn, and only after the insn has matched the ++ pattern's recognition template. The insn's operands may be found ++ in the vector `operands'. ++ ++ 4. The "output template": a string that says how to output matching ++ insns as assembler code. `%' in this string specifies where to ++ substitute the value of an operand. *Note Output Template::. ++ ++ When simple substitution isn't general enough, you can specify a ++ piece of C code to compute the output. *Note Output Statement::. ++ ++ 5. Optionally, some "machine-specific information". The meaning of ++ this information is defined only by an individual machine ++ description; typically it might say whether this insn alters the ++ condition codes, or how many bytes of output it generates. ++ ++ This operand is written as a string containing a C initializer ++ (complete with braces) for the structure type `INSN_MACHINE_INFO', ++ whose definition is up to you (*note Misc::.). ++ ++ ++File: gcc.info, Node: Example, Next: RTL Template, Prev: Patterns, Up: Machine Desc ++ ++Example of `define_insn' ++======================== ++ ++ Here is an actual example of an instruction pattern, for the ++68000/68020. ++ ++ (define_insn "tstsi" ++ [(set (cc0) ++ (match_operand:SI 0 "general_operand" "rm"))] ++ "" ++ "* ++ { if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) ++ return \"tstl %0\"; ++ return \"cmpl #0,%0\"; }") ++ ++ This is an instruction that sets the condition codes based on the ++value of a general operand. It has no condition, so any insn whose RTL ++description has the form shown may be handled according to this ++pattern. The name `tstsi' means "test a `SImode' value" and tells the ++RTL generation pass that, when it is necessary to test such a value, an ++insn to do so can be constructed using this pattern. ++ ++ The output control string is a piece of C code which chooses which ++output template to return based on the kind of operand and the specific ++type of CPU for which code is being generated. ++ ++ `"rm"' is an operand constraint. Its meaning is explained below. ++ ++ ++File: gcc.info, Node: RTL Template, Next: Output Template, Prev: Example, Up: Machine Desc ++ ++RTL Template for Generating and Recognizing Insns ++================================================= ++ ++ The RTL template is used to define which insns match the particular ++pattern and how to find their operands. For named patterns, the RTL ++template also says how to construct an insn from specified operands. ++ ++ Construction involves substituting specified operands into a copy of ++the template. Matching involves determining the values that serve as ++the operands in the insn being matched. Both of these activities are ++controlled by special expression types that direct matching and ++substitution of the operands. ++ ++`(match_operand:M N PRED CONSTRAINT)' ++ This expression is a placeholder for operand number N of the insn. ++ When constructing an insn, operand number N will be substituted ++ at this point. When matching an insn, whatever appears at this ++ position in the insn will be taken as operand number N; but it ++ must satisfy PRED or this instruction pattern will not match at ++ all. ++ ++ Operand numbers must be chosen consecutively counting from zero in ++ each instruction pattern. There may be only one `match_operand' ++ expression in the pattern for each operand number. Usually ++ operands are numbered in the order of appearance in `match_operand' ++ expressions. ++ ++ PRED is a string that is the name of a C function that accepts two ++ arguments, an expression and a machine mode. During matching, the ++ function will be called with the putative operand as the expression ++ and M as the mode argument. If it returns zero, this instruction ++ pattern fails to match. PRED may be an empty string; then it ++ means no test is to be done on the operand, so anything which ++ occurs in this position is valid. ++ ++ CONSTRAINT controls reloading and the choice of the best register ++ class to use for a value, as explained later (*note ++ Constraints::.). ++ ++ People are often unclear on the difference between the constraint ++ and the predicate. The predicate helps decide whether a given ++ insn matches the pattern. The constraint plays no role in this ++ decision; instead, it controls various decisions in the case of an ++ insn which does match. ++ ++ Most often, PRED is `"general_operand"'. This function checks ++ that the putative operand is either a constant, a register or a ++ memory reference, and that it is valid for mode M. ++ ++ For an operand that must be a register, PRED should be ++ `"register_operand"'. It would be valid to use ++ `"general_operand"', since the reload pass would copy any ++ non-register operands through registers, but this would make GNU ++ CC do extra work, and it would prevent the register allocator from ++ doing the best possible job. ++ ++ For an operand that must be a constant, either PRED should be ++ `"immediate_operand"', or the instruction pattern's extra ++ condition should check for constants, or both. You cannot expect ++ the constraints to do this work! If the constraints allow only ++ constants, but the predicate allows something else, the compiler ++ will crash when that case arises. ++ ++`(match_dup N)' ++ This expression is also a placeholder for operand number N. It is ++ used when the operand needs to appear more than once in the insn. ++ ++ In construction, `match_dup' behaves exactly like `match_operand': ++ the operand is substituted into the insn being constructed. But ++ in matching, `match_dup' behaves differently. It assumes that ++ operand number N has already been determined by a `match_operand' ++ appearing earlier in the recognition template, and it matches only ++ an identical-looking expression. ++ ++`(match_operator:M N "PREDICATE" [OPERANDS...])' ++ This pattern is a kind of placeholder for a variable RTL expression ++ code. ++ ++ When constructing an insn, it stands for an RTL expression whose ++ expression code is taken from that of operand N, and whose ++ operands are constructed from the patterns OPERANDS. ++ ++ When matching an expression, it matches an expression if the ++ function PREDICATE returns nonzero on that expression *and* the ++ patterns OPERANDS match the operands of the expression. ++ ++ Suppose that the function `commutative_operator' is defined as ++ follows, to match any expression whose operator is one of the six ++ commutative arithmetic operators of RTL and whose mode is MODE: ++ ++ int ++ commutative_operator (x, mode) ++ rtx x; ++ enum machine_mode mode; ++ { ++ enum rtx_code code = GET_CODE (x); ++ if (GET_MODE (x) != mode) ++ return 0; ++ return (code == PLUS || code == MULT || code == UMULT ++ || code == AND || code == IOR || code == XOR); ++ } ++ ++ Then the following pattern will match any RTL expression consisting ++ of a commutative operator applied to two general operands: ++ ++ (match_operator:SI 2 "commutative_operator" ++ [(match_operand:SI 3 "general_operand" "g") ++ (match_operand:SI 4 "general_operand" "g")]) ++ ++ Here the vector `[OPERANDS...]' contains two patterns because the ++ expressions to be matched all contain two operands. ++ ++ When this pattern does match, the two operands of the commutative ++ operator are recorded as operands 3 and 4 of the insn. (This is ++ done by the two instances of `match_operand'.) Operand 2 of the ++ insn will be the entire commutative expression: use `GET_CODE ++ (operands[2])' to see which commutative operator was used. ++ ++ The machine mode M of `match_operator' works like that of ++ `match_operand': it is passed as the second argument to the ++ predicate function, and that function is solely responsible for ++ deciding whether the expression to be matched "has" that mode. ++ ++ When constructing an insn, argument 2 of the gen-function will ++ specify the operation (i.e. the expression code) for the ++ expression to be made. It should be an RTL expression, whose ++ expression code is copied into a new expression whose operands are ++ arguments 3 and 4 of the gen-function. The subexpressions of ++ argument 2 are not used; only its expression code matters. ++ ++ There is no way to specify constraints in `match_operator'. The ++ operand of the insn which corresponds to the `match_operator' ++ never has any constraints because it is never reloaded as a whole. ++ However, if parts of its OPERANDS are matched by `match_operand' ++ patterns, those parts may have constraints of their own. ++ ++`(address (match_operand:M N "address_operand" ""))' ++ This complex of expressions is a placeholder for an operand number ++ N in a "load address" instruction: an operand which specifies a ++ memory location in the usual way, but for which the actual operand ++ value used is the address of the location, not the contents of the ++ location. ++ ++ `address' expressions never appear in RTL code, only in machine ++ descriptions. And they are used only in machine descriptions that ++ do not use the operand constraint feature. When operand ++ constraints are in use, the letter `p' in the constraint serves ++ this purpose. ++ ++ M is the machine mode of the *memory location being addressed*, ++ not the machine mode of the address itself. That mode is always ++ the same on a given target machine (it is `Pmode', which normally ++ is `SImode'), so there is no point in mentioning it; thus, no ++ machine mode is written in the `address' expression. If some day ++ support is added for machines in which addresses of different ++ kinds of objects appear differently or are used differently (such ++ as the PDP-10), different formats would perhaps need different ++ machine modes and these modes might be written in the `address' ++ expression. ++ ++ ++File: gcc.info, Node: Output Template, Next: Output Statement, Prev: RTL Template, Up: Machine Desc ++ ++Output Templates and Operand Substitution ++========================================= ++ ++ The "output template" is a string which specifies how to output the ++assembler code for an instruction pattern. Most of the template is a ++fixed string which is output literally. The character `%' is used to ++specify where to substitute an operand; it can also be used to identify ++places where different variants of the assembler require different ++syntax. ++ ++ In the simplest case, a `%' followed by a digit N says to output ++operand N at that point in the string. ++ ++ `%' followed by a letter and a digit says to output an operand in an ++alternate fashion. Four letters have standard, built-in meanings ++described below. The machine description macro `PRINT_OPERAND' can ++define additional letters with nonstandard meanings. ++ ++ `%cDIGIT' can be used to substitute an operand that is a constant ++value without the syntax that normally indicates an immediate operand. ++ ++ `%nDIGIT' is like `%cDIGIT' except that the value of the constant is ++negated before printing. ++ ++ `%aDIGIT' can be used to substitute an operand as if it were a ++memory reference, with the actual operand treated as the address. This ++may be useful when outputting a "load address" instruction, because ++often the assembler syntax for such an instruction requires you to ++write the operand as if it were a memory reference. ++ ++ `%lDIGIT' is used to substitute a `label_ref' into a jump ++instruction. ++ ++ `%' followed by a punctuation character specifies a substitution that ++does not use an operand. Only one case is standard: `%%' outputs a `%' ++into the assembler code. Other nonstandard cases can be defined in the ++`PRINT_OPERAND' macro. You must also define which punctuation ++characters are valid with the `PRINT_OPERAND_PUNCT_VALID_P' macro. ++ ++ The template may generate multiple assembler instructions. Write ++the text for the instructions, with `\;' between them. ++ ++ When the RTL contains two operands which are required by constraint ++to match each other, the output template must refer only to the ++lower-numbered operand. Matching operands are not always identical, and ++the rest of the compiler arranges to put the proper RTL expression for ++printing into the lower-numbered operand. ++ ++ One use of nonstandard letters or punctuation following `%' is to ++distinguish between different assembler languages for the same machine; ++for example, Motorola syntax versus MIT syntax for the 68000. Motorola ++syntax requires periods in most opcode names, while MIT syntax does ++not. For example, the opcode `movel' in MIT syntax is `move.l' in ++Motorola syntax. The same file of patterns is used for both kinds of ++output syntax, but the character sequence `%.' is used in each place ++where Motorola syntax wants a period. The `PRINT_OPERAND' macro for ++Motorola syntax defines the sequence to output a period; the macro for ++MIT syntax defines it to do nothing. ++ ++ ++File: gcc.info, Node: Output Statement, Next: Constraints, Prev: Output Template, Up: Machine Desc ++ ++C Statements for Generating Assembler Output ++============================================ ++ ++ Often a single fixed template string cannot produce correct and ++efficient assembler code for all the cases that are recognized by a ++single instruction pattern. For example, the opcodes may depend on the ++kinds of operands; or some unfortunate combinations of operands may ++require extra machine instructions. ++ ++ If the output control string starts with a `*', then it is not an ++output template but rather a piece of C program that should compute a ++template. It should execute a `return' statement to return the ++template-string you want. Most such templates use C string literals, ++which require doublequote characters to delimit them. To include these ++doublequote characters in the string, prefix each one with `\'. ++ ++ The operands may be found in the array `operands', whose C data type ++is `rtx []'. ++ ++ It is possible to output an assembler instruction and then go on to ++output or compute more of them, using the subroutine `output_asm_insn'. ++ This receives two arguments: a template-string and a vector of ++operands. The vector may be `operands', or it may be another array of ++`rtx' that you declare locally and initialize yourself. ++ ++ When an insn pattern has multiple alternatives in its constraints, ++often the appearance of the assembler code is determined mostly by ++which alternative was matched. When this is so, the C code can test ++the variable `which_alternative', which is the ordinal number of the ++alternative that was actually satisfied (0 for the first, 1 for the ++second alternative, etc.). ++ ++ For example, suppose there are two opcodes for storing zero, `clrreg' ++for registers and `clrmem' for memory locations. Here is how a pattern ++could use `which_alternative' to choose between them: ++ ++ (define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "=r,m") ++ (const_int 0))] ++ "" ++ "* ++ return (which_alternative == 0 ++ ? \"clrreg %0\" : \"clrmem %0\"); ++ ") ++ ++ ++File: gcc.info, Node: Constraints, Next: Standard Names, Prev: Output Statement, Up: Machine Desc ++ ++Operand Constraints ++=================== ++ ++ Each `match_operand' in an instruction pattern can specify a ++constraint for the type of operands allowed. Constraints can say ++whether an operand may be in a register, and which kinds of register; ++whether the operand can be a memory reference, and which kinds of ++address; whether the operand may be an immediate constant, and which ++possible values it may have. Constraints can also require two operands ++to match. ++ ++* Menu: ++ ++* Simple Constraints:: Basic use of constraints. ++* Multi-Alternative:: When an insn has two alternative constraint-patterns. ++* Class Preferences:: Constraints guide which hard register to put things in. ++* Modifiers:: More precise control over effects of constraints. ++* No Constraints:: Describing a clean machine without constraints. ++ ++ ++File: gcc.info, Node: Simple Constraints, Next: Multi-Alternative, Prev: Constraints, Up: Constraints ++ ++Simple Constraints ++------------------ ++ ++ The simplest kind of constraint is a string full of letters, each of ++which describes one kind of operand that is permitted. Here are the ++letters that are allowed: ++ ++`m' ++ A memory operand is allowed, with any kind of address that the ++ machine supports in general. ++ ++`o' ++ A memory operand is allowed, but only if the address is ++ "offsettable". This means that adding a small integer (actually, ++ the width in bytes of the operand, as determined by its machine ++ mode) may be added to the address and the result is also a valid ++ memory address. ++ ++ For example, an address which is constant is offsettable; so is an ++ address that is the sum of a register and a constant (as long as a ++ slightly larger constant is also within the range of ++ address-offsets supported by the machine); but an autoincrement or ++ autodecrement address is not offsettable. More complicated ++ indirect/indexed addresses may or may not be offsettable depending ++ on the other addressing modes that the machine supports. ++ ++ Note that in an output operand which can be matched by another ++ operand, the constraint letter `o' is valid only when accompanied ++ by both `<' (if the target machine has predecrement addressing) ++ and `>' (if the target machine has preincrement addressing). ++ ++ When the constraint letter `o' is used, the reload pass may ++ generate instructions which copy a nonoffsettable address into an ++ index register. The idea is that the register can be used as a ++ replacement offsettable address. But this method requires that ++ there be patterns to copy any kind of address into a register. ++ Auto-increment and auto-decrement addresses are an exception; ++ there need not be an instruction that can copy such an address ++ into a register, because reload handles these cases specially. ++ ++ Most older machine designs have "load address" instructions which ++ do just what is needed here. Some RISC machines do not advertise ++ such instructions, but the possible addresses on these machines ++ are very limited, so it is easy to fake them. ++ ++`<' ++ A memory operand with autodecrement addressing (either ++ predecrement or postdecrement) is allowed. ++ ++`>' ++ A memory operand with autoincrement addressing (either ++ preincrement or postincrement) is allowed. ++ ++`r' ++ A register operand is allowed provided that it is in a general ++ register. ++ ++`d', `a', `f', ... ++ Other letters can be defined in machine-dependent fashion to stand ++ for particular classes of registers. `d', `a' and `f' are defined ++ on the 68000/68020 to stand for data, address and floating point ++ registers. ++ ++`i' ++ An immediate integer operand (one with constant value) is allowed. ++ This includes symbolic constants whose values will be known only at ++ assembly time. ++ ++`n' ++ An immediate integer operand with a known numeric value is allowed. ++ Many systems cannot support assembly-time constants for operands ++ less than a word wide. Constraints for these operands should use ++ `n' rather than `i'. ++ ++`I', `J', `K', ... ++ Other letters in the range `I' through `M' may be defined in a ++ machine-dependent fashion to permit immediate integer operands with ++ explicit integer values in specified ranges. For example, on the ++ 68000, `I' is defined to stand for the range of values 1 to 8. ++ This is the range permitted as a shift count in the shift ++ instructions. ++ ++`F' ++ An immediate floating operand (expression code `const_double') is ++ allowed. ++ ++`G', `H' ++ `G' and `H' may be defined in a machine-dependent fashion to ++ permit immediate floating operands in particular ranges of values. ++ ++`s' ++ An immediate integer operand whose value is not an explicit ++ integer is allowed. ++ ++ This might appear strange; if an insn allows a constant operand ++ with a value not known at compile time, it certainly must allow ++ any known value. So why use `s' instead of `i'? Sometimes it ++ allows better code to be generated. ++ ++ For example, on the 68000 in a fullword instruction it is possible ++ to use an immediate operand; but if the immediate value is between ++ -128 and 127, better code results from loading the value into a ++ register and using the register. This is because the load into ++ the register can be done with a `moveq' instruction. We arrange ++ for this to happen by defining the letter `K' to mean "any integer ++ outside the range -128 to 127", and then specifying `Ks' in the ++ operand constraints. ++ ++`g' ++ Any register, memory or immediate integer operand is allowed, ++ except for registers that are not general registers. ++ ++`N' (a digit) ++ An operand that matches operand number N is allowed. If a digit is ++ used together with letters, the digit should come last. ++ ++ This is called a "matching constraint" and what it really means is ++ that the assembler has only a single operand that fills two roles ++ considered separate in the RTL insn. For example, an add insn has ++ two input operands and one output operand in the RTL, but on most ++ machines an add instruction really has only two operands, one of ++ them an input-output operand. ++ ++ Matching constraints work only in circumstances like that add insn. ++ More precisely, the matching constraint must appear in an ++ input-only operand and the operand that it matches must be an ++ output-only operand with a lower number. Thus, operand N must ++ have `=' in its constraint. ++ ++ For operands to match in a particular case usually means that they ++ are identical-looking RTL expressions. But in a few special cases ++ specific kinds of dissimilarity are allowed. For example, `*x' as ++ an input operand will match `*x++' as an output operand. For ++ proper results in such cases, the output template should always ++ use the output-operand's number when printing the operand. ++ ++`p' ++ An operand that is a valid memory address is allowed. This is for ++ "load address" and "push address" instructions. ++ ++ `p' in the constraint must be accompanies by `address_operand' as ++ the predicate in the `match_operand'. ++ ++ In order to have valid assembler code, each operand must satisfy its ++constraint. But a failure to do so does not prevent the pattern from ++applying to an insn. Instead, it directs the compiler to modify the ++code so that the constraint will be satisfied. Usually this is done by ++copying an operand into a register. ++ ++ Contrast, therefore, the two instruction patterns that follow: ++ ++ (define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "=r") ++ (plus:SI (match_dup 0) ++ (match_operand:SI 1 "general_operand" "r")))] ++ "" ++ "...") ++ ++which has two operands, one of which must appear in two places, and ++ ++ (define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "=r") ++ (plus:SI (match_operand:SI 1 "general_operand" "0") ++ (match_operand:SI 2 "general_operand" "r")))] ++ "" ++ "...") ++ ++which has three operands, two of which are required by a constraint to ++be identical. If we are considering an insn of the form ++ ++ (insn N PREV NEXT ++ (set (reg:SI 3) ++ (plus:SI (reg:SI 6) (reg:SI 109))) ++ ...) ++ ++the first pattern would not apply at all, because this insn does not ++contain two identical subexpressions in the right place. The pattern ++would say, "That does not look like an add instruction; try other ++patterns." The second pattern would say, "Yes, that's an add ++instruction, but there is something wrong with it." It would direct ++the reload pass of the compiler to generate additional insns to make ++the constraint true. The results might look like this: ++ ++ (insn N2 PREV N ++ (set (reg:SI 3) (reg:SI 6)) ++ ...) ++ ++ (insn N N2 NEXT ++ (set (reg:SI 3) ++ (plus:SI (reg:SI 3) (reg:SI 109))) ++ ...) ++ ++ It is up to you to make sure that each operand, in each pattern, has ++constraints that can handle any RTL expression that could be present for ++that operand. (When multiple alternatives are in use, each pattern ++must, for each possible combination of operand expressions, have at ++least one alternative which can handle that combination of operands.) ++The constraints don't need to *allow* any possible operand--when this is ++the case, they do not constrain--but they must at least point the way to ++reloading any possible operand so that it will fit. ++ ++ * If the constraint accepts whatever operands the predicate permits, ++ there is no problem: reloading is never necessary for this operand. ++ ++ For example, an operand whose constraints permit everything except ++ registers is safe provided its predicate rejects registers. ++ ++ An operand whose predicate accepts only constant values is safe ++ provided its constraints include the letter `i'. If any possible ++ constant value is accepted, then nothing less than `i' will do; if ++ the predicate is more selective, then the constraints may also be ++ more selective. ++ ++ * Any operand expression can be reloaded by copying it into a ++ register. So if an operand's constraints allow some kind of ++ register, it is certain to be safe. It need not permit all ++ classes of registers; the compiler knows how to copy a register ++ into another register of the proper class in order to make an ++ instruction valid. ++ ++ * A nonoffsettable memory reference can be reloaded by copying the ++ address into a register. So if the constraint uses the letter ++ `o', all memory references are taken care of. ++ ++ * A constant operand can be reloaded by allocating space in memory to ++ hold it as preinitialized data. Then the memory reference can be ++ used in place of the constant. So if the constraint uses the ++ letters `o' or `m', constant operands are not a problem. ++ ++ If the operand's predicate can recognize registers, but the ++constraint does not permit them, it can make the compiler crash. When ++this operand happens to be a register, the reload pass will be stymied, ++because it does not know how to copy a register temporarily into memory. ++ ++ ++File: gcc.info, Node: Multi-Alternative, Next: Class Preferences, Prev: Simple Constraints, Up: Constraints ++ ++Multiple Alternative Constraints ++-------------------------------- ++ ++ Sometimes a single instruction has multiple alternative sets of ++possible operands. For example, on the 68000, a logical-or instruction ++can combine register or an immediate value into memory, or it can ++combine any kind of operand into a register; but it cannot combine one ++memory location into another. ++ ++ These constraints are represented as multiple alternatives. An ++alternative can be described by a series of letters for each operand. ++The overall constraint for an operand is made from the letters for this ++operand from the first alternative, a comma, the letters for this ++operand from the second alternative, a comma, and so on until the last ++alternative. Here is how it is done for fullword logical-or on the ++68000: ++ ++ (define_insn "iorsi3" ++ [(set (match_operand:SI 0 "general_operand" "=m,d") ++ (ior:SI (match_operand:SI 1 "general_operand" "%0,0") ++ (match_operand:SI 2 "general_operand" "dKs,dmKs")))] ++ ...) ++ ++ The first alternative has `m' (memory) for operand 0, `0' for ++operand 1 (meaning it must match operand 0), and `dKs' for operand 2. ++The second alternative has `d' (data register) for operand 0, `0' for ++operand 1, and `dmKs' for operand 2. The `=' and `%' in the ++constraints apply to all the alternatives; their meaning is explained ++in the next section. ++ ++ If all the operands fit any one alternative, the instruction is ++valid. Otherwise, for each alternative, the compiler counts how many ++instructions must be added to copy the operands so that that ++alternative applies. The alternative requiring the least copying is ++chosen. If two alternatives need the same amount of copying, the one ++that comes first is chosen. These choices can be altered with the `?' ++and `!' characters: ++ ++`?' ++ Disparage slightly the alternative that the `?' appears in, as a ++ choice when no alternative applies exactly. The compiler regards ++ this alternative as one unit more costly for each `?' that appears ++ in it. ++ ++`!' ++ Disparage severely the alternative that the `!' appears in. When ++ operands must be copied into registers, the compiler will never ++ choose this alternative as the one to strive for. ++ ++ When an insn pattern has multiple alternatives in its constraints, ++often the appearance of the assembler code is determined mostly by which ++alternative was matched. When this is so, the C code for writing the ++assembler code can use the variable `which_alternative', which is the ++ordinal number of the alternative that was actually satisfied (0 for ++the first, 1 for the second alternative, etc.). For example: ++ ++ (define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "=r,m") ++ (const_int 0))] ++ "" ++ "* ++ return (which_alternative == 0 ++ ? \"clrreg %0\" : \"clrmem %0\"); ++ ") ++ ++ ++File: gcc.info, Node: Class Preferences, Next: Modifiers, Prev: Multi-Alternative, Up: Constraints ++ ++Register Class Preferences ++-------------------------- ++ ++ The operand constraints have another function: they enable the ++compiler to decide which kind of hardware register a pseudo register is ++best allocated to. The compiler examines the constraints that apply to ++the insns that use the pseudo register, looking for the ++machine-dependent letters such as `d' and `a' that specify classes of ++registers. The pseudo register is put in whichever class gets the most ++"votes". The constraint letters `g' and `r' also vote: they vote in ++favor of a general register. The machine description says which ++registers are considered general. ++ ++ Of course, on some machines all registers are equivalent, and no ++register classes are defined. Then none of this complexity is relevant. ++ ++ ++File: gcc.info, Node: Modifiers, Next: No Constraints, Prev: Class Preferences, Up: Constraints ++ ++Constraint Modifier Characters ++------------------------------ ++ ++`=' ++ Means that this operand is write-only for this instruction: the ++ previous value is discarded and replaced by output data. ++ ++`+' ++ Means that this operand is both read and written by the ++ instruction. ++ ++ When the compiler fixes up the operands to satisfy the constraints, ++ it needs to know which operands are inputs to the instruction and ++ which are outputs from it. `=' identifies an output; `+' ++ identifies an operand that is both input and output; all other ++ operands are assumed to be input only. ++ ++`&' ++ Means (in a particular alternative) that this operand is written ++ before the instruction is finished using the input operands. ++ Therefore, this operand may not lie in a register that is used as ++ an input operand or as part of any memory address. ++ ++ `&' applies only to the alternative in which it is written. In ++ constraints with multiple alternatives, sometimes one alternative ++ requires `&' while others do not. See, for example, the `movdf' ++ insn of the 68000. ++ ++ `&' does not obviate the need to write `='. ++ ++`%' ++ Declares the instruction to be commutative for this operand and the ++ following operand. This means that the compiler may interchange ++ the two operands if that is the cheapest way to make all operands ++ fit the constraints. This is often used in patterns for addition ++ instructions that really have only two operands: the result must ++ go in one of the arguments. Here for example, is how the 68000 ++ halfword-add instruction is defined: ++ ++ (define_insn "addhi3" ++ [(set (match_operand:HI 0 "general_operand" "=m,r") ++ (plus:HI (match_operand:HI 1 "general_operand" "%0,0") ++ (match_operand:HI 2 "general_operand" "di,g")))] ++ ...) ++ ++ Note that in previous versions of GNU CC the `%' constraint ++ modifier always applied to operands 1 and 2 regardless of which ++ operand it was written in. The usual custom was to write it in ++ operand 0. Now it must be in operand 1 if the operands to be ++ exchanged are 1 and 2. ++ ++`#' ++ Says that all following characters, up to the next comma, are to be ++ ignored as a constraint. They are significant only for choosing ++ register preferences. ++ ++`*' ++ Says that the following character should be ignored when choosing ++ register preferences. `*' has no effect on the meaning of the ++ constraint as a constraint. ++ ++ Here is an example: the 68000 has an instruction to sign-extend a ++ halfword in a data register, and can also sign-extend a value by ++ copying it into an address register. While either kind of ++ register is acceptable, the constraints on an address-register ++ destination are less strict, so it is best if register allocation ++ makes an address register its goal. Therefore, `*' is used so ++ that the `d' constraint letter (for data register) is ignored when ++ computing register preferences. ++ ++ (define_insn "extendhisi2" ++ [(set (match_operand:SI 0 "general_operand" "=*d,a") ++ (sign_extend:SI ++ (match_operand:HI 1 "general_operand" "0,g")))] ++ ...) ++ ++ ++File: gcc.info, Node: No Constraints, Prev: Modifiers, Up: Constraints ++ ++Not Using Constraints ++--------------------- ++ ++ Some machines are so clean that operand constraints are not ++required. For example, on the Vax, an operand valid in one context is ++valid in any other context. On such a machine, every operand ++constraint would be `g', excepting only operands of "load address" ++instructions which are written as if they referred to a memory ++location's contents but actual refer to its address. They would have ++constraint `p'. ++ ++ For such machines, instead of writing `g' and `p' for all the ++constraints, you can choose to write a description with empty ++constraints. Then you write `""' for the constraint in every ++`match_operand'. Address operands are identified by writing an ++`address' expression around the `match_operand', not by their ++constraints. ++ ++ When the machine description has just empty constraints, certain ++parts of compilation are skipped, making the compiler faster. However, ++few machines actually do not need constraints; all machine descriptions ++now in existence use constraints. ++ ++ +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-8 alliance/genview/src/gcc-1.42/gcc.info-8 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-8 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-8 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,1142 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Standard Names, Next: Pattern Ordering, Prev: Constraints, Up: Machine Desc ++ ++Standard Names for Patterns Used in Generation ++============================================== ++ ++ Here is a table of the instruction names that are meaningful in the ++RTL generation pass of the compiler. Giving one of these names to an ++instruction pattern tells the RTL generation pass that it can use the ++pattern in to accomplish a certain task. ++ ++`movM' ++ Here M stands for a two-letter machine mode name, in lower case. ++ This instruction pattern moves data with that machine mode from ++ operand 1 to operand 0. For example, `movsi' moves full-word data. ++ ++ If operand 0 is a `subreg' with mode M of a register whose own ++ mode is wider than M, the effect of this instruction is to store ++ the specified value in the part of the register that corresponds ++ to mode M. The effect on the rest of the register is undefined. ++ ++ This class of patterns is special in several ways. First of all, ++ each of these names *must* be defined, because there is no other ++ way to copy a datum from one place to another. ++ ++ Second, these patterns are not used solely in the RTL generation ++ pass. Even the reload pass can generate move insns to copy values ++ from stack slots into temporary registers. When it does so, one ++ of the operands is a hard register and the other is an operand ++ that can need to be reloaded into a register. ++ ++ Therefore, when given such a pair of operands, the pattern must ++ generate RTL which needs no reloading and needs no temporary ++ registers--no registers other than the operands. For example, if ++ you support the pattern with a `define_expand', then in such a ++ case the `define_expand' mustn't call `force_reg' or any other such ++ function which might generate new pseudo registers. ++ ++ This requirement exists even for subword modes on a RISC machine ++ where fetching those modes from memory normally requires several ++ insns and some temporary registers. Look in `spur.md' to see how ++ the requirement can be satisfied. ++ ++ The variety of operands that have reloads depends on the rest of ++ the machine description, but typically on a RISC machine these can ++ only be pseudo registers that did not get hard registers, while on ++ other machines explicit memory references will get optional ++ reloads. ++ ++ The constraints on a `moveM' must allow any hard register to be ++ moved to any other hard register (provided that ++ `HARD_REGNO_MODE_OK' permits mode M in both registers). ++ ++ It is obligatory to support floating point `moveM' instructions ++ into and out of any registers that can hold fixed point values, ++ because unions and structures (which have modes `SImode' or ++ `DImode') can be in those registers and they may have floating ++ point members. ++ ++ There may also be a need to support fixed point `moveM' ++ instructions in and out of floating point registers. ++ Unfortunately, I have forgotten why this was so, and I don't know ++ whether it is still true. If `HARD_REGNO_MODE_OK' rejects fixed ++ point values in floating point registers, then the constraints of ++ the fixed point `moveM' instructions must be designed to avoid ++ ever trying to reload into a floating point register. ++ ++`movstrictM' ++ Like `movM' except that if operand 0 is a `subreg' with mode M of ++ a register whose natural mode is wider, the `movstrictM' ++ instruction is guaranteed not to alter any of the register except ++ the part which belongs to mode M. ++ ++`movsi_unaligned' ++ Like `movsi' except that the memory reference will not trap if ++ loading or storing into unaligned memory. You must define this ++ pattern if you can pass structures or unions in registers when they ++ have less than a full word of alignment. ++ ++`addM3' ++ Add operand 2 and operand 1, storing the result in operand 0. All ++ operands must have mode M. This can be used even on two-address ++ machines, by means of constraints requiring operands 1 and 0 to be ++ the same location. ++ ++`subM3', `mulM3', `umulM3', `divM3', `udivM3', `modM3', `umodM3', `andM3', `iorM3', `xorM3' ++ Similar, for other arithmetic operations. ++ ++ There are special considerations for register classes for ++ logical-and instructions, affecting also the macro ++ `PREFERRED_RELOAD_CLASS'. They apply not only to the patterns with ++ these standard names, but to any patterns that will match such an ++ instruction. *Note Register Classes::. ++ ++`mulhisi3' ++ Multiply operands 1 and 2, which have mode `HImode', and store a ++ `SImode' product in operand 0. ++ ++`mulqihi3', `mulsidi3' ++ Similar widening-multiplication instructions of other widths. ++ ++`umulqihi3', `umulhisi3', `umulsidi3' ++ Similar widening-multiplication instructions that do unsigned ++ multiplication. ++ ++`divmodM4' ++ Signed division that produces both a quotient and a remainder. ++ Operand 1 is divided by operand 2 to produce a quotient stored in ++ operand 0 and a remainder stored in operand 3. ++ ++`udivmodM4' ++ Similar, but does unsigned division. ++ ++`ashlM3' ++ Arithmetic-shift operand 1 left by a number of bits specified by ++ operand 2, and store the result in operand 0. Operand 2 has mode ++ `SImode', not mode M. ++ ++`ashrM3', `lshlM3', `lshrM3', `rotlM3', `rotrM3' ++ Other shift and rotate instructions. ++ ++ Logical and arithmetic left shift are the same. Machines that do ++ not allow negative shift counts often have only one instruction for ++ shifting left. On such machines, you should define a pattern named ++ `ashlM3' and leave `lshlM3' undefined. ++ ++ There are special considerations for register classes for shift ++ instructions, affecting also the macro `PREFERRED_RELOAD_CLASS'. ++ They apply not only to the patterns with these standard names, but ++ to any patterns that will match such an instruction. *Note ++ Register Classes::. ++ ++`negM2' ++ Negate operand 1 and store the result in operand 0. ++ ++`absM2' ++ Store the absolute value of operand 1 into operand 0. ++ ++`sqrtM2' ++ Store the square root of operand 1 into operand 0. ++ ++`ffsM2' ++ Store into operand 0 one plus the index of the least significant ++ 1-bit of operand 1. If operand 1 is zero, store zero. M is the ++ mode of operand 0; operand 1's mode is specified by the instruction ++ pattern, and the compiler will convert the operand to that mode ++ before generating the instruction. ++ ++`one_cmplM2' ++ Store the bitwise-complement of operand 1 into operand 0. ++ ++`cmpM' ++ Compare operand 0 and operand 1, and set the condition codes. The ++ RTL pattern should look like this: ++ ++ (set (cc0) (compare (match_operand:M 0 ...) ++ (match_operand:M 1 ...))) ++ ++ Each such definition in the machine description, for integer mode ++ M, must have a corresponding `tstM' pattern, because optimization ++ can simplify the compare into a test when operand 1 is zero. ++ ++`tstM' ++ Compare operand 0 against zero, and set the condition codes. The ++ RTL pattern should look like this: ++ ++ (set (cc0) (match_operand:M 0 ...)) ++ ++`movstrM' ++ Block move instruction. The addresses of the destination and ++ source strings are the first two operands, and both are in mode ++ `Pmode'. The number of bytes to move is the third operand, in mode ++ M. The fourth operand is the known shared alignment of the source ++ and destination, in the form of a `const_int' rtx. ++ ++`cmpstrM' ++ Block compare instruction, with operands like `movstrM' except ++ that the two memory blocks are compared byte by byte in ++ lexicographic order. The effect of the instruction is to set the ++ condition codes. ++ ++`floatMN2' ++ Convert signed integer operand 1 (valid for fixed point mode M) to ++ floating point mode N and store in operand 0 (which has mode N). ++ ++`floatunsMN2' ++ Convert unsigned integer operand 1 (valid for fixed point mode M) ++ to floating point mode N and store in operand 0 (which has mode N). ++ ++`fixMN2' ++ Convert operand 1 (valid for floating point mode M) to fixed point ++ mode N as a signed number and store in operand 0 (which has mode ++ N). This instruction's result is defined only when the value of ++ operand 1 is an integer. ++ ++`fixunsMN2' ++ Convert operand 1 (valid for floating point mode M) to fixed point ++ mode N as an unsigned number and store in operand 0 (which has ++ mode N). This instruction's result is defined only when the value ++ of operand 1 is an integer. ++ ++`ftruncM2' ++ Convert operand 1 (valid for floating point mode M) to an integer ++ value, still represented in floating point mode M, and store it in ++ operand 0 (valid for floating point mode M). ++ ++`fix_truncMN2' ++ Like `fixMN2' but works for any floating point value of mode M by ++ converting the value to an integer. ++ ++`fixuns_truncMN2' ++ Like `fixunsMN2' but works for any floating point value of mode M ++ by converting the value to an integer. ++ ++`truncMN' ++ Truncate operand 1 (valid for mode M) to mode N and store in ++ operand 0 (which has mode N). Both modes must be fixed point or ++ both floating point. ++ ++`extendMN' ++ Sign-extend operand 1 (valid for mode M) to mode N and store in ++ operand 0 (which has mode N). Both modes must be fixed point or ++ both floating point. ++ ++`zero_extendMN' ++ Zero-extend operand 1 (valid for mode M) to mode N and store in ++ operand 0 (which has mode N). Both modes must be fixed point. ++ ++`extv' ++ Extract a bit-field from operand 1 (a register or memory operand), ++ where operand 2 specifies the width in bits and operand 3 the ++ starting bit, and store it in operand 0. Operand 0 must have ++ `SImode'. Operand 1 may have mode `QImode' or `SImode'; often ++ `SImode' is allowed only for registers. Operands 2 and 3 must be ++ valid for `SImode'. ++ ++ The RTL generation pass generates this instruction only with ++ constants for operands 2 and 3. ++ ++ The bit-field value is sign-extended to a full word integer before ++ it is stored in operand 0. ++ ++`extzv' ++ Like `extv' except that the bit-field value is zero-extended. ++ ++`insv' ++ Store operand 3 (which must be valid for `SImode') into a ++ bit-field in operand 0, where operand 1 specifies the width in bits ++ and operand 2 the starting bit. Operand 0 may have mode `QImode' ++ or `SImode'; often `SImode' is allowed only for registers. ++ Operands 1 and 2 must be valid for `SImode'. ++ ++ The RTL generation pass generates this instruction only with ++ constants for operands 1 and 2. ++ ++`sCOND' ++ Store zero or nonzero in the operand according to the condition ++ codes. Value stored is nonzero iff the condition COND is true. ++ COND is the name of a comparison operation expression code, such ++ as `eq', `lt' or `leu'. ++ ++ You specify the mode that the operand must have when you write the ++ `match_operand' expression. The compiler automatically sees which ++ mode you have used and supplies an operand of that mode. ++ ++ The value stored for a true condition must have 1 as its low bit, ++ or else must be negative. Otherwise the instruction is not ++ suitable and must be omitted from the machine description. You ++ must tell the compiler exactly which value is stored by defining ++ the macro `STORE_FLAG_VALUE'. ++ ++`bCOND' ++ Conditional branch instruction. Operand 0 is a `label_ref' that ++ refers to the label to jump to. Jump if the condition codes meet ++ condition COND. ++ ++`call' ++ Subroutine call instruction returning no value. Operand 0 is the ++ function to call; operand 1 is the number of bytes of arguments ++ pushed (in mode `SImode', except it is normally a `const_int'); ++ operand 2 is the number of registers used as operands. ++ ++ On most machines, operand 2 is not actually stored into the RTL ++ pattern. It is supplied for the sake of some RISC machines which ++ need to put this information into the assembler code; they can put ++ it in the RTL instead of operand 1. ++ ++ Operand 0 should be a `mem' RTX whose address is the address of ++ the function. ++ ++`call_value' ++ Subroutine call instruction returning a value. Operand 0 is the ++ hard register in which the value is returned. There are three more ++ operands, the same as the three operands of the `call' instruction ++ (but with numbers increased by one). ++ ++ Subroutines that return `BLKmode' objects use the `call' insn. ++ ++`return' ++ Subroutine return instruction. This instruction pattern name ++ should be defined only if a single instruction can do all the work ++ of returning from a function. ++ ++`nop' ++ No-op instruction. This instruction pattern name should always be ++ defined to output a no-op in assembler code. `(const_int 0)' will ++ do as an RTL pattern. ++ ++`casesi' ++ Instruction to jump through a dispatch table, including bounds ++ checking. This instruction takes five operands: ++ ++ 1. The index to dispatch on, which has mode `SImode'. ++ ++ 2. The lower bound for indices in the table, an integer constant. ++ ++ 3. The total range of indices in the table--the largest index ++ minus the smallest one (both inclusive). ++ ++ 4. A label to jump to if the index has a value outside the ++ bounds. (If the machine-description macro ++ `CASE_DROPS_THROUGH' is defined, then an out-of-bounds index ++ drops through to the code following the jump table instead of ++ jumping to this label. In that case, this label is not ++ actually used by the `casesi' instruction, but it is always ++ provided as an operand.) ++ ++ 5. A label that precedes the table itself. ++ ++ The table is a `addr_vec' or `addr_diff_vec' inside of a ++ `jump_insn'. The number of elements in the table is one plus the ++ difference between the upper bound and the lower bound. ++ ++`tablejump' ++ Instruction to jump to a variable address. This is a low-level ++ capability which can be used to implement a dispatch table when ++ there is no `casesi' pattern. ++ ++ This pattern requires two operands: the address or offset, and a ++ label which should immediately precede the jump table. If the ++ macro `CASE_VECTOR_PC_RELATIVE' is defined then the first operand ++ is an offset that counts from the address of the table; otherwise, ++ it is an absolute address to jump to. ++ ++ The `tablejump' insn is always the last insn before the jump table ++ it uses. Its assembler code normally has no need to use the ++ second operand, but you should incorporate it in the RTL pattern so ++ that the jump optimizer will not delete the table as unreachable ++ code. ++ ++ ++File: gcc.info, Node: Pattern Ordering, Next: Dependent Patterns, Prev: Standard Names, Up: Machine Desc ++ ++When the Order of Patterns Matters ++================================== ++ ++ Sometimes an insn can match more than one instruction pattern. Then ++the pattern that appears first in the machine description is the one ++used. Therefore, more specific patterns (patterns that will match fewer ++things) and faster instructions (those that will produce better code ++when they do match) should usually go first in the description. ++ ++ In some cases the effect of ordering the patterns can be used to hide ++a pattern when it is not valid. For example, the 68000 has an ++instruction for converting a fullword to floating point and another for ++converting a byte to floating point. An instruction converting an ++integer to floating point could match either one. We put the pattern ++to convert the fullword first to make sure that one will be used rather ++than the other. (Otherwise a large integer might be generated as a ++single-byte immediate quantity, which would not work.) Instead of using ++this pattern ordering it would be possible to make the pattern for ++convert-a-byte smart enough to deal properly with any constant value. ++ ++ ++File: gcc.info, Node: Dependent Patterns, Next: Jump Patterns, Prev: Pattern Ordering, Up: Machine Desc ++ ++Interdependence of Patterns ++=========================== ++ ++ Every machine description must have a named pattern for each of the ++conditional branch names `bCOND'. The recognition template must always ++have the form ++ ++ (set (pc) ++ (if_then_else (COND (cc0) (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc))) ++ ++In addition, every machine description must have an anonymous pattern ++for each of the possible reverse-conditional branches. These patterns ++look like ++ ++ (set (pc) ++ (if_then_else (COND (cc0) (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" "")))) ++ ++They are necessary because jump optimization can turn direct-conditional ++branches into reverse-conditional branches. ++ ++ The compiler does more with RTL than just create it from patterns ++and recognize the patterns: it can perform arithmetic expression codes ++when constant values for their operands can be determined. As a result, ++sometimes having one pattern can require other patterns. For example, ++the Vax has no `and' instruction, but it has `and not' instructions. ++Here is the definition of one of them: ++ ++ (define_insn "andcbsi2" ++ [(set (match_operand:SI 0 "general_operand" "") ++ (and:SI (match_dup 0) ++ (not:SI (match_operand:SI ++ 1 "general_operand" ""))))] ++ "" ++ "bicl2 %1,%0") ++ ++If operand 1 is an explicit integer constant, an instruction constructed ++using that pattern can be simplified into an `and' like this: ++ ++ (set (reg:SI 41) ++ (and:SI (reg:SI 41) ++ (const_int 0xffff7fff))) ++ ++(where the integer constant is the one's complement of what appeared in ++the original instruction). ++ ++ To avoid a fatal error, the compiler must have a pattern that ++recognizes such an instruction. Here is what is used: ++ ++ (define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "") ++ (and:SI (match_dup 0) ++ (match_operand:SI 1 "general_operand" "")))] ++ "GET_CODE (operands[1]) == CONST_INT" ++ "* ++ { operands[1] ++ = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[1])); ++ return \"bicl2 %1,%0\"; ++ }") ++ ++Whereas a pattern to match a general `and' instruction is impossible to ++support on the Vax, this pattern is possible because it matches only a ++constant second argument: a special case that can be output as an `and ++not' instruction. ++ ++ A "compare" instruction whose RTL looks like this: ++ ++ (set (cc0) (compare OPERAND (const_int 0))) ++ ++may be simplified by optimization into a "test" like this: ++ ++ (set (cc0) OPERAND) ++ ++So in the machine description, each "compare" pattern for an integer ++mode must have a corresponding "test" pattern that will match the ++result of such simplification. ++ ++ In some cases machines support instructions identical except for the ++machine mode of one or more operands. For example, there may be ++"sign-extend halfword" and "sign-extend byte" instructions whose ++patterns are ++ ++ (set (match_operand:SI 0 ...) ++ (extend:SI (match_operand:HI 1 ...))) ++ ++ (set (match_operand:SI 0 ...) ++ (extend:SI (match_operand:QI 1 ...))) ++ ++Constant integers do not specify a machine mode, so an instruction to ++extend a constant value could match either pattern. The pattern it ++actually will match is the one that appears first in the file. For ++correct results, this must be the one for the widest possible mode ++(`HImode', here). If the pattern matches the `QImode' instruction, the ++results will be incorrect if the constant value does not actually fit ++that mode. ++ ++ Such instructions to extend constants are rarely generated because ++they are optimized away, but they do occasionally happen in nonoptimized ++compilations. ++ ++ When an instruction has the constraint letter `o', the reload pass ++may generate instructions which copy a nonoffsettable address into an ++index register. The idea is that the register can be used as a ++replacement offsettable address. In order for these generated ++instructions to work, there must be patterns to copy any kind of valid ++address into a register. ++ ++ Most older machine designs have "load address" instructions which do ++just what is needed here. Some RISC machines do not advertise such ++instructions, but the possible addresses on these machines are very ++limited, so it is easy to fake them. ++ ++ Auto-increment and auto-decrement addresses are an exception; there ++need not be an instruction that can copy such an address into a ++register, because reload handles these cases in a different manner. ++ ++ ++File: gcc.info, Node: Jump Patterns, Next: Peephole Definitions, Prev: Dependent Patterns, Up: Machine Desc ++ ++Defining Jump Instruction Patterns ++================================== ++ ++ GNU CC assumes that the machine has a condition code. A comparison ++insn sets the condition code, recording the results of both signed and ++unsigned comparison of the given operands. A separate branch insn ++tests the condition code and branches or not according its value. The ++branch insns come in distinct signed and unsigned flavors. Many common ++machines, such as the Vax, the 68000 and the 32000, work this way. ++ ++ Some machines have distinct signed and unsigned compare ++instructions, and only one set of conditional branch instructions. The ++easiest way to handle these machines is to treat them just like the ++others until the final stage where assembly code is written. At this ++time, when outputting code for the compare instruction, peek ahead at ++the following branch using `NEXT_INSN (insn)'. (The variable `insn' ++refers to the insn being output, in the output-writing code in an ++instruction pattern.) If the RTL says that is an unsigned branch, ++output an unsigned compare; otherwise output a signed compare. When ++the branch itself is output, you can treat signed and unsigned branches ++identically. ++ ++ The reason you can do this is that GNU CC always generates a pair of ++consecutive RTL insns, one to set the condition code and one to test it, ++and keeps the pair inviolate until the end. ++ ++ To go with this technique, you must define the machine-description ++macro `NOTICE_UPDATE_CC' to do `CC_STATUS_INIT'; in other words, no ++compare instruction is superfluous. ++ ++ Some machines have compare-and-branch instructions and no condition ++code. A similar technique works for them. When it is time to "output" a ++compare instruction, record its operands in two static variables. When ++outputting the branch-on-condition-code instruction that follows, ++actually output a compare-and-branch instruction that uses the ++remembered operands. ++ ++ It also works to define patterns for compare-and-branch instructions. ++In optimizing compilation, the pair of compare and branch instructions ++will be combined according to these patterns. But this does not happen ++if optimization is not requested. So you must use one of the solutions ++above in addition to any special patterns you define. ++ ++ ++File: gcc.info, Node: Peephole Definitions, Next: Expander Definitions, Prev: Jump Patterns, Up: Machine Desc ++ ++Defining Machine-Specific Peephole Optimizers ++============================================= ++ ++ In addition to instruction patterns the `md' file may contain ++definitions of machine-specific peephole optimizations. ++ ++ The combiner does not notice certain peephole optimizations when the ++data flow in the program does not suggest that it should try them. For ++example, sometimes two consecutive insns related in purpose can be ++combined even though the second one does not appear to use a register ++computed in the first one. A machine-specific peephole optimizer can ++detect such opportunities. ++ ++ A definition looks like this: ++ ++ (define_peephole ++ [INSN-PATTERN-1 ++ INSN-PATTERN-2 ++ ...] ++ "CONDITION" ++ "TEMPLATE" ++ "MACHINE-SPECIFIC INFO") ++ ++The last string operand may be omitted if you are not using any ++machine-specific information in this machine description. If present, ++it must obey the same rules as in a `define_insn'. ++ ++ In this skeleton, INSN-PATTERN-1 and so on are patterns to match ++consecutive insns. The optimization applies to a sequence of insns when ++INSN-PATTERN-1 matches the first one, INSN-PATTERN-2 matches the next, ++and so on. ++ ++ Each of the insns matched by a peephole must also match a ++`define_insn'. Peepholes are checked only at the last stage just ++before code generation, and only optionally. Therefore, any insn which ++would match a peephole but no `define_insn' will cause a crash in code ++generation in an unoptimized compilation, or at various optimization ++stages. ++ ++ The operands of the insns are matched with `match_operands' and ++`match_dup', as usual. What is not usual is that the operand numbers ++apply to all the insn patterns in the definition. So, you can check for ++identical operands in two insns by using `match_operand' in one insn ++and `match_dup' in the other. ++ ++ The operand constraints used in `match_operand' patterns do not have ++any direct effect on the applicability of the peephole, but they will ++be validated afterward, so make sure your constraints are general enough ++to apply whenever the peephole matches. If the peephole matches but ++the constraints are not satisfied, the compiler will crash. ++ ++ It is safe to omit constraints in all the operands of the peephole; ++or you can write constraints which serve as a double-check on the ++criteria previously tested. ++ ++ Once a sequence of insns matches the patterns, the CONDITION is ++checked. This is a C expression which makes the final decision whether ++to perform the optimization (we do so if the expression is nonzero). If ++CONDITION is omitted (in other words, the string is empty) then the ++optimization is applied to every sequence of insns that matches the ++patterns. ++ ++ The defined peephole optimizations are applied after register ++allocation is complete. Therefore, the peephole definition can check ++which operands have ended up in which kinds of registers, just by ++looking at the operands. ++ ++ The way to refer to the operands in CONDITION is to write ++`operands[I]' for operand number I (as matched by `(match_operand I ++...)'). Use the variable `insn' to refer to the last of the insns ++being matched; use `PREV_INSN' to find the preceding insns (but be ++careful to skip over any `note' insns that intervene). ++ ++ When optimizing computations with intermediate results, you can use ++CONDITION to match only when the intermediate results are not used ++elsewhere. Use the C expression `dead_or_set_p (INSN, OP)', where INSN ++is the insn in which you expect the value to be used for the last time ++(from the value of `insn', together with use of `PREV_INSN'), and OP is ++the intermediate value (from `operands[I]'). ++ ++ Applying the optimization means replacing the sequence of insns with ++one new insn. The TEMPLATE controls ultimate output of assembler code ++for this combined insn. It works exactly like the template of a ++`define_insn'. Operand numbers in this template are the same ones used ++in matching the original sequence of insns. ++ ++ The result of a defined peephole optimizer does not need to match ++any of the insn patterns in the machine description; it does not even ++have an opportunity to match them. The peephole optimizer definition ++itself serves as the insn pattern to control how the insn is output. ++ ++ Defined peephole optimizers are run as assembler code is being ++output, so the insns they produce are never combined or rearranged in ++any way. ++ ++ Here is an example, taken from the 68000 machine description: ++ ++ (define_peephole ++ [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4))) ++ (set (match_operand:DF 0 "register_operand" "=f") ++ (match_operand:DF 1 "register_operand" "ad"))] ++ "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])" ++ "* ++ { ++ rtx xoperands[2]; ++ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); ++ #ifdef MOTOROLA ++ output_asm_insn (\"move.l %1,(sp)\", xoperands); ++ output_asm_insn (\"move.l %1,-(sp)\", operands); ++ return \"fmove.d (sp)+,%0\"; ++ #else ++ output_asm_insn (\"movel %1,sp@\", xoperands); ++ output_asm_insn (\"movel %1,sp@-\", operands); ++ return \"fmoved sp@+,%0\"; ++ #endif ++ } ++ ") ++ ++ The effect of this optimization is to change ++ ++ jbsr _foobar ++ addql #4,sp ++ movel d1,sp@- ++ movel d0,sp@- ++ fmoved sp@+,fp0 ++ ++into ++ ++ jbsr _foobar ++ movel d1,sp@ ++ movel d0,sp@- ++ fmoved sp@+,fp0 ++ ++ INSN-PATTERN-1 and so on look *almost* like the second operand of ++`define_insn'. There is one important difference: the second operand ++of `define_insn' consists of one or more RTX's enclosed in square ++brackets. Usually, there is only one: then the same action can be ++written as an element of a `define_peephole'. But when there are ++multiple actions in a `define_insn', they are implicitly enclosed in a ++`parallel'. Then you must explicitly write the `parallel', and the ++square brackets within it, in the `define_peephole'. Thus, if an insn ++pattern looks like this, ++ ++ (define_insn "divmodsi4" ++ [(set (match_operand:SI 0 "general_operand" "=d") ++ (div:SI (match_operand:SI 1 "general_operand" "0") ++ (match_operand:SI 2 "general_operand" "dmsK"))) ++ (set (match_operand:SI 3 "general_operand" "=d") ++ (mod:SI (match_dup 1) (match_dup 2)))] ++ "TARGET_68020" ++ "divsl%.l %2,%3:%0") ++ ++then the way to mention this insn in a peephole is as follows: ++ ++ (define_peephole ++ [... ++ (parallel ++ [(set (match_operand:SI 0 "general_operand" "=d") ++ (div:SI (match_operand:SI 1 "general_operand" "0") ++ (match_operand:SI 2 "general_operand" "dmsK"))) ++ (set (match_operand:SI 3 "general_operand" "=d") ++ (mod:SI (match_dup 1) (match_dup 2)))]) ++ ...] ++ ...) ++ ++ ++File: gcc.info, Node: Expander Definitions, Prev: Peephole Definitions, Up: Machine Desc ++ ++Defining RTL Sequences for Code Generation ++========================================== ++ ++ On some target machines, some standard pattern names for RTL ++generation cannot be handled with single insn, but a sequence of RTL ++insns can represent them. For these target machines, you can write a ++`define_expand' to specify how to generate the sequence of RTL. ++ ++ A `define_expand' is an RTL expression that looks almost like a ++`define_insn'; but, unlike the latter, a `define_expand' is used only ++for RTL generation and it can produce more than one RTL insn. ++ ++ A `define_expand' RTX has four operands: ++ ++ * The name. Each `define_expand' must have a name, since the only ++ use for it is to refer to it by name. ++ ++ * The RTL template. This is just like the RTL template for a ++ `define_peephole' in that it is a vector of RTL expressions each ++ being one insn. ++ ++ * The condition, a string containing a C expression. This ++ expression is used to express how the availability of this pattern ++ depends on subclasses of target machine, selected by command-line ++ options when GNU CC is run. This is just like the condition of a ++ `define_insn' that has a standard name. ++ ++ * The preparation statements, a string containing zero or more C ++ statements which are to be executed before RTL code is generated ++ from the RTL template. ++ ++ Usually these statements prepare temporary registers for use as ++ internal operands in the RTL template, but they can also generate ++ RTL insns directly by calling routines such as `emit_insn', etc. ++ Any such insns precede the ones that come from the RTL template. ++ ++ Every RTL insn emitted by a `define_expand' must match some ++`define_insn' in the machine description. Otherwise, the compiler will ++crash when trying to generate code for the insn or trying to optimize ++it. ++ ++ The RTL template, in addition to controlling generation of RTL insns, ++also describes the operands that need to be specified when this pattern ++is used. In particular, it gives a predicate for each operand. ++ ++ A true operand, which need to be specified in order to generate RTL ++from the pattern, should be described with a `match_operand' in its ++first occurrence in the RTL template. This enters information on the ++operand's predicate into the tables that record such things. GNU CC ++uses the information to preload the operand into a register if that is ++required for valid RTL code. If the operand is referred to more than ++once, subsequent references should use `match_dup'. ++ ++ The RTL template may also refer to internal "operands" which are ++temporary registers or labels used only within the sequence made by the ++`define_expand'. Internal operands are substituted into the RTL ++template with `match_dup', never with `match_operand'. The values of ++the internal operands are not passed in as arguments by the compiler ++when it requests use of this pattern. Instead, they are computed ++within the pattern, in the preparation statements. These statements ++compute the values and store them into the appropriate elements of ++`operands' so that `match_dup' can find them. ++ ++ There are two special macros defined for use in the preparation ++statements: `DONE' and `FAIL'. Use them with a following semicolon, as ++a statement. ++ ++`DONE' ++ Use the `DONE' macro to end RTL generation for the pattern. The ++ only RTL insns resulting from the pattern on this occasion will be ++ those already emitted by explicit calls to `emit_insn' within the ++ preparation statements; the RTL template will not be generated. ++ ++`FAIL' ++ Make the pattern fail on this occasion. When a pattern fails, it ++ means that the pattern was not truly available. The calling ++ routines in the compiler will try other strategies for code ++ generation using other patterns. ++ ++ Failure is currently supported only for binary operations ++ (addition, multiplication, shifting, etc.). ++ ++ Do not emit any insns explicitly with `emit_insn' before failing. ++ ++ Here is an example, the definition of left-shift for the SPUR chip: ++ ++ (define_expand "ashlsi3" ++ [(set (match_operand:SI 0 "register_operand" "") ++ (ashift:SI ++ (match_operand:SI 1 "register_operand" "") ++ (match_operand:SI 2 "nonmemory_operand" "")))] ++ "" ++ " ++ { ++ if (GET_CODE (operands[2]) != CONST_INT ++ || (unsigned) INTVAL (operands[2]) > 3) ++ FAIL; ++ }") ++ ++This example uses `define_expand' so that it can generate an RTL insn ++for shifting when the shift-count is in the supported range of 0 to 3 ++but fail in other cases where machine insns aren't available. When it ++fails, the compiler tries another strategy using different patterns ++(such as, a library call). ++ ++ If the compiler were able to handle nontrivial condition-strings in ++patterns with names, then it would be possible to use a `define_insn' ++in that case. Here is another case (zero-extension on the 68000) which ++makes more use of the power of `define_expand': ++ ++ (define_expand "zero_extendhisi2" ++ [(set (match_operand:SI 0 "general_operand" "") ++ (const_int 0)) ++ (set (strict_low_part ++ (subreg:HI ++ (match_dup 0) ++ 0)) ++ (match_operand:HI 1 "general_operand" ""))] ++ "" ++ "operands[1] = make_safe_from (operands[1], operands[0]);") ++ ++Here two RTL insns are generated, one to clear the entire output operand ++and the other to copy the input operand into its low half. This ++sequence is incorrect if the input operand refers to [the old value of] ++the output operand, so the preparation statement makes sure this isn't ++so. The function `make_safe_from' copies the `operands[1]' into a ++temporary register if it refers to `operands[0]'. It does this by ++emitting another RTL insn. ++ ++ Finally, a third example shows the use of an internal operand. ++Zero-extension on the SPUR chip is done by `and'-ing the result against ++a halfword mask. But this mask cannot be represented by a `const_int' ++because the constant value is too large to be legitimate on this ++machine. So it must be copied into a register with `force_reg' and ++then the register used in the `and'. ++ ++ (define_expand "zero_extendhisi2" ++ [(set (match_operand:SI 0 "register_operand" "") ++ (and:SI (subreg:SI ++ (match_operand:HI 1 "register_operand" "") ++ 0) ++ (match_dup 2)))] ++ "" ++ "operands[2] ++ = force_reg (SImode, gen_rtx (CONST_INT, ++ VOIDmode, 65535)); ") ++ ++ *Note:* If the `define_expand' is used to serve a standard binary or ++unary arithmetic operation, then the last insn it generates must not be ++a `code_label', `barrier' or `note'. It must be an `insn', `jump_insn' ++or `call_insn'. ++ ++ ++File: gcc.info, Node: Machine Macros, Next: Config, Prev: Machine Desc, Up: Top ++ ++Machine Description Macros ++************************** ++ ++ The other half of the machine description is a C header file ++conventionally given the name `tm-MACHINE.h'. The file `tm.h' should ++be a link to it. The header file `config.h' includes `tm.h' and most ++compiler source files include `config.h'. ++ ++* Menu: ++ ++* Run-time Target:: Defining `-m' options like `-m68000' and `-m68020'. ++* Storage Layout:: Defining sizes and alignments of data types. ++* Registers:: Naming and describing the hardware registers. ++* Register Classes:: Defining the classes of hardware registers. ++* Stack Layout:: Defining which way the stack grows and by how much. ++* Library Calls:: Specifying how to call certain library routines. ++* Addressing Modes:: Defining addressing modes valid for memory operands. ++* Delayed Branch:: Do branches execute the following instruction? ++* Condition Code:: Defining how insns update the condition code. ++* Cross-compilation:: Handling floating point for cross-compilers. ++* Misc:: Everything else. ++* Assembler Format:: Defining how to write insns and pseudo-ops to output. ++ ++ ++File: gcc.info, Node: Run-time Target, Next: Storage Layout, Prev: Machine Macros, Up: Machine Macros ++ ++Run-time Target Specification ++============================= ++ ++`CPP_PREDEFINES' ++ Define this to be a string constant containing `-D' options to ++ define the predefined macros that identify this machine and system. ++ These macros will be predefined unless the `-ansi' option is ++ specified. ++ ++ In addition, a parallel set of macros are predefined, whose names ++ are made by appending `__' at the beginning and at the end. These ++ `__' macros are permitted by the ANSI standard, so they are ++ predefined regardless of whether `-ansi' is specified. ++ ++ For example, on the Sun, one can use the following value: ++ ++ "-Dmc68000 -Dsun -Dunix" ++ ++ The result is to define the macros `__mc68000__', `__sun__' and ++ `__unix__' unconditionally, and the macros `mc68000', `sun' and ++ `unix' provided `-ansi' is not specified. ++ ++`CPP_SPEC' ++ A C string constant that tells the GNU CC driver program options to ++ pass to CPP. It can also specify how to translate options you ++ give to GNU CC into options for GNU CC to pass to the CPP. ++ ++ Do not define this macro if it does not need to do anything. ++ ++`CC1_SPEC' ++ A C string constant that tells the GNU CC driver program options to ++ pass to CC1. It can also specify how to translate options you ++ give to GNU CC into options for GNU CC to pass to the CC1. ++ ++ Do not define this macro if it does not need to do anything. ++ ++`extern int target_flags;' ++ This declaration should be present. ++ ++`TARGET_...' ++ This series of macros is to allow compiler command arguments to ++ enable or disable the use of optional features of the target ++ machine. For example, one machine description serves both the ++ 68000 and the 68020; a command argument tells the compiler whether ++ it should use 68020-only instructions or not. This command ++ argument works by means of a macro `TARGET_68020' that tests a bit ++ in `target_flags'. ++ ++ Define a macro `TARGET_FEATURENAME' for each such option. Its ++ definition should test a bit in `target_flags'; for example: ++ ++ #define TARGET_68020 (target_flags & 1) ++ ++ One place where these macros are used is in the ++ condition-expressions of instruction patterns. Note how ++ `TARGET_68020' appears frequently in the 68000 machine description ++ file, `m68k.md'. Another place they are used is in the definitions ++ of the other macros in the `tm-MACHINE.h' file. ++ ++`TARGET_SWITCHES' ++ This macro defines names of command options to set and clear bits ++ in `target_flags'. Its definition is an initializer with a ++ subgrouping for each command option. ++ ++ Each subgrouping contains a string constant, that defines the ++ option name, and a number, which contains the bits to set in ++ `target_flags'. A negative number says to clear bits instead; the ++ negative of the number is which bits to clear. The actual option ++ name is made by appending `-m' to the specified name. ++ ++ One of the subgroupings should have a null string. The number in ++ this grouping is the default value for `target_flags'. Any target ++ options act starting with that value. ++ ++ Here is an example which defines `-m68000' and `-m68020' with ++ opposite meanings, and picks the latter as the default: ++ ++ #define TARGET_SWITCHES \ ++ { { "68020", 1}, \ ++ { "68000", -1}, \ ++ { "", 1}} ++ ++`OVERRIDE_OPTIONS' ++ Sometimes certain combinations of command options do not make ++ sense on a particular target machine. You can define a macro ++ `OVERRIDE_OPTIONS' to take account of this. This macro, if ++ defined, is executed once just after all the command options have ++ been parsed. ++ ++ ++File: gcc.info, Node: Storage Layout, Next: Registers, Prev: Run-time Target, Up: Machine Macros ++ ++Storage Layout ++============== ++ ++ Note that the definitions of the macros in this table which are ++sizes or alignments measured in bits do not need to be constant. They ++can be C expressions that refer to static variables, such as the ++`target_flags'. *Note Run-time Target::. ++ ++`BITS_BIG_ENDIAN' ++ Define this macro if the most significant bit in a byte has the ++ lowest number. This means that bit-field instructions count from ++ the most significant bit. If the machine has no bit-field ++ instructions, this macro is irrelevant. ++ ++ This macro does not affect the way structure fields are packed into ++ bytes or words; that is controlled by `BYTES_BIG_ENDIAN'. ++ ++`BYTES_BIG_ENDIAN' ++ Define this macro if the most significant byte in a word has the ++ lowest number. ++ ++`WORDS_BIG_ENDIAN' ++ Define this macro if, in a multiword object, the most significant ++ word has the lowest number. ++ ++`BITS_PER_UNIT' ++ Number of bits in an addressable storage unit (byte); normally 8. ++ ++`BITS_PER_WORD' ++ Number of bits in a word; normally 32. ++ ++`UNITS_PER_WORD' ++ Number of storage units in a word; normally 4. ++ ++`POINTER_SIZE' ++ Width of a pointer, in bits. ++ ++`POINTER_BOUNDARY' ++ Alignment required for pointers stored in memory, in bits. ++ ++`PARM_BOUNDARY' ++ Normal alignment required for function parameters on the stack, in ++ bits. All stack parameters receive least this much alignment ++ regardless of data type. On most machines, this is the same as the ++ size of an integer. ++ ++`MAX_PARM_BOUNDARY' ++ Largest alignment required for any stack parameters, in bits. If ++ the data type of the parameter calls for more alignment than ++ `PARM_BOUNDARY', then it is given extra padding up to this limit. ++ ++ Don't define this macro if it would be equal to `PARM_BOUNDARY'; ++ in other words, if the alignment of a stack parameter should not ++ depend on its data type (as is the case on most machines). ++ ++`STACK_BOUNDARY' ++ Define this macro if you wish to preserve a certain alignment for ++ the stack pointer at all times. The definition is a C expression ++ for the desired alignment (measured in bits). ++ ++`FUNCTION_BOUNDARY' ++ Alignment required for a function entry point, in bits. ++ ++`BIGGEST_ALIGNMENT' ++ Biggest alignment that any data type can require on this machine, ++ in bits. ++ ++`CONSTANT_ALIGNMENT (CODE, TYPEALIGN)' ++ A C expression to compute the alignment for a constant. The ++ argument TYPEALIGN is the alignment required for the constant's ++ data type. CODE is the tree code of the constant itself. ++ ++ If this macro is not defined, the default is to use TYPEALIGN. If ++ you do define this macro, the value must be a multiple of ++ TYPEALIGN. ++ ++ The purpose of defining this macro is usually to cause string ++ constants to be word aligned so that `dhrystone' can be made to ++ run faster. ++ ++`EMPTY_FIELD_BOUNDARY' ++ Alignment in bits to be given to a structure bit field that ++ follows an empty field such as `int : 0;'. ++ ++`STRUCTURE_SIZE_BOUNDARY' ++ Number of bits which any structure or union's size must be a ++ multiple of. Each structure or union's size is rounded up to a ++ multiple of this. ++ ++ If you do not define this macro, the default is the same as ++ `BITS_PER_UNIT'. ++ ++`STRICT_ALIGNMENT' ++ Define this if instructions will fail to work if given data not on ++ the nominal alignment. If instructions will merely go slower in ++ that case, do not define this macro. ++ ++`PCC_BITFIELD_TYPE_MATTERS' ++ Define this if you wish to imitate a certain bizarre behavior ++ pattern of some instances of PCC: a bit field whose declared type ++ is `int' has the same effect on the size and alignment of a ++ structure as an actual `int' would have. ++ ++ If the macro is defined, then its definition should be a C ++ expression; a nonzero value for the expression enables ++ PCC-compatible behavior. ++ ++ Just what effect that is in GNU CC depends on other parameters, ++ but on most machines it would force the structure's alignment and ++ size to a multiple of 32 or `BIGGEST_ALIGNMENT' bits. ++ ++`MAX_FIXED_MODE_SIZE' ++ An integer expression for the largest integer machine mode that ++ should actually be used. All integer machine modes of this size ++ or smaller can be used for structures and unions with the ++ appropriate sizes. ++ ++`CHECK_FLOAT_VALUE (MODE, VALUE)' ++ A C statement to validate the value VALUE (or type `double') for ++ mode MODE. This means that you check whether VALUE fits within ++ the possible range of values for mode MODE on this target machine. ++ The mode MODE is always `SFmode' or `DFmode'. ++ ++ If VALUE is not valid, you should call `error' to print an error ++ message and then assign some valid value to VALUE. Allowing an ++ invalid value to go through the compiler can produce incorrect ++ assembler code which may even cause Unix assemblers to crash. ++ ++ This macro need not be defined if there is no work for it to do. ++ ++ +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.info-9 alliance/genview/src/gcc-1.42/gcc.info-9 +--- alliance-5.0/genview/src/gcc-1.42/gcc.info-9 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.info-9 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,1038 @@ ++This is Info file gcc.info, produced by Makeinfo-1.47 from the input ++file gcc.texinfo. ++ ++ This file documents the use and the internals of the GNU compiler. ++ ++ Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++ Permission is granted to make and distribute verbatim copies of this ++manual provided the copyright notice and this permission notice are ++preserved on all copies. ++ ++ Permission is granted to copy and distribute modified versions of ++this manual under the conditions for verbatim copying, provided also ++that the sections entitled "GNU General Public License" and "Protect ++Your Freedom--Fight `Look And Feel'" are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++ Permission is granted to copy and distribute translations of this ++manual into another language, under the above conditions for modified ++versions, except that the sections entitled "GNU General Public ++License" and "Protect Your Freedom--Fight `Look And Feel'" and this ++permission notice may be included in translations approved by the Free ++Software Foundation instead of in the original English. ++ ++ ++File: gcc.info, Node: Registers, Next: Register Classes, Prev: Storage Layout, Up: Machine Macros ++ ++Register Usage ++============== ++ ++`FIRST_PSEUDO_REGISTER' ++ Number of hardware registers known to the compiler. They receive ++ numbers 0 through `FIRST_PSEUDO_REGISTER-1'; thus, the first ++ pseudo register's number really is assigned the number ++ `FIRST_PSEUDO_REGISTER'. ++ ++`FIXED_REGISTERS' ++ An initializer that says which registers are used for fixed ++ purposes all throughout the compiled code and are therefore not ++ available for general allocation. These would include the stack ++ pointer, the frame pointer (except on machines where that can be ++ used as a general register when no frame pointer is needed), the ++ program counter on machines where that is considered one of the ++ addressable registers, and any other numbered register with a ++ standard use. ++ ++ This information is expressed as a sequence of numbers, separated ++ by commas and surrounded by braces. The Nth number is 1 if ++ register N is fixed, 0 otherwise. ++ ++ The table initialized from this macro, and the table initialized by ++ the following one, may be overridden at run time either ++ automatically, by the actions of the macro ++ `CONDITIONAL_REGISTER_USAGE', or by the user with the command ++ options `-ffixed-REG', `-fcall-used-REG' and `-fcall-saved-REG'. ++ ++`CALL_USED_REGISTERS' ++ Like `FIXED_REGISTERS' but has 1 for each register that is ++ clobbered (in general) by function calls as well as for fixed ++ registers. This macro therefore identifies the registers that are ++ not available for general allocation of values that must live ++ across function calls. ++ ++ If a register has 0 in `CALL_USED_REGISTERS', the compiler ++ automatically saves it on function entry and restores it on ++ function exit, if the register is used within the function. ++ ++`DEFAULT_CALLER_SAVES' ++ Define this macro if function calls on the target machine do not ++ preserve any registers; in other words, if `CALL_USED_REGISTERS' ++ has 1 for all registers. This macro enables `-fcaller-saves' by ++ default. Eventually that option will be enabled by default on all ++ machines and both the option and this macro will be eliminated. ++ ++`CONDITIONAL_REGISTER_USAGE' ++ Zero or more C statements that may conditionally modify two ++ variables `fixed_regs' and `call_used_regs' (both of type `char ++ []') after they have been initialized from the two preceding ++ macros. ++ ++ This is necessary in case the fixed or call-clobbered registers ++ depend on target flags. ++ ++ You need not define this macro if it has no work to do. ++ ++ If the usage of an entire class of registers depends on the target ++ flags, you may indicate this to GCC by using this macro to modify ++ `fixed_regs' and `call_used_regs' to 1 for each of the registers ++ in the classes which should not be used by GCC. Also define the ++ macro `REG_CLASS_FROM_LETTER' to return `NO_REGS' if it is called ++ with a letter for a class that shouldn't be used. ++ ++ (However, if this class is not included in `GENERAL_REGS' and all ++ of the insn patterns whose constraints permit this class are ++ controlled by target switches, then GCC will automatically avoid ++ using these registers when the target switches are opposed to ++ them.) ++ ++`OVERLAPPING_REGNO_P (REGNO)' ++ If defined, this is a C expression whose value is nonzero if hard ++ register number REGNO is an overlapping register. This means a ++ hard register which overlaps a hard register with a different ++ number. (Such overlap is undesirable, but occasionally it allows a ++ machine to be supported which otherwise could not be.) This macro ++ must return nonzero for *all* the registers which overlap each ++ other. GNU CC can use an overlapping register only in certain ++ limited ways. It can be used for allocation within a basic block, ++ and may be spilled for reloading; that is all. ++ ++ If this macro is not defined, it means that none of the hard ++ registers overlap each other. This is the usual situation. ++ ++`INSN_CLOBBERS_REGNO_P (INSN, REGNO)' ++ If defined, this is a C expression whose value should be nonzero if ++ the insn INSN has the effect of mysteriously clobbering the ++ contents of hard register number REGNO. By "mysterious" we mean ++ that the insn's RTL expression doesn't describe such an effect. ++ ++ If this macro is not defined, it means that no insn clobbers ++ registers mysteriously. This is the usual situation; all else ++ being equal, it is best for the RTL expression to show all the ++ activity. ++ ++`PRESERVE_DEATH_INFO_REGNO_P (REGNO)' ++ If defined, this is a C expression whose value is nonzero if ++ accurate `REG_DEAD' notes are needed for hard register number REGNO ++ at the time of outputting the assembler code. When this is so, a ++ few optimizations that take place after register allocation and ++ could invalidate the death notes are not done when this register is ++ involved. ++ ++ You would arrange to preserve death info for a register when some ++ of the code in the machine description which is executed to write ++ the assembler code looks at the death notes. This is necessary ++ only when the actual hardware feature which GNU CC thinks of as a ++ register is not actually a register of the usual sort. (It might, ++ for example, be a hardware stack.) ++ ++ If this macro is not defined, it means that no death notes need to ++ be preserved. This is the usual situation. ++ ++`HARD_REGNO_NREGS (REGNO, MODE)' ++ A C expression for the number of consecutive hard registers, ++ starting at register number REGNO, required to hold a value of mode ++ MODE. ++ ++ On a machine where all registers are exactly one word, a suitable ++ definition of this macro is ++ ++ #define HARD_REGNO_NREGS(REGNO, MODE) \ ++ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \ ++ / UNITS_PER_WORD)) ++ ++`HARD_REGNO_MODE_OK (REGNO, MODE)' ++ A C expression that is nonzero if it is permissible to store a ++ value of mode MODE in hard register number REGNO (or in several ++ registers starting with that one). For a machine where all ++ registers are equivalent, a suitable definition is ++ ++ #define HARD_REGNO_MODE_OK(REGNO, MODE) 1 ++ ++ It is not necessary for this macro to check for the numbers of ++ fixed registers, because the allocation mechanism considers them ++ to be always occupied. ++ ++ On some machines, double-precision values must be kept in even/odd ++ register pairs. The way to implement that is to define this macro ++ to reject odd register numbers for such modes. ++ ++ GNU CC assumes that it can always move values between registers and ++ (suitably addressed) memory locations. If it is impossible to ++ move a value of a certain mode between memory and certain ++ registers, then `HARD_REGNO_MODE_OK' must not allow this mode in ++ those registers. ++ ++ Many machines have special registers for floating point arithmetic. ++ Often people assume that floating point machine modes are allowed ++ only in floating point registers. This is not true. Any ++ registers that can hold integers can safely *hold* a floating ++ point machine mode, whether or not floating arithmetic can be done ++ on it in those registers. ++ ++ On some machines, though, the converse is true: fixed-point machine ++ modes may not go in floating registers. This is true if the ++ floating registers normalize any value stored in them, because ++ storing a non-floating value there would garble it. In this case, ++ `HARD_REGNO_MODE_OK' should reject fixed-point machine modes in ++ floating registers. But if the floating registers do not ++ automatically normalize, if you can store any bit pattern in one ++ and retrieve it unchanged without a trap, then any machine mode ++ may go in a floating register and this macro should say so. ++ ++ The primary significance of special floating registers is rather ++ that they are the registers acceptable in floating point arithmetic ++ instructions. However, this is of no concern to ++ `HARD_REGNO_MODE_OK'. You handle it by writing the proper ++ constraints for those instructions. ++ ++ On some machines, the floating registers are especially slow to ++ access, so that it is better to store a value in a stack frame ++ than in such a register if floating point arithmetic is not being ++ done. As long as the floating registers are not in class ++ `GENERAL_REGS', they will not be used unless some insn's ++ constraint asks for one. ++ ++`MODES_TIEABLE_P (MODE1, MODE2)' ++ A C expression that is nonzero if it is desirable to choose ++ register allocation so as to avoid move instructions between a ++ value of mode MODE1 and a value of mode MODE2. ++ ++ If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R, ++ MODE2)' are ever different for any R, then `MODES_TIEABLE_P (MODE1, ++ MODE2)' must be zero. ++ ++`PC_REGNUM' ++ If the program counter has a register number, define this as that ++ register number. Otherwise, do not define it. ++ ++`STACK_POINTER_REGNUM' ++ The register number of the stack pointer register, which must also ++ be a fixed register according to `FIXED_REGISTERS'. On many ++ machines, the hardware determines which register this is. ++ ++`FRAME_POINTER_REGNUM' ++ The register number of the frame pointer register, which is used to ++ access automatic variables in the stack frame. On some machines, ++ the hardware determines which register this is. On other ++ machines, you can choose any register you wish for this purpose. ++ ++`FRAME_POINTER_REQUIRED' ++ A C expression which is nonzero if a function must have and use a ++ frame pointer. This expression is evaluated twice: at the ++ beginning of generating RTL, and in the reload pass. If its value ++ is nonzero at either time, then the function will have a frame ++ pointer. ++ ++ The expression can in principle examine the current function and ++ decide according to the facts, but on most machines the constant 0 ++ or the constant 1 suffices. Use 0 when the machine allows code to ++ be generated with no frame pointer, and doing so saves some time ++ or space. Use 1 when there is no possible advantage to avoiding a ++ frame pointer. ++ ++ In certain cases, the compiler does not know how to produce valid ++ code without a frame pointer. The compiler recognizes those cases ++ and automatically gives the function a frame pointer regardless of ++ what `FRAME_POINTER_REQUIRED' says. You don't need to worry about ++ them. ++ ++ In a function that does not require a frame pointer, the frame ++ pointer register can be allocated for ordinary usage, unless you ++ mark it as a fixed register. See `FIXED_REGISTERS' for more ++ information. ++ ++`ARG_POINTER_REGNUM' ++ The register number of the arg pointer register, which is used to ++ access the function's argument list. On some machines, this is the ++ same as the frame pointer register. On some machines, the hardware ++ determines which register this is. On other machines, you can ++ choose any register you wish for this purpose. If this is not the ++ same register as the frame pointer register, then you must mark it ++ as a fixed register according to `FIXED_REGISTERS'. ++ ++`STATIC_CHAIN_REGNUM' ++ The register number used for passing a function's static chain ++ pointer. This is needed for languages such as Pascal and Algol ++ where functions defined within other functions can access the local ++ variables of the outer functions; it is not currently used because ++ C does not provide this feature, but you must define the macro. ++ ++ The static chain register need not be a fixed register. ++ ++`STRUCT_VALUE_REGNUM' ++ When a function's value's mode is `BLKmode', the value is not ++ returned according to `FUNCTION_VALUE'. Instead, the caller ++ passes the address of a block of memory in which the value should ++ be stored. ++ ++ If this value is passed in a register, then `STRUCT_VALUE_REGNUM' ++ should be the number of that register. ++ ++`STRUCT_VALUE' ++ If the structure value address is not passed in a register, define ++ `STRUCT_VALUE' as an expression returning an RTX for the place ++ where the address is passed. If it returns a `mem' RTX, the ++ address is passed as an "invisible" first argument. ++ ++`STRUCT_VALUE_INCOMING_REGNUM' ++ On some architectures the place where the structure value address ++ is found by the called function is not the same place that the ++ caller put it. This can be due to register windows, or it could ++ be because the function prologue moves it to a different place. ++ ++ If the incoming location of the structure value address is in a ++ register, define this macro as the register number. ++ ++`STRUCT_VALUE_INCOMING' ++ If the incoming location is not a register, define ++ `STRUCT_VALUE_INCOMING' as an expression for an RTX for where the ++ called function should find the value. If it should find the ++ value on the stack, define this to create a `mem' which refers to ++ the frame pointer. If the value is a `mem', the compiler assumes ++ it is for an invisible first argument, and leaves space for it when ++ finding the first real argument. ++ ++`REG_ALLOC_ORDER' ++ If defined, an initializer for a vector of integers, containing the ++ numbers of hard registers in the order in which the GNU CC should ++ prefer to use them (from most preferred to least). ++ ++ If this macro is not defined, registers are used lowest numbered ++ first (all else being equal). ++ ++ One use of this macro is on the 360, where the highest numbered ++ registers must always be saved and the save-multiple-registers ++ instruction supports only sequences of consecutive registers. This ++ macro is defined to cause the highest numbered allocatable ++ registers to be used first. ++ ++ ++File: gcc.info, Node: Register Classes, Next: Stack Layout, Prev: Registers, Up: Machine Macros ++ ++Register Classes ++================ ++ ++ On many machines, the numbered registers are not all equivalent. For ++example, certain registers may not be allowed for indexed addressing; ++certain registers may not be allowed in some instructions. These ++machine restrictions are described to the compiler using "register ++classes". ++ ++ You define a number of register classes, giving each one a name and ++saying which of the registers belong to it. Then you can specify ++register classes that are allowed as operands to particular instruction ++patterns. ++ ++ In general, each register will belong to several classes. In fact, ++one class must be named `ALL_REGS' and contain all the registers. ++Another class must be named `NO_REGS' and contain no registers. Often ++the union of two classes will be another class; however, this is not ++required. ++ ++ One of the classes must be named `GENERAL_REGS'. There is nothing ++terribly special about the name, but the operand constraint letters `r' ++and `g' specify this class. If `GENERAL_REGS' is the same as ++`ALL_REGS', just define it as a macro which expands to `ALL_REGS'. ++ ++ The way classes other than `GENERAL_REGS' are specified in operand ++constraints is through machine-dependent operand constraint letters. ++You can define such letters to correspond to various classes, then use ++them in operand constraints. ++ ++ You should define a class for the union of two classes whenever some ++instruction allows both classes. For example, if an instruction allows ++either a floating-point (coprocessor) register or a general register ++for a certain operand, you should define a class `FLOAT_OR_GENERAL_REGS' ++which includes both of them. Otherwise you will get suboptimal code. ++ ++ You must also specify certain redundant information about the ++register classes: for each class, which classes contain it and which ++ones are contained in it; for each pair of classes, the largest class ++contained in their union. ++ ++ When a value occupying several consecutive registers is expected in a ++certain class, all the registers used must belong to that class. ++Therefore, register classes cannot be used to enforce a requirement for ++a register pair to start with an even-numbered register. The way to ++specify this requirement is with `HARD_REGNO_MODE_OK'. ++ ++ Register classes used for input-operands of bitwise-and or shift ++instructions have a special requirement: each such class must have, for ++each fixed-point machine mode, a subclass whose registers can transfer ++that mode to or from memory. For example, on some machines, the ++operations for single-byte values (`QImode') are limited to certain ++registers. When this is so, each register class that is used in a ++bitwise-and or shift instruction must have a subclass consisting of ++registers from which single-byte values can be loaded or stored. This ++is so that `PREFERRED_RELOAD_CLASS' can always have a possible value to ++return. ++ ++`enum reg_class' ++ An enumeral type that must be defined with all the register class ++ names as enumeral values. `NO_REGS' must be first. `ALL_REGS' ++ must be the last register class, followed by one more enumeral ++ value, `LIM_REG_CLASSES', which is not a register class but rather ++ tells how many classes there are. ++ ++ Each register class has a number, which is the value of casting ++ the class name to type `int'. The number serves as an index in ++ many of the tables described below. ++ ++`N_REG_CLASSES' ++ The number of distinct register classes, defined as follows: ++ ++ #define N_REG_CLASSES (int) LIM_REG_CLASSES ++ ++`REG_CLASS_NAMES' ++ An initializer containing the names of the register classes as C ++ string constants. These names are used in writing some of the ++ debugging dumps. ++ ++`REG_CLASS_CONTENTS' ++ An initializer containing the contents of the register classes, as ++ integers which are bit masks. The Nth integer specifies the ++ contents of class N. The way the integer MASK is interpreted is ++ that register R is in the class if `MASK & (1 << R)' is 1. ++ ++ When the machine has more than 32 registers, an integer does not ++ suffice. Then the integers are replaced by sub-initializers, ++ braced groupings containing several integers. Each ++ sub-initializer must be suitable as an initializer for the type ++ `HARD_REG_SET' which is defined in `hard-reg-set.h'. ++ ++`REGNO_REG_CLASS (REGNO)' ++ A C expression whose value is a register class containing hard ++ register REGNO. In general there is more that one such class; ++ choose a class which is "minimal", meaning that no smaller class ++ also contains the register. ++ ++`BASE_REG_CLASS' ++ A macro whose definition is the name of the class to which a valid ++ base register must belong. A base register is one used in an ++ address which is the register value plus a displacement. ++ ++`INDEX_REG_CLASS' ++ A macro whose definition is the name of the class to which a valid ++ index register must belong. An index register is one used in an ++ address where its value is either multiplied by a scale factor or ++ added to another register (as well as added to a displacement). ++ ++`REG_CLASS_FROM_LETTER (CHAR)' ++ A C expression which defines the machine-dependent operand ++ constraint letters for register classes. If CHAR is such a ++ letter, the value should be the register class corresponding to ++ it. Otherwise, the value should be `NO_REGS'. ++ ++`REGNO_OK_FOR_BASE_P (NUM)' ++ A C expression which is nonzero if register number NUM is suitable ++ for use as a base register in operand addresses. It may be either ++ a suitable hard register or a pseudo register that has been ++ allocated such a hard register. ++ ++`REGNO_OK_FOR_INDEX_P (NUM)' ++ A C expression which is nonzero if register number NUM is suitable ++ for use as an index register in operand addresses. It may be ++ either a suitable hard register or a pseudo register that has been ++ allocated such a hard register. ++ ++ The difference between an index register and a base register is ++ that the index register may be scaled. If an address involves the ++ sum of two registers, neither one of them scaled, then either one ++ may be labeled the "base" and the other the "index"; but whichever ++ labeling is used must fit the machine's constraints of which ++ registers may serve in each capacity. The compiler will try both ++ labelings, looking for one that is valid, and will reload one or ++ both registers only if neither labeling works. ++ ++`PREFERRED_RELOAD_CLASS (X, CLASS)' ++ A C expression that places additional restrictions on the register ++ class to use when it is necessary to copy value X into a register ++ in class CLASS. The value is a register class; perhaps CLASS, or ++ perhaps another, smaller class. On many machines, the definition ++ ++ #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS ++ ++ is safe. ++ ++ Sometimes returning a more restrictive class makes better code. ++ For example, on the 68000, when X is an integer constant that is ++ in range for a `moveq' instruction, the value of this macro is ++ always `DATA_REGS' as long as CLASS includes the data registers. ++ Requiring a data register guarantees that a `moveq' will be used. ++ ++ If X is a `const_double', by returning `NO_REGS' you can force X ++ into a memory constant. This is useful on certain machines where ++ immediate floating values cannot be loaded into certain kinds of ++ registers. ++ ++ In a shift instruction or a bitwise-and instruction, the mode of X, ++ the value being reloaded, may not be the same as the mode of the ++ instruction's operand. (They will both be fixed-point modes, ++ however.) In such a case, CLASS may not be a safe value to ++ return. CLASS is certainly valid for the instruction, but it may ++ not be valid for reloading X. This problem can occur on machines ++ such as the 68000 and 80386 where some registers can handle ++ full-word values but cannot handle single-byte values. ++ ++ On such machines, this macro must examine the mode of X and return ++ a subclass of CLASS which can handle loads and stores of that ++ mode. On the 68000, where address registers cannot handle ++ `QImode', if X has `QImode' then you must return `DATA_REGS'. If ++ CLASS is `ADDR_REGS', then there is no correct value to return; ++ but the shift and bitwise-and instructions don't use `ADDR_REGS', ++ so this fatal case never arises. ++ ++`CLASS_MAX_NREGS (CLASS, MODE)' ++ A C expression for the maximum number of consecutive registers of ++ class CLASS needed to hold a value of mode MODE. ++ ++ This is closely related to the macro `HARD_REGNO_NREGS'. In fact, ++ the value of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be ++ the maximum value of `HARD_REGNO_NREGS (REGNO, MODE)' for all ++ REGNO values in the class CLASS. ++ ++ This macro helps control the handling of multiple-word values in ++ the reload pass. ++ ++ Two other special macros describe which constants fit which ++constraint letters. ++ ++`CONST_OK_FOR_LETTER_P (VALUE, C)' ++ A C expression that defines the machine-dependent operand ++ constraint letters that specify particular ranges of integer ++ values. If C is one of those letters, the expression should check ++ that VALUE, an integer, is in the appropriate range and return 1 ++ if so, 0 otherwise. If C is not one of those letters, the value ++ should be 0 regardless of VALUE. ++ ++`CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C)' ++ A C expression that defines the machine-dependent operand ++ constraint letters that specify particular ranges of floating ++ values. If C is one of those letters, the expression should check ++ that VALUE, an RTX of code `const_double', is in the appropriate ++ range and return 1 if so, 0 otherwise. If C is not one of those ++ letters, the value should be 0 regardless of VALUE. ++ ++ ++File: gcc.info, Node: Stack Layout, Next: Library Calls, Prev: Register Classes, Up: Machine Macros ++ ++Describing Stack Layout ++======================= ++ ++`STACK_GROWS_DOWNWARD' ++ Define this macro if pushing a word onto the stack moves the stack ++ pointer to a smaller address. ++ ++ When we say, "define this macro if ...," it means that the ++ compiler checks this macro only with `#ifdef' so the precise ++ definition used does not matter. ++ ++`FRAME_GROWS_DOWNWARD' ++ Define this macro if the addresses of local variable slots are at ++ negative offsets from the frame pointer. ++ ++`STARTING_FRAME_OFFSET' ++ Offset from the frame pointer to the first local variable slot to ++ be allocated. ++ ++ If `FRAME_GROWS_DOWNWARD', the next slot's offset is found by ++ subtracting the length of the first slot from ++ `STARTING_FRAME_OFFSET'. Otherwise, it is found by adding the ++ length of the first slot to the value `STARTING_FRAME_OFFSET'. ++ ++`PUSH_ROUNDING (NPUSHED)' ++ A C expression that is the number of bytes actually pushed onto the ++ stack when an instruction attempts to push NPUSHED bytes. ++ ++ If the target machine does not have a push instruction, do not ++ define this macro. That directs GNU CC to use an alternate ++ strategy: to allocate the entire argument block and then store the ++ arguments into it. ++ ++ On some machines, the definition ++ ++ #define PUSH_ROUNDING(BYTES) (BYTES) ++ ++ will suffice. But on other machines, instructions that appear to ++ push one byte actually push two bytes in an attempt to maintain ++ alignment. Then the definition should be ++ ++ #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1) ++ ++`FIRST_PARM_OFFSET (FUNDECL)' ++ Offset from the argument pointer register to the first argument's ++ address. On some machines it may depend on the data type of the ++ function. (In the next version of GNU CC, the argument will be ++ changed to the function data type rather than its declaration.) ++ ++`FIRST_PARM_CALLER_OFFSET (FUNDECL)' ++ Define this macro on machines where register parameters have shadow ++ locations on the stack, at addresses below the nominal parameter. ++ This matters because certain arguments cannot be passed on the ++ stack. On these machines, such arguments must be stored into the ++ shadow locations. ++ ++ This macro should expand into a C expression whose value is the ++ offset of the first parameter's shadow location from the nominal ++ stack pointer value. (That value is itself computed by adding the ++ value of `STACK_POINTER_OFFSET' to the stack pointer register.) ++ ++`REG_PARM_STACK_SPACE' ++ Define this macro if functions should assume that stack space has ++ been allocated for arguments even when their values are passed in ++ registers. ++ ++ The actual allocation of such space would be done either by the ++ call instruction or by the function prologue, or by defining ++ `FIRST_PARM_CALLER_OFFSET'. ++ ++`STACK_ARGS_ADJUST (SIZE)' ++ Define this macro if the machine requires padding on the stack for ++ certain function calls. This is padding on a per-function-call ++ basis, not padding for individual arguments. ++ ++ The argument SIZE will be a C variable of type `struct arg_data' ++ which contains two fields, an integer named `constant' and an RTX ++ named `var'. These together represent a size measured in bytes ++ which is the sum of the integer and the RTX. Most of the time ++ `var' is 0, which means that the size is simply the integer. ++ ++ The definition should be a C statement or compound statement which ++ alters the variable supplied in whatever way you wish. ++ ++ Note that the value you leave in the variable `size' will ++ ultimately be rounded up to a multiple of `STACK_BOUNDARY' bits. ++ ++ This macro is not fully implemented for machines which have push ++ instructions (i.e., on which `PUSH_ROUNDING' is defined). ++ ++`RETURN_POPS_ARGS (FUNTYPE)' ++ A C expression that should be 1 if a function pops its own ++ arguments on returning, or 0 if the function pops no arguments and ++ the caller must therefore pop them all after the function returns. ++ ++ FUNTYPE is a C variable whose value is a tree node that describes ++ the function in question. Normally it is a node of type ++ `FUNCTION_TYPE' that describes the data type of the function. From ++ this it is possible to obtain the data types of the value and ++ arguments (if known). ++ ++ When a call to a library function is being considered, FUNTYPE ++ will contain an identifier node for the library function. Thus, if ++ you need to distinguish among various library functions, you can ++ do so by their names. Note that "library function" in this ++ context means a function used to perform arithmetic, whose name is ++ known specially in the compiler and was not mentioned in the C ++ code being compiled. ++ ++ On the Vax, all functions always pop their arguments, so the ++ definition of this macro is 1. On the 68000, using the standard ++ calling convention, no functions pop their arguments, so the value ++ of the macro is always 0 in this case. But an alternative calling ++ convention is available in which functions that take a fixed ++ number of arguments pop them but other functions (such as ++ `printf') pop nothing (the caller pops all). When this convention ++ is in use, FUNTYPE is examined to determine whether a function ++ takes a fixed number of arguments. ++ ++ When this macro returns nonzero, the macro `FRAME_POINTER_REQUIRED' ++ must also return nonzero for proper operation. ++ ++`FUNCTION_VALUE (VALTYPE, FUNC)' ++ A C expression to create an RTX representing the place where a ++ function returns a value of data type VALTYPE. VALTYPE is a tree ++ node representing a data type. Write `TYPE_MODE (VALTYPE)' to get ++ the machine mode used to represent that type. On many machines, ++ only the mode is relevant. (Actually, on most machines, scalar ++ values are returned in the same place regardless of mode). ++ ++ If the precise function being called is known, FUNC is a tree node ++ (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This ++ makes it possible to use a different value-returning convention ++ for specific functions when all their calls are known. ++ ++`FUNCTION_OUTGOING_VALUE (VALTYPE, FUNC)' ++ Define this macro if the target machine has "register windows" so ++ that the register in which a function returns its value is not the ++ same as the one in which the caller sees the value. ++ ++ For such machines, `FUNCTION_VALUE' computes the register in which ++ the caller will see the value, and `FUNCTION_OUTGOING_VALUE' ++ should be defined in a similar fashion to tell the function where ++ to put the value. ++ ++ If `FUNCTION_OUTGOING_VALUE' is not defined, `FUNCTION_VALUE' ++ serves both purposes. ++ ++`RETURN_IN_MEMORY (TYPE)' ++ A C expression which can inhibit the returning of certain function ++ values in registers, based on the type of value. A nonzero value ++ says to return the function value in memory, just as large ++ structures are always returned. Here TYPE will be a C expression ++ of type `tree', representing the data type of the value. ++ ++ Note that values of mode `BLKmode' are returned in memory ++ regardless of this macro. Also, the option `-fpcc-struct-return' ++ takes effect regardless of this macro. On most systems, it is ++ possible to leave the macro undefined; this causes a default ++ definition to be used, whose value is the constant 0. ++ ++`LIBCALL_VALUE (MODE)' ++ A C expression to create an RTX representing the place where a ++ library function returns a value of mode MODE. If the precise ++ function being called is known, FUNC is a tree node ++ (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer. This ++ makes it possible to use a different value-returning convention ++ for specific functions when all their calls are known. ++ ++ Note that "library function" in this context means a compiler ++ support routine, used to perform arithmetic, whose name is known ++ specially by the compiler and was not mentioned in the C code being ++ compiled. ++ ++`FUNCTION_VALUE_REGNO_P (REGNO)' ++ A C expression that is nonzero if REGNO is the number of a hard ++ register in which the values of called function may come back. ++ ++ A register whose use for returning values is limited to serving as ++ the second of a pair (for a value of type `double', say) need not ++ be recognized by this macro. So for most machines, this definition ++ suffices: ++ ++ #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0) ++ ++ If the machine has register windows, so that the caller and the ++ called function use different registers for the return value, this ++ macro should recognize only the caller's register numbers. ++ ++`FUNCTION_ARG (CUM, MODE, TYPE, NAMED)' ++ A C expression that controls whether a function argument is passed ++ in a register, and which register. ++ ++ The arguments are CUM, which summarizes all the previous ++ arguments; MODE, the machine mode of the argument; TYPE, the data ++ type of the argument as a tree node or 0 if that is not known ++ (which happens for C support library functions); and NAMED, which ++ is 1 for an ordinary argument and 0 for nameless arguments that ++ correspond to `...' in the called function's prototype. ++ ++ The value of the expression should either be a `reg' RTX for the ++ hard register in which to pass the argument, or zero to pass the ++ argument on the stack. ++ ++ For the Vax and 68000, where normally all arguments are pushed, ++ zero suffices as a definition. ++ ++ The usual way to make the ANSI library `stdarg.h' work on a machine ++ where some arguments are usually passed in registers, is to cause ++ nameless arguments to be passed on the stack instead. This is done ++ by making `FUNCTION_ARG' return 0 whenever NAMED is 0. ++ ++`FUNCTION_INCOMING_ARG (CUM, MODE, TYPE, NAMED)' ++ Define this macro if the target machine has "register windows", so ++ that the register in which a function sees an arguments is not ++ necessarily the same as the one in which the caller passed the ++ argument. ++ ++ For such machines, `FUNCTION_ARG' computes the register in which ++ the caller passes the value, and `FUNCTION_INCOMING_ARG' should be ++ defined in a similar fashion to tell the function being called ++ where the arguments will arrive. ++ ++ If `FUNCTION_INCOMING_ARG' is not defined, `FUNCTION_ARG' serves ++ both purposes. ++ ++`FUNCTION_ARG_PARTIAL_NREGS (CUM, MODE, TYPE, NAMED)' ++ A C expression for the number of words, at the beginning of an ++ argument, must be put in registers. The value must be zero for ++ arguments that are passed entirely in registers or that are ++ entirely pushed on the stack. ++ ++ On some machines, certain arguments must be passed partially in ++ registers and partially in memory. On these machines, typically ++ the first N words of arguments are passed in registers, and the ++ rest on the stack. If a multi-word argument (a `double' or a ++ structure) crosses that boundary, its first few words must be ++ passed in registers and the rest must be pushed. This macro tells ++ the compiler when this occurs, and how many of the words should go ++ in registers. ++ ++ `FUNCTION_ARG' for these arguments should return the first ++ register to be used by the caller for this argument; likewise ++ `FUNCTION_INCOMING_ARG', for the called function. ++ ++`CUMULATIVE_ARGS' ++ A C type for declaring a variable that is used as the first ++ argument of `FUNCTION_ARG' and other related values. For some ++ target machines, the type `int' suffices and can hold the number of ++ bytes of argument so far. ++ ++`INIT_CUMULATIVE_ARGS (CUM, FNTYPE)' ++ A C statement (sans semicolon) for initializing the variable CUM ++ for the state at the beginning of the argument list. The variable ++ has type `CUMULATIVE_ARGS'. The value of FNTYPE is the tree node ++ for the data type of the function which will receive the args, or 0 ++ if the args are to a compiler support library function. ++ ++`FUNCTION_ARG_ADVANCE (CUM, MODE, TYPE, NAMED)' ++ A C statement (sans semicolon) to update the summarizer variable ++ CUM to advance past an argument in the argument list. The values ++ MODE, TYPE and NAMED describe that argument. Once this is done, ++ the variable CUM is suitable for analyzing the *following* ++ argument with `FUNCTION_ARG', etc. ++ ++`FUNCTION_ARG_REGNO_P (REGNO)' ++ A C expression that is nonzero if REGNO is the number of a hard ++ register in which function arguments are sometimes passed. This ++ does *not* include implicit arguments such as the static chain and ++ the structure-value address. On many machines, no registers can be ++ used for this purpose since all function arguments are pushed on ++ the stack. ++ ++`FUNCTION_ARG_PADDING (MODE, SIZE)' ++ If defined, a C expression which determines whether, and in which ++ direction, to pad out an argument with extra space. The value ++ should be of type `enum direction': either `upward' to pad above ++ the argument, `downward' to pad below, or `none' to inhibit ++ padding. ++ ++ The argument SIZE is an RTX which describes the size of the ++ argument, in bytes. It should be used only if MODE is `BLKmode'. ++ Otherwise, SIZE is 0. ++ ++ This macro does not control the *amount* of padding; that is ++ always just enough to reach the next multiple of `PARM_BOUNDARY'. ++ ++ This macro has a default definition which is right for most ++ systems. For little-endian machines, the default is to pad upward. ++ For big-endian machines, the default is to pad downward for an ++ argument of constant size shorter than an `int', and upward ++ otherwise. ++ ++`FUNCTION_PROLOGUE (FILE, SIZE)' ++ A C compound statement that outputs the assembler code for entry ++ to a function. The prologue is responsible for setting up the ++ stack frame, initializing the frame pointer register, saving ++ registers that must be saved, and allocating SIZE additional bytes ++ of storage for the local variables. SIZE is an integer. FILE is ++ a stdio stream to which the assembler code should be output. ++ ++ The label for the beginning of the function need not be output by ++ this macro. That has already been done when the macro is run. ++ ++ To determine which registers to save, the macro can refer to the ++ array `regs_ever_live': element R is nonzero if hard register R is ++ used anywhere within the function. This implies the function ++ prologue should save register R, but not if it is one of the ++ call-used registers. ++ ++ On machines where functions may or may not have frame-pointers, the ++ function entry code must vary accordingly; it must set up the frame ++ pointer if one is wanted, and not otherwise. To determine whether ++ a frame pointer is in wanted, the macro can refer to the variable ++ `frame_pointer_needed'. The variable's value will be 1 at run ++ time in a function that needs a frame pointer. ++ ++ On machines where an argument may be passed partly in registers and ++ partly in memory, this macro must examine the variable ++ `current_function_pretend_args_size', and allocate that many bytes ++ of uninitialized space on the stack just underneath the first ++ argument arriving on the stack. (This may not be at the very end ++ of the stack, if the calling sequence has pushed anything else ++ since pushing the stack arguments. But usually, on such machines, ++ nothing else has been pushed yet, because the function prologue ++ itself does all the pushing.) ++ ++`FUNCTION_PROFILER (FILE, LABELNO)' ++ A C statement or compound statement to output to FILE some ++ assembler code to call the profiling subroutine `mcount'. Before ++ calling, the assembler code must load the address of a counter ++ variable into a register where `mcount' expects to find the ++ address. The name of this variable is `LP' followed by the number ++ LABELNO, so you would generate the name using `LP%d' in a ++ `fprintf'. ++ ++ The details of how the address should be passed to `mcount' are ++ determined by your operating system environment, not by GNU CC. To ++ figure them out, compile a small program for profiling using the ++ system's installed C compiler and look at the assembler code that ++ results. ++ ++`FUNCTION_BLOCK_PROFILER (FILE, LABELNO)' ++ A C statement or compound statement to output to FILE some ++ assembler code to initialize basic-block profiling for the current ++ object module. This code should call the subroutine ++ `__bb_init_func' once per object module, passing it as its sole ++ argument the address of a block allocated in the object module. ++ ++ The name of the block is a local symbol made with this statement: ++ ++ ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0); ++ ++ Of course, since you are writing the definition of ++ `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you ++ can take a short cut in the definition of this macro and use the ++ name that you know will result. ++ ++ The first word of this block is a flag which will be nonzero if the ++ object module has already been initialized. So test this word ++ first, and do not call `__bb_init_func' if the flag is nonzero. ++ ++`BLOCK_PROFILER (FILE, BLOCKNO)' ++ A C statement or compound statement to increment the count ++ associated with the basic block number BLOCKNO. Basic blocks are ++ numbered separately from zero within each compilation. The count ++ associated with block number BLOCKNO is at index BLOCKNO in a ++ vector of words; the name of this array is a local symbol made ++ with this statement: ++ ++ ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2); ++ ++ Of course, since you are writing the definition of ++ `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro, you ++ can take a short cut in the definition of this macro and use the ++ name that you know will result. ++ ++`EXIT_IGNORE_STACK' ++ Define this macro as a C expression that is nonzero if the return ++ instruction or the function epilogue ignores the value of the stack ++ pointer; in other words, if it is safe to delete an instruction to ++ adjust the stack pointer before a return from the function. ++ ++ Note that this macro's value is relevant only for functions for ++ which frame pointers are maintained. It is never safe to delete a ++ final stack adjustment in a function that has no frame pointer, ++ and the compiler knows this regardless of `EXIT_IGNORE_STACK'. ++ ++`FUNCTION_EPILOGUE (FILE, SIZE)' ++ A C compound statement that outputs the assembler code for exit ++ from a function. The epilogue is responsible for restoring the ++ saved registers and stack pointer to their values when the ++ function was called, and returning control to the caller. This ++ macro takes the same arguments as the macro `FUNCTION_PROLOGUE', ++ and the registers to restore are determined from `regs_ever_live' ++ and `CALL_USED_REGISTERS' in the same way. ++ ++ On some machines, there is a single instruction that does all the ++ work of returning from the function. On these machines, give that ++ instruction the name `return' and do not define the macro ++ `FUNCTION_EPILOGUE' at all. ++ ++ Do not define a pattern named `return' if you want the ++ `FUNCTION_EPILOGUE' to be used. If you want the target switches ++ to control whether return instructions or epilogues are used, ++ define a `return' pattern with a validity condition that tests the ++ target switches appropriately. If the `return' pattern's validity ++ condition is false, epilogues will be used. ++ ++ On machines where functions may or may not have frame-pointers, the ++ function exit code must vary accordingly. Sometimes the code for ++ these two cases is completely different. To determine whether a ++ frame pointer is in wanted, the macro can refer to the variable ++ `frame_pointer_needed'. The variable's value will be 1 at run ++ time in a function that needs a frame pointer. ++ ++ On some machines, some functions pop their arguments on exit while ++ others leave that for the caller to do. For example, the 68020 ++ when given `-mrtd' pops arguments in functions that take a fixed ++ number of arguments. ++ ++ Your definition of the macro `RETURN_POPS_ARGS' decides which ++ functions pop their own arguments. `FUNCTION_EPILOGUE' needs to ++ know what was decided. The variable `current_function_pops_args' ++ is nonzero if the function should pop its own arguments. If so, ++ use the variable `current_function_args_size' as the number of ++ bytes to pop. ++ ++`FIX_FRAME_POINTER_ADDRESS (ADDR, DEPTH)' ++ A C compound statement to alter a memory address that uses the ++ frame pointer register so that it uses the stack pointer register ++ instead. This must be done in the instructions that load parameter ++ values into registers, when the reload pass determines that a ++ frame pointer is not necessary for the function. ADDR will be a C ++ variable name, and the updated address should be stored in that ++ variable. DEPTH will be the current depth of stack temporaries ++ (number of bytes of arguments currently pushed). The change in ++ offset between a frame-pointer-relative address and a ++ stack-pointer-relative address must include DEPTH. ++ ++ Even if your machine description specifies there will always be a ++ frame pointer in the frame pointer register, you must still define ++ `FIX_FRAME_POINTER_ADDRESS', but the definition will never be ++ executed at run time, so it may be empty. ++ ++`LONGJMP_RESTORE_FROM_STACK' ++ Define this macro if the `longjmp' function restores registers ++ from the stack frames, rather than from those saved specifically by ++ `setjmp'. Certain quantities must not be kept in registers across ++ a call to `setjmp' on such machines. ++ ++ ++File: gcc.info, Node: Library Calls, Next: Addressing Modes, Prev: Stack Layout, Up: Machine Macros ++ ++Implicit Use of Library Routines ++================================ ++ ++`MULSI3_LIBCALL' ++ A C string constant giving the name of the function to call for ++ multiplication of one signed full-word by another. If you do not ++ define this macro, the default name is used, which is `__mulsi3', ++ a function defined in `gnulib'. ++ ++`UMULSI3_LIBCALL' ++ A C string constant giving the name of the function to call for ++ multiplication of one unsigned full-word by another. If you do not ++ define this macro, the default name is used, which is `__umulsi3', ++ a function defined in `gnulib'. ++ ++`DIVSI3_LIBCALL' ++ A C string constant giving the name of the function to call for ++ division of one signed full-word by another. If you do not define ++ this macro, the default name is used, which is `__divsi3', a ++ function defined in `gnulib'. ++ ++`UDIVSI3_LIBCALL' ++ A C string constant giving the name of the function to call for ++ division of one unsigned full-word by another. If you do not ++ define this macro, the default name is used, which is `__udivsi3', ++ a function defined in `gnulib'. ++ ++`MODSI3_LIBCALL' ++ A C string constant giving the name of the function to call for the ++ remainder in division of one signed full-word by another. If you ++ do not define this macro, the default name is used, which is ++ `__modsi3', a function defined in `gnulib'. ++ ++`UMODSI3_LIBCALL' ++ A C string constant giving the name of the function to call for the ++ remainder in division of one unsigned full-word by another. If ++ you do not define this macro, the default name is used, which is ++ `__umodsi3', a function defined in `gnulib'. ++ ++`TARGET_MEM_FUNCTIONS' ++ Define this macro if GNU CC should generate calls to the System V ++ (and ANSI C) library functions `memcpy' and `memset' rather than ++ the BSD functions `bcopy' and `bzero'. ++ ++`GNULIB_NEEDS_DOUBLE' ++ Define this macro if only `float' arguments cannot be passed to ++ library routines (so they must be converted to `double'). This ++ macro affects both how library calls are generated and how the ++ library routines in `gnulib.c' accept their arguments. It is ++ useful on machines where floating and fixed point arguments are ++ passed differently, such as the i860. ++ ++ +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.log alliance/genview/src/gcc-1.42/gcc.log +--- alliance-5.0/genview/src/gcc-1.42/gcc.log 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.log 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,107 @@ ++This is TeX, C Version 3.141 (format=plain 92.11.5) 29 DEC 1992 13:12 ++**gcc.texinfo ++(gcc.texinfo (texinfo.tex Loading texinfo package [Version 2.1]: Basics, ++\bindingoffset=\dimen16 ++\normaloffset=\dimen17 ++\pagewidth=\dimen18 ++\pageheight=\dimen19 ++\cornerlong=\dimen20 ++\cornerthick=\dimen21 ++\topandbottommargin=\dimen22 ++\outerhsize=\dimen23 ++\outervsize=\dimen24 ++\EMsimple=\toks12 ++\singlespaceskip=\skip18 ++ ++fonts, ++\fontdepth=\count26 ++\tclosesave=\dimen25 ++\tcloserm=\dimen26 ++ page headings, ++\titlepagetopglue=\skip19 ++\titlepagebottomglue=\skip20 ++\realeverypar=\toks13 ++\evenheadline=\toks14 ++\oddheadline=\toks15 ++\evenfootline=\toks16 ++\oddfootline=\toks17 ++ tables, ++\tableindent=\dimen27 ++\itemindent=\dimen28 ++\itemmargin=\dimen29 ++\itemmax=\dimen30 ++\itemno=\count27 ++ indexing, ++\initialskipamount=\skip21 ++\secondaryindent=\skip22 ++\partialpage=\box16 ++\doublecolumnhsize=\dimen31 ++\doublecolumnvsize=\dimen32 ++\availdimen@=\dimen33 ++ sectioning, ++\chapno=\count28 ++\secno=\count29 ++\subsecno=\count30 ++\subsubsecno=\count31 ++\appendixno=\count32 ++\contentsfile=\write0 ++\chapheadingskip=\skip23 ++\subsecheadingskip=\skip24 ++\secheadingskip=\skip25 ++ toc printing, ++\tocindent=\dimen34 ++ ++environments, ++\dblarrowbox=\box17 ++\longdblarrowbox=\box18 ++\pushcharbox=\box19 ++\bullbox=\box20 ++\equivbox=\box21 ++\errorbox=\box22 ++\lispnarrowing=\skip26 ++\aboveenvskipamount=\skip27 ++ defuns, ++\defbodyindent=\skip28 ++\defargsindent=\skip29 ++\deftypemargin=\skip30 ++\deflastargmargin=\skip31 ++\parencount=\count33 ++ cross reference, ++\auxfile=\write1 ++\footnoteno=\count34 ++ and turning on texinfo input format.) ++(gcc.aux) ++@cpindfile=@write2 ++@fnindfile=@write3 ++@vrindfile=@write4 ++@tpindfile=@write5 ++@kyindfile=@write6 ++@pgindfile=@write7 ++ [1] [2] (GNU GENERAL PUBLIC LICENSE) [1] [2] [3] [4] [5] ++(Contributors to GNU CC) [6] Chapter 1 [7] [8] [9] [10] Chapter 2 [11] [12] ++[13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] Chapter 3 ++[26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] ++Chapter 4 [41] [42] [43] Chapter 5 [44] Chapter 6 [45] [46] [47] [48] [49] ++Chapter 7 [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] ++[63] [64] [65] [66] [67] [68] Chapter 8 [69] [70] [71] [72] [73] [74] [75] ++Chapter 9 [76] Chapter 10 [77] [78] [79] Chapter 11 [80] [81] [82] [83] ++[84] Chapter 12 [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] ++[97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] ++[110] [111] [112] [113] [114] Chapter 13 [115] [116] [117] [118] [119] [120] ++[121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] ++[133] [134] [135] [136] [137] [138] [139] [140] [141] [142] [143] [144] ++[145] [146] Chapter 14 [147] [148] [149] [150] [151] [152] [153] [154] [155] ++[156] [157] [158] [159] [160] [161] [162] [163] [164] [165] [166] [167] ++[168] [169] [170] [171] [172] [173] [174] [175] [176] [177] [178] [179] ++[180] [181] [182] [183] [184] [185] [186] [187] [188] Chapter 15 [189] [190] ++[191] [192] (gcc.toc [-1] [-2]) [-3] [-4] ) ++Here is how much of TeX's memory you used: ++ 811 strings out of 13041 ++ 8825 string characters out of 96249 ++ 23980 words of memory out of 262141 ++ 1694 multiletter control sequences out of 9500 ++ 22679 words of font info for 76 fonts, out of 100000 for 255 ++ 18 hyphenation exceptions out of 607 ++ 12i,6n,10p,221b,120s stack positions out of 300i,40n,60p,3000b,4000s ++ ++Output written on gcc.dvi (198 pages, 551312 bytes). +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.texinfo alliance/genview/src/gcc-1.42/gcc.texinfo +--- alliance-5.0/genview/src/gcc-1.42/gcc.texinfo 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.texinfo 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,10427 @@ ++\input texinfo @c -*-texinfo-*- ++ ++@settitle Using and Porting GNU CC ++@setfilename gcc.info ++ ++@ifinfo ++This file documents the use and the internals of the GNU compiler. ++ ++Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. ++ ++Permission is granted to make and distribute verbatim copies of ++this manual provided the copyright notice and this permission notice ++are preserved on all copies. ++ ++@ignore ++Permission is granted to process this file through Tex and print the ++results, provided the printed document carries copying permission ++notice identical to this one except for the removal of this paragraph ++(this paragraph not being relevant to the printed manual). ++ ++@end ignore ++Permission is granted to copy and distribute modified versions of this ++manual under the conditions for verbatim copying, provided also that the ++sections entitled ``GNU General Public License'' and ``Protect Your ++Freedom---Fight `Look And Feel'@w{}'' are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++Permission is granted to copy and distribute translations of this manual ++into another language, under the above conditions for modified versions, ++except that the sections entitled ``GNU General Public License'' and ++``Protect Your Freedom---Fight `Look And Feel'@w{}'' and this permission ++notice may be included in translations approved by the Free Software ++Foundation instead of in the original English. ++@end ifinfo ++ ++@setchapternewpage odd ++ ++@titlepage ++@center @titlefont{Using and Porting GNU CC} ++@sp 2 ++@center Richard M. Stallman ++@sp 3 ++@center last updated 19 Sep 1992 ++@sp 1 ++@center for version 1.42 ++@page ++@vskip 0pt plus 1filll ++Copyright @copyright{} 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. ++ ++Permission is granted to make and distribute verbatim copies of ++this manual provided the copyright notice and this permission notice ++are preserved on all copies. ++ ++Permission is granted to copy and distribute modified versions of this ++manual under the conditions for verbatim copying, provided also that the ++sections entitled ``GNU General Public License'' and ``Protect Your ++Freedom---Fight `Look And Feel'@w{}'' are included exactly as in the ++original, and provided that the entire resulting derived work is ++distributed under the terms of a permission notice identical to this ++one. ++ ++Permission is granted to copy and distribute translations of this manual ++into another language, under the above conditions for modified versions, ++except that the sections entitled ``GNU General Public License'' and ++``Protect Your Freedom---Fight `Look And Feel'@w{}'' and this permission ++notice may be included in translations approved by the Free Software ++Foundation instead of in the original English. ++@end titlepage ++@page ++ ++@ifinfo ++@node Top, Copying,, (DIR) ++@ichapter Introduction ++ ++This manual documents how to run, install and port the GNU C compiler, as ++well as its new features and incompatibilities, and how to report bugs. ++ ++@end ifinfo ++@menu ++* Copying:: GNU General Public License says ++ how you can copy and share GNU CC. ++* Contributors:: People who have contributed to GNU CC. ++* Boycott:: Protect your freedom---fight ``look and feel''. ++* Options:: Command options supported by @samp{gcc}. ++* Installation:: How to configure, compile and install GNU CC. ++* Trouble:: If you have trouble installing GNU CC. ++* Service:: How to find suppliers of services for GNU CC users. ++* Incompatibilities:: Incompatibilities of GNU CC. ++* Extensions:: GNU extensions to the C language. ++* Bugs:: How to report bugs (if you want to get them fixed). ++* Portability:: Goals of GNU CC's portability features. ++* Interface:: Function-call interface of GNU CC output. ++* Passes:: Order of passes, what they do, and what each file is for. ++* RTL:: The intermediate representation that most passes work on. ++* Machine Desc:: How to write machine description instruction patterns. ++* Machine Macros:: How to write the machine description C macros. ++* Config:: Writing the @file{xm-@var{machine}.h} file. ++@end menu ++ ++@node Copying, Contributors, Top, Top ++@unnumbered GNU GENERAL PUBLIC LICENSE ++@center Version 1, February 1989 ++ ++@display ++Copyright @copyright{} 1989 Free Software Foundation, Inc. ++675 Mass Ave, Cambridge, MA 02139, USA ++ ++Everyone is permitted to copy and distribute verbatim copies ++of this license document, but changing it is not allowed. ++@end display ++ ++@unnumberedsec Preamble ++ ++ The license agreements of most software companies try to keep users ++at the mercy of those companies. By contrast, our General Public ++License is intended to guarantee your freedom to share and change free ++software---to make sure the software is free for all its users. The ++General Public License applies to the Free Software Foundation's ++software and to any other program whose authors commit to using it. ++You can use it for your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Specifically, the General Public License is designed to make ++sure that you have the freedom to give away or sell copies of free ++software, that you receive source code or can get it if you want it, ++that you can change the software or use pieces of it in new free ++programs; and that you know you can do these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++anyone to deny you these rights or to ask you to surrender the rights. ++These restrictions translate to certain responsibilities for you if you ++distribute copies of the software, or if you modify it. ++ ++ For example, if you distribute copies of a such a program, whether ++gratis or for a fee, you must give the recipients all the rights that ++you have. You must make sure that they, too, receive or can get the ++source code. And you must tell them their rights. ++ ++ We protect your rights with two steps: (1) copyright the software, and ++(2) offer you this license which gives you legal permission to copy, ++distribute and/or modify the software. ++ ++ Also, for each author's protection and ours, we want to make certain ++that everyone understands that there is no warranty for this free ++software. If the software is modified by someone else and passed on, we ++want its recipients to know that what they have is not the original, so ++that any problems introduced by others will not reflect on the original ++authors' reputations. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++@iftex ++@unnumberedsec TERMS AND CONDITIONS ++@end iftex ++@ifinfo ++@center TERMS AND CONDITIONS ++@end ifinfo ++ ++@enumerate ++@item ++This License Agreement applies to any program or other work which ++contains a notice placed by the copyright holder saying it may be ++distributed under the terms of this General Public License. The ++``Program'', below, refers to any such program or work, and a ``work based ++on the Program'' means either the Program or any work containing the ++Program or a portion of it, either verbatim or with modifications. Each ++licensee is addressed as ``you''. ++ ++@item ++You may copy and distribute verbatim copies of the Program's source ++code as you receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice and ++disclaimer of warranty; keep intact all the notices that refer to this ++General Public License and to the absence of any warranty; and give any ++other recipients of the Program a copy of this General Public License ++along with the Program. You may charge a fee for the physical act of ++transferring a copy. ++ ++@item ++You may modify your copy or copies of the Program or any portion of ++it, and copy and distribute such modifications under the terms of Paragraph ++1 above, provided that you also do the following: ++ ++@itemize @bullet ++@item ++cause the modified files to carry prominent notices stating that ++you changed the files and the date of any change; and ++ ++@item ++cause the whole of any work that you distribute or publish, that ++in whole or in part contains the Program or any part thereof, either ++with or without modifications, to be licensed at no charge to all ++third parties under the terms of this General Public License (except ++that you may choose to grant warranty protection to some or all ++third parties, at your option). ++ ++@item ++If the modified program normally reads commands interactively when ++run, you must cause it, when started running for such interactive use ++in the simplest and most usual way, to print or display an ++announcement including an appropriate copyright notice and a notice ++that there is no warranty (or else, saying that you provide a ++warranty) and that users may redistribute the program under these ++conditions, and telling the user how to view a copy of this General ++Public License. ++ ++@item ++You may charge a fee for the physical act of transferring a ++copy, and you may at your option offer warranty protection in ++exchange for a fee. ++@end itemize ++ ++Mere aggregation of another independent work with the Program (or its ++derivative) on a volume of a storage or distribution medium does not bring ++the other work under the scope of these terms. ++ ++@item ++You may copy and distribute the Program (or a portion or derivative of ++it, under Paragraph 2) in object code or executable form under the terms of ++Paragraphs 1 and 2 above provided that you also do one of the following: ++ ++@itemize @bullet ++@item ++accompany it with the complete corresponding machine-readable ++source code, which must be distributed under the terms of ++Paragraphs 1 and 2 above; or, ++ ++@item ++accompany it with a written offer, valid for at least three ++years, to give any third party free (except for a nominal charge ++for the cost of distribution) a complete machine-readable copy of the ++corresponding source code, to be distributed under the terms of ++Paragraphs 1 and 2 above; or, ++ ++@item ++accompany it with the information you received as to where the ++corresponding source code may be obtained. (This alternative is ++allowed only for noncommercial distribution and only if you ++received the program in object code or executable form alone.) ++@end itemize ++ ++Source code for a work means the preferred form of the work for making ++modifications to it. For an executable file, complete source code means ++all the source code for all modules it contains; but, as a special ++exception, it need not include source code for modules which are standard ++libraries that accompany the operating system on which the executable ++file runs, or for standard header files or definitions files that ++accompany that operating system. ++ ++@item ++You may not copy, modify, sublicense, distribute or transfer the ++Program except as expressly provided under this General Public License. ++Any attempt otherwise to copy, modify, sublicense, distribute or transfer ++the Program is void, and will automatically terminate your rights to use ++the Program under this License. However, parties who have received ++copies, or rights to use copies, from you under this General Public ++License will not have their licenses terminated so long as such parties ++remain in full compliance. ++ ++@item ++By copying, distributing or modifying the Program (or any work based ++on the Program) you indicate your acceptance of this license to do so, ++and all its terms and conditions. ++ ++@item ++Each time you redistribute the Program (or any work based on the ++Program), the recipient automatically receives a license from the original ++licensor to copy, distribute or modify the Program subject to these ++terms and conditions. You may not impose any further restrictions on the ++recipients' exercise of the rights granted herein. ++ ++@item ++The Free Software Foundation may publish revised and/or new versions ++of the General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++Each version is given a distinguishing version number. If the Program ++specifies a version number of the license which applies to it and ``any ++later version'', you have the option of following the terms and conditions ++either of that version or of any later version published by the Free ++Software Foundation. If the Program does not specify a version number of ++the license, you may choose any version ever published by the Free Software ++Foundation. ++ ++@item ++If you wish to incorporate parts of the Program into other free ++programs whose distribution conditions are different, write to the author ++to ask for permission. For software which is copyrighted by the Free ++Software Foundation, write to the Free Software Foundation; we sometimes ++make exceptions for this. Our decision will be guided by the two goals ++of preserving the free status of all derivatives of our free software and ++of promoting the sharing and reuse of software generally. ++ ++@iftex ++@heading NO WARRANTY ++@end iftex ++@ifinfo ++@center NO WARRANTY ++@end ifinfo ++ ++@item ++BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY ++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN ++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES ++PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED ++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS ++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, ++REPAIR OR CORRECTION. ++ ++@item ++IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ++ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR ++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, ++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ++ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT ++LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES ++SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE ++WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ++ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ++@end enumerate ++ ++@iftex ++@heading END OF TERMS AND CONDITIONS ++@end iftex ++@ifinfo ++@center END OF TERMS AND CONDITIONS ++@end ifinfo ++ ++@page ++@unnumberedsec Appendix: How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to humanity, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these ++terms. ++ ++ To do so, attach the following notices to the program. It is safest to ++attach them to the start of each source file to most effectively convey ++the exclusion of warranty; and each file should have at least the ++``copyright'' line and a pointer to where the full notice is found. ++ ++@smallexample ++@var{one line to give the program's name and a brief idea of what it does.} ++Copyright (C) 19@var{yy} @var{name of author} ++ ++This program is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++This program is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; if not, write to the Free Software ++Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++@end smallexample ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++If the program is interactive, make it output a short notice like this ++when it starts in an interactive mode: ++ ++@smallexample ++Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} ++Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++This is free software, and you are welcome to redistribute it ++under certain conditions; type `show c' for details. ++@end smallexample ++ ++The hypothetical commands `show w' and `show c' should show the ++appropriate parts of the General Public License. Of course, the ++commands you use may be called something other than `show w' and `show ++c'; they could even be mouse-clicks or menu items---whatever suits your ++program. ++ ++You should also get your employer (if you work as a programmer) or your ++school, if any, to sign a ``copyright disclaimer'' for the program, if ++necessary. Here a sample; alter the names: ++ ++@example ++Yoyodyne, Inc., hereby disclaims all copyright interest in the ++program `Gnomovision' (a program to direct compilers to make passes ++at assemblers) written by James Hacker. ++ ++@var{signature of Ty Coon}, 1 April 1989 ++Ty Coon, President of Vice ++@end example ++ ++That's all there is to it! ++ ++@node Contributors, Boycott, Copying, Top ++@unnumbered Contributors to GNU CC ++ ++In addition to Richard Stallman, several people have written parts ++of GNU CC. ++ ++@itemize @bullet ++@item ++The idea of using RTL and some of the optimization ideas came from the ++U. of Arizona Portable Optimizer, written by Jack Davidson and ++Christopher Fraser. See ``Register Allocation and Exhaustive Peephole ++Optimization'', Software Practice and Experience 14 (9), Sept. 1984, ++857-866. ++ ++@item ++Paul Rubin wrote most of the preprocessor. ++ ++@item ++Leonard Tower wrote parts of the parser, RTL generator, and RTL ++definitions, and of the Vax machine description. ++ ++@item ++Ted Lemon wrote parts of the RTL reader and printer. ++ ++@item ++Jim Wilson implemented loop strength reduction and some other ++loop optimizations. ++ ++@item ++Nobuyuki Hikichi of Software Research Associates, Tokyo, contributed ++the support for the Sony NEWS machine. ++ ++@item ++Charles LaBrec contributed the support for the Integrated Solutions ++68020 system. ++ ++@item ++Michael Tiemann of MCC wrote most of the description of the National ++Semiconductor 32000 series cpu. He also wrote the code for inline ++function integration and for the SPARC cpu and Motorola 88000 cpu ++and part of the Sun FPA support. ++ ++@item ++Jan Stein of the Chalmers Computer Society provided support for ++Genix, as well as part of the 32000 machine description. ++ ++@item ++Randy Smith finished the Sun FPA support. ++ ++@item ++Robert Brown implemented the support for Encore 32000 systems. ++ ++@item ++David Kashtan of SRI adapted GNU CC to the Vomit-Making System. ++ ++@item ++Alex Crain provided changes for the 3b1. ++ ++@item ++Greg Satz and Chris Hanson assisted in making GNU CC work on HP-UX for ++the 9000 series 300. ++ ++@item ++William Schelter did most of the work on the Intel 80386 support. ++ ++@item ++Christopher Smith did the port for Convex machines. ++ ++@item ++Paul Petersen wrote the machine description for the Alliant FX/8. ++ ++@item ++Alain Lichnewsky ported GNU CC to the Mips cpu. ++ ++@item ++Devon Bowen, Dale Wiles and Kevin Zachmann ported GNU CC to the Tahoe. ++ ++@item ++Jonathan Stone wrote the machine description for the Pyramid computer. ++@end itemize ++ ++@node Boycott, Options, Contributors, Top ++@chapter Protect Your Freedom---Fight ``Look And Feel'' ++ ++@quotation ++@i{This section is a political message from the League for Programming ++Freedom to the users of GNU CC. It is included here as an expression ++of support for the League on the part of the Free Software Foundation ++and Richard Stallman.} ++@end quotation ++ ++Ashton-Tate, Apple, Lotus and Xerox are trying to create a new form of ++legal monopoly: a copyright on a class of user interfaces. These ++monopolies would cause serious problems for users and developers of ++computer software and systems. ++ ++Until a few years ago, the law seemed clear: no one could restrict ++others from using a user interface; programmers were free to implement ++any interface they chose. Imitating interfaces, sometimes with changes, ++was standard practice in the computer field. The interfaces we know ++evolved gradually in this way; for example, the Macintosh user interface ++drew ideas from the Xerox interface, which in turn drew on work done at ++Stanford and SRI. 1-2-3 imitated VisiCalc, and dBase imitated a ++database program from JPL. ++ ++Most computer companies, and nearly all computer users, were happy with ++this state of affairs. The companies that are suing say it does not ++offer ``enough incentive'' to develop their products, but they must have ++considered it ``enough'' when they made their decision to do so. It ++seems they are not satisfied with the opportunity to continue to compete ++in the marketplace---not even with a head start. ++ ++If Xerox, Lotus, Apple and Ashton-Tate are permitted to make law through ++the courts, the precedent will hobble the software industry: ++ ++@itemize @bullet ++@item ++Gratuitous incompatibilities will burden users. Imagine if each ++car manufacturer had to arrange the pedals in a different order. ++ ++@item ++Software will become and remain more expensive. Users will be ++``locked in'' to proprietary interfaces, for which there is no real ++competition. ++ ++@item ++Large companies have an unfair advantage wherever lawsuits become ++commonplace. Since they can easily afford to sue, they can intimidate ++small companies with threats even when they don't really have a case. ++ ++@item ++User interface improvements will come slower, since incremental ++evolution through creative imitation will no longer be permitted. ++ ++@item ++Even Apple, etc., will find it harder to make improvements if ++they can no longer adapt the good ideas that others introduce, for ++fear of weakening their own legal positions. Some users suggest that ++this stagnation may already have started. ++ ++@item ++If you use GNU software, you might find it of some concern that user ++interface copyright will make it hard for the Free Software Foundation ++to develop programs compatible with the interfaces that you already ++know. ++@end itemize ++ ++To protect our freedom from lawsuits like these, a group of programmers ++and users have formed a new grass-roots political organization, the ++League for Programming Freedom. ++ ++The purpose of the League is to oppose new monopolistic practices such ++as user-interface copyright and software patents; it calls for a return ++to the legal policies of the recent past, in which these practices were ++not allowed. The League is not concerned with free software as an ++issue, and not affiliated with the Free Software Foundation. ++ ++The League's membership rolls include John McCarthy, inventor of Lisp, ++Marvin Minsky, founder of the Artificial Intelligence lab, Guy L. ++Steele, Jr., author of well-known books on Lisp and C, as well as ++Richard Stallman, the developer of GNU CC. Please join and add your ++name to the list. Membership dues in the League are $42 per year for ++programmers, managers and professionals; $10.50 for students; $21 for ++others. ++ ++The League needs both activist members and members who only pay their ++dues. ++ ++To join, or for more information, phone (617) 492-0023 or write to: ++ ++@example ++League for Programming Freedom ++1 Kendall Square #143 ++P.O. Box 9171 ++Cambridge, MA 02139 league@@prep.ai.mit.edu ++@end example ++ ++Here are some suggestions from the League for how you can protect your ++freedom to write programs: ++ ++@itemize @bullet ++@item ++Don't buy from Xerox, Lotus, Apple or Ashton-Tate. Buy from their ++competitors or from the defendants they are suing. ++ ++@item ++Don't develop software to work with the systems made by these companies. ++ ++@item ++Port your existing software to competing systems, so that you encourage ++users to switch. ++ ++@item ++Write letters to company presidents to let them know their conduct ++is unacceptable. ++ ++@item ++Tell your friends and colleagues about this issue and how it threatens ++to ruin the computer industry. ++ ++@item ++Above all, don't work for the look-and-feel plaintiffs, and don't ++accept contracts from them. ++ ++@item ++Write to Congress to explain the importance of this issue. ++ ++@example ++House Subcommittee on Intellectual Property ++2137 Rayburn Bldg ++Washington, DC 20515 ++ ++Senate Subcommittee on Patents, Trademarks and Copyrights ++United States Senate ++Washington, DC 20510 ++@end example ++@end itemize ++ ++Express your opinion! You can make a difference. ++ ++@node Options, Installation, Boycott, Top ++@chapter GNU CC Command Options ++ ++The GNU C compiler uses a command syntax much like the Unix C compiler. ++The @code{gcc} program accepts options and file names as operands. ++Multiple single-letter options may @emph{not} be grouped: @samp{-dr} is ++very different from @w{@samp{-d -r}}. ++ ++When you invoke GNU CC, it normally does preprocessing, compilation, ++assembly and linking. File names which end in @samp{.c} are taken as C ++source to be preprocessed and compiled; file names ending in @samp{.i} ++are taken as preprocessor output to be compiled; compiler output files ++plus any input files with names ending in @samp{.s} are assembled; then ++the resulting object files, plus any other input files, are linked ++together to produce an executable. ++ ++Command options allow you to stop this process at an intermediate stage. ++For example, the @samp{-c} option says not to run the linker. Then the ++output consists of object files output by the assembler. ++ ++Other command options are passed on to one stage of processing. Some ++options control the preprocessor and others the compiler itself. Yet ++other options control the assembler and linker; these are not documented ++here, but you rarely need to use any of them. ++ ++Here are the options to control the overall compilation process, including ++those that say whether to link, whether to assemble, and so on. ++ ++@table @samp ++@item -o @var{file} ++Place output in file @var{file}. This applies regardless to whatever ++sort of output is being produced, whether it be an executable file, ++an object file, an assembler file or preprocessed C code. ++ ++If @samp{-o} is not specified, the default is to put an executable file ++in @file{a.out}, the object file @file{@var{source}.c} in ++@file{@var{source}.o}, an assembler file in @file{@var{source}.s}, and ++preprocessed C on standard output.@refill ++ ++@item -c ++Compile or assemble the source files, but do not link. Produce object ++files with names made by replacing @samp{.c} or @samp{.s} with ++@samp{.o} at the end of the input file names. Do nothing at all for ++object files specified as input. ++ ++@item -S ++Compile into assembler code but do not assemble. The assembler output ++file name is made by replacing @samp{.c} with @samp{.s} at the end of ++the input file name. Do nothing at all for assembler source files or ++object files specified as input. ++ ++@item -E ++Run only the C preprocessor. Preprocess all the C source files ++specified and output the results to standard output. ++ ++@item -v ++Compiler driver program prints the commands it executes as it runs ++the preprocessor, compiler proper, assembler and linker. Some of ++these are directed to print their own version numbers. ++ ++@item -pipe ++Use pipes rather than temporary files for communication between the ++various stages of compilation. This fails to work on some systems ++where the assembler is unable to read from a pipe; but the GNU ++assembler has no trouble. ++ ++@item -B@var{prefix} ++Compiler driver program tries @var{prefix} as a prefix for each ++program it tries to run. These programs are @file{cpp}, @file{cc1}, ++@file{as} and @file{ld}. ++ ++For each subprogram to be run, the compiler driver first tries the ++@samp{-B} prefix, if any. If that name is not found, or if @samp{-B} ++was not specified, the driver tries two standard prefixes, which are ++@file{/usr/lib/gcc-} and @file{/usr/local/lib/gcc-}. If neither of ++those results in a file name that is found, the unmodified program ++name is searched for using the directories specified in your ++@samp{PATH} environment variable. ++ ++The run-time support file @file{gnulib} is also searched for using ++the @samp{-B} prefix, if needed. If it is not found there, the two ++standard prefixes above are tried, and that is all. The file is left ++out of the link if it is not found by those means. Most of the time, ++on most machines, you can do without it. ++ ++You can get a similar result from the environment variable; ++@code{GCC_EXEC_PREFIX} if it is defined, its value is used as a prefix ++in the same way. If both the @samp{-B} option and the ++@code{GCC_EXEC_PREFIX} variable are present, the @samp{-B} option is ++used first and the environment variable value second. ++ ++@item -b@var{prefix} ++The argument @var{prefix} is used as a second prefix for the compiler ++executables and libraries. This prefix is optional: the compiler tries ++each file first with it, then without it. This prefix follows the ++prefix specified with @samp{-B} or the default prefixes. ++ ++Thus, @samp{-bvax- -Bcc/} in the presence of environment variable ++@code{GCC_EXEC_PREFIX} with definition @file{/u/foo/} causes GNU CC to ++try the following file names for the preprocessor executable: ++ ++@example ++cc/vax-cpp ++cc/cpp ++/u/foo/vax-cpp ++/u/foo/cpp ++/usr/local/lib/gcc-vax-cpp ++/usr/local/lib/gcc-cpp ++/usr/lib/gcc-vax-cpp ++/usr/lib/gcc-cpp ++@end example ++@end table ++ ++These options control the details of C compilation itself. ++ ++@table @samp ++@item -ansi ++Support all ANSI standard C programs. ++ ++This turns off certain features of GNU C that are incompatible with ++ANSI C, such as the @code{asm}, @code{inline} and @code{typeof} ++keywords, and predefined macros such as @code{unix} and @code{vax} ++that identify the type of system you are using. It also enables the ++undesirable and rarely used ANSI trigraph feature. ++ ++The alternate keywords @code{__asm__}, @code{__inline__} and ++@code{__typeof__} continue to work despite @samp{-ansi}. You would not ++want to use them in an ANSI C program, of course, but it useful to put ++them in header files that might be included in compilations done with ++@samp{-ansi}. Alternate predefined macros such as @code{__unix__} and ++@code{__vax__} are also available, with or without @samp{-ansi}. ++ ++The @samp{-ansi} option does not cause non-ANSI programs to be ++rejected gratuitously. For that, @samp{-pedantic} is required in ++addition to @samp{-ansi}. ++ ++The macro @code{__STRICT_ANSI__} is predefined when the @samp{-ansi} ++option is used. Some header files may notice this macro and refrain ++from declaring certain functions or defining certain macros that the ++ANSI standard doesn't call for; this is to avoid interfering with any ++programs that might use these names for other things. ++ ++@item -traditional ++Attempt to support some aspects of traditional C compilers. ++Specifically: ++ ++@itemize @bullet ++@item ++All @code{extern} declarations take effect globally even if they ++are written inside of a function definition. This includes implicit ++declarations of functions. ++ ++@item ++The keywords @code{typeof}, @code{inline}, @code{signed}, @code{const} ++and @code{volatile} are not recognized. (You can still use the alternative ++keywords such as @code{__typeof__}, @code{__inline__}, and so on.) ++ ++@item ++Comparisons between pointers and integers are always allowed. ++ ++@item ++Integer types @code{unsigned short} and @code{unsigned char} promote ++to @code{unsigned int}. ++ ++@item ++Out-of-range floating point literals are not an error. ++ ++@item ++String ``constants'' are not necessarily constant; they are stored in ++writable space, and identical looking constants are allocated ++separately. ++ ++@item ++All automatic variables not declared @code{register} are preserved by ++@code{longjmp}. Ordinarily, GNU C follows ANSI C: automatic variables ++not declared @code{volatile} may be clobbered. ++ ++@item ++In the preprocessor, comments convert to nothing at all, rather than ++to a space. This allows traditional token concatenation. ++ ++@item ++In the preprocessor, macro arguments are recognized within string ++constants in a macro definition (and their values are stringified, ++though without additional quote marks, when they appear in such a ++context). The preprocessor always considers a string constant to end ++at a newline. ++ ++@item ++The predefined macro @code{__STDC__} is not defined when you use ++@samp{-traditional}, but @code{__GNUC__} is (since the GNU extensions ++which @code{__GNUC__} indicates are not affected by ++@samp{-traditional}). If you need to write header files that work ++differently depending on whether @samp{-traditional} is in use, by ++testing both of these predefined macros you can distinguish four ++situations: GNU C, traditional GNU C, other ANSI C compilers, and ++other old C compilers. ++@end itemize ++ ++@item -O ++Optimize. Optimizing compilation takes somewhat more time, and a lot ++more memory for a large function. ++ ++Without @samp{-O}, the compiler's goal is to reduce the cost of ++compilation and to make debugging produce the expected results. ++Statements are independent: if you stop the program with a breakpoint ++between statements, you can then assign a new value to any variable or ++change the program counter to any other statement in the function and ++get exactly the results you would expect from the source code. ++ ++Without @samp{-O}, only variables declared @code{register} are ++allocated in registers. The resulting compiled code is a little worse ++than produced by PCC without @samp{-O}. ++ ++With @samp{-O}, the compiler tries to reduce code size and execution ++time. ++ ++Some of the @samp{-f} options described below turn specific kinds of ++optimization on or off. ++ ++@item -g ++Produce debugging information in the operating system's native format ++(for DBX or SDB). GDB also can work with this debugging information. ++ ++Unlike most other C compilers, GNU CC allows you to use @samp{-g} with ++@samp{-O}. The shortcuts taken by optimized code may occasionally ++produce surprising results: some variables you declared may not exist ++at all; flow of control may briefly move where you did not expect it; ++some statements may not be executed because they compute constant ++results or their values were already at hand; some statements may ++execute in different places because they were moved out of loops. ++Nevertheless it proves possible to debug optimized output. This makes ++it reasonable to use the optimizer for programs that might have bugs. ++ ++@item -gg ++Produce debugging information in the old GDB format. This is obsolete. ++ ++@item -w ++Inhibit all warning messages. ++ ++@item -W ++Print extra warning messages for these events: ++ ++@itemize @bullet ++@item ++An automatic variable is used without first being initialized. ++ ++These warnings are possible only in optimizing compilation, ++because they require data flow information that is computed only ++when optimizing. If you don't specify @samp{-O}, you simply won't ++get these warnings. ++ ++These warnings occur only for variables that are candidates for ++register allocation. Therefore, they do not occur for a variable that ++is declared @code{volatile}, or whose address is taken, or whose size ++is other than 1, 2, 4 or 8 bytes. Also, they do not occur for ++structures, unions or arrays, even when they are in registers. ++ ++Note that there may be no warning about a variable that is used only ++to compute a value that itself is never used, because such ++computations may be deleted by data flow analysis before the warnings ++are printed. ++ ++These warnings are made optional because GNU CC is not smart ++enough to see all the reasons why the code might be correct ++despite appearing to have an error. Here is one example of how ++this can happen: ++ ++@example ++@{ ++ int x; ++ switch (y) ++ @{ ++ case 1: x = 1; ++ break; ++ case 2: x = 4; ++ break; ++ case 3: x = 5; ++ @} ++ foo (x); ++@} ++@end example ++ ++@noindent ++If the value of @code{y} is always 1, 2 or 3, then @code{x} is ++always initialized, but GNU CC doesn't know this. Here is ++another common case: ++ ++@example ++@{ ++ int save_y; ++ if (change_y) save_y = y, y = new_y; ++ @dots{} ++ if (change_y) y = save_y; ++@} ++@end example ++ ++@noindent ++This has no bug because @code{save_y} is used only if it is set. ++ ++Some spurious warnings can be avoided if you declare as ++@code{volatile} all the functions you use that never return. ++@xref{Function Attributes}. ++ ++@item ++A nonvolatile automatic variable might be changed by a call to ++@code{longjmp}. These warnings as well are possible only in ++optimizing compilation. ++ ++The compiler sees only the calls to @code{setjmp}. It cannot know ++where @code{longjmp} will be called; in fact, a signal handler could ++call it at any point in the code. As a result, you may get a warning ++even when there is in fact no problem because @code{longjmp} cannot ++in fact be called at the place which would cause a problem. ++ ++@item ++A function can return either with or without a value. (Falling ++off the end of the function body is considered returning without ++a value.) For example, this function would evoke such a ++warning: ++ ++@example ++foo (a) ++@{ ++ if (a > 0) ++ return a; ++@} ++@end example ++ ++Spurious warnings can occur because GNU CC does not realize that ++certain functions (including @code{abort} and @code{longjmp}) ++will never return. ++ ++@item ++An expression-statement contains no side effects. ++@end itemize ++ ++In the future, other useful warnings may also be enabled by this ++option. ++ ++@item -Wimplicit ++Warn whenever a function is implicitly declared. ++ ++@item -Wreturn-type ++Warn whenever a function is defined with a return-type that defaults ++to @code{int}. Also warn about any @code{return} statement with no ++return-value in a function whose return-type is not @code{void}. ++ ++@item -Wunused ++Warn whenever a local variable is unused aside from its declaration, ++whenever a function is declared static but never defined, and whenever ++a statement computes a result that is explicitly not used. ++ ++@item -Wswitch ++Warn whenever a @code{switch} statement has an index of enumeral type ++and lacks a @code{case} for one or more of the named codes of that ++enumeration. (The presence of a @code{default} label prevents this ++warning.) @code{case} labels outside the enumeration range also ++provoke warnings when this option is used. ++ ++@item -Wcomment ++Warn whenever a comment-start sequence @samp{/*} appears in a comment. ++ ++@item -Wtrigraphs ++Warn if any trigraphs are encountered (assuming they are enabled). ++ ++@item -Wall ++All of the above @samp{-W} options combined. These are all the ++options which pertain to usage that we recommend avoiding and that we ++believe is easy to avoid, even in conjunction with macros. ++ ++The other @samp{-W@dots{}} options below are not implied by @samp{-Wall} ++because certain kinds of useful macros are almost impossible to write ++without causing those warnings. ++ ++@item -Wshadow ++Warn whenever a local variable shadows another local variable. ++ ++@item -Wid-clash-@var{len} ++Warn whenever two distinct identifiers match in the first @var{len} ++characters. This may help you prepare a program that will compile ++with certain obsolete, brain-damaged compilers. ++ ++@item -Wpointer-arith ++Warn about anything that depends on the ``size of'' a function type or ++of @code{void}. GNU C assigns these types a size of 1, for ++convenience in calculations with @code{void *} pointers and pointers ++to functions. ++ ++@item -Wcast-qual ++Warn whenever a pointer is cast so as to remove a type qualifier from ++the target type. For example, warn if a @code{const char *} is cast ++to an ordinary @code{char *}. ++ ++@item -Wwrite-strings ++Give string constants the type @code{const char[@var{length}]} so that ++copying the address of one into a non-@code{const} @code{char *} ++pointer will get a warning. These warnings will help you find at ++compile time code that can try to write into a string constant, but ++only if you have been very careful about using @code{const} in ++declarations and prototypes. Otherwise, it will just be a nuisance; ++this is why we did not make @samp{-Wall} request these warnings. ++ ++@item -p ++Generate extra code to write profile information suitable for the ++analysis program @code{prof}. ++ ++@item -pg ++Generate extra code to write profile information suitable for the ++analysis program @code{gprof}. ++ ++@item -a ++Generate extra code to write profile information for basic blocks, which ++will record the number of times each basic block is executed. This data ++could be analyzed by a program like @code{tcov}. Note, however, that ++the format of the data is not what @code{tcov} expects. Eventually GNU ++@code{gprof} should be extended to process this data. ++ ++@item -l@var{library} ++Search a standard list of directories for a library named ++@var{library}, which is actually a file named ++@file{lib@var{library}.a}. The linker uses this file as if it ++had been specified precisely by name. ++ ++The directories searched include several standard system directories ++plus any that you specify with @samp{-L}. ++ ++Normally the files found this way are library files---archive files ++whose members are object files. The linker handles an archive file by ++scanning through it for members which define symbols that have so far ++been referenced but not defined. But if the file that is found is an ++ordinary object file, it is linked in the usual fashion. The only ++difference between using an @samp{-l} option and specifying a file name ++is that @samp{-l} searches several directories. ++ ++@item -L@var{dir} ++Add directory @var{dir} to the list of directories to be searched ++for @samp{-l}. ++ ++@item -nostdlib ++Don't use the standard system libraries and startup files when linking. ++Only the files you specify will be passed to the linker. ++ ++@item -m@var{machinespec} ++Machine-dependent option specifying something about the type of target ++machine. These options are defined by the macro ++@code{TARGET_SWITCHES} in the machine description. The default for ++the options is also defined by that macro, which enables you to change ++the defaults.@refill ++ ++These are the @samp{-m} options defined in the 68000 machine ++description: ++ ++@table @samp ++@item -m68020 ++@itemx -mc68020 ++Generate output for a 68020 (rather than a 68000). This is the ++default if you use the unmodified sources. ++ ++@item -m68000 ++@item -mc68000 ++Generate output for a 68000 (rather than a 68020). ++ ++@item -m68881 ++Generate output containing 68881 instructions for floating point. ++This is the default if you use the unmodified sources. ++ ++@item -mfpa ++Generate output containing Sun FPA instructions for floating point. ++ ++@item -msoft-float ++Generate output containing library calls for floating point. ++ ++@item -mshort ++Consider type @code{int} to be 16 bits wide, like @code{short int}. ++ ++@item -mnobitfield ++Do not use the bit-field instructions. @samp{-m68000} implies ++@samp{-mnobitfield}. ++ ++@item -mbitfield ++Do use the bit-field instructions. @samp{-m68020} implies ++@samp{-mbitfield}. This is the default if you use the unmodified ++sources. ++ ++@item -mrtd ++Use a different function-calling convention, in which functions ++that take a fixed number of arguments return with the @code{rtd} ++instruction, which pops their arguments while returning. This ++saves one instruction in the caller since there is no need to pop ++the arguments there. ++ ++This calling convention is incompatible with the one normally ++used on Unix, so you cannot use it if you need to call libraries ++compiled with the Unix compiler. ++ ++Also, you must provide function prototypes for all functions that ++take variable numbers of arguments (including @code{printf}); ++otherwise incorrect code will be generated for calls to those ++functions. ++ ++In addition, seriously incorrect code will result if you call a ++function with too many arguments. (Normally, extra arguments are ++harmlessly ignored.) ++ ++The @code{rtd} instruction is supported by the 68010 and 68020 ++processors, but not by the 68000. ++@end table ++ ++These @samp{-m} options are defined in the Vax machine description: ++ ++@table @samp ++@item -munix ++Do not output certain jump instructions (@code{aobleq} and so on) ++that the Unix assembler for the Vax cannot handle across long ++ranges. ++ ++@item -mgnu ++Do output those jump instructions, on the assumption that you ++will assemble with the GNU assembler. ++ ++@item -mg ++Output code for g-format floating point numbers instead of d-format. ++@end table ++ ++These @samp{-m} switches are supported on the Sparc: ++ ++@table @samp ++@item -mfpu ++Generate output containing floating point instructions. This is the ++default if you use the unmodified sources. ++ ++@ignore ++@item -msoft-float ++Generate output containing library calls for floating point. ++ ++@end ignore ++@item -mno-epilogue ++Generate separate return instructions for @code{return} statements. ++This has both advantages and disadvantages; I don't recall what they ++are. ++@end table ++ ++These @samp{-m} options are defined in the Convex machine description: ++ ++@table @samp ++@item -mc1 ++Generate output for a C1. This is the default when the compiler is ++configured for a C1. ++ ++@item -mc2 ++Generate output for a C2. This is the default when the compiler is ++configured for a C2. ++ ++@item -margcount ++Generate code which puts an argument count in the word preceding each ++argument list. Some nonportable Convex and Vax programs need this ++word. (Debuggers don't; this info is in the symbol table.) ++ ++@item -mnoargcount ++Omit the argument count word. This is the default if you use the ++unmodified sources. ++@end table ++ ++@item -f@var{flag} ++Specify machine-independent flags. Most flags have both positive and ++negative forms; the negative form of @samp{-ffoo} would be ++@samp{-fno-foo}. In the table below, only one of the forms is ++listed---the one which is not the default. You can figure out the ++other form by either removing @samp{no-} or adding it. ++ ++@table @samp ++@item -fpcc-struct-return ++Use the same convention for returning @code{struct} and @code{union} ++values that is used by the usual C compiler on your system. This ++convention is less efficient for small structures, and on many ++machines it fails to be reentrant; but it has the advantage of ++allowing intercallability between GCC-compiled code and PCC-compiled ++code. ++ ++@item -ffloat-store ++Do not store floating-point variables in registers. This ++prevents undesirable excess precision on machines such as the ++68000 where the floating registers (of the 68881) keep more ++precision than a @code{double} is supposed to have. ++ ++For most programs, the excess precision does only good, but a few ++programs rely on the precise definition of IEEE floating point. ++Use @samp{-ffloat-store} for such programs. ++ ++@item -fno-asm ++Do not recognize @code{asm}, @code{inline} or @code{typeof} as a ++keyword. These words may then be used as identifiers. You can ++use @code{__asm__}, @code{__inline__} and @code{__typeof__} instead. ++ ++@item -fno-defer-pop ++Always pop the arguments to each function call as soon as that ++function returns. Normally the compiler (when optimizing) lets ++arguments accumulate on the stack for several function calls and ++pops them all at once. ++ ++@item -fstrength-reduce ++Perform the optimizations of loop strength reduction and ++elimination of iteration variables. ++ ++@item -fcombine-regs ++Allow the combine pass to combine an instruction that copies one ++register into another. This might or might not produce better ++code when used in addition to @samp{-O}. I am interested in ++hearing about the difference this makes. ++ ++@item -fforce-mem ++Force memory operands to be copied into registers before doing ++arithmetic on them. This may produce better code by making all ++memory references potential common subexpressions. When they are ++not common subexpressions, instruction combination should ++eliminate the separate register-load. I am interested in hearing ++about the difference this makes. ++ ++@item -fforce-addr ++Force memory address constants to be copied into registers before ++doing arithmetic on them. This may produce better code just as ++@samp{-fforce-mem} may. I am interested in hearing about the ++difference this makes. ++ ++@item -fomit-frame-pointer ++Don't keep the frame pointer in a register for functions that ++don't need one. This avoids the instructions to save, set up and ++restore frame pointers; it also makes an extra register available ++in many functions. @strong{It also makes debugging impossible.} ++ ++On some machines, such as the Vax, this flag has no effect, ++because the standard calling sequence automatically handles the ++frame pointer and nothing is saved by pretending it doesn't ++exist. The machine-description macro ++@code{FRAME_POINTER_REQUIRED} controls whether a target machine ++supports this flag. @xref{Registers}.@refill ++ ++@item -finline-functions ++Integrate all simple functions into their callers. The compiler ++heuristically decides which functions are simple enough to be ++worth integrating in this way. ++ ++If all calls to a given function are integrated, and the function ++is declared @code{static}, then the function is normally not ++output as assembler code in its own right. ++ ++@item -fcaller-saves ++Enable values to be allocated in registers that will be clobbered by ++function calls, by emitting extra instructions to save and restore the ++registers around such calls. Such allocation is done only when it ++seems to result in better code than would otherwise be produced. ++ ++This option is enabled by default on certain machines, usually those ++which have no call-preserved registers to use instead. ++ ++Don't use @samp{-fcaller-saves} together with ++@samp{-fomit-frame-pointer}. This combination does not work. ++ ++@item -fkeep-inline-functions ++Even if all calls to a given function are integrated, and the ++function is declared @code{static}, nevertheless output a ++separate run-time callable version of the function. ++ ++@item -fwritable-strings ++Store string constants in the writable data segment and don't uniquize ++them. This is for compatibility with old programs which assume they can ++write into string constants. @samp{-traditional} also has this effect. ++ ++Writing into string constants is a very bad idea; ``constants'' should ++be constant. ++ ++@item -fcond-mismatch ++Allow conditional expressions with mismatched types in the second and ++third arguments. The value of such an expression is void. ++ ++@item -fno-function-cse ++Do not put function addresses in registers; make each instruction ++that calls a constant function contain the function's address ++explicitly. ++ ++This option results in less efficient code, but some strange ++hacks that alter the assembler output may be confused by the ++optimizations performed when this option is not used. ++ ++@item -fvolatile ++Consider all memory references through pointers to be volatile. ++ ++@item -fshared-data ++Requests that the data and non-@code{const} variables of this ++compilation be shared data rather than private data. The distinction ++makes sense only on certain operating systems, where shared data is ++shared between processes running the same program, while private data ++exists in one copy per process. ++ ++@item -funsigned-char ++Let the type @code{char} be the unsigned, like @code{unsigned char}. ++ ++Each kind of machine has a default for what @code{char} should ++be. It is either like @code{unsigned char} by default or like ++@code{signed char} by default. (Actually, at present, the ++default is always signed.) ++ ++The type @code{char} is always a distinct type from either ++@code{signed char} or @code{unsigned char}, even though its ++behavior is always just like one of those two. ++ ++Note that this is equivalent to @samp{-fno-signed-char}, which is the ++negative form of @samp{-fsigned-char}. ++ ++@item -fsigned-char ++Let the type @code{char} be signed, like @code{signed char}. ++ ++Note that this is equivalent to @samp{-fno-unsigned-char}, which is ++the negative form of @samp{-funsigned-char}. ++ ++@item -fdelayed-branch ++If supported for the target machine, attempt to reorder instructions ++to exploit instruction slots available after delayed branch ++instructions. ++ ++@item -ffixed-@var{reg} ++Treat the register named @var{reg} as a fixed register; generated ++code should never refer to it (except perhaps as a stack pointer, ++frame pointer or in some other fixed role). ++ ++@var{reg} must be the name of a register. The register names ++accepted are machine-specific and are defined in the ++@code{REGISTER_NAMES} macro in the machine description macro ++file. ++ ++This flag does not have a negative form, because it specifies a ++three-way choice. ++ ++@item -fcall-used-@var{reg} ++Treat the register named @var{reg} as an allocatable register ++that is clobbered by function calls. It may be allocated for ++temporaries or variables that do not live across a call. ++Functions compiled this way will not save and restore the ++register @var{reg}. ++ ++Use of this flag for a register that has a fixed pervasive role ++in the machine's execution model, such as the stack pointer or ++frame pointer, will produce disastrous results. ++ ++This flag does not have a negative form, because it specifies a ++three-way choice. ++ ++@item -fcall-saved-@var{reg} ++Treat the register named @var{reg} as an allocatable register ++saved by functions. It may be allocated even for temporaries or ++variables that live across a call. Functions compiled this way ++will save and restore the register @var{reg} if they use it. ++ ++Use of this flag for a register that has a fixed pervasive role ++in the machine's execution model, such as the stack pointer or ++frame pointer, will produce disastrous results. ++ ++A different sort of disaster will result from the use of this ++flag for a register in which function values may be returned. ++ ++This flag does not have a negative form, because it specifies a ++three-way choice. ++@end table ++ ++@item -d@var{letters} ++Says to make debugging dumps at times specified by @var{letters}. ++Here are the possible letters: ++ ++@table @samp ++@item r ++Dump after RTL generation. ++@item j ++Dump after first jump optimization. ++@item s ++Dump after CSE (including the jump optimization that sometimes ++follows CSE). ++@item L ++Dump after loop optimization. ++@item f ++Dump after flow analysis. ++@item c ++Dump after instruction combination. ++@item l ++Dump after local register allocation. ++@item g ++Dump after global register allocation. ++@item d ++Dump after delayed branch scheduling. ++@item J ++Dump after last jump optimization. ++@item m ++Print statistics on memory usage, at the end of the run. ++@end table ++ ++@item -pedantic ++Issue all the warnings demanded by strict ANSI standard C; reject ++all programs that use forbidden extensions. ++ ++Valid ANSI standard C programs should compile properly with or without ++this option (though a rare few will require @samp{-ansi}). However, ++without this option, certain GNU extensions and traditional C features ++are supported as well. With this option, they are rejected. There is ++no reason to @i{use} this option; it exists only to satisfy pedants. ++ ++@samp{-pedantic} does not cause warning messages for use of the ++alternate keywords whose names begin and end with @samp{__}. ++@xref{Alternate Keywords}. ++ ++@item -static ++On Suns running version 4, this prevents linking with the shared ++libraries. (@samp{-g} has the same effect.) ++@end table ++ ++These options control the C preprocessor, which is run on each C source ++file before actual compilation. If you use the @samp{-E} option, nothing ++is done except C preprocessing. Some of these options make sense only ++together with @samp{-E} because they request preprocessor output that is ++not suitable for actual compilation. ++ ++@table @samp ++@item -C ++Tell the preprocessor not to discard comments. Used with the ++@samp{-E} option. ++ ++@item -I@var{dir} ++Search directory @var{dir} for include files. ++ ++@item -I- ++Any directories specified with @samp{-I} options before the @samp{-I-} ++option are searched only for the case of @samp{#include "@var{file}"}; ++they are not searched for @samp{#include <@var{file}>}. ++ ++If additional directories are specified with @samp{-I} options after ++the @samp{-I-}, these directories are searched for all @samp{#include} ++directives. (Ordinarily @emph{all} @samp{-I} directories are used ++this way.) ++ ++In addition, the @samp{-I-} option inhibits the use of the current ++directory (where the current input file came from) as the first search ++directory for @samp{#include "@var{file}"}. There is no way to override ++this effect of @samp{-I-}. With @samp{-I.} you can specify searching ++the directory which was current when the compiler was invoked. That is ++not exactly the same as what the preprocessor does by default, but it is ++often satisfactory. ++ ++@samp{-I-} does not inhibit the use of the standard system directories ++for header files. Thus, @samp{-I-} and @samp{-nostdinc} are ++independent. ++ ++@item -i @var{file} ++Process @var{file} as input, discarding the resulting output, before ++processing the regular input file. Because the output generated from ++@var{file} is discarded, the only effect of @samp{-i @var{file}} is to ++make the macros defined in @var{file} available for use in the main ++input. ++ ++@item -nostdinc ++Do not search the standard system directories for header files. Only ++the directories you have specified with @samp{-I} options (and the ++current directory, if appropriate) are searched. ++ ++Between @samp{-nostdinc} and @samp{-I-}, you can eliminate all ++directories from the search path except those you specify. ++ ++@item -M ++Tell the preprocessor to output a rule suitable for @code{make} ++describing the dependencies of each object file. For each source ++file, the preprocessor outputs one @code{make}-rule whose target is ++the object file name for that source file and whose dependencies are ++all the files @samp{#include}d in it. This rule may be a single line ++or may be continued with @samp{\}-newline if it is long. ++ ++@samp{-M} implies @samp{-E}. ++ ++@item -MM ++Like @samp{-M} but the output mentions only the user-header files ++included with @samp{#include "@var{file}"}. System header files ++included with @samp{#include <@var{file}>} are omitted. ++ ++@samp{-MM} implies @samp{-E}. ++ ++@item -D@var{macro} ++Define macro @var{macro} with the string @samp{1} as its definition. ++ ++@item -D@var{macro}=@var{defn} ++Define macro @var{macro} as @var{defn}. ++ ++@item -U@var{macro} ++Undefine macro @var{macro}. ++ ++@item -trigraphs ++Support ANSI C trigraphs. You don't want to know about this ++brain-damage. The @samp{-ansi} option also has this effect. ++@end table ++ ++@node Installation, Trouble, Options, Top ++@chapter Installing GNU CC ++ ++Here is the procedure for installing GNU CC on a Unix system. ++ ++@menu ++* Other Dir:: Compiling in a separate directory (not where the source is). ++* Sun Install:: See below for installation on the Sun. ++* 3B1 Install:: See below for installation on the 3B1. ++* SCO Install:: See below for installation on SCO System V 3.2. (Or ESIX.) ++* VMS Install:: See below for installation on VMS. ++* HPUX Install:: See below for installation on HPUX. ++* Tower Install:: See below for installation on an NCR Tower. ++@end menu ++@iftex ++See below for VMS systems, and modified procedures needed on Sun ++systems, 3b1 machines and HPUX. The following section says how to ++compile in a separate directory on Unix; here we assume you compile in ++the same directory that contains the source files. ++@end iftex ++ ++@enumerate ++@item ++Edit @file{Makefile}. If you are using HPUX, or any form of system V, ++you must make a few changes described in comments at the beginning of ++the file. Genix requires changes also, and so does the Pyramid. ++ ++@item ++On a Sequent system, go to the Berkeley universe. ++ ++@item ++Choose configuration files. The easy way to do this is to run the ++command file @file{config.gcc} with a single argument, which specifies ++the type of machine (and in some cases which operating system). ++ ++Here is a list of the possible arguments: ++ ++@table @samp ++@item vax ++Vaxes running BSD. ++@item vms ++Vaxes running VMS. ++@item vax-sysv ++Vaxes running system V. ++@item i386-sysv ++Intel 386 PCs running system V. ++@item i386-sysv-gas ++Intel 386 PCs running system V, using the GNU assembler and GNU ++linker. ++@item i386-sysv4 ++Intel 386 PCs running system V.4. You must run the shell script ++@file{fixincludes-V4} in order for GNU CC to work properly. You must ++also uncomment some lines in @file{Makefile}. ++@item sequent-i386 ++Sequent with Intel 386 processors. ++@item i386-aix ++Intel 386 PCs or PS/2s running AIX. ++@item sun2 ++Sun 2 running system version 2 or 3. ++@item sun3 ++Sun 3 running system version 4, with 68881. ++Note there we do not provide a configuration file to use an FPA ++by default, because programs that establish signal handlers for ++floating point traps inherently cannot work with the FPA. ++@item sun3-nfp ++Sun 3 running system version 4, without 68881. ++@item sun4 ++Sun 4 running system version 4. @xref{Incompatibilities}, ++for calling convention incompatibilities on the Sun 4 (sparc). ++@item sun2-os4 ++Sun 2 running system version 4. ++@item sun3-os3 ++Sun 3 running system version 2 or 3, with 68881. ++@item sun3-nfp-os3 ++Sun 3 running system version 2 or 3, without 68881. ++@item sun4-os3 ++Sun 4 running system version 2 or 3. @xref{Incompatibilities}, ++for calling convention incompatibilities on the Sun 4 (sparc). ++@item sun386 ++Sun 386 (``roadrunner''). ++@item alliant ++Alliant FX/8 computer. Note that the standard installed C compiler in ++Concentrix 5.0 has a bug which prevent it from compiling GNU CC ++correctly. You can patch the compiler bug as follows: ++ ++@example ++cp /bin/pcc ./pcc ++adb -w ./pcc - << EOF ++15f6?w 6610 ++EOF ++@end example ++ ++Then you must use the @samp{-ip12} option when compiling GNU CC ++with the patched compiler, as shown here: ++ ++@example ++make CC="./pcc -ip12" CFLAGS=-w ++@end example ++ ++Note also that Alliant's version of DBX does not manage to work with the ++output from GNU CC. ++@item tahoe ++The tahoe computer (running BSD, and using DBX). ++@item decstation ++The DEC 3100 Mips machine (``pmax''). Note that GNU CC cannot generate ++debugging information in the unusual format used on the Mips. ++@item mips-sysv-os5 ++The Mips computer, RS series, with the System V environment ++running on revision 5.00 of RISC-OS as default. ++Note that GNU CC cannot generate debugging information in the unusual ++format used on the Mips, and also cannot be used to create ++programs that use shared libraries. ++@item mips-sysv ++The Mips computer, RS series, with the System V environment as default. ++Note that GNU CC cannot generate debugging information in the unusual ++format used on the Mips. ++@item mips-bsd43-os5 ++The Mips computer, RS series, with the BSD 4.3 environment ++running revision 5.00 of RISC-OS as default. ++Note that GNU CC cannot generate debugging information in the unusual ++format used on the Mips, and also cannot be used to create ++programs that use shared libraries. ++@item mips-bsd43 ++The Mips computer, RS series, with the BSD 4.3 environment as default. ++Note that GNU CC cannot generate debugging information in the unusual ++format used on the Mips. ++@item mips-os5 ++The Mips computer, M series running revision 5.00 of RISC-OS. ++Note that GNU CC cannot generate debugging information in the ++unusual format used on the Mips, and also cannot be used to ++create programs that use shared libraries. ++@item mips ++The Mips computer, M series. Note that GNU CC cannot generate debugging ++information in the unusual format used on the Mips. ++@item iris ++Another variant of the Mips computer, the Silicon Graphics Iris 4D. ++Note that GNU CC cannot generate debugging information in the unusual ++format used on the Mips. ++@item convex-c1 ++Convex C1 computer. With operating system version 9, use @samp{cc -pcc} ++as the compilation command when building stage 1 of GNU CC. ++@item convex-c2 ++Convex C2 computer. With operating system version 9, use @samp{cc -pcc} ++as the compilation command when building stage 1 of GNU CC. ++@item pyramid ++Pyramid computer. ++@item hp9k320 ++HP 9000 series 300 using HPUX assembler. Note there is no ++support in GNU CC for HP's debugger; thus, @samp{-g} is not ++available in this configuration. ++@item hp9k320-gas ++HP 9000 series 300 using GNU assembler, linker and debugger. ++This requires the HP-adapt package, which is available along with ++the GNU linker as part of the ``binutils'' distribution. ++This is on the GNU CC distribution tape. ++@item hp9k320-old ++HP 9000 series 300 using HPUX assembler, in operating system versions ++older than 6.5. Note there is no support in GNU CC for HP's debugger; ++thus, @samp{-g} is not available in this configuration. ++@item hp9k320-bsd ++HP 9000 series 300 running BSD. ++@item hp9k200-bsd ++HP 9000 series 200 running BSD. Note that the C compiler that comes ++with this system cannot compile GNU CC; contact @code{law@@super.org} to ++get binaries of GNU CC for bootstrapping. Additionally, a minor patch ++is necessary if you wish to build kernels with GNU CC; contact ++@code{law@@super.org} to get a copy of the patch. ++@item isi68 ++ISI 68000 or 68020 system with a 68881. ++@item isi68-nfp ++ISI 68000 or 68020 system without a 68881. ++@item news800 ++Sony NEWS 68020 system. ++@item next ++NeXT system. ++@item tower ++NCR Tower 32 system. ++@item altos ++Altos 3068. Note that you must use the GNU assembler, linker and ++debugger, with COFF-encapsulation. Also, you must fix a kernel ++bug. Details in the file @file{ALTOS-README}. ++@item 3b1 ++AT&T 3b1, a.k.a. 7300 PC. Note that special procedures are needed ++to compile GNU CC with this machine's standard C compiler, due to ++bugs in that compiler. @xref{3b1 Install}. You can bootstrap it ++more easily with previous versions of GNU CC if you have them. ++@item 3b1-gas ++AT&T 3b1 using the GNU assembler. ++@item sequent-ns32k ++Sequent containing ns32000 processors. ++@item encore ++Encore ns32000 system. ++@item genix ++National Semiconductor ns32000 system. ++@item 88000 ++Motorola 88000 processor. This port is not finished. ++@end table ++ ++Here we spell out what files need to be set up: ++ ++@itemize @bullet ++@item ++Make a symbolic link named @file{config.h} to the top-level ++config file for the machine you are using (@pxref{Config}). This ++file is responsible for defining information about the host ++machine. It includes @file{tm.h}. ++ ++The file is located in the subdirectory @file{config}. Its name ++should be @file{xm-@var{machine}.h}, with these exceptions: ++ ++@table @file ++@item xm-vms.h ++for vaxen running VMS. ++@item xm-vaxv.h ++for vaxen running system V. ++@item xm-i386v.h ++for Intel 80386's running system V. ++@item xm-sun386i.h ++for Sun roadrunner running any version of the operating system. ++@item xm-hp9k320.h ++for the HP 9000 series 300. ++@item xm-genix.h ++for the ns32000 running Genix ++@end table ++ ++If your system does not support symbolic links, you might want to ++set up @file{config.h} to contain a @samp{#include} command which ++refers to the appropriate file. ++ ++@item ++Make a symbolic link named @file{tm.h} to the machine-description ++macro file for your machine. It should be in the subdirectory ++@file{config} and its name should be @file{tm-@var{machine}.h}. ++ ++If your system is a 68000, don't use the file @file{tm-m68k.h} ++directly. Instead, use one of these files: ++ ++@table @file ++@item tm-sun3.h ++for Sun 3 machines with 68881. ++@item tm-sun3-nfp.h ++for Sun 3 machines with no hardware floating point. ++@item tm-sun3os3.h ++for Sun 3 machines with 68881, running Sunos version 3. ++@item tm-sun3os3nf.h ++for Sun 3 machines with no hardware floating point, running Sunos ++version 3. ++@item tm-sun2.h ++for Sun 2 machines. ++@item tm-3b1.h ++for AT&T 3b1 (aka 7300 Unix PC). ++@item tm-isi68.h ++for Integrated Solutions systems. This file assumes you ++use the GNU assembler. ++@item tm-isi68-nfp.h ++for Integrated Solutions systems without a 68881. This file assumes you ++use the GNU assembler. ++@item tm-news800.h ++for Sony NEWS systems. ++@item tm-hp9k320.h ++for HPUX systems, if you are using GNU CC with the system's ++assembler and linker. ++@item tm-hp9k320g.h ++for HPUX systems, if you are using the GNU assembler, linker and ++other utilities. Not all of the pieces of GNU software needed ++for this mode of operation are as yet in distribution; full ++instructions will appear here in the future.@refill ++@item tm-tower-as.h ++for NCR Tower 32 systems, using the standard system assembler. ++@end table ++ ++For the vax, use @file{tm-vax.h} on BSD Unix, @file{tm-vaxv.h} on ++system V, or @file{tm-vms.h} on VMS.@refill ++ ++For the Motorola 88000, use @file{tm-m88k.h}. The support for the ++88000 does not currently work; it requires extensive changes which ++we hope to reconcile in version 2. ++ ++For the 80386, don't use @file{tm-i386.h} directly. Use ++@file{tm-i386v.h} if the target machine is running system V, ++@file{tm-i386gas.h} if it is running system V but you are using the ++GNU assembler and linker, @file{tm-seq386.h} for a Sequent 386 system, ++or @file{tm-compaq.h} for a Compaq, or @file{tm-sun386i.h} for a Sun ++386 system. ++ ++For the Mips computer, there are five choices: @file{tm-mips.h} for the ++M series, @file{tm-mips-bsd.h} for the RS series with BSD, ++@file{tm-mips-sysv.h} for the RS series with System V, @file{tm-iris.h} ++for the Iris version of the machine, and @file{tm-decstatn.h} for the ++Decstation. ++ ++For the 32000, use @file{tm-sequent.h} if you are using a Sequent ++machine, or @file{tm-encore.h} for an Encore machine, or ++@file{tm-genix.h} if you are using Genix version 3; otherwise, perhaps ++@file{tm-ns32k.h} will work for you. ++ ++Note that Genix has bugs in @code{alloca} and @code{malloc}; you must ++get the compiled versions of these from GNU Emacs and edit GNU CC's ++@file{Makefile} to use them. ++ ++Note that Encore systems are supported only under BSD. ++ ++For Sparc (Sun 4) machines, use @file{tm-sparc.h} with operating system ++version 4, and @file{tm-sun4os3.h} with system version 3. ++ ++For Convex systems before version 8.1, use @file{tm-conv1os7.h} or ++@file{tm-conv2os7.h}. For versions 8.1 and greater, use @file{tm-convex1.h} ++or @file{tm-convex2.h}. You should also bootstrap GCC with @code{pcc} ++rather than @code{cc}; one way to do this is with the following commands. ++ ++@example ++ln -s /bin/pcc ./cc ++set path = (. $path) ++@end example ++ ++@item ++Make a symbolic link named @file{md} to the machine description ++pattern file. It should be in the @file{config} subdirectory and its ++name should be @file{@var{machine}.md}; but @var{machine} is often not ++the same as the name used in the @file{tm.h} file because the ++@file{md} files are more general. ++ ++@item ++Make a symbolic link named @file{aux-output.c} to the output ++subroutine file for your machine. It should be in the @file{config} ++subdirectory and its name should be @file{out-@var{machine}.c}. ++@end itemize ++ ++@item ++Make sure the Bison parser generator is installed. (This is ++unnecessary if the Bison output files @file{c-parse.tab.c} and ++@file{cexp.c} are more recent than @file{c-parse.y} and @file{cexp.y} ++and you do not plan to change the @samp{.y} files.) ++ ++Bison versions older than Sept 8, 1988 will produce incorrect output ++for @file{c-parse.tab.c}. ++ ++@item ++If you have a previous version of GCC installed, then chances are ++you can compile the new version with that. Do the following: ++ ++@example ++make CC="gcc -O" ++@end example ++ ++@noindent ++Since this produces an optimized executable right away, there is no need ++to bootstrap the result with itself except to test it. Therefore, you can ++skip directly to the @samp{make install} step below. ++ ++@item ++Build the compiler. Just type @samp{make} in the compiler directory. ++ ++Ignore any warnings you may see about ``statement not reached'' in the ++@file{insn-emit.c}; they are normal. Any other compilation errors may ++represent bugs in the port to your machine or operating system, and ++should be investigated and reported (@pxref{Bugs}). ++ ++Some commercial compilers fail to compile GNU CC because they have bugs ++or limitations. For example, the Microsoft compiler is said to run out ++of macro space. Some Ultrix compilers run out of expression space; then ++you need to break up the statement where the problem happens. ++ ++@item ++If you are using COFF-encapsulation, you must convert @file{gnulib} to ++a GNU-format library at this point. See the file @file{README-ENCAP} ++in the directory containing the GNU binary file utilities, for ++directions. ++ ++@item ++Move the first-stage object files and executables into a subdirectory ++with this command: ++ ++@example ++make stage1 ++@end example ++ ++The files are moved into a subdirectory named @file{stage1}. ++Once installation is complete, you may wish to delete these files ++with @code{rm -r stage1}. ++ ++@item ++Recompile the compiler with itself, with this command: ++ ++@example ++make CC=stage1/gcc CFLAGS="-g -O -Bstage1/" ++@end example ++ ++This is called making the stage 2 compiler. ++ ++On a 68000 or 68020 system lacking floating point hardware, ++unless you have selected a @file{tm.h} file that expects by default ++that there is no such hardware, do this instead: ++ ++@example ++make CC=stage1/gcc CFLAGS="-g -O -Bstage1/ -msoft-float" ++@end example ++ ++@item ++If you wish to test the compiler by compiling it with itself one more ++time, do this (in C shell): ++ ++@example ++make stage2 ++make CC=stage2/gcc CFLAGS="-g -O -Bstage2/" ++foreach file (*.o) ++cmp $file stage2/$file ++end ++@end example ++ ++@noindent ++This is called making the stage 3 compiler. Aside from the @samp{-B} ++option, the options should be the same as when you made the stage 2 ++compiler. ++ ++The @code{foreach} command (written in C shell) will notify you if any of ++these stage 3 object files differs from those of stage 2. On BSD systems, ++any difference, no matter how innocuous, indicates that the stage 2 ++compiler has compiled GNU CC incorrectly, and is therefore a potentially ++serious bug which you should investigate and report (@pxref{Bugs}). ++ ++On systems that use COFF object files, bytes 5 to 8 will always be ++different, since it is a timestamp. On these systems, you can do the ++comparison as follows (in Bourne shell): ++ ++@example ++for file in *.o; do ++echo $file ++tail +10c $file > foo1 ++tail +10c stage2/$file > foo2 ++cmp foo1 foo2 ++done ++@end example ++ ++On MIPS machines, you should use the shell script @file{ecoff-cmp} ++to compare two object files. ++ ++@item ++Install the compiler driver, the compiler's passes and run-time support. ++You can use the following command: ++ ++@example ++make install ++@end example ++ ++@noindent ++On some machines, you will find that starts to recompile the @file{.c} ++files, due to a bug in Make. If that happens, cancel it and try again ++specifying the same values for Make variables that you used in the last ++compilation; that may not prevent the spurious recompilation, but will ++at least do it properly. For example: ++ ++@example ++make CC=stage2/gcc CFLAGS="-g -O -Bstage2/" install ++@end example ++ ++@noindent ++The @samp{install} target copies the files @file{cc1}, @file{cpp} and ++@file{gnulib} to files @file{gcc-cc1}, @file{gcc-cpp} and ++@file{gcc-gnulib} in directory @file{/usr/local/lib}, which is where the ++compiler driver program looks for them. It also copies the driver ++program @file{gcc} into the directory @file{/usr/local/bin}, so that it ++appears in typical execution search paths.@refill ++ ++@strong{Warning: there is a bug in @code{alloca} in the Sun library. ++To avoid this bug, install the binaries of GNU CC that were compiled ++by GNU CC. They use @code{alloca} as a built-in function and never ++the one in the library.} ++ ++@strong{Warning: the GNU CPP may not work for @file{ioctl.h}, ++@file{ttychars.h} and other system header files unless the ++@samp{-traditional} option is used.} The bug is in the header files: ++at least on some machines, they rely on behavior that is incompatible ++with ANSI C. This behavior consists of substituting for macro ++argument names when they appear inside of character constants. The ++@samp{-traditional} option tells GNU CC to behave the way these ++headers expect. ++ ++Because of this problem, you might prefer to configure GNU CC to use ++the system's own C preprocessor. To do so, make the file ++@file{/usr/local/lib/gcc-cpp} a link to @file{/lib/cpp}. ++ ++Alternatively, on Sun systems and 4.3BSD at least, you can correct the ++include files by running the shell script @file{fixincludes}. This ++installs modified, corrected copies of the files @file{ioctl.h}, ++@file{ttychars.h} and many others, in a special directory where only ++GNU CC will normally look for them. This script will work on various ++systems because it chooses the files by searching all the system ++headers for the problem cases that we know about. ++ ++Use the following command to do this: ++ ++@example ++make includes ++@end example ++ ++@noindent ++If you selected a different directory for GNU CC installation when you ++installed it, by specifying the Make variable @code{prefix} or ++@code{libdir}, specify it the same way in this command. ++ ++Note that some systems are starting to come with ANSI C system header ++files. On these systems, don't run @file{fixincludes}; it may not work, ++and is certainly not necessary. ++ ++@strong{Warning:} @file{fixincludes} does not work on many MIPS systems, ++because those systems come with circular symbolic links which cause ++@samp{ls -lR} to go into an infinite loop. The same problem may occur ++on some versions of SunOS. If you encounter this problem, try using ++@file{fixinc.new} instead opf @code{fixincludes}. ++@end enumerate ++ ++If you cannot install the compiler's passes and run-time support in ++@file{/usr/local/lib}, you can alternatively use the @samp{-B} option to ++specify a prefix by which they may be found. The compiler concatenates ++the prefix with the names @file{cpp}, @file{cc1} and @file{gnulib}. ++Thus, you can put the files in a directory @file{/usr/foo/gcc} and ++specify @samp{-B/usr/foo/gcc/} when you run GNU CC. ++ ++Also, you can specify an alternative default directory for these files ++by setting the Make variable @code{libdir} when you make GNU CC. ++ ++@node Other Dir, Sun Install, Installation, Installation ++@section Compilation in a Separate Directory ++ ++If you wish to build the object files and executables in a directory ++other than the one containing the source files, here is what you must ++do differently: ++ ++@enumerate ++@item ++Go to that directory before running @file{config.gcc}: ++ ++@example ++mkdir gcc-sun3 ++cd gcc-sun3 ++@end example ++ ++On systems that do not support symbolic links, this directory must be ++on the same file system as the source code directory. ++ ++@item ++Specify where to find @file{config.gcc} when you run it: ++ ++@example ++../gcc-1.36/config.gcc @dots{} ++@end example ++ ++@item ++Specify where to find the sources, as an argument to @file{config.gcc}: ++ ++@example ++../gcc-1.36/config.gcc -srcdir=../gcc-1.36 sun3 ++@end example ++ ++The @samp{-srcdir=@var{dir}} option is not needed when the source ++directory is the parent of the current directory, because ++@file{config.gcc} detects that case automatically. ++@end enumerate ++ ++Now, you can run @code{make} in that directory. You need not repeat the ++configuration steps shown above, when ordinary source files change. You ++must, however, run @code{config.gcc} again when the configuration files ++change, if your system does not support symbolic links. ++ ++@node Sun Install, 3b1 Install, Other Dir, Installation ++@section Installing GNU CC on the Sun ++ ++Make sure the environment variable @code{FLOAT_OPTION} is not set when ++you compile @file{gnulib}. If this option were set to @code{f68881} ++when @file{gnulib} is compiled, the resulting code would demand to be ++linked with a special startup file and would not link properly without ++special pains. ++ ++There is a bug in @code{alloca} in certain versions of the Sun library. ++To avoid this bug, install the binaries of GNU CC that were compiled by ++GNU CC. They use @code{alloca} as a built-in function and never the one ++in the library. ++ ++Some versions of the Sun compiler crash when compiling GNU CC, with a ++segmentation fault in cpp. This can sometimes be due to the bulk of ++data in the environment variables. You may be able to avoid it by using ++the following command to compile GNU CC with Sun CC: ++ ++@example ++make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc" ++@end example ++ ++Another problem that often happens on Suns is that you get a crash when ++building stage 2, when @code{genflags} is run. ++ ++One reason for such as crash is if you configured GNU CC for the wrong ++version of SunOS. Starting with version 1.38, configurations @code{sun3} ++and @code{sun4} are for SunOS 4, so this problem should no longer happen. ++ ++Another cause of the same symptom is having installed the GNU linker ++with an earlier version of SunOS. The version that worked before ++stopped working due to a change in the format of executables in SunOS ++4.1. Many sites have installed the GNU linker as ++@file{/usr/local/lib/gcc-ld}, often as part of installing GNU C++. So ++if you get such crashes and you have used the proper configuration, try ++deleting @file{/usr/local/lib/gcc-ld}. ++ ++The current version of the GNU linker, found in the current binutils ++release, does work with SunOS 4.1. ++ ++@node 3b1 Install, SCO Install, Sun Install, Installation ++@section Installing GNU CC on the 3b1 ++ ++Installing GNU CC on the 3b1 is difficult if you do not already have ++GNU CC running, due to bugs in the installed C compiler. However, ++the following procedure might work. We are unable to test it. ++ ++@enumerate ++@item ++Comment out the @samp{#include "config.h"} line on line 37 of ++@file{cccp.c} and do @samp{make cpp}. This makes a preliminary version ++of GNU cpp. ++ ++@item ++Save the old @file{/lib/cpp} and copy the preliminary GNU cpp to that ++file name. ++ ++@item ++Undo your change in @file{cccp.c}, or reinstall the original version, ++and do @samp{make cpp} again. ++ ++@item ++Copy this final version of GNU cpp into @file{/lib/cpp}. ++ ++@item ++Replace every occurrence of @code{obstack_free} in @file{tree.c} ++with @code{_obstack_free}. ++ ++@item ++Run @code{make} to get the first-stage GNU CC. ++ ++@item ++Reinstall the original version of @file{/lib/cpp}. ++ ++@item ++Now you can compile GNU CC with itself and install it in the normal ++fashion. ++@end enumerate ++ ++If you have installed an earlier version of GCC, you can compile the ++newer version with that. However, you will run into trouble compiling ++@file{gnulib}, since that is normally compiled with CC. To solve the ++problem, uncomment this line in @file{Makefile}: ++ ++@example ++CCLIBFLAGS = -B/usr/local/lib/gcc- -tp -Wp,-traditional ++@end example ++ ++@node SCO Install, VMS Install, 3B1 Install, Installation ++@section Installing GNU CC on SCO System V 3.2 ++@cindex Installation on SCO systems ++ ++The compiler that comes with this system does not work properly with ++@samp{-O}. Therefore, you should redefine the Make variable ++@code{CCLIBFLAGS} not to use @samp{-O}. ++ ++You should also edit @file{Makefile} to enable the lines that set ++@code{CLIB} to @code{-lPW}, and the ones specifically labeled as being ++for SCO, that set @code{RANLIB}, and that set @code{CC} and @code{OLDCC} ++to @samp{rcc -Di386 -DM_UNIX -DM_I386 -DM_SYSV -DM_COFF}. ++ ++Also, edit the definition of @code{USER_H} to remove the file @file{limits.h}. ++ ++Then you can run @samp{config.gcc i386-sco} and finish building GNU CC ++normally. ++ ++Note that the function @code{memmove} is broken in 3.2v2; it clobbers ++register @code{%ebx}. See the file @file{sco-memmove.s}. ++ ++The same recipe should work on ESIX, but use @samp{config.gcc i386-esix} ++instead. ++ ++@node VMS Install, HPUX Install, SCO Install, Installation ++@section Installing GNU CC on VMS ++ ++The VMS version of GNU CC is distributed in a backup saveset containing ++both source code and precompiled binaries. ++ ++To install the @file{gcc} command so you can use the compiler easily, in ++the same manner as you use the VMS C compiler, you must install the VMS CLD ++file for GNU CC as follows: ++ ++@enumerate ++@item ++Define the VMS logical names @samp{GNU_CC} and @samp{GNU_CC_INCLUDE} ++to point to the directories where the GNU CC executables ++(@file{gcc-cpp}, @file{gcc-cc1}, etc.) and the C include files are ++kept. This should be done with the commands:@refill ++ ++@example ++$ assign /super /system disk:[gcc.] gnu_cc ++$ assign /super /system disk:[gcc.include.] gnu_cc_include ++@end example ++ ++@noindent ++with the appropriate disk and directory names. These commands can be ++placed in your system startup file so they will be executed whenever ++the machine is rebooted. You may, if you choose, do this via the ++@file{GCC_INSTALL.COM} script in the @file{[GCC]} directory. ++ ++@item ++Install the @file{GCC} command with the command line: ++ ++@example ++$ set command /table=sys$library:dcltables gnu_cc:[000000]gcc ++@end example ++ ++@item ++To install the help file, do the following: ++ ++@example ++$ lib/help sys$library:helplib.hlb gcc.hlp ++@end example ++ ++@noindent ++Now you can invoke the compiler with a command like @samp{gcc /verbose ++file.c}, which is equivalent to the command @samp{gcc -v -c file.c} in ++Unix. ++@end enumerate ++ ++We try to put corresponding binaries and sources on the VMS distribution ++tape. But sometimes the binaries will be from an older version that the ++sources, because we don't always have time to update them. (Use the ++@samp{/verbose} option to determine the version number of the binaries and ++compare it with the source file @file{version.c} to tell whether this is ++so.) In this case, you should use the binaries you get to recompile the ++sources. If you must recompile, here is how: ++ ++@enumerate ++@item ++Copy the file @file{tm-vms.h} to @file{tm.h}, @file{xm-vms.h} to ++@file{config.h}, @file{vax.md} to @file{md.} and @file{out-vax.c} ++to @file{aux-output.c}. The files to be copied are found in the ++subdirectory named @file{config}; they should be copied to the ++main directory of GNU CC.@refill ++ ++@item ++Setup the logical names and command tables as defined above. In ++addition, define the vms logical name @samp{GNU_BISON} to point at the ++to the directories where the Bison executable is kept. This should be ++done with the command:@refill ++ ++@example ++$ assign /super /system disk:[bison.] gnu_bison ++@end example ++ ++You may, if you choose, use the @file{INSTALL_BISON.COM} script in the ++@file{[BISON]} directory. ++ ++@item ++Install the @samp{BISON} command with the command line:@refill ++ ++@example ++$ set command /table=sys$library:dcltables gnu_bison:[000000]bison ++@end example ++ ++@item ++Type @samp{@@make} to do recompile everything. ++ ++If you are compiling with a version of GNU CC older than 1.33, specify ++@samp{/DEFINE=("inline=")} as an option in all the compilations. This ++requires editing all the @code{gcc} commands in @file{make-cc1.com}. ++(The older versions had problems supporting @code{inline}.) Once you ++have a working 1.33 or newer GNU CC, you can change this file back. ++@end enumerate ++ ++Due to the differences between the filesystems of Unix and VMS, the ++preprocessor attempts to translate the names of include files into ++something that VMS will understand. The basic strategy is to prepend a ++prefix to the specification of the include file, convert the whole ++filename to a VMS filename, and then try to open the file. The ++preprocessor tries various prefixes until one of them succeeds. ++ ++The first prefix is the @samp{GNU_CC_INCLUDE:} logical name: this is ++where GNU_C header files are traditionally stored. If a header file is ++not found there, @samp{SYS$SYSROOT:[SYSLIB.]} is tried next. If the ++preprocessor is still unable to locate the file, it then assumes that ++the include file specification is a valid VMS filename all by itself, ++and it uses this filename to attempt to open the include file. If none ++of these strategies succeeds, the preprocessor reports an error. ++ ++If you wish to store header files in non-standard locations, then you ++can assign the logical @samp{GNU_CC_INCLUDE} to be a search list, where ++each element of the list is suitable for use with a rooted logical. ++ ++With this version of GNU CC, @code{const} global variables now work ++properly. Unless, however, the @code{const} modifier is also specified ++in every external declaration of the variable in all of the source files ++that use that variable, the linker will issue warnings about conflicting ++attributes for the variable, since the linker does not know if the ++variable should be read-only. The program will still work, but the ++variable will be placed in writable storage. ++ ++Due to an assembler bug, offsets to static constants are sometimes ++incorrectly evaluated. This bug is present in GAS 1.38.1, and should be ++fixed in the next version. ++ ++Under previous versions of GNU CC, the generated code would occasionally ++give strange results when linked to the sharable @file{VAXCRTL} library. ++Now this should work. ++ ++Even with this version, however, GNU CC itself should not be linked to the ++sharable @file{VAXCRTL}. The @file{qsort} routine supplied with @file{VAXCRTL} ++has a bug which can cause a compiler crash. ++ ++Similarly, the preprocessor should not be linked to the sharable ++@file{VAXCRTL}. The @code{strncat} routine supplied with @file{VAXCRTL} has a ++bug which can cause the preprocessor to go into an infinite loop. ++ ++It should be pointed out that if you attempt to link to the sharable ++@file{VAXCRTL}, the VMS linker will strongly resist any effort to force ++it to use the @code{qsort} and @code{strncat} routines from ++@file{gcclib}. Until the bugs in @file{VAXCRTL} have been fixed, ++linking any of the compiler components to the sharable VAXCRTL is not ++recommended. (These routines can be bypassed by placing duplicate copies ++of @code{qsort} and @code{strncat} in @file{gcclib} under different ++names, and patching the compiler sources to use these routines). Both ++of the bugs in @file{VAXCRTL} are still present in VMS version 5.4-1, ++which is the most recent version as of this writing. ++ ++The executables that are generated by @file{make-cc1.com} and ++@file{make-cccp.com} use the non-shared version of @file{VAXCRTL} (and ++thus use the @code{qsort} and @code{strncat} routines from ++@file{gcclib.olb}). ++ ++Note that GNU CC on VMS now generates debugging information to describe ++the programs symbols to the VMS debugger. However, you need version 1.37 ++or later of GAS in order to output them properly in the object file. ++ ++The VMS linker does not distinguish between upper and lower case letters ++in function and variable names. However, usual practice in C is to ++distinguish case. Normally GNU C (by means of the assembler GAS) ++implements usual C behavior by augmenting each name that is not all ++lower-case. A name is augmented by truncating it to at most 23 ++characters and then adding more characters at the end which encode the ++case pattern the rest. ++ ++Name augmentation yields bad results for programs that use precompiled ++libraries (such as Xlib) which were generated by another compiler. Use ++the compiler option @samp{/NOCASE_HACK} to inhibits augmentation; it ++makes external C functions and variables case-independent as is usual on ++VMS. Alternatively, you could write all references to the functions and ++variables in such libraries using lower case; this will work on VMS, but ++is not portable to other systems. In cases where you need to ++selectively inhibit augmentation, you can define a macro for each mixed ++case symbol for which you wish to inhibit augmentation, where the macro ++expands into the lower case equivalent of the name. ++ ++@node HPUX Install, Tower Install, VMS Install, Installation ++@section Installing GNU CC on HPUX ++ ++To install GNU CC on HPUX, you must start by editing the file ++@file{Makefile}. Search for the string @samp{HPUX} to find comments ++saying what to change. You need to change some variable definitions and ++(if you are using GAS) some lines in the rule for the target ++@samp{gnulib}. ++ ++To avoid errors when linking programs with @samp{-g}, create an empty ++library named @file{libg.a}. An easy way to do this is: ++ ++@example ++ar rc /usr/local/lib/libg.a ++@end example ++ ++To compile with the HPUX C compiler, you must specify get the file ++@file{alloca.c} from GNU Emacs. Then, when you run @code{make}, use ++this argument: ++ ++@example ++make ALLOCA=alloca.o ++@end example ++ ++When recompiling GNU CC with itself, do not define @code{ALLOCA}. ++Instead, an @samp{-I} option needs to be added to @code{CFLAGS} as ++follows: ++ ++@example ++make CC=stage1/gcc CFLAGS="-g -O -Bstage1/ -I../binutils/hp-include" ++@end example ++ ++@node Tower Install,, HPUX Install, Installation ++@section Installing GNU CC on an NCR Tower ++ ++On an NCR Tower model 4x0 or 6x0, you may have trouble because the ++default maximum virtual address size of a process is just 1 Mb. Most ++often you will find this problem while compiling GNU CC with itself. ++ ++The only way to solve the problem is to reconfigure the kernel. ++Add a line such as this to the configuration file: ++ ++@example ++MAXUMEM = 4096 ++@end example ++ ++@noindent ++and then relink the kernel and reboot the machine. ++ ++ ++@node Trouble, Service, Installation, Top ++@chapter Known Causes of Trouble with GNU CC ++ ++Here are some of the things that have caused trouble for people installing ++or using GNU CC. ++ ++@itemize @bullet ++@item ++On certain systems, defining certain environment variables such as ++@code{CC} can interfere with the functioning of @code{make}. ++ ++@item ++Cross compilation can run into trouble for certain machines because ++some target machines' assemblers require floating point numbers to be ++written as @emph{integer} constants in certain contexts. ++ ++The compiler writes these integer constants by examining the floating ++point value as an integer and printing that integer, because this is ++simple to write and independent of the details of the floating point ++representation. But this does not work if the compiler is running on ++a different machine with an incompatible floating point format, or ++even a different byte-ordering. ++ ++In addition, correct constant folding of floating point values ++requires representing them in the target machine's format. ++(The C standard does not quite require this, but in practice ++it is the only way to win.) ++ ++It is now possible to overcome these problems by defining macros such ++as @code{REAL_VALUE_TYPE}. But doing so is a substantial amount of ++work for each target machine. @xref{Cross-compilation}. ++ ++@item ++Users often think it is a bug when GNU CC reports an error for code ++like this: ++ ++@example ++int foo (short); ++ ++int foo (x) ++ short x; ++@{@dots{}@} ++@end example ++ ++The error message is correct: this code really is erroneous, because the ++old-style non-prototype definition passes subword integers in their ++promoted types. In other words, the argument is really an @code{int}, ++not a @code{short}. The correct prototype is this: ++ ++@example ++int foo (int); ++@end example ++ ++@item ++Users often think it is a bug when GNU CC reports an error for code ++like this: ++ ++@example ++int foo (struct mumble *); ++ ++struct mumble @{ @dots{} @}; ++ ++int foo (struct mumble *x) ++@{ @dots{} @} ++@end example ++ ++This code really is erroneous, because the scope of @code{struct ++mumble} the prototype is limited to the argument list containing it. ++It does not refer to the @code{struct mumble} defined with file scope ++immediately below---they are two unrelated types with similar names in ++different scopes. ++ ++But in the definition of @code{foo}, the file-scope type is used ++because that is available to be inherited. Thus, the definition and ++the prototype do not match, and you get an error. ++ ++This behavior may seem silly, but it's what the ANSI standard ++specifies. It is easy enough for you to make your code work by moving ++the definition of @code{struct mumble} above the prototype. I don't ++think it's worth being incompatible for. ++@end itemize ++ ++Additional problems are described in @ref{Incompatibilities}. ++ ++@node Service, Incompatibilities, Trouble, Top ++@chapter How To Get Help with GNU CC ++ ++If you need help installing, using or changing GNU CC, there are two ++ways to find it: ++ ++@itemize @bullet ++@item ++Send a message to a suitable network mailing list. First try ++@code{bug-gcc@@prep.ai.mit.edu}, and if that brings no response, try ++@code{help-gcc@@prep.ai.mit.edu}. ++ ++@item ++Look in the service directory for someone who might help you for a fee. ++The service directory is found in the file named @file{SERVICE} in the ++GNU CC distribution. ++@end itemize ++ ++@node Incompatibilities, Extensions, Service, Top ++@chapter Incompatibilities of GNU CC ++ ++There are several noteworthy incompatibilities between GNU C and most ++existing (non-ANSI) versions of C. The @samp{-traditional} option ++eliminates most of these incompatibilities, @emph{but not all}, by ++telling GNU C to behave like older C compilers. ++ ++@itemize @bullet ++@item ++GNU CC normally makes string constants read-only. If several ++identical-looking string constants are used, GNU CC stores only one ++copy of the string. ++ ++One consequence is that you cannot call @code{mktemp} with a string ++constant argument. The function @code{mktemp} always alters the ++string its argument points to. ++ ++Another consequence is that @code{sscanf} does not work on some ++systems when passed a string constant as its format control string. ++This is because @code{sscanf} incorrectly tries to write into the ++string constant. Likewise @code{fscanf} and @code{scanf}. ++ ++The best solution to these problems is to change the program to use ++@code{char}-array variables with initialization strings for these ++purposes instead of string constants. But if this is not possible, ++you can use the @samp{-fwritable-strings} flag, which directs GNU CC ++to handle string constants the same way most C compilers do. ++@samp{-traditional} also has this effect, among others. ++ ++@item ++GNU CC does not substitute macro arguments when they appear inside of ++string constants. For example, the following macro in GNU CC ++ ++@example ++#define foo(a) "a" ++@end example ++ ++@noindent ++will produce output @code{"a"} regardless of what the argument @var{a} is. ++ ++The @samp{-traditional} option directs GNU CC to handle such cases ++(among others) in the old-fashioned (non-ANSI) fashion. ++ ++@item ++When you use @code{setjmp} and @code{longjmp}, the only automatic ++variables guaranteed to remain valid are those declared ++@code{volatile}. This is a consequence of automatic register ++allocation. Consider this function: ++ ++@example ++jmp_buf j; ++ ++foo () ++@{ ++ int a, b; ++ ++ a = fun1 (); ++ if (setjmp (j)) ++ return a; ++ ++ a = fun2 (); ++ /* @r{@code{longjmp (j)} may be occur in @code{fun3}.} */ ++ return a + fun3 (); ++@} ++@end example ++ ++Here @code{a} may or may not be restored to its first value when the ++@code{longjmp} occurs. If @code{a} is allocated in a register, then ++its first value is restored; otherwise, it keeps the last value stored ++in it. ++ ++If you use the @samp{-W} option with the @samp{-O} option, you will ++get a warning when GNU CC thinks such a problem might be possible. ++ ++The @samp{-traditional} option directs GNU C to put variables in ++the stack by default, rather than in registers, in functions that ++call @code{setjmp}. This results in the behavior found in ++traditional C compilers. ++ ++@item ++Declarations of external variables and functions within a block apply ++only to the block containing the declaration. In other words, they ++have the same scope as any other declaration in the same place. ++ ++In some other C compilers, a @code{extern} declaration affects all the ++rest of the file even if it happens within a block. ++ ++The @samp{-traditional} option directs GNU C to treat all @code{extern} ++declarations as global, like traditional compilers. ++ ++@item ++In traditional C, you can combine @code{long}, etc., with a typedef name, ++as shown here: ++ ++@example ++typedef int foo; ++typedef long foo bar; ++@end example ++ ++In ANSI C, this is not allowed: @code{long} and other type modifiers ++require an explicit @code{int}. Because this criterion is expressed ++by Bison grammar rules rather than C code, the @samp{-traditional} ++flag cannot alter it. ++ ++@item ++PCC allows typedef names to be used as function parameters. The ++difficulty described immediately above applies here too. ++ ++@item ++PCC allows whitespace in the middle of compound assignment operators ++such as @samp{+=}. GNU CC, following the ANSI standard, does not ++allow this. The difficulty described immediately above applies here ++too. ++ ++@item ++GNU CC will flag unterminated character constants inside of preprocessor ++conditionals that fail. Some programs have English comments enclosed in ++conditionals that are guaranteed to fail; if these comments contain ++apostrophes, GNU CC will probably report an error. For example, ++this code would produce an error: ++ ++@example ++#if 0 ++You can't expect this to work. ++#endif ++@end example ++ ++The best solution to such a problem is to put the text into an actual ++C comment delimited by @samp{/*@dots{}*/}. However, ++@samp{-traditional} suppresses these error messages. ++ ++@item ++When compiling functions that return @code{float}, PCC converts it to ++a double. GNU CC actually returns a @code{float}. If you are concerned ++with PCC compatibility, you should declare your functions to return ++@code{double}; you might as well say what you mean. ++ ++@item ++When compiling functions that return structures or unions, GNU CC ++output code normally uses a method different from that used on most ++versions of Unix. As a result, code compiled with GNU CC cannot call ++a structure-returning function compiled with PCC, and vice versa. ++ ++The method used by GNU CC is as follows: a structure or union which is 1, ++2, 4 or 8 bytes long is returned like a scalar. A structure or union ++with any other size is stored into an address supplied by the caller ++in a special, fixed register. ++ ++PCC usually handles all sizes of structures and unions by returning ++the address of a block of static storage containing the value. This ++method is not used in GNU CC because it is slower and nonreentrant. ++ ++You can tell GNU CC to use the PCC convention with the option ++@samp{-fpcc-struct-return}. ++@end itemize ++ ++There are also system-specific incompatibilities. ++ ++@itemize @bullet ++@item ++On the Sparc, GNU CC uses an incompatible calling convention for ++structures and unions. It passes them by including their contents in ++the argument list, whereas the standard compiler passes them effectively ++by reference. ++ ++This is hard to fix in GCC version 1. GNU CC version 2 will use a ++compatible calling convention. ++ ++The convention for structure or union returning is also incompatible, ++and @samp{-fpcc-struct-return} does not help. ++ ++System functions which can't be called properly from code compiled with ++GCC include @code{fetch}, @code{store}, @code{delete}, @code{firstkey}, ++@code{nextkey}, @code{inet_makeaddr}, @code{inet_lnaof}, ++@code{inet_netof}, @code{inet_ntoa}, @code{mallinfo}, ++@code{pmap_rmtcall}, @code{clnt_call}, @code{clntudp_bufcreate} and ++@code{clntudp_create}. ++ ++@item ++One consequence of the unusual calling convention used on the Sparc ++is that structures with less than word alignment do not work right ++when passed as arguments to varargs functions. ++ ++It's not easy to fix this problem. In any case, it will be gone in ++version 2 as a result of the changed calling convention. ++ ++@item ++The Sparc version of @code{setjmp} interacts badly with unexpected stack ++adjustments. With rare exceptions, you cannot use @code{setjmp} in a ++function which moves the stack pointer. ++ ++In the current version of GNU CC, there are three ways that the stack ++pointer can change value: (1) calls to @code{alloca}, (2) use of ++variable-sized objects, and (3) calls to functions with parameters that ++do not all fit in the argument-passing registers (e.g., more than 6 ++parameters). You should avoid all three in functions that call ++@code{setjmp}. ++ ++The cause of the problem is the way that Sun implemented register ++windows. The 64 bytes at addresses @code{%sp} through @code{%sp+63} ++correspond to the register window save area. When a register window ++must be spilled, its stack pointer is located, and the registers are ++dumped starting at that address. Similarly, when a register window must ++be restored, its stack pointer is located, and the registers are ++restored from that address. ++ ++When @code{setjmp} is called, the current register window's registers ++are saved into the register save area, and when @code{longjmp} is ++called, they are restored (actually, @emph{all} register windows are ++restored from all valid register windows at the time @code{longjmp} is ++called). If there is a change in the value of the stack pointer bewteen ++the @code{setjmp} and @code{longjmp} calls, when the registers are ++restored, they are restored with random values. ++ ++@item ++On Ultrix, the Fortran compiler expects registers 2 through 5 to be saved ++by function calls. However, the C compiler uses conventions compatible ++with BSD Unix: registers 2 through 5 may be clobbered by function calls. ++ ++GNU CC uses the same convention as the Ultrix C compiler. You can use ++these options to produce code compatible with the Fortran compiler: ++ ++@example ++-fcall-saved-r2 -fcall-saved-r3 -fcall-saved-r4 -fcall-saved-r5 ++@end example ++ ++@item ++DBX rejects some files produced by GNU CC, though it accepts similar ++constructs in output from PCC. Until someone can supply a coherent ++description of what is valid DBX input and what is not, there is ++nothing I can do about these problems. You are on your own. ++@end itemize ++ ++@node Extensions, Bugs, Incompatibilities, Top ++@chapter GNU Extensions to the C Language ++ ++GNU C provides several language features not found in ANSI standard C. ++(The @samp{-pedantic} option directs GNU CC to print a warning message if ++any of these features is used.) To test for the availability of these ++features in conditional compilation, check for a predefined macro ++@code{__GNUC__}, which is always defined under GNU CC. ++ ++@menu ++* Statement Exprs:: Putting statements and declarations inside expressions. ++* Naming Types:: Giving a name to the type of some expression. ++* Typeof:: @code{typeof}: referring to the type of an expression. ++* Lvalues:: Using @samp{?:}, @samp{,} and casts in lvalues. ++* Conditionals:: Omitting the middle operand of a @samp{?:} expression. ++* Zero-Length:: Zero-length arrays. ++* Variable-Length:: Arrays whose length is computed at run time. ++* Subscripting:: Any array can be subscripted, even if not an lvalue. ++* Pointer Arith:: Arithmetic on @code{void}-pointers and function pointers. ++* Initializers:: Non-constant initializers. ++* Constructors:: Constructor expressions give structures, unions ++ or arrays as values. ++* Function Attributes:: Declaring that functions have no side effects, ++ or that they can never return. ++* Dollar Signs:: Dollar sign is allowed in identifiers. ++* Alignment:: Inquiring about the alignment of a type or variable. ++* Inline:: Defining inline functions (as fast as macros). ++* Extended Asm:: Assembler instructions with C expressions as operands. ++ (With them you can define ``built-in'' functions.) ++* Asm Labels:: Specifying the assembler name to use for a C symbol. ++* Explicit Reg Vars:: Defining variables residing in specified registers. ++* Alternate Keywords:: @code{__const__}, @code{__asm__}, etc., for header files. ++@end menu ++ ++@node Statement Exprs, Naming Types, Extensions, Extensions ++@section Statements and Declarations inside of Expressions ++ ++A compound statement in parentheses may appear inside an expression in GNU ++C. This allows you to declare variables within an expression. For ++example: ++ ++@example ++(@{ int y = foo (); int z; ++ if (y > 0) z = y; ++ else z = - y; ++ z; @}) ++@end example ++ ++@noindent ++is a valid (though slightly more complex than necessary) expression ++for the absolute value of @code{foo ()}. ++ ++This feature is especially useful in making macro definitions ``safe'' (so ++that they evaluate each operand exactly once). For example, the ++``maximum'' function is commonly defined as a macro in standard C as ++follows: ++ ++@example ++#define max(a,b) ((a) > (b) ? (a) : (b)) ++@end example ++ ++@noindent ++But this definition computes either @var{a} or @var{b} twice, with bad ++results if the operand has side effects. In GNU C, if you know the ++type of the operands (here let's assume @code{int}), you can define ++the macro safely as follows: ++ ++@example ++#define maxint(a,b) \ ++ (@{int _a = (a), _b = (b); _a > _b ? _a : _b; @}) ++@end example ++ ++Embedded statements are not allowed in constant expressions, such as ++the value of an enumeration constant, the width of a bit field, or ++the initial value of a static variable. ++ ++If you don't know the type of the operand, you can still do this, but you ++must use @code{typeof} (@pxref{Typeof}) or type naming (@pxref{Naming ++Types}). ++ ++@node Naming Types, Typeof, Statement Exprs, Extensions ++@section Naming an Expression's Type ++ ++You can give a name to the type of an expression using a @code{typedef} ++declaration with an initializer. Here is how to define @var{name} as a ++type name for the type of @var{exp}: ++ ++@example ++typedef @var{name} = @var{exp}; ++@end example ++ ++This is useful in conjunction with the statements-within-expressions ++feature. Here is how the two together can be used to define a safe ++``maximum'' macro that operates on any arithmetic type: ++ ++@example ++#define max(a,b) \ ++ (@{typedef _ta = (a), _tb = (b); \ ++ _ta _a = (a); _tb _b = (b); \ ++ _a > _b ? _a : _b; @}) ++@end example ++ ++The reason for using names that start with underscores for the local ++variables is to avoid conflicts with variable names that occur within the ++expressions that are substituted for @code{a} and @code{b}. Eventually we ++hope to design a new form of declaration syntax that allows you to declare ++variables whose scopes start only after their initializers; this will be a ++more reliable way to prevent such conflicts. ++ ++@node Typeof, Lvalues, Naming Types, Extensions ++@section Referring to a Type with @code{typeof} ++ ++Another way to refer to the type of an expression is with @code{typeof}. ++The syntax of using of this keyword looks like @code{sizeof}, but the ++construct acts semantically like a type name defined with @code{typedef}. ++ ++There are two ways of writing the argument to @code{typeof}: with an ++expression or with a type. Here is an example with an expression: ++ ++@example ++typeof (x[0](1)) ++@end example ++ ++@noindent ++This assumes that @code{x} is an array of functions; the type described ++is that of the values of the functions. ++ ++Here is an example with a typename as the argument: ++ ++@example ++typeof (int *) ++@end example ++ ++@noindent ++Here the type described is that of pointers to @code{int}. ++ ++If you are writing a header file that must work when included in ANSI C ++programs, write @code{__typeof__} instead of @code{typeof}. ++@xref{Alternate Keywords}. ++ ++A @code{typeof}-construct can be used anywhere a typedef name could be ++used. For example, you can use it in a declaration, in a cast, or inside ++of @code{sizeof} or @code{typeof}. ++ ++@itemize @bullet ++@item ++This declares @code{y} with the type of what @code{x} points to. ++ ++@example ++typeof (*x) y; ++@end example ++ ++@item ++This declares @code{y} as an array of such values. ++ ++@example ++typeof (*x) y[4]; ++@end example ++ ++@item ++This declares @code{y} as an array of pointers to characters: ++ ++@example ++typeof (typeof (char *)[4]) y; ++@end example ++ ++@noindent ++It is equivalent to the following traditional C declaration: ++ ++@example ++char *y[4]; ++@end example ++ ++To see the meaning of the declaration using @code{typeof}, and why it ++might be a useful way to write, let's rewrite it with these macros: ++ ++@example ++#define pointer(T) typeof(T *) ++#define array(T, N) typeof(T [N]) ++@end example ++ ++@noindent ++Now the declaration can be rewritten this way: ++ ++@example ++array (pointer (char), 4) y; ++@end example ++ ++@noindent ++Thus, @code{array (pointer (char), 4)} is the type of arrays of 4 ++pointers to @code{char}. ++@end itemize ++ ++@node Lvalues, Conditionals, Typeof, Extensions ++@section Generalized Lvalues ++ ++Compound expressions, conditional expressions and casts are allowed as ++lvalues provided their operands are lvalues. This means that you can take ++their addresses or store values into them. ++ ++For example, a compound expression can be assigned, provided the last ++expression in the sequence is an lvalue. These two expressions are ++equivalent: ++ ++@example ++(a, b) += 5 ++a, (b += 5) ++@end example ++ ++Similarly, the address of the compound expression can be taken. These two ++expressions are equivalent: ++ ++@example ++&(a, b) ++a, &b ++@end example ++ ++A conditional expression is a valid lvalue if its type is not void and the ++true and false branches are both valid lvalues. For example, these two ++expressions are equivalent: ++ ++@example ++(a ? b : c) = 5 ++(a ? b = 5 : (c = 5)) ++@end example ++ ++A cast is a valid lvalue if its operand is an lvalue. A simple ++assignment whose left-hand side is a cast works by converting the ++right-hand side first to the specified type, then to the type of the ++inner left-hand side expression. After this is stored, the value is ++converted back to the specified type to become the value of the ++assignment. Thus, if @code{a} has type @code{char *}, the following two ++expressions are equivalent: ++ ++@example ++(int)a = 5 ++(int)(a = (char *)(int)5) ++@end example ++ ++An assignment-with-arithmetic operation such as @samp{+=} applied to a cast ++performs the arithmetic using the type resulting from the cast, and then ++continues as in the previous case. Therefore, these two expressions are ++equivalent: ++ ++@example ++(int)a += 5 ++(int)(a = (char *)(int) ((int)a + 5)) ++@end example ++ ++You cannot take the address of an lvalue cast, because the use of its ++address would not work out coherently. Suppose that @code{&(int)f} were ++permitted, where @code{f} has type @code{float}. Then the following ++statement would try to store an integer bit-pattern where a floating ++point number belongs: ++ ++@example ++*&(int)f = 1; ++@end example ++ ++This is quite different from what @code{(int)f = 1} would do---that ++would convert 1 to floating point and store it. Rather than cause this ++inconsistancy, we think it is better to prohibit use of @samp{&} on a cast. ++ ++If you really do want an @code{int *} pointer with the address of ++@code{f}, you can simply write @code{(int *)&f}. ++ ++@node Conditionals, Zero-Length, Lvalues, Extensions ++@section Conditional Expressions with Omitted Middle-Operands ++ ++The middle operand in a conditional expression may be omitted. Then ++if the first operand is nonzero, its value is the value of the conditional ++expression. ++ ++Therefore, the expression ++ ++@example ++x ? : y ++@end example ++ ++@noindent ++has the value of @code{x} if that is nonzero; otherwise, the value of ++@code{y}. ++ ++This example is perfectly equivalent to ++ ++@example ++x ? x : y ++@end example ++ ++@noindent ++In this simple case, the ability to omit the middle operand is not ++especially useful. When it becomes useful is when the first operand does, ++or may (if it is a macro argument), contain a side effect. Then repeating ++the operand in the middle would perform the side effect twice. Omitting ++the middle operand uses the value already computed without the undesirable ++effects of recomputing it. ++ ++@node Zero-Length, Variable-Length, Conditionals, Extensions ++@section Arrays of Length Zero ++ ++Zero-length arrays are allowed in GNU C. They are very useful as the last ++element of a structure which is really a header for a variable-length ++object: ++ ++@example ++struct line @{ ++ int length; ++ char contents[0]; ++@}; ++ ++@{ ++ struct line *thisline ++ = (struct line *) malloc (sizeof (struct line) + this_length); ++ thisline->length = this_length; ++@} ++@end example ++ ++In standard C, you would have to give @code{contents} a length of 1, which ++means either you waste space or complicate the argument to @code{malloc}. ++ ++@node Variable-Length, Subscripting, Zero-Length, Extensions ++@section Arrays of Variable Length ++ ++Variable-length automatic arrays are allowed in GNU C. These arrays are ++declared like any other automatic arrays, but with a length that is not a ++constant expression. The storage is allocated at that time and ++deallocated when the brace-level is exited. For example: ++ ++@example ++FILE *concat_fopen (char *s1, char *s2, char *mode) ++@{ ++ char str[strlen (s1) + strlen (s2) + 1]; ++ strcpy (str, s1); ++ strcat (str, s2); ++ return fopen (str, mode); ++@} ++@end example ++ ++You can also use variable-length arrays as arguments to functions: ++ ++@example ++struct entry ++tester (int len, char data[len]) ++@{ ++ @dots{} ++@} ++@end example ++ ++The length of an array is computed on entry to the brace-level where the ++array is declared and is remembered for the scope of the array in case you ++access it with @code{sizeof}. ++ ++Jumping or breaking out of the scope of the array name will also deallocate ++the storage. Jumping into the scope is not allowed; you will get an error ++message for it. ++ ++You can use the function @code{alloca} to get an effect much like ++variable-length arrays. The function @code{alloca} is available in ++many other C implementations (but not in all). On the other hand, ++variable-length arrays are more elegant. ++ ++There are other differences between these two methods. Space allocated ++with @code{alloca} exists until the containing @emph{function} returns. ++The space for a variable-length array is deallocated as soon as the array ++name's scope ends. (If you use both variable-length arrays and ++@code{alloca} in the same function, deallocation of a variable-length array ++will also deallocate anything more recently allocated with @code{alloca}.) ++ ++@node Subscripting, Pointer Arith, Variable-Length, Extensions ++@section Non-Lvalue Arrays May Have Subscripts ++ ++Subscripting is allowed on arrays that are not lvalues, even though the ++unary @samp{&} operator is not. For example, this is valid in GNU C though ++not valid in other C dialects: ++ ++@example ++struct foo @{int a[4];@}; ++ ++struct foo f(); ++ ++bar (int index) ++@{ ++ return f().a[index]; ++@} ++@end example ++ ++@node Pointer Arith, Initializers, Subscripting, Extensions ++@section Arithmetic on @code{void}-Pointers and Function Pointers ++ ++In GNU C, addition and subtraction operations are supported on pointers to ++@code{void} and on pointers to functions. This is done by treating the ++size of a @code{void} or of a function as 1. ++ ++A consequence of this is that @code{sizeof} is also allowed on @code{void} ++and on function types, and returns 1. ++ ++The option @samp{-Wpointer-arith} requests a warning if these extensions ++are used. ++ ++@node Initializers, Constructors, Pointer Arith, Extensions ++@section Non-Constant Initializers ++ ++The elements of an aggregate initializer for an automatic variable are ++not required to be constant expressions in GNU C. Here is an example of ++an initializer with run-time varying elements: ++ ++@example ++foo (float f, float g) ++@{ ++ float beat_freqs[2] = @{ f-g, f+g @}; ++ @dots{} ++@} ++@end example ++ ++@node Constructors, Function Attributes, Initializers, Extensions ++@section Constructor Expressions ++ ++GNU C supports constructor expressions. A constructor looks like a cast ++containing an initializer. Its value is an object of the type specified in ++the cast, containing the elements specified in the initializer. The type ++must be a structure, union or array type. ++ ++Assume that @code{struct foo} and @code{structure} are declared as shown: ++ ++@example ++struct foo @{int a; char b[2];@} structure; ++@end example ++ ++@noindent ++Here is an example of constructing a @code{struct foo} with a constructor: ++ ++@example ++structure = ((struct foo) @{x + y, 'a', 0@}); ++@end example ++ ++@noindent ++This is equivalent to writing the following: ++ ++@example ++@{ ++ struct foo temp = @{x + y, 'a', 0@}; ++ structure = temp; ++@} ++@end example ++ ++You can also construct an array. If all the elements of the constructor ++are (made up of) simple constant expressions, suitable for use in ++initializers, then the constructor is an lvalue and can be coerced to a ++pointer to its first element, as shown here: ++ ++@example ++char **foo = (char *[]) @{ "x", "y", "z" @}; ++@end example ++ ++Array constructors whose elements are not simple constants are not very ++useful, because the constructor is not an lvalue. There are only two valid ++ways to use it: to subscript it, or initialize an array variable with it. ++The former is probably slower than a @code{switch} statement, while the ++latter does the same thing an ordinary C initializer would do. ++ ++@example ++output = ((int[]) @{ 2, x, 28 @}) [input]; ++@end example ++ ++@node Function Attributes, Dollar Signs, Constructors, Extensions ++@section Declaring Attributes of Functions ++ ++In GNU C, you declare certain things about functions called in your program ++which help the compiler optimize function calls. ++ ++A few functions, such as @code{abort} and @code{exit}, cannot return. ++These functions should be declared @code{volatile}. For example, ++ ++@example ++extern volatile void abort (); ++@end example ++ ++@noindent ++tells the compiler that it can assume that @code{abort} will not return. ++This makes slightly better code, but more importantly it helps avoid ++spurious warnings of uninitialized variables. ++ ++Many functions do not examine any values except their arguments, and ++have no effects except the return value. Such a function can be subject ++to common subexpression elimination and loop optimization just as an ++arithmetic operator would be. These functions should be declared ++@code{const}. For example, ++ ++@example ++extern const int square (); ++@end example ++ ++@noindent ++says that the hypothetical function @code{square} is safe to call ++fewer times than the program says. ++ ++Note that a function that has pointer arguments and examines the data ++pointed to must @emph{not} be declared @code{const}. Likewise, a ++function that calls a non-@code{const} function usually must not be ++@code{const}. ++ ++Some people object to this feature, claiming that ANSI C's @code{#pragma} ++should be used instead. There are two reasons I did not do this. ++ ++@enumerate ++@item ++It is impossible to generate @code{#pragma} commands from a macro. ++ ++@item ++The @code{#pragma} command is just as likely as these keywords to mean ++something else in another compiler. ++@end enumerate ++ ++These two reasons apply to @emph{any} application whatever: as far as ++I can see, @code{#pragma} is never useful. ++ ++@node Dollar Signs, Alignment, Function Attributes, Extensions ++@section Dollar Signs in Identifier Names ++ ++In GNU C, you may use dollar signs in identifier names. This is because ++many traditional C implementations allow such identifiers. ++ ++Dollar signs are allowed if you specify @samp{-traditional}; they are ++not allowed if you specify @samp{-ansi}. Whether they are allowed by ++default depends on the target machine; usually, they are not. ++ ++@node Alignment, Inline, Dollar Signs, Extensions ++@section Inquiring about the Alignment of a Type or Variable ++ ++The keyword @code{__alignof__} allows you to inquire about how an object ++is aligned, or the minimum alignment usually required by a type. Its ++syntax is just like @code{sizeof}. ++ ++For example, if the target machine requires a @code{double} value to be ++aligned on an 8-byte boundary, then @code{__alignof__ (double)} is 8. ++This is true on many RISC machines. On more traditional machine ++designs, @code{__alignof__ (double)} is 4 or even 2. ++ ++Some machines never actually require alignment; they allow reference to any ++data type even at an odd addresses. For these machines, @code{__alignof__} ++reports the @emph{recommended} alignment of a type. ++ ++When the operand of @code{__alignof__} is an lvalue rather than a type, the ++value is the largest alignment that the lvalue is known to have. It may ++have this alignment as a result of its data type, or because it is part of ++a structure and inherits alignment from that structure. For example, after ++this declaration: ++ ++@example ++struct foo @{ int x; char y; @} foo1; ++@end example ++ ++@noindent ++the value of @code{__alignof__ (foo1.y)} is probably 2 or 4, the same as ++@code{__alignof__ (int)}, even though the data type of @code{foo1.y} ++does not itself demand any alignment.@refill ++ ++@node Inline, Extended Asm, Alignment, Extensions ++@section An Inline Function is As Fast As a Macro ++ ++By declaring a function @code{inline}, you can direct GNU CC to integrate ++that function's code into the code for its callers. This makes execution ++faster by eliminating the function-call overhead; in addition, if any of ++the actual argument values are constant, their known values may permit ++simplifications at compile time so that not all of the inline function's ++code needs to be included. ++ ++To declare a function inline, use the @code{inline} keyword in its ++declaration, like this: ++ ++@example ++inline int ++inc (int *a) ++@{ ++ (*a)++; ++@} ++@end example ++ ++(If you are writing a header file to be included in ANSI C programs, write ++@code{__inline__} instead of @code{inline}. @xref{Alternate Keywords}.) ++ ++You can also make all ``simple enough'' functions inline with the option ++@samp{-finline-functions}. Note that certain usages in a function ++definition can make it unsuitable for inline substitution. ++ ++When a function is both inline and @code{static}, if all calls to the ++function are integrated into the caller, and the function's address is ++never used, then the function's own assembler code is never referenced. ++In this case, GNU CC does not actually output assembler code for the ++function, unless you specify the option @samp{-fkeep-inline-functions}. ++Some calls cannot be integrated for various reasons (in particular, ++calls that precede the function's definition cannot be integrated, and ++neither can recursive calls within the definition). If there is a ++nonintegrated call, then the function is compiled to assembler code as ++usual. The function must also be compiled as usual if the program ++refers to its address, because that can't be inlined. ++ ++When an inline function is not @code{static}, then the compiler must assume ++that there may be calls from other source files; since a global symbol can ++be defined only once in any program, the function must not be defined in ++the other source files, so the calls therein cannot be integrated. ++Therefore, a non-@code{static} inline function is always compiled on its ++own in the usual fashion. ++ ++If you specify both @code{inline} and @code{extern} in the function ++definition, then the definition is used only for inlining. In no case ++is the function compiled on its own, not even if you refer to its ++address explicitly. Such an address becomes an external reference, as ++if you had only declared the function, and had not defined it. ++ ++This combination of @code{inline} and @code{extern} has almost the ++effect of a macro. The way to use it is to put a function definition in ++a header file with these keywords, and put another copy of the ++definition (lacking @code{inline} and @code{extern}) in a library file. ++The definition in the header file will cause most calls to the function ++to be inlined. If any uses of the function remain, they will refer to ++the single copy in the library. ++ ++@node Extended Asm, Asm Labels, Inline, Extensions ++@section Assembler Instructions with C Expression Operands ++ ++In an assembler instruction using @code{asm}, you can now specify the ++operands of the instruction using C expressions. This means no more ++guessing which registers or memory locations will contain the data you want ++to use. ++ ++You must specify an assembler instruction template much like what appears ++in a machine description, plus an operand constraint string for each ++operand. ++ ++For example, here is how to use the 68881's @code{fsinx} instruction: ++ ++@example ++asm ("fsinx %1,%0" : "=f" (result) : "f" (angle)); ++@end example ++ ++@noindent ++Here @code{angle} is the C expression for the input operand while ++@code{result} is that of the output operand. Each has @samp{"f"} as its ++operand constraint, saying that a floating-point register is required. The ++@samp{=} in @samp{=f} indicates that the operand is an output; all output ++operands' constraints must use @samp{=}. The constraints use the same ++language used in the machine description (@pxref{Constraints}). ++ ++Each operand is described by an operand-constraint string followed by the C ++expression in parentheses. A colon separates the assembler template from ++the first output operand, and another separates the last output operand ++from the first input, if any. Commas separate output operands and separate ++inputs. The total number of operands is limited to the maximum number of ++operands in any instruction pattern in the machine description. ++ ++If there are no output operands, and there are input operands, then there ++must be two consecutive colons surrounding the place where the output ++operands would go. ++ ++Output operand expressions must be lvalues; the compiler can check this. ++The input operands need not be lvalues. The compiler cannot check whether ++the operands have data types that are reasonable for the instruction being ++executed. It does not parse the assembler instruction template and does ++not know what it means, or whether it is valid assembler input. The ++extended @code{asm} feature is most often used for machine instructions ++that the compiler itself does not know exist. ++ ++The output operands must be write-only; GNU CC will assume that the values ++in these operands before the instruction are dead and need not be ++generated. Extended asm does not support input-output or read-write ++operands. For this reason, the constraint character @samp{+}, which ++indicates such an operand, may not be used. ++ ++When the assembler instruction has a read-write operand, or an operand ++in which only some of the bits are to be changed, you must logically ++split its function into two separate operands, one input operand and one ++write-only output operand. The connection between them is expressed by ++constraints which say they need to be in the same location when the ++instruction executes. You can use the same C expression for both ++operands, or different expressions. For example, here we write the ++(fictitious) @samp{combine} instruction with @code{bar} as its read-only ++source operand and @code{foo} as its read-write destination: ++ ++@example ++asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar)); ++@end example ++ ++@noindent ++The constraint @samp{"0"} for operand 1 says that it must occupy the same ++location as operand 0. A digit in constraint is allowed only in an input ++operand, and it must refer to an output operand. ++ ++Only a digit in the constraint can guarantee that one operand will be in ++the same place as another. The mere fact that @code{foo} is the value of ++both operands is not enough to guarantee that they will be in the same ++place in the generated assembler code. The following would not work: ++ ++@example ++asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar)); ++@end example ++ ++Various optimizations or reloading could cause operands 0 and 1 to be in ++different registers; GNU CC knows no reason not to do so. For example, the ++compiler might find a copy of the value of @code{foo} in one register and ++use it for operand 1, but generate the output operand 0 in a different ++register (copying it afterward to @code{foo}'s own address). Of course, ++since the register for operand 1 is not even mentioned in the assembler ++code, the result will not work, but GNU CC can't tell that. ++ ++Unless an output operand has the @samp{&} constraint modifier, GNU CC may ++allocate it in the same register as an unrelated input operand, on the ++assumption that the inputs are consumed before the outputs are produced. ++This assumption may be false if the assembler code actually consists of ++more than one instruction. In such a case, use @samp{&} for each output ++operand that may not overlap an input. @xref{Modifiers}. ++ ++Some instructions clobber specific hard registers. To describe this, write ++a third colon after the input operands, followed by the names of the ++clobbered hard registers (given as strings). Here is a realistic example ++for the vax: ++ ++@example ++asm volatile ("movc3 %0,%1,%2" ++ : /* no outputs */ ++ : "g" (from), "g" (to), "g" (count) ++ : "r0", "r1", "r2", "r3", "r4", "r5"); ++@end example ++ ++You can put multiple assembler instructions together in a single @code{asm} ++template, separated either with newlines (written as @samp{\n}) or with ++semicolons if the assembler allows such semicolons. The GNU assembler ++allows semicolons and all Unix assemblers seem to do so. The input ++operands are guaranteed not to use any of the clobbered registers, and ++neither will the output operands' addresses, so you can read and write the ++clobbered registers as many times as you like. Here is an example of ++multiple instructions in a template; it assumes that the subroutine ++@code{_foo} accepts arguments in registers 9 and 10: ++ ++@example ++asm ("movl %0,r9;movl %1,r10;call _foo" ++ : /* no outputs */ ++ : "g" (from), "g" (to) ++ : "r9", "r10"); ++@end example ++ ++If you want to test the condition code produced by an assembler instruction, ++you must include a branch and a label in the @code{asm} construct, as follows: ++ ++@example ++asm ("clr %0;frob %1;beq 0f;mov #1,%0;0:" ++ : "g" (result) ++ : "g" (input)); ++@end example ++ ++@noindent ++This assumes your assembler supports local labels, as the GNU assembler ++and most Unix assemblers do. ++ ++Usually the most convenient way to use these @code{asm} instructions is to ++encapsulate them in macros that look like functions. For example, ++ ++@example ++#define sin(x) \ ++(@{ double __value, __arg = (x); \ ++ asm ("fsinx %1,%0": "=f" (__value): "f" (__arg)); \ ++ __value; @}) ++@end example ++ ++@noindent ++Here the variable @code{__arg} is used to make sure that the instruction ++operates on a proper @code{double} value, and to accept only those ++arguments @code{x} which can convert automatically to a @code{double}. ++ ++Another way to make sure the instruction operates on the correct data type ++is to use a cast in the @code{asm}. This is different from using a ++variable @code{__arg} in that it converts more different types. For ++example, if the desired type were @code{int}, casting the argument to ++@code{int} would accept a pointer with no complaint, while assigning the ++argument to an @code{int} variable named @code{__arg} would warn about ++using a pointer unless the caller explicitly casts it. ++ ++If an @code{asm} has output operands, GNU CC assumes for optimization ++purposes that the instruction has no side effects except to change the ++output operands. This does not mean that instructions with a side effect ++cannot be used, but you must be careful, because the compiler may eliminate ++them if the output operands aren't used, or move them out of loops, or ++replace two with one if they constitute a common subexpression. Also, if ++your instruction does have a side effect on a variable that otherwise ++appears not to change, the old value of the variable may be reused later if ++it happens to be found in a register. ++ ++You can prevent an @code{asm} instruction from being deleted, moved or ++combined by writing the keyword @code{volatile} after the @code{asm}. For ++example: ++ ++@example ++#define set_priority(x) \ ++asm volatile ("set_priority %0": /* no outputs */ : "g" (x)) ++@end example ++ ++@noindent ++(However, an instruction without output operands will not be deleted ++or moved, regardless, unless it is unreachable.) ++ ++It is a natural idea to look for a way to give access to the condition ++code left by the assembler instruction. However, when we attempted to ++implement this, we found no way to make it work reliably. The problem ++is that output operands might need reloading, which would result in ++additional following ``store'' instructions. On most machines, these ++instructions would alter the condition code before there was time to ++test it. This problem doesn't arise for ordinary ``test'' and ++``compare'' instructions because they don't have any output operands. ++ ++If you are writing a header file that should be includable in ANSI C ++programs, write @code{__asm__} instead of @code{asm}. @xref{Alternate ++Keywords}. ++ ++@node Asm Labels, Explicit Reg Vars, Extended Asm, Extensions ++@section Controlling Names Used in Assembler Code ++ ++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: ++ ++@example ++int foo asm ("myfoo") = 2; ++@end example ++ ++@noindent ++This specifies that the name to be used for the variable @code{foo} in ++the assembler code should be @samp{myfoo} rather than the usual ++@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 ++linker that do not start with an underscore. ++ ++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: ++ ++@example ++extern func () asm ("FUNC"); ++ ++func (x, y) ++ int x, y; ++@dots{} ++@end example ++ ++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. GNU ++CC does not as yet have the ability to store static variables in registers. ++Perhaps that will be added. ++ ++@node Explicit Reg Vars, Alternate Keywords, Asm Labels, Extensions ++@section Variables in Specified Registers ++ ++GNU C allows you to put a few global variables into specified hardware ++registers. You can also specify the register in which an ordinary ++register variable should be allocated. ++ ++@itemize @bullet ++@item ++Global register variables reserve registers throughout the program. ++This may be useful in programs such as programming language ++interpreters which have a couple of global variables that are accessed ++very often. ++ ++@item ++Local register variables in specific registers do not reserve the ++registers. The compiler's data flow analysis is capable of ++determining where the specified registers contain live values, and ++where they are available for other uses. These local variables are ++sometimes convenient for use with the extended @code{asm} feature ++(@pxref{Extended Asm}). ++@end itemize ++ ++@menu ++* Global Reg Vars:: ++* Local Reg Vars:: ++@end menu ++ ++@node Global Reg Vars, Local Reg Vars, Explicit Reg Vars, Explicit Reg Vars ++@subsection Defining Global Register Variables ++ ++You can define a global register variable in GNU C like this: ++ ++@example ++register int *foo asm ("a5"); ++@end example ++ ++@noindent ++Here @code{a5} is the name of the register which should be used. Choose a ++register which is normally saved and restored by function calls on your ++machine, so that library routines will not clobber it. ++ ++Naturally the register name is cpu-dependent, so you would need to ++conditionalize your program according to cpu type. The register ++@code{a5} would be a good choice on a 68000 for a variable of pointer ++type. On machines with register windows, be sure to choose a ``global'' ++register that is not affected magically by the function call mechanism. ++ ++In addition, operating systems on one type of cpu may differ in how they ++name the registers; then you would need additional conditionals. For ++example, some 68000 operating systems call this register @code{%a5}. ++ ++Eventually there may be a way of asking the compiler to choose a register ++automatically, but first we need to figure out how it should choose and ++how to enable you to guide the choice. No solution is evident. ++ ++Defining a global register variable in a certain register reserves that ++register entirely for this use, at least within the current compilation. ++The register will not be allocated for any other purpose in the functions ++in the current compilation. The register will not be saved and restored by ++these functions. Stores into this register are never deleted even if they ++would appear to be dead, but references may be deleted or moved or ++simplified. ++ ++It is not safe to access the global register variables from signal ++handlers, or from more than one thread of control, because the system ++library routines may temporarily use the register for other things (unless ++you recompile them specially for the task at hand). ++ ++It is not safe for one function that uses a global register variable to ++call another such function @code{foo} by way of a third function ++@code{lose} that was compiled without knowledge of this variable (i.e. in a ++different source file in which the variable wasn't declared). This is ++because @code{lose} might save the register and put some other value there. ++For example, you can't expect a global register variable to be available in ++the comparison-function that you pass to @code{qsort}, since @code{qsort} ++might have put something else in that register. (If you are prepared to ++recompile @code{qsort} with the same global register variable, you can ++solve this problem.) ++ ++If you want to recompile @code{qsort} or other source files which do not ++actually use your global register variable, so that they will not use that ++register for any other purpose, then it suffices to specify the compiler ++option @samp{-ffixed-@var{reg}}. You need not actually add a global ++register declaration to their source code. ++ ++A function which can alter the value of a global register variable cannot ++safely be called from a function compiled without this variable, because it ++could clobber the value the caller expects to find there on return. ++Therefore, the function which is the entry point into the part of the ++program that uses the global register variable must explicitly save and ++restore the value which belongs to its caller. ++ ++On most machines, @code{longjmp} will restore to each global register ++variable the value it had at the time of the @code{setjmp}. On some ++machines, however, @code{longjmp} will not change the value of global ++register variables. To be portable, the function that called @code{setjmp} ++should make other arrangements to save the values of the global register ++variables, and to restore them in a @code{longjmp}. This way, the same ++thing will happen regardless of what @code{longjmp} does. ++ ++All global register variable declarations must precede all function ++definitions. If such a declaration could appear after function ++definitions, the declaration would be too late to prevent the register from ++being used for other purposes in the preceding functions. ++ ++Global register variables may not have initial values, because an ++executable file has no means to supply initial contents for a register. ++ ++@node Local Reg Vars,, Global Reg Vars, Explicit Reg Vars ++@subsection Specifying Registers for Local Variables ++ ++You can define a local register variable with a specified register ++like this: ++ ++@example ++register int *foo asm ("a5"); ++@end example ++ ++@noindent ++Here @code{a5} is the name of the register which should be used. Note ++that this is the same syntax used for defining global register ++variables, but for a local variable it would appear within a function. ++ ++Naturally the register name is cpu-dependent, but this is not a ++problem, since specific registers are most often useful with explicit ++assembler instructions (@pxref{Extended Asm}). Both of these things ++generally require that you conditionalize your program according to ++cpu type. ++ ++In addition, operating systems on one type of cpu may differ in how they ++name the registers; then you would need additional conditionals. For ++example, some 68000 operating systems call this register @code{%a5}. ++ ++Eventually there may be a way of asking the compiler to choose a register ++automatically, but first we need to figure out how it should choose and ++how to enable you to guide the choice. No solution is evident. ++ ++Defining such a register variable does not reserve the register; it ++remains available for other uses in places where flow control determines ++the variable's value is not live. However, these registers are made ++unavailable for use in the reload pass. I would not be surprised if ++excessive use of this feature leaves the compiler too few available ++registers to compile certain functions. ++ ++@node Alternate Keywords,, Explicit Reg Vars, Extensions ++@section Alternate Keywords ++ ++The option @samp{-traditional} disables certain keywords; @samp{-ansi} ++disables certain others. This causes trouble when you want to use GNU C ++extensions, or ANSI C features, in a general-purpose header file that ++should be usable by all programs, including ANSI C programs and traditional ++ones. The keywords @code{asm}, @code{typeof} and @code{inline} cannot be ++used since they won't work in a program compiled with @samp{-ansi}, while ++the keywords @code{const}, @code{volatile}, @code{signed}, @code{typeof} ++and @code{inline} won't work in a program compiled with ++@samp{-traditional}.@refill ++ ++The way to solve these problems is to put @samp{__} at the beginning and ++end of each problematical keyword. For example, use @code{__asm__} ++instead of @code{asm}, @code{__const__} instead of @code{const}, and ++@code{__inline__} instead of @code{inline}. ++ ++Other C compilers won't accept these alternative keywords; if you want to ++compile with another compiler, you can define the alternate keywords as ++macros to replace them with the customary keywords. It looks like this: ++ ++@example ++#ifndef __GNUC__ ++#define __asm__ asm ++#endif ++@end example ++ ++@node Bugs, Portability, Extensions, Top ++@chapter Reporting Bugs ++ ++Your bug reports play an essential role in making GNU CC reliable. ++ ++When you encounter a problem, the first thing to do is to see if it is ++already known. @xref{Trouble}. Also look in @ref{Incompatibilities}. ++If it isn't known, then you should report the problem. ++ ++Reporting a bug may help you by bringing a solution to your problem, or ++it may not. (If it does not, look in the service directory; see ++@ref{Service}.) In any case, the principal function of a bug report ++is to help the entire community by making the next version of GNU CC ++work better. Bug reports are your contribution to the maintenance of ++GNU CC. ++ ++In order for a bug report to serve its purpose, you must include the ++information that makes for fixing the bug. ++ ++@menu ++* Criteria: Bug Criteria. Have you really found a bug? ++* Reporting: Bug Reporting. How to report a bug effectively. ++@end menu ++ ++@node Bug Criteria, Bug Reporting, Bugs, Bugs ++@section Have You Found a Bug? ++ ++If you are not sure whether you have found a bug, here are some guidelines: ++ ++@itemize @bullet ++@item ++If the compiler gets a fatal signal, for any input whatever, that is a ++compiler bug. Reliable compilers never crash. ++ ++@item ++If the compiler produces invalid assembly code, for any input whatever ++(except an @code{asm} statement), that is a compiler bug, unless the ++compiler reports errors (not just warnings) which would ordinarily ++prevent the assembler from being run. ++ ++@item ++If the compiler produces valid assembly code that does not correctly ++execute the input source code, that is a compiler bug. ++ ++However, you must double-check to make sure, because you may have run ++into an incompatibility between GNU C and traditional C ++(@pxref{Incompatibilities}). These incompatibilities might be considered ++bugs, but they are inescapable consequences of valuable features. ++ ++Or you may have a program whose behavior is undefined, which happened ++by chance to give the desired results with another C compiler. ++ ++For example, in many nonoptimizing compilers, you can write @samp{x;} ++at the end of a function instead of @samp{return x;}, with the same ++results. But the value of the function is undefined if @code{return} ++is omitted; it is not a bug when GNU CC produces different results. ++ ++Problems often result from expressions with two increment operators, ++as in @code{f (*p++, *p++)}. Your previous compiler might have ++interpreted that expression the way you intended; GNU CC might ++interpret it another way. Neither compiler is wrong. The bug is ++in your code. ++ ++After you have localized the error to a single source line, it should ++be easy to check for these things. If your program is correct and ++well defined, you have found a compiler bug. ++ ++@item ++If the compiler produces an error message for valid input, that is a ++compiler bug. ++ ++Note that the following is not valid input, and the error message for ++it is not a bug: ++ ++@example ++int foo (char); ++ ++int ++foo (x) ++ char x; ++@{ @dots{} @} ++@end example ++ ++@noindent ++The prototype says to pass a @code{char}, while the definition says to ++pass an @code{int} and treat the value as a @code{char}. This is what ++the ANSI standard says, and it makes sense. ++ ++@item ++If the compiler does not produce an error message for invalid input, ++that is a compiler bug. However, you should note that your idea of ++``invalid input'' might be my idea of ``an extension'' or ``support ++for traditional practice''. ++ ++@item ++If you are an experienced user of C compilers, your suggestions ++for improvement of GNU CC are welcome in any case. ++@end itemize ++ ++@node Bug Reporting,, Bug Criteria, Bugs ++@section How to Report Bugs ++ ++Send bug reports for GNU C to one of these addresses: ++ ++@example ++bug-gcc@@prep.ai.mit.edu ++@{ucbvax|mit-eddie|uunet@}!prep.ai.mit.edu!bug-gcc ++@end example ++ ++@strong{Do not send bug reports to @samp{help-gcc}, or to the newsgroup ++@samp{gnu.gcc.help}.} Most users of GNU CC do not want to receive bug ++reports. Those that do, have asked to be on @samp{bug-gcc}. ++ ++The mailing list @samp{bug-gcc} has a newsgroup which serves as a ++repeater. The mailing list and the newsgroup carry exactly the same ++messages. Often people think of posting bug reports to the newsgroup ++instead of mailing them. This appears to work, but it has one problem ++which can be crucial: a newsgroup posting does not contain a mail path ++back to the sender. Thus, if I need to ask for more information, I ++may be unable to reach you. For this reason, it is better to send bug ++reports to the mailing list. ++ ++As a last resort, send bug reports on paper to: ++ ++@example ++GNU Compiler Bugs ++Free Software Foundation ++675 Mass Ave ++Cambridge, MA 02139 ++@end example ++ ++The fundamental principle of reporting bugs usefully is this: ++@strong{report all the facts}. If you are not sure whether to state a ++fact or leave it out, state it! ++ ++Often people omit facts because they think they know what causes the ++problem and they conclude that some details don't matter. Thus, you might ++assume that the name of the variable you use in an example does not matter. ++Well, probably it doesn't, but one cannot be sure. Perhaps the bug is a ++stray memory reference which happens to fetch from the location where that ++name is stored in memory; perhaps, if the name were different, the contents ++of that location would fool the compiler into doing the right thing despite ++the bug. Play it safe and give a specific, complete example. That is the ++easiest thing for you to do, and the most helpful. ++ ++Keep in mind that the purpose of a bug report is to enable me to fix ++the bug if it is not known. It isn't very important what happens if ++the bug is already known. Therefore, always write your bug reports on ++the assumption that the bug is not known. ++ ++Sometimes people give a few sketchy facts and ask, ``Does this ring a ++bell?'' Those bug reports are useless, and I urge everyone to ++@emph{refuse to respond to them} except to chide the sender to report ++bugs properly. ++ ++To enable me to fix the bug, you should include all these things: ++ ++@itemize @bullet ++@item ++The version of GNU CC. You can get this by running it with the ++@samp{-v} option. ++ ++Without this, I won't know whether there is any point in looking for ++the bug in the current version of GNU CC. ++ ++@item ++A complete input file that will reproduce the bug. If the bug is in ++the C preprocessor, send me a source file and any header files that it ++requires. If the bug is in the compiler proper (@file{cc1}), run your ++source file through the C preprocessor by doing @samp{gcc -E ++@var{sourcefile} > @var{outfile}}, then include the contents of ++@var{outfile} in the bug report. (Any @samp{-I}, @samp{-D} or ++@samp{-U} options that you used in actual compilation should also be ++used when doing this.) ++ ++A single statement is not enough of an example. In order to compile ++it, it must be embedded in a function definition; and the bug might ++depend on the details of how this is done. ++ ++Without a real example I can compile, all I can do about your bug ++report is wish you luck. It would be futile to try to guess how to ++provoke the bug. For example, bugs in register allocation and ++reloading frequently depend on every little detail of the function ++they happen in. ++ ++@item ++The command arguments you gave GNU CC to compile that example and ++observe the bug. For example, did you use @samp{-O}? To guarantee ++you won't omit something important, list them all. ++ ++If I were to try to guess the arguments, I would probably guess wrong ++and then I would not encounter the bug. ++ ++@item ++The names of the files that you used for @file{tm.h} and @file{md} ++when you installed the compiler. ++ ++@item ++The type of machine you are using, and the operating system name and ++version number. ++ ++@item ++A description of what behavior you observe that you believe is ++incorrect. For example, ``It gets a fatal signal,'' or, ``There is an ++incorrect assembler instruction in the output.'' ++ ++Of course, if the bug is that the compiler gets a fatal signal, then I ++will certainly notice it. But if the bug is incorrect output, I might ++not notice unless it is glaringly wrong. I won't study all the ++assembler code from a 50-line C program just on the off chance that it ++might be wrong. ++ ++Even if the problem you experience is a fatal signal, you should still ++say so explicitly. Suppose something strange is going on, such as, ++your copy of the compiler is out of synch, or you have encountered a ++bug in the C library on your system. (This has happened!) Your copy ++might crash and mine would not. If you @i{told} me to expect a crash, ++then when mine fails to crash, I would know that the bug was not ++happening for me. If you had not told me to expect a crash, then I ++would not be able to draw any conclusion from my observations. ++ ++Often the observed symptom is incorrect output when your program is run. ++Sad to say, this is not enough information for me unless the program is ++short and simple. If you send me a large program, I don't have time to ++figure out how it would work if compiled correctly, much less which line ++of it was compiled wrong. So you will have to do that. Tell me which ++source line it is, and what incorrect result happens when that line is ++executed. A person who understands the test program can find this as ++easily as a bug in the program itself. ++ ++@item ++If you send me examples of output from GNU CC, please use @samp{-g} ++when you make them. The debugging information includes source line ++numbers which are essential for correlating the output with the input. ++ ++@item ++If you wish to suggest changes to the GNU CC source, send me context ++diffs. If you even discuss something in the GNU CC source, refer to ++it by context, not by line number. ++ ++The line numbers in my development sources don't match those in your ++sources. Your line numbers would convey no useful information to me. ++ ++@item ++Additional information from a debugger might enable me to find ++a problem on a machine which I do not have available myself. ++However, you need to think when you collect this information if ++you want it to have any chance of being useful. ++ ++For example, many people send just a backtrace, but that is never ++useful by itself. A simple backtrace with arguments conveys little ++about GNU CC because the compiler is largely data-driven; the same ++functions are called over and over for different RTL insns, doing ++different things depending on the details of the insn. ++ ++Most of the arguments listed in the backtrace are useless because they ++are pointers to RTL list structure. The numeric values of the ++pointers, which the debugger prints in the backtrace, have no ++significance whatever; all that matters is the contents of the objects ++they point to (and most of the contents are other such pointers). ++ ++In addition, most compiler passes consist of one or more loops that ++scan the RTL insn sequence. The most vital piece of information about ++such a loop---which insn it has reached---is usually in a local variable, ++not in an argument. ++ ++What you need to provide in addition to a backtrace are the values of ++the local variables for several stack frames up. When a local ++variable or an argument is an RTX, first print its value and then use ++the GDB command @code{pr} to print the RTL expression that it points ++to. (If GDB doesn't run on your machine, use your debugger to call ++the function @code{debug_rtx} with the RTX as an argument.) In ++general, whenever a variable is a pointer, its value is no use ++without the data it points to. ++ ++In addition, include a debugging dump from just before the pass ++in which the crash happens. Most bugs involve a series of insns, ++not just one. ++@end itemize ++ ++Here are some things that are not necessary: ++ ++@itemize @bullet ++@item ++A description of the envelope of the bug. ++ ++Often people who encounter a bug spend a lot of time investigating ++which changes to the input file will make the bug go away and which ++changes will not affect it. ++ ++This is often time consuming and not very useful, because the way I ++will find the bug is by running a single example under the debugger ++with breakpoints, not by pure deduction from a series of examples. ++I recommend that you save your time for something else. ++ ++Of course, if you can find a simpler example to report @emph{instead} ++of the original one, that is a convenience for me. Errors in the ++output will be easier to spot, running under the debugger will take ++less time, etc. Most GNU CC bugs involve just one function, so the ++most straightforward way to simplify an example is to delete all the ++function definitions except the one where the bug occurs. Those ++earlier in the file may be replaced by external declarations if the ++crucial function depends on them. (Exception: inline functions may ++affect compilation of functions defined later in the file.) ++ ++However, simplification is not vital; if you don't want to do this, ++report the bug anyway and send me the entire test case you used. ++ ++@item ++A patch for the bug. ++ ++A patch for the bug does help me if it is a good one. But don't omit ++the necessary information, such as the test case, on the assumption that ++a patch is all I need. I might see problems with your patch and decide ++to fix the problem another way, or I might not understand it at all. ++ ++Sometimes with a program as complicated as GNU CC it is very hard to ++construct an example that will make the program follow a certain path ++through the code. If you don't send me the example, I won't be able ++to construct one, so I won't be able to verify that the bug is fixed. ++ ++And if I can't understand what bug you are trying to fix, or why your ++patch should be an improvement, I won't install it. A test case will ++help me to understand. ++ ++@item ++A guess about what the bug is or what it depends on. ++ ++Such guesses are usually wrong. Even I can't guess right about such ++things without first using the debugger to find the facts. ++@end itemize ++ ++@node Portability, Interface, Bugs, Top ++@chapter GNU CC and Portability ++ ++The main goal of GNU CC was to make a good, fast compiler for machines in ++the class that the GNU system aims to run on: 32-bit machines that address ++8-bit bytes and have several general registers. Elegance, theoretical ++power and simplicity are only secondary. ++ ++GNU CC gets most of the information about the target machine from a machine ++description which gives an algebraic formula for each of the machine's ++instructions. This is a very clean way to describe the target. But when ++the compiler needs information that is difficult to express in this ++fashion, I have not hesitated to define an ad-hoc parameter to the machine ++description. The purpose of portability is to reduce the total work needed ++on the compiler; it was not of interest for its own sake. ++ ++GNU CC does not contain machine dependent code, but it does contain code ++that depends on machine parameters such as endianness (whether the most ++significant byte has the highest or lowest address of the bytes in a word) ++and the availability of autoincrement addressing. In the RTL-generation ++pass, it is often necessary to have multiple strategies for generating code ++for a particular kind of syntax tree, strategies that are usable for different ++combinations of parameters. Often I have not tried to address all possible ++cases, but only the common ones or only the ones that I have encountered. ++As a result, a new target may require additional strategies. You will know ++if this happens because the compiler will call @code{abort}. Fortunately, ++the new strategies can be added in a machine-independent fashion, and will ++affect only the target machines that need them. ++ ++@node Interface, Passes, Portability, Top ++@chapter Interfacing to GNU CC Output ++ ++GNU CC is normally configured to use the same function calling convention ++normally in use on the target system. This is done with the ++machine-description macros described (@pxref{Machine Macros}). ++ ++However, returning of structure and union values is done differently on ++some target machines. As a result, functions compiled with PCC ++returning such types cannot be called from code compiled with GNU CC, ++and vice versa. This does not cause trouble often because few Unix ++library routines return structures or unions. ++ ++GNU CC code returns structures and unions that are 1, 2, 4 or 8 bytes ++long in the same registers used for @code{int} or @code{double} return ++values. (GNU CC typically allocates variables of such types in ++registers also.) Structures and unions of other sizes are returned by ++storing them into an address passed by the caller (usually in a ++register). The machine-description macros @code{STRUCT_VALUE} and ++@code{STRUCT_INCOMING_VALUE} tell GNU CC where to pass this address. ++ ++By contrast, PCC on most target machines returns structures and unions ++of any size by copying the data into an area of static storage, and then ++returning the address of that storage as if it were a pointer value. ++The caller must copy the data from that memory area to the place where ++the value is wanted. This is slower than the method used by GNU CC, and ++fails to be reentrant. ++ ++On some target machines, such as RISC machines and the 80386, the ++standard system convention is to pass to the subroutine the address of ++where to return the value. On these machines, GNU CC has been ++configured to be compatible with the standard compiler, when this method ++is used. It may not be compatible for structures of 1, 2, 4 or 8 bytes. ++ ++GNU CC uses the system's standard convention for passing arguments. On ++some machines, the first few arguments are passed in registers; in ++others, all are passed on the stack. It would be possible to use ++registers for argument passing on any machine, and this would probably ++result in a significant speedup. But the result would be complete ++incompatibility with code that follows the standard convention. So this ++change is practical only if you are switching to GNU CC as the sole C ++compiler for the system. We may implement register argument passing on ++certain machines once we have a complete GNU system so that we can ++compile the libraries with GNU CC. ++ ++If you use @code{longjmp}, beware of automatic variables. ANSI C says that ++automatic variables that are not declared @code{volatile} have undefined ++values after a @code{longjmp}. And this is all GNU CC promises to do, ++because it is very difficult to restore register variables correctly, and ++one of GNU CC's features is that it can put variables in registers without ++your asking it to. ++ ++If you want a variable to be unaltered by @code{longjmp}, and you don't ++want to write @code{volatile} because old C compilers don't accept it, ++just take the address of the variable. If a variable's address is ever ++taken, even if just to compute it and ignore it, then the variable cannot ++go in a register: ++ ++@example ++@{ ++ int careful; ++ &careful; ++ @dots{} ++@} ++@end example ++ ++Code compiled with GNU CC may call certain library routines. Most of ++them handle arithmetic for which there are no instructions. This ++includes multiply and divide on some machines, and floating point ++operations on any machine for which floating point support is disabled ++with @samp{-msoft-float}. Some standard parts of the C library, such as ++@code{bcopy} or @code{memcpy}, are also called automatically. The usual ++function call interface is used for calling the library routines. ++ ++These library routines should be defined in the library @file{gnulib}, ++which GNU CC automatically searches whenever it links a program. On ++machines that have multiply and divide instructions, if hardware ++floating point is in use, normally @file{gnulib} is not needed, but it ++is searched just in case. ++ ++Each arithmetic function is defined in @file{gnulib.c} to use the ++corresponding C arithmetic operator. As long as the file is compiled ++with another C compiler, which supports all the C arithmetic operators, ++this file will work portably. However, @file{gnulib.c} does not work if ++compiled with GNU CC, because each arithmetic function would compile ++into a call to itself! ++ ++@node Passes, RTL, Interface, Top ++@chapter Passes and Files of the Compiler ++ ++The overall control structure of the compiler is in @file{toplev.c}. This ++file is responsible for initialization, decoding arguments, opening and ++closing files, and sequencing the passes. ++ ++The parsing pass is invoked only once, to parse the entire input. The RTL ++intermediate code for a function is generated as the function is parsed, a ++statement at a time. Each statement is read in as a syntax tree and then ++converted to RTL; then the storage for the tree for the statement is ++reclaimed. Storage for types (and the expressions for their sizes), ++declarations, and a representation of the binding contours and how they nest, ++remains until the function is finished being compiled; these are all needed ++to output the debugging information. ++ ++Each time the parsing pass reads a complete function definition or ++top-level declaration, it calls the function ++@code{rest_of_compilation} or @code{rest_of_decl_compilation} in ++@file{toplev.c}, which are responsible for all further processing ++necessary, ending with output of the assembler language. All other ++compiler passes run, in sequence, within @code{rest_of_compilation}. ++When that function returns from compiling a function definition, the ++storage used for that function definition's compilation is entirely ++freed, unless it is an inline function (@pxref{Inline}). ++ ++Here is a list of all the passes of the compiler and their source files. ++Also included is a description of where debugging dumps can be requested ++with @samp{-d} options. ++ ++@itemize @bullet ++@item ++Parsing. This pass reads the entire text of a function definition, ++constructing partial syntax trees. This and RTL generation are no longer ++truly separate passes (formerly they were), but it is easier to think ++of them as separate. ++ ++The tree representation does not entirely follow C syntax, because it is ++intended to support other languages as well. ++ ++C data type analysis is also done in this pass, and every tree node ++that represents an expression has a data type attached. Variables are ++represented as declaration nodes. ++ ++Constant folding and associative-law simplifications are also done ++during this pass. ++ ++The source files for parsing are @file{c-parse.y}, @file{c-decl.c}, ++@file{c-typeck.c}, @file{c-convert.c}, @file{stor-layout.c}, ++@file{fold-const.c}, and @file{tree.c}. The last three files are ++intended to be language-independent. There are also header files ++@file{c-parse.h}, @file{c-tree.h}, @file{tree.h} and @file{tree.def}. ++The last two define the format of the tree representation.@refill ++ ++@item ++RTL generation. This is the conversion of syntax tree into RTL code. ++It is actually done statement-by-statement during parsing, but for ++most purposes it can be thought of as a separate pass. ++ ++This is where the bulk of target-parameter-dependent code is found, ++since often it is necessary for strategies to apply only when certain ++standard kinds of instructions are available. The purpose of named ++instruction patterns is to provide this information to the RTL ++generation pass. ++ ++Optimization is done in this pass for @code{if}-conditions that are ++comparisons, boolean operations or conditional expressions. Tail ++recursion is detected at this time also. Decisions are made about how ++best to arrange loops and how to output @code{switch} statements. ++ ++The source files for RTL generation are @file{stmt.c}, @file{expr.c}, ++@file{explow.c}, @file{expmed.c}, @file{optabs.c} and @file{emit-rtl.c}. ++Also, the file @file{insn-emit.c}, generated from the machine description ++by the program @code{genemit}, is used in this pass. The header files ++@file{expr.h} is used for communication within this pass.@refill ++ ++The header files @file{insn-flags.h} and @file{insn-codes.h}, ++generated from the machine description by the programs @code{genflags} ++and @code{gencodes}, tell this pass which standard names are available ++for use and which patterns correspond to them.@refill ++ ++Aside from debugging information output, none of the following passes ++refers to the tree structure representation of the function (only ++part of which is saved). ++ ++The decision of whether the function can and should be expanded inline ++in its subsequent callers is made at the end of rtl generation. The ++function must meet certain criteria, currently related to the size of ++the function and the types and number of parameters it has. Note that ++this function may contain loops, recursive calls to itself ++(tail-recursive functions can be inlined!), gotos, in short, all ++constructs supported by GNU CC. ++ ++The option @samp{-dr} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.rtl} to ++the input file name. ++ ++@item ++Jump optimization. This pass simplifies jumps to the following ++instruction, jumps across jumps, and jumps to jumps. It deletes ++unreferenced labels and unreachable code, except that unreachable code ++that contains a loop is not recognized as unreachable in this pass. ++(Such loops are deleted later in the basic block analysis.) ++ ++Jump optimization is performed two or three times. The first time is ++immediately following RTL generation. The second time is after CSE, ++but only if CSE says repeated jump optimization is needed. The ++last time is right before the final pass. That time, cross-jumping ++and deletion of no-op move instructions are done together with the ++optimizations described above. ++ ++The source file of this pass is @file{jump.c}. ++ ++The option @samp{-dj} causes a debugging dump of the RTL code after ++this pass is run for the first time. This dump file's name is made by ++appending @samp{.jump} to the input file name. ++ ++@item ++Register scan. This pass finds the first and last use of each ++register, as a guide for common subexpression elimination. Its source ++is in @file{regclass.c}. ++ ++@item ++Common subexpression elimination. This pass also does constant ++propagation. Its source file is @file{cse.c}. If constant ++propagation causes conditional jumps to become unconditional or to ++become no-ops, jump optimization is run again when CSE is finished. ++ ++The option @samp{-ds} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.cse} to ++the input file name. ++ ++@item ++Loop optimization. This pass moves constant expressions out of loops, ++and optionally does strength-reduction as well. Its source file is ++@file{loop.c}. ++ ++The option @samp{-dL} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.loop} to ++the input file name. ++ ++@item ++Stupid register allocation is performed at this point in a ++nonoptimizing compilation. It does a little data flow analysis as ++well. When stupid register allocation is in use, the next pass ++executed is the reloading pass; the others in between are skipped. ++The source file is @file{stupid.c}. ++ ++@item ++Data flow analysis (@file{flow.c}). This pass divides the program ++into basic blocks (and in the process deletes unreachable loops); then ++it computes which pseudo-registers are live at each point in the ++program, and makes the first instruction that uses a value point at ++the instruction that computed the value. ++ ++This pass also deletes computations whose results are never used, and ++combines memory references with add or subtract instructions to make ++autoincrement or autodecrement addressing. ++ ++The option @samp{-df} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.flow} to ++the input file name. If stupid register allocation is in use, this ++dump file reflects the full results of such allocation. ++ ++@item ++Instruction combination (@file{combine.c}). This pass attempts to ++combine groups of two or three instructions that are related by data ++flow into single instructions. It combines the RTL expressions for ++the instructions by substitution, simplifies the result using algebra, ++and then attempts to match the result against the machine description. ++ ++The option @samp{-dc} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.combine} ++to the input file name. ++ ++@item ++Register class preferencing. The RTL code is scanned to find out ++which register class is best for each pseudo register. The source ++file is @file{regclass.c}. ++ ++@item ++Local register allocation (@file{local-alloc.c}). This pass allocates ++hard registers to pseudo registers that are used only within one basic ++block. Because the basic block is linear, it can use fast and ++powerful techniques to do a very good job. ++ ++The option @samp{-dl} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.lreg} to ++the input file name. ++ ++@item ++Global register allocation (@file{global-alloc.c}). This pass ++allocates hard registers for the remaining pseudo registers (those ++whose life spans are not contained in one basic block). ++ ++@item ++Reloading. This pass renumbers pseudo registers with the hardware ++registers numbers they were allocated. Pseudo registers that did not ++get hard registers are replaced with stack slots. Then it finds ++instructions that are invalid because a value has failed to end up in ++a register, or has ended up in a register of the wrong kind. It fixes ++up these instructions by reloading the problematical values ++temporarily into registers. Additional instructions are generated to ++do the copying. ++ ++Source files are @file{reload.c} and @file{reload1.c}, plus the header ++@file{reload.h} used for communication between them. ++ ++The option @samp{-dg} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.greg} to ++the input file name. ++ ++@item ++Jump optimization is repeated, this time including cross-jumping ++and deletion of no-op move instructions. ++ ++The option @samp{-dJ} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.jump2} ++to the input file name. ++ ++@item ++Delayed branch scheduling may be done at this point. The source file ++name is @file{dbranch.c}. ++ ++The option @samp{-dd} causes a debugging dump of the RTL code after ++this pass. This dump file's name is made by appending @samp{.dbr} ++to the input file name. ++ ++@item ++Final. This pass outputs the assembler code for the function. It is ++also responsible for identifying spurious test and compare ++instructions. Machine-specific peephole optimizations are performed ++at the same time. The function entry and exit sequences are generated ++directly as assembler code in this pass; they never exist as RTL. ++ ++The source files are @file{final.c} plus @file{insn-output.c}; the ++latter is generated automatically from the machine description by the ++tool @file{genoutput}. The header file @file{conditions.h} is used ++for communication between these files. ++ ++@item ++Debugging information output. This is run after final because it must ++output the stack slot offsets for pseudo registers that did not get ++hard registers. Source files are @file{dbxout.c} for DBX symbol table ++format and @file{symout.c} for GDB's own symbol table format. ++@end itemize ++ ++Some additional files are used by all or many passes: ++ ++@itemize @bullet ++@item ++Every pass uses @file{machmode.def}, which defines the machine modes. ++ ++@item ++All the passes that work with RTL use the header files @file{rtl.h} ++and @file{rtl.def}, and subroutines in file @file{rtl.c}. The tools ++@code{gen*} also use these files to read and work with the machine ++description RTL. ++ ++@item ++Several passes refer to the header file @file{insn-config.h} which ++contains a few parameters (C macro definitions) generated ++automatically from the machine description RTL by the tool ++@code{genconfig}. ++ ++@item ++Several passes use the instruction recognizer, which consists of ++@file{recog.c} and @file{recog.h}, plus the files @file{insn-recog.c} ++and @file{insn-extract.c} that are generated automatically from the ++machine description by the tools @file{genrecog} and ++@file{genextract}.@refill ++ ++@item ++Several passes use the header files @file{regs.h} which defines the ++information recorded about pseudo register usage, and @file{basic-block.h} ++which defines the information recorded about basic blocks. ++ ++@item ++@file{hard-reg-set.h} defines the type @code{HARD_REG_SET}, a bit-vector ++with a bit for each hard register, and some macros to manipulate it. ++This type is just @code{int} if the machine has few enough hard registers; ++otherwise it is an array of @code{int} and some of the macros expand ++into loops. ++@end itemize ++ ++@node RTL, Machine Desc, Passes, Top ++@chapter RTL Representation ++ ++Most of the work of the compiler is done on an intermediate representation ++called register transfer language. In this language, the instructions to be ++output are described, pretty much one by one, in an algebraic form that ++describes what the instruction does. ++ ++RTL is inspired by Lisp lists. It has both an internal form, made up of ++structures that point at other structures, and a textual form that is used ++in the machine description and in printed debugging dumps. The textual ++form uses nested parentheses to indicate the pointers in the internal form. ++ ++@menu ++* RTL Objects:: Expressions vs vectors vs strings vs integers. ++* Accessors:: Macros to access expression operands or vector elts. ++* Flags:: Other flags in an RTL expression. ++* Machine Modes:: Describing the size and format of a datum. ++* Constants:: Expressions with constant values. ++* Regs and Memory:: Expressions representing register contents or memory. ++* Arithmetic:: Expressions representing arithmetic on other expressions. ++* Comparisons:: Expressions representing comparison of expressions. ++* Bit Fields:: Expressions representing bit-fields in memory or reg. ++* Conversions:: Extending, truncating, floating or fixing. ++* RTL Declarations:: Declaring volatility, constancy, etc. ++* Side Effects:: Expressions for storing in registers, etc. ++* Incdec:: Embedded side-effects for autoincrement addressing. ++* Assembler:: Representing @code{asm} with operands. ++* Insns:: Expression types for entire insns. ++* Calls:: RTL representation of function call insns. ++* Sharing:: Some expressions are unique; others *must* be copied. ++@end menu ++ ++@node RTL Objects, Accessors, RTL, RTL ++@section RTL Object Types ++ ++RTL uses four kinds of objects: expressions, integers, strings and vectors. ++Expressions are the most important ones. An RTL expression (``RTX'', for ++short) is a C structure, but it is usually referred to with a pointer; a ++type that is given the typedef name @code{rtx}. ++ ++An integer is simply an @code{int}, and a string is a @code{char *}. ++Within RTL code, strings appear only inside @code{symbol_ref} expressions, ++but they appear in other contexts in the RTL expressions that make up ++machine descriptions. Their written form uses decimal digits. ++ ++A string is a sequence of characters. In core it is represented as a ++@code{char *} in usual C fashion, and it is written in C syntax as well. ++However, strings in RTL may never be null. If you write an empty string in ++a machine description, it is represented in core as a null pointer rather ++than as a pointer to a null character. In certain contexts, these null ++pointers instead of strings are valid. ++ ++A vector contains an arbitrary, specified number of pointers to ++expressions. The number of elements in the vector is explicitly present in ++the vector. The written form of a vector consists of square brackets ++(@samp{[@dots{}]}) surrounding the elements, in sequence and with ++whitespace separating them. Vectors of length zero are not created; null ++pointers are used instead. ++ ++Expressions are classified by @dfn{expression codes} (also called RTX ++codes). The expression code is a name defined in @file{rtl.def}, which is ++also (in upper case) a C enumeration constant. The possible expression ++codes and their meanings are machine-independent. The code of an RTX can ++be extracted with the macro @code{GET_CODE (@var{x})} and altered with ++@code{PUT_CODE (@var{x}, @var{newcode})}. ++ ++The expression code determines how many operands the expression contains, ++and what kinds of objects they are. In RTL, unlike Lisp, you cannot tell ++by looking at an operand what kind of object it is. Instead, you must know ++from its context---from the expression code of the containing expression. ++For example, in an expression of code @code{subreg}, the first operand is ++to be regarded as an expression and the second operand as an integer. In ++an expression of code @code{plus}, there are two operands, both of which ++are to be regarded as expressions. In a @code{symbol_ref} expression, ++there is one operand, which is to be regarded as a string. ++ ++Expressions are written as parentheses containing the name of the ++expression type, its flags and machine mode if any, and then the operands ++of the expression (separated by spaces). ++ ++Expression code names in the @samp{md} file are written in lower case, ++but when they appear in C code they are written in upper case. In this ++manual, they are shown as follows: @code{const_int}. ++ ++In a few contexts a null pointer is valid where an expression is normally ++wanted. The written form of this is @code{(nil)}. ++ ++@node Accessors, Flags, RTL Objects, RTL ++@section Access to Operands ++ ++For each expression type @file{rtl.def} specifies the number of contained ++objects and their kinds, with four possibilities: @samp{e} for expression ++(actually a pointer to an expression), @samp{i} for integer, @samp{s} for ++string, and @samp{E} for vector of expressions. The sequence of letters ++for an expression code is called its @dfn{format}. Thus, the format of ++@code{subreg} is @samp{ei}.@refill ++ ++Two other format characters are used occasionally: @samp{u} and @samp{0}. ++@samp{u} is equivalent to @samp{e} except that it is printed differently in ++debugging dumps, and @samp{0} means a slot whose contents do not fit any ++normal category. @samp{0} slots are not printed at all in dumps, and are ++often used in special ways by small parts of the compiler.@refill ++ ++There are macros to get the number of operands and the format of an ++expression code: ++ ++@table @code ++@item GET_RTX_LENGTH (@var{code}) ++Number of operands of an RTX of code @var{code}. ++ ++@item GET_RTX_FORMAT (@var{code}) ++The format of an RTX of code @var{code}, as a C string. ++@end table ++ ++Operands of expressions are accessed using the macros @code{XEXP}, ++@code{XINT} and @code{XSTR}. Each of these macros takes two arguments: an ++expression-pointer (RTX) and an operand number (counting from zero). ++Thus,@refill ++ ++@example ++XEXP (@var{x}, 2) ++@end example ++ ++@noindent ++accesses operand 2 of expression @var{x}, as an expression. ++ ++@example ++XINT (@var{x}, 2) ++@end example ++ ++@noindent ++accesses the same operand as an integer. @code{XSTR}, used in the same ++fashion, would access it as a string. ++ ++Any operand can be accessed as an integer, as an expression or as a string. ++You must choose the correct method of access for the kind of value actually ++stored in the operand. You would do this based on the expression code of ++the containing expression. That is also how you would know how many ++operands there are. ++ ++For example, if @var{x} is a @code{subreg} expression, you know that it has ++two operands which can be correctly accessed as @code{XEXP (@var{x}, 0)} ++and @code{XINT (@var{x}, 1)}. If you did @code{XINT (@var{x}, 0)}, you ++would get the address of the expression operand but cast as an integer; ++that might occasionally be useful, but it would be cleaner to write ++@code{(int) XEXP (@var{x}, 0)}. @code{XEXP (@var{x}, 1)} would also ++compile without error, and would return the second, integer operand cast as ++an expression pointer, which would probably result in a crash when ++accessed. Nothing stops you from writing @code{XEXP (@var{x}, 28)} either, ++but this will access memory past the end of the expression with ++unpredictable results.@refill ++ ++Access to operands which are vectors is more complicated. You can use the ++macro @code{XVEC} to get the vector-pointer itself, or the macros ++@code{XVECEXP} and @code{XVECLEN} to access the elements and length of a ++vector. ++ ++@table @code ++@item XVEC (@var{exp}, @var{idx}) ++Access the vector-pointer which is operand number @var{idx} in @var{exp}. ++ ++@item XVECLEN (@var{exp}, @var{idx}) ++Access the length (number of elements) in the vector which is ++in operand number @var{idx} in @var{exp}. This value is an @code{int}. ++ ++@item XVECEXP (@var{exp}, @var{idx}, @var{eltnum}) ++Access element number @var{eltnum} in the vector which is ++in operand number @var{idx} in @var{exp}. This value is an RTX. ++ ++It is up to you to make sure that @var{eltnum} is not negative ++and is less than @code{XVECLEN (@var{exp}, @var{idx})}. ++@end table ++ ++All the macros defined in this section expand into lvalues and therefore ++can be used to assign the operands, lengths and vector elements as well as ++to access them. ++ ++@node Flags, Machine Modes, Accessors, RTL ++@section Flags in an RTL Expression ++ ++RTL expressions contain several flags (one-bit bit-fields) that are used ++in certain types of expression. Most often they are accessed with the ++following macros: ++ ++@table @code ++@item EXTERNAL_SYMBOL_P (@var{x}) ++In a @code{symbol_ref} expression, nonzero if it corresponds to a variable ++declared extern in the users code. Zero for all other variables. Stored in ++the @code{volatil} field and printed as @samp{/v}. ++ ++@item MEM_VOLATILE_P (@var{x}) ++In @code{mem} expressions, nonzero for volatile memory references. ++Stored in the @code{volatil} field and printed as @samp{/v}. ++ ++@item MEM_IN_STRUCT_P (@var{x}) ++In @code{mem} expressions, nonzero for reference to an entire ++structure, union or array, or to a component of one. Zero for ++references to a scalar variable or through a pointer to a scalar. ++Stored in the @code{in_struct} field and printed as @samp{/s}. ++ ++@item REG_USER_VAR_P (@var{x}) ++In a @code{reg}, nonzero if it corresponds to a variable present in ++the user's source code. Zero for temporaries generated internally by ++the compiler. Stored in the @code{volatil} field and printed as ++@samp{/v}. ++ ++@item REG_FUNCTION_VALUE_P (@var{x}) ++Nonzero in a @code{reg} if it is the place in which this function's ++value is going to be returned. (This happens only in a hard ++register.) Stored in the @code{integrated} field and printed as ++@samp{/i}. ++ ++The same hard register may be used also for collecting the values of ++functions called by this one, but @code{REG_FUNCTION_VALUE_P} is zero ++in this kind of use. ++ ++@item RTX_UNCHANGING_P (@var{x}) ++Nonzero in a @code{reg} or @code{mem} if the value is not changed ++explicitly by the current function. (If it is a memory reference then ++it may be changed by other functions or by aliasing.) Stored in the ++@code{unchanging} field and printed as @samp{/u}. ++ ++@item RTX_INTEGRATED_P (@var{insn}) ++Nonzero in an insn if it resulted from an in-line function call. ++Stored in the @code{integrated} field and printed as @samp{/i}. This ++may be deleted; nothing currently depends on it. ++ ++@item INSN_DELETED_P (@var{insn}) ++In an insn, nonzero if the insn has been deleted. Stored in the ++@code{volatil} field and printed as @samp{/v}. ++ ++@item CONSTANT_POOL_ADDRESS_P (@var{x}) ++Nonzero in a @code{symbol_ref} if it refers to part of the current ++function's ``constants pool''. These are addresses close to the ++beginning of the function, and GNU CC assumes they can be addressed ++directly (perhaps with the help of base registers). Stored in the ++@code{unchanging} field and printed as @samp{/u}. ++@end table ++ ++These are the fields which the above macros refer to: ++ ++@table @code ++@item used ++This flag is used only momentarily, at the end of RTL generation for a ++function, to count the number of times an expression appears in insns. ++Expressions that appear more than once are copied, according to the ++rules for shared structure (@pxref{Sharing}). ++ ++@item volatil ++This flag is used in @code{mem},@code{symbol_ref} and @code{reg} expressions ++and in insns. In RTL dump files, it is printed as @samp{/v}. ++ ++In a @code{mem} expression, it is 1 if the memory reference is volatile. ++Volatile memory references may not be deleted, reordered or combined. ++ ++In a @code{reg} expression, it is 1 if the value is a user-level variable. ++0 indicates an internal compiler temporary. ++ ++In a @code{symbol_ref} expression, it is 1 if the symbol is declared ++@code{extern}. ++ ++In an insn, 1 means the insn has been deleted. ++ ++@item in_struct ++This flag is used in @code{mem} expressions. It is 1 if the memory ++datum referred to is all or part of a structure or array; 0 if it is (or ++might be) a scalar variable. A reference through a C pointer has 0 ++because the pointer might point to a scalar variable. ++ ++This information allows the compiler to determine something about possible ++cases of aliasing. ++ ++In an RTL dump, this flag is represented as @samp{/s}. ++ ++@item unchanging ++This flag is used in @code{reg} and @code{mem} expressions. 1 means ++that the value of the expression never changes (at least within the ++current function). ++ ++In an RTL dump, this flag is represented as @samp{/u}. ++ ++@item integrated ++In some kinds of expressions, including insns, this flag means the ++rtl was produced by procedure integration. ++ ++In a @code{reg} expression, this flag indicates the register ++containing the value to be returned by the current function. On ++machines that pass parameters in registers, the same register number ++may be used for parameters as well, but this flag is not set on such ++uses. ++@end table ++ ++@node Machine Modes, Constants, Flags, RTL ++@section Machine Modes ++ ++A machine mode describes a size of data object and the representation used ++for it. In the C code, machine modes are represented by an enumeration ++type, @code{enum machine_mode}, defined in @file{machmode.def}. Each RTL ++expression has room for a machine mode and so do certain kinds of tree ++expressions (declarations and types, to be precise). ++ ++In debugging dumps and machine descriptions, the machine mode of an RTL ++expression is written after the expression code with a colon to separate ++them. The letters @samp{mode} which appear at the end of each machine mode ++name are omitted. For example, @code{(reg:SI 38)} is a @code{reg} ++expression with machine mode @code{SImode}. If the mode is ++@code{VOIDmode}, it is not written at all. ++ ++Here is a table of machine modes. ++ ++@table @code ++@item QImode ++``Quarter-Integer'' mode represents a single byte treated as an integer. ++ ++@item HImode ++``Half-Integer'' mode represents a two-byte integer. ++ ++@item PSImode ++``Partial Single Integer'' mode represents an integer which occupies ++four bytes but which doesn't really use all four. On some machines, ++this is the right mode to use for pointers. ++ ++@item SImode ++``Single Integer'' mode represents a four-byte integer. ++ ++@item PDImode ++``Partial Double Integer'' mode represents an integer which occupies ++eight bytes but which doesn't really use all eight. On some machines, ++this is the right mode to use for certain pointers. ++ ++@item DImode ++``Double Integer'' mode represents an eight-byte integer. ++ ++@item TImode ++``Tetra Integer'' (?) mode represents a sixteen-byte integer. ++ ++@item SFmode ++``Single Floating'' mode represents a single-precision (four byte) floating ++point number. ++ ++@item DFmode ++``Double Floating'' mode represents a double-precision (eight byte) floating ++point number. ++ ++@item XFmode ++``Extended Floating'' mode represents a triple-precision (twelve byte) ++floating point number. This mode is used for IEEE extended floating ++point. ++ ++@item TFmode ++``Tetra Floating'' mode represents a quadruple-precision (sixteen byte) ++floating point number. ++ ++@item BLKmode ++``Block'' mode represents values that are aggregates to which none of ++the other modes apply. In RTL, only memory references can have this mode, ++and only if they appear in string-move or vector instructions. On machines ++which have no such instructions, @code{BLKmode} will not appear in RTL. ++ ++@item VOIDmode ++Void mode means the absence of a mode or an unspecified mode. ++For example, RTL expressions of code @code{const_int} have mode ++@code{VOIDmode} because they can be taken to have whatever mode the context ++requires. In debugging dumps of RTL, @code{VOIDmode} is expressed by ++the absence of any mode. ++ ++@item EPmode ++``Entry Pointer'' mode is intended to be used for function variables in ++Pascal and other block structured languages. Such values contain ++both a function address and a static chain pointer for access to ++automatic variables of outer levels. This mode is only partially ++implemented since C does not use it. ++ ++@item CSImode@r{, @dots{}} ++``Complex Single Integer'' mode stands for a complex number represented ++as a pair of @code{SImode} integers. Any of the integer and floating modes ++may have @samp{C} prefixed to its name to obtain a complex number mode. ++For example, there are @code{CQImode}, @code{CSFmode}, and @code{CDFmode}. ++Since C does not support complex numbers, these machine modes are only ++partially implemented. ++ ++@item BImode ++This is the machine mode of a bit-field in a structure. It is used ++only in the syntax tree, never in RTL, and in the syntax tree it appears ++only in declaration nodes. In C, it appears only in @code{FIELD_DECL} ++nodes for structure fields defined with a bit size. ++@end table ++ ++The machine description defines @code{Pmode} as a C macro which expands ++into the machine mode used for addresses. Normally this is @code{SImode}. ++ ++The only modes which a machine description @i{must} support are ++@code{QImode}, @code{SImode}, @code{SFmode} and @code{DFmode}. The ++compiler will attempt to use @code{DImode} for two-word structures and ++unions, but this can be prevented by overriding the definition of ++@code{MAX_FIXED_MODE_SIZE}. Likewise, you can arrange for the C type ++@code{short int} to avoid using @code{HImode}. In the long term it ++might be desirable to make the set of available machine modes ++machine-dependent and eliminate all assumptions about specific machine ++modes or their uses from the machine-independent code of the compiler. ++ ++To help begin this process, the machine modes are divided into mode ++classes. These are represented by the enumeration type @code{enum ++mode_class} defined in @file{rtl.h}. The possible mode classes are: ++ ++@table @code ++@item MODE_INT ++Integer modes. By default these are @code{QImode}, @code{HImode}, ++@code{SImode}, @code{DImode}, @code{TImode}, and also @code{BImode}. ++ ++@item MODE_FLOAT ++Floating-point modes. By default these are @code{QFmode}, ++@code{HFmode}, @code{SFmode}, @code{DFmode} and @code{TFmode}, but the ++MC68881 also defines @code{XFmode} to be an 80-bit extended-precision ++floating-point mode. ++ ++@item MODE_COMPLEX_INT ++Complex integer modes. By default these are @code{CQImode}, ++@code{CHImode}, @code{CSImode}, @code{CDImode} and @code{CTImode}. ++ ++@item MODE_COMPLEX_FLOAT ++Complex floating-point modes. By default these are @code{CQFmode}, ++@code{CHFmode}, @code{CSFmode}, @code{CDFmode} and @code{CTFmode}, ++ ++@item MODE_FUNCTION ++Algol or Pascal function variables including a static chain. ++(These are not currently implemented). ++ ++@item MODE_RANDOM ++This is a catchall mode class for modes which don't fit into the above ++classes. Currently @code{VOIDmode}, @code{BLKmode} and @code{EPmode} ++are in @code{MODE_RANDOM}. ++@end table ++ ++Here are some C macros that relate to machine modes: ++ ++@table @code ++@item GET_MODE (@var{x}) ++Returns the machine mode of the RTX @var{x}. ++ ++@item PUT_MODE (@var{x}, @var{newmode}) ++Alters the machine mode of the RTX @var{x} to be @var{newmode}. ++ ++@item NUM_MACHINE_MODES ++Stands for the number of machine modes available on the target ++machine. This is one greater than the largest numeric value of any ++machine mode. ++ ++@item GET_MODE_NAME (@var{m}) ++Returns the name of mode @var{m} as a string. ++ ++@item GET_MODE_CLASS (@var{m}) ++Returns the mode class of mode @var{m}. ++ ++@item GET_MODE_SIZE (@var{m}) ++Returns the size in bytes of a datum of mode @var{m}. ++ ++@item GET_MODE_BITSIZE (@var{m}) ++Returns the size in bits of a datum of mode @var{m}. ++ ++@item GET_MODE_UNIT_SIZE (@var{m}) ++Returns the size in bits of the subunits of a datum of mode @var{m}. ++This is the same as @code{GET_MODE_SIZE} except in the case of ++complex modes and @code{EPmode}. For them, the unit size is the ++size of the real or imaginary part, or the size of the function ++pointer or the context pointer. ++@end table ++ ++@node Constants, Regs and Memory, Machine Modes, RTL ++@section Constant Expression Types ++ ++The simplest RTL expressions are those that represent constant values. ++ ++@table @code ++@item (const_int @var{i}) ++This type of expression represents the integer value @var{i}. @var{i} ++is customarily accessed with the macro @code{INTVAL} as in ++@code{INTVAL (@var{exp})}, which is equivalent to @code{XINT (@var{exp}, 0)}. ++ ++There is only one expression object for the integer value zero; ++it is the value of the variable @code{const0_rtx}. Likewise, the ++only expression for integer value one is found in @code{const1_rtx}. ++Any attempt to create an expression of code @code{const_int} and ++value zero or one will return @code{const0_rtx} or @code{const1_rtx} ++as appropriate. ++ ++@item (const_double:@var{m} @var{i0} @var{i1}) ++Represents a 64-bit constant of mode @var{m}. All floating point ++constants are represented in this way, and so are 64-bit @code{DImode} ++integer constants. ++ ++The two integers @var{i0} and @var{i1} together contain the bits of ++the value. If the constant is floating point (either single or double ++precision), then they represent a @code{double}. To convert them to a ++@code{double}, do ++ ++@example ++union @{ double d; int i[2];@} u; ++u.i[0] = CONST_DOUBLE_LOW(x); ++u.i[1] = CONST_DOUBLE_HIGH(x); ++@end example ++ ++@noindent ++and then refer to @code{u.d}. ++ ++The global variables @code{dconst0_rtx} and @code{fconst0_rtx} hold ++@code{const_double} expressions with value 0, in modes @code{DFmode} ++and @code{SFmode}, respectively. The macro @code{CONST0_RTX ++(@var{mode})} refers to a @code{const_double} expression with value 0 ++in mode @var{mode}. The mode @var{mode} must be of mode class ++@code{MODE_FLOAT}. ++ ++@item (symbol_ref @var{symbol}) ++Represents the value of an assembler label for data. @var{symbol} is ++a string that describes the name of the assembler label. If it starts ++with a @samp{*}, the label is the rest of @var{symbol} not including ++the @samp{*}. Otherwise, the label is @var{symbol}, prefixed with ++@samp{_}. ++ ++@item (label_ref @var{label}) ++Represents the value of an assembler label for code. It contains one ++operand, an expression, which must be a @code{code_label} that appears ++in the instruction sequence to identify the place where the label ++should go. ++ ++The reason for using a distinct expression type for code label ++references is so that jump optimization can distinguish them. ++ ++@item (const @var{exp}) ++Represents a constant that is the result of an assembly-time ++arithmetic computation. The operand, @var{exp}, is an expression that ++contains only constants (@code{const_int}, @code{symbol_ref} and ++@code{label_ref} expressions) combined with @code{plus} and ++@code{minus}. However, not all combinations are valid, since the ++assembler cannot do arbitrary arithmetic on relocatable symbols. ++@end table ++ ++@node Regs and Memory, Arithmetic, Constants, RTL ++@section Registers and Memory ++ ++Here are the RTL expression types for describing access to machine ++registers and to main memory. ++ ++@table @code ++@item (reg:@var{m} @var{n}) ++For small values of the integer @var{n} (less than ++@code{FIRST_PSEUDO_REGISTER}), this stands for a reference to machine ++register number @var{n}: a @dfn{hard register}. For larger values of ++@var{n}, it stands for a temporary value or @dfn{pseudo register}. ++The compiler's strategy is to generate code assuming an unlimited ++number of such pseudo registers, and later convert them into hard ++registers or into memory references. ++ ++The symbol @code{FIRST_PSEUDO_REGISTER} is defined by the machine ++description, since the number of hard registers on the machine is an ++invariant characteristic of the machine. Note, however, that not ++all of the machine registers must be general registers. All the ++machine registers that can be used for storage of data are given ++hard register numbers, even those that can be used only in certain ++instructions or can hold only certain types of data. ++ ++Each pseudo register number used in a function's RTL code is ++represented by a unique @code{reg} expression. ++ ++@var{m} is the machine mode of the reference. It is necessary because ++machines can generally refer to each register in more than one mode. ++For example, a register may contain a full word but there may be ++instructions to refer to it as a half word or as a single byte, as ++well as instructions to refer to it as a floating point number of ++various precisions. ++ ++Even for a register that the machine can access in only one mode, ++the mode must always be specified. ++ ++A hard register may be accessed in various modes throughout one ++function, but each pseudo register is given a natural mode ++and is accessed only in that mode. When it is necessary to describe ++an access to a pseudo register using a nonnatural mode, a @code{subreg} ++expression is used. ++ ++A @code{reg} expression with a machine mode that specifies more than ++one word of data may actually stand for several consecutive registers. ++If in addition the register number specifies a hardware register, then ++it actually represents several consecutive hardware registers starting ++with the specified one. ++ ++Such multi-word hardware register @code{reg} expressions must not be live ++across the boundary of a basic block. The lifetime analysis pass does not ++know how to record properly that several consecutive registers are ++actually live there, and therefore register allocation would be confused. ++The CSE pass must go out of its way to make sure the situation does ++not arise. ++ ++@item (subreg:@var{m} @var{reg} @var{wordnum}) ++@code{subreg} expressions are used to refer to a register in a machine ++mode other than its natural one, or to refer to one register of ++a multi-word @code{reg} that actually refers to several registers. ++ ++Each pseudo-register has a natural mode. If it is necessary to ++operate on it in a different mode---for example, to perform a fullword ++move instruction on a pseudo-register that contains a single ++byte---the pseudo-register must be enclosed in a @code{subreg}. In ++such a case, @var{wordnum} is zero. ++ ++The other use of @code{subreg} is to extract the individual registers ++of a multi-register value. Machine modes such as @code{DImode} and ++@code{EPmode} indicate values longer than a word, values which usually ++require two consecutive registers. To access one of the registers, ++use a @code{subreg} with mode @code{SImode} and a @var{wordnum} that ++says which register. ++ ++The compilation parameter @code{WORDS_BIG_ENDIAN}, if defined, says ++that word number zero is the most significant part; otherwise, it is ++the least significant part. ++ ++Between the combiner pass and the reload pass, it is possible to have ++a @code{subreg} which contains a @code{mem} instead of a @code{reg} as ++its first operand. The reload pass eliminates these cases by ++reloading the @code{mem} into a suitable register. ++ ++Note that it is not valid to access a @code{DFmode} value in @code{SFmode} ++using a @code{subreg}. On some machines the most significant part of a ++@code{DFmode} value does not have the same format as a single-precision ++floating value. ++ ++@item (cc0) ++This refers to the machine's condition code register. It has no ++operands and may not have a machine mode. There are two ways to use it: ++ ++@itemize @bullet ++@item ++To stand for a complete set of condition code flags. This is best on ++most machines, where each comparison sets the entire series of flags. ++ ++With this technique, @code{(cc0)} may be validly used in only two ++contexts: as the destination of an assignment (in test and compare ++instructions) and in comparison operators comparing against zero ++(@code{const_int} with value zero; that is to say, @code{const0_rtx}). ++ ++@item ++To stand for a single flag that is the result of a single condition. ++This is useful on machines that have only a single flag bit, and in ++which comparison instructions must specify the condition to test. ++ ++With this technique, @code{(cc0)} may be validly used in only two ++contexts: as the destination of an assignment (in test and compare ++instructions) where the source is a comparison operator, and as the ++first operand of @code{if_then_else} (in a conditional branch). ++@end itemize ++ ++There is only one expression object of code @code{cc0}; it is the ++value of the variable @code{cc0_rtx}. Any attempt to create an ++expression of code @code{cc0} will return @code{cc0_rtx}. ++ ++One special thing about the condition code register is that ++instructions can set it implicitly. On many machines, nearly all ++instructions set the condition code based on the value that they ++compute or store. It is not necessary to record these actions ++explicitly in the RTL because the machine description includes a ++prescription for recognizing the instructions that do so (by means of ++the macro @code{NOTICE_UPDATE_CC}). Only instructions whose sole ++purpose is to set the condition code, and instructions that use the ++condition code, need mention @code{(cc0)}. ++ ++In some cases, better code may result from recognizing combinations or ++peepholes that include instructions that set the condition codes, even ++in cases where some reloading is inevitable. For examples, search for ++@samp{addcc} and @samp{andcc} in @file{sparc.md}. ++ ++@item (pc) ++This represents the machine's program counter. It has no operands and ++may not have a machine mode. @code{(pc)} may be validly used only in ++certain specific contexts in jump instructions. ++ ++There is only one expression object of code @code{pc}; it is the value ++of the variable @code{pc_rtx}. Any attempt to create an expression of ++code @code{pc} will return @code{pc_rtx}. ++ ++All instructions that do not jump alter the program counter implicitly ++by incrementing it, but there is no need to mention this in the RTL. ++ ++@item (mem:@var{m} @var{addr}) ++This RTX represents a reference to main memory at an address ++represented by the expression @var{addr}. @var{m} specifies how large ++a unit of memory is accessed. ++@end table ++ ++@node Arithmetic, Comparisons, Regs and Memory, RTL ++@section RTL Expressions for Arithmetic ++ ++@table @code ++@item (plus:@var{m} @var{x} @var{y}) ++Represents the sum of the values represented by @var{x} and @var{y} ++carried out in machine mode @var{m}. This is valid only if ++@var{x} and @var{y} both are valid for mode @var{m}. ++ ++@item (minus:@var{m} @var{x} @var{y}) ++Like @code{plus} but represents subtraction. ++ ++@item (compare @var{x} @var{y}) ++Represents the result of subtracting @var{y} from @var{x} ++for purposes of comparison. The absence of a machine mode ++in the @code{compare} expression indicates that the result is ++computed without overflow, as if with infinite precision. ++ ++Of course, machines can't really subtract with infinite precision. ++However, they can pretend to do so when only the sign of the ++result will be used, which is the case when the result is stored ++in @code{(cc0)}. And that is the only way this kind of expression ++may validly be used: as a value to be stored in the condition codes. ++ ++@item (neg:@var{m} @var{x}) ++Represents the negation (subtraction from zero) of the value ++represented by @var{x}, carried out in mode @var{m}. @var{x} must be ++valid for mode @var{m}. ++ ++@item (mult:@var{m} @var{x} @var{y}) ++Represents the signed product of the values represented by @var{x} and ++@var{y} carried out in machine mode @var{m}. If ++@var{x} and @var{y} are both valid for mode @var{m}, this is ordinary ++size-preserving multiplication. Alternatively, both @var{x} and @var{y} ++may be valid for a different, narrower mode. This represents the ++kind of multiplication that generates a product wider than the operands. ++Widening multiplication and same-size multiplication are completely ++distinct and supported by different machine instructions; machines may ++support one but not the other.@refill ++ ++@code{mult} may be used for floating point multiplication as well. ++Then @var{m} is a floating point machine mode. ++ ++@item (umult:@var{m} @var{x} @var{y}) ++Like @code{mult} but represents unsigned multiplication. It may be ++used in both same-size and widening forms, like @code{mult}. ++@code{umult} is used only for fixed-point multiplication. ++ ++@item (div:@var{m} @var{x} @var{y}) ++Represents the quotient in signed division of @var{x} by @var{y}, ++carried out in machine mode @var{m}. If @var{m} is a floating-point ++mode, it represents the exact quotient; otherwise, the integerized ++quotient. If @var{x} and @var{y} are both valid for mode @var{m}, ++this is ordinary size-preserving division. Some machines have ++division instructions in which the operands and quotient widths are ++not all the same; such instructions are represented by @code{div} ++expressions in which the machine modes are not all the same. ++ ++@item (udiv:@var{m} @var{x} @var{y}) ++Like @code{div} but represents unsigned division. ++ ++@item (mod:@var{m} @var{x} @var{y}) ++@itemx (umod:@var{m} @var{x} @var{y}) ++Like @code{div} and @code{udiv} but represent the remainder instead of ++the quotient. ++ ++@item (not:@var{m} @var{x}) ++Represents the bitwise complement of the value represented by @var{x}, ++carried out in mode @var{m}, which must be a fixed-point machine mode. ++@var{x} must be valid for mode @var{m}, which must be a fixed-point mode. ++ ++@item (and:@var{m} @var{x} @var{y}) ++Represents the bitwise logical-and of the values represented by ++@var{x} and @var{y}, carried out in machine mode @var{m}. This is ++valid only if @var{x} and @var{y} both are valid for mode @var{m}, ++which must be a fixed-point mode. ++ ++@item (ior:@var{m} @var{x} @var{y}) ++Represents the bitwise inclusive-or of the values represented by ++@var{x} and @var{y}, carried out in machine mode @var{m}. This is ++valid only if @var{x} and @var{y} both are valid for mode @var{m}, ++which must be a fixed-point mode. ++ ++@item (xor:@var{m} @var{x} @var{y}) ++Represents the bitwise exclusive-or of the values represented by ++@var{x} and @var{y}, carried out in machine mode @var{m}. This is ++valid only if @var{x} and @var{y} both are valid for mode @var{m}, ++which must be a fixed-point mode. ++ ++@item (lshift:@var{m} @var{x} @var{c}) ++Represents the result of logically shifting @var{x} left by @var{c} ++places. @var{x} must be valid for the mode @var{m}, a fixed-point ++machine mode. @var{c} must be valid for a fixed-point mode; ++which mode is determined by the mode called for in the machine ++description entry for the left-shift instruction. For example, ++on the Vax, the mode of @var{c} is @code{QImode} regardless of @var{m}. ++ ++On some machines, negative values of @var{c} may be meaningful; this ++is why logical left shift and arithmetic left shift are distinguished. ++For example, Vaxes have no right-shift instructions, and right shifts ++are represented as left-shift instructions whose counts happen ++to be negative constants or else computed (in a previous instruction) ++by negation. ++ ++@item (ashift:@var{m} @var{x} @var{c}) ++Like @code{lshift} but for arithmetic left shift. ++ ++@item (lshiftrt:@var{m} @var{x} @var{c}) ++@itemx (ashiftrt:@var{m} @var{x} @var{c}) ++Like @code{lshift} and @code{ashift} but for right shift. ++ ++@item (rotate:@var{m} @var{x} @var{c}) ++@itemx (rotatert:@var{m} @var{x} @var{c}) ++Similar but represent left and right rotate. ++ ++@item (abs:@var{m} @var{x}) ++Represents the absolute value of @var{x}, computed in mode @var{m}. ++@var{x} must be valid for @var{m}. ++ ++@item (sqrt:@var{m} @var{x}) ++Represents the square root of @var{x}, computed in mode @var{m}. ++@var{x} must be valid for @var{m}. Most often @var{m} will be ++a floating point mode. ++ ++@item (ffs:@var{m} @var{x}) ++Represents one plus the index of the least significant 1-bit in ++@var{x}, represented as an integer of mode @var{m}. (The value is ++zero if @var{x} is zero.) The mode of @var{x} need not be @var{m}; ++depending on the target machine, various mode combinations may be ++valid. ++@end table ++ ++@node Comparisons, Bit Fields, Arithmetic, RTL ++@section Comparison Operations ++ ++Comparison operators test a relation on two operands and are considered ++to represent a machine-dependent nonzero value (@code{STORE_FLAG_VALUE}) ++if the relation holds, or zero if it does not. The mode of the ++comparison is determined by the operands; they must both be valid for a ++common machine mode. A comparison with both operands constant would be ++invalid as the machine mode could not be deduced from it, but such a ++comparison should never exist in RTL due to constant folding. ++ ++Inequality comparisons come in two flavors, signed and unsigned. Thus, ++there are distinct expression codes @code{gt} and @code{gtu} for signed and ++unsigned greater-than. These can produce different results for the same ++pair of integer values: for example, 1 is signed greater-than -1 but not ++unsigned greater-than, because -1 when regarded as unsigned is actually ++@code{0xffffffff} which is greater than 1. ++ ++The signed comparisons are also used for floating point values. Floating ++point comparisons are distinguished by the machine modes of the operands. ++ ++The comparison operators may be used to compare the condition codes ++@code{(cc0)} against zero, as in @code{(eq (cc0) (const_int 0))}. Such a ++construct actually refers to the result of the preceding instruction in ++which the condition codes were set. The above example stands for 1 if the ++condition codes were set to say ``zero'' or ``equal'', 0 otherwise. ++Although the same comparison operators are used for this as may be used in ++other contexts on actual data, no confusion can result since the machine ++description would never allow both kinds of uses in the same context. ++ ++@table @code ++@item (eq @var{x} @var{y}) ++1 if the values represented by @var{x} and @var{y} are equal, ++otherwise 0. ++ ++@item (ne @var{x} @var{y}) ++1 if the values represented by @var{x} and @var{y} are not equal, ++otherwise 0. ++ ++@item (gt @var{x} @var{y}) ++1 if the @var{x} is greater than @var{y}. If they are fixed-point, ++the comparison is done in a signed sense. ++ ++@item (gtu @var{x} @var{y}) ++Like @code{gt} but does unsigned comparison, on fixed-point numbers only. ++ ++@item (lt @var{x} @var{y}) ++@item (ltu @var{x} @var{y}) ++Like @code{gt} and @code{gtu} but test for ``less than''. ++ ++@item (ge @var{x} @var{y}) ++@item (geu @var{x} @var{y}) ++Like @code{gt} and @code{gtu} but test for ``greater than or equal''. ++ ++@item (le @var{x} @var{y}) ++@item (leu @var{x} @var{y}) ++Like @code{gt} and @code{gtu} but test for ``less than or equal''. ++ ++@item (if_then_else @var{cond} @var{then} @var{else}) ++This is not a comparison operation but is listed here because it is ++always used in conjunction with a comparison operation. To be ++precise, @var{cond} is a comparison expression. This expression ++represents a choice, according to @var{cond}, between the value ++represented by @var{then} and the one represented by @var{else}. ++ ++On most machines, @code{if_then_else} expressions are valid only ++to express conditional jumps. ++@end table ++ ++@node Bit Fields, Conversions, Comparisons, RTL ++@section Bit-fields ++ ++Special expression codes exist to represent bit-field instructions. ++These types of expressions are lvalues in RTL; they may appear ++on the left side of an assignment, indicating insertion of a value ++into the specified bit field. ++ ++@table @code ++@item (sign_extract:SI @var{loc} @var{size} @var{pos}) ++This represents a reference to a sign-extended bit-field contained or ++starting in @var{loc} (a memory or register reference). The bit field ++is @var{size} bits wide and starts at bit @var{pos}. The compilation ++option @code{BITS_BIG_ENDIAN} says which end of the memory unit ++@var{pos} counts from. ++ ++Which machine modes are valid for @var{loc} depends on the machine, ++but typically @var{loc} should be a single byte when in memory ++or a full word in a register. ++ ++@item (zero_extract:SI @var{loc} @var{size} @var{pos}) ++Like @code{sign_extract} but refers to an unsigned or zero-extended ++bit field. The same sequence of bits are extracted, but they ++are filled to an entire word with zeros instead of by sign-extension. ++@end table ++ ++@node Conversions, RTL Declarations, Bit Fields, RTL ++@section Conversions ++ ++All conversions between machine modes must be represented by ++explicit conversion operations. For example, an expression ++which is the sum of a byte and a full word cannot be written as ++@code{(plus:SI (reg:QI 34) (reg:SI 80))} because the @code{plus} ++operation requires two operands of the same machine mode. ++Therefore, the byte-sized operand is enclosed in a conversion ++operation, as in ++ ++@example ++(plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80)) ++@end example ++ ++The conversion operation is not a mere placeholder, because there ++may be more than one way of converting from a given starting mode ++to the desired final mode. The conversion operation code says how ++to do it. ++ ++@table @code ++@item (sign_extend:@var{m} @var{x}) ++Represents the result of sign-extending the value @var{x} ++to machine mode @var{m}. @var{m} must be a fixed-point mode ++and @var{x} a fixed-point value of a mode narrower than @var{m}. ++ ++@item (zero_extend:@var{m} @var{x}) ++Represents the result of zero-extending the value @var{x} ++to machine mode @var{m}. @var{m} must be a fixed-point mode ++and @var{x} a fixed-point value of a mode narrower than @var{m}. ++ ++@item (float_extend:@var{m} @var{x}) ++Represents the result of extending the value @var{x} ++to machine mode @var{m}. @var{m} must be a floating point mode ++and @var{x} a floating point value of a mode narrower than @var{m}. ++ ++@item (truncate:@var{m} @var{x}) ++Represents the result of truncating the value @var{x} ++to machine mode @var{m}. @var{m} must be a fixed-point mode ++and @var{x} a fixed-point value of a mode wider than @var{m}. ++ ++@item (float_truncate:@var{m} @var{x}) ++Represents the result of truncating the value @var{x} ++to machine mode @var{m}. @var{m} must be a floating point mode ++and @var{x} a floating point value of a mode wider than @var{m}. ++ ++@item (float:@var{m} @var{x}) ++Represents the result of converting fixed point value @var{x}, ++regarded as signed, to floating point mode @var{m}. ++ ++@item (unsigned_float:@var{m} @var{x}) ++Represents the result of converting fixed point value @var{x}, ++regarded as unsigned, to floating point mode @var{m}. ++ ++@item (fix:@var{m} @var{x}) ++When @var{m} is a fixed point mode, represents the result of ++converting floating point value @var{x} to mode @var{m}, regarded as ++signed. How rounding is done is not specified, so this operation may ++be used validly in compiling C code only for integer-valued operands. ++ ++@item (unsigned_fix:@var{m} @var{x}) ++Represents the result of converting floating point value @var{x} to ++fixed point mode @var{m}, regarded as unsigned. How rounding is done ++is not specified. ++ ++@item (fix:@var{m} @var{x}) ++When @var{m} is a floating point mode, represents the result of ++converting floating point value @var{x} (valid for mode @var{m}) to an ++integer, still represented in floating point mode @var{m}, by rounding ++towards zero. ++@end table ++ ++@node RTL Declarations, Side Effects, Conversions, RTL ++@section Declarations ++ ++Declaration expression codes do not represent arithmetic operations ++but rather state assertions about their operands. ++ ++@table @code ++@item (strict_low_part (subreg:@var{m} (reg:@var{n} @var{r}) 0)) ++This expression code is used in only one context: operand 0 of a ++@code{set} expression. In addition, the operand of this expression ++must be a @code{subreg} expression. ++ ++The presence of @code{strict_low_part} says that the part of the ++register which is meaningful in mode @var{n}, but is not part of ++mode @var{m}, is not to be altered. Normally, an assignment to such ++a subreg is allowed to have undefined effects on the rest of the ++register when @var{m} is less than a word. ++@end table ++ ++@node Side Effects, Incdec, RTL Declarations, RTL ++@section Side Effect Expressions ++ ++The expression codes described so far represent values, not actions. ++But machine instructions never produce values; they are meaningful ++only for their side effects on the state of the machine. Special ++expression codes are used to represent side effects. ++ ++The body of an instruction is always one of these side effect codes; ++the codes described above, which represent values, appear only as ++the operands of these. ++ ++@table @code ++@item (set @var{lval} @var{x}) ++Represents the action of storing the value of @var{x} into the place ++represented by @var{lval}. @var{lval} must be an expression ++representing a place that can be stored in: @code{reg} (or ++@code{subreg} or @code{strict_low_part}), @code{mem}, @code{pc} or ++@code{cc0}.@refill ++ ++If @var{lval} is a @code{reg}, @code{subreg} or @code{mem}, it has a ++machine mode; then @var{x} must be valid for that mode.@refill ++ ++If @var{lval} is a @code{reg} whose machine mode is less than the full ++width of the register, then it means that the part of the register ++specified by the machine mode is given the specified value and the ++rest of the register receives an undefined value. Likewise, if ++@var{lval} is a @code{subreg} whose machine mode is narrower than ++@code{SImode}, the rest of the register can be changed in an undefined way. ++ ++If @var{lval} is a @code{strict_low_part} of a @code{subreg}, then the ++part of the register specified by the machine mode of the ++@code{subreg} is given the value @var{x} and the rest of the register ++is not changed.@refill ++ ++If @var{lval} is @code{(cc0)}, it has no machine mode, and @var{x} may ++have any mode. This represents a ``test'' or ``compare'' instruction.@refill ++ ++If @var{lval} is @code{(pc)}, we have a jump instruction, and the ++possibilities for @var{x} are very limited. It may be a ++@code{label_ref} expression (unconditional jump). It may be an ++@code{if_then_else} (conditional jump), in which case either the ++second or the third operand must be @code{(pc)} (for the case which ++does not jump) and the other of the two must be a @code{label_ref} ++(for the case which does jump). @var{x} may also be a @code{mem} or ++@code{(plus:SI (pc) @var{y})}, where @var{y} may be a @code{reg} or a ++@code{mem}; these unusual patterns are used to represent jumps through ++branch tables.@refill ++ ++@item (return) ++Represents a return from the current function, on machines where this ++can be done with one instruction, such as Vaxes. On machines where a ++multi-instruction ``epilogue'' must be executed in order to return ++from the function, returning is done by jumping to a label which ++precedes the epilogue, and the @code{return} expression code is never ++used. ++ ++@item (call @var{function} @var{nargs}) ++Represents a function call. @var{function} is a @code{mem} expression ++whose address is the address of the function to be called. ++@var{nargs} is an expression which can be used for two purposes: on ++some machines it represents the number of bytes of stack argument; on ++others, it represents the number of argument registers. ++ ++Each machine has a standard machine mode which @var{function} must ++have. The machine description defines macro @code{FUNCTION_MODE} to ++expand into the requisite mode name. The purpose of this mode is to ++specify what kind of addressing is allowed, on machines where the ++allowed kinds of addressing depend on the machine mode being ++addressed. ++ ++@item (clobber @var{x}) ++Represents the storing or possible storing of an unpredictable, ++undescribed value into @var{x}, which must be a @code{reg} or ++@code{mem} expression. ++ ++One place this is used is in string instructions that store standard ++values into particular hard registers. It may not be worth the ++trouble to describe the values that are stored, but it is essential to ++inform the compiler that the registers will be altered, lest it ++attempt to keep data in them across the string instruction. ++ ++@var{x} may also be null---a null C pointer, no expression at all. ++Such a @code{(clobber (null))} expression means that all memory ++locations must be presumed clobbered. ++ ++Note that the machine description classifies certain hard registers as ++``call-clobbered''. All function call instructions are assumed by ++default to clobber these registers, so there is no need to use ++@code{clobber} expressions to indicate this fact. Also, each function ++call is assumed to have the potential to alter any memory location, ++unless the function is declared @code{const}. ++ ++When a @code{clobber} expression for a register appears inside a ++@code{parallel} with other side effects, GNU CC guarantees that the ++register is unoccupied both before and after that insn. Therefore, it ++is safe for the assembler code produced by the insn to use the ++register as a temporary. You can clobber either a specific hard ++register or a pseudo register; in the latter case, GNU CC will ++allocate a hard register that is available there for use as a ++temporary. ++ ++If you clobber a pseudo register in this way, use a pseudo register ++which appears nowhere else---generate a new one each time. Otherwise, ++you may confuse CSE. ++ ++There is one other known use for clobbering a pseudo register in a ++@code{parallel}: when one of the input operands of the insn is also ++clobbered by the insn. In this case, using the same pseudo register in ++the clobber and elsewhere in the insn produces the expected results. ++ ++@item (use @var{x}) ++Represents the use of the value of @var{x}. It indicates that the ++value in @var{x} at this point in the program is needed, even though ++it may not be apparent why this is so. Therefore, the compiler will ++not attempt to delete previous instructions whose only effect is to ++store a value in @var{x}. @var{x} must be a @code{reg} expression. ++ ++@item (parallel [@var{x0} @var{x1} @dots{}]) ++Represents several side effects performed in parallel. The square ++brackets stand for a vector; the operand of @code{parallel} is a ++vector of expressions. @var{x0}, @var{x1} and so on are individual ++side effect expressions---expressions of code @code{set}, @code{call}, ++@code{return}, @code{clobber} or @code{use}.@refill ++ ++``In parallel'' means that first all the values used in the individual ++side-effects are computed, and second all the actual side-effects are ++performed. For example, ++ ++@example ++(parallel [(set (reg:SI 1) (mem:SI (reg:SI 1))) ++ (set (mem:SI (reg:SI 1)) (reg:SI 1))]) ++@end example ++ ++@noindent ++says unambiguously that the values of hard register 1 and the memory ++location addressed by it are interchanged. In both places where ++@code{(reg:SI 1)} appears as a memory address it refers to the value ++in register 1 @emph{before} the execution of the insn. ++ ++It follows that it is @emph{incorrect} to use @code{parallel} and ++expect the result of one @code{set} to be available for the next one. ++For example, people sometimes attempt to represent a jump-if-zero ++instruction this way: ++ ++@example ++(parallel [(set (cc0) (reg:SI 34)) ++ (set (pc) (if_then_else ++ (eq (cc0) (const_int 0)) ++ (label_ref @dots{}) ++ (pc)))]) ++@end example ++ ++@noindent ++But this is incorrect, because it says that the jump condition depends ++on the condition code value @emph{before} this instruction, not on the ++new value that is set by this instruction. ++ ++Peephole optimization, which takes place in together with final assembly ++code output, can produce insns whose patterns consist of a @code{parallel} ++whose elements are the operands needed to output the resulting ++assembler code---often @code{reg}, @code{mem} or constant expressions. ++This would not be well-formed RTL at any other stage in compilation, ++but it is ok then because no further optimization remains to be done. ++However, the definition of the macro @code{NOTICE_UPDATE_CC} must ++deal with such insns if you define any peephole optimizations. ++ ++@item (sequence [@var{insns} @dots{}]) ++Represents a sequence of insns. Each of the @var{insns} that appears ++in the vector is suitable for appearing in the chain of insns, so it ++must be an @code{insn}, @code{jump_insn}, @code{call_insn}, ++@code{code_label}, @code{barrier} or @code{note}. ++ ++A @code{sequence} RTX never appears in an actual insn. It represents ++the sequence of insns that result from a @code{define_expand} ++@emph{before} those insns are passed to @code{emit_insn} to insert ++them in the chain of insns. When actually inserted, the individual ++sub-insns are separated out and the @code{sequence} is forgotten. ++@end table ++ ++Three expression codes appear in place of a side effect, as the body of an ++insn, though strictly speaking they do not describe side effects as such: ++ ++@table @code ++@item (asm_input @var{s}) ++Represents literal assembler code as described by the string @var{s}. ++ ++@item (addr_vec:@var{m} [@var{lr0} @var{lr1} @dots{}]) ++Represents a table of jump addresses. The vector elements @var{lr0}, ++etc., are @code{label_ref} expressions. The mode @var{m} specifies ++how much space is given to each address; normally @var{m} would be ++@code{Pmode}. ++ ++@item (addr_diff_vec:@var{m} @var{base} [@var{lr0} @var{lr1} @dots{}]) ++Represents a table of jump addresses expressed as offsets from ++@var{base}. The vector elements @var{lr0}, etc., are @code{label_ref} ++expressions and so is @var{base}. The mode @var{m} specifies how much ++space is given to each address-difference.@refill ++@end table ++ ++@node Incdec, Assembler, Side Effects, RTL ++@section Embedded Side-Effects on Addresses ++ ++Four special side-effect expression codes appear as memory addresses. ++ ++@table @code ++@item (pre_dec:@var{m} @var{x}) ++Represents the side effect of decrementing @var{x} by a standard ++amount and represents also the value that @var{x} has after being ++decremented. @var{x} must be a @code{reg} or @code{mem}, but most ++machines allow only a @code{reg}. @var{m} must be the machine mode ++for pointers on the machine in use. The amount @var{x} is decremented ++by is the length in bytes of the machine mode of the containing memory ++reference of which this expression serves as the address. Here is an ++example of its use:@refill ++ ++@example ++(mem:DF (pre_dec:SI (reg:SI 39))) ++@end example ++ ++@noindent ++This says to decrement pseudo register 39 by the length of a @code{DFmode} ++value and use the result to address a @code{DFmode} value. ++ ++@item (pre_inc:@var{m} @var{x}) ++Similar, but specifies incrementing @var{x} instead of decrementing it. ++ ++@item (post_dec:@var{m} @var{x}) ++Represents the same side effect as @code{pre_dec} but a different ++value. The value represented here is the value @var{x} has @i{before} ++being decremented. ++ ++@item (post_inc:@var{m} @var{x}) ++Similar, but specifies incrementing @var{x} instead of decrementing it. ++@end table ++ ++These embedded side effect expressions must be used with care. Instruction ++patterns may not use them. Until the @samp{flow} pass of the compiler, ++they may occur only to represent pushes onto the stack. The @samp{flow} ++pass finds cases where registers are incremented or decremented in one ++instruction and used as an address shortly before or after; these cases are ++then transformed to use pre- or post-increment or -decrement. ++ ++Explicit popping of the stack could be represented with these embedded ++side effect operators, but that would not be safe; the instruction ++combination pass could move the popping past pushes, thus changing ++the meaning of the code. ++ ++An instruction that can be represented with an embedded side effect ++could also be represented using @code{parallel} containing an additional ++@code{set} to describe how the address register is altered. This is not ++done because machines that allow these operations at all typically ++allow them wherever a memory address is called for. Describing them as ++additional parallel stores would require doubling the number of entries ++in the machine description. ++ ++@node Assembler, Insns, IncDec, RTL ++@section Assembler Instructions as Expressions ++ ++The RTX code @code{asm_operands} represents a value produced by a ++user-specified assembler instruction. It is used to represent ++an @code{asm} statement with arguments. An @code{asm} statement with ++a single output operand, like this: ++ ++@example ++asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z)); ++@end example ++ ++@noindent ++is represented using a single @code{asm_operands} RTX which represents ++the value that is stored in @code{outputvar}: ++ ++@example ++(set @var{rtx-for-outputvar} ++ (asm_operands "foo %1,%2,%0" "a" 0 ++ [@var{rtx-for-addition-result} @var{rtx-for-*z}] ++ [(asm_input:@var{m1} "g") ++ (asm_input:@var{m2} "di")])) ++@end example ++ ++@noindent ++Here the operands of the @code{asm_operands} RTX are the assembler ++template string, the output-operand's constraint, the index-number of the ++output operand among the output operands specified, a vector of input ++operand RTX's, and a vector of input-operand modes and constraints. The ++mode @var{m1} is the mode of the sum @code{x+y}; @var{m2} is that of ++@code{*z}. ++ ++When an @code{asm} statement has multiple output values, its insn has ++several such @code{set} RTX's inside of a @code{parallel}. Each @code{set} ++contains a @code{asm_operands}; all of these share the same assembler ++template and vectors, but each contains the constraint for the respective ++output operand. They are also distinguished by the output-operand index ++number, which is 0, 1, @dots{} for successive output operands. ++ ++@node Insns, Calls, Assembler, RTL ++@section Insns ++ ++The RTL representation of the code for a function is a doubly-linked ++chain of objects called @dfn{insns}. Insns are expressions with ++special codes that are used for no other purpose. Some insns are ++actual instructions; others represent dispatch tables for @code{switch} ++statements; others represent labels to jump to or various sorts of ++declarative information. ++ ++In addition to its own specific data, each insn must have a unique id-number ++that distinguishes it from all other insns in the current function, and ++chain pointers to the preceding and following insns. These three fields ++occupy the same position in every insn, independent of the expression code ++of the insn. They could be accessed with @code{XEXP} and @code{XINT}, ++but instead three special macros are always used: ++ ++@table @code ++@item INSN_UID (@var{i}) ++Accesses the unique id of insn @var{i}. ++ ++@item PREV_INSN (@var{i}) ++Accesses the chain pointer to the insn preceding @var{i}. ++If @var{i} is the first insn, this is a null pointer. ++ ++@item NEXT_INSN (@var{i}) ++Accesses the chain pointer to the insn following @var{i}. ++If @var{i} is the last insn, this is a null pointer. ++@end table ++ ++The @code{NEXT_INSN} and @code{PREV_INSN} pointers must always ++correspond: if @var{insn} is not the first insn, ++ ++@example ++NEXT_INSN (PREV_INSN (@var{insn})) == @var{insn} ++@end example ++ ++@noindent ++is always true. ++ ++Every insn has one of the following six expression codes: ++ ++@table @code ++@item insn ++The expression code @code{insn} is used for instructions that do not jump ++and do not do function calls. Insns with code @code{insn} have four ++additional fields beyond the three mandatory ones listed above. ++These four are described in a table below. ++ ++@item jump_insn ++The expression code @code{jump_insn} is used for instructions that may jump ++(or, more generally, may contain @code{label_ref} expressions). ++@code{jump_insn} insns have the same extra fields as @code{insn} insns, ++accessed in the same way. If there is an instruction to return from the ++current function, it is recorded as a @code{jump_insn}. ++ ++@item call_insn ++The expression code @code{call_insn} is used for instructions that may do ++function calls. It is important to distinguish these instructions because ++they imply that certain registers and memory locations may be altered ++unpredictably. ++ ++@code{call_insn} insns have the same extra fields as @code{insn} insns, ++accessed in the same way. ++ ++@item code_label ++A @code{code_label} insn represents a label that a jump insn can jump to. ++It contains one special field of data in addition to the three standard ones. ++It is used to hold the @dfn{label number}, a number that identifies this ++label uniquely among all the labels in the compilation (not just in the ++current function). Ultimately, the label is represented in the assembler ++output as an assembler label @samp{L@var{n}} where @var{n} is the label number. ++ ++@item barrier ++Barriers are placed in the instruction stream after unconditional ++jump instructions to indicate that the jumps are unconditional. ++They contain no information beyond the three standard fields. ++ ++@item note ++@code{note} insns are used to represent additional debugging and ++declarative information. They contain two nonstandard fields, an ++integer which is accessed with the macro @code{NOTE_LINE_NUMBER} and a ++string accessed with @code{NOTE_SOURCE_FILE}. ++ ++If @code{NOTE_LINE_NUMBER} is positive, the note represents the ++position of a source line and @code{NOTE_SOURCE_FILE} is the source file name ++that the line came from. These notes control generation of line ++number data in the assembler output. ++ ++Otherwise, @code{NOTE_LINE_NUMBER} is not really a line number but a ++code with one of the following values (and @code{NOTE_SOURCE_FILE} ++must contain a null pointer): ++ ++@table @code ++@item NOTE_INSN_DELETED ++Such a note is completely ignorable. Some passes of the compiler ++delete insns by altering them into notes of this kind. ++ ++@item NOTE_INSN_BLOCK_BEG ++@itemx NOTE_INSN_BLOCK_END ++These types of notes indicate the position of the beginning and end ++of a level of scoping of variable names. They control the output ++of debugging information. ++ ++@item NOTE_INSN_LOOP_BEG ++@itemx NOTE_INSN_LOOP_END ++These types of notes indicate the position of the beginning and end ++of a @code{while} or @code{for} loop. They enable the loop optimizer ++to find loops quickly. ++@item NOTE_INSN_FUNCTION_END ++Appears near the end of the function body, just before the label that ++@code{return} statements jump to (on machine where a single instruction ++does not suffice for returning). This note may be deleted by jump ++optimization. ++@item NOTE_INSN_SETJMP ++Appears following each call to @code{setjmp} or a related function. ++ ++@item NOTE_INSN_LOOP_CONT ++Appears at the place in a loop that @code{continue} statements jump to. ++@end table ++ ++These codes are printed symbolically when they appear in debugging dumps. ++@end table ++ ++The machine mode of an insn is normally zero (@code{VOIDmode}), but the ++reload pass sets it to @code{QImode} if the insn needs reloading. ++ ++Here is a table of the extra fields of @code{insn}, @code{jump_insn} ++and @code{call_insn} insns: ++ ++@table @code ++@item PATTERN (@var{i}) ++An expression for the side effect performed by this insn. ++ ++@item INSN_CODE (@var{i}) ++An integer that says which pattern in the machine description matches ++this insn, or -1 if the matching has not yet been attempted. ++ ++Such matching is never attempted and this field is not used on an insn ++whose pattern consists of a single @code{use}, @code{clobber}, ++@code{asm}, @code{addr_vec} or @code{addr_diff_vec} expression. ++ ++@item LOG_LINKS (@var{i}) ++A list (chain of @code{insn_list} expressions) of previous ``related'' ++insns: insns which store into registers values that are used for the ++first time in this insn. (An additional constraint is that neither a ++jump nor a label may come between the related insns). This list is ++set up by the flow analysis pass; it is a null pointer until then. ++ ++@item REG_NOTES (@var{i}) ++A list (chain of @code{expr_list} expressions) giving information ++about the usage of registers in this insn. This list is set up by the ++flow analysis pass; it is a null pointer until then. ++@end table ++ ++The @code{LOG_LINKS} field of an insn is a chain of @code{insn_list} ++expressions. Each of these has two operands: the first is an insn, ++and the second is another @code{insn_list} expression (the next one in ++the chain). The last @code{insn_list} in the chain has a null pointer ++as second operand. The significant thing about the chain is which ++insns appear in it (as first operands of @code{insn_list} ++expressions). Their order is not significant. ++ ++The @code{REG_NOTES} field of an insn is a similar chain but of ++@code{expr_list} expressions instead of @code{insn_list}. There are ++several kinds of register notes, which are distinguished by the machine ++mode of the @code{expr_list}, which in a register note is really ++understood as being an @code{enum reg_note}. The first operand @var{op} ++of the @code{expr_list} is data whose meaning depends on the kind of ++note. Here are the kinds of register note: ++ ++@table @code ++@item REG_DEAD ++The register @var{op} dies in this insn; that is to say, altering the ++value immediately after this insn would not affect the future behavior ++of the program. ++ ++@item REG_INC ++The register @var{op} is incremented (or decremented; at this level ++there is no distinction) by an embedded side effect inside this insn. ++This means it appears in a @code{post_inc}, @code{pre_inc}, ++@code{post_dec} or @code{pre_dec} RTX. ++ ++@item REG_EQUIV ++The register that is set by this insn will be equal to @var{op} at run ++time, and could validly be replaced in all its occurrences by ++@var{op}. (``Validly'' here refers to the data flow of the program; ++simple replacement may make some insns invalid.) ++ ++The value which the insn explicitly copies into the register may look ++different from @var{op}, but they will be equal at run time. ++ ++For example, when a constant is loaded into a register that is never ++assigned any other value, this kind of note is used. ++ ++When a parameter is copied into a pseudo-register at entry to a function, ++a note of this kind records that the register is equivalent to the stack ++slot where the parameter was passed. Although in this case the register ++may be set by other insns, it is still valid to replace the register ++by the stack slot throughout the function. ++ ++@item REG_EQUAL ++The register that is set by this insn will be equal to @var{op} at run ++time at the end of this insn (but not necessarily elsewhere in the ++function). ++ ++The RTX @var{op} is typically an arithmetic expression. For example, ++when a sequence of insns such as a library call is used to perform an ++arithmetic operation, this kind of note is attached to the insn that ++produces or copies the final value. It tells the CSE pass how to ++think of that value. ++ ++@item REG_RETVAL ++This insn copies the value of a library call, and @var{op} is the ++first insn that was generated to set up the arguments for the library ++call. ++ ++Flow analysis uses this note to delete all of a library call whose ++result is dead. ++ ++@item REG_WAS_0 ++The register @var{op} contained zero before this insn. You can rely ++on this note if it is present; its absence implies nothing. ++ ++@item REG_LIBCALL ++This is the inverse of @code{REG_RETVAL}: it is placed on the first ++insn of a library call, and it points to the last one. ++ ++Loop optimization uses this note to move an entire library call out ++of a loop when its value is constant. ++ ++@item REG_NONNEG ++The register @var{op} is known to have nonnegative value when this ++insn is reached. ++@end table ++ ++For convenience, the machine mode in an @code{insn_list} or ++@code{expr_list} is printed using these symbolic codes in debugging dumps. ++ ++The only difference between the expression codes @code{insn_list} and ++@code{expr_list} is that the first operand of an @code{insn_list} is ++assumed to be an insn and is printed in debugging dumps as the insn's ++unique id; the first operand of an @code{expr_list} is printed in the ++ordinary way as an expression. ++ ++@node Calls, Sharing, Insns, RTL ++@section RTL Representation of Function-Call Insns ++ ++Insns that call subroutines have the RTL expression code @code{call_insn}. ++These insns must satisfy special rules, and their bodies must use a special ++RTL expression code, @code{call}. ++ ++A @code{call} expression has two operands, as follows: ++ ++@example ++(call (mem:@var{fm} @var{addr}) @var{nbytes}) ++@end example ++ ++@noindent ++Here @var{nbytes} is an operand that represents the number of bytes of ++argument data being passed to the subroutine, @var{fm} is a machine mode ++(which must equal as the definition of the @code{FUNCTION_MODE} macro in ++the machine description) and @var{addr} represents the address of the ++subroutine. ++ ++For a subroutine that returns no value, the @code{call} RTX as shown above ++is the entire body of the insn. ++ ++For a subroutine that returns a value whose mode is not @code{BLKmode}, ++the value is returned in a hard register. If this register's number is ++@var{r}, then the body of the call insn looks like this: ++ ++@example ++(set (reg:@var{m} @var{r}) ++ (call (mem:@var{fm} @var{addr}) @var{nbytes})) ++@end example ++ ++@noindent ++This RTL expression makes it clear (to the optimizer passes) that the ++appropriate register receives a useful value in this insn. ++ ++Immediately after RTL generation, if the value of the subroutine is ++actually used, this call insn is always followed closely by an insn which ++refers to the register @var{r}. This remains true through all the ++optimizer passes until cross jumping occurs. ++ ++The following insn has one of two forms. Either it copies the value into a ++pseudo-register, like this: ++ ++@example ++(set (reg:@var{m} @var{p}) (reg:@var{m} @var{r})) ++@end example ++ ++@noindent ++or (in the case where the calling function will simply return whatever ++value the call produced, and no operation is needed to do this): ++ ++@example ++(use (reg:@var{m} @var{r})) ++@end example ++ ++@noindent ++Between the call insn and this following insn there may intervene only a ++stack-adjustment insn (and perhaps some @code{note} insns). ++ ++When a subroutine returns a @code{BLKmode} value, it is handled by ++passing to the subroutine the address of a place to store the value. ++So the call insn itself does not ``return'' any value, and it has the ++same RTL form as a call that returns nothing. ++ ++@node Sharing,, Calls, RTL ++@section Structure Sharing Assumptions ++ ++The compiler assumes that certain kinds of RTL expressions are unique; ++there do not exist two distinct objects representing the same value. ++In other cases, it makes an opposite assumption: that no RTL expression ++object of a certain kind appears in more than one place in the ++containing structure. ++ ++These assumptions refer to a single function; except for the RTL ++objects that describe global variables and external functions, ++no RTL objects are common to two functions. ++ ++@itemize @bullet ++@item ++Each pseudo-register has only a single @code{reg} object to represent it, ++and therefore only a single machine mode. ++ ++@item ++For any symbolic label, there is only one @code{symbol_ref} object ++referring to it. ++ ++@item ++There is only one @code{const_int} expression with value zero, ++and only one with value one. ++ ++@item ++There is only one @code{pc} expression. ++ ++@item ++There is only one @code{cc0} expression. ++ ++@item ++There is only one @code{const_double} expression with mode ++@code{SFmode} and value zero, and only one with mode @code{DFmode} and ++value zero. ++ ++@item ++No @code{label_ref} appears in more than one place in the RTL ++structure; in other words, it is safe to do a tree-walk of all the ++insns in the function and assume that each time a @code{label_ref} is ++seen it is distinct from all others that are seen. ++ ++@item ++Only one @code{mem} object is normally created for each static ++variable or stack slot, so these objects are frequently shared in all ++the places they appear. However, separate but equal objects for these ++variables are occasionally made. ++ ++@item ++When a single @code{asm} statement has multiple output operands, ++a distinct @code{asm_operands} RTX is made for each output operand. ++However, these all share the vector which contains the sequence of ++input operands. Because this sharing is used later on to test whether ++two @code{asm_operands} RTX's come from the same statement, the sharing ++must be guaranteed to be preserved. ++ ++@item ++No RTL object appears in more than one place in the RTL structure ++except as described above. Many passes of the compiler rely on this ++by assuming that they can modify RTL objects in place without unwanted ++side-effects on other insns. ++ ++@item ++During initial RTL generation, shared structure is freely introduced. ++After all the RTL for a function has been generated, all shared ++structure is copied by @code{unshare_all_rtl} in @file{emit-rtl.c}, ++after which the above rules are guaranteed to be followed. ++ ++@item ++During the combiner pass, shared structure with an insn can exist ++temporarily. However, the shared structure is copied before the ++combiner is finished with the insn. This is done by ++@code{copy_substitutions} in @file{combine.c}. ++@end itemize ++ ++@node Machine Desc, Machine Macros, RTL, Top ++@chapter Machine Descriptions ++ ++A machine description has two parts: a file of instruction patterns ++(@file{.md} file) and a C header file of macro definitions. ++ ++The @file{.md} file for a target machine contains a pattern for each ++instruction that the target machine supports (or at least each instruction ++that is worth telling the compiler about). It may also contain comments. ++A semicolon causes the rest of the line to be a comment, unless the semicolon ++is inside a quoted string. ++ ++See the next chapter for information on the C header file. ++ ++@menu ++* Patterns:: How to write instruction patterns. ++* Example:: An explained example of a @code{define_insn} pattern. ++* RTL Template:: The RTL template defines what insns match a pattern. ++* Output Template:: The output template says how to make assembler code ++ from such an insn. ++* Output Statement:: For more generality, write C code to output ++ the assembler code. ++* Constraints:: When not all operands are general operands. ++* Standard Names:: Names mark patterns to use for code generation. ++* Pattern Ordering:: When the order of patterns makes a difference. ++* Dependent Patterns:: Having one pattern may make you need another. ++* Jump Patterns:: Special considerations for patterns for jump insns. ++* Peephole Definitions::Defining machine-specific peephole optimizations. ++* Expander Definitions::Generating a sequence of several RTL insns ++ for a standard operation. ++@end menu ++ ++@node Patterns, Example, Machine Desc, Machine Desc ++@section Everything about Instruction Patterns ++ ++Each instruction pattern contains an incomplete RTL expression, with pieces ++to be filled in later, operand constraints that restrict how the pieces can ++be filled in, and an output pattern or C code to generate the assembler ++output, all wrapped up in a @code{define_insn} expression. ++ ++A @code{define_insn} is an RTL expression containing four or five operands: ++ ++@enumerate ++@item ++An optional name. The presence of a name indicate that this instruction ++pattern can perform a certain standard job for the RTL-generation ++pass of the compiler. This pass knows certain names and will use ++the instruction patterns with those names, if the names are defined ++in the machine description. ++ ++The absence of a name is indicated by writing an empty string ++where the name should go. Nameless instruction patterns are never ++used for generating RTL code, but they may permit several simpler insns ++to be combined later on. ++ ++Names that are not thus known and used in RTL-generation have no ++effect; they are equivalent to no name at all. ++ ++@item ++The @dfn{RTL template} (@pxref{RTL Template}) is a vector of ++incomplete RTL expressions which show what the instruction should look ++like. It is incomplete because it may contain @code{match_operand} ++and @code{match_dup} expressions that stand for operands of the ++instruction. ++ ++If the vector has only one element, that element is the template for the ++instruction pattern. If the vector has multiple elements, then the ++instruction pattern is a @code{parallel} expression containing the ++elements described. ++ ++@item ++A condition. This is a string which contains a C expression that is ++the final test to decide whether an insn body matches this pattern. ++ ++For a named pattern, the condition (if present) may not depend on ++the data in the insn being matched, but only the target-machine-type ++flags. The compiler needs to test these conditions during ++initialization in order to learn exactly which named instructions are ++available in a particular run. ++ ++For nameless patterns, the condition is applied only when matching an ++individual insn, and only after the insn has matched the pattern's ++recognition template. The insn's operands may be found in the vector ++@code{operands}. ++ ++@item ++The @dfn{output template}: a string that says how to output matching ++insns as assembler code. @samp{%} in this string specifies where ++to substitute the value of an operand. @xref{Output Template}. ++ ++When simple substitution isn't general enough, you can specify a piece ++of C code to compute the output. @xref{Output Statement}. ++ ++@item ++Optionally, some @dfn{machine-specific information}. The meaning ++of this information is defined only by an individual machine description; ++typically it might say whether this insn alters the condition codes, ++or how many bytes of output it generates. ++ ++This operand is written as a string containing a C initializer ++(complete with braces) for the structure type @code{INSN_MACHINE_INFO}, ++whose definition is up to you (@pxref{Misc}). ++@end enumerate ++ ++@node Example, RTL Template, Patterns, Machine Desc ++@section Example of @code{define_insn} ++ ++Here is an actual example of an instruction pattern, for the 68000/68020. ++ ++@example ++(define_insn "tstsi" ++ [(set (cc0) ++ (match_operand:SI 0 "general_operand" "rm"))] ++ "" ++ "* ++@{ if (TARGET_68020 || ! ADDRESS_REG_P (operands[0])) ++ return \"tstl %0\"; ++ return \"cmpl #0,%0\"; @}") ++@end example ++ ++This is an instruction that sets the condition codes based on the value of ++a general operand. It has no condition, so any insn whose RTL description ++has the form shown may be handled according to this pattern. The name ++@samp{tstsi} means ``test a @code{SImode} value'' and tells the RTL generation ++pass that, when it is necessary to test such a value, an insn to do so ++can be constructed using this pattern. ++ ++The output control string is a piece of C code which chooses which ++output template to return based on the kind of operand and the specific ++type of CPU for which code is being generated. ++ ++@samp{"rm"} is an operand constraint. Its meaning is explained below. ++ ++@node RTL Template, Output Template, Example, Machine Desc ++@section RTL Template for Generating and Recognizing Insns ++ ++The RTL template is used to define which insns match the particular pattern ++and how to find their operands. For named patterns, the RTL template also ++says how to construct an insn from specified operands. ++ ++Construction involves substituting specified operands into a copy of the ++template. Matching involves determining the values that serve as the ++operands in the insn being matched. Both of these activities are ++controlled by special expression types that direct matching and ++substitution of the operands. ++ ++@table @code ++@item (match_operand:@var{m} @var{n} @var{pred} @var{constraint}) ++This expression is a placeholder for operand number @var{n} of ++the insn. When constructing an insn, operand number @var{n} ++will be substituted at this point. When matching an insn, whatever ++appears at this position in the insn will be taken as operand ++number @var{n}; but it must satisfy @var{pred} or this instruction ++pattern will not match at all. ++ ++Operand numbers must be chosen consecutively counting from zero in ++each instruction pattern. There may be only one @code{match_operand} ++expression in the pattern for each operand number. Usually operands ++are numbered in the order of appearance in @code{match_operand} ++expressions. ++ ++@var{pred} is a string that is the name of a C function that accepts ++two arguments, an expression and a machine mode. During matching, the ++function will be called with the putative operand as the expression ++and @var{m} as the mode argument. If it returns zero, this ++instruction pattern fails to match. @var{pred} may be an empty ++string; then it means no test is to be done on the operand, ++so anything which occurs in this position is valid. ++ ++@var{constraint} controls reloading and the choice of the best register ++class to use for a value, as explained later (@pxref{Constraints}). ++ ++People are often unclear on the difference between the constraint and the ++predicate. The predicate helps decide whether a given insn matches the ++pattern. The constraint plays no role in this decision; instead, it ++controls various decisions in the case of an insn which does match. ++ ++Most often, @var{pred} is @code{"general_operand"}. This function checks ++that the putative operand is either a constant, a register or a memory ++reference, and that it is valid for mode @var{m}. ++ ++For an operand that must be a register, @var{pred} should be ++@code{"register_operand"}. It would be valid to use ++@code{"general_operand"}, since the reload pass would copy any ++non-register operands through registers, but this would make GNU CC do ++extra work, and it would prevent the register allocator from doing the ++best possible job. ++ ++For an operand that must be a constant, either @var{pred} should be ++@code{"immediate_operand"}, or the instruction pattern's extra ++condition should check for constants, or both. You cannot expect the ++constraints to do this work! If the constraints allow only constants, ++but the predicate allows something else, the compiler will crash when ++that case arises. ++ ++@item (match_dup @var{n}) ++This expression is also a placeholder for operand number @var{n}. ++It is used when the operand needs to appear more than once in the ++insn. ++ ++In construction, @code{match_dup} behaves exactly like ++@code{match_operand}: the operand is substituted into the insn being ++constructed. But in matching, @code{match_dup} behaves differently. ++It assumes that operand number @var{n} has already been determined by ++a @code{match_operand} appearing earlier in the recognition template, ++and it matches only an identical-looking expression. ++ ++@item (match_operator:@var{m} @var{n} "@var{predicate}" [@var{operands}@dots{}]) ++This pattern is a kind of placeholder for a variable RTL expression ++code. ++ ++When constructing an insn, it stands for an RTL expression whose ++expression code is taken from that of operand @var{n}, and whose ++operands are constructed from the patterns @var{operands}. ++ ++When matching an expression, it matches an expression if the function ++@var{predicate} returns nonzero on that expression @emph{and} the ++patterns @var{operands} match the operands of the expression. ++ ++Suppose that the function @code{commutative_operator} is defined as ++follows, to match any expression whose operator is one of the six ++commutative arithmetic operators of RTL and whose mode is @var{mode}: ++ ++@example ++int ++commutative_operator (x, mode) ++ rtx x; ++ enum machine_mode mode; ++@{ ++ enum rtx_code code = GET_CODE (x); ++ if (GET_MODE (x) != mode) ++ return 0; ++ return (code == PLUS || code == MULT || code == UMULT ++ || code == AND || code == IOR || code == XOR); ++@} ++@end example ++ ++Then the following pattern will match any RTL expression consisting ++of a commutative operator applied to two general operands: ++ ++@example ++(match_operator:SI 2 "commutative_operator" ++ [(match_operand:SI 3 "general_operand" "g") ++ (match_operand:SI 4 "general_operand" "g")]) ++@end example ++ ++Here the vector @code{[@var{operands}@dots{}]} contains two patterns ++because the expressions to be matched all contain two operands. ++ ++When this pattern does match, the two operands of the commutative ++operator are recorded as operands 3 and 4 of the insn. (This is done ++by the two instances of @code{match_operand}.) Operand 2 of the insn ++will be the entire commutative expression: use @code{GET_CODE ++(operands[2])} to see which commutative operator was used. ++ ++The machine mode @var{m} of @code{match_operator} works like that of ++@code{match_operand}: it is passed as the second argument to the ++predicate function, and that function is solely responsible for ++deciding whether the expression to be matched ``has'' that mode. ++ ++When constructing an insn, argument 2 of the gen-function will specify ++the operation (i.e. the expression code) for the expression to be ++made. It should be an RTL expression, whose expression code is copied ++into a new expression whose operands are arguments 3 and 4 of the ++gen-function. The subexpressions of argument 2 are not used; ++only its expression code matters. ++ ++There is no way to specify constraints in @code{match_operator}. The ++operand of the insn which corresponds to the @code{match_operator} ++never has any constraints because it is never reloaded as a whole. ++However, if parts of its @var{operands} are matched by ++@code{match_operand} patterns, those parts may have constraints of ++their own. ++ ++@item (address (match_operand:@var{m} @var{n} "address_operand" "")) ++This complex of expressions is a placeholder for an operand number ++@var{n} in a ``load address'' instruction: an operand which specifies ++a memory location in the usual way, but for which the actual operand ++value used is the address of the location, not the contents of the ++location. ++ ++@code{address} expressions never appear in RTL code, only in machine ++descriptions. And they are used only in machine descriptions that do ++not use the operand constraint feature. When operand constraints are ++in use, the letter @samp{p} in the constraint serves this purpose. ++ ++@var{m} is the machine mode of the @emph{memory location being ++addressed}, not the machine mode of the address itself. That mode is ++always the same on a given target machine (it is @code{Pmode}, which ++normally is @code{SImode}), so there is no point in mentioning it; ++thus, no machine mode is written in the @code{address} expression. If ++some day support is added for machines in which addresses of different ++kinds of objects appear differently or are used differently (such as ++the PDP-10), different formats would perhaps need different machine ++modes and these modes might be written in the @code{address} ++expression. ++@end table ++ ++@node Output Template, Output Statement, RTL Template, Machine Desc ++@section Output Templates and Operand Substitution ++ ++The @dfn{output template} is a string which specifies how to output the ++assembler code for an instruction pattern. Most of the template is a ++fixed string which is output literally. The character @samp{%} is used ++to specify where to substitute an operand; it can also be used to ++identify places where different variants of the assembler require ++different syntax. ++ ++In the simplest case, a @samp{%} followed by a digit @var{n} says to output ++operand @var{n} at that point in the string. ++ ++@samp{%} followed by a letter and a digit says to output an operand in an ++alternate fashion. Four letters have standard, built-in meanings described ++below. The machine description macro @code{PRINT_OPERAND} can define ++additional letters with nonstandard meanings. ++ ++@samp{%c@var{digit}} can be used to substitute an operand that is a ++constant value without the syntax that normally indicates an immediate ++operand. ++ ++@samp{%n@var{digit}} is like @samp{%c@var{digit}} except that the value of ++the constant is negated before printing. ++ ++@samp{%a@var{digit}} can be used to substitute an operand as if it were a ++memory reference, with the actual operand treated as the address. This may ++be useful when outputting a ``load address'' instruction, because often the ++assembler syntax for such an instruction requires you to write the operand ++as if it were a memory reference. ++ ++@samp{%l@var{digit}} is used to substitute a @code{label_ref} into a jump ++instruction. ++ ++@samp{%} followed by a punctuation character specifies a substitution that ++does not use an operand. Only one case is standard: @samp{%%} outputs a ++@samp{%} into the assembler code. Other nonstandard cases can be ++defined in the @code{PRINT_OPERAND} macro. You must also define ++which punctuation characters are valid with the ++@code{PRINT_OPERAND_PUNCT_VALID_P} macro. ++ ++The template may generate multiple assembler instructions. Write the text ++for the instructions, with @samp{\;} between them. ++ ++When the RTL contains two operands which are required by constraint to match ++each other, the output template must refer only to the lower-numbered operand. ++Matching operands are not always identical, and the rest of the compiler ++arranges to put the proper RTL expression for printing into the lower-numbered ++operand. ++ ++One use of nonstandard letters or punctuation following @samp{%} is to ++distinguish between different assembler languages for the same machine; for ++example, Motorola syntax versus MIT syntax for the 68000. Motorola syntax ++requires periods in most opcode names, while MIT syntax does not. For ++example, the opcode @samp{movel} in MIT syntax is @samp{move.l} in Motorola ++syntax. The same file of patterns is used for both kinds of output syntax, ++but the character sequence @samp{%.} is used in each place where Motorola ++syntax wants a period. The @code{PRINT_OPERAND} macro for Motorola syntax ++defines the sequence to output a period; the macro for MIT syntax defines ++it to do nothing. ++ ++@node Output Statement, Constraints, Output Template, Machine Desc ++@section C Statements for Generating Assembler Output ++ ++Often a single fixed template string cannot produce correct and efficient ++assembler code for all the cases that are recognized by a single ++instruction pattern. For example, the opcodes may depend on the kinds of ++operands; or some unfortunate combinations of operands may require extra ++machine instructions. ++ ++If the output control string starts with a @samp{*}, then it is not an ++output template but rather a piece of C program that should compute a ++template. It should execute a @code{return} statement to return the ++template-string you want. Most such templates use C string literals, which ++require doublequote characters to delimit them. To include these ++doublequote characters in the string, prefix each one with @samp{\}. ++ ++The operands may be found in the array @code{operands}, whose C data type ++is @code{rtx []}. ++ ++It is possible to output an assembler instruction and then go on to output ++or compute more of them, using the subroutine @code{output_asm_insn}. This ++receives two arguments: a template-string and a vector of operands. The ++vector may be @code{operands}, or it may be another array of @code{rtx} ++that you declare locally and initialize yourself. ++ ++When an insn pattern has multiple alternatives in its constraints, often ++the appearance of the assembler code is determined mostly by which alternative ++was matched. When this is so, the C code can test the variable ++@code{which_alternative}, which is the ordinal number of the alternative ++that was actually satisfied (0 for the first, 1 for the second alternative, ++etc.). ++ ++For example, suppose there are two opcodes for storing zero, @samp{clrreg} ++for registers and @samp{clrmem} for memory locations. Here is how ++a pattern could use @code{which_alternative} to choose between them: ++ ++@example ++(define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "=r,m") ++ (const_int 0))] ++ "" ++ "* ++ return (which_alternative == 0 ++ ? \"clrreg %0\" : \"clrmem %0\"); ++ ") ++@end example ++ ++@node Constraints, Standard Names, Output Statement, Machine Desc ++@section Operand Constraints ++ ++Each @code{match_operand} in an instruction pattern can specify a ++constraint for the type of operands allowed. Constraints can say whether ++an operand may be in a register, and which kinds of register; whether the ++operand can be a memory reference, and which kinds of address; whether the ++operand may be an immediate constant, and which possible values it may ++have. Constraints can also require two operands to match. ++ ++@menu ++* Simple Constraints:: Basic use of constraints. ++* Multi-Alternative:: When an insn has two alternative constraint-patterns. ++* Class Preferences:: Constraints guide which hard register to put things in. ++* Modifiers:: More precise control over effects of constraints. ++* No Constraints:: Describing a clean machine without constraints. ++@end menu ++ ++@node Simple Constraints, Multi-Alternative, Constraints, Constraints ++@subsection Simple Constraints ++ ++The simplest kind of constraint is a string full of letters, each of ++which describes one kind of operand that is permitted. Here are ++the letters that are allowed: ++ ++@table @asis ++@item @samp{m} ++A memory operand is allowed, with any kind of address that the machine ++supports in general. ++ ++@item @samp{o} ++A memory operand is allowed, but only if the address is ++@dfn{offsettable}. This means that adding a small integer (actually, ++the width in bytes of the operand, as determined by its machine mode) ++may be added to the address and the result is also a valid memory ++address. ++ ++For example, an address which is constant is offsettable; so is an ++address that is the sum of a register and a constant (as long as a ++slightly larger constant is also within the range of address-offsets ++supported by the machine); but an autoincrement or autodecrement ++address is not offsettable. More complicated indirect/indexed ++addresses may or may not be offsettable depending on the other ++addressing modes that the machine supports. ++ ++Note that in an output operand which can be matched by another ++operand, the constraint letter @samp{o} is valid only when accompanied ++by both @samp{<} (if the target machine has predecrement addressing) ++and @samp{>} (if the target machine has preincrement addressing). ++ ++When the constraint letter @samp{o} is used, the reload pass may ++generate instructions which copy a nonoffsettable address into an index ++register. The idea is that the register can be used as a replacement ++offsettable address. But this method requires that there be patterns ++to copy any kind of address into a register. Auto-increment ++and auto-decrement addresses are an exception; there need not be an ++instruction that can copy such an address into a register, because ++reload handles these cases specially. ++ ++Most older machine designs have ``load address'' instructions which do ++just what is needed here. Some RISC machines do not advertise such ++instructions, but the possible addresses on these machines are very ++limited, so it is easy to fake them. ++ ++@item @samp{<} ++A memory operand with autodecrement addressing (either predecrement or ++postdecrement) is allowed. ++ ++@item @samp{>} ++A memory operand with autoincrement addressing (either preincrement or ++postincrement) is allowed. ++ ++@item @samp{r} ++A register operand is allowed provided that it is in a general ++register. ++ ++@item @samp{d}, @samp{a}, @samp{f}, @dots{} ++Other letters can be defined in machine-dependent fashion to stand for ++particular classes of registers. @samp{d}, @samp{a} and @samp{f} are ++defined on the 68000/68020 to stand for data, address and floating ++point registers. ++ ++@item @samp{i} ++An immediate integer operand (one with constant value) is allowed. ++This includes symbolic constants whose values will be known only at ++assembly time. ++ ++@item @samp{n} ++An immediate integer operand with a known numeric value is allowed. ++Many systems cannot support assembly-time constants for operands less ++than a word wide. Constraints for these operands should use @samp{n} ++rather than @samp{i}. ++ ++@item @samp{I}, @samp{J}, @samp{K}, @dots{} ++Other letters in the range @samp{I} through @samp{M} may be defined in ++a machine-dependent fashion to permit immediate integer operands with ++explicit integer values in specified ranges. For example, on the ++68000, @samp{I} is defined to stand for the range of values 1 to 8. ++This is the range permitted as a shift count in the shift ++instructions. ++ ++@item @samp{F} ++An immediate floating operand (expression code @code{const_double}) is ++allowed. ++ ++@item @samp{G}, @samp{H} ++@samp{G} and @samp{H} may be defined in a machine-dependent fashion to ++permit immediate floating operands in particular ranges of values. ++ ++@item @samp{s} ++An immediate integer operand whose value is not an explicit integer is ++allowed. ++ ++This might appear strange; if an insn allows a constant operand with a ++value not known at compile time, it certainly must allow any known ++value. So why use @samp{s} instead of @samp{i}? Sometimes it allows ++better code to be generated. ++ ++For example, on the 68000 in a fullword instruction it is possible to ++use an immediate operand; but if the immediate value is between -128 ++and 127, better code results from loading the value into a register and ++using the register. This is because the load into the register can be ++done with a @samp{moveq} instruction. We arrange for this to happen ++by defining the letter @samp{K} to mean ``any integer outside the ++range -128 to 127'', and then specifying @samp{Ks} in the operand ++constraints. ++ ++@item @samp{g} ++Any register, memory or immediate integer operand is allowed, except for ++registers that are not general registers. ++ ++@item @samp{@var{n}} (a digit) ++An operand that matches operand number @var{n} is allowed. ++If a digit is used together with letters, the digit should come last. ++ ++This is called a @dfn{matching constraint} and what it really means is ++that the assembler has only a single operand that fills two roles ++considered separate in the RTL insn. For example, an add insn has two ++input operands and one output operand in the RTL, but on most machines ++an add instruction really has only two operands, one of them an ++input-output operand. ++ ++Matching constraints work only in circumstances like that add insn. ++More precisely, the matching constraint must appear in an input-only ++operand and the operand that it matches must be an output-only operand ++with a lower number. Thus, operand @var{n} must have @samp{=} in its ++constraint. ++ ++For operands to match in a particular case usually means that they ++are identical-looking RTL expressions. But in a few special cases ++specific kinds of dissimilarity are allowed. For example, @code{*x} ++as an input operand will match @code{*x++} as an output operand. ++For proper results in such cases, the output template should always ++use the output-operand's number when printing the operand. ++ ++@item @samp{p} ++An operand that is a valid memory address is allowed. This is ++for ``load address'' and ``push address'' instructions. ++ ++@samp{p} in the constraint must be accompanies by @code{address_operand} ++as the predicate in the @code{match_operand}. ++@end table ++ ++In order to have valid assembler code, each operand must satisfy ++its constraint. But a failure to do so does not prevent the pattern ++from applying to an insn. Instead, it directs the compiler to modify ++the code so that the constraint will be satisfied. Usually this is ++done by copying an operand into a register. ++ ++Contrast, therefore, the two instruction patterns that follow: ++ ++@example ++(define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "=r") ++ (plus:SI (match_dup 0) ++ (match_operand:SI 1 "general_operand" "r")))] ++ "" ++ "@dots{}") ++@end example ++ ++@noindent ++which has two operands, one of which must appear in two places, and ++ ++@example ++(define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "=r") ++ (plus:SI (match_operand:SI 1 "general_operand" "0") ++ (match_operand:SI 2 "general_operand" "r")))] ++ "" ++ "@dots{}") ++@end example ++ ++@noindent ++which has three operands, two of which are required by a constraint to be ++identical. If we are considering an insn of the form ++ ++@example ++(insn @var{n} @var{prev} @var{next} ++ (set (reg:SI 3) ++ (plus:SI (reg:SI 6) (reg:SI 109))) ++ @dots{}) ++@end example ++ ++@noindent ++the first pattern would not apply at all, because this insn does not ++contain two identical subexpressions in the right place. The pattern would ++say, ``That does not look like an add instruction; try other patterns.'' ++The second pattern would say, ``Yes, that's an add instruction, but there ++is something wrong with it.'' It would direct the reload pass of the ++compiler to generate additional insns to make the constraint true. The ++results might look like this: ++ ++@example ++(insn @var{n2} @var{prev} @var{n} ++ (set (reg:SI 3) (reg:SI 6)) ++ @dots{}) ++ ++(insn @var{n} @var{n2} @var{next} ++ (set (reg:SI 3) ++ (plus:SI (reg:SI 3) (reg:SI 109))) ++ @dots{}) ++@end example ++ ++It is up to you to make sure that each operand, in each pattern, has ++constraints that can handle any RTL expression that could be present for ++that operand. (When multiple alternatives are in use, each pattern must, ++for each possible combination of operand expressions, have at least one ++alternative which can handle that combination of operands.) The ++constraints don't need to @emph{allow} any possible operand---when this is ++the case, they do not constrain---but they must at least point the way to ++reloading any possible operand so that it will fit. ++ ++@itemize @bullet ++@item ++If the constraint accepts whatever operands the predicate permits, ++there is no problem: reloading is never necessary for this operand. ++ ++For example, an operand whose constraints permit everything except ++registers is safe provided its predicate rejects registers. ++ ++An operand whose predicate accepts only constant values is safe ++provided its constraints include the letter @samp{i}. If any possible ++constant value is accepted, then nothing less than @samp{i} will do; ++if the predicate is more selective, then the constraints may also be ++more selective. ++ ++@item ++Any operand expression can be reloaded by copying it into a register. ++So if an operand's constraints allow some kind of register, it is ++certain to be safe. It need not permit all classes of registers; the ++compiler knows how to copy a register into another register of the ++proper class in order to make an instruction valid. ++ ++@item ++A nonoffsettable memory reference can be reloaded by copying the ++address into a register. So if the constraint uses the letter ++@samp{o}, all memory references are taken care of. ++ ++@item ++A constant operand can be reloaded by allocating space in memory to ++hold it as preinitialized data. Then the memory reference can be used ++in place of the constant. So if the constraint uses the letters ++@samp{o} or @samp{m}, constant operands are not a problem. ++@end itemize ++ ++If the operand's predicate can recognize registers, but the constraint does ++not permit them, it can make the compiler crash. When this operand happens ++to be a register, the reload pass will be stymied, because it does not know ++how to copy a register temporarily into memory. ++ ++@node Multi-Alternative, Class Preferences, Simple Constraints, Constraints ++@subsection Multiple Alternative Constraints ++ ++Sometimes a single instruction has multiple alternative sets of possible ++operands. For example, on the 68000, a logical-or instruction can combine ++register or an immediate value into memory, or it can combine any kind of ++operand into a register; but it cannot combine one memory location into ++another. ++ ++These constraints are represented as multiple alternatives. An alternative ++can be described by a series of letters for each operand. The overall ++constraint for an operand is made from the letters for this operand ++from the first alternative, a comma, the letters for this operand from ++the second alternative, a comma, and so on until the last alternative. ++Here is how it is done for fullword logical-or on the 68000: ++ ++@example ++(define_insn "iorsi3" ++ [(set (match_operand:SI 0 "general_operand" "=m,d") ++ (ior:SI (match_operand:SI 1 "general_operand" "%0,0") ++ (match_operand:SI 2 "general_operand" "dKs,dmKs")))] ++ @dots{}) ++@end example ++ ++The first alternative has @samp{m} (memory) for operand 0, @samp{0} for ++operand 1 (meaning it must match operand 0), and @samp{dKs} for operand ++2. The second alternative has @samp{d} (data register) for operand 0, ++@samp{0} for operand 1, and @samp{dmKs} for operand 2. The @samp{=} and ++@samp{%} in the constraints apply to all the alternatives; their meaning ++is explained in the next section. ++ ++If all the operands fit any one alternative, the instruction is valid. ++Otherwise, for each alternative, the compiler counts how many instructions ++must be added to copy the operands so that that alternative applies. ++The alternative requiring the least copying is chosen. If two alternatives ++need the same amount of copying, the one that comes first is chosen. ++These choices can be altered with the @samp{?} and @samp{!} characters: ++ ++@table @samp ++@item ? ++Disparage slightly the alternative that the @samp{?} appears in, ++as a choice when no alternative applies exactly. The compiler regards ++this alternative as one unit more costly for each @samp{?} that appears ++in it. ++ ++@item ! ++Disparage severely the alternative that the @samp{!} appears in. ++When operands must be copied into registers, the compiler will ++never choose this alternative as the one to strive for. ++@end table ++ ++When an insn pattern has multiple alternatives in its constraints, often ++the appearance of the assembler code is determined mostly by which ++alternative was matched. When this is so, the C code for writing the ++assembler code can use the variable @code{which_alternative}, which is ++the ordinal number of the alternative that was actually satisfied (0 for ++the first, 1 for the second alternative, etc.). For example: ++ ++@example ++(define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "=r,m") ++ (const_int 0))] ++ "" ++ "* ++ return (which_alternative == 0 ++ ? \"clrreg %0\" : \"clrmem %0\"); ++ ") ++@end example ++ ++@node Class Preferences, Modifiers, Multi-Alternative, Constraints ++@subsection Register Class Preferences ++ ++The operand constraints have another function: they enable the compiler ++to decide which kind of hardware register a pseudo register is best ++allocated to. The compiler examines the constraints that apply to the ++insns that use the pseudo register, looking for the machine-dependent ++letters such as @samp{d} and @samp{a} that specify classes of registers. ++The pseudo register is put in whichever class gets the most ``votes''. ++The constraint letters @samp{g} and @samp{r} also vote: they vote in ++favor of a general register. The machine description says which registers ++are considered general. ++ ++Of course, on some machines all registers are equivalent, and no register ++classes are defined. Then none of this complexity is relevant. ++ ++@node Modifiers, No Constraints, Class Preferences, Constraints ++@subsection Constraint Modifier Characters ++ ++@table @samp ++@item = ++Means that this operand is write-only for this instruction: the previous ++value is discarded and replaced by output data. ++ ++@item + ++Means that this operand is both read and written by the instruction. ++ ++When the compiler fixes up the operands to satisfy the constraints, ++it needs to know which operands are inputs to the instruction and ++which are outputs from it. @samp{=} identifies an output; @samp{+} ++identifies an operand that is both input and output; all other operands ++are assumed to be input only. ++ ++@item & ++Means (in a particular alternative) that this operand is written ++before the instruction is finished using the input operands. ++Therefore, this operand may not lie in a register that is used as an ++input operand or as part of any memory address. ++ ++@samp{&} applies only to the alternative in which it is written. In ++constraints with multiple alternatives, sometimes one alternative ++requires @samp{&} while others do not. See, for example, the ++@samp{movdf} insn of the 68000. ++ ++@samp{&} does not obviate the need to write @samp{=}. ++ ++@item % ++Declares the instruction to be commutative for this operand and the ++following operand. This means that the compiler may interchange the ++two operands if that is the cheapest way to make all operands fit the ++constraints. This is often used in patterns for addition instructions ++that really have only two operands: the result must go in one of the ++arguments. Here for example, is how the 68000 halfword-add ++instruction is defined: ++ ++@example ++(define_insn "addhi3" ++ [(set (match_operand:HI 0 "general_operand" "=m,r") ++ (plus:HI (match_operand:HI 1 "general_operand" "%0,0") ++ (match_operand:HI 2 "general_operand" "di,g")))] ++ @dots{}) ++@end example ++ ++Note that in previous versions of GNU CC the @samp{%} constraint ++modifier always applied to operands 1 and 2 regardless of which ++operand it was written in. The usual custom was to write it in ++operand 0. Now it must be in operand 1 if the operands to be ++exchanged are 1 and 2. ++ ++@item # ++Says that all following characters, up to the next comma, are to be ++ignored as a constraint. They are significant only for choosing ++register preferences. ++ ++@item * ++Says that the following character should be ignored when choosing ++register preferences. @samp{*} has no effect on the meaning of the ++constraint as a constraint. ++ ++Here is an example: the 68000 has an instruction to sign-extend a ++halfword in a data register, and can also sign-extend a value by ++copying it into an address register. While either kind of register is ++acceptable, the constraints on an address-register destination are ++less strict, so it is best if register allocation makes an address ++register its goal. Therefore, @samp{*} is used so that the @samp{d} ++constraint letter (for data register) is ignored when computing ++register preferences. ++ ++@example ++(define_insn "extendhisi2" ++ [(set (match_operand:SI 0 "general_operand" "=*d,a") ++ (sign_extend:SI ++ (match_operand:HI 1 "general_operand" "0,g")))] ++ @dots{}) ++@end example ++@end table ++ ++@node No Constraints,, Modifiers, Constraints ++@subsection Not Using Constraints ++ ++Some machines are so clean that operand constraints are not required. For ++example, on the Vax, an operand valid in one context is valid in any other ++context. On such a machine, every operand constraint would be @samp{g}, ++excepting only operands of ``load address'' instructions which are ++written as if they referred to a memory location's contents but actual ++refer to its address. They would have constraint @samp{p}. ++ ++For such machines, instead of writing @samp{g} and @samp{p} for all ++the constraints, you can choose to write a description with empty constraints. ++Then you write @samp{""} for the constraint in every @code{match_operand}. ++Address operands are identified by writing an @code{address} expression ++around the @code{match_operand}, not by their constraints. ++ ++When the machine description has just empty constraints, certain parts ++of compilation are skipped, making the compiler faster. However, ++few machines actually do not need constraints; all machine descriptions ++now in existence use constraints. ++ ++@node Standard Names, Pattern Ordering, Constraints, Machine Desc ++@section Standard Names for Patterns Used in Generation ++ ++Here is a table of the instruction names that are meaningful in the RTL ++generation pass of the compiler. Giving one of these names to an ++instruction pattern tells the RTL generation pass that it can use the ++pattern in to accomplish a certain task. ++ ++@table @asis ++@item @samp{mov@var{m}} ++Here @var{m} stands for a two-letter machine mode name, in lower case. ++This instruction pattern moves data with that machine mode from operand ++1 to operand 0. For example, @samp{movsi} moves full-word data. ++ ++If operand 0 is a @code{subreg} with mode @var{m} of a register whose ++own mode is wider than @var{m}, the effect of this instruction is ++to store the specified value in the part of the register that corresponds ++to mode @var{m}. The effect on the rest of the register is undefined. ++ ++This class of patterns is special in several ways. First of all, each ++of these names @emph{must} be defined, because there is no other way ++to copy a datum from one place to another. ++ ++Second, these patterns are not used solely in the RTL generation pass. ++Even the reload pass can generate move insns to copy values from stack ++slots into temporary registers. When it does so, one of the operands is ++a hard register and the other is an operand that can need to be reloaded ++into a register. ++ ++Therefore, when given such a pair of operands, the pattern must generate ++RTL which needs no reloading and needs no temporary registers---no ++registers other than the operands. For example, if you support the ++pattern with a @code{define_expand}, then in such a case the ++@code{define_expand} mustn't call @code{force_reg} or any other such ++function which might generate new pseudo registers. ++ ++This requirement exists even for subword modes on a RISC machine where ++fetching those modes from memory normally requires several insns and ++some temporary registers. Look in @file{spur.md} to see how the ++requirement can be satisfied. ++ ++The variety of operands that have reloads depends on the rest of the ++machine description, but typically on a RISC machine these can only be ++pseudo registers that did not get hard registers, while on other ++machines explicit memory references will get optional reloads. ++ ++The constraints on a @samp{move@var{m}} must allow any hard register to ++be moved to any other hard register (provided that ++@code{HARD_REGNO_MODE_OK} permits mode @var{m} in both registers). ++ ++It is obligatory to support floating point @samp{move@var{m}} ++instructions into and out of any registers that can hold fixed point ++values, because unions and structures (which have modes @code{SImode} or ++@code{DImode}) can be in those registers and they may have floating ++point members. ++ ++There may also be a need to support fixed point @samp{move@var{m}} ++instructions in and out of floating point registers. Unfortunately, I ++have forgotten why this was so, and I don't know whether it is still ++true. If @code{HARD_REGNO_MODE_OK} rejects fixed point values in ++floating point registers, then the constraints of the fixed point ++@samp{move@var{m}} instructions must be designed to avoid ever trying to ++reload into a floating point register. ++ ++@item @samp{movstrict@var{m}} ++Like @samp{mov@var{m}} except that if operand 0 is a @code{subreg} ++with mode @var{m} of a register whose natural mode is wider, ++the @samp{movstrict@var{m}} instruction is guaranteed not to alter ++any of the register except the part which belongs to mode @var{m}. ++ ++@item @samp{movsi_unaligned} ++Like @samp{movsi} except that the memory reference will not trap ++if loading or storing into unaligned memory. You must define this ++pattern if you can pass structures or unions in registers when they ++have less than a full word of alignment. ++ ++@item @samp{add@var{m}3} ++Add operand 2 and operand 1, storing the result in operand 0. All operands ++must have mode @var{m}. This can be used even on two-address machines, by ++means of constraints requiring operands 1 and 0 to be the same location. ++ ++@item @samp{sub@var{m}3}, @samp{mul@var{m}3}, @samp{umul@var{m}3}, @samp{div@var{m}3}, @samp{udiv@var{m}3}, @samp{mod@var{m}3}, @samp{umod@var{m}3}, @samp{and@var{m}3}, @samp{ior@var{m}3}, @samp{xor@var{m}3} ++Similar, for other arithmetic operations. ++ ++There are special considerations for register classes for logical-and ++instructions, affecting also the macro @code{PREFERRED_RELOAD_CLASS}. ++They apply not only to the patterns with these standard names, but to ++any patterns that will match such an instruction. @xref{Register ++Classes}. ++ ++@item @samp{mulhisi3} ++Multiply operands 1 and 2, which have mode @code{HImode}, and store ++a @code{SImode} product in operand 0. ++ ++@item @samp{mulqihi3}, @samp{mulsidi3} ++Similar widening-multiplication instructions of other widths. ++ ++@item @samp{umulqihi3}, @samp{umulhisi3}, @samp{umulsidi3} ++Similar widening-multiplication instructions that do unsigned ++multiplication. ++ ++@item @samp{divmod@var{m}4} ++Signed division that produces both a quotient and a remainder. ++Operand 1 is divided by operand 2 to produce a quotient stored ++in operand 0 and a remainder stored in operand 3. ++ ++@item @samp{udivmod@var{m}4} ++Similar, but does unsigned division. ++ ++@item @samp{ashl@var{m}3} ++Arithmetic-shift operand 1 left by a number of bits specified by ++operand 2, and store the result in operand 0. Operand 2 has ++mode @code{SImode}, not mode @var{m}. ++ ++@item @samp{ashr@var{m}3}, @samp{lshl@var{m}3}, @samp{lshr@var{m}3}, @samp{rotl@var{m}3}, @samp{rotr@var{m}3} ++Other shift and rotate instructions. ++ ++Logical and arithmetic left shift are the same. Machines that do not ++allow negative shift counts often have only one instruction for ++shifting left. On such machines, you should define a pattern named ++@samp{ashl@var{m}3} and leave @samp{lshl@var{m}3} undefined. ++ ++There are special considerations for register classes for shift ++instructions, affecting also the macro @code{PREFERRED_RELOAD_CLASS}. ++They apply not only to the patterns with these standard names, but to ++any patterns that will match such an instruction. @xref{Register ++Classes}. ++ ++@item @samp{neg@var{m}2} ++Negate operand 1 and store the result in operand 0. ++ ++@item @samp{abs@var{m}2} ++Store the absolute value of operand 1 into operand 0. ++ ++@item @samp{sqrt@var{m}2} ++Store the square root of operand 1 into operand 0. ++ ++@item @samp{ffs@var{m}2} ++Store into operand 0 one plus the index of the least significant 1-bit ++of operand 1. If operand 1 is zero, store zero. @var{m} is the mode ++of operand 0; operand 1's mode is specified by the instruction ++pattern, and the compiler will convert the operand to that mode before ++generating the instruction. ++ ++@item @samp{one_cmpl@var{m}2} ++Store the bitwise-complement of operand 1 into operand 0. ++ ++@item @samp{cmp@var{m}} ++Compare operand 0 and operand 1, and set the condition codes. ++The RTL pattern should look like this: ++ ++@example ++(set (cc0) (compare (match_operand:@var{m} 0 @dots{}) ++ (match_operand:@var{m} 1 @dots{}))) ++@end example ++ ++Each such definition in the machine description, for integer mode ++@var{m}, must have a corresponding @samp{tst@var{m}} pattern, because ++optimization can simplify the compare into a test when operand 1 is ++zero. ++ ++@item @samp{tst@var{m}} ++Compare operand 0 against zero, and set the condition codes. ++The RTL pattern should look like this: ++ ++@example ++(set (cc0) (match_operand:@var{m} 0 @dots{})) ++@end example ++ ++@item @samp{movstr@var{m}} ++Block move instruction. The addresses of the destination and source ++strings are the first two operands, and both are in mode @code{Pmode}. ++The number of bytes to move is the third operand, in mode @var{m}. ++The fourth operand is the known shared alignment of the source and ++destination, in the form of a @code{const_int} rtx. ++ ++@item @samp{cmpstr@var{m}} ++Block compare instruction, with operands like @samp{movstr@var{m}} ++except that the two memory blocks are compared byte by byte ++in lexicographic order. The effect of the instruction is to set ++the condition codes. ++ ++@item @samp{float@var{m}@var{n}2} ++Convert signed integer operand 1 (valid for fixed point mode @var{m}) to ++floating point mode @var{n} and store in operand 0 (which has mode ++@var{n}). ++ ++@item @samp{floatuns@var{m}@var{n}2} ++Convert unsigned integer operand 1 (valid for fixed point mode @var{m}) ++to floating point mode @var{n} and store in operand 0 (which has mode ++@var{n}). ++ ++@item @samp{fix@var{m}@var{n}2} ++Convert operand 1 (valid for floating point mode @var{m}) to fixed ++point mode @var{n} as a signed number and store in operand 0 (which ++has mode @var{n}). This instruction's result is defined only when ++the value of operand 1 is an integer. ++ ++@item @samp{fixuns@var{m}@var{n}2} ++Convert operand 1 (valid for floating point mode @var{m}) to fixed ++point mode @var{n} as an unsigned number and store in operand 0 (which ++has mode @var{n}). This instruction's result is defined only when the ++value of operand 1 is an integer. ++ ++@item @samp{ftrunc@var{m}2} ++Convert operand 1 (valid for floating point mode @var{m}) to an ++integer value, still represented in floating point mode @var{m}, and ++store it in operand 0 (valid for floating point mode @var{m}). ++ ++@item @samp{fix_trunc@var{m}@var{n}2} ++Like @samp{fix@var{m}@var{n}2} but works for any floating point value ++of mode @var{m} by converting the value to an integer. ++ ++@item @samp{fixuns_trunc@var{m}@var{n}2} ++Like @samp{fixuns@var{m}@var{n}2} but works for any floating point ++value of mode @var{m} by converting the value to an integer. ++ ++@item @samp{trunc@var{m}@var{n}} ++Truncate operand 1 (valid for mode @var{m}) to mode @var{n} and ++store in operand 0 (which has mode @var{n}). Both modes must be fixed ++point or both floating point. ++ ++@item @samp{extend@var{m}@var{n}} ++Sign-extend operand 1 (valid for mode @var{m}) to mode @var{n} and ++store in operand 0 (which has mode @var{n}). Both modes must be fixed ++point or both floating point. ++ ++@item @samp{zero_extend@var{m}@var{n}} ++Zero-extend operand 1 (valid for mode @var{m}) to mode @var{n} and ++store in operand 0 (which has mode @var{n}). Both modes must be fixed ++point. ++ ++@item @samp{extv} ++Extract a bit-field from operand 1 (a register or memory operand), ++where operand 2 specifies the width in bits and operand 3 the starting ++bit, and store it in operand 0. Operand 0 must have @code{SImode}. ++Operand 1 may have mode @code{QImode} or @code{SImode}; often ++@code{SImode} is allowed only for registers. Operands 2 and 3 must be ++valid for @code{SImode}. ++ ++The RTL generation pass generates this instruction only with constants ++for operands 2 and 3. ++ ++The bit-field value is sign-extended to a full word integer ++before it is stored in operand 0. ++ ++@item @samp{extzv} ++Like @samp{extv} except that the bit-field value is zero-extended. ++ ++@item @samp{insv} ++Store operand 3 (which must be valid for @code{SImode}) into a ++bit-field in operand 0, where operand 1 specifies the width in bits ++and operand 2 the starting bit. Operand 0 may have mode @code{QImode} ++or @code{SImode}; often @code{SImode} is allowed only for registers. ++Operands 1 and 2 must be valid for @code{SImode}. ++ ++The RTL generation pass generates this instruction only with constants ++for operands 1 and 2. ++ ++@item @samp{s@var{cond}} ++Store zero or nonzero in the operand according to the condition codes. ++Value stored is nonzero iff the condition @var{cond} is true. ++@var{cond} is the name of a comparison operation expression code, such ++as @code{eq}, @code{lt} or @code{leu}. ++ ++You specify the mode that the operand must have when you write the ++@code{match_operand} expression. The compiler automatically sees ++which mode you have used and supplies an operand of that mode. ++ ++The value stored for a true condition must have 1 as its low bit, or ++else must be negative. Otherwise the instruction is not suitable and ++must be omitted from the machine description. You must tell the ++compiler exactly which value is stored by defining the macro ++@code{STORE_FLAG_VALUE}. ++ ++@item @samp{b@var{cond}} ++Conditional branch instruction. Operand 0 is a @code{label_ref} ++that refers to the label to jump to. Jump if the condition codes ++meet condition @var{cond}. ++ ++@item @samp{call} ++Subroutine call instruction returning no value. Operand 0 is the ++function to call; operand 1 is the number of bytes of arguments pushed ++(in mode @code{SImode}, except it is normally a @code{const_int}); ++operand 2 is the number of registers used as operands. ++ ++On most machines, operand 2 is not actually stored into the RTL ++pattern. It is supplied for the sake of some RISC machines which need ++to put this information into the assembler code; they can put it in ++the RTL instead of operand 1. ++ ++Operand 0 should be a @code{mem} RTX whose address is the address of ++the function. ++ ++@item @samp{call_value} ++Subroutine call instruction returning a value. Operand 0 is the hard ++register in which the value is returned. There are three more ++operands, the same as the three operands of the @samp{call} ++instruction (but with numbers increased by one). ++ ++Subroutines that return @code{BLKmode} objects use the @samp{call} ++insn. ++ ++@item @samp{return} ++Subroutine return instruction. This instruction pattern name should be ++defined only if a single instruction can do all the work of returning ++from a function. ++ ++@item @samp{nop} ++No-op instruction. This instruction pattern name should always be defined ++to output a no-op in assembler code. @code{(const_int 0)} will do as an ++RTL pattern. ++ ++@item @samp{casesi} ++Instruction to jump through a dispatch table, including bounds checking. ++This instruction takes five operands: ++ ++@enumerate ++@item ++The index to dispatch on, which has mode @code{SImode}. ++ ++@item ++The lower bound for indices in the table, an integer constant. ++ ++@item ++The total range of indices in the table---the largest index ++minus the smallest one (both inclusive). ++ ++@item ++A label to jump to if the index has a value outside the bounds. ++(If the machine-description macro @code{CASE_DROPS_THROUGH} is defined, ++then an out-of-bounds index drops through to the code following ++the jump table instead of jumping to this label. In that case, ++this label is not actually used by the @samp{casesi} instruction, ++but it is always provided as an operand.) ++ ++@item ++A label that precedes the table itself. ++@end enumerate ++ ++The table is a @code{addr_vec} or @code{addr_diff_vec} inside of a ++@code{jump_insn}. The number of elements in the table is one plus the ++difference between the upper bound and the lower bound. ++ ++@item @samp{tablejump} ++Instruction to jump to a variable address. This is a low-level ++capability which can be used to implement a dispatch table when there ++is no @samp{casesi} pattern. ++ ++This pattern requires two operands: the address or offset, and a label ++which should immediately precede the jump table. If the macro ++@code{CASE_VECTOR_PC_RELATIVE} is defined then the first operand is an ++offset that counts from the address of the table; otherwise, it is an ++absolute address to jump to. ++ ++The @samp{tablejump} insn is always the last insn before the jump ++table it uses. Its assembler code normally has no need to use the ++second operand, but you should incorporate it in the RTL pattern so ++that the jump optimizer will not delete the table as unreachable code. ++@end table ++ ++@node Pattern Ordering, Dependent Patterns, Standard Names, Machine Desc ++@section When the Order of Patterns Matters ++ ++Sometimes an insn can match more than one instruction pattern. Then the ++pattern that appears first in the machine description is the one used. ++Therefore, more specific patterns (patterns that will match fewer things) ++and faster instructions (those that will produce better code when they ++do match) should usually go first in the description. ++ ++In some cases the effect of ordering the patterns can be used to hide ++a pattern when it is not valid. For example, the 68000 has an ++instruction for converting a fullword to floating point and another ++for converting a byte to floating point. An instruction converting ++an integer to floating point could match either one. We put the ++pattern to convert the fullword first to make sure that one will ++be used rather than the other. (Otherwise a large integer might ++be generated as a single-byte immediate quantity, which would not work.) ++Instead of using this pattern ordering it would be possible to make the ++pattern for convert-a-byte smart enough to deal properly with any ++constant value. ++ ++@node Dependent Patterns, Jump Patterns, Pattern Ordering, Machine Desc ++@section Interdependence of Patterns ++ ++Every machine description must have a named pattern for each of the ++conditional branch names @samp{b@var{cond}}. The recognition template ++must always have the form ++ ++@example ++(set (pc) ++ (if_then_else (@var{cond} (cc0) (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc))) ++@end example ++ ++@noindent ++In addition, every machine description must have an anonymous pattern ++for each of the possible reverse-conditional branches. These patterns ++look like ++ ++@example ++(set (pc) ++ (if_then_else (@var{cond} (cc0) (const_int 0)) ++ (pc) ++ (label_ref (match_operand 0 "" "")))) ++@end example ++ ++@noindent ++They are necessary because jump optimization can turn direct-conditional ++branches into reverse-conditional branches. ++ ++The compiler does more with RTL than just create it from patterns ++and recognize the patterns: it can perform arithmetic expression codes ++when constant values for their operands can be determined. As a result, ++sometimes having one pattern can require other patterns. For example, the ++Vax has no `and' instruction, but it has `and not' instructions. Here ++is the definition of one of them: ++ ++@example ++(define_insn "andcbsi2" ++ [(set (match_operand:SI 0 "general_operand" "") ++ (and:SI (match_dup 0) ++ (not:SI (match_operand:SI ++ 1 "general_operand" ""))))] ++ "" ++ "bicl2 %1,%0") ++@end example ++ ++@noindent ++If operand 1 is an explicit integer constant, an instruction constructed ++using that pattern can be simplified into an `and' like this: ++ ++@example ++(set (reg:SI 41) ++ (and:SI (reg:SI 41) ++ (const_int 0xffff7fff))) ++@end example ++ ++@noindent ++(where the integer constant is the one's complement of what ++appeared in the original instruction). ++ ++To avoid a fatal error, the compiler must have a pattern that recognizes ++such an instruction. Here is what is used: ++ ++@example ++(define_insn "" ++ [(set (match_operand:SI 0 "general_operand" "") ++ (and:SI (match_dup 0) ++ (match_operand:SI 1 "general_operand" "")))] ++ "GET_CODE (operands[1]) == CONST_INT" ++ "* ++@{ operands[1] ++ = gen_rtx (CONST_INT, VOIDmode, ~INTVAL (operands[1])); ++ return \"bicl2 %1,%0\"; ++@}") ++@end example ++ ++@noindent ++Whereas a pattern to match a general `and' instruction is impossible to ++support on the Vax, this pattern is possible because it matches only a ++constant second argument: a special case that can be output as an `and not' ++instruction. ++ ++A ``compare'' instruction whose RTL looks like this: ++ ++@example ++(set (cc0) (compare @var{operand} (const_int 0))) ++@end example ++ ++@noindent ++may be simplified by optimization into a ``test'' like this: ++ ++@example ++(set (cc0) @var{operand}) ++@end example ++ ++@noindent ++So in the machine description, each ``compare'' pattern for an integer ++mode must have a corresponding ``test'' pattern that will match the ++result of such simplification. ++ ++In some cases machines support instructions identical except for the ++machine mode of one or more operands. For example, there may be ++``sign-extend halfword'' and ``sign-extend byte'' instructions whose ++patterns are ++ ++@example ++(set (match_operand:SI 0 @dots{}) ++ (extend:SI (match_operand:HI 1 @dots{}))) ++ ++(set (match_operand:SI 0 @dots{}) ++ (extend:SI (match_operand:QI 1 @dots{}))) ++@end example ++ ++@noindent ++Constant integers do not specify a machine mode, so an instruction to ++extend a constant value could match either pattern. The pattern it ++actually will match is the one that appears first in the file. For correct ++results, this must be the one for the widest possible mode (@code{HImode}, ++here). If the pattern matches the @code{QImode} instruction, the results ++will be incorrect if the constant value does not actually fit that mode. ++ ++Such instructions to extend constants are rarely generated because they are ++optimized away, but they do occasionally happen in nonoptimized ++compilations. ++ ++When an instruction has the constraint letter @samp{o}, the reload ++pass may generate instructions which copy a nonoffsettable address into ++an index register. The idea is that the register can be used as a ++replacement offsettable address. In order for these generated ++instructions to work, there must be patterns to copy any kind of valid ++address into a register. ++ ++Most older machine designs have ``load address'' instructions which do ++just what is needed here. Some RISC machines do not advertise such ++instructions, but the possible addresses on these machines are very ++limited, so it is easy to fake them. ++ ++Auto-increment and auto-decrement addresses are an exception; there ++need not be an instruction that can copy such an address into a ++register, because reload handles these cases in a different manner. ++ ++@node Jump Patterns, Peephole Definitions, Dependent Patterns, Machine Desc ++@section Defining Jump Instruction Patterns ++ ++GNU CC assumes that the machine has a condition code. A comparison insn ++sets the condition code, recording the results of both signed and unsigned ++comparison of the given operands. A separate branch insn tests the ++condition code and branches or not according its value. The branch insns ++come in distinct signed and unsigned flavors. Many common machines, such ++as the Vax, the 68000 and the 32000, work this way. ++ ++Some machines have distinct signed and unsigned compare instructions, and ++only one set of conditional branch instructions. The easiest way to handle ++these machines is to treat them just like the others until the final stage ++where assembly code is written. At this time, when outputting code for the ++compare instruction, peek ahead at the following branch using ++@code{NEXT_INSN (insn)}. (The variable @code{insn} refers to the insn ++being output, in the output-writing code in an instruction pattern.) If ++the RTL says that is an unsigned branch, output an unsigned compare; ++otherwise output a signed compare. When the branch itself is output, you ++can treat signed and unsigned branches identically. ++ ++The reason you can do this is that GNU CC always generates a pair of ++consecutive RTL insns, one to set the condition code and one to test it, ++and keeps the pair inviolate until the end. ++ ++To go with this technique, you must define the machine-description macro ++@code{NOTICE_UPDATE_CC} to do @code{CC_STATUS_INIT}; in other words, no ++compare instruction is superfluous. ++ ++Some machines have compare-and-branch instructions and no condition code. ++A similar technique works for them. When it is time to ``output'' a ++compare instruction, record its operands in two static variables. When ++outputting the branch-on-condition-code instruction that follows, actually ++output a compare-and-branch instruction that uses the remembered operands. ++ ++It also works to define patterns for compare-and-branch instructions. ++In optimizing compilation, the pair of compare and branch instructions ++will be combined according to these patterns. But this does not happen ++if optimization is not requested. So you must use one of the solutions ++above in addition to any special patterns you define. ++ ++@node Peephole Definitions, Expander Definitions, Jump Patterns, Machine Desc ++@section Defining Machine-Specific Peephole Optimizers ++ ++In addition to instruction patterns the @file{md} file may contain ++definitions of machine-specific peephole optimizations. ++ ++The combiner does not notice certain peephole optimizations when the data ++flow in the program does not suggest that it should try them. For example, ++sometimes two consecutive insns related in purpose can be combined even ++though the second one does not appear to use a register computed in the ++first one. A machine-specific peephole optimizer can detect such ++opportunities. ++ ++A definition looks like this: ++ ++@example ++(define_peephole ++ [@var{insn-pattern-1} ++ @var{insn-pattern-2} ++ @dots{}] ++ "@var{condition}" ++ "@var{template}" ++ "@var{machine-specific info}") ++@end example ++ ++@noindent ++The last string operand may be omitted if you are not using any ++machine-specific information in this machine description. If present, ++it must obey the same rules as in a @code{define_insn}. ++ ++In this skeleton, @var{insn-pattern-1} and so on are patterns to match ++consecutive insns. The optimization applies to a sequence of insns when ++@var{insn-pattern-1} matches the first one, @var{insn-pattern-2} matches ++the next, and so on.@refill ++ ++Each of the insns matched by a peephole must also match a ++@code{define_insn}. Peepholes are checked only at the last stage just ++before code generation, and only optionally. Therefore, any insn which ++would match a peephole but no @code{define_insn} will cause a crash in code ++generation in an unoptimized compilation, or at various optimization ++stages. ++ ++The operands of the insns are matched with @code{match_operands} and ++@code{match_dup}, as usual. What is not usual is that the operand numbers ++apply to all the insn patterns in the definition. So, you can check for ++identical operands in two insns by using @code{match_operand} in one insn ++and @code{match_dup} in the other. ++ ++The operand constraints used in @code{match_operand} patterns do not have ++any direct effect on the applicability of the peephole, but they will ++be validated afterward, so make sure your constraints are general enough ++to apply whenever the peephole matches. If the peephole matches ++but the constraints are not satisfied, the compiler will crash. ++ ++It is safe to omit constraints in all the operands of the peephole; or ++you can write constraints which serve as a double-check on the criteria ++previously tested. ++ ++Once a sequence of insns matches the patterns, the @var{condition} is ++checked. This is a C expression which makes the final decision whether to ++perform the optimization (we do so if the expression is nonzero). If ++@var{condition} is omitted (in other words, the string is empty) then the ++optimization is applied to every sequence of insns that matches the ++patterns. ++ ++The defined peephole optimizations are applied after register allocation ++is complete. Therefore, the peephole definition can check which ++operands have ended up in which kinds of registers, just by looking at ++the operands. ++ ++The way to refer to the operands in @var{condition} is to write ++@code{operands[@var{i}]} for operand number @var{i} (as matched by ++@code{(match_operand @var{i} @dots{})}). Use the variable @code{insn} to ++refer to the last of the insns being matched; use @code{PREV_INSN} to find ++the preceding insns (but be careful to skip over any @code{note} insns that ++intervene).@refill ++ ++When optimizing computations with intermediate results, you can use ++@var{condition} to match only when the intermediate results are not used ++elsewhere. Use the C expression @code{dead_or_set_p (@var{insn}, ++@var{op})}, where @var{insn} is the insn in which you expect the value to ++be used for the last time (from the value of @code{insn}, together with use ++of @code{PREV_INSN}), and @var{op} is the intermediate value (from ++@code{operands[@var{i}]}).@refill ++ ++Applying the optimization means replacing the sequence of insns with one ++new insn. The @var{template} controls ultimate output of assembler code ++for this combined insn. It works exactly like the template of a ++@code{define_insn}. Operand numbers in this template are the same ones ++used in matching the original sequence of insns. ++ ++The result of a defined peephole optimizer does not need to match any of ++the insn patterns in the machine description; it does not even have an ++opportunity to match them. The peephole optimizer definition itself serves ++as the insn pattern to control how the insn is output. ++ ++Defined peephole optimizers are run as assembler code is being output, ++so the insns they produce are never combined or rearranged in any way. ++ ++Here is an example, taken from the 68000 machine description: ++ ++@example ++(define_peephole ++ [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4))) ++ (set (match_operand:DF 0 "register_operand" "=f") ++ (match_operand:DF 1 "register_operand" "ad"))] ++ "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])" ++ "* ++@{ ++ rtx xoperands[2]; ++ xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1); ++#ifdef MOTOROLA ++ output_asm_insn (\"move.l %1,(sp)\", xoperands); ++ output_asm_insn (\"move.l %1,-(sp)\", operands); ++ return \"fmove.d (sp)+,%0\"; ++#else ++ output_asm_insn (\"movel %1,sp@@\", xoperands); ++ output_asm_insn (\"movel %1,sp@@-\", operands); ++ return \"fmoved sp@@+,%0\"; ++#endif ++@} ++") ++@end example ++ ++The effect of this optimization is to change ++ ++@example ++jbsr _foobar ++addql #4,sp ++movel d1,sp@@- ++movel d0,sp@@- ++fmoved sp@@+,fp0 ++@end example ++ ++@noindent ++into ++ ++@example ++jbsr _foobar ++movel d1,sp@@ ++movel d0,sp@@- ++fmoved sp@@+,fp0 ++@end example ++ ++@ignore ++If a peephole matches a sequence including one or more jump insns, you must ++take account of the flags such as @code{CC_REVERSED} which specify that the ++condition codes are represented in an unusual manner. The compiler ++automatically alters any ordinary conditional jumps which occur in such ++situations, but the compiler cannot alter jumps which have been replaced by ++peephole optimizations. So it is up to you to alter the assembler code ++that the peephole produces. Supply C code to write the assembler output, ++and in this C code check the condition code status flags and change the ++assembler code as appropriate. ++@end ignore ++ ++@var{insn-pattern-1} and so on look @emph{almost} like the second ++operand of @code{define_insn}. There is one important difference: the ++second operand of @code{define_insn} consists of one or more RTX's ++enclosed in square brackets. Usually, there is only one: then the same ++action can be written as an element of a @code{define_peephole}. But ++when there are multiple actions in a @code{define_insn}, they are ++implicitly enclosed in a @code{parallel}. Then you must explicitly ++write the @code{parallel}, and the square brackets within it, in the ++@code{define_peephole}. Thus, if an insn pattern looks like this, ++ ++@example ++(define_insn "divmodsi4" ++ [(set (match_operand:SI 0 "general_operand" "=d") ++ (div:SI (match_operand:SI 1 "general_operand" "0") ++ (match_operand:SI 2 "general_operand" "dmsK"))) ++ (set (match_operand:SI 3 "general_operand" "=d") ++ (mod:SI (match_dup 1) (match_dup 2)))] ++ "TARGET_68020" ++ "divsl%.l %2,%3:%0") ++@end example ++ ++@noindent ++then the way to mention this insn in a peephole is as follows: ++ ++@example ++(define_peephole ++ [@dots{} ++ (parallel ++ [(set (match_operand:SI 0 "general_operand" "=d") ++ (div:SI (match_operand:SI 1 "general_operand" "0") ++ (match_operand:SI 2 "general_operand" "dmsK"))) ++ (set (match_operand:SI 3 "general_operand" "=d") ++ (mod:SI (match_dup 1) (match_dup 2)))]) ++ @dots{}] ++ @dots{}) ++@end example ++ ++@node Expander Definitions,, Peephole Definitions, Machine Desc ++@section Defining RTL Sequences for Code Generation ++ ++On some target machines, some standard pattern names for RTL generation ++cannot be handled with single insn, but a sequence of RTL insns can ++represent them. For these target machines, you can write a ++@code{define_expand} to specify how to generate the sequence of RTL. ++ ++A @code{define_expand} is an RTL expression that looks almost like a ++@code{define_insn}; but, unlike the latter, a @code{define_expand} is used ++only for RTL generation and it can produce more than one RTL insn. ++ ++A @code{define_expand} RTX has four operands: ++ ++@itemize @bullet ++@item ++The name. Each @code{define_expand} must have a name, since the only ++use for it is to refer to it by name. ++ ++@item ++The RTL template. This is just like the RTL template for a ++@code{define_peephole} in that it is a vector of RTL expressions ++each being one insn. ++ ++@item ++The condition, a string containing a C expression. This expression is ++used to express how the availability of this pattern depends on ++subclasses of target machine, selected by command-line options when ++GNU CC is run. This is just like the condition of a ++@code{define_insn} that has a standard name. ++ ++@item ++The preparation statements, a string containing zero or more C ++statements which are to be executed before RTL code is generated from ++the RTL template. ++ ++Usually these statements prepare temporary registers for use as ++internal operands in the RTL template, but they can also generate RTL ++insns directly by calling routines such as @code{emit_insn}, etc. ++Any such insns precede the ones that come from the RTL template. ++@end itemize ++ ++Every RTL insn emitted by a @code{define_expand} must match some ++@code{define_insn} in the machine description. Otherwise, the compiler ++will crash when trying to generate code for the insn or trying to optimize ++it. ++ ++The RTL template, in addition to controlling generation of RTL insns, ++also describes the operands that need to be specified when this pattern ++is used. In particular, it gives a predicate for each operand. ++ ++A true operand, which need to be specified in order to generate RTL from ++the pattern, should be described with a @code{match_operand} in its first ++occurrence in the RTL template. This enters information on the operand's ++predicate into the tables that record such things. GNU CC uses the ++information to preload the operand into a register if that is required for ++valid RTL code. If the operand is referred to more than once, subsequent ++references should use @code{match_dup}. ++ ++The RTL template may also refer to internal ``operands'' which are ++temporary registers or labels used only within the sequence made by the ++@code{define_expand}. Internal operands are substituted into the RTL ++template with @code{match_dup}, never with @code{match_operand}. The ++values of the internal operands are not passed in as arguments by the ++compiler when it requests use of this pattern. Instead, they are computed ++within the pattern, in the preparation statements. These statements ++compute the values and store them into the appropriate elements of ++@code{operands} so that @code{match_dup} can find them. ++ ++There are two special macros defined for use in the preparation statements: ++@code{DONE} and @code{FAIL}. Use them with a following semicolon, ++as a statement. ++ ++@table @code ++@item DONE ++Use the @code{DONE} macro to end RTL generation for the pattern. The ++only RTL insns resulting from the pattern on this occasion will be ++those already emitted by explicit calls to @code{emit_insn} within the ++preparation statements; the RTL template will not be generated. ++ ++@item FAIL ++Make the pattern fail on this occasion. When a pattern fails, it means ++that the pattern was not truly available. The calling routines in the ++compiler will try other strategies for code generation using other patterns. ++ ++Failure is currently supported only for binary operations (addition, ++multiplication, shifting, etc.). ++ ++Do not emit any insns explicitly with @code{emit_insn} before failing. ++@end table ++ ++Here is an example, the definition of left-shift for the SPUR chip: ++ ++@example ++(define_expand "ashlsi3" ++ [(set (match_operand:SI 0 "register_operand" "") ++ (ashift:SI ++ (match_operand:SI 1 "register_operand" "") ++ (match_operand:SI 2 "nonmemory_operand" "")))] ++ "" ++ " ++@{ ++ if (GET_CODE (operands[2]) != CONST_INT ++ || (unsigned) INTVAL (operands[2]) > 3) ++ FAIL; ++@}") ++@end example ++ ++@noindent ++This example uses @code{define_expand} so that it can generate an RTL insn ++for shifting when the shift-count is in the supported range of 0 to 3 but ++fail in other cases where machine insns aren't available. When it fails, ++the compiler tries another strategy using different patterns (such as, a ++library call). ++ ++If the compiler were able to handle nontrivial condition-strings in ++patterns with names, then it would be possible to use a ++@code{define_insn} in that case. Here is another case (zero-extension ++on the 68000) which makes more use of the power of @code{define_expand}: ++ ++@example ++(define_expand "zero_extendhisi2" ++ [(set (match_operand:SI 0 "general_operand" "") ++ (const_int 0)) ++ (set (strict_low_part ++ (subreg:HI ++ (match_dup 0) ++ 0)) ++ (match_operand:HI 1 "general_operand" ""))] ++ "" ++ "operands[1] = make_safe_from (operands[1], operands[0]);") ++@end example ++ ++@noindent ++Here two RTL insns are generated, one to clear the entire output operand ++and the other to copy the input operand into its low half. This sequence ++is incorrect if the input operand refers to [the old value of] the output ++operand, so the preparation statement makes sure this isn't so. The ++function @code{make_safe_from} copies the @code{operands[1]} into a ++temporary register if it refers to @code{operands[0]}. It does this ++by emitting another RTL insn. ++ ++Finally, a third example shows the use of an internal operand. ++Zero-extension on the SPUR chip is done by @code{and}-ing the result ++against a halfword mask. But this mask cannot be represented by a ++@code{const_int} because the constant value is too large to be legitimate ++on this machine. So it must be copied into a register with ++@code{force_reg} and then the register used in the @code{and}. ++ ++@example ++(define_expand "zero_extendhisi2" ++ [(set (match_operand:SI 0 "register_operand" "") ++ (and:SI (subreg:SI ++ (match_operand:HI 1 "register_operand" "") ++ 0) ++ (match_dup 2)))] ++ "" ++ "operands[2] ++ = force_reg (SImode, gen_rtx (CONST_INT, ++ VOIDmode, 65535)); ") ++@end example ++ ++@strong{Note:} If the @code{define_expand} is used to serve a standard ++binary or unary arithmetic operation, then the last insn it generates ++must not be a @code{code_label}, @code{barrier} or @code{note}. It must ++be an @code{insn}, @code{jump_insn} or @code{call_insn}. ++ ++@node Machine Macros, Config, Machine Desc, Top ++@chapter Machine Description Macros ++ ++The other half of the machine description is a C header file conventionally ++given the name @file{tm-@var{machine}.h}. The file @file{tm.h} should be a ++link to it. The header file @file{config.h} includes @file{tm.h} and most ++compiler source files include @file{config.h}. ++ ++@menu ++* Run-time Target:: Defining @samp{-m} options like @samp{-m68000} and @samp{-m68020}. ++* Storage Layout:: Defining sizes and alignments of data types. ++* Registers:: Naming and describing the hardware registers. ++* Register Classes:: Defining the classes of hardware registers. ++* Stack Layout:: Defining which way the stack grows and by how much. ++* Library Calls:: Specifying how to call certain library routines. ++* Addressing Modes:: Defining addressing modes valid for memory operands. ++* Delayed Branch:: Do branches execute the following instruction? ++* Condition Code:: Defining how insns update the condition code. ++* Cross-compilation:: Handling floating point for cross-compilers. ++* Misc:: Everything else. ++* Assembler Format:: Defining how to write insns and pseudo-ops to output. ++@end menu ++ ++@node Run-time Target, Storage Layout, Machine Macros, Machine Macros ++@section Run-time Target Specification ++ ++@table @code ++@item CPP_PREDEFINES ++Define this to be a string constant containing @samp{-D} options to ++define the predefined macros that identify this machine and system. ++These macros will be predefined unless the @samp{-ansi} option is ++specified. ++ ++In addition, a parallel set of macros are predefined, whose names are ++made by appending @samp{__} at the beginning and at the end. These ++@samp{__} macros are permitted by the ANSI standard, so they are ++predefined regardless of whether @samp{-ansi} is specified. ++ ++For example, on the Sun, one can use the following value: ++ ++@example ++"-Dmc68000 -Dsun -Dunix" ++@end example ++ ++The result is to define the macros @code{__mc68000__}, @code{__sun__} ++and @code{__unix__} unconditionally, and the macros @code{mc68000}, ++@code{sun} and @code{unix} provided @samp{-ansi} is not specified. ++ ++@item CPP_SPEC ++A C string constant that tells the GNU CC driver program options to ++pass to CPP. It can also specify how to translate options you ++give to GNU CC into options for GNU CC to pass to the CPP. ++ ++Do not define this macro if it does not need to do anything. ++ ++@item CC1_SPEC ++A C string constant that tells the GNU CC driver program options to ++pass to CC1. It can also specify how to translate options you ++give to GNU CC into options for GNU CC to pass to the CC1. ++ ++Do not define this macro if it does not need to do anything. ++ ++@item extern int target_flags; ++This declaration should be present. ++ ++@item TARGET_@dots{} ++This series of macros is to allow compiler command arguments to ++enable or disable the use of optional features of the target machine. ++For example, one machine description serves both the 68000 and ++the 68020; a command argument tells the compiler whether it should ++use 68020-only instructions or not. This command argument works ++by means of a macro @code{TARGET_68020} that tests a bit in ++@code{target_flags}. ++ ++Define a macro @code{TARGET_@var{featurename}} for each such option. ++Its definition should test a bit in @code{target_flags}; for example: ++ ++@example ++#define TARGET_68020 (target_flags & 1) ++@end example ++ ++One place where these macros are used is in the condition-expressions ++of instruction patterns. Note how @code{TARGET_68020} appears ++frequently in the 68000 machine description file, @file{m68k.md}. ++Another place they are used is in the definitions of the other ++macros in the @file{tm-@var{machine}.h} file. ++ ++@item TARGET_SWITCHES ++This macro defines names of command options to set and clear ++bits in @code{target_flags}. Its definition is an initializer ++with a subgrouping for each command option. ++ ++Each subgrouping contains a string constant, that defines the option ++name, and a number, which contains the bits to set in ++@code{target_flags}. A negative number says to clear bits instead; ++the negative of the number is which bits to clear. The actual option ++name is made by appending @samp{-m} to the specified name. ++ ++One of the subgroupings should have a null string. The number in ++this grouping is the default value for @code{target_flags}. Any ++target options act starting with that value. ++ ++Here is an example which defines @samp{-m68000} and @samp{-m68020} ++with opposite meanings, and picks the latter as the default: ++ ++@example ++#define TARGET_SWITCHES \ ++ @{ @{ "68020", 1@}, \ ++ @{ "68000", -1@}, \ ++ @{ "", 1@}@} ++@end example ++ ++@item OVERRIDE_OPTIONS ++Sometimes certain combinations of command options do not make sense on ++a particular target machine. You can define a macro ++@code{OVERRIDE_OPTIONS} to take account of this. This macro, if ++defined, is executed once just after all the command options have been ++parsed. ++@end table ++ ++@node Storage Layout, Registers, Run-time Target, Machine Macros ++@section Storage Layout ++ ++Note that the definitions of the macros in this table which are sizes or ++alignments measured in bits do not need to be constant. They can be C ++expressions that refer to static variables, such as the @code{target_flags}. ++@xref{Run-time Target}. ++ ++@table @code ++@item BITS_BIG_ENDIAN ++Define this macro if the most significant bit in a byte has the lowest ++number. This means that bit-field instructions count from the most ++significant bit. If the machine has no bit-field instructions, this ++macro is irrelevant. ++ ++This macro does not affect the way structure fields are packed into ++bytes or words; that is controlled by @code{BYTES_BIG_ENDIAN}. ++ ++@item BYTES_BIG_ENDIAN ++Define this macro if the most significant byte in a word has the ++lowest number. ++ ++@item WORDS_BIG_ENDIAN ++Define this macro if, in a multiword object, the most significant ++word has the lowest number. ++ ++@item BITS_PER_UNIT ++Number of bits in an addressable storage unit (byte); normally 8. ++ ++@item BITS_PER_WORD ++Number of bits in a word; normally 32. ++ ++@item UNITS_PER_WORD ++Number of storage units in a word; normally 4. ++ ++@item POINTER_SIZE ++Width of a pointer, in bits. ++ ++@item POINTER_BOUNDARY ++Alignment required for pointers stored in memory, in bits. ++ ++@item PARM_BOUNDARY ++Normal alignment required for function parameters on the stack, in ++bits. All stack parameters receive least this much alignment ++regardless of data type. On most machines, this is the same as the ++size of an integer. ++ ++@item MAX_PARM_BOUNDARY ++Largest alignment required for any stack parameters, in bits. If the ++data type of the parameter calls for more alignment than ++@code{PARM_BOUNDARY}, then it is given extra padding up to this limit. ++ ++Don't define this macro if it would be equal to @code{PARM_BOUNDARY}; ++in other words, if the alignment of a stack parameter should not ++depend on its data type (as is the case on most machines). ++ ++@item STACK_BOUNDARY ++Define this macro if you wish to preserve a certain alignment for ++the stack pointer at all times. The definition is a C expression ++for the desired alignment (measured in bits). ++ ++@item FUNCTION_BOUNDARY ++Alignment required for a function entry point, in bits. ++ ++@item BIGGEST_ALIGNMENT ++Biggest alignment that any data type can require on this machine, in bits. ++ ++@item CONSTANT_ALIGNMENT (@var{code}, @var{typealign}) ++A C expression to compute the alignment for a constant. The argument ++@var{typealign} is the alignment required for the constant's data type. ++@var{code} is the tree code of the constant itself. ++ ++If this macro is not defined, the default is to use @var{typealign}. If ++you do define this macro, the value must be a multiple of ++@var{typealign}. ++ ++The purpose of defining this macro is usually to cause string constants ++to be word aligned so that @file{dhrystone} can be made to run faster. ++ ++@item EMPTY_FIELD_BOUNDARY ++Alignment in bits to be given to a structure bit field that follows an ++empty field such as @code{int : 0;}. ++ ++@item STRUCTURE_SIZE_BOUNDARY ++Number of bits which any structure or union's size must be a multiple of. ++Each structure or union's size is rounded up to a multiple of this. ++ ++If you do not define this macro, the default is the same as ++@code{BITS_PER_UNIT}. ++ ++@item STRICT_ALIGNMENT ++Define this if instructions will fail to work if given data not ++on the nominal alignment. If instructions will merely go slower ++in that case, do not define this macro. ++ ++@item PCC_BITFIELD_TYPE_MATTERS ++Define this if you wish to imitate a certain bizarre behavior pattern ++of some instances of PCC: a bit field whose declared type is ++@code{int} has the same effect on the size and alignment of a ++structure as an actual @code{int} would have. ++ ++If the macro is defined, then its definition should be a C expression; ++a nonzero value for the expression enables PCC-compatible behavior. ++ ++Just what effect that is in GNU CC depends on other parameters, but on ++most machines it would force the structure's alignment and size to a ++multiple of 32 or @code{BIGGEST_ALIGNMENT} bits. ++ ++@item MAX_FIXED_MODE_SIZE ++An integer expression for the largest integer machine mode that should ++actually be used. All integer machine modes of this size or smaller ++can be used for structures and unions with the appropriate sizes. ++ ++@item CHECK_FLOAT_VALUE (@var{mode}, @var{value}) ++A C statement to validate the value @var{value} (or type ++@code{double}) for mode @var{mode}. This means that you check whether ++@var{value} fits within the possible range of values for mode ++@var{mode} on this target machine. The mode @var{mode} is always ++@code{SFmode} or @code{DFmode}. ++ ++If @var{value} is not valid, you should call @code{error} to print an ++error message and then assign some valid value to @var{value}. ++Allowing an invalid value to go through the compiler can produce ++incorrect assembler code which may even cause Unix assemblers to ++crash. ++ ++This macro need not be defined if there is no work for it to do. ++@end table ++ ++@node Registers, Register Classes, Storage Layout, Machine Macros ++@section Register Usage ++ ++@table @code ++@item FIRST_PSEUDO_REGISTER ++Number of hardware registers known to the compiler. They receive ++numbers 0 through @code{FIRST_PSEUDO_REGISTER-1}; thus, the first ++pseudo register's number really is assigned the number ++@code{FIRST_PSEUDO_REGISTER}. ++ ++@item FIXED_REGISTERS ++An initializer that says which registers are used for fixed purposes ++all throughout the compiled code and are therefore not available for ++general allocation. These would include the stack pointer, the frame ++pointer (except on machines where that can be used as a general ++register when no frame pointer is needed), the program counter on ++machines where that is considered one of the addressable registers, ++and any other numbered register with a standard use. ++ ++This information is expressed as a sequence of numbers, separated by ++commas and surrounded by braces. The @var{n}th number is 1 if ++register @var{n} is fixed, 0 otherwise. ++ ++The table initialized from this macro, and the table initialized by ++the following one, may be overridden at run time either automatically, ++by the actions of the macro @code{CONDITIONAL_REGISTER_USAGE}, or by ++the user with the command options @samp{-ffixed-@var{reg}}, ++@samp{-fcall-used-@var{reg}} and @samp{-fcall-saved-@var{reg}}. ++ ++@item CALL_USED_REGISTERS ++Like @code{FIXED_REGISTERS} but has 1 for each register that is ++clobbered (in general) by function calls as well as for fixed ++registers. This macro therefore identifies the registers that are not ++available for general allocation of values that must live across ++function calls. ++ ++If a register has 0 in @code{CALL_USED_REGISTERS}, the compiler ++automatically saves it on function entry and restores it on function ++exit, if the register is used within the function. ++ ++@item DEFAULT_CALLER_SAVES ++Define this macro if function calls on the target machine do not preserve ++any registers; in other words, if @code{CALL_USED_REGISTERS} has 1 ++for all registers. This macro enables @samp{-fcaller-saves} by default. ++Eventually that option will be enabled by default on all machines and both ++the option and this macro will be eliminated. ++ ++@item CONDITIONAL_REGISTER_USAGE ++Zero or more C statements that may conditionally modify two variables ++@code{fixed_regs} and @code{call_used_regs} (both of type @code{char ++[]}) after they have been initialized from the two preceding macros. ++ ++This is necessary in case the fixed or call-clobbered registers depend ++on target flags. ++ ++You need not define this macro if it has no work to do. ++ ++If the usage of an entire class of registers depends on the target ++flags, you may indicate this to GCC by using this macro to modify ++@code{fixed_regs} and @code{call_used_regs} to 1 for each of the ++registers in the classes which should not be used by GCC. Also define ++the macro @code{REG_CLASS_FROM_LETTER} to return @code{NO_REGS} if it ++is called with a letter for a class that shouldn't be used. ++ ++(However, if this class is not included in @code{GENERAL_REGS} and all ++of the insn patterns whose constraints permit this class are ++controlled by target switches, then GCC will automatically avoid using ++these registers when the target switches are opposed to them.) ++ ++@item OVERLAPPING_REGNO_P (@var{regno}) ++If defined, this is a C expression whose value is nonzero if hard ++register number @var{regno} is an overlapping register. This means a ++hard register which overlaps a hard register with a different number. ++(Such overlap is undesirable, but occasionally it allows a machine to ++be supported which otherwise could not be.) This macro must return ++nonzero for @emph{all} the registers which overlap each other. GNU CC ++can use an overlapping register only in certain limited ways. It can ++be used for allocation within a basic block, and may be spilled for ++reloading; that is all. ++ ++If this macro is not defined, it means that none of the hard registers ++overlap each other. This is the usual situation. ++ ++@item INSN_CLOBBERS_REGNO_P (@var{insn}, @var{regno}) ++If defined, this is a C expression whose value should be nonzero if ++the insn @var{insn} has the effect of mysteriously clobbering the ++contents of hard register number @var{regno}. By ``mysterious'' we ++mean that the insn's RTL expression doesn't describe such an effect. ++ ++If this macro is not defined, it means that no insn clobbers registers ++mysteriously. This is the usual situation; all else being equal, ++it is best for the RTL expression to show all the activity. ++ ++@item PRESERVE_DEATH_INFO_REGNO_P (@var{regno}) ++If defined, this is a C expression whose value is nonzero if accurate ++@code{REG_DEAD} notes are needed for hard register number @var{regno} ++at the time of outputting the assembler code. When this is so, a few ++optimizations that take place after register allocation and could ++invalidate the death notes are not done when this register is ++involved. ++ ++You would arrange to preserve death info for a register when some of the ++code in the machine description which is executed to write the assembler ++code looks at the death notes. This is necessary only when the actual ++hardware feature which GNU CC thinks of as a register is not actually a ++register of the usual sort. (It might, for example, be a hardware ++stack.) ++ ++If this macro is not defined, it means that no death notes need to be ++preserved. This is the usual situation. ++ ++@item HARD_REGNO_NREGS (@var{regno}, @var{mode}) ++A C expression for the number of consecutive hard registers, starting ++at register number @var{regno}, required to hold a value of mode ++@var{mode}. ++ ++On a machine where all registers are exactly one word, a suitable ++definition of this macro is ++ ++@example ++#define HARD_REGNO_NREGS(REGNO, MODE) \ ++ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \ ++ / UNITS_PER_WORD)) ++@end example ++ ++@item HARD_REGNO_MODE_OK (@var{regno}, @var{mode}) ++A C expression that is nonzero if it is permissible to store a value ++of mode @var{mode} in hard register number @var{regno} (or in several ++registers starting with that one). For a machine where all registers ++are equivalent, a suitable definition is ++ ++@example ++#define HARD_REGNO_MODE_OK(REGNO, MODE) 1 ++@end example ++ ++It is not necessary for this macro to check for the numbers of fixed ++registers, because the allocation mechanism considers them to be always ++occupied. ++ ++On some machines, double-precision values must be kept in even/odd ++register pairs. The way to implement that is to define this macro ++to reject odd register numbers for such modes. ++ ++GNU CC assumes that it can always move values between registers and ++(suitably addressed) memory locations. If it is impossible to move a ++value of a certain mode between memory and certain registers, then ++@code{HARD_REGNO_MODE_OK} must not allow this mode in those registers. ++ ++Many machines have special registers for floating point arithmetic. ++Often people assume that floating point machine modes are allowed only ++in floating point registers. This is not true. Any registers that ++can hold integers can safely @emph{hold} a floating point machine ++mode, whether or not floating arithmetic can be done on it in those ++registers. ++ ++On some machines, though, the converse is true: fixed-point machine ++modes may not go in floating registers. This is true if the floating ++registers normalize any value stored in them, because storing a ++non-floating value there would garble it. In this case, ++@code{HARD_REGNO_MODE_OK} should reject fixed-point machine modes in ++floating registers. But if the floating registers do not automatically ++normalize, if you can store any bit pattern in one and retrieve it ++unchanged without a trap, then any machine mode may go in a floating ++register and this macro should say so. ++ ++The primary significance of special floating registers is rather that ++they are the registers acceptable in floating point arithmetic ++instructions. However, this is of no concern to ++@code{HARD_REGNO_MODE_OK}. You handle it by writing the proper ++constraints for those instructions. ++ ++On some machines, the floating registers are especially slow to access, ++so that it is better to store a value in a stack frame than in such a ++register if floating point arithmetic is not being done. As long as the ++floating registers are not in class @code{GENERAL_REGS}, they will not ++be used unless some insn's constraint asks for one. ++ ++@item MODES_TIEABLE_P (@var{mode1}, @var{mode2}) ++A C expression that is nonzero if it is desirable to choose register ++allocation so as to avoid move instructions between a value of mode ++@var{mode1} and a value of mode @var{mode2}. ++ ++If @code{HARD_REGNO_MODE_OK (@var{r}, @var{mode1})} and ++@code{HARD_REGNO_MODE_OK (@var{r}, @var{mode2})} are ever different ++for any @var{r}, then @code{MODES_TIEABLE_P (@var{mode1}, ++@var{mode2})} must be zero. ++ ++@item PC_REGNUM ++If the program counter has a register number, define this as that ++register number. Otherwise, do not define it. ++ ++@item STACK_POINTER_REGNUM ++The register number of the stack pointer register, which must also be ++a fixed register according to @code{FIXED_REGISTERS}. On many ++machines, the hardware determines which register this is. ++ ++@item FRAME_POINTER_REGNUM ++The register number of the frame pointer register, which is used to ++access automatic variables in the stack frame. On some machines, the ++hardware determines which register this is. On other machines, you ++can choose any register you wish for this purpose. ++ ++@item FRAME_POINTER_REQUIRED ++A C expression which is nonzero if a function must have and use a frame ++pointer. This expression is evaluated twice: at the beginning of ++generating RTL, and in the reload pass. If its value is nonzero at ++either time, then the function will have a frame pointer. ++ ++The expression can in principle examine the current function and decide ++according to the facts, but on most machines the constant 0 or the ++constant 1 suffices. Use 0 when the machine allows code to be generated ++with no frame pointer, and doing so saves some time or space. Use 1 ++when there is no possible advantage to avoiding a frame pointer. ++ ++In certain cases, the compiler does not know how to produce valid code ++without a frame pointer. The compiler recognizes those cases and ++automatically gives the function a frame pointer regardless of what ++@code{FRAME_POINTER_REQUIRED} says. You don't need to worry about ++them.@refill ++ ++In a function that does not require a frame pointer, the frame pointer ++register can be allocated for ordinary usage, unless you mark it as a ++fixed register. See @code{FIXED_REGISTERS} for more information. ++ ++@item ARG_POINTER_REGNUM ++The register number of the arg pointer register, which is used to ++access the function's argument list. On some machines, this is the ++same as the frame pointer register. On some machines, the hardware ++determines which register this is. On other machines, you can choose ++any register you wish for this purpose. If this is not the same ++register as the frame pointer register, then you must mark it as a ++fixed register according to @code{FIXED_REGISTERS}. ++ ++@item STATIC_CHAIN_REGNUM ++The register number used for passing a function's static chain ++pointer. This is needed for languages such as Pascal and Algol where ++functions defined within other functions can access the local ++variables of the outer functions; it is not currently used because C ++does not provide this feature, but you must define the macro. ++ ++The static chain register need not be a fixed register. ++ ++@item STRUCT_VALUE_REGNUM ++When a function's value's mode is @code{BLKmode}, the value is not ++returned according to @code{FUNCTION_VALUE}. Instead, the caller ++passes the address of a block of memory in which the value should be ++stored. ++ ++If this value is passed in a register, then @code{STRUCT_VALUE_REGNUM} ++should be the number of that register. ++ ++@item STRUCT_VALUE ++If the structure value address is not passed in a register, define ++@code{STRUCT_VALUE} as an expression returning an RTX for the place ++where the address is passed. If it returns a @code{mem} RTX, the ++address is passed as an ``invisible'' first argument. ++ ++@item STRUCT_VALUE_INCOMING_REGNUM ++On some architectures the place where the structure value address ++is found by the called function is not the same place that the ++caller put it. This can be due to register windows, or it could ++be because the function prologue moves it to a different place. ++ ++If the incoming location of the structure value address is in a ++register, define this macro as the register number. ++ ++@item STRUCT_VALUE_INCOMING ++If the incoming location is not a register, define ++@code{STRUCT_VALUE_INCOMING} as an expression for an RTX for where the ++called function should find the value. If it should find the value on ++the stack, define this to create a @code{mem} which refers to the ++frame pointer. If the value is a @code{mem}, the compiler assumes it ++is for an invisible first argument, and leaves space for it when ++finding the first real argument. ++ ++@item REG_ALLOC_ORDER ++If defined, an initializer for a vector of integers, containing the ++numbers of hard registers in the order in which the GNU CC should ++prefer to use them (from most preferred to least). ++ ++If this macro is not defined, registers are used lowest numbered first ++(all else being equal). ++ ++One use of this macro is on the 360, where the highest numbered ++registers must always be saved and the save-multiple-registers ++instruction supports only sequences of consecutive registers. This ++macro is defined to cause the highest numbered allocatable registers ++to be used first. ++@end table ++ ++@node Register Classes, Stack Layout, Registers, Machine Macros ++@section Register Classes ++ ++On many machines, the numbered registers are not all equivalent. ++For example, certain registers may not be allowed for indexed addressing; ++certain registers may not be allowed in some instructions. These machine ++restrictions are described to the compiler using @dfn{register classes}. ++ ++You define a number of register classes, giving each one a name and saying ++which of the registers belong to it. Then you can specify register classes ++that are allowed as operands to particular instruction patterns. ++ ++In general, each register will belong to several classes. In fact, one ++class must be named @code{ALL_REGS} and contain all the registers. Another ++class must be named @code{NO_REGS} and contain no registers. Often the ++union of two classes will be another class; however, this is not required. ++ ++One of the classes must be named @code{GENERAL_REGS}. There is nothing ++terribly special about the name, but the operand constraint letters ++@samp{r} and @samp{g} specify this class. If @code{GENERAL_REGS} is ++the same as @code{ALL_REGS}, just define it as a macro which expands ++to @code{ALL_REGS}. ++ ++The way classes other than @code{GENERAL_REGS} are specified in operand ++constraints is through machine-dependent operand constraint letters. ++You can define such letters to correspond to various classes, then use ++them in operand constraints. ++ ++You should define a class for the union of two classes whenever some ++instruction allows both classes. For example, if an instruction allows ++either a floating-point (coprocessor) register or a general register for a ++certain operand, you should define a class @code{FLOAT_OR_GENERAL_REGS} ++which includes both of them. Otherwise you will get suboptimal code. ++ ++You must also specify certain redundant information about the register ++classes: for each class, which classes contain it and which ones are ++contained in it; for each pair of classes, the largest class contained ++in their union. ++ ++When a value occupying several consecutive registers is expected in a ++certain class, all the registers used must belong to that class. ++Therefore, register classes cannot be used to enforce a requirement for ++a register pair to start with an even-numbered register. The way to ++specify this requirement is with @code{HARD_REGNO_MODE_OK}. ++ ++Register classes used for input-operands of bitwise-and or shift ++instructions have a special requirement: each such class must have, for ++each fixed-point machine mode, a subclass whose registers can transfer that ++mode to or from memory. For example, on some machines, the operations for ++single-byte values (@code{QImode}) are limited to certain registers. When ++this is so, each register class that is used in a bitwise-and or shift ++instruction must have a subclass consisting of registers from which ++single-byte values can be loaded or stored. This is so that ++@code{PREFERRED_RELOAD_CLASS} can always have a possible value to return. ++ ++@table @code ++@item enum reg_class ++An enumeral type that must be defined with all the register class names ++as enumeral values. @code{NO_REGS} must be first. @code{ALL_REGS} ++must be the last register class, followed by one more enumeral value, ++@code{LIM_REG_CLASSES}, which is not a register class but rather ++tells how many classes there are. ++ ++Each register class has a number, which is the value of casting ++the class name to type @code{int}. The number serves as an index ++in many of the tables described below. ++ ++@item N_REG_CLASSES ++The number of distinct register classes, defined as follows: ++ ++@example ++#define N_REG_CLASSES (int) LIM_REG_CLASSES ++@end example ++ ++@item REG_CLASS_NAMES ++An initializer containing the names of the register classes as C string ++constants. These names are used in writing some of the debugging dumps. ++ ++@item REG_CLASS_CONTENTS ++An initializer containing the contents of the register classes, as integers ++which are bit masks. The @var{n}th integer specifies the contents of class ++@var{n}. The way the integer @var{mask} is interpreted is that ++register @var{r} is in the class if @code{@var{mask} & (1 << @var{r})} is 1. ++ ++When the machine has more than 32 registers, an integer does not suffice. ++Then the integers are replaced by sub-initializers, braced groupings containing ++several integers. Each sub-initializer must be suitable as an initializer ++for the type @code{HARD_REG_SET} which is defined in @file{hard-reg-set.h}. ++ ++@item REGNO_REG_CLASS (@var{regno}) ++A C expression whose value is a register class containing hard register ++@var{regno}. In general there is more that one such class; choose a class ++which is @dfn{minimal}, meaning that no smaller class also contains the ++register. ++ ++@item BASE_REG_CLASS ++A macro whose definition is the name of the class to which a valid ++base register must belong. A base register is one used in an address ++which is the register value plus a displacement. ++ ++@item INDEX_REG_CLASS ++A macro whose definition is the name of the class to which a valid ++index register must belong. An index register is one used in an ++address where its value is either multiplied by a scale factor or ++added to another register (as well as added to a displacement). ++ ++@item REG_CLASS_FROM_LETTER (@var{char}) ++A C expression which defines the machine-dependent operand constraint ++letters for register classes. If @var{char} is such a letter, the ++value should be the register class corresponding to it. Otherwise, ++the value should be @code{NO_REGS}. ++ ++@item REGNO_OK_FOR_BASE_P (@var{num}) ++A C expression which is nonzero if register number @var{num} is ++suitable for use as a base register in operand addresses. It may be ++either a suitable hard register or a pseudo register that has been ++allocated such a hard register. ++ ++@item REGNO_OK_FOR_INDEX_P (@var{num}) ++A C expression which is nonzero if register number @var{num} is ++suitable for use as an index register in operand addresses. It may be ++either a suitable hard register or a pseudo register that has been ++allocated such a hard register. ++ ++The difference between an index register and a base register is that ++the index register may be scaled. If an address involves the sum of ++two registers, neither one of them scaled, then either one may be ++labeled the ``base'' and the other the ``index''; but whichever ++labeling is used must fit the machine's constraints of which registers ++may serve in each capacity. The compiler will try both labelings, ++looking for one that is valid, and will reload one or both registers ++only if neither labeling works. ++ ++@item PREFERRED_RELOAD_CLASS (@var{x}, @var{class}) ++A C expression that places additional restrictions on the register class ++to use when it is necessary to copy value @var{x} into a register in class ++@var{class}. The value is a register class; perhaps @var{class}, or perhaps ++another, smaller class. On many machines, the definition ++ ++@example ++#define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS ++@end example ++ ++@noindent ++is safe. ++ ++Sometimes returning a more restrictive class makes better code. For ++example, on the 68000, when @var{x} is an integer constant that is in range ++for a @samp{moveq} instruction, the value of this macro is always ++@code{DATA_REGS} as long as @var{class} includes the data registers. ++Requiring a data register guarantees that a @samp{moveq} will be used. ++ ++If @var{x} is a @code{const_double}, by returning @code{NO_REGS} ++you can force @var{x} into a memory constant. This is useful on ++certain machines where immediate floating values cannot be loaded into ++certain kinds of registers. ++ ++In a shift instruction or a bitwise-and instruction, the mode of @var{x}, ++the value being reloaded, may not be the same as the mode of the ++instruction's operand. (They will both be fixed-point modes, however.) In ++such a case, @var{class} may not be a safe value to return. @var{class} is ++certainly valid for the instruction, but it may not be valid for reloading ++@var{x}. This problem can occur on machines such as the 68000 and 80386 ++where some registers can handle full-word values but cannot handle ++single-byte values. ++ ++On such machines, this macro must examine the mode of @var{x} and return a ++subclass of @var{class} which can handle loads and stores of that mode. On ++the 68000, where address registers cannot handle @code{QImode}, if @var{x} ++has @code{QImode} then you must return @code{DATA_REGS}. If @var{class} is ++@code{ADDR_REGS}, then there is no correct value to return; but the shift ++and bitwise-and instructions don't use @code{ADDR_REGS}, so this fatal case ++never arises. ++ ++@item CLASS_MAX_NREGS (@var{class}, @var{mode}) ++A C expression for the maximum number of consecutive registers ++of class @var{class} needed to hold a value of mode @var{mode}. ++ ++This is closely related to the macro @code{HARD_REGNO_NREGS}. ++In fact, the value of the macro @code{CLASS_MAX_NREGS (@var{class}, @var{mode})} ++should be the maximum value of @code{HARD_REGNO_NREGS (@var{regno}, @var{mode})} ++for all @var{regno} values in the class @var{class}. ++ ++This macro helps control the handling of multiple-word values ++in the reload pass. ++@end table ++ ++Two other special macros describe which constants fit which constraint ++letters. ++ ++@table @code ++@item CONST_OK_FOR_LETTER_P (@var{value}, @var{c}) ++A C expression that defines the machine-dependent operand constraint letters ++that specify particular ranges of integer values. If @var{c} is one ++of those letters, the expression should check that @var{value}, an integer, ++is in the appropriate range and return 1 if so, 0 otherwise. If @var{c} is ++not one of those letters, the value should be 0 regardless of @var{value}. ++ ++@item CONST_DOUBLE_OK_FOR_LETTER_P (@var{value}, @var{c}) ++A C expression that defines the machine-dependent operand constraint ++letters that specify particular ranges of floating values. If @var{c} is ++one of those letters, the expression should check that @var{value}, an RTX ++of code @code{const_double}, is in the appropriate range and return 1 if ++so, 0 otherwise. If @var{c} is not one of those letters, the value should ++be 0 regardless of @var{value}. ++@end table ++ ++@node Stack Layout, Library Calls, Register Classes, Machine Macros ++@section Describing Stack Layout ++ ++@table @code ++@item STACK_GROWS_DOWNWARD ++Define this macro if pushing a word onto the stack moves the stack ++pointer to a smaller address. ++ ++When we say, ``define this macro if @dots{},'' it means that the ++compiler checks this macro only with @code{#ifdef} so the precise ++definition used does not matter. ++ ++@item FRAME_GROWS_DOWNWARD ++Define this macro if the addresses of local variable slots are at negative ++offsets from the frame pointer. ++ ++@item STARTING_FRAME_OFFSET ++Offset from the frame pointer to the first local variable slot to be allocated. ++ ++If @code{FRAME_GROWS_DOWNWARD}, the next slot's offset is found by ++subtracting the length of the first slot from @code{STARTING_FRAME_OFFSET}. ++Otherwise, it is found by adding the length of the first slot to ++the value @code{STARTING_FRAME_OFFSET}. ++ ++@item PUSH_ROUNDING (@var{npushed}) ++A C expression that is the number of bytes actually pushed onto the ++stack when an instruction attempts to push @var{npushed} bytes. ++ ++If the target machine does not have a push instruction, do not define ++this macro. That directs GNU CC to use an alternate strategy: to ++allocate the entire argument block and then store the arguments into ++it. ++ ++On some machines, the definition ++ ++@example ++#define PUSH_ROUNDING(BYTES) (BYTES) ++@end example ++ ++@noindent ++will suffice. But on other machines, instructions that appear ++to push one byte actually push two bytes in an attempt to maintain ++alignment. Then the definition should be ++ ++@example ++#define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1) ++@end example ++ ++@item FIRST_PARM_OFFSET (@var{fundecl}) ++Offset from the argument pointer register to the first argument's ++address. On some machines it may depend on the data type of the ++function. (In the next version of GNU CC, the argument will be ++changed to the function data type rather than its declaration.) ++ ++@item FIRST_PARM_CALLER_OFFSET (@var{fundecl}) ++Define this macro on machines where register parameters have shadow ++locations on the stack, at addresses below the nominal parameter. ++This matters because certain arguments cannot be passed on the stack. ++On these machines, such arguments must be stored into the shadow ++locations. ++ ++This macro should expand into a C expression whose value is the offset ++of the first parameter's shadow location from the nominal stack ++pointer value. (That value is itself computed by adding the value of ++@code{STACK_POINTER_OFFSET} to the stack pointer register.) ++ ++@item REG_PARM_STACK_SPACE ++Define this macro if functions should assume that stack space has been ++allocated for arguments even when their values are passed in ++registers. ++ ++The actual allocation of such space would be done either by ++the call instruction or by the function prologue, or by ++defining @code{FIRST_PARM_CALLER_OFFSET}. ++ ++@item STACK_ARGS_ADJUST (@var{size}) ++Define this macro if the machine requires padding on the stack for ++certain function calls. This is padding on a per-function-call basis, ++not padding for individual arguments. ++ ++The argument @var{size} will be a C variable of type @code{struct ++arg_data} which contains two fields, an integer named @code{constant} ++and an RTX named @code{var}. These together represent a size measured ++in bytes which is the sum of the integer and the RTX. Most of the ++time @code{var} is 0, which means that the size is simply the integer. ++ ++The definition should be a C statement or compound statement ++which alters the variable supplied in whatever way you wish. ++ ++Note that the value you leave in the variable @code{size} will ++ultimately be rounded up to a multiple of @code{STACK_BOUNDARY} bits. ++ ++This macro is not fully implemented for machines which have push ++instructions (i.e., on which @code{PUSH_ROUNDING} is defined). ++ ++@item RETURN_POPS_ARGS (@var{funtype}) ++A C expression that should be 1 if a function pops its own arguments ++on returning, or 0 if the function pops no arguments and the caller ++must therefore pop them all after the function returns. ++ ++@var{funtype} is a C variable whose value is a tree node that ++describes the function in question. Normally it is a node of type ++@code{FUNCTION_TYPE} that describes the data type of the function. ++From this it is possible to obtain the data types of the value and ++arguments (if known). ++ ++When a call to a library function is being considered, @var{funtype} ++will contain an identifier node for the library function. Thus, if ++you need to distinguish among various library functions, you can do so ++by their names. Note that ``library function'' in this context means ++a function used to perform arithmetic, whose name is known specially ++in the compiler and was not mentioned in the C code being compiled. ++ ++On the Vax, all functions always pop their arguments, so the ++definition of this macro is 1. On the 68000, using the standard ++calling convention, no functions pop their arguments, so the value of ++the macro is always 0 in this case. But an alternative calling ++convention is available in which functions that take a fixed number of ++arguments pop them but other functions (such as @code{printf}) pop ++nothing (the caller pops all). When this convention is in use, ++@var{funtype} is examined to determine whether a function takes a ++fixed number of arguments. ++ ++When this macro returns nonzero, the macro @code{FRAME_POINTER_REQUIRED} ++must also return nonzero for proper operation. ++ ++@item FUNCTION_VALUE (@var{valtype}, @var{func}) ++A C expression to create an RTX representing the place where a ++function returns a value of data type @var{valtype}. @var{valtype} is ++a tree node representing a data type. Write @code{TYPE_MODE ++(@var{valtype})} to get the machine mode used to represent that type. ++On many machines, only the mode is relevant. (Actually, on most ++machines, scalar values are returned in the same place regardless of ++mode).@refill ++ ++If the precise function being called is known, @var{func} is a tree ++node (@code{FUNCTION_DECL}) for it; otherwise, @var{func} is a null ++pointer. This makes it possible to use a different value-returning ++convention for specific functions when all their calls are ++known.@refill ++ ++@item FUNCTION_OUTGOING_VALUE (@var{valtype}, @var{func}) ++Define this macro if the target machine has ``register windows'' ++so that the register in which a function returns its value is not ++the same as the one in which the caller sees the value. ++ ++For such machines, @code{FUNCTION_VALUE} computes the register in ++which the caller will see the value, and ++@code{FUNCTION_OUTGOING_VALUE} should be defined in a similar fashion ++to tell the function where to put the value.@refill ++ ++If @code{FUNCTION_OUTGOING_VALUE} is not defined, ++@code{FUNCTION_VALUE} serves both purposes.@refill ++ ++@item RETURN_IN_MEMORY (@var{type}) ++A C expression which can inhibit the returning of certain function ++values in registers, based on the type of value. A nonzero value says ++to return the function value in memory, just as large structures are ++always returned. Here @var{type} will be a C expression of type ++@code{tree}, representing the data type of the value. ++ ++Note that values of mode @code{BLKmode} are returned in memory ++regardless of this macro. Also, the option @samp{-fpcc-struct-return} ++takes effect regardless of this macro. On most systems, it is ++possible to leave the macro undefined; this causes a default ++definition to be used, whose value is the constant 0. ++ ++@item LIBCALL_VALUE (@var{mode}) ++A C expression to create an RTX representing the place where a library ++function returns a value of mode @var{mode}. If the precise function ++being called is known, @var{func} is a tree node ++(@code{FUNCTION_DECL}) for it; otherwise, @var{func} is a null ++pointer. This makes it possible to use a different value-returning ++convention for specific functions when all their calls are ++known.@refill ++ ++Note that ``library function'' in this context means a compiler ++support routine, used to perform arithmetic, whose name is known ++specially by the compiler and was not mentioned in the C code being ++compiled. ++ ++@item FUNCTION_VALUE_REGNO_P (@var{regno}) ++A C expression that is nonzero if @var{regno} is the number of a hard ++register in which the values of called function may come back. ++ ++A register whose use for returning values is limited to serving as the ++second of a pair (for a value of type @code{double}, say) need not be ++recognized by this macro. So for most machines, this definition ++suffices: ++ ++@example ++#define FUNCTION_VALUE_REGNO_P(N) ((N) == 0) ++@end example ++ ++If the machine has register windows, so that the caller and the called ++function use different registers for the return value, this macro ++should recognize only the caller's register numbers. ++ ++@item FUNCTION_ARG (@var{cum}, @var{mode}, @var{type}, @var{named}) ++A C expression that controls whether a function argument is passed ++in a register, and which register. ++ ++The arguments are @var{cum}, which summarizes all the previous ++arguments; @var{mode}, the machine mode of the argument; @var{type}, ++the data type of the argument as a tree node or 0 if that is not known ++(which happens for C support library functions); and @var{named}, ++which is 1 for an ordinary argument and 0 for nameless arguments that ++correspond to @samp{@dots{}} in the called function's prototype. ++ ++The value of the expression should either be a @code{reg} RTX for the ++hard register in which to pass the argument, or zero to pass the ++argument on the stack. ++ ++For the Vax and 68000, where normally all arguments are pushed, zero ++suffices as a definition. ++ ++The usual way to make the ANSI library @file{stdarg.h} work on a machine ++where some arguments are usually passed in registers, is to cause ++nameless arguments to be passed on the stack instead. This is done ++by making @code{FUNCTION_ARG} return 0 whenever @var{named} is 0. ++ ++@item FUNCTION_INCOMING_ARG (@var{cum}, @var{mode}, @var{type}, @var{named}) ++Define this macro if the target machine has ``register windows'', so ++that the register in which a function sees an arguments is not ++necessarily the same as the one in which the caller passed the ++argument. ++ ++For such machines, @code{FUNCTION_ARG} computes the register in which ++the caller passes the value, and @code{FUNCTION_INCOMING_ARG} should ++be defined in a similar fashion to tell the function being called ++where the arguments will arrive. ++ ++If @code{FUNCTION_INCOMING_ARG} is not defined, @code{FUNCTION_ARG} ++serves both purposes.@refill ++ ++@item FUNCTION_ARG_PARTIAL_NREGS (@var{cum}, @var{mode}, @var{type}, @var{named}) ++A C expression for the number of words, at the beginning of an ++argument, must be put in registers. The value must be zero for ++arguments that are passed entirely in registers or that are entirely ++pushed on the stack. ++ ++On some machines, certain arguments must be passed partially in ++registers and partially in memory. On these machines, typically the ++first @var{n} words of arguments are passed in registers, and the rest ++on the stack. If a multi-word argument (a @code{double} or a ++structure) crosses that boundary, its first few words must be passed ++in registers and the rest must be pushed. This macro tells the ++compiler when this occurs, and how many of the words should go in ++registers. ++ ++@code{FUNCTION_ARG} for these arguments should return the first ++register to be used by the caller for this argument; likewise ++@code{FUNCTION_INCOMING_ARG}, for the called function. ++ ++@item CUMULATIVE_ARGS ++A C type for declaring a variable that is used as the first argument ++of @code{FUNCTION_ARG} and other related values. For some target ++machines, the type @code{int} suffices and can hold the number of ++bytes of argument so far. ++ ++@item INIT_CUMULATIVE_ARGS (@var{cum}, @var{fntype}) ++A C statement (sans semicolon) for initializing the variable @var{cum} ++for the state at the beginning of the argument list. The variable has ++type @code{CUMULATIVE_ARGS}. The value of @var{fntype} is the tree node ++for the data type of the function which will receive the args, or 0 ++if the args are to a compiler support library function. ++ ++@item FUNCTION_ARG_ADVANCE (@var{cum}, @var{mode}, @var{type}, @var{named}) ++A C statement (sans semicolon) to update the summarizer variable ++@var{cum} to advance past an argument in the argument list. The ++values @var{mode}, @var{type} and @var{named} describe that argument. ++Once this is done, the variable @var{cum} is suitable for analyzing ++the @emph{following} argument with @code{FUNCTION_ARG}, etc.@refill ++ ++@item FUNCTION_ARG_REGNO_P (@var{regno}) ++A C expression that is nonzero if @var{regno} is the number of a hard ++register in which function arguments are sometimes passed. This does ++@emph{not} include implicit arguments such as the static chain and ++the structure-value address. On many machines, no registers can be ++used for this purpose since all function arguments are pushed on the ++stack. ++ ++@item FUNCTION_ARG_PADDING (@var{mode}, @var{size}) ++If defined, a C expression which determines whether, and in which direction, ++to pad out an argument with extra space. The value should be of type ++@code{enum direction}: either @code{upward} to pad above the argument, ++@code{downward} to pad below, or @code{none} to inhibit padding. ++ ++The argument @var{size} is an RTX which describes the size of the ++argument, in bytes. It should be used only if @var{mode} is ++@code{BLKmode}. Otherwise, @var{size} is 0. ++ ++This macro does not control the @emph{amount} of padding; that is ++always just enough to reach the next multiple of @code{PARM_BOUNDARY}. ++ ++This macro has a default definition which is right for most systems. ++For little-endian machines, the default is to pad upward. For ++big-endian machines, the default is to pad downward for an argument of ++constant size shorter than an @code{int}, and upward otherwise. ++ ++@item FUNCTION_PROLOGUE (@var{file}, @var{size}) ++A C compound statement that outputs the assembler code for entry to a ++function. The prologue is responsible for setting up the stack frame, ++initializing the frame pointer register, saving registers that must be ++saved, and allocating @var{size} additional bytes of storage for the ++local variables. @var{size} is an integer. @var{file} is a stdio ++stream to which the assembler code should be output. ++ ++The label for the beginning of the function need not be output by this ++macro. That has already been done when the macro is run. ++ ++To determine which registers to save, the macro can refer to the array ++@code{regs_ever_live}: element @var{r} is nonzero if hard register ++@var{r} is used anywhere within the function. This implies the ++function prologue should save register @var{r}, but not if it is one ++of the call-used registers. ++ ++On machines where functions may or may not have frame-pointers, the ++function entry code must vary accordingly; it must set up the frame ++pointer if one is wanted, and not otherwise. To determine whether a ++frame pointer is in wanted, the macro can refer to the variable ++@code{frame_pointer_needed}. The variable's value will be 1 at run ++time in a function that needs a frame pointer. ++ ++On machines where an argument may be passed partly in registers and ++partly in memory, this macro must examine the variable ++@code{current_function_pretend_args_size}, and allocate that many bytes ++of uninitialized space on the stack just underneath the first argument ++arriving on the stack. (This may not be at the very end of the stack, ++if the calling sequence has pushed anything else since pushing the stack ++arguments. But usually, on such machines, nothing else has been pushed ++yet, because the function prologue itself does all the pushing.) ++ ++@item FUNCTION_PROFILER (@var{file}, @var{labelno}) ++A C statement or compound statement to output to @var{file} some ++assembler code to call the profiling subroutine @code{mcount}. ++Before calling, the assembler code must load the address of a ++counter variable into a register where @code{mcount} expects to ++find the address. The name of this variable is @samp{LP} followed ++by the number @var{labelno}, so you would generate the name using ++@samp{LP%d} in a @code{fprintf}. ++ ++The details of how the address should be passed to @code{mcount} are ++determined by your operating system environment, not by GNU CC. To ++figure them out, compile a small program for profiling using the ++system's installed C compiler and look at the assembler code that ++results. ++ ++@item FUNCTION_BLOCK_PROFILER (@var{file}, @var{labelno}) ++A C statement or compound statement to output to @var{file} some ++assembler code to initialize basic-block profiling for the current ++object module. This code should call the subroutine ++@code{__bb_init_func} once per object module, passing it as its sole ++argument the address of a block allocated in the object module. ++ ++The name of the block is a local symbol made with this statement: ++ ++@example ++ASM_GENERATE_INTERNAL_LABEL (@var{buffer}, "LPBX", 0); ++@end example ++ ++Of course, since you are writing the definition of ++@code{ASM_GENERATE_INTERNAL_LABEL} as well as that of this macro, you ++can take a short cut in the definition of this macro and use the name ++that you know will result. ++ ++The first word of this block is a flag which will be nonzero if the ++object module has already been initialized. So test this word first, ++and do not call @code{__bb_init_func} if the flag is nonzero. ++ ++@item BLOCK_PROFILER (@var{file}, @var{blockno}) ++A C statement or compound statement to increment the count associated ++with the basic block number @var{blockno}. Basic blocks are numbered ++separately from zero within each compilation. The count associated ++with block number @var{blockno} is at index @var{blockno} in a vector ++of words; the name of this array is a local symbol made with this ++statement: ++ ++@example ++ASM_GENERATE_INTERNAL_LABEL (@var{buffer}, "LPBX", 2); ++@end example ++ ++Of course, since you are writing the definition of ++@code{ASM_GENERATE_INTERNAL_LABEL} as well as that of this macro, you ++can take a short cut in the definition of this macro and use the name ++that you know will result. ++ ++@item EXIT_IGNORE_STACK ++Define this macro as a C expression that is nonzero if the return ++instruction or the function epilogue ignores the value of the stack ++pointer; in other words, if it is safe to delete an instruction to ++adjust the stack pointer before a return from the function. ++ ++Note that this macro's value is relevant only for functions for which ++frame pointers are maintained. It is never safe to delete a final ++stack adjustment in a function that has no frame pointer, and the ++compiler knows this regardless of @code{EXIT_IGNORE_STACK}. ++ ++@item FUNCTION_EPILOGUE (@var{file}, @var{size}) ++A C compound statement that outputs the assembler code for exit from a ++function. The epilogue is responsible for restoring the saved ++registers and stack pointer to their values when the function was ++called, and returning control to the caller. This macro takes the ++same arguments as the macro @code{FUNCTION_PROLOGUE}, and the ++registers to restore are determined from @code{regs_ever_live} and ++@code{CALL_USED_REGISTERS} in the same way. ++ ++On some machines, there is a single instruction that does all the work ++of returning from the function. On these machines, give that ++instruction the name @samp{return} and do not define the macro ++@code{FUNCTION_EPILOGUE} at all. ++ ++Do not define a pattern named @samp{return} if you want the ++@code{FUNCTION_EPILOGUE} to be used. If you want the target switches ++to control whether return instructions or epilogues are used, define a ++@samp{return} pattern with a validity condition that tests the target ++switches appropriately. If the @samp{return} pattern's validity ++condition is false, epilogues will be used. ++ ++On machines where functions may or may not have frame-pointers, the ++function exit code must vary accordingly. Sometimes the code for ++these two cases is completely different. To determine whether a frame ++pointer is in wanted, the macro can refer to the variable ++@code{frame_pointer_needed}. The variable's value will be 1 at run ++time in a function that needs a frame pointer. ++ ++On some machines, some functions pop their arguments on exit while ++others leave that for the caller to do. For example, the 68020 when ++given @samp{-mrtd} pops arguments in functions that take a fixed ++number of arguments. ++ ++Your definition of the macro @code{RETURN_POPS_ARGS} decides which ++functions pop their own arguments. @code{FUNCTION_EPILOGUE} needs to ++know what was decided. The variable @code{current_function_pops_args} ++is nonzero if the function should pop its own arguments. If so, use ++the variable @code{current_function_args_size} as the number of bytes ++to pop. ++ ++@item FIX_FRAME_POINTER_ADDRESS (@var{addr}, @var{depth}) ++A C compound statement to alter a memory address that uses the frame ++pointer register so that it uses the stack pointer register instead. ++This must be done in the instructions that load parameter values into ++registers, when the reload pass determines that a frame pointer is not ++necessary for the function. @var{addr} will be a C variable name, and ++the updated address should be stored in that variable. @var{depth} ++will be the current depth of stack temporaries (number of bytes of ++arguments currently pushed). The change in offset between a ++frame-pointer-relative address and a stack-pointer-relative address ++must include @var{depth}. ++ ++Even if your machine description specifies there will always be a ++frame pointer in the frame pointer register, you must still define ++@code{FIX_FRAME_POINTER_ADDRESS}, but the definition will never be ++executed at run time, so it may be empty. ++ ++@item LONGJMP_RESTORE_FROM_STACK ++Define this macro if the @code{longjmp} function restores registers ++from the stack frames, rather than from those saved specifically by ++@code{setjmp}. Certain quantities must not be kept in registers ++across a call to @code{setjmp} on such machines. ++@end table ++ ++@node Library Calls, Addressing Modes, Stack Layout, Machine Macros ++@section Implicit Use of Library Routines ++ ++@table @code ++@item MULSI3_LIBCALL ++A C string constant giving the name of the function to call for ++multiplication of one signed full-word by another. If you do not ++define this macro, the default name is used, which is @code{__mulsi3}, ++a function defined in @file{gnulib}. ++ ++@item UMULSI3_LIBCALL ++A C string constant giving the name of the function to call for ++multiplication of one unsigned full-word by another. If you do not ++define this macro, the default name is used, which is ++@code{__umulsi3}, a function defined in @file{gnulib}. ++ ++@item DIVSI3_LIBCALL ++A C string constant giving the name of the function to call for ++division of one signed full-word by another. If you do not define ++this macro, the default name is used, which is @code{__divsi3}, a ++function defined in @file{gnulib}. ++ ++@item UDIVSI3_LIBCALL ++A C string constant giving the name of the function to call for ++division of one unsigned full-word by another. If you do not define ++this macro, the default name is used, which is @code{__udivsi3}, a ++function defined in @file{gnulib}. ++ ++@item MODSI3_LIBCALL ++A C string constant giving the name of the function to call for the ++remainder in division of one signed full-word by another. If you do ++not define this macro, the default name is used, which is ++@code{__modsi3}, a function defined in @file{gnulib}. ++ ++@item UMODSI3_LIBCALL ++A C string constant giving the name of the function to call for the ++remainder in division of one unsigned full-word by another. If you do ++not define this macro, the default name is used, which is ++@code{__umodsi3}, a function defined in @file{gnulib}. ++ ++@item TARGET_MEM_FUNCTIONS ++Define this macro if GNU CC should generate calls to the System V ++(and ANSI C) library functions @code{memcpy} and @code{memset} ++rather than the BSD functions @code{bcopy} and @code{bzero}. ++ ++@item GNULIB_NEEDS_DOUBLE ++Define this macro if only @code{float} arguments cannot be passed to ++library routines (so they must be converted to @code{double}). This ++macro affects both how library calls are generated and how the library ++routines in @file{gnulib.c} accept their arguments. It is useful on ++machines where floating and fixed point arguments are passed ++differently, such as the i860. ++@end table ++ ++@node Addressing Modes, Delayed Branch, Library Calls, Machine Macros ++@section Addressing Modes ++ ++@table @code ++@item HAVE_POST_INCREMENT ++Define this macro if the machine supports post-increment addressing. ++ ++@item HAVE_PRE_INCREMENT ++@itemx HAVE_POST_DECREMENT ++@itemx HAVE_PRE_DECREMENT ++Similar for other kinds of addressing. ++ ++@item CONSTANT_ADDRESS_P (@var{x}) ++A C expression that is 1 if the RTX @var{x} is a constant whose value ++is an integer. This includes integers whose values are not explicitly ++known, such as @code{symbol_ref} and @code{label_ref} expressions and ++@code{const} arithmetic expressions. ++ ++On most machines, this can be defined as @code{CONSTANT_P (@var{x})}, ++but a few machines are more restrictive in which constant addresses ++are supported. ++ ++@item MAX_REGS_PER_ADDRESS ++A number, the maximum number of registers that can appear in a valid ++memory address. Note that it is up to you to specify a value equal to ++the maximum number that @code{go_if_legitimate_address} would ever ++accept. ++ ++@item GO_IF_LEGITIMATE_ADDRESS (@var{mode}, @var{x}, @var{label}) ++A C compound statement with a conditional @code{goto @var{label};} ++executed if @var{x} (an RTX) is a legitimate memory address on the ++target machine for a memory operand of mode @var{mode}. ++ ++It usually pays to define several simpler macros to serve as ++subroutines for this one. Otherwise it may be too complicated to ++understand. ++ ++This macro must exist in two variants: a strict variant and a ++non-strict one. The strict variant is used in the reload pass. It ++must be defined so that any pseudo-register that has not been ++allocated a hard register is considered a memory reference. In ++contexts where some kind of register is required, a pseudo-register ++with no hard register must be rejected. ++ ++The non-strict variant is used in other passes. It must be defined to ++accept all pseudo-registers in every context where some kind of ++register is required. ++ ++Compiler source files that want to use the strict variant of this ++macro define the macro @code{REG_OK_STRICT}. You should use an ++@code{#ifdef REG_OK_STRICT} conditional to define the strict variant ++in that case and the non-strict variant otherwise. ++ ++Typically among the subroutines used to define ++@code{GO_IF_LEGITIMATE_ADDRESS} are subroutines to check for ++acceptable registers for various purposes (one for base registers, one ++for index registers, and so on). Then only these subroutine macros ++need have two variants; the higher levels of macros may be the same ++whether strict or not.@refill ++ ++Normally, constant addresses which are the sum of a @code{symbol_ref} ++and an integer are stored inside a @code{const} RTX to mark them as ++constant. Therefore, there is no need to recognize such sums as ++legitimate addresses. ++ ++Usually @code{PRINT_OPERAND_ADDRESS} is not prepared to handle constant ++sums that are not marked with @code{const}. It assumes that a naked ++@code{plus} indicates indexing. If so, then you @emph{must} reject such ++naked constant sums as illegitimate addresses, so that none of them will ++be given to @code{PRINT_OPERAND_ADDRESS}.@refill ++ ++@item REG_OK_FOR_BASE_P (@var{x}) ++A C expression that is nonzero if @var{x} (assumed to be a @code{reg} ++RTX) is valid for use as a base register. For hard registers, it ++should always accept those which the hardware permits and reject the ++others. Whether the macro accepts or rejects pseudo registers must be ++controlled by @code{REG_OK_STRICT} as described above. This usually ++requires two variant definitions, of which @code{REG_OK_STRICT} ++controls the one actually used. ++ ++@item REG_OK_FOR_INDEX_P (@var{x}) ++A C expression that is nonzero if @var{x} (assumed to be a @code{reg} ++RTX) is valid for use as an index register. ++ ++The difference between an index register and a base register is that ++the index register may be scaled. If an address involves the sum of ++two registers, neither one of them scaled, then either one may be ++labeled the ``base'' and the other the ``index''; but whichever ++labeling is used must fit the machine's constraints of which registers ++may serve in each capacity. The compiler will try both labelings, ++looking for one that is valid, and will reload one or both registers ++only if neither labeling works. ++ ++@item LEGITIMIZE_ADDRESS (@var{x}, @var{oldx}, @var{mode}, @var{win}) ++A C compound statement that attempts to replace @var{x} with a valid ++memory address for an operand of mode @var{mode}. @var{win} will be a ++C statement label elsewhere in the code; the macro definition may use ++ ++@example ++GO_IF_LEGITIMATE_ADDRESS (@var{mode}, @var{x}, @var{win}); ++@end example ++ ++@noindent ++to avoid further processing if the address has become legitimate. ++ ++@var{x} will always be the result of a call to @code{break_out_memory_refs}, ++and @var{oldx} will be the operand that was given to that function to produce ++@var{x}. ++ ++The code generated by this macro should not alter the substructure of ++@var{x}. If it transforms @var{x} into a more legitimate form, it ++should assign @var{x} (which will always be a C variable) a new value. ++ ++It is not necessary for this macro to come up with a legitimate ++address. The compiler has standard ways of doing so in all cases. In ++fact, it is safe for this macro to do nothing. But often a ++machine-dependent strategy can generate better code. ++ ++@item GO_IF_MODE_DEPENDENT_ADDRESS (@var{addr}, @var{label}) ++A C statement or compound statement with a conditional @code{goto ++@var{label};} executed if memory address @var{x} (an RTX) can have ++different meanings depending on the machine mode of the memory ++reference it is used for. ++ ++Autoincrement and autodecrement addresses typically have mode-dependent ++effects because the amount of the increment or decrement is the size ++of the operand being addressed. Some machines have other mode-dependent ++addresses. Many RISC machines have no mode-dependent addresses. ++ ++You may assume that @var{addr} is a valid address for the machine. ++ ++@item LEGITIMATE_CONSTANT_P (@var{x}) ++A C expression that is nonzero if @var{x} is a legitimate constant for ++an immediate operand on the target machine. You can assume that ++either @var{x} is a @code{const_double} or it satisfies ++@code{CONSTANT_P}, so you need not check these things. In fact, ++@samp{1} is a suitable definition for this macro on machines where any ++@code{const_double} is valid and anything @code{CONSTANT_P} is valid.@refill ++@end table ++ ++@node Delayed Branch, Condition Code, Addressing Modes, Machine Macros ++@section Parameters for Delayed Branch Optimization ++ ++@table @code ++@item HAVE_DELAYED_BRANCH ++Define this macro if the target machine has delayed branches, that is, ++a branch does not take effect immediately, and the actual branch ++instruction may be followed by one or more instructions that will be ++issued before the PC is actually changed. ++ ++If defined, this allows a special scheduling pass to be run after the ++second jump optimization to attempt to reorder instructions to exploit ++this. Defining this macro also requires the definition of certain ++other macros described below. ++ ++@item DBR_SLOTS_AFTER (@var{insn}) ++This macro must be defined if @code{HAVE_DELAYED_BRANCH} is defined. ++Its definition should be a C expression returning the number of ++available delay slots following the instruction(s) output by the ++pattern for @var{insn}. The definition of ``slot'' is ++machine-dependent, and may denote instructions, bytes, or whatever. ++ ++@item DBR_INSN_SLOTS (@var{insn}) ++This macro must be defined if @code{HAVE_DELAYED_BRANCH} is defined. ++It should be a C expression returning the number of slots (typically ++the number of machine instructions) consumed by @var{insn}. ++ ++You may assume that @var{insn} is truly an insn, not a note, label, ++barrier, dispatch table, @code{use}, or @code{clobber}. ++ ++@item DBR_INSN_ELIGIBLE_P (@var{insn}, @var{dinsn}) ++A C expression whose value is non-zero if it is legitimate to put ++@var{insn} in the delay slot following @var{dinsn}. ++ ++You do not need to take account of data flow considerations in the ++definition of this macro, because the delayed branch optimizer always ++does that. This macro is needed only when certain insns may not be ++placed in certain delay slots for reasons not evident from the RTL ++expressions themselves. If there are no such problems, you don't need ++to define this macro. ++ ++You may assume that @var{insn} is truly an insn, not a note, label, ++barrier, dispatch table, @code{use}, or @code{clobber}. You may ++assume that @var{dinsn} is a jump insn with a delay slot. ++ ++@item DBR_OUTPUT_SEQEND(@var{file}) ++A C statement, to be executed after all slot-filler instructions have ++been output. If necessary, call @code{dbr_sequence_length} to ++determine the number of slots filled in a sequence (zero if not ++currently outputting a sequence), to decide how many no-ops to output, ++or whatever. ++ ++Don't define this macro if it has nothing to do, but it is helpful in ++reading assembly output if the extent of the delay sequence is made ++explicit (e.g. with white space). ++ ++Note that output routines for instructions with delay slots must be ++prepared to deal with not being output as part of a sequence (i.e. ++when the scheduling pass is not run, or when no slot fillers could be ++found.) The variable @code{final_sequence} is null when not ++processing a sequence, otherwise it contains the @code{sequence} rtx ++being output. ++@end table ++ ++@node Condition Code, Cross-compilation, Delayed Branch, Machine Macros ++@section Condition Code Information ++ ++The file @file{conditions.h} defines a variable @code{cc_status} to ++describe how the condition code was computed (in case the interpretation of ++the condition code depends on the instruction that it was set by). This ++variable contains the RTL expressions on which the condition code is ++currently based, and several standard flags. ++ ++Sometimes additional machine-specific flags must be defined in the machine ++description header file. It can also add additional machine-specific ++information by defining @code{CC_STATUS_MDEP}. ++ ++@table @code ++@item CC_STATUS_MDEP ++C code for a data type which is used for declaring the @code{mdep} ++component of @code{cc_status}. It defaults to @code{int}. ++ ++@item CC_STATUS_MDEP_INIT ++A C expression to initialize the @code{mdep} field to ``empty''. ++The default definition does nothing, since most machines don't use ++the field anyway. If you want to use the field, you should probably ++define this macro to initialize it. ++ ++@item NOTICE_UPDATE_CC (@var{exp}, @var{insn}) ++A C compound statement to set the components of @code{cc_status} ++appropriately for an insn @var{insn} whose body is @var{exp}. It is ++this macro's responsibility to recognize insns that set the condition ++code as a byproduct of other activity as well as those that explicitly ++set @code{(cc0)}. ++ ++If there are insn that do not set the condition code but do alter ++other machine registers, this macro must check to see whether they ++invalidate the expressions that the condition code is recorded as ++reflecting. For example, on the 68000, insns that store in address ++registers do not set the condition code, which means that usually ++@code{NOTICE_UPDATE_CC} can leave @code{cc_status} unaltered for such ++insns. But suppose that the previous insn set the condition code ++based on location @samp{a4@@(102)} and the current insn stores a new ++value in @samp{a4}. Although the condition code is not changed by ++this, it will no longer be true that it reflects the contents of ++@samp{a4@@(102)}. Therefore, @code{NOTICE_UPDATE_CC} must alter ++@code{cc_status} in this case to say that nothing is known about the ++condition code value. ++ ++The definition of @code{NOTICE_UPDATE_CC} must be prepared to deal ++with the results of peephole optimization: insns whose patterns are ++@code{parallel} RTXs containing various @code{reg}, @code{mem} or ++constants which are just the operands. The RTL structure of these ++insns is not sufficient to indicate what the insns actually do. What ++@code{NOTICE_UPDATE_CC} should do when it sees one is just to run ++@code{CC_STATUS_INIT}. ++@end table ++ ++@node Cross-compilation, Misc, Condition Code, Machine Macros ++@section Cross Compilation and Floating-Point Format ++ ++While all modern machines use 2's complement representation for integers, ++there are a variety of representations for floating point numbers. This ++means that in a cross-compiler the representation of floating point numbers ++in the compiled program may be different from that used in the machine ++doing the compilation. ++ ++Because different representation systems may offer different amounts of ++range and precision, the cross compiler cannot safely use the host ++machine's floating point arithmetic. Therefore, floating point constants ++must be represented in the target machine's format. This means that the ++cross compiler cannot use @code{atof} to parse a floating point constant; ++it must have its own special routine to use instead. Also, constant ++folding must emulate the target machine's arithmetic (or must not be done ++at all). ++ ++The macros in the following table should be defined only if you are cross ++compiling between different floating point formats. ++ ++Otherwise, don't define them. Then default definitions will be set up which ++use @code{double} as the data type, @code{==} to test for equality, etc. ++ ++You don't need to worry about how many times you use an operand of any ++of these macros. The compiler never uses operands which have side effects. ++ ++@table @code ++@item REAL_VALUE_TYPE ++A macro for the C data type to be used to hold a floating point value ++in the target machine's format. Typically this would be a ++@code{struct} containing an array of @code{int}. ++ ++@item REAL_VALUES_EQUAL (@var{x}, @var{y}) ++A macro for a C expression which compares for equality the two values, ++@var{x} and @var{y}, both of type @code{REAL_VALUE_TYPE}. ++ ++@item REAL_VALUES_LESS (@var{x}, @var{y}) ++A macro for a C expression which tests whether @var{x} is less than ++@var{y}, both values being of type @code{REAL_VALUE_TYPE} and ++interpreted as floating point numbers in the target machine's ++representation. ++ ++@item REAL_VALUE_LDEXP (@var{x}, @var{scale}) ++A macro for a C expression which performs the standard library ++function @code{ldexp}, but using the target machine's floating point ++representation. Both @var{x} and the value of the expression have ++type @code{REAL_VALUE_TYPE}. The second argument, @var{scale}, is an ++integer. ++ ++@item REAL_VALUE_ATOF (@var{string}) ++A macro for a C expression which converts @var{string}, an expression ++of type @code{char *}, into a floating point number in the target ++machine's representation. The value has type @code{REAL_VALUE_TYPE}. ++@end table ++ ++Define the following additional macros if you want to make floating ++point constant folding work while cross compiling. If you don't ++define them, cross compilation is still possible, but constant folding ++will not happen for floating point values. ++ ++@table @code ++@item REAL_ARITHMETIC (@var{output}, @var{code}, @var{x}, @var{y}) ++A macro for a C statement which calculates an arithmetic operation of ++the two floating point values @var{x} and @var{y}, both of type ++@code{REAL_VALUE_TYPE} in the target machine's representation, to ++produce a result of the same type and representation which is stored ++in @var{output} (which will be a variable). ++ ++The operation to be performed is specified by @var{code}, a tree code ++which will always be one of the following: @code{PLUS_EXPR}, ++@code{MINUS_EXPR}, @code{MULT_EXPR}, @code{RDIV_EXPR}, ++@code{MAX_EXPR}, @code{MIN_EXPR}.@refill ++ ++The expansion of this macro is responsible for checking for overflow. ++If overflow happens, the macro expansion should execute the statement ++@code{return 0;}, which indicates the inability to perform the ++arithmetic operation requested. ++ ++@item REAL_VALUE_NEGATE (@var{x}) ++A macro for a C expression which returns the negative of the floating ++point value @var{x}. Both @var{x} and the value of the expression ++have type @code{REAL_VALUE_TYPE} and are in the target machine's ++floating point representation. ++ ++There is no way for this macro to report overflow, since overflow ++can't happen in the negation operation. ++ ++@item REAL_VALUE_TO_INT (@var{low}, @var{high}, @var{x}) ++A macro for a C expression which converts a floating point value ++@var{x} into a double-precision integer which is then stored into ++@var{low} and @var{high}, two variables of type @var{int}. ++ ++@item REAL_VALUE_FROM_INT (@var{x}, @var{low}, @var{high}) ++A macro for a C expression which converts a double-precision integer ++found in @var{low} and @var{high}, two variables of type @var{int}, ++into a floating point value which is then stored into @var{x}. ++@end table ++ ++@node Misc, Assembler Format, Cross-compilation, Machine Macros ++@section Miscellaneous Parameters ++ ++@table @code ++@item CASE_VECTOR_MODE ++An alias for a machine mode name. This is the machine mode that ++elements of a jump-table should have. ++ ++@item CASE_VECTOR_PC_RELATIVE ++Define this macro if jump-tables should contain relative addresses. ++ ++@item CASE_DROPS_THROUGH ++Define this if control falls through a @code{case} insn when the index ++value is out of range. This means the specified default-label is ++actually ignored by the @code{case} insn proper. ++ ++@item IMPLICIT_FIX_EXPR ++An alias for a tree code that should be used by default for conversion ++of floating point values to fixed point. Normally, ++@code{FIX_ROUND_EXPR} is used.@refill ++ ++@item FIXUNS_TRUNC_LIKE_FIX_TRUNC ++Define this macro if the same instructions that convert a floating ++point number to a signed fixed point number also convert validly to an ++unsigned one. ++ ++@item EASY_DIV_EXPR ++An alias for a tree code that is the easiest kind of division to ++compile code for in the general case. It may be ++@code{TRUNC_DIV_EXPR}, @code{FLOOR_DIV_EXPR}, @code{CEIL_DIV_EXPR} or ++@code{ROUND_DIV_EXPR}. These four division operators differ in how ++they round the result to an integer. @code{EASY_DIV_EXPR} is used ++when it is permissible to use any of those kinds of division and the ++choice should be made on the basis of efficiency.@refill ++ ++@item DEFAULT_SIGNED_CHAR ++An expression whose value is 1 or 0, according to whether the type ++@code{char} should be signed or unsigned by default. The user can ++always override this default with the options @samp{-fsigned-char} ++and @samp{-funsigned-char}. ++ ++@item SCCS_DIRECTIVE ++Define this if the preprocessor should ignore @code{#sccs} directives ++and print no error message. ++ ++@item HAVE_VPRINTF ++Define this if the library function @code{vprintf} is available on your ++system. ++ ++@item MOVE_MAX ++The maximum number of bytes that a single instruction can move quickly ++from memory to memory. ++ ++@item INT_TYPE_SIZE ++A C expression for the size in bits of the type @code{int} on the ++target machine. If you don't define this, the default is one word. ++ ++@item SHORT_TYPE_SIZE ++A C expression for the size in bits of the type @code{short} on the ++target machine. If you don't define this, the default is half a word. ++(If this would be less than one storage unit, it is rounded up to one ++unit.) ++ ++@item LONG_TYPE_SIZE ++A C expression for the size in bits of the type @code{long} on the ++target machine. If you don't define this, the default is one word. ++ ++@item LONG_LONG_TYPE_SIZE ++A C expression for the size in bits of the type @code{long long} on the ++target machine. If you don't define this, the default is two ++words. ++ ++@item CHAR_TYPE_SIZE ++A C expression for the size in bits of the type @code{char} on the ++target machine. If you don't define this, the default is one quarter ++of a word. (If this would be less than one storage unit, it is rounded up ++to one unit.) ++ ++@item FLOAT_TYPE_SIZE ++A C expression for the size in bits of the type @code{float} on the ++target machine. If you don't define this, the default is one word. ++ ++@item DOUBLE_TYPE_SIZE ++A C expression for the size in bits of the type @code{double} on the ++target machine. If you don't define this, the default is two ++words. ++ ++@item LONG_DOUBLE_TYPE_SIZE ++A C expression for the size in bits of the type @code{long double} on ++the target machine. If you don't define this, the default is two ++words. ++ ++@item SLOW_BYTE_ACCESS ++Define this macro as a C expression which is nonzero if accessing less ++than a word of memory (i.e. a @code{char} or a @code{short}) is slow ++(requires more than one instruction). ++ ++@item SLOW_ZERO_EXTEND ++Define this macro if zero-extension (of a @code{char} or @code{short} ++to an @code{int}) can be done faster if the destination is a register ++that is known to be zero. ++ ++If you define this macro, you must have instruction patterns that ++recognize RTL structures like this: ++ ++@example ++(set (strict-low-part (subreg:QI (reg:SI @dots{}) 0)) @dots{}) ++@end example ++ ++@noindent ++and likewise for @code{HImode}. ++ ++@item SHIFT_COUNT_TRUNCATED ++Define this macro if shift instructions ignore all but the lowest few ++bits of the shift count. It implies that a sign-extend or zero-extend ++instruction for the shift count can be omitted. ++ ++@item TRULY_NOOP_TRUNCATION (@var{outprec}, @var{inprec}) ++A C expression which is nonzero if on this machine it is safe to ++``convert'' an integer of @var{inprec} bits to one of @var{outprec} ++bits (where @var{outprec} is smaller than @var{inprec}) by merely ++operating on it as if it had only @var{outprec} bits. ++ ++On many machines, this expression can be 1. ++ ++@item NO_FUNCTION_CSE ++Define this macro if it is as good or better to call a constant ++function address than to call an address kept in a register. ++ ++@item PROMOTE_PROTOTYPES ++Define this macro if an argument declared as @code{char} or ++@code{short} in a prototype should actually be passed as an ++@code{int}. In addition to avoiding errors in certain cases of ++mismatch, it also makes for better code on certain machines. ++ ++@item STORE_FLAG_VALUE ++A C expression for the value stored by a store-flag instruction ++(@code{s@var{cond}}) when the condition is true. This is usually 1 or ++-1; it is required to be an odd number or a negative number. ++ ++Do not define @code{STORE_FLAG_VALUE} if the machine has no store-flag ++instructions. ++ ++@item Pmode ++An alias for the machine mode for pointers. Normally the definition ++can be ++ ++@example ++#define Pmode SImode ++@end example ++ ++@item FUNCTION_MODE ++An alias for the machine mode used for memory references to functions ++being called, in @code{call} RTL expressions. On most machines this ++should be @code{QImode}. ++ ++@item INSN_MACHINE_INFO ++This macro should expand into a C structure type to use for the ++machine-dependent info field specified with the optional last argument ++in @code{define_insn} and @code{define_peephole} patterns. For example, ++it might expand into @code{struct machine_info}; then it would be up ++to you to define this structure in the @file{tm.h} file. ++ ++You do not need to define this macro if you do not write the optional ++last argument in any of the patterns in the machine description. ++ ++@item DEFAULT_MACHINE_INFO ++This macro should expand into a C initializer to use to initialize ++the machine-dependent info for one insn pattern. It is used for patterns ++that do not specify the machine-dependent info. ++ ++If you do not define this macro, zero is used. ++ ++@item CONST_COSTS (@var{x}, @var{code}) ++A part of a C @code{switch} statement that describes the relative ++costs of constant RTL expressions. It must contain @code{case} labels ++for expression codes @code{const_int}, @code{const}, @code{symbol_ref}, @code{label_ref} ++and @code{const_double}. Each case must ultimately reach a ++@code{return} statement to return the relative cost of the use of that ++kind of constant value in an expression. The cost may depend on the ++precise value of the constant, which is available for examination in ++@var{x}. ++ ++@var{code} is the expression code---redundant, since it can be ++obtained with @code{GET_CODE (@var{x})}. ++ ++@item DOLLARS_IN_IDENTIFIERS ++Define this to be nonzero if the character @samp{$} should be allowed ++by default in identifier names. ++@end table ++ ++@node Assembler Format,, Misc, Machine Macros ++@section Output of Assembler Code ++ ++@table @code ++@item ASM_SPEC ++A C string constant that tells the GNU CC driver program options to ++pass to the assembler. It can also specify how to translate options ++you give to GNU CC into options for GNU CC to pass to the assembler. ++See the file @file{tm-sun3.h} for an example of this. ++ ++Do not define this macro if it does not need to do anything. ++ ++@item LINK_SPEC ++A C string constant that tells the GNU CC driver program options to ++pass to the linker. It can also specify how to translate options you ++give to GNU CC into options for GNU CC to pass to the linker. ++ ++Do not define this macro if it does not need to do anything. ++ ++@item LIB_SPEC ++Another C string constant used much like @code{LINK_SPEC}. The difference ++between the two is that @code{LIBS_SPEC} is used at the end of the ++command given to the linker. ++ ++If this macro is not defined, a default is provided that ++loads the standard C library from the usual place. See @file{gcc.c}. ++ ++@item LIBG_SPEC ++Another C string constant used much like @code{LINK_SPEC}. ++This controls whether to link @file{libg.a} when debugging. ++Some systems expect this; others do not have any @file{libg.a}. ++ ++If this macro is not defined, a default is provided that loads the ++@file{libg.a} provided @samp{-g} is specified. See @file{gcc.c}. ++ ++@item STARTFILE_SPEC ++Another C string constant used much like @code{LINK_SPEC}. The ++difference between the two is that @code{STARTFILE_SPEC} is used at ++the very beginning of the command given to the linker. ++ ++If this macro is not defined, a default is provided that loads the ++standard C startup file from the usual place. See @file{gcc.c}. ++ ++@item STANDARD_EXEC_PREFIX ++Define this macro as a C string constant if you wish to override the ++standard choice of @file{/usr/local/lib/gcc-} as the default prefix to ++try when searching for the executable files of the compiler. ++ ++The prefix specified by the @samp{-B} option, if any, is tried before ++the default prefix. After the default prefix, if the executable is ++not found that way, @file{/usr/lib/gcc-} is tried next; then the ++directories in your search path for shell commands are searched. ++ ++@item STANDARD_STARTFILE_PREFIX ++Define this macro as a C string constant if you wish to override the ++standard choice of @file{/usr/local/lib/} as the default prefix to try ++when searching for startup files such as @file{crt0.o}. ++ ++In this search, all the prefixes tried for executable files are tried ++first. Then comes the default startfile prefix specified by this ++macro, followed by the prefixes @file{/lib/} and @file{/usr/lib/} as ++last resorts. ++ ++@item ASM_FILE_START (@var{stream}) ++A C expression which outputs to the stdio stream @var{stream} ++some appropriate text to go at the start of an assembler file. ++ ++Normally this macro is defined to output a line containing ++@samp{#NO_APP}, which is a comment that has no effect on most ++assemblers but tells the GNU assembler that it can save time by not ++checking for certain assembler constructs. ++ ++On systems that use SDB, it is necessary to output certain commands; ++see @file{tm-attasm.h}. ++ ++@item ASM_FILE_END (@var{stream}) ++A C expression which outputs to the stdio stream @var{stream} ++some appropriate text to go at the end of an assembler file. ++ ++If this macro is not defined, the default is to output nothing ++special at the end of the file. Most systems don't require any ++definition. ++ ++On systems that use SDB, it is necessary to output certain commands; ++see @file{tm-attasm.h}. ++ ++@item ASM_IDENTIFY_GCC (@var{file}) ++A C statement to output assembler commands which will identify ++the object file as having been compiled with GNU CC (or another ++GNU compiler). ++ ++If you don't define this macro, the string @samp{gcc_compiled.:} ++is output. This string is calculated to define a symbol which, ++on BSD systems, will never be defined for any other reason. ++GDB checks for the presence of this symbol when reading the ++symbol table of an executable. ++ ++On non-BSD systems, you must arrange communication with GDB in ++some other fashion. If GDB is not used on your system, you can ++define this macro with an empty body. ++ ++@item ASM_APP_ON ++A C string constant for text to be output before each @code{asm} ++statement or group of consecutive ones. Normally this is ++@code{"#APP"}, which is a comment that has no effect on most ++assemblers but tells the GNU assembler that it must check the lines ++that follow for all valid assembler constructs. ++ ++@item ASM_APP_OFF ++A C string constant for text to be output after each @code{asm} ++statement or group of consecutive ones. Normally this is ++@code{"#NO_APP"}, which tells the GNU assembler to resume making the ++time-saving assumptions that are valid for ordinary compiler output. ++ ++@item TEXT_SECTION_ASM_OP ++A C string constant for the assembler operation that should precede ++instructions and read-only data. Normally @code{".text"} is right. ++ ++@item DATA_SECTION_ASM_OP ++A C string constant for the assembler operation to identify the ++following data as writable initialized data. Normally @code{".data"} ++is right. ++ ++@item EXTRA_SECTIONS ++A list of names for sections other than the standard two, which are ++@code{in_text} and @code{in_data}. You need not define this macro ++on a system with no other sections (that GCC needs to use). ++ ++@item EXTRA_SECTION_FUNCTIONS ++One or more functions to be defined in @file{varasm.c}. These ++functions should do jobs analogous to those of @code{text_section} and ++@code{data_section}, for your additional sections. Do not define this ++macro if you do not define @code{EXTRA_SECTIONS}. ++ ++@item SELECT_SECTION (@var{exp}) ++A C statement or statements to switch to the appropriate section for ++output of @var{exp}. You can assume that @var{exp} is either a ++@code{VAR_DECL} node or a constant of some sort. Select the section ++by calling @code{text_section} or one of the alternatives for other ++sections. ++ ++Do not define this macro if you use only the standard two sections ++and put all read-only variables and constants in the text section. ++ ++@item SELECT_RTX_SECTION (@var{mode}, @var{rtx}) ++A C statement or statements to switch to the appropriate section for ++output of @var{rtx} in mode @var{mode}. You can assume that @var{rtx} ++is some kind of constant in RTL. The argument @var{mode} is redundant ++except in the case of a @code{const_int} rtx. Select the section by ++calling @code{text_section} or one of the alternatives for other ++sections. ++ ++Do not define this macro if you use only the standard two sections and ++put all constants in the text section. ++ ++@item REGISTER_NAMES ++A C initializer containing the assembler's names for the machine ++registers, each one as a C string constant. This is what translates ++register numbers in the compiler into assembler language. ++ ++@item DBX_REGISTER_NUMBER (@var{regno}) ++A C expression that returns the DBX register number for the compiler ++register number @var{regno}. In simple cases, the value of this ++expression may be @var{regno} itself. But sometimes there are some ++registers that the compiler knows about and DBX does not, or vice ++versa. In such cases, some register may need to have one number in ++the compiler and another for DBX. ++ ++@item DBX_DEBUGGING_INFO ++Define this macro if GNU CC should produce debugging output for DBX ++in response to the @samp{-g} option. ++ ++@item SDB_DEBUGGING_INFO ++Define this macro if GNU CC should produce debugging output for SDB ++in response to the @samp{-g} option. ++ ++@item PUT_SDB_@var{op} ++Define these macros to override the assembler syntax for the special ++SDB assembler directives. See @file{sdbout.c} for a list of these ++macros and their arguments. If the standard syntax is used, you need ++not define them yourself. ++ ++@item SDB_GENERATE_FAKE ++Define this macro to override the usual method of constructing a dummy ++name for anonymous structure and union types. See @file{sdbout.c} for ++more information. ++ ++@item DBX_NO_XREFS ++Define this macro if DBX on your system does not support the construct ++@samp{xs@var{tagname}}. On some systems, this construct is used to ++describe a forward reference to a structure named @var{tagname}. ++On other systems, this construct is not supported at all. ++ ++@item DBX_CONTIN_LENGTH ++A symbol name in DBX-format debugging information is normally ++continued (split into two separate @code{.stabs} directives) when it ++exceeds a certain length (by default, 80 characters). On some ++operating systems, DBX requires this splitting; on others, splitting ++must not be done. You can inhibit splitting by defining this macro ++with the value zero. You can override the default splitting-length by ++defining this macro as an expression for the length you desire. ++ ++@item DBX_CONTIN_CHAR ++Normally continuation is indicated by adding a @samp{\} character to ++the end of a @code{.stabs} string when a continuation follows. To use ++a different character instead, define this macro as a character ++constant for the character you want to use. Do not define this macro ++if backslash is correct for your system. ++ ++@item DBX_STATIC_STAB_DATA_SECTION ++Define this macro if it is necessary to go to the data section before ++outputting the @samp{.stabs} pseudo-op for a non-global static ++variable. ++ ++@item ASM_OUTPUT_LABEL (@var{stream}, @var{name}) ++A C statement (sans semicolon) to output to the stdio stream ++@var{stream} the assembler definition of a label named @var{name}. ++Use the expression @code{assemble_name (@var{stream}, @var{name})} to ++output the name itself; before and after that, output the additional ++assembler syntax for defining the name, and a newline. ++ ++@item ASM_DECLARE_FUNCTION_NAME (@var{stream}, @var{name}, @var{decl}) ++A C statement (sans semicolon) to output to the stdio stream ++@var{stream} any text necessary for declaring the name @var{name} of a ++function which is being defined. This macro is responsible for ++outputting the label definition (perhaps using ++@code{ASM_OUTPUT_LABEL}). The argument @var{decl} is the ++@code{FUNCTION_DECL} tree node representing the function. ++ ++If this macro is not defined, then the function name is defined in the ++usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}). ++ ++@item ASM_GLOBALIZE_LABEL (@var{stream}, @var{name}) ++A C statement (sans semicolon) to output to the stdio stream ++@var{stream} some commands that will make the label @var{name} global; ++that is, available for reference from other files. Use the expression ++@code{assemble_name (@var{stream}, @var{name})} to output the name ++itself; before and after that, output the additional assembler syntax ++for making that name global, and a newline. ++ ++@item ASM_OUTPUT_EXTERNAL (@var{stream}, @var{decl}, @var{name}) ++A C statement (sans semicolon) to output to the stdio stream ++@var{stream} any text necessary for declaring the name of an external ++symbol named @var{name} which is referenced in this compilation but ++not defined. The value of @var{decl} is the tree node for the ++declaration. ++ ++This macro need not be defined if it does not need to output anything. ++The GNU assembler and most Unix assemblers don't require anything. ++ ++@item ASM_OUTPUT_LABELREF (@var{stream}, @var{name}) ++A C statement to output to the stdio stream @var{stream} a reference ++in assembler syntax to a label named @var{name}. The character ++@samp{_} should be added to the front of the name, if that is ++customary on your operating system, as it is in most Berkeley Unix ++systems. This macro is used in @code{assemble_name}. ++ ++@item ASM_GENERATE_INTERNAL_LABEL (@var{string}, @var{prefix}, @var{num}) ++A C statement to store into the string @var{string} a label whose name ++is made from the string @var{prefix} and the number @var{num}. ++ ++This string, when output subsequently by @code{ASM_OUTPUT_LABELREF}, ++should produce the same output that @code{ASM_OUTPUT_INTERNAL_LABEL} ++would produce with the same @var{prefix} and @var{num}. ++ ++@item ASM_OUTPUT_INTERNAL_LABEL (@var{stream}, @var{prefix}, @var{num}) ++A C statement to output to the stdio stream @var{stream} a label whose ++name is made from the string @var{prefix} and the number @var{num}. ++These labels are used for internal purposes, and there is no reason ++for them to appear in the symbol table of the object file. On many ++systems, the letter @samp{L} at the beginning of a label has this ++effect. The usual definition of this macro is as follows: ++ ++@example ++fprintf (@var{stream}, "L%s%d:\n", @var{prefix}, @var{num}) ++@end example ++ ++@item ASM_OUTPUT_CASE_LABEL (@var{stream}, @var{prefix}, @var{num}, @var{table}) ++Define this if the label before a jump-table needs to be output ++specially. The first three arguments are the same as for ++@code{ASM_OUTPUT_INTERNAL_LABEL}; the fourth argument is the ++jump-table which follows (a @code{jump_insn} containing an ++@code{addr_vec} or @code{addr_diff_vec}). ++ ++This feature is used on system V to output a @code{swbeg} statement ++for the table. ++ ++If this macro is not defined, these labels are output with ++@code{ASM_OUTPUT_INTERNAL_LABEL}. ++ ++@item ASM_OUTPUT_CASE_END (@var{stream}, @var{num}, @var{table}) ++Define this if something special must be output at the end of a ++jump-table. The definition should be a C statement to be executed ++after the assembler code for the table is written. It should write ++the appropriate code to stdio stream @var{stream}. The argument ++@var{table} is the jump-table insn, and @var{num} is the label-number ++of the preceding label. ++ ++If this macro is not defined, nothing special is output at the end of ++the jump-table. ++ ++@item ASM_OUTPUT_ALIGN_CODE (@var{file}) ++A C expression to output text to align the location counter in the way ++that is desirable at a point in the code that is reached only by ++jumping. ++ ++This macro need not be defined if you don't want any special alignment ++to be done at such a time. Most machine descriptions do not currently ++define the macro. ++ ++@item ASM_FORMAT_PRIVATE_NAME (@var{outvar}, @var{name}, @var{number}) ++A C expression to assign to @var{outvar} (which is a variable of type ++@code{char *}) a newly allocated string made from the string ++@var{name} and the number @var{number}, with some suitable punctuation ++added. Use @code{alloca} to get space for the string. ++ ++This string will be used as the argument to @code{ASM_OUTPUT_LABELREF} ++to produce an assembler label for an internal static variable whose ++name is @var{name}. Therefore, the string must be such as to result ++in valid assembler code. The argument @var{number} is different each ++time this macro is executed; it prevents conflicts between ++similarly-named internal static variables in different scopes. ++ ++Ideally this string should not be a valid C identifier, to prevent any ++conflict with the user's own symbols. Most assemblers allow periods ++or percent signs in assembler symbols; putting at least one of these ++between the name and the number will suffice. ++ ++@item ASM_OUTPUT_REG_PUSH (@var{stream}, @var{regno}) ++A C expression to output to @var{stream} some assembler code ++which will push hard register number @var{regno} onto the stack. ++The code need not be optimal, since this macro is used only when ++profiling. ++ ++@item ASM_OUTPUT_REG_POP (@var{stream}, @var{regno}) ++A C expression to output to @var{stream} some assembler code ++which will pop hard register number @var{regno} off of the stack. ++The code need not be optimal, since this macro is used only when ++profiling. ++ ++@item ASM_OUTPUT_ADDR_DIFF_ELT (@var{stream}, @var{value}, @var{rel}) ++This macro should be provided on machines where the addresses ++in a dispatch table are relative to the table's own address. ++ ++The definition should be a C statement to output to the stdio stream ++@var{stream} an assembler pseudo-instruction to generate a difference ++between two labels. @var{value} and @var{rel} are the numbers of two ++internal labels. The definitions of these labels are output using ++@code{ASM_OUTPUT_INTERNAL_LABEL}, and they must be printed in the same ++way here. For example, ++ ++@example ++fprintf (@var{stream}, "\t.word L%d-L%d\n", ++ @var{value}, @var{rel}) ++@end example ++ ++@item ASM_OUTPUT_ADDR_VEC_ELT (@var{stream}, @var{value}) ++This macro should be provided on machines where the addresses ++in a dispatch table are absolute. ++ ++The definition should be a C statement to output to the stdio stream ++@var{stream} an assembler pseudo-instruction to generate a reference to ++a label. @var{value} is the number of an internal label whose ++definition is output using @code{ASM_OUTPUT_INTERNAL_LABEL}. ++For example, ++ ++@example ++fprintf (@var{stream}, "\t.word L%d\n", @var{value}) ++@end example ++ ++@item ASM_OUTPUT_DOUBLE (@var{stream}, @var{value}) ++A C statement to output to the stdio stream @var{stream} an assembler ++instruction to assemble a @code{double} constant whose value is ++@var{value}. @var{value} will be a C expression of type ++@code{double}. ++ ++@item ASM_OUTPUT_FLOAT (@var{stream}, @var{value}) ++A C statement to output to the stdio stream @var{stream} an assembler ++instruction to assemble a @code{float} constant whose value is ++@var{value}. @var{value} will be a C expression of type @code{float}. ++ ++@item ASM_OUTPUT_INT (@var{stream}, @var{exp}) ++@itemx ASM_OUTPUT_SHORT (@var{stream}, @var{exp}) ++@itemx ASM_OUTPUT_CHAR (@var{stream}, @var{exp}) ++A C statement to output to the stdio stream @var{stream} an assembler ++instruction to assemble a @code{int}, @code{short} or @code{char} ++constant whose value is @var{value}. The argument @var{exp} will be an ++RTL expression which represents a constant value. Use ++@samp{output_addr_const (@var{stream}, @var{exp})} to output this value ++as an assembler expression.@refill ++ ++@item ASM_OUTPUT_DOUBLE_INT (@var{stream}, @var{exp}) ++A C statement to output to the stdio stream @var{stream} an assembler ++instruction to assemble a @code{long long} constant whose value is ++@var{exp}. The argument @var{exp} will be an RTL expression which ++represents a constant value. It may be a @code{const_double} RTX, ++or it may be an ordinary single-precision constant. In the latter ++case, you should zero-extend it. ++ ++@item ASM_OUTPUT_BYTE (@var{stream}, @var{value}) ++A C statement to output to the stdio stream @var{stream} an assembler ++instruction to assemble a single byte containing the number @var{value}. ++ ++@item ASM_OUTPUT_ASCII (@var{stream}, @var{ptr}, @var{len}) ++A C statement to output to the stdio stream @var{stream} an assembler ++instruction to assemble a string constant containing the @var{len} ++bytes at @var{ptr}. @var{ptr} will be a C expression of type ++@code{char *} and @var{len} a C expression of type @code{int}. ++ ++If the assembler has a @code{.ascii} pseudo-op as found in the ++Berkeley Unix assembler, do not define the macro ++@code{ASM_OUTPUT_ASCII}. ++ ++@item ASM_OUTPUT_SKIP (@var{stream}, @var{nbytes}) ++A C statement to output to the stdio stream @var{stream} an assembler ++instruction to advance the location counter by @var{nbytes} bytes. ++@var{nbytes} will be a C expression of type @code{int}. ++ ++@item ASM_OUTPUT_ALIGN (@var{stream}, @var{power}) ++A C statement to output to the stdio stream @var{stream} an assembler ++instruction to advance the location counter to a multiple of 2 to the ++@var{power} bytes. @var{power} will be a C expression of type @code{int}. ++ ++@item ASM_OUTPUT_COMMON (@var{stream}, @var{name}, @var{size}, @var{rounded}) ++A C statement (sans semicolon) to output to the stdio stream ++@var{stream} the assembler definition of a common-label named ++@var{name} whose size is @var{size} bytes. The variable @var{rounded} ++is the size rounded up to whatever alignment the caller wants. ++ ++Use the expression @code{assemble_name (@var{stream}, @var{name})} to ++output the name itself; before and after that, output the additional ++assembler syntax for defining the name, and a newline. ++ ++This macro controls how the assembler definitions of uninitialized ++global variables are output. ++ ++@item ASM_OUTPUT_LOCAL (@var{stream}, @var{name}, @var{size}, @var{rounded}) ++A C statement (sans semicolon) to output to the stdio stream ++@var{stream} the assembler definition of a local-common-label named ++@var{name} whose size is @var{size} bytes. The variable @var{rounded} ++is the size rounded up to whatever alignment the caller wants. ++ ++Use the expression @code{assemble_name (@var{stream}, @var{name})} to ++output the name itself; before and after that, output the additional ++assembler syntax for defining the name, and a newline. ++ ++This macro controls how the assembler definitions of uninitialized ++static variables are output. ++ ++@item ASM_OUTPUT_SOURCE_FILENAME (@var{stream}, @var{name}) ++A C statment to output DBX or SDB debugging information which indicates ++that filename @var{name} is the current source file to the stdio stream ++@var{stream}. ++ ++This macro need not be defined if the standard form of debugging ++information for the debugger in use is appropriate. ++ ++@item ASM_OUTPUT_SOURCE_LINE (@var{stream}, @var{line}) ++A C statment to output DBX or SDB debugging information before code ++for line number @var{line} of the current source file to the ++stdio stream @var{stream}. ++ ++This macro need not be defined if the standard form of debugging ++information for the debugger in use is appropriate. ++ ++@item ASM_OUTPUT_IDENT (@var{stream}, @var{string}) ++A C statement to output something to the assembler file to handle a ++@samp{#ident} directive containing the text @var{string}. If this ++macro is not defined, nothing is output for a @samp{#ident} directive. ++ ++@item TARGET_BELL ++A C constant expression for the integer value for escape sequence ++@samp{\a}. ++ ++@item TARGET_BS ++@itemx TARGET_TAB ++@itemx TARGET_NEWLINE ++C constant expressions for the integer values for escape sequences ++@samp{\b}, @samp{\t} and @samp{\n}. ++ ++@item TARGET_VT ++@itemx TARGET_FF ++@itemx TARGET_CR ++C constant expressions for the integer values for escape sequences ++@samp{\v}, @samp{\f} and @samp{\r}. ++ ++@item ASM_OUTPUT_OPCODE (@var{stream}, @var{ptr}) ++Define this macro if you are using an unusual assembler that ++requires different names for the machine instructions. ++ ++The definition is a C statement or statements which output an ++assembler instruction opcode to the stdio stream @var{stream}. The ++macro-operand @var{ptr} is a variable of type @code{char *} which ++points to the opcode name in its ``internal'' form---the form that is ++written in the machine description. The definition should output the ++opcode name to @var{stream}, performing any translation you desire, and ++increment the variable @var{ptr} to point at the end of the opcode ++so that it will not be output twice. ++ ++In fact, your macro definition may process less than the entire opcode ++name, or more than the opcode name; but if you want to process text ++that includes @samp{%}-sequences to substitute operands, you must take ++care of the substitution yourself. Just be sure to increment ++@var{ptr} over whatever text should not be output normally. ++ ++If you need to look at the operand values, they can be found as the ++elements of @code{recog_operand}. ++ ++If the macro definition does nothing, the instruction is output ++in the usual way. ++ ++@item FINAL_PRESCAN_INSN (@var{insn}, @var{opvec}, @var{noperands}) ++If defined, a C statement to be executed just prior to the output of ++assembler code for @var{insn}, to modify the extracted operands so ++they will be output differently. ++ ++Here the argument @var{opvec} is the vector containing the operands ++extracted from @var{insn}, and @var{noperands} is the number of ++elements of the vector which contain meaningful data for this insn. ++The contents of this vector are what will be used to convert the insn ++template into assembler code, so you can change the assembler output ++by changing the contents of the vector. ++ ++This macro is useful when various assembler syntaxes share a single ++file of instruction patterns; by defining this macro differently, you ++can cause a large class of instructions to be output differently (such ++as with rearranged operands). Naturally, variations in assembler ++syntax affecting individual insn patterns ought to be handled by ++writing conditional output routines in those patterns. ++ ++If this macro is not defined, it is equivalent to a null statement. ++ ++@item PRINT_OPERAND (@var{stream}, @var{x}, @var{code}) ++A C compound statement to output to stdio stream @var{stream} the ++assembler syntax for an instruction operand @var{x}. @var{x} is an ++RTL expression. ++ ++@var{code} is a value that can be used to specify one of several ways ++of printing the operand. It is used when identical operands must be ++printed differently depending on the context. @var{code} comes from ++the @samp{%} specification that was used to request printing of the ++operand. If the specification was just @samp{%@var{digit}} then ++@var{code} is 0; if the specification was @samp{%@var{ltr} ++@var{digit}} then @var{code} is the ASCII code for @var{ltr}. ++ ++If @var{x} is a register, this macro should print the register's name. ++The names can be found in an array @code{reg_names} whose type is ++@code{char *[]}. @code{reg_names} is initialized from ++@code{REGISTER_NAMES}. ++ ++When the machine description has a specification @samp{%@var{punct}} ++(a @samp{%} followed by a punctuation character), this macro is called ++with a null pointer for @var{x} and the punctuation character for ++@var{code}. ++ ++@item PRINT_OPERAND_PUNCT_VALID_P (@var{code}) ++A C expression which evaluates to true if @var{code} is a valid ++punctuation character for use in the @code{PRINT_OPERAND} macro. If ++@code{PRINT_OPERAND_PUNCT_VALID_P} is not defined, it means that no ++punctuation characters (except for the standard one, @samp{%}) are used ++in this way. ++ ++@item PRINT_OPERAND_ADDRESS (@var{stream}, @var{x}) ++A C compound statement to output to stdio stream @var{stream} the ++assembler syntax for an instruction operand that is a memory reference ++whose address is @var{x}. @var{x} is an RTL expression. ++ ++@item ASM_OPEN_PAREN ++@itemx ASM_CLOSE_PAREN ++These macros are defined as C string constant, describing the syntax ++in the assembler for grouping arithmetic expressions. The following ++definitions are correct for most assemblers: ++ ++@example ++#define ASM_OPEN_PAREN "(" ++#define ASM_CLOSE_PAREN ")" ++@end example ++@end table ++ ++@node Config,, Machine Macros, Top ++@chapter The Configuration File ++ ++The configuration file @file{xm-@var{machine}.h} contains macro definitions ++that describe the machine and system on which the compiler is running. ++Most of the values in it are actually the same on all machines that GNU CC ++runs on, so large parts of all configuration files are identical. But ++there are some macros that vary: ++ ++@table @code ++@item FAILURE_EXIT_CODE ++A C expression for the status code to be returned when the compiler ++exits after serious errors. ++ ++@item SUCCESS_EXIT_CODE ++A C expression for the status code to be returned when the compiler ++exits without serious errors. ++ ++@item USE_C_ALLOCA ++Define this macro to indicate that the compiler is running with the ++@code{alloca} implemented in C. This version of @code{alloca} can be ++found in the file @file{alloca.c}; to use it, you must also alter the ++@file{Makefile} variable @code{ALLOCA}. ++ ++This macro, unlike most, describes the machine that the compiler is ++running on, rather than the one the compiler is compiling for. ++Therefore, it should be set in the @file{xm-@var{machine}.h} file ++rather than in the @file{tm-@var{machine}.h} file. ++ ++If you do define this macro, you should probably do it as follows: ++ ++@example ++#ifndef __GNUC__ ++#define USE_C_ALLOCA ++#else ++#define alloca __builtin_alloca ++#endif ++@end example ++ ++@noindent ++so that when the compiler is compiled with GNU CC it uses the more ++efficient built-in @code{alloca} function. ++@end table ++ ++In addition, configuration files for system V define @code{bcopy}, ++@code{bzero} and @code{bcmp} as aliases. Some files define @code{alloca} ++as a macro when compiled with GNU CC, in order to take advantage of the ++benefit of GNU CC's built-in @code{alloca}. ++ ++@contents ++@bye +diff -Naur alliance-5.0/genview/src/gcc-1.42/gcc.toc alliance/genview/src/gcc-1.42/gcc.toc +--- alliance-5.0/genview/src/gcc-1.42/gcc.toc 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gcc.toc 2002-04-11 09:14:45.000000000 +0200 +@@ -0,0 +1,96 @@ ++\unnumbchapentry {GNU GENERAL PUBLIC LICENSE}{1} ++\unnumbsecentry{Preamble}{1} ++\unnumbsecentry{TERMS AND CONDITIONS}{2} ++\unnumbsecentry{Appendix: How to Apply These Terms to Your New Programs}{5} ++\unnumbchapentry {Contributors to GNU CC}{7} ++\chapentry {Protect Your Freedom---Fight ``Look And Feel''}{1}{9} ++\chapentry {GNU CC Command Options}{2}{13} ++\chapentry {Installing GNU CC}{3}{27} ++\secentry {Compilation in a Separate Directory}{3}{1}{35} ++\secentry {Installing GNU CC on the Sun}{3}{2}{35} ++\secentry {Installing GNU CC on the 3b1}{3}{3}{36} ++\secentry {Installing GNU CC on SCO System V 3.2}{3}{4}{37} ++\secentry {Installing GNU CC on VMS}{3}{5}{37} ++\secentry {Installing GNU CC on HPUX}{3}{6}{40} ++\secentry {Installing GNU CC on an NCR Tower}{3}{7}{41} ++\chapentry {Known Causes of Trouble with GNU CC}{4}{43} ++\chapentry {How To Get Help with GNU CC}{5}{45} ++\chapentry {Incompatibilities of GNU CC}{6}{47} ++\chapentry {GNU Extensions to the C Language}{7}{51} ++\secentry {Statements and Declarations inside of Expressions}{7}{1}{51} ++\secentry {Naming an Expression's Type}{7}{2}{52} ++\secentry {Referring to a Type with \code {typeof}}{7}{3}{52} ++\secentry {Generalized Lvalues}{7}{4}{53} ++\secentry {Conditional Expressions with Omitted Middle-Operands}{7}{5}{55} ++\secentry {Arrays of Length Zero}{7}{6}{55} ++\secentry {Arrays of Variable Length}{7}{7}{56} ++\secentry {Non-Lvalue Arrays May Have Subscripts}{7}{8}{57} ++\secentry {Arithmetic on \code {void}-Pointers and Function Pointers}{7}{9}{57} ++\secentry {Non-Constant Initializers}{7}{10}{57} ++\secentry {Constructor Expressions}{7}{11}{58} ++\secentry {Declaring Attributes of Functions}{7}{12}{58} ++\secentry {Dollar Signs in Identifier Names}{7}{13}{59} ++\secentry {Inquiring about the Alignment of a Type or Variable}{7}{14}{60} ++\secentry {An Inline Function is As Fast As a Macro}{7}{15}{60} ++\secentry {Assembler Instructions with C Expression Operands}{7}{16}{62} ++\secentry {Controlling Names Used in Assembler Code}{7}{17}{65} ++\secentry {Variables in Specified Registers}{7}{18}{66} ++\subsecentry {Defining Global Register Variables}{7}{18}{1}{66} ++\subsecentry {Specifying Registers for Local Variables}{7}{18}{2}{68} ++\secentry {Alternate Keywords}{7}{19}{69} ++\chapentry {Reporting Bugs}{8}{71} ++\secentry {Have You Found a Bug?}{8}{1}{71} ++\secentry {How to Report Bugs}{8}{2}{72} ++\chapentry {GNU CC and Portability}{9}{77} ++\chapentry {Interfacing to GNU CC Output}{10}{79} ++\chapentry {Passes and Files of the Compiler}{11}{81} ++\chapentry {RTL Representation}{12}{87} ++\secentry {RTL Object Types}{12}{1}{87} ++\secentry {Access to Operands}{12}{2}{88} ++\secentry {Flags in an RTL Expression}{12}{3}{90} ++\secentry {Machine Modes}{12}{4}{92} ++\secentry {Constant Expression Types}{12}{5}{94} ++\secentry {Registers and Memory}{12}{6}{96} ++\secentry {RTL Expressions for Arithmetic}{12}{7}{98} ++\secentry {Comparison Operations}{12}{8}{100} ++\secentry {Bit-fields}{12}{9}{102} ++\secentry {Conversions}{12}{10}{102} ++\secentry {Declarations}{12}{11}{103} ++\secentry {Side Effect Expressions}{12}{12}{104} ++\secentry {Embedded Side-Effects on Addresses}{12}{13}{107} ++\secentry {Assembler Instructions as Expressions}{12}{14}{108} ++\secentry {Insns}{12}{15}{109} ++\secentry {RTL Representation of Function-Call Insns}{12}{16}{113} ++\secentry {Structure Sharing Assumptions}{12}{17}{114} ++\chapentry {Machine Descriptions}{13}{117} ++\secentry {Everything about Instruction Patterns}{13}{1}{117} ++\secentry {Example of \code {define{@fam @ttfam @tentt \char'137}insn}}{13}{2}{118} ++\secentry {RTL Template for Generating and Recognizing Insns}{13}{3}{119} ++\secentry {Output Templates and Operand Substitution}{13}{4}{122} ++\secentry {C Statements for Generating Assembler Output}{13}{5}{123} ++\secentry {Operand Constraints}{13}{6}{124} ++\subsecentry {Simple Constraints}{13}{6}{1}{124} ++\subsecentry {Multiple Alternative Constraints}{13}{6}{2}{128} ++\subsecentry {Register Class Preferences}{13}{6}{3}{129} ++\subsecentry {Constraint Modifier Characters}{13}{6}{4}{130} ++\subsecentry {Not Using Constraints}{13}{6}{5}{131} ++\secentry {Standard Names for Patterns Used in Generation}{13}{7}{131} ++\secentry {When the Order of Patterns Matters}{13}{8}{137} ++\secentry {Interdependence of Patterns}{13}{9}{137} ++\secentry {Defining Jump Instruction Patterns}{13}{10}{140} ++\secentry {Defining Machine-Specific Peephole Optimizers}{13}{11}{141} ++\secentry {Defining RTL Sequences for Code Generation}{13}{12}{144} ++\chapentry {Machine Description Macros}{14}{149} ++\secentry {Run-time Target Specification}{14}{1}{149} ++\secentry {Storage Layout}{14}{2}{150} ++\secentry {Register Usage}{14}{3}{152} ++\secentry {Register Classes}{14}{4}{157} ++\secentry {Describing Stack Layout}{14}{5}{161} ++\secentry {Implicit Use of Library Routines}{14}{6}{169} ++\secentry {Addressing Modes}{14}{7}{170} ++\secentry {Parameters for Delayed Branch Optimization}{14}{8}{172} ++\secentry {Condition Code Information}{14}{9}{173} ++\secentry {Cross Compilation and Floating-Point Format}{14}{10}{174} ++\secentry {Miscellaneous Parameters}{14}{11}{176} ++\secentry {Output of Assembler Code}{14}{12}{179} ++\chapentry {The Configuration File}{15}{191} +diff -Naur alliance-5.0/genview/src/gcc-1.42/gdbfiles.h alliance/genview/src/gcc-1.42/gdbfiles.h +--- alliance-5.0/genview/src/gcc-1.42/gdbfiles.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gdbfiles.h 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,38 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++ ++/* Alist matching source file names to GDB filenumbers. ++ Used in output_source_line. */ ++ ++struct gdbfile ++{ ++ struct gdbfile *next; ++ char *name; /* name of source file */ ++ int filenum; /* Assigned number */ ++ int nlines; /* # lines generated for this source file */ ++}; ++ ++/* Chain of all `struct gdbfile's. */ ++ ++extern struct gdbfile *gdbfiles; +diff -Naur alliance-5.0/genview/src/gcc-1.42/gencodes alliance/genview/src/gcc-1.42/gencodes +--- alliance-5.0/genview/src/gcc-1.42/gencodes 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gencodes 2002-04-11 09:14:49.000000000 +0200 +@@ -0,0 +1,48 @@ ++ELF4Z4 (444 / / /  `T 5 /lib/ld-linux.so.2GNU" !  ++ Y/,G<"L/6\l)e|S'  ++Lpr "(lT@̇ТH .܇"!.p = ",'<]L \$l |__gmon_start__libc.so.6strcpyprintfstdoutungetcperror__cxa_finalizemalloc_obstack_newchunkfflushabort_obstack_beginfprintf__deregister_frame_infoferrorrealloc_IO_getc_obstack_allocated_pftellstrcmp_obstackstderrobstack_free_obstack_freeexitfopenatoi_IO_putc_IO_stdin_used__libc_start_mainstrlen__register_frame_infofreeGLIBC_2.1GLIBC_2.1.3GLIBC_2.0ii bsi lii x    ++ !UK5x%|%h%h%h%h%h %h(%h0%h8p%h@`%hHP%hP@%hX0%h` %hh%hp%hx%h%h%h%h%h%h%h1^PTRhhQVh+USP[ö<htЋ]ÉU,uI(tt&B(( ++u긬t h`,]ÍvU]ÍU<thh`]Ð&U]ÍU Ep(t5Eph@6ÐU uE}u hUDEUu uE}u hU EÍvUhn5uu u5hy5 j!U h{U hLh̉jj502 } h\hE 0dE}u E 0F j!w h h# h; u E}ucvuu u EEf8t Ef8 ++t uEf8u뇍v hM h h 5^ 5t E! ++vEuUS$0EEEEEUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEUEEE;E|UEDEډE]ÉUS$Ek0EEEUUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEEUEfE]ÍvUS$UEMM}w]E' uEUBMA]CƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUkEEvMk];|-EEE}Et[}etkUkEMD]DkEU| kEMt}kE]TkUkEMD]DkEU| kEMD0kE]TEkEUDM;rN kE]TkEtkE]TkELEkEkUMT ++]TEE]U=Dt2A)Ph5PD}u%h5*DUk@4h5MAth5UBth5MAth5yUBth5PMythEf8t Uf:t,MAkl4h5 *UBk4h5MkEEUkM; |U0EE}EMvkEU|uh"5[#kEMth&56D=Duh.5 kEUtg-H=Dt2A)Ph5Dh05kEM|tikEUD8t ++DEkEMDU;r$ kEMTkEtEɐ-=Dt(A)Ph5h35D-kEUth65DkEM|2kEUDkH4h:5G#kEMth65"DvkEU|t&kEMDph65h>5D&UBPh`5Eh5yDÉU uh57ÉUEDE ffEf}wGf} r@E E}u> uah5E@ Eɐ u 1U}xu uh5u Ph5gh5QEv}~9 u-E}u5uE뽐h!55U uEEuv} tڃ} ++tԃ} t΃} tȃ};u" uEEt} ++u렃}/un ukE}*tuuj*E u9EEuKv}*u}/u7vEEċEÍvU u EEEv} tk} ++te} t_} tY}:tB})t<}]t6}"t0}/t*}(t$}[tEUE u E렃u u2E;Eu(h,5Tu jjUÍvUSd u;(tuj(JuPEDžZ~=k@4Pu E ++븃}uPh`5h}u7v uQt )uٸZv u)k u :usuPDž~5Pk4ru vPvuDžk; |v0E ukL u[tuj[DžDž u]uu uAuQkt  DžD ODž9|%kLkCD ++뱐 uu)ukDDž u(uDž u"tuj"DžDž ++ @Pv9|/@P} u<\uW u<;u:hPt<"u @Pt3 u)tuj) kLuP PLkD ++PCPh5JuY Phح5#kv u)tuj),]UVSE}Z~n?@ABCDE F$G;HTIiNQRST9UUVmX[^ehl q r5 uP vm y z } ++& ++@ ++˔t ++F ++ ++ #V Y 4u < C F S Z ^ltMyn4 ++Lb8wbKL#5LwH8KgLUZ^?awb\r5 7!899S:m dinit.c/usr/src/build/45423-i386/BUILD/glibc-2.2.4/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/45423-i386/BUILD/glibc-2.2.4/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note# 1((7  ?GoDTo@c $$l ,,u << ~  p$  $   /@ ``5dd5ll5tt5l566 6 $>WWYY_F hc($, < ++     `dlt   +2  =(AlO,[ q`@ P  0d2   h `p`     T D#, 6> Ml W  a$ỉ4 qp|YT" ,<"L/p8h  \l),|>` G; PpZ' lslp ++ p "T$6 .<S 4l? FpQ0]̇ol(}9 x  ТH  H$܇"<    ++."p+ 8 "T@l]m,'} p<tLt  \ $[ ! .lB Q|initfini.cgcc2_compiled.call_gmon_startinit.ccrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__gencodes.crtl.csawcloseindent.0print_rtxoutfiledump_and_abortread_nameobstack.cobstackxmallocrtx_lengthferror@@GLIBC_2.0rtvec_allocungetc@@GLIBC_2.0_DYNAMIC__register_frame_info@@GLIBC_2.0strcmp@@GLIBC_2.0mode_unit_sizeread_rtx_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0fflush@@GLIBC_2.0copy_rtxgen_insnmode_size_obstack_newchunkspacesmode_wider_modeftell@@GLIBC_2.0_initmalloc@@GLIBC_2.0_obstack_begin__deregister_frame_info@@GLIBC_2.0insn_code_numberstdout@@GLIBC_2.0stderr@@GLIBC_2.0abort@@GLIBC_2.0debug_rtxfatalrtx_format_startmode_classrtl_obstackstrlen@@GLIBC_2.0reg_note_namexreallocrtx_alloc_obstack_allocated_p__bss_startmainnote_insn_name__libc_start_main@@GLIBC_2.0realloc@@GLIBC_2.0print_rtldata_startprintf@@GLIBC_2.0_fini_obstackobstack_free__cxa_finalize@@GLIBC_2.1.3rtx_nameexit@@GLIBC_2.0atoi@@GLIBC_2.0read_skip_spaces_edatamode_name_IO_putc@@GLIBC_2.0_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endfancy_abort_obstack_freefopen@@GLIBC_2.1_IO_stdin_usedinit_rtl__data_start_IO_getc@@GLIBC_2.0__gmon_start__strcpy@@GLIBC_2.0 +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/gencodes.c alliance/genview/src/gcc-1.42/gencodes.c +--- alliance-5.0/genview/src/gcc-1.42/gencodes.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gencodes.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,177 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Generate from machine description: ++ ++ - some macros CODE_FOR_... giving the insn_code_number value ++ for each of the defined standard insn names. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "obstack.h" ++ ++struct obstack obstack; ++struct obstack *rtl_obstack = &obstack; ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++void fatal (); ++void fancy_abort (); ++ ++int insn_code_number; ++ ++void ++gen_insn (insn) ++ rtx insn; ++{ ++ /* Don't mention instructions whose names are the null string. ++ They are in the machine description just to be recognized. */ ++ if (strlen (XSTR (insn, 0)) != 0) ++ printf (" CODE_FOR_%s = %d,\n", XSTR (insn, 0), ++ insn_code_number); ++} ++ ++int ++xmalloc (size) ++{ ++ register int val = malloc (size); ++ ++ if (val == 0) ++ fatal ("virtual memory exhausted"); ++ return val; ++} ++ ++int ++xrealloc (ptr, size) ++ char *ptr; ++ int size; ++{ ++ int result = realloc (ptr, size); ++ if (!result) ++ fatal ("virtual memory exhausted"); ++ return result; ++} ++ ++void ++fatal (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "gencodes: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++ exit (FATAL_EXIT_CODE); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ rtx desc; ++ FILE *infile; ++ extern rtx read_rtx (); ++ register int c; ++ ++ obstack_init (rtl_obstack); ++ ++ if (argc <= 1) ++ fatal ("No input file name."); ++ ++ infile = fopen (argv[1], "r"); ++ if (infile == 0) ++ { ++ perror (argv[1]); ++ exit (FATAL_EXIT_CODE); ++ } ++ ++ init_rtl (); ++ ++ printf ("/* Generated automatically by the program `gencodes'\n\ ++from the machine description file `md'. */\n\n"); ++ ++ printf ("#ifndef MAX_INSN_CODE\n\n"); ++ ++ /* Read the machine description. */ ++ ++ insn_code_number = 0; ++ printf ("enum insn_code {\n"); ++ ++ while (1) ++ { ++ c = read_skip_spaces (infile); ++ if (c == EOF) ++ break; ++ ungetc (c, infile); ++ ++ desc = read_rtx (infile); ++ if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND) ++ { ++ gen_insn (desc); ++ insn_code_number++; ++ } ++ if (GET_CODE (desc) == DEFINE_PEEPHOLE) ++ { ++ insn_code_number++; ++ } ++ } ++ ++ printf (" CODE_FOR_nothing };\n"); ++ ++ printf ("\n#define MAX_INSN_CODE ((int) CODE_FOR_nothing)\n"); ++ ++ printf ("#endif /* MAX_INSN_CODE */\n"); ++ ++ fflush (stdout); ++ exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/genconfig alliance/genview/src/gcc-1.42/genconfig +--- alliance-5.0/genview/src/gcc-1.42/genconfig 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genconfig 2002-04-11 09:14:49.000000000 +0200 +@@ -0,0 +1,48 @@ ++ELF4 ^4 (444@2@2@2@@`T 9 /lib/ld-linux.so.2GNU" !  ++ Y/,G<"L/6\l)e|S|'  ++LprУ "(lT@̇H .܇"!. = ",'<]Lt \l |__gmon_start__libc.so.6strcpyprintfstdoutungetcperror__cxa_finalizemalloc_obstack_newchunkfflushabort_obstack_beginfprintf__deregister_frame_infoferrorrealloc_IO_getc_obstack_allocated_pftellstrcmp_obstackstderrobstack_free_obstack_freeexitfopenatoi_IO_putc_IO_stdin_used__libc_start_mainstrlen__register_frame_infofreeGLIBC_2.1GLIBC_2.1.3GLIBC_2.0ii bsi lii x    ++ !UK5%%h%h%h%h%h %h(%h0%h8p%h@`%hHP%hP@%hX0%h` %hh%hp%hx%h%h%h%h%h%h%h1^PTRhЦhQVhl+USP[?htЋ]ÉULuIHtt&BHH ++u긬t hL]ÍvU]ÍU<thh]Ð&U]ÍU}uvEE}$U E@;~ E@Ex FE@ 87(E@;~JE@=E@f8*E@;E@EkEEEk M; |EEE}et}e }Et#q}uth UkEtPUkE|tBEvEkUDU;r$ UkETkEtaEɐELÉUExt=EEPE;r% EPEtE̡; ~ ++ ;~ ++UExtaEEPE;rI EPEtp; ~ ++ E뫍vÉUEEPE;r% EPEtEÉU uE}u hDEUu uE}u h EÍvUhͧ5Suu u5<h٧5& j!U hۧU hLhjj5PB } h\hE 0E}u E 0 j!5 h v uQ E}usvuu u EEf8u uEf8 ++u uiEf8u uvPhZ=u ++5h1=t hި 5 5t E!EuUS$PEEEEEUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEUEEE;E|UEDEډE]ÉUS$E kPEEEUUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEEUEfE]ÍvUS$UEMM}w]E' uEUBMA]CƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUkEEvMk ];|-EEE}Et[}etkUkEMD]DkEU| kEMt}kE]TkUkEMD]DkEU| kEMD0kE]TEkEUDM;rN kE]TkEtkE]TkELEkEkUMT ++]TEE]U=dt2a)Ph$5|d}u%h(5VdUk`4h.5 MAth25UBth55MAth85UBth;5|MythEf8t Uf:t,MAk4h>57*UBk4h>5 MkEEUk M; |U0EE}EMvkEU|uhB5#kEMthF5bd=duhN5- kEUtg-H=dt2a)Ph$5dhP5kEM|tikEUD8t ++dEkEMDU;r$ kEMTkEtEɐ-=dt(a)Ph$5 hS5d-kEUthV5dkEM|2kEUDkh4hZ5s#kEMthV5NdvkEU|t&kEMDphV5 h^5d&UBPh5Eh5dÉU uhد5cÉUEdE ffEf}wGf} r@E E}u> uahد5E@ Eɐ u 1U}xu uh5u Ph 5h%5}Ev}~9 uYE}u5uE뽐hA5aU uEEuv} tڃ} ++tԃ} t΃} tȃ};u" uEEt} ++u렃}/un uE}*tuuj*E ueEEuKv}*u}/u7vEEċEÍvU u EEEv} tk} ++te} t_} tY}:tB})t<}]t6}"t0}/t*}(t$}[tEUE u E렃u u^E;Eu(hL5u jjUÍvUSd u;(tuj(JuPEDžZ~=k`4Pu E ++븃}uPh5}u7v u}t )uٸZv u)k u :usuPDž~5Pk4u vPvuCDžk ; |v0E ukL u[tuj[DžDž u]uu+ uAuQkt  DžD ODž9|%kLkCD ++뱐 uu)ukDDž u(uDž u"tuj"DžDž ++ @P|v9|/@Pm u<\uW u<;u:hP<"u @Pt3 u)tuj) kLuP PxkD ++PCPh5vu Ph5Ov u)tuj),]UVSE}Z~n?@ABCDE F$G;HTIiNQRST9UUVmX[^ehl q r5 uP vm y z } ++& ++@ ++˔t ++F ++ ++ #V Y 4u < C F S Z ^ltMyn4 ++Lb8wbKL#5LwH8KgLUZ^?awb\r5 7!899S:m dinit.c/usr/src/build/45423-i386/BUILD/glibc-2.2.4/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/45423-i386/BUILD/glibc-2.2.4/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note# 1((7  ?GoDTo@c $$l ,,u << ~  @Ц&'@ @@2@ 8888l999 9 DAZw\]b` F Dl($, < ++   Ц@   +2  =HAOL[ q@ P  P2     Ц    ( d$- 7? N@ X У b$j4 r p}Y(" ,<"L/p& h /6\Hl)[|m\` vD p|' p ++ pУ  "(:LT]ؘ6 gS mlx <pṖ(Č9 L   H l h$ ܇*F"YHF f p@ {.Ц  "ԋr `l,'\ ";BpL<`vLT t \t[ @l |initfini.cgcc2_compiled.call_gmon_startinit.ccrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__genconfig.crtl.csawcloseindent.0print_rtxoutfiledump_and_abortread_nameobstack.cobstackxmallocrtx_lengthmax_dup_operands_flagferror@@GLIBC_2.0rtvec_allocungetc@@GLIBC_2.0_DYNAMICmax_recog_operands_flag__register_frame_info@@GLIBC_2.0strcmp@@GLIBC_2.0mode_unit_sizeread_rtx_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0fflush@@GLIBC_2.0copy_rtxgen_insnmode_size_obstack_newchunkspacesmode_wider_modeftell@@GLIBC_2.0_initmalloc@@GLIBC_2.0_obstack_beginmax_clobbers_per_insn_flag__deregister_frame_info@@GLIBC_2.0stdout@@GLIBC_2.0stderr@@GLIBC_2.0abort@@GLIBC_2.0debug_rtxfatalrtx_format_startmode_classrtl_obstackstrlen@@GLIBC_2.0reg_note_namexreallocrtx_allocwalk_insn_part_obstack_allocated_p__bss_startmainnote_insn_name__libc_start_main@@GLIBC_2.0dup_operands_seen_this_insnrealloc@@GLIBC_2.0gen_peepholeprint_rtldata_startprintf@@GLIBC_2.0_fini_obstackclobbers_seen_this_insnobstack_free__cxa_finalize@@GLIBC_2.1.3gen_expandrtx_nameexit@@GLIBC_2.0atoi@@GLIBC_2.0read_skip_spacesregister_constraint_flag_edatamode_name_IO_putc@@GLIBC_2.0_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endfancy_abort_obstack_freefopen@@GLIBC_2.1_IO_stdin_usedinit_rtl__data_start_IO_getc@@GLIBC_2.0__gmon_start__strcpy@@GLIBC_2.0 +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/genconfig.c alliance/genview/src/gcc-1.42/genconfig.c +--- alliance-5.0/genview/src/gcc-1.42/genconfig.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genconfig.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,290 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Generate from machine description: ++ ++ - some #define configuration flags. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "obstack.h" ++ ++struct obstack obstack; ++struct obstack *rtl_obstack = &obstack; ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++/* flags to determine output of machine description dependent #define's. */ ++int max_recog_operands_flag; ++int max_dup_operands_flag; ++int max_clobbers_per_insn_flag; ++int register_constraint_flag; ++ ++int clobbers_seen_this_insn; ++int dup_operands_seen_this_insn; ++ ++void fatal (); ++void fancy_abort (); ++ ++void ++walk_insn_part (part) ++ rtx part; ++{ ++ register int i, j; ++ register RTX_CODE code; ++ register char *format_ptr; ++ ++ if (part == 0) ++ return; ++ ++ code = GET_CODE (part); ++ switch (code) ++ { ++ case CLOBBER: ++ clobbers_seen_this_insn++; ++ break; ++ ++ case MATCH_OPERAND: ++ if (XINT (part, 0) > max_recog_operands_flag) ++ max_recog_operands_flag = XINT (part, 0); ++ if (XSTR (part, 2) && *XSTR (part, 2)) ++ register_constraint_flag = 1; ++ return; ++ ++ case MATCH_OPERATOR: ++ if (XINT (part, 0) > max_recog_operands_flag) ++ max_recog_operands_flag = XINT (part, 0); ++ /* Now scan the rtl'x in the vector inside the match_operator. */ ++ break; ++ ++ case LABEL_REF: ++ if (GET_CODE (XEXP (part, 0)) == MATCH_OPERAND) ++ break; ++ return; ++ ++ case MATCH_DUP: ++ ++dup_operands_seen_this_insn; ++ if (XINT (part, 0) > max_recog_operands_flag) ++ max_recog_operands_flag = XINT (part, 0); ++ ++ case REG: case CONST_INT: case SYMBOL_REF: ++ case PC: case CC0: ++ return; ++ } ++ ++ format_ptr = GET_RTX_FORMAT (GET_CODE (part)); ++ ++ for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++) ++ switch (*format_ptr++) ++ { ++ case 'e': ++ case 'u': ++ walk_insn_part (XEXP (part, i)); ++ break; ++ case 'E': ++ if (XVEC (part, i) != NULL) ++ for (j = 0; j < XVECLEN (part, i); j++) ++ walk_insn_part (XVECEXP (part, i, j)); ++ break; ++ } ++} ++ ++void ++gen_insn (insn) ++ rtx insn; ++{ ++ int i; ++ ++ /* Walk the insn pattern to gather the #define's status. */ ++ clobbers_seen_this_insn = 0; ++ dup_operands_seen_this_insn = 0; ++ if (XVEC (insn, 1) != 0) ++ for (i = 0; i < XVECLEN (insn, 1); i++) ++ walk_insn_part (XVECEXP (insn, 1, i)); ++ ++ if (clobbers_seen_this_insn > max_clobbers_per_insn_flag) ++ max_clobbers_per_insn_flag = clobbers_seen_this_insn; ++ if (dup_operands_seen_this_insn > max_dup_operands_flag) ++ max_dup_operands_flag = dup_operands_seen_this_insn; ++} ++ ++/* Similar but scan a define_expand. */ ++ ++void ++gen_expand (insn) ++ rtx insn; ++{ ++ int i; ++ ++ /* Walk the insn pattern to gather the #define's status. */ ++ ++ /* Note that we don't bother recording the number of MATCH_DUPs ++ that occur in a gen_expand, because only reload cares about that. */ ++ if (XVEC (insn, 1) != 0) ++ for (i = 0; i < XVECLEN (insn, 1); i++) ++ { ++ /* Compute the maximum SETs and CLOBBERS ++ in any one of the sub-insns; ++ don't sum across all of them. */ ++ clobbers_seen_this_insn = 0; ++ ++ walk_insn_part (XVECEXP (insn, 1, i)); ++ ++ if (clobbers_seen_this_insn > max_clobbers_per_insn_flag) ++ max_clobbers_per_insn_flag = clobbers_seen_this_insn; ++ } ++} ++ ++void ++gen_peephole (peep) ++ rtx peep; ++{ ++ int i; ++ ++ /* Look through the patterns that are matched ++ to compute the maximum operand number. */ ++ for (i = 0; i < XVECLEN (peep, 0); i++) ++ walk_insn_part (XVECEXP (peep, 0, i)); ++} ++ ++int ++xmalloc (size) ++{ ++ register int val = malloc (size); ++ ++ if (val == 0) ++ fatal ("virtual memory exhausted"); ++ ++ return val; ++} ++ ++int ++xrealloc (ptr, size) ++ char *ptr; ++ int size; ++{ ++ int result = realloc (ptr, size); ++ if (!result) ++ fatal ("virtual memory exhausted"); ++ return result; ++} ++ ++void ++fatal (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "genconfig: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++ exit (FATAL_EXIT_CODE); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ rtx desc; ++ FILE *infile; ++ extern rtx read_rtx (); ++ register int c; ++ ++ obstack_init (rtl_obstack); ++ ++ if (argc <= 1) ++ fatal ("No input file name."); ++ ++ infile = fopen (argv[1], "r"); ++ if (infile == 0) ++ { ++ perror (argv[1]); ++ exit (FATAL_EXIT_CODE); ++ } ++ ++ init_rtl (); ++ ++ printf ("/* Generated automatically by the program `genconfig'\n\ ++from the machine description file `md'. */\n\n"); ++ ++ /* Read the machine description. */ ++ ++ while (1) ++ { ++ c = read_skip_spaces (infile); ++ if (c == EOF) ++ break; ++ ungetc (c, infile); ++ ++ desc = read_rtx (infile); ++ if (GET_CODE (desc) == DEFINE_INSN) ++ gen_insn (desc); ++ if (GET_CODE (desc) == DEFINE_EXPAND) ++ gen_expand (desc); ++ if (GET_CODE (desc) == DEFINE_PEEPHOLE) ++ gen_peephole (desc); ++ } ++ ++ /* 3 more than needed for this md file, for the sake of asm constructs. */ ++ printf ("\n#define MAX_RECOG_OPERANDS %d\n", max_recog_operands_flag + 4); ++ ++ if (max_dup_operands_flag == 0) ++ max_dup_operands_flag = 1; ++ printf ("\n#define MAX_DUP_OPERANDS %d\n", max_dup_operands_flag); ++ ++ if (register_constraint_flag) ++ printf ("#define REGISTER_CONSTRAINTS\n"); ++ ++ fflush (stdout); ++ exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/genemit alliance/genview/src/gcc-1.42/genemit +--- alliance-5.0/genview/src/gcc-1.42/genemit 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genemit 2002-04-11 09:14:49.000000000 +0200 +@@ -0,0 +1,83 @@ ++ELF4k4 (444???dt dFdd /lib/ld-linux.so.2GNU# "! ++   @Y7PO`"p/>)m[̭'  ++TЇpz  "0 $tTHH 6 ")0.< E@"P`'peį 'D "__gmon_start__libc.so.6putcharstrcpyprintfstdoutungetcperror__cxa_finalizemalloc_obstack_newchunkfflushabort_obstack_beginfprintf__deregister_frame_infoferrorrealloc_IO_getc_obstack_allocated_pftellstrcmp_obstackstderrobstack_free_obstack_freeexitfopenatoi_IO_putc_IO_stdin_used__libc_start_mainstrlen__register_frame_infofreeGLIBC_2.1GLIBC_2.1.3GLIBC_2.0ii jsi tii `! $   ++$ ( ,048<@DHLPTX \"UW(5%%h%h%h% h%h %h(%h0%h8p% h@`%$hHP%(hP@%,hX0%0h` %4hh%8hp%<hx%@h%Dh%Hh%Lh%Ph%Th%Xh%\hp1^PTRh hQVhT/USP[MltЋ]ÉUuItt&B ++ut h]ÍvU]ÍU`th(h]Ð&U]ÍU}uKvEE}uEx t ++}t}t%E@EE;}EU}u%E@EE;}EUkU\EkUEEvE9E|vUE<etUE<ut UkEtTUE<EuHEUkETE;r, UkETEtEÍvE`ÉUUE DEEvE9E|* UE TkEt=E͐@ÉUEEE8uBU:`~ E8z U P UPE뵐ÉU}u h`;vEEEE}$<U0EphbEphlE@k,4hEE@ U;r hf hO EP kEtE뮉 h hڰ;v h#vExu hExu h h uE@k,4hokU\EkUEEvE9E|[vUE<0uGv h UE<etUE<ut UkEtUE<iu UkEth UE<su UkEthUE<EEkUD0hVEUkETE;r h-D h UkETEtE룍vvE hÉU Epuju}E;E| h&EphXEE;E|2u}t E ++vEbuEŐ h'EU;U|uh*E܃ h?E@8u9 hB E@pp hLsvE@0h`kEE@U;r1 hC EPkEtE‰ hÉU Epu hExuEph{juEEphEE;E|2u}t E ++vEbuQEŐ h';EU;U|uh*E܃ h?EEU;~vuhE؃@EU;U}EEuh h  hExEU;U|uuh/MEِEphL1ExtaEE;E|uuhPEِvU;~vuuhPEՐEE@U;rEPkEDEEf8u E@f8!t6Ef8u!E@@f8uE@@@f8!t Ef8t hm?vEf8u E@f8tOEf8tFEf8u!E@@f8uE@@@f8tEf8u'E@@f8t hjEf8u hMEf8tEf8tEf8t Ef8t hk hW u! h9Ef8u(E@f8!uE@f8&u hEA hг hٳ h hÉU uGE}u hDEUu u`E}u h EÍvUh45$uu u5$xh>5$b j!U h@U hhxjj5 } hT\hhE 0E}u E 0 j! hD h4 h$ h  h h/ hJ h h h h h: u E}u{vuu u EEf8u utEf8 ++u uEf8yn 5 ^ 5 t E! ++vEuUS$EEEEEUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEUEEE;E|UEDEډE]ÉUS$EkEEEUUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEEUEfE]ÍvUS$UEMM}w] E' uEUBMA]CƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUk\EEvMk];|-EEE}Et[}etkUkEMD]DkEU| kEMt}kE]TkUkEMD]DkEU| kEMD0kE]TEkEUDM;rN kE]TkEtkE]TkELEkEkUMT ++]TEE]U=t2@)Ph5DP}u%h5D*Uk4h5DMAth5DUBth5DMAth5DyUBth5DPMythEf8t Uf:t,MAk4h5D *UBk,4h5DMk\EEUkM; |U0EE}EM vkEU|uh5D[#kEMth5D6@=uh5D kEUtg-@H@=t2@)Ph5Dh5DkEM|ti@kEUD8t ++EkEMDU;r$ kEMTkEtEɐ-@=t(@)Ph5Dh5D-@kEUth5DkEM|2kEUDk4h5DG#kEMth5D"vkEU|t&kEMDph5Dh5D&UBPh5$Eh5DyÉU$D uh85$7ÉUEDE ffEf}wGf} r@E E}u> uah85DE@ Eɐ u 1U}xu uh@5$u Phl5$gh5$QEv}~9 u=E}u5$uE뽐h5$EU uEEuv} tڃ} ++tԃ} t΃} tȃ};u" uEEt} ++u렃}/un u{E}*tuuj*E uIEEuKv}*u}/u7vEEċEÍvU u EEEv} tk} ++te} t_} tY}:tB})t<}]t6}"t0}/t*}(t$}[tEUE u E렃u u2E;Eu(h5$Tu jjUÍvUSd u;(tuj(JuPEDžZ~=k4Pu E ++븃}uPh5$h}u7v uat )uٸZv u)k\ u :usuPDž~5Pk,4ru vPvuDžk; |v0Ep ukL u[tuj[DžDž u]uu uAuQkt  DžD ODž9|%kLkCD ++뱐 uu)ukDDž u(uDž u"tuj"DžDž ++ @Pv9|/@P u<\uW u<;u:hP<"u @P.t3 u)tuj) kLuP P\kD ++PCPh 5$Jui PhX5$#{v u)tuj),]UVSE}Z~n?@ABCDE F$G;HTIiNQRST9UUVmX[^ehl q r5 uP vm y z } ++& ++@ ++˔t ++F ++ ++ #V Y 4u < C F S Z ^ltMyn4 ++Lb8wbKL#5LwH8KgLUZ^?awb\r5 7!899S:m dinit.c/usr/src/build/45423-i386/BUILD/glibc-2.2.4/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/45423-i386/BUILD/glibc-2.2.4/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note# 1((7 0?00GoFTo@c @@l HHu XX ~00`'  0@@0` ?@ EEEEpddF G  G  G NGhijdpp F y(0@H X ++ 0  @d    +2  =AO[ qp (  2         x "@+  5D= L V  ``$hx4 p^ xp@Yx" Pd`"p/|p\h @ )3E` Nch l pv̭'  p ++ Їp  "  0$BTS(6 ]S c\ln up(9   H T# $ "-^ ;` E Pn [0.m s|< @"$R lP`' ,pp%5:< F v Vį duDĬ[  initfini.cgcc2_compiled.call_gmon_startinit.ccrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__genemit.crtl.csawcloseindent.0print_rtxoutfiledump_and_abortread_nameobstack.cobstackxmallocgen_exprtx_lengthferror@@GLIBC_2.0rtvec_allocungetc@@GLIBC_2.0_DYNAMIC__register_frame_info@@GLIBC_2.0strcmp@@GLIBC_2.0mode_unit_sizeread_rtx_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0fflush@@GLIBC_2.0copy_rtxregister_constraintsgen_insnmode_size_obstack_newchunkputchar@@GLIBC_2.0spacesmode_wider_modeftell@@GLIBC_2.0_initmalloc@@GLIBC_2.0_obstack_begin__deregister_frame_info@@GLIBC_2.0insn_code_numberstdout@@GLIBC_2.0stderr@@GLIBC_2.0abort@@GLIBC_2.0debug_rtxfatalrtx_format_startmode_classrtl_obstackstrlen@@GLIBC_2.0max_opnoreg_note_namexreallocrtx_alloc_obstack_allocated_p__bss_startmainnote_insn_name__libc_start_main@@GLIBC_2.0realloc@@GLIBC_2.0max_operand_1print_rtldata_startprint_codeprintf@@GLIBC_2.0_fini_obstackobstack_free__cxa_finalize@@GLIBC_2.1.3gen_expandrtx_nameexit@@GLIBC_2.0atoi@@GLIBC_2.0read_skip_spaces_edatamode_name_IO_putc@@GLIBC_2.0_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endfancy_abortmax_operand_vec_obstack_freefopen@@GLIBC_2.1max_dup_opno_IO_stdin_usedinit_rtl__data_start_IO_getc@@GLIBC_2.0__gmon_start__strcpy@@GLIBC_2.0 +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/genemit.c alliance/genview/src/gcc-1.42/genemit.c +--- alliance-5.0/genview/src/gcc-1.42/genemit.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genemit.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,503 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Generate code from machine description to emit insns as rtl. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "obstack.h" ++ ++struct obstack obstack; ++struct obstack *rtl_obstack = &obstack; ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++void fatal (); ++void fancy_abort (); ++ ++int max_opno; ++int max_dup_opno; ++int register_constraints; ++int insn_code_number; ++ ++#define max(a, b) ((a) > (b) ? (a) : (b)) ++ ++void ++max_operand_1 (x) ++ rtx x; ++{ ++ register RTX_CODE code; ++ register int i; ++ register int len; ++ register char *fmt; ++ ++ if (x == 0) ++ return; ++ ++ code = GET_CODE (x); ++ ++ if (code == MATCH_OPERAND && XSTR (x, 2) != 0) ++ register_constraints = 1; ++ if (code == MATCH_OPERAND || code == MATCH_OPERATOR) ++ max_opno = max (max_opno, XINT (x, 0)); ++ if (code == MATCH_DUP) ++ max_dup_opno = max (max_dup_opno, XINT (x, 0)); ++ ++ fmt = GET_RTX_FORMAT (code); ++ len = GET_RTX_LENGTH (code); ++ for (i = 0; i < len; i++) ++ { ++ if (fmt[i] == 'e' || fmt[i] == 'u') ++ max_operand_1 (XEXP (x, i)); ++ else if (fmt[i] == 'E') ++ { ++ int j; ++ for (j = 0; j < XVECLEN (x, i); j++) ++ max_operand_1 (XVECEXP (x, i, j)); ++ } ++ } ++} ++ ++int ++max_operand_vec (insn, arg) ++ rtx insn; ++ int arg; ++{ ++ register int len = XVECLEN (insn, arg); ++ register int i; ++ ++ max_opno = -1; ++ max_dup_opno = -1; ++ ++ for (i = 0; i < len; i++) ++ max_operand_1 (XVECEXP (insn, arg, i)); ++ ++ return max_opno + 1; ++} ++ ++void ++print_code (code) ++ RTX_CODE code; ++{ ++ register char *p1; ++ for (p1 = GET_RTX_NAME (code); *p1; p1++) ++ { ++ if (*p1 >= 'a' && *p1 <= 'z') ++ putchar (*p1 + 'A' - 'a'); ++ else ++ putchar (*p1); ++ } ++} ++ ++/* Print a C expression to construct an RTX just like X, ++ substituting any operand references appearing within. */ ++ ++void ++gen_exp (x) ++ rtx x; ++{ ++ register RTX_CODE code; ++ register int i; ++ register int len; ++ register char *fmt; ++ ++ if (x == 0) ++ { ++ printf ("0"); ++ return; ++ } ++ ++ code = GET_CODE (x); ++ ++ switch (code) ++ { ++ case MATCH_OPERAND: ++ case MATCH_DUP: ++ printf ("operand%d", XINT (x, 0)); ++ return; ++ ++ case MATCH_OPERATOR: ++ printf ("gen_rtx (GET_CODE (operand%d)", XINT (x, 0)); ++ printf (", %smode", GET_MODE_NAME (GET_MODE (x))); ++ for (i = 0; i < XVECLEN (x, 2); i++) ++ { ++ printf (",\n\t\t"); ++ gen_exp (XVECEXP (x, 2, i)); ++ } ++ printf (")"); ++ return; ++ ++ case ADDRESS: ++ fatal ("ADDRESS expression code used in named instruction pattern"); ++ ++ case PC: ++ printf ("pc_rtx"); ++ return; ++ ++ case CC0: ++ printf ("cc0_rtx"); ++ return; ++ ++ case CONST_INT: ++ if (INTVAL (x) == 0) ++ { ++ printf ("const0_rtx"); ++ return; ++ } ++ if (INTVAL (x) == 1) ++ { ++ printf ("const1_rtx"); ++ return; ++ } ++ } ++ ++ printf ("gen_rtx ("); ++ print_code (code); ++ printf (", %smode", GET_MODE_NAME (GET_MODE (x))); ++ ++ fmt = GET_RTX_FORMAT (code); ++ len = GET_RTX_LENGTH (code); ++ for (i = 0; i < len; i++) ++ { ++ if (fmt[i] == '0') ++ break; ++ printf (", "); ++ if (fmt[i] == 'e' || fmt[i] == 'u') ++ gen_exp (XEXP (x, i)); ++ else if (fmt[i] == 'i') ++ printf ("%d", XINT (x, i)); ++ else if (fmt[i] == 's') ++ printf ("\"%s\"", XSTR (x, i)); ++ else if (fmt[i] == 'E') ++ { ++ int j; ++ printf ("gen_rtvec (%d", XVECLEN (x, i)); ++ for (j = 0; j < XVECLEN (x, i); j++) ++ { ++ printf (",\n\t\t"); ++ gen_exp (XVECEXP (x, i, j)); ++ } ++ printf (")"); ++ } ++ else ++ abort (); ++ } ++ printf (")"); ++} ++ ++/* Generate the `gen_...' function for a DEFINE_INSN. */ ++ ++void ++gen_insn (insn) ++ rtx insn; ++{ ++ int operands; ++ register int i; ++ ++ /* Don't mention instructions whose names are the null string. ++ They are in the machine description just to be recognized. */ ++ if (strlen (XSTR (insn, 0)) == 0) ++ return; ++ ++ /* Find out how many operands this function has, ++ and also whether any of them have register constraints. */ ++ register_constraints = 0; ++ operands = max_operand_vec (insn, 1); ++ if (max_dup_opno >= operands) ++ fatal ("match_dup operand number has no match_operand"); ++ ++ /* Output the function name and argument declarations. */ ++ printf ("rtx\ngen_%s (", XSTR (insn, 0)); ++ for (i = 0; i < operands; i++) ++ printf (i ? ", operand%d" : "operand%d", i); ++ printf (")\n"); ++ for (i = 0; i < operands; i++) ++ printf (" rtx operand%d;\n", i); ++ printf ("{\n"); ++ ++ /* Output code to construct and return the rtl for the instruction body */ ++ ++ if (XVECLEN (insn, 1) == 1) ++ { ++ printf (" return "); ++ gen_exp (XVECEXP (insn, 1, 0)); ++ printf (";\n}\n\n"); ++ } ++ else ++ { ++ printf (" return gen_rtx (PARALLEL, VOIDmode, gen_rtvec (%d", XVECLEN (insn, 1)); ++ for (i = 0; i < XVECLEN (insn, 1); i++) ++ { ++ printf (",\n\t\t"); ++ gen_exp (XVECEXP (insn, 1, i)); ++ } ++ printf ("));\n}\n\n"); ++ } ++} ++ ++/* Generate the `gen_...' function for a DEFINE_EXPAND. */ ++ ++void ++gen_expand (expand) ++ rtx expand; ++{ ++ int operands; ++ register int i; ++ ++ if (strlen (XSTR (expand, 0)) == 0) ++ fatal ("define_expand lacks a name"); ++ if (XVEC (expand, 1) == 0) ++ fatal ("define_expand for %s lacks a pattern", XSTR (expand, 0)); ++ ++ /* Find out how many operands this function has, ++ and also whether any of them have register constraints. */ ++ register_constraints = 0; ++ ++ operands = max_operand_vec (expand, 1); ++ ++ /* Output the function name and argument declarations. */ ++ printf ("rtx\ngen_%s (", XSTR (expand, 0)); ++ for (i = 0; i < operands; i++) ++ printf (i ? ", operand%d" : "operand%d", i); ++ printf (")\n"); ++ for (i = 0; i < operands; i++) ++ printf (" rtx operand%d;\n", i); ++ printf ("{\n"); ++ ++ /* For each operand referred to only with MATCH_DUPs, ++ make a local variable. */ ++ for (i = operands; i <= max_dup_opno; i++) ++ printf (" rtx operand%d;\n", i); ++ printf (" rtx operands[%d];\n", max (operands, max_dup_opno + 1)); ++ printf (" rtx _val;\n"); ++ printf (" start_sequence ();\n"); ++ ++ /* The fourth operand of DEFINE_EXPAND is some code to be executed ++ before the actual construction. ++ This code expects to refer to `operands' ++ just as the output-code in a DEFINE_INSN does, ++ but here `operands' is an automatic array. ++ So copy the operand values there before executing it. */ ++ if (XSTR (expand, 3)) ++ { ++ /* Output code to copy the arguments into `operands'. */ ++ for (i = 0; i < operands; i++) ++ printf (" operands[%d] = operand%d;\n", i, i); ++ ++ /* Output the special code to be executed before the sequence ++ is generated. */ ++ printf ("%s\n", XSTR (expand, 3)); ++ ++ /* Output code to copy the arguments back out of `operands' ++ (unless we aren't going to use them at all). */ ++ if (XVEC (expand, 1) != 0) ++ { ++ for (i = 0; i < operands; i++) ++ printf (" operand%d = operands[%d];\n", i, i); ++ for (; i <= max_dup_opno; i++) ++ printf (" operand%d = operands[%d];\n", i, i); ++ } ++ } ++ ++ /* Output code to construct the rtl for the instruction bodies. ++ Use emit_insn to add them to the sequence being accumulated. ++ But don't do this if the user's code has set `no_more' nonzero. */ ++ ++ for (i = 0; i < XVECLEN (expand, 1); i++) ++ { ++ rtx next = XVECEXP (expand, 1, i); ++ if ((GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC) ++ || (GET_CODE (next) == PARALLEL ++ && GET_CODE (XVECEXP (next, 0, 0)) == SET ++ && GET_CODE (SET_DEST (XVECEXP (next, 0, 0))) == PC) ++ || GET_CODE (next) == RETURN) ++ printf (" emit_jump_insn ("); ++ else if ((GET_CODE (next) == SET && GET_CODE (SET_SRC (next)) == CALL) ++ || GET_CODE (next) == CALL ++ || (GET_CODE (next) == PARALLEL ++ && GET_CODE (XVECEXP (next, 0, 0)) == SET ++ && GET_CODE (SET_SRC (XVECEXP (next, 0, 0))) == CALL) ++ || (GET_CODE (next) == PARALLEL ++ && GET_CODE (XVECEXP (next, 0, 0)) == CALL)) ++ printf (" emit_call_insn ("); ++ else if (GET_CODE (next) == CODE_LABEL) ++ printf (" emit_label ("); ++ else if (GET_CODE (next) == MATCH_OPERAND ++ || GET_CODE (next) == MATCH_OPERATOR ++ || GET_CODE (next) == MATCH_DUP ++ || GET_CODE (next) == PARALLEL) ++ printf (" emit ("); ++ else ++ printf (" emit_insn ("); ++ gen_exp (next); ++ printf (");\n"); ++ if (GET_CODE (next) == SET && GET_CODE (SET_DEST (next)) == PC ++ && GET_CODE (SET_SRC (next)) == LABEL_REF) ++ printf (" emit_barrier ();"); ++ } ++ ++ /* Call `gen_sequence' to make a SEQUENCE out of all the ++ insns emitted within this gen_... function. */ ++ ++ printf (" _done:\n"); ++ printf (" _val = gen_sequence ();\n"); ++ printf (" end_sequence ();\n"); ++ printf (" return _val;\n}\n\n"); ++} ++ ++int ++xmalloc (size) ++{ ++ register int val = malloc (size); ++ ++ if (val == 0) ++ fatal ("virtual memory exhausted"); ++ ++ return val; ++} ++ ++int ++xrealloc (ptr, size) ++ char *ptr; ++ int size; ++{ ++ int result = realloc (ptr, size); ++ if (!result) ++ fatal ("virtual memory exhausted"); ++ return result; ++} ++ ++void ++fatal (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "genemit: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++ exit (FATAL_EXIT_CODE); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ rtx desc; ++ FILE *infile; ++ extern rtx read_rtx (); ++ register int c; ++ ++ obstack_init (rtl_obstack); ++ ++ if (argc <= 1) ++ fatal ("No input file name."); ++ ++ infile = fopen (argv[1], "r"); ++ if (infile == 0) ++ { ++ perror (argv[1]); ++ exit (FATAL_EXIT_CODE); ++ } ++ ++ init_rtl (); ++ ++ /* Assign sequential codes to all entries in the machine description ++ in parallel with the tables in insn-output.c. */ ++ ++ insn_code_number = 0; ++ ++ printf ("/* Generated automatically by the program `genemit'\n\ ++from the machine description file `md'. */\n\n"); ++ ++ printf ("#include \"config.h\"\n"); ++ printf ("#include \"rtl.h\"\n"); ++ printf ("#include \"expr.h\"\n"); ++ printf ("#include \"real.h\"\n"); ++ printf ("#include \"insn-config.h\"\n\n"); ++ printf ("#include \"insn-flags.h\"\n\n"); ++ printf ("extern char *insn_operand_constraint[][MAX_RECOG_OPERANDS];\n\n"); ++ printf ("extern rtx recog_operand[];\n"); ++ printf ("#define operands emit_operand\n\n"); ++ printf ("#define FAIL do { end_sequence (); return 0;} while (0)\n\n"); ++ printf ("#define DONE goto _done\n\n"); ++ ++ /* Read the machine description. */ ++ ++ while (1) ++ { ++ c = read_skip_spaces (infile); ++ if (c == EOF) ++ break; ++ ungetc (c, infile); ++ ++ desc = read_rtx (infile); ++ if (GET_CODE (desc) == DEFINE_INSN) ++ { ++ gen_insn (desc); ++ ++insn_code_number; ++ } ++ if (GET_CODE (desc) == DEFINE_EXPAND) ++ { ++ gen_expand (desc); ++ ++insn_code_number; ++ } ++ if (GET_CODE (desc) == DEFINE_PEEPHOLE) ++ { ++ ++insn_code_number; ++ } ++ } ++ ++ fflush (stdout); ++ exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/genextract alliance/genview/src/gcc-1.42/genextract +--- alliance-5.0/genview/src/gcc-1.42/genextract 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genextract 2002-04-11 09:14:49.000000000 +0200 +@@ -0,0 +1,84 @@ ++ELF4 c4 (444@7@7@7@@`T > /lib/ld-linux.so.2GNU" !  ++ Y/,G<"L/6\l)e|S'  ++Lpr "(lT@̧̇H .܇"!. = ",'<]L \$l |__gmon_start__libc.so.6strcpyprintfstdoutungetcperror__cxa_finalizemalloc_obstack_newchunkfflushabort_obstack_beginfprintf__deregister_frame_infoferrorrealloc_IO_getc_obstack_allocated_pftellstrcmp_obstackstderrobstack_free_obstack_freeexitfopenatoi_IO_putc_IO_stdin_used__libc_start_mainstrlen__register_frame_infofreeGLIBC_2.1GLIBC_2.1.3GLIBC_2.0ii bsi lii x    ++ !UK!5%%h%h%h%h%h %h(%h0%h8p%h@`%hHP%hP@%hX0%h` %hh%hp%hx%h%h%h%h%h%h%h1^PTRhhQVh+USP[DhtЋ]ÉULuIHtt&BHH ++u긬t hL]ÍvU]ÍU<thh]Ð&U]ÍU(5h@I hg9E@8ujE@pSvE@HEv}y8EEEEEPEPkEtnM‰ hjÉU5h@ hg hs hjcÉU8}uOvEEEEЃ}$LUЋPEpEph u  h5h u  h2Ep5h5EpEphk u e hME EEE@ HEܐ}y)E܉EEPEP kEtM̃u EpvE EEkUEkU EEU9U|vE܉EUԋE܀<etUԋE܀<utEPUkEt \UԋE܀<EuPUkEDHEv}y4EEEPUkETEtEŐEPÉU}u hvExx? h E0EpEph7 h E0wEphYU uE}u h ++DEUu uE}u h ++ EÍvUh#5;uu u5$h05 j!U h2U hLhjj5PR } hF\hZE 0E}u E 0j j! h` hū hګ h h  hB h` hp u E}uuur ulEEf8u uEf8u uOEf8 ++y5h¬X hEE;|OvEt h}t hmuh ++ZE릉 hC h 3 h@# hZ h h 5b 5t E! ++vEuUS$PEEEEEUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEUEEE;E|UEDEډE]ÉUS$E kPEEEUUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEEUEfE]ÍvUS$UEMM}w]E' uEUBMA]CƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUkEEvMk ];|-EEE}Et[}etkUkEMD]DkEU| kEMt}kE]TkUkEMD]DkEU| kEMD0kE]TEkEUDM;rN kE]TkEtkE]TkELEkEkUMT ++]TEE]U=dt2a)Ph$5Td}u%h(5.dUk`4h.5MAth25UBth55MAth85}UBth;5TMythEf8t Uf:t,MAk4h>5*UBk4h>5MkEEUk M; |U0EE}EMvkEU|uhB5_#kEMthF5:d=duhN5 kEUtg-H=dt2a)Ph$5dhP5kEM|tikEUD8t ++dEkEMDU;r$ kEMTkEtEɐ-=dt(a)Ph$5hS5d-kEUthV5dkEM|2kEUDkh4hZ5K#kEMthV5&dvkEU|t&kEMDphV5h^5d&UBPh5Eh5}dÉU uhش5;ÉUEdE ffEf}wGf} r@E E}u> uahش5E@ Eɐ u 1U}xu uh5u Ph 5kh%5UEv}~9 u1E}u5uE뽐hA59U uEEuv} tڃ} ++tԃ} t΃} tȃ};u" uEEt} ++u렃}/un uoE}*tuuj*E u=EEuKv}*u}/u7vEEċEÍvU u EEEv} tk} ++te} t_} tY}:tB})t<}]t6}"t0}/t*}(t$}[tEUE u E렃u u6E;Eu(hL5Xu jjUÍvUSd u;(tuj(JuPEDžZ~=k`4Pu E ++븃}uPh5l}u7v uUt )uٸZv u)k u :usuPDž~5Pk4vu vPvuDžk ; |v0E ukL u[tuj[DžDž u]uu uAuQkt  DžD ODž9|%kLkCD ++뱐 uu)ukDDž u(uDž u"tuj"DžDž ++ @Plv9|/@P] u<\uW u<;u:hPx<"u @Pt3 u)tuj) kLuP PPkD ++PCPh5Nu] Ph5'ov u)tuj),]UVSE}Z~n?@ABCDE F$G;HTIiNQRST9UUVmX[^ehl q r5 uP vm y z } ++& ++@ ++˔t ++F ++ ++ #V Y 4u < C F S Z ^ltMyn4 ++Lb8wbKL#5LwH8KgLUZ^?awb\r5 7!899S:m dinit.c/usr/src/build/45423-i386/BUILD/glibc-2.2.4/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/45423-i386/BUILD/glibc-2.2.4/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note# 1((7  ?GoDTo@c $$l ,,u << ~  p )  )  @@7@ ====l>>> > DF_wabg F q($, < ++    @   +2  =HAOL[ q@ P  P2         P d%. 8@ Oh Y  c$k4 s p~Y P" ,<"L/p4h  \&l)9|K` T ]pg' yp ++ p " T16 ;S AlL S<p^Pj̇|(܍9 t  ̧H  h$܇"PN 8 @ $.6<E R "n`lw,' p<Ll  \-$<[ E@Rlfb o ~|initfini.cgcc2_compiled.call_gmon_startinit.ccrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__genextract.crtl.csawcloseindent.0print_rtxoutfiledump_and_abortread_nameobstack.cobstackxmallocrtx_lengthferror@@GLIBC_2.0print_pathrtvec_allocungetc@@GLIBC_2.0_DYNAMIC__register_frame_info@@GLIBC_2.0strcmp@@GLIBC_2.0mode_unit_sizeread_rtx_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0fflush@@GLIBC_2.0copy_rtxgen_insnmode_size_obstack_newchunkspacesmode_wider_modeftell@@GLIBC_2.0_initmalloc@@GLIBC_2.0_obstack_begin__deregister_frame_info@@GLIBC_2.0insn_code_numberstdout@@GLIBC_2.0stderr@@GLIBC_2.0abort@@GLIBC_2.0debug_rtxfatalrtx_format_startmode_classrtl_obstackstrlen@@GLIBC_2.0reg_note_namexreallocrtx_alloc_obstack_allocated_p__bss_startmainnote_insn_name__libc_start_main@@GLIBC_2.0realloc@@GLIBC_2.0gen_peepholeprint_rtldata_startprintf@@GLIBC_2.0_fini_obstackobstack_free__cxa_finalize@@GLIBC_2.1.3rtx_nameexit@@GLIBC_2.0atoi@@GLIBC_2.0read_skip_spaces_edatamode_name_IO_putc@@GLIBC_2.0_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endfancy_abort_obstack_freedup_countfopen@@GLIBC_2.1_IO_stdin_usedinit_rtl__data_start_IO_getc@@GLIBC_2.0walk_rtx__gmon_start__strcpy@@GLIBC_2.0 +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/genextract.c alliance/genview/src/gcc-1.42/genextract.c +--- alliance-5.0/genview/src/gcc-1.42/genextract.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genextract.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,371 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Generate code from machine description to extract operands from insn as rtl. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "obstack.h" ++ ++struct obstack obstack; ++struct obstack *rtl_obstack = &obstack; ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++/* Number instruction patterns handled, starting at 0 for first one. */ ++ ++int insn_code_number; ++ ++/* Number the occurrences of MATCH_DUP in each instruction, ++ starting at 0 for the first occurrence. */ ++ ++int dup_count; ++ ++/* While tree-walking an instruction pattern, we keep a chain ++ of these `struct link's to record how to get down to the ++ current position. In each one, POS is the operand number, ++ and if the operand is a vector VEC is the element number. ++ VEC is -1 if the operand is not a vector. */ ++ ++struct link ++{ ++ struct link *next; ++ int pos; ++ int vecelt; ++}; ++ ++void walk_rtx (); ++void print_path (); ++void fatal (); ++void fancy_abort (); ++ ++void ++gen_insn (insn) ++ rtx insn; ++{ ++ register int i; ++ ++ dup_count = 0; ++ ++ /* Output the function name and argument declaration. */ ++ /* It would be cleaner to make `void' the return type ++ but 4.2 vax compiler doesn't accept that in the array ++ that these functions are supposed to go in. */ ++ printf ("VOID\nextract_%d (insn)\n rtx insn;\n", insn_code_number); ++ printf ("{\n"); ++ ++ /* Walk the insn's pattern, remembering at all times the path ++ down to the walking point. */ ++ ++ if (XVECLEN (insn, 1) == 1) ++ walk_rtx (XVECEXP (insn, 1, 0), 0); ++ else ++ for (i = XVECLEN (insn, 1) - 1; i >= 0; i--) ++ { ++ struct link link; ++ link.next = 0; ++ link.pos = 0; ++ link.vecelt = i; ++ walk_rtx (XVECEXP (insn, 1, i), &link); ++ } ++ printf ("}\n\n"); ++} ++ ++/* Like gen_insn but handles `define_peephole'. */ ++ ++void ++gen_peephole (peep) ++ rtx peep; ++{ ++ /* Output the function name and argument declaration. */ ++ printf ("VOID\nextract_%d (insn)\n rtx insn;\n", insn_code_number); ++ printf ("{\n"); ++ /* The vector in the insn says how many operands it has. ++ And all it contains are operands. In fact, the vector was ++ created just for the sake of this function. */ ++ printf ("\ ++ bcopy (&XVECEXP (insn, 0, 0), recog_operand,\ ++ sizeof (rtx) * XVECLEN (insn, 0));\n"); ++ printf ("}\n\n"); ++} ++ ++void ++walk_rtx (x, path) ++ rtx x; ++ struct link *path; ++{ ++ register RTX_CODE code; ++ register int i; ++ register int len; ++ register char *fmt; ++ struct link link; ++ ++ if (x == 0) ++ return; ++ ++ code = GET_CODE (x); ++ ++ switch (code) ++ { ++ case PC: ++ case CC0: ++ case CONST_INT: ++ case SYMBOL_REF: ++ return; ++ ++ case MATCH_OPERAND: ++ printf (" recog_operand[%d] = *(recog_operand_loc[%d]\n = &", ++ XINT (x, 0), XINT (x, 0)); ++ print_path (path); ++ printf (");\n"); ++ break; ++ ++ case MATCH_DUP: ++ printf (" recog_dup_loc[%d] = &", dup_count); ++ print_path (path); ++ printf (";\n"); ++ printf (" recog_dup_num[%d] = %d;\n", dup_count, XINT (x, 0)); ++ dup_count++; ++ break; ++ ++ case MATCH_OPERATOR: ++ printf (" recog_operand[%d] = *(recog_operand_loc[%d]\n = &", ++ XINT (x, 0), XINT (x, 0)); ++ print_path (path); ++ printf (");\n"); ++ link.next = path; ++ link.vecelt = -1; ++ for (i = XVECLEN (x, 2) - 1; i >= 0; i--) ++ { ++ link.pos = i; ++ walk_rtx (XVECEXP (x, 2, i), &link); ++ } ++ return; ++ ++ case ADDRESS: ++ walk_rtx (XEXP (x, 0), path); ++ return; ++ } ++ ++ link.next = path; ++ link.vecelt = -1; ++ fmt = GET_RTX_FORMAT (code); ++ len = GET_RTX_LENGTH (code); ++ for (i = 0; i < len; i++) ++ { ++ link.pos = i; ++ if (fmt[i] == 'e' || fmt[i] == 'u') ++ { ++ walk_rtx (XEXP (x, i), &link); ++ } ++ else if (fmt[i] == 'E') ++ { ++ int j; ++ for (j = XVECLEN (x, i) - 1; j >= 0; j--) ++ { ++ link.vecelt = j; ++ walk_rtx (XVECEXP (x, i, j), &link); ++ } ++ } ++ } ++} ++ ++/* Given a PATH, representing a path down the instruction's ++ pattern from the root to a certain point, output code to ++ evaluate to the rtx at that point. */ ++ ++void ++print_path (path) ++ struct link *path; ++{ ++ if (path == 0) ++ printf ("insn"); ++ else if (path->vecelt >= 0) ++ { ++ printf ("XVECEXP ("); ++ print_path (path->next); ++ printf (", %d, %d)", path->pos, path->vecelt); ++ } ++ else ++ { ++ printf ("XEXP ("); ++ print_path (path->next); ++ printf (", %d)", path->pos); ++ } ++} ++ ++int ++xmalloc (size) ++{ ++ register int val = malloc (size); ++ ++ if (val == 0) ++ fatal ("virtual memory exhausted"); ++ return val; ++} ++ ++int ++xrealloc (ptr, size) ++ char *ptr; ++ int size; ++{ ++ int result = realloc (ptr, size); ++ if (!result) ++ fatal ("virtual memory exhausted"); ++ return result; ++} ++ ++void ++fatal (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "genextract: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++ exit (FATAL_EXIT_CODE); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ rtx desc; ++ FILE *infile; ++ extern rtx read_rtx (); ++ register int c, i; ++ ++ obstack_init (rtl_obstack); ++ ++ if (argc <= 1) ++ fatal ("No input file name."); ++ ++ infile = fopen (argv[1], "r"); ++ if (infile == 0) ++ { ++ perror (argv[1]); ++ exit (FATAL_EXIT_CODE); ++ } ++ ++ init_rtl (); ++ ++ /* Assign sequential codes to all entries in the machine description ++ in parallel with the tables in insn-output.c. */ ++ ++ insn_code_number = 0; ++ ++ printf ("/* Generated automatically by the program `genextract'\n\ ++from the machine description file `md'. */\n\n"); ++ ++ printf ("#include \"config.h\"\n"); ++ printf ("#include \"rtl.h\"\n\n"); ++ ++ printf ("extern rtx recog_operand[];\n"); ++ printf ("extern rtx *recog_operand_loc[];\n"); ++ printf ("extern rtx *recog_dup_loc[];\n"); ++ printf ("extern char recog_dup_num[];\n\n"); ++ ++ /* The extractor functions really should return `void'; ++ but old C compilers don't seem to be able to handle the array ++ definition if `void' is used. So use `int' in non-ANSI C compilers. */ ++ ++ printf ("#ifdef __STDC__\n#define VOID void\n#else\n#define VOID int\n#endif\n\n"); ++ ++ /* Read the machine description. */ ++ ++ while (1) ++ { ++ c = read_skip_spaces (infile); ++ if (c == EOF) ++ break; ++ ungetc (c, infile); ++ ++ desc = read_rtx (infile); ++ if (GET_CODE (desc) == DEFINE_INSN) ++ { ++ gen_insn (desc); ++ ++insn_code_number; ++ } ++ if (GET_CODE (desc) == DEFINE_PEEPHOLE) ++ { ++ gen_peephole (desc); ++ ++insn_code_number; ++ } ++ if (GET_CODE (desc) == DEFINE_EXPAND) ++ { ++ printf ("VOID extract_%d () {}\n\n", insn_code_number); ++ ++insn_code_number; ++ } ++ } ++ ++ printf ("VOID (*insn_extract_fn[]) () =\n{ "); ++ for (i = 0; i < insn_code_number; i++) ++ { ++ if (i % 4 != 0) ++ printf (", "); ++ else if (i != 0) ++ printf (",\n "); ++ printf ("extract_%d", i); ++ } ++ printf ("\n};\n\n"); ++ ++ printf ("void fatal_insn_not_found ();\n\n"); ++ printf ("void\ninsn_extract (insn)\n"); ++ printf (" rtx insn;\n"); ++ printf ("{\n if (INSN_CODE (insn) == -1) fatal_insn_not_found (insn);\n"); ++ printf (" (*insn_extract_fn[INSN_CODE (insn)]) (PATTERN (insn));\n}\n"); ++ ++ fflush (stdout); ++ exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/genflags alliance/genview/src/gcc-1.42/genflags +--- alliance-5.0/genview/src/gcc-1.42/genflags 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genflags 2002-04-11 09:14:49.000000000 +0200 +@@ -0,0 +1,43 @@ ++ELF4,Z4 (444`.`.`.```T  5   /lib/ld-linux.so.2GNU" !  ++ Y/,G<"L/6\l)e|S|'  ++LprР "(lT@̇H .܇"!. = ",'<]Lt \l |__gmon_start__libc.so.6strcpyprintfstdoutungetcperror__cxa_finalizemalloc_obstack_newchunkfflushabort_obstack_beginfprintf__deregister_frame_infoferrorrealloc_IO_getc_obstack_allocated_pftellstrcmp_obstackstderrobstack_free_obstack_freeexitfopenatoi_IO_putc_IO_stdin_used__libc_start_mainstrlen__register_frame_infofreeGLIBC_2.1GLIBC_2.1.3GLIBC_2.0ii bsi lii x    ++  !UK5%%h%h%h%h%h %h(%h0%h8p%h@`%hHP%hP@%hX0%h` %hh%hp%hx%h%h%h% h%h%h%h1^PTRhУhQVh+USP[;htЋ]ÉUluIhtt&Bhh ++u긬t hl]ÍvU]ÍU<thh]Ð&U]ÍU Ep(u\Ep tE@ E ++vE uEph" ++Eph8ÍvU u{E}u hODEUu uE}u hO EÍvUhh5uu u5hs5 j!IU huU hLhjj5p } h\hE 0 E}u E 0 j! hv u E}uKvuu uT EEf8t Ef8 ++t묃 u뜃 5 5t E! ++vEuUS$pEEEEEUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEUEEE;E|UEDEډE]ÉUS$E@kpEEEUUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEEUEfE]ÍvUS$UEMM}w]E' uEUBMA]CƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUkEEvMk@];|-EEE}Et[}etkUkEMD]DkEU| kEMt}kE]TkUkEMD]DkEU| kEMD0kE]TEkEUDM;rN kE]TkEtkE]TkELEkEkUMT ++]TEE]U=t2)PhD5|}u%hH5VUk4hN5 MAthR5UBthU5MAthX5UBth[5|MythEf8t Uf:t,MAk4h^57*UBk4h^5 MkEEUk@M; |U0EE}EMvkEU|uhb5#kEMthf5b=uhn5- kEUtg-H=t2)PhD5hp5kEM|tikEUD8t ++EkEMDU;r$ kEMTkEtEɐ-=t()PhD5 hs5-kEUthv5kEM|2kEUDk4hz5s#kEMthv5NvkEU|t&kEMDphv5 h~5&UBPh5Eh٪5ÉU uh5cÉUEE ffEf}wGf} r@E E}u> uah5E@ Eɐ u 1U}xu uh5u Ph,5hE5}Ev}~9 uYE}u5uE뽐ha5aU uEEuv} tڃ} ++tԃ} t΃} tȃ};u" uEEt} ++u렃}/un uE}*tuuj*E ueEEuKv}*u}/u7vEEċEÍvU u EEEv} tk} ++te} t_} tY}:tB})t<}]t6}"t0}/t*}(t$}[tEUE u E렃u u^E;Eu(hl5u jjUÍvUSd u;(tuj(JuPEDžZ~=k4Pu E ++븃}uPh5}u7v u}t )uٸZv u)k u :usuPDž~5Pk4u vPvuCDžk@; |v0E0 ukL u[tuj[DžDž u]uu+ uAuQkt  DžD ODž9|%kLkCD ++뱐 uu)ukDDž u(uDž u"tuj"DžDž ++ @Pv9|/@P u<\uW u<;u:h׬P<"u @Pt3 u)tuj) kLuP PxkD ++PCPh5vu Ph5Ov u)tuj),]UVSE}Z~83.*&" ޥե̥ɥƥå|mgcTGC>:- PMJFC?<9630-*'#      ΨΨ˨ȨĨ¨ywol˨˨k¨fk¨c_wkYU˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨˨UUlZF2 Шkթͩé "2BRbr‡҇"2BRbr  У( ++b <$ooodd9<Hr0,V1V cV$[Lby !"#3%K&a1x234568 9";B=X>n?@ABCDE F$G;HTIiNQRST9UUVmX[^ehl q r5 uP vm y z } ++& ++@ ++˔t ++F ++ ++ #V Y 4u < C F S Z ^ltMyn4 ++Lb8wbKL#5LwH8KgLUZ^?awb\r5 7!899S:m dinit.c/usr/src/build/45423-i386/BUILD/glibc-2.2.4/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/45423-i386/BUILD/glibc-2.2.4/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note# 1((7  ?GoDTo@c $$l ,,u << ~  @У#$` ++ ``.@ 4444l  555 5 d=VX7Y_F gR($, < ++   У`    +2  =hAOl[ q@ P  p2     У    ( #, 6> M@ W Р a$i4 q@p|Y(" , <"L/<p h \l),|>\` G} PpZ|' lsp ++ pР "Tؕ6 S #l. 5\p@pL̇^(lD9 uL  H ; $܇" ` . У ' "ClL\,'l\ }p<LԊ t \t[ `l1 @|initfini.cgcc2_compiled.call_gmon_startinit.ccrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__genflags.crtl.csawcloseindent.0print_rtxoutfiledump_and_abortread_nameobstack.cobstackxmallocrtx_lengthferror@@GLIBC_2.0rtvec_allocungetc@@GLIBC_2.0_DYNAMIC__register_frame_info@@GLIBC_2.0strcmp@@GLIBC_2.0mode_unit_sizeread_rtx_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0fflush@@GLIBC_2.0copy_rtxgen_insnmode_size_obstack_newchunkspacesmode_wider_modeftell@@GLIBC_2.0_initmalloc@@GLIBC_2.0_obstack_begin__deregister_frame_info@@GLIBC_2.0stdout@@GLIBC_2.0stderr@@GLIBC_2.0abort@@GLIBC_2.0debug_rtxfatalrtx_format_startmode_classrtl_obstackstrlen@@GLIBC_2.0reg_note_namexreallocrtx_alloc_obstack_allocated_p__bss_startmainnote_insn_name__libc_start_main@@GLIBC_2.0realloc@@GLIBC_2.0print_rtldata_startprintf@@GLIBC_2.0_fini_obstackobstack_free__cxa_finalize@@GLIBC_2.1.3rtx_nameexit@@GLIBC_2.0atoi@@GLIBC_2.0read_skip_spaces_edatamode_name_IO_putc@@GLIBC_2.0_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endfancy_abort_obstack_freefopen@@GLIBC_2.1_IO_stdin_usedinit_rtl__data_start_IO_getc@@GLIBC_2.0__gmon_start__strcpy@@GLIBC_2.0 +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/genflags.c alliance/genview/src/gcc-1.42/genflags.c +--- alliance-5.0/genview/src/gcc-1.42/genflags.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genflags.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,161 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Generate from machine description: ++ ++ - some flags HAVE_... saying which simple standard instructions are ++ available for this machine. ++ Copyright (C) 1987 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "obstack.h" ++ ++struct obstack obstack; ++struct obstack *rtl_obstack = &obstack; ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++void fatal (); ++void fancy_abort (); ++ ++void ++gen_insn (insn) ++ rtx insn; ++{ ++ /* Don't mention instructions whose names are the null string. ++ They are in the machine description just to be recognized. */ ++ if (strlen (XSTR (insn, 0)) == 0) ++ return; ++ ++ printf ("#define HAVE_%s (%s)\n", XSTR (insn, 0), ++ strlen (XSTR (insn, 2)) ? XSTR (insn, 2) : "1"); ++ printf ("extern rtx gen_%s ();\n", XSTR (insn, 0)); ++} ++ ++int ++xmalloc (size) ++{ ++ register int val = malloc (size); ++ ++ if (val == 0) ++ fatal ("virtual memory exhausted"); ++ ++ return val; ++} ++ ++int ++xrealloc (ptr, size) ++ char *ptr; ++ int size; ++{ ++ int result = realloc (ptr, size); ++ if (!result) ++ fatal ("virtual memory exhausted"); ++ return result; ++} ++ ++void ++fatal (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "genflags: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++ exit (FATAL_EXIT_CODE); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ rtx desc; ++ FILE *infile; ++ extern rtx read_rtx (); ++ register int c; ++ ++ obstack_init (rtl_obstack); ++ ++ if (argc <= 1) ++ fatal ("No input file name."); ++ ++ infile = fopen (argv[1], "r"); ++ if (infile == 0) ++ { ++ perror (argv[1]); ++ exit (FATAL_EXIT_CODE); ++ } ++ ++ init_rtl (); ++ ++ printf ("/* Generated automatically by the program `genflags'\n\ ++from the machine description file `md'. */\n\n"); ++ ++ /* Read the machine description. */ ++ ++ while (1) ++ { ++ c = read_skip_spaces (infile); ++ if (c == EOF) ++ break; ++ ungetc (c, infile); ++ ++ desc = read_rtx (infile); ++ if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND) ++ gen_insn (desc); ++ } ++ ++ fflush (stdout); ++ exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/genoutput alliance/genview/src/gcc-1.42/genoutput +--- alliance-5.0/genview/src/gcc-1.42/genoutput 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genoutput 2002-04-11 09:14:50.000000000 +0200 +@@ -0,0 +1,122 @@ ++ELF4t4 (444HHHd dOdd /lib/ld-linux.so.2GNU$!# " ++   \Y7lU|"/>)m[' ̇܇ ++Tpz "0 $t TNH <,<")L.P@K  E\"l|'$k -$ "̈__gmon_start__libc.so.6putcharstrcpyprintfstdoutungetcperror__cxa_finalizemalloc_obstack_newchunkfflushabort_obstack_beginfprintf__deregister_frame_infoferrorrealloc_IO_getc_obstack_allocated_pftellstrcmp_obstackstderrerrorobstack_free_obstack_freeexitfopenatoi_IO_putc_IO_stdin_used__libc_start_mainstrlen__register_frame_infofreeGLIBC_2.1GLIBC_2.1.3GLIBC_2.0ii psi zii `" $   ++$ ( ,048<@DHLPTX!\#U[f05%%h%h%h% h%h %h(%h0%h8p% h@`%$hHP%(hP@%,hX0%0h` %4hh%8hp%<hx%@h%Dh%Hh%Lh%Ph%Th%Xh%\hp1^PTRhh4QVh+USP[UltЋ]ÉUuItt&B ++ut h]ÍvU]ÍU|th(h]Ð&U]ÍU h@Y hI h9 h˸) h޸ h  h  h% h> hY hk hz h h hy hi hzYU( h A@E}u@UztMqhEv hPE@E빐 hX h`@E}u@UtM1h hPE@E빐 hXo h_@E}u@UztMqh̺0v hPE@E빐 hX h@E}u$Ur hE@E׍v hX h @E}u$UrhuE@E׍v hXW= h@:@Ev}u hX E hEMU;J |svkEE <~R}ukEE E2kEE M; tE0uhmE끐MUJEUE;P |SvkEPE <u hݻ.#kEPE 4h E롐My u h hE@E h@E}u hEMU;J |/vUE Ph@YEŐEx u h: h*E@Ei hX  h`@E}u hEMU;J |?vkE E,4hE뵐Ex u hj hZE@EY hX; h+@E}u hEMU;J |/vUEPh@EŐEx u h hE@Ei hX{ h k@E}u hGEMU;J |ovkEPE <t5kEPE 8tkEPE EEduhfE넋Ex u h hE@E) hX{ hk h[@E}uDUtMh& h E@E뵐 hX h@@E}u@UztMqhv hhE@E빐 hXÉUS$}uEE}E@EE;~E='~@Ph E E@UE ++E `E@E E@ Ex tAE@ 8t6Ep j,L ËE CUE  ++v}E@EE;~E='~@Ph ++E E@EE `E@EEEE@ U;rFjjEP kEtEʉ}uv} ujjEp}$ujjEpEk\EEEkM; |EEE}Et'}etsvjjUkEt5TUkE|tFEvEkUDU;r(jjUkETkEtEŐEP]ÍvU h EUE@8tE@UB E@UB=tUP ++E@Uhhhh hh`j(hhhj(hEE@U;r%jjEPkEtEΉ@UB UBhEPh4hEPh hE\Ph`j(EPhhE$Phj(EPhE@UE@8*tE@UBEƀUBEƀ hU2hľ h h hE@@EE8u UPEݐ j ++ hZÐU hEUE@UB=tUP E@Uhhhh EE@U;r%jjEPkEt ++EΉ@UB E@hEPhhEPh hE\PZj(EPDhE$P+j(EPE@UE@ 8*tE@ UBEƀUBEƀ h{U2hľf hV hF h6E@ @Ph  hÐU hEUE@8tE@UB E@UB=tUP ++E@Uhh`hhExt } hJh^E 0E}u E 0 j!e uE E}usvuu u EEf8u uEf8u ueEf8 ++u uv? 5  5 t E! EuqUEEEE 8u"U E :UEE׍vEÐUS$EEEEEUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEUEEE;E|UEDEډE]ÉUS$EkEEEUUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEEUEfE]ÍvUS$UEMM}w] E' uEUBMA]CƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUk\EEvMk];|-EEE}Et[}etkUkEMD]DkEU| kEMt}kE]TkUkEMD]DkEU| kEMD0kE]TEkEUDM;rN kE]TkEtkE]TkELEkEkUMT ++]TEE]U=t2@)Ph5D}u%h5DzUk4h5DDMAth5DUBth5DMAth5DUBth5DMythEf8t Uf:t,MAk4h5D[*UBk,4h5D/Mk\EEUkM; |U0EE}EM vkEU|uh5D#kEMth5D@=uh5DQ kEUtg-@H@=t2@)Ph5Dh5DkEM|ti@kEUD8t ++EkEMDU;r$ kEMTkEtEɐ-@=t(@)Ph5D/h5D-@kEUth5DkEM|2kEUDk4h5D#kEMth5DrvkEU|t&kEMDph5D1h5D&UBPh5$EEh5DÉU$D uh85$ÉUEDE ffEf}wGf} r@E E}u> uah85DE@ Eɐ u 1U}xu uh@5$u Phl5$h5$Ev}~9 uE}u5$u;E뽐h5$=U u1EEuv} tڃ} ++tԃ} t΃} tȃ};u" uEEt} ++u렃}/un uE}*tuuj*E uEEuKv}*u}/u7vEEċEÍvU u EEEv} tk} ++te} t_} tY}:tB})t<}]t6}"t0}/t*}(t$}[tEUE u E렃u uE;Eu(h5$u jjUÍvUSd u;(tuj(JuPEDžZ~=k4Pu E ++븃}uPh5$}u7v ut )uٸZv u)k\ u :usuPDž~5Pk,4u vPvugDžk; |v0Ep ukL u[tuj[DžDž u]uuO uAuQkt  DžD ODž9|%kLkCD ++뱐 uu)ukDDž u(uDž u"tuj"DžDž ++ @Pv9|/@P u5<\uW u<;u:hP<"u @Pt3 u)tuj) kLuP PkD ++PCPh 5$u PhX5$sv u)tuj),]UVSE}Z~n?@ABCDE F$G;HTIiNQRST9UUVmX[^ehl q r5 uP vm y z } ++& ++@ ++˔t ++F ++ ++ #V Y 4u < C F S Z ^ltMyn4 ++Lb8wbKL#5LwH8KgLUZ^?awb\r5 7!899S:m dinit.c/usr/src/build/45423-i386/BUILD/glibc-2.2.4/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/45423-i386/BUILD/glibc-2.2.4/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note# 1((7 @?DDGoԅHTo@c \\l ddu tt ~44LL/7  8 H@ NNNNpddO P  P4  P WGqrsdy0 ++F c(Dԅ\d t ++4 L   d    +2 0 =AO[0 q ( Љ 2         D $@-ؤ 7D? N\ X  b`$j4 rp}\YD" ld|"/|p(h  )-?x` H Q p[' m~̇ p܇ ++@4  p & "1 C$U Tf6 p`{ ԝS \l p (P9 h  H &2o 7$F,c<"vK (,  L.G P@K  \"D l̒1 #l3|'Cx T dk,puT( ( $[ 1B Q̈initfini.cgcc2_compiled.call_gmon_startinit.ccrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__genoutput.crtl.csawcloseindent.0print_rtxoutfiledump_and_abortread_nameobstack.cobstackxmallocrtx_lengthferror@@GLIBC_2.0rtvec_allocungetc@@GLIBC_2.0_DYNAMIC__register_frame_info@@GLIBC_2.0strcmp@@GLIBC_2.0mode_unit_sizeread_rtx_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0fflush@@GLIBC_2.0copy_rtxgen_insnmode_size_obstack_newchunkend_of_insn_dataputchar@@GLIBC_2.0spacesmode_wider_modeftell@@GLIBC_2.0constraintsinsn_data_initoutput_prologuemalloc@@GLIBC_2.0_obstack_beginmybcopy__deregister_frame_info@@GLIBC_2.0stdout@@GLIBC_2.0stderr@@GLIBC_2.0abort@@GLIBC_2.0debug_rtxpredicatesmybzerofatalrtx_formathave_constraints_startmode_classrtl_obstackstrlen@@GLIBC_2.0max_opnoop_n_alternativesreg_note_namexreallocrtx_alloc_obstack_allocated_p__bss_startmainnote_insn_name__libc_start_main@@GLIBC_2.0realloc@@GLIBC_2.0gen_peepholestrict_lowprint_rtldata_startprintf@@GLIBC_2.0_finin_occurrences_obstackerrorobstack_free__cxa_finalize@@GLIBC_2.1.3gen_expandrtx_namescan_operandsexit@@GLIBC_2.0atoi@@GLIBC_2.0read_skip_spacesoutput_epilogue_edatamode_name_IO_putc@@GLIBC_2.0_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endfancy_abortmodesaddress_p_obstack_freefopen@@GLIBC_2.1_IO_stdin_usednum_dupsinit_rtl__data_start_IO_getc@@GLIBC_2.0next_code_number__gmon_start__strcpy@@GLIBC_2.0 +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/genoutput.c alliance/genview/src/gcc-1.42/genoutput.c +--- alliance-5.0/genview/src/gcc-1.42/genoutput.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genoutput.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,809 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Generate code from to output assembler insns as recognized from rtl. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* This program reads the machine description for the compiler target machine ++ and produces a file containing three things: ++ ++ 1, An array of strings `insn_template' which is indexed by insn code number ++ and contains the template for output of that insn, ++ ++ 2. An array of ints `insn_n_operands' which is indexed by insn code number ++ and contains the number of distinct operands in the pattern for that insn, ++ ++ 3. An array of ints `insn_n_dups' which is indexed by insn code number ++ and contains the number of match_dup's that appear in the insn's pattern. ++ This says how many elements of `recog_dup_loc' are significant ++ after an insn has been recognized. ++ ++ 4. An array of arrays of operand constraint strings, ++ `insn_operand_constraint', ++ indexed first by insn code number and second by operand number, ++ containing the constraint for that operand. ++ ++ This array is generated only if register constraints appear in ++ match_operand rtx's. ++ ++ 5. An array of arrays of chars which indicate which operands of ++ which insn patterns appear within ADDRESS rtx's. This array is ++ called `insn_operand_address_p' and is generated only if there ++ are *no* register constraints in the match_operand rtx's. ++ ++ 6. An array of arrays of machine modes, `insn_operand_mode', ++ indexed first by insn code number and second by operand number, ++ containing the machine mode that that operand is supposed to have. ++ Also `insn_operand_strict_low', which is nonzero for operands ++ contained in a STRICT_LOW_PART. ++ ++ 7. An array of arrays of int-valued functions, `insn_operand_predicate', ++ indexed first by insn code number and second by operand number, ++ containing the match_operand predicate for this operand. ++ ++ 8. An array of functions `insn_gen_function' which, indexed ++ by insn code number, gives the function to generate a body ++ for that patter, given operands as arguments. ++ ++ 9. A function `output_insn_hairy' which is called with two arguments ++ (an insn code number and a vector of operand value rtx's) ++ and returns a template to use for output of that insn. ++ This is used only in the cases where the template is not constant. ++ These cases are specified by a * at the beginning of the template string ++ in the machine description. They are identified for the sake of ++ other parts of the compiler by a zero element in `insn_template'. ++ ++ 10. An array of structures, `insn_machine_info', that gives machine-specific ++ information about the insn. ++ ++ 11. An array of ints, `insn_n_alternatives', that gives the number ++ of alternatives in the constraints of each pattern. ++ ++The code number of an insn is simply its position in the machine description; ++code numbers are assigned sequentially to entries in the description, ++starting with code number 0. ++ ++Thus, the following entry in the machine description ++ ++ (define_insn "clrdf" ++ [(set (match_operand:DF 0 "general_operand" "") ++ (const_int 0))] ++ "" ++ "clrd %0") ++ ++assuming it is the 25th entry present, would cause ++insn_template[24] to be "clrd %0", and insn_n_operands[24] to be 1. ++It would not make an case in output_insn_hairy because the template ++given in the entry is a constant (it does not start with `*'). */ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "obstack.h" ++ ++/* No instruction can have more operands than this. ++ Sorry for this arbitrary limit, but what machine will ++ have an instruction with this many operands? */ ++ ++#define MAX_MAX_OPERANDS 40 ++ ++struct obstack obstack; ++struct obstack *rtl_obstack = &obstack; ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++void fatal (); ++void fancy_abort (); ++void error (); ++void mybcopy (); ++void mybzero (); ++ ++/* insns in the machine description are assigned sequential code numbers ++ that are used by insn-recog.c (produced by genrecog) to communicate ++ to insn-output.c (produced by this program). */ ++ ++int next_code_number; ++ ++/* Record in this chain all information that we will output, ++ associated with the code number of the insn. */ ++ ++struct data ++{ ++ int code_number; ++ char *name; ++ char *template; /* string such as "movl %1,%0" */ ++ int n_operands; /* Number of operands this insn recognizes */ ++ int n_dups; /* Number times match_dup appears in pattern */ ++ int n_alternatives; /* Number of alternatives in each constraint */ ++ struct data *next; ++ char *constraints[MAX_MAX_OPERANDS]; ++ /* Number of alternatives in constraints of operand N. */ ++ int op_n_alternatives[MAX_MAX_OPERANDS]; ++ char *predicates[MAX_MAX_OPERANDS]; ++ char address_p[MAX_MAX_OPERANDS]; ++ enum machine_mode modes[MAX_MAX_OPERANDS]; ++ char strict_low[MAX_MAX_OPERANDS]; ++ char outfun; /* Nonzero means this has an output function */ ++ char *machine_info; /* machine-specific info string. */ ++}; ++ ++/* This variable points to the first link in the chain. */ ++ ++struct data *insn_data; ++ ++/* Pointer to the last link in the chain, so new elements ++ can be added at the end. */ ++ ++struct data *end_of_insn_data; ++ ++/* Nonzero if any match_operand has a constraint string; ++ implies that REGISTER_CONSTRAINTS will be defined ++ for this machine description. */ ++ ++int have_constraints; ++ ++void ++output_prologue () ++{ ++ ++ printf ("/* Generated automatically by the program `genoutput'\n\ ++from the machine description file `md'. */\n\n"); ++ ++ printf ("#include \"config.h\"\n"); ++ printf ("#include \"rtl.h\"\n"); ++ printf ("#include \"regs.h\"\n"); ++ printf ("#include \"hard-reg-set.h\"\n"); ++ printf ("#include \"real.h\"\n"); ++ printf ("#include \"conditions.h\"\n"); ++ printf ("#include \"insn-flags.h\"\n"); ++ printf ("#include \"insn-config.h\"\n\n"); ++ ++ printf ("#ifndef __STDC__\n"); ++ printf ("#define const\n"); ++ printf ("#endif\n\n"); ++ ++ printf ("#include \"output.h\"\n"); ++ printf ("#include \"aux-output.c\"\n\n"); ++ ++ /* Make sure there is at least a dummy definition of INSN_MACHINE_INFO. */ ++ printf ("#ifndef INSN_MACHINE_INFO\n"); ++ printf ("#define INSN_MACHINE_INFO struct dummy1 {int i;}\n"); ++ printf ("#endif\n\n"); ++} ++ ++void ++output_epilogue () ++{ ++ register struct data *d; ++ ++ printf ("\nchar * const insn_template[] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ if (d->template) ++ printf (" \"%s\",\n", d->template); ++ else ++ printf (" 0,\n"); ++ } ++ printf (" };\n"); ++ ++ printf ("\nchar *(*const insn_outfun[])() =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ if (d->outfun) ++ printf (" output_%d,\n", d->code_number); ++ else ++ printf (" 0,\n"); ++ } ++ printf (" };\n"); ++ ++ printf ("\nrtx (*const insn_gen_function[]) () =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ if (d->name) ++ printf (" gen_%s,\n", d->name); ++ else ++ printf (" 0,\n"); ++ } ++ printf (" };\n"); ++ ++ printf ("\nconst int insn_n_operands[] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ printf (" %d,\n", d->n_operands); ++ } ++ printf (" };\n"); ++ ++ printf ("\nconst int insn_n_dups[] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ printf (" %d,\n", d->n_dups); ++ } ++ printf (" };\n"); ++ ++ if (have_constraints) ++ { ++ printf ("\nchar *const insn_operand_constraint[][MAX_RECOG_OPERANDS] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ register int i, n = 0, start; ++ printf (" {"); ++ /* Make sure all the operands have the same number of ++ alternatives in their constraints. ++ Let N be that number. */ ++ for (start = 0; start < d->n_operands; start++) ++ if (d->op_n_alternatives[start] > 0) ++ { ++ if (n == 0) ++ n = d->op_n_alternatives[start]; ++ else if (n != d->op_n_alternatives[start]) ++ error ("wrong number of alternatives in operand %d of insn number %d", ++ start, d->code_number); ++ } ++ /* Record the insn's overall number of alternatives. */ ++ d->n_alternatives = n; ++ ++ for (i = 0; i < d->n_operands; i++) ++ { ++ if (d->constraints[i] == 0) ++ printf (" \"\","); ++ else ++ printf (" \"%s\",", d->constraints[i]); ++ } ++ if (d->n_operands == 0) ++ printf (" 0"); ++ printf (" },\n"); ++ } ++ printf (" };\n"); ++ } ++ else ++ { ++ printf ("\nconst char insn_operand_address_p[][MAX_RECOG_OPERANDS] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ register int i; ++ printf (" {"); ++ for (i = 0; i < d->n_operands; i++) ++ printf (" %d,", d->address_p[i]); ++ if (d->n_operands == 0) ++ printf (" 0"); ++ printf (" },\n"); ++ } ++ printf (" };\n"); ++ } ++ ++ printf ("\nconst enum machine_mode insn_operand_mode[][MAX_RECOG_OPERANDS] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ register int i; ++ printf (" {"); ++ for (i = 0; i < d->n_operands; i++) ++ printf (" %smode,", GET_MODE_NAME (d->modes[i])); ++ if (d->n_operands == 0) ++ printf (" VOIDmode"); ++ printf (" },\n"); ++ } ++ printf (" };\n"); ++ ++ printf ("\nconst char insn_operand_strict_low[][MAX_RECOG_OPERANDS] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ register int i; ++ printf (" {"); ++ for (i = 0; i < d->n_operands; i++) ++ printf (" %d,", d->strict_low[i]); ++ if (d->n_operands == 0) ++ printf (" 0"); ++ printf (" },\n"); ++ } ++ printf (" };\n"); ++ ++ printf ("\nint (*const insn_operand_predicate[][MAX_RECOG_OPERANDS])() =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ register int i; ++ printf (" {"); ++ for (i = 0; i < d->n_operands; i++) ++ printf (" %s,", ((d->predicates[i] && d->predicates[i][0]) ++ ? d->predicates[i] : "0")); ++ if (d->n_operands == 0) ++ printf (" 0"); ++ printf (" },\n"); ++ } ++ printf (" };\n"); ++ ++ printf ("\n#ifndef DEFAULT_MACHINE_INFO\n#define DEFAULT_MACHINE_INFO 0\n"); ++ printf ("#endif\n\nconst INSN_MACHINE_INFO insn_machine_info[] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ if (d->machine_info) ++ printf (" {%s},\n", d->machine_info); ++ else ++ printf(" { DEFAULT_MACHINE_INFO },\n"); ++ } ++ printf(" };\n"); ++ ++ printf ("\nconst int insn_n_alternatives[] =\n {\n"); ++ for (d = insn_data; d; d = d->next) ++ { ++ if (d->n_alternatives) ++ printf (" %d,\n", d->n_alternatives); ++ else ++ printf(" 0,\n"); ++ } ++ printf(" };\n"); ++} ++ ++/* scan_operands (X) stores in max_opno the largest operand ++ number present in X, if that is larger than the previous ++ value of max_opno. It stores all the constraints in `constraints' ++ and all the machine modes in `modes'. ++ ++ THIS_ADDRESS_P is nonzero if the containing rtx was an ADDRESS. ++ THIS_STRICT_LOW is nonzero if the containing rtx was a STRICT_LOW_PART. */ ++ ++int max_opno; ++int num_dups; ++char *constraints[MAX_MAX_OPERANDS]; ++int op_n_alternatives[MAX_MAX_OPERANDS]; ++char *predicates[MAX_MAX_OPERANDS]; ++char address_p[MAX_MAX_OPERANDS]; ++enum machine_mode modes[MAX_MAX_OPERANDS]; ++char strict_low[MAX_MAX_OPERANDS]; ++ ++void ++scan_operands (part, this_address_p, this_strict_low) ++ rtx part; ++ int this_address_p; ++ int this_strict_low; ++{ ++ register int i, j; ++ register RTX_CODE code; ++ register char *format_ptr; ++ ++ if (part == 0) ++ return; ++ ++ code = GET_CODE (part); ++ ++ if (code == MATCH_OPERAND) ++ { ++ int opno = XINT (part, 0); ++ if (opno > max_opno) ++ max_opno = opno; ++ if (max_opno >= MAX_MAX_OPERANDS) ++ error ("Too many operands (%d) in one instruction pattern.\n", ++ max_opno + 1); ++ modes[opno] = GET_MODE (part); ++ strict_low[opno] = this_strict_low; ++ predicates[opno] = XSTR (part, 1); ++ constraints[opno] = XSTR (part, 2); ++ if (XSTR (part, 2) != 0 && *XSTR (part, 2) != 0) ++ { ++ op_n_alternatives[opno] = n_occurrences (',', XSTR (part, 2)) + 1; ++ have_constraints = 1; ++ } ++ address_p[opno] = this_address_p; ++ return; ++ } ++ ++ if (code == MATCH_OPERATOR) ++ { ++ int opno = XINT (part, 0); ++ if (opno > max_opno) ++ max_opno = opno; ++ if (max_opno >= MAX_MAX_OPERANDS) ++ error ("Too many operands (%d) in one instruction pattern.\n", ++ max_opno + 1); ++ modes[opno] = GET_MODE (part); ++ strict_low[opno] = 0; ++ predicates[opno] = XSTR (part, 1); ++ constraints[opno] = 0; ++ address_p[opno] = 0; ++ for (i = 0; i < XVECLEN (part, 2); i++) ++ scan_operands (XVECEXP (part, 2, i), 0, 0); ++ return; ++ } ++ ++ if (code == MATCH_DUP) ++ { ++ ++num_dups; ++ return; ++ } ++ ++ if (code == ADDRESS) ++ { ++ scan_operands (XEXP (part, 0), 1, 0); ++ return; ++ } ++ ++ if (code == STRICT_LOW_PART) ++ { ++ scan_operands (XEXP (part, 0), 0, 1); ++ return; ++ } ++ ++ format_ptr = GET_RTX_FORMAT (GET_CODE (part)); ++ ++ for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++) ++ switch (*format_ptr++) ++ { ++ case 'e': ++ scan_operands (XEXP (part, i), 0, 0); ++ break; ++ case 'E': ++ if (XVEC (part, i) != NULL) ++ for (j = 0; j < XVECLEN (part, i); j++) ++ scan_operands (XVECEXP (part, i, j), 0, 0); ++ break; ++ } ++} ++ ++/* Look at a define_insn just read. Assign its code number. ++ Record on insn_data the template and the number of arguments. ++ If the insn has a hairy output action, output a function for now. */ ++ ++void ++gen_insn (insn) ++ rtx insn; ++{ ++ register struct data *d = (struct data *) xmalloc (sizeof (struct data)); ++ register int i; ++ ++ d->code_number = next_code_number++; ++ if (XSTR (insn, 0)[0]) ++ d->name = XSTR (insn, 0); ++ else ++ d->name = 0; ++ ++ /* Build up the list in the same order as the insns are seen ++ in the machine description. */ ++ d->next = 0; ++ if (end_of_insn_data) ++ end_of_insn_data->next = d; ++ else ++ insn_data = d; ++ ++ end_of_insn_data = d; ++ ++ max_opno = -1; ++ num_dups = 0; ++ ++ mybzero (constraints, sizeof constraints); ++ mybzero (op_n_alternatives, sizeof op_n_alternatives); ++ mybzero (predicates, sizeof predicates); ++ mybzero (address_p, sizeof address_p); ++ mybzero (modes, sizeof modes); ++ mybzero (strict_low, sizeof strict_low); ++ for (i = 0; i < XVECLEN (insn, 1); i++) ++ scan_operands (XVECEXP (insn, 1, i), 0, 0); ++ d->n_operands = max_opno + 1; ++ d->n_dups = num_dups; ++ mybcopy (constraints, d->constraints, sizeof constraints); ++ mybcopy (op_n_alternatives, d->op_n_alternatives, sizeof op_n_alternatives); ++ mybcopy (predicates, d->predicates, sizeof predicates); ++ mybcopy (address_p, d->address_p, sizeof address_p); ++ mybcopy (modes, d->modes, sizeof modes); ++ mybcopy (strict_low, d->strict_low, sizeof strict_low); ++ d->machine_info = XSTR (insn, 4); ++ ++ /* We need to consider only the instructions whose assembler code template ++ starts with a *. These are the ones where the template is really ++ C code to run to decide on a template to use. ++ So for all others just return now. */ ++ ++ if (XSTR (insn, 3)[0] != '*') ++ { ++ d->template = XSTR (insn, 3); ++ d->outfun = 0; ++ return; ++ } ++ ++ d->template = 0; ++ d->outfun = 1; ++ ++ printf ("\nstatic char *\n"); ++ printf ("output_%d (operands, insn)\n", d->code_number); ++ printf (" rtx *operands;\n"); ++ printf (" rtx insn;\n"); ++ printf ("{\n"); ++ /* The following is done in a funny way to get around problems in ++ VAX-11 "C" on VMS. It is the equivalent of: ++ printf ("%s\n", &(XSTR (insn, 3)[1])); */ ++ { ++ register char *cp = &(XSTR (insn, 3)[1]); ++ while (*cp) putchar (*cp++); ++ putchar ('\n'); ++ } ++ printf ("}\n"); ++} ++ ++/* Look at a define_peephole just read. Assign its code number. ++ Record on insn_data the template and the number of arguments. ++ If the insn has a hairy output action, output it now. */ ++ ++void ++gen_peephole (peep) ++ rtx peep; ++{ ++ register struct data *d = (struct data *) xmalloc (sizeof (struct data)); ++ register int i; ++ ++ d->code_number = next_code_number++; ++ d->name = 0; ++ ++ /* Build up the list in the same order as the insns are seen ++ in the machine description. */ ++ d->next = 0; ++ if (end_of_insn_data) ++ end_of_insn_data->next = d; ++ else ++ insn_data = d; ++ ++ end_of_insn_data = d; ++ ++ max_opno = -1; ++ mybzero (constraints, sizeof constraints); ++ mybzero (op_n_alternatives, sizeof op_n_alternatives); ++ ++ /* Get the number of operands by scanning all the ++ patterns of the peephole optimizer. ++ But ignore all the rest of the information thus obtained. */ ++ for (i = 0; i < XVECLEN (peep, 0); i++) ++ scan_operands (XVECEXP (peep, 0, i), 0, 0); ++ ++ d->n_operands = max_opno + 1; ++ d->n_dups = 0; ++ mybcopy (constraints, d->constraints, sizeof constraints); ++ mybcopy (op_n_alternatives, d->op_n_alternatives, sizeof op_n_alternatives); ++ mybzero (d->predicates, sizeof predicates); ++ mybzero (d->address_p, sizeof address_p); ++ mybzero (d->modes, sizeof modes); ++ mybzero (d->strict_low, sizeof strict_low); ++ d->machine_info = XSTR (peep, 3); ++ ++ /* We need to consider only the instructions whose assembler code template ++ starts with a *. These are the ones where the template is really ++ C code to run to decide on a template to use. ++ So for all others just return now. */ ++ ++ if (XSTR (peep, 2)[0] != '*') ++ { ++ d->template = XSTR (peep, 2); ++ d->outfun = 0; ++ return; ++ } ++ ++ d->template = 0; ++ d->outfun = 1; ++ ++ printf ("\nstatic char *\n"); ++ printf ("output_%d (operands, insn)\n", d->code_number); ++ printf (" rtx *operands;\n"); ++ printf (" rtx insn;\n"); ++ printf ("{\n"); ++ printf ("%s\n", &(XSTR (peep, 2)[1])); ++ printf ("}\n"); ++} ++ ++/* Process a define_expand just read. Assign its code number, ++ only for the purposes of `insn_gen_function'. */ ++ ++void ++gen_expand (insn) ++ rtx insn; ++{ ++ register struct data *d = (struct data *) xmalloc (sizeof (struct data)); ++ register int i; ++ ++ d->code_number = next_code_number++; ++ if (XSTR (insn, 0)[0]) ++ d->name = XSTR (insn, 0); ++ else ++ d->name = 0; ++ ++ /* Build up the list in the same order as the insns are seen ++ in the machine description. */ ++ d->next = 0; ++ if (end_of_insn_data) ++ end_of_insn_data->next = d; ++ else ++ insn_data = d; ++ ++ end_of_insn_data = d; ++ ++ max_opno = -1; ++ num_dups = 0; ++ ++ /* Scan the operands to get the specified predicates and modes, ++ since expand_binop needs to know them. */ ++ ++ mybzero (predicates, sizeof predicates); ++ mybzero (modes, sizeof modes); ++ if (XVEC (insn, 1)) ++ for (i = 0; i < XVECLEN (insn, 1); i++) ++ scan_operands (XVECEXP (insn, 1, i), 0, 0); ++ d->n_operands = max_opno + 1; ++ mybcopy (predicates, d->predicates, sizeof predicates); ++ mybcopy (modes, d->modes, sizeof modes); ++ ++ mybzero (d->constraints, sizeof constraints); ++ mybzero (d->op_n_alternatives, sizeof op_n_alternatives); ++ mybzero (d->address_p, sizeof address_p); ++ mybzero (d->strict_low, sizeof strict_low); ++ ++ d->n_dups = 0; ++ d->template = 0; ++ d->outfun = 0; ++ d->machine_info = 0; ++} ++ ++int ++xmalloc (size) ++{ ++ register int val = malloc (size); ++ ++ if (val == 0) ++ fatal ("virtual memory exhausted"); ++ return val; ++} ++ ++int ++xrealloc (ptr, size) ++ char *ptr; ++ int size; ++{ ++ int result = realloc (ptr, size); ++ if (!result) ++ fatal ("virtual memory exhausted"); ++ return result; ++} ++ ++void ++mybzero (b, length) ++ register char *b; ++ register int length; ++{ ++ while (length-- > 0) ++ *b++ = 0; ++} ++ ++void ++mybcopy (b1, b2, length) ++ register char *b1; ++ register char *b2; ++ register int length; ++{ ++ while (length-- > 0) ++ *b2++ = *b1++; ++} ++ ++void ++fatal (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "genoutput: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++ exit (FATAL_EXIT_CODE); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++void ++error (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "genoutput: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ rtx desc; ++ FILE *infile; ++ extern rtx read_rtx (); ++ register int c; ++ ++ obstack_init (rtl_obstack); ++ ++ if (argc <= 1) ++ fatal ("No input file name."); ++ ++ infile = fopen (argv[1], "r"); ++ if (infile == 0) ++ { ++ perror (argv[1]); ++ exit (FATAL_EXIT_CODE); ++ } ++ ++ init_rtl (); ++ ++ output_prologue (); ++ next_code_number = 0; ++ have_constraints = 0; ++ ++ /* Read the machine description. */ ++ ++ while (1) ++ { ++ c = read_skip_spaces (infile); ++ if (c == EOF) ++ break; ++ ungetc (c, infile); ++ ++ desc = read_rtx (infile); ++ if (GET_CODE (desc) == DEFINE_INSN) ++ gen_insn (desc); ++ if (GET_CODE (desc) == DEFINE_PEEPHOLE) ++ gen_peephole (desc); ++ if (GET_CODE (desc) == DEFINE_EXPAND) ++ gen_expand (desc); ++ } ++ ++ output_epilogue (); ++ ++ fflush (stdout); ++ exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); ++} ++ ++int ++n_occurrences (c, s) ++ char c; ++ char *s; ++{ ++ int n = 0; ++ while (*s) ++ n += (*s++ == c); ++ return n; ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/genpeep alliance/genview/src/gcc-1.42/genpeep +--- alliance-5.0/genview/src/gcc-1.42/genpeep 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genpeep 2002-04-11 09:14:49.000000000 +0200 +@@ -0,0 +1,92 @@ ++ELF4,h4 (444@<@<@<@@dt C /lib/ld-linux.so.2GNU# "! ++   @Y7PO`"p/>)m['  ++TЇpz  "0tTHH 6 ")0.( E@"P`'pe 'D "__gmon_start__libc.so.6putcharstrcpyprintfstdoutungetcperror__cxa_finalizemalloc_obstack_newchunkfflushabort_obstack_beginfprintf__deregister_frame_infoferrorrealloc_IO_getc_obstack_allocated_pftellstrcmp_obstackstderrobstack_free_obstack_freeexitfopenatoi_IO_putc_IO_stdin_used__libc_start_mainstrlen__register_frame_infofreeGLIBC_2.1GLIBC_2.1.3GLIBC_2.0ii jsi tii !  ++   "UW$5%%h%h%h%h%h %h(%h0%h8p%h@`%hHP%hP@%hX0%h` %hh%hp%hx%h%h%h%h%h%h%h%hp1^PTRhhQVh /USP[æIltЋ]ÉULuIHtt&BHH ++ut hL]ÍvU]ÍU`thh]Ð&U]ÍUE@E$ h`HEE;E|v}~L h5Th h5Th@ h5TjEPEtE_vExt'E@8t5TEphk5$hU5Th.?}~ h`) h5ThÉU8}uvEE}}w }t!L}} 3vE@;(~ E@(E@;$| E@@$ hh u F hJEph4Ex E@8uE@k4Eph h u  huEph E@;(~ E@(E@;$| E@@$ hQ\ u : h>Eph(Ext3E@8t(uE@k4EphE EEEE@ U;rE܉EuEPEP kEtEuu Ep` hk u I hM h]= uuhtExt%uE@k4hE EEkUEkU@EEU9U|vE܉EUԋE܀<etUԋE܀<ut$uEPUkEtrDUԋE܀<EuxuUkED0uh;UkEDHEv}yEEuEPUkETEtE뾉UԋE܀<iuT}t. h u  huUkEtuh ^UԋE܀<suR}t. ha u ? hCuUkEtuh`%EbÉU}u hvExx? h E0EpEph7 h E0wEphuUE`EE8uBU:`~ E8z U P UPE뵐ÉU uE}u hDEUu uE}u h EÍvUh̰5uu u5hְ5 j!]U hذU( hh0jj5P } hRhE 0*E}u E 0 j!v h  hz hj hZ hJ hб: h* h  hF ++ h[ hf h hv u! E}ucvuu u EEf8u uTEf8tEf8 ++t돍vT넃 h²;=(u ++((@PhҲ 5p 5t ++E!EuUS$PEEEEEUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEUEEE;E|UEDEډE]ÉUS$E@kPEEEUUER ‹E;PvuuEEMUEB A A EEE@EMUE@R ‹E@!ЉA A MEPA )ӋMEPA)9~EURP UEUE@ BEEEUEfE]ÍvUS$UEMM}w]E' uEUBMA]CƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUBƒMA Ћ]CUkEEvMk@];|-EEE}Et[}etkUkEMD]DkEU| kEMt}kE]TkUkEMD]DkEU| kEMD0kE]TEkEUDM;rN kE]TkEtkE]TkELEkEkUMT ++]TEE]U=dt2a)Ph$5dd}u%h(5>dUk`4h.5MAth25UBth55MAth85UBth;5dMythEf8t Uf:t,MAk4h>5*UBk4h>5MkEEUk@M; |U0EE}EMvkEU|uhB5o#kEMthF5Jd=duhN5 kEUtg-H=dt2a)Ph$5dhP5kEM|tikEUD8t ++dEkEMDU;r$ kEMTkEtEɐ-=dt(a)Ph$5hS5d-kEUthV5dkEM|2kEUDkh4hZ5[#kEMthV56dvkEU|t&kEMDphV5h^5d&UBPh5 Eh5dÉU uhع5KÉUEdE ffEf}wGf} r@E E}u> uahع5E@ Eɐ u 1U}xu uh5u Ph 5{h%5eEv}~9 uQE}u5uE뽐hA5YU uEEuv} tڃ} ++tԃ} t΃} tȃ};u" uEEt} ++u렃}/un uE}*tuuj*E u]EEuKv}*u}/u7vEEċEÍvU u EEEv} tk} ++te} t_} tY}:tB})t<}]t6}"t0}/t*}(t$}[tEUE u E렃u uFE;Eu(hL5hu jjUÍvUSd u;(tuj(JuPEDžZ~=k`4Pu E ++븃}uPh5|}u7v uut )uٸZv u)k u :usuPDž~5Pk4u vPvu+Džk@; |v0E ukL u[tuj[DžDž u]uu uAuQkt  DžD ODž9|%kLkCD ++뱐 uu)ukDDž u(uDž u"tuj"DžDž ++ @Pv9|/@P u<\uW u<;u:hP<"u @Pt3 u)tuj) kLuP PpkD ++PCPh5^u} Ph57v u)tuj),]UVSE}Z~n?@ABCDE F$G;HTIiNQRST9UUVmX[^ehl q r5 uP vm y z } ++& ++@ ++˔t ++F ++ ++ #V Y 4u < C F S Z ^ltMyn4 ++Lb8wbKL#5LwH8KgLUZ^?awb\r5 7!899S:m dinit.c/usr/src/build/45423-i386/BUILD/glibc-2.2.4/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/45423-i386/BUILD/glibc-2.2.4/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note# 1((7 0?00GoFTo@c @@l HHu XX ~00P#,@@, @@<@ BBBBpCCC C dKdf7gm@ F Dv(0@H X ++ 0  @@   +2  =HAOL[ qp   P2 Ы Ы       d d"+ 5=̞ L| V  `$h04 p@p{@Y d" P`"p/pHh ++@#)6H` Qp[' mp ++ Їp  "$T 2TC6 MS Sl^ e<ppP|((d9   H  W h$ ++4  "'r 4L >@ In T0.flu( @"`lP`' pp#( 4 BSDb[ k@x initfini.cgcc2_compiled.call_gmon_startinit.ccrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__genpeep.crtl.csawcloseindent.0print_rtxoutfiledump_and_abortread_nameobstack.cobstackxmallocrtx_lengthferror@@GLIBC_2.0print_pathrtvec_allocungetc@@GLIBC_2.0_DYNAMIC__register_frame_info@@GLIBC_2.0strcmp@@GLIBC_2.0mode_unit_sizeread_rtx_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0fflush@@GLIBC_2.0copy_rtxmode_size_obstack_newchunkputchar@@GLIBC_2.0spacesmode_wider_modeftell@@GLIBC_2.0_initmalloc@@GLIBC_2.0_obstack_begin__deregister_frame_info@@GLIBC_2.0n_operandsinsn_code_numberstdout@@GLIBC_2.0stderr@@GLIBC_2.0abort@@GLIBC_2.0debug_rtxfatalrtx_format_startmode_classrtl_obstackstrlen@@GLIBC_2.0max_opnoreg_note_namexreallocrtx_alloc_obstack_allocated_p__bss_startmainnote_insn_name__libc_start_main@@GLIBC_2.0match_rtxrealloc@@GLIBC_2.0gen_peepholeprint_rtldata_startprint_codeprintf@@GLIBC_2.0_fini_obstackobstack_free__cxa_finalize@@GLIBC_2.1.3rtx_nameexit@@GLIBC_2.0atoi@@GLIBC_2.0read_skip_spaces_edatamode_name_IO_putc@@GLIBC_2.0_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endfancy_abort_obstack_freefopen@@GLIBC_2.1_IO_stdin_usedinit_rtl__data_start_IO_getc@@GLIBC_2.0__gmon_start__strcpy@@GLIBC_2.0 +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/genpeep.c alliance/genview/src/gcc-1.42/genpeep.c +--- alliance-5.0/genview/src/gcc-1.42/genpeep.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genpeep.c 2002-09-30 18:20:27.000000000 +0200 +@@ -0,0 +1,460 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Generate code from machine description to perform peephole optimizations. ++ Copyright (C) 1987, 1989 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "obstack.h" ++ ++struct obstack obstack; ++struct obstack *rtl_obstack = &obstack; ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++/* While tree-walking an instruction pattern, we keep a chain ++ of these `struct link's to record how to get down to the ++ current position. In each one, POS is the operand number, ++ and if the operand is a vector VEC is the element number. ++ VEC is -1 if the operand is not a vector. */ ++ ++struct link ++{ ++ struct link *next; ++ int pos; ++ int vecelt; ++}; ++ ++void match_rtx (); ++void gen_exp (); ++void fatal (); ++void fancy_abort (); ++ ++int max_opno; ++ ++/* Number of operands used in current peephole definition. */ ++ ++int n_operands; ++ ++/* Peephole optimizations get insn codes just like insn patterns. ++ Count them so we know the code of the define_peephole we are handling. */ ++ ++int insn_code_number = 0; ++ ++void print_path (); ++void print_code (); ++ ++void ++gen_peephole (peep) ++ rtx peep; ++{ ++ int ninsns = XVECLEN (peep, 0); ++ int i; ++ ++ n_operands = 0; ++ ++ printf (" insn = ins1;\n"); ++#if 0 ++ printf (" want_jump = 0;\n"); ++#endif ++ ++ for (i = 0; i < ninsns; i++) ++ { ++ if (i > 0) ++ { ++ printf (" do { insn = NEXT_INSN (insn);\n"); ++ printf (" if (insn == 0) goto L%d; }\n", ++ insn_code_number); ++ printf (" while (GET_CODE (insn) == NOTE);\n"); ++ ++ printf (" if (GET_CODE (insn) == CODE_LABEL\n\ ++ || GET_CODE (insn) == BARRIER)\n goto L%d;\n", ++ insn_code_number); ++ } ++ ++#if 0 ++ printf (" if (GET_CODE (insn) == JUMP_INSN)\n"); ++ printf (" want_jump = JUMP_LABEL (insn);\n"); ++#endif ++ ++ printf (" pat = PATTERN (insn);\n"); ++ ++ /* Walk the insn's pattern, remembering at all times the path ++ down to the walking point. */ ++ ++ match_rtx (XVECEXP (peep, 0, i), 0, insn_code_number); ++ } ++ ++ /* We get this far if the pattern matches. ++ Now test the extra condition. */ ++ ++ if (XSTR (peep, 1) && XSTR (peep, 1)[0]) ++ printf (" if (! (%s)) goto L%d;\n", ++ XSTR (peep, 1), insn_code_number); ++ ++ /* If that matches, construct new pattern and put it in the first insn. ++ This new pattern will never be matched. ++ It exists only so that insn-extract can get the operands back. ++ So use a simple regular form: a PARALLEL containing a vector ++ of all the operands. */ ++ ++ printf (" PATTERN (ins1) = gen_rtx (PARALLEL, VOIDmode, gen_rtvec_v (%d, operands));\n", n_operands); ++ ++#if 0 ++ printf (" if (want_jump && GET_CODE (ins1) != JUMP_INSN)\n"); ++ printf (" {\n"); ++ printf (" rtx insn2 = emit_jump_insn_before (PATTERN (ins1), ins1);\n"); ++ printf (" delete_insn (ins1);\n"); ++ printf (" ins1 = ins2;\n"); ++ printf (" }\n"); ++#endif ++ ++ /* Record this define_peephole's insn code in the insn, ++ as if it had been recognized to match this. */ ++ printf (" INSN_CODE (ins1) = %d;\n", ++ insn_code_number); ++ ++ /* Delete the remaining insns. */ ++ if (ninsns > 1) ++ printf (" delete_for_peephole (NEXT_INSN (ins1), insn);\n"); ++ ++ /* See reload1.c for insertion of NOTE which guarantees that this ++ cannot be zero. */ ++ printf (" return NEXT_INSN (insn);\n"); ++ ++ printf (" L%d:\n\n", insn_code_number); ++} ++ ++void ++match_rtx (x, path, fail_label) ++ rtx x; ++ struct link *path; ++ int fail_label; ++{ ++ register RTX_CODE code; ++ register int i; ++ register int len; ++ register char *fmt; ++ struct link link; ++ ++ if (x == 0) ++ return; ++ ++ ++ code = GET_CODE (x); ++ ++ switch (code) ++ { ++ case MATCH_OPERAND: ++ if (XINT (x, 0) > max_opno) ++ max_opno = XINT (x, 0); ++ if (XINT (x, 0) >= n_operands) ++ n_operands = 1 + XINT (x, 0); ++ ++ printf (" x = "); ++ print_path (path); ++ printf (";\n"); ++ ++ printf (" operands[%d] = x;\n", XINT (x, 0)); ++ if (XSTR (x, 1) && XSTR (x, 1)[0]) ++ printf (" if (! %s (x, %smode)) goto L%d;\n", ++ XSTR (x, 1), GET_MODE_NAME (GET_MODE (x)), fail_label); ++ return; ++ ++ case MATCH_DUP: ++ printf (" x = "); ++ print_path (path); ++ printf (";\n"); ++ ++ printf (" if (!rtx_equal_p (operands[%d], x)) goto L%d;\n", ++ XINT (x, 0), fail_label); ++ return; ++ ++ case MATCH_OPERATOR: ++ if (XINT (x, 0) > max_opno) ++ max_opno = XINT (x, 0); ++ if (XINT (x, 0) >= n_operands) ++ n_operands = 1 + XINT (x, 0); ++ ++ printf (" x = (rtx)"); ++ print_path (path); ++ printf (";\n"); ++ ++ printf (" operands[%d] = x;\n", XINT (x, 0)); ++ if (XSTR (x, 1) && XSTR (x, 1)[0]) ++ printf (" if (! %s (x, %smode)) goto L%d;\n", ++ XSTR (x, 1), GET_MODE_NAME (GET_MODE (x)), fail_label); ++ link.next = path; ++ link.vecelt = -1; ++ for (i = 0; i < XVECLEN (x, 2); i++) ++ { ++ link.pos = i; ++ match_rtx (XVECEXP (x, 2, i), &link, fail_label); ++ } ++ return; ++ ++ case ADDRESS: ++ match_rtx (XEXP (x, 0), path, fail_label); ++ return; ++ } ++ ++ printf (" x = "); ++ print_path (path); ++ printf (";\n"); ++ ++ printf (" if (GET_CODE (x) != "); ++ print_code (code); ++ printf (") goto L%d;\n", fail_label); ++ ++ if (GET_MODE (x) != VOIDmode) ++ { ++ printf (" if (GET_MODE (x) != %smode) goto L%d;\n", ++ GET_MODE_NAME (GET_MODE (x)), fail_label); ++ } ++ ++ link.next = path; ++ link.vecelt = -1; ++ fmt = GET_RTX_FORMAT (code); ++ len = GET_RTX_LENGTH (code); ++ for (i = 0; i < len; i++) ++ { ++ link.pos = i; ++ if (fmt[i] == 'e' || fmt[i] == 'u') ++ match_rtx (XEXP (x, i), &link, fail_label); ++ else if (fmt[i] == 'E') ++ { ++ int j; ++ printf (" if (XVECLEN (x, %d) != %d) goto L%d;\n", ++ i, XVECLEN (x, i), fail_label); ++ for (j = XVECLEN (x, i) - 1; j >= 0; j--) ++ { ++ link.vecelt = j; ++ match_rtx (XVECEXP (x, i, j), &link, fail_label); ++ } ++ } ++ else if (fmt[i] == 'i') ++ { ++ /* Make sure that at run time `x' is the RTX we want to test. */ ++ if (i != 0) ++ { ++ printf (" x = "); ++ print_path (path); ++ printf (";\n"); ++ } ++ ++ printf (" if (XINT (x, %d) != %d) goto L%d;\n", ++ i, XINT (x, i), fail_label); ++ } ++ else if (fmt[i] == 's') ++ { ++ /* Make sure that at run time `x' is the RTX we want to test. */ ++ if (i != 0) ++ { ++ printf (" x = "); ++ print_path (path); ++ printf (";\n"); ++ } ++ ++ printf (" if (strcmp (XSTR (x, %d), \"%s\")) goto L%d;\n", ++ i, XSTR (x, i), fail_label); ++ } ++ } ++} ++ ++/* Given a PATH, representing a path down the instruction's ++ pattern from the root to a certain point, output code to ++ evaluate to the rtx at that point. */ ++ ++void ++print_path (path) ++ struct link *path; ++{ ++ if (path == 0) ++ printf ("pat"); ++ else if (path->vecelt >= 0) ++ { ++ printf ("XVECEXP ("); ++ print_path (path->next); ++ printf (", %d, %d)", path->pos, path->vecelt); ++ } ++ else ++ { ++ printf ("XEXP ("); ++ print_path (path->next); ++ printf (", %d)", path->pos); ++ } ++} ++ ++void ++print_code (code) ++ RTX_CODE code; ++{ ++ register char *p1; ++ for (p1 = GET_RTX_NAME (code); *p1; p1++) ++ { ++ if (*p1 >= 'a' && *p1 <= 'z') ++ putchar (*p1 + 'A' - 'a'); ++ else ++ putchar (*p1); ++ } ++} ++ ++int ++xmalloc (size) ++{ ++ register int val = malloc (size); ++ ++ if (val == 0) ++ fatal ("virtual memory exhausted"); ++ return val; ++} ++ ++int ++xrealloc (ptr, size) ++ char *ptr; ++ int size; ++{ ++ int result = realloc (ptr, size); ++ if (!result) ++ fatal ("virtual memory exhausted"); ++ return result; ++} ++ ++void ++fatal (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "genpeep: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++ exit (FATAL_EXIT_CODE); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ rtx desc; ++ FILE *infile; ++ extern rtx read_rtx (); ++ register int c; ++ ++ max_opno = -1; ++ ++ obstack_init (rtl_obstack); ++ ++ if (argc <= 1) ++ fatal ("No input file name."); ++ ++ infile = fopen (argv[1], "r"); ++ if (infile == 0) ++ { ++ perror (argv[1]); ++ exit (FATAL_EXIT_CODE); ++ } ++ ++ init_rtl (); ++ ++ printf ("/* Generated automatically by the program `genpeep'\n\ ++from the machine description file `md'. */\n\n"); ++ ++ printf ("#include \"config.h\"\n"); ++ printf ("#include \"rtl.h\"\n"); ++ printf ("#include \"regs.h\"\n"); ++ printf ("#include \"real.h\"\n\n"); ++ ++ printf ("extern rtx peep_operand[];\n\n"); ++ printf ("#define operands peep_operand\n\n"); ++ ++ printf ("rtx\npeephole (ins1)\n rtx ins1;\n{\n"); ++ printf (" rtx insn, x, pat;\n"); ++ printf (" int i;\n\n"); ++ ++ /* Early out: no peepholes for insns followed by barriers. */ ++ printf (" if (NEXT_INSN (ins1)\n"); ++ printf (" && GET_CODE (NEXT_INSN (ins1)) == BARRIER)\n"); ++ printf (" return 0;\n\n"); ++ ++ /* Read the machine description. */ ++ ++ while (1) ++ { ++ c = read_skip_spaces (infile); ++ if (c == EOF) ++ break; ++ ungetc (c, infile); ++ ++ desc = read_rtx (infile); ++ if (GET_CODE (desc) == DEFINE_PEEPHOLE) ++ { ++ gen_peephole (desc); ++ insn_code_number++; ++ } ++ if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND) ++ { ++ insn_code_number++; ++ } ++ } ++ ++ printf (" return 0;\n}\n\n"); ++ ++ if (max_opno == -1) ++ max_opno = 1; ++ ++ printf ("rtx peep_operand[%d];\n", max_opno + 1); ++ ++ fflush (stdout); ++ exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/genrecog alliance/genview/src/gcc-1.42/genrecog +--- alliance-5.0/genview/src/gcc-1.42/genrecog 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genrecog 2002-04-11 09:14:49.000000000 +0200 +@@ -0,0 +1,128 @@ ++ELF4,4 (444@V@V@V@@lt  ]   /lib/ld-linux.so.2GNU%% # $ "  ++!܇Y7^" />,)m<[' L\ ++Tlpzh |"0tTW<H Ë"܈'). E" ('-,t<  "L6\ "l__gmon_start__libc.so.6putcharstrcpyprintfstdoutungetcperror__cxa_finalizemalloc_obstack_newchunkfflushabort_obstack_beginfprintfstrcat__deregister_frame_infoferrorstrncmprealloc_IO_getc_obstack_allocated_pftellstrcmp_obstackstderrobstack_free_obstack_freeexitfopenatoi_IO_putc_IO_stdin_used__libc_start_mainstrlen__register_frame_infofreeGLIBC_2.1GLIBC_2.1.3GLIBC_2.0ii ysi ii #  ++   "$U{f95%%h%h%h%h%h %h(%h0%h8p%h@`%hHP%hP@%hX0%h` %hh%hp%hx%h%h%h%h%h%h%h%hp%h`%hP1^PTRhphQVhUSP[bttЋ]ÉULuIHtt&BHH ++u|t h`L]ÍvU]ÍUthh]Ð&U]ÍUE@ E0E@8uE@@E' j& EUE@BE@hju5EE8t UEBLE,P,4ÐU( j`$E$U$ uUBE@ UBE@ UBE@UB$E@(UB,E@0UB8E@4UB<E@TUB@E@DUBHE@LUBPE@XUB\EE} u U4 E UP uPEE)ĉEuuEE@}u)E@ UBE@EvE@t UB E@UBEEUBEE܃}VU܋E@UB$E@E@UBUB8u ++E@E@ UBPUBP8u ++E@PE'E@UB$E@E@UBUB8u ++E@EE@ U;rE@ @TEEUŠE0uuEP kEt,EE멐E@UB(0UB,0E@E`E@EGUB E=E@ E)ExuUB E ExkE@ EEE0uuEp_EE@ @TEE1uuEp2EEEE0uuEpEE@ @TE^vE@8UE@B5_*UBk4h>53MkEEUk@M; |U0EE}EMvkEU|uhB5#kEMthF5d=duhN5U kEUtg-H=dt2a)Ph$5dhP5kEM|tikEUD8t ++dEkEMDU;r$ kEMTkEtEɐ-=dt(a)Ph$53hS5d-kEUthV5dkEM|2kEUDkh4hZ5#kEMthV5vdvkEU|t&kEMDphV55h^5d&UBPh5IEh5dÉU uh5ÉUEdE ffEf}wGf} r@E E}u> uah5#E@ Eɐ u 1U}xu uh5u Ph 5h%5Ev}~9 uE}u5u_E뽐hA5AU uUEEuv} tڃ} ++tԃ} t΃} tȃ};u" uEEt} ++u렃}/un uE}*tuuj*E uEEuKv}*u}/u7vEEċEÍvU u EEEv} tk} ++te} t_} tY}:tB})t<}]t6}"t0}/t*}(t$}[tEUE u E렃u uE;Eu(hL5u jjUÍvUSd u;(tuj(JuPEDžZ~=k`4Pu E ++븃}uPh5}u7v ut )uٸZv u)k u :usuPDž~5Pk4u vPvukDžk@; |v0E ukL u[tuj[DžDž u]uuS uAuQkt  DžD ODž9|%kLkCD ++뱐 uu)ukDDž u(uDž u"tuj"DžDž ++ @Pv9|/@P) uY<\uW u(<;u:hP<"u @PRt3 u)tuj) kLuP PkD ++PCPh5u Ph5wv u)tuj),]UVSE}Z~= 0) return tem; ++ goto L%d; ++ return recog_%d (x0, insn); ++ } ++ if (GET_MODE (x%d) != %smode) ++ { ++ goto L%d; ++ } ++ goto ret0; ++ if (GET_CODE (x%d) != ) ++ { goto L%d; } ++ switch (GET_MODE (x%d)) ++ { ++ switch (GET_CODE (x%d)) ++ { ++ case %smode: ++ case : ++ if (x%d == %sGET_CODE (x%d) == && GET_MODE (x%d) == %smode && XINT (x%d, 0) == %d && XVECLEN (x%d, 0) == %d && XINT (x%d, 1) == %d && rtx_equal_p (x%d, recog_operand[%d]) && %s (x%d, %smode)1) ++ { recog_operand[%d] = x%d; ) ++ if (%s) return %d;goto L%d; } ++ ++ break; ++ goto L%d; ++ goto ret0; ++ x%d = recog_addr_dummy; ++ XEXP (x%d, 0) = x%d; ++ x%d = XVECEXP (x%d, 0, %d); ++ x%d = XEXP (x%d, %c); ++ virtual memory exhaustedgenrecog: after %d instruction definitions ++Internal gcc abort.No input file name.r/* Generated automatically by the program `genrecog' ++from the machine description file `md'. */ ++ ++#include "config.h" ++#include "rtl.h" ++#include "insn-config.h" ++#include "recog.h" ++#include "real.h" ++ ++/* `recog' contains a decision tree ++ that recognizes whether the rtx X0 is a valid instruction. ++ ++ recog returns -1 if the rtx is not valid. ++ If the rtx is valid, recog returns a nonnegative number ++ which is the insn code number for the pattern that matched. ++ This is the same as the order in the machine description of ++ the entry that matched. This number can be used as an index into ++ insn_templates and insn_n_operands (found in insn-output.c) ++ or as an argument to output_insn_hairy (also in insn-output.c). */ ++ ++rtx recog_operand[MAX_RECOG_OPERANDS]; ++ ++rtx *recog_operand_loc[MAX_RECOG_OPERANDS]; ++ ++rtx *recog_dup_loc[MAX_DUP_OPERANDS]; ++ ++char recog_dup_num[MAX_DUP_OPERANDS]; ++ ++extern rtx recog_addr_dummy; ++ ++#define operands recog_operand ++ ++int ++recog (x0, insn) ++ register rtx x0; ++ rtx insn; ++{ ++ ret0: return -1; ++} ++zero_extractsign_extractffssqrtabsunsigned_fixunsigned_floatfixfloatfloat_truncatefloat_extendtruncatezero_extendsign_extendltuleugtugeultlegtgeeqnepost_incpost_decpre_incpre_decrotatertlshiftrtashiftrtrotateashiftlshiftnotxoriorandumodudivumultmoddivmultnegminuspluscompareif_then_elsequeuedcc0symbol_reflabel_refmemstrict_low_partsubregregpcconstconst_doubleconst_intreturncallclobberusesetaddr_diff_vecaddr_vecasm_operandsasm_inputparallelinline_headernotecode_labelbarriercall_insnjump_insninsnaddresssequencedefine_expanddefine_combinedefine_peepholedefine_insnmatch_operatormatch_dupmatch_operandinsn_listexpr_listnilUnKnownEPBLKBICTFCXFCDFCSFCHFCQFCTICDICSICHICQITFXFDFSFHFQFTIDIPDISIPSIHIQIVOIDeeeeeeeeu00eie0iieEssiEEsisiuuiiiiiiiiiuusniuui0iuuiuueiee0iuueieeeEsEssEssEssSsEssSisEiissueee*NOTE_INSN_LOOP_CONTNOTE_INSN_SETJMPNOTE_INSN_FUNCTION_ENDNOTE_INSN_LOOP_ENDNOTE_INSN_LOOP_BEGNOTE_INSN_BLOCK_ENDNOTE_INSN_BLOCK_BEGNOTE_INSN_DELETEDNOTE_INSN_FUNCTION_BEGREG_UNSETREG_NONNEGREG_LIBCALLREG_RETVALREG_EQUALREG_WAS_0REG_EQUIVREG_INCREG_DEAD ((((((((((((  (  ((((    ++%s(nil)(%s/s/v/u/i:%s "" ("%s") [ ] %d %s 0switch format wrong in rtl.print_rtx(). format was: %c. ++)D                                 \                    (    X    \ Ȳ ++Expected character %c. Found character %c. At file position: %ld ++Following characters are: ++ Aborting. ++missing name or numberUnknown rtx read in rtl.read_rtx(). Code name was %s .\n\tswitch format wrong in rtl.read_rtx(). format was: %c. ++ file position: %ld ++pppppppppppppppppppppppppppppppppغpppppppppppppppppppp(pppp(pppp$p~n_QH@;1'soeZVOB:5/+&" ++~ri\MGC4'# 0-*&#  ++     ~u~qkeYWOLKFKC?WK9555L:&Kxmc "2BRbrˆ҈"2BRbr  p(X ++y ̆oooBdd9<Hr0,V1V cV$[Lby !"#3%K&a1x234568 9";B=X>n?@ABCDE F$G;HTIiNQRST9UUVmX[^ehl q r5 uP vm y z } ++& ++@ ++˔t ++F ++ ++ #V Y 4u < C F S Z ^ltMyn4 ++Lb8wbKL#5LwH8KgLUZ^?awb\r5 7!899S:m dinit.c/usr/src/build/45423-i386/BUILD/glibc-2.2.4/csu/gcc2_compiled.int:t(0,1)=r(0,1);-2147483648;2147483647;char:t(0,2)=r(0,2);0;127;long int:t(0,3)=r(0,3);-2147483648;2147483647;unsigned int:t(0,4)=r(0,4);0000000000000;0037777777777;long unsigned int:t(0,5)=r(0,5);0000000000000;0037777777777;long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;long long unsigned int:t(0,7)=@s64;r(0,7);0000000000000;01777777777777777777777;short int:t(0,8)=@s16;r(0,8);-32768;32767;short unsigned int:t(0,9)=@s16;r(0,9);0;65535;signed char:t(0,10)=@s8;r(0,10);-128;127;unsigned char:t(0,11)=@s8;r(0,11);0;255;float:t(0,12)=r(0,1);4;0;double:t(0,13)=r(0,1);8;0;long double:t(0,14)=r(0,1);12;0;complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;complex float:t(0,16)=r(0,16);8;0;complex double:t(0,17)=r(0,17);16;0;complex long double:t(0,18)=r(0,18);24;0;__builtin_va_list:t(0,19)=*(0,20)=(0,20)../include/libc-symbols.h/usr/src/build/45423-i386/BUILD/glibc-2.2.4/build-i386-linux/config.h../sysdeps/gnu/_G_config.h../sysdeps/unix/sysv/linux/bits/types.h../include/features.h../include/sys/cdefs.h../misc/sys/cdefs.h/usr/lib/gcc-lib/i386-redhat-linux/2.96/include/stddef.hsize_t:t(8,1)=(0,4)__u_char:t(4,1)=(0,11)__u_short:t(4,2)=(0,9)__u_int:t(4,3)=(0,4)__u_long:t(4,4)=(0,5)__u_quad_t:t(4,5)=(0,7)__quad_t:t(4,6)=(0,6)__int8_t:t(4,7)=(0,10)__uint8_t:t(4,8)=(0,11)__int16_t:t(4,9)=(0,8)__uint16_t:t(4,10)=(0,9)__int32_t:t(4,11)=(0,1)__uint32_t:t(4,12)=(0,4)__int64_t:t(4,13)=(0,6)__uint64_t:t(4,14)=(0,7)__qaddr_t:t(4,15)=(4,16)=*(4,6)__dev_t:t(4,17)=(4,5)__uid_t:t(4,18)=(4,3)__gid_t:t(4,19)=(4,3)__ino_t:t(4,20)=(4,4)__mode_t:t(4,21)=(4,3)__nlink_t:t(4,22)=(4,3)__off_t:t(4,23)=(0,3)__loff_t:t(4,24)=(4,6)__pid_t:t(4,25)=(0,1)__ssize_t:t(4,26)=(0,1)__rlim_t:t(4,27)=(4,4)__rlim64_t:t(4,28)=(4,5)__id_t:t(4,29)=(4,3)__fsid_t:t(4,30)=(4,31)=s8__val:(4,32)=ar(4,33)=r(4,33);0000000000000;0037777777777;;0;1;(0,1),0,64;;__daddr_t:t(4,34)=(0,1)__caddr_t:t(4,35)=(4,36)=*(0,2)__time_t:t(4,37)=(0,3)__useconds_t:t(4,38)=(0,4)__suseconds_t:t(4,39)=(0,3)__swblk_t:t(4,40)=(0,3)__clock_t:t(4,41)=(0,3)__clockid_t:t(4,42)=(0,1)__timer_t:t(4,43)=(0,1)__key_t:t(4,44)=(0,1)__ipc_pid_t:t(4,45)=(0,9)__blksize_t:t(4,46)=(0,3)__blkcnt_t:t(4,47)=(0,3)__blkcnt64_t:t(4,48)=(4,6)__fsblkcnt_t:t(4,49)=(4,4)__fsblkcnt64_t:t(4,50)=(4,5)__fsfilcnt_t:t(4,51)=(4,4)__fsfilcnt64_t:t(4,52)=(4,5)__ino64_t:t(4,53)=(4,5)__off64_t:t(4,54)=(4,24)__t_scalar_t:t(4,55)=(0,3)__t_uscalar_t:t(4,56)=(0,5)__intptr_t:t(4,57)=(0,1)__socklen_t:t(4,58)=(0,4)../linuxthreads/sysdeps/pthread/bits/pthreadtypes.h../sysdeps/unix/sysv/linux/bits/sched.h__sched_param:T(10,1)=s4__sched_priority:(0,1),0,32;;_pthread_fastlock:T(9,1)=s8__status:(0,3),0,32;__spinlock:(0,1),32,32;;_pthread_descr:t(9,2)=(9,3)=*(9,4)=xs_pthread_descr_struct:__pthread_attr_s:T(9,5)=s36__detachstate:(0,1),0,32;__schedpolicy:(0,1),32,32;__schedparam:(10,1),64,32;__inheritsched:(0,1),96,32;__scope:(0,1),128,32;__guardsize:(8,1),160,32;__stackaddr_set:(0,1),192,32;__stackaddr:(0,19),224,32;__stacksize:(8,1),256,32;;pthread_attr_t:t(9,6)=(9,5)pthread_cond_t:t(9,7)=(9,8)=s12__c_lock:(9,1),0,64;__c_waiting:(9,2),64,32;;pthread_condattr_t:t(9,9)=(9,10)=s4__dummy:(0,1),0,32;;pthread_key_t:t(9,11)=(0,4)pthread_mutex_t:t(9,12)=(9,13)=s24__m_reserved:(0,1),0,32;__m_count:(0,1),32,32;__m_owner:(9,2),64,32;__m_kind:(0,1),96,32;__m_lock:(9,1),128,64;;pthread_mutexattr_t:t(9,14)=(9,15)=s4__mutexkind:(0,1),0,32;;pthread_once_t:t(9,16)=(0,1)_pthread_rwlock_t:T(9,17)=s32__rw_lock:(9,1),0,64;__rw_readers:(0,1),64,32;__rw_writer:(9,2),96,32;__rw_read_waiting:(9,2),128,32;__rw_write_waiting:(9,2),160,32;__rw_kind:(0,1),192,32;__rw_pshared:(0,1),224,32;;pthread_rwlock_t:t(9,18)=(9,17)pthread_rwlockattr_t:t(9,19)=(9,20)=s8__lockkind:(0,1),0,32;__pshared:(0,1),32,32;;pthread_spinlock_t:t(9,21)=(0,1)pthread_barrier_t:t(9,22)=(9,23)=s20__ba_lock:(9,1),0,64;__ba_required:(0,1),64,32;__ba_present:(0,1),96,32;__ba_waiting:(9,2),128,32;;pthread_barrierattr_t:t(9,24)=(9,25)=s4__pshared:(0,1),0,32;;pthread_t:t(9,26)=(0,5)wchar_t:t(11,1)=(0,3)wint_t:t(11,2)=(0,4)../include/wchar.h../wcsmbs/wchar.h../sysdeps/unix/sysv/linux/i386/bits/wchar.h__mbstate_t:t(13,1)=(13,2)=s8__count:(0,1),0,32;__value:(13,3)=u4__wch:(11,2),0,32;__wchb:(13,4)=ar(4,33);0;3;(0,2),0,32;;,32,32;;_G_fpos_t:t(3,1)=(3,2)=s12__pos:(4,23),0,32;__state:(13,1),32,64;;_G_fpos64_t:t(3,3)=(3,4)=s16__pos:(4,54),0,64;__state:(13,1),64,64;;../include/gconv.h../iconv/gconv.h :T(17,1)=e__GCONV_OK:0,__GCONV_NOCONV:1,__GCONV_NODB:2,__GCONV_NOMEM:3,__GCONV_EMPTY_INPUT:4,__GCONV_FULL_OUTPUT:5,__GCONV_ILLEGAL_INPUT:6,__GCONV_INCOMPLETE_INPUT:7,__GCONV_ILLEGAL_DESCRIPTOR:8,__GCONV_INTERNAL_ERROR:9,; :T(17,2)=e__GCONV_IS_LAST:1,__GCONV_IGNORE_ERRORS:2,;__gconv_fct:t(17,3)=(17,4)=*(17,5)=f(0,1)__gconv_init_fct:t(17,6)=(17,7)=*(17,8)=f(0,1)__gconv_end_fct:t(17,9)=(17,10)=*(17,11)=f(0,20)__gconv_trans_fct:t(17,12)=(17,13)=*(17,14)=f(0,1)__gconv_trans_context_fct:t(17,15)=(17,16)=*(17,17)=f(0,1)__gconv_trans_query_fct:t(17,18)=(17,19)=*(17,20)=f(0,1)__gconv_trans_init_fct:t(17,21)=(17,22)=*(17,23)=f(0,1)__gconv_trans_end_fct:t(17,24)=(17,25)=*(17,26)=f(0,20)__gconv_trans_data:T(17,27)=s20__trans_fct:(17,12),0,32;__trans_context_fct:(17,15),32,32;__trans_end_fct:(17,24),64,32;__data:(0,19),96,32;__next:(17,28)=*(17,27),128,32;;__gconv_step:T(17,29)=s56__shlib_handle:(17,30)=*(17,31)=xs__gconv_loaded_object:,0,32;__modname:(17,32)=*(0,2),32,32;__counter:(0,1),64,32;__from_name:(4,36),96,32;__to_name:(4,36),128,32;__fct:(17,3),160,32;__init_fct:(17,6),192,32;__end_fct:(17,9),224,32;__min_needed_from:(0,1),256,32;__max_needed_from:(0,1),288,32;__min_needed_to:(0,1),320,32;__max_needed_to:(0,1),352,32;__stateful:(0,1),384,32;__data:(0,19),416,32;;__gconv_step_data:T(17,33)=s36__outbuf:(17,34)=*(0,11),0,32;__outbufend:(17,34),32,32;__flags:(0,1),64,32;__invocation_counter:(0,1),96,32;__internal_use:(0,1),128,32;__statep:(17,35)=*(13,1),160,32;__state:(13,1),192,64;__trans:(17,28),256,32;;__gconv_info:T(17,36)=s8__nsteps:(8,1),0,32;__steps:(17,37)=*(17,29),32,32;__data:(17,38)=ar(4,33);0;-1;(17,33),64,0;;__gconv_t:t(17,39)=(17,40)=*(17,36)_G_iconv_t:t(3,5)=(3,6)=u44__cd:(17,36),0,64;__combined:(3,7)=s44__cd:(17,36),0,64;__data:(17,33),64,288;;,0,352;;_G_int16_t:t(3,8)=(0,8)_G_int32_t:t(3,9)=(0,1)_G_uint16_t:t(3,10)=(0,9)_G_uint32_t:t(3,11)=(0,4)_IO_stdin_used:G(0,1)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-85)GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)01.0101.0101.0101.0101.0101.0101.0101.01.symtab.strtab.shstrtab.interp.note.ABI-tag.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.got.rel.bss.rel.plt.init.plt.text.fini.rodata.data.eh_frame.ctors.dtors.got.dynamic.sbss.bss.stab.stabstr.comment.note# 1((07 XXP?GoBBJTo@c ̆l Ԇu  ~̇ 7ppAA @@V@ \\\\x  ]]] ] de~7` ++F d(XB̆Ԇ  ++ ̇  p@    +2 Љ =HAOL[Љ q0 @ p P2 0 0 `  p     d#,T 6>( Mص W h a$iT4 q@p|܇Y"  Pw " /p h /,)B4  M<_` hpr' L3 ? p\ ++ ȕj  lph |"8& DVhTyp6 & \7 l" o l <pP(9   <H ,8 =$Ih$Xu(,̈"܈'  q @ r .p0] &G 3 @"\`le$ r( ~ ' 4 p,< $  2LCR$F Z [ c@p\ linitfini.cgcc2_compiled.call_gmon_startinit.ccrtstuff.cp.0__DTOR_LIST__completed.1__do_global_dtors_aux__EH_FRAME_BEGIN__fini_dummyobject.2frame_dummyinit_dummyforce_to_data__CTOR_LIST____do_global_ctors_aux__CTOR_END____DTOR_END____FRAME_END__genrecog.crtl.csawcloseindent.0print_rtxoutfiledump_and_abortread_nameobstack.cobstackxmallocrtx_lengthferror@@GLIBC_2.0rtvec_allocungetc@@GLIBC_2.0_DYNAMICbreak_out_subroutines__register_frame_info@@GLIBC_2.0strcmp@@GLIBC_2.0mode_unit_sizeread_rtx_fp_hwperror@@GLIBC_2.0fprintf@@GLIBC_2.0write_treefflush@@GLIBC_2.0copy_rtxmode_size_obstack_newchunkputchar@@GLIBC_2.0spacestry_merge_1same_modesmode_wider_modeftell@@GLIBC_2.0concatwrite_subroutine_initmalloc@@GLIBC_2.0_obstack_begin__deregister_frame_info@@GLIBC_2.0clear_codesstdout@@GLIBC_2.0stderr@@GLIBC_2.0abort@@GLIBC_2.0debug_rtxclear_modessame_codesmybzerofatalrtx_format_startmode_classrtl_obstackstrlen@@GLIBC_2.0reg_note_namexreallocrtx_allocstrncmp@@GLIBC_2.0_obstack_allocated_p__bss_startmainnext_numbernote_insn_name__libc_start_main@@GLIBC_2.0next_subroutine_numbernext_insn_coderealloc@@GLIBC_2.0strcat@@GLIBC_2.0print_rtladd_to_sequencedata_startprint_codeprintf@@GLIBC_2.0_fini_obstackdupcountmerge_treesno_same_modeobstack_free__cxa_finalize@@GLIBC_2.1.3rtx_namechange_statetry_merge_2exit@@GLIBC_2.0atoi@@GLIBC_2.0read_skip_spacesfirstmake_insn_sequence_edatamode_name_IO_putc@@GLIBC_2.0_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endfancy_abort_obstack_freefopen@@GLIBC_2.1_IO_stdin_usedcopystrinit_rtl__data_start_IO_getc@@GLIBC_2.0__gmon_start__strcpy@@GLIBC_2.0 +\ No newline at end of file +diff -Naur alliance-5.0/genview/src/gcc-1.42/genrecog.c alliance/genview/src/gcc-1.42/genrecog.c +--- alliance-5.0/genview/src/gcc-1.42/genrecog.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/genrecog.c 2002-09-30 18:20:28.000000000 +0200 +@@ -0,0 +1,1118 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Generate code from machine description to emit insns as rtl. ++ Copyright (C) 1987,1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++/* This program is used to produce insn-recog.c, which contains ++ a function called `recog' plus its subroutines. ++ These functions contain a decision tree ++ that recognizes whether an rtx, the argument given to recog, ++ is a valid instruction. ++ ++ recog returns -1 if the rtx is not valid. ++ If the rtx is valid, recog returns a nonnegative number ++ which is the insn code number for the pattern that matched. ++ This is the same as the order in the machine description of the ++ entry that matched. This number can be used as an index into ++ insn_templates and insn_n_operands (found in insn-output.c) ++ or as an argument to output_insn_hairy (also in insn-output.c). */ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "obstack.h" ++ ++struct obstack obstack; ++struct obstack *rtl_obstack = &obstack; ++ ++#define obstack_chunk_alloc xmalloc ++#define obstack_chunk_free free ++extern int xmalloc (); ++extern void free (); ++ ++/* Data structure for decision tree for recognizing ++ legitimate instructions. */ ++ ++struct decision ++{ ++ int number; ++ char *position; ++ RTX_CODE code; ++ char *exact; ++ enum machine_mode mode; ++ char *tests; ++ int insn_code_number; ++ struct decision *next; ++ struct decision *success; ++ int opno; ++ int dupno; ++ int dupcount; ++ int test_elt_zero_int; ++ int elt_zero_int; ++ int test_elt_one_int; ++ int elt_one_int; ++ int ignmode; ++ struct decision *afterward; ++ int label_needed; ++ char *c_test; ++ char *reg_class; ++ char enforce_mode; ++ int veclen; ++ int subroutine_number; ++}; ++ ++#define SUBROUTINE_THRESHOLD 50 ++ ++int next_subroutine_number; ++ ++/* ++recognize (top) ++{ ++ staten: ++ x = XVECEXP (top, 0, 3); ++ if (test_code (GET_CODE (x)) ++ && test_mode (MODE (x)) ++ && whatever_else) ++ goto statep; ++ else if (next one...) ++ goto statem: ++ goto stater; ++ ++ statep: ++ actions...; ++ return 1; ++ ++ statem: ++ x = stack[depth--]; ++ more tests...; ++ ++ stateq: ++ stack[++depth] = x; ++ x = XEXP (stack[depth], 0); ++ more tests...; ++ ++ stater: ++ x = XEXP (stack[depth], 1); ++} ++ ++*/ ++ ++int next_number; ++ ++int next_insn_code; ++ ++/* Number of MATCH_DUP's seen so far in this instruction. */ ++int dupcount; ++ ++struct decision *add_to_sequence (); ++struct decision *try_merge_2 (); ++void write_subroutine (); ++void print_code (); ++void clear_codes (); ++void clear_modes (); ++void change_state (); ++void write_tree (); ++char *copystr (); ++char *concat (); ++void fatal (); ++void fancy_abort (); ++void mybzero (); ++ ++struct decision *first; ++ ++/* Construct and return a sequence of decisions ++ that will recognize INSN. */ ++ ++struct decision * ++make_insn_sequence (insn) ++ rtx insn; ++{ ++ rtx x; ++ char *c_test = XSTR (insn, 2); ++ struct decision *last; ++ ++ dupcount = 0; ++ ++ if (XVECLEN (insn, 1) == 1) ++ x = XVECEXP (insn, 1, 0); ++ else ++ { ++ x = rtx_alloc (PARALLEL); ++ XVEC (x, 0) = XVEC (insn, 1); ++ PUT_MODE (x, VOIDmode); ++ } ++ ++ last = add_to_sequence (x, 0, ""); ++ ++ if (c_test[0]) ++ last->c_test = c_test; ++ last->insn_code_number = next_insn_code++; ++ ++ return first; ++} ++ ++struct decision * ++add_to_sequence (pattern, last, position) ++ rtx pattern; ++ struct decision *last; ++ char *position; ++{ ++ register RTX_CODE code; ++ register struct decision *new ++ = (struct decision *) xmalloc (sizeof (struct decision)); ++ struct decision *this; ++ char *newpos; ++ register char *fmt; ++ register int i; ++ int depth; ++ int len; ++ ++ new->number = next_number++; ++ new->position = copystr (position); ++ new->exact = 0; ++ new->next = 0; ++ new->success = 0; ++ new->insn_code_number = -1; ++ new->tests = 0; ++ new->opno = -1; ++ new->dupno = -1; ++ new->dupcount = -1; ++ new->test_elt_zero_int = 0; ++ new->test_elt_one_int = 0; ++ new->elt_zero_int = 0; ++ new->elt_one_int = 0; ++ new->enforce_mode = 0; ++ new->ignmode = 0; ++ new->afterward = 0; ++ new->label_needed = 0; ++ new->c_test = 0; ++ new->reg_class = 0; ++ new->veclen = 0; ++ new->subroutine_number = 0; ++ ++ this = new; ++ ++ if (last == 0) ++ first = new; ++ else ++ last->success = new; ++ ++ depth = strlen (position); ++ newpos = (char *) alloca (depth + 2); ++ strcpy (newpos, position); ++ newpos[depth + 1] = 0; ++ ++ restart: ++ ++ if (pattern == 0) ++ { ++ new->exact = "0"; ++ new->code = UNKNOWN; ++ new->mode = VOIDmode; ++ return new; ++ } ++ ++ switch (GET_MODE (pattern)) ++ { ++ case 0: ++ new->mode = VOIDmode; ++ break; ++ ++ default: ++ new->mode = GET_MODE (pattern); ++ break; ++ } ++ ++ new->code = code = GET_CODE (pattern); ++ ++ switch (code) ++ { ++ case MATCH_OPERAND: ++ new->opno = XINT (pattern, 0); ++ new->code = UNKNOWN; ++ new->tests = XSTR (pattern, 1); ++ if (*new->tests == 0) ++ new->tests = 0; ++ new->reg_class = XSTR (pattern, 2); ++ if (*new->reg_class == 0) ++ new->reg_class = 0; ++ return new; ++ ++ case MATCH_OPERATOR: ++ new->opno = XINT (pattern, 0); ++ new->code = UNKNOWN; ++ new->tests = XSTR (pattern, 1); ++ if (*new->tests == 0) ++ new->tests = 0; ++ for (i = 0; i < XVECLEN (pattern, 2); i++) ++ { ++ newpos[depth] = i + '0'; ++ new = add_to_sequence (XVECEXP (pattern, 2, i), new, newpos); ++ } ++ this->success->enforce_mode = 0; ++ return new; ++ ++ case MATCH_DUP: ++ new->dupno = XINT (pattern, 0); ++ new->dupcount = dupcount++; ++ new->code = UNKNOWN; ++ return new; ++ ++ case ADDRESS: ++ pattern = XEXP (pattern, 0); ++ goto restart; ++ ++ case PC: ++ new->exact = "pc_rtx"; ++ return new; ++ ++ case CC0: ++ new->exact = "cc0_rtx"; ++ return new; ++ ++ case CONST_INT: ++ if (INTVAL (pattern) == 0) ++ { ++ new->exact = "const0_rtx"; ++ return new; ++ } ++ if (INTVAL (pattern) == 1) ++ { ++ new->exact = "const1_rtx"; ++ return new; ++ } ++ break; ++ ++ case SET: ++ newpos[depth] = '0'; ++ new = add_to_sequence (SET_DEST (pattern), new, newpos); ++ this->success->enforce_mode = 1; ++ newpos[depth] = '1'; ++ new = add_to_sequence (SET_SRC (pattern), new, newpos); ++ return new; ++ ++ case STRICT_LOW_PART: ++ newpos[depth] = '0'; ++ new = add_to_sequence (XEXP (pattern, 0), new, newpos); ++ this->success->enforce_mode = 1; ++ return new; ++ ++ case SUBREG: ++ this->test_elt_one_int = 1; ++ this->elt_one_int = XINT (pattern, 1); ++ newpos[depth] = '0'; ++ new = add_to_sequence (XEXP (pattern, 0), new, newpos); ++ this->success->enforce_mode = 1; ++ return new; ++ ++ case ZERO_EXTRACT: ++ case SIGN_EXTRACT: ++ newpos[depth] = '0'; ++ new = add_to_sequence (XEXP (pattern, 0), new, newpos); ++ this->success->enforce_mode = 1; ++ newpos[depth] = '1'; ++ new = add_to_sequence (XEXP (pattern, 1), new, newpos); ++ newpos[depth] = '2'; ++ new = add_to_sequence (XEXP (pattern, 2), new, newpos); ++ return new; ++ } ++ ++ fmt = GET_RTX_FORMAT (code); ++ len = GET_RTX_LENGTH (code); ++ for (i = 0; i < len; i++) ++ { ++ newpos[depth] = '0' + i; ++ if (fmt[i] == 'e' || fmt[i] == 'u') ++ new = add_to_sequence (XEXP (pattern, i), new, newpos); ++ else if (fmt[i] == 'i' && i == 0) ++ { ++ this->test_elt_zero_int = 1; ++ this->elt_zero_int = XINT (pattern, i); ++ } ++ else if (fmt[i] == 'i' && i == 1) ++ { ++ this->test_elt_one_int = 1; ++ this->elt_one_int = XINT (pattern, i); ++ } ++ else if (fmt[i] == 'E') ++ { ++ register int j; ++ /* We do not handle a vector appearing as other than ++ the first item, just because nothing uses them ++ and by handling only the special case ++ we can use one element in newpos for either ++ the item number of a subexpression ++ or the element number in a vector. */ ++ if (i != 0) ++ abort (); ++ this->veclen = XVECLEN (pattern, i); ++ for (j = 0; j < XVECLEN (pattern, i); j++) ++ { ++ newpos[depth] = 'a' + j; ++ new = add_to_sequence (XVECEXP (pattern, i, j), ++ new, newpos); ++ } ++ } ++ else if (fmt[i] != '0') ++ abort (); ++ } ++ return new; ++} ++ ++/* Merge two decision trees OLD and ADD, ++ modifying OLD destructively, ++ and return the merged tree. */ ++ ++struct decision * ++merge_trees (old, add) ++ register struct decision *old, *add; ++{ ++ while (add) ++ { ++ register struct decision *next = add->next; ++ add->next = 0; ++ if (!try_merge_1 (old, add)) ++ old = try_merge_2 (old, add); ++ add = next; ++ } ++ return old; ++} ++ ++/* Merge ADD into the next-chain starting with OLD ++ only if it overlaps a condition already tested in OLD. ++ Returns 1 if successful (OLD is modified), ++ 0 if nothing has been done. */ ++ ++int ++try_merge_1 (old, add) ++ register struct decision *old, *add; ++{ ++ while (old) ++ { ++ if ((old->position == add->position ++ || (old->position && add->position ++ && !strcmp (old->position, add->position))) ++ && (old->tests == add->tests ++ || (old->tests && add->tests && !strcmp (old->tests, add->tests))) ++ && (old->c_test == add->c_test ++ || (old->c_test && add->c_test && !strcmp (old->c_test, add->c_test))) ++ && old->test_elt_zero_int == add->test_elt_zero_int ++ && old->elt_zero_int == add->elt_zero_int ++ && old->test_elt_one_int == add->test_elt_one_int ++ && old->elt_one_int == add->elt_one_int ++ && old->veclen == add->veclen ++ && old->dupno == add->dupno ++ && old->opno == add->opno ++ && (old->tests == 0 ++ || (add->enforce_mode ? no_same_mode (old) : old->next == 0)) ++ && old->code == add->code ++ && old->mode == add->mode) ++ { ++ old->success = merge_trees (old->success, add->success); ++ if (old->insn_code_number >= 0 && add->insn_code_number >= 0) ++ fatal ("Two actions at one point in tree."); ++ if (old->insn_code_number == -1) ++ old->insn_code_number = add->insn_code_number; ++ return 1; ++ } ++ old = old->next; ++ } ++ return 0; ++} ++ ++/* Merge ADD into the next-chain that starts with OLD, ++ preferably after something that tests the same place ++ that ADD does. ++ The next-chain of ADD itself is ignored, and it is set ++ up for entering ADD into the new chain. ++ Returns the new chain. */ ++ ++struct decision * ++try_merge_2 (old, add) ++ struct decision *old, *add; ++{ ++ register struct decision *p; ++ struct decision *last = 0; ++ struct decision *last_same_place = 0; ++ ++ /* Put this in after the others that test the same place, ++ if there are any. If not, find the last chain element ++ and insert there. ++ ++ One modification: if this one is NOT a MATCH_OPERAND, ++ put it before any MATCH_OPERANDS that test the same place. ++ ++ Another: if enforce_mode (i.e. this is first operand of a SET), ++ put this after the last thing that tests the same place for ++ the same mode. */ ++ ++ int operand = 0 != add->tests; ++ ++ for (p = old; p; p = p->next) ++ { ++ if (p->position == add->position ++ || (p->position && add->position ++ && !strcmp (p->position, add->position))) ++ { ++ last_same_place = p; ++ /* If enforce_mode, segregate the modes in numerical order. */ ++ if (p->enforce_mode && (int) add->mode < (int) p->mode) ++ break; ++#if 0 ++ /* Keep explicit decompositions before those that test predicates. ++ If enforce_mode, do this separately within each mode. */ ++ if (! p->enforce_mode || p->mode == add->mode) ++ if (!operand && p->tests) ++ break; ++#endif ++ } ++ /* If this is past the end of the decisions at the same place as ADD, ++ stop looking now; add ADD before here. */ ++ else if (last_same_place) ++ break; ++ last = p; ++ } ++ ++ /* Insert before P, which means after LAST. */ ++ ++ if (last) ++ { ++ add->next = last->next; ++ last->next = add; ++ return old; ++ } ++ ++ add->next = old; ++ return add; ++} ++ ++int ++no_same_mode (node) ++ struct decision *node; ++{ ++ register struct decision *p; ++ register enum machine_mode mode = node->mode; ++ ++ for (p = node->next; p; p = p->next) ++ if (p->mode == mode) ++ return 0; ++ ++ return 1; ++} ++ ++/* Count the number of subnodes of node NODE, assumed to be the start ++ of a next-chain. If the number is high enough, make NODE start ++ a separate subroutine in the C code that is generated. */ ++ ++int ++break_out_subroutines (node) ++ struct decision *node; ++{ ++ int size = 0; ++ struct decision *sub; ++ for (sub = node; sub; sub = sub->next) ++ size += 1 + break_out_subroutines (sub->success); ++ if (size > SUBROUTINE_THRESHOLD) ++ { ++ node->subroutine_number = ++next_subroutine_number; ++ write_subroutine (node); ++ size = 1; ++ } ++ return size; ++} ++ ++void ++write_subroutine (tree) ++ struct decision *tree; ++{ ++ printf ("int\nrecog_%d (x0, insn)\n register rtx x0;\n rtx insn;\n{\n", ++ tree->subroutine_number); ++ printf (" register rtx x1, x2, x3, x4, x5;\n rtx x6, x7, x8, x9, x10, x11;\n"); ++ printf (" int tem;\n"); ++ write_tree (tree, "", 0, "", 1); ++ printf (" ret0: return -1;\n}\n\n"); ++} ++ ++/* Write out C code to perform the decisions in the tree. */ ++ ++void ++write_tree (tree, prevpos, afterward, afterpos, initial) ++ struct decision *tree; ++ char *prevpos; ++ int afterward; ++ char *afterpos; ++ int initial; ++{ ++ register struct decision *p, *p1; ++ char *pos; ++ register int depth; ++ int ignmode; ++ enum anon1 { NO_SWITCH, CODE_SWITCH, MODE_SWITCH } in_switch = NO_SWITCH; ++ char modemap[NUM_MACHINE_MODES]; ++ char codemap[NUM_RTX_CODE]; ++ ++ pos = prevpos; ++ ++ if (tree->subroutine_number > 0 && ! initial) ++ { ++ printf (" L%d:\n", tree->number); ++ ++ if (afterward) ++ { ++ printf (" tem = recog_%d (x0, insn);\n", ++ tree->subroutine_number); ++ printf (" if (tem >= 0) return tem;\n"); ++ change_state (pos, afterpos); ++ printf (" goto L%d;\n", afterward); ++ } ++ else ++ printf (" return recog_%d (x0, insn);\n", ++ tree->subroutine_number); ++ return; ++ } ++ ++ tree->label_needed = 1; ++ for (p = tree; p; p = p->next) ++ { ++ /* Find the next alternative to p ++ that might be true when p is true. ++ Test that one next if p's successors fail. ++ Note that when the `tests' field is nonzero ++ it is up to the specified test-function to compare machine modes ++ and some (such as general_operand) don't always do so. ++ But when inside a switch-on-modes we ignore this and ++ consider all modes mutually exclusive. */ ++ for (p1 = p->next; p1; p1 = p1->next) ++ if (((p->code == UNKNOWN || p1->code == UNKNOWN || p->code == p1->code) ++ && (p->mode == VOIDmode || p1->mode == VOIDmode ++ || p->mode == p1->mode ++ || (in_switch != MODE_SWITCH && (p->tests || p1->tests)))) ++ || strcmp (p1->position, p->position)) ++ break; ++ p->afterward = p1; ++ if (p1) p1->label_needed = 1; ++ ++ if (in_switch == MODE_SWITCH ++ && (p->mode == VOIDmode || (! p->enforce_mode && p->tests != 0))) ++ { ++ in_switch = NO_SWITCH; ++ printf (" }\n"); ++ } ++ if (in_switch == CODE_SWITCH && p->code == UNKNOWN) ++ { ++ in_switch = NO_SWITCH; ++ printf (" }\n"); ++ } ++ ++ if (p->label_needed) ++ printf (" L%d:\n", p->number); ++ ++ if (p->success == 0 && p->insn_code_number < 0) ++ abort (); ++ ++ change_state (pos, p->position); ++ pos = p->position; ++ depth = strlen (pos); ++ ++ ignmode = p->ignmode || pos[depth - 1] == '*' || p->tests; ++ ++ if (in_switch == NO_SWITCH) ++ { ++ /* If p and its alternatives all want the same mode, ++ reject all others at once, first, then ignore the mode. */ ++ if (!ignmode && p->mode != VOIDmode && p->next && same_modes (p, p->mode)) ++ { ++ printf (" if (GET_MODE (x%d) != %smode)\n", ++ depth, GET_MODE_NAME (p->mode)); ++ if (afterward) ++ { ++ printf (" {\n "); ++ change_state (pos, afterpos); ++ printf (" goto L%d;\n }\n", afterward); ++ } ++ else ++ printf (" goto ret0;\n"); ++ clear_modes (p); ++ ignmode = 1; ++ } ++ ++ /* If p and its alternatives all want the same code, ++ reject all others at once, first, then ignore the code. */ ++ if (p->code != UNKNOWN && p->next && same_codes (p, p->code)) ++ { ++ printf (" if (GET_CODE (x%d) != ", depth); ++ print_code (p->code); ++ printf (")\n"); ++ if (afterward) ++ { ++ printf (" {"); ++ change_state (pos, afterpos); ++ printf (" goto L%d; }\n", afterward); ++ } ++ else ++ printf (" goto ret0;\n"); ++ clear_codes (p); ++ } ++ } ++ ++ /* If p and its alternatives all have different modes ++ and there are at least 4 of them, make a switch. */ ++ if (in_switch == NO_SWITCH && pos[depth-1] != '*') ++ { ++ register int i; ++ int lose = 0; ++ ++ mybzero (modemap, sizeof modemap); ++ for (p1 = p, i = 0; ++ (p1 && p1->mode != VOIDmode ++ && (p1->tests == 0 || p1->enforce_mode)); ++ p1 = p1->next, i++) ++ { ++ if (! p->enforce_mode && modemap[(int) p1->mode]) ++ { ++ lose = 1; ++ break; ++ } ++ modemap[(int) p1->mode] = 1; ++ } ++ if (!lose && i >= 4) ++ { ++ in_switch = MODE_SWITCH; ++ printf (" switch (GET_MODE (x%d))\n {\n", depth); ++ } ++ } ++ ++ if (in_switch == NO_SWITCH) ++ { ++ register int i; ++ mybzero (codemap, sizeof codemap); ++ for (p1 = p, i = 0; p1 && p1->code != UNKNOWN; p1 = p1->next, i++) ++ { ++ if (codemap[(int) p1->code]) ++ break; ++ codemap[(int) p1->code] = 1; ++ } ++ if ((p1 == 0 || p1->code == UNKNOWN) && i >= 4) ++ { ++ in_switch = CODE_SWITCH; ++ printf (" switch (GET_CODE (x%d))\n {\n", depth); ++ } ++ } ++ ++ if (in_switch == MODE_SWITCH) ++ { ++ if (modemap[(int) p->mode]) ++ { ++ printf (" case %smode:\n", GET_MODE_NAME (p->mode)); ++ modemap[(int) p->mode] = 0; ++ } ++ } ++ if (in_switch == CODE_SWITCH) ++ { ++ if (codemap[(int) p->code]) ++ { ++ printf (" case "); ++ print_code (p->code); ++ printf (":\n"); ++ codemap[(int) p->code] = 0; ++ } ++ } ++ ++ printf (" if ("); ++ if (p->exact || (p->code != UNKNOWN && in_switch != CODE_SWITCH)) ++ { ++ if (p->exact) ++ printf ("x%d == %s", depth, p->exact); ++ else ++ { ++ printf ("GET_CODE (x%d) == ", depth); ++ print_code (p->code); ++ } ++ printf (" && "); ++ } ++ if (p->mode != VOIDmode && !ignmode && in_switch != MODE_SWITCH) ++ printf ("GET_MODE (x%d) == %smode && ", ++ depth, GET_MODE_NAME (p->mode)); ++ if (p->test_elt_zero_int) ++ printf ("XINT (x%d, 0) == %d && ", depth, p->elt_zero_int); ++ if (p->veclen) ++ printf ("XVECLEN (x%d, 0) == %d && ", depth, p->veclen); ++ if (p->test_elt_one_int) ++ printf ("XINT (x%d, 1) == %d && ", depth, p->elt_one_int); ++ if (p->dupno >= 0) ++ printf ("rtx_equal_p (x%d, recog_operand[%d]) && ", depth, p->dupno); ++ if (p->tests) ++ printf ("%s (x%d, %smode)", p->tests, depth, ++ GET_MODE_NAME (p->mode)); ++ else ++ printf ("1"); ++ ++ if (p->opno >= 0) ++ printf (")\n { recog_operand[%d] = x%d; ", ++ p->opno, depth); ++ else ++ printf (")\n "); ++ ++ if (p->c_test) ++ printf ("if (%s) ", p->c_test); ++ ++ if (p->insn_code_number >= 0) ++ printf ("return %d;", p->insn_code_number); ++ else ++ printf ("goto L%d;", p->success->number); ++ ++ if (p->opno >= 0) ++ printf (" }\n"); ++ else ++ printf ("\n"); ++ ++ /* Now, if inside a switch, branch to next switch member ++ that might also need to be tested if this one fails. */ ++ ++ if (in_switch == CODE_SWITCH) ++ { ++ /* Find the next alternative to p ++ that might be applicable if p was applicable. */ ++ for (p1 = p->next; p1; p1 = p1->next) ++ if (p1->code == UNKNOWN || p->code == p1->code) ++ break; ++ if (p1 == 0 || p1->code == UNKNOWN) ++ printf (" break;\n"); ++ else if (p1 != p->next) ++ { ++ printf (" goto L%d;\n", p1->number); ++ p1->label_needed = 1; ++ } ++ } ++ ++ if (in_switch == MODE_SWITCH) ++ { ++ /* Find the next alternative to p ++ that might be applicable if p was applicable. */ ++ for (p1 = p->next; p1; p1 = p1->next) ++ if (p1->mode == VOIDmode || p->mode == p1->mode) ++ break; ++ if (p1 == 0 || p1->mode == VOIDmode) ++ printf (" break;\n"); ++ else if (p1 != p->next) ++ { ++ printf (" goto L%d;\n", p1->number); ++ p1->label_needed = 1; ++ } ++ } ++ } ++ ++ if (in_switch != NO_SWITCH) ++ printf (" }\n"); ++ ++ if (afterward) ++ { ++ change_state (pos, afterpos); ++ printf (" goto L%d;\n", afterward); ++ } ++ else ++ printf (" goto ret0;\n"); ++ ++ for (p = tree; p; p = p->next) ++ if (p->success) ++ { ++ { ++ pos = p->position; ++ write_tree (p->success, pos, ++ p->afterward ? p->afterward->number : afterward, ++ p->afterward ? pos : afterpos, ++ 0); ++ } ++ } ++} ++ ++void ++print_code (code) ++ RTX_CODE code; ++{ ++ register char *p1; ++ for (p1 = GET_RTX_NAME (code); *p1; p1++) ++ { ++ if (*p1 >= 'a' && *p1 <= 'z') ++ putchar (*p1 + 'A' - 'a'); ++ else ++ putchar (*p1); ++ } ++} ++ ++int ++same_codes (p, code) ++ register struct decision *p; ++ register RTX_CODE code; ++{ ++ for (; p; p = p->next) ++ if (p->code != code) ++ return 0; ++ ++ return 1; ++} ++ ++void ++clear_codes (p) ++ register struct decision *p; ++{ ++ for (; p; p = p->next) ++ p->code = UNKNOWN; ++} ++ ++int ++same_modes (p, mode) ++ register struct decision *p; ++ register enum machine_mode mode; ++{ ++ for (; p; p = p->next) ++ if (p->mode != mode || p->tests) ++ return 0; ++ ++ return 1; ++} ++ ++void ++clear_modes (p) ++ register struct decision *p; ++{ ++ for (; p; p = p->next) ++ p->ignmode = 1; ++} ++ ++void ++change_state (oldpos, newpos) ++ char *oldpos; ++ char *newpos; ++{ ++ int odepth = strlen (oldpos); ++ int depth = odepth; ++ int ndepth = strlen (newpos); ++ ++ /* Pop up as many levels as necessary. */ ++ ++ while (strncmp (oldpos, newpos, depth)) ++ --depth; ++ ++ /* Go down to desired level. */ ++ ++ while (depth < ndepth) ++ { ++ if (newpos[depth] == '*') ++ printf (" x%d = recog_addr_dummy;\n XEXP (x%d, 0) = x%d;\n", ++ depth + 1, depth + 1, depth); ++ else if (newpos[depth] >= 'a' && newpos[depth] <= 'z') ++ printf (" x%d = XVECEXP (x%d, 0, %d);\n", ++ depth + 1, depth, newpos[depth] - 'a'); ++ else ++ printf (" x%d = XEXP (x%d, %c);\n", ++ depth + 1, depth, newpos[depth]); ++ ++depth; ++ } ++} ++ ++char * ++copystr (s1) ++ char *s1; ++{ ++ register char *tem; ++ ++ if (s1 == 0) ++ return 0; ++ ++ tem = (char *) xmalloc (strlen (s1) + 1); ++ strcpy (tem, s1); ++ ++ return tem; ++} ++ ++void ++mybzero (b, length) ++ register char *b; ++ register int length; ++{ ++ while (length-- > 0) ++ *b++ = 0; ++} ++ ++char * ++concat (s1, s2) ++ char *s1, *s2; ++{ ++ register char *tem; ++ ++ if (s1 == 0) ++ return s2; ++ if (s2 == 0) ++ return s1; ++ ++ tem = (char *) xmalloc (strlen (s1) + strlen (s2) + 2); ++ strcpy (tem, s1); ++ strcat (tem, " "); ++ strcat (tem, s2); ++ ++ return tem; ++} ++ ++int ++xrealloc (ptr, size) ++ char *ptr; ++ int size; ++{ ++ int result = realloc (ptr, size); ++ if (!result) ++ fatal ("virtual memory exhausted"); ++ return result; ++} ++ ++int ++xmalloc (size) ++{ ++ register int val = malloc (size); ++ ++ if (val == 0) ++ fatal ("virtual memory exhausted"); ++ return val; ++} ++ ++void ++fatal (s, a1, a2) ++ char *s; ++{ ++ fprintf (stderr, "genrecog: "); ++ fprintf (stderr, s, a1, a2); ++ fprintf (stderr, "\n"); ++ fprintf (stderr, "after %d instruction definitions\n", ++ next_insn_code); ++ exit (FATAL_EXIT_CODE); ++} ++ ++/* More 'friendly' abort that prints the line and file. ++ config.h can #define abort fancy_abort if you like that sort of thing. */ ++ ++void ++fancy_abort () ++{ ++ fatal ("Internal gcc abort."); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ rtx desc; ++ struct decision *tree = 0; ++ FILE *infile; ++ extern rtx read_rtx (); ++ register int c; ++ ++ obstack_init (rtl_obstack); ++ ++ if (argc <= 1) ++ fatal ("No input file name."); ++ ++ infile = fopen (argv[1], "r"); ++ if (infile == 0) ++ { ++ perror (argv[1]); ++ exit (FATAL_EXIT_CODE); ++ } ++ ++ init_rtl (); ++ next_insn_code = 0; ++ ++ printf ("/* Generated automatically by the program `genrecog'\n\ ++from the machine description file `md'. */\n\n"); ++ ++ /* Read the machine description. */ ++ ++ while (1) ++ { ++ c = read_skip_spaces (infile); ++ if (c == EOF) ++ break; ++ ungetc (c, infile); ++ ++ desc = read_rtx (infile); ++ if (GET_CODE (desc) == DEFINE_INSN) ++ tree = merge_trees (tree, make_insn_sequence (desc)); ++ if (GET_CODE (desc) == DEFINE_PEEPHOLE ++ || GET_CODE (desc) == DEFINE_EXPAND) ++ next_insn_code++; ++ } ++ ++ printf ("#include \"config.h\"\n"); ++ printf ("#include \"rtl.h\"\n"); ++ printf ("#include \"insn-config.h\"\n"); ++ printf ("#include \"recog.h\"\n"); ++ printf ("#include \"real.h\"\n"); ++ printf ("\n\ ++/* `recog' contains a decision tree\n\ ++ that recognizes whether the rtx X0 is a valid instruction.\n\ ++\n\ ++ recog returns -1 if the rtx is not valid.\n\ ++ If the rtx is valid, recog returns a nonnegative number\n\ ++ which is the insn code number for the pattern that matched.\n"); ++ printf (" This is the same as the order in the machine description of\n\ ++ the entry that matched. This number can be used as an index into\n\ ++ insn_templates and insn_n_operands (found in insn-output.c)\n\ ++ or as an argument to output_insn_hairy (also in insn-output.c). */\n\n"); ++ ++ printf ("rtx recog_operand[MAX_RECOG_OPERANDS];\n\n"); ++ printf ("rtx *recog_operand_loc[MAX_RECOG_OPERANDS];\n\n"); ++ printf ("rtx *recog_dup_loc[MAX_DUP_OPERANDS];\n\n"); ++ printf ("char recog_dup_num[MAX_DUP_OPERANDS];\n\n"); ++ printf ("extern rtx recog_addr_dummy;\n\n"); ++ printf ("#define operands recog_operand\n\n"); ++ ++ break_out_subroutines (tree); ++ ++ printf ("int\nrecog (x0, insn)\n register rtx x0;\n rtx insn;\n{\n"); ++ printf (" register rtx x1, x2, x3, x4, x5;\n rtx x6, x7, x8, x9, x10, x11;\n"); ++ printf (" int tem;\n"); ++ ++ write_tree (tree, "", 0, "", 1); ++ printf (" ret0: return -1;\n}\n"); ++ ++ fflush (stdout); ++ exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/global-alloc.c alliance/genview/src/gcc-1.42/global-alloc.c +--- alliance-5.0/genview/src/gcc-1.42/global-alloc.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/global-alloc.c 2002-09-30 18:20:28.000000000 +0200 +@@ -0,0 +1,1114 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Allocate registers for pseudo-registers that span basic blocks. ++ Copyright (C) 1987, 1988 Free Software Foundation, Inc. ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 1, or (at your option) ++any later version. ++ ++GNU CC is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ++ ++ ++#include ++#include "config.h" ++#include "rtl.h" ++#include "flags.h" ++#include "basic-block.h" ++#include "hard-reg-set.h" ++#include "regs.h" ++#include "insn-config.h" ++ ++/* This pass of the compiler performs global register allocation. ++ It assigns hard register numbers to all the pseudo registers ++ that were not handled in local_alloc. Assignments are recorded ++ in the vector reg_renumber, not by changing the rtl code. ++ (Such changes are made by final). The entry point is ++ the function global_alloc. ++ ++ After allocation is complete, the reload pass is run as a subroutine ++ of this pass, so that when a pseudo reg loses its hard reg due to ++ spilling it is possible to make a second attempt to find a hard ++ reg for it. The reload pass is independent in other respects ++ and it is run even when stupid register allocation is in use. ++ ++ 1. count the pseudo-registers still needing allocation ++ and assign allocation-numbers (allocnos) to them. ++ Set up tables reg_allocno and allocno_reg to map ++ reg numbers to allocnos and vice versa. ++ max_allocno gets the number of allocnos in use. ++ ++ 2. Allocate a max_allocno by max_allocno conflict bit matrix and clear it. ++ Allocate a max_allocno by FIRST_PSEUDO_REGISTER conflict matrix ++ for conflicts between allocnos and explicit hard register use ++ (which includes use of pseudo-registers allocated by local_alloc). ++ ++ 3. for each basic block ++ walk forward through the block, recording which ++ unallocated registers and which hardware registers are live. ++ Build the conflict matrix between the unallocated registers ++ and another of unallocated registers versus hardware registers. ++ Also record the preferred hardware registers ++ for each unallocated one. ++ ++ 4. Sort a table of the allocnos into order of ++ desirability of the variables. ++ ++ 5. Allocate the variables in that order; each if possible into ++ a preferred register, else into another register. */ ++ ++/* Number of pseudo-registers still requiring allocation ++ (not allocated by local_allocate). */ ++ ++static int max_allocno; ++ ++/* Indexed by (pseudo) reg number, gives the allocno, or -1 ++ for pseudo registers already allocated by local_allocate. */ ++ ++static int *reg_allocno; ++ ++/* Indexed by allocno, gives the reg number. */ ++ ++static int *allocno_reg; ++ ++/* A vector of the integers from 0 to max_allocno-1, ++ sorted in the order of first-to-be-allocated first. */ ++ ++static int *allocno_order; ++ ++/* Indexed by an allocno, gives the number of consecutive ++ hard registers needed by that pseudo reg. */ ++ ++static int *allocno_size; ++ ++/* max_allocno by max_allocno array of bits, ++ recording whether two allocno's conflict (can't go in the same ++ hardware register). ++ ++ `conflicts' is not symmetric; a conflict between allocno's i and j ++ is recorded either in element i,j or in element j,i. */ ++ ++static int *conflicts; ++ ++/* Number of ints require to hold max_allocno bits. ++ This is the length of a row in `conflicts'. */ ++ ++static int allocno_row_words; ++ ++/* Two macros to test or store 1 in an element of `conflicts'. */ ++ ++#define CONFLICTP(I, J) \ ++ (conflicts[(I) * allocno_row_words + (J) / INT_BITS] \ ++ & (1 << ((J) % INT_BITS))) ++ ++#define SET_CONFLICT(I, J) \ ++ (conflicts[(I) * allocno_row_words + (J) / INT_BITS] \ ++ |= (1 << ((J) % INT_BITS))) ++ ++/* Set of hard regs currently live (during scan of all insns). */ ++ ++static HARD_REG_SET hard_regs_live; ++ ++/* Indexed by N, set of hard regs conflicting with allocno N. */ ++ ++static HARD_REG_SET *hard_reg_conflicts; ++ ++/* Indexed by N, set of hard regs preferred by allocno N. ++ This is used to make allocnos go into regs that are copied to or from them, ++ when possible, to reduce register shuffling. */ ++ ++static HARD_REG_SET *hard_reg_preferences; ++ ++/* Set of registers that some allocno has a preference for. */ ++ ++static HARD_REG_SET regs_someone_prefers; ++ ++/* Set of registers that global-alloc isn't supposed to use. */ ++ ++static HARD_REG_SET no_global_alloc_regs; ++ ++/* Test a bit in TABLE, a vector of HARD_REG_SETs, ++ for vector element I, and hard register number J. */ ++ ++#define REGBITP(TABLE, I, J) TEST_HARD_REG_BIT (TABLE[I], J) ++ ++/* Set to 1 a bit in a vector of HARD_REG_SETs. Works like REGBITP. */ ++ ++#define SET_REGBIT(TABLE, I, J) SET_HARD_REG_BIT (TABLE[I], J) ++ ++/* Bit mask for allocnos live at current point in the scan. */ ++ ++static int *allocnos_live; ++ ++#define INT_BITS HOST_BITS_PER_INT ++ ++/* Test, set or clear bit number I in allocnos_live, ++ a bit vector indexed by allocno. */ ++ ++#define ALLOCNO_LIVE_P(I) \ ++ (allocnos_live[(I) / INT_BITS] & (1 << ((I) % INT_BITS))) ++ ++#define SET_ALLOCNO_LIVE(I) \ ++ (allocnos_live[(I) / INT_BITS] |= (1 << ((I) % INT_BITS))) ++ ++#define CLEAR_ALLOCNO_LIVE(I) \ ++ (allocnos_live[(I) / INT_BITS] &= ~(1 << ((I) % INT_BITS))) ++ ++/* Record all regs that are set in any one insn. ++ Communication from mark_reg_{store,clobber} and global_conflicts. */ ++ ++static rtx *regs_set; ++static int n_regs_set; ++ ++static int allocno_compare (); ++static void mark_reg_store (); ++static void mark_reg_clobber (); ++static void mark_reg_live_nc (); ++static void mark_reg_death (); ++static void dump_conflicts (); ++static void find_reg (); ++static void global_conflicts (); ++static void record_conflicts (); ++static void set_preference (); ++ ++/* Perform allocation of pseudo-registers not allocated by local_alloc. ++ FILE is a file to output debugging information on, ++ or zero if such output is not desired. */ ++ ++void ++global_alloc (file) ++ FILE *file; ++{ ++ register int i; ++ ++ max_allocno = 0; ++ ++ CLEAR_HARD_REG_SET (regs_someone_prefers); ++ ++ /* A machine may have certain hard registers that ++ are safe to use only within a basic block. */ ++ ++ CLEAR_HARD_REG_SET (no_global_alloc_regs); ++#ifdef OVERLAPPING_REGNO_P ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ if (OVERLAPPING_REGNO_P (i)) ++ SET_HARD_REG_BIT (no_global_alloc_regs, i); ++#endif ++ ++ /* Establish mappings from register number to allocation number ++ and vice versa. In the process, count the allocnos. */ ++ ++ reg_allocno = (int *) alloca (max_regno * sizeof (int)); ++ ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ reg_allocno[i] = -1; ++ ++ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ++ /* Note that reg_live_length[i] < 0 indicates a "constant" reg ++ that we are supposed to refrain from putting in a hard reg. ++ -2 means do make an allocno but don't allocate it. */ ++ if (reg_n_refs[i] != 0 && reg_renumber[i] < 0 && reg_live_length[i] != -1) ++ { ++ reg_allocno[i] = max_allocno++; ++ if (reg_live_length[i] == 0) ++ abort (); ++ } ++ else ++ reg_allocno[i] = -1; ++ ++ allocno_reg = (int *) alloca (max_allocno * sizeof (int)); ++ allocno_size = (int *) alloca (max_allocno * sizeof (int)); ++ bzero (allocno_size, max_allocno * sizeof (int)); ++ ++ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ++ if (reg_allocno[i] >= 0) ++ { ++ allocno_reg[reg_allocno[i]] = i; ++ allocno_size[reg_allocno[i]] = PSEUDO_REGNO_SIZE (i); ++ } ++ ++ /* Allocate the space for the conflict tables. */ ++ ++ hard_reg_conflicts = (HARD_REG_SET *) ++ alloca (max_allocno * sizeof (HARD_REG_SET)); ++ bzero (hard_reg_conflicts, max_allocno * sizeof (HARD_REG_SET)); ++ ++ hard_reg_preferences = (HARD_REG_SET *) ++ alloca (max_allocno * sizeof (HARD_REG_SET)); ++ bzero (hard_reg_preferences, max_allocno * sizeof (HARD_REG_SET)); ++ ++ allocno_row_words = (max_allocno + INT_BITS - 1) / INT_BITS; ++ ++ conflicts = (int *) ++ alloca (max_allocno * allocno_row_words * sizeof (int)); ++ bzero (conflicts, max_allocno * allocno_row_words * sizeof (int)); ++ ++ allocnos_live = (int *) alloca (allocno_row_words * sizeof (int)); ++ ++ /* If there is work to be done (at least one reg to allocate), ++ perform global conflict analysis and allocate the regs. */ ++ ++ if (max_allocno > 0) ++ { ++ /* Scan all the insns and compute the conflicts among allocnos ++ and between allocnos and hard regs. */ ++ ++ global_conflicts (); ++ ++ /* Determine the order to allocate the remaining pseudo registers. */ ++ ++ allocno_order = (int *) alloca (max_allocno * sizeof (int)); ++ for (i = 0; i < max_allocno; i++) ++ allocno_order[i] = i; ++ ++ /* Default the size to 1, since allocno_compare uses it to divide by. */ ++ ++ for (i = 0; i < max_allocno; i++) ++ if (allocno_size[i] == 0) ++ allocno_size[i] = 1; ++ ++ qsort (allocno_order, max_allocno, sizeof (int), allocno_compare); ++ ++ if (file) ++ dump_conflicts (file); ++ ++ /* Try allocating them, one by one, in that order, ++ except for parameters marked with reg_live_length[regno] == -2. */ ++ ++ for (i = 0; i < max_allocno; i++) ++ if (reg_live_length[allocno_reg[allocno_order[i]]] >= 0) ++ { ++ /* If we have more than one register class, ++ first try allocating in the class that is cheapest ++ for this pseudo-reg. If that fails, try any reg. */ ++ if (N_REG_CLASSES > 1) ++ { ++ find_reg (allocno_order[i], 0, 0, 0, ++ hard_reg_preferences[allocno_order[i]]); ++ if (reg_renumber[allocno_reg[allocno_order[i]]] >= 0) ++ continue; ++ } ++ if (!reg_preferred_or_nothing (allocno_reg[allocno_order[i]])) ++ find_reg (allocno_order[i], 0, 1, 0, ++ hard_reg_preferences[allocno_order[i]]); ++ } ++ } ++ ++ /* Do the reloads now while the allocno data still exist, so that we can ++ try to assign new hard regs to any pseudo regs that are spilled. */ ++ ++ if (n_basic_blocks > 0) ++ reload (basic_block_head[0], 1, file); ++} ++ ++/* Sort predicate for ordering the allocnos. ++ Returns -1 (1) if *v1 should be allocated before (after) *v2. */ ++ ++static int ++allocno_compare (v1, v2) ++ int *v1, *v2; ++{ ++ register int r1 = allocno_reg[*v1]; ++ register int r2 = allocno_reg[*v2]; ++ /* Note that the quotient will never be bigger than ++ the value of floor_log2 times the maximum number of ++ times a register can occur in one insn (surely less than 100). ++ Multiplying this by 10000 can't overflow. */ ++ register int pri1 ++ = (((double) (floor_log2 (reg_n_refs[r1]) * reg_n_refs[r1]) ++ / (reg_live_length[r1] * allocno_size[*v1])) ++ * 10000); ++ register int pri2 ++ = (((double) (floor_log2 (reg_n_refs[r2]) * reg_n_refs[r2]) ++ / (reg_live_length[r2] * allocno_size[*v2])) ++ * 10000); ++ if (pri2 - pri1) ++ return pri2 - pri1; ++ ++ /* If regs are equally good, sort by allocno, ++ so that the results of qsort leave nothing to chance. */ ++ return *v1 - *v2; ++} ++ ++/* Scan the rtl code and record all conflicts in the conflict matrices. */ ++ ++static void ++global_conflicts () ++{ ++ register int b, i; ++ register rtx insn; ++ short *block_start_allocnos; ++ ++ /* Make a vector that mark_reg_{store,clobber} will store in. */ ++ regs_set = (rtx *) alloca (max_parallel * sizeof (rtx) * 2); ++ ++ block_start_allocnos = (short *) alloca (max_allocno * sizeof (short)); ++ ++ for (b = 0; b < n_basic_blocks; b++) ++ { ++ bzero (allocnos_live, allocno_row_words * sizeof (int)); ++ ++ /* Initialize table of registers currently live ++ to the state at the beginning of this basic block. ++ This also marks the conflicts among them. ++ ++ For pseudo-regs, there is only one bit for each one ++ no matter how many hard regs it occupies. ++ This is ok; we know the size from PSEUDO_REGNO_SIZE. ++ For explicit hard regs, we cannot know the size that way ++ since one hard reg can be used with various sizes. ++ Therefore, we must require that all the hard regs ++ implicitly live as part of a multi-word hard reg ++ are explicitly marked in basic_block_live_at_start. */ ++ ++ { ++ register int offset, bit; ++ register regset old = basic_block_live_at_start[b]; ++ int ax = 0; ++ ++#ifdef HARD_REG_SET ++ hard_regs_live = old[0]; ++#else ++ COPY_HARD_REG_SET (hard_regs_live, old); ++#endif ++ for (offset = 0, i = 0; offset < regset_size; offset++) ++ if (old[offset] == 0) ++ i += HOST_BITS_PER_INT; ++ else ++ for (bit = 1; bit; bit <<= 1, i++) ++ { ++ if (i >= max_regno) ++ break; ++ if (old[offset] & bit) ++ { ++ register int a = reg_allocno[i]; ++ if (a >= 0) ++ { ++ SET_ALLOCNO_LIVE (a); ++ block_start_allocnos[ax++] = a; ++ } ++ else if ((a = reg_renumber[i]) >= 0) ++ mark_reg_live_nc (a, PSEUDO_REGNO_MODE (i)); ++ } ++ } ++ ++ /* Record that each allocno now live conflicts with each other ++ allocno now live, and with each hard reg now live. */ ++ ++ record_conflicts (block_start_allocnos, ax); ++ } ++ ++ insn = basic_block_head[b]; ++ ++ /* Scan the code of this basic block, noting which allocnos ++ and hard regs are born or die. When one is born, ++ record a conflict with all others currently live. */ ++ ++ while (1) ++ { ++ register RTX_CODE code = GET_CODE (insn); ++ register rtx link; ++ ++ /* Make regs_set an empty set. */ ++ ++ n_regs_set = 0; ++ ++ if (code == INSN || code == CALL_INSN || code == JUMP_INSN) ++ { ++ /* Mark any registers clobbered by INSN as live, ++ so they conflict with the inputs. */ ++ ++ note_stores (PATTERN (insn), mark_reg_clobber); ++ ++ /* Mark any registers dead after INSN as dead now. */ ++ ++ for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ++ if (REG_NOTE_KIND (link) == REG_DEAD) ++ mark_reg_death (XEXP (link, 0)); ++ ++ /* Mark any registers set in INSN as live, ++ and mark them as conflicting with all other live regs. ++ Clobbers are processed again, so they conflict with ++ the registers that are set. */ ++ ++ note_stores (PATTERN (insn), mark_reg_store); ++ ++ /* Mark any registers both set and dead after INSN as dead. ++ This is not redundant! ++ A register may be set and killed in the same insn. ++ It is necessary to mark them as live, above, to get ++ the right conflicts within the insn. */ ++ ++ while (n_regs_set > 0) ++ if (find_regno_note (insn, REG_DEAD, REGNO (regs_set[--n_regs_set]))) ++ mark_reg_death (regs_set[n_regs_set]); ++ ++ /*???The following seems to be incorrect. */ ++ /* Likewise for regs set by incrementation. */ ++ ++ for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ++ if (REG_NOTE_KIND (link) == REG_INC ++ && find_regno_note (insn, REG_DEAD, REGNO (XEXP (link, 0)))) ++ mark_reg_death (XEXP (link, 0)); ++ } ++ ++ if (insn == basic_block_end[b]) ++ break; ++ insn = NEXT_INSN (insn); ++ } ++ } ++} ++ ++/* Assign a hard register to ALLOCNO; look for one that is the beginning ++ of a long enough stretch of hard regs none of which conflicts with ALLOCNO. ++ The registers marked in PREFREGS are tried first. ++ ++ If ALL_REGS_P is zero, consider only the preferred class of ALLOCNO's reg. ++ Otherwise ignore that preferred class. ++ ++ If ACCEPT_CALL_CLOBBERED is nonzero, accept a call-clobbered hard reg that ++ will have to be saved and restored at calls. ++ ++ If we find one, record it in reg_renumber. ++ If not, do nothing. */ ++ ++static void ++find_reg (allocno, losers, all_regs_p, accept_call_clobbered, prefregs) ++ int allocno; ++ register short *losers; ++ int all_regs_p; ++ int accept_call_clobbered; ++ HARD_REG_SET prefregs; ++{ ++ register int i, prefreg, pass; ++#ifdef HARD_REG_SET ++ register /* Declare it register if it's a scalar. */ ++#endif ++ HARD_REG_SET used; ++ ++ enum reg_class class ++ = all_regs_p ? GENERAL_REGS : reg_preferred_class (allocno_reg[allocno]); ++ enum machine_mode mode = PSEUDO_REGNO_MODE (allocno_reg[allocno]); ++ ++ if (accept_call_clobbered) ++ COPY_HARD_REG_SET (used, call_fixed_reg_set); ++ else if (reg_n_calls_crossed[allocno_reg[allocno]] == 0) ++ COPY_HARD_REG_SET (used, fixed_reg_set); ++ else ++ COPY_HARD_REG_SET (used, call_used_reg_set); ++ ++ /* Some registers should not be allocated in global-alloc. */ ++ IOR_HARD_REG_SET (used, no_global_alloc_regs); ++ ++ IOR_COMPL_HARD_REG_SET (used, reg_class_contents[(int) class]); ++ IOR_HARD_REG_SET (used, hard_reg_conflicts[allocno]); ++ if (frame_pointer_needed) ++ SET_HARD_REG_BIT (used, FRAME_POINTER_REGNUM); ++ ++ AND_COMPL_HARD_REG_SET (prefregs, used); ++ ++ /* Try to find a register from the preferred set first. */ ++ ++ i = -1; ++ for (prefreg = 0; prefreg < FIRST_PSEUDO_REGISTER; prefreg++) ++ if (TEST_HARD_REG_BIT (prefregs, prefreg) ++ && (losers == 0 || losers[prefreg] < 0) ++ && HARD_REGNO_MODE_OK (prefreg, mode)) ++ { ++ register int j; ++ register int lim = prefreg + HARD_REGNO_NREGS (prefreg, mode); ++ for (j = prefreg + 1; ++ (j < lim ++ && ! TEST_HARD_REG_BIT (used, j) ++ && (losers == 0 || losers[j] < 0)); ++ j++); ++ if (j == lim) ++ { ++ i = prefreg; ++ break; ++ } ++ } ++ ++#if 0 ++ /* Otherwise try each hard reg to see if it fits. Do this in two passes. ++ In the first pass, skip registers that are prefered by some pseudo to ++ give it a better chance of getting one of those registers. Only if ++ we can't get a register when excluding those do we take one of them. */ ++ ++ /* This is turned off because it makes worse allocation on the 68020. */ ++ for (pass = 0; pass <= 1 && i < 0; pass++) ++#endif ++ pass = 1; ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ { ++#ifdef REG_ALLOC_ORDER ++ int regno = reg_alloc_order[i]; ++#else ++ int regno = i; ++#endif ++ if (! TEST_HARD_REG_BIT (used, regno) ++ && (losers == 0 || losers[regno] < 0) ++ && (pass == 1 || ! TEST_HARD_REG_BIT (regs_someone_prefers, regno)) ++ && HARD_REGNO_MODE_OK (regno, mode)) ++ { ++ register int j; ++ register int lim = regno + HARD_REGNO_NREGS (regno, mode); ++ for (j = regno + 1; ++ (j < lim ++ && ! TEST_HARD_REG_BIT (used, j) ++ && (losers == 0 || losers[j] < 0)); ++ j++); ++ if (j == lim) ++ { ++ i = regno; ++ break; ++ } ++#ifndef REG_ALLOC_ORDER ++ i = j; /* Skip starting points we know will lose */ ++#endif ++ } ++ } ++ ++ /* Did we find a register? */ ++ ++ if (i < FIRST_PSEUDO_REGISTER) ++ { ++ register int lim, j; ++ HARD_REG_SET this_reg; ++ ++ /* Yes. Record it as the hard register of this pseudo-reg. */ ++ reg_renumber[allocno_reg[allocno]] = i; ++ /* For each other pseudo-reg conflicting with this one, ++ mark it as conflicting with the hard regs this one occupies. */ ++ CLEAR_HARD_REG_SET (this_reg); ++ lim = i + HARD_REGNO_NREGS (i, mode); ++ for (j = i; j < lim; j++) ++ SET_HARD_REG_BIT (this_reg, j); ++ lim = allocno; ++ for (j = 0; j < max_allocno; j++) ++ if (CONFLICTP (lim, j) || CONFLICTP (j, lim)) ++ { ++ IOR_HARD_REG_SET (hard_reg_conflicts[j], this_reg); ++ } ++ } ++ else if (flag_caller_saves) ++ { ++ /* Did not find a register. If it would be profitable to ++ allocate a call-clobbered register and save and restore it ++ around calls, do that. */ ++ if (! accept_call_clobbered ++ && reg_n_calls_crossed[allocno_reg[allocno]] != 0 ++ && CALLER_SAVE_PROFITABLE (reg_n_refs[allocno_reg[allocno]], ++ reg_n_calls_crossed[allocno_reg[allocno]])) ++ { ++ find_reg (allocno, losers, all_regs_p, 1, prefregs); ++ if (reg_renumber[allocno_reg[allocno]] >= 0) ++ caller_save_needed = 1; ++ } ++ } ++} ++ ++/* Called from `reload' to look for a hard reg to put pseudo reg REGNO in. ++ Perhaps it had previously seemed not worth a hard reg, ++ or perhaps its old hard reg has been commandeered for reloads. ++ FORBIDDEN_REGS is a vector that indicates certain hard regs ++ that may not be used, even if they do not appear to be allocated. ++ A nonnegative element means the corresponding hard reg is forbidden. ++ If FORBIDDEN_REGS is zero, no regs are forbidden. */ ++ ++void ++retry_global_alloc (regno, forbidden_regs) ++ int regno; ++ short *forbidden_regs; ++{ ++ int allocno = reg_allocno[regno]; ++ if (allocno >= 0) ++ { ++ /* If we have more than one register class, ++ first try allocating in the class that is cheapest ++ for this pseudo-reg. If that fails, try any reg. */ ++ if (N_REG_CLASSES > 1) ++ find_reg (allocno, forbidden_regs, 0, 0, ++ hard_reg_preferences[allocno]); ++ if (reg_renumber[regno] < 0 ++ && !reg_preferred_or_nothing (regno)) ++ find_reg (allocno, forbidden_regs, 1, 0, ++ hard_reg_preferences[allocno]); ++ } ++} ++ ++/* Called from reload pass to see if current function's pseudo regs ++ require a frame pointer to be allocated and set up. ++ ++ Return 1 if so, 0 otherwise. ++ We may alter the hard-reg allocation of the pseudo regs ++ in order to make the frame pointer unnecessary. ++ However, if the value is 1, nothing has been altered. ++ ++ Args grant access to some tables used in reload1.c. ++ See there for info on them. */ ++ ++int ++check_frame_pointer_required (reg_equiv_constant, reg_equiv_mem, reg_equiv_address) ++ rtx *reg_equiv_constant, *reg_equiv_mem, *reg_equiv_address; ++{ ++ register int i; ++ HARD_REG_SET *old_hard_reg_conflicts; ++ short *old_reg_renumber; ++ char old_regs_ever_live[FIRST_PSEUDO_REGISTER]; ++ ++ /* If any pseudo reg has no hard reg and no equivalent, ++ we must have a frame pointer. */ ++ ++ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ++ if (reg_renumber[i] < 0 && reg_n_refs[i] > 0 ++ && reg_equiv_mem[i] == 0 && reg_equiv_constant[i] == 0 ++ && reg_equiv_address[i] == 0) ++ return 1; ++ ++ /* If we might not need a frame pointer, ++ try finding a hard reg for any pseudo that has a memory equivalent. ++ That is because the memory equivalent probably refers to a frame ++ pointer. */ ++ ++ old_reg_renumber = (short *) alloca (max_regno * sizeof (short)); ++ old_hard_reg_conflicts = (HARD_REG_SET *) ++ alloca (max_allocno * sizeof (HARD_REG_SET)); ++ ++ bcopy (reg_renumber, old_reg_renumber, max_regno * sizeof (short)); ++ bcopy (hard_reg_conflicts, old_hard_reg_conflicts, ++ max_allocno * sizeof (HARD_REG_SET)); ++ bcopy (regs_ever_live, old_regs_ever_live, sizeof regs_ever_live); ++ ++ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ++ if (reg_renumber[i] < 0 ++ && ((reg_equiv_mem[i] ++ && reg_mentioned_p (frame_pointer_rtx, reg_equiv_mem[i])) ++ || (reg_equiv_address[i] ++ && reg_mentioned_p (frame_pointer_rtx, reg_equiv_address[i])))) ++ { ++ retry_global_alloc (i, 0); ++ /* If we can't find a hard reg for ALL of them, ++ or if a previously unneeded hard reg is used that requires saving, ++ we fail: set all those pseudos back as they were. */ ++ if (reg_renumber[i] < 0 ++ || (! old_regs_ever_live[reg_renumber[i]] ++ && ! call_used_regs[reg_renumber[i]])) ++ { ++ bcopy (old_reg_renumber, reg_renumber, ++ max_regno * sizeof (short)); ++ bcopy (old_hard_reg_conflicts, hard_reg_conflicts, ++ max_allocno * sizeof (HARD_REG_SET)); ++ bcopy (old_regs_ever_live, regs_ever_live, sizeof regs_ever_live); ++ return 1; ++ } ++ mark_home_live (i); ++ } ++ ++ return 0; ++} ++ ++/* Record a conflict between register REGNO ++ and everything currently live. ++ REGNO must not be a pseudo reg that was allocated ++ by local_alloc; such numbers must be translated through ++ reg_renumber before calling here. */ ++ ++static void ++record_one_conflict (regno) ++ int regno; ++{ ++ register int j; ++ ++ if (regno < FIRST_PSEUDO_REGISTER) ++ /* When a hard register becomes live, ++ record conflicts with live pseudo regs. */ ++ for (j = 0; j < max_allocno; j++) ++ { ++ if (ALLOCNO_LIVE_P (j)) ++ SET_HARD_REG_BIT (hard_reg_conflicts[j], regno); ++ } ++ else ++ /* When a pseudo-register becomes live, ++ record conflicts first with hard regs, ++ then with other pseudo regs. */ ++ { ++ register int ialloc = reg_allocno[regno]; ++ register int ialloc_prod = ialloc * allocno_row_words; ++ IOR_HARD_REG_SET (hard_reg_conflicts[ialloc], hard_regs_live); ++ for (j = allocno_row_words - 1; j >= 0; j--) ++ conflicts[ialloc_prod + j] |= allocnos_live[j]; ++ } ++} ++ ++/* Record all allocnos currently live as conflicting ++ with each other and with all hard regs currently live. ++ ALLOCNO_VEC is a vector of LEN allocnos, all allocnos that ++ are currently live. Their bits are also flagged in allocnos_live. */ ++ ++static void ++record_conflicts (allocno_vec, len) ++ register short *allocno_vec; ++ register int len; ++{ ++ register int allocno; ++ register int j; ++ register int ialloc_prod; ++ ++ while (--len >= 0) ++ { ++ allocno = allocno_vec[len]; ++ ialloc_prod = allocno * allocno_row_words; ++ IOR_HARD_REG_SET (hard_reg_conflicts[allocno], hard_regs_live); ++ for (j = allocno_row_words - 1; j >= 0; j--) ++ conflicts[ialloc_prod + j] |= allocnos_live[j]; ++ } ++} ++ ++/* Handle the case where REG is set by the insn being scanned, ++ during the forward scan to accumulate conflicts. ++ Store a 1 in regs_live or allocnos_live for this register, record how many ++ consecutive hardware registers it actually needs, ++ and record a conflict with all other registers already live. ++ ++ Note that even if REG does not remain alive after this insn, ++ we must mark it here as live, to ensure a conflict between ++ REG and any other regs set in this insn that really do live. ++ This is because those other regs could be considered after this. ++ ++ REG might actually be something other than a register; ++ if so, we do nothing. ++ ++ CLOBBERs are processed here by calling mark_reg_clobber. */ ++ ++static void ++mark_reg_store (orig_reg, setter) ++ rtx orig_reg, setter; ++{ ++ register int regno; ++ register rtx reg = orig_reg; ++ ++ /* WORD is which word of a multi-register group is being stored. ++ For the case where the store is actually into a SUBREG of REG. ++ Except we don't use it; I believe the entire REG needs to be ++ made live. */ ++ int word = 0; ++ ++ if (GET_CODE (reg) == SUBREG) ++ { ++ word = SUBREG_WORD (reg); ++ reg = SUBREG_REG (reg); ++ } ++ ++ if (GET_CODE (reg) != REG) ++ return; ++ ++ if (GET_CODE (setter) != SET) ++ { ++ /* A clobber of a register should be processed here too. */ ++ mark_reg_clobber (orig_reg, setter); ++ return; ++ } ++ ++ regs_set[n_regs_set++] = reg; ++ ++ set_preference (reg, SET_SRC (setter)); ++ ++ regno = REGNO (reg); ++ ++ if (reg_renumber[regno] >= 0) ++ regno = reg_renumber[regno] /* + word */; ++ ++ /* Either this is one of the max_allocno pseudo regs not allocated, ++ or it is or has a hardware reg. First handle the pseudo-regs. */ ++ if (regno >= FIRST_PSEUDO_REGISTER) ++ { ++ if (reg_allocno[regno] >= 0) ++ { ++ SET_ALLOCNO_LIVE (reg_allocno[regno]); ++ record_one_conflict (regno); ++ } ++ } ++ /* Handle hardware regs (and pseudos allocated to hard regs). */ ++ else if (! fixed_regs[regno]) ++ { ++ register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ++ while (regno < last) ++ { ++ record_one_conflict (regno); ++ SET_HARD_REG_BIT (hard_regs_live, regno); ++ regno++; ++ } ++ } ++} ++ ++/* Like mark_reg_set except notice just CLOBBERs; ignore SETs. */ ++ ++static void ++mark_reg_clobber (reg, setter) ++ rtx reg, setter; ++{ ++ register int regno; ++ ++ /* WORD is which word of a multi-register group is being stored. ++ For the case where the store is actually into a SUBREG of REG. ++ Except we don't use it; I believe the entire REG needs to be ++ made live. */ ++ int word = 0; ++ ++ if (GET_CODE (setter) != CLOBBER) ++ return; ++ ++ if (GET_CODE (reg) == SUBREG) ++ { ++ word = SUBREG_WORD (reg); ++ reg = SUBREG_REG (reg); ++ } ++ ++ if (GET_CODE (reg) != REG) ++ return; ++ ++ regs_set[n_regs_set++] = reg; ++ ++ regno = REGNO (reg); ++ ++ if (reg_renumber[regno] >= 0) ++ regno = reg_renumber[regno] /* + word */; ++ ++ /* Either this is one of the max_allocno pseudo regs not allocated, ++ or it is or has a hardware reg. First handle the pseudo-regs. */ ++ if (regno >= FIRST_PSEUDO_REGISTER) ++ { ++ if (reg_allocno[regno] >= 0) ++ { ++ SET_ALLOCNO_LIVE (reg_allocno[regno]); ++ record_one_conflict (regno); ++ } ++ } ++ /* Handle hardware regs (and pseudos allocated to hard regs). */ ++ else if (! fixed_regs[regno]) ++ { ++ register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ++ while (regno < last) ++ { ++ record_one_conflict (regno); ++ SET_HARD_REG_BIT (hard_regs_live, regno); ++ regno++; ++ } ++ } ++} ++ ++/* Mark REG as being dead (following the insn being scanned now). ++ Store a 0 in regs_live or allocnos_live for this register. */ ++ ++static void ++mark_reg_death (reg) ++ rtx reg; ++{ ++ register int regno = REGNO (reg); ++ ++ /* For pseudo reg, see if it has been assigned a hardware reg. */ ++ if (reg_renumber[regno] >= 0) ++ regno = reg_renumber[regno]; ++ ++ /* Either this is one of the max_allocno pseudo regs not allocated, ++ or it is a hardware reg. First handle the pseudo-regs. */ ++ if (regno >= FIRST_PSEUDO_REGISTER) ++ { ++ if (reg_allocno[regno] >= 0) ++ CLEAR_ALLOCNO_LIVE (reg_allocno[regno]); ++ } ++ /* Handle hardware regs (and pseudos allocated to hard regs). */ ++ else if (! fixed_regs[regno]) ++ { ++ /* Pseudo regs already assigned hardware regs are treated ++ almost the same as explicit hardware regs. */ ++ register int last = regno + HARD_REGNO_NREGS (regno, GET_MODE (reg)); ++ while (regno < last) ++ { ++ CLEAR_HARD_REG_BIT (hard_regs_live, regno); ++ regno++; ++ } ++ } ++} ++ ++/* Mark hard reg REGNO as currently live, assuming machine mode MODE ++ for the value stored in it. MODE determines how many consecutive ++ registers are actually in use. Do not record conflicts; ++ it is assumed that the caller will do that. */ ++ ++static void ++mark_reg_live_nc (regno, mode) ++ register int regno; ++ enum machine_mode mode; ++{ ++ register int last = regno + HARD_REGNO_NREGS (regno, mode); ++ while (regno < last) ++ { ++ SET_HARD_REG_BIT (hard_regs_live, regno); ++ regno++; ++ } ++} ++ ++/* Try to set a preference for an allocno to a hard register. ++ We are passed DEST and SRC which are the operands of a SET. It is known ++ that SRC is a register. If SRC or the first operand of SRC is a register, ++ try to set a preference. If one of the two is a hard register and the other ++ is a pseudo-register, mark the preference. ++ ++ Note that we are not as agressive as local-alloc in trying to tie a ++ pseudo-register to a hard register. */ ++ ++static void ++set_preference (dest, src) ++ rtx dest, src; ++{ ++ int src_regno, dest_regno; ++ /* Amount to add to the hard regno for SRC, or subtract from that for DEST, ++ to compensate for subregs in SRC or DEST. */ ++ int offset = 0; ++ ++ if (GET_RTX_FORMAT (GET_CODE (src))[0] == 'e') ++ src = XEXP (src, 0); ++ ++ /* Get the reg number for both SRC and DEST. ++ If neither is a reg, give up. */ ++ ++ if (GET_CODE (src) == REG) ++ src_regno = REGNO (src); ++ else if (GET_CODE (src) == SUBREG && GET_CODE (SUBREG_REG (src)) == REG) ++ { ++ src_regno = REGNO (SUBREG_REG (src)); ++ offset += SUBREG_WORD (src); ++ } ++ else ++ return; ++ ++ if (GET_CODE (dest) == REG) ++ dest_regno = REGNO (dest); ++ else if (GET_CODE (dest) == SUBREG && GET_CODE (SUBREG_REG (dest)) == REG) ++ { ++ dest_regno = REGNO (SUBREG_REG (dest)); ++ offset -= SUBREG_WORD (dest); ++ } ++ else ++ return; ++ ++ /* Convert either or both to hard reg numbers. */ ++ ++ if (reg_renumber[src_regno] >= 0) ++ src_regno = reg_renumber[src_regno]; ++ ++ if (reg_renumber[dest_regno] >= 0) ++ dest_regno = reg_renumber[dest_regno]; ++ ++ /* Now if one is a hard reg and the other is a global pseudo ++ then give the other a preference. */ ++ ++ if (dest_regno < FIRST_PSEUDO_REGISTER && src_regno >= FIRST_PSEUDO_REGISTER ++ && reg_allocno[src_regno] >= 0) ++ { ++ dest_regno -= offset; ++ if (dest_regno >= 0 && dest_regno < FIRST_PSEUDO_REGISTER) ++ { ++ SET_REGBIT (hard_reg_preferences, ++ reg_allocno[src_regno], dest_regno); ++ SET_HARD_REG_BIT (regs_someone_prefers, dest_regno); ++ } ++ } ++ ++ if (src_regno < FIRST_PSEUDO_REGISTER && dest_regno >= FIRST_PSEUDO_REGISTER ++ && reg_allocno[dest_regno] >= 0) ++ { ++ src_regno += offset; ++ if (src_regno >= 0 && src_regno < FIRST_PSEUDO_REGISTER) ++ { ++ SET_REGBIT (hard_reg_preferences, ++ reg_allocno[dest_regno], src_regno); ++ SET_HARD_REG_BIT (regs_someone_prefers, src_regno); ++ } ++ } ++} ++ ++/* Print debugging trace information if -greg switch is given, ++ showing the information on which the allocation decisions are based. */ ++ ++static void ++dump_conflicts (file) ++ FILE *file; ++{ ++ register int i; ++ fprintf (file, ";; %d regs to allocate:", max_allocno); ++ for (i = 0; i < max_allocno; i++) ++ { ++ fprintf (file, " %d", allocno_reg[allocno_order[i]]); ++ if (allocno_size[allocno_order[i]] != 1) ++ fprintf (file, " (%d)", allocno_size[allocno_order[i]]); ++ } ++ fprintf (file, "\n"); ++ ++ for (i = 0; i < max_allocno; i++) ++ { ++ register int j; ++ fprintf (file, ";; %d conflicts:", allocno_reg[i]); ++ for (j = 0; j < max_allocno; j++) ++ if (CONFLICTP (i, j) || CONFLICTP (j, i)) ++ fprintf (file, " %d", allocno_reg[j]); ++ for (j = 0; j < FIRST_PSEUDO_REGISTER; j++) ++ if (TEST_HARD_REG_BIT (hard_reg_conflicts[i], j)) ++ fprintf (file, " %d", j); ++ fprintf (file, "\n"); ++ } ++ fprintf (file, "\n"); ++} ++ ++void ++dump_global_regs (file) ++ FILE *file; ++{ ++ register int i; ++ ++ fprintf (file, ";; Register dispositions:"); ++ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++) ++ { ++ if (reg_renumber[i] >= 0) ++ fprintf (file, " %d in %d ", i, reg_renumber[i]); ++ } ++ ++ fprintf (file, "\n\n;; Hard regs used: "); ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ if (regs_ever_live[i]) ++ fprintf (file, " %d", i); ++ fprintf (file, "\n\n"); ++} +diff -Naur alliance-5.0/genview/src/gcc-1.42/gnulib2.c alliance/genview/src/gcc-1.42/gnulib2.c +--- alliance-5.0/genview/src/gcc-1.42/gnulib2.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gnulib2.c 2002-09-30 18:20:28.000000000 +0200 +@@ -0,0 +1,952 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* More subroutines needed by GCC output code on some machines. */ ++/* Compile this one with gcc. */ ++ ++#include "config.h" ++#include ++ ++/* Don't use `fancy_abort' here even if config.h says to use it. */ ++#ifdef abort ++#undef abort ++#endif ++ ++#ifndef SItype ++#define SItype long int ++#endif ++ ++/* long long ints are pairs of long ints in the order determined by ++ WORDS_BIG_ENDIAN. */ ++ ++#ifdef WORDS_BIG_ENDIAN ++ struct longlong {long high, low;}; ++#else ++ struct longlong {long low, high;}; ++#endif ++ ++/* We need this union to unpack/pack longlongs, since we don't have ++ any arithmetic yet. Incoming long long parameters are stored ++ into the `ll' field, and the unpacked result is read from the struct ++ longlong. */ ++ ++typedef union ++{ ++ struct longlong s; ++ long long ll; ++ SItype i[2]; ++ unsigned SItype ui[2]; ++} long_long; ++ ++/* Internally, long long ints are strings of unsigned shorts in the ++ order determined by BYTES_BIG_ENDIAN. */ ++ ++#define B 0x10000 ++#define low16 (B - 1) ++ ++#ifdef BYTES_BIG_ENDIAN ++ ++/* Note that HIGH and LOW do not describe the order ++ of words in a long long. They describe the order of words ++ in vectors ordered according to the byte order. */ ++ ++#define HIGH 0 ++#define LOW 1 ++ ++#define big_end(n) 0 ++#define little_end(n) ((n) - 1) ++#define next_msd(i) ((i) - 1) ++#define next_lsd(i) ((i) + 1) ++#define is_not_msd(i,n) ((i) >= 0) ++#define is_not_lsd(i,n) ((i) < (n)) ++ ++#else ++ ++#define LOW 0 ++#define HIGH 1 ++ ++#define big_end(n) ((n) - 1) ++#define little_end(n) 0 ++#define next_msd(i) ((i) + 1) ++#define next_lsd(i) ((i) - 1) ++#define is_not_msd(i,n) ((i) < (n)) ++#define is_not_lsd(i,n) ((i) >= 0) ++ ++#endif ++ ++/* These algorithms are all straight out of Knuth, vol. 2, sec. 4.3.1. */ ++ ++static int badd (); ++static int bsub (); ++static void bmul (); ++static int bneg (); ++static int bshift (); ++ ++#ifdef L_adddi3 ++long long ++__adddi3 (u, v) ++ long long u, v; ++{ ++ long a[2], b[2], c[2]; ++ long_long w; ++ long_long uu, vv; ++ ++ uu.ll = u; ++ vv.ll = v; ++ ++ a[HIGH] = uu.s.high; ++ a[LOW] = uu.s.low; ++ b[HIGH] = vv.s.high; ++ b[LOW] = vv.s.low; ++ ++ badd (a, b, c, sizeof c); ++ ++ w.s.high = c[HIGH]; ++ w.s.low = c[LOW]; ++ return w.ll; ++} ++ ++static int ++badd (a, b, c, n) ++ unsigned short *a, *b, *c; ++ size_t n; ++{ ++ unsigned long acc; ++ int i; ++ ++ n /= sizeof *c; ++ ++ acc = 0; ++ for (i = little_end (n); is_not_msd (i, n); i = next_msd (i)) ++ { ++ /* Widen before adding to avoid loss of high bits. */ ++ acc += (unsigned long) a[i] + b[i]; ++ c[i] = acc & low16; ++ acc = acc >> 16; ++ } ++ return acc; ++} ++#endif ++ ++#ifdef L_anddi3 ++long long ++__anddi3 (u, v) ++ long long u, v; ++{ ++ long_long w; ++ long_long uu, vv; ++ ++ uu.ll = u; ++ vv.ll = v; ++ ++ w.s.high = uu.s.high & vv.s.high; ++ w.s.low = uu.s.low & vv.s.low; ++ ++ return w.ll; ++} ++#endif ++ ++#ifdef L_iordi3 ++long long ++__iordi3 (u, v) ++ long long u, v; ++{ ++ long_long w; ++ long_long uu, vv; ++ ++ uu.ll = u; ++ vv.ll = v; ++ ++ w.s.high = uu.s.high | vv.s.high; ++ w.s.low = uu.s.low | vv.s.low; ++ ++ return w.ll; ++} ++#endif ++ ++#ifdef L_xordi3 ++long long ++__xordi3 (u, v) ++ long long u, v; ++{ ++ long_long w; ++ long_long uu, vv; ++ ++ uu.ll = u; ++ vv.ll = v; ++ ++ w.s.high = uu.s.high ^ vv.s.high; ++ w.s.low = uu.s.low ^ vv.s.low; ++ ++ return w.ll; ++} ++#endif ++ ++#ifdef L_one_cmpldi2 ++long long ++__one_cmpldi2 (u) ++ long long u; ++{ ++ long_long w; ++ long_long uu; ++ ++ uu.ll = u; ++ ++ w.s.high = ~uu.s.high; ++ w.s.low = ~uu.s.low; ++ ++ return w.ll; ++} ++#endif ++ ++#ifdef L_lshldi3 ++long long ++__lshldi3 (u, b1) ++ long long u; ++ long long b1; ++{ ++ long_long w; ++ unsigned long carries; ++ int bm; ++ long_long uu; ++ int b = b1; ++ ++ if (b == 0) ++ return u; ++ ++ uu.ll = u; ++ ++ bm = (sizeof (int) * BITS_PER_UNIT) - b; ++ if (bm <= 0) ++ { ++ w.s.low = 0; ++ w.s.high = (unsigned long)uu.s.low << -bm; ++ } ++ else ++ { ++ carries = (unsigned long)uu.s.low >> bm; ++ w.s.low = (unsigned long)uu.s.low << b; ++ w.s.high = ((unsigned long)uu.s.high << b) | carries; ++ } ++ ++ return w.ll; ++} ++#endif ++ ++#ifdef L_lshrdi3 ++long long ++__lshrdi3 (u, b1) ++ long long u; ++ long long b1; ++{ ++ long_long w; ++ unsigned long carries; ++ int bm; ++ long_long uu; ++ int b = b1; ++ ++ if (b == 0) ++ return u; ++ ++ uu.ll = u; ++ ++ bm = (sizeof (int) * BITS_PER_UNIT) - b; ++ if (bm <= 0) ++ { ++ w.s.high = 0; ++ w.s.low = (unsigned long)uu.s.high >> -bm; ++ } ++ else ++ { ++ carries = (unsigned long)uu.s.high << bm; ++ w.s.high = (unsigned long)uu.s.high >> b; ++ w.s.low = ((unsigned long)uu.s.low >> b) | carries; ++ } ++ ++ return w.ll; ++} ++#endif ++ ++#ifdef L_ashldi3 ++long long ++__ashldi3 (u, b1) ++ long long u; ++ long long b1; ++{ ++ long_long w; ++ unsigned long carries; ++ int bm; ++ long_long uu; ++ int b = b1; ++ ++ if (b == 0) ++ return u; ++ ++ uu.ll = u; ++ ++ bm = (sizeof (int) * BITS_PER_UNIT) - b; ++ if (bm <= 0) ++ { ++ w.s.low = 0; ++ w.s.high = (unsigned long)uu.s.low << -bm; ++ } ++ else ++ { ++ carries = (unsigned long)uu.s.low >> bm; ++ w.s.low = (unsigned long)uu.s.low << b; ++ w.s.high = ((unsigned long)uu.s.high << b) | carries; ++ } ++ ++ return w.ll; ++} ++#endif ++ ++#ifdef L_ashrdi3 ++long long ++__ashrdi3 (u, b1) ++ long long u; ++ long long b1; ++{ ++ long_long w; ++ unsigned long carries; ++ int bm; ++ long_long uu; ++ int b = b1; ++ ++ if (b == 0) ++ return u; ++ ++ uu.ll = u; ++ ++ bm = (sizeof (int) * BITS_PER_UNIT) - b; ++ if (bm <= 0) ++ { ++ w.s.high = uu.s.high >> 31; /* just to make w.s.high 1..1 or 0..0 */ ++ w.s.low = uu.s.high >> -bm; ++ } ++ else ++ { ++ carries = (unsigned long)uu.s.high << bm; ++ w.s.high = uu.s.high >> b; ++ w.s.low = ((unsigned long)uu.s.low >> b) | carries; ++ } ++ ++ return w.ll; ++} ++#endif ++ ++#ifdef L_subdi3 ++long long ++__subdi3 (u, v) ++ long long u, v; ++{ ++ long a[2], b[2], c[2]; ++ long_long w; ++ long_long uu, vv; ++ ++ uu.ll = u; ++ vv.ll = v; ++ ++ a[HIGH] = uu.s.high; ++ a[LOW] = uu.s.low; ++ b[HIGH] = vv.s.high; ++ b[LOW] = vv.s.low; ++ ++ bsub (a, b, c, sizeof c); ++ ++ w.s.high = c[HIGH]; ++ w.s.low = c[LOW]; ++ return w.ll; ++} ++ ++static int ++bsub (a, b, c, n) ++ unsigned short *a, *b, *c; ++ size_t n; ++{ ++ signed long acc; ++ int i; ++ ++ n /= sizeof *c; ++ ++ acc = 0; ++ for (i = little_end (n); is_not_msd (i, n); i = next_msd (i)) ++ { ++ /* Widen before subtracting to avoid loss of high bits. */ ++ acc += (long) a[i] - b[i]; ++ c[i] = acc & low16; ++ acc = acc >> 16; ++ } ++ return acc; ++} ++#endif ++ ++#ifdef L_muldi3 ++long long ++__muldi3 (u, v) ++ long long u, v; ++{ ++ long a[2], b[2], c[2][2]; ++ long_long w; ++ long_long uu, vv; ++ ++ uu.ll = u; ++ vv.ll = v; ++ ++ a[HIGH] = uu.s.high; ++ a[LOW] = uu.s.low; ++ b[HIGH] = vv.s.high; ++ b[LOW] = vv.s.low; ++ ++ bmul (a, b, c, sizeof a, sizeof b); ++ ++ w.s.high = c[LOW][HIGH]; ++ w.s.low = c[LOW][LOW]; ++ return w.ll; ++} ++ ++static void ++bmul (a, b, c, m, n) ++ unsigned short *a, *b, *c; ++ size_t m, n; ++{ ++ int i, j; ++ unsigned long acc; ++ ++ bzero (c, m + n); ++ ++ m /= sizeof *a; ++ n /= sizeof *b; ++ ++ for (j = little_end (n); is_not_msd (j, n); j = next_msd (j)) ++ { ++ unsigned short *c1 = c + j + little_end (2); ++ acc = 0; ++ for (i = little_end (m); is_not_msd (i, m); i = next_msd (i)) ++ { ++ /* Widen before arithmetic to avoid loss of high bits. */ ++ acc += (unsigned long) a[i] * b[j] + c1[i]; ++ c1[i] = acc & low16; ++ acc = acc >> 16; ++ } ++ c1[i] = acc; ++ } ++} ++#endif ++ ++#ifdef L_divdi3 ++long long ++__divdi3 (u, v) ++ long long u, v; ++{ ++ if (u < 0) ++ if (v < 0) ++ return (unsigned long long) -u / (unsigned long long) -v; ++ else ++ return - ((unsigned long long) -u / (unsigned long long) v); ++ else ++ if (v < 0) ++ return - ((unsigned long long) u / (unsigned long long) -v); ++ else ++ return (unsigned long long) u / (unsigned long long) v; ++} ++#endif ++ ++#ifdef L_moddi3 ++long long ++__moddi3 (u, v) ++ long long u, v; ++{ ++ if (u < 0) ++ if (v < 0) ++ return - ((unsigned long long) -u % (unsigned long long) -v); ++ else ++ return - ((unsigned long long) -u % (unsigned long long) v); ++ else ++ if (v < 0) ++ return (unsigned long long) u % (unsigned long long) -v; ++ else ++ return (unsigned long long) u % (unsigned long long) v; ++} ++#endif ++ ++#ifdef L_udivdi3 ++long long ++__udivdi3 (u, v) ++ long long u, v; ++{ ++ unsigned long a[2][2], b[2], q[2], r[2]; ++ long_long w; ++ long_long uu, vv; ++ ++ uu.ll = u; ++ vv.ll = v; ++ ++ a[HIGH][HIGH] = 0; ++ a[HIGH][LOW] = 0; ++ a[LOW][HIGH] = uu.s.high; ++ a[LOW][LOW] = uu.s.low; ++ b[HIGH] = vv.s.high; ++ b[LOW] = vv.s.low; ++ ++ __bdiv (a, b, q, r, sizeof a, sizeof b); ++ ++ w.s.high = q[HIGH]; ++ w.s.low = q[LOW]; ++ return w.ll; ++} ++#endif ++ ++#ifdef L_umoddi3 ++long long ++__umoddi3 (u, v) ++ long long u, v; ++{ ++ unsigned long a[2][2], b[2], q[2], r[2]; ++ long_long w; ++ long_long uu, vv; ++ ++ uu.ll = u; ++ vv.ll = v; ++ ++ a[HIGH][HIGH] = 0; ++ a[HIGH][LOW] = 0; ++ a[LOW][HIGH] = uu.s.high; ++ a[LOW][LOW] = uu.s.low; ++ b[HIGH] = vv.s.high; ++ b[LOW] = vv.s.low; ++ ++ __bdiv (a, b, q, r, sizeof a, sizeof b); ++ ++ w.s.high = r[HIGH]; ++ w.s.low = r[LOW]; ++ return w.ll; ++} ++#endif ++ ++#ifdef L_negdi2 ++long long ++__negdi2 (u) ++ long long u; ++{ ++ unsigned long a[2], b[2]; ++ long_long w; ++ long_long uu; ++ ++ uu.ll = u; ++ ++ a[HIGH] = uu.s.high; ++ a[LOW] = uu.s.low; ++ ++ bneg (a, b, sizeof b); ++ ++ w.s.high = b[HIGH]; ++ w.s.low = b[LOW]; ++ return w.ll; ++} ++ ++static int ++bneg (a, b, n) ++ unsigned short *a, *b; ++ size_t n; ++{ ++ signed long acc; ++ int i; ++ ++ n /= sizeof (short); ++ ++ acc = 0; ++ for (i = little_end (n); is_not_msd (i, n); i = next_msd (i)) ++ { ++ acc -= a[i]; ++ b[i] = acc & low16; ++ acc = acc >> 16; ++ } ++ return acc; ++} ++#endif ++ ++/* Divide a by b, producing quotient q and remainder r. ++ ++ sizeof a is m ++ sizeof b is n ++ sizeof q is m - n ++ sizeof r is n ++ ++ The quotient must fit in m - n bytes, i.e., the most significant ++ n digits of a must be less than b, and m must be greater than n. */ ++ ++/* The name of this used to be __div_internal, ++ but that is too long for SYSV. */ ++ ++#ifdef L_bdiv ++void ++__bdiv (a, b, q, r, m, n) ++ unsigned short *a, *b, *q, *r; ++ size_t m, n; ++{ ++ unsigned long qhat, rhat; ++ unsigned long acc; ++ unsigned short *u = (unsigned short *) alloca (m); ++ unsigned short *v = (unsigned short *) alloca (n); ++ unsigned short *u0, *u1, *u2; ++ unsigned short *v0; ++ int d, qn; ++ int i, j; ++ ++ m /= sizeof *a; ++ n /= sizeof *b; ++ qn = m - n; ++ ++ /* Remove leading zero digits from divisor, and the same number of ++ digits (which must be zero) from dividend. */ ++ ++ while (b[big_end (n)] == 0) ++ { ++ r[big_end (n)] = 0; ++ ++ a += little_end (2); ++ b += little_end (2); ++ r += little_end (2); ++ m--; ++ n--; ++ ++ /* Check for zero divisor. */ ++ if (n == 0) ++ abort (); ++ } ++ ++ /* If divisor is a single digit, do short division. */ ++ ++ if (n == 1) ++ { ++ acc = a[big_end (m)]; ++ a += little_end (2); ++ for (j = big_end (qn); is_not_lsd (j, qn); j = next_lsd (j)) ++ { ++ acc = (acc << 16) | a[j]; ++ q[j] = acc / *b; ++ acc = acc % *b; ++ } ++ *r = acc; ++ return; ++ } ++ ++ /* No such luck, must do long division. Shift divisor and dividend ++ left until the high bit of the divisor is 1. */ ++ ++ for (d = 0; d < 16; d++) ++ if (b[big_end (n)] & (1 << (16 - 1 - d))) ++ break; ++ ++ bshift (a, d, u, 0, m); ++ bshift (b, d, v, 0, n); ++ ++ /* Get pointers to the high dividend and divisor digits. */ ++ ++ u0 = u + big_end (m) - big_end (qn); ++ u1 = next_lsd (u0); ++ u2 = next_lsd (u1); ++ u += little_end (2); ++ ++ v0 = v + big_end (n); ++ ++ /* Main loop: find a quotient digit, multiply it by the divisor, ++ and subtract that from the dividend, shifted over the right amount. */ ++ ++ for (j = big_end (qn); is_not_lsd (j, qn); j = next_lsd (j)) ++ { ++ /* Quotient digit initial guess: high 2 dividend digits over high ++ divisor digit. */ ++ ++ if (u0[j] == *v0) ++ { ++ qhat = B - 1; ++ rhat = (unsigned long) *v0 + u1[j]; ++ } ++ else ++ { ++ unsigned long numerator = ((unsigned long) u0[j] << 16) | u1[j]; ++ qhat = numerator / *v0; ++ rhat = numerator % *v0; ++ } ++ ++ /* Now get the quotient right for high 3 dividend digits over ++ high 2 divisor digits. */ ++ ++ while (rhat < B && qhat * *next_lsd (v0) > ((rhat << 16) | u2[j])) ++ { ++ qhat -= 1; ++ rhat += *v0; ++ } ++ ++ /* Multiply quotient by divisor, subtract from dividend. */ ++ ++ acc = 0; ++ for (i = little_end (n); is_not_msd (i, n); i = next_msd (i)) ++ { ++ acc += (unsigned long) (u + j)[i] - v[i] * qhat; ++ (u + j)[i] = acc & low16; ++ if (acc < B) ++ acc = 0; ++ else ++ acc = (acc >> 16) | -B; ++ } ++ ++ q[j] = qhat; ++ ++ /* Quotient may have been too high by 1. If dividend went negative, ++ decrement the quotient by 1 and add the divisor back. */ ++ ++ if ((signed long) (acc + u0[j]) < 0) ++ { ++ q[j] -= 1; ++ acc = 0; ++ for (i = little_end (n); is_not_msd (i, n); i = next_msd (i)) ++ { ++ acc += (unsigned long) (u + j)[i] + v[i]; ++ (u + j)[i] = acc & low16; ++ acc = acc >> 16; ++ } ++ } ++ } ++ ++ /* Now the remainder is what's left of the dividend, shifted right ++ by the amount of the normalizing left shift at the top. */ ++ ++ r[big_end (n)] = bshift (u + 1 + little_end (j - 1), ++ 16 - d, ++ r + little_end (2), ++ u[little_end (m - 1)] >> d, ++ n - 1); ++} ++ ++/* Left shift U by K giving W; fill the introduced low-order bits with ++ CARRY_IN. Length of U and W is N. Return carry out. K must be ++ in 0 .. 16. */ ++ ++static int ++bshift (u, k, w, carry_in, n) ++ unsigned short *u, *w, carry_in; ++ int k, n; ++{ ++ unsigned long acc; ++ int i; ++ ++ if (k == 0) ++ { ++ bcopy (u, w, n * sizeof *u); ++ return 0; ++ } ++ ++ acc = carry_in; ++ for (i = little_end (n); is_not_msd (i, n); i = next_msd (i)) ++ { ++ acc |= (unsigned long) u[i] << k; ++ w[i] = acc & low16; ++ acc = acc >> 16; ++ } ++ return acc; ++} ++#endif ++ ++#ifdef L_cmpdi2 ++SItype ++__cmpdi2 (a, b) ++ long long a, b; ++{ ++ long_long au, bu; ++ ++ au.ll = a, bu.ll = b; ++ ++ if (au.s.high < bu.s.high) ++ return 0; ++ else if (au.s.high > bu.s.high) ++ return 2; ++ if ((unsigned) au.s.low < (unsigned) bu.s.low) ++ return 0; ++ else if ((unsigned) au.s.low > (unsigned) bu.s.low) ++ return 2; ++ return 1; ++} ++#endif ++ ++#ifdef L_ucmpdi2 ++SItype ++__ucmpdi2 (a, b) ++ long long a, b; ++{ ++ long_long au, bu; ++ ++ au.ll = a, bu.ll = b; ++ ++ if ((unsigned) au.s.high < (unsigned) bu.s.high) ++ return 0; ++ else if ((unsigned) au.s.high > (unsigned) bu.s.high) ++ return 2; ++ if ((unsigned) au.s.low < (unsigned) bu.s.low) ++ return 0; ++ else if ((unsigned) au.s.low > (unsigned) bu.s.low) ++ return 2; ++ return 1; ++} ++#endif ++ ++#ifdef L_fixunsdfdi ++#define HIGH_WORD_COEFF (((long long) 1) << BITS_PER_WORD) ++ ++long long ++__fixunsdfdi (a) ++ double a; ++{ ++ double b; ++ unsigned long long v; ++ ++ if (a < 0) ++ return 0; ++ ++ /* Compute high word of result, as a flonum. */ ++ b = (a / HIGH_WORD_COEFF); ++ /* Convert that to fixed (but not to long long!), ++ and shift it into the high word. */ ++ v = (unsigned long int) b; ++ v <<= BITS_PER_WORD; ++ /* Remove high part from the double, leaving the low part as flonum. */ ++ a -= (double)v; ++ /* Convert that to fixed (but not to long long!) and add it in. ++ Sometimes A comes out negative. This is significant, since ++ A has more bits than a long int does. */ ++ if (a < 0) ++ v -= (unsigned long int) (- a); ++ else ++ v += (unsigned long int) a; ++ return v; ++} ++#endif ++ ++#ifdef L_fixdfdi ++long long ++__fixdfdi (a) ++ double a; ++{ ++ long long __fixunsdfdi (double a); ++ ++ if (a < 0) ++ return - __fixunsdfdi (-a); ++ return __fixunsdfdi (a); ++} ++#endif ++ ++#ifdef L_floatdidf ++#define HIGH_HALFWORD_COEFF (((long long) 1) << (BITS_PER_WORD / 2)) ++#define HIGH_WORD_COEFF (((long long) 1) << BITS_PER_WORD) ++ ++double ++__floatdidf (u) ++ long long u; ++{ ++ double d; ++ int negate = 0; ++ ++ if (u < 0) ++ u = -u, negate = 1; ++ ++ d = (unsigned int) (u >> BITS_PER_WORD); ++ d *= HIGH_HALFWORD_COEFF; ++ d *= HIGH_HALFWORD_COEFF; ++ d += (unsigned int) (u & (HIGH_WORD_COEFF - 1)); ++ ++ return (negate ? -d : d); ++} ++#endif ++ ++#ifdef L_varargs ++#ifdef i860 ++ asm (" .text"); ++ asm (" .align 4"); ++ ++ asm ("___builtin_saveregs::"); ++ asm (" mov sp,r30"); ++ asm (" andnot 0x0f,sp,sp"); ++ asm (" adds -96,sp,sp"); /* allocate sufficient space on the stack */ ++ ++/* Fill in the __va_struct. */ ++ asm (" st.l r16, 0(sp)"); /* save integer regs (r16-r27) */ ++ asm (" st.l r17, 4(sp)"); /* int fixed[12] */ ++ asm (" st.l r18, 8(sp)"); ++ asm (" st.l r19,12(sp)"); ++ asm (" st.l r20,16(sp)"); ++ asm (" st.l r21,20(sp)"); ++ asm (" st.l r22,24(sp)"); ++ asm (" st.l r23,28(sp)"); ++ asm (" st.l r24,32(sp)"); ++ asm (" st.l r25,36(sp)"); ++ asm (" st.l r26,40(sp)"); ++ asm (" st.l r27,44(sp)"); ++ ++ asm (" fst.q f8, 48(sp)"); /* save floating regs (f8-f15) */ ++ asm (" fst.q f12,64(sp)"); /* int floating[8] */ ++ ++/* Fill in the __va_ctl. */ ++ asm (" st.l sp, 80(sp)"); /* __va_ctl points to __va_struct. */ ++ asm (" st.l r28,84(sp)"); /* pointer to more args */ ++ asm (" st.l r0, 88(sp)"); /* nfixed */ ++ asm (" st.l r0, 92(sp)"); /* nfloating */ ++ ++ asm (" adds 80,sp,r16"); /* return address of the __va_ctl. */ ++ asm (" bri r1"); ++ asm (" mov r30,sp"); ++ /* recover stack and pass address to start ++ of data. */ ++#endif ++#ifdef sparc ++ asm (".global ___builtin_saveregs"); ++ asm ("___builtin_saveregs:"); ++ asm ("st %i0,[%fp+68]"); ++ asm ("st %i1,[%fp+72]"); ++ asm ("st %i2,[%fp+76]"); ++ asm ("st %i3,[%fp+80]"); ++ asm ("st %i4,[%fp+84]"); ++ asm ("retl"); ++ asm ("st %i5,[%fp+88]"); ++#else /* not sparc */ ++#if defined(MIPSEL) | defined(R3000) | defined(R2000) | defined(mips) ++ ++ asm (" .text"); ++ asm (" .ent __builtin_saveregs"); ++ asm (" .globl __builtin_saveregs"); ++ asm ("__builtin_saveregs:"); ++ asm (" sw $4,0($30)"); ++ asm (" sw $5,4($30)"); ++ asm (" sw $6,8($30)"); ++ asm (" sw $7,12($30)"); ++ asm (" j $31"); ++ asm (" .end __builtin_saveregs"); ++#else /* not mips */ ++__builtin_saveregs () ++{ ++ abort (); ++} ++#endif /* not mips */ ++#endif /* not sparc */ ++#endif +diff -Naur alliance-5.0/genview/src/gcc-1.42/gnulib.c alliance/genview/src/gcc-1.42/gnulib.c +--- alliance-5.0/genview/src/gcc-1.42/gnulib.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gnulib.c 2002-09-30 18:20:28.000000000 +0200 +@@ -0,0 +1,493 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Subroutines needed by GCC output code on some machines. */ ++/* Compile this file with the Unix C compiler! */ ++ ++#include "config.h" ++ ++/* Don't use `fancy_abort' here even if config.h says to use it. */ ++#ifdef abort ++#undef abort ++#endif ++ ++/* Define the C data type to use for an SImode value. */ ++ ++#ifndef SItype ++#define SItype long int ++#endif ++ ++/* Define the type to be used for returning an SF mode value ++ and the method for turning a float into that type. ++ These definitions work for machines where an SF value is ++ returned in the same register as an int. */ ++ ++#ifndef SFVALUE ++#define SFVALUE int ++#endif ++ ++#ifndef INTIFY ++#define INTIFY(FLOATVAL) (intify.f = (FLOATVAL), intify.i) ++#endif ++ ++#ifdef GNULIB_NEEDS_DOUBLE ++#define FLOAT_ARG_TYPE double ++#define FLOATIFY(ARG) ((float) (ARG)) ++#endif ++ ++#ifndef FLOATIFY ++#define FLOATIFY(INTVAL) ((INTVAL).f) ++#endif ++ ++#ifndef FLOAT_ARG_TYPE ++#define FLOAT_ARG_TYPE union flt_or_int ++#endif ++ ++union flt_or_int { int i; float f; }; ++ ++ ++#ifdef L_eprintf ++#include ++/* This is used by the `assert' macro. */ ++void ++__eprintf (string, expression, line, filename) ++ char *string; ++ char *expression; ++ int line; ++ char *filename; ++{ ++ fprintf (stderr, string, expression, line, filename); ++ fflush (stderr); ++ abort (); ++} ++#endif ++ ++#ifdef L_umulsi3 ++SItype ++__umulsi3 (a, b) ++ unsigned SItype a, b; ++{ ++ return a * b; ++} ++#endif ++ ++#ifdef L_mulsi3 ++SItype ++__mulsi3 (a, b) ++ SItype a, b; ++{ ++ return a * b; ++} ++#endif ++ ++#ifdef L_udivsi3 ++SItype ++__udivsi3 (a, b) ++ unsigned SItype a, b; ++{ ++ return a / b; ++} ++#endif ++ ++#ifdef L_divsi3 ++SItype ++__divsi3 (a, b) ++ SItype a, b; ++{ ++ return a / b; ++} ++#endif ++ ++#ifdef L_umodsi3 ++SItype ++__umodsi3 (a, b) ++ unsigned SItype a, b; ++{ ++ return a % b; ++} ++#endif ++ ++#ifdef L_modsi3 ++SItype ++__modsi3 (a, b) ++ SItype a, b; ++{ ++ return a % b; ++} ++#endif ++ ++#ifdef L_lshrsi3 ++SItype ++__lshrsi3 (a, b) ++ unsigned SItype a, b; ++{ ++ return a >> b; ++} ++#endif ++ ++#ifdef L_lshlsi3 ++SItype ++__lshlsi3 (a, b) ++ unsigned SItype a, b; ++{ ++ return a << b; ++} ++#endif ++ ++#ifdef L_ashrsi3 ++SItype ++__ashrsi3 (a, b) ++ SItype a, b; ++{ ++ return a >> b; ++} ++#endif ++ ++#ifdef L_ashlsi3 ++SItype ++__ashlsi3 (a, b) ++ SItype a, b; ++{ ++ return a << b; ++} ++#endif ++ ++#ifdef L_divdf3 ++double ++__divdf3 (a, b) ++ double a, b; ++{ ++ return a / b; ++} ++#endif ++ ++#ifdef L_muldf3 ++double ++__muldf3 (a, b) ++ double a, b; ++{ ++ return a * b; ++} ++#endif ++ ++#ifdef L_negdf2 ++double ++__negdf2 (a) ++ double a; ++{ ++ return -a; ++} ++#endif ++ ++#ifdef L_adddf3 ++double ++__adddf3 (a, b) ++ double a, b; ++{ ++ return a + b; ++} ++#endif ++ ++#ifdef L_subdf3 ++double ++__subdf3 (a, b) ++ double a, b; ++{ ++ return a - b; ++} ++#endif ++ ++#ifdef L_cmpdf2 ++SItype ++__cmpdf2 (a, b) ++ double a, b; ++{ ++ if (a > b) ++ return 1; ++ else if (a < b) ++ return -1; ++ return 0; ++} ++#endif ++ ++#ifdef L_fixunsdfsi ++#define HIGH_BIT_INT_COEFF (1 << (BITS_PER_WORD - 1)) ++#define HIGH_BIT_COEFF (2 * (double) (1 << (BITS_PER_WORD - 2))) ++ ++SItype ++__fixunsdfsi (a) ++ double a; ++{ ++ if (a < HIGH_BIT_COEFF) ++ return (SItype)a; ++ /* Convert large positive numbers to smaller ones, ++ then increase again after you have a fixed point number. */ ++ else ++ return ((SItype) (a - HIGH_BIT_COEFF)) + HIGH_BIT_INT_COEFF; ++} ++#endif ++ ++#ifdef L_fixdfsi ++SItype ++__fixdfsi (a) ++ double a; ++{ ++ return (SItype) a; ++} ++#endif ++ ++#ifdef L_floatsidf ++double ++__floatsidf (a) ++ SItype a; ++{ ++ return (double) a; ++} ++#endif ++ ++#ifdef L_addsf3 ++SFVALUE ++__addsf3 (a, b) ++ FLOAT_ARG_TYPE a, b; ++{ ++ union flt_or_int intify; ++ return INTIFY (FLOATIFY (a) + FLOATIFY (b)); ++} ++#endif ++ ++#ifdef L_negsf2 ++SFVALUE ++__negsf2 (a) ++ FLOAT_ARG_TYPE a; ++{ ++ union flt_or_int intify; ++ return INTIFY (-FLOATIFY (a)); ++} ++#endif ++ ++#ifdef L_subsf3 ++SFVALUE ++__subsf3 (a, b) ++ FLOAT_ARG_TYPE a, b; ++{ ++ union flt_or_int intify; ++ return INTIFY (FLOATIFY (a) - FLOATIFY (b)); ++} ++#endif ++ ++#ifdef L_cmpsf2 ++SItype ++__cmpsf2 (a, b) ++ FLOAT_ARG_TYPE a, b; ++{ ++ if (FLOATIFY (a) > FLOATIFY (b)) ++ return 1; ++ else if (FLOATIFY (a) < FLOATIFY (b)) ++ return -1; ++ return 0; ++} ++#endif ++ ++#ifdef L_mulsf3 ++SFVALUE ++__mulsf3 (a, b) ++ FLOAT_ARG_TYPE a, b; ++{ ++ union flt_or_int intify; ++ return INTIFY (FLOATIFY (a) * FLOATIFY (b)); ++} ++#endif ++ ++#ifdef L_divsf3 ++SFVALUE ++__divsf3 (a, b) ++ FLOAT_ARG_TYPE a, b; ++{ ++ union flt_or_int intify; ++ ++ return INTIFY (FLOATIFY (a) / FLOATIFY (b)); ++} ++#endif ++ ++#ifdef L_truncdfsf2 ++SFVALUE ++__truncdfsf2 (a) ++ double a; ++{ ++ union flt_or_int intify; ++ return INTIFY (a); ++} ++#endif ++ ++#ifdef L_extendsfdf2 ++double ++__extendsfdf2 (a) ++ FLOAT_ARG_TYPE a; ++{ ++ return FLOATIFY (a); ++} ++#endif ++ ++#ifdef L_bb ++int __avoid_ranlib_warning; /* Don't let symbol table be empty. */ ++ ++#if defined (sun) && defined (mc68000) ++struct bb ++{ ++ int initialized; ++ char *filename; ++ int *counts; ++ int ncounts; ++ int zero_word; ++ int *addresses; ++}; ++ ++__bb_init_func (blocks) ++ struct bb *blocks; ++{ ++ extern int ___tcov_init; ++ ++ if (! ___tcov_init) ++ ___tcov_init_func (); ++ ++ ___bb_link (blocks->filename, blocks->counts, blocks->ncounts); ++} ++ ++#endif ++#endif ++ ++/* frills for C++ */ ++ ++#ifdef L_builtin_new ++typedef void (*vfp)(); ++ ++extern vfp __new_handler; ++ ++char * ++__builtin_new (sz) ++ long sz; ++{ ++ char *p; ++ ++ p = (char *)malloc (sz); ++ if (p == 0) ++ (*__new_handler) (); ++ return p; ++} ++#endif ++ ++#ifdef L_builtin_New ++typedef void (*vfp)(); ++ ++static void ++default_new_handler (); ++ ++vfp __new_handler = default_new_handler; ++ ++char * ++__builtin_vec_new (p, maxindex, size, ctor) ++ char *p; ++ int maxindex, size; ++ void (*ctor)(); ++{ ++ int i, nelts = maxindex + 1; ++ char *rval; ++ ++ if (p == 0) ++ p = (char *)__builtin_new (nelts * size); ++ ++ rval = p; ++ ++ for (i = 0; i < nelts; i++) ++ { ++ (*ctor) (p); ++ p += size; ++ } ++ ++ return rval; ++} ++ ++vfp ++__set_new_handler (handler) ++ vfp handler; ++{ ++ vfp prev_handler; ++ ++ prev_handler = __new_handler; ++ if (handler == 0) handler = default_new_handler; ++ __new_handler = handler; ++ return prev_handler; ++} ++ ++vfp ++set_new_handler (handler) ++ vfp handler; ++{ ++ return __set_new_handler (handler); ++} ++ ++static void ++default_new_handler () ++{ ++ /* don't use fprintf (stderr, ...) because it may need to call malloc. */ ++ write (2, "default_new_handler: out of memory... aaaiiiiiieeeeeeeeeeeeee!\n", 65); ++ /* don't call exit () because that may call global destructors which ++ may cause a loop. */ ++ _exit (-1); ++} ++#endif ++ ++#ifdef L_builtin_del ++typedef void (*vfp)(); ++ ++void ++__builtin_delete (ptr) ++ char *ptr; ++{ ++ if (ptr) ++ free (ptr); ++} ++ ++void ++__builtin_vec_delete (ptr, maxindex, size, dtor, auto_delete_vec, auto_delete) ++ char *ptr; ++ int maxindex, size; ++ void (*dtor)(); ++ int auto_delete; ++{ ++ int i, nelts = maxindex + 1; ++ char *p = ptr; ++ ++ ptr += nelts * size; ++ ++ for (i = 0; i < nelts; i++) ++ { ++ ptr -= size; ++ (*dtor) (ptr, auto_delete); ++ } ++ ++ if (auto_delete_vec) ++ free (p); ++} ++ ++#endif +diff -Naur alliance-5.0/genview/src/gcc-1.42/gstab.h alliance/genview/src/gcc-1.42/gstab.h +--- alliance-5.0/genview/src/gcc-1.42/gstab.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gstab.h 2002-09-30 18:20:28.000000000 +0200 +@@ -0,0 +1,39 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#ifndef __GNU_STAB__ ++ ++/* Indicate the GNU stab.h is in use. */ ++ ++#define __GNU_STAB__ ++ ++#define __define_stab(NAME, CODE, STRING) NAME=CODE, ++ ++enum __stab_debug_code ++{ ++#include "stab.def" ++}; ++ ++#undef __define_stab ++ ++#endif /* __GNU_STAB_ */ +diff -Naur alliance-5.0/genview/src/gcc-1.42/gstdarg.h alliance/genview/src/gcc-1.42/gstdarg.h +--- alliance-5.0/genview/src/gcc-1.42/gstdarg.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gstdarg.h 2002-09-30 18:20:28.000000000 +0200 +@@ -0,0 +1,71 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* stdarg.h for GNU. ++ Note that the type used in va_arg is supposed to match the ++ actual type **after default promotions**. ++ Thus, va_arg (..., short) is not valid. */ ++ ++#ifndef _STDARG_H ++#define _STDARG_H ++ ++/* The macro _VA_LIST_ is the same thing used by this file in Ultrix. */ ++#ifndef _VA_LIST_ ++/* The macro _VA_LIST_ is used in SCO Unix 3.2. */ ++#ifndef _VA_LIST ++#define _VA_LIST_ ++#define _VA_LIST ++typedef char *va_list; ++#endif /* _VA_LIST */ ++#endif /* _VA_LIST_ */ ++ ++/* Amount of space required in an argument list for an arg of type TYPE. ++ TYPE may alternatively be an expression whose type is used. */ ++ ++#define __va_rounded_size(TYPE) \ ++ (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) ++ ++#ifndef __sparc__ ++#define va_start(AP, LASTARG) \ ++ (AP = ((char *) __builtin_next_arg ())) ++#else ++#define va_start(AP, LASTARG) \ ++ (__builtin_saveregs (), \ ++ AP = ((char *) __builtin_next_arg ())) ++#endif ++ ++void va_end (va_list); /* Defined in gnulib */ ++#define va_end(AP) ++ ++#ifdef __mips__ ++#define va_arg(AP, mode) ((mode *)(AP = \ ++ (char *) (sizeof(mode) > 4 ? ((int)AP + 2*8 - 1) & -8 \ ++ : ((int)AP + 2*4 - 1) & -4)))[-1] ++#else /* not __mips__ */ ++#define va_arg(AP, TYPE) \ ++ (*((TYPE *) (AP += __va_rounded_size (TYPE), \ ++ AP - (sizeof (TYPE) < 4 ? sizeof (TYPE) \ ++ : __va_rounded_size (TYPE))))) ++#endif /* not __mips__ */ ++ ++#endif /* _STDARG_H */ +diff -Naur alliance-5.0/genview/src/gcc-1.42/gvarargs.h alliance/genview/src/gcc-1.42/gvarargs.h +--- alliance-5.0/genview/src/gcc-1.42/gvarargs.h 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/gvarargs.h 2002-09-30 18:20:28.000000000 +0200 +@@ -0,0 +1,94 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#ifndef __GNUC__ ++/* Use the system's macros with the system's compiler. */ ++#include ++#else ++/* Record that varargs.h is defined; this turns off stdarg.h. */ ++ ++#ifndef _VARARGS_H ++#define _VARARGS_H ++ ++#ifdef __sparc__ ++#include "va-sparc.h" ++#else ++#ifdef __spur__ ++#include "va-spur.h" ++#else ++#ifdef __mips__ ++#include "va-mips.h" ++#else ++#ifdef __i860__ ++#include "va-i860.h" ++#else ++#ifdef __pyr__ ++#include "va-pyr.h" ++#else ++ ++#ifdef __NeXT__ ++ ++/* On Next, erase any vestiges of stdarg.h. */ ++ ++#undef va_alist ++#undef va_dcl ++#undef va_list ++#undef va_start ++#undef va_end ++#undef __va_rounded_size ++#undef va_arg ++#endif /* __NeXT__ */ ++ ++/* These macros implement traditional (non-ANSI) varargs ++ for GNU C. */ ++ ++#define va_alist __builtin_va_alist ++#define va_dcl int __builtin_va_alist; ++ ++/* Make this a macro rather than a typedef, so we can undef any other defn. */ ++#define va_list __va___list ++typedef char * __va___list; ++ ++#ifdef __sparc__ ++#define va_start(AP) \ ++ (__builtin_saveregs (), \ ++ AP = ((void *) &__builtin_va_alist)) ++#else ++#define va_start(AP) AP=(char *) &__builtin_va_alist ++#endif ++#define va_end(AP) ++ ++#define __va_rounded_size(TYPE) \ ++ (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) ++ ++#define va_arg(AP, TYPE) \ ++ (*((TYPE *) (AP += __va_rounded_size (TYPE), \ ++ AP - __va_rounded_size (TYPE)))) ++ ++#endif /* not pyr */ ++#endif /* not i860 */ ++#endif /* not mips */ ++#endif /* not spur */ ++#endif /* not sparc */ ++#endif /* not _VARARGS_H */ ++#endif /* __GNUC__ */ +diff -Naur alliance-5.0/genview/src/gcc-1.42/hard-params.c alliance/genview/src/gcc-1.42/hard-params.c +--- alliance-5.0/genview/src/gcc-1.42/hard-params.c 1970-01-01 01:00:00.000000000 +0100 ++++ alliance/genview/src/gcc-1.42/hard-params.c 2002-09-30 18:20:28.000000000 +0200 +@@ -0,0 +1,1757 @@ ++/* ++ * This file is part of the Alliance CAD System ++ * Copyright (C) Laboratoire LIP6 - Dpartement ASIM ++ * Universite Pierre et Marie Curie ++ * ++ * Home page : http://www-asim.lip6.fr/alliance/ ++ * E-mail : mailto:alliance-users@asim.lip6.fr ++ * ++ * This progam is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Alliance VLSI CAD System is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General ++ * Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with the GNU C Library; see the file COPYING. If not, write to the Free ++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* Everything you wanted to know about your machine and C compiler, ++ but didn't know who to ask. ++ Author: Steven Pemberton, CWI, Amsterdam; steven@cwi.nl ++ Bugfixes and upgrades gratefully received. ++ ++ Name changed to `hard-params' by Richard Stallman, April 89. ++ xmalloc function defined, Richard Stallman, June 89. ++ Avoid macro in #include, Richard Stallman, Jan 90. ++ Undef CHAR_BIT, etc., if defined in stdio.h, Richard Stallman, Aug 90. ++ In EPROP, don't compare a with old if bad is already set. Stallman, May 91. ++ Don't handle long doubles if -DNO_LONG_DOUBLE. Stallman, May 91. ++ ++ Copyright (c) 1988, 1989 Steven Pemberton, CWI, Amsterdam. ++ All rights reserved. ++ ++ COMPILING ++ With luck and a following wind, just the following will work: ++ cc hard-params.c -o hard-params ++ ++ If your compiler doesn't support: add flag: ++ signed char (eg pcc) -DNO_SC ++ unsigned char -DNO_UC ++ unsigned short and long -DNO_UI ++ signal(), or setjmp/longjmp() -DNO_SIG ++ ++ Try it first with no flags, and see if you get any errors - you might be ++ surprised. (Most non-ANSI compilers need -DNO_SC, though.) ++ Some compilers need a -f flag for floating point. ++ ++ Don't use any optimisation flags: the program may not work if you do. ++ Though "while (a+1.0-a-1.0 == 0.0)" may look like "while(1)" to an ++ optimiser, to a floating-point unit there's a world of difference. ++ ++ Some compilers offer various flags for different floating point ++ modes; it's worth trying all possible combinations of these. ++ ++ Add -DID=\"name\" if you want the machine/flags identified in the output. ++ ++ SYSTEM DEPENDENCIES ++ You may possibly need to add some calls to signal() for other sorts of ++ exception on your machine than SIGFPE, and SIGOVER. See lines beginning ++ #ifdef SIGxxx in main() (and communicate the differences to me!). ++ ++ If your C preprocessor doesn't have the predefined __FILE__ macro, and ++ you want to call this file anything other than hard-params.c, change the ++ #define command for __FILE__ accordingly. If it doesn't accept macro ++ names at all in #include lines, order a new C compiler. While you're ++ waiting for it to arrive, change the last #include in this file (the ++ last but one line) accordingly. ++ ++ OUTPUT ++ Run without argument to get the information as English text. If run ++ with argument -l (e.g. hard-params -l), output is a series of #define's for ++ the ANSI standard limits.h include file, excluding MB_MAX_CHAR. If run ++ with argument -f, output is a series of #define's for the ANSI standard ++ float.h include file. Flag -v gives verbose output: output includes the ++ English text above as C comments. The program exit(0)'s if everything ++ went ok, otherwise it exits with a positive number, telling how many ++ problems there were. ++ ++ VERIFYING THE COMPILER ++ If, having produced the float.h and limits.h header files, you want to ++ verify that the compiler reads them back correctly (there are a lot of ++ boundary cases, of course, like minimum and maximum numbers), you can ++ recompile hard-params.c with -DVERIFY set (plus the other flags that you used ++ when compiling the version that produced the header files). This then ++ recompiles the program so that it #includes "limits.h" and "float.h", ++ and checks that the constants it finds there are the same as the ++ constants it produces. Run the resulting program with hard-params -fl. As of ++ this writing, of 21 compiler/flags combinations only 1 compiler has ++ passed without error! (The honour goes to 'pcc' on an IBM RT.) ++ ++ You can also use this option if your compiler already has both files, ++ and you want to confirm that this program produces the right results. ++ ++ TROUBLE SHOOTING. ++ This program is now quite trustworthy, and suspicious and wrong output ++ may well be caused by bugs in the compiler, not in the program (however ++ of course, this is not guaranteed, and no responsibility can be ++ accepted, etc.) ++ ++ The program only works if overflows are ignored by the C system or ++ are catchable with signal(). ++ ++ If the program fails to run to completion (often with the error message ++ "Unexpected signal at point x"), this often turns out to be a bug in the ++ C compiler's run-time system. Check what was about to be printed, and ++ try to narrow the problem down. ++ ++ Another possible problem is that you have compiled the program to produce ++ loss-of-precision arithmetic traps. The program cannot cope with these, ++ and you should re-compile without them. (They should never be the default). ++ ++ Make sure you compiled with optimisation turned off. ++ ++ Output preceded by *** WARNING: identifies behaviour of the C system ++ deemed incorrect by the program. Likely problems are that printf or ++ scanf don't cope properly with certain boundary numbers. For each float ++ and double that is printed, the printed value is checked that it is ++ correct by using sscanf to read it back. Care is taken that numbers are ++ printed with enough digits to uniquely identify them, and therefore that ++ they can be read back identically. If the number read back is different, ++ the program prints a warning message. If the two numbers in the warning ++ look identical, then printf is more than likely rounding the last ++ digit(s) incorrectly. To put you at ease that the two really are ++ different, the bit patterns of the two numbers are also printed. The ++ difference is very likely in the last bit. Many scanf's read the ++ minimum double back as 0.0, and similarly cause overflow when reading ++ the maximum double. The program quite ruthlessly declares all these ++ behaviours faulty. ++ ++ The warning that "a cast didn't work" refers to cases like this: ++ ++ float f; ++ #define C 1.234567890123456789 ++ f= C; ++ if (f != (float) C) printf ("Wrong!"); ++ ++ A faulty compiler will widen f to double and ignore the cast to float, ++ and because there is more accuracy in a double than a float, fail to ++ recognise that they are the same. In the actual case in point, f and C ++ are passed as parameters to a function that discovers they are not equal, ++ so it's just possible that the error was in the parameter passing, ++ not in the cast (see function Validate()). ++ For ANSI C, which has float constants, the error message is "constant has ++ wrong precision". ++ ++ REPORTING PROBLEMS ++ If the program doesn't work for you for any reason that can't be ++ narrowed down to a problem in the C compiler, or it has to be changed in ++ order to get it to compile, or it produces suspicious output (like a very ++ low maximum float, for instance), please mail the problem and an example ++ of the incorrect output to steven@cwi.nl or mcvax!steven.uucp, so that ++ improvements can be worked into future versions; mcvax/cwi.nl is the ++ European backbone, and is connected to uunet and other fine hosts. ++ ++ This version of the program is the first to try to catch and diagnose ++ bugs in the compiler/run-time system. I would be especially pleased to ++ have reports of failures so that I can improve this service. ++ ++ I apologise unreservedly for the contorted use of the preprocessor... ++ ++ THE SMALL PRINT ++ You may copy and distribute verbatim copies of this source file. ++ ++ You may modify this source file, and copy and distribute such ++ modified versions, provided that you leave the copyright notice ++ at the top of the file and also cause the modified file to carry ++ prominent notices stating that you changed the files and the date ++ of any change; and cause the whole of any work that you distribute ++ or publish, that in whole or in part contains or is a derivative of ++ this program or any part thereof, to be licensed at no charge to ++ all third parties on terms identical to those here. ++ ++ If you do have a fix to any problem, please send it to me, so that ++ other people can have the benefits. ++ ++ While every effort has been taken to make this program as reliable as ++ possible, no responsibility can be taken for the correctness of the ++ output, or suitability for any particular use. ++ ++ ACKNOWLEDGEMENTS ++ Many people have given time and ideas to making this program what it is. ++ To all of them thanks, and apologies for not mentioning them by name. ++*/ ++ ++#ifndef __FILE__ ++#define __FILE__ "hard-params.c" ++#endif ++ ++#ifndef PASS ++#define PASS 1 ++#define PASS1 1 ++#define VERSION "4.1" ++ ++/* Procedure just marks the functions that don't return a result */ ++#ifdef Procedure ++#undef Procedure ++#endif ++#define Procedure ++ ++#define Vprintf if (V) printf ++ ++/* stdc is used in tests like if (stdc) */ ++#ifdef __STDC__ ++#define stdc 1 ++#else ++#define stdc 0 ++#endif ++ ++/* volatile is used to reduce the chance of optimisation, ++ and to prevent variables being put in registers (when setjmp/longjmp ++ wouldn't work as we want) */ ++#ifndef __STDC__ ++#define volatile static ++#endif ++ ++#include ++ ++/* Kludge around the possiblity that includes */ ++#ifdef CHAR_BIT ++#undef CHAR_BIT ++#undef CHAR_MAX ++#undef CHAR_MIN ++#undef SCHAR_MAX ++#undef SCHAR_MIN ++#undef UCHAR_MAX ++#undef UCHAR_MIN ++#endif ++ ++#ifdef VERIFY ++#include "limits.h" ++#include "float.h" ++#endif ++ ++#ifdef NO_SIG /* There's no signal(), or setjmp/longjmp() */ ++ ++ /* Dummy routines instead */ ++ int lab=1; ++ int setjmp(lab) int lab; { return(0); } ++ signal(i, p) int i, (*p)(); {} ++ ++#else ++ ++#include ++#include ++ ++ jmp_buf lab; ++ overflow(sig) int sig; { /* what to do on overflow/underflow */ ++ signal(sig, overflow); ++ longjmp(lab, 1); ++ } ++ ++#endif /*NO_SIG*/ ++ ++#define Unexpected(place) if (setjmp(lab)!=0) croak(place) ++ ++int V= 0, /* verbose */ ++ L= 0, /* produce limits.h */ ++ F= 0, /* produce float.h */ ++ bugs=0; /* The number of (possible) bugs in the output */ ++ ++char co[4], oc[4]; /* Comment starter and ender symbols */ ++ ++int bits_per_byte; /* the number of bits per unit returned by sizeof() */ ++ ++#ifdef TEST ++/* Set the fp modes on a SUN with 68881 chip, to check that different ++ rounding modes etc. get properly detected. ++ Compile with additional flag -DTEST, and run with additional parameter ++ +hex-number, to set the 68881 mode register to hex-number ++*/ ++ ++/* Bits 0x30 = rounding mode: */ ++#define ROUND_BITS 0x30 ++#define TO_NEAREST 0x00 ++#define TO_ZERO 0x10 ++#define TO_MINUS_INF 0x20 ++#define TO_PLUS_INF 0x30 /* The SUN FP user's guide seems to be wrong here */ ++ ++/* Bits 0xc0 = extended rounding: */ ++#define EXT_BITS 0xc0 ++#define ROUND_EXTENDED 0x00 ++#define ROUND_SINGLE 0x40 ++#define ROUND_DOUBLE 0x80 ++ ++/* Enabled traps: */ ++#define EXE_INEX1 0x100 ++#define EXE_INEX2 0x200 ++#define EXE_DZ 0x400 ++#define EXE_UNFL 0x800 ++#define EXE_OVFL 0x1000 ++#define EXE_OPERR 0x2000 ++#define EXE_SNAN 0x4000 ++#define EXE_BSUN 0x8000 ++ ++printmode(new) unsigned new; { ++ fpmode_(&new); ++ printf("New fp mode:\n"); ++ printf(" Round toward "); ++ switch (new & ROUND_BITS) { ++ case TO_NEAREST: printf("nearest"); break; ++ case TO_ZERO: printf("zero"); break; ++ case TO_MINUS_INF: printf("minus infinity"); break; ++ case TO_PLUS_INF: printf("plus infinity"); break; ++ default: printf("???"); break; ++ } ++ ++ printf("\n Extended rounding precision: "); ++ ++ switch (new & EXT_BITS) { ++ case ROUND_EXTENDED: printf("extended"); break; ++ case ROUND_SINGLE: printf("single"); break; ++ case ROUND_DOUBLE: printf("double"); break; ++ default: printf("???"); break; ++ } ++ ++ printf("\n Enabled exceptions:"); ++ if (new & (unsigned) EXE_INEX1) printf(" inex1"); ++ if (new & (unsigned) EXE_INEX2) printf(" inex2"); ++ if (new & (unsigned) EXE_DZ) printf(" dz"); ++ if (new & (unsigned) EXE_UNFL) printf(" unfl"); ++ if (new & (unsigned) EXE_OVFL) printf(" ovfl"); ++ if (new & (unsigned) EXE_OPERR) printf(" operr"); ++ if (new & (unsigned) EXE_SNAN) printf(" snan"); ++ if (new & (unsigned) EXE_BSUN) printf(" bsun"); ++ printf("\n"); ++} ++ ++int setmode(s) char *s; { ++ unsigned mode=0, dig; ++ char c; ++ ++ while (*s) { ++ c= *s++; ++ if (c>='0' && c<='9') dig= c-'0'; ++ else if (c>='a' && c<='f') dig= c-'a'+10; ++ else if (c>='A' && c<='F') dig= c-'A'+10; ++ else return 1; ++ mode= mode<<4 | dig; ++ } ++ printmode(mode); ++ return 0; ++} ++#else ++int setmode(s) char *s; { ++ fprintf(stderr, "Can't set mode: not compiled with TEST\n"); ++ return(1); ++} ++#endif ++ ++croak(place) int place; { ++ printf("*** Unexpected signal at point %d\n", place); ++ exit(bugs+1); /* An exit isn't essential here, but avoids loops */ ++} ++ ++/* This is here in case alloca.c is used. That wants to call this. */ ++ ++char * ++xmalloc(size) unsigned size; { ++ char *malloc(); ++ char *value = malloc(size); ++ if (value == 0) { ++ fprintf(stderr, "Virtual memory exceeded\n"); ++ exit(bugs+1); ++ } ++ return value; ++} ++ ++main(argc, argv) int argc; char *argv[]; { ++ int dprec, fprec, lprec, basic(), fprop(), dprop(), efprop(), edprop(); ++ char *malloc(); ++ unsigned int size; ++ long total; ++ int i; char *s; int bad; ++ ++#ifdef SIGFPE ++ signal(SIGFPE, overflow); ++#endif ++#ifdef SIGOVER ++ signal(SIGOVER, overflow); ++#endif ++/* Add more calls as necessary */ ++ ++ Unexpected(1); ++ ++ bad=0; ++ for (i=1; i < argc; i++) { ++ s= argv[i]; ++ if (*s == '-') { ++ s++; ++ while (*s) { ++ switch (*(s++)) { ++ case 'v': V=1; break; ++ case 'l': L=1; break; ++ case 'f': F=1; break; ++ default: bad=1; break; ++ } ++ } ++ } else if (*s == '+') { ++ s++; ++ bad= setmode(s); ++ } else bad= 1; ++ } ++ if (bad) { ++ fprintf(stderr, ++ "Usage: %s [-vlf]\n v=Verbose l=Limits.h f=Float.h\n", ++ argv[0]); ++ exit(1); ++ } ++ if (L || F) { ++ co[0]= '/'; oc[0]= ' '; ++ co[1]= '*'; oc[1]= '*'; ++ co[2]= ' '; oc[2]= '/'; ++ co[3]= '\0'; oc[3]= '\0'; ++ } else { ++ co[0]= '\0'; oc[0]= '\0'; ++ V=1; ++ } ++ ++ if (L) printf("%slimits.h%s\n", co, oc); ++ if (F) printf("%sfloat.h%s\n", co, oc); ++#ifdef ID ++ printf("%sProduced on %s by hard-params version %s, CWI, Amsterdam%s\n", ++ co, ID, VERSION, oc); ++#else ++ printf("%sProduced by hard-params version %s, CWI, Amsterdam%s\n", ++ co, VERSION, oc); ++#endif ++ ++#ifdef VERIFY ++ printf("%sVerification phase%s\n", co, oc); ++#endif ++ ++#ifdef NO_SIG ++ Vprintf("%sCompiled without signal(): %s%s\n", ++ co, ++ "there's nothing that can be done if overflow occurs", ++ oc); ++#endif ++#ifdef NO_SC ++ Vprintf("%sCompiled without signed char%s\n", co, oc); ++#endif ++#ifdef NO_UC ++ Vprintf("%Compiled without unsigned char%s\n", co, oc); ++#endif ++#ifdef NO_UI ++ Vprintf("%Compiled without unsigned short or long%s\n", co, oc); ++#endif ++#ifdef __STDC__ ++ Vprintf("%sCompiler claims to be ANSI C level %d%s\n", ++ co, __STDC__, oc); ++#else ++ Vprintf("%sCompiler does not claim to be ANSI C%s\n", co, oc); ++#endif ++ printf("\n"); ++ bits_per_byte= basic(); ++ Vprintf("\n"); ++ if (F||V) { ++ fprec= fprop(bits_per_byte); ++ dprec= dprop(bits_per_byte); ++ lprec= ldprop(bits_per_byte); ++ efprop(fprec, dprec, lprec); ++ edprop(fprec, dprec, lprec); ++ eldprop(fprec, dprec, lprec); ++ } ++ if (V) { ++ /* An extra goody: the approximate amount of data-space */ ++ /* Allocate store until no more available */ ++ size=1<<((bits_per_byte*sizeof(int))-2); ++ total=0; ++ while (size!=0) { ++ while (malloc(size)!=(char *)NULL) total+=(size/2); ++ size/=2; ++ } ++ ++ Vprintf("%sMemory mallocatable ~= %ld Kbytes%s\n", ++ co, (total+511)/512, oc); ++ } ++ exit(bugs); ++} ++ ++Procedure eek_a_bug(problem) char *problem; { ++ printf("\n%s*** WARNING: %s%s\n", co, problem, oc); ++ bugs++; ++} ++ ++Procedure i_define(sort, name, val, req) char *sort, *name; long val, req; { ++ if (val >= 0) { ++ printf("#define %s%s %ld\n", sort, name, val); ++ } else { ++ printf("#define %s%s (%ld)\n", sort, name, val); ++ } ++ if (val != req) { ++ printf("%s*** Verify failed for above #define!\n", co); ++ printf(" Compiler has %ld for value%s\n\n", req, oc); ++ bugs++; ++ } ++ Vprintf("\n"); ++} ++ ++#ifndef NO_UI ++ ++#ifdef __STDC__ ++#define U "U" ++#else ++#define U "" ++#endif ++ ++Procedure u_define(sort, name, val, req) char *sort, *name; unsigned long val, req; { ++ printf("#define %s%s %lu%s\n", sort, name, val, U); ++ if (val != req) { ++ printf("%s*** Verify failed for above #define!\n", co); ++ printf(" Compiler has %lu for value%s\n\n", req, oc); ++ bugs++; ++ } ++ Vprintf("\n"); ++} ++#endif ++ ++/* Long_double is the longest floating point type available: */ ++#if defined(__STDC__) && !defined(NO_LONG_DOUBLE) ++#define Long_double long double ++#else ++#define Long_double double ++#endif ++ ++char *f_rep(); ++ ++Procedure f_define(sort, name, precision, val, mark) ++ char *sort, *name; int precision; Long_double val; char *mark; { ++ if (stdc) { ++ printf("#define %s%s %s%s\n", ++ sort, name, f_rep(precision, val), mark); ++ } else if (*mark == 'F') { ++ /* non-ANSI C has no float constants, so cast the constant */ ++ printf("#define %s%s ((float)%s)\n", ++ sort, name, f_rep(precision, val)); ++ } else { ++ printf("#define %s%s %s\n", sort, name, f_rep(precision, val)); ++ } ++ Vprintf("\n"); ++} ++ ++int floor_log(base, x) int base; Long_double x; { /* return floor(log base(x)) */ ++ int r=0; ++ while (x>=base) { r++; x/=base; } ++ return r; ++} ++ ++int ceil_log(base, x) int base; Long_double x; { ++ int r=0; ++ while (x>1.0) { r++; x/=base; } ++ return r; ++} ++ ++int exponent(x, fract, exp) Long_double x; double *fract; int *exp; { ++ /* Split x into a fraction and a power of ten; ++ returns 0 if x is unusable, 1 otherwise. ++ Only used for error messages about faulty output. ++ */ ++ int r=0, neg=0; ++ Long_double old; ++ *fract=0.0; *exp=0; ++ if (x<0.0) { ++ x= -x; ++ neg= 1; ++ } ++ if (x==0.0) return 1; ++ if (x>=10.0) { ++ while (x>=10.0) { ++ old=x; r++; x/=10.0; ++ if (old==x) return 0; ++ } ++ } else { ++ while (x<1.0) { ++ old=x; r--; x*=10.0; ++ if (old==x) return 0; ++ } ++ } ++ if (neg) *fract= -x; ++ else *fract=x; ++ *exp=r; ++ return 1; ++} ++ ++#define fabs(x) (((x)<0.0)?(-x):(x)) ++ ++char *f_rep(precision, val) int precision; Long_double val; { ++ static char buf[1024]; ++ char *f1; ++ if (sizeof(double) == sizeof(Long_double)) { ++ /* Assume they're the same, and use non-stdc format */ ++ /* This is for stdc compilers using non-stdc libraries */ ++ f1= "%.*e"; ++ } else { ++ /* It had better support Le then */ ++ f1= "%.*Le"; ++ } ++ sprintf(buf, f1, precision, val); ++ return buf; ++} ++ ++Procedure bitpattern(p, size) char *p; int size; { ++ char c; ++ int i, j; ++ ++ for (i=1; i<=size; i++) { ++ c= *p; ++ p++; ++ for (j=bits_per_byte-1; j>=0; j--) ++ printf("%c", (c>>j)&1 ? '1' : '0'); ++ if (i!=size) printf(" "); ++ } ++} ++ ++#define Order(x, px, mode)\ ++ printf("%s %s ", co, mode); for (i=0; i>(bits_per_byte*(sizeof(x)-i)))&mask)); }\ ++ printf("%s\n", oc); ++ ++Procedure endian(bits_per_byte) int bits_per_byte; { ++ /*unsigned*/ short s=0; ++ /*unsigned*/ int j=0; ++ /*unsigned*/ long l=0; ++ ++ char *ps= (char *) &s, ++ *pj= (char *) &j, ++ *pl= (char *) &l, ++ *c= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ++ unsigned int mask, i; ++ ++ mask=0; ++ for (i=1; i<=bits_per_byte; i++) mask= (mask<<1)|1; ++ ++ if (V) { ++ printf("%sCharacter order:%s\n", co, oc); ++ Order(s, ps, "short:"); ++ Order(j, pj, "int: "); ++ Order(l, pl, "long: "); ++ } ++} ++ ++#ifdef VERIFY ++#ifndef SCHAR_MAX ++#define SCHAR_MAX char_max ++#define SCHAR_MIN char_min ++#endif ++#ifndef UCHAR_MAX ++#define UCHAR_MAX char_max ++#endif ++#else ++#define CHAR_BIT char_bit ++#define CHAR_MAX char_max ++#define CHAR_MIN char_min ++#define SCHAR_MAX char_max ++#define SCHAR_MIN char_min ++#define UCHAR_MAX char_max ++#endif /* VERIFY */ ++ ++int cprop() { /* Properties of character */ ++ volatile char c, char_max, char_min; ++ volatile int bits_per_byte, is_signed; ++ long char_bit; ++ ++ Unexpected(2); ++ ++ /* Calculate number of bits per character *************************/ ++ c=1; bits_per_byte=0; ++ do { c=c<<1; bits_per_byte++; } while(c!=0); ++ c= (char)(-1); ++ if (((int)c)<0) is_signed=1; ++ else is_signed=0; ++ Vprintf("%sChar = %d bits, %ssigned%s\n", ++ co, (int)sizeof(c)*bits_per_byte, (is_signed?"":"un"), oc); ++ char_bit=(long)(sizeof(c)*bits_per_byte); ++ if (L) i_define("CHAR", "_BIT", char_bit, (long) CHAR_BIT); ++ ++ c=0; char_max=0; ++ c++; ++ if (setjmp(lab)==0) { /* Yields char_max */ ++ while (c>char_max) { ++ char_max=c; ++ c++; ++ } ++ } else { ++ Vprintf("%sCharacter overflow generates a trap!%s\n", co, oc); ++ } ++ c=0; char_min=0; ++ c--; ++ if (setjmp(lab)==0) { /* Yields char_min */ ++ while (cchar_max) { ++ char_max=c; ++ c++; ++ } ++ } ++ Unexpected(4); ++ i_define("UCHAR", "_MAX", (long) char_max, ++ (long) UCHAR_MAX); ++#endif ++ } else { ++#ifndef NO_SC /* Define NO_SC if the next line gives a syntax error */ ++ volatile signed char c, char_max, char_min; ++ c=0; char_max=0; ++ c++; ++ if (setjmp(lab)==0) { /* Yields char_max */ ++ while (c>char_max) { ++ char_max=c; ++ c++; ++ } ++ } ++ c=0; char_min=0; ++ c--; ++ if (setjmp(lab)==0) { /* Yields char_min */ ++ while (csizeof(int)?" BEWARE! larger than int!":"", ++ oc); ++ Vprintf("%sInt pointers = %d bits%s%s\n", ++ co, (int)sizeof(int *)*bits_per_byte, ++ sizeof(int *)>sizeof(int)?" BEWARE! larger than int!":"", ++ oc); ++ sprop(); ++ iprop(); ++ lprop(); ++ usprop(); ++ uiprop(); ++ ulprop(); ++ ++ Unexpected(6); ++ ++ /* Alignment constants ********************************************/ ++ Vprintf("%sAlignments used for char=%d short=%d int=%d long=%d%s\n", ++ co, ++ (int)sizeof(struct{char i1; char c1;})-(int)sizeof(char), ++ (int)sizeof(struct{short i2; char c2;})-(int)sizeof(short), ++ (int)sizeof(struct{int i3; char c3;})-(int)sizeof(int), ++ (int)sizeof(struct{long i4; char c4;})-(int)sizeof(long), ++ oc); ++ ++ /* Ten little endians *********************************************/ ++ ++ endian(bits_per_byte); ++ ++ /* Pointers *******************************************************/ ++ if (V) { ++ if ("abcd"=="abcd") ++ printf("%sStrings are shared%s\n", co, oc); ++ else printf("%sStrings are not shared%s\n", co, oc); ++ } ++ ++ return bits_per_byte; ++} ++ ++#endif /* ifndef PASS */ ++ ++/* As I said, I apologise for the contortions below. The functions are ++ expanded by the preprocessor twice or three times (for float and double, ++ and maybe for long double, and for short, int and long). That way, ++ I never make a change to one that I forget to make to the other. ++ You can look on it as C's fault for not supporting multi-line macro's. ++ This whole file is read 3 times by the preprocessor, with PASSn set for ++ n=1, 2 or 3, to decide which parts to reprocess. ++*/ ++ ++/* #undef on an already undefined thing is (wrongly) flagged as an error ++ by some compilers, therefore the #ifdef that follows: ++*/ ++#ifdef Number ++#undef Number ++#undef THING ++#undef Thing ++#undef thing ++#undef FPROP ++#undef Fname ++#undef Store ++#undef Sum ++#undef Diff ++#undef Mul ++#undef Div ++#undef Self ++#undef F_check ++#undef Validate ++#undef EPROP ++#undef MARK ++ ++#undef F_RADIX ++#undef F_MANT_DIG ++#undef F_DIG ++#undef F_ROUNDS ++#undef F_EPSILON ++#undef F_MIN_EXP ++#undef F_MIN ++#undef F_MIN_10_EXP ++#undef F_MAX_EXP ++#undef F_MAX ++#undef F_MAX_10_EXP ++#endif ++ ++#ifdef Integer ++#undef Integer ++#undef INT ++#undef IPROP ++#undef Iname ++#undef UPROP ++#undef Uname ++#undef OK_UI ++ ++#undef I_MAX ++#undef I_MIN ++#undef U_MAX ++#endif ++ ++#ifdef PASS1 ++ ++#define Number float ++#define THING "FLOAT" ++#define Thing "Float" ++#define thing "float" ++#define Fname "FLT" ++#define FPROP fprop ++#define Store fStore ++#define Sum fSum ++#define Diff fDiff ++#define Mul fMul ++#define Div fDiv ++#define Self fSelf ++#define F_check fCheck ++#define Validate fValidate ++#define MARK "F" ++ ++#define EPROP efprop ++ ++#define Integer short ++#define INT "short" ++#define IPROP sprop ++#define Iname "SHRT" ++#ifndef NO_UI ++#define OK_UI 1 ++#endif ++ ++#define UPROP usprop ++#define Uname "USHRT" ++ ++#ifdef VERIFY ++#define I_MAX SHRT_MAX ++#define I_MIN SHRT_MIN ++#define U_MAX USHRT_MAX ++ ++#define F_RADIX FLT_RADIX ++#define F_MANT_DIG FLT_MANT_DIG ++#define F_DIG FLT_DIG ++#define F_ROUNDS FLT_ROUNDS ++#define F_EPSILON FLT_EPSILON ++#define F_MIN_EXP FLT_MIN_EXP ++#define F_MIN FLT_MIN ++#define F_MIN_10_EXP FLT_MIN_10_EXP ++#define F_MAX_EXP FLT_MAX_EXP ++#define F_MAX FLT_MAX ++#define F_MAX_10_EXP FLT_MAX_10_EXP ++#endif /* VERIFY */ ++ ++#endif /* PASS1 */ ++ ++#ifdef PASS2 ++ ++#define Number double ++#define THING "DOUBLE" ++#define Thing "Double" ++#define thing "double" ++#define Fname "DBL" ++#define FPROP dprop ++#define Store dStore ++#define Sum dSum ++#define Diff dDiff ++#define Mul dMul ++#define Div dDiv ++#define Self dSelf ++#define F_check dCheck ++#define Validate dValidate ++#define MARK "" ++ ++#define EPROP edprop ++ ++#define Integer int ++#define INT "int" ++#define IPROP iprop ++#define Iname "INT" ++#define OK_UI 1 /* Unsigned int is always possible */ ++ ++#define UPROP uiprop ++#define Uname "UINT" ++ ++#ifdef VERIFY ++#define I_MAX INT_MAX ++#define I_MIN INT_MIN ++#define U_MAX UINT_MAX ++ ++#define F_MANT_DIG DBL_MANT_DIG ++#define F_DIG DBL_DIG ++#define F_EPSILON DBL_EPSILON ++#define F_MIN_EXP DBL_MIN_EXP ++#define F_MIN DBL_MIN ++#define F_MIN_10_EXP DBL_MIN_10_EXP ++#define F_MAX_EXP DBL_MAX_EXP ++#define F_MAX DBL_MAX ++#define F_MAX_10_EXP DBL_MAX_10_EXP ++#endif /* VERIFY */ ++ ++#endif /* PASS2 */ ++ ++#ifdef PASS3 ++ ++#if defined(__STDC__) && !defined(NO_LONG_DOUBLE) ++#define Number long double ++#endif ++ ++#define THING "LONG DOUBLE" ++#define Thing "Long double" ++#define thing "long double" ++#define Fname "LDBL" ++#define FPROP ldprop ++#define Store ldStore ++#define Sum ldSum ++#define Diff ldDiff ++#define Mul ldMul ++#define Div ldDiv ++#define Self ldSelf ++#define F_check ldCheck ++#define Validate ldValidate ++#define MARK "L" ++ ++#define EPROP eldprop ++ ++#define Integer long ++#define INT "long" ++#define IPROP lprop ++#define Iname "LONG" ++#ifndef NO_UI ++#define OK_UI 1 ++#endif ++ ++#define UPROP ulprop ++#define Uname "ULONG" ++ ++#ifdef VERIFY ++#define I_MAX LONG_MAX ++#define I_MIN LONG_MIN ++#define U_MAX ULONG_MAX ++ ++#define F_MANT_DIG LDBL_MANT_DIG ++#define F_DIG LDBL_DIG ++#define F_EPSILON LDBL_EPSILON ++#define F_MIN_EXP LDBL_MIN_EXP ++#define F_MIN LDBL_MIN ++#define F_MIN_10_EXP LDBL_MIN_10_EXP ++#define F_MAX_EXP LDBL_MAX_EXP ++#define F_MAX LDBL_MAX ++#define F_MAX_10_EXP LDBL_MAX_10_EXP ++#endif /* VERIFY */ ++ ++#endif /* PASS3 */ ++ ++#ifndef VERIFY ++#define I_MAX int_max ++#define I_MIN int_min ++#define U_MAX int_max ++ ++#define F_RADIX f_radix ++#define F_MANT_DIG f_mant_dig ++#define F_DIG f_dig ++#define F_ROUNDS f_rounds ++#define F_EPSILON f_epsilon ++#define F_MIN_EXP f_min_exp ++#define F_MIN f_min ++#define F_MIN_10_EXP f_min_10_exp ++#define F_MAX_EXP f_max_exp ++#define F_MAX f_max ++#define F_MAX_10_EXP f_max_10_exp ++#endif ++ ++Procedure IPROP() { /* for short, int, and long */ ++ volatile Integer newi, int_max, maxeri, int_min, minneri; ++ volatile int ibits, ipower, two=2; ++ ++ /* Calculate max short/int/long ***********************************/ ++ /* Calculate 2**n-1 until overflow - then use the previous value */ ++ ++ newi=1; int_max=0; ++ ++ if (setjmp(lab)==0) { /* Yields int_max */ ++ for(ipower=0; newi>int_max; ipower++) { ++ int_max=newi; ++ newi=newi*two+1; ++ } ++ Vprintf("%sOverflow of a%s %s does not generate a trap%s\n", ++ co, INT[0]=='i'?"n":"", INT, oc); ++ } else { ++ Vprintf("%sOverflow of a%s %s generates a trap%s\n", ++ co, INT[0]=='i'?"n":"", INT, oc); ++ } ++ Unexpected(7); ++ ++ /* Minimum value: assume either two's or one's complement *********/ ++ int_min= -int_max; ++ if (setjmp(lab)==0) { /* Yields int_min */ ++ if (int_min-1 < int_min) int_min--; ++ } ++ Unexpected(8); ++ ++ /* Now for those daft Cybers: */ ++ ++ maxeri=0; newi=int_max; ++ ++ if (setjmp(lab)==0) { /* Yields maxeri */ ++ for(ibits=ipower; newi>maxeri; ibits++) { ++ maxeri=newi; ++ newi=newi+newi+1; ++ } ++ } ++ Unexpected(9); ++ ++ minneri= -maxeri; ++ if (setjmp(lab)==0) { /* Yields minneri */ ++ if (minneri-1 < minneri) minneri--; ++ } ++ Unexpected(10); ++ ++ Vprintf("%sMaximum %s = %ld (= 2**%d-1)%s\n", ++ co, INT, (long)int_max, ipower, oc); ++ Vprintf("%sMinimum %s = %ld%s\n", co, INT, (long)int_min, oc); ++ ++ if (L) i_define(Iname, "_MAX", (long) int_max, (long) I_MAX); ++ if (L) i_define(Iname, "_MIN", (long) int_min, (long) I_MIN); ++ ++ if (maxeri>int_max) { ++ Vprintf("%sThere is a larger %s, %ld (= 2**%d-1), %s %s%s\n", ++ co, INT, (long)maxeri, ibits, ++ "but only for addition, not multiplication", ++ "(I smell a Cyber!)", ++ oc); ++ } ++ ++ if (minneriint_max) { ++ int_max=newi; ++ newi=newi*two+1; ++ } ++ } ++ Unexpected(11); ++ Vprintf("%sMaximum unsigned %s = %lu%s\n", ++ co, INT, (unsigned long) int_max, oc); ++ if (L) u_define(Uname, "_MAX", (unsigned long) int_max, ++ (unsigned long) U_MAX); ++#endif ++} ++ ++ ++#ifdef Number ++ ++/* These routines are intended to defeat any attempt at optimisation ++ or use of extended precision, and to defeat faulty narrowing casts: ++*/ ++Procedure Store(a, b) Number a, *b; { *b=a; } ++Number Sum(a, b) Number a, b; { Number r; Store(a+b, &r); return (r); } ++Number Diff(a, b) Number a, b; { Number r; Store(a-b, &r); return (r); } ++Number Mul(a, b) Number a, b; { Number r; Store(a*b, &r); return (r); } ++Number Div(a, b) Number a, b; { Number r; Store(a/b, &r); return (r); } ++Number Self(a) Number a; { Number r; Store(a, &r); return (r); } ++ ++Procedure F_check(precision, val1) int precision; Long_double val1; { ++ /* You don't think I'm going to go to all the trouble of writing ++ a program that works out what all sorts of values are, only to ++ have printf go and print the wrong values out, do you? ++ No, you're right, so this function tries to see if printf ++ has written the right value, by reading it back again. ++ This introduces a new problem of course: suppose printf writes ++ the correct value, and scanf reads it back wrong... oh well. ++ But I'm adamant about this: the precision given is enough ++ to uniquely identify the printed number, therefore I insist ++ that sscanf read the number back identically. Harsh yes, but ++ sometimes you've got to be cruel to be kind. ++ */ ++ Long_double new1; ++ Number val, new, diff; ++ double rem; ++ int e; ++ char *rep; ++ char *f2; ++ ++ if (sizeof(double) == sizeof(Long_double)) { ++ /* Assume they're the same, and use non-stdc format */ ++ /* This is for stdc compilers using non-stdc libraries */ ++ f2= "%le"; /* Input */ ++ } else { ++ /* It had better support Le then */ ++ f2= "%Le"; ++ } ++ val= val1; ++ rep= f_rep(precision, (Long_double) val); ++ if (setjmp(lab)==0) { ++ sscanf(rep, f2, &new1); ++ } else { ++ eek_a_bug("sscanf caused a trap"); ++ printf("%s scanning: %s format: %s%s\n\n", co, rep, f2, oc); ++ Unexpected(12); ++ return; ++ } ++ ++ if (setjmp(lab)==0) { /* See if new is usable */ ++ new= new1; ++ if (new != 0.0) { ++ diff= val/new - 1.0; ++ if (diff < 0.1) diff= 1.0; ++ /* That should be enough to generate a trap */ ++ } ++ } else { ++ eek_a_bug("sscanf returned an unusable number"); ++ printf("%s scanning: %s with format: %s%s\n\n", ++ co, rep, f2, oc); ++ Unexpected(13); ++ return; ++ } ++ ++ Unexpected(14); ++ if (new != val) { ++ eek_a_bug("Possibly bad output from printf above"); ++ if (!exponent(val, &rem, &e)) { ++ printf("%s but value was an unusable number%s\n\n", ++ co, oc); ++ return; ++ } ++ printf("%s expected value around %.*fe%d, bit pattern:\n ", ++ co, precision, rem, e); ++ bitpattern((char *) &val, sizeof(val)); ++ printf ("%s\n", oc); ++ printf("%s sscanf gave %s, bit pattern:\n ", ++ co, f_rep(precision, (Long_double) new)); ++ bitpattern((char *) &new, sizeof(new)); ++ printf ("%s\n", oc); ++ printf("%s difference= %s%s\n\n", ++ co, f_rep(precision, (Long_double) (val-new)), oc); ++ } ++} ++ ++Procedure Validate(prec, val, req, same) int prec, same; Long_double val, req; { ++ Unexpected(15); ++ if (!same) { ++ printf("%s*** Verify failed for above #define!\n", co); ++ if (setjmp(lab) == 0) { /* for the case that req == nan */ ++ printf(" Compiler has %s for value%s\n", ++ f_rep(prec, req), oc); ++ } else { ++ printf(" Compiler has %s for value%s\n", ++ "an unusable number", oc); ++ } ++ if (setjmp(lab) == 0) { ++ F_check(prec, (Long_double) req); ++ } /*else forget it*/ ++ if (setjmp(lab) == 0) { ++ if (req > 0.0 && val > 0.0) { ++ printf("%s difference= %s%s\n", ++ co, f_rep(prec, val-req), oc); ++ } ++ } /*else forget it*/ ++ Unexpected(16); ++ printf("\n"); ++ bugs++; ++ } else if (val != req) { ++ if (stdc) { ++ printf("%s*** Verify failed for above #define!\n", co); ++ printf(" Constant has the wrong precision%s\n", ++ oc); ++ bugs++; ++ } else eek_a_bug("the cast didn't work"); ++ printf("\n"); ++ } ++} ++ ++int FPROP(bits_per_byte) int bits_per_byte; { ++ /* Properties of floating types, using algorithms by Cody and Waite ++ from MA Malcolm, as modified by WM Gentleman and SB Marovich. ++ Further extended by S Pemberton. ++ ++ Returns the number of digits in the fraction. ++ */ ++ ++ volatile int i, f_radix, iexp, irnd, mrnd, f_rounds, f_mant_dig, ++ iz, k, inf, machep, f_max_exp, f_min_exp, mx, negeps, ++ mantbits, digs, f_dig, trap, ++ hidden, normal, f_min_10_exp, f_max_10_exp; ++ volatile Number a, b, base, basein, basem1, f_epsilon, epsneg, ++ f_max, newxmax, f_min, xminner, y, y1, z, z1, z2; ++ ++ Unexpected(17); ++ ++ Vprintf("%sPROPERTIES OF %s:%s\n", co, THING, oc); ++ ++ /* Base and size of mantissa **************************************/ ++ /* First repeatedly double until adding 1 has no effect. */ ++ /* For instance, if base is 10, with 3 significant digits */ ++ /* it will try 1, 2, 4, 8, ... 512, 1024, and stop there, */ ++ /* since 1024 is only representable as 1020. */ ++ a=1.0; ++ if (setjmp(lab)==0) { /* inexact trap? */ ++ do { a=Sum(a, a); } ++ while (Diff(Diff(Sum(a, 1.0), a), 1.0) == 0.0); ++ } else { ++ fprintf(stderr, "*** Program got loss-of-precision trap!\n"); ++ /* And supporting those is just TOO much trouble! */ ++ exit(bugs+1); ++ } ++ Unexpected(18); ++ /* Now double until you find a number that can be added to the */ ++ /* above number. For 1020 this is 8 or 16, depending whether the */ ++ /* result is rounded or truncated. */ ++ /* In either case the result is 1030. 1030-1020= the base, 10. */ ++ b=1.0; ++ do { b=Sum(b, b); } while ((base=Diff(Sum(a, b), a)) == 0.0); ++ f_radix=base; ++ Vprintf("%sBase = %d%s\n", co, f_radix, oc); ++ ++ /* Sanity check; if base<2, I can't guarantee the rest will work */ ++ if (f_radix < 2) { ++ eek_a_bug("Function return or parameter passing faulty? (This is a guess.)"); ++ printf("\n"); ++ return(0); ++ } ++ ++#ifdef PASS1 /* only for FLT */ ++ if (F) i_define("FLT", "_RADIX", (long) f_radix, (long) F_RADIX); ++#endif ++ ++ /* Now the number of digits precision: */ ++ f_mant_dig=0; b=1.0; ++ do { f_mant_dig++; b=Mul(b, base); } ++ while (Diff(Diff(Sum(b,1.0),b),1.0) == 0.0); ++ f_dig=floor_log(10, (Long_double)(b/base)) + (base==10?1:0); ++ Vprintf("%sSignificant base digits = %d %s %d %s%s\n", ++ co, f_mant_dig, "(= at least", f_dig, "decimal digits)", oc); ++ if (F) i_define(Fname, "_MANT_DIG", (long) f_mant_dig, ++ (long) F_MANT_DIG); ++ if (F) i_define(Fname, "_DIG", (long) f_dig, (long) F_DIG); ++ digs= ceil_log(10, (Long_double)b); /* the number of digits to printf */ ++ ++ /* Rounding *******************************************************/ ++ basem1=Diff(base, 0.5); ++ if (Diff(Sum(a, basem1), a) != 0.0) { ++ if (f_radix == 2) basem1=0.375; ++ else basem1=1.0; ++ if (Diff(Sum(a, basem1), a) != 0.0) irnd=2; /* away from 0 */ ++ else irnd=1; /* to nearest */ ++ } else irnd=0; /* towards 0 */ ++ ++ basem1=Diff(base, 0.5); ++ ++ if (Diff(Diff(-a, basem1), -a) != 0.0) { ++ if (f_radix == 2) basem1=0.375; ++ else basem1=1.0; ++ if (Diff(Diff(-a, basem1), -a) != 0.0) mrnd=2; /* away from 0*/ ++ else mrnd=1; /* to nearest */ ++ } else mrnd=0; /* towards 0 */ ++ ++ f_rounds=4; /* Unknown rounding */ ++ if (irnd==0 && mrnd==0) f_rounds=0; /* zero = chops */ ++ if (irnd==1 && mrnd==1) f_rounds=1; /* nearest */ ++ if (irnd==2 && mrnd==0) f_rounds=2; /* +inf */ ++ if (irnd==0 && mrnd==2) f_rounds=3; /* -inf */ ++ ++ if (f_rounds != 4) { ++ Vprintf("%sArithmetic rounds towards ", co); ++ switch (f_rounds) { ++ case 0: Vprintf("zero (i.e. it chops)"); break; ++ case 1: Vprintf("nearest"); break; ++ case 2: Vprintf("+infinity"); break; ++ case 3: Vprintf("-infinity"); break; ++ default: Vprintf("???"); break; ++ } ++ Vprintf("%s\n", oc); ++ } else { /* Hmm, try to give some help here: */ ++ Vprintf("%sArithmetic rounds oddly: %s\n", co, oc); ++ Vprintf("%s Negative numbers %s%s\n", ++ co, mrnd==0 ? "towards zero" : ++ mrnd==1 ? "to nearest" : ++ "away from zero", ++ oc); ++ Vprintf("%s Positive numbers %s%s\n", ++ co, irnd==0 ? "towards zero" : ++ irnd==1 ? "to nearest" : ++ "away from zero", ++ oc); ++ } ++ /* An extra goody */ ++ if (f_radix == 2 && f_rounds == 1) { ++ if (Diff(Sum(a, 1.0), a) != 0.0) { ++ Vprintf("%s Tie breaking rounds up%s\n", co, oc); ++ } else if (Diff(Sum(a, 3.0), a) == 4.0) { ++ Vprintf("%s Tie breaking rounds to even%s\n", co, oc); ++ } else { ++ Vprintf("%s Tie breaking rounds down%s\n", co, oc); ++ } ++ } ++#ifdef PASS1 /* only for FLT */ ++ if (F) i_define("FLT", "_ROUNDS", (long) f_rounds, (long) F_ROUNDS); ++#endif ++ ++ /* Various flavours of epsilon ************************************/ ++ negeps=f_mant_dig+f_mant_dig; ++ basein=1.0/base; ++ a=1.0; ++ for(i=1; i<=negeps; i++) a*=basein; ++ ++ b=a; ++ while (Diff(Diff(1.0, a), 1.0) == 0.0) { ++ a*=base; ++ negeps--; ++ } ++ negeps= -negeps; ++ Vprintf("%sSmallest x such that 1.0-base**x != 1.0 = %d%s\n", ++ co, negeps, oc); ++ ++ epsneg=a; ++ if ((f_radix!=2) && irnd) { ++ /* a=(a*(1.0+a))/(1.0+1.0); => */ ++ a=Div(Mul(a, Sum(1.0, a)), Sum(1.0, 1.0)); ++ /* if ((1.0-a)-1.0 != 0.0) epsneg=a; => */ ++ if (Diff(Diff(1.0, a), 1.0) != 0.0) epsneg=a; ++ } ++ Vprintf("%sSmall x such that 1.0-x != 1.0 = %s%s\n", ++ co, f_rep(digs, (Long_double) epsneg), oc); ++ /* it may not be the smallest */ ++ if (V) F_check(digs, (Long_double) epsneg); ++ Unexpected(19); ++ ++ machep= -f_mant_dig-f_mant_dig; ++ a=b; ++ while (Diff(Sum(1.0, a), 1.0) == 0.0) { a*=base; machep++; } ++ Vprintf("%sSmallest x such that 1.0+base**x != 1.0 = %d%s\n", ++ co, machep, oc); ++ ++ f_epsilon=a; ++ if ((f_radix!=2) && irnd) { ++ /* a=(a*(1.0+a))/(1.0+1.0); => */ ++ a=Div(Mul(a, Sum(1.0, a)), Sum(1.0, 1.0)); ++ /* if ((1.0+a)-1.0 != 0.0) f_epsilon=a; => */ ++ if (Diff(Sum(1.0, a), 1.0) != 0.0) f_epsilon=a; ++ } ++ Vprintf("%sSmallest x such that 1.0+x != 1.0 = %s%s\n", ++ co, f_rep(digs, (Long_double) f_epsilon), oc); ++ /* Possible loss of precision warnings here from non-stdc compilers: */ ++ if (F) f_define(Fname, "_EPSILON", digs, (Long_double) f_epsilon, MARK); ++ if (V || F) F_check(digs, (Long_double) f_epsilon); ++ Unexpected(20); ++ if (F) Validate(digs, (Long_double) f_epsilon, (Long_double) F_EPSILON, ++ f_epsilon == Self(F_EPSILON)); ++ Unexpected(21); ++ ++ /* Extra chop info *************************************************/ ++ if (f_rounds == 0) { ++ if (Diff(Mul(Sum(1.0,f_epsilon),1.0),1.0) != 0.0) { ++ Vprintf("%sAlthough arithmetic chops, it uses guard digits%s\n", co, oc); ++ } ++ } ++ ++ /* Size of and minimum normalised exponent ************************/ ++ y=0; i=0; k=1; z=basein; z1=(1.0+f_epsilon)/base; ++ ++ /* Coarse search for the largest power of two */ ++ if (setjmp(lab)==0) { /* for underflow trap */ /* Yields i, k, y, y1 */ ++ do { ++ y=z; y1=z1; ++ z=Mul(y,y); z1=Mul(z1, y); ++ a=Mul(z,1.0); ++ z2=Div(z1,y); ++ if (z2 != y1) break; ++ if ((Sum(a,a) == 0.0) || (fabs(z) >= y)) break; ++ i++; ++ k+=k; ++ } while(1); ++ } else { ++ Vprintf("%s%s underflow generates a trap%s\n", co, Thing, oc); ++ } ++ Unexpected(22); ++ ++ if (f_radix != 10) { ++ iexp=i+1; /* for the sign */ ++ mx=k+k; ++ } else { ++ iexp=2; ++ iz=f_radix; ++ while (k >= iz) { iz*=f_radix; iexp++; } ++ mx=iz+iz-1; ++ } ++ ++ /* Fine tune starting with y and y1 */ ++ if (setjmp(lab)==0) { /* for underflow trap */ /* Yields k, f_min */ ++ do { ++ f_min=y; z1=y1; ++ y=Div(y,base); y1=Div(y1,base); ++ a=Mul(y,1.0); ++ z2=Mul(y1,base); ++ if (z2 != z1) break; ++ if ((Sum(a,a) == 0.0) || (fabs(y) >= f_min)) break; ++ k++; ++ } while (1); ++ } ++ Unexpected(23); ++ ++ f_min_exp=(-k)+1; ++ ++ if ((mx <= k+k-3) && (f_radix != 10)) { mx+=mx; iexp+=1; } ++ Vprintf("%sNumber of bits used for exponent = %d%s\n", co, iexp, oc); ++ Vprintf("%sMinimum normalised exponent = %d%s\n", co, f_min_exp, oc); ++ if (F) i_define(Fname, "_MIN_EXP", (long) f_min_exp, (long) F_MIN_EXP); ++ ++ if (setjmp(lab)==0) { ++ Vprintf("%sMinimum normalised positive number = %s%s\n", ++ co, f_rep(digs, (Long_double) f_min), oc); ++ } else { ++ eek_a_bug("printf can't print the smallest normalised number"); ++ printf("\n"); ++ } ++ Unexpected(24); ++ /* Possible loss of precision warnings here from non-stdc compilers: */ ++ if (setjmp(lab) == 0) { ++ if (F) f_define(Fname, "_MIN", digs, (Long_double) f_min, MARK); ++ if (V || F) F_check(digs, (Long_double) f_min); ++ } else { ++ eek_a_bug("xxx_MIN caused a trap"); ++ printf("\n"); ++ } ++ ++ if (setjmp(lab) == 0) { ++ if (F) Validate(digs, (Long_double) f_min, (Long_double) F_MIN, ++ f_min == Self(F_MIN)); ++ } else { ++ printf("%s*** Verify failed for above #define!\n %s %s\n\n", ++ co, "Compiler has an unusable number for value", oc); ++ bugs++; ++ } ++ Unexpected(25); ++ ++ a=1.0; f_min_10_exp=0; ++ while (a > f_min*10.0) { a/=10.0; f_min_10_exp--; } ++ if (F) i_define(Fname, "_MIN_10_EXP", (long) f_min_10_exp, ++ (long) F_MIN_10_EXP); ++ ++ /* Minimum exponent ************************************************/ ++ if (setjmp(lab)==0) { /* for underflow trap */ /* Yields xminner */ ++ do { ++ xminner=y; ++ y=Div(y,base); ++ a=Mul(y,1.0); ++ if ((Sum(a,a) == 0.0) || (fabs(y) >= xminner)) break; ++ } while (1); ++ } ++ Unexpected(26); ++ ++ if (xminner != 0.0 && xminner != f_min) { ++ normal= 0; ++ Vprintf("%sThe smallest numbers are not kept normalised%s\n", ++ co, oc); ++ if (setjmp(lab)==0) { ++ Vprintf("%sSmallest unnormalised positive number = %s%s\n", ++ co, f_rep(digs, (Long_double) xminner), oc); ++ if (V) F_check(digs, (Long_double) xminner); ++ } else { ++ eek_a_bug("printf can't print the smallest unnormalised number."); ++ printf("\n"); ++ } ++ Unexpected(27); ++ } else { ++ normal= 1; ++ Vprintf("%sThe smallest numbers are normalised%s\n", co, oc); ++ } ++ ++ /* Maximum exponent ************************************************/ ++ f_max_exp=2; f_max=1.0; newxmax=base+1.0; ++ inf=0; trap=0; ++ while (f_maxA-;IRqFb9!4w}5Wn%;|E{yW+b>rwQRB72(#A)osf)UMd}NvmB5qXnKKbBsK@fwK zd9Ig>NA#XXc}i^z2my}IaXvMX+tu$meTML2b8kNxjd`xUwYjDHCIC{gG@D7~hfCR^ zLb_2YE26^WP)HW2YeMED03n9}0KV_?2*=bg=el5ENG_Ei@>}ih&OW8I5K81@87UUy ze*XHa`@1_)RnuOP4M&#=iAOe;APP zSRwQEC!e}-@)&dNZl^KOG)d%n4l?T7rfC@l1Qaj^0l<)B)b~6O0HDY+W-t?p72*jA z07vU80E!Iq6b=uK_%7j6se~E{AqgKlePU^6BVNpPZM)GMbWPLaIFopdZl_~(DUX_c z%^_|;m8Yl1eW!o-iJ7ne+b6#HwXf*C+Spij=J2S1{QccE0nvC^A&v@o|o0_mX?{CtXhM;ZgYO+v$JQ9`({V$wEDJl_^z4KP(}%$>(?$zB8Q;M zn9C!`K}J2FQVId0gh7U64(-k_?5(aK*OMTO2ZIQ31Ko&c^MwNkx`d!)Uv~`c;M7DW zm-3;1dvVFMNi>ryPES!0t!{5`?^itn2o|G-p~8V_ON7;4LsI#R7tcw+@rgAtGrP94 zS>9it92?%eoQik$L%t7DxF+vc!gi#Cu!r1d& z-Lm7nm`NoQVbyN;c6+)cDYnS*smP_9pGJm;IoXAhj}#^1b&UOLr$@o@2hQI6#YYW} zo8K;9cUaETK1{{f#;Q5_oxACCY4002ovPDHLkV1kpR#RC8U diff --git a/import.log b/import.log index a4b204c..e9bf0f8 100644 --- a/import.log +++ b/import.log @@ -4,3 +4,4 @@ alliance-5_0-26_20070718snap_fc10:HEAD:alliance-5.0-26.20070718snap.fc10.src.rpm alliance-5_0-27_20070718snap_fc11:HEAD:alliance-5.0-27.20070718snap.fc11.src.rpm:1246707806 alliance-5_0-28_20070718snap_fc11:HEAD:alliance-5.0-28.20070718snap.fc11.src.rpm:1247151445 alliance-5_0-30_20090827snap_fc11:HEAD:alliance-5.0-30.20090827snap.fc11.src.rpm:1251456077 +alliance-5_0-31_20090901snap_fc11:HEAD:alliance-5.0-31.20090901snap.fc11.src.rpm:1251955356 diff --git a/sources b/sources index 21938b3..9af8cf1 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -8591c98de3f24a76e81b5ecb4cf60f7d alliance-5.0-20090827.tar.gz +f3b692c4ea9e54c040280f660b3cf170 alliance-5.0-20090901.tar.gz diff --git a/xfsm.desktop b/xfsm.desktop deleted file mode 100644 index 6dd425c..0000000 --- a/xfsm.desktop +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Encoding=UTF-8 -Name=Alliance: FSM Viewer -Exec=ALLIANCE_TOP/bin/xfsm -Icon=xfsm.png -Type=Application -Terminal=false -GenericName=xfsm -Categories=Electronics;Engineering; -Comment=View Finite State Machines diff --git a/xfsm.png b/xfsm.png deleted file mode 100644 index 414f15315c44dc0a18a511aa405cb1269fb50755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5909 zcmV+w7wYJVP)r)S@R87w3=0wh2NB)Et%MOg}M(~4D&q>5d6NLBLSvXqBZ zrILr_At_~Xm87y=iAoGb%9JTeB1MHOK!O0V&kUB?2h+3n-giIeS1H0Ex*>FZP<6&FT+?3CN_ zA^?yG006K=NFpo|LQxP%1cVT(DwI+#L=Xf~6j4H?loVk`DAjbrxsV{kAhcaO4ndVN zqiHFOX%w+YDgcrvx(b;T=r$gm9y@*ZvC)GQn&teTAO7^yPp&L32d;zCmE!(>yVmGN zaTj4ggi^*dT_FnPoO@o!^E^r^LWn3#(=q%f6;0A?}> zeT*S(YI)l-kmQ|4+=@^jPz)&zG8xoc$sRs3{>X`GHe3W<9da`n*P+zsJP|@*jG`p& zbUmgrOb}&QQ7Ba~fJj8dd2E|Dr3_QT7-Nk6eoY9WsVX6a5W)yW$HsMu(eHUp-3r@H z>V-Cfya7Yy+|k41(^ErH($WkHECvM?hf3zeAm~i&wY|;A$_>@-umA0je){o;i<*Jl zY|)PsKTZGuA%q#CL=gxgp2$Qv#FDXylSERC7?lY8C=A2U(hZTsNJ@f$W)003NsJ_x zINoU-9UM`;W?GX`chkg;m;drb5OskqsV0O1Fqtsn)76kLrAM>UDTw^cfx#3)&mBK} z>-I8qk!v|3s!=9X0+MqcM+s7}qFbt(=}H!%7*UR~1VvIJR9l!L34GJCOij@gN_*Yx z#@-HLSd%#II$u3?$|bRax)(3L{p9l}!Cwgs54%z*31J8rrdRSL(x8-rP>`S? zXs}mP60T8&ac&1ecYR*bP$Sw?)MV!5xQ|;}R;}|Ik^&{5as*PLfOG_$>t=Zj!c60% zOF28ewbL!7bLlM8QU)iXp@ORrgE5R45G_%3OcaPElE5hfN(jRkV~~PyPT~;!ScJYz zLYh@|*EAYkFKD;YDf`kVpSub~30!!o0u(bOA&E1Y3_t`42O$Aez?fh{gaJEEzTH}V zu-uz3l@)^#H^NLY)QERfEG$SENXa1)B*u&*T8q1h6e1L{j5+5riewbhICfN(h?pc? z@Q}8vTb+=bX|uP~E22g~K(U~hf+xh$e`%JYOOVAf!kjNf1wHoPgjDn@vMu zs>%{1Xx2&{of+gHw|6&PH}}ZIL|J1gCgo;`njMh_kN8$G6^jrj3BeRp0vZLC1BBqh z{@Siz@2s{K#U^U(2YwTfy$7g zndMS?Y&11KO4qiw+Raw8*$mo2(2Uer&h74c?b^{3M>2!?+ne_lF6iX+^Iv%(ZDk>W z`QLrCdVg6pEl1OuwM`OYuNjn6C2sJ&oh^XT-r(+bw#68A^oF+3B#6Uuta7Y zdwF?TMTw#)gpu9-z22db0Mqo~Fe_DHdYWFkcD>VVbsEjU3o$1qQIOX~z*|JBDwA0k z@~Kz9{m+S$zW(Oh+l#AOjQYnXx?b>beWj32rwjVxs^@on(=-(w>k8|LShdYo6lKzG zF7Ni1dlZeB1=lPWWxa-o7#(~B7`Z=p0{}9mKIB@Nbj}W>~1g2-3@m4X(UM^B}*jbQU%aLDPvG#fVCQR>NfA-DPB3Cf zP3gJ=(t~E>&it+I&4+Q~O$?0+&+AlInh)0~$5e1G1qT5bAnbwykXJOzatYS@E2T_- z|N6$ZrWqrn6Lu!8Qgx-e7Ii}cWNB@EVraBHG`O(5tdXkQ(_^_QC!4#!xMb@liMgT} z1W`BTGNQB^ZPU#*wrcKJFE~cD)1sC-adg5lb?DJkS@Q^!ep^zGFhxL^LaD@|A4sHP zmYq5n=5n)9aG<|Der)DQ!G*y4{MYXWch3{mTpIFIYYK zr=NRvb7#k}QVL-`y#t`pO1S_i5^c?QVCwpWeQ8dt)O`ncz6kTiK5J-L2gYW=%n>UO=5}JLcQ< z`hK_D2m?1?n7e&TRampJ=UBAs?SsxCtHW4DGKp=?&N_{-RT{2TYCGGr*RI{T zavhK|b@FWGz>#ugpjhf7c|u46sw9S{aul_r*rn)O-~8s>?48O$|H^K4V{bcG=y~t$ zU%&O*8|y38`TL8+N^N?6L~tC22;}n8%DHn-+Lpb%ygV@6ub?K z+h6;mm!JE}-TU`Gx%FjTmyu4d&D~yJTqPZ_D6~7EXrSiw6DN;OmNQE?Z~fc9_}7`y z13&&ZfBpE0M+Yip4t@mQPJOd0y8R;qsZ3VURIt+b?p&XE`DxhS01Ws4-}~?W!+TGj zn31*=`fKm4^* zDCTAcArbY}jfqE3KooSnCbZl4mllh?seGxtw6@VZIJUC7yWIpo1|UF+B1VbO2{v?P zujS`b4n=fndG+e-?Uod=sRar-cIJ%0__+%&ma^M8=0>h{X&$jC@aQ#8gL+qNw`+^v%^URhi#8>2=3OKDMc?7 zdLj1Ik@EiH{o3k!R?%q?71PDy(~rim+bSb*+?&>B#8V zV~?Nt#-IJ^(80;!nW^#V=~8dmYk5EW>1%tNyU$;E_VlUK4<0O>I&}E^-}$cTB~L&4 z*khB2noAo`Jo^r9CDOT5(ZhZW^$;VD@U%S~@ zt5(Jj)aMrbwVlkd)3v$PrG~hY#q#QJKU%$hJCz{7O1xX|T)DdV=FiSOdiW1s z{d(SIh7yy4zP>(t^Ujr(f4S{>^JYxl`RTd)?tf2PO|q-=3R)xV)+gGCnw* zww$@!ca|5HU5pBGWD0oU#7XFeveBLz9=LJ+;^fSbTh!ftXOGvAL(5}>ArkwYHjxZ9 zP(FqIN~G@tut&phKw-tSl^jvV;fi~pp${jk>FwF>s)_F_YZ zo)#>$S8zq?`@=Jp=Z@ebdHqyx`E+0DnMYf3RLED(Uw9#t%TrSsJTN@JdcSX?a{kq? zViSB0x+TfC^S#AfzPhx+5L#PX9e?7?JOB9eBd3qO@)zH^dimmqpWmybs1}Q?rsoXf z^pT?mMk$4PJ3C){_L-Oe@TJuoH&7T3^p;z-ohWMCIVEP{Q(u3E7Bomx=*vP_2NI)! za(i*@#>IOFCl4b_uWqg+gfDKan0cq?_z|%6oxN3T%4X1|u4UJ^cMADDAVgFR>NU^r zoPPYVdUfr>`6thv^vb!yTd%(nG@4I-<;Ag)QO&Y1fAHbI_{P`!`g=hn)ww$+)0v&p z0i0s7GFA*&r(LhvM~}vPi!!V$m7c(B%H@rnT2rJ+6P9-3a?-rVw<&prPwn z0<87qp-`Ay>8o$;KttQSb|tSW`LyfR_xlUETq&m+S~``YSqD0txqVN*NjxS#S^4aga z+R`ACv1m32s&Vxvf0xm%M<=HjmKMEs>)^R_SHAfC%EuRvkB=D5TCZ*9om4Fn!{t86 zXMlI3FowEle!eIzk}w2}Ixf^}&HV@dOW%EBd1uXI0!-X$G*a0z7flj3S;6Y7^yTz& zCRL(8{>9IRM~8ipD1-*L=)|#OR?KHzPFPxVG zFRUz<`pc0BwX6*|;Rdd5KO8tX29W_uam*SbUz?cN_L|5xVnQiasN=|d${p%k-m2#F z1>W-h@wGS396hcvC0{H|KXK+a@4S8V=+uStPh%0s{=Q}^fe^)^p@`5>NFSlwD=VMf z-mEsl5Rhq?H#fRFo55KBk!-Q=^ZCoFi%&g$mgFoPwP%HsO7zxdbNj|ZYj%x{ zHuggv>6Q^jQK#ccikEh)=byWf%V)G~=D+^Ce}Cu8`7_5KDdl@?*CAmvIW~Uu`~|02 z*}U@Q#_at=V`EVyi={rp%~IP&hTY-v@~yjvPfRbZZMVF5bmCCVajg|pn;UJiId-U$ zaSf{B(CcVDS&&IL@IVq%bIruS4MG0Pb5B)zvVZ!@*9q`+&ULaWzuT@ZEspp0E_`wI zhd=oHKY8WF!GVFw)D%m($cr?pi+d~AfBw$y?83N~aUw;-w#tk~J6fr3N<~lQd&)z- zK8Nx^|DofLwiB-~SUhs}=zR71p);k)BNb<20tlmo0RlmyK!nYpo6;RjbDN*d;XcPb zIWbjVT1#Pk;?bG+fBVk$OCR07`01=+dRp!v}|7dS>ay)&KaP{(H(* zHn*a*i%rc8+ug(CQ{DaAXitf^JI%FfN@W@VNy72I0+7UGKy%I}@9xIl*zuXE6G!Hj z9^6}7I`ib?>pSaBzkT?`BfE{gY(d9*+f3W4Q<2obh!Pbf^+FkRyeP+t$<@Y>zxM-b z+pgb^RBQ|%oM|uJPnXj_dgE{WM(6d{-@NqkXMgp*zslxHvR?nqoB#0O<}ID`$m?p9 zl}n|)?fU(lmHzQ!M+EDe4~I`4eEd&dg@V0#^K#u?c zyDqmUPaP!b^xZEnfAhQF-d^8{qlhJVe{spH?b#XEOxx{ly%h(k5|qYzr;i?xnoxS2 zow+MZm)`Jn-glt?{JEDv_@FDq?+9-PF{)+^4o$aI2t}M=ln{Y2LINZ(1WbTQfMNjM za0dE^NgrZvU;oJABP4IrqKZu7xBb4pp_QeFzkBb4cD*xr;*`?rK3rNZWSrPFb@jH+yrty4;X~R10qUlVG&xuqn!Wd6ztukW$l-xX4%_Kp z{I?(e&;Rg)?YWiC>h9{5*^xkA{rTH`r#75U_oZCY?L3^HZ*0`FX>H=@_|Sntb07;v z6D$DK1rkBxg`9IlDYFn(5lT^-Pe5hZ0tq0900T)KCpr=aMkxv|B^juN;Nx^BM!)*c z|3ejMx4QMkhrhXSe5Ad#JbPodz1L<5HL+55@`@0n<#J=UDx*%jUN%?5(CEY4cwe<&cH;4#xX=8XW zH#k(v4HhBn`qedkM1?SfMhC)hPwcl@K(nTnO=n93fCWMTh#*iT7=UaF2!TPQPk~E> r2{r&skQPYOa2()*fAPsDA7A?aBowgvp9TqE00000NkvXXu0mjfX%~S9 diff --git a/xgra.desktop b/xgra.desktop deleted file mode 100644 index 6aedfb2..0000000 --- a/xgra.desktop +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Encoding=UTF-8 -Name=Alliance: Graphic Graph Viewer -Exec=ALLIANCE_TOP/bin/xgra -Icon=xgra.png -Type=Application -Terminal=false -GenericName=xpvn -Categories=Electronics;Engineering; -Comment=View the graphic graph diff --git a/xgra.png b/xgra.png deleted file mode 100644 index 39579358a14cec92673695b12f1b894c90f55ae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6079 zcmV;w7eMHVP)Q))_}@7UcdSlpZMb6V`U3rj&x2Qpt#$tP=bpp* z6;D0<5QAQa|NY6&UiuD)%L6W6eu(6R zr3w?G^L&@}(uTTf zc=p-HI9e^)9X;UU(+{J1U9P?HGrsVZFLSgv#5#wufzh37Eawy2{T}W0E>$&WW-IcI zz~+T*9(nu{A@-yvdW>#e<@VKYu`(5d3!8lG?|ud?8$^~M%Q?O}L>P(b#yByh81$)e zSShf|Bc(ui&C}GIsluH*b5jMAw-9S+&DiNqhBhH*V$Nuh+ z7himtGn+d+^O@(!hZEi(PS`oM!+bI2%~xKe-HW*L$VGNe4Vc>{3tLj&8S(z=fd0h| zKK$uVpw|$g4DpQENLgF@L@<$4kr=<3aJwGwB6?RojW}C*yBtl zb4Eu)7G=#~qf4VAR_zw=91Yn_+qB~rxk_ltfGcaF8s>XL)=pi9sK6uzS6})GelcOa ztr@fnK6HMY`}b~heKlh2mgx1Aho63wQ>QPX&##f5*#JL*G{V*;qFUfZMA17z5SnFW z$)l4jnh}Xf@i?4U1QfAM(TglcZfm(%0hQoJmGTuL=e>&&f z!`oy#U3xofs8e0&CE#WtYiJyeb6_P(wGq+)Igv^5GDoBFeu|(%ga|@Ha1r9Gzx_KQ z$#d@R-ea(~PLa2H|K@G_t%5UK+lb0i&6mvfZ}F>7on|?Ez>mN419q?9qZ74>y<(8} zIJve?H!_U&?_sF0t0jrCYz|WT-JJI2ZK4f{I@Ly=>A@g@yn)0Ll0b+R6%wgiDAPmg zK0@{hqQHd|Xi&`Xp`;Ru5F#R%qkH{LCi5wyqX~cOsb~0`Z+)9)w%`+=|0owup5_n! z!`Ja;#h_*Q_Wyj7(ZLb*bVe`AU|F%&>2qOgllj2`dy5&aoKa+oJd$jm*kJqICaDfM zTVa%hAfWUxv`j}6R#A!SCg^TKtG9_z9w9)W5X1yBglHoPND>4qvL{DNzBehm*sfE zYB@(K!DLq9moxgg=8?;%$TLY?NMs%e+T%ro$TL)Gz*Vp)vB6Sj6(MTSi6k+GEJ+Yj zgU}!hh=?Fk0{I6oLWCGZ1gr=+5C(nc&P_BPm1fwwCi0f&KJ{xn_Q-jD|4;r4ZSB}u z&oOH$i_s8Q)>MlU;~PRG>Ewo;^&b6PQ{xhaBx$qXWuH026kme~1{I;(Nr zKqJt`mNYWZGK#ZXTYTj=zrgM5 zZ*%YNHU81(pX1brt}wm&HsAhV-=v(*=_t+iMu${7I*H`WW}Bv*k@$v8NUC~;L|{ye zks1*ktLYr0B(*d+1hTD3q`)hUmMw&6f&ZZJkO6H1Ej%q;XyJo_pdbXir~&W@bO??} zLTo@O$C)!*y#B^3REGzgKYxPDm(Nk0SmV8K-lv}$HqtI_qZqU@v@KEff@r?P_=--N zVO&kslw_SQaT+tPN@QsWK^`w4X;6_s#}UMWMuCt8$O1x62suz7C_eZ=g2zA*NbdlP zQyvINK%ElN^BpZ|$C^$%Ld(F& z6^v#KqKwQ-ia0?C2wGx|fFgr9Vrnf_fTa}FnP!=QZ70yr2t|f#CCE-2-RdFZb-Y}| z%S}9M1kolC){`F9YKAqEkVe!-FpC9MQ=zj6xzLR3yEq+Sk=M0F35Fc*nrSQs00Nd79hqLwZJzup;ic$AXS8(HWl4i(ySV0!x>vW zc=GgFs`svQcCb!-VM&^&Y@OMmIoM^g_des%1B&(r*+#*BHATb%A44cKWk;}V$LRHf z_T~n(JM?;+bWZO;9H7V{N+Ea=7_-}lcgBQNb9o;ZfLuU1orCSnZ zG5yn9?7KM!YD#OcN$bK%)-Rpo+~q6KA3!6)2@nEWU62VlAUH&<(bA)xN81c#2H@7f z8E8DP1T+w+het@=V6-7rOR7qub*`yBbR$9B1h!gzF05^{+S}*)Yd@tp+2_RR4Q99B zqPLc@@yz2q*c`zF*4Hl2BwQSN=dYE7DUFw7fxdCJ>a>I zJyBIDek%l^<~BiKp0n*)IkEEy zdD^AdEhFOKDe(swvCK5qodGLo+_&;Anx4+kE8dXOSO2e}%_S zoI#Y9I7`VkyWAe`F|6lIRx>V~J&hQR$t^7BE3%WP8LujAlrjl0eB&3~xV_6~KKoff zKvh9mg7+kmLI}@tF=lwUhiew3#*@W>Sc08`n4+R3f-&>@7E8BF%)|`McpKKlw2~|M{z&I@u$UB^#ZHr!Jr4r{8;#FMaXv zz;r?rJo?lY%OJ=%PvSd$zW&vJ&F+z>cUto={>{Il^`VQ;E6}k&5CBW!043K!66}QXgzd^W*OLj^9_o01LO8t9a!$X`7V!M zI*Uj&WC}!$Z^lStFz33gZx`ssAlqA@b6AzIT0riBDbzERi3p($-l4@hi2kv7bH@fA zU1QcVifn|;1C$4-=0`6*KOPNnG~C!bur&)!+Rp zn;VirkyAvPRur+lw$Ay7uOQb>^7~)^19taUoGoIiX~m$I(asbqwrrm2apK`Eb{;)L zw$(v&5_BhrEJdOamB)@|SSvA^X2pb2wM*1p(%)%giUM>G^cfH*!4H5o=oY91M9eY2 zu3&YK)$k^I=jkWdfBP*6o*#by2b@09N4uK&WW}&_oI10`tzTRxY@FfdTQ76-!HRyQ z*xowJVYAD8ydYXgHo6JJ*Y{Z7ywBYiUPpB$`JhL8a}AMaINPw%idoGU2$Rz8w-GIi zGe;=rFufimD^Sg`A{7dcr3nSd94!hI#qkEG1ZPR(9KD=P7+iiBW@EMn8@y*Cs^x;s z!4^x~uo5wE?N!|T#&?)6JOt1t;o9|EXkW9XTjatM#x-X*Iz*vHOe>O>Dw53BO9pc3b3P^f2al0YxA0Si-t_BekB0;4ZYB49s6itD)1pbz;qujrDhkLubtQIQ<8(U14ORn7=(r7_@XNx!9+hbipmLB)>bg^X9WC&wu>XKY* z4)&+4CxIf<$VMRRie^4SL=o06$l8{)oe=qBQ{o*c6CuZrQY_F2LQf!?F`>vHjgea5 zsgEN@YP3iRwnnIg;q|-dZ~ULX;^puDUmo1Pfv#8d*VcLO)?E&lj&8rjjr|Gf-9uV& zgm5)gT)S_2>ZJdkg^;1W_Fbw!v9XghYo36WR!JgwlwqBP2@# zF)mVgYtTVpghC5NoPbxBzyd8if|5|zP(}RcJKsl-4v!F7OwlU%jo&E>dF|y_(2L=i<^7to zJ11$$ly`1lW3p(dY#?q$ti@pB7~uo4hfb@-!DvJg8(L9>Xe{d+eP&pqRz^7~dFbJD zoV{?KqkFe`@A`F&k@Wioq!FYBk%5RxkPRX@L~ZfQhM;O1QDe0tia{qDqAtjopgc1> z1uJOxPa?|(sU_N0mQ2S4FZsj&_@Ak(5-SXO(MD=T<^oxs5kg=woZ!5tou#a`TXd6z zdNyS?pCFaMq!F!biz^@hW!fM4Fr8O_%xFGBDZ$y(+xU8dj1}k_3n;IUE;V(*6*UWoqIl5%Xl$oZ|^>{<(y?>vB6W;H9lBe z@H|*lw6rAn1|ua0%M!OLiKXXoG^3kp#^WVv4BML<7#!1kcc_+Al2{X5O_pht1QEos zrwt&qN2owh4q}g$mXHWU9;37L1GBC{ShQ-0R1V`MqKUcp*88Y|bI%(ksa!)4fyy@2 z-cdJ}(mAB?L`GBBHSJj8s+!;(OD^mQ4iD%S zIYpi^n+|Cw1`!%?0T~2R3X~QI8L-mgq{W+nY8@{?*=`*R9w{JHDC*g$QNh3`xB?^zmqoqPigO(Z* z1TF+zaMc zKzM<|evm$Uf)s?9p%#b=s2nD?2o2S|CW#DaiFFM}qY)bCXzGTAonf>f z4W8+u;_~^6Ja*+0_piRq?HhM^>AT;QU zsE3q%UI@vFej8g_S_(FL>wM)Oe2!oFkDWPzvX(dg`mcHa_HBAan=Cf862)>cqgpP> z(gdRouC8c&Ac`ZZx&{GKDl~%Hfo&X1SK))h1C6ubJ;n%z6KdEMxauS zNh5R|p`=De8M5&hoe_xyTtyyhWGoQIb2wX&=56H4P|X~Z{W0R7tak!UMV3TdICq}M zu3Tn#_YOb%$!i$lNuvZQpvW_piwR0goO9T^A&nE-t&Gq(7LzIKoeoL}q5v9!wh){n zSO?zG@2}&1O%w%+c1)`k5yujxB^XKEUndBU8uak0Mr0mwvInsPzl8NRtQ;H$=v;(( zj$Tftv=dDc$9(ZiUqY|-_||{=LspBL&Q=F+k29N9uvjVa0)mowqo^g60i@Q@%9$e( z))8ulunuVj`UAevLeY#?5GvxxQ~QR}Nwfy30zyezl_x~z_#)(2n6}156}FlnMTNXG zMpyx^Lv!agGC76#XN3x})a0>YXRyV_dY^aRdW$4YNs@^B`}+(A8-(Dow!#OC)&{LL zRaLQEl;l~)T7QGX_aETu246O~$|8Iq5{gI~BBe;t1h+!ThBOJJDMT^EksyvWwO2%G zi}e#HS-O&>myom~_J+G`4SL8`Nh&gw?y`4Kqw*cJQi3ElXeoK{;6C&55a&IOYgkTJ zR5mbPE>KF4rU|P>g{v%Co}tqeiDbB}IJ|wAdRZN(4#x)+j!$)t$V*}iX{(Kt$I?dV z22?<4h*LwJx7aAw+1NQp-syAg+B<|M;2MQpLLm#%xIoSwqy0Hi9no#K(AHXNSQ))_}@7UcdSlpZMb6V`U3rj&x2Qpt#$tP=bpp* z6;D0<5QAQa|NY6&UiuD)%L6W6eu(6R zr3w?G^L&@}(uTTf zc=p-HI9e^)9X;UU(+{J1U9P?HGrsVZFLSgv#5#wufzh37Eawy2{T}W0E>$&WW-IcI zz~+T*9(nu{A@-yvdW>#e<@VKYu`(5d3!8lG?|ud?8$^~M%Q?O}L>P(b#yByh81$)e zSShf|Bc(ui&C}GIsluH*b5jMAw-9S+&DiNqhBhH*V$Nuh+ z7himtGn+d+^O@(!hZEi(PS`oM!+bI2%~xKe-HW*L$VGNe4Vc>{3tLj&8S(z=fd0h| zKK$uVpw|$g4DpQENLgF@L@<$4kr=<3aJwGwB6?RojW}C*yBtl zb4Eu)7G=#~qf4VAR_zw=91Yn_+qB~rxk_ltfGcaF8s>XL)=pi9sK6uzS6})GelcOa ztr@fnK6HMY`}b~heKlh2mgx1Aho63wQ>QPX&##f5*#JL*G{V*;qFUfZMA17z5SnFW z$)l4jnh}Xf@i?4U1QfAM(TglcZfm(%0hQoJmGTuL=e>&&f z!`oy#U3xofs8e0&CE#WtYiJyeb6_P(wGq+)Igv^5GDoBFeu|(%ga|@Ha1r9Gzx_KQ z$#d@R-ea(~PLa2H|K@G_t%5UK+lb0i&6mvfZ}F>7on|?Ez>mN419q?9qZ74>y<(8} zIJve?H!_U&?_sF0t0jrCYz|WT-JJI2ZK4f{I@Ly=>A@g@yn)0Ll0b+R6%wgiDAPmg zK0@{hqQHd|Xi&`Xp`;Ru5F#R%qkH{LCi5wyqX~cOsb~0`Z+)9)w%`+=|0owup5_n! z!`Ja;#h_*Q_Wyj7(ZLb*bVe`AU|F%&>2qOgllj2`dy5&aoKa+oJd$jm*kJqICaDfM zTVa%hAfWUxv`j}6R#A!SCg^TKtG9_z9w9)W5X1yBglHoPND>4qvL{DNzBehm*sfE zYB@(K!DLq9moxgg=8?;%$TLY?NMs%e+T%ro$TL)Gz*Vp)vB6Sj6(MTSi6k+GEJ+Yj zgU}!hh=?Fk0{I6oLWCGZ1gr=+5C(nc&P_BPm1fwwCi0f&KJ{xn_Q-jD|4;r4ZSB}u z&oOH$i_s8Q)>MlU;~PRG>Ewo;^&b6PQ{xhaBx$qXWuH026kme~1{I;(Nr zKqJt`mNYWZGK#ZXTYTj=zrgM5 zZ*%YNHU81(pX1brt}wm&HsAhV-=v(*=_t+iMu${7I*H`WW}Bv*k@$v8NUC~;L|{ye zks1*ktLYr0B(*d+1hTD3q`)hUmMw&6f&ZZJkO6H1Ej%q;XyJo_pdbXir~&W@bO??} zLTo@O$C)!*y#B^3REGzgKYxPDm(Nk0SmV8K-lv}$HqtI_qZqU@v@KEff@r?P_=--N zVO&kslw_SQaT+tPN@QsWK^`w4X;6_s#}UMWMuCt8$O1x62suz7C_eZ=g2zA*NbdlP zQyvINK%ElN^BpZ|$C^$%Ld(F& z6^v#KqKwQ-ia0?C2wGx|fFgr9Vrnf_fTa}FnP!=QZ70yr2t|f#CCE-2-RdFZb-Y}| z%S}9M1kolC){`F9YKAqEkVe!-FpC9MQ=zj6xzLR3yEq+Sk=M0F35Fc*nrSQs00Nd79hqLwZJzup;ic$AXS8(HWl4i(ySV0!x>vW zc=GgFs`svQcCb!-VM&^&Y@OMmIoM^g_des%1B&(r*+#*BHATb%A44cKWk;}V$LRHf z_T~n(JM?;+bWZO;9H7V{N+Ea=7_-}lcgBQNb9o;ZfLuU1orCSnZ zG5yn9?7KM!YD#OcN$bK%)-Rpo+~q6KA3!6)2@nEWU62VlAUH&<(bA)xN81c#2H@7f z8E8DP1T+w+het@=V6-7rOR7qub*`yBbR$9B1h!gzF05^{+S}*)Yd@tp+2_RR4Q99B zqPLc@@yz2q*c`zF*4Hl2BwQSN=dYE7DUFw7fxdCJ>a>I zJyBIDek%l^<~BiKp0n*)IkEEy zdD^AdEhFOKDe(swvCK5qodGLo+_&;Anx4+kE8dXOSO2e}%_S zoI#Y9I7`VkyWAe`F|6lIRx>V~J&hQR$t^7BE3%WP8LujAlrjl0eB&3~xV_6~KKoff zKvh9mg7+kmLI}@tF=lwUhiew3#*@W>Sc08`n4+R3f-&>@7E8BF%)|`McpKKlw2~|M{z&I@u$UB^#ZHr!Jr4r{8;#FMaXv zz;r?rJo?lY%OJ=%PvSd$zW&vJ&F+z>cUto={>{Il^`VQ;E6}k&5CBW!043K!66}QXgzd^W*OLj^9_o01LO8t9a!$X`7V!M zI*Uj&WC}!$Z^lStFz33gZx`ssAlqA@b6AzIT0riBDbzERi3p($-l4@hi2kv7bH@fA zU1QcVifn|;1C$4-=0`6*KOPNnG~C!bur&)!+Rp zn;VirkyAvPRur+lw$Ay7uOQb>^7~)^19taUoGoIiX~m$I(asbqwrrm2apK`Eb{;)L zw$(v&5_BhrEJdOamB)@|SSvA^X2pb2wM*1p(%)%giUM>G^cfH*!4H5o=oY91M9eY2 zu3&YK)$k^I=jkWdfBP*6o*#by2b@09N4uK&WW}&_oI10`tzTRxY@FfdTQ76-!HRyQ z*xowJVYAD8ydYXgHo6JJ*Y{Z7ywBYiUPpB$`JhL8a}AMaINPw%idoGU2$Rz8w-GIi zGe;=rFufimD^Sg`A{7dcr3nSd94!hI#qkEG1ZPR(9KD=P7+iiBW@EMn8@y*Cs^x;s z!4^x~uo5wE?N!|T#&?)6JOt1t;o9|EXkW9XTjatM#x-X*Iz*vHOe>O>Dw53BO9pc3b3P^f2al0YxA0Si-t_BekB0;4ZYB49s6itD)1pbz;qujrDhkLubtQIQ<8(U14ORn7=(r7_@XNx!9+hbipmLB)>bg^X9WC&wu>XKY* z4)&+4CxIf<$VMRRie^4SL=o06$l8{)oe=qBQ{o*c6CuZrQY_F2LQf!?F`>vHjgea5 zsgEN@YP3iRwnnIg;q|-dZ~ULX;^puDUmo1Pfv#8d*VcLO)?E&lj&8rjjr|Gf-9uV& zgm5)gT)S_2>ZJdkg^;1W_Fbw!v9XghYo36WR!JgwlwqBP2@# zF)mVgYtTVpghC5NoPbxBzyd8if|5|zP(}RcJKsl-4v!F7OwlU%jo&E>dF|y_(2L=i<^7to zJ11$$ly`1lW3p(dY#?q$ti@pB7~uo4hfb@-!DvJg8(L9>Xe{d+eP&pqRz^7~dFbJD zoV{?KqkFe`@A`F&k@Wioq!FYBk%5RxkPRX@L~ZfQhM;O1QDe0tia{qDqAtjopgc1> z1uJOxPa?|(sU_N0mQ2S4FZsj&_@Ak(5-SXO(MD=T<^oxs5kg=woZ!5tou#a`TXd6z zdNyS?pCFaMq!F!biz^@hW!fM4Fr8O_%xFGBDZ$y(+xU8dj1}k_3n;IUE;V(*6*UWoqIl5%Xl$oZ|^>{<(y?>vB6W;H9lBe z@H|*lw6rAn1|ua0%M!OLiKXXoG^3kp#^WVv4BML<7#!1kcc_+Al2{X5O_pht1QEos zrwt&qN2owh4q}g$mXHWU9;37L1GBC{ShQ-0R1V`MqKUcp*88Y|bI%(ksa!)4fyy@2 z-cdJ}(mAB?L`GBBHSJj8s+!;(OD^mQ4iD%S zIYpi^n+|Cw1`!%?0T~2R3X~QI8L-mgq{W+nY8@{?*=`*R9w{JHDC*g$QNh3`xB?^zmqoqPigO(Z* z1TF+zaMc zKzM<|evm$Uf)s?9p%#b=s2nD?2o2S|CW#DaiFFM}qY)bCXzGTAonf>f z4W8+u;_~^6Ja*+0_piRq?HhM^>AT;QU zsE3q%UI@vFej8g_S_(FL>wM)Oe2!oFkDWPzvX(dg`mcHa_HBAan=Cf862)>cqgpP> z(gdRouC8c&Ac`ZZx&{GKDl~%Hfo&X1SK))h1C6ubJ;n%z6KdEMxauS zNh5R|p`=De8M5&hoe_xyTtyyhWGoQIb2wX&=56H4P|X~Z{W0R7tak!UMV3TdICq}M zu3Tn#_YOb%$!i$lNuvZQpvW_piwR0goO9T^A&nE-t&Gq(7LzIKoeoL}q5v9!wh){n zSO?zG@2}&1O%w%+c1)`k5yujxB^XKEUndBU8uak0Mr0mwvInsPzl8NRtQ;H$=v;(( zj$Tftv=dDc$9(ZiUqY|-_||{=LspBL&Q=F+k29N9uvjVa0)mowqo^g60i@Q@%9$e( z))8ulunuVj`UAevLeY#?5GvxxQ~QR}Nwfy30zyezl_x~z_#)(2n6}156}FlnMTNXG zMpyx^Lv!agGC76#XN3x})a0>YXRyV_dY^aRdW$4YNs@^B`}+(A8-(Dow!#OC)&{LL zRaLQEl;l~)T7QGX_aETu246O~$|8Iq5{gI~BBe;t1h+!ThBOJJDMT^EksyvWwO2%G zi}e#HS-O&>myom~_J+G`4SL8`Nh&gw?y`4Kqw*cJQi3ElXeoK{;6C&55a&IOYgkTJ zR5mbPE>KF4rU|P>g{v%Co}tqeiDbB}IJ|wAdRZN(4#x)+j!$)t$V*}iX{(Kt$I?dV z22?<4h*LwJx7aAw+1NQp-syAg+B<|M;2MQpLLm#%xIoSwqy0Hi9no#K(AHXNSgS;v1>UESwCx1HIw<5@egz3Ur}!2&rDk`Rn>BwmaZ@)(JW5CMrdgiypQE)p0z{m6O|ZS*UB~OS_cFV4IcMhF`cn1r@KsNr8BbhN>zwYc zs{XG3?^65@2*)lLFSBp~(gykEV{^M8Uk6#XRt$)Z&!4tV{sH8dNTf?5ox{sYH?C`g z+>;vl{2-OT1o;JHqzAGDvW$^$V8oq3-!WR7kpOLA4M>3i8~}T9b^vZ;=vXkK^Fi1V z*bm`wSAZL#q7UrgneyYu^-{P|mV6MnB8JJ~4wh>e{_K9k`p*Tbj-ezVAz%f9fy5eI z3YZ0!3Sb|wKnYaweLV_o2=93VM;u0#!TqZW=hFLmRkk=ME4U}SR|@0fI$H} zD~3P(Y(m)yB*9Q2eBfUKd;bTY|IsRMGh7f)Gn|c*x4;H421fBdiA>bP9Al;)U!)>X z0EUlJ@l66R2EM!2fyuH5KP`z{i1- z1l9lXA-Gz~NhEF%nMeSS!6CS~WeQ{`Y!es){{z6?3(s#<@TI@aF~AbA8u$1F@J--4 z63IF^VORa82kZ%wuZKH6xdhG`2m;#(E#NLxD|bZ(YJwzgVB`A|SO!*r(?AQjiJIhH zQ8>N$|7io)1YQAlBMpY5a`r&ZNrtn)fCKud)OUe(;Ed7xErChg^k)2UI}+WF&qG`< zs2p1;2%L_LGO->BT#0kr@k2#qCX0mT3sUOEPj1Kg^GIYn=zTx#o1)rU9GA{@_}s^G zLKYCJBkvLi?wQZ@nVB&-xJw{7%b*|d7H&;-)0Gz7os^|Vvi^)M^J7!^tP5<7$TAV8q76_xV#i5K;syJQ#3YQMSmzGVOzkvQEGkE#A@^^BQZH}ohF{x z`0OCQpGN@WwcYv zAaNX!P^OlSRn#g`Q(K9Ijes9Tsh_qg`RZ7hw7`rKITB8f4p*J*VIT;r)6a%^fe$gP{hDFkBkWLgo9^(v4{V4PudFz z0b>jzs$(M=t~g2us?mfFDQgG=3?+sPO9I?$=X^*~E=Vo24x0AWL4Jba6qX#1jWDWN zQ0$rxe5IPv9954nt2q_o&4lS-T;a}N*k241hXga+(4Dc}D;-h?v z5)C%asGVMm_ZGPIB5b?{=UTA0ta;5~3@roa{B@=dZY{z3f%?D?W|pUCuk#iDom0T6 zXlf%GMB9kZ5)_`F03Ko~R(>ZB_o>f0);H@c4@{Nu!j~po->R_0h$`v_c{G|FC}&_s z5fcjakNyy*8I)evUXq8afKx?M;LW26%0Sc*8n%Fv{fo;!mNIijpi(j#Pxn~HW zLW}{MbMLNag(efN?atBE$^i%!R0ezwrPZWPN`>IUD3iX>LdnmlNQ4M(- z}|3kdo9GU2xKf_L(xu6&LL`|Ajt#{V_KWbs*MwJtR_LSxJeF^Vn@a0$!`HA5ni zGny14h63_q5}yGNd_3oC&%(^K58wJARN_gUn)iE#iIS1{n?zzqaf=r4;Wn5jp}h>t ziAuabhpG)p88y&`!4w7#veyj$s!)2}qeqh;)x**RM+3Z^82(1ugcpT0tLwk|t*&q< zImisS2%JF!SKX<|X^Ih7!uCtL)y@FQ1X@FwXONbf#ok$gVhj@x!%{E-PNjy#7zzh> z*}%}~9-|6Un^1Yf%vMM+cnqKJ2Kv8N(Q13F(Ym5SeM}_9Eq7Bk+X)^YgMGrSy^?Ja zZUGOV$a9OPoD|@753&mP09jkRU+DlsrWyzqk`&Um7CoDDutV4{g%V*}DAE*hzdazw zAJ!KhVIScqUnuzf7ae;n0|sO2XprE<<5teKxPQrkv5Ex2F}SeD>*JDLG!+;`^-j=_ z4$vsMRe%(lM~Q{7uSK@6Vh?B?WCmpgPoa5_piI|=Oq~}cG!3=o$j}Cmi{qVH$=ipe z|4~zS-+yJyi^pDk7R&8uHY+6D0NQx=X!7~B3eG$WOY0z&mW7*Edxjw>B2`l@+?TsB z`aXp3f|mv+&j2eJ5`+>%f+0iLA)z3U5-4%+pH83T1KZrkgiXM6osvF*E&-3hlasT> zrF5GopMs6kP~;!k?b;q}_v~aUI zcS3de(x5S*&V6cT>O||20CuizZhrvtRPmlU*a~cH=7zbJlrIepzcN*K9P2c8Xrj7_ z5+9)GR2M$4ygX;?<+?-LNS|mQZd8=)6(#q_jjL!j%fLf4C1RbYq>-Vs4(0<04$_tq zJg|_r)CU9zJ&-Y23t7|>(&RlZYGG|brv3QM+fi8S2wR6ej~T~@i!FLip{2YIZvHLMF=m-I2&s3(}uPjSu5B zi^4pq>2QRB-oniX&{A^4z>0xxTL}pjv?|5$dR+Ff)Yg`u#CKw2mTEPSm4%vENZ_n! zakJP#Oh;D(HO{i~MEaY$svb zYLR=WLP}x`KB#~~2$(m%hFo3Jc6Tp>ECYf@xFDJq)T8U5zi-$@7+p({M?7g;PudJ> zYU^_twIc%piKsyG($Kn`z#|pCT^RLYA~A=G=Uhdl>#PUCaON$;_)$F*s|1QdQ}qy( zww0E}eDUtKeErNa=P&QUq#!Zs3#DkTJr|YoRP^~d;NPsa;I9h&e6qoXWE|Daes%G{68P2T3;sc#~8j4ZTS>1 ztu&Ys?fn5OOlkV2b?>Q*_EZxB9ReRT(2XIf?nH!G%qPI;of21hTw}*D2bCj8Pfk%Mdm_2I#uE(Lr&kq9zOACiE#ju31C4o5-J9Pc!prG2yF_6LAcLYY#IomAWvq@%F`5N zxI>+)(OLEpt~Tj(Mq`s*V8g;@fU5?EQa4&*fbeeoKf}}Gy(6OpE+5|4$F{ZlYk@7c z66zScD{!sQwBn3`o1(5;+kLgLPoITIyboNUsf<=aT@f`0cow)5KUSx{1t%YVFCK~u zN4pJmusUfJ=wTwjo6>Z?E7X^kskLtyBYMnQOJEp@JctChQM1`aHPl6&y>@OmdW5t% zEX{Efacv!8H&Ca1Z)S6JBn!VTuGe~5YvwuNe)=)PXC5`|{s-J+T6k;l-ZR5+Wmt0N z{2HsNo}FbPtW_nCr`mLp+>>0|J+bxokrhj_q`+r`kV=Yp!L|Yq`#{=)k+Fmj2nGCb z3wFxJm+EXdrAeX_j<)nq-`mCg@2kS!y(+O!GdrT%p8@h4cep7{q`mCHCHr^-o25eL z@eZ*7+e5fBtPWd-h5|!I!1IGRPdgz1j*qa)_efbH!PCJb++@TuLWd>P)M0= z{Z*aQ-CtGzsu}><@kCBiDr^8i5-*MK=VH$c4hdyq#{dpMfCyxOdITpm+0Mtu69}`? z3;reVMuok?+|&K{*Z*UP+$0_s00<}Kcy3fGN62YHj^!qCSL)*{oSBv^tig^#rt^gd z6mswiM}FhP6^{AFJHPh$`#A`?3;-M{<|`A9u5jd6rk+}1PAoqO0NE~KzuLEbzeZeh zmfElm^ zw!jIv18?9DLcm7A0kI$n@IfZX0lPpxC4lF?sgoVfu4U&PBAazIwGJ@EUHRJ?&LVi#P6b{8eJSZK?fp$ZMP$^Ue z)j>_rFVH#YGIRqPf*wK>&@A*f^btm25=@5`U=3IwX2W){2kZ}TfMehkI1A2$_rVo# zJ$wr8fG@+h;1O5=zl0YMfDjP|qKxPwY{UWaMnaKjgpX`T3XpQ79%)6ok$&VJB0%Pl z4=4Tf&Ru)$ta1Z#);j z6<>^Rz<1;C;HU6Q1PKC*U`6mJ#1nQADhREFtAugF8zPaYLNq7(661(Fi50}t#OuTf z;s+9yq)l=lg^|)p`$#89mq-suZ^&e_2HBPzN=_s1BR7$+ke`y@i_ygN#N5QVVmrjD z#X7`>#a>bH6m^OnWg{hvQcgKbxkH%~$BS!-JBUY!Zx^o?KPNsWz92!9FqH6?NRlX$ zXqLDkF+;^tHKsLEJ{{e)>k%D_K56N**Q77oTVH`u0ZaL+#`8dUR&NzK3o2n z{DAy|f}(3fkDNd7vpLrX(1OD*=uYS{^gQ))^*Z%l>8t67>hIU@*Z*Q* zVvuOiVDQ+GYUpm5YuIi0w~@9H$Ee!q{%Z1S=hZt_cddSHtYaKye8l*H3C+aIWRFR& z$!AkDQ@&}d>8zQWS-4q^*%+J7_F)&XubZRI?ag-cHp(^;HuW~oY*lT!wvD#ac3O7vcBkxK*&EpN z?c41a9V{HSIb3o?9990#4KP619;PEVaxoMW6@oabFkT(Vs*xuRV?T=%<H4t zP6+<3q)%j6XH;jr&kW2wyG3FPZ_B_|?X7#aPG>o19nVH( zbFzDLlyi3FOl-5;R<|A69=W}Dhw6^J9aB49cAnft*p;yBcCJBgY3|$ILA$&26!LcF zP5$8WLrcC`K0kkKkL8})A5lNX{W!RH_1?<8UkbPdHwz64%L_jhaf)vKWcX9XPs{tF z_YD@C79T0Wl<-PM_uK40St?PQRXTaV>p({tv#g-(?ZHh4Z1Bky8E-^&t0v$t#xgT zw!+ikbo%KRzl8rXddA~S?^*WQ)?d|st!byV7j!@!TRY}EV><<1Azee~+|TuPTXwhq zruW;4^UCL|FGyY}?jiK#^(jvq*PO3i z>9^~@c-`vy`5P8D&fR3+?7U@qt7E`qp#8SV?e;;_!Hzp-ce?JH-|Ze+Gt@I|Gkp1; zEHv9xr$z{-pe={L}j1wSI3C zmaTlehoBxmyFAE|$Qn#y}leqKJUG~F~~G;@B|dG_v$^)IGgCcj*o%l}j2 z&ze`7uYUc@_OF5Y;Q6W7{MXBW7rl{rbK+ujAAg{SY5-YqQ_yq9@@@&o%r|Hq(@ z(@UA3u%9YEYklti;_+pCIca%Wxq!$8L@pq5 z0g(&*AG^TUe>cJ)E6cGl0Q|E7@VpH`WfcG#(Ew1w{s9d3127=2KdAr!03Ui(Sae}^ zbZBpK004N}bI!;t$w@8FP;mG64|4PX04rk!6^APElmGw~Oi4sRR9M3ucv*~G=XK`4 z-My-AE!|z+?2TlTqDV?sti@U^SzhEN$z)~%2Tl-V;+H{|7mtCw46?i=h>_$WKrom| zFv&{{D{-I%a5gBmv)FN@v22CXNMcKDvYWkkb#1rm?)P7FF3CbS*>(Hg^PlsbZz=rD zcmA;=cr>4DL<~koX-3dwFmxDw?B1?p@0O>`!6Dz9B5xt=bmk{}i!0YhqsXDy#=;+khEf3350@69_Znq7VLM_&2r*Lo{mMyX)9vvJjLgvm5Y z#xuuhG?|l)@cHi92k-9SiWH|&=i<%Ho1gZCGu%CY?eD%NwPo^ByA9$j7@@_iqNWuO zr#7NY8>WcX#t_673)$~1F^h4@ZHF=2Rz_r1v9r5_&j)&j<5)Qc+nvtA{rmm3?z7K6 zeQd!iD(mP8(Gw%6fvz-Vl-eQf1aA|Xz#s`Bl<1nY;H~Sa=_12-^T>8kTURc{&o%5t3 zYM4bQlktp;PJdM(hk1S}*!i%S&a!0tjE}TBO7ua5h9$}@R5ExFu9SncmZ=hvmQ$mr z*u)eU2w4g>33eT$Fy@?QESjE&jaH`@e*e}RpZN4kRx|kSH-4~ta`;RC<4eSKhN*bz zzdq7g?Afhm#B=03llgRaaNby4TnU=gZN|CExIQ}_o!vh#B&N&}N+WELOHh}!I-$p1 zH7n&TPNQ>JS!0kv%Ag9P+?WI|)u=SclLlj>6v^50+RC+uu64SdhaSD@bvpt&xV-H1 zYV+nJQI^@t;XykUIu#tw4@Z!M`QajSn$2+Ge3IYYJ(@-ECPu(tQmeE?&)g(g~-d&Xo(EG1Tq|(0;BA~iyK_QPZ07jqVO);*tjHt=87B^o)h-!KYi!D z5B7fLXMR4B^mv?!NfC6quwPE#3Swcd=b1PjM^I3l={PR6Vh#mVVv!3|Xv_78>#~M# z=Qf>T94Udg(3PwoSvLlm5@~==4%JYUBFqiqsBRmyk72DDoWN=Nmd2@2`-8z(|NNEB zt?R4nSO4N0uO7W~yLI#WOaJ9FZmTg@@@zCOG@Y0F;5@P1W=X8vXvg+6oJ&+f0}QCw zY5<08E#R;^fqNUGq|~V~DIyO_!8t++Mkzrl#VNr8VVD{w#)g_;s0_oZX;cZM6g@Z? zJoe~Q&cfo}-s$%C{rGfp@P;plGcR&MfzRE1KC6nV;keor z80(tiv{2m0iUU+&i;RvDyfBP5Lnt;Veo#(@_4*|f@Mn#+cV!p1nw3*Qu3f-OS0F}$*?dMpiQ z`;KjCAX{V$Ba5=k3snkQfx0EsWKz$Fj5*qj1ko1}RWQ=q}_kt_b2(kITsMnoMY1aCmUDGLGfQ zoa@O{DURcU4|7=>1@t~EWTIuPRl=E?Gde?htnmopnNj5f)C9=1g$jseV^Aywh~%tg zIkQSzp4IF&2N8PfaNoJIwLctJyMB=sgM(vhaV=cA(C#e7$tWMieWztALn?%0>CTOx zRB{|A=OdKNqv(8ocwAFVoFNWy0Z7=mGL!>JE6V~OajMj@MlsN#L6*cmjL318h|{oX zA$e2*!>)NDNWb>oGlg;=?G(|}Av>c{L2Z%d-}|d?EkAFBmnVuewnwvMGNj`ex-KCYz6CZt2 zX1q9>Uc}8_WqWh6{jYECy#7O!6*aqHcsj8iBqgUUPy#M^ig*b~#e@NGVrU)B5EGa| z%^E2Q)C`U=D=WY!u}~`jp3}@wct5|hdm>hsUVZJ&^U?6yGoKhHxzePNwAEft<{8{` zymNHgTSh!PdH42}=U!a3n=gO$56`!E(PV~Phq{*SdrrUEZU@zT9)N;n=Y!*2S>}i_ z1_UOx6eSD}<62ity;F|obgjk;?JZT6u>;)=oj5sTCt3X3+qeGL*Z%CKFMe@0n_EG< z8}{O;3R~Tox(9lP5cLRauB?^QFkXZhbsv5B^5)vNzWL31 zZyg7@E-Y)w6}UYg4zsXAt)LJjulL$Vtc6TVao?bJ!@lU#HHR$PC?v??QYDjke0DrM zy$42Xd7*_d2E&1${Qci~^2v{U=tEB&okUw9|2=Aj7AEp&;A4}W zpOE?VOJDh|wH}EMh--L8Y~;N75FPJkC2H(#Tz;zy0lhXoGxWd+Wl&zkK(t z*I#?%rJwz8>sy!OJSnjDsL6*1FTC*NkN?zvdj7>Hwk|aWvnnlRXQ@9HDhF3u0imi| z9HB5NLAZ=4Kqc!@x-I1Qz4k@Rzeq?=p#U+jE`k_D)dNy6^{?T2_=dwR91<+x^WU-{jyoR9P{&SEZ8&d(;}y*sz{^P}kW z&fxg{gM2VI^HR<;lozng#v!cJWK4@(g4T4LH9qsF$BBqx10p03kU2qQ2oj5Aia=;U zMrtPTkhkh}FR|k{-|k<(0j&D`$6h!*ol06my6e)TgTcjzxA5rT(v7DtEqPO}&IbDn z)>@+-@Ia4dW%sca|I+gMbC0Q+&W2HPJ^?>OnKeo)uMt3>l4)X6Mnw-Yg@__ldO+8; z;MYsfEDQ^nNfRp|Zs2s}LL4fpjQP!QxP1pT+k@fgir|hPoDT;+xII(dSaB|W?o*9` zKv#i9u5MkF#2&~rGX%HoeZW7qP0K+ZD?B#|Tp(wQHKgzpO;tIs0uP>5Ms}50xW8x= zJko}KfCX}tWt#@pg+#Grv7*2VmZ=GWv#S@k-hS`><<*VVwKXsBhND5~`&ZYymNd!n z;L$59V~~_WDj`~de=c(HK9=ofQZDve;}XYt9RM}hkVeOF&Pb3atVl{uYV`zX0a(^; z>Y4z|B94r)+VDH5sK7oEWY>Wjq#g_;vq42WAHafr4+YkjYkgC7?{frrMxL8P`=*l-(TW>H2s(h_rl6N56N zq-jxHg3YKXSA+@B3sL`6RVDaT0Dl05fv3i{4czq6PkoGa7J4SH;xzuNKmTLVYJK_3 zUpCt6wE`Ew?^;}GP->toV~k5#%WZ(sFN&%igy&HfP|pX7Avn)*%n2Ai&`0pM6nqL2 zg-Su=;7P_c%Hkw|Vu93^u`o0Tjsj9_VFzm)6Kz3o3-#kqKgEJ>+h4Z#k55uvT-&@F z2A0EcmGVi21ZWI_oQ~#cy4dN&m4MYV78{SIO~iPbyPAlS!Xt5i;Lp22W%&CQ@niM@IC`qJh@ z%ywpR23D-MurkXNU|I@xpVXF70V!LUI;6&s0Qf^!WG#P~BI?3d0pw(S47KXXJ3Dt+ z8mC6UMVi9AY?kMc>A*<=bvf|EQ3f8Jm8HnJcx)>#_83@H>Tr3xGzIL;u-?(Oe{o!-()7o1FMp}(?qjoIGmC;^-h8!Nb; zSE|m}9a#2Rk^?Nk_z3_RR0MVms)3Y4nY1PK;RHV77>1|gf|M{&QWU1O(w?OiY4x=g zfl&fwx6-6y;4~oaY3;b4kU$zFn$7?D-@d>7+V^jK{1czO{K=J#&4-@-Xt>me#61Dq zYPm)2geh3<6jEy?pn{rCpbrL61ple?7GRnZ*b3w{ZJSvRP?Z;wmM{=4(#n*EWxCaC z%;d4XU_DqkZ~#IyMJj~TXlk&$5H4*;5~_ho z92f3jOr>fhTZ|bn%0P9hzB8blVErJx!}u(1BnH5M-WUg@or;P9s3CEbTp(C@YV|rD zhF~9TD_~7g6F6xF&i3BD_ipbj-@LwgdE=Rnzep$?%pc8Sn7r2tVImR=a;yr%gv~%F zOK=^ic2F>&GB1I<34;R}1MULq0Q@Sc%X-CSA|O43%;OnH6RzQw(y=&$wIWiE_pP0`Zar`PwAJl4dp*}{6hIULVlshBAmjk?Lo@*3!y~2U zH9&0wm((Rva68H)AR$i4AX0PSI>5Xl!tyCiOX6Zk*~o!J4v7O0?Z|N+gl&f{#?!NC zl(4~k4qF=K`LHO1PV2pcQ^nY$pZ)BG&CMuIa$x6D`9ah1{k$jvGj*INm{;5ZxIhcE z0-~`2w-!LwA@zO&5i(E)z*Jc&QB+`{xL<<33_6P>(fKfEJ*!39^=C3E!gEex&n>F` z)2(Y8Y?NfJcH8ZAPlrP|(ZcHLkFH$6zMB@1^ypI9%L_Ol9F^D6*K??C0|j6usG$HN zq7()ALhlHJ2{MKYa76@sG=_pyA%W0k1(FD@%(X=Xq;3Ouc7U~XWsD#T&7jBBm{_2O(g9!s6OiQI$!WV~Yl1YdoJr z)Zk#1z`Fv_VV@Wbj83OxLTnB(KdI7`R~7V7!4(efk%E(F^SPU=CypVamhcMKusN29guX)?gICUPzQ? z4WL^fWShcQU9XF&T{Y->$3xhuI05VL()wDUBcpT*^W>ubRE~Hek>CZH6Kdn=jkbY} zq;qRyQv*o^Hy%Vi{Gb$rIFJE&Qs5e_yUh^1btxzZN(9D*oWleqeE$cpqg!thSc}V7n#~5V zZqT3*MQ?og=I-Et^Vu+&HrfrArVwfrn94YgfheJsXZLn4KeSb))77=^Jc@3=b!)M+ zu(jTA_`YM+{Q!Fd?96JU)-MnWQh&aRnI^#25CJ3r4=e_FS0HXMzeU1W#UQ Date: Wed, 25 Nov 2009 22:39:14 +0000 Subject: [PATCH 28/85] Fix typo that causes a failure to update the common directory. (releng #2781) --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 7633618..7e1f9df 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ # Makefile for source rpm: alliance -# $Id$ +# $Id: Makefile,v 1.1 2007/08/13 19:36:39 kevin Exp $ NAME := alliance SPECFILE = $(firstword $(wildcard *.spec)) define find-makefile-common -for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done +for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done endef MAKEFILE_COMMON := $(shell $(find-makefile-common)) From 77046a4bb164aaf111f4805c381b20005ed17303 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 28 Jul 2010 09:43:35 +0000 Subject: [PATCH 29/85] dist-git conversion --- .cvsignore => .gitignore | 0 Makefile | 21 --------------------- import.log | 7 ------- 3 files changed, 28 deletions(-) rename .cvsignore => .gitignore (100%) delete mode 100644 Makefile delete mode 100644 import.log diff --git a/.cvsignore b/.gitignore similarity index 100% rename from .cvsignore rename to .gitignore diff --git a/Makefile b/Makefile deleted file mode 100644 index 7e1f9df..0000000 --- a/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# Makefile for source rpm: alliance -# $Id: Makefile,v 1.1 2007/08/13 19:36:39 kevin Exp $ -NAME := alliance -SPECFILE = $(firstword $(wildcard *.spec)) - -define find-makefile-common -for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done -endef - -MAKEFILE_COMMON := $(shell $(find-makefile-common)) - -ifeq ($(MAKEFILE_COMMON),) -# attept a checkout -define checkout-makefile-common -test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2 -endef - -MAKEFILE_COMMON := $(shell $(checkout-makefile-common)) -endif - -include $(MAKEFILE_COMMON) diff --git a/import.log b/import.log deleted file mode 100644 index e9bf0f8..0000000 --- a/import.log +++ /dev/null @@ -1,7 +0,0 @@ -alliance-5_0-21_20070718snap_fc9:HEAD:alliance-5.0-21.20070718snap.fc9.src.rpm:1221496180 -alliance-5_0-24_20070718snap_fc10:HEAD:alliance-5.0-24.20070718snap.fc10.src.rpm:1233516213 -alliance-5_0-26_20070718snap_fc10:HEAD:alliance-5.0-26.20070718snap.fc10.src.rpm:1235508896 -alliance-5_0-27_20070718snap_fc11:HEAD:alliance-5.0-27.20070718snap.fc11.src.rpm:1246707806 -alliance-5_0-28_20070718snap_fc11:HEAD:alliance-5.0-28.20070718snap.fc11.src.rpm:1247151445 -alliance-5_0-30_20090827snap_fc11:HEAD:alliance-5.0-30.20090827snap.fc11.src.rpm:1251456077 -alliance-5_0-31_20090901snap_fc11:HEAD:alliance-5.0-31.20090901snap.fc11.src.rpm:1251955356 From aa4478bd966df9ff8fa3f5d53bedff84f7016204 Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Mon, 7 Feb 2011 18:54:42 -0600 Subject: [PATCH 30/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index bccda9f..dbddfc4 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 31.%{snapshot}snap%{?dist} +Release: 32.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -332,6 +332,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon Feb 07 2011 Fedora Release Engineering - 5.0-32.20090901snap +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + * Wed Sep 02 2009 Chitlesh Goorah - 5.0-31.20090901snap - updated to upstream's 20090901 snapshot - Removed all patches which are accepted by upstream From 8cc7c9e763e86061f42d942e06e9685f2e41a8ee Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Thu, 12 Jan 2012 15:10:19 -0600 Subject: [PATCH 31/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index dbddfc4..54f613e 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 32.%{snapshot}snap%{?dist} +Release: 33.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -332,6 +332,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Thu Jan 12 2012 Fedora Release Engineering - 5.0-33.20090901snap +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + * Mon Feb 07 2011 Fedora Release Engineering - 5.0-32.20090901snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild From 389b20e5f3ee2376230d5a47c83ff304fc45f0ab Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Tue, 28 Feb 2012 11:43:12 -0600 Subject: [PATCH 32/85] - Rebuilt for c++ ABI breakage --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 54f613e..223d22d 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 33.%{snapshot}snap%{?dist} +Release: 34.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -332,6 +332,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Tue Feb 28 2012 Fedora Release Engineering - 5.0-34.20090901snap +- Rebuilt for c++ ABI breakage + * Thu Jan 12 2012 Fedora Release Engineering - 5.0-33.20090901snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild From 8b6f9442922bcee65a93035e6f36b5be4e6e910d Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Wed, 18 Jul 2012 10:48:50 -0500 Subject: [PATCH 33/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 223d22d..3c227f7 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 34.%{snapshot}snap%{?dist} +Release: 35.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -332,6 +332,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Wed Jul 18 2012 Fedora Release Engineering - 5.0-35.20090901snap +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + * Tue Feb 28 2012 Fedora Release Engineering - 5.0-34.20090901snap - Rebuilt for c++ ABI breakage From 14385419887f8e6892d33fdbda8707cef2657648 Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Wed, 13 Feb 2013 10:27:42 -0600 Subject: [PATCH 34/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 3c227f7..c983978 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 35.%{snapshot}snap%{?dist} +Release: 36.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -332,6 +332,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Wed Feb 13 2013 Fedora Release Engineering - 5.0-36.20090901snap +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + * Wed Jul 18 2012 Fedora Release Engineering - 5.0-35.20090901snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild From 70eca45df0293eb856f7b516b316c12c15b07d83 Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Fri, 2 Aug 2013 19:36:04 -0500 Subject: [PATCH 35/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index c983978..a127284 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 36.%{snapshot}snap%{?dist} +Release: 37.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -332,6 +332,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Sat Aug 03 2013 Fedora Release Engineering - 5.0-37.20090901snap +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + * Wed Feb 13 2013 Fedora Release Engineering - 5.0-36.20090901snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild From cb42e2683babf9bf2e98507d9fd6c50b3d640c6a Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Fri, 6 Jun 2014 19:28:49 -0500 Subject: [PATCH 36/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index a127284..3e1627e 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 37.%{snapshot}snap%{?dist} +Release: 38.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -332,6 +332,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Sat Jun 07 2014 Fedora Release Engineering - 5.0-38.20090901snap +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + * Sat Aug 03 2013 Fedora Release Engineering - 5.0-37.20090901snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild From 4f2a7ec77b8e07a71e4e1f859823e6bda26b2e29 Mon Sep 17 00:00:00 2001 From: Till Maas Date: Tue, 1 Jul 2014 18:07:48 +0200 Subject: [PATCH 37/85] Add missing tex BRs (#913874, #991959, #1105945) - Fix FTBFS with -Werror=format-security - Fix FTBFS with latest bison - Remove unneeded macros --- alliance-5.0-20090901-bison.patch | 25 ++++++ alliance-5.0-20090901-format-security.patch | 85 +++++++++++++++++++++ alliance.spec | 27 ++++--- 3 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 alliance-5.0-20090901-bison.patch create mode 100644 alliance-5.0-20090901-format-security.patch diff --git a/alliance-5.0-20090901-bison.patch b/alliance-5.0-20090901-bison.patch new file mode 100644 index 0000000..62998be --- /dev/null +++ b/alliance-5.0-20090901-bison.patch @@ -0,0 +1,25 @@ +From debian/patches/10-fix-parser-extern.patch +Fix duplicate extern error with newer bison + +--- a/ppt/src/Makefile.am ++++ b/ppt/src/Makefile.am +@@ -19,7 +19,7 @@ pat_decl_y.c pat_decl_y.h : $(srcdir)/pat_decl_y.y + $(YACC) -d $(YFLAGS) $(srcdir)/pat_decl_y.y \ + && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.c \ + | sed -e "s/int[ ]*pat_decl_y_char;/extern int pat_decl_y_char;/" \ +- | sed -e "s/PAT_DECL_Y_STYPE[ ]*pat_decl_y_lval;/extern PAT_DECL_Y_STYPE pat_decl_y_lval;/" \ ++ | sed -e "s/PAT_DECL_Y_STYPE[ ]*pat_decl_y_lval;/PAT_DECL_Y_STYPE pat_decl_y_lval;/" \ + | sed -e "s/int[ ]*pat_decl_y_nerrs;/extern int pat_decl_y_nerrs;/" \ + > pat_decl_y.c \ + && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.h > pat_decl_y.h +--- a/ppt/src/Makefile.in ++++ b/ppt/src/Makefile.in +@@ -701,7 +701,7 @@ pat_decl_y.c pat_decl_y.h : $(srcdir)/pat_decl_y.y + $(YACC) -d $(YFLAGS) $(srcdir)/pat_decl_y.y \ + && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.c \ + | sed -e "s/int[ ]*pat_decl_y_char;/extern int pat_decl_y_char;/" \ +- | sed -e "s/PAT_DECL_Y_STYPE[ ]*pat_decl_y_lval;/extern PAT_DECL_Y_STYPE pat_decl_y_lval;/" \ ++ | sed -e "s/PAT_DECL_Y_STYPE[ ]*pat_decl_y_lval;/PAT_DECL_Y_STYPE pat_decl_y_lval;/" \ + | sed -e "s/int[ ]*pat_decl_y_nerrs;/extern int pat_decl_y_nerrs;/" \ + > pat_decl_y.c \ + && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.h > pat_decl_y.h diff --git a/alliance-5.0-20090901-format-security.patch b/alliance-5.0-20090901-format-security.patch new file mode 100644 index 0000000..de54d36 --- /dev/null +++ b/alliance-5.0-20090901-format-security.patch @@ -0,0 +1,85 @@ +--- a/rtd/src/rtd_drive.c ++++ b/rtd/src/rtd_drive.c +@@ -100,7 +100,7 @@ static void RtlWriteNameFile( Name ) + RtlExprLength = Length; + } + +- fprintf( RtlFile, Name ); ++ fprintf( RtlFile, "%s", Name ); + } + + /*------------------------------------------------------------\ +--- a/vpd/src/vpd_drive.c ++++ b/vpd/src/vpd_drive.c +@@ -100,7 +100,7 @@ static void VpnWriteNameFile( Name ) + VpnExprLength = Length; + } + +- fprintf( VpnFile, Name ); ++ fprintf( VpnFile, "%s", Name ); + } + + /*------------------------------------------------------------\ +--- a/boog/src/bog_normalize_message.c ++++ b/boog/src/bog_normalize_message.c +@@ -106,7 +106,7 @@ extern void display_error_in_abl(char* message, chain_list *abl) + } + + fprintf(stderr,"BEH: "); +- fprintf(stderr,message); ++ fprintf(stderr,"%s",message); + fprintf(stderr," in '"); + fflush(stderr); + display_abl(abl); +--- a/l2p/src/drive_ps.c ++++ b/l2p/src/drive_ps.c +@@ -83,22 +83,22 @@ char *msg; + break; + case E_OPEN : + fprintf (stderr, "Problem while opening file "); +- fprintf (stderr, msg); ++ fprintf (stderr, "%s", msg); + break; + case E_CLOSE : + fprintf (stderr, "Problem while closing file "); +- fprintf (stderr, msg); ++ fprintf (stderr, "%s", msg); + break; + case E_WRITE : + fprintf (stderr, "Problem while writing file "); +- fprintf (stderr, msg); ++ fprintf (stderr, "%s", msg); + break; + case E_READ : + fprintf (stderr, "Problem while reading file "); +- fprintf (stderr, msg); ++ fprintf (stderr, "%s", msg); + break; + case E_OUTBOX : +- fprintf (stderr, msg); ++ fprintf (stderr, "%s", msg); + break; + default : + fprintf (stderr, "Unknow internal error"); +--- a/loon/src/lon_normalize_message.c ++++ b/loon/src/lon_normalize_message.c +@@ -106,7 +106,7 @@ extern void display_error_in_abl(char* message, chain_list *abl) + } + + fprintf(stderr,"BEH: "); +- fprintf(stderr,message); ++ fprintf(stderr,"%s",message); + fprintf(stderr," in '"); + fflush(stderr); + display_abl(abl); +--- a/sea/src/util_LEFDEF.c ++++ b/sea/src/util_LEFDEF.c +@@ -213,7 +213,7 @@ extern char *MBK2DEF_name(asLEF, asMBK) + *pI = (char)0; pI += 1; + sprintf (asLEF, "%s(%s)", sTmp, pI); + } else { +- sprintf (asLEF, sTmp); ++ sprintf (asLEF, "%s", sTmp); + } + + return (asLEF); diff --git a/alliance.spec b/alliance.spec index 3e1627e..e6cdbde 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 38.%{snapshot}snap%{?dist} +Release: 39.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -13,7 +13,6 @@ Group: Applications/Engineering Source: http://www-asim.lip6.fr/pub/alliance/distribution/5.0/%{name}-%{version}-%{snapshot}.tar.gz URL: http://www-asim.lip6.fr/recherche/alliance/ - Source1: alliance.fedora # Chitlesh's donated pictures to alliance @@ -24,10 +23,16 @@ Source3: alliance-tutorials-go-all-clean.sh Source4: alliance-examples-go-all.sh Source5: alliance-examples-go-all-clean.sh +# 2014-07-01: Notified upstream via e-mail to alliance-users@asim.lip6.fr +Patch0: alliance-5.0-20090901-format-security.patch +# 2014-07-01: From debian: debian/patches/10-fix-parser-extern.patch +Patch1: alliance-5.0-20090901-bison.patch + BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: libXt-devel byacc desktop-file-utils bison BuildRequires: libXp-devel libXpm-devel libstdc++-devel flex m4 -BuildRequires: transfig ghostscript +BuildRequires: transfig ghostscript tex(latex) tex(epsf.sty) tex(picinpar.sty) +BuildRequires: tex(subfigure.sty) tex(wrapfig.sty) %if 0%{?rhel} BuildRequires: openmotif-devel @@ -100,6 +105,8 @@ Documentation and tutorials for the Alliance VLSI CAD Sytem. %prep %setup -q +%patch0 -p1 +%patch1 -p1 %{__rm} -rf autom4te.cache %{__cp} -p %{SOURCE1} . @@ -191,8 +198,6 @@ sed -i -e 's! -shared ! -Wl,--as-needed\0!g' libtool %install -%{__rm} -rf %{buildroot} - %{__make} INSTALL="install -p" DESTDIR=%{buildroot} install # Set execution rights on the alc_env.* batchs and adjust ALLIANCE_TOP. @@ -292,15 +297,11 @@ touch --no-create %{_datadir}/icons/hicolor || : -%clean -%{__rm} -rf %{buildroot} - #These headers are useful for the _usage_ of the binaries #without these headers some of the binaries will be broken by default %files -%defattr(-,root,root,-) %doc CHANGES LICENCE COPYING* FAQ alliance.fedora %{prefix}/ %{_datadir}/%{name}/ @@ -308,14 +309,12 @@ touch --no-create %{_datadir}/icons/hicolor || : %files libs -%defattr(-,root,root,-) %config(noreplace) %{_sysconfdir}/ld.so.conf.d/* %{_datadir}/applications/*.desktop %config(noreplace) %{_sysconfdir}/profile.d/alc_env.* %files doc -%defattr(-,root,root,-) %doc doc/html/ %doc doc/design-flow %doc doc/pdf/*.pdf @@ -332,6 +331,12 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Wed Jun 18 2014 Yaakov Selkowitz - 5.0-39.20090901snap +- Add missing tex BRs (#913874, #991959, #1105945) +- Fix FTBFS with -Werror=format-security +- Fix FTBFS with latest bison +- Remove unneeded macros + * Sat Jun 07 2014 Fedora Release Engineering - 5.0-38.20090901snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild From 733e5ed055605228b162d55448aaecf1c7ca4397 Mon Sep 17 00:00:00 2001 From: Till Maas Date: Wed, 2 Jul 2014 21:53:59 +0200 Subject: [PATCH 38/85] Update URL --- alliance.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index e6cdbde..15a971c 100644 --- a/alliance.spec +++ b/alliance.spec @@ -11,7 +11,7 @@ License: GPLv2 Group: Applications/Engineering Source: http://www-asim.lip6.fr/pub/alliance/distribution/5.0/%{name}-%{version}-%{snapshot}.tar.gz -URL: http://www-asim.lip6.fr/recherche/alliance/ +URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ Source1: alliance.fedora From 6544962dd2215b434b061cf24adb389d6375cd5e Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Fri, 15 Aug 2014 20:19:55 +0000 Subject: [PATCH 39/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 15a971c..eba45ee 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.0 -Release: 39.%{snapshot}snap%{?dist} +Release: 40.%{snapshot}snap%{?dist} Summary: VLSI EDA System License: GPLv2 @@ -331,6 +331,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Fri Aug 15 2014 Fedora Release Engineering - 5.0-40.20090901snap +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + * Wed Jun 18 2014 Yaakov Selkowitz - 5.0-39.20090901snap - Add missing tex BRs (#913874, #991959, #1105945) - Fix FTBFS with -Werror=format-security From 114f9664af9b235c0915fc008b3fcf1d5f32c4ec Mon Sep 17 00:00:00 2001 From: Christopher Meng Date: Tue, 19 Aug 2014 18:23:11 +0800 Subject: [PATCH 40/85] Update to 5.1.1 --- .gitignore | 1 + alliance.spec | 215 +++++++++++++++++++++----------------------------- sources | 2 +- 3 files changed, 92 insertions(+), 126 deletions(-) diff --git a/.gitignore b/.gitignore index 2f30e04..f7c59bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ alliance-5.0-20090901.tar.gz +/alliance-5.1.1.tar.bz2 diff --git a/alliance.spec b/alliance.spec index 15a971c..c7bb727 100644 --- a/alliance.spec +++ b/alliance.spec @@ -1,19 +1,11 @@ -%define prefix %{_libdir}/%{name} -%define snapshot 20090901 -%define _default_patch_fuzz 2 - -Name: alliance -Version: 5.0 -Release: 39.%{snapshot}snap%{?dist} -Summary: VLSI EDA System - -License: GPLv2 -Group: Applications/Engineering - -Source: http://www-asim.lip6.fr/pub/alliance/distribution/5.0/%{name}-%{version}-%{snapshot}.tar.gz -URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ - -Source1: alliance.fedora +Name: alliance +Version: 5.1.1 +Release: 0%{?dist} +Summary: VLSI EDA System +License: GPLv2 +URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ +Source: http://www-asim.lip6.fr/pub/alliance/distribution/latest/alliance-%{version}.tar.bz2 +Source1: alliance.fedora # Chitlesh's donated pictures to alliance # included asfrom snapshot 20090901 @@ -22,47 +14,45 @@ Source2: alliance-tutorials-go-all.sh Source3: alliance-tutorials-go-all-clean.sh Source4: alliance-examples-go-all.sh Source5: alliance-examples-go-all-clean.sh - # 2014-07-01: Notified upstream via e-mail to alliance-users@asim.lip6.fr -Patch0: alliance-5.0-20090901-format-security.patch +#Patch0: alliance-5.0-20090901-format-security.patch # 2014-07-01: From debian: debian/patches/10-fix-parser-extern.patch -Patch1: alliance-5.0-20090901-bison.patch - -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) -BuildRequires: libXt-devel byacc desktop-file-utils bison -BuildRequires: libXp-devel libXpm-devel libstdc++-devel flex m4 -BuildRequires: transfig ghostscript tex(latex) tex(epsf.sty) tex(picinpar.sty) -BuildRequires: tex(subfigure.sty) tex(wrapfig.sty) - +#Patch1: alliance-5.0-20090901-bison.patch +BuildRequires: bison +BuildRequires: byacc +BuildRequires: desktop-file-utils +BuildRequires: flex +BuildRequires: ghostscript +BuildRequires: libstdc++-devel +BuildRequires: libXp-devel +BuildRequires: libXpm-devel +BuildRequires: libXt-devel +BuildRequires: m4 +BuildRequires: tex(epsf.sty) +BuildRequires: tex(latex) +BuildRequires: tex(picinpar.sty) +BuildRequires: tex(subfigure.sty) +BuildRequires: tex(wrapfig.sty) +BuildRequires: transfig %if 0%{?rhel} -BuildRequires: openmotif-devel -BuildRequires: pkgconfig +BuildRequires: openmotif-devel +BuildRequires: pkgconfig %else -BuildRequires: lesstif-devel +BuildRequires: lesstif-devel %endif - -Requires: xorg-x11-fonts-misc +Requires: xorg-x11-fonts-misc # RHBZ 442379 -Requires(post): %{name}-libs = %{version}-%{release} +Requires(post): %{name}-libs%{?_isa} = %{version}-%{release} %description -Alliance is a complete set of free CAD tools and portable libraries for -VLSI design. It includes a VHDL compiler and simulator, logic synthesis -tools, and automatic place and route tools. - -A complete set of portable CMOS libraries is provided, including a RAM -generator, a ROM generator and a data-path compiler. - -Alliance is the result of more than ten years effort spent at ASIM department -of LIP6 laboratory of the Pierre et Marie Curie University (Paris VI, France). - -Alliance has been used for research projects such as the 875 000 transistors -StaCS superscalar microprocessor and 400 000 transistors IEEE Gigabit HSL -Router. - -You are kindly requested to mention -" Designed with alliance (c) LIP6, Université Pierre et Marie Curie" -so as to spread the word about "alliance CAD system" and its development team. +Alliance is a complete set of free cad tools and portable libraries for VLSI +design. It includes a vhdl compiler and simulator, logic synthesis tools, +and automatic place and route tools. A complete set of portable cmos libraries +is provided. Alliance is the result of a twelve year effort spent at SoC +department of LIP6 laboratory of the Pierre & Marie Curie University (Paris +VI, France). Alliance has been used for research projects such as the 875 000 +transistors StaCS superscalar microprocessor and 400 000 transistors ieee +Gigabit HSL Router. Alliance provides CAD tools covering most of all the digital design flow: @@ -76,40 +66,33 @@ Alliance provides CAD tools covering most of all the digital design flow: * Netlist extraction and verification * Design rules checking -%{name} is listed among Fedora Electronic Lab (FEL) packages. +Alliance is listed among Fedora Electronic Lab (FEL) packages. +%package libs +Summary: Alliance VLSI CAD Sytem - multilibs +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: electronics-menu -%package libs -Summary: Alliance VLSI CAD Sytem - multilibs -Group: Applications/Engineering -Requires: %{name} = %{version}-%{release} -Requires: electronics-menu - - -%description libs +%description libs Architecture dependent files for the Alliance VLSI CAD Sytem. +%package doc +Summary: Alliance VLSI CAD Sytem - Documentations +BuildArch: noarch +Requires: %{name} = %{version}-%{release} +Requires: gnuplot +BuildRequires: tetex-latex -%package doc -Summary: Alliance VLSI CAD Sytem - Documentations -Group: Applications/Engineering -Requires: %{name} = %{version}-%{release} -Requires: gnuplot -BuildRequires:tetex-latex - - - -%description doc +%description doc Documentation and tutorials for the Alliance VLSI CAD Sytem. - %prep %setup -q -%patch0 -p1 -%patch1 -p1 -%{__rm} -rf autom4te.cache +#%patch0 -p1 +#%patch1 -p1 +rm -frv autom4te.cache -%{__cp} -p %{SOURCE1} . +cp -p %{SOURCE1} . sed -i "s|ALLIANCE_TOP|%{prefix}|" distrib/*.desktop # removed useless copyrighted (by Cadence) lines from the examples @@ -122,19 +105,19 @@ sed -i "s|tutorials||" documentation/Makefile.in sed -i "s|documentation/tutorials/Makefile||" configure* pushd documentation/tutorials # clean unneccessary files - %{__rm} Makefile* - %{__rm} *.pdf + rm Makefile* + rm *.pdf # build documentation for folder in place_and_route/tex start simulation/tex synthesis/tex; do pushd $folder - %{__make} + make popd # remove useless directories before %%doc - %{__rm} -rf $folder + rm -rf $folder done # Add automated scripts to tutorials - %{__install} -pm 755 %{SOURCE2} go-all.sh - %{__install} -pm 755 %{SOURCE3} go-all-clean.sh + install -pm 755 %{SOURCE2} go-all.sh + install -pm 755 %{SOURCE3} go-all-clean.sh # Fedora Electronic Lab self test for alliance #./go-all.sh 2>&1 | tee self-test-tutorials.log # clean temporary files @@ -150,7 +133,7 @@ sed -i '18i\#include \"bvl_bcomp_y.h\"' bvl/src/bvl_bcomp_y.y for nonUTF8 in FAQ README LICENCE distrib/doc/alc_origin.1 alcban/man1/alcbanner.1 \ loon/doc/loon.1 m2e/doc/man1/m2e.1 boog/doc/boog.1 ; do %{_bindir}/iconv -f ISO-8859-1 -t utf-8 $nonUTF8 > $nonUTF8.conv - %{__mv} -f $nonUTF8.conv $nonUTF8 + mv -f $nonUTF8.conv $nonUTF8 done pushd documentation/alliance-examples/ @@ -158,7 +141,7 @@ pushd documentation/alliance-examples/ for nonUTF8 in tuner/build_tuner mipsR3000/asm/mips_defs.h tuner/tuner.vbe \ tuner/README mipsR3000/sce/mips_dpt.c ; do %{_bindir}/iconv -f ISO-8859-1 -t utf-8 $nonUTF8 > $nonUTF8.conv - %{__mv} -f $nonUTF8.conv $nonUTF8 + mv -f $nonUTF8.conv $nonUTF8 done #wrong-file-end-of-line-encoding @@ -174,15 +157,11 @@ find documentation/tutorials/ \ -exec chmod 0644 {} ';' %build - export ALLIANCE_TOP=%{prefix} - -%configure --prefix=%{prefix} \ - --enable-alc-shared \ +%configure --enable-alc-shared \ --disable-static \ --includedir=%{prefix}/include \ --libdir=%{prefix}/lib \ - --bindir=%{prefix}/bin \ --mandir=%{_datadir}/%{name}/man # RHBZ 252941 # disabling rpath @@ -193,12 +172,10 @@ sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool sed -i -e 's! -shared ! -Wl,--as-needed\0!g' libtool # Is not parallel-build-safe -%{__make} - +make %install - -%{__make} INSTALL="install -p" DESTDIR=%{buildroot} install +%make_install # Set execution rights on the alc_env.* batchs and adjust ALLIANCE_TOP. pushd %{buildroot}%{_sysconfdir}/profile.d @@ -210,15 +187,15 @@ popd # documentation -%{__cp} -pr %{buildroot}%{prefix}/doc/ . -%{__cp} -pr %{buildroot}%{prefix}/examples/alliance-examples/ . +cp -pr %{buildroot}%{prefix}/doc/ . +cp -pr %{buildroot}%{prefix}/examples/alliance-examples/ . -%{__rm} -rf %{buildroot}%{prefix}/doc/ -%{__rm} -rf %{buildroot}%{prefix}/examples/ +rm -rf %{buildroot}%{prefix}/doc/ +rm -rf %{buildroot}%{prefix}/examples/ # Add automated scripts to examples -%{__install} -pm 755 %{SOURCE4} alliance-examples/go-all.sh -%{__install} -pm 755 %{SOURCE5} alliance-examples/go-all-clean.sh +install -pm 755 %{SOURCE4} alliance-examples/go-all.sh +install -pm 755 %{SOURCE5} alliance-examples/go-all-clean.sh pushd alliance-examples/ # FEL self test for alliance @@ -227,39 +204,31 @@ pushd alliance-examples/ ./go-all-clean.sh popd -find %{buildroot} -name '*.la' -exec rm -f {} ';' - +find %{buildroot} -name '*.la' -delete -print # Adding icons for the menus -%{__mkdir} -p %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/ -%{__cp} -p distrib/*.png \ +mkdir -p %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/ +cp -p distrib/*.png \ %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/ - # desktop files with enhanced menu from electronics-menu now on Fedora # thanks Peter Brett -for desktopfile in distrib/*.desktop; do -desktop-file-install --vendor "" \ - --dir %{buildroot}%{_datadir}/applications/ \ - $desktopfile +for d in distrib/*.desktop; do +desktop-file-install --dir %{buildroot}%{_datadir}/applications/ $d done - # Architecture independent files -%{__mv} %{buildroot}%{prefix}/cells %{buildroot}%{_datadir}/%{name}/ -%{__mv} %{buildroot}%{prefix}/etc %{buildroot}%{_datadir}/%{name}/ - +mv %{buildroot}%{prefix}/cells %{buildroot}%{_datadir}/%{name}/ +mv %{buildroot}%{prefix}/etc %{buildroot}%{_datadir}/%{name}/ # protecting hardcoded links ln -sf ../../..%{_datadir}/%{name}/cells %{buildroot}%{prefix}/cells ln -sf ../../..%{_datadir}/%{name}/etc %{buildroot}%{prefix}/etc ln -sf ../../..%{_datadir}/%{name}/man %{buildroot}%{prefix}/man - # manpage-not-gzipped find %{prefix}/man -type f -not -name '*.gz' -print | xargs gzip -9f - %{__mkdir} -p %{buildroot}%{_sysconfdir}/ld.so.conf.d/ cat > %{buildroot}%{_sysconfdir}/ld.so.conf.d/%{name}.conf << EOF # Alliance VLSI design system @@ -269,51 +238,44 @@ EOF # removing tools for compiling and installing Alliance tools # These are for the packager (i.e me) and not for user -%{__rm} -f %{buildroot}%{_sysconfdir}/%{name}/attila.conf -%{__rm} -f %{buildroot}%{prefix}/etc/attila.conf -%{__rm} -f %{buildroot}%{prefix}/bin/attila -%{__rm} -f %{buildroot}%{_datadir}/man/man1/attila* -%{__rm} -f doc/html/alliance/*attila.html -%{__rm} -f doc/pdf/attila.pdf +rm -f %{buildroot}%{_sysconfdir}/%{name}/attila.conf +rm -f %{buildroot}%{prefix}/etc/attila.conf +rm -f %{buildroot}%{prefix}/bin/attila +rm -f %{buildroot}%{_datadir}/man/man1/attila* +rm -f doc/html/alliance/*attila.html +rm -f doc/pdf/attila.pdf # correcting minor documentation details sed -i "s|/bin/zsh|/bin/sh|" doc/alliance-run/bench.zsh %{_fixperms} %{buildroot}/* - - %post /sbin/ldconfig source %{_sysconfdir}/profile.d/alc_env.sh touch --no-create %{_datadir}/icons/hicolor || : %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : - %postun /sbin/ldconfig touch --no-create %{_datadir}/icons/hicolor || : %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : - #These headers are useful for the _usage_ of the binaries #without these headers some of the binaries will be broken by default - %files %doc CHANGES LICENCE COPYING* FAQ alliance.fedora -%{prefix}/ +#%{prefix}/ %{_datadir}/%{name}/ %{_datadir}/icons/hicolor/48x48/apps/* - %files libs %config(noreplace) %{_sysconfdir}/ld.so.conf.d/* %{_datadir}/applications/*.desktop %config(noreplace) %{_sysconfdir}/profile.d/alc_env.* - %files doc %doc doc/html/ %doc doc/design-flow @@ -331,6 +293,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Tue Aug 19 2014 Christopher Meng - 5.1.1-0 +- Update to 5.1.1 + * Wed Jun 18 2014 Yaakov Selkowitz - 5.0-39.20090901snap - Add missing tex BRs (#913874, #991959, #1105945) - Fix FTBFS with -Werror=format-security diff --git a/sources b/sources index 9af8cf1..b5ec516 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -f3b692c4ea9e54c040280f660b3cf170 alliance-5.0-20090901.tar.gz +2a0e6419d8e61e432554e17fa3d6dc1c alliance-5.1.1.tar.bz2 From 9677d6bfa31d90d4a8d856b28571b489856a9199 Mon Sep 17 00:00:00 2001 From: Christopher Meng Date: Wed, 20 Aug 2014 12:09:21 +0800 Subject: [PATCH 41/85] Correct the setup stage. --- alliance.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 0248e12..b38ca39 100644 --- a/alliance.spec +++ b/alliance.spec @@ -87,7 +87,7 @@ BuildRequires: tetex-latex Documentation and tutorials for the Alliance VLSI CAD Sytem. %prep -%setup -q +%setup -qn %{name} #%patch0 -p1 #%patch1 -p1 rm -frv autom4te.cache From 577cfcf13618a550f8a29eef9b7a4aad717033eb Mon Sep 17 00:00:00 2001 From: Christopher Meng Date: Wed, 20 Aug 2014 13:03:54 +0800 Subject: [PATCH 42/85] Cleanup. --- alliance.spec | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/alliance.spec b/alliance.spec index b38ca39..7c59bf7 100644 --- a/alliance.spec +++ b/alliance.spec @@ -79,7 +79,6 @@ Architecture dependent files for the Alliance VLSI CAD Sytem. %package doc Summary: Alliance VLSI CAD Sytem - Documentations BuildArch: noarch -Requires: %{name} = %{version}-%{release} Requires: gnuplot BuildRequires: tetex-latex @@ -87,7 +86,7 @@ BuildRequires: tetex-latex Documentation and tutorials for the Alliance VLSI CAD Sytem. %prep -%setup -qn %{name} +%setup -qn %{name}/src #%patch0 -p1 #%patch1 -p1 rm -frv autom4te.cache From aa72ad59196d434f8b092191cc58dae4bad49bdd Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Tue, 16 Jun 2015 23:47:36 +0000 Subject: [PATCH 43/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 7c59bf7..6c58db9 100644 --- a/alliance.spec +++ b/alliance.spec @@ -1,6 +1,6 @@ Name: alliance Version: 5.1.1 -Release: 0%{?dist} +Release: 1%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -292,6 +292,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Tue Jun 16 2015 Fedora Release Engineering - 5.1.1-1 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + * Tue Aug 19 2014 Christopher Meng - 5.1.1-0 - Update to 5.1.1 From f3e801444821fcaa00a581ba331fea09b7374d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= Date: Sun, 27 Dec 2015 08:49:39 +0100 Subject: [PATCH 44/85] Rebuilt for libXm so-name bump Use %%license Cleanup trailing whitespace --- alliance.spec | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/alliance.spec b/alliance.spec index 6c58db9..9028bc7 100644 --- a/alliance.spec +++ b/alliance.spec @@ -1,6 +1,6 @@ Name: alliance Version: 5.1.1 -Release: 1%{?dist} +Release: 2%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -45,13 +45,13 @@ Requires: xorg-x11-fonts-misc Requires(post): %{name}-libs%{?_isa} = %{version}-%{release} %description -Alliance is a complete set of free cad tools and portable libraries for VLSI -design. It includes a vhdl compiler and simulator, logic synthesis tools, +Alliance is a complete set of free cad tools and portable libraries for VLSI +design. It includes a vhdl compiler and simulator, logic synthesis tools, and automatic place and route tools. A complete set of portable cmos libraries -is provided. Alliance is the result of a twelve year effort spent at SoC -department of LIP6 laboratory of the Pierre & Marie Curie University (Paris -VI, France). Alliance has been used for research projects such as the 875 000 -transistors StaCS superscalar microprocessor and 400 000 transistors ieee +is provided. Alliance is the result of a twelve year effort spent at SoC +department of LIP6 laboratory of the Pierre & Marie Curie University (Paris +VI, France). Alliance has been used for research projects such as the 875 000 +transistors StaCS superscalar microprocessor and 400 000 transistors ieee Gigabit HSL Router. Alliance provides CAD tools covering most of all the digital design flow: @@ -154,7 +154,7 @@ find documentation/tutorials/ \ -name *.vst -o \ -name *.c \ -exec chmod 0644 {} ';' - + %build export ALLIANCE_TOP=%{prefix} %configure --enable-alc-shared \ @@ -265,7 +265,8 @@ touch --no-create %{_datadir}/icons/hicolor || : #without these headers some of the binaries will be broken by default %files -%doc CHANGES LICENCE COPYING* FAQ alliance.fedora +%license LICENCE COPYING* +%doc CHANGES FAQ alliance.fedora #%{prefix}/ %{_datadir}/%{name}/ %{_datadir}/icons/hicolor/48x48/apps/* @@ -276,6 +277,7 @@ touch --no-create %{_datadir}/icons/hicolor || : %config(noreplace) %{_sysconfdir}/profile.d/alc_env.* %files doc +%license LICENCE COPYING* %doc doc/html/ %doc doc/design-flow %doc doc/pdf/*.pdf @@ -290,8 +292,12 @@ touch --no-create %{_datadir}/icons/hicolor || : %doc doc/alliance-run/ - %changelog +* Sun Dec 27 2015 Björn Esser - 5.1.1-2 +- Rebuilt for libXm so-name bump +- Use %%license +- Cleanup trailing whitespace + * Tue Jun 16 2015 Fedora Release Engineering - 5.1.1-1 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild @@ -300,7 +306,6 @@ touch --no-create %{_datadir}/icons/hicolor || : * Fri Aug 15 2014 Fedora Release Engineering - 5.0-40.20090901snap - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild ->>>>>>> 6544962dd2215b434b061cf24adb389d6375cd5e * Wed Jun 18 2014 Yaakov Selkowitz - 5.0-39.20090901snap - Add missing tex BRs (#913874, #991959, #1105945) From f952aca474372f4b27ff551a555507020cfc5020 Mon Sep 17 00:00:00 2001 From: Dennis Gilmore Date: Wed, 3 Feb 2016 16:06:22 +0000 Subject: [PATCH 45/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 9028bc7..fcd0801 100644 --- a/alliance.spec +++ b/alliance.spec @@ -1,6 +1,6 @@ Name: alliance Version: 5.1.1 -Release: 2%{?dist} +Release: 3%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -293,6 +293,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Wed Feb 03 2016 Fedora Release Engineering - 5.1.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + * Sun Dec 27 2015 Björn Esser - 5.1.1-2 - Rebuilt for libXm so-name bump - Use %%license From 90e4143735e4d594710cda790f0b815eec6d2c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Tue, 1 Mar 2016 19:34:42 +0100 Subject: [PATCH 46/85] Rework spec. - Add upstream changes. - Rework package configuration. - Introduce *-devel. --- 0000-alliance-5.1.1-git10a7b7e.patch | 32518 ++++++++++++++++ 0001-Remove-stray-files.patch | 1475 + 0002-Update-autostuff.patch | 191 + 0003-Consolidate-installation-dirs.patch | 151 + 0004-Misc-installation-dirs-fixes.patch | 316 + ...Use-inttypes-macros-to-print-int32_t.patch | 36 + 0006-Use-ring_yy-instead-of-yy.patch | 77 + 0007-Eliminate-CFLAGS.patch | 62 + 0008-Rework-Makefile.ams.patch | 1923 + 0009-Misc.-doc-fixes.patch | 388 + 0010-Fedora-profiles.patch | 114 + alliance-5.0-20090901-bison.patch | 25 - alliance-5.0-20090901-format-security.patch | 85 - alliance.spec | 306 +- 14 files changed, 37414 insertions(+), 253 deletions(-) create mode 100644 0000-alliance-5.1.1-git10a7b7e.patch create mode 100644 0001-Remove-stray-files.patch create mode 100644 0002-Update-autostuff.patch create mode 100644 0003-Consolidate-installation-dirs.patch create mode 100644 0004-Misc-installation-dirs-fixes.patch create mode 100644 0005-Use-inttypes-macros-to-print-int32_t.patch create mode 100644 0006-Use-ring_yy-instead-of-yy.patch create mode 100644 0007-Eliminate-CFLAGS.patch create mode 100644 0008-Rework-Makefile.ams.patch create mode 100644 0009-Misc.-doc-fixes.patch create mode 100644 0010-Fedora-profiles.patch delete mode 100644 alliance-5.0-20090901-bison.patch delete mode 100644 alliance-5.0-20090901-format-security.patch diff --git a/0000-alliance-5.1.1-git10a7b7e.patch b/0000-alliance-5.1.1-git10a7b7e.patch new file mode 100644 index 0000000..78be246 --- /dev/null +++ b/0000-alliance-5.1.1-git10a7b7e.patch @@ -0,0 +1,32518 @@ +diff --git a/alliance/src/README b/alliance/src/README +index d769dcd..c4d784c 100644 +--- a/alliance/src/README ++++ b/alliance/src/README +@@ -1,5 +1,5 @@ + # Alliance VLSI CAD System +-# Copyright (C) 1990, 2002 ASIM/LIP6/UPMC ++# Copyright (C) 1990, 2016 UPMC + # + # Home page : http://asim.lip6.fr/recherche/alliance/ + # E-mail : mailto:alliance-users@asim.lip6.fr +@@ -13,6 +13,7 @@ + This file discuss about installation of Alliance on UNIX machines. + + ++ + # Downloading and installing binary distribution : + # =================================================================== + +diff --git a/alliance/src/autostuff b/alliance/src/autostuff +index abbdfd6..53083eb 100755 +--- a/alliance/src/autostuff ++++ b/alliance/src/autostuff +@@ -291,28 +291,28 @@ find $ordered_dirs -name configure.in | while read config; do + echo "" >> configure.in + echo "dnl Infos extracted from $config" >> configure.in + +- for version_line in `grep -h _CUR= $config`; do ++ for version_line in `grep -ah _CUR= $config`; do + echo "$version_line" >> configure.in + version_name=`echo $version_line | sed 's,=.*,,'` + echo "AC_SUBST($version_name)" >> configure.in + done +- for version_line in `grep -h _REV= $config`; do ++ for version_line in `grep -ah _REV= $config`; do + echo "$version_line" >> configure.in + version_name=`echo $version_line | sed 's,=.*,,'` + echo "AC_SUBST($version_name)" >> configure.in + done +- for version_line in `grep -h _REL= $config`; do ++ for version_line in `grep -ah _REL= $config`; do + echo "$version_line" >> configure.in + version_name=`echo $version_line | sed 's,=.*,,'` + echo "AC_SUBST($version_name)" >> configure.in + done + +- for dll_line in `grep -h _DLL_VERSION= $config`; do ++ for dll_line in `grep -ah _DLL_VERSION= $config`; do + echo "$dll_line" >> configure.in + dll_name=`echo $dll_line | sed 's,=.*,,'` + echo "AC_SUBST($dll_name)" >> configure.in + done +- for version_line in `grep -h _VERSION= $config | grep -v DLL`; do ++ for version_line in `grep -ah _VERSION= $config | grep -v DLL`; do + echo "$version_line" >> configure.in + version_name=`echo $version_line | sed 's,=.*,,'` + echo "AC_SUBST($version_name)" >> configure.in +diff --git a/alliance/src/boog/src/bog_lib_reader.c b/alliance/src/boog/src/bog_lib_reader.c +index fca9bd2..da3603b 100644 +--- a/alliance/src/boog/src/bog_lib_reader.c ++++ b/alliance/src/boog/src/bog_lib_reader.c +@@ -149,7 +149,7 @@ static int distribCell(befig_list* befig) + } + + /*patterns aren't equal, new is more precise*/ +- if (!biabl_befig) continue; ++ if (biabl_befig) continue; + + /*patterns are equal -->comparison*/ + if (cell->AREAABL)!=ABL_ATOM(expr)) continue; +- ++ if (ABL_ATOM(expr)&& ++ ((ABL_ATOM_VALUE(expr)==getablatomzero() || ABL_ATOM_VALUE(expr)==getablatomone()) ++ && ABL_ATOM_VALUE(expr)!=ABL_ATOM_VALUE(cell->ABL))) continue; + /*improve speed*/ + if (!ABL_ATOM(expr) && ABL_OPER(expr)!=ABL_NOT/*match all*/) { + if (ABL_ARITY(cell->ABL)!=ABL_ARITY(expr)) continue; +diff --git a/alliance/src/cells/src/Makefile.am b/alliance/src/cells/src/Makefile.am +index 64e6972..b4c0f2a 100644 +--- a/alliance/src/cells/src/Makefile.am ++++ b/alliance/src/cells/src/Makefile.am +@@ -1,4 +1,4 @@ + # $Id: Makefile.am,v 1.5 2005/10/04 15:46:25 jpc Exp $ + +-SUBDIRS = dp_sxlib padlib pxlib rflib rf2lib ramlib romlib sxlib ++SUBDIRS = dp_sxlib padlib pxlib mpxlib rflib rf2lib ramlib romlib sxlib msxlib + +diff --git a/alliance/src/cells/src/dp_sxlib/dp_dff_x4.ap b/alliance/src/cells/src/dp_sxlib/dp_dff_x4.ap +index bb6f720..bd47a67 100644 +--- a/alliance/src/cells/src/dp_sxlib/dp_dff_x4.ap ++++ b/alliance/src/cells/src/dp_sxlib/dp_dff_x4.ap +@@ -1,170 +1,173 @@ + V ALLIANCE : 6 +-H dp_dff_x4,P,26/ 9/2000,100 ++H dp_dff_x4,P, 6/ 8/2015,100 + A 0,0,7000,5000 +-R 3000,2000,ref_ref,nckx +-R 500,4000,ref_ref,i_40 +-R 500,1000,ref_ref,i_10 +-R 500,1500,ref_ref,i_15 +-R 500,2000,ref_ref,i_20 +-R 500,3500,ref_ref,i_35 +-R 500,3000,ref_ref,i_30 +-R 6000,1500,ref_ref,q_15 +-R 6000,1000,ref_ref,q_10 +-R 6000,4000,ref_ref,q_40 +-R 6000,3000,ref_ref,q_30 +-R 6000,2000,ref_ref,q_20 +-R 6000,3500,ref_ref,q_35 +-R 500,2500,ref_ref,i_25 +-R 6000,2500,ref_ref,q_25 +-R 1000,2000,ref_ref,wenx +-R 2000,2000,ref_ref,nwenx + R 4500,2000,ref_ref,ckx +-S 3000,1500,3400,1500,200,*,RIGHT,ALU1 +-S 3000,3000,3900,3000,200,*,RIGHT,ALU1 +-S 3000,1500,3000,3000,100,*,DOWN,ALU1 +-S 3000,2000,3000,2000,200,nckx,LEFT,CALU3 +-S 4400,2500,4400,3500,100,*,DOWN,ALU1 +-S 3700,3500,3700,4000,100,*,DOWN,ALU1 +-S 3700,3500,4400,3500,100,*,RIGHT,ALU1 +-S 300,3300,300,4600,300,*,UP,PDIF +-S 5100,2600,5100,4900,100,*,DOWN,PTRANS +-S 6300,2600,6300,4900,100,*,DOWN,PTRANS +-S 6600,2800,6600,4700,300,*,DOWN,PDIF +-S 0,4000,7000,4000,2600,*,RIGHT,NWELL +-S 2400,3100,2400,4400,100,*,UP,PTRANS +-S 1900,3100,1900,4400,100,*,UP,PTRANS +-S 1100,3100,1100,4400,100,*,UP,PTRANS +-S 5700,2600,5700,4900,100,*,DOWN,PTRANS +-S 6000,2800,6000,4700,300,*,DOWN,PDIF +-S 4700,2600,4700,4900,100,*,DOWN,PTRANS +-S 5300,2800,5300,4700,300,*,DOWN,PDIF +-S 4400,2800,4400,4700,300,*,DOWN,PDIF +-S 3700,3800,3700,4700,300,*,DOWN,PDIF +-S 2700,3300,2700,4700,300,*,UP,PDIF +-S 3000,3600,3000,4900,100,*,DOWN,PTRANS +-S 3400,3600,3400,4900,100,*,DOWN,PTRANS +-S 600,3100,600,4400,100,*,UP,PTRANS +-S 1500,3300,1500,4200,500,*,UP,PDIF +-S 4700,100,4700,1400,100,*,UP,NTRANS +-S 6300,100,6300,1400,100,*,UP,NTRANS +-S 1900,600,1900,1400,100,*,DOWN,NTRANS +-S 2400,600,2400,1400,100,*,DOWN,NTRANS +-S 1100,600,1100,1400,100,*,DOWN,NTRANS +-S 3400,600,3400,1400,100,*,UP,NTRANS +-S 3000,600,3000,1400,100,*,UP,NTRANS +-S 600,600,600,1400,100,*,DOWN,NTRANS +-S 5700,100,5700,1400,100,*,UP,NTRANS +-S 5100,100,5100,1400,100,*,UP,NTRANS +-S 4400,300,4400,1200,300,*,DOWN,NDIF +-S 300,400,300,1200,300,*,DOWN,NDIF +-S 300,300,300,1200,300,*,DOWN,NDIF +-S 5400,300,5400,1200,300,*,DOWN,NDIF +-S 6000,300,6000,1200,300,*,DOWN,NDIF +-S 2700,400,2700,1200,300,*,DOWN,NDIF +-S 6600,300,6600,1200,300,*,DOWN,NDIF +-S 1500,800,1500,1200,500,*,UP,NDIF +-S 3700,800,3700,1200,300,*,DOWN,NDIF +-S 5700,1400,5700,2600,100,*,DOWN,POLY +-S 4700,2500,4700,2600,100,*,DOWN,POLY +-S 5100,1400,5100,2600,100,*,DOWN,POLY +-S 5500,2000,6300,2000,100,*,RIGHT,POLY +-S 6300,1400,6300,2600,100,*,DOWN,POLY +-S 4300,1400,4700,1400,100,*,LEFT,POLY +-S 3900,2500,4700,2500,100,*,LEFT,POLY +-S 3900,2500,3900,3000,100,*,UP,POLY +-S 4300,1400,4300,2000,100,*,DOWN,POLY +-S 3400,2000,4300,2000,100,*,RIGHT,POLY +-S 1500,2000,3000,2000,100,*,RIGHT,POLY +-S 1100,1400,1100,2500,100,*,UP,POLY +-S 1100,2500,1900,2500,100,*,RIGHT,POLY +-S 3400,2000,3400,3600,100,*,DOWN,POLY +-S 3000,900,3000,3600,100,*,DOWN,POLY +-S 1900,2500,1900,3100,100,*,DOWN,POLY +-S 600,1400,600,3100,100,*,DOWN,POLY +-S 2500,1500,2500,3000,100,*,UP,ALU1 +-S 2700,500,2700,1000,200,*,UP,ALU1 +-S 1000,4000,2000,4000,100,*,LEFT,ALU1 +-S 2000,1500,2000,4000,100,*,UP,ALU1 +-S 1500,1000,1500,3500,100,*,UP,ALU1 +-S 6600,500,6600,1000,200,*,DOWN,ALU1 +-S 6600,3000,6600,4500,200,*,DOWN,ALU1 +-S 4400,4000,4900,4000,100,*,RIGHT,ALU1 +-S 3700,1000,3900,1000,200,*,RIGHT,ALU1 +-S 3900,1500,5000,1500,100,*,RIGHT,ALU1 +-S 3900,1000,3900,2500,100,*,DOWN,ALU1 +-S 3900,2500,4400,2500,100,*,RIGHT,ALU1 +-S 4900,2500,4900,4000,100,*,DOWN,ALU1 +-S 1000,3000,1000,4000,100,*,DOWN,ALU1 +-S 2700,3500,2700,4500,200,*,DOWN,ALU1 +-S 5400,3000,5400,4500,200,*,DOWN,ALU1 +-S 4900,2500,5500,2500,100,*,RIGHT,ALU1 +-S 4400,1000,5500,1000,100,*,LEFT,ALU1 +-S 5500,1000,5500,2500,100,*,DOWN,ALU1 +-S 5000,1500,5000,1900,100,*,UP,ALU1 +-S 1000,2000,4500,2000,200,*,RIGHT,TALU2 +-S 0,300,7000,300,600,vss,RIGHT,CALU1 +-S 0,4700,7000,4700,600,vdd,RIGHT,CALU1 +-S 500,1000,500,4000,200,i,UP,CALU1 +-S 6000,1000,6000,4000,200,q,DOWN,CALU1 +-S 2500,2500,6000,2500,200,q,RIGHT,CALU2 +-S 1000,2000,1000,2000,200,wenx,LEFT,CALU3 +-S 2000,2000,2000,2000,200,nwenx,LEFT,CALU3 ++R 2000,2000,ref_ref,nwenx ++R 1000,2000,ref_ref,wenx ++R 6000,2500,ref_ref,q_25 ++R 500,2500,ref_ref,i_25 ++R 6000,3500,ref_ref,q_35 ++R 6000,2000,ref_ref,q_20 ++R 6000,3000,ref_ref,q_30 ++R 6000,4000,ref_ref,q_40 ++R 6000,1000,ref_ref,q_10 ++R 6000,1500,ref_ref,q_15 ++R 500,3000,ref_ref,i_30 ++R 500,3500,ref_ref,i_35 ++R 500,2000,ref_ref,i_20 ++R 500,1500,ref_ref,i_15 ++R 500,1000,ref_ref,i_10 ++R 500,4000,ref_ref,i_40 ++R 3000,2000,ref_ref,nckx ++S 4500,2000,4500,2000,200,ckx,RIGHT,CALU2 ++S 3000,2000,3000,2000,200,nckx,RIGHT,CALU2 ++S 2000,2000,2000,2000,200,nwenx,RIGHT,CALU2 ++S 1000,2000,1000,2000,200,wenx,RIGHT,CALU2 + S 4500,2000,4500,2000,200,ckx,LEFT,CALU3 +-V 3000,2000,CONT_VIA,* +-V 3000,2000,CONT_VIA2,* +-V 5400,4000,CONT_DIF_P,* +-V 5400,4500,CONT_DIF_P,* +-V 6600,4500,CONT_DIF_P,* +-V 6600,3000,CONT_DIF_P,* +-V 5400,3500,CONT_DIF_P,* +-V 900,4700,CONT_BODY_N,* +-V 2100,4700,CONT_BODY_N,* +-V 1500,4700,CONT_BODY_N,* +-V 5400,3000,CONT_DIF_P,* +-V 1500,3500,CONT_DIF_P,* +-V 2700,4500,CONT_DIF_P,* +-V 4400,4000,CONT_DIF_P,* +-V 6600,3500,CONT_DIF_P,* +-V 3700,4000,CONT_DIF_P,* +-V 2700,3500,CONT_DIF_P,* +-V 300,4500,CONT_DIF_P,* +-V 2700,4000,CONT_DIF_P,* +-V 6000,3000,CONT_DIF_P,* +-V 6600,4000,CONT_DIF_P,* +-V 2700,500,CONT_DIF_N,* +-V 4400,1000,CONT_DIF_N,* +-V 6000,1000,CONT_DIF_N,* +-V 5400,500,CONT_DIF_N,* +-V 6600,500,CONT_DIF_N,* +-V 6600,1000,CONT_DIF_N,* ++S 2000,2000,2000,2000,200,nwenx,LEFT,CALU3 ++S 1000,2000,1000,2000,200,wenx,LEFT,CALU3 ++S 2500,2500,6000,2500,200,q,RIGHT,CALU2 ++S 6000,1000,6000,4000,200,q,DOWN,CALU1 ++S 500,1000,500,4000,200,i,UP,CALU1 ++S 0,4700,7000,4700,600,vdd,RIGHT,CALU1 ++S 0,300,7000,300,600,vss,RIGHT,CALU1 ++S 5000,1500,5000,1900,100,*,UP,ALU1 ++S 5500,1000,5500,2500,100,*,DOWN,ALU1 ++S 4400,1000,5500,1000,100,*,LEFT,ALU1 ++S 4900,2500,5500,2500,100,*,RIGHT,ALU1 ++S 5400,3000,5400,4500,200,*,DOWN,ALU1 ++S 2700,3500,2700,4500,200,*,DOWN,ALU1 ++S 1000,3000,1000,4000,100,*,DOWN,ALU1 ++S 4900,2500,4900,4000,100,*,DOWN,ALU1 ++S 3900,2500,4400,2500,100,*,RIGHT,ALU1 ++S 3900,1000,3900,2500,100,*,DOWN,ALU1 ++S 3900,1500,5000,1500,100,*,RIGHT,ALU1 ++S 3700,1000,3900,1000,200,*,RIGHT,ALU1 ++S 4400,4000,4900,4000,100,*,RIGHT,ALU1 ++S 6600,3000,6600,4500,200,*,DOWN,ALU1 ++S 6600,500,6600,1000,200,*,DOWN,ALU1 ++S 1500,1000,1500,3500,100,*,UP,ALU1 ++S 2000,1500,2000,4000,100,*,UP,ALU1 ++S 1000,4000,2000,4000,100,*,LEFT,ALU1 ++S 2700,500,2700,1000,200,*,UP,ALU1 ++S 2500,1500,2500,3000,100,*,UP,ALU1 ++S 600,1400,600,3100,100,*,DOWN,POLY ++S 1900,2500,1900,3100,100,*,DOWN,POLY ++S 3000,900,3000,3600,100,*,DOWN,POLY ++S 3400,2000,3400,3600,100,*,DOWN,POLY ++S 1100,2500,1900,2500,100,*,RIGHT,POLY ++S 1100,1400,1100,2500,100,*,UP,POLY ++S 1500,2000,3000,2000,100,*,RIGHT,POLY ++S 3400,2000,4300,2000,100,*,RIGHT,POLY ++S 4300,1400,4300,2000,100,*,DOWN,POLY ++S 3900,2500,3900,3000,100,*,UP,POLY ++S 3900,2500,4700,2500,100,*,LEFT,POLY ++S 4300,1400,4700,1400,100,*,LEFT,POLY ++S 6300,1400,6300,2600,100,*,DOWN,POLY ++S 5500,2000,6300,2000,100,*,RIGHT,POLY ++S 5100,1400,5100,2600,100,*,DOWN,POLY ++S 4700,2500,4700,2600,100,*,DOWN,POLY ++S 5700,1400,5700,2600,100,*,DOWN,POLY ++S 3700,800,3700,1200,300,*,DOWN,NDIF ++S 1500,800,1500,1200,500,*,UP,NDIF ++S 6600,300,6600,1200,300,*,DOWN,NDIF ++S 2700,400,2700,1200,300,*,DOWN,NDIF ++S 6000,300,6000,1200,300,*,DOWN,NDIF ++S 5400,300,5400,1200,300,*,DOWN,NDIF ++S 300,300,300,1200,300,*,DOWN,NDIF ++S 300,400,300,1200,300,*,DOWN,NDIF ++S 4400,300,4400,1200,300,*,DOWN,NDIF ++S 5100,100,5100,1400,100,*,UP,NTRANS ++S 5700,100,5700,1400,100,*,UP,NTRANS ++S 600,600,600,1400,100,*,DOWN,NTRANS ++S 3000,600,3000,1400,100,*,UP,NTRANS ++S 3400,600,3400,1400,100,*,UP,NTRANS ++S 1100,600,1100,1400,100,*,DOWN,NTRANS ++S 2400,600,2400,1400,100,*,DOWN,NTRANS ++S 1900,600,1900,1400,100,*,DOWN,NTRANS ++S 6300,100,6300,1400,100,*,UP,NTRANS ++S 4700,100,4700,1400,100,*,UP,NTRANS ++S 1500,3300,1500,4200,500,*,UP,PDIF ++S 600,3100,600,4400,100,*,UP,PTRANS ++S 3400,3600,3400,4900,100,*,DOWN,PTRANS ++S 3000,3600,3000,4900,100,*,DOWN,PTRANS ++S 2700,3300,2700,4700,300,*,UP,PDIF ++S 3700,3800,3700,4700,300,*,DOWN,PDIF ++S 4400,2800,4400,4700,300,*,DOWN,PDIF ++S 5300,2800,5300,4700,300,*,DOWN,PDIF ++S 4700,2600,4700,4900,100,*,DOWN,PTRANS ++S 6000,2800,6000,4700,300,*,DOWN,PDIF ++S 5700,2600,5700,4900,100,*,DOWN,PTRANS ++S 1100,3100,1100,4400,100,*,UP,PTRANS ++S 1900,3100,1900,4400,100,*,UP,PTRANS ++S 2400,3100,2400,4400,100,*,UP,PTRANS ++S 0,4000,7000,4000,2600,*,RIGHT,NWELL ++S 6600,2800,6600,4700,300,*,DOWN,PDIF ++S 6300,2600,6300,4900,100,*,DOWN,PTRANS ++S 5100,2600,5100,4900,100,*,DOWN,PTRANS ++S 300,3300,300,4600,300,*,UP,PDIF ++S 3700,3500,4400,3500,100,*,RIGHT,ALU1 ++S 3700,3500,3700,4000,100,*,DOWN,ALU1 ++S 4400,2500,4400,3500,100,*,DOWN,ALU1 ++S 3000,2000,3000,2000,200,nckx,LEFT,CALU3 ++S 3000,1500,3000,3000,100,*,DOWN,ALU1 ++S 3000,3000,3900,3000,200,*,RIGHT,ALU1 ++S 3000,1500,3400,1500,200,*,RIGHT,ALU1 ++V 1000,2000,CONT_VIA2,wenx ++V 4500,2000,CONT_VIA2,* ++V 2000,2000,CONT_VIA2,* ++V 2500,2500,CONT_VIA,* ++V 1000,2000,CONT_VIA,* ++V 2000,2000,CONT_VIA,* ++V 6000,2500,CONT_VIA,* ++V 4500,2000,CONT_VIA,* ++V 4400,2000,CONT_POLY,* ++V 1000,2000,CONT_POLY,* ++V 1000,3000,CONT_POLY,* ++V 2500,3000,CONT_POLY,* ++V 2500,1500,CONT_POLY,* ++V 2000,1500,CONT_POLY,* ++V 5500,2000,CONT_POLY,* ++V 3400,1500,CONT_POLY,* ++V 1500,2000,CONT_POLY,* ++V 5000,2000,CONT_POLY,* ++V 3900,3000,CONT_POLY,* ++V 500,1500,CONT_POLY,* ++V 500,3000,CONT_POLY,* ++V 3700,300,CONT_BODY_P,* ++V 2100,300,CONT_BODY_P,* ++V 900,300,CONT_BODY_P,* ++V 1500,300,CONT_BODY_P,* ++V 1500,1000,CONT_DIF_N,* + V 300,500,CONT_DIF_N,* +-V 2700,1000,CONT_DIF_N,* + V 3700,1000,CONT_DIF_N,* ++V 2700,1000,CONT_DIF_N,* + V 300,500,CONT_DIF_N,* +-V 1500,1000,CONT_DIF_N,* +-V 1500,300,CONT_BODY_P,* +-V 900,300,CONT_BODY_P,* +-V 2100,300,CONT_BODY_P,* +-V 3700,300,CONT_BODY_P,* +-V 500,3000,CONT_POLY,* +-V 500,1500,CONT_POLY,* +-V 3900,3000,CONT_POLY,* +-V 5000,2000,CONT_POLY,* +-V 1500,2000,CONT_POLY,* +-V 3400,1500,CONT_POLY,* +-V 5500,2000,CONT_POLY,* +-V 2000,1500,CONT_POLY,* +-V 2500,1500,CONT_POLY,* +-V 2500,3000,CONT_POLY,* +-V 1000,3000,CONT_POLY,* +-V 1000,2000,CONT_POLY,* +-V 4400,2000,CONT_POLY,* +-V 4500,2000,CONT_VIA,* +-V 6000,2500,CONT_VIA,* +-V 2000,2000,CONT_VIA,* +-V 1000,2000,CONT_VIA,* +-V 2500,2500,CONT_VIA,* +-V 2000,2000,CONT_VIA2,* +-V 1000,2000,CONT_VIA2,* +-V 4500,2000,CONT_VIA2,* ++V 6600,1000,CONT_DIF_N,* ++V 6600,500,CONT_DIF_N,* ++V 5400,500,CONT_DIF_N,* ++V 6000,1000,CONT_DIF_N,* ++V 4400,1000,CONT_DIF_N,* ++V 2700,500,CONT_DIF_N,* ++V 6600,4000,CONT_DIF_P,* ++V 6000,3000,CONT_DIF_P,* ++V 2700,4000,CONT_DIF_P,* ++V 300,4500,CONT_DIF_P,* ++V 2700,3500,CONT_DIF_P,* ++V 3700,4000,CONT_DIF_P,* ++V 6600,3500,CONT_DIF_P,* ++V 4400,4000,CONT_DIF_P,* ++V 2700,4500,CONT_DIF_P,* ++V 1500,3500,CONT_DIF_P,* ++V 5400,3000,CONT_DIF_P,* ++V 1500,4700,CONT_BODY_N,* ++V 2100,4700,CONT_BODY_N,* ++V 900,4700,CONT_BODY_N,* ++V 5400,3500,CONT_DIF_P,* ++V 6600,3000,CONT_DIF_P,* ++V 6600,4500,CONT_DIF_P,* ++V 5400,4500,CONT_DIF_P,* ++V 5400,4000,CONT_DIF_P,* ++V 3000,2000,CONT_VIA2,* ++V 3000,2000,CONT_VIA,* + EOF +diff --git a/alliance/src/cells/src/mpxlib/CATAL b/alliance/src/cells/src/mpxlib/CATAL +new file mode 100644 +index 0000000..6b55fa3 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/CATAL +@@ -0,0 +1,13 @@ ++pck_mpx C ++piot_mpx C ++pi_mpx C ++po_mpx C ++pot_mpx C ++pvddeck_mpx C ++pvdde_mpx C ++pvddick_mpx C ++pvddi_mpx C ++pvsseck_mpx C ++pvsse_mpx C ++pvssick_mpx C ++pvssi_mpx C +diff --git a/alliance/src/cells/src/mpxlib/Makefile.am b/alliance/src/cells/src/mpxlib/Makefile.am +new file mode 100644 +index 0000000..9469aab +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/Makefile.am +@@ -0,0 +1,34 @@ ++ ++mpxlibdir=$(prefix)/cells/mpxlib ++ ++mpxlib_DATA=CATAL \ ++ pck_mpx.ap \ ++ pck_mpx.vbe \ ++ piot_mpx.ap \ ++ piot_mpx.vbe \ ++ pi_mpx.ap \ ++ pi_mpx.vbe \ ++ po_mpx.ap \ ++ po_mpx.vbe \ ++ pot_mpx.ap \ ++ pot_mpx.vbe \ ++ padreal_mpx.ap \ ++ pvddeck_mpx.ap \ ++ pvddeck_mpx.vbe \ ++ pvdde_mpx.ap \ ++ pvdde_mpx.vbe \ ++ pvddick_mpx.ap \ ++ pvddick_mpx.vbe \ ++ pvddi_mpx.ap \ ++ pvddi_mpx.vbe \ ++ pvsseck_mpx.ap \ ++ pvsseck_mpx.vbe \ ++ pvsse_mpx.ap \ ++ pvsse_mpx.vbe \ ++ pvssick_mpx.ap \ ++ pvssick_mpx.vbe \ ++ pvssi_mpx.ap \ ++ pvssi_mpx.vbe ++ ++EXTRA_DIST=$(mpxlib_DATA) ++ +diff --git a/alliance/src/cells/src/mpxlib/padreal_mpx.ap b/alliance/src/cells/src/mpxlib/padreal_mpx.ap +new file mode 100644 +index 0000000..f1edeaf +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/padreal_mpx.ap +@@ -0,0 +1,5 @@ ++V ALLIANCE : 6 ++H padreal_mpx,P,14/9/2014,100 ++A 0,0,40000,40000 ++S 20000,8100,20000,31900,24400,pad,UP,CALU1 ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pck_mpx.ap b/alliance/src/cells/src/mpxlib/pck_mpx.ap +new file mode 100644 +index 0000000..55cb0c6 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pck_mpx.ap +@@ -0,0 +1,1385 @@ ++V ALLIANCE : 6 ++H pck_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 29000,35100,29000,39700,400,pad,UP,ALU1 ++S 29000,25900,29000,34900,400,pad,UP,ALU1 ++S 28600,33000,29000,33000,600,pad,RIGHT,POLY ++S 28600,31800,29000,31800,600,pad,RIGHT,POLY ++S 28600,30600,29000,30600,600,pad,RIGHT,POLY ++S 28600,25800,29000,25800,600,pad,RIGHT,POLY ++S 20000,48100,20000,71900,24400,pad,UP,CALU1 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 24000,34200,24400,34200,600,vdde,RIGHT,POLY ++S 16800,29900,16800,38300,400,vdde,UP,ALU2 ++S 16800,34600,17200,34600,200,vdde,RIGHT,POLY ++S 16800,35800,17200,35800,200,vdde,RIGHT,POLY ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 6800,22200,8400,22200,200,vdde,RIGHT,POLY ++S 3600,22200,5200,22200,200,vdde,RIGHT,POLY ++S 25100,28800,27900,28800,400,vdde,RIGHT,ALU1 ++S 25100,24000,27900,24000,400,vdde,RIGHT,ALU1 ++S 24000,35800,24400,35800,600,vdde,RIGHT,POLY ++S 16800,33400,17200,33400,200,vdde,RIGHT,POLY ++S 16800,32200,17200,32200,200,vdde,RIGHT,POLY ++S 10500,21800,14300,21800,400,vdde,RIGHT,ALU2 ++S 25100,21600,27900,21600,400,vdde,RIGHT,ALU1 ++S 25100,26400,27900,26400,400,vdde,RIGHT,ALU1 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 32000,9600,32000,11000,200,vddi,UP,POLY ++S 3100,16000,36900,16000,2400,vddi,RIGHT,ALU1 ++S 17800,22900,17800,31900,400,vsse,UP,ALU2 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 7600,22900,7600,37500,400,vsse,UP,ALU1 ++S 4400,22900,4400,37500,400,vsse,UP,ALU1 ++S 30400,36400,30400,36600,200,vsse,UP,POLY ++S 20800,22900,20800,37100,400,vsse,UP,ALU1 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 3100,6000,36900,6000,2400,vssi,RIGHT,ALU1 ++S 14800,22500,14800,36700,200,n15d,UP,NTRANS ++S 26600,11100,26600,13100,200,p17c,UP,PTRANS ++S 31700,6000,37100,6000,400,93onymous_,RIGHT,ALU2 ++S 31600,20200,31600,20600,600,92onymous_,UP,POLY ++S 31400,19100,31400,28300,400,91onymous_,UP,ALU2 ++S 2700,20200,15700,20200,400,53onymous_,RIGHT,ALU1 ++S 17900,31600,18700,31600,400,249nymous_,RIGHT,ALU1 ++S 16400,7500,16400,9100,620,210nymous_,UP,NDIF ++S 23100,19200,38100,19200,400,13onymous_,RIGHT,ALU1 ++S 36800,6900,36800,17300,400,126nymous_,UP,ALU2 ++S 23100,37600,27700,37600,400,10onymous_,RIGHT,ALU1 ++S 36800,11100,36800,15900,400,127nymous_,UP,ALU1 ++S 17500,22600,19100,22600,200,n6d,RIGHT,NTRANS ++S 13400,10900,13400,14900,200,p18b,UP,PTRANS ++S 6800,22500,6800,36700,200,n14c,UP,NTRANS ++S 26000,12100,26000,15900,400,52onymous_,UP,ALU1 ++S 17900,30400,18700,30400,400,248nymous_,RIGHT,ALU1 ++S 26000,11300,26000,12900,620,51onymous_,UP,PDIF ++S 16400,11100,16400,14700,620,211nymous_,UP,PDIF ++S 900,19000,9300,19000,2400,169nymous_,RIGHT,ALU2 ++S 23000,19300,23000,37500,400,11onymous_,UP,ALU1 ++S 23000,19080,23000,37920,600,12onymous_,UP,NTIE ++S 27000,24900,27000,36700,400,56onymous_,UP,ALU2 ++S 27200,7500,27200,9100,620,57onymous_,UP,NDIF ++S 27200,8100,27200,8900,400,58onymous_,UP,ALU1 ++S 32000,8100,32000,8500,400,94onymous_,UP,ALU1 ++S 23600,6100,23600,7900,400,16onymous_,UP,ALU1 ++S 31400,20900,31400,34300,200,p14a,UP,PTRANS ++S 16400,12100,16400,15900,400,212nymous_,UP,ALU1 ++S 12200,9600,12200,10600,200,170nymous_,UP,POLY ++S 23080,37600,29920,37600,600,15onymous_,RIGHT,NTIE ++S 22880,19200,38320,19200,600,14onymous_,RIGHT,NTIE ++S 37000,21300,37000,36300,400,130nymous_,UP,ALU1 ++S 36800,10880,36800,16120,600,128nymous_,UP,NTIE ++S 37000,21100,37000,36500,620,129nymous_,UP,PDIF ++S 16500,20200,24300,20200,400,213nymous_,RIGHT,ALU2 ++S 31400,35300,31400,36100,200,p11,UP,PTRANS ++S 23600,7500,23600,9100,620,17onymous_,UP,NDIF ++S 16800,20300,16800,23300,400,214nymous_,UP,ALU1 ++S 12400,20700,12400,36300,400,171nymous_,UP,ALU1 ++S 17900,34000,18700,34000,400,250nymous_,RIGHT,ALU1 ++S 16500,21200,25300,21200,400,215nymous_,RIGHT,ALU2 ++S 12400,22700,12400,36500,620,172nymous_,UP,NDIF ++S 26400,18600,26400,38600,8400,54onymous_,UP,NWELL ++S 12400,18500,12400,22100,2400,173nymous_,UP,ALU2 ++S 26600,9600,26600,10800,200,55onymous_,UP,POLY ++S 14600,10900,14600,14900,200,p18c,UP,PTRANS ++S 14600,7300,14600,9300,200,n18c,UP,NTRANS ++S 12500,4000,17900,4000,400,175nymous_,RIGHT,ALU2 ++S 12800,3700,12800,11300,400,174nymous_,UP,ALU2 ++S 1800,17700,1800,38300,1600,252nymous_,UP,ALU2 ++S 16800,23200,16800,25400,600,217nymous_,UP,POLY ++S 16800,20900,16800,24700,400,216nymous_,UP,ALU2 ++S 23600,12100,23600,15900,400,19onymous_,UP,ALU1 ++S 17900,36400,18700,36400,400,251nymous_,RIGHT,ALU1 ++S 23600,11300,23600,12900,620,18onymous_,UP,PDIF ++S 32000,8500,32000,9100,620,pad2,UP,NDIF ++S 2900,20600,15500,20600,400,pad2,RIGHT,ALU1 ++S 2700,20600,15700,20600,400,pad2,RIGHT,ALU1 ++S 38200,19080,38200,37920,600,133nymous_,UP,NTIE ++S 37000,17700,37000,38300,2400,131nymous_,UP,ALU2 ++S 2800,20500,2800,36300,400,62onymous_,UP,ALU1 ++S 27800,9600,27800,10800,200,61onymous_,UP,POLY ++S 27200,11300,27200,12900,620,60onymous_,UP,PDIF ++S 27200,11100,27200,12500,400,59onymous_,UP,ALU1 ++S 3200,5880,3200,8720,600,97onymous_,UP,PTIE ++S 3200,5700,3200,8300,400,96onymous_,UP,ALU2 ++S 12900,9000,17500,9000,400,177nymous_,RIGHT,ALU1 ++S 32000,11100,32000,15900,400,95onymous_,UP,ALU1 ++S 12800,7500,12800,9100,420,176nymous_,UP,NDIF ++S 18200,9600,18200,10600,200,253nymous_,UP,POLY ++S 38200,19300,38200,37500,400,132nymous_,UP,ALU1 ++S 3600,22500,3600,36700,200,n14a,UP,NTRANS ++S 28400,6100,28400,8900,400,65onymous_,UP,ALU1 ++S 32600,8300,32600,9300,200,n16c,UP,NTRANS ++S 24000,33900,24000,36100,400,21onymous_,UP,ALU2 ++S 16800,24100,16800,29500,400,218nymous_,UP,ALU2 ++S 4400,22700,4400,38300,2400,137nymous_,UP,ALU2 ++S 24000,27100,24000,29100,400,20onymous_,UP,ALU1 ++S 4400,22900,4400,37500,400,136nymous_,UP,ALU1 ++S 4400,22700,4400,36500,620,135nymous_,UP,NDIF ++S 4400,21800,4400,22200,600,134nymous_,UP,POLY ++S 16900,24400,17700,24400,400,219nymous_,RIGHT,ALU1 ++S 16800,25500,16800,28100,400,220nymous_,UP,ALU1 ++S 18500,6000,32300,6000,400,254nymous_,RIGHT,ALU2 ++S 12800,11100,12800,14700,620,178nymous_,UP,PDIF ++S 18800,6100,18800,8900,400,255nymous_,UP,ALU1 ++S 12900,11000,17500,11000,400,179nymous_,RIGHT,ALU1 ++S 3200,6100,3200,9100,400,98onymous_,UP,ALU1 ++S 18800,5700,18800,11300,400,256nymous_,UP,ALU2 ++S 18800,7500,18800,9100,620,257nymous_,UP,NDIF ++S 2900,6000,11900,6000,400,99onymous_,RIGHT,ALU2 ++S 27800,7300,27800,9300,200,n17d,UP,NTRANS ++S 3200,7700,3200,15700,400,100nymous_,UP,ALU2 ++S 13400,9600,13400,10600,200,180nymous_,UP,POLY ++S 3200,11100,3200,15900,400,101nymous_,UP,ALU1 ++S 27800,11100,27800,13100,200,p17d,UP,PTRANS ++S 2800,22700,2800,36500,620,63onymous_,UP,NDIF ++S 2200,13600,37800,13600,6800,64onymous_,RIGHT,NWELL ++S 36200,20900,36200,36700,200,p14d,UP,PTRANS ++S 25100,37000,27900,37000,1600,fbul,RIGHT,ALU1 ++S 25100,25200,27900,25200,400,fbul,RIGHT,ALU1 ++S 13200,22200,14800,22200,200,cn,RIGHT,POLY ++S 10000,22200,11600,22200,200,cn,RIGHT,POLY ++S 4100,21800,7900,21800,400,cn,RIGHT,ALU2 ++S 25100,22800,27900,22800,400,cn,RIGHT,ALU1 ++S 25100,20400,27900,20400,400,cn,RIGHT,ALU1 ++S 25000,20100,25000,23100,400,cn,UP,ALU2 ++S 24900,21600,28100,21600,420,25onymous_,RIGHT,PDIF ++S 24900,20400,28100,20400,620,24onymous_,RIGHT,PDIF ++S 28400,11300,28400,12900,620,67onymous_,UP,PDIF ++S 28400,7500,28400,9100,620,66onymous_,UP,NDIF ++S 18200,7300,18200,9300,200,n18f,UP,NTRANS ++S 6000,20700,6000,36300,400,138nymous_,UP,ALU1 ++S 18200,10900,18200,14900,200,p18f,UP,PTRANS ++S 24000,18900,24000,20500,400,22onymous_,UP,ALU2 ++S 6000,22700,6000,36500,620,139nymous_,UP,NDIF ++S 16800,28200,16800,29800,600,221nymous_,UP,POLY ++S 7600,21800,7600,22200,600,140nymous_,UP,POLY ++S 16900,29200,18700,29200,400,222nymous_,RIGHT,ALU1 ++S 24200,9600,24200,10800,200,23onymous_,UP,POLY ++S 7300,21800,10100,21800,400,141nymous_,RIGHT,ALU2 ++S 18500,10000,35900,10000,2400,258nymous_,RIGHT,ALU2 ++S 3200,10880,3200,16120,600,102nymous_,UP,NTIE ++S 14000,21800,14000,22200,600,181nymous_,UP,POLY ++S 2900,17000,19100,17000,400,103nymous_,RIGHT,ALU2 ++S 14000,22700,14000,36500,620,182nymous_,UP,NDIF ++S 14000,22900,14000,39700,400,183nymous_,UP,ALU1 ++S 11600,22500,11600,36700,200,n15b,UP,NTRANS ++S 32200,21300,32200,39700,400,105nymous_,UP,ALU1 ++S 32200,21100,32200,36500,620,104nymous_,UP,PDIF ++S 19800,32900,19800,35100,400,262nymous_,UP,ALU1 ++S 9200,20700,9200,36300,400,145nymous_,UP,ALU1 ++S 18500,17000,33500,17000,400,261nymous_,RIGHT,ALU2 ++S 18800,11900,18800,15900,400,260nymous_,UP,ALU1 ++S 7600,22700,7600,38300,2400,144nymous_,UP,ALU2 ++S 18800,11100,18800,14700,620,259nymous_,UP,PDIF ++S 17000,9600,17000,10600,200,223nymous_,UP,POLY ++S 7600,22900,7600,37500,400,143nymous_,UP,ALU1 ++S 7600,22700,7600,36500,620,142nymous_,UP,NDIF ++S 14000,6100,14000,7900,400,184nymous_,UP,ALU1 ++S 14000,7500,14000,9100,620,185nymous_,UP,NDIF ++S 14100,10000,24700,10000,400,186nymous_,RIGHT,ALU1 ++S 14000,11100,14000,14700,620,187nymous_,UP,PDIF ++S 33800,8300,33800,9300,200,n16d,UP,NTRANS ++S 17700,22000,18900,22000,620,224nymous_,RIGHT,NDIF ++S 17700,23200,18900,23200,620,225nymous_,RIGHT,NDIF ++S 24900,22800,28100,22800,420,26onymous_,RIGHT,PDIF ++S 17700,24400,18900,24400,620,226nymous_,RIGHT,NDIF ++S 24900,24000,28100,24000,420,27onymous_,RIGHT,PDIF ++S 24900,25200,28100,25200,420,28onymous_,RIGHT,PDIF ++S 18500,31600,25300,31600,400,cpd,RIGHT,ALU2 ++S 18800,21900,18800,36700,400,cpd,UP,ALU2 ++S 25100,32400,27900,32400,400,cpd,RIGHT,ALU1 ++S 25100,30000,27900,30000,400,cpd,RIGHT,ALU1 ++S 25100,27600,27900,27600,400,cpd,RIGHT,ALU1 ++S 25000,27300,25000,32700,400,cpd,UP,ALU2 ++S 19500,36800,26300,36800,400,node_cp,RIGHT,ALU2 ++S 17900,35200,19700,35200,400,node_cp,RIGHT,ALU1 ++S 17900,32800,19700,32800,400,node_cp,RIGHT,ALU1 ++S 34600,20600,36200,20600,200,node_cp,RIGHT,POLY ++S 31400,20600,33000,20600,200,node_cp,RIGHT,POLY ++S 28600,24600,29000,24600,600,node_cp,RIGHT,POLY ++S 27700,24600,29300,24600,400,node_cp,RIGHT,ALU2 ++S 28000,24300,28000,31500,400,node_cp,UP,ALU2 ++S 25100,33600,27900,33600,400,node_cp,RIGHT,ALU1 ++S 25100,31200,27900,31200,400,node_cp,RIGHT,ALU1 ++S 9300,25000,16100,25000,2400,147nymous_,RIGHT,ALU2 ++S 9200,22700,9200,36500,620,146nymous_,UP,NDIF ++S 8400,22500,8400,36700,200,n14d,UP,NTRANS ++S 24200,7300,24200,9300,200,n17a,UP,NTRANS ++S 19500,28200,24300,28200,400,cpb,RIGHT,ALU2 ++S 19800,22700,19800,30900,400,cpb,UP,ALU1 ++S 19400,31000,19800,31000,200,cpb,RIGHT,POLY ++S 19400,27400,19800,27400,200,cpb,RIGHT,POLY ++S 19400,26200,19800,26200,200,cpb,RIGHT,POLY ++S 19400,22600,19800,22600,200,cpb,RIGHT,POLY ++S 24000,29200,24400,29200,600,cpb,RIGHT,POLY ++S 24000,28200,24400,28200,600,cpb,RIGHT,POLY ++S 24000,27000,24400,27000,600,cpb,RIGHT,POLY ++S 9300,31000,16100,31000,2400,148nymous_,RIGHT,ALU2 ++S 19800,34900,19800,37100,400,263nymous_,UP,ALU2 ++S 32800,20200,32800,20600,600,106nymous_,UP,POLY ++S 9800,21500,9800,23100,400,149nymous_,UP,ALU2 ++S 0,6000,40000,6000,12000,264nymous_,RIGHT,TALU6 ++S 33200,8500,33200,9100,420,107nymous_,UP,NDIF ++S 28400,12100,28400,15900,400,68onymous_,UP,ALU1 ++S 14000,12100,14000,15900,400,188nymous_,UP,ALU1 ++S 24900,28800,28100,28800,420,31onymous_,RIGHT,PDIF ++S 1280,37600,21120,37600,600,189nymous_,RIGHT,PTIE ++S 14600,9600,14600,10600,200,190nymous_,UP,POLY ++S 17700,25600,18900,25600,620,227nymous_,RIGHT,NDIF ++S 24900,26400,28100,26400,420,29onymous_,RIGHT,PDIF ++S 24900,27600,28100,27600,420,30onymous_,RIGHT,PDIF ++S 15800,7300,15800,9300,200,n18d,UP,NTRANS ++S 15800,10900,15800,14900,200,p18d,UP,PTRANS ++S 26000,21300,26000,24300,400,45onymous_,UP,ALU2 ++S 24200,11100,24200,13100,200,p17a,UP,PTRANS ++S 24200,10000,28400,10000,600,nnt,RIGHT,POLY ++S 9500,22800,17100,22800,400,150nymous_,RIGHT,ALU2 ++S 9500,37000,17100,37000,2400,151nymous_,RIGHT,ALU2 ++S 33200,9100,33200,9900,400,108nymous_,UP,ALU1 ++S 50,6000,39950,6000,12000,266nymous_,RIGHT,TALU2 ++S 28700,24600,30300,24600,400,69onymous_,RIGHT,ALU2 ++S 24900,30000,28100,30000,420,32onymous_,RIGHT,PDIF ++S 33800,21100,33800,36500,620,109nymous_,UP,PDIF ++S 24900,31200,28100,31200,420,33onymous_,RIGHT,PDIF ++S 33800,21300,33800,36300,400,110nymous_,UP,ALU1 ++S 24900,32400,28100,32400,420,34onymous_,RIGHT,PDIF ++S 15300,37600,20700,37600,400,191nymous_,RIGHT,ALU1 ++S 29400,11100,29400,11700,400,70onymous_,UP,ALU1 ++S 15200,3700,15200,11300,400,192nymous_,UP,ALU2 ++S 15200,7500,15200,9100,420,193nymous_,UP,NDIF ++S 17700,26800,18900,26800,620,228nymous_,RIGHT,NDIF ++S 15200,8100,15200,8900,400,194nymous_,UP,ALU1 ++S 17700,28000,18900,28000,620,229nymous_,RIGHT,NDIF ++S 17700,29200,18900,29200,620,230nymous_,RIGHT,NDIF ++S 30200,8300,30200,9300,200,n16a,UP,NTRANS ++S 25400,9600,25400,10800,200,44onymous_,UP,POLY ++S 26000,30900,26000,37100,400,47onymous_,UP,ALU2 ++S 26000,23700,26000,29100,400,46onymous_,UP,ALU2 ++S 26000,6100,26000,7900,400,48onymous_,UP,ALU1 ++S 33000,20900,33000,36700,200,p14b,UP,PTRANS ++S 10000,22200,11600,22200,200,152nymous_,RIGHT,POLY ++S 24900,33600,28100,33600,420,35onymous_,RIGHT,PDIF ++S 33800,19100,33800,38300,2400,111nymous_,UP,ALU2 ++S 24900,35000,28100,35000,820,36onymous_,RIGHT,PDIF ++S 34000,18200,34000,38200,10400,112nymous_,UP,NWELL ++S 24900,36400,28100,36400,620,37onymous_,RIGHT,PDIF ++S 3280,6000,28520,6000,600,113nymous_,RIGHT,PTIE ++S 34400,8100,34400,8500,400,114nymous_,UP,ALU1 ++S 29400,11800,29400,12000,200,71onymous_,UP,POLY ++S 29300,37000,31900,37000,2400,72onymous_,RIGHT,ALU2 ++S 29480,37600,38520,37600,600,73onymous_,RIGHT,NTIE ++S 15200,11100,15200,13700,400,195nymous_,UP,ALU1 ++S 15200,11100,15200,14700,620,196nymous_,UP,PDIF ++S 15600,20700,15600,36300,400,197nymous_,UP,ALU1 ++S 17700,30400,18900,30400,620,231nymous_,RIGHT,NDIF ++S 17700,31600,18900,31600,620,232nymous_,RIGHT,NDIF ++S 17700,32800,18900,32800,620,233nymous_,RIGHT,NDIF ++S 17700,34000,18900,34000,620,234nymous_,RIGHT,NDIF ++S 16800,29800,17200,29800,200,cnb,RIGHT,POLY ++S 16800,28600,17200,28600,200,cnb,RIGHT,POLY ++S 16800,25000,17200,25000,200,cnb,RIGHT,POLY ++S 16800,23800,17200,23800,200,cnb,RIGHT,POLY ++S 29000,18900,29000,23700,400,cnb,UP,ALU2 ++S 28600,23400,29000,23400,600,cnb,RIGHT,POLY ++S 28600,22200,29000,22200,600,cnb,RIGHT,POLY ++S 28600,21000,29000,21000,600,cnb,RIGHT,POLY ++S 23700,19200,29300,19200,400,cnb,RIGHT,ALU2 ++S 26000,7500,26000,9100,620,49onymous_,UP,NDIF ++S 31400,8300,31400,9300,200,n16b,UP,NTRANS ++S 9700,19000,14900,19000,2400,153nymous_,RIGHT,ALU2 ++S 29000,12300,29000,13100,200,p16,UP,PTRANS ++S 700,25000,8900,25000,2400,154nymous_,RIGHT,ALU2 ++S 700,28000,15100,28000,2400,155nymous_,RIGHT,ALU2 ++S 24800,7500,24800,9100,620,38onymous_,UP,NDIF ++S 24800,8100,24800,12500,400,39onymous_,UP,ALU1 ++S 700,31000,8900,31000,2400,156nymous_,RIGHT,ALU2 ++S 34400,8500,34400,9100,620,115nymous_,UP,NDIF ++S 24900,9000,27100,9000,400,40onymous_,RIGHT,ALU1 ++S 24900,11000,29300,11000,400,41onymous_,RIGHT,ALU1 ++S 29600,8100,29600,8500,400,74onymous_,UP,ALU1 ++S 29700,8000,34300,8000,400,75onymous_,RIGHT,ALU1 ++S 29600,8500,29600,9100,620,76onymous_,UP,NDIF ++S 15600,22700,15600,36500,620,198nymous_,UP,NDIF ++S 29600,12500,29600,12900,620,77onymous_,UP,PDIF ++S 15300,18200,34700,18200,400,199nymous_,RIGHT,ALU2 ++S 15600,17900,15600,20500,400,200nymous_,UP,ALU2 ++S 17700,35200,18900,35200,620,235nymous_,RIGHT,NDIF ++S 17700,36400,18900,36400,620,236nymous_,RIGHT,NDIF ++S 17600,3700,17600,11300,400,237nymous_,UP,ALU2 ++S 17600,7500,17600,9100,420,238nymous_,UP,NDIF ++S 17600,8100,17600,8900,400,239nymous_,UP,ALU1 ++S 25400,7300,25400,9300,200,n17b,UP,NTRANS ++S 30200,9600,33800,9600,200,81onymous_,RIGHT,POLY ++S 15800,9600,15800,10600,200,202nymous_,UP,POLY ++S 25100,35000,29100,35000,400,43onymous_,RIGHT,ALU1 ++S 30100,20200,35900,20200,400,80onymous_,RIGHT,ALU1 ++S 15800,23700,15800,32300,400,201nymous_,UP,ALU2 ++S 30000,19900,30000,24900,400,79onymous_,UP,ALU2 ++S 29700,12800,30300,12800,400,78onymous_,RIGHT,ALU1 ++S 700,15400,33500,15400,1200,159nymous_,RIGHT,ALU2 ++S 35400,21100,35400,36500,620,117nymous_,UP,PDIF ++S 700,10000,11900,10000,2400,158nymous_,RIGHT,ALU2 ++S 24800,11300,24800,12900,620,42onymous_,UP,PDIF ++S 34800,20200,34800,20600,600,116nymous_,UP,POLY ++S 700,34000,16100,34000,2400,157nymous_,RIGHT,ALU2 ++S 12200,10000,18200,10000,600,nt,RIGHT,POLY ++S 29000,12000,29400,12000,200,nt,RIGHT,POLY ++S 26100,10000,33100,10000,400,50onymous_,RIGHT,ALU1 ++S 12200,7300,12200,9300,200,n18a,UP,NTRANS ++S 13200,22500,13200,36700,200,n15c,UP,NTRANS ++S 17600,11100,17600,14700,620,241nymous_,UP,PDIF ++S 25400,11100,25400,13100,200,p17b,UP,PTRANS ++S 17600,11100,17600,13700,400,240nymous_,UP,ALU1 ++S 17500,25000,19100,25000,200,n7c,RIGHT,NTRANS ++S 17500,23800,19100,23800,200,n7d,RIGHT,NTRANS ++S 24700,22200,28300,22200,200,p7b,RIGHT,PTRANS ++S 24700,21000,28300,21000,200,p7c,RIGHT,PTRANS ++S 30400,36400,30400,36600,200,82onymous_,UP,POLY ++S 1700,37600,9500,37600,400,203nymous_,RIGHT,ALU1 ++S 10800,22700,10800,36500,620,162nymous_,UP,NDIF ++S 10800,21800,10800,22200,600,161nymous_,UP,POLY ++S 10700,39600,35500,39600,2400,160nymous_,RIGHT,ALU1 ++S 4100,13000,33500,13000,2400,2nonymous_,RIGHT,ALU2 ++S 32900,12400,37100,12400,1200,1nonymous_,RIGHT,ALU2 ++S 35400,21300,35400,39700,400,118nymous_,UP,ALU1 ++S 20000,200,20000,2000,40000,0nonymous_,UP,TALU3 ++S 10000,22500,10000,36700,200,n15a,UP,NTRANS ++S 17500,29800,19100,29800,200,n7a,RIGHT,NTRANS ++S 17500,28600,19100,28600,200,n7b,RIGHT,NTRANS ++S 17500,27400,19100,27400,200,n6b,RIGHT,NTRANS ++S 24700,27000,28300,27000,200,p6c,RIGHT,PTRANS ++S 5200,22500,5200,36700,200,n14b,UP,NTRANS ++S 12200,10900,12200,14900,200,p18a,UP,PTRANS ++S 12800,8100,12800,13700,400,1.nq,UP,ALU1 ++S 17000,7300,17000,9300,200,n18e,UP,NTRANS ++S 17000,10900,17000,14900,200,p18e,UP,PTRANS ++S 24700,23400,28300,23400,200,p7a,RIGHT,PTRANS ++S 24700,24600,28300,24600,200,p10,RIGHT,PTRANS ++S 24700,25800,28300,25800,200,p13,RIGHT,PTRANS ++S 17500,26200,19100,26200,200,n6c,RIGHT,NTRANS ++S 30400,10100,30400,12700,400,83onymous_,UP,ALU1 ++S 30600,21100,30600,35900,620,84onymous_,UP,PDIF ++S 17900,22000,18700,22000,400,242nymous_,RIGHT,ALU1 ++S 10800,22900,10800,39700,400,163nymous_,UP,ALU1 ++S 20000,40100,20000,59900,4400,5nonymous_,UP,ALU1 ++S 34400,13700,34400,18500,400,4nonymous_,UP,ALU2 ++S 3600,22200,5200,22200,200,121nymous_,RIGHT,POLY ++S 34400,8700,34400,13900,400,3nonymous_,UP,ALU1 ++S 36000,20200,36000,20600,600,120nymous_,UP,POLY ++S 35300,17000,37100,17000,400,119nymous_,RIGHT,ALU2 ++S 17900,24400,18700,24400,400,244nymous_,RIGHT,ALU1 ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 17500,34600,19100,34600,200,n8b,RIGHT,NTRANS ++S 17500,33400,19100,33400,200,n8c,RIGHT,NTRANS ++S 17500,32200,19100,32200,200,n8d,RIGHT,NTRANS ++S 17500,31000,19100,31000,200,n6a,RIGHT,NTRANS ++S 24700,30600,28300,30600,200,p8c,RIGHT,PTRANS ++S 24700,29400,28300,29400,200,p6a,RIGHT,PTRANS ++S 24700,28200,28300,28200,200,p6b,RIGHT,PTRANS ++S 30680,6000,37120,6000,600,88onymous_,RIGHT,PTIE ++S 17900,25600,18700,25600,400,245nymous_,RIGHT,ALU1 ++S 30600,36400,31400,36400,200,87onymous_,RIGHT,POLY ++S 1700,19200,20700,19200,400,204nymous_,RIGHT,ALU1 ++S 11600,6100,11600,8900,400,164nymous_,UP,ALU1 ++S 1480,19200,20920,19200,600,205nymous_,RIGHT,PTIE ++S 1600,19300,1600,37500,400,206nymous_,UP,ALU1 ++S 11600,7500,11600,9100,620,165nymous_,UP,NDIF ++S 30600,21300,30600,35500,400,85onymous_,UP,ALU1 ++S 17900,23200,18700,23200,400,243nymous_,RIGHT,ALU1 ++S 1600,19080,1600,37720,600,207nymous_,UP,PTIE ++S 30600,26700,30600,35300,2400,86onymous_,UP,ALU2 ++S 20800,19300,20800,37500,400,7nonymous_,UP,ALU1 ++S 36700,37600,38100,37600,400,123nymous_,RIGHT,ALU1 ++S 19700,7600,37100,7600,1200,6nonymous_,RIGHT,ALU2 ++S 3480,16000,36920,16000,600,122nymous_,RIGHT,NTIE ++S 34600,20900,34600,36700,200,p14c,UP,PTRANS ++S 17500,35800,19100,35800,200,n8a,RIGHT,NTRANS ++S 24700,35800,28300,35800,200,p12,RIGHT,PTRANS ++S 24700,34200,28300,34200,200,p9,RIGHT,PTRANS ++S 24700,33000,28300,33000,200,p8a,RIGHT,PTRANS ++S 24700,31800,28300,31800,200,p8b,RIGHT,PTRANS ++S 26600,7300,26600,9300,200,n17c,UP,NTRANS ++S 900,37000,8900,37000,2400,168nymous_,RIGHT,ALU2 ++S 16400,6100,16400,7900,400,209nymous_,UP,ALU1 ++S 11600,11900,11600,15900,400,167nymous_,UP,ALU1 ++S 16400,29900,16400,32300,400,208nymous_,UP,ALU2 ++S 17900,26800,18700,26800,400,246nymous_,RIGHT,ALU1 ++S 30800,8500,30800,9100,420,89onymous_,UP,NDIF ++S 17900,28000,18700,28000,400,247nymous_,RIGHT,ALU1 ++S 30800,9100,30800,9900,400,90onymous_,UP,ALU1 ++S 13400,7300,13400,9300,200,n18b,UP,NTRANS ++S 36800,5880,36800,8720,600,124nymous_,UP,PTIE ++S 20800,19080,20800,37720,600,8nonymous_,UP,PTIE ++S 36800,6100,36800,9100,400,125nymous_,UP,ALU1 ++S 22000,23700,22000,28500,400,9nonymous_,UP,ALU2 ++S 11600,11100,11600,14700,620,166nymous_,UP,PDIF ++B 23000,28400,300,300,CONT_BODY_N,320nymous_ ++B 23000,27400,300,300,CONT_BODY_N,319nymous_ ++B 23000,29400,300,300,CONT_BODY_N,321nymous_ ++B 23000,26400,300,300,CONT_BODY_N,318nymous_ ++B 20800,23400,300,300,CONT_BODY_P,285nymous_ ++B 20800,24400,300,300,CONT_BODY_P,286nymous_ ++B 20800,25400,300,300,CONT_BODY_P,287nymous_ ++B 20800,26400,300,300,CONT_BODY_P,288nymous_ ++B 20800,27400,300,300,CONT_BODY_P,289nymous_ ++B 20800,28400,300,300,CONT_BODY_P,290nymous_ ++B 23000,30400,300,300,CONT_BODY_N,322nymous_ ++B 23000,31400,300,300,CONT_BODY_N,323nymous_ ++B 23000,32400,300,300,CONT_BODY_N,324nymous_ ++B 23000,33400,300,300,CONT_BODY_N,325nymous_ ++B 23000,37600,300,300,CONT_BODY_N,329nymous_ ++B 23000,36400,300,300,CONT_BODY_N,328nymous_ ++B 23000,35400,300,300,CONT_BODY_N,327nymous_ ++B 23000,34400,300,300,CONT_BODY_N,326nymous_ ++B 20800,32400,300,300,CONT_BODY_P,294nymous_ ++B 20800,31400,300,300,CONT_BODY_P,293nymous_ ++B 20800,30400,300,300,CONT_BODY_P,292nymous_ ++B 20800,29400,300,300,CONT_BODY_P,291nymous_ ++B 23600,6000,300,300,CONT_BODY_P,333nymous_ ++B 23400,17000,300,300,CONT_VIA2,332nymous_ ++B 23400,17000,300,300,CONT_VIA,331nymous_ ++B 23000,19200,300,300,CONT_BODY_N,330nymous_ ++B 20800,33400,300,300,CONT_BODY_P,295nymous_ ++B 20800,36400,300,300,CONT_BODY_P,298nymous_ ++B 20800,35400,300,300,CONT_BODY_P,297nymous_ ++B 23600,6000,300,300,CONT_VIA2,335nymous_ ++B 23600,7200,300,300,CONT_DIF_N,336nymous_ ++B 23600,8000,300,300,CONT_DIF_N,337nymous_ ++B 20800,34400,300,300,CONT_BODY_P,296nymous_ ++B 23600,6000,300,300,CONT_VIA,334nymous_ ++B 20800,37600,300,300,CONT_BODY_P,299nymous_ ++B 23600,16000,300,300,CONT_BODY_N,340nymous_ ++B 23600,12800,300,300,CONT_DIF_P,339nymous_ ++B 23600,12000,300,300,CONT_DIF_P,338nymous_ ++B 20800,19200,300,300,CONT_BODY_P,300nymous_ ++B 21200,6000,300,300,CONT_BODY_P,301nymous_ ++B 21200,6000,300,300,CONT_VIA2,302nymous_ ++B 21200,16000,300,300,CONT_BODY_N,303nymous_ ++B 24000,29200,300,300,CONT_POLY,344nymous_ ++B 24000,28200,300,300,CONT_VIA,343nymous_ ++B 24000,28200,300,300,CONT_POLY,342nymous_ ++B 24000,27000,300,300,CONT_POLY,341nymous_ ++B 21200,17000,300,300,CONT_VIA2,304nymous_ ++B 22000,24000,300,300,CONT_VIA2,305nymous_ ++B 22000,26000,300,300,CONT_VIA2,306nymous_ ++B 22400,6000,300,300,CONT_BODY_P,307nymous_ ++B 24000,34200,300,300,CONT_VIA,346nymous_ ++B 24000,34200,300,300,CONT_POLY,345nymous_ ++B 22400,6000,300,300,CONT_VIA2,308nymous_ ++B 22400,16000,300,300,CONT_BODY_N,309nymous_ ++B 22400,17000,300,300,CONT_VIA,310nymous_ ++B 22400,17000,300,300,CONT_VIA2,311nymous_ ++B 24000,35800,300,300,CONT_VIA,349nymous_ ++B 24000,35800,300,300,CONT_POLY,348nymous_ ++B 24000,34200,300,300,CONT_VIA2,347nymous_ ++B 23000,20400,300,300,CONT_BODY_N,312nymous_ ++B 23000,21400,300,300,CONT_BODY_N,313nymous_ ++B 29400,11000,200,200,CONT_TURN1,269nymous_ ++B 34400,14000,300,300,CONT_VIA,268nymous_ ++B 29600,8000,200,200,CONT_TURN1,270nymous_ ++B 24000,19200,300,300,CONT_BODY_N,351nymous_ ++B 24000,37600,300,300,CONT_BODY_N,350nymous_ ++B 23000,22400,300,300,CONT_BODY_N,314nymous_ ++B 23000,23400,300,300,CONT_BODY_N,315nymous_ ++B 30400,12800,200,200,CONT_TURN1,271nymous_ ++B 33200,10000,200,200,CONT_TURN1,272nymous_ ++B 34400,8000,200,200,CONT_TURN1,273nymous_ ++B 5000,19000,8300,2300,CONT_VIA2,274nymous_ ++B 24800,6000,300,300,CONT_VIA,353nymous_ ++B 24800,6000,300,300,CONT_BODY_P,352nymous_ ++B 19800,32800,200,200,CONT_TURN1,277nymous_ ++B 17800,22000,200,200,CONT_TURN1,276nymous_ ++B 17600,11000,200,200,CONT_TURN1,275nymous_ ++B 20000,6000,300,300,CONT_VIA2,279nymous_ ++B 20000,6000,300,300,CONT_BODY_P,278nymous_ ++B 20000,17000,300,300,CONT_VIA2,281nymous_ ++B 20000,16000,300,300,CONT_BODY_N,280nymous_ ++B 23000,25400,300,300,CONT_BODY_N,317nymous_ ++B 23000,24400,300,300,CONT_BODY_N,316nymous_ ++B 20800,20400,300,300,CONT_BODY_P,282nymous_ ++B 20800,21400,300,300,CONT_BODY_P,283nymous_ ++B 20800,22400,300,300,CONT_BODY_P,284nymous_ ++B 4400,35000,300,300,CONT_DIF_N,840nymous_ ++B 38000,33000,300,300,CONT_VIA2,786nymous_ ++B 36800,10000,300,300,CONT_VIA2,732nymous_ ++B 34400,8600,300,300,CONT_DIF_N,678nymous_ ++B 17600,16000,300,300,CONT_BODY_N,1163ymous_ ++B 1600,25400,300,300,CONT_BODY_P,1109ymous_ ++B 33200,6000,300,300,CONT_VIA2,624nymous_ ++B 32000,6000,300,300,CONT_BODY_P,570nymous_ ++B 28000,32400,300,300,CONT_DIF_P,463nymous_ ++B 29600,17000,300,300,CONT_VIA,517nymous_ ++B 14000,34000,300,300,CONT_DIF_N,1055ymous_ ++B 11600,6000,300,300,CONT_VIA,1001ymous_ ++B 26000,6000,300,300,CONT_VIA2,409nymous_ ++B 18800,13800,300,300,CONT_DIF_P,1215ymous_ ++B 8600,26000,300,300,CONT_VIA2,947nymous_ ++B 6800,37600,300,300,CONT_VIA,893nymous_ ++B 4400,34000,300,300,CONT_VIA,839nymous_ ++B 38000,29000,300,300,CONT_VIA2,785nymous_ ++B 34400,6000,300,300,CONT_VIA2,677nymous_ ++B 29600,16000,300,300,CONT_BODY_N,516nymous_ ++B 17600,13800,300,300,CONT_DIF_P,1162ymous_ ++B 1600,24400,300,300,CONT_BODY_P,1108ymous_ ++B 33200,6000,300,300,CONT_VIA,623nymous_ ++B 31600,35000,300,300,CONT_VIA2,569nymous_ ++B 26000,6000,300,300,CONT_VIA,408nymous_ ++B 28000,31200,300,300,CONT_VIA,462nymous_ ++B 14000,33000,300,300,CONT_DIF_N,1054ymous_ ++B 11600,6000,300,300,CONT_BODY_P,1000ymous_ ++B 18800,12800,300,300,CONT_DIF_P,1214ymous_ ++B 30600,31000,300,300,CONT_DIF_P,540nymous_ ++B 17600,17000,300,300,CONT_VIA2,1165ymous_ ++B 1600,27400,300,300,CONT_BODY_P,1111ymous_ ++B 14000,36000,300,300,CONT_DIF_N,1057ymous_ ++B 32000,6000,300,300,CONT_VIA2,572nymous_ ++B 26000,8000,300,300,CONT_DIF_N,411nymous_ ++B 18800,16000,300,300,CONT_BODY_N,1217ymous_ ++B 11600,8000,300,300,CONT_DIF_N,1003ymous_ ++B 8600,31000,300,300,CONT_VIA2,949nymous_ ++B 24800,11600,300,300,CONT_DIF_P,357nymous_ ++B 6800,6000,300,300,CONT_BODY_P,895nymous_ ++B 4400,35000,300,300,CONT_VIA,841nymous_ ++B 38000,34000,300,300,CONT_VIA2,787nymous_ ++B 36800,11000,300,300,CONT_VIA2,733nymous_ ++B 17600,17000,300,300,CONT_VIA,1164ymous_ ++B 34400,16000,300,300,CONT_BODY_N,679nymous_ ++B 33200,9000,300,300,CONT_DIF_N,625nymous_ ++B 28000,33600,300,300,CONT_DIF_P,464nymous_ ++B 29600,17000,300,300,CONT_VIA2,518nymous_ ++B 1600,26400,300,300,CONT_BODY_P,1110ymous_ ++B 14000,35000,300,300,CONT_DIF_N,1056ymous_ ++B 32000,6000,300,300,CONT_VIA,571nymous_ ++B 24800,9000,300,300,CONT_DIF_N,356nymous_ ++B 26000,7200,300,300,CONT_DIF_N,410nymous_ ++B 18800,14800,300,300,CONT_DIF_P,1216ymous_ ++B 11600,6000,300,300,CONT_VIA2,1002ymous_ ++B 8600,30000,300,300,CONT_VIA2,948nymous_ ++B 6800,37600,300,300,CONT_VIA2,894nymous_ ++B 11600,11800,300,300,CONT_DIF_P,1005ymous_ ++B 24800,16000,300,300,CONT_BODY_N,359nymous_ ++B 18800,17000,300,300,CONT_VIA2,1219ymous_ ++B 8600,36000,300,300,CONT_VIA2,951nymous_ ++B 6800,16000,300,300,CONT_BODY_N,897nymous_ ++B 4400,36000,300,300,CONT_VIA,843nymous_ ++B 38200,20400,300,300,CONT_BODY_N,789nymous_ ++B 36800,13000,300,300,CONT_BODY_N,735nymous_ ++B 34800,22000,300,300,CONT_VIA2,681nymous_ ++B 30000,19200,300,300,CONT_BODY_N,520nymous_ ++B 17600,19200,300,300,CONT_BODY_P,1166ymous_ ++B 1600,28400,300,300,CONT_BODY_P,1112ymous_ ++B 33200,17000,300,300,CONT_VIA,627nymous_ ++B 32000,8600,300,300,CONT_DIF_N,573nymous_ ++B 26000,10000,300,300,CONT_POLY,412nymous_ ++B 28000,19200,300,300,CONT_BODY_N,466nymous_ ++B 14000,4000,300,300,CONT_VIA2,1058ymous_ ++B 11600,9000,300,300,CONT_DIF_N,1004ymous_ ++B 24800,12600,300,300,CONT_DIF_P,358nymous_ ++B 18800,17000,300,300,CONT_VIA,1218ymous_ ++B 8600,32000,300,300,CONT_VIA2,950nymous_ ++B 6800,6000,300,300,CONT_VIA2,896nymous_ ++B 4400,36000,300,300,CONT_DIF_N,842nymous_ ++B 38000,35000,300,300,CONT_VIA2,788nymous_ ++B 36800,12000,300,300,CONT_BODY_N,734nymous_ ++B 34800,20200,300,300,CONT_POLY,680nymous_ ++B 33200,16000,300,300,CONT_BODY_N,626nymous_ ++B 30000,20200,300,300,CONT_VIA,519nymous_ ++B 28000,35000,300,300,CONT_DIF_P,465nymous_ ++B 4400,6000,300,300,CONT_BODY_P,845nymous_ ++B 38200,22400,300,300,CONT_BODY_N,791nymous_ ++B 36800,15000,300,300,CONT_BODY_N,737nymous_ ++B 17800,23200,300,300,CONT_VIA,1168ymous_ ++B 34800,27000,300,300,CONT_VIA2,683nymous_ ++B 33800,22000,300,300,CONT_DIF_P,629nymous_ ++B 2800,24000,300,300,CONT_DIF_N,468nymous_ ++B 30400,36600,300,300,CONT_VIA,522nymous_ ++B 1600,30400,300,300,CONT_BODY_P,1114ymous_ ++B 14000,7200,300,300,CONT_DIF_N,1060ymous_ ++B 32000,16000,300,300,CONT_BODY_N,575nymous_ ++B 24800,17000,300,300,CONT_VIA2,360nymous_ ++B 26000,12800,300,300,CONT_DIF_P,414nymous_ ++B 19600,19200,300,300,CONT_BODY_P,1220ymous_ ++B 11600,12800,300,300,CONT_DIF_P,1006ymous_ ++B 8600,19200,300,300,CONT_BODY_P,952nymous_ ++B 6800,17000,300,300,CONT_VIA,898nymous_ ++B 4400,36000,300,300,CONT_VIA2,844nymous_ ++B 38200,21400,300,300,CONT_BODY_N,790nymous_ ++B 36800,14000,300,300,CONT_BODY_N,736nymous_ ++B 34800,23000,300,300,CONT_VIA2,682nymous_ ++B 17800,23200,300,300,CONT_DIF_N,1167ymous_ ++B 1600,29400,300,300,CONT_BODY_P,1113ymous_ ++B 33200,17000,300,300,CONT_VIA2,628nymous_ ++B 32000,11000,300,300,CONT_POLY,574nymous_ ++B 2800,23000,300,300,CONT_DIF_N,467nymous_ ++B 30400,36600,300,300,CONT_POLY,521nymous_ ++B 14000,6000,300,300,CONT_BODY_P,1059ymous_ ++B 26000,12000,300,300,CONT_DIF_P,413nymous_ ++B 30600,22000,300,300,CONT_DIF_P,524nymous_ ++B 17800,24400,300,300,CONT_VIA2,1170ymous_ ++B 1600,32400,300,300,CONT_BODY_P,1116ymous_ ++B 32000,17000,300,300,CONT_VIA2,577nymous_ ++B 26000,17000,300,300,CONT_VIA,416nymous_ ++B 14000,10000,300,300,CONT_POLY,1062ymous_ ++B 11600,14800,300,300,CONT_DIF_P,1008ymous_ ++B 25000,20400,300,300,CONT_VIA,362nymous_ ++B 19800,26200,300,300,CONT_POLY,1222ymous_ ++B 8800,37600,300,300,CONT_VIA,954nymous_ ++B 7600,21800,300,300,CONT_POLY,900nymous_ ++B 4400,6000,300,300,CONT_VIA2,846nymous_ ++B 38200,23400,300,300,CONT_BODY_N,792nymous_ ++B 36800,15000,300,300,CONT_VIA2,738nymous_ ++B 17800,24400,300,300,CONT_DIF_N,1169ymous_ ++B 34800,28000,300,300,CONT_VIA2,684nymous_ ++B 33800,22000,300,300,CONT_VIA,630nymous_ ++B 30400,36600,300,300,CONT_VIA2,523nymous_ ++B 1600,31400,300,300,CONT_BODY_P,1115ymous_ ++B 14000,8000,300,300,CONT_DIF_N,1061ymous_ ++B 32000,17000,300,300,CONT_VIA,576nymous_ ++B 26000,16000,300,300,CONT_BODY_N,415nymous_ ++B 2800,25000,300,300,CONT_DIF_N,469nymous_ ++B 19800,22600,300,300,CONT_POLY,1221ymous_ ++B 11600,13800,300,300,CONT_DIF_P,1007ymous_ ++B 8800,37600,300,300,CONT_BODY_P,953nymous_ ++B 25000,20400,300,300,CONT_DIF_P,361nymous_ ++B 6800,17000,300,300,CONT_VIA2,899nymous_ ++B 25000,22800,300,300,CONT_DIF_P,364nymous_ ++B 19800,28200,300,300,CONT_VIA,1224ymous_ ++B 11600,17000,300,300,CONT_VIA,1010ymous_ ++B 9200,23000,300,300,CONT_DIF_N,956nymous_ ++B 7600,23000,300,300,CONT_DIF_N,902nymous_ ++B 4400,17000,300,300,CONT_VIA,848nymous_ ++B 38200,25400,300,300,CONT_BODY_N,794nymous_ ++B 36800,16000,300,300,CONT_VIA2,740nymous_ ++B 34800,33000,300,300,CONT_VIA2,686nymous_ ++B 17800,25600,300,300,CONT_DIF_N,1171ymous_ ++B 1600,33400,300,300,CONT_BODY_P,1117ymous_ ++B 33800,23000,300,300,CONT_DIF_P,632nymous_ ++B 32000,19200,300,300,CONT_BODY_N,578nymous_ ++B 2800,27000,300,300,CONT_DIF_N,471nymous_ ++B 30600,23000,300,300,CONT_DIF_P,525nymous_ ++B 14000,12000,300,300,CONT_DIF_P,1063ymous_ ++B 11600,16000,300,300,CONT_BODY_N,1009ymous_ ++B 25000,21600,300,300,CONT_DIF_P,363nymous_ ++B 26000,17000,300,300,CONT_VIA2,417nymous_ ++B 19800,27400,300,300,CONT_POLY,1223ymous_ ++B 8800,37600,300,300,CONT_VIA2,955nymous_ ++B 7600,21800,300,300,CONT_VIA,901nymous_ ++B 4400,16000,300,300,CONT_BODY_N,847nymous_ ++B 38200,24400,300,300,CONT_BODY_N,793nymous_ ++B 36800,16000,300,300,CONT_BODY_N,739nymous_ ++B 34800,29000,300,300,CONT_VIA2,685nymous_ ++B 33800,22000,300,300,CONT_VIA2,631nymous_ ++B 2800,26000,300,300,CONT_DIF_N,470nymous_ ++B 7600,24000,300,300,CONT_DIF_N,904nymous_ ++B 4600,37600,300,300,CONT_BODY_P,850nymous_ ++B 38200,27400,300,300,CONT_BODY_N,796nymous_ ++B 36800,17000,300,300,CONT_VIA2,742nymous_ ++B 17800,25600,300,300,CONT_VIA2,1173ymous_ ++B 34800,35000,300,300,CONT_VIA2,688nymous_ ++B 33800,23000,300,300,CONT_VIA2,634nymous_ ++B 30600,25000,300,300,CONT_DIF_P,527nymous_ ++B 1600,35400,300,300,CONT_BODY_P,1119ymous_ ++B 14000,13800,300,300,CONT_DIF_P,1065ymous_ ++B 3200,6000,300,300,CONT_VIA,580nymous_ ++B 2600,37600,300,300,CONT_BODY_P,419nymous_ ++B 2800,29000,300,300,CONT_DIF_N,473nymous_ ++B 19800,31000,300,300,CONT_POLY,1225ymous_ ++B 11600,17000,300,300,CONT_VIA2,1011ymous_ ++B 9200,24000,300,300,CONT_DIF_N,957nymous_ ++B 25000,22800,300,300,CONT_VIA,365nymous_ ++B 7600,23000,300,300,CONT_VIA,903nymous_ ++B 4400,17000,300,300,CONT_VIA2,849nymous_ ++B 38200,26400,300,300,CONT_BODY_N,795nymous_ ++B 36800,17000,300,300,CONT_VIA,741nymous_ ++B 17800,25600,300,300,CONT_VIA,1172ymous_ ++B 34800,34000,300,300,CONT_VIA2,687nymous_ ++B 33800,23000,300,300,CONT_VIA,633nymous_ ++B 2800,28000,300,300,CONT_DIF_N,472nymous_ ++B 30600,24000,300,300,CONT_DIF_P,526nymous_ ++B 1600,34400,300,300,CONT_BODY_P,1118ymous_ ++B 14000,12800,300,300,CONT_DIF_P,1064ymous_ ++B 3200,6000,300,300,CONT_BODY_P,579nymous_ ++B 26000,19200,300,300,CONT_BODY_N,418nymous_ ++B 2800,30000,300,300,CONT_DIF_N,474nymous_ ++B 14000,14800,300,300,CONT_DIF_P,1066ymous_ ++B 11600,19200,300,300,CONT_BODY_P,1012ymous_ ++B 25000,24000,300,300,CONT_DIF_P,366nymous_ ++B 19800,35200,300,300,CONT_VIA,1226ymous_ ++B 9200,25000,300,300,CONT_DIF_N,958nymous_ ++B 2600,19200,300,300,CONT_BODY_P,420nymous_ ++B 3200,6000,300,300,CONT_VIA2,581nymous_ ++B 33800,24000,300,300,CONT_DIF_P,635nymous_ ++B 1600,36400,300,300,CONT_BODY_P,1120ymous_ ++B 17800,26800,300,300,CONT_DIF_N,1174ymous_ ++B 30600,26000,300,300,CONT_DIF_P,528nymous_ ++B 35000,19200,300,300,CONT_BODY_N,689nymous_ ++B 37000,22000,300,300,CONT_DIF_P,743nymous_ ++B 38200,28400,300,300,CONT_BODY_N,797nymous_ ++B 4600,37600,300,300,CONT_VIA,851nymous_ ++B 7600,24000,300,300,CONT_VIA,905nymous_ ++B 9200,26000,300,300,CONT_DIF_N,959nymous_ ++B 19800,37600,300,300,CONT_BODY_P,1227ymous_ ++B 27000,20400,300,300,CONT_DIF_P,421nymous_ ++B 25000,25200,300,300,CONT_DIF_P,367nymous_ ++B 12400,23000,300,300,CONT_DIF_N,1013ymous_ ++B 14000,16000,300,300,CONT_BODY_N,1067ymous_ ++B 30600,27000,300,300,CONT_DIF_P,529nymous_ ++B 2800,31000,300,300,CONT_DIF_N,475nymous_ ++B 3200,7000,300,300,CONT_BODY_P,582nymous_ ++B 33800,24000,300,300,CONT_VIA,636nymous_ ++B 1600,37600,300,300,CONT_BODY_P,1121ymous_ ++B 35400,22000,300,300,CONT_DIF_P,690nymous_ ++B 37000,22000,300,300,CONT_VIA,744nymous_ ++B 38200,29400,300,300,CONT_BODY_N,798nymous_ ++B 4600,37600,300,300,CONT_VIA2,852nymous_ ++B 7600,24000,300,300,CONT_VIA2,906nymous_ ++B 9200,27000,300,300,CONT_DIF_N,960nymous_ ++B 12400,24000,300,300,CONT_DIF_N,1014ymous_ ++B 27000,21600,300,300,CONT_DIF_P,422nymous_ ++B 25000,26400,300,300,CONT_DIF_P,368nymous_ ++B 3200,7000,300,300,CONT_VIA2,583nymous_ ++B 14000,17000,300,300,CONT_VIA,1068ymous_ ++B 1600,19200,300,300,CONT_BODY_P,1122ymous_ ++B 30600,27000,300,300,CONT_VIA,530nymous_ ++B 2800,32000,300,300,CONT_DIF_N,476nymous_ ++B 33800,25000,300,300,CONT_DIF_P,637nymous_ ++B 35400,23000,300,300,CONT_DIF_P,691nymous_ ++B 17800,28000,300,300,CONT_VIA,1176ymous_ ++B 37000,22000,300,300,CONT_VIA2,745nymous_ ++B 38200,30400,300,300,CONT_BODY_N,799nymous_ ++B 4600,19200,300,300,CONT_BODY_P,853nymous_ ++B 7600,25000,300,300,CONT_DIF_N,907nymous_ ++B 25000,27600,300,300,CONT_DIF_P,369nymous_ ++B 9200,28000,300,300,CONT_DIF_N,961nymous_ ++B 12400,25000,300,300,CONT_DIF_N,1015ymous_ ++B 27000,22800,300,300,CONT_DIF_P,423nymous_ ++B 14000,17000,300,300,CONT_VIA2,1069ymous_ ++B 2800,33000,300,300,CONT_DIF_N,477nymous_ ++B 3200,8000,300,300,CONT_BODY_P,584nymous_ ++B 16400,4000,300,300,CONT_VIA2,1123ymous_ ++B 30600,27000,300,300,CONT_VIA2,531nymous_ ++B 33800,25000,300,300,CONT_VIA,638nymous_ ++B 35400,24000,300,300,CONT_DIF_P,692nymous_ ++B 17800,29200,300,300,CONT_DIF_N,1177ymous_ ++B 37000,23000,300,300,CONT_DIF_P,746nymous_ ++B 38200,31400,300,300,CONT_BODY_N,800nymous_ ++B 5400,24000,300,300,CONT_VIA2,854nymous_ ++B 7600,25000,300,300,CONT_VIA,908nymous_ ++B 9200,29000,300,300,CONT_DIF_N,962nymous_ ++B 25000,27600,300,300,CONT_VIA,370nymous_ ++B 12400,26000,300,300,CONT_DIF_N,1016ymous_ ++B 14600,19200,300,300,CONT_BODY_P,1070ymous_ ++B 2800,34000,300,300,CONT_DIF_N,478nymous_ ++B 27000,24000,300,300,CONT_DIF_P,424nymous_ ++B 3200,8000,300,300,CONT_VIA2,585nymous_ ++B 33800,26000,300,300,CONT_DIF_P,639nymous_ ++B 16400,6000,300,300,CONT_BODY_P,1124ymous_ ++B 17800,30400,300,300,CONT_DIF_N,1178ymous_ ++B 30600,28000,300,300,CONT_DIF_P,532nymous_ ++B 35400,25000,300,300,CONT_DIF_P,693nymous_ ++B 37000,23000,300,300,CONT_VIA,747nymous_ ++B 38200,32400,300,300,CONT_BODY_N,801nymous_ ++B 5400,25000,300,300,CONT_VIA2,855nymous_ ++B 7600,25000,300,300,CONT_VIA2,909nymous_ ++B 9200,30000,300,300,CONT_DIF_N,963nymous_ ++B 12400,27000,300,300,CONT_DIF_N,1017ymous_ ++B 27000,25200,300,300,CONT_DIF_P,425nymous_ ++B 25000,28800,300,300,CONT_DIF_P,371nymous_ ++B 15200,4000,300,300,CONT_VIA2,1071ymous_ ++B 30600,28000,300,300,CONT_VIA,533nymous_ ++B 2800,35000,300,300,CONT_DIF_N,479nymous_ ++B 3200,9000,300,300,CONT_BODY_P,586nymous_ ++B 33800,26000,300,300,CONT_VIA,640nymous_ ++B 16400,7200,300,300,CONT_DIF_N,1125ymous_ ++B 17800,30400,300,300,CONT_VIA,1179ymous_ ++B 35400,26000,300,300,CONT_DIF_P,694nymous_ ++B 37000,23000,300,300,CONT_VIA2,748nymous_ ++B 38200,33400,300,300,CONT_BODY_N,802nymous_ ++B 5400,26000,300,300,CONT_VIA2,856nymous_ ++B 7600,26000,300,300,CONT_DIF_N,910nymous_ ++B 9200,31000,300,300,CONT_DIF_N,964nymous_ ++B 12400,28000,300,300,CONT_DIF_N,1018ymous_ ++B 27000,25200,300,300,CONT_VIA,426nymous_ ++B 25000,30000,300,300,CONT_DIF_P,372nymous_ ++B 3200,12000,300,300,CONT_BODY_N,587nymous_ ++B 15200,6000,300,300,CONT_BODY_P,1072ymous_ ++B 16400,8000,300,300,CONT_DIF_N,1126ymous_ ++B 30600,28000,300,300,CONT_VIA2,534nymous_ ++B 2800,36000,300,300,CONT_DIF_N,480nymous_ ++B 33800,27000,300,300,CONT_DIF_P,641nymous_ ++B 35400,27000,300,300,CONT_DIF_P,695nymous_ ++B 37000,24000,300,300,CONT_DIF_P,749nymous_ ++B 38200,34400,300,300,CONT_BODY_N,803nymous_ ++B 5400,30000,300,300,CONT_VIA2,857nymous_ ++B 7600,26000,300,300,CONT_VIA,911nymous_ ++B 25000,30000,300,300,CONT_VIA,373nymous_ ++B 9200,32000,300,300,CONT_DIF_N,965nymous_ ++B 12400,29000,300,300,CONT_DIF_N,1019ymous_ ++B 28400,6000,300,300,CONT_BODY_P,481nymous_ ++B 27000,26400,300,300,CONT_DIF_P,427nymous_ ++B 3200,12000,300,300,CONT_VIA2,588nymous_ ++B 15200,8000,300,300,CONT_DIF_N,1073ymous_ ++B 16400,10000,300,300,CONT_POLY,1127ymous_ ++B 30600,29000,300,300,CONT_DIF_P,535nymous_ ++B 33800,27000,300,300,CONT_VIA,642nymous_ ++B 35400,28000,300,300,CONT_DIF_P,696nymous_ ++B 37000,24000,300,300,CONT_VIA,750nymous_ ++B 38200,35400,300,300,CONT_BODY_N,804nymous_ ++B 5400,31000,300,300,CONT_VIA2,858nymous_ ++B 7600,26000,300,300,CONT_VIA2,912nymous_ ++B 9200,33000,300,300,CONT_DIF_N,966nymous_ ++B 25000,31200,300,300,CONT_DIF_P,374nymous_ ++B 12400,30000,300,300,CONT_DIF_N,1020ymous_ ++B 15200,9000,300,300,CONT_DIF_N,1074ymous_ ++B 27000,27600,300,300,CONT_DIF_P,428nymous_ ++B 3200,13000,300,300,CONT_BODY_N,589nymous_ ++B 16400,12000,300,300,CONT_DIF_P,1128ymous_ ++B 30600,29000,300,300,CONT_VIA,536nymous_ ++B 28400,6000,300,300,CONT_VIA,482nymous_ ++B 33800,27000,300,300,CONT_VIA2,643nymous_ ++B 17800,31600,300,300,CONT_VIA2,1182ymous_ ++B 35400,29000,300,300,CONT_DIF_P,697nymous_ ++B 37000,25000,300,300,CONT_DIF_P,751nymous_ ++B 38200,36400,300,300,CONT_BODY_N,805nymous_ ++B 5400,32000,300,300,CONT_VIA2,859nymous_ ++B 7600,27000,300,300,CONT_DIF_N,913nymous_ ++B 9200,34000,300,300,CONT_DIF_N,967nymous_ ++B 27000,28800,300,300,CONT_DIF_P,429nymous_ ++B 25000,32400,300,300,CONT_DIF_P,375nymous_ ++B 12400,31000,300,300,CONT_DIF_N,1021ymous_ ++B 15200,9000,300,300,CONT_VIA,1075ymous_ ++B 30600,29000,300,300,CONT_VIA2,537nymous_ ++B 28400,6000,300,300,CONT_VIA2,483nymous_ ++B 3200,13000,300,300,CONT_VIA2,590nymous_ ++B 33800,28000,300,300,CONT_DIF_P,644nymous_ ++B 16400,12800,300,300,CONT_DIF_P,1129ymous_ ++B 35400,30000,300,300,CONT_DIF_P,698nymous_ ++B 37000,25000,300,300,CONT_VIA,752nymous_ ++B 38200,37600,300,300,CONT_BODY_N,806nymous_ ++B 5400,36000,300,300,CONT_VIA2,860nymous_ ++B 7600,27000,300,300,CONT_VIA,914nymous_ ++B 9200,35000,300,300,CONT_DIF_N,968nymous_ ++B 12400,32000,300,300,CONT_DIF_N,1022ymous_ ++B 25000,32400,300,300,CONT_VIA,376nymous_ ++B 17800,32800,300,300,CONT_DIF_N,1183ymous_ ++B 27000,30000,300,300,CONT_DIF_P,430nymous_ ++B 3200,14000,300,300,CONT_BODY_N,591nymous_ ++B 15200,10000,300,300,CONT_POLY,1076ymous_ ++B 16400,13800,300,300,CONT_DIF_P,1130ymous_ ++B 30600,30000,300,300,CONT_DIF_P,538nymous_ ++B 28400,8000,300,300,CONT_DIF_N,484nymous_ ++B 33800,28000,300,300,CONT_VIA,645nymous_ ++B 35400,31000,300,300,CONT_DIF_P,699nymous_ ++B 17800,34000,300,300,CONT_DIF_N,1184ymous_ ++B 37000,26000,300,300,CONT_DIF_P,753nymous_ ++B 38200,19200,300,300,CONT_BODY_N,807nymous_ ++B 5600,37600,300,300,CONT_BODY_P,861nymous_ ++B 7600,28000,300,300,CONT_DIF_N,915nymous_ ++B 25000,33600,300,300,CONT_DIF_P,377nymous_ ++B 9200,36000,300,300,CONT_DIF_N,969nymous_ ++B 12400,33000,300,300,CONT_DIF_N,1023ymous_ ++B 28400,9000,300,300,CONT_DIF_N,485nymous_ ++B 27000,31200,300,300,CONT_DIF_P,431nymous_ ++B 3200,14000,300,300,CONT_VIA2,592nymous_ ++B 15200,11000,300,300,CONT_VIA,1077ymous_ ++B 16400,14800,300,300,CONT_DIF_P,1131ymous_ ++B 30600,30000,300,300,CONT_VIA,539nymous_ ++B 33800,28000,300,300,CONT_VIA2,646nymous_ ++B 35400,32000,300,300,CONT_DIF_P,700nymous_ ++B 37000,26000,300,300,CONT_VIA,754nymous_ ++B 4400,21800,300,300,CONT_POLY,808nymous_ ++B 5600,37600,300,300,CONT_VIA,862nymous_ ++B 7600,28000,300,300,CONT_VIA,916nymous_ ++B 17800,30400,300,300,CONT_VIA2,1180ymous_ ++B 17800,31600,300,300,CONT_DIF_N,1181ymous_ ++B 17800,35200,300,300,CONT_DIF_N,1185ymous_ ++B 9200,6000,300,300,CONT_BODY_P,970nymous_ ++B 25000,35000,300,300,CONT_DIF_P,378nymous_ ++B 12400,34000,300,300,CONT_DIF_N,1024ymous_ ++B 15200,11800,300,300,CONT_DIF_P,1078ymous_ ++B 28400,10000,300,300,CONT_POLY,486nymous_ ++B 27000,32400,300,300,CONT_DIF_P,432nymous_ ++B 3200,15000,300,300,CONT_BODY_N,593nymous_ ++B 33800,29000,300,300,CONT_DIF_P,647nymous_ ++B 16400,16000,300,300,CONT_BODY_N,1132ymous_ ++B 35400,33000,300,300,CONT_DIF_P,701nymous_ ++B 37000,27000,300,300,CONT_DIF_P,755nymous_ ++B 4400,21800,300,300,CONT_VIA,809nymous_ ++B 5600,37600,300,300,CONT_VIA2,863nymous_ ++B 7600,29000,300,300,CONT_DIF_N,917nymous_ ++B 9200,6000,300,300,CONT_VIA2,971nymous_ ++B 27000,33600,300,300,CONT_DIF_P,433nymous_ ++B 25000,36400,300,300,CONT_DIF_P,379nymous_ ++B 12400,35000,300,300,CONT_DIF_N,1025ymous_ ++B 15200,12800,300,300,CONT_DIF_P,1079ymous_ ++B 28400,12000,300,300,CONT_DIF_P,487nymous_ ++B 3200,16000,300,300,CONT_BODY_N,594nymous_ ++B 33800,29000,300,300,CONT_VIA,648nymous_ ++B 16400,17000,300,300,CONT_VIA,1133ymous_ ++B 17800,36400,300,300,CONT_DIF_N,1186ymous_ ++B 17800,37600,300,300,CONT_BODY_P,1187ymous_ ++B 35400,34000,300,300,CONT_DIF_P,702nymous_ ++B 37000,27000,300,300,CONT_VIA,756nymous_ ++B 4400,23000,300,300,CONT_DIF_N,810nymous_ ++B 5600,6000,300,300,CONT_BODY_P,864nymous_ ++B 7600,29000,300,300,CONT_VIA,918nymous_ ++B 9200,16000,300,300,CONT_BODY_N,972nymous_ ++B 12400,36000,300,300,CONT_DIF_N,1026ymous_ ++B 27000,35000,300,300,CONT_DIF_P,434nymous_ ++B 25000,37600,300,300,CONT_BODY_N,380nymous_ ++B 3200,17000,300,300,CONT_VIA,595nymous_ ++B 15200,13800,300,300,CONT_DIF_P,1080ymous_ ++B 16400,17000,300,300,CONT_VIA2,1134ymous_ ++B 28400,12800,300,300,CONT_DIF_P,488nymous_ ++B 33800,29000,300,300,CONT_VIA2,649nymous_ ++B 35400,35000,300,300,CONT_DIF_P,703nymous_ ++B 37000,27000,300,300,CONT_VIA2,757nymous_ ++B 4400,23000,300,300,CONT_VIA,811nymous_ ++B 5600,6000,300,300,CONT_VIA2,865nymous_ ++B 7600,30000,300,300,CONT_DIF_N,919nymous_ ++B 25000,19200,300,300,CONT_BODY_N,381nymous_ ++B 9200,17000,300,300,CONT_VIA,973nymous_ ++B 12600,19200,300,300,CONT_BODY_P,1027ymous_ ++B 27000,36400,300,300,CONT_DIF_P,435nymous_ ++B 15200,16000,300,300,CONT_BODY_N,1081ymous_ ++B 30600,32000,300,300,CONT_DIF_P,542nymous_ ++B 18600,19200,300,300,CONT_BODY_P,1188ymous_ ++B 28400,16000,300,300,CONT_BODY_N,489nymous_ ++B 3200,17000,300,300,CONT_VIA2,596nymous_ ++B 16600,19200,300,300,CONT_BODY_P,1135ymous_ ++B 30600,32000,300,300,CONT_VIA,543nymous_ ++B 33800,30000,300,300,CONT_DIF_P,650nymous_ ++B 35400,36000,300,300,CONT_DIF_P,704nymous_ ++B 18800,22000,300,300,CONT_DIF_N,1189ymous_ ++B 37000,28000,300,300,CONT_DIF_P,758nymous_ ++B 4400,24000,300,300,CONT_DIF_N,812nymous_ ++B 5600,16000,300,300,CONT_BODY_N,866nymous_ ++B 7600,30000,300,300,CONT_VIA,920nymous_ ++B 9200,17000,300,300,CONT_VIA2,974nymous_ ++B 26000,20400,300,300,CONT_DIF_P,382nymous_ ++B 12800,4000,300,300,CONT_VIA2,1028ymous_ ++B 15200,17000,300,300,CONT_VIA,1082ymous_ ++B 28400,17000,300,300,CONT_VIA,490nymous_ ++B 27000,36400,300,300,CONT_VIA,436nymous_ ++B 32200,22000,300,300,CONT_DIF_P,597nymous_ ++B 33800,30000,300,300,CONT_VIA,651nymous_ ++B 16800,20200,300,300,CONT_VIA,1136ymous_ ++B 35600,6000,300,300,CONT_BODY_P,705nymous_ ++B 37000,28000,300,300,CONT_VIA,759nymous_ ++B 4400,24000,300,300,CONT_VIA,813nymous_ ++B 5600,17000,300,300,CONT_VIA,867nymous_ ++B 7600,30000,300,300,CONT_VIA2,921nymous_ ++B 9600,37600,300,300,CONT_BODY_P,975nymous_ ++B 12800,6000,300,300,CONT_BODY_P,1029ymous_ ++B 18800,22200,300,300,CONT_VIA,1190ymous_ ++B 30600,33000,300,300,CONT_DIF_P,544nymous_ ++B 27000,37600,300,300,CONT_BODY_N,437nymous_ ++B 26000,21600,300,300,CONT_DIF_P,383nymous_ ++B 15200,17000,300,300,CONT_VIA2,1083ymous_ ++B 30600,33000,300,300,CONT_VIA,545nymous_ ++B 28400,17000,300,300,CONT_VIA2,491nymous_ ++B 32200,23000,300,300,CONT_DIF_P,598nymous_ ++B 33800,31000,300,300,CONT_DIF_P,652nymous_ ++B 16800,23400,300,300,CONT_POLY,1137ymous_ ++B 35600,6000,300,300,CONT_VIA,706nymous_ ++B 37000,28000,300,300,CONT_VIA2,760nymous_ ++B 4400,24000,300,300,CONT_VIA2,814nymous_ ++B 5600,17000,300,300,CONT_VIA2,868nymous_ ++B 7600,31000,300,300,CONT_DIF_N,922nymous_ ++B 9600,19200,300,300,CONT_BODY_P,976nymous_ ++B 12800,8000,300,300,CONT_DIF_N,1030ymous_ ++B 27000,19200,300,300,CONT_BODY_N,438nymous_ ++B 26000,21600,300,300,CONT_VIA,384nymous_ ++B 32200,24000,300,300,CONT_DIF_P,599nymous_ ++B 15600,20200,300,300,CONT_VIA,1084ymous_ ++B 16800,24400,300,300,CONT_VIA,1138ymous_ ++B 29000,21000,300,300,CONT_POLY,492nymous_ ++B 33800,31000,300,300,CONT_VIA,653nymous_ ++B 35600,6000,300,300,CONT_VIA2,707nymous_ ++B 37000,29000,300,300,CONT_DIF_P,761nymous_ ++B 18800,23200,300,300,CONT_DIF_N,1191ymous_ ++B 30600,33000,300,300,CONT_VIA2,546nymous_ ++B 18800,24400,300,300,CONT_DIF_N,1192ymous_ ++B 4400,25000,300,300,CONT_DIF_N,815nymous_ ++B 5600,19200,300,300,CONT_BODY_P,869nymous_ ++B 7600,31000,300,300,CONT_VIA,923nymous_ ++B 26000,21600,300,300,CONT_VIA2,385nymous_ ++B 10400,6000,300,300,CONT_BODY_P,977nymous_ ++B 12800,9000,300,300,CONT_DIF_N,1031ymous_ ++B 29000,21000,300,300,CONT_VIA,493nymous_ ++B 27200,6000,300,300,CONT_BODY_P,439nymous_ ++B 32200,25000,300,300,CONT_DIF_P,600nymous_ ++B 15600,23000,300,300,CONT_DIF_N,1085ymous_ ++B 16800,25400,300,300,CONT_POLY,1139ymous_ ++B 30600,34000,300,300,CONT_DIF_P,547nymous_ ++B 33800,32000,300,300,CONT_DIF_P,654nymous_ ++B 35600,16000,300,300,CONT_BODY_N,708nymous_ ++B 37000,29000,300,300,CONT_VIA,762nymous_ ++B 4400,25000,300,300,CONT_VIA,816nymous_ ++B 6000,23000,300,300,CONT_DIF_N,870nymous_ ++B 7600,31000,300,300,CONT_VIA2,924nymous_ ++B 10400,6000,300,300,CONT_VIA2,978nymous_ ++B 26000,22800,300,300,CONT_DIF_P,386nymous_ ++B 12800,9000,300,300,CONT_VIA,1032ymous_ ++B 15600,24000,300,300,CONT_DIF_N,1086ymous_ ++B 27200,6000,300,300,CONT_VIA,440nymous_ ++B 12800,11800,300,300,CONT_DIF_P,1034ymous_ ++B 10400,17000,300,300,CONT_VIA,980nymous_ ++B 7600,32000,300,300,CONT_VIA,926nymous_ ++B 6000,25000,300,300,CONT_DIF_N,872nymous_ ++B 4400,26000,300,300,CONT_DIF_N,818nymous_ ++B 37000,30000,300,300,CONT_DIF_P,764nymous_ ++B 35600,17000,300,300,CONT_VIA2,710nymous_ ++B 16800,29200,300,300,CONT_VIA,1141ymous_ ++B 33800,33000,300,300,CONT_DIF_P,656nymous_ ++B 32200,27000,300,300,CONT_DIF_P,602nymous_ ++B 29000,22200,300,300,CONT_POLY,495nymous_ ++B 15600,25000,300,300,CONT_DIF_N,1087ymous_ ++B 18800,25600,300,300,CONT_DIF_N,1193ymous_ ++B 29000,21000,300,300,CONT_VIA2,494nymous_ ++B 32200,26000,300,300,CONT_DIF_P,601nymous_ ++B 33800,32000,300,300,CONT_VIA,655nymous_ ++B 16800,28200,300,300,CONT_POLY,1140ymous_ ++B 18800,26800,300,300,CONT_DIF_N,1194ymous_ ++B 30600,34000,300,300,CONT_VIA,548nymous_ ++B 35600,17000,300,300,CONT_VIA,709nymous_ ++B 37000,29000,300,300,CONT_VIA2,763nymous_ ++B 4400,25000,300,300,CONT_VIA2,817nymous_ ++B 6000,24000,300,300,CONT_DIF_N,871nymous_ ++B 7600,32000,300,300,CONT_DIF_N,925nymous_ ++B 10400,16000,300,300,CONT_BODY_N,979nymous_ ++B 27200,6000,300,300,CONT_VIA2,441nymous_ ++B 26000,22800,300,300,CONT_VIA2,387nymous_ ++B 12800,11000,300,300,CONT_VIA,1033ymous_ ++B 4400,26000,300,300,CONT_VIA,819nymous_ ++B 36000,20200,300,300,CONT_POLY,711nymous_ ++B 33800,33000,300,300,CONT_VIA,657nymous_ ++B 29000,22200,300,300,CONT_VIA,496nymous_ ++B 30600,35000,300,300,CONT_DIF_P,550nymous_ ++B 16800,32200,300,300,CONT_POLY,1142ymous_ ++B 15600,26000,300,300,CONT_DIF_N,1088ymous_ ++B 32200,28000,300,300,CONT_DIF_P,603nymous_ ++B 26000,24000,300,300,CONT_DIF_P,388nymous_ ++B 27200,8000,300,300,CONT_DIF_N,442nymous_ ++B 18800,26800,300,300,CONT_VIA,1195ymous_ ++B 30600,34000,300,300,CONT_VIA2,549nymous_ ++B 4400,26000,300,300,CONT_VIA2,820nymous_ ++B 37000,31000,300,300,CONT_DIF_P,766nymous_ ++B 36000,22000,300,300,CONT_VIA2,712nymous_ ++B 33800,33000,300,300,CONT_VIA2,658nymous_ ++B 16800,32200,300,300,CONT_VIA,1143ymous_ ++B 15600,27000,300,300,CONT_DIF_N,1089ymous_ ++B 32200,29000,300,300,CONT_DIF_P,604nymous_ ++B 27200,9000,300,300,CONT_DIF_N,443nymous_ ++B 29000,22200,300,300,CONT_VIA2,497nymous_ ++B 12800,12800,300,300,CONT_DIF_P,1035ymous_ ++B 10400,17000,300,300,CONT_VIA2,981nymous_ ++B 26000,24000,300,300,CONT_VIA,389nymous_ ++B 7600,32000,300,300,CONT_VIA2,927nymous_ ++B 6000,26000,300,300,CONT_DIF_N,873nymous_ ++B 37000,30000,300,300,CONT_VIA,765nymous_ ++B 18800,28000,300,300,CONT_DIF_N,1196ymous_ ++B 16800,33400,300,300,CONT_VIA,1145ymous_ ++B 29000,23400,300,300,CONT_VIA,499nymous_ ++B 15600,29000,300,300,CONT_DIF_N,1091ymous_ ++B 12800,16000,300,300,CONT_BODY_N,1037ymous_ ++B 26000,26400,300,300,CONT_DIF_P,391nymous_ ++B 10800,21800,300,300,CONT_POLY,983nymous_ ++B 7600,33000,300,300,CONT_VIA,929nymous_ ++B 6000,28000,300,300,CONT_DIF_N,875nymous_ ++B 4400,27000,300,300,CONT_DIF_N,821nymous_ ++B 37000,31000,300,300,CONT_VIA,767nymous_ ++B 36000,23000,300,300,CONT_VIA2,713nymous_ ++B 30600,35000,300,300,CONT_VIA2,552nymous_ ++B 16800,33400,300,300,CONT_POLY,1144ymous_ ++B 33800,34000,300,300,CONT_DIF_P,659nymous_ ++B 32200,30000,300,300,CONT_DIF_P,605nymous_ ++B 27200,10000,300,300,CONT_POLY,444nymous_ ++B 29000,23400,300,300,CONT_POLY,498nymous_ ++B 15600,28000,300,300,CONT_DIF_N,1090ymous_ ++B 12800,13800,300,300,CONT_DIF_P,1036ymous_ ++B 26000,25200,300,300,CONT_DIF_P,390nymous_ ++B 10600,19200,300,300,CONT_BODY_P,982nymous_ ++B 7600,33000,300,300,CONT_DIF_N,928nymous_ ++B 6000,27000,300,300,CONT_DIF_N,874nymous_ ++B 18800,29200,300,300,CONT_DIF_N,1197ymous_ ++B 30600,35000,300,300,CONT_VIA,551nymous_ ++B 15600,31000,300,300,CONT_DIF_N,1093ymous_ ++B 12800,17000,300,300,CONT_VIA2,1039ymous_ ++B 10800,21800,300,300,CONT_VIA2,985nymous_ ++B 7600,34000,300,300,CONT_VIA,931nymous_ ++B 6000,30000,300,300,CONT_DIF_N,877nymous_ ++B 4400,28000,300,300,CONT_DIF_N,823nymous_ ++B 37000,32000,300,300,CONT_VIA,769nymous_ ++B 36000,28000,300,300,CONT_VIA2,715nymous_ ++B 33800,34000,300,300,CONT_VIA2,661nymous_ ++B 29000,24600,300,300,CONT_POLY,500nymous_ ++B 16800,33400,300,300,CONT_VIA2,1146ymous_ ++B 15600,30000,300,300,CONT_DIF_N,1092ymous_ ++B 32200,32000,300,300,CONT_DIF_P,607nymous_ ++B 26000,26400,300,300,CONT_VIA,392nymous_ ++B 27200,12600,300,300,CONT_DIF_P,446nymous_ ++B 12800,17000,300,300,CONT_VIA,1038ymous_ ++B 10800,21800,300,300,CONT_VIA,984nymous_ ++B 7600,34000,300,300,CONT_DIF_N,930nymous_ ++B 6000,29000,300,300,CONT_DIF_N,876nymous_ ++B 4400,27000,300,300,CONT_VIA,822nymous_ ++B 37000,32000,300,300,CONT_DIF_P,768nymous_ ++B 36000,27000,300,300,CONT_VIA2,714nymous_ ++B 18800,31600,300,300,CONT_DIF_N,1199ymous_ ++B 33800,34000,300,300,CONT_VIA,660nymous_ ++B 32200,31000,300,300,CONT_DIF_P,606nymous_ ++B 30800,6000,300,300,CONT_BODY_P,553nymous_ ++B 27200,11600,300,300,CONT_DIF_P,445nymous_ ++B 18800,30400,300,300,CONT_DIF_N,1198ymous_ ++B 6000,32000,300,300,CONT_DIF_N,879nymous_ ++B 4400,29000,300,300,CONT_DIF_N,825nymous_ ++B 37000,33000,300,300,CONT_VIA,771nymous_ ++B 36000,33000,300,300,CONT_VIA2,717nymous_ ++B 16800,34600,300,300,CONT_VIA,1148ymous_ ++B 33800,35000,300,300,CONT_VIA,663nymous_ ++B 32200,34000,300,300,CONT_DIF_P,609nymous_ ++B 27200,17000,300,300,CONT_VIA,448nymous_ ++B 29000,25800,300,300,CONT_POLY,502nymous_ ++B 15600,32000,300,300,CONT_DIF_N,1094ymous_ ++B 13600,19200,300,300,CONT_BODY_P,1040ymous_ ++B 26000,27600,300,300,CONT_VIA2,394nymous_ ++B 10800,23000,300,300,CONT_DIF_N,986nymous_ ++B 7600,35000,300,300,CONT_DIF_N,932nymous_ ++B 6000,31000,300,300,CONT_DIF_N,878nymous_ ++B 4400,28000,300,300,CONT_VIA,824nymous_ ++B 37000,33000,300,300,CONT_DIF_P,770nymous_ ++B 36000,29000,300,300,CONT_VIA2,716nymous_ ++B 33800,35000,300,300,CONT_DIF_P,662nymous_ ++B 30800,6000,300,300,CONT_VIA2,555nymous_ ++B 16800,34600,300,300,CONT_POLY,1147ymous_ ++B 32200,33000,300,300,CONT_DIF_P,608nymous_ ++B 27200,16000,300,300,CONT_BODY_N,447nymous_ ++B 29000,24600,300,300,CONT_VIA,501nymous_ ++B 26000,27600,300,300,CONT_DIF_P,393nymous_ ++B 18800,31600,300,300,CONT_VIA,1200ymous_ ++B 30800,6000,300,300,CONT_VIA,554nymous_ ++B 18800,34000,300,300,CONT_DIF_N,1202ymous_ ++B 29000,31800,300,300,CONT_POLY,504nymous_ ++B 16800,35800,300,300,CONT_POLY,1150ymous_ ++B 15600,34000,300,300,CONT_DIF_N,1096ymous_ ++B 26000,28800,300,300,CONT_VIA,396nymous_ ++B 27800,36400,300,300,CONT_DIF_P,450nymous_ ++B 14000,21800,300,300,CONT_VIA,1042ymous_ ++B 10800,25000,300,300,CONT_DIF_N,988nymous_ ++B 7600,36000,300,300,CONT_DIF_N,934nymous_ ++B 6000,33000,300,300,CONT_DIF_N,880nymous_ ++B 4400,29000,300,300,CONT_VIA,826nymous_ ++B 37000,33000,300,300,CONT_VIA2,772nymous_ ++B 36000,34000,300,300,CONT_VIA2,718nymous_ ++B 16800,34600,300,300,CONT_VIA2,1149ymous_ ++B 33800,35000,300,300,CONT_VIA2,664nymous_ ++B 32200,35000,300,300,CONT_DIF_P,610nymous_ ++B 29000,30600,300,300,CONT_POLY,503nymous_ ++B 30800,16000,300,300,CONT_BODY_N,557nymous_ ++B 15600,33000,300,300,CONT_DIF_N,1095ymous_ ++B 14000,21800,300,300,CONT_POLY,1041ymous_ ++B 26000,28800,300,300,CONT_DIF_P,395nymous_ ++B 27200,17000,300,300,CONT_VIA2,449nymous_ ++B 10800,24000,300,300,CONT_DIF_N,987nymous_ ++B 7600,35000,300,300,CONT_VIA,933nymous_ ++B 30800,9000,300,300,CONT_DIF_N,556nymous_ ++B 18800,32800,300,300,CONT_DIF_N,1201ymous_ ++B 18800,34000,300,300,CONT_VIA,1203ymous_ ++B 15600,36000,300,300,CONT_DIF_N,1098ymous_ ++B 14000,23000,300,300,CONT_DIF_N,1044ymous_ ++B 18800,35200,300,300,CONT_DIF_N,1204ymous_ ++B 10800,27000,300,300,CONT_DIF_N,990nymous_ ++B 7600,36000,300,300,CONT_VIA2,936nymous_ ++B 6000,35000,300,300,CONT_DIF_N,882nymous_ ++B 4400,30000,300,300,CONT_VIA,828nymous_ ++B 37000,34000,300,300,CONT_VIA,774nymous_ ++B 36000,19200,300,300,CONT_BODY_N,720nymous_ ++B 33800,36000,300,300,CONT_VIA,666nymous_ ++B 16800,35800,300,300,CONT_VIA,1151ymous_ ++B 15600,35000,300,300,CONT_DIF_N,1097ymous_ ++B 32800,20200,300,300,CONT_POLY,612nymous_ ++B 27800,37600,300,300,CONT_BODY_N,451nymous_ ++B 29000,33000,300,300,CONT_POLY,505nymous_ ++B 14000,21800,300,300,CONT_VIA2,1043ymous_ ++B 10800,26000,300,300,CONT_DIF_N,989nymous_ ++B 26000,28800,300,300,CONT_VIA2,397nymous_ ++B 7600,36000,300,300,CONT_VIA,935nymous_ ++B 6000,34000,300,300,CONT_DIF_N,881nymous_ ++B 4400,30000,300,300,CONT_DIF_N,827nymous_ ++B 37000,34000,300,300,CONT_DIF_P,773nymous_ ++B 36000,35000,300,300,CONT_VIA2,719nymous_ ++B 33800,36000,300,300,CONT_DIF_P,665nymous_ ++B 30800,17000,300,300,CONT_VIA,558nymous_ ++B 32200,36000,300,300,CONT_DIF_P,611nymous_ ++B 7800,37600,300,300,CONT_BODY_P,938nymous_ ++B 6600,24000,300,300,CONT_VIA2,884nymous_ ++B 4400,31000,300,300,CONT_DIF_N,830nymous_ ++B 37000,35000,300,300,CONT_DIF_P,776nymous_ ++B 3600,37600,300,300,CONT_VIA,722nymous_ ++B 17600,4000,300,300,CONT_VIA2,1153ymous_ ++B 3400,24000,300,300,CONT_VIA2,668nymous_ ++B 32800,23000,300,300,CONT_VIA2,614nymous_ ++B 29400,11800,300,300,CONT_POLY,507nymous_ ++B 15600,19200,300,300,CONT_BODY_P,1099ymous_ ++B 14000,24000,300,300,CONT_DIF_N,1045ymous_ ++B 26000,31200,300,300,CONT_DIF_P,399nymous_ ++B 28000,21600,300,300,CONT_DIF_P,453nymous_ ++B 18800,36400,300,300,CONT_DIF_N,1205ymous_ ++B 10800,28000,300,300,CONT_DIF_N,991nymous_ ++B 7600,19200,300,300,CONT_BODY_P,937nymous_ ++B 6000,36000,300,300,CONT_DIF_N,883nymous_ ++B 4400,30000,300,300,CONT_VIA2,829nymous_ ++B 37000,34000,300,300,CONT_VIA2,775nymous_ ++B 3600,37600,300,300,CONT_BODY_P,721nymous_ ++B 31000,19200,300,300,CONT_BODY_N,560nymous_ ++B 16800,37600,300,300,CONT_BODY_P,1152ymous_ ++B 34000,19200,300,300,CONT_BODY_N,667nymous_ ++B 32800,22000,300,300,CONT_VIA2,613nymous_ ++B 28000,20400,300,300,CONT_DIF_P,452nymous_ ++B 29000,19200,300,300,CONT_BODY_N,506nymous_ ++B 26000,30000,300,300,CONT_DIF_P,398nymous_ ++B 30800,17000,300,300,CONT_VIA2,559nymous_ ++B 17600,8000,300,300,CONT_DIF_N,1155ymous_ ++B 15800,28000,300,300,CONT_VIA2,1101ymous_ ++B 32800,28000,300,300,CONT_VIA2,616nymous_ ++B 28000,24000,300,300,CONT_DIF_P,455nymous_ ++B 14000,26000,300,300,CONT_DIF_N,1047ymous_ ++B 10800,30000,300,300,CONT_DIF_N,993nymous_ ++B 26000,32400,300,300,CONT_DIF_P,401nymous_ ++B 18800,37600,300,300,CONT_BODY_P,1207ymous_ ++B 7800,37600,300,300,CONT_VIA,939nymous_ ++B 6600,25000,300,300,CONT_VIA2,885nymous_ ++B 4400,31000,300,300,CONT_VIA,831nymous_ ++B 37000,35000,300,300,CONT_VIA,777nymous_ ++B 3600,37600,300,300,CONT_VIA2,723nymous_ ++B 3400,25000,300,300,CONT_VIA2,669nymous_ ++B 29600,33000,300,300,CONT_VIA2,508nymous_ ++B 17600,6000,300,300,CONT_BODY_P,1154ymous_ ++B 15800,27000,300,300,CONT_VIA2,1100ymous_ ++B 32800,27000,300,300,CONT_VIA2,615nymous_ ++B 26000,31200,300,300,CONT_VIA,400nymous_ ++B 28000,22800,300,300,CONT_DIF_P,454nymous_ ++B 14000,25000,300,300,CONT_DIF_N,1046ymous_ ++B 10800,29000,300,300,CONT_DIF_N,992nymous_ ++B 18800,36400,300,300,CONT_VIA,1206ymous_ ++B 31600,20200,300,300,CONT_POLY,561nymous_ ++B 31600,22000,300,300,CONT_VIA2,562nymous_ ++B 36800,9000,300,300,CONT_VIA2,731nymous_ ++B 14000,28000,300,300,CONT_DIF_N,1049ymous_ ++B 18800,6000,300,300,CONT_VIA,1209ymous_ ++B 10800,32000,300,300,CONT_DIF_N,995nymous_ ++B 8000,6000,300,300,CONT_VIA2,941nymous_ ++B 6600,30000,300,300,CONT_VIA2,887nymous_ ++B 4400,32000,300,300,CONT_DIF_N,833nymous_ ++B 37000,36000,300,300,CONT_DIF_P,779nymous_ ++B 36800,6000,300,300,CONT_BODY_P,725nymous_ ++B 17600,9000,300,300,CONT_DIF_N,1156ymous_ ++B 3400,30000,300,300,CONT_VIA2,671nymous_ ++B 32800,29000,300,300,CONT_VIA2,617nymous_ ++B 28000,25200,300,300,CONT_DIF_P,456nymous_ ++B 29600,35000,300,300,CONT_VIA2,510nymous_ ++B 15800,29000,300,300,CONT_VIA2,1102ymous_ ++B 14000,27000,300,300,CONT_DIF_N,1048ymous_ ++B 26000,33600,300,300,CONT_DIF_P,402nymous_ ++B 18800,6000,300,300,CONT_BODY_P,1208ymous_ ++B 10800,31000,300,300,CONT_DIF_N,994nymous_ ++B 7800,37600,300,300,CONT_VIA2,940nymous_ ++B 6600,26000,300,300,CONT_VIA2,886nymous_ ++B 4400,31000,300,300,CONT_VIA2,832nymous_ ++B 37000,35000,300,300,CONT_VIA2,778nymous_ ++B 3600,19200,300,300,CONT_BODY_P,724nymous_ ++B 3400,26000,300,300,CONT_VIA2,670nymous_ ++B 29600,34000,300,300,CONT_VIA2,509nymous_ ++B 17800,28000,300,300,CONT_DIF_N,1175ymous_ ++B 31600,23000,300,300,CONT_VIA2,563nymous_ ++B 4400,32000,300,300,CONT_VIA2,835nymous_ ++B 37000,19200,300,300,CONT_BODY_N,781nymous_ ++B 36800,6000,300,300,CONT_VIA2,727nymous_ ++B 3400,32000,300,300,CONT_VIA2,673nymous_ ++B 29600,6000,300,300,CONT_VIA,512nymous_ ++B 17600,10000,300,300,CONT_POLY,1158ymous_ ++B 1600,20400,300,300,CONT_BODY_P,1104ymous_ ++B 32800,34000,300,300,CONT_VIA2,619nymous_ ++B 31600,28000,300,300,CONT_VIA2,565nymous_ ++B 26000,35000,300,300,CONT_DIF_P,404nymous_ ++B 28000,27600,300,300,CONT_DIF_P,458nymous_ ++B 14000,29000,300,300,CONT_DIF_N,1050ymous_ ++B 10800,33000,300,300,CONT_DIF_N,996nymous_ ++B 18800,6000,300,300,CONT_VIA2,1210ymous_ ++B 8000,16000,300,300,CONT_BODY_N,942nymous_ ++B 6600,31000,300,300,CONT_VIA2,888nymous_ ++B 4400,32000,300,300,CONT_VIA,834nymous_ ++B 37000,36000,300,300,CONT_VIA,780nymous_ ++B 36800,6000,300,300,CONT_VIA,726nymous_ ++B 17600,9000,300,300,CONT_VIA,1157ymous_ ++B 3400,31000,300,300,CONT_VIA2,672nymous_ ++B 32800,33000,300,300,CONT_VIA2,618nymous_ ++B 29600,6000,300,300,CONT_BODY_P,511nymous_ ++B 15800,37600,300,300,CONT_BODY_P,1103ymous_ ++B 31600,27000,300,300,CONT_VIA2,564nymous_ ++B 26000,33600,300,300,CONT_VIA,403nymous_ ++B 28000,26400,300,300,CONT_DIF_P,457nymous_ ++B 24800,6000,300,300,CONT_VIA2,354nymous_ ++B 24800,8000,300,300,CONT_DIF_N,355nymous_ ++B 30600,31000,300,300,CONT_VIA,541nymous_ ++B 17600,11800,300,300,CONT_DIF_P,1160ymous_ ++B 33000,19200,300,300,CONT_BODY_N,621nymous_ ++B 28000,30000,300,300,CONT_DIF_P,460nymous_ ++B 29600,8600,300,300,CONT_DIF_N,514nymous_ ++B 1600,22400,300,300,CONT_BODY_P,1106ymous_ ++B 28000,28800,300,300,CONT_DIF_P,459nymous_ ++B 29600,6000,300,300,CONT_VIA2,513nymous_ ++B 14000,30000,300,300,CONT_DIF_N,1051ymous_ ++B 10800,34000,300,300,CONT_DIF_N,997nymous_ ++B 26000,36400,300,300,CONT_DIF_P,405nymous_ ++B 18800,8000,300,300,CONT_DIF_N,1211ymous_ ++B 8000,17000,300,300,CONT_VIA,943nymous_ ++B 6600,32000,300,300,CONT_VIA2,889nymous_ ++B 31600,29000,300,300,CONT_VIA2,566nymous_ ++B 32800,35000,300,300,CONT_VIA2,620nymous_ ++B 1600,21400,300,300,CONT_BODY_P,1105ymous_ ++B 17600,11000,300,300,CONT_VIA,1159ymous_ ++B 3400,36000,300,300,CONT_VIA2,674nymous_ ++B 36800,7000,300,300,CONT_BODY_P,728nymous_ ++B 37200,37600,300,300,CONT_BODY_N,782nymous_ ++B 4400,33000,300,300,CONT_DIF_N,836nymous_ ++B 6600,36000,300,300,CONT_VIA2,890nymous_ ++B 8000,17000,300,300,CONT_VIA2,944nymous_ ++B 10800,35000,300,300,CONT_DIF_N,998nymous_ ++B 18800,9000,300,300,CONT_DIF_N,1212ymous_ ++B 26000,37600,300,300,CONT_BODY_N,406nymous_ ++B 31600,33000,300,300,CONT_VIA2,567nymous_ ++B 14000,31000,300,300,CONT_DIF_N,1052ymous_ ++B 8600,25000,300,300,CONT_VIA2,946nymous_ ++B 6800,37600,300,300,CONT_BODY_P,892nymous_ ++B 4400,34000,300,300,CONT_DIF_N,838nymous_ ++B 38000,28000,300,300,CONT_VIA2,784nymous_ ++B 36800,9000,300,300,CONT_BODY_P,730nymous_ ++B 17600,12800,300,300,CONT_DIF_P,1161ymous_ ++B 34400,6000,300,300,CONT_VIA,676nymous_ ++B 33200,6000,300,300,CONT_BODY_P,622nymous_ ++B 29600,12800,300,300,CONT_DIF_P,515nymous_ ++B 1600,23400,300,300,CONT_BODY_P,1107ymous_ ++B 14000,32000,300,300,CONT_DIF_N,1053ymous_ ++B 31600,34000,300,300,CONT_VIA2,568nymous_ ++B 26000,6000,300,300,CONT_BODY_P,407nymous_ ++B 28000,31200,300,300,CONT_DIF_P,461nymous_ ++B 18800,11800,300,300,CONT_DIF_P,1213ymous_ ++B 10800,36000,300,300,CONT_DIF_N,999nymous_ ++B 8600,24000,300,300,CONT_VIA2,945nymous_ ++B 6600,19200,300,300,CONT_BODY_P,891nymous_ ++B 4400,33000,300,300,CONT_VIA,837nymous_ ++B 38000,27000,300,300,CONT_VIA2,783nymous_ ++B 36800,8000,300,300,CONT_BODY_P,729nymous_ ++B 34400,6000,300,300,CONT_BODY_P,675nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pck_mpx.vbe b/alliance/src/cells/src/mpxlib/pck_mpx.vbe +new file mode 100644 +index 0000000..59f6ddd +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pck_mpx.vbe +@@ -0,0 +1,29 @@ ++ENTITY pck_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_pad : NATURAL := 1326; ++ CONSTANT tpll_pad : NATURAL := 1443; ++ CONSTANT rdown_pad : NATURAL := 58; ++ CONSTANT tphh_pad : NATURAL := 228; ++ CONSTANT rup_pad : NATURAL := 68 ++ ); ++ PORT ( ++ pad : in BIT; ++ ck : out BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pck_mpx; ++ ++ ++ARCHITECTURE behaviour_data_flow OF pck_mpx IS ++ ++BEGIN ++ ck <= pad; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pck_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pi_mpx.ap b/alliance/src/cells/src/mpxlib/pi_mpx.ap +new file mode 100644 +index 0000000..6650743 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pi_mpx.ap +@@ -0,0 +1,1547 @@ ++V ALLIANCE : 6 ++H pi_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 29000,35100,29000,39700,400,pad,UP,ALU1 ++S 29000,25900,29000,34900,400,pad,UP,ALU1 ++S 28600,33000,29000,33000,600,pad,RIGHT,POLY ++S 28600,31800,29000,31800,600,pad,RIGHT,POLY ++S 28600,30600,29000,30600,600,pad,RIGHT,POLY ++S 28600,25800,29000,25800,600,pad,RIGHT,POLY ++S 20000,48100,20000,71900,24400,pad,UP,CALU1 ++S 8000,0,8000,0,400,t,RIGHT,CALU5 ++S 8000,0,8000,0,400,t,RIGHT,CALU4 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 16800,33400,17200,33400,200,vdde,RIGHT,POLY ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 3600,22200,5200,22200,200,vdde,RIGHT,POLY ++S 25100,28800,27900,28800,400,vdde,RIGHT,ALU1 ++S 25100,26400,27900,26400,400,vdde,RIGHT,ALU1 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 6800,22200,8400,22200,200,vdde,RIGHT,POLY ++S 25100,21600,27900,21600,400,vdde,RIGHT,ALU1 ++S 24000,35800,24400,35800,600,vdde,RIGHT,POLY ++S 24000,34200,24400,34200,600,vdde,RIGHT,POLY ++S 16800,32200,17200,32200,200,vdde,RIGHT,POLY ++S 16800,35800,17200,35800,200,vdde,RIGHT,POLY ++S 16800,34600,17200,34600,200,vdde,RIGHT,POLY ++S 16800,29900,16800,38300,400,vdde,UP,ALU2 ++S 10500,21800,14300,21800,400,vdde,RIGHT,ALU2 ++S 25100,24000,27900,24000,400,vdde,RIGHT,ALU1 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 3100,16000,36900,16000,2400,vddi,RIGHT,ALU1 ++S 20000,9600,20000,11000,200,vddi,UP,POLY ++S 17800,22900,17800,31900,400,vsse,UP,ALU2 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 7600,22900,7600,37500,400,vsse,UP,ALU1 ++S 4400,22900,4400,37500,400,vsse,UP,ALU1 ++S 30400,36400,30400,36600,200,vsse,UP,POLY ++S 20800,22900,20800,37100,400,vsse,UP,ALU1 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 3100,6000,36900,6000,2400,vssi,RIGHT,ALU1 ++S 28800,9000,29000,9000,200,i,RIGHT,POLY ++S 27800,11800,28200,11800,200,i,RIGHT,POLY ++S 17500,22600,19100,22600,200,n6d,RIGHT,NTRANS ++S 28300,9000,28700,9000,400,91onymous_,RIGHT,ALU1 ++S 24900,31200,28100,31200,420,53onymous_,RIGHT,PDIF ++S 28300,10600,29500,10600,400,92onymous_,RIGHT,ALU1 ++S 20000,11100,20000,15900,400,12onymous_,UP,ALU1 ++S 28400,7500,28400,8100,620,93onymous_,UP,NDIF ++S 20000,12700,20000,17300,400,13onymous_,UP,ALU2 ++S 6200,10900,6200,14900,200,p18b,UP,PTRANS ++S 14600,11100,14600,13100,200,p17c,UP,PTRANS ++S 30800,10600,33800,10600,200,cnbb,RIGHT,POLY ++S 30800,8100,30800,12900,400,cnbb,UP,ALU1 ++S 6800,22500,6800,36700,200,n14c,UP,NTRANS ++S 14800,22500,14800,36700,200,n15d,UP,NTRANS ++S 35000,7300,35000,8300,200,n5b,UP,NTRANS ++S 35000,12700,35000,14700,200,p5b,UP,PTRANS ++S 27800,12500,27800,14500,200,p1,UP,PTRANS ++S 17700,29200,18900,29200,620,318nymous_,RIGHT,NDIF ++S 17700,30400,18900,30400,620,319nymous_,RIGHT,NDIF ++S 17700,31600,18900,31600,620,320nymous_,RIGHT,NDIF ++S 15600,22700,15600,36500,620,285nymous_,UP,NDIF ++S 24900,30000,28100,30000,420,52onymous_,RIGHT,PDIF ++S 20000,8100,20000,8500,400,11onymous_,UP,ALU1 ++S 10800,21800,10800,22200,600,249nymous_,UP,POLY ++S 10700,39600,35500,39600,2400,248nymous_,RIGHT,ALU1 ++S 7600,21800,7600,22200,600,211nymous_,UP,POLY ++S 31800,12000,31800,12200,200,127nymous_,UP,POLY ++S 20000,40100,20000,59900,4400,10onymous_,UP,ALU1 ++S 24900,28800,28100,28800,420,51onymous_,RIGHT,PDIF ++S 31600,20200,31600,20600,600,126nymous_,UP,POLY ++S 15300,18200,21300,18200,400,286nymous_,RIGHT,ALU2 ++S 17700,32800,18900,32800,620,321nymous_,RIGHT,NDIF ++S 7400,9600,7400,10600,200,210nymous_,UP,POLY ++S 35600,12900,35600,14500,620,169nymous_,UP,PDIF ++S 7300,21800,10100,21800,400,212nymous_,RIGHT,ALU2 ++S 31700,6000,37100,6000,400,128nymous_,RIGHT,ALU2 ++S 36000,20200,36000,20600,600,172nymous_,UP,POLY ++S 15800,23700,15800,32300,400,288nymous_,UP,ALU2 ++S 17700,35200,18900,35200,620,323nymous_,RIGHT,NDIF ++S 35300,17000,37100,17000,400,171nymous_,RIGHT,ALU2 ++S 15600,17900,15600,20500,400,287nymous_,UP,ALU2 ++S 17700,34000,18900,34000,620,322nymous_,RIGHT,NDIF ++S 35600,13100,35600,15900,400,170nymous_,UP,ALU1 ++S 31400,35300,31400,36100,200,p11,UP,PTRANS ++S 31400,20900,31400,34300,200,p14a,UP,PTRANS ++S 24900,35000,28100,35000,820,56onymous_,RIGHT,PDIF ++S 7600,22700,7600,38300,2400,215nymous_,UP,ALU2 ++S 1700,37600,9500,37600,400,290nymous_,RIGHT,ALU1 ++S 24900,33600,28100,33600,420,55onymous_,RIGHT,PDIF ++S 7600,22900,7600,37500,400,214nymous_,UP,ALU1 ++S 31700,7600,37100,7600,1200,130nymous_,RIGHT,ALU2 ++S 17700,36400,18900,36400,620,324nymous_,RIGHT,NDIF ++S 32000,7500,32000,8100,620,129nymous_,UP,NDIF ++S 15800,9600,15800,10800,200,289nymous_,UP,POLY ++S 7600,22700,7600,36500,620,213nymous_,UP,NDIF ++S 17700,8000,22300,8000,400,325nymous_,RIGHT,ALU1 ++S 3600,22200,5200,22200,200,173nymous_,RIGHT,POLY ++S 10800,22700,10800,36500,620,250nymous_,UP,NDIF ++S 24900,32400,28100,32400,420,54onymous_,RIGHT,PDIF ++S 28500,8000,30700,8000,400,94onymous_,RIGHT,ALU1 ++S 24900,36400,28100,36400,620,57onymous_,RIGHT,PDIF ++S 20800,19300,20800,37500,400,14onymous_,UP,ALU1 ++S 24800,7500,24800,8100,620,58onymous_,UP,NDIF ++S 20800,19080,20800,37720,600,15onymous_,UP,PTIE ++S 21000,13100,21000,13900,400,16onymous_,UP,ALU1 ++S 21100,13000,22300,13000,400,17onymous_,RIGHT,ALU1 ++S 24800,13100,24800,14500,620,60onymous_,UP,PDIF ++S 8000,7500,8000,9100,420,217nymous_,UP,NDIF ++S 11600,6100,11600,8900,400,253nymous_,UP,ALU1 ++S 28700,24600,30300,24600,400,97onymous_,RIGHT,ALU2 ++S 1600,19080,1600,37720,600,294nymous_,UP,PTIE ++S 36800,6100,36800,9100,400,177nymous_,UP,ALU1 ++S 24800,8100,24800,13900,400,59onymous_,UP,ALU1 ++S 28400,14100,28400,15900,400,96onymous_,UP,ALU1 ++S 1600,19300,1600,37500,400,293nymous_,UP,ALU1 ++S 36800,5880,36800,8720,600,176nymous_,UP,PTIE ++S 28400,12700,28400,14300,620,95onymous_,UP,PDIF ++S 1480,19200,20920,19200,600,292nymous_,RIGHT,PTIE ++S 17700,12800,18300,12800,400,329nymous_,RIGHT,ALU1 ++S 36700,37600,38100,37600,400,175nymous_,RIGHT,ALU1 ++S 3200,5880,3200,8720,600,133nymous_,UP,PTIE ++S 11000,9600,11000,10600,200,252nymous_,UP,POLY ++S 8000,-100,8000,11300,400,216nymous_,UP,ALU2 ++S 1700,19200,20700,19200,400,291nymous_,RIGHT,ALU1 ++S 2900,20600,15500,20600,400,pad2,RIGHT,ALU1 ++S 2700,20600,15700,20600,400,pad2,RIGHT,ALU1 ++S 21000,12700,21000,18500,400,pad2,UP,ALU2 ++S 20000,8500,20000,9100,620,pad2,UP,NDIF ++S 17600,8100,17600,8500,400,326nymous_,UP,ALU1 ++S 3480,16000,36920,16000,600,174nymous_,RIGHT,NTIE ++S 10800,22900,10800,39700,400,251nymous_,UP,ALU1 ++S 32000,8100,32000,12900,400,131nymous_,UP,ALU1 ++S 7400,10900,7400,14900,200,p18c,UP,PTRANS ++S 7400,7300,7400,9300,200,n18c,UP,NTRANS ++S 25400,8600,25400,12400,200,62onymous_,UP,POLY ++S 25100,35000,29100,35000,400,61onymous_,RIGHT,ALU1 ++S 21200,9100,21200,9900,400,19onymous_,UP,ALU1 ++S 21200,8500,21200,9100,420,18onymous_,UP,NDIF ++S 17600,12500,17600,12900,620,328nymous_,UP,PDIF ++S 32000,12900,32000,14500,620,132nymous_,UP,PDIF ++S 17600,8500,17600,9100,620,327nymous_,UP,NDIF ++S 26000,30900,26000,37100,400,65onymous_,UP,ALU2 ++S 26000,23700,26000,29100,400,64onymous_,UP,ALU2 ++S 26000,21300,26000,24300,400,63onymous_,UP,ALU2 ++S 2900,10000,6300,10000,2400,137nymous_,RIGHT,ALU2 ++S 11600,7500,11600,9100,420,254nymous_,UP,NDIF ++S 8000,8100,8000,8900,400,218nymous_,UP,ALU1 ++S 17900,24400,18700,24400,400,332nymous_,RIGHT,ALU1 ++S 16400,29900,16400,32300,400,295nymous_,UP,ALU2 ++S 36800,6900,36800,17300,400,178nymous_,UP,ALU2 ++S 2900,6000,7100,6000,400,136nymous_,RIGHT,ALU2 ++S 17900,23200,18700,23200,400,331nymous_,RIGHT,ALU1 ++S 3200,5700,3200,16100,400,135nymous_,UP,ALU2 ++S 17900,22000,18700,22000,400,330nymous_,RIGHT,ALU1 ++S 3200,6100,3200,9100,400,134nymous_,UP,ALU1 ++S 20600,8300,20600,9300,200,n16c,UP,NTRANS ++S 3600,22500,3600,36700,200,n14a,UP,NTRANS ++S 15800,7300,15800,9300,200,n17d,UP,NTRANS ++S 15800,11100,15800,13100,200,p17d,UP,PTRANS ++S 36800,11100,36800,15900,400,179nymous_,UP,ALU1 ++S 8000,11100,8000,13700,400,219nymous_,UP,ALU1 ++S 17900,25600,18700,25600,400,333nymous_,RIGHT,ALU1 ++S 11600,11100,11600,14700,620,255nymous_,UP,PDIF ++S 36800,10880,36800,16120,600,180nymous_,UP,NTIE ++S 8000,11100,8000,14700,620,220nymous_,UP,PDIF ++S 11600,11900,11600,15900,400,256nymous_,UP,ALU1 ++S 900,37000,8900,37000,2400,257nymous_,RIGHT,ALU2 ++S 29000,8600,29000,9000,200,98onymous_,UP,POLY ++S 22000,21900,22000,28500,400,20onymous_,UP,ALU2 ++S 29000,11400,29000,12200,200,99onymous_,UP,POLY ++S 22000,17900,22000,19500,400,21onymous_,UP,ALU2 ++S 29000,11400,32600,11400,200,100nymous_,RIGHT,POLY ++S 28700,18200,34700,18200,400,101nymous_,RIGHT,ALU2 ++S 11000,7300,11000,9300,200,n18f,UP,NTRANS ++S 36200,20900,36200,36700,200,p14d,UP,PTRANS ++S 16400,6100,16400,8900,400,296nymous_,UP,ALU1 ++S 3200,11100,3200,15900,400,138nymous_,UP,ALU1 ++S 25100,37000,27900,37000,1600,fbul,RIGHT,ALU1 ++S 25100,25200,27900,25200,400,fbul,RIGHT,ALU1 ++S 16400,7500,16400,9100,620,297nymous_,UP,NDIF ++S 17900,26800,18700,26800,400,334nymous_,RIGHT,ALU1 ++S 3200,10880,3200,16120,600,139nymous_,UP,NTIE ++S 37000,21100,37000,36500,620,181nymous_,UP,PDIF ++S 16400,11300,16400,12900,620,298nymous_,UP,PDIF ++S 17900,28000,18700,28000,400,335nymous_,RIGHT,ALU1 ++S 2900,15400,19300,15400,1200,140nymous_,RIGHT,ALU2 ++S 37000,21300,37000,36300,400,182nymous_,UP,ALU1 ++S 16400,12100,16400,15900,400,299nymous_,UP,ALU1 ++S 17900,30400,18700,30400,400,336nymous_,RIGHT,ALU1 ++S 900,19000,9300,19000,2400,258nymous_,RIGHT,ALU2 ++S 2900,17000,19100,17000,400,141nymous_,RIGHT,ALU2 ++S 37000,17700,37000,38300,2400,183nymous_,UP,ALU2 ++S 8600,9600,8600,10600,200,221nymous_,UP,POLY ++S 17900,31600,18700,31600,400,337nymous_,RIGHT,ALU1 ++S 21700,18200,25100,18200,400,22onymous_,RIGHT,ALU2 ++S 9200,20700,9200,36300,400,222nymous_,UP,ALU1 ++S 22000,19300,22000,22100,400,23onymous_,UP,ALU1 ++S 29000,18300,29000,19500,400,102nymous_,UP,ALU2 ++S 22400,8100,22400,8500,400,24onymous_,UP,ALU1 ++S 11000,10900,11000,14900,200,p18f,UP,PTRANS ++S 11600,22500,11600,36700,200,n15b,UP,NTRANS ++S 13200,22200,14800,22200,200,cn,RIGHT,POLY ++S 10000,22200,11600,22200,200,cn,RIGHT,POLY ++S 4100,21800,7900,21800,400,cn,RIGHT,ALU2 ++S 25100,22800,27900,22800,400,cn,RIGHT,ALU1 ++S 25100,20400,27900,20400,400,cn,RIGHT,ALU1 ++S 25000,20100,25000,23100,400,cn,UP,ALU2 ++S 29300,37000,31900,37000,2400,103nymous_,RIGHT,ALU2 ++S 22400,8500,22400,9100,620,25onymous_,UP,NDIF ++S 26000,6100,26000,7900,400,66onymous_,UP,ALU1 ++S 26000,7500,26000,8100,620,67onymous_,UP,NDIF ++S 12400,22700,12400,36500,620,261nymous_,UP,NDIF ++S 9200,6100,9200,7900,400,225nymous_,UP,ALU1 ++S 32600,11400,32600,12400,200,145nymous_,UP,POLY ++S 12400,20700,12400,36300,400,260nymous_,UP,ALU1 ++S 8900,6000,26300,6000,400,224nymous_,RIGHT,ALU2 ++S 1800,17700,1800,38300,1600,340nymous_,UP,ALU2 ++S 4400,21800,4400,22200,600,187nymous_,UP,POLY ++S 32600,8600,32600,9800,200,144nymous_,UP,POLY ++S 9200,22700,9200,36500,620,223nymous_,UP,NDIF ++S 16800,20900,16800,24700,400,303nymous_,UP,ALU2 ++S 3900,7600,7300,7600,1200,186nymous_,RIGHT,ALU2 ++S 17900,36400,18700,36400,400,339nymous_,RIGHT,ALU1 ++S 16500,21200,25300,21200,400,302nymous_,RIGHT,ALU2 ++S 38200,19080,38200,37920,600,185nymous_,UP,NTIE ++S 32200,21300,32200,39700,400,143nymous_,UP,ALU1 ++S 12200,9600,12200,10800,200,259nymous_,UP,POLY ++S 17900,34000,18700,34000,400,338nymous_,RIGHT,ALU1 ++S 16800,20300,16800,23300,400,301nymous_,UP,ALU1 ++S 38200,19300,38200,37500,400,184nymous_,UP,ALU1 ++S 32200,21100,32200,36500,620,142nymous_,UP,PDIF ++S 19500,36800,26300,36800,400,node_cp,RIGHT,ALU2 ++S 17900,35200,19700,35200,400,node_cp,RIGHT,ALU1 ++S 17900,32800,19700,32800,400,node_cp,RIGHT,ALU1 ++S 34600,20600,36200,20600,200,node_cp,RIGHT,POLY ++S 31400,20600,33000,20600,200,node_cp,RIGHT,POLY ++S 28600,24600,29000,24600,600,node_cp,RIGHT,POLY ++S 27700,24600,29300,24600,400,node_cp,RIGHT,ALU2 ++S 28000,24300,28000,31500,400,node_cp,UP,ALU2 ++S 25100,33600,27900,33600,400,node_cp,RIGHT,ALU1 ++S 25100,31200,27900,31200,400,node_cp,RIGHT,ALU1 ++S 16500,20200,24300,20200,400,300nymous_,RIGHT,ALU2 ++S 21800,8300,21800,9300,200,n16d,UP,NTRANS ++S 18500,31600,25300,31600,400,cpd,RIGHT,ALU2 ++S 18800,21900,18800,36700,400,cpd,UP,ALU2 ++S 25100,32400,27900,32400,400,cpd,RIGHT,ALU1 ++S 25100,30000,27900,30000,400,cpd,RIGHT,ALU1 ++S 25100,27600,27900,27600,400,cpd,RIGHT,ALU1 ++S 25000,27300,25000,32700,400,cpd,UP,ALU2 ++S 29000,7300,29000,8300,200,n1,UP,NTRANS ++S 9200,5700,9200,11300,400,226nymous_,UP,ALU2 ++S 12400,18500,12400,22100,2400,262nymous_,UP,ALU2 ++S 29480,37600,38520,37600,600,104nymous_,RIGHT,NTIE ++S 22400,8700,22400,12900,400,26onymous_,UP,ALU1 ++S 29600,7100,29600,8100,620,105nymous_,UP,NDIF ++S 22100,17000,23700,17000,400,27onymous_,RIGHT,ALU2 ++S 23100,37600,27700,37600,400,28onymous_,RIGHT,ALU1 ++S 16800,24100,16800,29500,400,305nymous_,UP,ALU2 ++S 4400,22700,4400,36500,620,188nymous_,UP,NDIF ++S 19500,28200,24300,28200,400,cpb,RIGHT,ALU2 ++S 19400,27400,19800,27400,200,cpb,RIGHT,POLY ++S 19400,26200,19800,26200,200,cpb,RIGHT,POLY ++S 24000,29200,24400,29200,600,cpb,RIGHT,POLY ++S 24000,28200,24400,28200,600,cpb,RIGHT,POLY ++S 19800,22700,19800,30900,400,cpb,UP,ALU1 ++S 19400,31000,19800,31000,200,cpb,RIGHT,POLY ++S 19400,22600,19800,22600,200,cpb,RIGHT,POLY ++S 24800,12700,24800,18500,400,cpb,UP,ALU2 ++S 24000,27000,24400,27000,600,cpb,RIGHT,POLY ++S 16800,23200,16800,25400,600,304nymous_,UP,POLY ++S 25400,7300,25400,8300,200,n4b,UP,NTRANS ++S 29000,12500,29000,14500,200,p2,UP,PTRANS ++S 8600,10900,8600,14900,200,p18d,UP,PTRANS ++S 12200,7300,12200,9300,200,n17a,UP,NTRANS ++S 8600,7300,8600,9300,200,n18d,UP,NTRANS ++S 8400,22500,8400,36700,200,n14d,UP,NTRANS ++S 18200,9600,21800,9600,200,341nymous_,RIGHT,POLY ++S 4400,22900,4400,37500,400,189nymous_,UP,ALU1 ++S 16900,24400,17700,24400,400,306nymous_,RIGHT,ALU1 ++S 32800,20200,32800,20600,600,146nymous_,UP,POLY ++S 18400,10100,18400,12700,400,342nymous_,UP,ALU1 ++S 16800,25500,16800,28100,400,307nymous_,UP,ALU1 ++S 9200,7500,9200,9100,620,227nymous_,UP,NDIF ++S 12800,7500,12800,9100,620,263nymous_,UP,NDIF ++S 4400,22700,4400,38300,2400,190nymous_,UP,ALU2 ++S 18800,8500,18800,9100,420,343nymous_,UP,NDIF ++S 12800,8100,12800,12500,400,264nymous_,UP,ALU1 ++S 33200,6100,33200,7900,400,147nymous_,UP,ALU1 ++S 29600,9800,29600,11400,200,106nymous_,UP,POLY ++S 12900,9000,15100,9000,400,265nymous_,RIGHT,ALU1 ++S 33200,7500,33200,8100,620,148nymous_,UP,NDIF ++S 18800,9100,18800,9900,400,344nymous_,UP,ALU1 ++S 29600,12700,29600,14300,620,107nymous_,UP,PDIF ++S 23000,11700,23000,17300,2000,29onymous_,UP,ALU2 ++S 33200,12900,33200,14500,620,149nymous_,UP,PDIF ++S 23000,19300,23000,37500,400,30onymous_,UP,ALU1 ++S 23000,19080,23000,37920,600,31onymous_,UP,NTIE ++S 26000,8700,26000,14300,400,68onymous_,UP,ALU2 ++S 24900,21600,28100,21600,420,45onymous_,RIGHT,PDIF ++S 24900,20400,28100,20400,620,44onymous_,RIGHT,PDIF ++S 17400,11100,17400,11700,400,310nymous_,UP,ALU1 ++S 17400,11800,17400,12000,200,311nymous_,UP,POLY ++S 18200,8300,18200,9300,200,n16a,UP,NTRANS ++S 12200,11100,12200,13100,200,p17a,UP,PTRANS ++S 32600,7300,32600,8300,200,n0,UP,NTRANS ++S 12200,10000,16400,10000,600,nnt,RIGHT,POLY ++S 27200,8100,27200,12900,400,cpbb,UP,ALU1 ++S 25400,10600,27200,10600,200,cpbb,RIGHT,POLY ++S 25400,12700,25400,14700,200,p4b,UP,PTRANS ++S 8900,10000,26300,10000,2400,228nymous_,RIGHT,ALU2 ++S 4400,6100,4400,8900,400,191nymous_,UP,ALU1 ++S 16800,28200,16800,29800,600,308nymous_,UP,POLY ++S 9200,11100,9200,14700,620,229nymous_,UP,PDIF ++S 16900,29200,18700,29200,400,309nymous_,RIGHT,ALU1 ++S 4400,7500,4400,9100,620,192nymous_,UP,NDIF ++S 9200,12100,9200,15900,400,230nymous_,UP,ALU1 ++S 12900,11000,17300,11000,400,266nymous_,RIGHT,ALU1 ++S 4400,11100,4400,14700,620,193nymous_,UP,PDIF ++S 18500,17000,20300,17000,400,345nymous_,RIGHT,ALU2 ++S 29600,13100,29600,13900,400,108nymous_,UP,ALU1 ++S 4400,11900,4400,15900,400,194nymous_,UP,ALU1 ++S 33200,13100,33200,15900,400,150nymous_,UP,ALU1 ++S 30000,19900,30000,24900,400,109nymous_,UP,ALU2 ++S 33400,11700,33400,17300,400,151nymous_,UP,ALU2 ++S 30100,20200,35900,20200,400,110nymous_,RIGHT,ALU1 ++S 23100,19200,38100,19200,400,32onymous_,RIGHT,ALU1 ++S 19800,32900,19800,35100,400,346nymous_,UP,ALU1 ++S 26000,12900,26000,14500,620,69onymous_,UP,PDIF ++S 22880,19200,38320,19200,600,33onymous_,RIGHT,NTIE ++S 26000,13100,26000,15900,400,70onymous_,UP,ALU1 ++S 23080,37600,29920,37600,600,34onymous_,RIGHT,NTIE ++S 24900,25200,28100,25200,420,48onymous_,RIGHT,PDIF ++S 24900,24000,28100,24000,420,47onymous_,RIGHT,PDIF ++S 24900,22800,28100,22800,420,46onymous_,RIGHT,PDIF ++S 17700,23200,18900,23200,620,313nymous_,RIGHT,NDIF ++S 17700,22000,18900,22000,620,312nymous_,RIGHT,NDIF ++S 32600,12700,32600,14700,200,p0,UP,PTRANS ++S 33000,20900,33000,36700,200,p14b,UP,PTRANS ++S 9300,25000,16100,25000,2400,231nymous_,RIGHT,ALU2 ++S 12800,11300,12800,12900,620,267nymous_,UP,PDIF ++S 9300,31000,16100,31000,2400,232nymous_,RIGHT,ALU2 ++S 4100,13000,20300,13000,2400,195nymous_,RIGHT,ALU2 ++S 9800,21500,9800,23100,400,233nymous_,UP,ALU2 ++S 33800,21100,33800,36500,620,152nymous_,UP,PDIF ++S 5000,9600,5000,10600,200,196nymous_,UP,POLY ++S 9500,22800,17100,22800,400,234nymous_,RIGHT,ALU2 ++S 13400,9600,13400,10800,200,268nymous_,UP,POLY ++S 30200,8600,30200,9000,200,111nymous_,UP,POLY ++S 19800,34900,19800,37100,400,347nymous_,UP,ALU2 ++S 26000,13700,26000,16100,400,71onymous_,UP,ALU2 ++S 23600,6100,23600,7900,400,35onymous_,UP,ALU1 ++S 14000,21800,14000,22200,600,269nymous_,UP,POLY ++S 30200,12000,30200,12200,200,112nymous_,UP,POLY ++S 25700,15400,32500,15400,1200,72onymous_,RIGHT,ALU2 ++S 23600,7500,23600,8100,620,36onymous_,UP,NDIF ++S 14000,22700,14000,36500,620,270nymous_,UP,NDIF ++S 25700,17000,33500,17000,400,73onymous_,RIGHT,ALU2 ++S 23600,12900,23600,14500,620,37onymous_,UP,PDIF ++S 5600,7500,5600,9100,420,197nymous_,UP,NDIF ++S 30400,36400,30400,36600,200,113nymous_,UP,POLY ++S 30600,21100,30600,35900,620,114nymous_,UP,PDIF ++S 24000,18900,24000,20500,400,41onymous_,UP,ALU2 ++S 27000,6900,27000,14300,400,77onymous_,UP,ALU2 ++S 5700,11000,10300,11000,400,200nymous_,RIGHT,ALU1 ++S 30600,21300,30600,35500,400,115nymous_,UP,ALU1 ++S 9700,19000,14900,19000,2400,238nymous_,RIGHT,ALU2 ++S 24900,26400,28100,26400,420,49onymous_,RIGHT,PDIF ++S 17700,25600,18900,25600,620,315nymous_,RIGHT,NDIF ++S 17700,24400,18900,24400,620,314nymous_,RIGHT,NDIF ++S 24200,7300,24200,8300,200,n4a,UP,NTRANS ++S 16800,29800,17200,29800,200,cnb,RIGHT,POLY ++S 16800,28600,17200,28600,200,cnb,RIGHT,POLY ++S 16800,25000,17200,25000,200,cnb,RIGHT,POLY ++S 16800,23800,17200,23800,200,cnb,RIGHT,POLY ++S 34400,12700,34400,18500,400,cnb,UP,ALU2 ++S 29000,17900,29000,23700,400,cnb,UP,ALU2 ++S 28600,23400,29000,23400,600,cnb,RIGHT,POLY ++S 28600,22200,29000,22200,600,cnb,RIGHT,POLY ++S 28600,21000,29000,21000,600,cnb,RIGHT,POLY ++S 23700,19200,29300,19200,400,cnb,RIGHT,ALU2 ++S 17000,12300,17000,13100,200,p16,UP,PTRANS ++S 19400,8300,19400,9300,200,n16b,UP,NTRANS ++S 33800,21300,33800,36300,400,153nymous_,UP,ALU1 ++S 9500,37000,17100,37000,2400,235nymous_,RIGHT,ALU2 ++S 33800,8600,33800,12400,200,154nymous_,UP,POLY ++S 9800,9600,9800,10600,200,236nymous_,UP,POLY ++S 33800,8600,35000,8600,200,155nymous_,RIGHT,POLY ++S 14000,22900,14000,39700,400,271nymous_,UP,ALU1 ++S 2700,20200,15700,20200,400,74onymous_,RIGHT,ALU1 ++S 23600,13100,23600,15900,400,38onymous_,UP,ALU1 ++S 33800,12400,35000,12400,200,156nymous_,RIGHT,POLY ++S 14000,6100,14000,7900,400,272nymous_,UP,ALU1 ++S 10000,22200,11600,22200,200,237nymous_,RIGHT,POLY ++S 26400,18600,26400,38600,8400,75onymous_,UP,NWELL ++S 24000,27100,24000,29100,400,39onymous_,UP,ALU1 ++S 5700,9000,10300,9000,400,198nymous_,RIGHT,ALU1 ++S 14000,7500,14000,9100,620,273nymous_,UP,NDIF ++S 24000,33900,24000,36100,400,40onymous_,UP,ALU2 ++S 5600,11100,5600,14700,620,199nymous_,UP,PDIF ++S 27000,24900,27000,36700,400,76onymous_,UP,ALU2 ++S 6000,22700,6000,36500,620,202nymous_,UP,NDIF ++S 30600,36400,31400,36400,200,117nymous_,RIGHT,POLY ++S 26700,13000,33700,13000,2400,78onymous_,RIGHT,ALU2 ++S 6000,20700,6000,36300,400,201nymous_,UP,ALU1 ++S 30600,26700,30600,35300,2400,116nymous_,UP,ALU2 ++S 700,25000,8900,25000,2400,239nymous_,RIGHT,ALU2 ++S 3280,6000,28520,6000,600,159nymous_,RIGHT,PTIE ++S 34000,18200,34000,38200,10400,158nymous_,UP,NWELL ++S 14100,10000,21100,10000,400,274nymous_,RIGHT,ALU1 ++S 33800,19100,33800,38300,2400,157nymous_,UP,ALU2 ++S 24700,22200,28300,22200,200,p7b,RIGHT,PTRANS ++S 24700,21000,28300,21000,200,p7c,RIGHT,PTRANS ++S 24200,12400,25400,12400,200,43onymous_,RIGHT,POLY ++S 24200,12700,24200,14700,200,p4a,UP,PTRANS ++S 17500,25000,19100,25000,200,n7c,RIGHT,NTRANS ++S 33800,7300,33800,8300,200,n5a,UP,NTRANS ++S 13400,11100,13400,13100,200,p17b,UP,PTRANS ++S 17000,12000,17400,12000,200,nt,RIGHT,POLY ++S 5000,10000,11000,10000,600,nt,RIGHT,POLY ++S 17500,23800,19100,23800,200,n7d,RIGHT,NTRANS ++S 30200,7300,30200,8300,200,n3,UP,NTRANS ++S 5000,7300,5000,9300,200,n18a,UP,NTRANS ++S 13400,7300,13400,9300,200,n17b,UP,NTRANS ++S 13200,22500,13200,36700,200,n15c,UP,NTRANS ++S 27200,7500,27200,8100,620,79onymous_,UP,NDIF ++S 700,28000,15100,28000,2400,240nymous_,RIGHT,ALU2 ++S 27200,12700,27200,14300,620,80onymous_,UP,PDIF ++S 24200,8600,25400,8600,200,42onymous_,RIGHT,POLY ++S 700,31000,8900,31000,2400,241nymous_,RIGHT,ALU2 ++S 27200,13100,27200,13900,400,81onymous_,UP,ALU1 ++S 24900,27600,28100,27600,420,50onymous_,RIGHT,PDIF ++S 14000,12100,14000,15900,400,276nymous_,UP,ALU1 ++S 34400,7500,34400,8100,620,160nymous_,UP,NDIF ++S 24700,27000,28300,27000,200,p6c,RIGHT,PTRANS ++S 14000,11300,14000,12900,620,275nymous_,UP,PDIF ++S 24700,25800,28300,25800,200,p13,RIGHT,PTRANS ++S 24700,24600,28300,24600,200,p10,RIGHT,PTRANS ++S 24700,23400,28300,23400,200,p7a,RIGHT,PTRANS ++S 17500,29800,19100,29800,200,n7a,RIGHT,NTRANS ++S 5600,8100,5600,13700,400,1.nq,UP,ALU1 ++S 10000,22500,10000,36700,200,n15a,UP,NTRANS ++S 17500,28600,19100,28600,200,n7b,RIGHT,NTRANS ++S 33800,12700,33800,14700,200,p5a,UP,PTRANS ++S 30200,12500,30200,14500,200,p3,UP,PTRANS ++S 9800,10900,9800,14900,200,p18e,UP,PTRANS ++S 17500,27400,19100,27400,200,n6b,RIGHT,NTRANS ++S 5200,22500,5200,36700,200,n14b,UP,NTRANS ++S 17500,26200,19100,26200,200,n6c,RIGHT,NTRANS ++S 9800,7300,9800,9300,200,n18e,UP,NTRANS ++S 5000,10900,5000,14900,200,p18a,UP,PTRANS ++S 30200,12000,31800,12000,200,eb,RIGHT,POLY ++S 30200,9000,31800,9000,200,eb,RIGHT,POLY ++S 34400,8100,34400,13900,400,161nymous_,UP,ALU1 ++S 1280,37600,21120,37600,600,277nymous_,RIGHT,PTIE ++S 30680,6000,37120,6000,600,118nymous_,RIGHT,PTIE ++S 34400,13100,34400,14500,620,162nymous_,UP,PDIF ++S 6200,9600,6200,10600,200,203nymous_,UP,POLY ++S 9200,6000,39950,6000,12000,0nonymous_,RIGHT,TALU2 ++S 27300,13000,29500,13000,400,82onymous_,RIGHT,ALU1 ++S 700,34000,16100,34000,2400,242nymous_,RIGHT,ALU2 ++S 50,6000,6800,6000,12000,1nonymous_,RIGHT,TALU2 ++S 27800,8600,27800,9800,200,83onymous_,UP,POLY ++S 9200,6000,39950,6000,12000,2nonymous_,RIGHT,TALU4 ++S 27800,9800,32600,9800,200,84onymous_,RIGHT,POLY ++S 24700,28200,28300,28200,200,p6b,RIGHT,PTRANS ++S 17500,34600,19100,34600,200,n8b,RIGHT,NTRANS ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 17500,33400,19100,33400,200,n8c,RIGHT,NTRANS ++S 17500,32200,19100,32200,200,n8d,RIGHT,NTRANS ++S 17500,31000,19100,31000,200,n6a,RIGHT,NTRANS ++S 24700,29400,28300,29400,200,p6a,RIGHT,PTRANS ++S 24700,30600,28300,30600,200,p8c,RIGHT,PTRANS ++S 14600,9600,14600,10800,200,278nymous_,UP,POLY ++S 30800,7500,30800,8100,620,119nymous_,UP,NDIF ++S 34800,20200,34800,20600,600,163nymous_,UP,POLY ++S 30800,12700,30800,14300,620,120nymous_,UP,PDIF ++S 6800,6100,6800,7900,400,204nymous_,UP,ALU1 ++S 10400,7500,10400,9100,420,243nymous_,UP,NDIF ++S 15300,37600,20700,37600,400,279nymous_,RIGHT,ALU1 ++S 30800,13100,30800,13900,400,121nymous_,UP,ALU1 ++S 6800,7500,6800,9100,620,205nymous_,UP,NDIF ++S 15200,7500,15200,9100,620,280nymous_,UP,NDIF ++S 50,6000,6800,6000,12000,3nonymous_,RIGHT,TALU4 ++S 35400,21100,35400,36500,620,164nymous_,UP,PDIF ++S 6900,10000,12700,10000,400,206nymous_,RIGHT,ALU1 ++S 15200,8100,15200,8900,400,281nymous_,UP,ALU1 ++S 27800,11800,27800,12400,200,85onymous_,UP,POLY ++S 0,6000,40000,6000,12000,4nonymous_,RIGHT,TALU6 ++S 35400,21300,35400,39700,400,165nymous_,UP,ALU1 ++S 6800,11100,6800,14700,620,207nymous_,UP,PDIF ++S 24600,200,24600,2000,31000,5nonymous_,UP,TALU3 ++S 10100,7600,27300,7600,1200,244nymous_,RIGHT,ALU2 ++S 2800,20500,2800,36300,400,86onymous_,UP,ALU1 ++S 10400,8100,10400,8900,400,245nymous_,UP,ALU1 ++S 2800,22700,2800,36500,620,87onymous_,UP,NDIF ++S 2200,13600,37800,13600,6800,88onymous_,RIGHT,NWELL ++S 28200,9100,28200,11700,400,90onymous_,UP,ALU1 ++S 17500,35800,19100,35800,200,n8a,RIGHT,NTRANS ++S 6200,7300,6200,9300,200,n18b,UP,NTRANS ++S 14600,7300,14600,9300,200,n17c,UP,NTRANS ++S 34600,20900,34600,36700,200,p14c,UP,PTRANS ++S 24700,31800,28300,31800,200,p8b,RIGHT,PTRANS ++S 24700,33000,28300,33000,200,p8a,RIGHT,PTRANS ++S 27800,7300,27800,8300,200,n2,UP,NTRANS ++S 24700,34200,28300,34200,200,p9,RIGHT,PTRANS ++S 24700,35800,28300,35800,200,p12,RIGHT,PTRANS ++S 31000,5700,31000,11300,400,122nymous_,UP,ALU2 ++S 17700,26800,18900,26800,620,316nymous_,RIGHT,NDIF ++S 30700,6000,32300,6000,400,123nymous_,RIGHT,ALU2 ++S 15200,11100,15200,12500,400,282nymous_,UP,ALU1 ++S 17700,28000,18900,28000,620,317nymous_,RIGHT,NDIF ++S 30700,10000,36100,10000,2400,124nymous_,RIGHT,ALU2 ++S 35100,13000,37100,13000,2400,166nymous_,RIGHT,ALU2 ++S 15200,11300,15200,12900,620,283nymous_,UP,PDIF ++S 6800,12100,6800,15900,400,208nymous_,UP,ALU1 ++S 3400,200,3400,2000,7000,6nonymous_,UP,TALU3 ++S 35600,6100,35600,7900,400,167nymous_,UP,ALU1 ++S 15600,20700,15600,36300,400,284nymous_,UP,ALU1 ++S 7000,6900,7000,14300,400,209nymous_,UP,ALU2 ++S 24600,200,24600,12000,31000,7nonymous_,UP,TALU5 ++S 35600,7500,35600,8100,620,168nymous_,UP,NDIF ++S 3400,200,3400,12000,7000,8nonymous_,UP,TALU5 ++S 31400,19100,31400,28300,400,125nymous_,UP,ALU2 ++S 10400,11100,10400,13700,400,246nymous_,UP,ALU1 ++S 20000,40100,20000,59900,4400,9nonymous_,UP,ALU1 ++S 10400,11100,10400,14700,620,247nymous_,UP,PDIF ++S 28200,6300,28200,10900,400,89onymous_,UP,ALU2 ++B 22400,8000,200,200,CONT_TURN1,349nymous_ ++B 21200,10000,200,200,CONT_TURN1,348nymous_ ++B 28200,9000,200,200,CONT_TURN1,351nymous_ ++B 22400,13000,200,200,CONT_TURN1,350nymous_ ++B 5000,19000,8300,2300,CONT_VIA2,352nymous_ ++B 10400,11000,200,200,CONT_TURN1,353nymous_ ++B 16400,9000,300,300,CONT_DIF_N,1268ymous_ ++B 15200,6000,300,300,CONT_BODY_P,1214ymous_ ++B 6800,37600,300,300,CONT_BODY_P,1000ymous_ ++B 7600,36000,300,300,CONT_VIA,1054ymous_ ++B 17800,36400,300,300,CONT_DIF_N,1322ymous_ ++B 23000,28400,300,300,CONT_BODY_N,408nymous_ ++B 28200,6600,300,300,CONT_VIA,569nymous_ ++B 9200,12800,300,300,CONT_DIF_P,1108ymous_ ++B 12400,26000,300,300,CONT_DIF_N,1162ymous_ ++B 27000,27600,300,300,CONT_DIF_P,516nymous_ ++B 25000,32400,300,300,CONT_DIF_P,462nymous_ ++B 30600,31000,300,300,CONT_DIF_P,623nymous_ ++B 3200,14000,300,300,CONT_BODY_N,677nymous_ ++B 35400,25000,300,300,CONT_DIF_P,785nymous_ ++B 37000,22000,300,300,CONT_VIA,839nymous_ ++B 38200,29400,300,300,CONT_BODY_N,893nymous_ ++B 4400,13800,300,300,CONT_DIF_P,947nymous_ ++B 16400,10000,300,300,CONT_POLY,1269ymous_ ++B 15200,6000,300,300,CONT_VIA,1215ymous_ ++B 6800,37600,300,300,CONT_VIA,1001ymous_ ++B 7600,36000,300,300,CONT_VIA2,1055ymous_ ++B 17800,37600,300,300,CONT_BODY_P,1323ymous_ ++B 23000,29400,300,300,CONT_BODY_N,409nymous_ ++B 28200,10600,300,300,CONT_VIA,570nymous_ ++B 9200,13800,300,300,CONT_DIF_P,1109ymous_ ++B 12400,27000,300,300,CONT_DIF_N,1163ymous_ ++B 27000,28800,300,300,CONT_DIF_P,517nymous_ ++B 25000,32400,300,300,CONT_VIA,463nymous_ ++B 30600,31000,300,300,CONT_VIA,624nymous_ ++B 3200,14000,300,300,CONT_VIA2,678nymous_ ++B 35400,26000,300,300,CONT_DIF_P,786nymous_ ++B 33800,28000,300,300,CONT_DIF_P,732nymous_ ++B 37000,22000,300,300,CONT_VIA2,840nymous_ ++B 28000,20400,300,300,CONT_DIF_P,540nymous_ ++B 38200,30400,300,300,CONT_BODY_N,894nymous_ ++B 4400,14800,300,300,CONT_DIF_P,948nymous_ ++B 6800,37600,300,300,CONT_VIA2,1002ymous_ ++B 16400,12000,300,300,CONT_DIF_P,1270ymous_ ++B 15200,6000,300,300,CONT_VIA2,1216ymous_ ++B 17800,22000,200,200,CONT_TURN1,356nymous_ ++B 7600,19200,300,300,CONT_BODY_P,1056ymous_ ++B 9200,14800,300,300,CONT_DIF_P,1110ymous_ ++B 18600,19200,300,300,CONT_BODY_P,1324ymous_ ++B 25000,33600,300,300,CONT_DIF_P,464nymous_ ++B 23000,30400,300,300,CONT_BODY_N,410nymous_ ++B 28200,11800,300,300,CONT_POLY,571nymous_ ++B 30600,32000,300,300,CONT_DIF_P,625nymous_ ++B 12400,28000,300,300,CONT_DIF_N,1164ymous_ ++B 27000,30000,300,300,CONT_DIF_P,518nymous_ ++B 3200,15000,300,300,CONT_BODY_N,679nymous_ ++B 33800,28000,300,300,CONT_VIA,733nymous_ ++B 35400,27000,300,300,CONT_DIF_P,787nymous_ ++B 37000,23000,300,300,CONT_DIF_P,841nymous_ ++B 38200,31400,300,300,CONT_BODY_N,895nymous_ ++B 15200,8000,300,300,CONT_DIF_N,1217ymous_ ++B 4400,16000,300,300,CONT_BODY_N,949nymous_ ++B 6800,6000,300,300,CONT_BODY_P,1003ymous_ ++B 18800,22000,300,300,CONT_DIF_N,1325ymous_ ++B 16400,12800,300,300,CONT_DIF_P,1271ymous_ ++B 18400,12800,200,200,CONT_TURN1,357nymous_ ++B 7800,37600,300,300,CONT_BODY_P,1057ymous_ ++B 9200,16000,300,300,CONT_BODY_N,1111ymous_ ++B 23000,31400,300,300,CONT_BODY_N,411nymous_ ++B 28400,6000,300,300,CONT_BODY_P,572nymous_ ++B 12400,29000,300,300,CONT_DIF_N,1165ymous_ ++B 25000,35000,300,300,CONT_DIF_P,465nymous_ ++B 30600,32000,300,300,CONT_VIA,626nymous_ ++B 27000,31200,300,300,CONT_DIF_P,519nymous_ ++B 3200,16000,300,300,CONT_BODY_N,680nymous_ ++B 33800,28000,300,300,CONT_VIA2,734nymous_ ++B 35400,28000,300,300,CONT_DIF_P,788nymous_ ++B 37000,23000,300,300,CONT_VIA,842nymous_ ++B 38200,32400,300,300,CONT_BODY_N,896nymous_ ++B 4400,17000,300,300,CONT_VIA,950nymous_ ++B 15200,9000,300,300,CONT_DIF_N,1218ymous_ ++B 6800,6000,300,300,CONT_VIA,1004ymous_ ++B 7800,37600,300,300,CONT_VIA,1058ymous_ ++B 18800,22200,300,300,CONT_VIA,1326ymous_ ++B 16400,16000,300,300,CONT_BODY_N,1272ymous_ ++B 23000,32400,300,300,CONT_BODY_N,412nymous_ ++B 19800,32800,200,200,CONT_TURN1,358nymous_ ++B 28400,8000,300,300,CONT_DIF_N,573nymous_ ++B 9200,17000,300,300,CONT_VIA,1112ymous_ ++B 12400,30000,300,300,CONT_DIF_N,1166ymous_ ++B 27000,32400,300,300,CONT_DIF_P,520nymous_ ++B 25000,36400,300,300,CONT_DIF_P,466nymous_ ++B 30600,33000,300,300,CONT_DIF_P,627nymous_ ++B 3200,17000,300,300,CONT_VIA,681nymous_ ++B 33800,29000,300,300,CONT_DIF_P,735nymous_ ++B 35400,29000,300,300,CONT_DIF_P,789nymous_ ++B 37000,23000,300,300,CONT_VIA2,843nymous_ ++B 38200,33400,300,300,CONT_BODY_N,897nymous_ ++B 4400,17000,300,300,CONT_VIA2,951nymous_ ++B 16400,17000,300,300,CONT_VIA,1273ymous_ ++B 15200,10000,300,300,CONT_POLY,1219ymous_ ++B 6800,6000,300,300,CONT_VIA2,1005ymous_ ++B 20000,6000,300,300,CONT_BODY_P,359nymous_ ++B 7800,37600,300,300,CONT_VIA2,1059ymous_ ++B 18800,23200,300,300,CONT_DIF_N,1327ymous_ ++B 23000,33400,300,300,CONT_BODY_N,413nymous_ ++B 28400,14000,300,300,CONT_DIF_P,574nymous_ ++B 9200,17000,300,300,CONT_VIA2,1113ymous_ ++B 12400,31000,300,300,CONT_DIF_N,1167ymous_ ++B 27000,33600,300,300,CONT_DIF_P,521nymous_ ++B 25000,37600,300,300,CONT_BODY_N,467nymous_ ++B 30600,33000,300,300,CONT_VIA,628nymous_ ++B 3200,17000,300,300,CONT_VIA2,682nymous_ ++B 35400,30000,300,300,CONT_DIF_P,790nymous_ ++B 33800,29000,300,300,CONT_VIA,736nymous_ ++B 37000,24000,300,300,CONT_DIF_P,844nymous_ ++B 38200,34400,300,300,CONT_BODY_N,898nymous_ ++B 4600,37600,300,300,CONT_BODY_P,952nymous_ ++B 6800,7200,300,300,CONT_DIF_N,1006ymous_ ++B 16400,17000,300,300,CONT_VIA2,1274ymous_ ++B 15200,11600,300,300,CONT_DIF_P,1220ymous_ ++B 20000,6000,300,300,CONT_VIA,360nymous_ ++B 8000,0,300,300,CONT_VIA2,1060ymous_ ++B 9600,37600,300,300,CONT_BODY_P,1114ymous_ ++B 18800,24400,300,300,CONT_DIF_N,1328ymous_ ++B 25000,19200,300,300,CONT_BODY_N,468nymous_ ++B 23000,34400,300,300,CONT_BODY_N,414nymous_ ++B 28400,16000,300,300,CONT_BODY_N,575nymous_ ++B 30600,33000,300,300,CONT_VIA2,629nymous_ ++B 12400,32000,300,300,CONT_DIF_N,1168ymous_ ++B 27000,35000,300,300,CONT_DIF_P,522nymous_ ++B 32200,22000,300,300,CONT_DIF_P,683nymous_ ++B 33800,29000,300,300,CONT_VIA2,737nymous_ ++B 35400,31000,300,300,CONT_DIF_P,791nymous_ ++B 37000,24000,300,300,CONT_VIA,845nymous_ ++B 15200,12600,300,300,CONT_DIF_P,1221ymous_ ++B 4600,37600,300,300,CONT_VIA,953nymous_ ++B 6800,8000,300,300,CONT_DIF_N,1007ymous_ ++B 18800,25600,300,300,CONT_DIF_N,1329ymous_ ++B 16600,19200,300,300,CONT_BODY_P,1275ymous_ ++B 20000,6000,300,300,CONT_VIA2,361nymous_ ++B 8000,0,300,300,CONT_VIA3,1061ymous_ ++B 9600,19200,300,300,CONT_BODY_P,1115ymous_ ++B 26000,20400,300,300,CONT_DIF_P,469nymous_ ++B 23000,35400,300,300,CONT_BODY_N,415nymous_ ++B 28400,17000,300,300,CONT_VIA,576nymous_ ++B 30600,34000,300,300,CONT_DIF_P,630nymous_ ++B 33800,30000,300,300,CONT_DIF_P,738nymous_ ++B 12400,33000,300,300,CONT_DIF_N,1169ymous_ ++B 27000,36400,300,300,CONT_DIF_P,523nymous_ ++B 32200,23000,300,300,CONT_DIF_P,684nymous_ ++B 35400,32000,300,300,CONT_DIF_P,792nymous_ ++B 37000,25000,300,300,CONT_DIF_P,846nymous_ ++B 38200,36400,300,300,CONT_BODY_N,900nymous_ ++B 4600,37600,300,300,CONT_VIA2,954nymous_ ++B 15200,16000,300,300,CONT_BODY_N,1222ymous_ ++B 6800,10000,300,300,CONT_POLY,1008ymous_ ++B 8000,0,300,300,CONT_VIA4,1062ymous_ ++B 18800,26800,300,300,CONT_DIF_N,1330ymous_ ++B 16800,20200,300,300,CONT_VIA,1276ymous_ ++B 23000,36400,300,300,CONT_BODY_N,416nymous_ ++B 20000,8600,300,300,CONT_DIF_N,362nymous_ ++B 28400,17000,300,300,CONT_VIA2,577nymous_ ++B 10400,6000,300,300,CONT_BODY_P,1116ymous_ ++B 12400,34000,300,300,CONT_DIF_N,1170ymous_ ++B 27000,36400,300,300,CONT_VIA,524nymous_ ++B 38200,35400,300,300,CONT_BODY_N,899nymous_ ++B 4600,19200,300,300,CONT_BODY_P,955nymous_ ++B 16800,23400,300,300,CONT_POLY,1277ymous_ ++B 15200,17000,300,300,CONT_VIA,1223ymous_ ++B 6800,12000,300,300,CONT_DIF_P,1009ymous_ ++B 8000,8000,300,300,CONT_DIF_N,1063ymous_ ++B 18800,26800,300,300,CONT_VIA,1331ymous_ ++B 23000,37600,300,300,CONT_BODY_N,417nymous_ ++B 20000,11000,300,300,CONT_POLY,363nymous_ ++B 28800,9000,300,300,CONT_POLY,578nymous_ ++B 10400,6000,300,300,CONT_VIA,1117ymous_ ++B 12400,35000,300,300,CONT_DIF_N,1171ymous_ ++B 27000,37600,300,300,CONT_BODY_N,525nymous_ ++B 26000,21600,300,300,CONT_VIA,471nymous_ ++B 30600,34000,300,300,CONT_VIA2,632nymous_ ++B 32200,25000,300,300,CONT_DIF_P,686nymous_ ++B 33800,31000,300,300,CONT_DIF_P,740nymous_ ++B 35400,34000,300,300,CONT_DIF_P,794nymous_ ++B 37000,26000,300,300,CONT_DIF_P,848nymous_ ++B 38200,19200,300,300,CONT_BODY_N,902nymous_ ++B 5400,24000,300,300,CONT_VIA2,956nymous_ ++B 6800,12800,300,300,CONT_DIF_P,1010ymous_ ++B 16800,24400,300,300,CONT_VIA,1278ymous_ ++B 15200,17000,300,300,CONT_VIA2,1224ymous_ ++B 20000,16000,300,300,CONT_BODY_N,364nymous_ ++B 18800,28000,300,300,CONT_DIF_N,1332ymous_ ++B 38200,37600,300,300,CONT_BODY_N,901nymous_ ++B 37000,25000,300,300,CONT_VIA,847nymous_ ++B 35400,33000,300,300,CONT_DIF_P,793nymous_ ++B 33800,30000,300,300,CONT_VIA,739nymous_ ++B 32200,24000,300,300,CONT_DIF_P,685nymous_ ++B 30600,34000,300,300,CONT_VIA,631nymous_ ++B 26000,21600,300,300,CONT_DIF_P,470nymous_ ++B 4400,21800,300,300,CONT_VIA,904nymous_ ++B 37000,27000,300,300,CONT_DIF_P,850nymous_ ++B 35400,36000,300,300,CONT_DIF_P,796nymous_ ++B 32200,27000,300,300,CONT_DIF_P,688nymous_ ++B 27000,10000,300,300,CONT_VIA2,527nymous_ ++B 12600,19200,300,300,CONT_BODY_P,1173ymous_ ++B 33800,32000,300,300,CONT_DIF_P,742nymous_ ++B 30600,35000,300,300,CONT_VIA,634nymous_ ++B 29000,21000,300,300,CONT_VIA,580nymous_ ++B 23400,17000,300,300,CONT_VIA,419nymous_ ++B 26000,22800,300,300,CONT_DIF_P,473nymous_ ++B 10400,8000,300,300,CONT_DIF_N,1119ymous_ ++B 8000,9000,300,300,CONT_VIA,1065ymous_ ++B 20800,20400,300,300,CONT_BODY_P,365nymous_ ++B 16800,25400,300,300,CONT_POLY,1279ymous_ ++B 18800,29200,300,300,CONT_DIF_N,1333ymous_ ++B 6800,13800,300,300,CONT_DIF_P,1011ymous_ ++B 5400,25000,300,300,CONT_VIA2,957nymous_ ++B 15600,20200,300,300,CONT_VIA,1225ymous_ ++B 4400,21800,300,300,CONT_POLY,903nymous_ ++B 37000,26000,300,300,CONT_VIA,849nymous_ ++B 35400,35000,300,300,CONT_DIF_P,795nymous_ ++B 33800,31000,300,300,CONT_VIA,741nymous_ ++B 32200,26000,300,300,CONT_DIF_P,687nymous_ ++B 27000,9000,300,300,CONT_VIA2,526nymous_ ++B 12400,36000,300,300,CONT_DIF_N,1172ymous_ ++B 30600,35000,300,300,CONT_DIF_P,633nymous_ ++B 29000,21000,300,300,CONT_POLY,579nymous_ ++B 23000,19200,300,300,CONT_BODY_N,418nymous_ ++B 26000,21600,300,300,CONT_VIA2,472nymous_ ++B 10400,6000,300,300,CONT_VIA2,1118ymous_ ++B 8000,9000,300,300,CONT_DIF_N,1064ymous_ ++B 30800,6000,300,300,CONT_BODY_P,636nymous_ ++B 26000,24000,300,300,CONT_DIF_P,475nymous_ ++B 27000,19200,300,300,CONT_BODY_N,529nymous_ ++B 10400,10000,300,300,CONT_POLY,1121ymous_ ++B 29000,22200,300,300,CONT_VIA,582nymous_ ++B 20800,22400,300,300,CONT_BODY_P,367nymous_ ++B 23600,6000,300,300,CONT_BODY_P,421nymous_ ++B 18800,31600,300,300,CONT_DIF_N,1335ymous_ ++B 8000,11000,300,300,CONT_VIA,1067ymous_ ++B 6800,16000,300,300,CONT_BODY_N,1013ymous_ ++B 15600,24000,300,300,CONT_DIF_N,1227ymous_ ++B 16800,29200,300,300,CONT_VIA,1281ymous_ ++B 5400,30000,300,300,CONT_VIA2,959nymous_ ++B 4400,23000,300,300,CONT_DIF_N,905nymous_ ++B 37000,27000,300,300,CONT_VIA,851nymous_ ++B 35600,6000,300,300,CONT_BODY_P,797nymous_ ++B 33800,32000,300,300,CONT_VIA,743nymous_ ++B 32200,28000,300,300,CONT_DIF_P,689nymous_ ++B 30600,35000,300,300,CONT_VIA2,635nymous_ ++B 26000,22800,300,300,CONT_VIA2,474nymous_ ++B 27000,11000,300,300,CONT_VIA2,528nymous_ ++B 12800,6000,300,300,CONT_BODY_P,1174ymous_ ++B 10400,9000,300,300,CONT_DIF_N,1120ymous_ ++B 29000,22200,300,300,CONT_POLY,581nymous_ ++B 20800,21400,300,300,CONT_BODY_P,366nymous_ ++B 23400,17000,300,300,CONT_VIA2,420nymous_ ++B 16800,28200,300,300,CONT_POLY,1280ymous_ ++B 18800,30400,300,300,CONT_DIF_N,1334ymous_ ++B 8000,10000,300,300,CONT_POLY,1066ymous_ ++B 6800,14800,300,300,CONT_DIF_P,1012ymous_ ++B 15600,23000,300,300,CONT_DIF_N,1226ymous_ ++B 5400,26000,300,300,CONT_VIA2,958nymous_ ++B 23600,6000,300,300,CONT_VIA2,423nymous_ ++B 8000,12800,300,300,CONT_DIF_P,1069ymous_ ++B 20800,24400,300,300,CONT_BODY_P,369nymous_ ++B 16800,32200,300,300,CONT_VIA,1283ymous_ ++B 18800,32800,300,300,CONT_DIF_N,1337ymous_ ++B 6800,17000,300,300,CONT_VIA2,1015ymous_ ++B 5400,32000,300,300,CONT_VIA2,961nymous_ ++B 15600,26000,300,300,CONT_DIF_N,1229ymous_ ++B 4400,24000,300,300,CONT_DIF_N,907nymous_ ++B 37000,28000,300,300,CONT_DIF_P,853nymous_ ++B 35600,6000,300,300,CONT_VIA2,799nymous_ ++B 33800,33000,300,300,CONT_VIA,745nymous_ ++B 32200,30000,300,300,CONT_DIF_P,691nymous_ ++B 27200,6000,300,300,CONT_BODY_P,530nymous_ ++B 12800,6000,300,300,CONT_VIA2,1176ymous_ ++B 30800,8000,300,300,CONT_DIF_N,637nymous_ ++B 29000,23400,300,300,CONT_POLY,583nymous_ ++B 23600,6000,300,300,CONT_VIA,422nymous_ ++B 26000,24000,300,300,CONT_VIA,476nymous_ ++B 18800,31600,300,300,CONT_VIA,1336ymous_ ++B 10400,11800,300,300,CONT_DIF_P,1122ymous_ ++B 8000,11800,300,300,CONT_DIF_P,1068ymous_ ++B 20800,23400,300,300,CONT_BODY_P,368nymous_ ++B 15600,25000,300,300,CONT_DIF_N,1228ymous_ ++B 16800,32200,300,300,CONT_POLY,1282ymous_ ++B 6800,17000,300,300,CONT_VIA,1014ymous_ ++B 5400,31000,300,300,CONT_VIA2,960nymous_ ++B 4400,23000,300,300,CONT_VIA,906nymous_ ++B 37000,27000,300,300,CONT_VIA2,852nymous_ ++B 35600,6000,300,300,CONT_VIA,798nymous_ ++B 33800,33000,300,300,CONT_DIF_P,744nymous_ ++B 32200,29000,300,300,CONT_DIF_P,690nymous_ ++B 5600,37600,300,300,CONT_BODY_P,963nymous_ ++B 4400,24000,300,300,CONT_VIA2,909nymous_ ++B 37000,28000,300,300,CONT_VIA2,855nymous_ ++B 35600,13000,300,300,CONT_DIF_P,801nymous_ ++B 33800,34000,300,300,CONT_DIF_P,747nymous_ ++B 32200,32000,300,300,CONT_DIF_P,693nymous_ ++B 30800,13000,300,300,CONT_DIF_P,639nymous_ ++B 26000,26400,300,300,CONT_DIF_P,478nymous_ ++B 27200,10600,300,300,CONT_POLY,532nymous_ ++B 12800,9000,300,300,CONT_DIF_N,1178ymous_ ++B 10400,13800,300,300,CONT_DIF_P,1124ymous_ ++B 29000,24600,300,300,CONT_POLY,585nymous_ ++B 20800,25400,300,300,CONT_BODY_P,370nymous_ ++B 23600,8000,300,300,CONT_DIF_N,424nymous_ ++B 16800,33400,300,300,CONT_POLY,1284ymous_ ++B 18800,34000,300,300,CONT_DIF_N,1338ymous_ ++B 8000,13800,300,300,CONT_DIF_P,1070ymous_ ++B 7000,9000,300,300,CONT_VIA2,1016ymous_ ++B 15600,27000,300,300,CONT_DIF_N,1230ymous_ ++B 5400,36000,300,300,CONT_VIA2,962nymous_ ++B 4400,24000,300,300,CONT_VIA,908nymous_ ++B 37000,28000,300,300,CONT_VIA,854nymous_ ++B 35600,8000,300,300,CONT_DIF_N,800nymous_ ++B 32200,31000,300,300,CONT_DIF_P,692nymous_ ++B 27200,8000,300,300,CONT_DIF_N,531nymous_ ++B 12800,8000,300,300,CONT_DIF_N,1177ymous_ ++B 33800,33000,300,300,CONT_VIA2,746nymous_ ++B 30800,10600,300,300,CONT_POLY,638nymous_ ++B 29000,23400,300,300,CONT_VIA,584nymous_ ++B 26000,25200,300,300,CONT_DIF_P,477nymous_ ++B 10400,12800,300,300,CONT_DIF_P,1123ymous_ ++B 7000,10000,300,300,CONT_VIA2,1017ymous_ ++B 16800,33400,300,300,CONT_VIA,1285ymous_ ++B 15600,28000,300,300,CONT_DIF_N,1231ymous_ ++B 8000,16000,300,300,CONT_BODY_N,1071ymous_ ++B 18800,34000,300,300,CONT_VIA,1339ymous_ ++B 23600,13000,300,300,CONT_DIF_P,425nymous_ ++B 20800,26400,300,300,CONT_BODY_P,371nymous_ ++B 29000,24600,300,300,CONT_VIA,586nymous_ ++B 10400,16000,300,300,CONT_BODY_N,1125ymous_ ++B 12800,11600,300,300,CONT_DIF_P,1179ymous_ ++B 27200,13000,300,300,CONT_DIF_P,533nymous_ ++B 26000,26400,300,300,CONT_VIA,479nymous_ ++B 30800,14000,300,300,CONT_DIF_P,640nymous_ ++B 32200,33000,300,300,CONT_DIF_P,694nymous_ ++B 33800,34000,300,300,CONT_VIA,748nymous_ ++B 35600,14000,300,300,CONT_DIF_P,802nymous_ ++B 37000,29000,300,300,CONT_DIF_P,856nymous_ ++B 4400,25000,300,300,CONT_DIF_N,910nymous_ ++B 5600,37600,300,300,CONT_VIA,964nymous_ ++B 7000,11000,300,300,CONT_VIA2,1018ymous_ ++B 16800,33400,300,300,CONT_VIA2,1286ymous_ ++B 15600,29000,300,300,CONT_DIF_N,1232ymous_ ++B 20800,27400,300,300,CONT_BODY_P,372nymous_ ++B 8000,17000,300,300,CONT_VIA,1072ymous_ ++B 10400,17000,300,300,CONT_VIA,1126ymous_ ++B 18800,35200,300,300,CONT_DIF_N,1340ymous_ ++B 26000,27600,300,300,CONT_DIF_P,480nymous_ ++B 23600,14000,300,300,CONT_DIF_P,426nymous_ ++B 29000,25800,300,300,CONT_POLY,587nymous_ ++B 30800,16000,300,300,CONT_BODY_N,641nymous_ ++B 27200,14000,300,300,CONT_DIF_P,534nymous_ ++B 32200,34000,300,300,CONT_DIF_P,695nymous_ ++B 33800,34000,300,300,CONT_VIA2,749nymous_ ++B 35600,16000,300,300,CONT_BODY_N,803nymous_ ++B 37000,29000,300,300,CONT_VIA,857nymous_ ++B 4400,25000,300,300,CONT_VIA,911nymous_ ++B 15600,30000,300,300,CONT_DIF_N,1233ymous_ ++B 5600,37600,300,300,CONT_VIA2,965nymous_ ++B 7600,21800,300,300,CONT_POLY,1019ymous_ ++B 18800,36400,300,300,CONT_DIF_N,1341ymous_ ++B 16800,34600,300,300,CONT_POLY,1287ymous_ ++B 20800,28400,300,300,CONT_BODY_P,373nymous_ ++B 8000,17000,300,300,CONT_VIA2,1073ymous_ ++B 10400,17000,300,300,CONT_VIA2,1127ymous_ ++B 26000,27600,300,300,CONT_VIA2,481nymous_ ++B 23600,16000,300,300,CONT_BODY_N,427nymous_ ++B 29000,30600,300,300,CONT_POLY,588nymous_ ++B 30800,17000,300,300,CONT_VIA,642nymous_ ++B 33800,35000,300,300,CONT_DIF_P,750nymous_ ++B 27200,16000,300,300,CONT_BODY_N,535nymous_ ++B 32200,35000,300,300,CONT_DIF_P,696nymous_ ++B 35600,17000,300,300,CONT_VIA,804nymous_ ++B 37000,29000,300,300,CONT_VIA2,858nymous_ ++B 4400,25000,300,300,CONT_VIA2,912nymous_ ++B 5600,6000,300,300,CONT_BODY_P,966nymous_ ++B 15600,31000,300,300,CONT_DIF_N,1234ymous_ ++B 7600,21800,300,300,CONT_VIA,1020ymous_ ++B 8600,24000,300,300,CONT_VIA2,1074ymous_ ++B 18800,36400,300,300,CONT_VIA,1342ymous_ ++B 16800,34600,300,300,CONT_VIA,1288ymous_ ++B 24000,27000,300,300,CONT_POLY,428nymous_ ++B 20800,29400,300,300,CONT_BODY_P,374nymous_ ++B 29000,31800,300,300,CONT_POLY,589nymous_ ++B 10600,19200,300,300,CONT_BODY_P,1128ymous_ ++B 27200,17000,300,300,CONT_VIA,536nymous_ ++B 26000,28800,300,300,CONT_DIF_P,482nymous_ ++B 30800,17000,300,300,CONT_VIA2,643nymous_ ++B 32200,36000,300,300,CONT_DIF_P,697nymous_ ++B 33800,35000,300,300,CONT_VIA,751nymous_ ++B 35600,17000,300,300,CONT_VIA2,805nymous_ ++B 37000,30000,300,300,CONT_DIF_P,859nymous_ ++B 4400,26000,300,300,CONT_DIF_N,913nymous_ ++B 5600,6000,300,300,CONT_VIA,967nymous_ ++B 16800,34600,300,300,CONT_VIA2,1289ymous_ ++B 15600,32000,300,300,CONT_DIF_N,1235ymous_ ++B 7600,23000,300,300,CONT_DIF_N,1021ymous_ ++B 8600,25000,300,300,CONT_VIA2,1075ymous_ ++B 18800,37600,300,300,CONT_BODY_P,1343ymous_ ++B 24000,28200,300,300,CONT_POLY,429nymous_ ++B 20800,30400,300,300,CONT_BODY_P,375nymous_ ++B 29000,33000,300,300,CONT_POLY,590nymous_ ++B 10800,21800,300,300,CONT_POLY,1129ymous_ ++B 27200,17000,300,300,CONT_VIA2,537nymous_ ++B 26000,28800,300,300,CONT_VIA,483nymous_ ++B 31000,19200,300,300,CONT_BODY_N,644nymous_ ++B 32800,20200,300,300,CONT_POLY,698nymous_ ++B 33800,35000,300,300,CONT_VIA2,752nymous_ ++B 36000,20200,300,300,CONT_POLY,806nymous_ ++B 37000,30000,300,300,CONT_VIA,860nymous_ ++B 4400,26000,300,300,CONT_VIA,914nymous_ ++B 5600,6000,300,300,CONT_VIA2,968nymous_ ++B 7600,23000,300,300,CONT_VIA,1022ymous_ ++B 16800,35800,300,300,CONT_POLY,1290ymous_ ++B 15600,33000,300,300,CONT_DIF_N,1236ymous_ ++B 20800,31400,300,300,CONT_BODY_P,376nymous_ ++B 18800,6000,300,300,CONT_BODY_P,1344ymous_ ++B 12800,17000,300,300,CONT_VIA,1182ymous_ ++B 8600,26000,300,300,CONT_VIA2,1076ymous_ ++B 10800,21800,300,300,CONT_VIA,1130ymous_ ++B 26000,28800,300,300,CONT_VIA2,484nymous_ ++B 24000,28200,300,300,CONT_VIA,430nymous_ ++B 29000,19200,300,300,CONT_BODY_N,591nymous_ ++B 31600,20200,300,300,CONT_POLY,645nymous_ ++B 27800,36400,300,300,CONT_DIF_P,538nymous_ ++B 32800,22000,300,300,CONT_VIA2,699nymous_ ++B 33800,36000,300,300,CONT_DIF_P,753nymous_ ++B 36000,22000,300,300,CONT_VIA2,807nymous_ ++B 37000,31000,300,300,CONT_DIF_P,861nymous_ ++B 4400,26000,300,300,CONT_VIA2,915nymous_ ++B 15600,34000,300,300,CONT_DIF_N,1237ymous_ ++B 5600,8000,300,300,CONT_DIF_N,969nymous_ ++B 7600,24000,300,300,CONT_DIF_N,1023ymous_ ++B 18800,6000,300,300,CONT_VIA,1345ymous_ ++B 16800,35800,300,300,CONT_VIA,1291ymous_ ++B 20800,32400,300,300,CONT_BODY_P,377nymous_ ++B 8600,30000,300,300,CONT_VIA2,1077ymous_ ++B 10800,21800,300,300,CONT_VIA2,1131ymous_ ++B 26000,30000,300,300,CONT_DIF_P,485nymous_ ++B 24000,29200,300,300,CONT_POLY,431nymous_ ++B 29600,33000,300,300,CONT_VIA2,592nymous_ ++B 31600,22000,300,300,CONT_VIA2,646nymous_ ++B 33800,36000,300,300,CONT_VIA,754nymous_ ++B 27800,37600,300,300,CONT_BODY_N,539nymous_ ++B 32800,23000,300,300,CONT_VIA2,700nymous_ ++B 36000,23000,300,300,CONT_VIA2,808nymous_ ++B 37000,31000,300,300,CONT_VIA,862nymous_ ++B 4400,27000,300,300,CONT_DIF_N,916nymous_ ++B 13600,19200,300,300,CONT_BODY_P,1184ymous_ ++B 12800,17000,300,300,CONT_VIA2,1183ymous_ ++B 12800,12600,300,300,CONT_DIF_P,1180ymous_ ++B 5600,9000,300,300,CONT_DIF_N,970nymous_ ++B 15600,35000,300,300,CONT_DIF_N,1238ymous_ ++B 7600,24000,300,300,CONT_VIA,1024ymous_ ++B 8600,31000,300,300,CONT_VIA2,1078ymous_ ++B 18800,6000,300,300,CONT_VIA2,1346ymous_ ++B 16800,37600,300,300,CONT_BODY_P,1292ymous_ ++B 24000,34200,300,300,CONT_POLY,432nymous_ ++B 20800,33400,300,300,CONT_BODY_P,378nymous_ ++B 29600,34000,300,300,CONT_VIA2,593nymous_ ++B 10800,23000,300,300,CONT_DIF_N,1132ymous_ ++B 26000,31200,300,300,CONT_DIF_P,486nymous_ ++B 31600,23000,300,300,CONT_VIA2,647nymous_ ++B 32800,27000,300,300,CONT_VIA2,701nymous_ ++B 34000,19200,300,300,CONT_BODY_N,755nymous_ ++B 36000,27000,300,300,CONT_VIA2,809nymous_ ++B 37000,32000,300,300,CONT_DIF_P,863nymous_ ++B 14000,21800,300,300,CONT_POLY,1185ymous_ ++B 4400,27000,300,300,CONT_VIA,917nymous_ ++B 5600,11800,300,300,CONT_DIF_P,971nymous_ ++B 17400,11800,300,300,CONT_POLY,1293ymous_ ++B 15600,36000,300,300,CONT_DIF_N,1239ymous_ ++B 7600,24000,300,300,CONT_VIA2,1025ymous_ ++B 8600,32000,300,300,CONT_VIA2,1079ymous_ ++B 18800,9000,300,300,CONT_DIF_N,1347ymous_ ++B 24000,34200,300,300,CONT_VIA,433nymous_ ++B 20800,34400,300,300,CONT_BODY_P,379nymous_ ++B 29600,35000,300,300,CONT_VIA2,594nymous_ ++B 10800,24000,300,300,CONT_DIF_N,1133ymous_ ++B 12800,16000,300,300,CONT_BODY_N,1181ymous_ ++B 26000,31200,300,300,CONT_VIA,487nymous_ ++B 31600,27000,300,300,CONT_VIA2,648nymous_ ++B 32800,28000,300,300,CONT_VIA2,702nymous_ ++B 3400,24000,300,300,CONT_VIA2,756nymous_ ++B 36000,28000,300,300,CONT_VIA2,810nymous_ ++B 37000,32000,300,300,CONT_VIA,864nymous_ ++B 4400,28000,300,300,CONT_DIF_N,918nymous_ ++B 14000,21800,300,300,CONT_VIA,1186ymous_ ++B 5600,12800,300,300,CONT_DIF_P,972nymous_ ++B 7600,25000,300,300,CONT_DIF_N,1026ymous_ ++B 17600,6000,300,300,CONT_BODY_P,1294ymous_ ++B 15600,19200,300,300,CONT_BODY_P,1240ymous_ ++B 20800,35400,300,300,CONT_BODY_P,380nymous_ ++B 8600,36000,300,300,CONT_VIA2,1080ymous_ ++B 10800,25000,300,300,CONT_DIF_N,1134ymous_ ++B 18800,16000,300,300,CONT_BODY_N,1348ymous_ ++B 26000,32400,300,300,CONT_DIF_P,488nymous_ ++B 24000,34200,300,300,CONT_VIA2,434nymous_ ++B 29600,7000,300,300,CONT_DIF_N,595nymous_ ++B 31600,28000,300,300,CONT_VIA2,649nymous_ ++B 32800,29000,300,300,CONT_VIA2,703nymous_ ++B 3400,25000,300,300,CONT_VIA2,757nymous_ ++B 36000,29000,300,300,CONT_VIA2,811nymous_ ++B 37000,33000,300,300,CONT_DIF_P,865nymous_ ++B 4400,28000,300,300,CONT_VIA,919nymous_ ++B 15800,27000,300,300,CONT_VIA2,1241ymous_ ++B 14000,21800,300,300,CONT_VIA2,1187ymous_ ++B 5600,13800,300,300,CONT_DIF_P,973nymous_ ++B 7600,25000,300,300,CONT_VIA,1027ymous_ ++B 18800,17000,300,300,CONT_VIA,1349ymous_ ++B 17600,6000,300,300,CONT_VIA,1295ymous_ ++B 20800,36400,300,300,CONT_BODY_P,381nymous_ ++B 8600,19200,300,300,CONT_BODY_P,1081ymous_ ++B 24000,35800,300,300,CONT_POLY,435nymous_ ++B 10800,26000,300,300,CONT_DIF_N,1135ymous_ ++B 26000,33600,300,300,CONT_DIF_P,489nymous_ ++B 29600,10600,300,300,CONT_POLY,596nymous_ ++B 31600,29000,300,300,CONT_VIA2,650nymous_ ++B 3400,26000,300,300,CONT_VIA2,758nymous_ ++B 32800,33000,300,300,CONT_VIA2,704nymous_ ++B 36000,33000,300,300,CONT_VIA2,812nymous_ ++B 37000,33000,300,300,CONT_VIA,866nymous_ ++B 4400,29000,300,300,CONT_DIF_N,920nymous_ ++B 5600,16000,300,300,CONT_BODY_N,974nymous_ ++B 15800,28000,300,300,CONT_VIA2,1242ymous_ ++B 14000,23000,300,300,CONT_DIF_N,1188ymous_ ++B 7600,25000,300,300,CONT_VIA2,1028ymous_ ++B 8800,37600,300,300,CONT_BODY_P,1082ymous_ ++B 18800,17000,300,300,CONT_VIA2,1350ymous_ ++B 17600,6000,300,300,CONT_VIA2,1296ymous_ ++B 24000,35800,300,300,CONT_VIA,436nymous_ ++B 20800,37600,300,300,CONT_BODY_P,382nymous_ ++B 28000,24000,300,300,CONT_DIF_P,543nymous_ ++B 29600,13000,300,300,CONT_DIF_P,597nymous_ ++B 10800,27000,300,300,CONT_DIF_N,1136ymous_ ++B 26000,33600,300,300,CONT_VIA,490nymous_ ++B 31600,33000,300,300,CONT_VIA2,651nymous_ ++B 32800,34000,300,300,CONT_VIA2,705nymous_ ++B 3400,30000,300,300,CONT_VIA2,759nymous_ ++B 36000,34000,300,300,CONT_VIA2,813nymous_ ++B 37000,33000,300,300,CONT_VIA2,867nymous_ ++B 14000,24000,300,300,CONT_DIF_N,1189ymous_ ++B 4400,29000,300,300,CONT_VIA,921nymous_ ++B 5600,17000,300,300,CONT_VIA,975nymous_ ++B 7600,26000,300,300,CONT_DIF_N,1029ymous_ ++B 28000,22800,300,300,CONT_DIF_P,542nymous_ ++B 17600,8600,300,300,CONT_DIF_N,1297ymous_ ++B 15800,29000,300,300,CONT_VIA2,1243ymous_ ++B 8800,37600,300,300,CONT_VIA,1083ymous_ ++B 19600,19200,300,300,CONT_BODY_P,1351ymous_ ++B 24000,37600,300,300,CONT_BODY_N,437nymous_ ++B 20800,19200,300,300,CONT_BODY_P,383nymous_ ++B 28000,25200,300,300,CONT_DIF_P,544nymous_ ++B 29600,14000,300,300,CONT_DIF_P,598nymous_ ++B 10800,28000,300,300,CONT_DIF_N,1137ymous_ ++B 26000,35000,300,300,CONT_DIF_P,491nymous_ ++B 31600,34000,300,300,CONT_VIA2,652nymous_ ++B 32800,35000,300,300,CONT_VIA2,706nymous_ ++B 3400,31000,300,300,CONT_VIA2,760nymous_ ++B 36000,35000,300,300,CONT_VIA2,814nymous_ ++B 37000,34000,300,300,CONT_DIF_P,868nymous_ ++B 4400,30000,300,300,CONT_DIF_N,922nymous_ ++B 14000,25000,300,300,CONT_DIF_N,1190ymous_ ++B 5600,17000,300,300,CONT_VIA2,976nymous_ ++B 7600,26000,300,300,CONT_VIA,1030ymous_ ++B 17600,12800,300,300,CONT_DIF_P,1298ymous_ ++B 15800,37600,300,300,CONT_BODY_P,1244ymous_ ++B 21000,13000,300,300,CONT_VIA,384nymous_ ++B 28000,26400,300,300,CONT_DIF_P,545nymous_ ++B 8800,37600,300,300,CONT_VIA2,1084ymous_ ++B 10800,29000,300,300,CONT_DIF_N,1138ymous_ ++B 19800,22600,300,300,CONT_POLY,1352ymous_ ++B 26000,36400,300,300,CONT_DIF_P,492nymous_ ++B 24000,19200,300,300,CONT_BODY_N,438nymous_ ++B 29600,16000,300,300,CONT_BODY_N,599nymous_ ++B 31600,35000,300,300,CONT_VIA2,653nymous_ ++B 33000,19200,300,300,CONT_BODY_N,707nymous_ ++B 3400,32000,300,300,CONT_VIA2,761nymous_ ++B 36000,19200,300,300,CONT_BODY_N,815nymous_ ++B 37000,34000,300,300,CONT_VIA,869nymous_ ++B 4400,30000,300,300,CONT_VIA,923nymous_ ++B 1600,20400,300,300,CONT_BODY_P,1245ymous_ ++B 14000,26000,300,300,CONT_DIF_N,1191ymous_ ++B 5600,19200,300,300,CONT_BODY_P,977nymous_ ++B 7600,26000,300,300,CONT_VIA2,1031ymous_ ++B 19800,26200,300,300,CONT_POLY,1353ymous_ ++B 17600,16000,300,300,CONT_BODY_N,1299ymous_ ++B 21000,14000,300,300,CONT_VIA,385nymous_ ++B 28000,27600,300,300,CONT_DIF_P,546nymous_ ++B 9200,23000,300,300,CONT_DIF_N,1085ymous_ ++B 10800,30000,300,300,CONT_DIF_N,1139ymous_ ++B 26000,37600,300,300,CONT_BODY_N,493nymous_ ++B 24800,6000,300,300,CONT_BODY_P,439nymous_ ++B 29600,17000,300,300,CONT_VIA,600nymous_ ++B 31800,9000,300,300,CONT_POLY,654nymous_ ++B 3400,36000,300,300,CONT_VIA2,762nymous_ ++B 33200,6000,300,300,CONT_BODY_P,708nymous_ ++B 3600,37600,300,300,CONT_BODY_P,816nymous_ ++B 37000,34000,300,300,CONT_VIA2,870nymous_ ++B 4400,30000,300,300,CONT_VIA2,924nymous_ ++B 6000,23000,300,300,CONT_DIF_N,978nymous_ ++B 1600,21400,300,300,CONT_BODY_P,1246ymous_ ++B 14000,27000,300,300,CONT_DIF_N,1192ymous_ ++B 7600,27000,300,300,CONT_DIF_N,1032ymous_ ++B 9200,24000,300,300,CONT_DIF_N,1086ymous_ ++B 19800,27400,300,300,CONT_POLY,1354ymous_ ++B 17600,17000,300,300,CONT_VIA,1300ymous_ ++B 24800,6000,300,300,CONT_VIA,440nymous_ ++B 21200,6000,300,300,CONT_BODY_P,386nymous_ ++B 28000,28800,300,300,CONT_DIF_P,547nymous_ ++B 29600,17000,300,300,CONT_VIA2,601nymous_ ++B 10800,31000,300,300,CONT_DIF_N,1140ymous_ ++B 26000,6000,300,300,CONT_BODY_P,494nymous_ ++B 31800,12200,300,300,CONT_POLY,655nymous_ ++B 33200,6000,300,300,CONT_VIA,709nymous_ ++B 34400,6000,300,300,CONT_BODY_P,763nymous_ ++B 3600,37600,300,300,CONT_VIA,817nymous_ ++B 37000,35000,300,300,CONT_DIF_P,871nymous_ ++B 14000,28000,300,300,CONT_DIF_N,1193ymous_ ++B 4400,31000,300,300,CONT_DIF_N,925nymous_ ++B 6000,24000,300,300,CONT_DIF_N,979nymous_ ++B 17600,17000,300,300,CONT_VIA2,1301ymous_ ++B 1600,22400,300,300,CONT_BODY_P,1247ymous_ ++B 7600,27000,300,300,CONT_VIA,1033ymous_ ++B 9200,25000,300,300,CONT_DIF_N,1087ymous_ ++B 19800,28200,300,300,CONT_VIA,1355ymous_ ++B 24800,6000,300,300,CONT_VIA2,441nymous_ ++B 21200,6000,300,300,CONT_VIA,387nymous_ ++B 28000,30000,300,300,CONT_DIF_P,548nymous_ ++B 30000,20200,300,300,CONT_VIA,602nymous_ ++B 10800,32000,300,300,CONT_DIF_N,1141ymous_ ++B 26000,6000,300,300,CONT_VIA,495nymous_ ++B 32000,6000,300,300,CONT_BODY_P,656nymous_ ++B 33200,6000,300,300,CONT_VIA2,710nymous_ ++B 34400,6000,300,300,CONT_VIA,764nymous_ ++B 3600,37600,300,300,CONT_VIA2,818nymous_ ++B 37000,35000,300,300,CONT_VIA,872nymous_ ++B 4400,31000,300,300,CONT_VIA,926nymous_ ++B 14000,29000,300,300,CONT_DIF_N,1194ymous_ ++B 6000,25000,300,300,CONT_DIF_N,980nymous_ ++B 7600,28000,300,300,CONT_DIF_N,1034ymous_ ++B 1600,23400,300,300,CONT_BODY_P,1248ymous_ ++B 17600,19200,300,300,CONT_BODY_P,1302ymous_ ++B 21200,6000,300,300,CONT_VIA2,388nymous_ ++B 28000,31200,300,300,CONT_DIF_P,549nymous_ ++B 9200,26000,300,300,CONT_DIF_N,1088ymous_ ++B 10800,33000,300,300,CONT_DIF_N,1142ymous_ ++B 19800,31000,300,300,CONT_POLY,1356ymous_ ++B 26000,6000,300,300,CONT_VIA2,496nymous_ ++B 24800,8000,300,300,CONT_DIF_N,442nymous_ ++B 30000,19200,300,300,CONT_BODY_N,603nymous_ ++B 32000,6000,300,300,CONT_VIA,657nymous_ ++B 33200,8000,300,300,CONT_DIF_N,711nymous_ ++B 34400,6000,300,300,CONT_VIA2,765nymous_ ++B 3600,19200,300,300,CONT_BODY_P,819nymous_ ++B 37000,35000,300,300,CONT_VIA2,873nymous_ ++B 4400,31000,300,300,CONT_VIA2,927nymous_ ++B 1600,24400,300,300,CONT_BODY_P,1249ymous_ ++B 14000,30000,300,300,CONT_DIF_N,1195ymous_ ++B 6000,26000,300,300,CONT_DIF_N,981nymous_ ++B 7600,28000,300,300,CONT_VIA,1035ymous_ ++B 19800,35200,300,300,CONT_VIA,1357ymous_ ++B 17800,23200,300,300,CONT_DIF_N,1303ymous_ ++B 21200,9000,300,300,CONT_DIF_N,389nymous_ ++B 28000,31200,300,300,CONT_VIA,550nymous_ ++B 9200,27000,300,300,CONT_DIF_N,1089ymous_ ++B 10800,34000,300,300,CONT_DIF_N,1143ymous_ ++B 26000,8000,300,300,CONT_DIF_N,497nymous_ ++B 24800,13000,300,300,CONT_DIF_P,443nymous_ ++B 30400,36600,300,300,CONT_POLY,604nymous_ ++B 32000,6000,300,300,CONT_VIA2,658nymous_ ++B 34400,8000,300,300,CONT_DIF_N,766nymous_ ++B 33200,13000,300,300,CONT_DIF_P,712nymous_ ++B 36800,6000,300,300,CONT_BODY_P,820nymous_ ++B 37000,36000,300,300,CONT_DIF_P,874nymous_ ++B 4400,32000,300,300,CONT_DIF_N,928nymous_ ++B 6000,27000,300,300,CONT_DIF_N,982nymous_ ++B 1600,25400,300,300,CONT_BODY_P,1250ymous_ ++B 14000,31000,300,300,CONT_DIF_N,1196ymous_ ++B 7600,29000,300,300,CONT_DIF_N,1036ymous_ ++B 9200,28000,300,300,CONT_DIF_N,1090ymous_ ++B 19800,37600,300,300,CONT_BODY_P,1358ymous_ ++B 17800,23200,300,300,CONT_VIA,1304ymous_ ++B 24800,13000,300,300,CONT_VIA,444nymous_ ++B 21200,16000,300,300,CONT_BODY_N,390nymous_ ++B 28000,32400,300,300,CONT_DIF_P,551nymous_ ++B 30400,36600,300,300,CONT_VIA,605nymous_ ++B 10800,35000,300,300,CONT_DIF_N,1144ymous_ ++B 26000,12000,300,300,CONT_VIA2,498nymous_ ++B 32000,8000,300,300,CONT_DIF_N,659nymous_ ++B 33200,14000,300,300,CONT_DIF_P,713nymous_ ++B 34400,13000,300,300,CONT_DIF_P,767nymous_ ++B 36800,6000,300,300,CONT_VIA,821nymous_ ++B 37000,36000,300,300,CONT_VIA,875nymous_ ++B 14000,32000,300,300,CONT_DIF_N,1197ymous_ ++B 4400,32000,300,300,CONT_VIA,929nymous_ ++B 6000,28000,300,300,CONT_DIF_N,983nymous_ ++B 17800,24400,300,300,CONT_DIF_N,1305ymous_ ++B 1600,26400,300,300,CONT_BODY_P,1251ymous_ ++B 7600,29000,300,300,CONT_VIA,1037ymous_ ++B 9200,29000,300,300,CONT_DIF_N,1091ymous_ ++B 22000,22200,300,300,CONT_VIA,391nymous_ ++B 28000,33600,300,300,CONT_DIF_P,552nymous_ ++B 10800,36000,300,300,CONT_DIF_N,1145ymous_ ++B 26000,13000,300,300,CONT_DIF_P,499nymous_ ++B 24800,14000,300,300,CONT_DIF_P,445nymous_ ++B 30400,36600,300,300,CONT_VIA2,606nymous_ ++B 32000,13000,300,300,CONT_DIF_P,660nymous_ ++B 33200,16000,300,300,CONT_BODY_N,714nymous_ ++B 34400,13000,300,300,CONT_VIA,768nymous_ ++B 36800,6000,300,300,CONT_VIA2,822nymous_ ++B 37000,19200,300,300,CONT_BODY_N,876nymous_ ++B 4400,32000,300,300,CONT_VIA2,930nymous_ ++B 14000,33000,300,300,CONT_DIF_N,1198ymous_ ++B 6000,29000,300,300,CONT_DIF_N,984nymous_ ++B 7600,30000,300,300,CONT_DIF_N,1038ymous_ ++B 17800,24400,300,300,CONT_VIA2,1306ymous_ ++B 1600,27400,300,300,CONT_BODY_P,1252ymous_ ++B 22000,19200,300,300,CONT_VIA,392nymous_ ++B 28000,35000,300,300,CONT_DIF_P,553nymous_ ++B 9200,30000,300,300,CONT_DIF_N,1092ymous_ ++B 11600,6000,300,300,CONT_BODY_P,1146ymous_ ++B 26000,13000,300,300,CONT_VIA2,500nymous_ ++B 24800,14000,300,300,CONT_VIA,446nymous_ ++B 30600,22000,300,300,CONT_DIF_P,607nymous_ ++B 32000,16000,300,300,CONT_BODY_N,661nymous_ ++B 33200,17000,300,300,CONT_VIA,715nymous_ ++B 34400,14000,300,300,CONT_DIF_P,769nymous_ ++B 36800,7000,300,300,CONT_BODY_P,823nymous_ ++B 37200,37600,300,300,CONT_BODY_N,877nymous_ ++B 4400,33000,300,300,CONT_DIF_N,931nymous_ ++B 1600,28400,300,300,CONT_BODY_P,1253ymous_ ++B 14000,34000,300,300,CONT_DIF_N,1199ymous_ ++B 6000,30000,300,300,CONT_DIF_N,985nymous_ ++B 7600,30000,300,300,CONT_VIA,1039ymous_ ++B 9200,31000,300,300,CONT_DIF_N,1093ymous_ ++B 17800,25600,300,300,CONT_DIF_N,1307ymous_ ++B 22400,6000,300,300,CONT_BODY_P,393nymous_ ++B 28000,19200,300,300,CONT_BODY_N,554nymous_ ++B 11600,6000,300,300,CONT_VIA,1147ymous_ ++B 26000,14000,300,300,CONT_DIF_P,501nymous_ ++B 24800,16000,300,300,CONT_BODY_N,447nymous_ ++B 30600,23000,300,300,CONT_DIF_P,608nymous_ ++B 32000,17000,300,300,CONT_VIA,662nymous_ ++B 34400,14000,300,300,CONT_VIA,770nymous_ ++B 33200,17000,300,300,CONT_VIA2,716nymous_ ++B 36800,8000,300,300,CONT_BODY_P,824nymous_ ++B 38000,27000,300,300,CONT_VIA2,878nymous_ ++B 4400,33000,300,300,CONT_VIA,932nymous_ ++B 6000,31000,300,300,CONT_DIF_N,986nymous_ ++B 1600,29400,300,300,CONT_BODY_P,1254ymous_ ++B 14000,35000,300,300,CONT_DIF_N,1200ymous_ ++B 7600,30000,300,300,CONT_VIA2,1040ymous_ ++B 9200,32000,300,300,CONT_DIF_N,1094ymous_ ++B 17800,25600,300,300,CONT_VIA,1308ymous_ ++B 25000,20400,300,300,CONT_DIF_P,448nymous_ ++B 22400,6000,300,300,CONT_VIA,394nymous_ ++B 2800,23000,300,300,CONT_DIF_N,555nymous_ ++B 30600,24000,300,300,CONT_DIF_P,609nymous_ ++B 11600,6000,300,300,CONT_VIA2,1148ymous_ ++B 26000,14000,300,300,CONT_VIA2,502nymous_ ++B 32000,17000,300,300,CONT_VIA2,663nymous_ ++B 33800,22000,300,300,CONT_DIF_P,717nymous_ ++B 34400,16000,300,300,CONT_BODY_N,771nymous_ ++B 36800,9000,300,300,CONT_BODY_P,825nymous_ ++B 38000,28000,300,300,CONT_VIA2,879nymous_ ++B 14000,36000,300,300,CONT_DIF_N,1201ymous_ ++B 4400,34000,300,300,CONT_DIF_N,933nymous_ ++B 6000,32000,300,300,CONT_DIF_N,987nymous_ ++B 17800,25600,300,300,CONT_VIA2,1309ymous_ ++B 1600,30400,300,300,CONT_BODY_P,1255ymous_ ++B 7600,31000,300,300,CONT_DIF_N,1041ymous_ ++B 9200,33000,300,300,CONT_DIF_N,1095ymous_ ++B 25000,20400,300,300,CONT_VIA,449nymous_ ++B 22400,6000,300,300,CONT_VIA2,395nymous_ ++B 2800,24000,300,300,CONT_DIF_N,556nymous_ ++B 30600,25000,300,300,CONT_DIF_P,610nymous_ ++B 11600,8000,300,300,CONT_DIF_N,1149ymous_ ++B 26000,16000,300,300,CONT_BODY_N,503nymous_ ++B 32000,19200,300,300,CONT_BODY_N,664nymous_ ++B 33800,22000,300,300,CONT_VIA,718nymous_ ++B 34800,20200,300,300,CONT_POLY,772nymous_ ++B 36800,9000,300,300,CONT_VIA2,826nymous_ ++B 38000,29000,300,300,CONT_VIA2,880nymous_ ++B 4400,34000,300,300,CONT_VIA,934nymous_ ++B 14000,6000,300,300,CONT_BODY_P,1202ymous_ ++B 6000,33000,300,300,CONT_DIF_N,988nymous_ ++B 7600,31000,300,300,CONT_VIA,1042ymous_ ++B 17800,26800,300,300,CONT_DIF_N,1310ymous_ ++B 1600,31400,300,300,CONT_BODY_P,1256ymous_ ++B 22400,8600,300,300,CONT_DIF_N,396nymous_ ++B 2800,25000,300,300,CONT_DIF_N,557nymous_ ++B 9200,34000,300,300,CONT_DIF_N,1096ymous_ ++B 11600,9000,300,300,CONT_DIF_N,1150ymous_ ++B 26000,17000,300,300,CONT_VIA,504nymous_ ++B 25000,21600,300,300,CONT_DIF_P,450nymous_ ++B 30600,26000,300,300,CONT_DIF_P,611nymous_ ++B 3200,6000,300,300,CONT_BODY_P,665nymous_ ++B 33800,22000,300,300,CONT_VIA2,719nymous_ ++B 34800,22000,300,300,CONT_VIA2,773nymous_ ++B 36800,10000,300,300,CONT_VIA2,827nymous_ ++B 38000,33000,300,300,CONT_VIA2,881nymous_ ++B 4400,35000,300,300,CONT_DIF_N,935nymous_ ++B 1600,32400,300,300,CONT_BODY_P,1257ymous_ ++B 14000,6000,300,300,CONT_VIA,1203ymous_ ++B 6000,34000,300,300,CONT_DIF_N,989nymous_ ++B 7600,31000,300,300,CONT_VIA2,1043ymous_ ++B 17800,28000,300,300,CONT_DIF_N,1311ymous_ ++B 22400,16000,300,300,CONT_BODY_N,397nymous_ ++B 2800,26000,300,300,CONT_DIF_N,558nymous_ ++B 9200,35000,300,300,CONT_DIF_N,1097ymous_ ++B 11600,11800,300,300,CONT_DIF_P,1151ymous_ ++B 26000,17000,300,300,CONT_VIA2,505nymous_ ++B 25000,22800,300,300,CONT_DIF_P,451nymous_ ++B 30600,27000,300,300,CONT_DIF_P,612nymous_ ++B 3200,6000,300,300,CONT_VIA,666nymous_ ++B 34800,23000,300,300,CONT_VIA2,774nymous_ ++B 33800,23000,300,300,CONT_DIF_P,720nymous_ ++B 36800,11000,300,300,CONT_VIA2,828nymous_ ++B 38000,34000,300,300,CONT_VIA2,882nymous_ ++B 4400,35000,300,300,CONT_VIA,936nymous_ ++B 6000,35000,300,300,CONT_DIF_N,990nymous_ ++B 1600,33400,300,300,CONT_BODY_P,1258ymous_ ++B 14000,6000,300,300,CONT_VIA2,1204ymous_ ++B 7600,32000,300,300,CONT_DIF_N,1044ymous_ ++B 9200,36000,300,300,CONT_DIF_N,1098ymous_ ++B 17800,28000,300,300,CONT_VIA,1312ymous_ ++B 4400,36000,300,300,CONT_VIA,938nymous_ ++B 38200,20400,300,300,CONT_BODY_N,884nymous_ ++B 36800,13000,300,300,CONT_BODY_N,830nymous_ ++B 34800,28000,300,300,CONT_VIA2,776nymous_ ++B 33800,23000,300,300,CONT_VIA2,722nymous_ ++B 3200,7000,300,300,CONT_BODY_P,668nymous_ ++B 2600,37600,300,300,CONT_BODY_P,507nymous_ ++B 11600,13800,300,300,CONT_DIF_P,1153ymous_ ++B 30600,27000,300,300,CONT_VIA2,614nymous_ ++B 2800,28000,300,300,CONT_DIF_N,560nymous_ ++B 22400,17000,300,300,CONT_VIA2,399nymous_ ++B 25000,24000,300,300,CONT_DIF_P,453nymous_ ++B 9200,6000,300,300,CONT_BODY_P,1099ymous_ ++B 7600,32000,300,300,CONT_VIA,1045ymous_ ++B 1600,34400,300,300,CONT_BODY_P,1259ymous_ ++B 17800,29200,300,300,CONT_DIF_N,1313ymous_ ++B 6000,36000,300,300,CONT_DIF_N,991nymous_ ++B 4400,36000,300,300,CONT_DIF_N,937nymous_ ++B 14000,7200,300,300,CONT_DIF_N,1205ymous_ ++B 38000,35000,300,300,CONT_VIA2,883nymous_ ++B 36800,12000,300,300,CONT_BODY_N,829nymous_ ++B 34800,27000,300,300,CONT_VIA2,775nymous_ ++B 33800,23000,300,300,CONT_VIA,721nymous_ ++B 3200,6000,300,300,CONT_VIA2,667nymous_ ++B 26000,19200,300,300,CONT_BODY_N,506nymous_ ++B 11600,12800,300,300,CONT_DIF_P,1152ymous_ ++B 30600,27000,300,300,CONT_VIA,613nymous_ ++B 2800,27000,300,300,CONT_DIF_N,559nymous_ ++B 22400,17000,300,300,CONT_VIA,398nymous_ ++B 25000,22800,300,300,CONT_VIA,452nymous_ ++B 30600,28000,300,300,CONT_VIA,616nymous_ ++B 25000,26400,300,300,CONT_DIF_P,455nymous_ ++B 11600,16000,300,300,CONT_BODY_N,1155ymous_ ++B 9200,6000,300,300,CONT_VIA2,1101ymous_ ++B 2800,30000,300,300,CONT_DIF_N,562nymous_ ++B 23000,21400,300,300,CONT_BODY_N,401nymous_ ++B 17800,30400,300,300,CONT_VIA,1315ymous_ ++B 7600,33000,300,300,CONT_DIF_N,1047ymous_ ++B 6600,25000,300,300,CONT_VIA2,993nymous_ ++B 14000,10000,300,300,CONT_POLY,1207ymous_ ++B 1600,36400,300,300,CONT_BODY_P,1261ymous_ ++B 4400,36000,300,300,CONT_VIA2,939nymous_ ++B 38200,21400,300,300,CONT_BODY_N,885nymous_ ++B 36800,14000,300,300,CONT_BODY_N,831nymous_ ++B 34800,29000,300,300,CONT_VIA2,777nymous_ ++B 33800,24000,300,300,CONT_DIF_P,723nymous_ ++B 3200,7000,300,300,CONT_VIA2,669nymous_ ++B 30600,28000,300,300,CONT_DIF_P,615nymous_ ++B 25000,25200,300,300,CONT_DIF_P,454nymous_ ++B 2600,19200,300,300,CONT_BODY_P,508nymous_ ++B 11600,14800,300,300,CONT_DIF_P,1154ymous_ ++B 9200,6000,300,300,CONT_VIA,1100ymous_ ++B 2800,29000,300,300,CONT_DIF_N,561nymous_ ++B 23000,20400,300,300,CONT_BODY_N,400nymous_ ++B 1600,35400,300,300,CONT_BODY_P,1260ymous_ ++B 17800,30400,300,300,CONT_DIF_N,1314ymous_ ++B 7600,32000,300,300,CONT_VIA2,1046ymous_ ++B 6600,24000,300,300,CONT_VIA2,992nymous_ ++B 14000,8000,300,300,CONT_DIF_N,1206ymous_ ++B 33800,27000,300,300,CONT_VIA2,731nymous_ ++B 7600,34000,300,300,CONT_DIF_N,1049ymous_ ++B 1600,19200,300,300,CONT_BODY_P,1263ymous_ ++B 17800,31600,300,300,CONT_DIF_N,1317ymous_ ++B 6600,30000,300,300,CONT_VIA2,995nymous_ ++B 4400,6000,300,300,CONT_VIA,941nymous_ ++B 14000,12800,300,300,CONT_DIF_P,1209ymous_ ++B 38200,23400,300,300,CONT_BODY_N,887nymous_ ++B 36800,15000,300,300,CONT_VIA2,833nymous_ ++B 34800,34000,300,300,CONT_VIA2,779nymous_ ++B 33800,25000,300,300,CONT_DIF_P,725nymous_ ++B 3200,8000,300,300,CONT_VIA2,671nymous_ ++B 27000,21600,300,300,CONT_DIF_P,510nymous_ ++B 11600,17000,300,300,CONT_VIA,1156ymous_ ++B 30600,28000,300,300,CONT_VIA2,617nymous_ ++B 2800,31000,300,300,CONT_DIF_N,563nymous_ ++B 23000,22400,300,300,CONT_BODY_N,402nymous_ ++B 25000,27600,300,300,CONT_DIF_P,456nymous_ ++B 17800,30400,300,300,CONT_VIA2,1316ymous_ ++B 9200,7000,300,300,CONT_VIA2,1102ymous_ ++B 7600,33000,300,300,CONT_VIA,1048ymous_ ++B 14000,12000,300,300,CONT_DIF_P,1208ymous_ ++B 1600,37600,300,300,CONT_BODY_P,1262ymous_ ++B 6600,26000,300,300,CONT_VIA2,994nymous_ ++B 4400,6000,300,300,CONT_BODY_P,940nymous_ ++B 38200,22400,300,300,CONT_BODY_N,886nymous_ ++B 36800,15000,300,300,CONT_BODY_N,832nymous_ ++B 33800,24000,300,300,CONT_VIA,724nymous_ ++B 34800,33000,300,300,CONT_VIA2,778nymous_ ++B 3200,8000,300,300,CONT_BODY_P,670nymous_ ++B 27000,20400,300,300,CONT_DIF_P,509nymous_ ++B 12800,6000,300,300,CONT_VIA,1175ymous_ ++B 36800,16000,300,300,CONT_VIA2,835nymous_ ++B 35000,19200,300,300,CONT_BODY_N,781nymous_ ++B 33800,26000,300,300,CONT_DIF_P,727nymous_ ++B 3200,12000,300,300,CONT_BODY_N,673nymous_ ++B 30600,29000,300,300,CONT_VIA,619nymous_ ++B 25000,28800,300,300,CONT_DIF_P,458nymous_ ++B 27000,24000,300,300,CONT_DIF_P,512nymous_ ++B 11600,19200,300,300,CONT_BODY_P,1158ymous_ ++B 9200,8000,300,300,CONT_DIF_N,1104ymous_ ++B 2800,33000,300,300,CONT_DIF_N,565nymous_ ++B 23000,24400,300,300,CONT_BODY_N,404nymous_ ++B 16400,6000,300,300,CONT_BODY_P,1264ymous_ ++B 17800,31600,300,300,CONT_VIA2,1318ymous_ ++B 7600,34000,300,300,CONT_VIA,1050ymous_ ++B 6600,31000,300,300,CONT_VIA2,996nymous_ ++B 14000,16000,300,300,CONT_BODY_N,1210ymous_ ++B 4400,6000,300,300,CONT_VIA2,942nymous_ ++B 38200,24400,300,300,CONT_BODY_N,888nymous_ ++B 36800,16000,300,300,CONT_BODY_N,834nymous_ ++B 34800,35000,300,300,CONT_VIA2,780nymous_ ++B 33800,25000,300,300,CONT_VIA,726nymous_ ++B 3200,9000,300,300,CONT_BODY_P,672nymous_ ++B 27000,22800,300,300,CONT_DIF_P,511nymous_ ++B 11600,17000,300,300,CONT_VIA2,1157ymous_ ++B 30600,29000,300,300,CONT_DIF_P,618nymous_ ++B 2800,32000,300,300,CONT_DIF_N,564nymous_ ++B 23000,23400,300,300,CONT_BODY_N,403nymous_ ++B 25000,27600,300,300,CONT_VIA,457nymous_ ++B 9200,7200,300,300,CONT_DIF_N,1103ymous_ ++B 28000,21600,300,300,CONT_DIF_P,541nymous_ ++B 17400,11000,200,200,CONT_TURN1,354nymous_ ++B 17600,8000,200,200,CONT_TURN1,355nymous_ ++B 12400,23000,300,300,CONT_DIF_N,1159ymous_ ++B 9200,8000,300,300,CONT_VIA2,1105ymous_ ++B 2800,34000,300,300,CONT_DIF_N,566nymous_ ++B 23000,25400,300,300,CONT_BODY_N,405nymous_ ++B 17800,32800,300,300,CONT_DIF_N,1319ymous_ ++B 7600,35000,300,300,CONT_DIF_N,1051ymous_ ++B 6600,32000,300,300,CONT_VIA2,997nymous_ ++B 14000,17000,300,300,CONT_VIA,1211ymous_ ++B 16400,6000,300,300,CONT_VIA,1265ymous_ ++B 4400,8000,300,300,CONT_DIF_N,943nymous_ ++B 38200,25400,300,300,CONT_BODY_N,889nymous_ ++B 27000,25200,300,300,CONT_DIF_P,513nymous_ ++B 25000,30000,300,300,CONT_DIF_P,459nymous_ ++B 30600,29000,300,300,CONT_VIA2,620nymous_ ++B 3200,12000,300,300,CONT_VIA2,674nymous_ ++B 35400,22000,300,300,CONT_DIF_P,782nymous_ ++B 33800,26000,300,300,CONT_VIA,728nymous_ ++B 36800,17000,300,300,CONT_VIA,836nymous_ ++B 38200,26400,300,300,CONT_BODY_N,890nymous_ ++B 4400,9000,300,300,CONT_DIF_N,944nymous_ ++B 6600,36000,300,300,CONT_VIA2,998nymous_ ++B 16400,6000,300,300,CONT_VIA2,1266ymous_ ++B 14000,17000,300,300,CONT_VIA2,1212ymous_ ++B 7600,35000,300,300,CONT_VIA,1052ymous_ ++B 9200,10000,300,300,CONT_POLY,1106ymous_ ++B 17800,34000,300,300,CONT_DIF_N,1320ymous_ ++B 25000,30000,300,300,CONT_VIA,460nymous_ ++B 23000,26400,300,300,CONT_BODY_N,406nymous_ ++B 2800,35000,300,300,CONT_DIF_N,567nymous_ ++B 30600,30000,300,300,CONT_DIF_P,621nymous_ ++B 12400,24000,300,300,CONT_DIF_N,1160ymous_ ++B 27000,25200,300,300,CONT_VIA,514nymous_ ++B 3200,13000,300,300,CONT_BODY_N,675nymous_ ++B 33800,27000,300,300,CONT_DIF_P,729nymous_ ++B 35400,23000,300,300,CONT_DIF_P,783nymous_ ++B 36800,17000,300,300,CONT_VIA2,837nymous_ ++B 38200,27400,300,300,CONT_BODY_N,891nymous_ ++B 14600,19200,300,300,CONT_BODY_P,1213ymous_ ++B 4400,11800,300,300,CONT_DIF_P,945nymous_ ++B 6600,19200,300,300,CONT_BODY_P,999nymous_ ++B 17800,35200,300,300,CONT_DIF_N,1321ymous_ ++B 16400,8000,300,300,CONT_DIF_N,1267ymous_ ++B 7600,36000,300,300,CONT_DIF_N,1053ymous_ ++B 9200,12000,300,300,CONT_DIF_P,1107ymous_ ++B 25000,31200,300,300,CONT_DIF_P,461nymous_ ++B 23000,27400,300,300,CONT_BODY_N,407nymous_ ++B 2800,36000,300,300,CONT_DIF_N,568nymous_ ++B 30600,30000,300,300,CONT_VIA,622nymous_ ++B 12400,25000,300,300,CONT_DIF_N,1161ymous_ ++B 27000,26400,300,300,CONT_DIF_P,515nymous_ ++B 3200,13000,300,300,CONT_VIA2,676nymous_ ++B 33800,27000,300,300,CONT_VIA,730nymous_ ++B 35400,24000,300,300,CONT_DIF_P,784nymous_ ++B 37000,22000,300,300,CONT_DIF_P,838nymous_ ++B 38200,28400,300,300,CONT_BODY_N,892nymous_ ++B 4400,12800,300,300,CONT_DIF_P,946nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pi_mpx.vbe b/alliance/src/cells/src/mpxlib/pi_mpx.vbe +new file mode 100644 +index 0000000..4e2b19e +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pi_mpx.vbe +@@ -0,0 +1,30 @@ ++ENTITY pi_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_pad : NATURAL := 654; ++ CONSTANT tpll_pad : NATURAL := 1487; ++ CONSTANT rdown_pad : NATURAL := 234; ++ CONSTANT tphh_pad : NATURAL := 233; ++ CONSTANT rup_pad : NATURAL := 273 ++ ); ++ PORT ( ++ pad : in BIT; ++ t : out BIT; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pi_mpx; ++ ++ ++ARCHITECTURE behaviour_data_flow OF pi_mpx IS ++ ++BEGIN ++ t <= pad; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pi_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/piot_mpx.ap b/alliance/src/cells/src/mpxlib/piot_mpx.ap +new file mode 100644 +index 0000000..080fb5d +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/piot_mpx.ap +@@ -0,0 +1,1563 @@ ++V ALLIANCE : 6 ++H piot_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 28800,9000,29000,9000,200,i,RIGHT,POLY ++S 28000,-300,28000,10900,400,i,UP,ALU2 ++S 28000,0,28000,0,400,i,RIGHT,CALU5 ++S 28000,0,28000,0,400,i,RIGHT,CALU4 ++S 27800,11800,28200,11800,200,i,RIGHT,POLY ++S 30000,-100,30000,10900,400,b,UP,ALU2 ++S 30000,0,30000,0,400,b,RIGHT,CALU5 ++S 30000,0,30000,0,400,b,RIGHT,CALU4 ++S 29600,9800,29600,11400,200,b,UP,POLY ++S 8000,0,8000,0,400,t,RIGHT,CALU5 ++S 8000,0,8000,0,400,t,RIGHT,CALU4 ++S 29000,35100,29000,39700,400,pad,UP,ALU1 ++S 29000,25900,29000,34900,400,pad,UP,ALU1 ++S 28600,33000,29000,33000,600,pad,RIGHT,POLY ++S 28600,31800,29000,31800,600,pad,RIGHT,POLY ++S 28600,30600,29000,30600,600,pad,RIGHT,POLY ++S 28600,25800,29000,25800,600,pad,RIGHT,POLY ++S 20000,48100,20000,71900,24400,pad,UP,CALU1 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 16800,35800,17200,35800,200,vdde,RIGHT,POLY ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 3600,22200,5200,22200,200,vdde,RIGHT,POLY ++S 25100,28800,27900,28800,400,vdde,RIGHT,ALU1 ++S 25100,26400,27900,26400,400,vdde,RIGHT,ALU1 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 6800,22200,8400,22200,200,vdde,RIGHT,POLY ++S 25100,21600,27900,21600,400,vdde,RIGHT,ALU1 ++S 10500,21800,14300,21800,400,vdde,RIGHT,ALU2 ++S 16800,29900,16800,38300,400,vdde,UP,ALU2 ++S 16800,34600,17200,34600,200,vdde,RIGHT,POLY ++S 16800,33400,17200,33400,200,vdde,RIGHT,POLY ++S 16800,32200,17200,32200,200,vdde,RIGHT,POLY ++S 24000,34200,24400,34200,600,vdde,RIGHT,POLY ++S 24000,35800,24400,35800,600,vdde,RIGHT,POLY ++S 25100,24000,27900,24000,400,vdde,RIGHT,ALU1 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 3100,16000,36900,16000,2400,vddi,RIGHT,ALU1 ++S 20000,9600,20000,11000,200,vddi,UP,POLY ++S 17800,22900,17800,31900,400,vsse,UP,ALU2 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 7600,22900,7600,37500,400,vsse,UP,ALU1 ++S 4400,22900,4400,37500,400,vsse,UP,ALU1 ++S 30400,36400,30400,36600,200,vsse,UP,POLY ++S 20800,22900,20800,37100,400,vsse,UP,ALU1 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 3100,6000,36900,6000,2400,vssi,RIGHT,ALU1 ++S 27800,11800,27800,12400,200,92onymous_,UP,POLY ++S 17500,22600,19100,22600,200,n6d,RIGHT,NTRANS ++S 6800,22500,6800,36700,200,n14c,UP,NTRANS ++S 700,34000,16100,34000,2400,248nymous_,RIGHT,ALU2 ++S 14600,11100,14600,13100,200,p17c,UP,PTRANS ++S 34800,20200,34800,20600,600,169nymous_,UP,POLY ++S 30800,10600,33800,10600,200,cnbb,RIGHT,POLY ++S 30800,8100,30800,12900,400,cnbb,UP,ALU1 ++S 29000,200,29000,2000,0,10onymous_,UP,TALU3 ++S 17700,22000,18900,22000,620,318nymous_,RIGHT,NDIF ++S 24900,20400,28100,20400,620,51onymous_,RIGHT,PDIF ++S 6200,10900,6200,14900,200,p18b,UP,PTRANS ++S 27800,9800,32600,9800,200,91onymous_,RIGHT,POLY ++S 30800,12700,30800,14300,620,126nymous_,UP,PDIF ++S 17700,23200,18900,23200,620,319nymous_,RIGHT,NDIF ++S 14800,22500,14800,36700,200,n15d,UP,NTRANS ++S 24900,21600,28100,21600,420,52onymous_,RIGHT,PDIF ++S 35600,200,35600,2000,9000,11onymous_,UP,TALU3 ++S 35000,7300,35000,8300,200,n5b,UP,NTRANS ++S 6800,6100,6800,7900,400,210nymous_,UP,ALU1 ++S 27800,12500,27800,14500,200,p1,UP,PTRANS ++S 17700,25600,18900,25600,620,321nymous_,RIGHT,NDIF ++S 15200,7500,15200,9100,620,286nymous_,UP,NDIF ++S 6800,7500,6800,9100,620,211nymous_,UP,NDIF ++S 18000,200,18000,12000,18000,13onymous_,UP,TALU5 ++S 10400,7500,10400,9100,420,249nymous_,UP,NDIF ++S 35000,12700,35000,14700,200,p5b,UP,PTRANS ++S 30800,13100,30800,13900,400,127nymous_,UP,ALU1 ++S 24900,22800,28100,22800,420,53onymous_,RIGHT,PDIF ++S 15300,37600,20700,37600,400,285nymous_,RIGHT,ALU1 ++S 17700,24400,18900,24400,620,320nymous_,RIGHT,NDIF ++S 3400,200,3400,12000,7000,12onymous_,UP,TALU5 ++S 24900,24000,28100,24000,420,54onymous_,RIGHT,PDIF ++S 31000,5700,31000,11300,400,128nymous_,UP,ALU2 ++S 35400,21100,35400,36500,620,170nymous_,UP,PDIF ++S 29000,200,29000,12000,0,14onymous_,UP,TALU5 ++S 6900,10000,12700,10000,400,212nymous_,RIGHT,ALU1 ++S 17700,26800,18900,26800,620,322nymous_,RIGHT,NDIF ++S 15200,8100,15200,8900,400,287nymous_,UP,ALU1 ++S 24900,25200,28100,25200,420,55onymous_,RIGHT,PDIF ++S 30700,6000,32300,6000,400,129nymous_,RIGHT,ALU2 ++S 35400,21300,35400,39700,400,171nymous_,UP,ALU1 ++S 35600,200,35600,12000,9000,15onymous_,UP,TALU5 ++S 6800,11100,6800,14700,620,213nymous_,UP,PDIF ++S 17700,28000,18900,28000,620,323nymous_,RIGHT,NDIF ++S 15200,11100,15200,12500,400,288nymous_,UP,ALU1 ++S 24900,26400,28100,26400,420,56onymous_,RIGHT,PDIF ++S 30700,10000,36100,10000,2400,130nymous_,RIGHT,ALU2 ++S 35100,13000,37100,13000,2400,172nymous_,RIGHT,ALU2 ++S 17700,29200,18900,29200,620,324nymous_,RIGHT,NDIF ++S 0,6000,40000,6000,12000,16onymous_,RIGHT,TALU6 ++S 6800,12100,6800,15900,400,214nymous_,UP,ALU1 ++S 15200,11300,15200,12900,620,289nymous_,UP,PDIF ++S 24900,27600,28100,27600,420,57onymous_,RIGHT,PDIF ++S 31400,20900,31400,34300,200,p14a,UP,PTRANS ++S 35600,6100,35600,7900,400,173nymous_,UP,ALU1 ++S 17700,30400,18900,30400,620,325nymous_,RIGHT,NDIF ++S 15600,20700,15600,36300,400,290nymous_,UP,ALU1 ++S 2800,20500,2800,36300,400,94onymous_,UP,ALU1 ++S 20000,40100,20000,59900,4400,17onymous_,UP,ALU1 ++S 7000,6900,7000,14300,400,215nymous_,UP,ALU2 ++S 10100,7600,27300,7600,1200,250nymous_,RIGHT,ALU2 ++S 24900,28800,28100,28800,420,58onymous_,RIGHT,PDIF ++S 31400,35300,31400,36100,200,p11,UP,PTRANS ++S 24900,30000,28100,30000,420,59onymous_,RIGHT,PDIF ++S 10400,8100,10400,8900,400,251nymous_,UP,ALU1 ++S 15600,22700,15600,36500,620,291nymous_,UP,NDIF ++S 17700,31600,18900,31600,620,326nymous_,RIGHT,NDIF ++S 7400,7300,7400,9300,200,n18c,UP,NTRANS ++S 20000,8100,20000,8500,400,18onymous_,UP,ALU1 ++S 2800,22700,2800,36500,620,95onymous_,UP,NDIF ++S 35600,7500,35600,8100,620,174nymous_,UP,NDIF ++S 31400,19100,31400,28300,400,131nymous_,UP,ALU2 ++S 35600,12900,35600,14500,620,175nymous_,UP,PDIF ++S 7400,9600,7400,10600,200,216nymous_,UP,POLY ++S 17700,32800,18900,32800,620,327nymous_,RIGHT,NDIF ++S 15300,18200,21300,18200,400,292nymous_,RIGHT,ALU2 ++S 24900,31200,28100,31200,420,60onymous_,RIGHT,PDIF ++S 10400,11100,10400,13700,400,252nymous_,UP,ALU1 ++S 2200,13600,37800,13600,6800,96onymous_,RIGHT,NWELL ++S 31600,20200,31600,20600,600,132nymous_,UP,POLY ++S 35600,13100,35600,15900,400,176nymous_,UP,ALU1 ++S 2900,20600,15500,20600,400,pad2,RIGHT,ALU1 ++S 2700,20600,15700,20600,400,pad2,RIGHT,ALU1 ++S 21000,12700,21000,18500,400,pad2,UP,ALU2 ++S 20000,8500,20000,9100,620,pad2,UP,NDIF ++S 7400,10900,7400,14900,200,p18c,UP,PTRANS ++S 17700,34000,18900,34000,620,328nymous_,RIGHT,NDIF ++S 15600,17900,15600,20500,400,293nymous_,UP,ALU2 ++S 24900,32400,28100,32400,420,61onymous_,RIGHT,PDIF ++S 10400,11100,10400,14700,620,253nymous_,UP,PDIF ++S 24900,33600,28100,33600,420,62onymous_,RIGHT,PDIF ++S 15800,23700,15800,32300,400,294nymous_,UP,ALU2 ++S 17700,35200,18900,35200,620,329nymous_,RIGHT,NDIF ++S 7600,21800,7600,22200,600,217nymous_,UP,POLY ++S 35300,17000,37100,17000,400,177nymous_,RIGHT,ALU2 ++S 31800,12000,31800,12200,200,133nymous_,UP,POLY ++S 20000,11100,20000,15900,400,19onymous_,UP,ALU1 ++S 28200,9100,28200,11700,400,97onymous_,UP,ALU1 ++S 10700,39600,35500,39600,2400,254nymous_,RIGHT,ALU1 ++S 28300,9000,28700,9000,400,98onymous_,RIGHT,ALU1 ++S 31700,6000,37100,6000,400,134nymous_,RIGHT,ALU2 ++S 36000,20200,36000,20600,600,178nymous_,UP,POLY ++S 20000,12700,20000,17300,400,20onymous_,UP,ALU2 ++S 7300,21800,10100,21800,400,218nymous_,RIGHT,ALU2 ++S 17700,36400,18900,36400,620,330nymous_,RIGHT,NDIF ++S 15800,7300,15800,9300,200,n17d,UP,NTRANS ++S 24900,35000,28100,35000,820,63onymous_,RIGHT,PDIF ++S 10800,21800,10800,22200,600,255nymous_,UP,POLY ++S 28400,7500,28400,8100,620,99onymous_,UP,NDIF ++S 32000,7500,32000,8100,620,135nymous_,UP,NDIF ++S 3600,22500,3600,36700,200,n14a,UP,NTRANS ++S 15800,9600,15800,10800,200,295nymous_,UP,POLY ++S 20600,8300,20600,9300,200,n16c,UP,NTRANS ++S 7600,22700,7600,36500,620,219nymous_,UP,NDIF ++S 17700,8000,22300,8000,400,331nymous_,RIGHT,ALU1 ++S 10800,22700,10800,36500,620,256nymous_,UP,NDIF ++S 28500,8000,30700,8000,400,100nymous_,RIGHT,ALU1 ++S 24900,36400,28100,36400,620,64onymous_,RIGHT,PDIF ++S 3600,22200,5200,22200,200,179nymous_,RIGHT,POLY ++S 31700,7600,37100,7600,1200,136nymous_,RIGHT,ALU2 ++S 20800,19300,20800,37500,400,21onymous_,UP,ALU1 ++S 7600,22900,7600,37500,400,220nymous_,UP,ALU1 ++S 17600,8100,17600,8500,400,332nymous_,UP,ALU1 ++S 15800,11100,15800,13100,200,p17d,UP,PTRANS ++S 28400,12700,28400,14300,620,101nymous_,UP,PDIF ++S 24800,7500,24800,8100,620,65onymous_,UP,NDIF ++S 3480,16000,36920,16000,600,180nymous_,RIGHT,NTIE ++S 10800,22900,10800,39700,400,257nymous_,UP,ALU1 ++S 32000,8100,32000,12900,400,137nymous_,UP,ALU1 ++S 17600,8500,17600,9100,620,333nymous_,UP,NDIF ++S 1700,37600,9500,37600,400,296nymous_,RIGHT,ALU1 ++S 28400,14100,28400,15900,400,102nymous_,UP,ALU1 ++S 24800,8100,24800,13900,400,66onymous_,UP,ALU1 ++S 20800,19080,20800,37720,600,22onymous_,UP,PTIE ++S 7600,22700,7600,38300,2400,221nymous_,UP,ALU2 ++S 11000,7300,11000,9300,200,n18f,UP,NTRANS ++S 32000,12900,32000,14500,620,138nymous_,UP,PDIF ++S 36200,20900,36200,36700,200,p14d,UP,PTRANS ++S 17600,12500,17600,12900,620,334nymous_,UP,PDIF ++S 1700,19200,20700,19200,400,297nymous_,RIGHT,ALU1 ++S 28700,24600,30300,24600,400,103nymous_,RIGHT,ALU2 ++S 24800,13100,24800,14500,620,67onymous_,UP,PDIF ++S 21000,13100,21000,13900,400,23onymous_,UP,ALU1 ++S 8000,-100,8000,11300,400,222nymous_,UP,ALU2 ++S 11000,9600,11000,10600,200,258nymous_,UP,POLY ++S 3200,5880,3200,8720,600,139nymous_,UP,PTIE ++S 36700,37600,38100,37600,400,181nymous_,RIGHT,ALU1 ++S 17700,12800,18300,12800,400,335nymous_,RIGHT,ALU1 ++S 1480,19200,20920,19200,600,298nymous_,RIGHT,PTIE ++S 13200,22200,14800,22200,200,cn,RIGHT,POLY ++S 10000,22200,11600,22200,200,cn,RIGHT,POLY ++S 4100,21800,7900,21800,400,cn,RIGHT,ALU2 ++S 25100,22800,27900,22800,400,cn,RIGHT,ALU1 ++S 25100,20400,27900,20400,400,cn,RIGHT,ALU1 ++S 25000,20100,25000,23100,400,cn,UP,ALU2 ++S 21100,13000,22300,13000,400,24onymous_,RIGHT,ALU1 ++S 3200,6100,3200,9100,400,140nymous_,UP,ALU1 ++S 11000,10900,11000,14900,200,p18f,UP,PTRANS ++S 36800,5880,36800,8720,600,182nymous_,UP,PTIE ++S 17900,22000,18700,22000,400,336nymous_,RIGHT,ALU1 ++S 1600,19300,1600,37500,400,299nymous_,UP,ALU1 ++S 25100,37000,27900,37000,1600,fbul,RIGHT,ALU1 ++S 25100,25200,27900,25200,400,fbul,RIGHT,ALU1 ++S 11600,22500,11600,36700,200,n15b,UP,NTRANS ++S 21200,8500,21200,9100,420,25onymous_,UP,NDIF ++S 3200,5700,3200,16100,400,141nymous_,UP,ALU2 ++S 36800,6100,36800,9100,400,183nymous_,UP,ALU1 ++S 17900,23200,18700,23200,400,337nymous_,RIGHT,ALU1 ++S 1600,19080,1600,37720,600,300nymous_,UP,PTIE ++S 8000,7500,8000,9100,420,223nymous_,UP,NDIF ++S 11600,6100,11600,8900,400,259nymous_,UP,ALU1 ++S 21200,9100,21200,9900,400,26onymous_,UP,ALU1 ++S 2900,6000,7100,6000,400,142nymous_,RIGHT,ALU2 ++S 36800,6900,36800,17300,400,184nymous_,UP,ALU2 ++S 29000,7300,29000,8300,200,n1,UP,NTRANS ++S 16400,29900,16400,32300,400,301nymous_,UP,ALU2 ++S 17900,24400,18700,24400,400,338nymous_,RIGHT,ALU1 ++S 8000,8100,8000,8900,400,224nymous_,UP,ALU1 ++S 11600,7500,11600,9100,420,260nymous_,UP,NDIF ++S 18500,31600,25300,31600,400,cpd,RIGHT,ALU2 ++S 18800,21900,18800,36700,400,cpd,UP,ALU2 ++S 25100,32400,27900,32400,400,cpd,RIGHT,ALU1 ++S 25100,30000,27900,30000,400,cpd,RIGHT,ALU1 ++S 25100,27600,27900,27600,400,cpd,RIGHT,ALU1 ++S 25000,27300,25000,32700,400,cpd,UP,ALU2 ++S 21800,8300,21800,9300,200,n16d,UP,NTRANS ++S 2900,10000,6300,10000,2400,143nymous_,RIGHT,ALU2 ++S 36800,11100,36800,15900,400,185nymous_,UP,ALU1 ++S 16400,6100,16400,8900,400,302nymous_,UP,ALU1 ++S 17900,25600,18700,25600,400,339nymous_,RIGHT,ALU1 ++S 22000,21900,22000,28500,400,27onymous_,UP,ALU2 ++S 8000,11100,8000,13700,400,225nymous_,UP,ALU1 ++S 11600,11100,11600,14700,620,261nymous_,UP,PDIF ++S 29000,8600,29000,9000,200,104nymous_,UP,POLY ++S 3200,11100,3200,15900,400,144nymous_,UP,ALU1 ++S 19500,36800,26300,36800,400,node_cp,RIGHT,ALU2 ++S 17900,35200,19700,35200,400,node_cp,RIGHT,ALU1 ++S 17900,32800,19700,32800,400,node_cp,RIGHT,ALU1 ++S 34600,20600,36200,20600,200,node_cp,RIGHT,POLY ++S 31400,20600,33000,20600,200,node_cp,RIGHT,POLY ++S 28600,24600,29000,24600,600,node_cp,RIGHT,POLY ++S 27700,24600,29300,24600,400,node_cp,RIGHT,ALU2 ++S 28000,24300,28000,31500,400,node_cp,UP,ALU2 ++S 25100,33600,27900,33600,400,node_cp,RIGHT,ALU1 ++S 25100,31200,27900,31200,400,node_cp,RIGHT,ALU1 ++S 36800,10880,36800,16120,600,186nymous_,UP,NTIE ++S 16400,7500,16400,9100,620,303nymous_,UP,NDIF ++S 17900,26800,18700,26800,400,340nymous_,RIGHT,ALU1 ++S 8000,11100,8000,14700,620,226nymous_,UP,PDIF ++S 11600,11900,11600,15900,400,262nymous_,UP,ALU1 ++S 29000,11400,29000,12200,200,105nymous_,UP,POLY ++S 22000,17900,22000,19500,400,28onymous_,UP,ALU2 ++S 3200,10880,3200,16120,600,145nymous_,UP,NTIE ++S 37000,21100,37000,36500,620,187nymous_,UP,PDIF ++S 16400,11300,16400,12900,620,304nymous_,UP,PDIF ++S 8400,22500,8400,36700,200,n14d,UP,NTRANS ++S 17900,28000,18700,28000,400,341nymous_,RIGHT,ALU1 ++S 900,37000,8900,37000,2400,263nymous_,RIGHT,ALU2 ++S 29000,11400,32600,11400,200,106nymous_,RIGHT,POLY ++S 25100,35000,29100,35000,400,68onymous_,RIGHT,ALU1 ++S 21700,18200,25100,18200,400,29onymous_,RIGHT,ALU2 ++S 2900,15400,19300,15400,1200,146nymous_,RIGHT,ALU2 ++S 37000,21300,37000,36300,400,188nymous_,UP,ALU1 ++S 16400,12100,16400,15900,400,305nymous_,UP,ALU1 ++S 8600,7300,8600,9300,200,n18d,UP,NTRANS ++S 17900,30400,18700,30400,400,342nymous_,RIGHT,ALU1 ++S 900,19000,9300,19000,2400,264nymous_,RIGHT,ALU2 ++S 29000,12500,29000,14500,200,p2,UP,PTRANS ++S 22000,19300,22000,22100,400,30onymous_,UP,ALU1 ++S 2900,17000,19100,17000,400,147nymous_,RIGHT,ALU2 ++S 37000,17700,37000,38300,2400,189nymous_,UP,ALU2 ++S 16500,20200,24300,20200,400,306nymous_,RIGHT,ALU2 ++S 8600,9600,8600,10600,200,227nymous_,UP,POLY ++S 17900,31600,18700,31600,400,343nymous_,RIGHT,ALU1 ++S 12200,7300,12200,9300,200,n17a,UP,NTRANS ++S 28700,18200,34700,18200,400,107nymous_,RIGHT,ALU2 ++S 25400,7300,25400,8300,200,n4b,UP,NTRANS ++S 32200,21100,32200,36500,620,148nymous_,UP,PDIF ++S 24000,28200,24400,28200,600,cpb,RIGHT,POLY ++S 19800,22700,19800,30900,400,cpb,UP,ALU1 ++S 19400,31000,19800,31000,200,cpb,RIGHT,POLY ++S 19400,27400,19800,27400,200,cpb,RIGHT,POLY ++S 24000,27000,24400,27000,600,cpb,RIGHT,POLY ++S 19500,28200,24300,28200,400,cpb,RIGHT,ALU2 ++S 19400,26200,19800,26200,200,cpb,RIGHT,POLY ++S 19400,22600,19800,22600,200,cpb,RIGHT,POLY ++S 24800,12700,24800,18500,400,cpb,UP,ALU2 ++S 24000,29200,24400,29200,600,cpb,RIGHT,POLY ++S 38200,19300,38200,37500,400,190nymous_,UP,ALU1 ++S 16800,20300,16800,23300,400,307nymous_,UP,ALU1 ++S 17900,34000,18700,34000,400,344nymous_,RIGHT,ALU1 ++S 8600,10900,8600,14900,200,p18d,UP,PTRANS ++S 12200,9600,12200,10800,200,265nymous_,UP,POLY ++S 22400,8100,22400,8500,400,31onymous_,UP,ALU1 ++S 32200,21300,32200,39700,400,149nymous_,UP,ALU1 ++S 25400,8600,25400,12400,200,69onymous_,UP,POLY ++S 38200,19080,38200,37920,600,191nymous_,UP,NTIE ++S 29000,18300,29000,19500,400,108nymous_,UP,ALU2 ++S 16500,21200,25300,21200,400,308nymous_,RIGHT,ALU2 ++S 9200,20700,9200,36300,400,228nymous_,UP,ALU1 ++S 12200,10000,16400,10000,600,nnt,RIGHT,POLY ++S 22400,8500,22400,9100,620,32onymous_,UP,NDIF ++S 32600,7300,32600,8300,200,n0,UP,NTRANS ++S 17900,36400,18700,36400,400,345nymous_,RIGHT,ALU1 ++S 27200,8100,27200,12900,400,cpbb,UP,ALU1 ++S 25400,10600,27200,10600,200,cpbb,RIGHT,POLY ++S 3900,7600,7300,7600,1200,192nymous_,RIGHT,ALU2 ++S 29300,37000,31900,37000,2400,109nymous_,RIGHT,ALU2 ++S 16800,20900,16800,24700,400,309nymous_,UP,ALU2 ++S 9200,22700,9200,36500,620,229nymous_,UP,NDIF ++S 12200,11100,12200,13100,200,p17a,UP,PTRANS ++S 23600,12900,23600,14500,620,44onymous_,UP,PDIF ++S 32600,8600,32600,9800,200,150nymous_,UP,POLY ++S 25400,12700,25400,14700,200,p4b,UP,PTRANS ++S 22400,8700,22400,12900,400,33onymous_,UP,ALU1 ++S 4400,21800,4400,22200,600,193nymous_,UP,POLY ++S 1800,17700,1800,38300,1600,346nymous_,UP,ALU2 ++S 16800,23200,16800,25400,600,310nymous_,UP,POLY ++S 29480,37600,38520,37600,600,110nymous_,RIGHT,NTIE ++S 8900,6000,26300,6000,400,230nymous_,RIGHT,ALU2 ++S 12400,20700,12400,36300,400,266nymous_,UP,ALU1 ++S 23600,13100,23600,15900,400,45onymous_,UP,ALU1 ++S 26000,21300,26000,24300,400,70onymous_,UP,ALU2 ++S 22100,17000,23700,17000,400,34onymous_,RIGHT,ALU2 ++S 32600,11400,32600,12400,200,151nymous_,UP,POLY ++S 4400,22700,4400,36500,620,194nymous_,UP,NDIF ++S 18200,8300,18200,9300,200,n16a,UP,NTRANS ++S 16800,24100,16800,29500,400,311nymous_,UP,ALU2 ++S 29600,7100,29600,8100,620,111nymous_,UP,NDIF ++S 9200,6100,9200,7900,400,231nymous_,UP,ALU1 ++S 12400,22700,12400,36500,620,267nymous_,UP,NDIF ++S 24000,27100,24000,29100,400,46onymous_,UP,ALU1 ++S 26000,23700,26000,29100,400,71onymous_,UP,ALU2 ++S 23100,37600,27700,37600,400,35onymous_,RIGHT,ALU1 ++S 32600,12700,32600,14700,200,p0,UP,PTRANS ++S 18200,9600,21800,9600,200,347nymous_,RIGHT,POLY ++S 29300,10600,30300,10600,400,112nymous_,RIGHT,ALU2 ++S 4400,22900,4400,37500,400,195nymous_,UP,ALU1 ++S 24000,33900,24000,36100,400,47onymous_,UP,ALU2 ++S 9200,5700,9200,11300,400,232nymous_,UP,ALU2 ++S 16900,24400,17700,24400,400,312nymous_,RIGHT,ALU1 ++S 12400,18500,12400,22100,2400,268nymous_,UP,ALU2 ++S 32800,20200,32800,20600,600,152nymous_,UP,POLY ++S 26000,30900,26000,37100,400,72onymous_,UP,ALU2 ++S 23000,11700,23000,17300,2000,36onymous_,UP,ALU2 ++S 18400,10100,18400,12700,400,348nymous_,UP,ALU1 ++S 16800,25500,16800,28100,400,313nymous_,UP,ALU1 ++S 29600,12700,29600,14300,620,113nymous_,UP,PDIF ++S 4400,22700,4400,38300,2400,196nymous_,UP,ALU2 ++S 9200,7500,9200,9100,620,233nymous_,UP,NDIF ++S 12800,7500,12800,9100,620,269nymous_,UP,NDIF ++S 33000,20900,33000,36700,200,p14b,UP,PTRANS ++S 26000,6100,26000,7900,400,73onymous_,UP,ALU1 ++S 23000,19300,23000,37500,400,37onymous_,UP,ALU1 ++S 18800,8500,18800,9100,420,349nymous_,UP,NDIF ++S 29600,13100,29600,13900,400,114nymous_,UP,ALU1 ++S 24000,18900,24000,20500,400,48onymous_,UP,ALU2 ++S 4400,6100,4400,8900,400,197nymous_,UP,ALU1 ++S 8900,10000,26300,10000,2400,234nymous_,RIGHT,ALU2 ++S 12800,8100,12800,12500,400,270nymous_,UP,ALU1 ++S 9300,25000,16100,25000,2400,237nymous_,RIGHT,ALU2 ++S 17000,12300,17000,13100,200,p16,UP,PTRANS ++S 24200,7300,24200,8300,200,n4a,UP,NTRANS ++S 26000,12900,26000,14500,620,76onymous_,UP,PDIF ++S 33200,12900,33200,14500,620,155nymous_,UP,PDIF ++S 22880,19200,38320,19200,600,40onymous_,RIGHT,NTIE ++S 12900,11000,17300,11000,400,272nymous_,RIGHT,ALU1 ++S 18500,17000,20300,17000,400,351nymous_,RIGHT,ALU2 ++S 9300,31000,16100,31000,2400,238nymous_,RIGHT,ALU2 ++S 24200,8600,25400,8600,200,49onymous_,RIGHT,POLY ++S 26000,13100,26000,15900,400,77onymous_,UP,ALU1 ++S 33200,13100,33200,15900,400,156nymous_,UP,ALU1 ++S 23080,37600,29920,37600,600,41onymous_,RIGHT,NTIE ++S 12800,11300,12800,12900,620,273nymous_,UP,PDIF ++S 19400,8300,19400,9300,200,n16b,UP,NTRANS ++S 4400,11900,4400,15900,400,200nymous_,UP,ALU1 ++S 23000,19080,23000,37920,600,38onymous_,UP,NTIE ++S 33200,6100,33200,7900,400,153nymous_,UP,ALU1 ++S 16800,28200,16800,29800,600,314nymous_,UP,POLY ++S 26000,7500,26000,8100,620,74onymous_,UP,NDIF ++S 30000,19900,30000,24900,400,115nymous_,UP,ALU2 ++S 4400,7500,4400,9100,620,198nymous_,UP,NDIF ++S 9200,11100,9200,14700,620,235nymous_,UP,PDIF ++S 18800,9100,18800,9900,400,350nymous_,UP,ALU1 ++S 12900,9000,15100,9000,400,271nymous_,RIGHT,ALU1 ++S 23100,19200,38100,19200,400,39onymous_,RIGHT,ALU1 ++S 33200,7500,33200,8100,620,154nymous_,UP,NDIF ++S 16900,29200,18700,29200,400,315nymous_,RIGHT,ALU1 ++S 26000,8700,26000,14300,400,75onymous_,UP,ALU2 ++S 16800,29800,17200,29800,200,cnb,RIGHT,POLY ++S 16800,28600,17200,28600,200,cnb,RIGHT,POLY ++S 16800,25000,17200,25000,200,cnb,RIGHT,POLY ++S 16800,23800,17200,23800,200,cnb,RIGHT,POLY ++S 34400,12700,34400,18500,400,cnb,UP,ALU2 ++S 29000,17900,29000,23700,400,cnb,UP,ALU2 ++S 28600,23400,29000,23400,600,cnb,RIGHT,POLY ++S 28600,22200,29000,22200,600,cnb,RIGHT,POLY ++S 28600,21000,29000,21000,600,cnb,RIGHT,POLY ++S 23700,19200,29300,19200,400,cnb,RIGHT,ALU2 ++S 4400,11100,4400,14700,620,199nymous_,UP,PDIF ++S 9200,12100,9200,15900,400,236nymous_,UP,ALU1 ++S 13200,22500,13200,36700,200,n15c,UP,NTRANS ++S 4100,13000,20300,13000,2400,201nymous_,RIGHT,ALU2 ++S 30100,20200,35900,20200,400,116nymous_,RIGHT,ALU1 ++S 26000,13700,26000,16100,400,78onymous_,UP,ALU2 ++S 23600,6100,23600,7900,400,42onymous_,UP,ALU1 ++S 33400,11700,33400,17300,400,157nymous_,UP,ALU2 ++S 24200,12700,24200,14700,200,p4a,UP,PTRANS ++S 13400,7300,13400,9300,200,n17b,UP,NTRANS ++S 23600,7500,23600,8100,620,43onymous_,UP,NDIF ++S 9800,21500,9800,23100,400,239nymous_,UP,ALU2 ++S 33800,21100,33800,36500,620,158nymous_,UP,PDIF ++S 5000,7300,5000,9300,200,n18a,UP,NTRANS ++S 19800,32900,19800,35100,400,352nymous_,UP,ALU1 ++S 30200,7300,30200,8300,200,n3,UP,NTRANS ++S 25700,15400,32500,15400,1200,79onymous_,RIGHT,ALU2 ++S 24200,12400,25400,12400,200,50onymous_,RIGHT,POLY ++S 5000,9600,5000,10600,200,202nymous_,UP,POLY ++S 9500,22800,17100,22800,400,240nymous_,RIGHT,ALU2 ++S 33800,21300,33800,36300,400,159nymous_,UP,ALU1 ++S 13400,9600,13400,10800,200,274nymous_,UP,POLY ++S 25700,17000,33500,17000,400,80onymous_,RIGHT,ALU2 ++S 17500,23800,19100,23800,200,n7d,RIGHT,NTRANS ++S 24700,21000,28300,21000,200,p7c,RIGHT,PTRANS ++S 30200,8600,30200,9000,200,117nymous_,UP,POLY ++S 17000,12000,17400,12000,200,nt,RIGHT,POLY ++S 5000,10000,11000,10000,600,nt,RIGHT,POLY ++S 9500,37000,17100,37000,2400,241nymous_,RIGHT,ALU2 ++S 19800,34900,19800,37100,400,353nymous_,UP,ALU2 ++S 33800,7300,33800,8300,200,n5a,UP,NTRANS ++S 17500,25000,19100,25000,200,n7c,RIGHT,NTRANS ++S 13400,11100,13400,13100,200,p17b,UP,PTRANS ++S 2700,20200,15700,20200,400,81onymous_,RIGHT,ALU1 ++S 24700,22200,28300,22200,200,p7b,RIGHT,PTRANS ++S 30200,12000,31800,12000,200,eb,RIGHT,POLY ++S 30200,9000,31800,9000,200,eb,RIGHT,POLY ++S 33800,8600,33800,12400,200,160nymous_,UP,POLY ++S 5000,10900,5000,14900,200,p18a,UP,PTRANS ++S 9800,7300,9800,9300,200,n18e,UP,NTRANS ++S 17500,26200,19100,26200,200,n6c,RIGHT,NTRANS ++S 14000,21800,14000,22200,600,275nymous_,UP,POLY ++S 26400,18600,26400,38600,8400,82onymous_,UP,NWELL ++S 24700,23400,28300,23400,200,p7a,RIGHT,PTRANS ++S 30200,12000,30200,12200,200,118nymous_,UP,POLY ++S 50,6000,6800,6000,12000,0nonymous_,RIGHT,TALU2 ++S 5200,22500,5200,36700,200,n14b,UP,NTRANS ++S 9800,9600,9800,10600,200,242nymous_,UP,POLY ++S 24700,24600,28300,24600,200,p10,RIGHT,PTRANS ++S 33800,8600,35000,8600,200,161nymous_,RIGHT,POLY ++S 17500,27400,19100,27400,200,n6b,RIGHT,NTRANS ++S 14000,22700,14000,36500,620,276nymous_,UP,NDIF ++S 27000,24900,27000,36700,400,83onymous_,UP,ALU2 ++S 5600,7500,5600,9100,420,203nymous_,UP,NDIF ++S 9800,10900,9800,14900,200,p18e,UP,PTRANS ++S 9200,6000,26800,6000,12000,1nonymous_,RIGHT,TALU2 ++S 24700,25800,28300,25800,200,p13,RIGHT,PTRANS ++S 30200,12500,30200,14500,200,p3,UP,PTRANS ++S 33800,12700,33800,14700,200,p5a,UP,PTRANS ++S 17500,28600,19100,28600,200,n7b,RIGHT,NTRANS ++S 14000,22900,14000,39700,400,277nymous_,UP,ALU1 ++S 27000,6900,27000,14300,400,84onymous_,UP,ALU2 ++S 5600,8100,5600,13700,400,1.nq,UP,ALU1 ++S 10000,22500,10000,36700,200,n15a,UP,NTRANS ++S 33800,12400,35000,12400,200,162nymous_,RIGHT,POLY ++S 17500,29800,19100,29800,200,n7a,RIGHT,NTRANS ++S 31200,6000,39950,6000,12000,2nonymous_,RIGHT,TALU2 ++S 24700,27000,28300,27000,200,p6c,RIGHT,PTRANS ++S 14000,6100,14000,7900,400,278nymous_,UP,ALU1 ++S 30400,36400,30400,36600,200,119nymous_,UP,POLY ++S 26700,13000,33700,13000,2400,85onymous_,RIGHT,ALU2 ++S 10000,22200,11600,22200,200,243nymous_,RIGHT,POLY ++S 5700,9000,10300,9000,400,204nymous_,RIGHT,ALU1 ++S 33800,19100,33800,38300,2400,163nymous_,UP,ALU2 ++S 17500,31000,19100,31000,200,n6a,RIGHT,NTRANS ++S 24700,28200,28300,28200,200,p6b,RIGHT,PTRANS ++S 14000,7500,14000,9100,620,279nymous_,UP,NDIF ++S 27200,7500,27200,8100,620,86onymous_,UP,NDIF ++S 30600,21100,30600,35900,620,120nymous_,UP,PDIF ++S 5600,11100,5600,14700,620,205nymous_,UP,PDIF ++S 24700,29400,28300,29400,200,p6a,RIGHT,PTRANS ++S 34000,18200,34000,38200,10400,164nymous_,UP,NWELL ++S 9700,19000,14900,19000,2400,244nymous_,RIGHT,ALU2 ++S 17500,32200,19100,32200,200,n8d,RIGHT,NTRANS ++S 14100,10000,21100,10000,400,280nymous_,RIGHT,ALU1 ++S 50,6000,6800,6000,12000,4nonymous_,RIGHT,TALU4 ++S 27200,12700,27200,14300,620,87onymous_,UP,PDIF ++S 5700,11000,10300,11000,400,206nymous_,RIGHT,ALU1 ++S 9200,6000,26800,6000,12000,5nonymous_,RIGHT,TALU4 ++S 24700,30600,28300,30600,200,p8c,RIGHT,PTRANS ++S 3280,6000,28520,6000,600,165nymous_,RIGHT,PTIE ++S 700,25000,8900,25000,2400,245nymous_,RIGHT,ALU2 ++S 17500,33400,19100,33400,200,n8c,RIGHT,NTRANS ++S 14000,11300,14000,12900,620,281nymous_,UP,PDIF ++S 30600,21300,30600,35500,400,121nymous_,UP,ALU1 ++S 27200,13100,27200,13900,400,88onymous_,UP,ALU1 ++S 6000,20700,6000,36300,400,207nymous_,UP,ALU1 ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 17500,34600,19100,34600,200,n8b,RIGHT,NTRANS ++S 31200,6000,39950,6000,12000,6nonymous_,RIGHT,TALU4 ++S 24700,31800,28300,31800,200,p8b,RIGHT,PTRANS ++S 30600,26700,30600,35300,2400,122nymous_,UP,ALU2 ++S 34400,7500,34400,8100,620,166nymous_,UP,NDIF ++S 14000,12100,14000,15900,400,282nymous_,UP,ALU1 ++S 27300,13000,29500,13000,400,89onymous_,RIGHT,ALU1 ++S 6000,22700,6000,36500,620,208nymous_,UP,NDIF ++S 17500,35800,19100,35800,200,n8a,RIGHT,NTRANS ++S 24700,33000,28300,33000,200,p8a,RIGHT,PTRANS ++S 30600,36400,31400,36400,200,123nymous_,RIGHT,POLY ++S 34400,8100,34400,13900,400,167nymous_,UP,ALU1 ++S 1280,37600,21120,37600,600,283nymous_,RIGHT,PTIE ++S 700,28000,15100,28000,2400,246nymous_,RIGHT,ALU2 ++S 27800,7300,27800,8300,200,n2,UP,NTRANS ++S 24700,34200,28300,34200,200,p9,RIGHT,PTRANS ++S 6200,7300,6200,9300,200,n18b,UP,NTRANS ++S 17400,11100,17400,11700,400,316nymous_,UP,ALU1 ++S 3400,200,3400,2000,7000,8nonymous_,UP,TALU3 ++S 30680,6000,37120,6000,600,124nymous_,RIGHT,PTIE ++S 34400,13100,34400,14500,620,168nymous_,UP,PDIF ++S 14600,7300,14600,9300,200,n17c,UP,NTRANS ++S 27800,8600,27800,9800,200,90onymous_,UP,POLY ++S 6200,9600,6200,10600,200,209nymous_,UP,POLY ++S 24700,35800,28300,35800,200,p12,RIGHT,PTRANS ++S 34600,20900,34600,36700,200,p14c,UP,PTRANS ++S 700,31000,8900,31000,2400,247nymous_,RIGHT,ALU2 ++S 17400,11800,17400,12000,200,317nymous_,UP,POLY ++S 14600,9600,14600,10800,200,284nymous_,UP,POLY ++S 18000,200,18000,2000,18000,9nonymous_,UP,TALU3 ++S 30800,7500,30800,8100,620,125nymous_,UP,NDIF ++B 1600,31400,300,300,CONT_BODY_P,1268ymous_ ++B 14000,6000,300,300,CONT_BODY_P,1214ymous_ ++B 6000,33000,300,300,CONT_DIF_N,1000ymous_ ++B 7600,31000,300,300,CONT_VIA,1054ymous_ ++B 17800,26800,300,300,CONT_DIF_N,1322ymous_ ++B 23000,22400,300,300,CONT_BODY_N,408nymous_ ++B 2800,28000,300,300,CONT_DIF_N,569nymous_ ++B 9200,34000,300,300,CONT_DIF_N,1108ymous_ ++B 11600,9000,300,300,CONT_DIF_N,1162ymous_ ++B 27000,21600,300,300,CONT_DIF_P,516nymous_ ++B 25000,27600,300,300,CONT_DIF_P,462nymous_ ++B 30600,26000,300,300,CONT_DIF_P,623nymous_ ++B 3200,6000,300,300,CONT_BODY_P,677nymous_ ++B 34800,22000,300,300,CONT_VIA2,785nymous_ ++B 36800,10000,300,300,CONT_VIA2,839nymous_ ++B 38000,33000,300,300,CONT_VIA2,893nymous_ ++B 4400,35000,300,300,CONT_DIF_N,947nymous_ ++B 6000,34000,300,300,CONT_DIF_N,1001ymous_ ++B 1600,32400,300,300,CONT_BODY_P,1269ymous_ ++B 14000,6000,300,300,CONT_VIA,1215ymous_ ++B 7600,31000,300,300,CONT_VIA2,1055ymous_ ++B 9200,35000,300,300,CONT_DIF_N,1109ymous_ ++B 17800,28000,300,300,CONT_DIF_N,1323ymous_ ++B 25000,27600,300,300,CONT_VIA,463nymous_ ++B 23000,23400,300,300,CONT_BODY_N,409nymous_ ++B 2800,29000,300,300,CONT_DIF_N,570nymous_ ++B 30600,27000,300,300,CONT_DIF_P,624nymous_ ++B 11600,11800,300,300,CONT_DIF_P,1163ymous_ ++B 27000,22800,300,300,CONT_DIF_P,517nymous_ ++B 3200,6000,300,300,CONT_VIA,678nymous_ ++B 33800,23000,300,300,CONT_DIF_P,732nymous_ ++B 34800,23000,300,300,CONT_VIA2,786nymous_ ++B 36800,11000,300,300,CONT_VIA2,840nymous_ ++B 38000,34000,300,300,CONT_VIA2,894nymous_ ++B 14000,6000,300,300,CONT_VIA2,1216ymous_ ++B 4400,35000,300,300,CONT_VIA,948nymous_ ++B 6000,35000,300,300,CONT_DIF_N,1002ymous_ ++B 17800,28000,300,300,CONT_VIA,1324ymous_ ++B 1600,33400,300,300,CONT_BODY_P,1270ymous_ ++B 22400,13000,200,200,CONT_TURN1,356nymous_ ++B 7600,32000,300,300,CONT_DIF_N,1056ymous_ ++B 9200,36000,300,300,CONT_DIF_N,1110ymous_ ++B 25000,28800,300,300,CONT_DIF_P,464nymous_ ++B 23000,24400,300,300,CONT_BODY_N,410nymous_ ++B 27200,14000,300,300,CONT_DIF_P,540nymous_ ++B 2800,30000,300,300,CONT_DIF_N,571nymous_ ++B 30600,27000,300,300,CONT_VIA,625nymous_ ++B 33800,23000,300,300,CONT_VIA,733nymous_ ++B 11600,12800,300,300,CONT_DIF_P,1164ymous_ ++B 27000,24000,300,300,CONT_DIF_P,518nymous_ ++B 3200,6000,300,300,CONT_VIA2,679nymous_ ++B 34800,27000,300,300,CONT_VIA2,787nymous_ ++B 36800,12000,300,300,CONT_BODY_N,841nymous_ ++B 38000,35000,300,300,CONT_VIA2,895nymous_ ++B 4400,36000,300,300,CONT_DIF_N,949nymous_ ++B 14000,7200,300,300,CONT_DIF_N,1217ymous_ ++B 6000,36000,300,300,CONT_DIF_N,1003ymous_ ++B 7600,32000,300,300,CONT_VIA,1057ymous_ ++B 17800,29200,300,300,CONT_DIF_N,1325ymous_ ++B 1600,34400,300,300,CONT_BODY_P,1271ymous_ ++B 23000,25400,300,300,CONT_BODY_N,411nymous_ ++B 28200,9000,200,200,CONT_TURN1,357nymous_ ++B 2800,31000,300,300,CONT_DIF_N,572nymous_ ++B 9200,6000,300,300,CONT_BODY_P,1111ymous_ ++B 11600,13800,300,300,CONT_DIF_P,1165ymous_ ++B 27000,25200,300,300,CONT_DIF_P,519nymous_ ++B 25000,30000,300,300,CONT_DIF_P,465nymous_ ++B 30600,27000,300,300,CONT_VIA2,626nymous_ ++B 3200,7000,300,300,CONT_BODY_P,680nymous_ ++B 33800,23000,300,300,CONT_VIA2,734nymous_ ++B 34800,28000,300,300,CONT_VIA2,788nymous_ ++B 36800,13000,300,300,CONT_BODY_N,842nymous_ ++B 38200,20400,300,300,CONT_BODY_N,896nymous_ ++B 4400,36000,300,300,CONT_VIA,950nymous_ ++B 1600,35400,300,300,CONT_BODY_P,1272ymous_ ++B 14000,8000,300,300,CONT_DIF_N,1218ymous_ ++B 6600,24000,300,300,CONT_VIA2,1004ymous_ ++B 7600,32000,300,300,CONT_VIA2,1058ymous_ ++B 17800,30400,300,300,CONT_DIF_N,1326ymous_ ++B 23000,26400,300,300,CONT_BODY_N,412nymous_ ++B 5000,19000,8300,2300,CONT_VIA2,358nymous_ ++B 2800,32000,300,300,CONT_DIF_N,573nymous_ ++B 9200,6000,300,300,CONT_VIA,1112ymous_ ++B 11600,14800,300,300,CONT_DIF_P,1166ymous_ ++B 27000,25200,300,300,CONT_VIA,520nymous_ ++B 25000,30000,300,300,CONT_VIA,466nymous_ ++B 30600,28000,300,300,CONT_DIF_P,627nymous_ ++B 3200,7000,300,300,CONT_VIA2,681nymous_ ++B 33800,24000,300,300,CONT_DIF_P,735nymous_ ++B 34800,29000,300,300,CONT_VIA2,789nymous_ ++B 36800,14000,300,300,CONT_BODY_N,843nymous_ ++B 38200,21400,300,300,CONT_BODY_N,897nymous_ ++B 4400,36000,300,300,CONT_VIA2,951nymous_ ++B 6600,25000,300,300,CONT_VIA2,1005ymous_ ++B 1600,36400,300,300,CONT_BODY_P,1273ymous_ ++B 14000,10000,300,300,CONT_POLY,1219ymous_ ++B 10400,11000,200,200,CONT_TURN1,359nymous_ ++B 7600,33000,300,300,CONT_DIF_N,1059ymous_ ++B 9200,6000,300,300,CONT_VIA2,1113ymous_ ++B 17800,30400,300,300,CONT_VIA,1327ymous_ ++B 25000,31200,300,300,CONT_DIF_P,467nymous_ ++B 23000,27400,300,300,CONT_BODY_N,413nymous_ ++B 2800,33000,300,300,CONT_DIF_N,574nymous_ ++B 30600,28000,300,300,CONT_VIA,628nymous_ ++B 11600,16000,300,300,CONT_BODY_N,1167ymous_ ++B 27000,26400,300,300,CONT_DIF_P,521nymous_ ++B 3200,8000,300,300,CONT_BODY_P,682nymous_ ++B 33800,24000,300,300,CONT_VIA,736nymous_ ++B 34800,33000,300,300,CONT_VIA2,790nymous_ ++B 36800,15000,300,300,CONT_BODY_N,844nymous_ ++B 38200,22400,300,300,CONT_BODY_N,898nymous_ ++B 14000,12000,300,300,CONT_DIF_P,1220ymous_ ++B 4400,6000,300,300,CONT_BODY_P,952nymous_ ++B 6600,26000,300,300,CONT_VIA2,1006ymous_ ++B 17800,30400,300,300,CONT_VIA2,1328ymous_ ++B 1600,37600,300,300,CONT_BODY_P,1274ymous_ ++B 17400,11000,200,200,CONT_TURN1,360nymous_ ++B 7600,33000,300,300,CONT_VIA,1060ymous_ ++B 9200,7000,300,300,CONT_VIA2,1114ymous_ ++B 25000,32400,300,300,CONT_DIF_P,468nymous_ ++B 23000,28400,300,300,CONT_BODY_N,414nymous_ ++B 2800,34000,300,300,CONT_DIF_N,575nymous_ ++B 30600,28000,300,300,CONT_VIA2,629nymous_ ++B 33800,25000,300,300,CONT_DIF_P,737nymous_ ++B 11600,17000,300,300,CONT_VIA,1168ymous_ ++B 27000,27600,300,300,CONT_DIF_P,522nymous_ ++B 3200,8000,300,300,CONT_VIA2,683nymous_ ++B 34800,34000,300,300,CONT_VIA2,791nymous_ ++B 36800,15000,300,300,CONT_VIA2,845nymous_ ++B 38200,23400,300,300,CONT_BODY_N,899nymous_ ++B 4400,6000,300,300,CONT_VIA,953nymous_ ++B 14000,12800,300,300,CONT_DIF_P,1221ymous_ ++B 6600,30000,300,300,CONT_VIA2,1007ymous_ ++B 7600,34000,300,300,CONT_DIF_N,1061ymous_ ++B 17800,31600,300,300,CONT_DIF_N,1329ymous_ ++B 1600,19200,300,300,CONT_BODY_P,1275ymous_ ++B 23000,29400,300,300,CONT_BODY_N,415nymous_ ++B 17600,8000,200,200,CONT_TURN1,361nymous_ ++B 2800,35000,300,300,CONT_DIF_N,576nymous_ ++B 9200,7200,300,300,CONT_DIF_N,1115ymous_ ++B 11600,17000,300,300,CONT_VIA2,1169ymous_ ++B 27000,28800,300,300,CONT_DIF_P,523nymous_ ++B 25000,32400,300,300,CONT_VIA,469nymous_ ++B 30600,29000,300,300,CONT_DIF_P,630nymous_ ++B 3200,9000,300,300,CONT_BODY_P,684nymous_ ++B 33800,25000,300,300,CONT_VIA,738nymous_ ++B 34800,35000,300,300,CONT_VIA2,792nymous_ ++B 36800,16000,300,300,CONT_BODY_N,846nymous_ ++B 38200,24400,300,300,CONT_BODY_N,900nymous_ ++B 4400,6000,300,300,CONT_VIA2,954nymous_ ++B 16400,6000,300,300,CONT_BODY_P,1276ymous_ ++B 14000,16000,300,300,CONT_BODY_N,1222ymous_ ++B 6600,31000,300,300,CONT_VIA2,1008ymous_ ++B 7600,34000,300,300,CONT_VIA,1062ymous_ ++B 17800,31600,300,300,CONT_VIA2,1330ymous_ ++B 23000,30400,300,300,CONT_BODY_N,416nymous_ ++B 17800,22000,200,200,CONT_TURN1,362nymous_ ++B 2800,36000,300,300,CONT_DIF_N,577nymous_ ++B 9200,8000,300,300,CONT_DIF_N,1116ymous_ ++B 11600,19200,300,300,CONT_BODY_P,1170ymous_ ++B 27000,30000,300,300,CONT_DIF_P,524nymous_ ++B 25000,33600,300,300,CONT_DIF_P,470nymous_ ++B 30600,29000,300,300,CONT_VIA,631nymous_ ++B 3200,12000,300,300,CONT_BODY_N,685nymous_ ++B 33800,26000,300,300,CONT_DIF_P,739nymous_ ++B 35000,19200,300,300,CONT_BODY_N,793nymous_ ++B 36800,16000,300,300,CONT_VIA2,847nymous_ ++B 38200,25400,300,300,CONT_BODY_N,901nymous_ ++B 4400,8000,300,300,CONT_DIF_N,955nymous_ ++B 6600,32000,300,300,CONT_VIA2,1009ymous_ ++B 16400,6000,300,300,CONT_VIA,1277ymous_ ++B 14000,17000,300,300,CONT_VIA,1223ymous_ ++B 18400,12800,200,200,CONT_TURN1,363nymous_ ++B 7600,35000,300,300,CONT_DIF_N,1063ymous_ ++B 9200,8000,300,300,CONT_VIA2,1117ymous_ ++B 17800,32800,300,300,CONT_DIF_N,1331ymous_ ++B 25000,35000,300,300,CONT_DIF_P,471nymous_ ++B 23000,31400,300,300,CONT_BODY_N,417nymous_ ++B 28200,10600,300,300,CONT_VIA,578nymous_ ++B 30600,29000,300,300,CONT_VIA2,632nymous_ ++B 12400,23000,300,300,CONT_DIF_N,1171ymous_ ++B 27000,31200,300,300,CONT_DIF_P,525nymous_ ++B 3200,12000,300,300,CONT_VIA2,686nymous_ ++B 33800,26000,300,300,CONT_VIA,740nymous_ ++B 35400,22000,300,300,CONT_DIF_P,794nymous_ ++B 36800,17000,300,300,CONT_VIA,848nymous_ ++B 38200,26400,300,300,CONT_BODY_N,902nymous_ ++B 14000,17000,300,300,CONT_VIA2,1224ymous_ ++B 4400,9000,300,300,CONT_DIF_N,956nymous_ ++B 6600,36000,300,300,CONT_VIA2,1010ymous_ ++B 17800,34000,300,300,CONT_DIF_N,1332ymous_ ++B 16400,6000,300,300,CONT_VIA2,1278ymous_ ++B 19800,32800,200,200,CONT_TURN1,364nymous_ ++B 7600,35000,300,300,CONT_VIA,1064ymous_ ++B 9200,10000,300,300,CONT_POLY,1118ymous_ ++B 25000,36400,300,300,CONT_DIF_P,472nymous_ ++B 23000,32400,300,300,CONT_BODY_N,418nymous_ ++B 28200,11800,300,300,CONT_POLY,579nymous_ ++B 30600,30000,300,300,CONT_DIF_P,633nymous_ ++B 33800,27000,300,300,CONT_DIF_P,741nymous_ ++B 12400,24000,300,300,CONT_DIF_N,1172ymous_ ++B 27000,32400,300,300,CONT_DIF_P,526nymous_ ++B 3200,13000,300,300,CONT_BODY_N,687nymous_ ++B 35400,23000,300,300,CONT_DIF_P,795nymous_ ++B 36800,17000,300,300,CONT_VIA2,849nymous_ ++B 38200,27400,300,300,CONT_BODY_N,903nymous_ ++B 4400,11800,300,300,CONT_DIF_P,957nymous_ ++B 14600,19200,300,300,CONT_BODY_P,1225ymous_ ++B 6600,19200,300,300,CONT_BODY_P,1011ymous_ ++B 7600,36000,300,300,CONT_DIF_N,1065ymous_ ++B 17800,35200,300,300,CONT_DIF_N,1333ymous_ ++B 16400,8000,300,300,CONT_DIF_N,1279ymous_ ++B 23000,33400,300,300,CONT_BODY_N,419nymous_ ++B 20000,6000,300,300,CONT_BODY_P,365nymous_ ++B 28400,6000,300,300,CONT_BODY_P,580nymous_ ++B 9200,12000,300,300,CONT_DIF_P,1119ymous_ ++B 12400,25000,300,300,CONT_DIF_N,1173ymous_ ++B 27000,33600,300,300,CONT_DIF_P,527nymous_ ++B 25000,37600,300,300,CONT_BODY_N,473nymous_ ++B 30600,30000,300,300,CONT_VIA,634nymous_ ++B 3200,13000,300,300,CONT_VIA2,688nymous_ ++B 33800,27000,300,300,CONT_VIA,742nymous_ ++B 35400,24000,300,300,CONT_DIF_P,796nymous_ ++B 37000,22000,300,300,CONT_DIF_P,850nymous_ ++B 38200,28400,300,300,CONT_BODY_N,904nymous_ ++B 4400,12800,300,300,CONT_DIF_P,958nymous_ ++B 16400,9000,300,300,CONT_DIF_N,1280ymous_ ++B 15200,6000,300,300,CONT_BODY_P,1226ymous_ ++B 6800,37600,300,300,CONT_BODY_P,1012ymous_ ++B 7600,36000,300,300,CONT_VIA,1066ymous_ ++B 17800,36400,300,300,CONT_DIF_N,1334ymous_ ++B 23000,34400,300,300,CONT_BODY_N,420nymous_ ++B 20000,6000,300,300,CONT_VIA,366nymous_ ++B 28400,8000,300,300,CONT_DIF_N,581nymous_ ++B 9200,12800,300,300,CONT_DIF_P,1120ymous_ ++B 12400,26000,300,300,CONT_DIF_N,1174ymous_ ++B 27000,35000,300,300,CONT_DIF_P,528nymous_ ++B 25000,19200,300,300,CONT_BODY_N,474nymous_ ++B 30600,31000,300,300,CONT_DIF_P,635nymous_ ++B 3200,14000,300,300,CONT_BODY_N,689nymous_ ++B 33800,27000,300,300,CONT_VIA2,743nymous_ ++B 35400,25000,300,300,CONT_DIF_P,797nymous_ ++B 37000,22000,300,300,CONT_VIA,851nymous_ ++B 38200,29400,300,300,CONT_BODY_N,905nymous_ ++B 4400,13800,300,300,CONT_DIF_P,959nymous_ ++B 6800,37600,300,300,CONT_VIA,1013ymous_ ++B 16400,10000,300,300,CONT_POLY,1281ymous_ ++B 15200,6000,300,300,CONT_VIA,1227ymous_ ++B 20000,6000,300,300,CONT_VIA2,367nymous_ ++B 7600,36000,300,300,CONT_VIA2,1067ymous_ ++B 9200,13800,300,300,CONT_DIF_P,1121ymous_ ++B 17800,37600,300,300,CONT_BODY_P,1335ymous_ ++B 26000,20400,300,300,CONT_DIF_P,475nymous_ ++B 23000,35400,300,300,CONT_BODY_N,421nymous_ ++B 28400,14000,300,300,CONT_DIF_P,582nymous_ ++B 30600,31000,300,300,CONT_VIA,636nymous_ ++B 27000,36400,300,300,CONT_DIF_P,529nymous_ ++B 3200,14000,300,300,CONT_VIA2,690nymous_ ++B 33800,28000,300,300,CONT_DIF_P,744nymous_ ++B 35400,26000,300,300,CONT_DIF_P,798nymous_ ++B 37000,22000,300,300,CONT_VIA2,852nymous_ ++B 38200,30400,300,300,CONT_BODY_N,906nymous_ ++B 15200,6000,300,300,CONT_VIA2,1228ymous_ ++B 4400,14800,300,300,CONT_DIF_P,960nymous_ ++B 6800,37600,300,300,CONT_VIA2,1014ymous_ ++B 18600,19200,300,300,CONT_BODY_P,1336ymous_ ++B 16400,12000,300,300,CONT_DIF_P,1282ymous_ ++B 20000,8600,300,300,CONT_DIF_N,368nymous_ ++B 7600,19200,300,300,CONT_BODY_P,1068ymous_ ++B 9200,14800,300,300,CONT_DIF_P,1122ymous_ ++B 12400,28000,300,300,CONT_DIF_N,1176ymous_ ++B 26000,21600,300,300,CONT_DIF_P,476nymous_ ++B 23000,36400,300,300,CONT_BODY_N,422nymous_ ++B 28400,16000,300,300,CONT_BODY_N,583nymous_ ++B 30600,32000,300,300,CONT_DIF_P,637nymous_ ++B 33800,28000,300,300,CONT_VIA,745nymous_ ++B 27000,36400,300,300,CONT_VIA,530nymous_ ++B 3200,15000,300,300,CONT_BODY_N,691nymous_ ++B 35400,27000,300,300,CONT_DIF_P,799nymous_ ++B 37000,23000,300,300,CONT_DIF_P,853nymous_ ++B 38200,31400,300,300,CONT_BODY_N,907nymous_ ++B 4400,16000,300,300,CONT_BODY_N,961nymous_ ++B 15200,8000,300,300,CONT_DIF_N,1229ymous_ ++B 6800,6000,300,300,CONT_BODY_P,1015ymous_ ++B 7800,37600,300,300,CONT_BODY_P,1069ymous_ ++B 18800,22000,300,300,CONT_DIF_N,1337ymous_ ++B 16400,12800,300,300,CONT_DIF_P,1283ymous_ ++B 23000,37600,300,300,CONT_BODY_N,423nymous_ ++B 20000,11000,300,300,CONT_POLY,369nymous_ ++B 28400,17000,300,300,CONT_VIA,584nymous_ ++B 9200,16000,300,300,CONT_BODY_N,1123ymous_ ++B 12400,29000,300,300,CONT_DIF_N,1177ymous_ ++B 27000,37600,300,300,CONT_BODY_N,531nymous_ ++B 26000,21600,300,300,CONT_VIA,477nymous_ ++B 30600,32000,300,300,CONT_VIA,638nymous_ ++B 3200,16000,300,300,CONT_BODY_N,692nymous_ ++B 33800,28000,300,300,CONT_VIA2,746nymous_ ++B 35400,28000,300,300,CONT_DIF_P,800nymous_ ++B 37000,23000,300,300,CONT_VIA,854nymous_ ++B 38200,32400,300,300,CONT_BODY_N,908nymous_ ++B 4400,17000,300,300,CONT_VIA,962nymous_ ++B 16400,16000,300,300,CONT_BODY_N,1284ymous_ ++B 15200,9000,300,300,CONT_DIF_N,1230ymous_ ++B 6800,6000,300,300,CONT_VIA,1016ymous_ ++B 7800,37600,300,300,CONT_VIA,1070ymous_ ++B 18800,22200,300,300,CONT_VIA,1338ymous_ ++B 23000,19200,300,300,CONT_BODY_N,424nymous_ ++B 20000,16000,300,300,CONT_BODY_N,370nymous_ ++B 28400,17000,300,300,CONT_VIA2,585nymous_ ++B 9200,17000,300,300,CONT_VIA,1124ymous_ ++B 12400,30000,300,300,CONT_DIF_N,1178ymous_ ++B 27000,9000,300,300,CONT_VIA2,532nymous_ ++B 26000,21600,300,300,CONT_VIA2,478nymous_ ++B 30600,33000,300,300,CONT_DIF_P,639nymous_ ++B 3200,17000,300,300,CONT_VIA,693nymous_ ++B 33800,29000,300,300,CONT_DIF_P,747nymous_ ++B 35400,29000,300,300,CONT_DIF_P,801nymous_ ++B 37000,23000,300,300,CONT_VIA2,855nymous_ ++B 38200,33400,300,300,CONT_BODY_N,909nymous_ ++B 4400,17000,300,300,CONT_VIA2,963nymous_ ++B 6800,6000,300,300,CONT_VIA2,1017ymous_ ++B 16400,17000,300,300,CONT_VIA,1285ymous_ ++B 15200,10000,300,300,CONT_POLY,1231ymous_ ++B 20800,20400,300,300,CONT_BODY_P,371nymous_ ++B 7800,37600,300,300,CONT_VIA2,1071ymous_ ++B 9200,17000,300,300,CONT_VIA2,1125ymous_ ++B 18800,23200,300,300,CONT_DIF_N,1339ymous_ ++B 26000,22800,300,300,CONT_DIF_P,479nymous_ ++B 23400,17000,300,300,CONT_VIA,425nymous_ ++B 28800,9000,300,300,CONT_POLY,586nymous_ ++B 30600,33000,300,300,CONT_VIA,640nymous_ ++B 12400,31000,300,300,CONT_DIF_N,1179ymous_ ++B 27000,10000,300,300,CONT_VIA2,533nymous_ ++B 3200,17000,300,300,CONT_VIA2,694nymous_ ++B 33800,29000,300,300,CONT_VIA,748nymous_ ++B 35400,30000,300,300,CONT_DIF_P,802nymous_ ++B 37000,24000,300,300,CONT_DIF_P,856nymous_ ++B 38200,34400,300,300,CONT_BODY_N,910nymous_ ++B 15200,11600,300,300,CONT_DIF_P,1232ymous_ ++B 4600,37600,300,300,CONT_BODY_P,964nymous_ ++B 6800,7200,300,300,CONT_DIF_N,1018ymous_ ++B 18800,24400,300,300,CONT_DIF_N,1340ymous_ ++B 16400,17000,300,300,CONT_VIA2,1286ymous_ ++B 20800,21400,300,300,CONT_BODY_P,372nymous_ ++B 8000,0,300,300,CONT_VIA2,1072ymous_ ++B 9600,37600,300,300,CONT_BODY_P,1126ymous_ ++B 26000,22800,300,300,CONT_VIA2,480nymous_ ++B 23400,17000,300,300,CONT_VIA2,426nymous_ ++B 29000,21000,300,300,CONT_POLY,587nymous_ ++B 30600,33000,300,300,CONT_VIA2,641nymous_ ++B 33800,29000,300,300,CONT_VIA2,749nymous_ ++B 27000,11000,300,300,CONT_VIA2,534nymous_ ++B 32200,22000,300,300,CONT_DIF_P,695nymous_ ++B 35400,31000,300,300,CONT_DIF_P,803nymous_ ++B 37000,24000,300,300,CONT_VIA,857nymous_ ++B 38200,35400,300,300,CONT_BODY_N,911nymous_ ++B 4600,37600,300,300,CONT_VIA,965nymous_ ++B 15200,12600,300,300,CONT_DIF_P,1233ymous_ ++B 6800,8000,300,300,CONT_DIF_N,1019ymous_ ++B 8000,0,300,300,CONT_VIA3,1073ymous_ ++B 18800,25600,300,300,CONT_DIF_N,1341ymous_ ++B 16600,19200,300,300,CONT_BODY_P,1287ymous_ ++B 23600,6000,300,300,CONT_BODY_P,427nymous_ ++B 20800,22400,300,300,CONT_BODY_P,373nymous_ ++B 29000,21000,300,300,CONT_VIA,588nymous_ ++B 9600,19200,300,300,CONT_BODY_P,1127ymous_ ++B 27000,19200,300,300,CONT_BODY_N,535nymous_ ++B 26000,24000,300,300,CONT_DIF_P,481nymous_ ++B 30600,34000,300,300,CONT_DIF_P,642nymous_ ++B 32200,23000,300,300,CONT_DIF_P,696nymous_ ++B 33800,30000,300,300,CONT_DIF_P,750nymous_ ++B 35400,32000,300,300,CONT_DIF_P,804nymous_ ++B 37000,25000,300,300,CONT_DIF_P,858nymous_ ++B 38200,36400,300,300,CONT_BODY_N,912nymous_ ++B 4600,37600,300,300,CONT_VIA2,966nymous_ ++B 16800,20200,300,300,CONT_VIA,1288ymous_ ++B 15200,16000,300,300,CONT_BODY_N,1234ymous_ ++B 6800,10000,300,300,CONT_POLY,1020ymous_ ++B 8000,0,300,300,CONT_VIA4,1074ymous_ ++B 18800,26800,300,300,CONT_DIF_N,1342ymous_ ++B 23600,6000,300,300,CONT_VIA,428nymous_ ++B 20800,23400,300,300,CONT_BODY_P,374nymous_ ++B 29000,22200,300,300,CONT_POLY,589nymous_ ++B 10400,6000,300,300,CONT_BODY_P,1128ymous_ ++B 27200,6000,300,300,CONT_BODY_P,536nymous_ ++B 26000,24000,300,300,CONT_VIA,482nymous_ ++B 30600,34000,300,300,CONT_VIA,643nymous_ ++B 32200,24000,300,300,CONT_DIF_P,697nymous_ ++B 33800,30000,300,300,CONT_VIA,751nymous_ ++B 35400,33000,300,300,CONT_DIF_P,805nymous_ ++B 37000,25000,300,300,CONT_VIA,859nymous_ ++B 38200,37600,300,300,CONT_BODY_N,913nymous_ ++B 4600,19200,300,300,CONT_BODY_P,967nymous_ ++B 6800,12000,300,300,CONT_DIF_P,1021ymous_ ++B 16800,23400,300,300,CONT_POLY,1289ymous_ ++B 15200,17000,300,300,CONT_VIA,1235ymous_ ++B 20800,24400,300,300,CONT_BODY_P,375nymous_ ++B 8000,8000,300,300,CONT_DIF_N,1075ymous_ ++B 10400,6000,300,300,CONT_VIA,1129ymous_ ++B 18800,26800,300,300,CONT_VIA,1343ymous_ ++B 26000,25200,300,300,CONT_DIF_P,483nymous_ ++B 23600,6000,300,300,CONT_VIA2,429nymous_ ++B 29000,22200,300,300,CONT_VIA,590nymous_ ++B 30600,34000,300,300,CONT_VIA2,644nymous_ ++B 27200,8000,300,300,CONT_DIF_N,537nymous_ ++B 32200,25000,300,300,CONT_DIF_P,698nymous_ ++B 33800,31000,300,300,CONT_DIF_P,752nymous_ ++B 35400,34000,300,300,CONT_DIF_P,806nymous_ ++B 37000,26000,300,300,CONT_DIF_P,860nymous_ ++B 38200,19200,300,300,CONT_BODY_N,914nymous_ ++B 15200,17000,300,300,CONT_VIA2,1236ymous_ ++B 12400,34000,300,300,CONT_DIF_N,1182ymous_ ++B 5400,24000,300,300,CONT_VIA2,968nymous_ ++B 6800,12800,300,300,CONT_DIF_P,1022ymous_ ++B 18800,28000,300,300,CONT_DIF_N,1344ymous_ ++B 16800,24400,300,300,CONT_VIA,1290ymous_ ++B 20800,25400,300,300,CONT_BODY_P,376nymous_ ++B 8000,9000,300,300,CONT_DIF_N,1076ymous_ ++B 10400,6000,300,300,CONT_VIA2,1130ymous_ ++B 26000,26400,300,300,CONT_DIF_P,484nymous_ ++B 23600,8000,300,300,CONT_DIF_N,430nymous_ ++B 29000,23400,300,300,CONT_POLY,591nymous_ ++B 30600,35000,300,300,CONT_DIF_P,645nymous_ ++B 33800,31000,300,300,CONT_VIA,753nymous_ ++B 27200,10600,300,300,CONT_POLY,538nymous_ ++B 32200,26000,300,300,CONT_DIF_P,699nymous_ ++B 35400,35000,300,300,CONT_DIF_P,807nymous_ ++B 37000,26000,300,300,CONT_VIA,861nymous_ ++B 4400,21800,300,300,CONT_POLY,915nymous_ ++B 5400,25000,300,300,CONT_VIA2,969nymous_ ++B 15600,20200,300,300,CONT_VIA,1237ymous_ ++B 12400,35000,300,300,CONT_DIF_N,1183ymous_ ++B 6800,13800,300,300,CONT_DIF_P,1023ymous_ ++B 8000,9000,300,300,CONT_VIA,1077ymous_ ++B 18800,29200,300,300,CONT_DIF_N,1345ymous_ ++B 16800,25400,300,300,CONT_POLY,1291ymous_ ++B 23600,13000,300,300,CONT_DIF_P,431nymous_ ++B 20800,26400,300,300,CONT_BODY_P,377nymous_ ++B 29000,23400,300,300,CONT_VIA,592nymous_ ++B 10400,8000,300,300,CONT_DIF_N,1131ymous_ ++B 27200,13000,300,300,CONT_DIF_P,539nymous_ ++B 26000,26400,300,300,CONT_VIA,485nymous_ ++B 30600,35000,300,300,CONT_VIA,646nymous_ ++B 32200,27000,300,300,CONT_DIF_P,700nymous_ ++B 33800,32000,300,300,CONT_DIF_P,754nymous_ ++B 35400,36000,300,300,CONT_DIF_P,808nymous_ ++B 37000,27000,300,300,CONT_DIF_P,862nymous_ ++B 12400,36000,300,300,CONT_DIF_N,1184ymous_ ++B 4400,21800,300,300,CONT_VIA,916nymous_ ++B 5400,26000,300,300,CONT_VIA2,970nymous_ ++B 16800,28200,300,300,CONT_POLY,1292ymous_ ++B 15600,23000,300,300,CONT_DIF_N,1238ymous_ ++B 6800,14800,300,300,CONT_DIF_P,1024ymous_ ++B 8000,10000,300,300,CONT_POLY,1078ymous_ ++B 18800,30400,300,300,CONT_DIF_N,1346ymous_ ++B 23600,14000,300,300,CONT_DIF_P,432nymous_ ++B 20800,27400,300,300,CONT_BODY_P,378nymous_ ++B 29000,24600,300,300,CONT_POLY,593nymous_ ++B 10400,9000,300,300,CONT_DIF_N,1132ymous_ ++B 12400,32000,300,300,CONT_DIF_N,1180ymous_ ++B 26000,27600,300,300,CONT_DIF_P,486nymous_ ++B 30600,35000,300,300,CONT_VIA2,647nymous_ ++B 32200,28000,300,300,CONT_DIF_P,701nymous_ ++B 33800,32000,300,300,CONT_VIA,755nymous_ ++B 35600,6000,300,300,CONT_BODY_P,809nymous_ ++B 37000,27000,300,300,CONT_VIA,863nymous_ ++B 4400,23000,300,300,CONT_DIF_N,917nymous_ ++B 12600,19200,300,300,CONT_BODY_P,1185ymous_ ++B 5400,30000,300,300,CONT_VIA2,971nymous_ ++B 6800,16000,300,300,CONT_BODY_N,1025ymous_ ++B 16800,29200,300,300,CONT_VIA,1293ymous_ ++B 15600,24000,300,300,CONT_DIF_N,1239ymous_ ++B 20800,28400,300,300,CONT_BODY_P,379nymous_ ++B 8000,11000,300,300,CONT_VIA,1079ymous_ ++B 10400,10000,300,300,CONT_POLY,1133ymous_ ++B 18800,31600,300,300,CONT_DIF_N,1347ymous_ ++B 26000,27600,300,300,CONT_VIA2,487nymous_ ++B 23600,16000,300,300,CONT_BODY_N,433nymous_ ++B 29000,24600,300,300,CONT_VIA,594nymous_ ++B 30800,6000,300,300,CONT_BODY_P,648nymous_ ++B 12400,33000,300,300,CONT_DIF_N,1181ymous_ ++B 32200,29000,300,300,CONT_DIF_P,702nymous_ ++B 33800,33000,300,300,CONT_DIF_P,756nymous_ ++B 35600,6000,300,300,CONT_VIA,810nymous_ ++B 37000,27000,300,300,CONT_VIA2,864nymous_ ++B 4400,23000,300,300,CONT_VIA,918nymous_ ++B 15600,25000,300,300,CONT_DIF_N,1240ymous_ ++B 12800,6000,300,300,CONT_BODY_P,1186ymous_ ++B 5400,31000,300,300,CONT_VIA2,972nymous_ ++B 6800,17000,300,300,CONT_VIA,1026ymous_ ++B 18800,31600,300,300,CONT_VIA,1348ymous_ ++B 16800,32200,300,300,CONT_POLY,1294ymous_ ++B 20800,29400,300,300,CONT_BODY_P,380nymous_ ++B 8000,11800,300,300,CONT_DIF_P,1080ymous_ ++B 10400,11800,300,300,CONT_DIF_P,1134ymous_ ++B 26000,28800,300,300,CONT_DIF_P,488nymous_ ++B 24000,27000,300,300,CONT_POLY,434nymous_ ++B 29000,25800,300,300,CONT_POLY,595nymous_ ++B 30800,8000,300,300,CONT_DIF_N,649nymous_ ++B 33800,33000,300,300,CONT_VIA,757nymous_ ++B 32200,30000,300,300,CONT_DIF_P,703nymous_ ++B 35600,6000,300,300,CONT_VIA2,811nymous_ ++B 37000,28000,300,300,CONT_DIF_P,865nymous_ ++B 4400,24000,300,300,CONT_DIF_N,919nymous_ ++B 5400,32000,300,300,CONT_VIA2,973nymous_ ++B 15600,26000,300,300,CONT_DIF_N,1241ymous_ ++B 12800,6000,300,300,CONT_VIA,1187ymous_ ++B 6800,17000,300,300,CONT_VIA2,1027ymous_ ++B 8000,12800,300,300,CONT_DIF_P,1081ymous_ ++B 18800,32800,300,300,CONT_DIF_N,1349ymous_ ++B 16800,32200,300,300,CONT_VIA,1295ymous_ ++B 24000,28200,300,300,CONT_POLY,435nymous_ ++B 20800,30400,300,300,CONT_BODY_P,381nymous_ ++B 27200,17000,300,300,CONT_VIA,542nymous_ ++B 29000,30600,300,300,CONT_POLY,596nymous_ ++B 10400,12800,300,300,CONT_DIF_P,1135ymous_ ++B 26000,28800,300,300,CONT_VIA,489nymous_ ++B 30800,10600,300,300,CONT_POLY,650nymous_ ++B 32200,31000,300,300,CONT_DIF_P,704nymous_ ++B 33800,33000,300,300,CONT_VIA2,758nymous_ ++B 35600,8000,300,300,CONT_DIF_N,812nymous_ ++B 37000,28000,300,300,CONT_VIA,866nymous_ ++B 12800,6000,300,300,CONT_VIA2,1188ymous_ ++B 4400,24000,300,300,CONT_VIA,920nymous_ ++B 5400,36000,300,300,CONT_VIA2,974nymous_ ++B 16800,33400,300,300,CONT_POLY,1296ymous_ ++B 15600,27000,300,300,CONT_DIF_N,1242ymous_ ++B 7000,9000,300,300,CONT_VIA2,1028ymous_ ++B 8000,13800,300,300,CONT_DIF_P,1082ymous_ ++B 18800,34000,300,300,CONT_DIF_N,1350ymous_ ++B 24000,28200,300,300,CONT_VIA,436nymous_ ++B 20800,31400,300,300,CONT_BODY_P,382nymous_ ++B 27200,17000,300,300,CONT_VIA2,543nymous_ ++B 29000,31800,300,300,CONT_POLY,597nymous_ ++B 10400,13800,300,300,CONT_DIF_P,1136ymous_ ++B 26000,28800,300,300,CONT_VIA2,490nymous_ ++B 30800,13000,300,300,CONT_DIF_P,651nymous_ ++B 32200,32000,300,300,CONT_DIF_P,705nymous_ ++B 33800,34000,300,300,CONT_DIF_P,759nymous_ ++B 35600,13000,300,300,CONT_DIF_P,813nymous_ ++B 37000,28000,300,300,CONT_VIA2,867nymous_ ++B 4400,24000,300,300,CONT_VIA2,921nymous_ ++B 12800,8000,300,300,CONT_DIF_N,1189ymous_ ++B 5600,37600,300,300,CONT_BODY_P,975nymous_ ++B 7000,10000,300,300,CONT_VIA2,1029ymous_ ++B 16800,33400,300,300,CONT_VIA,1297ymous_ ++B 15600,28000,300,300,CONT_DIF_N,1243ymous_ ++B 20800,32400,300,300,CONT_BODY_P,383nymous_ ++B 27800,36400,300,300,CONT_DIF_P,544nymous_ ++B 8000,16000,300,300,CONT_BODY_N,1083ymous_ ++B 10400,16000,300,300,CONT_BODY_N,1137ymous_ ++B 18800,34000,300,300,CONT_VIA,1351ymous_ ++B 26000,30000,300,300,CONT_DIF_P,491nymous_ ++B 24000,29200,300,300,CONT_POLY,437nymous_ ++B 29000,33000,300,300,CONT_POLY,598nymous_ ++B 30800,14000,300,300,CONT_DIF_P,652nymous_ ++B 32200,33000,300,300,CONT_DIF_P,706nymous_ ++B 33800,34000,300,300,CONT_VIA,760nymous_ ++B 35600,14000,300,300,CONT_DIF_P,814nymous_ ++B 37000,29000,300,300,CONT_DIF_P,868nymous_ ++B 4400,25000,300,300,CONT_DIF_N,922nymous_ ++B 15600,29000,300,300,CONT_DIF_N,1244ymous_ ++B 12800,9000,300,300,CONT_DIF_N,1190ymous_ ++B 5600,37600,300,300,CONT_VIA,976nymous_ ++B 7000,11000,300,300,CONT_VIA2,1030ymous_ ++B 18800,35200,300,300,CONT_DIF_N,1352ymous_ ++B 16800,33400,300,300,CONT_VIA2,1298ymous_ ++B 20800,33400,300,300,CONT_BODY_P,384nymous_ ++B 27800,37600,300,300,CONT_BODY_N,545nymous_ ++B 8000,17000,300,300,CONT_VIA,1084ymous_ ++B 10400,17000,300,300,CONT_VIA,1138ymous_ ++B 26000,31200,300,300,CONT_DIF_P,492nymous_ ++B 24000,34200,300,300,CONT_POLY,438nymous_ ++B 29000,19200,300,300,CONT_BODY_N,599nymous_ ++B 30800,16000,300,300,CONT_BODY_N,653nymous_ ++B 33800,34000,300,300,CONT_VIA2,761nymous_ ++B 32200,34000,300,300,CONT_DIF_P,707nymous_ ++B 35600,16000,300,300,CONT_BODY_N,815nymous_ ++B 37000,29000,300,300,CONT_VIA,869nymous_ ++B 4400,25000,300,300,CONT_VIA,923nymous_ ++B 5600,37600,300,300,CONT_VIA2,977nymous_ ++B 15600,30000,300,300,CONT_DIF_N,1245ymous_ ++B 12800,11600,300,300,CONT_DIF_P,1191ymous_ ++B 7600,21800,300,300,CONT_POLY,1031ymous_ ++B 8000,17000,300,300,CONT_VIA2,1085ymous_ ++B 18800,36400,300,300,CONT_DIF_N,1353ymous_ ++B 16800,34600,300,300,CONT_POLY,1299ymous_ ++B 24000,34200,300,300,CONT_VIA,439nymous_ ++B 20800,34400,300,300,CONT_BODY_P,385nymous_ ++B 28000,0,300,300,CONT_VIA2,546nymous_ ++B 29600,33000,300,300,CONT_VIA2,600nymous_ ++B 10400,17000,300,300,CONT_VIA2,1139ymous_ ++B 26000,31200,300,300,CONT_VIA,493nymous_ ++B 30800,17000,300,300,CONT_VIA,654nymous_ ++B 32200,35000,300,300,CONT_DIF_P,708nymous_ ++B 33800,35000,300,300,CONT_DIF_P,762nymous_ ++B 35600,17000,300,300,CONT_VIA,816nymous_ ++B 37000,29000,300,300,CONT_VIA2,870nymous_ ++B 12800,12600,300,300,CONT_DIF_P,1192ymous_ ++B 4400,25000,300,300,CONT_VIA2,924nymous_ ++B 5600,6000,300,300,CONT_BODY_P,978nymous_ ++B 16800,34600,300,300,CONT_VIA,1300ymous_ ++B 15600,31000,300,300,CONT_DIF_N,1246ymous_ ++B 7600,21800,300,300,CONT_VIA,1032ymous_ ++B 8600,24000,300,300,CONT_VIA2,1086ymous_ ++B 18800,36400,300,300,CONT_VIA,1354ymous_ ++B 24000,34200,300,300,CONT_VIA2,440nymous_ ++B 20800,35400,300,300,CONT_BODY_P,386nymous_ ++B 28000,0,300,300,CONT_VIA3,547nymous_ ++B 29600,34000,300,300,CONT_VIA2,601nymous_ ++B 10600,19200,300,300,CONT_BODY_P,1140ymous_ ++B 26000,32400,300,300,CONT_DIF_P,494nymous_ ++B 30800,17000,300,300,CONT_VIA2,655nymous_ ++B 32200,36000,300,300,CONT_DIF_P,709nymous_ ++B 33800,35000,300,300,CONT_VIA,763nymous_ ++B 35600,17000,300,300,CONT_VIA2,817nymous_ ++B 37000,30000,300,300,CONT_DIF_P,871nymous_ ++B 4400,26000,300,300,CONT_DIF_N,925nymous_ ++B 12800,16000,300,300,CONT_BODY_N,1193ymous_ ++B 5600,6000,300,300,CONT_VIA,979nymous_ ++B 7600,23000,300,300,CONT_DIF_N,1033ymous_ ++B 16800,34600,300,300,CONT_VIA2,1301ymous_ ++B 15600,32000,300,300,CONT_DIF_N,1247ymous_ ++B 20800,36400,300,300,CONT_BODY_P,387nymous_ ++B 28000,0,300,300,CONT_VIA4,548nymous_ ++B 8600,25000,300,300,CONT_VIA2,1087ymous_ ++B 10800,21800,300,300,CONT_POLY,1141ymous_ ++B 18800,37600,300,300,CONT_BODY_P,1355ymous_ ++B 26000,33600,300,300,CONT_DIF_P,495nymous_ ++B 24000,35800,300,300,CONT_POLY,441nymous_ ++B 29600,35000,300,300,CONT_VIA2,602nymous_ ++B 31000,19200,300,300,CONT_BODY_N,656nymous_ ++B 32800,20200,300,300,CONT_POLY,710nymous_ ++B 33800,35000,300,300,CONT_VIA2,764nymous_ ++B 36000,20200,300,300,CONT_POLY,818nymous_ ++B 37000,30000,300,300,CONT_VIA,872nymous_ ++B 4400,26000,300,300,CONT_VIA,926nymous_ ++B 15600,33000,300,300,CONT_DIF_N,1248ymous_ ++B 12800,17000,300,300,CONT_VIA,1194ymous_ ++B 5600,6000,300,300,CONT_VIA2,980nymous_ ++B 7600,23000,300,300,CONT_VIA,1034ymous_ ++B 18800,6000,300,300,CONT_BODY_P,1356ymous_ ++B 16800,35800,300,300,CONT_POLY,1302ymous_ ++B 20800,37600,300,300,CONT_BODY_P,388nymous_ ++B 28000,20400,300,300,CONT_DIF_P,549nymous_ ++B 8600,26000,300,300,CONT_VIA2,1088ymous_ ++B 10800,21800,300,300,CONT_VIA,1142ymous_ ++B 26000,33600,300,300,CONT_VIA,496nymous_ ++B 24000,35800,300,300,CONT_VIA,442nymous_ ++B 29600,7000,300,300,CONT_DIF_N,603nymous_ ++B 31600,20200,300,300,CONT_POLY,657nymous_ ++B 33800,36000,300,300,CONT_DIF_P,765nymous_ ++B 32800,22000,300,300,CONT_VIA2,711nymous_ ++B 36000,22000,300,300,CONT_VIA2,819nymous_ ++B 37000,31000,300,300,CONT_DIF_P,873nymous_ ++B 4400,26000,300,300,CONT_VIA2,927nymous_ ++B 5600,8000,300,300,CONT_DIF_N,981nymous_ ++B 15600,34000,300,300,CONT_DIF_N,1249ymous_ ++B 12800,17000,300,300,CONT_VIA2,1195ymous_ ++B 7600,24000,300,300,CONT_DIF_N,1035ymous_ ++B 8600,30000,300,300,CONT_VIA2,1089ymous_ ++B 18800,6000,300,300,CONT_VIA,1357ymous_ ++B 16800,35800,300,300,CONT_VIA,1303ymous_ ++B 24000,37600,300,300,CONT_BODY_N,443nymous_ ++B 20800,19200,300,300,CONT_BODY_P,389nymous_ ++B 28000,21600,300,300,CONT_DIF_P,550nymous_ ++B 29600,10600,300,300,CONT_POLY,604nymous_ ++B 10800,21800,300,300,CONT_VIA2,1143ymous_ ++B 26000,35000,300,300,CONT_DIF_P,497nymous_ ++B 31600,22000,300,300,CONT_VIA2,658nymous_ ++B 32800,23000,300,300,CONT_VIA2,712nymous_ ++B 33800,36000,300,300,CONT_VIA,766nymous_ ++B 36000,23000,300,300,CONT_VIA2,820nymous_ ++B 37000,31000,300,300,CONT_VIA,874nymous_ ++B 13600,19200,300,300,CONT_BODY_P,1196ymous_ ++B 4400,27000,300,300,CONT_DIF_N,928nymous_ ++B 5600,9000,300,300,CONT_DIF_N,982nymous_ ++B 16800,37600,300,300,CONT_BODY_P,1304ymous_ ++B 15600,35000,300,300,CONT_DIF_N,1250ymous_ ++B 7600,24000,300,300,CONT_VIA,1036ymous_ ++B 8600,31000,300,300,CONT_VIA2,1090ymous_ ++B 18800,6000,300,300,CONT_VIA2,1358ymous_ ++B 24000,19200,300,300,CONT_BODY_N,444nymous_ ++B 21000,13000,300,300,CONT_VIA,390nymous_ ++B 28000,22800,300,300,CONT_DIF_P,551nymous_ ++B 29600,10600,300,300,CONT_VIA,605nymous_ ++B 10800,23000,300,300,CONT_DIF_N,1144ymous_ ++B 26000,36400,300,300,CONT_DIF_P,498nymous_ ++B 31600,23000,300,300,CONT_VIA2,659nymous_ ++B 32800,27000,300,300,CONT_VIA2,713nymous_ ++B 34000,19200,300,300,CONT_BODY_N,767nymous_ ++B 36000,27000,300,300,CONT_VIA2,821nymous_ ++B 37000,32000,300,300,CONT_DIF_P,875nymous_ ++B 4400,27000,300,300,CONT_VIA,929nymous_ ++B 14000,21800,300,300,CONT_POLY,1197ymous_ ++B 5600,11800,300,300,CONT_DIF_P,983nymous_ ++B 7600,24000,300,300,CONT_VIA2,1037ymous_ ++B 17400,11800,300,300,CONT_POLY,1305ymous_ ++B 15600,36000,300,300,CONT_DIF_N,1251ymous_ ++B 21000,14000,300,300,CONT_VIA,391nymous_ ++B 28000,24000,300,300,CONT_DIF_P,552nymous_ ++B 8600,32000,300,300,CONT_VIA2,1091ymous_ ++B 10800,24000,300,300,CONT_DIF_N,1145ymous_ ++B 18800,9000,300,300,CONT_DIF_N,1359ymous_ ++B 26000,37600,300,300,CONT_BODY_N,499nymous_ ++B 24800,6000,300,300,CONT_BODY_P,445nymous_ ++B 29600,13000,300,300,CONT_DIF_P,606nymous_ ++B 31600,27000,300,300,CONT_VIA2,660nymous_ ++B 32800,28000,300,300,CONT_VIA2,714nymous_ ++B 3400,24000,300,300,CONT_VIA2,768nymous_ ++B 36000,28000,300,300,CONT_VIA2,822nymous_ ++B 37000,32000,300,300,CONT_VIA,876nymous_ ++B 4400,28000,300,300,CONT_DIF_N,930nymous_ ++B 15600,19200,300,300,CONT_BODY_P,1252ymous_ ++B 14000,21800,300,300,CONT_VIA,1198ymous_ ++B 5600,12800,300,300,CONT_DIF_P,984nymous_ ++B 7600,25000,300,300,CONT_DIF_N,1038ymous_ ++B 18800,16000,300,300,CONT_BODY_N,1360ymous_ ++B 17600,6000,300,300,CONT_BODY_P,1306ymous_ ++B 21200,6000,300,300,CONT_BODY_P,392nymous_ ++B 28000,25200,300,300,CONT_DIF_P,553nymous_ ++B 8600,36000,300,300,CONT_VIA2,1092ymous_ ++B 10800,25000,300,300,CONT_DIF_N,1146ymous_ ++B 26000,6000,300,300,CONT_BODY_P,500nymous_ ++B 24800,6000,300,300,CONT_VIA,446nymous_ ++B 29600,14000,300,300,CONT_DIF_P,607nymous_ ++B 31600,28000,300,300,CONT_VIA2,661nymous_ ++B 3400,25000,300,300,CONT_VIA2,769nymous_ ++B 32800,29000,300,300,CONT_VIA2,715nymous_ ++B 36000,29000,300,300,CONT_VIA2,823nymous_ ++B 37000,33000,300,300,CONT_DIF_P,877nymous_ ++B 4400,28000,300,300,CONT_VIA,931nymous_ ++B 5600,13800,300,300,CONT_DIF_P,985nymous_ ++B 15800,27000,300,300,CONT_VIA2,1253ymous_ ++B 14000,21800,300,300,CONT_VIA2,1199ymous_ ++B 7600,25000,300,300,CONT_VIA,1039ymous_ ++B 8600,19200,300,300,CONT_BODY_P,1093ymous_ ++B 18800,17000,300,300,CONT_VIA,1361ymous_ ++B 17600,6000,300,300,CONT_VIA,1307ymous_ ++B 24800,6000,300,300,CONT_VIA2,447nymous_ ++B 21200,6000,300,300,CONT_VIA,393nymous_ ++B 28000,26400,300,300,CONT_DIF_P,554nymous_ ++B 29600,16000,300,300,CONT_BODY_N,608nymous_ ++B 10800,26000,300,300,CONT_DIF_N,1147ymous_ ++B 26000,6000,300,300,CONT_VIA,501nymous_ ++B 31600,29000,300,300,CONT_VIA2,662nymous_ ++B 32800,33000,300,300,CONT_VIA2,716nymous_ ++B 3400,26000,300,300,CONT_VIA2,770nymous_ ++B 36000,33000,300,300,CONT_VIA2,824nymous_ ++B 37000,33000,300,300,CONT_VIA,878nymous_ ++B 14000,23000,300,300,CONT_DIF_N,1200ymous_ ++B 4400,29000,300,300,CONT_DIF_N,932nymous_ ++B 5600,16000,300,300,CONT_BODY_N,986nymous_ ++B 17600,6000,300,300,CONT_VIA2,1308ymous_ ++B 15800,28000,300,300,CONT_VIA2,1254ymous_ ++B 7600,25000,300,300,CONT_VIA2,1040ymous_ ++B 8800,37600,300,300,CONT_BODY_P,1094ymous_ ++B 18800,17000,300,300,CONT_VIA2,1362ymous_ ++B 24800,8000,300,300,CONT_DIF_N,448nymous_ ++B 21200,6000,300,300,CONT_VIA2,394nymous_ ++B 28000,27600,300,300,CONT_DIF_P,555nymous_ ++B 29600,17000,300,300,CONT_VIA,609nymous_ ++B 10800,27000,300,300,CONT_DIF_N,1148ymous_ ++B 26000,6000,300,300,CONT_VIA2,502nymous_ ++B 31600,33000,300,300,CONT_VIA2,663nymous_ ++B 32800,34000,300,300,CONT_VIA2,717nymous_ ++B 3400,30000,300,300,CONT_VIA2,771nymous_ ++B 36000,34000,300,300,CONT_VIA2,825nymous_ ++B 37000,33000,300,300,CONT_VIA2,879nymous_ ++B 4400,29000,300,300,CONT_VIA,933nymous_ ++B 14000,24000,300,300,CONT_DIF_N,1201ymous_ ++B 5600,17000,300,300,CONT_VIA,987nymous_ ++B 7600,26000,300,300,CONT_DIF_N,1041ymous_ ++B 17600,8600,300,300,CONT_DIF_N,1309ymous_ ++B 15800,29000,300,300,CONT_VIA2,1255ymous_ ++B 21200,9000,300,300,CONT_DIF_N,395nymous_ ++B 28000,28800,300,300,CONT_DIF_P,556nymous_ ++B 8800,37600,300,300,CONT_VIA,1095ymous_ ++B 10800,28000,300,300,CONT_DIF_N,1149ymous_ ++B 19600,19200,300,300,CONT_BODY_P,1363ymous_ ++B 26000,8000,300,300,CONT_DIF_N,503nymous_ ++B 24800,13000,300,300,CONT_DIF_P,449nymous_ ++B 29600,17000,300,300,CONT_VIA2,610nymous_ ++B 31600,34000,300,300,CONT_VIA2,664nymous_ ++B 32800,35000,300,300,CONT_VIA2,718nymous_ ++B 3400,31000,300,300,CONT_VIA2,772nymous_ ++B 36000,35000,300,300,CONT_VIA2,826nymous_ ++B 37000,34000,300,300,CONT_DIF_P,880nymous_ ++B 4400,30000,300,300,CONT_DIF_N,934nymous_ ++B 15800,37600,300,300,CONT_BODY_P,1256ymous_ ++B 14000,25000,300,300,CONT_DIF_N,1202ymous_ ++B 5600,17000,300,300,CONT_VIA2,988nymous_ ++B 7600,26000,300,300,CONT_VIA,1042ymous_ ++B 19800,22600,300,300,CONT_POLY,1364ymous_ ++B 17600,12800,300,300,CONT_DIF_P,1310ymous_ ++B 21200,16000,300,300,CONT_BODY_N,396nymous_ ++B 28000,30000,300,300,CONT_DIF_P,557nymous_ ++B 8800,37600,300,300,CONT_VIA2,1096ymous_ ++B 10800,29000,300,300,CONT_DIF_N,1150ymous_ ++B 26000,12000,300,300,CONT_VIA2,504nymous_ ++B 24800,13000,300,300,CONT_VIA,450nymous_ ++B 3600,37600,300,300,CONT_BODY_P,828nymous_ ++B 3400,36000,300,300,CONT_VIA2,774nymous_ ++B 33200,6000,300,300,CONT_BODY_P,720nymous_ ++B 31800,9000,300,300,CONT_POLY,666nymous_ ++B 26000,13000,300,300,CONT_DIF_P,505nymous_ ++B 10800,30000,300,300,CONT_DIF_N,1151ymous_ ++B 30000,0,300,300,CONT_VIA3,612nymous_ ++B 28000,31200,300,300,CONT_DIF_P,558nymous_ ++B 9200,24000,300,300,CONT_DIF_N,1098ymous_ ++B 7600,27000,300,300,CONT_DIF_N,1044ymous_ ++B 1600,21400,300,300,CONT_BODY_P,1258ymous_ ++B 17600,17000,300,300,CONT_VIA,1312ymous_ ++B 6000,23000,300,300,CONT_DIF_N,990nymous_ ++B 4400,30000,300,300,CONT_VIA2,936nymous_ ++B 14000,27000,300,300,CONT_DIF_N,1204ymous_ ++B 37000,34000,300,300,CONT_VIA2,882nymous_ ++B 30000,0,300,300,CONT_VIA2,611nymous_ ++B 31600,35000,300,300,CONT_VIA2,665nymous_ ++B 3400,32000,300,300,CONT_VIA2,773nymous_ ++B 33000,19200,300,300,CONT_BODY_N,719nymous_ ++B 36000,19200,300,300,CONT_BODY_N,827nymous_ ++B 37000,34000,300,300,CONT_VIA,881nymous_ ++B 4400,30000,300,300,CONT_VIA,935nymous_ ++B 5600,19200,300,300,CONT_BODY_P,989nymous_ ++B 1600,20400,300,300,CONT_BODY_P,1257ymous_ ++B 14000,26000,300,300,CONT_DIF_N,1203ymous_ ++B 7600,26000,300,300,CONT_VIA2,1043ymous_ ++B 9200,23000,300,300,CONT_DIF_N,1097ymous_ ++B 19800,26200,300,300,CONT_POLY,1365ymous_ ++B 17600,16000,300,300,CONT_BODY_N,1311ymous_ ++B 24800,14000,300,300,CONT_DIF_P,451nymous_ ++B 22000,22200,300,300,CONT_VIA,397nymous_ ++B 19800,27400,300,300,CONT_POLY,1366ymous_ ++B 24800,14000,300,300,CONT_VIA,452nymous_ ++B 22000,19200,300,300,CONT_VIA,398nymous_ ++B 28000,31200,300,300,CONT_VIA,559nymous_ ++B 30000,0,300,300,CONT_VIA4,613nymous_ ++B 10800,31000,300,300,CONT_DIF_N,1152ymous_ ++B 26000,13000,300,300,CONT_VIA2,506nymous_ ++B 31800,12200,300,300,CONT_POLY,667nymous_ ++B 33200,6000,300,300,CONT_VIA,721nymous_ ++B 34400,6000,300,300,CONT_BODY_P,775nymous_ ++B 3600,37600,300,300,CONT_VIA,829nymous_ ++B 37000,35000,300,300,CONT_DIF_P,883nymous_ ++B 4400,31000,300,300,CONT_DIF_N,937nymous_ ++B 14000,28000,300,300,CONT_DIF_N,1205ymous_ ++B 6000,24000,300,300,CONT_DIF_N,991nymous_ ++B 7600,27000,300,300,CONT_VIA,1045ymous_ ++B 17600,17000,300,300,CONT_VIA2,1313ymous_ ++B 1600,22400,300,300,CONT_BODY_P,1259ymous_ ++B 22400,6000,300,300,CONT_BODY_P,399nymous_ ++B 28000,32400,300,300,CONT_DIF_P,560nymous_ ++B 9200,25000,300,300,CONT_DIF_N,1099ymous_ ++B 10800,32000,300,300,CONT_DIF_N,1153ymous_ ++B 19800,28200,300,300,CONT_VIA,1367ymous_ ++B 26000,14000,300,300,CONT_DIF_P,507nymous_ ++B 24800,16000,300,300,CONT_BODY_N,453nymous_ ++B 30000,20200,300,300,CONT_VIA,614nymous_ ++B 32000,6000,300,300,CONT_BODY_P,668nymous_ ++B 33200,6000,300,300,CONT_VIA2,722nymous_ ++B 34400,6000,300,300,CONT_VIA,776nymous_ ++B 3600,37600,300,300,CONT_VIA2,830nymous_ ++B 37000,35000,300,300,CONT_VIA,884nymous_ ++B 4400,31000,300,300,CONT_VIA,938nymous_ ++B 1600,23400,300,300,CONT_BODY_P,1260ymous_ ++B 14000,29000,300,300,CONT_DIF_N,1206ymous_ ++B 6000,25000,300,300,CONT_DIF_N,992nymous_ ++B 7600,28000,300,300,CONT_DIF_N,1046ymous_ ++B 19800,31000,300,300,CONT_POLY,1368ymous_ ++B 17600,19200,300,300,CONT_BODY_P,1314ymous_ ++B 22400,6000,300,300,CONT_VIA,400nymous_ ++B 28000,33600,300,300,CONT_DIF_P,561nymous_ ++B 9200,26000,300,300,CONT_DIF_N,1100ymous_ ++B 10800,33000,300,300,CONT_DIF_N,1154ymous_ ++B 26000,14000,300,300,CONT_VIA2,508nymous_ ++B 25000,20400,300,300,CONT_DIF_P,454nymous_ ++B 30000,19200,300,300,CONT_BODY_N,615nymous_ ++B 32000,6000,300,300,CONT_VIA,669nymous_ ++B 34400,6000,300,300,CONT_VIA2,777nymous_ ++B 33200,8000,300,300,CONT_DIF_N,723nymous_ ++B 3600,19200,300,300,CONT_BODY_P,831nymous_ ++B 37000,35000,300,300,CONT_VIA2,885nymous_ ++B 4400,31000,300,300,CONT_VIA2,939nymous_ ++B 6000,26000,300,300,CONT_DIF_N,993nymous_ ++B 1600,24400,300,300,CONT_BODY_P,1261ymous_ ++B 14000,30000,300,300,CONT_DIF_N,1207ymous_ ++B 33800,22000,300,300,CONT_VIA2,731nymous_ ++B 7600,28000,300,300,CONT_VIA,1047ymous_ ++B 9200,27000,300,300,CONT_DIF_N,1101ymous_ ++B 19800,35200,300,300,CONT_VIA,1369ymous_ ++B 17800,23200,300,300,CONT_DIF_N,1315ymous_ ++B 25000,20400,300,300,CONT_VIA,455nymous_ ++B 22400,6000,300,300,CONT_VIA2,401nymous_ ++B 28000,35000,300,300,CONT_DIF_P,562nymous_ ++B 30400,36600,300,300,CONT_POLY,616nymous_ ++B 10800,34000,300,300,CONT_DIF_N,1155ymous_ ++B 26000,16000,300,300,CONT_BODY_N,509nymous_ ++B 32000,6000,300,300,CONT_VIA2,670nymous_ ++B 33200,13000,300,300,CONT_DIF_P,724nymous_ ++B 34400,8000,300,300,CONT_DIF_N,778nymous_ ++B 36800,6000,300,300,CONT_BODY_P,832nymous_ ++B 37000,36000,300,300,CONT_DIF_P,886nymous_ ++B 14000,31000,300,300,CONT_DIF_N,1208ymous_ ++B 4400,32000,300,300,CONT_DIF_N,940nymous_ ++B 6000,27000,300,300,CONT_DIF_N,994nymous_ ++B 17800,23200,300,300,CONT_VIA,1316ymous_ ++B 1600,25400,300,300,CONT_BODY_P,1262ymous_ ++B 7600,29000,300,300,CONT_DIF_N,1048ymous_ ++B 9200,28000,300,300,CONT_DIF_N,1102ymous_ ++B 19800,37600,300,300,CONT_BODY_P,1370ymous_ ++B 25000,21600,300,300,CONT_DIF_P,456nymous_ ++B 22400,8600,300,300,CONT_DIF_N,402nymous_ ++B 28000,19200,300,300,CONT_BODY_N,563nymous_ ++B 30400,36600,300,300,CONT_VIA,617nymous_ ++B 10800,35000,300,300,CONT_DIF_N,1156ymous_ ++B 26000,17000,300,300,CONT_VIA,510nymous_ ++B 32000,8000,300,300,CONT_DIF_N,671nymous_ ++B 33200,14000,300,300,CONT_DIF_P,725nymous_ ++B 34400,13000,300,300,CONT_DIF_P,779nymous_ ++B 36800,6000,300,300,CONT_VIA,833nymous_ ++B 37000,36000,300,300,CONT_VIA,887nymous_ ++B 4400,32000,300,300,CONT_VIA,941nymous_ ++B 12400,27000,300,300,CONT_DIF_N,1175ymous_ ++B 14000,32000,300,300,CONT_DIF_N,1209ymous_ ++B 6000,28000,300,300,CONT_DIF_N,995nymous_ ++B 7600,29000,300,300,CONT_VIA,1049ymous_ ++B 17800,24400,300,300,CONT_DIF_N,1317ymous_ ++B 1600,26400,300,300,CONT_BODY_P,1263ymous_ ++B 22400,16000,300,300,CONT_BODY_N,403nymous_ ++B 2800,23000,300,300,CONT_DIF_N,564nymous_ ++B 9200,29000,300,300,CONT_DIF_N,1103ymous_ ++B 10800,36000,300,300,CONT_DIF_N,1157ymous_ ++B 26000,17000,300,300,CONT_VIA2,511nymous_ ++B 25000,22800,300,300,CONT_DIF_P,457nymous_ ++B 22400,8000,200,200,CONT_TURN1,355nymous_ ++B 21200,10000,200,200,CONT_TURN1,354nymous_ ++B 30400,36600,300,300,CONT_VIA2,618nymous_ ++B 32000,13000,300,300,CONT_DIF_P,672nymous_ ++B 33200,16000,300,300,CONT_BODY_N,726nymous_ ++B 34400,13000,300,300,CONT_VIA,780nymous_ ++B 36800,6000,300,300,CONT_VIA2,834nymous_ ++B 37000,19200,300,300,CONT_BODY_N,888nymous_ ++B 4400,32000,300,300,CONT_VIA2,942nymous_ ++B 1600,27400,300,300,CONT_BODY_P,1264ymous_ ++B 14000,33000,300,300,CONT_DIF_N,1210ymous_ ++B 6000,29000,300,300,CONT_DIF_N,996nymous_ ++B 7600,30000,300,300,CONT_DIF_N,1050ymous_ ++B 17800,24400,300,300,CONT_VIA2,1318ymous_ ++B 22400,17000,300,300,CONT_VIA,404nymous_ ++B 2800,24000,300,300,CONT_DIF_N,565nymous_ ++B 9200,30000,300,300,CONT_DIF_N,1104ymous_ ++B 11600,6000,300,300,CONT_BODY_P,1158ymous_ ++B 26000,19200,300,300,CONT_BODY_N,512nymous_ ++B 25000,22800,300,300,CONT_VIA,458nymous_ ++B 27200,16000,300,300,CONT_BODY_N,541nymous_ ++B 30600,22000,300,300,CONT_DIF_P,619nymous_ ++B 32000,16000,300,300,CONT_BODY_N,673nymous_ ++B 34400,14000,300,300,CONT_DIF_P,781nymous_ ++B 33200,17000,300,300,CONT_VIA,727nymous_ ++B 36800,7000,300,300,CONT_BODY_P,835nymous_ ++B 37200,37600,300,300,CONT_BODY_N,889nymous_ ++B 4400,33000,300,300,CONT_DIF_N,943nymous_ ++B 6000,30000,300,300,CONT_DIF_N,997nymous_ ++B 1600,28400,300,300,CONT_BODY_P,1265ymous_ ++B 14000,34000,300,300,CONT_DIF_N,1211ymous_ ++B 7600,30000,300,300,CONT_VIA,1051ymous_ ++B 9200,31000,300,300,CONT_DIF_N,1105ymous_ ++B 17800,25600,300,300,CONT_DIF_N,1319ymous_ ++B 25000,24000,300,300,CONT_DIF_P,459nymous_ ++B 22400,17000,300,300,CONT_VIA2,405nymous_ ++B 2800,25000,300,300,CONT_DIF_N,566nymous_ ++B 30600,23000,300,300,CONT_DIF_P,620nymous_ ++B 11600,6000,300,300,CONT_VIA,1159ymous_ ++B 2600,37600,300,300,CONT_BODY_P,513nymous_ ++B 32000,17000,300,300,CONT_VIA,674nymous_ ++B 33200,17000,300,300,CONT_VIA2,728nymous_ ++B 34400,14000,300,300,CONT_VIA,782nymous_ ++B 36800,8000,300,300,CONT_BODY_P,836nymous_ ++B 38000,27000,300,300,CONT_VIA2,890nymous_ ++B 14000,35000,300,300,CONT_DIF_N,1212ymous_ ++B 4400,33000,300,300,CONT_VIA,944nymous_ ++B 6000,31000,300,300,CONT_DIF_N,998nymous_ ++B 17800,25600,300,300,CONT_VIA,1320ymous_ ++B 1600,29400,300,300,CONT_BODY_P,1266ymous_ ++B 7600,30000,300,300,CONT_VIA2,1052ymous_ ++B 9200,32000,300,300,CONT_DIF_N,1106ymous_ ++B 25000,25200,300,300,CONT_DIF_P,460nymous_ ++B 23000,20400,300,300,CONT_BODY_N,406nymous_ ++B 2800,26000,300,300,CONT_DIF_N,567nymous_ ++B 30600,24000,300,300,CONT_DIF_P,621nymous_ ++B 11600,6000,300,300,CONT_VIA2,1160ymous_ ++B 2600,19200,300,300,CONT_BODY_P,514nymous_ ++B 32000,17000,300,300,CONT_VIA2,675nymous_ ++B 33800,22000,300,300,CONT_DIF_P,729nymous_ ++B 34400,16000,300,300,CONT_BODY_N,783nymous_ ++B 36800,9000,300,300,CONT_BODY_P,837nymous_ ++B 38000,28000,300,300,CONT_VIA2,891nymous_ ++B 4400,34000,300,300,CONT_DIF_N,945nymous_ ++B 14000,36000,300,300,CONT_DIF_N,1213ymous_ ++B 6000,32000,300,300,CONT_DIF_N,999nymous_ ++B 7600,31000,300,300,CONT_DIF_N,1053ymous_ ++B 17800,25600,300,300,CONT_VIA2,1321ymous_ ++B 1600,30400,300,300,CONT_BODY_P,1267ymous_ ++B 23000,21400,300,300,CONT_BODY_N,407nymous_ ++B 2800,27000,300,300,CONT_DIF_N,568nymous_ ++B 9200,33000,300,300,CONT_DIF_N,1107ymous_ ++B 11600,8000,300,300,CONT_DIF_N,1161ymous_ ++B 27000,20400,300,300,CONT_DIF_P,515nymous_ ++B 25000,26400,300,300,CONT_DIF_P,461nymous_ ++B 30600,25000,300,300,CONT_DIF_P,622nymous_ ++B 32000,19200,300,300,CONT_BODY_N,676nymous_ ++B 33800,22000,300,300,CONT_VIA,730nymous_ ++B 34800,20200,300,300,CONT_POLY,784nymous_ ++B 36800,9000,300,300,CONT_VIA2,838nymous_ ++B 38000,29000,300,300,CONT_VIA2,892nymous_ ++B 4400,34000,300,300,CONT_VIA,946nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/piot_mpx.vbe b/alliance/src/cells/src/mpxlib/piot_mpx.vbe +new file mode 100644 +index 0000000..2723794 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/piot_mpx.vbe +@@ -0,0 +1,44 @@ ++ENTITY piot_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT rup : NATURAL := 402; ++ CONSTANT rdown : NATURAL := 0 ++ ); ++ PORT ( ++ i : in BIT; ++ b : in BIT; ++ t : out BIT; ++ pad : inout MUX_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END piot_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF piot_mpx IS ++ SIGNAL b1 : BIT; ++ SIGNAL b2 : BIT; ++ SIGNAL b3 : BIT; ++ SIGNAL b4 : BIT; ++ SIGNAL b5 : BIT; ++ SIGNAL b6 : BIT; ++ ++BEGIN ++ b6 <= b5; ++ b5 <= b4; ++ b4 <= b3; ++ b3 <= b2; ++ b2 <= b1; ++ b1 <= b; ++ label0 : BLOCK (b6 = '1') ++ BEGIN ++ pad <= GUARDED i; ++ END BLOCK label0; ++ t <= pad; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on piot_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/po_mpx.ap b/alliance/src/cells/src/mpxlib/po_mpx.ap +new file mode 100644 +index 0000000..ffb3150 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/po_mpx.ap +@@ -0,0 +1,1536 @@ ++V ALLIANCE : 6 ++H po_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 27800,11800,28200,11800,200,i,RIGHT,POLY ++S 28000,0,28000,0,400,i,RIGHT,CALU4 ++S 28000,0,28000,0,400,i,RIGHT,CALU5 ++S 28000,-300,28000,10900,400,i,UP,ALU2 ++S 28800,9000,29000,9000,200,i,RIGHT,POLY ++S 20000,48100,20000,71900,24400,pad,UP,CALU1 ++S 28600,25800,29000,25800,600,pad,RIGHT,POLY ++S 28600,30600,29000,30600,600,pad,RIGHT,POLY ++S 28600,31800,29000,31800,600,pad,RIGHT,POLY ++S 28600,33000,29000,33000,600,pad,RIGHT,POLY ++S 29000,25900,29000,34900,400,pad,UP,ALU1 ++S 29000,35100,29000,39700,400,pad,UP,ALU1 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 25100,26400,27900,26400,400,vdde,RIGHT,ALU1 ++S 25100,21600,27900,21600,400,vdde,RIGHT,ALU1 ++S 6800,22200,8400,22200,200,vdde,RIGHT,POLY ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 16800,33400,17200,33400,200,vdde,RIGHT,POLY ++S 3600,22200,5200,22200,200,vdde,RIGHT,POLY ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 10500,21800,14300,21800,400,vdde,RIGHT,ALU2 ++S 16800,29900,16800,38300,400,vdde,UP,ALU2 ++S 16800,32200,17200,32200,200,vdde,RIGHT,POLY ++S 16800,35800,17200,35800,200,vdde,RIGHT,POLY ++S 24000,34200,24400,34200,600,vdde,RIGHT,POLY ++S 24000,35800,24400,35800,600,vdde,RIGHT,POLY ++S 25100,24000,27900,24000,400,vdde,RIGHT,ALU1 ++S 25100,28800,27900,28800,400,vdde,RIGHT,ALU1 ++S 16800,34600,17200,34600,200,vdde,RIGHT,POLY ++S 20000,9600,20000,11000,200,vddi,UP,POLY ++S 3100,16000,36900,16000,2400,vddi,RIGHT,ALU1 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 20800,22900,20800,37100,400,vsse,UP,ALU1 ++S 30400,36400,30400,36600,200,vsse,UP,POLY ++S 4400,22900,4400,37500,400,vsse,UP,ALU1 ++S 7600,22900,7600,37500,400,vsse,UP,ALU1 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 17800,22900,17800,31900,400,vsse,UP,ALU2 ++S 3100,6000,36900,6000,2400,vssi,RIGHT,ALU1 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 29600,9800,29600,11400,200,248nymous_,UP,POLY ++S 14600,11100,14600,13100,200,p17c,UP,PTRANS ++S 14800,22500,14800,36700,200,n15d,UP,NTRANS ++S 6200,10900,6200,14900,200,p18b,UP,PTRANS ++S 30800,8100,30800,12900,400,cnbb,UP,ALU1 ++S 30800,10600,33800,10600,200,cnbb,RIGHT,POLY ++S 6800,22500,6800,36700,200,n14c,UP,NTRANS ++S 35000,7300,35000,8300,200,n5b,UP,NTRANS ++S 35000,12700,35000,14700,200,p5b,UP,PTRANS ++S 27800,12500,27800,14500,200,p1,UP,PTRANS ++S 18800,8500,18800,9100,420,13onymous_,UP,NDIF ++S 18800,9100,18800,9900,400,12onymous_,UP,ALU1 ++S 16800,23200,16800,25400,600,52onymous_,UP,POLY ++S 16800,24100,16800,29500,400,51onymous_,UP,ALU2 ++S 16800,20900,16800,24700,400,53onymous_,UP,ALU2 ++S 18500,17000,20300,17000,400,11onymous_,RIGHT,ALU2 ++S 17500,22600,19100,22600,200,n6d,RIGHT,NTRANS ++S 26000,6100,26000,7900,400,285nymous_,UP,ALU1 ++S 26000,30900,26000,37100,400,286nymous_,UP,ALU2 ++S 12400,22700,12400,36500,620,93onymous_,UP,NDIF ++S 19800,32900,19800,35100,400,10onymous_,UP,ALU1 ++S 38200,19300,38200,37500,400,169nymous_,UP,ALU1 ++S 32200,21100,32200,36500,620,211nymous_,UP,PDIF ++S 32200,21300,32200,39700,400,210nymous_,UP,ALU1 ++S 23000,19300,23000,37500,400,321nymous_,UP,ALU1 ++S 12400,18500,12400,22100,2400,92onymous_,UP,ALU2 ++S 23000,19080,23000,37920,600,320nymous_,UP,NTIE ++S 9200,7500,9200,9100,620,127nymous_,UP,NDIF ++S 12800,7500,12800,9100,620,91onymous_,UP,NDIF ++S 23100,19200,38100,19200,400,319nymous_,RIGHT,ALU1 ++S 8900,10000,26300,10000,2400,126nymous_,RIGHT,ALU2 ++S 22880,19200,38320,19200,600,318nymous_,RIGHT,NTIE ++S 29600,7100,29600,8100,620,249nymous_,UP,NDIF ++S 12400,20700,12400,36300,400,94onymous_,UP,ALU1 ++S 8900,6000,26300,6000,400,130nymous_,RIGHT,ALU2 ++S 9200,6100,9200,7900,400,129nymous_,UP,ALU1 ++S 23000,11700,23000,17300,2000,322nymous_,UP,ALU2 ++S 25100,35000,29100,35000,400,290nymous_,RIGHT,ALU1 ++S 9200,5700,9200,11300,400,128nymous_,UP,ALU2 ++S 25400,8600,25400,12400,200,289nymous_,UP,POLY ++S 29480,37600,38520,37600,600,250nymous_,RIGHT,NTIE ++S 26000,21300,26000,24300,400,288nymous_,UP,ALU2 ++S 26000,23700,26000,29100,400,287nymous_,UP,ALU2 ++S 31400,35300,31400,36100,200,p11,UP,PTRANS ++S 17900,36400,18700,36400,400,17onymous_,RIGHT,ALU1 ++S 1800,17700,1800,38300,1600,16onymous_,UP,ALU2 ++S 16800,20300,16800,23300,400,55onymous_,UP,ALU1 ++S 3200,11100,3200,15900,400,215nymous_,UP,ALU1 ++S 36800,10880,36800,16120,600,173nymous_,UP,NTIE ++S 16500,21200,25300,21200,400,54onymous_,RIGHT,ALU2 ++S 3200,10880,3200,16120,600,214nymous_,UP,NTIE ++S 37000,21100,37000,36500,620,172nymous_,UP,PDIF ++S 22400,8500,22400,9100,620,325nymous_,UP,NDIF ++S 2900,15400,19300,15400,1200,213nymous_,RIGHT,ALU2 ++S 37000,17700,37000,38300,2400,170nymous_,UP,ALU2 ++S 23100,37600,27700,37600,400,323nymous_,RIGHT,ALU1 ++S 2900,17000,19100,17000,400,212nymous_,RIGHT,ALU2 ++S 22100,17000,23700,17000,400,324nymous_,RIGHT,ALU2 ++S 37000,21300,37000,36300,400,171nymous_,UP,ALU1 ++S 16500,20200,24300,20200,400,56onymous_,RIGHT,ALU2 ++S 16400,12100,16400,15900,400,57onymous_,UP,ALU1 ++S 16400,11300,16400,12900,620,58onymous_,UP,PDIF ++S 18400,10100,18400,12700,400,14onymous_,UP,ALU1 ++S 18200,9600,21800,9600,200,15onymous_,RIGHT,POLY ++S 31400,20900,31400,34300,200,p14a,UP,PTRANS ++S 16400,7500,16400,9100,620,59onymous_,UP,NDIF ++S 36800,5880,36800,8720,600,177nymous_,UP,PTIE ++S 24900,36400,28100,36400,620,294nymous_,RIGHT,PDIF ++S 36800,6100,36800,9100,400,176nymous_,UP,ALU1 ++S 22000,17900,22000,19500,400,329nymous_,UP,ALU2 ++S 24800,7500,24800,8100,620,293nymous_,UP,NDIF ++S 2900,6000,7100,6000,400,217nymous_,RIGHT,ALU2 ++S 900,37000,8900,37000,2400,97onymous_,RIGHT,ALU2 ++S 36800,6900,36800,17300,400,175nymous_,UP,ALU2 ++S 21700,18200,25100,18200,400,328nymous_,RIGHT,ALU2 ++S 24800,8100,24800,13900,400,292nymous_,UP,ALU1 ++S 2900,10000,6300,10000,2400,216nymous_,RIGHT,ALU2 ++S 36800,11100,36800,15900,400,174nymous_,UP,ALU1 ++S 9200,22700,9200,36500,620,131nymous_,UP,NDIF ++S 9200,20700,9200,36300,400,132nymous_,UP,ALU1 ++S 12200,9600,12200,10800,200,95onymous_,UP,POLY ++S 22400,8100,22400,8500,400,326nymous_,UP,ALU1 ++S 8600,9600,8600,10600,200,133nymous_,UP,POLY ++S 22000,19300,22000,22100,400,327nymous_,UP,ALU1 ++S 900,19000,9300,19000,2400,96onymous_,RIGHT,ALU2 ++S 16400,6100,16400,8900,400,60onymous_,UP,ALU1 ++S 16400,29900,16400,32300,400,61onymous_,UP,ALU2 ++S 24800,13100,24800,14500,620,291nymous_,UP,PDIF ++S 28700,18200,34700,18200,400,253nymous_,RIGHT,ALU2 ++S 29000,18300,29000,19500,400,252nymous_,UP,ALU2 ++S 29300,37000,31900,37000,2400,251nymous_,RIGHT,ALU2 ++S 7400,7300,7400,9300,200,n18c,UP,NTRANS ++S 7400,10900,7400,14900,200,p18c,UP,PTRANS ++S 20000,8500,20000,9100,620,pad2,UP,NDIF ++S 2700,20600,15700,20600,400,pad2,RIGHT,ALU1 ++S 2900,20600,15500,20600,400,pad2,RIGHT,ALU1 ++S 17900,31600,18700,31600,400,19onymous_,RIGHT,ALU1 ++S 17900,34000,18700,34000,400,18onymous_,RIGHT,ALU1 ++S 1600,19080,1600,37720,600,62onymous_,UP,PTIE ++S 21200,9100,21200,9900,400,331nymous_,UP,ALU1 ++S 3200,5880,3200,8720,600,220nymous_,UP,PTIE ++S 8000,8100,8000,8900,400,136nymous_,UP,ALU1 ++S 36700,37600,38100,37600,400,178nymous_,RIGHT,ALU1 ++S 11600,7500,11600,9100,420,100nymous_,UP,NDIF ++S 24900,35000,28100,35000,820,295nymous_,RIGHT,PDIF ++S 3200,6100,3200,9100,400,219nymous_,UP,ALU1 ++S 8000,11100,8000,13700,400,135nymous_,UP,ALU1 ++S 11600,11100,11600,14700,620,99onymous_,UP,PDIF ++S 22000,21900,22000,28500,400,330nymous_,UP,ALU2 ++S 3200,5700,3200,16100,400,218nymous_,UP,ALU2 ++S 8000,11100,8000,14700,620,134nymous_,UP,PDIF ++S 11600,11900,11600,15900,400,98onymous_,UP,ALU1 ++S 29000,8600,29000,9000,200,256nymous_,UP,POLY ++S 29000,11400,29000,12200,200,255nymous_,UP,POLY ++S 28700,24600,30300,24600,400,257nymous_,RIGHT,ALU2 ++S 11600,6100,11600,8900,400,101nymous_,UP,ALU1 ++S 8000,7500,8000,9100,420,137nymous_,UP,NDIF ++S 21200,8500,21200,9100,420,332nymous_,UP,NDIF ++S 3480,16000,36920,16000,600,179nymous_,RIGHT,NTIE ++S 20800,19080,20800,37720,600,333nymous_,UP,PTIE ++S 3600,22200,5200,22200,200,180nymous_,RIGHT,POLY ++S 1600,19300,1600,37500,400,63onymous_,UP,ALU1 ++S 3600,22500,3600,36700,200,n14a,UP,NTRANS ++S 20600,8300,20600,9300,200,n16c,UP,NTRANS ++S 1480,19200,20920,19200,600,64onymous_,RIGHT,PTIE ++S 1700,19200,20700,19200,400,65onymous_,RIGHT,ALU1 ++S 17900,30400,18700,30400,400,20onymous_,RIGHT,ALU1 ++S 15800,11100,15800,13100,200,p17d,UP,PTRANS ++S 17900,28000,18700,28000,400,21onymous_,RIGHT,ALU1 ++S 15800,7300,15800,9300,200,n17d,UP,NTRANS ++S 29000,11400,32600,11400,200,254nymous_,RIGHT,POLY ++S 32000,12900,32000,14500,620,221nymous_,UP,PDIF ++S 24900,32400,28100,32400,420,297nymous_,RIGHT,PDIF ++S 11600,22500,11600,36700,200,n15b,UP,NTRANS ++S 32000,8100,32000,12900,400,222nymous_,UP,ALU1 ++S 7600,22700,7600,38300,2400,138nymous_,UP,ALU2 ++S 24900,31200,28100,31200,420,298nymous_,RIGHT,PDIF ++S 11000,10900,11000,14900,200,p18f,UP,PTRANS ++S 7600,22900,7600,37500,400,139nymous_,UP,ALU1 ++S 24900,30000,28100,30000,420,299nymous_,RIGHT,PDIF ++S 20800,19300,20800,37500,400,334nymous_,UP,ALU1 ++S 11000,9600,11000,10600,200,102nymous_,UP,POLY ++S 7600,22700,7600,36500,620,140nymous_,UP,NDIF ++S 11000,7300,11000,9300,200,n18f,UP,NTRANS ++S 36000,20200,36000,20600,600,181nymous_,UP,POLY ++S 7300,21800,10100,21800,400,141nymous_,RIGHT,ALU2 ++S 20000,12700,20000,17300,400,335nymous_,UP,ALU2 ++S 10800,22900,10800,39700,400,103nymous_,UP,ALU1 ++S 35300,17000,37100,17000,400,182nymous_,RIGHT,ALU2 ++S 20000,11100,20000,15900,400,336nymous_,UP,ALU1 ++S 1700,37600,9500,37600,400,66onymous_,RIGHT,ALU1 ++S 35600,13100,35600,15900,400,183nymous_,UP,ALU1 ++S 20000,6300,20000,8500,400,337nymous_,UP,ALU1 ++S 15800,9600,15800,10800,200,67onymous_,UP,POLY ++S 17900,26800,18700,26800,400,22onymous_,RIGHT,ALU1 ++S 25000,20100,25000,23100,400,cn,UP,ALU2 ++S 25100,20400,27900,20400,400,cn,RIGHT,ALU1 ++S 25100,22800,27900,22800,400,cn,RIGHT,ALU1 ++S 4100,21800,7900,21800,400,cn,RIGHT,ALU2 ++S 10000,22200,11600,22200,200,cn,RIGHT,POLY ++S 13200,22200,14800,22200,200,cn,RIGHT,POLY ++S 25100,25200,27900,25200,400,fbul,RIGHT,ALU1 ++S 25100,37000,27900,37000,1600,fbul,RIGHT,ALU1 ++S 36200,20900,36200,36700,200,p14d,UP,PTRANS ++S 28400,14100,28400,15900,400,258nymous_,UP,ALU1 ++S 24900,33600,28100,33600,420,296nymous_,RIGHT,PDIF ++S 17900,25600,18700,25600,400,23onymous_,RIGHT,ALU1 ++S 17900,24400,18700,24400,400,24onymous_,RIGHT,ALU1 ++S 17900,23200,18700,23200,400,25onymous_,RIGHT,ALU1 ++S 25100,31200,27900,31200,400,node_cp,RIGHT,ALU1 ++S 25100,33600,27900,33600,400,node_cp,RIGHT,ALU1 ++S 28000,24300,28000,31500,400,node_cp,UP,ALU2 ++S 27700,24600,29300,24600,400,node_cp,RIGHT,ALU2 ++S 28600,24600,29000,24600,600,node_cp,RIGHT,POLY ++S 31400,20600,33000,20600,200,node_cp,RIGHT,POLY ++S 34600,20600,36200,20600,200,node_cp,RIGHT,POLY ++S 17900,32800,19700,32800,400,node_cp,RIGHT,ALU1 ++S 17900,35200,19700,35200,400,node_cp,RIGHT,ALU1 ++S 19500,36800,26300,36800,400,node_cp,RIGHT,ALU2 ++S 20000,40100,20000,59900,4400,338nymous_,UP,ALU1 ++S 35600,7500,35600,8100,620,185nymous_,UP,NDIF ++S 7400,9600,7400,10600,200,143nymous_,UP,POLY ++S 35600,12900,35600,14500,620,184nymous_,UP,PDIF ++S 10800,21800,10800,22200,600,105nymous_,UP,POLY ++S 24900,25200,28100,25200,420,303nymous_,RIGHT,PDIF ++S 10800,22700,10800,36500,620,104nymous_,UP,NDIF ++S 7600,21800,7600,22200,600,142nymous_,UP,POLY ++S 24900,26400,28100,26400,420,302nymous_,RIGHT,PDIF ++S 31800,12000,31800,12200,200,226nymous_,UP,POLY ++S 24900,27600,28100,27600,420,301nymous_,RIGHT,PDIF ++S 31700,6000,37100,6000,400,225nymous_,RIGHT,ALU2 ++S 24900,28800,28100,28800,420,300nymous_,RIGHT,PDIF ++S 32000,7500,32000,8100,620,224nymous_,UP,NDIF ++S 28300,9000,28700,9000,400,262nymous_,RIGHT,ALU1 ++S 31700,7600,37100,7600,1200,223nymous_,RIGHT,ALU2 ++S 28400,7500,28400,8100,620,261nymous_,UP,NDIF ++S 28500,8000,30700,8000,400,260nymous_,RIGHT,ALU1 ++S 29000,7300,29000,8300,200,n1,UP,NTRANS ++S 25000,27300,25000,32700,400,cpd,UP,ALU2 ++S 25100,27600,27900,27600,400,cpd,RIGHT,ALU1 ++S 25100,30000,27900,30000,400,cpd,RIGHT,ALU1 ++S 25100,32400,27900,32400,400,cpd,RIGHT,ALU1 ++S 18800,21900,18800,36700,400,cpd,UP,ALU2 ++S 18500,31600,25300,31600,400,cpd,RIGHT,ALU2 ++S 21800,8300,21800,9300,200,n16d,UP,NTRANS ++S 28400,12700,28400,14300,620,259nymous_,UP,PDIF ++S 7000,6900,7000,14300,400,144nymous_,UP,ALU2 ++S 35600,6100,35600,7900,400,186nymous_,UP,ALU1 ++S 25700,15400,28900,15400,1200,339nymous_,RIGHT,ALU2 ++S 35100,13000,37100,13000,2400,187nymous_,RIGHT,ALU2 ++S 6800,12100,6800,15900,400,145nymous_,UP,ALU1 ++S 26700,13000,33700,13000,2400,340nymous_,RIGHT,ALU2 ++S 17900,22000,18700,22000,400,26onymous_,RIGHT,ALU1 ++S 17700,12800,18300,12800,400,27onymous_,RIGHT,ALU1 ++S 17600,12500,17600,12900,620,28onymous_,UP,PDIF ++S 29000,12500,29000,14500,200,p2,UP,PTRANS ++S 25400,7300,25400,8300,200,n4b,UP,NTRANS ++S 24900,22800,28100,22800,420,305nymous_,RIGHT,PDIF ++S 10700,39600,35500,39600,2400,106nymous_,RIGHT,ALU1 ++S 24900,24000,28100,24000,420,304nymous_,RIGHT,PDIF ++S 31600,20200,31600,20600,600,227nymous_,UP,POLY ++S 2800,22700,2800,36500,620,265nymous_,UP,NDIF ++S 2200,13600,37800,13600,6800,264nymous_,RIGHT,NWELL ++S 28200,9100,28200,11700,400,263nymous_,UP,ALU1 ++S 12200,7300,12200,9300,200,n17a,UP,NTRANS ++S 8600,10900,8600,14900,200,p18d,UP,PTRANS ++S 24000,27000,24400,27000,600,cpb,RIGHT,POLY ++S 24000,28200,24400,28200,600,cpb,RIGHT,POLY ++S 24800,12700,24800,18500,400,cpb,UP,ALU2 ++S 19400,22600,19800,22600,200,cpb,RIGHT,POLY ++S 19400,26200,19800,26200,200,cpb,RIGHT,POLY ++S 24000,29200,24400,29200,600,cpb,RIGHT,POLY ++S 19400,27400,19800,27400,200,cpb,RIGHT,POLY ++S 19400,31000,19800,31000,200,cpb,RIGHT,POLY ++S 19800,22700,19800,30900,400,cpb,UP,ALU1 ++S 19500,28200,24300,28200,400,cpb,RIGHT,ALU2 ++S 8600,7300,8600,9300,200,n18d,UP,NTRANS ++S 8400,22500,8400,36700,200,n14d,UP,NTRANS ++S 10400,11100,10400,14700,620,107nymous_,UP,PDIF ++S 24900,21600,28100,21600,420,306nymous_,RIGHT,PDIF ++S 15800,23700,15800,32300,400,68onymous_,UP,ALU2 ++S 24900,20400,28100,20400,620,307nymous_,RIGHT,PDIF ++S 35400,21300,35400,39700,400,188nymous_,UP,ALU1 ++S 6800,11100,6800,14700,620,146nymous_,UP,PDIF ++S 35400,21100,35400,36500,620,189nymous_,UP,PDIF ++S 6900,10000,12700,10000,400,147nymous_,RIGHT,ALU1 ++S 6800,7500,6800,9100,620,148nymous_,UP,NDIF ++S 6800,6100,6800,7900,400,149nymous_,UP,ALU1 ++S 34800,20200,34800,20600,600,190nymous_,UP,POLY ++S 17600,8500,17600,9100,620,29onymous_,UP,NDIF ++S 17600,8100,17600,8500,400,30onymous_,UP,ALU1 ++S 17700,8000,22300,8000,400,31onymous_,RIGHT,ALU1 ++S 32600,7300,32600,8300,200,n0,UP,NTRANS ++S 25400,12700,25400,14700,200,p4b,UP,PTRANS ++S 2800,20500,2800,36300,400,266nymous_,UP,ALU1 ++S 31400,19100,31400,28300,400,228nymous_,UP,ALU2 ++S 18200,8300,18200,9300,200,n16a,UP,NTRANS ++S 12200,11100,12200,13100,200,p17a,UP,PTRANS ++S 12200,10000,16400,10000,600,nnt,RIGHT,POLY ++S 10400,11100,10400,13700,400,108nymous_,UP,ALU1 ++S 30700,10000,36100,10000,2400,229nymous_,RIGHT,ALU2 ++S 15600,22700,15600,36500,620,69onymous_,UP,NDIF ++S 10400,8100,10400,8900,400,109nymous_,UP,ALU1 ++S 30700,6000,32300,6000,400,230nymous_,RIGHT,ALU2 ++S 15600,20700,15600,36300,400,70onymous_,UP,ALU1 ++S 10100,7600,27300,7600,1200,110nymous_,RIGHT,ALU2 ++S 34400,13100,34400,14500,620,191nymous_,UP,PDIF ++S 6200,9600,6200,10600,200,150nymous_,UP,POLY ++S 17700,36400,18900,36400,620,32onymous_,RIGHT,NDIF ++S 34400,8100,34400,13900,400,192nymous_,UP,ALU1 ++S 17700,22000,18900,22000,620,44onymous_,RIGHT,NDIF ++S 17700,35200,18900,35200,620,33onymous_,RIGHT,NDIF ++S 6000,22700,6000,36500,620,151nymous_,UP,NDIF ++S 34400,7500,34400,8100,620,193nymous_,UP,NDIF ++S 17400,11800,17400,12000,200,45onymous_,UP,POLY ++S 17700,34000,18900,34000,620,34onymous_,RIGHT,NDIF ++S 3280,6000,28520,6000,600,194nymous_,RIGHT,PTIE ++S 25400,10600,27200,10600,200,cpbb,RIGHT,POLY ++S 27200,8100,27200,12900,400,cpbb,UP,ALU1 ++S 24200,12400,25400,12400,200,308nymous_,RIGHT,POLY ++S 24200,8600,25400,8600,200,309nymous_,RIGHT,POLY ++S 24000,18900,24000,20500,400,310nymous_,UP,ALU2 ++S 24000,33900,24000,36100,400,311nymous_,UP,ALU2 ++S 16800,28200,16800,29800,600,48onymous_,UP,POLY ++S 16900,29200,18700,29200,400,47onymous_,RIGHT,ALU1 ++S 32600,12700,32600,14700,200,p0,UP,PTRANS ++S 33000,20900,33000,36700,200,p14b,UP,PTRANS ++S 23600,13100,23600,15900,400,313nymous_,UP,ALU1 ++S 24000,27100,24000,29100,400,312nymous_,UP,ALU1 ++S 31000,5700,31000,11300,400,231nymous_,UP,ALU2 ++S 15200,11300,15200,12900,620,71onymous_,UP,PDIF ++S 10400,7500,10400,9100,420,111nymous_,UP,NDIF ++S 30800,13100,30800,13900,400,232nymous_,UP,ALU1 ++S 27800,11800,27800,12400,200,268nymous_,UP,POLY ++S 15200,11100,15200,12500,400,72onymous_,UP,ALU1 ++S 700,34000,16100,34000,2400,112nymous_,RIGHT,ALU2 ++S 30800,12700,30800,14300,620,233nymous_,UP,PDIF ++S 15200,8100,15200,8900,400,73onymous_,UP,ALU1 ++S 27800,9800,32600,9800,200,269nymous_,RIGHT,POLY ++S 27800,8600,27800,9800,200,270nymous_,UP,POLY ++S 30800,7500,30800,8100,620,234nymous_,UP,NDIF ++S 700,31000,8900,31000,2400,113nymous_,RIGHT,ALU2 ++S 6000,20700,6000,36300,400,152nymous_,UP,ALU1 ++S 700,28000,15100,28000,2400,114nymous_,RIGHT,ALU2 ++S 17400,11100,17400,11700,400,46onymous_,UP,ALU1 ++S 17700,32800,18900,32800,620,35onymous_,RIGHT,NDIF ++S 34000,18200,34000,38200,10400,195nymous_,UP,NWELL ++S 17700,31600,18900,31600,620,36onymous_,RIGHT,NDIF ++S 33800,19100,33800,38300,2400,196nymous_,UP,ALU2 ++S 17700,30400,18900,30400,620,37onymous_,RIGHT,NDIF ++S 33800,12400,35000,12400,200,197nymous_,RIGHT,POLY ++S 17700,25600,18900,25600,620,41onymous_,RIGHT,NDIF ++S 24200,7300,24200,8300,200,n4a,UP,NTRANS ++S 33800,8600,33800,12400,200,199nymous_,UP,POLY ++S 17700,26800,18900,26800,620,40onymous_,RIGHT,NDIF ++S 16800,25500,16800,28100,400,49onymous_,UP,ALU1 ++S 23700,19200,29300,19200,400,cnb,RIGHT,ALU2 ++S 28600,21000,29000,21000,600,cnb,RIGHT,POLY ++S 28600,22200,29000,22200,600,cnb,RIGHT,POLY ++S 28600,23400,29000,23400,600,cnb,RIGHT,POLY ++S 29000,17900,29000,23700,400,cnb,UP,ALU2 ++S 34400,12700,34400,18500,400,cnb,UP,ALU2 ++S 16800,23800,17200,23800,200,cnb,RIGHT,POLY ++S 16800,25000,17200,25000,200,cnb,RIGHT,POLY ++S 16800,28600,17200,28600,200,cnb,RIGHT,POLY ++S 16800,29800,17200,29800,200,cnb,RIGHT,POLY ++S 23600,7500,23600,8100,620,315nymous_,UP,NDIF ++S 17000,12300,17000,13100,200,p16,UP,PTRANS ++S 23600,12900,23600,14500,620,314nymous_,UP,PDIF ++S 33800,21300,33800,36300,400,200nymous_,UP,ALU1 ++S 19400,8300,19400,9300,200,n16b,UP,NTRANS ++S 15200,7500,15200,9100,620,74onymous_,UP,NDIF ++S 15300,37600,20700,37600,400,75onymous_,RIGHT,ALU1 ++S 30680,6000,37120,6000,600,235nymous_,RIGHT,PTIE ++S 27300,13000,29500,13000,400,271nymous_,RIGHT,ALU1 ++S 30600,36400,31400,36400,200,236nymous_,RIGHT,POLY ++S 27200,13100,27200,13900,400,272nymous_,UP,ALU1 ++S 14600,9600,14600,10800,200,76onymous_,UP,POLY ++S 30600,26700,30600,35300,2400,237nymous_,UP,ALU2 ++S 27200,12700,27200,14300,620,273nymous_,UP,PDIF ++S 30600,21300,30600,35500,400,238nymous_,UP,ALU1 ++S 1280,37600,21120,37600,600,77onymous_,RIGHT,PTIE ++S 5700,11000,10300,11000,400,153nymous_,RIGHT,ALU1 ++S 700,25000,8900,25000,2400,115nymous_,RIGHT,ALU2 ++S 5600,11100,5600,14700,620,154nymous_,UP,PDIF ++S 5700,9000,10300,9000,400,155nymous_,RIGHT,ALU1 ++S 17700,29200,18900,29200,620,38onymous_,RIGHT,NDIF ++S 17700,28000,18900,28000,620,39onymous_,RIGHT,NDIF ++S 5600,7500,5600,9100,420,156nymous_,UP,NDIF ++S 33800,8600,35000,8600,200,198nymous_,RIGHT,POLY ++S 5000,9600,5000,10600,200,157nymous_,UP,POLY ++S 17700,24400,18900,24400,620,42onymous_,RIGHT,NDIF ++S 33800,7300,33800,8300,200,n5a,UP,NTRANS ++S 30200,12000,30200,12200,200,241nymous_,UP,POLY ++S 10000,22200,11600,22200,200,117nymous_,RIGHT,POLY ++S 14000,7500,14000,9100,620,81onymous_,UP,NDIF ++S 24200,12700,24200,14700,200,p4a,UP,PTRANS ++S 14100,10000,21100,10000,400,80onymous_,RIGHT,ALU1 ++S 9700,19000,14900,19000,2400,116nymous_,RIGHT,ALU2 ++S 14000,11300,14000,12900,620,79onymous_,UP,PDIF ++S 24700,21000,28300,21000,200,p7c,RIGHT,PTRANS ++S 14000,12100,14000,15900,400,78onymous_,UP,ALU1 ++S 30400,36400,30400,36600,200,240nymous_,UP,POLY ++S 24700,22200,28300,22200,200,p7b,RIGHT,PTRANS ++S 30600,21100,30600,35900,620,239nymous_,UP,PDIF ++S 27200,7500,27200,8100,620,274nymous_,UP,NDIF ++S 17700,23200,18900,23200,620,43onymous_,RIGHT,NDIF ++S 30200,7300,30200,8300,200,n3,UP,NTRANS ++S 33800,21100,33800,36500,620,201nymous_,UP,PDIF ++S 5000,7300,5000,9300,200,n18a,UP,NTRANS ++S 13400,11100,13400,13100,200,p17b,UP,PTRANS ++S 17500,25000,19100,25000,200,n7c,RIGHT,NTRANS ++S 4100,13000,20300,13000,2400,158nymous_,RIGHT,ALU2 ++S 33400,11700,33400,17300,400,202nymous_,UP,ALU2 ++S 17500,23800,19100,23800,200,n7d,RIGHT,NTRANS ++S 4400,11900,4400,15900,400,159nymous_,UP,ALU1 ++S 13400,7300,13400,9300,200,n17b,UP,NTRANS ++S 5000,10000,11000,10000,600,nt,RIGHT,POLY ++S 17000,12000,17400,12000,200,nt,RIGHT,POLY ++S 13200,22500,13200,36700,200,n15c,UP,NTRANS ++S 16900,24400,17700,24400,400,50onymous_,RIGHT,ALU1 ++S 17500,28600,19100,28600,200,n7b,RIGHT,NTRANS ++S 14000,22900,14000,39700,400,83onymous_,UP,ALU1 ++S 5000,10900,5000,14900,200,p18a,UP,PTRANS ++S 30200,8600,30200,9000,200,242nymous_,UP,POLY ++S 10000,22500,10000,36700,200,n15a,UP,NTRANS ++S 17500,29800,19100,29800,200,n7a,RIGHT,NTRANS ++S 5200,22500,5200,36700,200,n14b,UP,NTRANS ++S 14000,6100,14000,7900,400,82onymous_,UP,ALU1 ++S 30200,9000,31800,9000,200,eb,RIGHT,POLY ++S 30200,12000,31800,12000,200,eb,RIGHT,POLY ++S 33800,12700,33800,14700,200,p5a,UP,PTRANS ++S 26400,18600,26400,38600,8400,277nymous_,UP,NWELL ++S 5600,8100,5600,13700,400,1.nq,UP,ALU1 ++S 30200,12500,30200,14500,200,p3,UP,PTRANS ++S 27000,24900,27000,36700,400,276nymous_,UP,ALU2 ++S 27000,6900,27000,14300,400,275nymous_,UP,ALU2 ++S 24700,23400,28300,23400,200,p7a,RIGHT,PTRANS ++S 24700,24600,28300,24600,200,p10,RIGHT,PTRANS ++S 24700,25800,28300,25800,200,p13,RIGHT,PTRANS ++S 24700,27000,28300,27000,200,p6c,RIGHT,PTRANS ++S 14000,22700,14000,36500,620,84onymous_,UP,NDIF ++S 17500,27400,19100,27400,200,n6b,RIGHT,NTRANS ++S 9800,10900,9800,14900,200,p18e,UP,PTRANS ++S 17500,26200,19100,26200,200,n6c,RIGHT,NTRANS ++S 9800,9600,9800,10600,200,118nymous_,UP,POLY ++S 34600,200,34600,2000,11000,0nonymous_,UP,TALU3 ++S 9800,7300,9800,9300,200,n18e,UP,NTRANS ++S 33200,13100,33200,15900,400,203nymous_,UP,ALU1 ++S 13400,200,13400,2000,27000,1nonymous_,UP,TALU3 ++S 4400,11100,4400,14700,620,160nymous_,UP,PDIF ++S 34600,200,34600,12000,11000,2nonymous_,UP,TALU5 ++S 4400,7500,4400,9100,620,161nymous_,UP,NDIF ++S 4400,6100,4400,8900,400,162nymous_,UP,ALU1 ++S 26000,13700,26000,16100,400,280nymous_,UP,ALU2 ++S 25700,17000,33500,17000,400,279nymous_,RIGHT,ALU2 ++S 17500,31000,19100,31000,200,n6a,RIGHT,NTRANS ++S 2700,20200,15700,20200,400,278nymous_,RIGHT,ALU1 ++S 17500,32200,19100,32200,200,n8d,RIGHT,NTRANS ++S 17500,33400,19100,33400,200,n8c,RIGHT,NTRANS ++S 17500,34600,19100,34600,200,n8b,RIGHT,NTRANS ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 24700,28200,28300,28200,200,p6b,RIGHT,PTRANS ++S 24700,29400,28300,29400,200,p6a,RIGHT,PTRANS ++S 24700,30600,28300,30600,200,p8c,RIGHT,PTRANS ++S 26000,13100,26000,15900,400,281nymous_,UP,ALU1 ++S 30100,20200,35900,20200,400,243nymous_,RIGHT,ALU1 ++S 14000,21800,14000,22200,600,85onymous_,UP,POLY ++S 30000,19900,30000,24900,400,244nymous_,UP,ALU2 ++S 13400,9600,13400,10800,200,86onymous_,UP,POLY ++S 9500,37000,17100,37000,2400,119nymous_,RIGHT,ALU2 ++S 29600,13100,29600,13900,400,245nymous_,UP,ALU1 ++S 33200,12900,33200,14500,620,204nymous_,UP,PDIF ++S 9500,22800,17100,22800,400,120nymous_,RIGHT,ALU2 ++S 33200,7500,33200,8100,620,205nymous_,UP,NDIF ++S 9800,21500,9800,23100,400,121nymous_,UP,ALU2 ++S 13400,200,13400,12000,27000,3nonymous_,UP,TALU5 ++S 33200,6100,33200,7900,400,206nymous_,UP,ALU1 ++S 50,6000,26800,6000,12000,4nonymous_,RIGHT,TALU2 ++S 12800,11300,12800,12900,620,87onymous_,UP,PDIF ++S 4400,22700,4400,38300,2400,163nymous_,UP,ALU2 ++S 29200,6000,39950,6000,12000,5nonymous_,RIGHT,TALU2 ++S 32800,20200,32800,20600,600,207nymous_,UP,POLY ++S 12900,11000,17300,11000,400,88onymous_,RIGHT,ALU1 ++S 4400,22900,4400,37500,400,164nymous_,UP,ALU1 ++S 4400,22700,4400,36500,620,165nymous_,UP,NDIF ++S 17500,35800,19100,35800,200,n8a,RIGHT,NTRANS ++S 14600,7300,14600,9300,200,n17c,UP,NTRANS ++S 6200,7300,6200,9300,200,n18b,UP,NTRANS ++S 27800,7300,27800,8300,200,n2,UP,NTRANS ++S 34600,20900,34600,36700,200,p14c,UP,PTRANS ++S 24700,31800,28300,31800,200,p8b,RIGHT,PTRANS ++S 24700,33000,28300,33000,200,p8a,RIGHT,PTRANS ++S 24700,34200,28300,34200,200,p9,RIGHT,PTRANS ++S 24700,35800,28300,35800,200,p12,RIGHT,PTRANS ++S 26000,12900,26000,14500,620,282nymous_,UP,PDIF ++S 26000,8700,26000,14300,400,283nymous_,UP,ALU2 ++S 26000,7500,26000,8100,620,284nymous_,UP,NDIF ++S 29600,12700,29600,14300,620,246nymous_,UP,PDIF ++S 29600,10300,29600,16300,400,247nymous_,UP,ALU2 ++S 9300,31000,16100,31000,2400,122nymous_,RIGHT,ALU2 ++S 9300,25000,16100,25000,2400,123nymous_,RIGHT,ALU2 ++S 23600,6100,23600,7900,400,316nymous_,UP,ALU1 ++S 9200,12100,9200,15900,400,124nymous_,UP,ALU1 ++S 23080,37600,29920,37600,600,317nymous_,RIGHT,NTIE ++S 50,6000,26800,6000,12000,6nonymous_,RIGHT,TALU4 ++S 12900,9000,15100,9000,400,89onymous_,RIGHT,ALU1 ++S 9200,11100,9200,14700,620,125nymous_,UP,PDIF ++S 29200,6000,39950,6000,12000,7nonymous_,RIGHT,TALU4 ++S 12800,8100,12800,12500,400,90onymous_,UP,ALU1 ++S 32600,11400,32600,12400,200,208nymous_,UP,POLY ++S 0,6000,40000,6000,12000,8nonymous_,RIGHT,TALU6 ++S 4400,21800,4400,22200,600,166nymous_,UP,POLY ++S 32600,8600,32600,9800,200,209nymous_,UP,POLY ++S 3900,7600,7300,7600,1200,167nymous_,RIGHT,ALU2 ++S 19800,34900,19800,37100,400,9nonymous_,UP,ALU2 ++S 38200,19080,38200,37920,600,168nymous_,UP,NTIE ++B 19800,35200,300,300,CONT_VIA,342nymous_ ++B 19800,37600,300,300,CONT_BODY_P,341nymous_ ++B 19800,31000,300,300,CONT_POLY,343nymous_ ++B 19800,28200,300,300,CONT_VIA,344nymous_ ++B 19800,27400,300,300,CONT_POLY,345nymous_ ++B 19800,26200,300,300,CONT_POLY,346nymous_ ++B 19800,22600,300,300,CONT_POLY,347nymous_ ++B 19600,19200,300,300,CONT_BODY_P,348nymous_ ++B 18800,17000,300,300,CONT_VIA2,349nymous_ ++B 18800,16000,300,300,CONT_BODY_N,351nymous_ ++B 18800,17000,300,300,CONT_VIA,350nymous_ ++B 18800,9000,300,300,CONT_DIF_N,352nymous_ ++B 18800,6000,300,300,CONT_VIA2,353nymous_ ++B 24000,29200,300,300,CONT_POLY,1268ymous_ ++B 26000,30000,300,300,CONT_DIF_P,1214ymous_ ++B 32200,34000,300,300,CONT_DIF_P,1000ymous_ ++B 30800,16000,300,300,CONT_BODY_N,1054ymous_ ++B 20800,30400,300,300,CONT_BODY_P,1322ymous_ ++B 16800,35800,300,300,CONT_VIA,408nymous_ ++B 10800,21800,300,300,CONT_POLY,569nymous_ ++B 29000,31800,300,300,CONT_POLY,1108ymous_ ++B 27200,17000,300,300,CONT_VIA2,1162ymous_ ++B 12800,17000,300,300,CONT_VIA,516nymous_ ++B 15600,34000,300,300,CONT_DIF_N,462nymous_ ++B 8600,25000,300,300,CONT_VIA2,623nymous_ ++B 7000,11000,300,300,CONT_VIA2,677nymous_ ++B 4400,25000,300,300,CONT_DIF_N,785nymous_ ++B 37000,29000,300,300,CONT_DIF_P,839nymous_ ++B 35600,14000,300,300,CONT_DIF_P,893nymous_ ++B 33800,34000,300,300,CONT_VIA,947nymous_ ++B 24000,28200,300,300,CONT_VIA,1269ymous_ ++B 26000,28800,300,300,CONT_VIA2,1215ymous_ ++B 32200,33000,300,300,CONT_DIF_P,1001ymous_ ++B 30800,14000,300,300,CONT_DIF_P,1055ymous_ ++B 20800,29400,300,300,CONT_BODY_P,1323ymous_ ++B 15600,33000,300,300,CONT_DIF_N,463nymous_ ++B 16800,35800,300,300,CONT_POLY,409nymous_ ++B 10600,19200,300,300,CONT_BODY_P,570nymous_ ++B 8600,24000,300,300,CONT_VIA2,624nymous_ ++B 29000,30600,300,300,CONT_POLY,1109ymous_ ++B 27200,17000,300,300,CONT_VIA,1163ymous_ ++B 12800,16000,300,300,CONT_BODY_N,517nymous_ ++B 7000,10000,300,300,CONT_VIA2,678nymous_ ++B 5600,37600,300,300,CONT_BODY_P,732nymous_ ++B 4400,24000,300,300,CONT_VIA2,786nymous_ ++B 37000,28000,300,300,CONT_VIA2,840nymous_ ++B 11600,19200,300,300,CONT_BODY_P,540nymous_ ++B 35600,13000,300,300,CONT_DIF_P,894nymous_ ++B 26000,28800,300,300,CONT_VIA,1216ymous_ ++B 33800,34000,300,300,CONT_DIF_P,948nymous_ ++B 32200,32000,300,300,CONT_DIF_P,1002ymous_ ++B 20800,28400,300,300,CONT_BODY_P,1324ymous_ ++B 24000,28200,300,300,CONT_POLY,1270ymous_ ++B 18800,37600,300,300,CONT_BODY_P,356nymous_ ++B 30800,13000,300,300,CONT_DIF_P,1056ymous_ ++B 29000,25800,300,300,CONT_POLY,1110ymous_ ++B 15600,32000,300,300,CONT_DIF_N,464nymous_ ++B 16800,34600,300,300,CONT_VIA2,410nymous_ ++B 10400,17000,300,300,CONT_VIA2,571nymous_ ++B 8000,17000,300,300,CONT_VIA2,625nymous_ ++B 27200,16000,300,300,CONT_BODY_N,1164ymous_ ++B 12800,12600,300,300,CONT_DIF_P,518nymous_ ++B 7000,9000,300,300,CONT_VIA2,679nymous_ ++B 5400,36000,300,300,CONT_VIA2,733nymous_ ++B 4400,24000,300,300,CONT_VIA,787nymous_ ++B 37000,28000,300,300,CONT_VIA,841nymous_ ++B 35600,8000,300,300,CONT_DIF_N,895nymous_ ++B 26000,28800,300,300,CONT_DIF_P,1217ymous_ ++B 33800,33000,300,300,CONT_VIA2,949nymous_ ++B 32200,31000,300,300,CONT_DIF_P,1003ymous_ ++B 20800,27400,300,300,CONT_BODY_P,1325ymous_ ++B 24000,27000,300,300,CONT_POLY,1271ymous_ ++B 16800,34600,300,300,CONT_VIA,411nymous_ ++B 18800,36400,300,300,CONT_VIA,357nymous_ ++B 10400,17000,300,300,CONT_VIA,572nymous_ ++B 30800,10600,300,300,CONT_POLY,1057ymous_ ++B 29000,24600,300,300,CONT_VIA,1111ymous_ ++B 27200,14000,300,300,CONT_DIF_P,1165ymous_ ++B 12800,11600,300,300,CONT_DIF_P,519nymous_ ++B 15600,31000,300,300,CONT_DIF_N,465nymous_ ++B 8000,17000,300,300,CONT_VIA,626nymous_ ++B 6800,17000,300,300,CONT_VIA2,680nymous_ ++B 5400,32000,300,300,CONT_VIA2,734nymous_ ++B 4400,24000,300,300,CONT_DIF_N,788nymous_ ++B 37000,28000,300,300,CONT_DIF_P,842nymous_ ++B 35600,6000,300,300,CONT_VIA2,896nymous_ ++B 33800,33000,300,300,CONT_VIA,950nymous_ ++B 23600,16000,300,300,CONT_BODY_N,1272ymous_ ++B 26000,27600,300,300,CONT_VIA2,1218ymous_ ++B 32200,30000,300,300,CONT_DIF_P,1004ymous_ ++B 30800,8000,300,300,CONT_DIF_N,1058ymous_ ++B 20800,26400,300,300,CONT_BODY_P,1326ymous_ ++B 16800,34600,300,300,CONT_POLY,412nymous_ ++B 18800,36400,300,300,CONT_DIF_N,358nymous_ ++B 10400,16000,300,300,CONT_BODY_N,573nymous_ ++B 29000,24600,300,300,CONT_POLY,1112ymous_ ++B 27200,13000,300,300,CONT_DIF_P,1166ymous_ ++B 12800,9000,300,300,CONT_DIF_N,520nymous_ ++B 15600,30000,300,300,CONT_DIF_N,466nymous_ ++B 8000,16000,300,300,CONT_BODY_N,627nymous_ ++B 6800,17000,300,300,CONT_VIA,681nymous_ ++B 5400,31000,300,300,CONT_VIA2,735nymous_ ++B 4400,23000,300,300,CONT_VIA,789nymous_ ++B 37000,27000,300,300,CONT_VIA2,843nymous_ ++B 35600,6000,300,300,CONT_VIA,897nymous_ ++B 33800,33000,300,300,CONT_DIF_P,951nymous_ ++B 23600,14000,300,300,CONT_DIF_P,1273ymous_ ++B 26000,27600,300,300,CONT_DIF_P,1219ymous_ ++B 18800,35200,300,300,CONT_DIF_N,359nymous_ ++B 32200,29000,300,300,CONT_DIF_P,1005ymous_ ++B 30800,6000,300,300,CONT_BODY_P,1059ymous_ ++B 20800,25400,300,300,CONT_BODY_P,1327ymous_ ++B 15600,29000,300,300,CONT_DIF_N,467nymous_ ++B 16800,33400,300,300,CONT_VIA2,413nymous_ ++B 10400,13800,300,300,CONT_DIF_P,574nymous_ ++B 8000,13800,300,300,CONT_DIF_P,628nymous_ ++B 29000,23400,300,300,CONT_VIA,1113ymous_ ++B 27200,10600,300,300,CONT_POLY,1167ymous_ ++B 12800,8000,300,300,CONT_DIF_N,521nymous_ ++B 6800,16000,300,300,CONT_BODY_N,682nymous_ ++B 5400,30000,300,300,CONT_VIA2,736nymous_ ++B 4400,23000,300,300,CONT_DIF_N,790nymous_ ++B 37000,27000,300,300,CONT_VIA,844nymous_ ++B 35600,6000,300,300,CONT_BODY_P,898nymous_ ++B 26000,26400,300,300,CONT_VIA,1220ymous_ ++B 33800,32000,300,300,CONT_VIA,952nymous_ ++B 32200,28000,300,300,CONT_DIF_P,1006ymous_ ++B 20800,24400,300,300,CONT_BODY_P,1328ymous_ ++B 23600,13000,300,300,CONT_DIF_P,1274ymous_ ++B 18800,34000,300,300,CONT_VIA,360nymous_ ++B 30600,35000,300,300,CONT_VIA2,1060ymous_ ++B 29000,23400,300,300,CONT_POLY,1114ymous_ ++B 15600,28000,300,300,CONT_DIF_N,468nymous_ ++B 16800,33400,300,300,CONT_VIA,414nymous_ ++B 10400,12800,300,300,CONT_DIF_P,575nymous_ ++B 8000,12800,300,300,CONT_DIF_P,629nymous_ ++B 27200,8000,300,300,CONT_DIF_N,1168ymous_ ++B 12800,6000,300,300,CONT_VIA2,522nymous_ ++B 6800,14800,300,300,CONT_DIF_P,683nymous_ ++B 5400,26000,300,300,CONT_VIA2,737nymous_ ++B 4400,21800,300,300,CONT_VIA,791nymous_ ++B 37000,27000,300,300,CONT_DIF_P,845nymous_ ++B 5400,25000,300,300,CONT_VIA2,738nymous_ ++B 35400,35000,300,300,CONT_DIF_P,900nymous_ ++B 33800,31000,300,300,CONT_VIA,954nymous_ ++B 23600,6000,300,300,CONT_VIA2,1276ymous_ ++B 26000,25200,300,300,CONT_DIF_P,1222ymous_ ++B 32200,26000,300,300,CONT_DIF_P,1008ymous_ ++B 30600,35000,300,300,CONT_DIF_P,1062ymous_ ++B 20800,22400,300,300,CONT_BODY_P,1330ymous_ ++B 16800,32200,300,300,CONT_VIA,416nymous_ ++B 18800,32800,300,300,CONT_DIF_N,362nymous_ ++B 10400,10000,300,300,CONT_POLY,577nymous_ ++B 29000,22200,300,300,CONT_POLY,1116ymous_ ++B 27000,19200,300,300,CONT_BODY_N,1170ymous_ ++B 12800,6000,300,300,CONT_BODY_P,524nymous_ ++B 35400,36000,300,300,CONT_DIF_P,899nymous_ ++B 26000,26400,300,300,CONT_DIF_P,1221ymous_ ++B 33800,32000,300,300,CONT_DIF_P,953nymous_ ++B 32200,27000,300,300,CONT_DIF_P,1007ymous_ ++B 20800,23400,300,300,CONT_BODY_P,1329ymous_ ++B 23600,8000,300,300,CONT_DIF_N,1275ymous_ ++B 16800,33400,300,300,CONT_POLY,415nymous_ ++B 18800,34000,300,300,CONT_DIF_N,361nymous_ ++B 10400,11800,300,300,CONT_DIF_P,576nymous_ ++B 30600,35000,300,300,CONT_VIA,1061ymous_ ++B 29000,22200,300,300,CONT_VIA,1115ymous_ ++B 12800,6000,300,300,CONT_VIA,523nymous_ ++B 15600,27000,300,300,CONT_DIF_N,469nymous_ ++B 8000,11800,300,300,CONT_DIF_P,630nymous_ ++B 6800,13800,300,300,CONT_DIF_P,684nymous_ ++B 27200,6000,300,300,CONT_BODY_P,1169ymous_ ++B 4400,21800,300,300,CONT_POLY,792nymous_ ++B 37000,26000,300,300,CONT_VIA,846nymous_ ++B 35400,34000,300,300,CONT_DIF_P,901nymous_ ++B 33800,31000,300,300,CONT_DIF_P,955nymous_ ++B 23600,6000,300,300,CONT_VIA,1277ymous_ ++B 26000,24000,300,300,CONT_VIA,1223ymous_ ++B 18800,31600,300,300,CONT_VIA,363nymous_ ++B 32200,25000,300,300,CONT_DIF_P,1009ymous_ ++B 30600,34000,300,300,CONT_VIA2,1063ymous_ ++B 20800,21400,300,300,CONT_BODY_P,1331ymous_ ++B 15600,25000,300,300,CONT_DIF_N,471nymous_ ++B 16800,32200,300,300,CONT_POLY,417nymous_ ++B 10400,9000,300,300,CONT_DIF_N,578nymous_ ++B 8000,10000,300,300,CONT_POLY,632nymous_ ++B 29000,21000,300,300,CONT_VIA,1117ymous_ ++B 27000,11000,300,300,CONT_VIA2,1171ymous_ ++B 12600,19200,300,300,CONT_BODY_P,525nymous_ ++B 6800,12000,300,300,CONT_DIF_P,686nymous_ ++B 4600,19200,300,300,CONT_BODY_P,740nymous_ ++B 38200,37600,300,300,CONT_BODY_N,794nymous_ ++B 37000,25000,300,300,CONT_VIA,848nymous_ ++B 35400,33000,300,300,CONT_DIF_P,902nymous_ ++B 26000,24000,300,300,CONT_DIF_P,1224ymous_ ++B 33800,30000,300,300,CONT_VIA,956nymous_ ++B 32200,24000,300,300,CONT_DIF_P,1010ymous_ ++B 20800,20400,300,300,CONT_BODY_P,1332ymous_ ++B 23600,6000,300,300,CONT_BODY_P,1278ymous_ ++B 18800,31600,300,300,CONT_DIF_N,364nymous_ ++B 37000,26000,300,300,CONT_DIF_P,847nymous_ ++B 38200,19200,300,300,CONT_BODY_N,793nymous_ ++B 5400,24000,300,300,CONT_VIA2,739nymous_ ++B 6800,12800,300,300,CONT_DIF_P,685nymous_ ++B 8000,11000,300,300,CONT_VIA,631nymous_ ++B 15600,26000,300,300,CONT_DIF_N,470nymous_ ++B 35400,31000,300,300,CONT_DIF_P,904nymous_ ++B 37000,24000,300,300,CONT_VIA,850nymous_ ++B 38200,35400,300,300,CONT_BODY_N,796nymous_ ++B 27000,9000,300,300,CONT_VIA2,1173ymous_ ++B 4600,37600,300,300,CONT_VIA,742nymous_ ++B 6800,8000,300,300,CONT_DIF_N,688nymous_ ++B 8000,9000,300,300,CONT_DIF_N,634nymous_ ++B 15600,23000,300,300,CONT_DIF_N,473nymous_ ++B 12400,35000,300,300,CONT_DIF_N,527nymous_ ++B 28800,9000,300,300,CONT_POLY,1119ymous_ ++B 30600,34000,300,300,CONT_DIF_P,1065ymous_ ++B 10400,6000,300,300,CONT_VIA2,580nymous_ ++B 18800,30400,300,300,CONT_DIF_N,365nymous_ ++B 16800,28200,300,300,CONT_POLY,419nymous_ ++B 23400,17000,300,300,CONT_VIA2,1279ymous_ ++B 20000,16000,300,300,CONT_BODY_N,1333ymous_ ++B 32200,23000,300,300,CONT_DIF_P,1011ymous_ ++B 33800,30000,300,300,CONT_DIF_P,957nymous_ ++B 26000,22800,300,300,CONT_VIA2,1225ymous_ ++B 35400,32000,300,300,CONT_DIF_P,903nymous_ ++B 37000,25000,300,300,CONT_DIF_P,849nymous_ ++B 38200,36400,300,300,CONT_BODY_N,795nymous_ ++B 4600,37600,300,300,CONT_VIA2,741nymous_ ++B 6800,10000,300,300,CONT_POLY,687nymous_ ++B 12400,36000,300,300,CONT_DIF_N,526nymous_ ++B 27000,10000,300,300,CONT_VIA2,1172ymous_ ++B 8000,9000,300,300,CONT_VIA,633nymous_ ++B 10400,8000,300,300,CONT_DIF_N,579nymous_ ++B 16800,29200,300,300,CONT_VIA,418nymous_ ++B 15600,24000,300,300,CONT_DIF_N,472nymous_ ++B 29000,21000,300,300,CONT_POLY,1118ymous_ ++B 30600,34000,300,300,CONT_VIA,1064ymous_ ++B 12400,33000,300,300,CONT_DIF_N,529nymous_ ++B 28400,17000,300,300,CONT_VIA,1121ymous_ ++B 7800,37600,300,300,CONT_VIA2,636nymous_ ++B 10400,6000,300,300,CONT_BODY_P,582nymous_ ++B 16800,24400,300,300,CONT_VIA,421nymous_ ++B 15200,17000,300,300,CONT_VIA,475nymous_ ++B 20000,8600,300,300,CONT_DIF_N,1335ymous_ ++B 30600,33000,300,300,CONT_VIA,1067ymous_ ++B 3200,17000,300,300,CONT_VIA2,1013ymous_ ++B 18800,28000,300,300,CONT_DIF_N,367nymous_ ++B 26000,21600,300,300,CONT_VIA2,1227ymous_ ++B 23000,19200,300,300,CONT_BODY_N,1281ymous_ ++B 33800,29000,300,300,CONT_VIA,959nymous_ ++B 35400,30000,300,300,CONT_DIF_P,905nymous_ ++B 37000,24000,300,300,CONT_DIF_P,851nymous_ ++B 38200,34400,300,300,CONT_BODY_N,797nymous_ ++B 4600,37600,300,300,CONT_BODY_P,743nymous_ ++B 6800,7200,300,300,CONT_DIF_N,689nymous_ ++B 8000,8000,300,300,CONT_DIF_N,635nymous_ ++B 15200,17000,300,300,CONT_VIA2,474nymous_ ++B 12400,34000,300,300,CONT_DIF_N,528nymous_ ++B 27000,37600,300,300,CONT_BODY_N,1174ymous_ ++B 28400,17000,300,300,CONT_VIA2,1120ymous_ ++B 10400,6000,300,300,CONT_VIA,581nymous_ ++B 18800,29200,300,300,CONT_DIF_N,366nymous_ ++B 16800,25400,300,300,CONT_POLY,420nymous_ ++B 20000,11000,300,300,CONT_POLY,1334ymous_ ++B 30600,33000,300,300,CONT_VIA2,1066ymous_ ++B 32200,22000,300,300,CONT_DIF_P,1012ymous_ ++B 26000,22800,300,300,CONT_DIF_P,1226ymous_ ++B 23400,17000,300,300,CONT_VIA,1280ymous_ ++B 33800,29000,300,300,CONT_VIA2,958nymous_ ++B 30600,32000,300,300,CONT_VIA,1069ymous_ ++B 18800,26800,300,300,CONT_DIF_N,369nymous_ ++B 16800,20200,300,300,CONT_VIA,423nymous_ ++B 23000,36400,300,300,CONT_BODY_N,1283ymous_ ++B 20000,6000,300,300,CONT_VIA,1337ymous_ ++B 3200,16000,300,300,CONT_BODY_N,1015ymous_ ++B 33800,28000,300,300,CONT_VIA2,961nymous_ ++B 26000,21600,300,300,CONT_DIF_P,1229ymous_ ++B 35400,28000,300,300,CONT_DIF_P,907nymous_ ++B 37000,23000,300,300,CONT_VIA,853nymous_ ++B 38200,32400,300,300,CONT_BODY_N,799nymous_ ++B 4400,17000,300,300,CONT_VIA,745nymous_ ++B 6800,6000,300,300,CONT_VIA,691nymous_ ++B 12400,32000,300,300,CONT_DIF_N,530nymous_ ++B 27000,36400,300,300,CONT_DIF_P,1176ymous_ ++B 7800,37600,300,300,CONT_VIA,637nymous_ ++B 9600,19200,300,300,CONT_BODY_P,583nymous_ ++B 16800,23400,300,300,CONT_POLY,422nymous_ ++B 15200,16000,300,300,CONT_BODY_N,476nymous_ ++B 28400,16000,300,300,CONT_BODY_N,1122ymous_ ++B 30600,33000,300,300,CONT_DIF_P,1068ymous_ ++B 18800,26800,300,300,CONT_VIA,368nymous_ ++B 23000,37600,300,300,CONT_BODY_N,1282ymous_ ++B 20000,6000,300,300,CONT_VIA2,1336ymous_ ++B 3200,17000,300,300,CONT_VIA,1014ymous_ ++B 33800,29000,300,300,CONT_DIF_P,960nymous_ ++B 26000,21600,300,300,CONT_VIA,1228ymous_ ++B 35400,29000,300,300,CONT_DIF_P,906nymous_ ++B 37000,23000,300,300,CONT_VIA2,852nymous_ ++B 38200,33400,300,300,CONT_BODY_N,798nymous_ ++B 4400,17000,300,300,CONT_VIA2,744nymous_ ++B 6800,6000,300,300,CONT_VIA2,690nymous_ ++B 3200,14000,300,300,CONT_VIA2,1017ymous_ ++B 33800,28000,300,300,CONT_DIF_P,963nymous_ ++B 35400,26000,300,300,CONT_DIF_P,909nymous_ ++B 37000,22000,300,300,CONT_VIA2,855nymous_ ++B 38200,30400,300,300,CONT_BODY_N,801nymous_ ++B 4400,14800,300,300,CONT_DIF_P,747nymous_ ++B 6800,37600,300,300,CONT_VIA2,693nymous_ ++B 7600,19200,300,300,CONT_BODY_P,639nymous_ ++B 15200,11600,300,300,CONT_DIF_P,478nymous_ ++B 12400,30000,300,300,CONT_DIF_N,532nymous_ ++B 27000,33600,300,300,CONT_DIF_P,1178ymous_ ++B 28400,8000,300,300,CONT_DIF_N,1124ymous_ ++B 9200,17000,300,300,CONT_VIA2,585nymous_ ++B 18800,25600,300,300,CONT_DIF_N,370nymous_ ++B 16600,19200,300,300,CONT_BODY_P,424nymous_ ++B 20000,6000,300,300,CONT_BODY_P,1338ymous_ ++B 30600,32000,300,300,CONT_DIF_P,1070ymous_ ++B 3200,15000,300,300,CONT_BODY_N,1016ymous_ ++B 26000,20400,300,300,CONT_DIF_P,1230ymous_ ++B 23000,35400,300,300,CONT_BODY_N,1284ymous_ ++B 33800,28000,300,300,CONT_VIA,962nymous_ ++B 35400,27000,300,300,CONT_DIF_P,908nymous_ ++B 37000,23000,300,300,CONT_DIF_P,854nymous_ ++B 38200,31400,300,300,CONT_BODY_N,800nymous_ ++B 27000,35000,300,300,CONT_DIF_P,1177ymous_ ++B 4400,16000,300,300,CONT_BODY_N,746nymous_ ++B 6800,6000,300,300,CONT_BODY_P,692nymous_ ++B 7800,37600,300,300,CONT_BODY_P,638nymous_ ++B 15200,12600,300,300,CONT_DIF_P,477nymous_ ++B 12400,31000,300,300,CONT_DIF_N,531nymous_ ++B 28400,14000,300,300,CONT_DIF_P,1123ymous_ ++B 9600,37600,300,300,CONT_BODY_P,584nymous_ ++B 15200,9000,300,300,CONT_DIF_N,480nymous_ ++B 18400,12800,200,200,CONT_TURN1,1340ymous_ ++B 28200,11800,300,300,CONT_POLY,1126ymous_ ++B 30600,31000,300,300,CONT_DIF_P,1072ymous_ ++B 18800,23200,300,300,CONT_DIF_N,372nymous_ ++B 23000,33400,300,300,CONT_BODY_N,1286ymous_ ++B 3200,14000,300,300,CONT_BODY_N,1018ymous_ ++B 33800,27000,300,300,CONT_VIA2,964nymous_ ++B 25000,37600,300,300,CONT_BODY_N,1232ymous_ ++B 35400,25000,300,300,CONT_DIF_P,910nymous_ ++B 37000,22000,300,300,CONT_VIA,856nymous_ ++B 38200,29400,300,300,CONT_BODY_N,802nymous_ ++B 4400,13800,300,300,CONT_DIF_P,748nymous_ ++B 6800,37600,300,300,CONT_VIA,694nymous_ ++B 12400,29000,300,300,CONT_DIF_N,533nymous_ ++B 27000,32400,300,300,CONT_DIF_P,1179ymous_ ++B 28400,6000,300,300,CONT_BODY_P,1125ymous_ ++B 7600,36000,300,300,CONT_VIA2,640nymous_ ++B 9200,17000,300,300,CONT_VIA,586nymous_ ++B 16400,17000,300,300,CONT_VIA2,425nymous_ ++B 15200,10000,300,300,CONT_POLY,479nymous_ ++B 19800,32800,200,200,CONT_TURN1,1339ymous_ ++B 30600,31000,300,300,CONT_VIA,1071ymous_ ++B 18800,24400,300,300,CONT_DIF_N,371nymous_ ++B 25000,19200,300,300,CONT_BODY_N,1231ymous_ ++B 23000,34400,300,300,CONT_BODY_N,1285ymous_ ++B 16400,17000,300,300,CONT_VIA,426nymous_ ++B 9200,16000,300,300,CONT_BODY_N,587nymous_ ++B 7600,36000,300,300,CONT_VIA,641nymous_ ++B 12400,28000,300,300,CONT_DIF_N,534nymous_ ++B 6800,37600,300,300,CONT_BODY_P,695nymous_ ++B 4400,12800,300,300,CONT_DIF_P,749nymous_ ++B 38200,28400,300,300,CONT_BODY_N,803nymous_ ++B 37000,22000,300,300,CONT_DIF_P,857nymous_ ++B 35400,24000,300,300,CONT_DIF_P,911nymous_ ++B 25000,36400,300,300,CONT_DIF_P,1233ymous_ ++B 33800,27000,300,300,CONT_VIA,965nymous_ ++B 3200,13000,300,300,CONT_VIA2,1019ymous_ ++B 23000,32400,300,300,CONT_BODY_N,1287ymous_ ++B 16400,16000,300,300,CONT_BODY_N,427nymous_ ++B 18800,22200,300,300,CONT_VIA,373nymous_ ++B 9200,14800,300,300,CONT_DIF_P,588nymous_ ++B 30600,30000,300,300,CONT_VIA,1073ymous_ ++B 28200,10600,300,300,CONT_VIA,1127ymous_ ++B 17800,22000,200,200,CONT_TURN1,1341ymous_ ++B 12400,27000,300,300,CONT_DIF_N,535nymous_ ++B 15200,8000,300,300,CONT_DIF_N,481nymous_ ++B 7600,36000,300,300,CONT_DIF_N,642nymous_ ++B 6600,19200,300,300,CONT_BODY_P,696nymous_ ++B 4400,11800,300,300,CONT_DIF_P,750nymous_ ++B 38200,27400,300,300,CONT_BODY_N,804nymous_ ++B 36800,17000,300,300,CONT_VIA2,858nymous_ ++B 35400,23000,300,300,CONT_DIF_P,912nymous_ ++B 33800,27000,300,300,CONT_DIF_P,966nymous_ ++B 23000,31400,300,300,CONT_BODY_N,1288ymous_ ++B 25000,35000,300,300,CONT_DIF_P,1234ymous_ ++B 3200,13000,300,300,CONT_BODY_N,1020ymous_ ++B 30600,30000,300,300,CONT_DIF_P,1074ymous_ ++B 16400,12800,300,300,CONT_DIF_P,428nymous_ ++B 18800,22000,300,300,CONT_DIF_N,374nymous_ ++B 9200,13800,300,300,CONT_DIF_P,589nymous_ ++B 2800,36000,300,300,CONT_DIF_N,1128ymous_ ++B 17600,8000,200,200,CONT_TURN1,1342ymous_ ++B 12400,26000,300,300,CONT_DIF_N,536nymous_ ++B 15200,6000,300,300,CONT_VIA2,482nymous_ ++B 7600,35000,300,300,CONT_VIA,643nymous_ ++B 6600,36000,300,300,CONT_VIA2,697nymous_ ++B 4400,9000,300,300,CONT_DIF_N,751nymous_ ++B 38200,26400,300,300,CONT_BODY_N,805nymous_ ++B 36800,17000,300,300,CONT_VIA,859nymous_ ++B 35400,22000,300,300,CONT_DIF_P,913nymous_ ++B 33800,26000,300,300,CONT_VIA,967nymous_ ++B 23000,30400,300,300,CONT_BODY_N,1289ymous_ ++B 25000,33600,300,300,CONT_DIF_P,1235ymous_ ++B 18600,19200,300,300,CONT_BODY_P,375nymous_ ++B 3200,12000,300,300,CONT_VIA2,1021ymous_ ++B 30600,29000,300,300,CONT_VIA2,1075ymous_ ++B 17400,11000,200,200,CONT_TURN1,1343ymous_ ++B 15200,6000,300,300,CONT_VIA,483nymous_ ++B 16400,12000,300,300,CONT_DIF_P,429nymous_ ++B 9200,12800,300,300,CONT_DIF_P,590nymous_ ++B 7600,35000,300,300,CONT_DIF_N,644nymous_ ++B 2800,35000,300,300,CONT_DIF_N,1129ymous_ ++B 12400,25000,300,300,CONT_DIF_N,537nymous_ ++B 6600,32000,300,300,CONT_VIA2,698nymous_ ++B 4400,8000,300,300,CONT_DIF_N,752nymous_ ++B 38200,25400,300,300,CONT_BODY_N,806nymous_ ++B 36800,16000,300,300,CONT_VIA2,860nymous_ ++B 35000,19200,300,300,CONT_BODY_N,914nymous_ ++B 25000,32400,300,300,CONT_VIA,1236ymous_ ++B 33800,26000,300,300,CONT_DIF_P,968nymous_ ++B 3200,12000,300,300,CONT_BODY_N,1022ymous_ ++B 23000,29400,300,300,CONT_BODY_N,1290ymous_ ++B 17800,37600,300,300,CONT_BODY_P,376nymous_ ++B 10400,11000,200,200,CONT_TURN1,1344ymous_ ++B 27000,28800,300,300,CONT_DIF_P,1182ymous_ ++B 30600,29000,300,300,CONT_VIA,1076ymous_ ++B 2800,34000,300,300,CONT_DIF_N,1130ymous_ ++B 15200,6000,300,300,CONT_BODY_P,484nymous_ ++B 16400,10000,300,300,CONT_POLY,430nymous_ ++B 9200,12000,300,300,CONT_DIF_P,591nymous_ ++B 7600,34000,300,300,CONT_VIA,645nymous_ ++B 12400,24000,300,300,CONT_DIF_N,538nymous_ ++B 6600,31000,300,300,CONT_VIA2,699nymous_ ++B 4400,6000,300,300,CONT_VIA2,753nymous_ ++B 38200,24400,300,300,CONT_BODY_N,807nymous_ ++B 36800,16000,300,300,CONT_BODY_N,861nymous_ ++B 34800,35000,300,300,CONT_VIA2,915nymous_ ++B 25000,32400,300,300,CONT_DIF_P,1237ymous_ ++B 33800,25000,300,300,CONT_VIA,969nymous_ ++B 3200,9000,300,300,CONT_BODY_P,1023ymous_ ++B 23000,28400,300,300,CONT_BODY_N,1291ymous_ ++B 16400,9000,300,300,CONT_DIF_N,431nymous_ ++B 17800,36400,300,300,CONT_DIF_N,377nymous_ ++B 9200,10000,300,300,CONT_POLY,592nymous_ ++B 30600,29000,300,300,CONT_DIF_P,1077ymous_ ++B 2800,33000,300,300,CONT_DIF_N,1131ymous_ ++B 5000,19000,8300,2300,CONT_VIA2,1345ymous_ ++B 12400,23000,300,300,CONT_DIF_N,539nymous_ ++B 14600,19200,300,300,CONT_BODY_P,485nymous_ ++B 7600,34000,300,300,CONT_DIF_N,646nymous_ ++B 6600,30000,300,300,CONT_VIA2,700nymous_ ++B 4400,6000,300,300,CONT_VIA,754nymous_ ++B 38200,23400,300,300,CONT_BODY_N,808nymous_ ++B 36800,15000,300,300,CONT_VIA2,862nymous_ ++B 34800,34000,300,300,CONT_VIA2,916nymous_ ++B 27000,27600,300,300,CONT_DIF_P,1183ymous_ ++B 27000,26400,300,300,CONT_DIF_P,1184ymous_ ++B 27000,31200,300,300,CONT_DIF_P,1180ymous_ ++B 27000,30000,300,300,CONT_DIF_P,1181ymous_ ++B 33800,25000,300,300,CONT_DIF_P,970nymous_ ++B 23000,27400,300,300,CONT_BODY_N,1292ymous_ ++B 25000,31200,300,300,CONT_DIF_P,1238ymous_ ++B 3200,8000,300,300,CONT_VIA2,1024ymous_ ++B 30600,28000,300,300,CONT_VIA2,1078ymous_ ++B 16400,8000,300,300,CONT_DIF_N,432nymous_ ++B 17800,35200,300,300,CONT_DIF_N,378nymous_ ++B 9200,8000,300,300,CONT_VIA2,593nymous_ ++B 2800,32000,300,300,CONT_DIF_N,1132ymous_ ++B 28200,9000,200,200,CONT_TURN1,1346ymous_ ++B 14000,17000,300,300,CONT_VIA2,486nymous_ ++B 7600,33000,300,300,CONT_VIA,647nymous_ ++B 6600,26000,300,300,CONT_VIA2,701nymous_ ++B 4400,6000,300,300,CONT_BODY_P,755nymous_ ++B 38200,22400,300,300,CONT_BODY_N,809nymous_ ++B 36800,15000,300,300,CONT_BODY_N,863nymous_ ++B 27000,25200,300,300,CONT_VIA,1185ymous_ ++B 34800,33000,300,300,CONT_VIA2,917nymous_ ++B 33800,24000,300,300,CONT_VIA,971nymous_ ++B 23000,26400,300,300,CONT_BODY_N,1293ymous_ ++B 25000,30000,300,300,CONT_VIA,1239ymous_ ++B 17800,34000,300,300,CONT_DIF_N,379nymous_ ++B 3200,8000,300,300,CONT_BODY_P,1025ymous_ ++B 30600,28000,300,300,CONT_VIA,1079ymous_ ++B 22400,8000,200,200,CONT_TURN1,1347ymous_ ++B 14000,17000,300,300,CONT_VIA,487nymous_ ++B 16400,6000,300,300,CONT_VIA2,433nymous_ ++B 9200,8000,300,300,CONT_DIF_N,594nymous_ ++B 7600,33000,300,300,CONT_DIF_N,648nymous_ ++B 2800,31000,300,300,CONT_DIF_N,1133ymous_ ++B 6600,25000,300,300,CONT_VIA2,702nymous_ ++B 4400,36000,300,300,CONT_VIA2,756nymous_ ++B 38200,21400,300,300,CONT_BODY_N,810nymous_ ++B 36800,14000,300,300,CONT_BODY_N,864nymous_ ++B 34800,29000,300,300,CONT_VIA2,918nymous_ ++B 25000,30000,300,300,CONT_DIF_P,1240ymous_ ++B 27000,25200,300,300,CONT_DIF_P,1186ymous_ ++B 33800,24000,300,300,CONT_DIF_P,972nymous_ ++B 3200,7000,300,300,CONT_VIA2,1026ymous_ ++B 23000,25400,300,300,CONT_BODY_N,1294ymous_ ++B 17800,32800,300,300,CONT_DIF_N,380nymous_ ++B 30600,28000,300,300,CONT_DIF_P,1080ymous_ ++B 2800,30000,300,300,CONT_DIF_N,1134ymous_ ++B 21200,10000,200,200,CONT_TURN1,1348ymous_ ++B 14000,16000,300,300,CONT_BODY_N,488nymous_ ++B 16400,6000,300,300,CONT_VIA,434nymous_ ++B 9200,7200,300,300,CONT_DIF_N,595nymous_ ++B 7600,32000,300,300,CONT_VIA2,649nymous_ ++B 6600,24000,300,300,CONT_VIA2,703nymous_ ++B 4400,36000,300,300,CONT_VIA,757nymous_ ++B 38200,20400,300,300,CONT_BODY_N,811nymous_ ++B 36800,13000,300,300,CONT_BODY_N,865nymous_ ++B 34800,28000,300,300,CONT_VIA2,919nymous_ ++B 25000,28800,300,300,CONT_DIF_P,1241ymous_ ++B 27000,24000,300,300,CONT_DIF_P,1187ymous_ ++B 33800,23000,300,300,CONT_VIA2,973nymous_ ++B 3200,7000,300,300,CONT_BODY_P,1027ymous_ ++B 23000,24400,300,300,CONT_BODY_N,1295ymous_ ++B 16400,6000,300,300,CONT_BODY_P,435nymous_ ++B 17800,31600,300,300,CONT_VIA2,381nymous_ ++B 30600,27000,300,300,CONT_VIA2,1081ymous_ ++B 11600,17000,300,300,CONT_VIA,542nymous_ ++B 9200,7000,300,300,CONT_VIA2,596nymous_ ++B 2800,29000,300,300,CONT_DIF_N,1135ymous_ ++B 14000,12800,300,300,CONT_DIF_P,489nymous_ ++B 7600,32000,300,300,CONT_VIA,650nymous_ ++B 6000,36000,300,300,CONT_DIF_N,704nymous_ ++B 4400,36000,300,300,CONT_DIF_N,758nymous_ ++B 38000,35000,300,300,CONT_VIA2,812nymous_ ++B 36800,12000,300,300,CONT_BODY_N,866nymous_ ++B 27000,22800,300,300,CONT_DIF_P,1188ymous_ ++B 34800,27000,300,300,CONT_VIA2,920nymous_ ++B 33800,23000,300,300,CONT_VIA,974nymous_ ++B 23000,23400,300,300,CONT_BODY_N,1296ymous_ ++B 25000,27600,300,300,CONT_VIA,1242ymous_ ++B 3200,6000,300,300,CONT_VIA2,1028ymous_ ++B 30600,27000,300,300,CONT_VIA,1082ymous_ ++B 1600,19200,300,300,CONT_BODY_P,436nymous_ ++B 17800,31600,300,300,CONT_DIF_N,382nymous_ ++B 9200,6000,300,300,CONT_VIA2,597nymous_ ++B 2800,28000,300,300,CONT_DIF_N,1136ymous_ ++B 14000,12000,300,300,CONT_DIF_P,490nymous_ ++B 7600,32000,300,300,CONT_DIF_N,651nymous_ ++B 6000,35000,300,300,CONT_DIF_N,705nymous_ ++B 4400,35000,300,300,CONT_VIA,759nymous_ ++B 38000,34000,300,300,CONT_VIA2,813nymous_ ++B 36800,11000,300,300,CONT_VIA2,867nymous_ ++B 27000,21600,300,300,CONT_DIF_P,1189ymous_ ++B 34800,23000,300,300,CONT_VIA2,921nymous_ ++B 33800,23000,300,300,CONT_DIF_P,975nymous_ ++B 3200,6000,300,300,CONT_VIA,1029ymous_ ++B 11600,16000,300,300,CONT_BODY_N,543nymous_ ++B 23000,22400,300,300,CONT_BODY_N,1297ymous_ ++B 25000,27600,300,300,CONT_DIF_P,1243ymous_ ++B 17800,30400,300,300,CONT_VIA2,383nymous_ ++B 11600,14800,300,300,CONT_DIF_P,544nymous_ ++B 30600,27000,300,300,CONT_DIF_P,1083ymous_ ++B 14000,10000,300,300,CONT_POLY,491nymous_ ++B 1600,37600,300,300,CONT_BODY_P,437nymous_ ++B 9200,6000,300,300,CONT_VIA,598nymous_ ++B 7600,31000,300,300,CONT_VIA2,652nymous_ ++B 2800,27000,300,300,CONT_DIF_N,1137ymous_ ++B 6000,34000,300,300,CONT_DIF_N,706nymous_ ++B 4400,35000,300,300,CONT_DIF_N,760nymous_ ++B 38000,33000,300,300,CONT_VIA2,814nymous_ ++B 36800,10000,300,300,CONT_VIA2,868nymous_ ++B 34800,22000,300,300,CONT_VIA2,922nymous_ ++B 25000,26400,300,300,CONT_DIF_P,1244ymous_ ++B 27000,20400,300,300,CONT_DIF_P,1190ymous_ ++B 33800,22000,300,300,CONT_VIA2,976nymous_ ++B 3200,6000,300,300,CONT_BODY_P,1030ymous_ ++B 23000,21400,300,300,CONT_BODY_N,1298ymous_ ++B 17800,30400,300,300,CONT_VIA,384nymous_ ++B 11600,13800,300,300,CONT_DIF_P,545nymous_ ++B 30600,26000,300,300,CONT_DIF_P,1084ymous_ ++B 2800,26000,300,300,CONT_DIF_N,1138ymous_ ++B 14000,8000,300,300,CONT_DIF_N,492nymous_ ++B 1600,36400,300,300,CONT_BODY_P,438nymous_ ++B 9200,6000,300,300,CONT_BODY_P,599nymous_ ++B 7600,31000,300,300,CONT_VIA,653nymous_ ++B 6000,33000,300,300,CONT_DIF_N,707nymous_ ++B 4400,34000,300,300,CONT_VIA,761nymous_ ++B 38000,29000,300,300,CONT_VIA2,815nymous_ ++B 36800,9000,300,300,CONT_VIA2,869nymous_ ++B 34800,20200,300,300,CONT_POLY,923nymous_ ++B 25000,25200,300,300,CONT_DIF_P,1245ymous_ ++B 2600,19200,300,300,CONT_BODY_P,1191ymous_ ++B 33800,22000,300,300,CONT_VIA,977nymous_ ++B 32000,19200,300,300,CONT_BODY_N,1031ymous_ ++B 23000,20400,300,300,CONT_BODY_N,1299ymous_ ++B 1600,35400,300,300,CONT_BODY_P,439nymous_ ++B 17800,30400,300,300,CONT_DIF_N,385nymous_ ++B 11600,12800,300,300,CONT_DIF_P,546nymous_ ++B 9200,36000,300,300,CONT_DIF_N,600nymous_ ++B 30600,25000,300,300,CONT_DIF_P,1085ymous_ ++B 2800,25000,300,300,CONT_DIF_N,1139ymous_ ++B 14000,7200,300,300,CONT_DIF_N,493nymous_ ++B 7600,31000,300,300,CONT_DIF_N,654nymous_ ++B 6000,32000,300,300,CONT_DIF_N,708nymous_ ++B 4400,34000,300,300,CONT_DIF_N,762nymous_ ++B 38000,28000,300,300,CONT_VIA2,816nymous_ ++B 36800,9000,300,300,CONT_BODY_P,870nymous_ ++B 2600,37600,300,300,CONT_BODY_P,1192ymous_ ++B 34400,16000,300,300,CONT_BODY_N,924nymous_ ++B 33800,22000,300,300,CONT_DIF_P,978nymous_ ++B 22400,17000,300,300,CONT_VIA2,1300ymous_ ++B 25000,24000,300,300,CONT_DIF_P,1246ymous_ ++B 32000,17000,300,300,CONT_VIA2,1032ymous_ ++B 30600,24000,300,300,CONT_DIF_P,1086ymous_ ++B 1600,34400,300,300,CONT_BODY_P,440nymous_ ++B 17800,29200,300,300,CONT_DIF_N,386nymous_ ++B 11600,11800,300,300,CONT_DIF_P,547nymous_ ++B 9200,35000,300,300,CONT_DIF_N,601nymous_ ++B 2800,24000,300,300,CONT_DIF_N,1140ymous_ ++B 14000,6000,300,300,CONT_VIA2,494nymous_ ++B 7600,30000,300,300,CONT_VIA2,655nymous_ ++B 6000,31000,300,300,CONT_DIF_N,709nymous_ ++B 4400,33000,300,300,CONT_VIA,763nymous_ ++B 38000,27000,300,300,CONT_VIA2,817nymous_ ++B 36800,8000,300,300,CONT_BODY_P,871nymous_ ++B 26000,19200,300,300,CONT_BODY_N,1193ymous_ ++B 34400,14000,300,300,CONT_VIA,925nymous_ ++B 33200,17000,300,300,CONT_VIA2,979nymous_ ++B 22400,17000,300,300,CONT_VIA,1301ymous_ ++B 25000,22800,300,300,CONT_VIA,1247ymous_ ++B 17800,28000,300,300,CONT_VIA,387nymous_ ++B 11600,9000,300,300,CONT_DIF_N,548nymous_ ++B 32000,17000,300,300,CONT_VIA,1033ymous_ ++B 30600,23000,300,300,CONT_DIF_P,1087ymous_ ++B 14000,6000,300,300,CONT_VIA,495nymous_ ++B 1600,33400,300,300,CONT_BODY_P,441nymous_ ++B 9200,34000,300,300,CONT_DIF_N,602nymous_ ++B 7600,30000,300,300,CONT_VIA,656nymous_ ++B 2800,23000,300,300,CONT_DIF_N,1141ymous_ ++B 6000,30000,300,300,CONT_DIF_N,710nymous_ ++B 4400,33000,300,300,CONT_DIF_N,764nymous_ ++B 37200,37600,300,300,CONT_BODY_N,818nymous_ ++B 36800,7000,300,300,CONT_BODY_P,872nymous_ ++B 34400,14000,300,300,CONT_DIF_P,926nymous_ ++B 25000,22800,300,300,CONT_DIF_P,1248ymous_ ++B 26000,17000,300,300,CONT_VIA2,1194ymous_ ++B 33200,17000,300,300,CONT_VIA,980nymous_ ++B 32000,16000,300,300,CONT_BODY_N,1034ymous_ ++B 22400,16000,300,300,CONT_BODY_N,1302ymous_ ++B 17800,28000,300,300,CONT_DIF_N,388nymous_ ++B 11600,8000,300,300,CONT_DIF_N,549nymous_ ++B 30600,22000,300,300,CONT_DIF_P,1088ymous_ ++B 28000,19200,300,300,CONT_BODY_N,1142ymous_ ++B 14000,6000,300,300,CONT_BODY_P,496nymous_ ++B 1600,32400,300,300,CONT_BODY_P,442nymous_ ++B 9200,33000,300,300,CONT_DIF_N,603nymous_ ++B 7600,30000,300,300,CONT_DIF_N,657nymous_ ++B 6000,29000,300,300,CONT_DIF_N,711nymous_ ++B 4400,32000,300,300,CONT_VIA2,765nymous_ ++B 37000,19200,300,300,CONT_BODY_N,819nymous_ ++B 36800,6000,300,300,CONT_VIA2,873nymous_ ++B 34400,13000,300,300,CONT_VIA,927nymous_ ++B 25000,21600,300,300,CONT_DIF_P,1249ymous_ ++B 26000,17000,300,300,CONT_VIA,1195ymous_ ++B 33200,16000,300,300,CONT_BODY_N,981nymous_ ++B 32000,13000,300,300,CONT_DIF_P,1035ymous_ ++B 22400,8600,300,300,CONT_DIF_N,1303ymous_ ++B 1600,31400,300,300,CONT_BODY_P,443nymous_ ++B 17800,26800,300,300,CONT_DIF_N,389nymous_ ++B 11600,6000,300,300,CONT_VIA2,550nymous_ ++B 9200,32000,300,300,CONT_DIF_N,604nymous_ ++B 30400,36600,300,300,CONT_VIA2,1089ymous_ ++B 28000,35000,300,300,CONT_DIF_P,1143ymous_ ++B 14000,36000,300,300,CONT_DIF_N,497nymous_ ++B 7600,29000,300,300,CONT_VIA,658nymous_ ++B 6000,28000,300,300,CONT_DIF_N,712nymous_ ++B 4400,32000,300,300,CONT_VIA,766nymous_ ++B 37000,36000,300,300,CONT_VIA,820nymous_ ++B 36800,6000,300,300,CONT_VIA,874nymous_ ++B 26000,16000,300,300,CONT_BODY_N,1196ymous_ ++B 34400,13000,300,300,CONT_DIF_P,928nymous_ ++B 33200,14000,300,300,CONT_DIF_P,982nymous_ ++B 22400,6000,300,300,CONT_VIA2,1304ymous_ ++B 25000,20400,300,300,CONT_VIA,1250ymous_ ++B 32000,8000,300,300,CONT_DIF_N,1036ymous_ ++B 30400,36600,300,300,CONT_VIA,1090ymous_ ++B 1600,30400,300,300,CONT_BODY_P,444nymous_ ++B 17800,25600,300,300,CONT_VIA2,390nymous_ ++B 11600,6000,300,300,CONT_VIA,551nymous_ ++B 9200,31000,300,300,CONT_DIF_N,605nymous_ ++B 28000,33600,300,300,CONT_DIF_P,1144ymous_ ++B 14000,35000,300,300,CONT_DIF_N,498nymous_ ++B 7600,29000,300,300,CONT_DIF_N,659nymous_ ++B 6000,27000,300,300,CONT_DIF_N,713nymous_ ++B 4400,32000,300,300,CONT_DIF_N,767nymous_ ++B 37000,36000,300,300,CONT_DIF_P,821nymous_ ++B 36800,6000,300,300,CONT_BODY_P,875nymous_ ++B 26000,14000,300,300,CONT_VIA2,1197ymous_ ++B 34400,8000,300,300,CONT_DIF_N,929nymous_ ++B 33200,13000,300,300,CONT_DIF_P,983nymous_ ++B 22400,6000,300,300,CONT_VIA,1305ymous_ ++B 25000,20400,300,300,CONT_DIF_P,1251ymous_ ++B 17800,25600,300,300,CONT_VIA,391nymous_ ++B 11600,6000,300,300,CONT_BODY_P,552nymous_ ++B 32000,6000,300,300,CONT_VIA2,1037ymous_ ++B 30400,36600,300,300,CONT_POLY,1091ymous_ ++B 14000,34000,300,300,CONT_DIF_N,499nymous_ ++B 28000,32400,300,300,CONT_DIF_P,1145ymous_ ++B 1600,29400,300,300,CONT_BODY_P,445nymous_ ++B 9200,30000,300,300,CONT_DIF_N,606nymous_ ++B 7600,28000,300,300,CONT_VIA,660nymous_ ++B 6000,26000,300,300,CONT_DIF_N,714nymous_ ++B 4400,31000,300,300,CONT_VIA2,768nymous_ ++B 37000,35000,300,300,CONT_VIA2,822nymous_ ++B 3600,19200,300,300,CONT_BODY_P,876nymous_ ++B 34400,6000,300,300,CONT_VIA2,930nymous_ ++B 24800,16000,300,300,CONT_BODY_N,1252ymous_ ++B 26000,14000,300,300,CONT_DIF_P,1198ymous_ ++B 33200,8000,300,300,CONT_DIF_N,984nymous_ ++B 32000,6000,300,300,CONT_VIA,1038ymous_ ++B 22400,6000,300,300,CONT_BODY_P,1306ymous_ ++B 17800,25600,300,300,CONT_DIF_N,392nymous_ ++B 10800,36000,300,300,CONT_DIF_N,553nymous_ ++B 30000,19200,300,300,CONT_BODY_N,1092ymous_ ++B 28000,31200,300,300,CONT_VIA,1146ymous_ ++B 14000,33000,300,300,CONT_DIF_N,500nymous_ ++B 1600,28400,300,300,CONT_BODY_P,446nymous_ ++B 9200,29000,300,300,CONT_DIF_N,607nymous_ ++B 7600,28000,300,300,CONT_DIF_N,661nymous_ ++B 6000,25000,300,300,CONT_DIF_N,715nymous_ ++B 4400,31000,300,300,CONT_VIA,769nymous_ ++B 37000,35000,300,300,CONT_VIA,823nymous_ ++B 3600,37600,300,300,CONT_VIA2,877nymous_ ++B 34400,6000,300,300,CONT_VIA,931nymous_ ++B 24800,14000,300,300,CONT_VIA,1253ymous_ ++B 26000,13000,300,300,CONT_VIA2,1199ymous_ ++B 33200,6000,300,300,CONT_VIA2,985nymous_ ++B 32000,6000,300,300,CONT_BODY_P,1039ymous_ ++B 30000,20200,300,300,CONT_VIA,1093ymous_ ++B 22000,19200,300,300,CONT_VIA,1307ymous_ ++B 1600,27400,300,300,CONT_BODY_P,447nymous_ ++B 17800,24400,300,300,CONT_VIA2,393nymous_ ++B 10800,35000,300,300,CONT_DIF_N,554nymous_ ++B 9200,28000,300,300,CONT_DIF_N,608nymous_ ++B 28000,31200,300,300,CONT_DIF_P,1147ymous_ ++B 14000,32000,300,300,CONT_DIF_N,501nymous_ ++B 7600,27000,300,300,CONT_VIA,662nymous_ ++B 6000,24000,300,300,CONT_DIF_N,716nymous_ ++B 4400,31000,300,300,CONT_DIF_N,770nymous_ ++B 37000,35000,300,300,CONT_DIF_P,824nymous_ ++B 3600,37600,300,300,CONT_VIA,878nymous_ ++B 26000,13000,300,300,CONT_DIF_P,1200ymous_ ++B 34400,6000,300,300,CONT_BODY_P,932nymous_ ++B 33200,6000,300,300,CONT_VIA,986nymous_ ++B 22000,22200,300,300,CONT_VIA,1308ymous_ ++B 24800,14000,300,300,CONT_DIF_P,1254ymous_ ++B 31800,12200,300,300,CONT_POLY,1040ymous_ ++B 29600,17000,300,300,CONT_VIA2,1094ymous_ ++B 1600,26400,300,300,CONT_BODY_P,448nymous_ ++B 17800,24400,300,300,CONT_DIF_N,394nymous_ ++B 10800,34000,300,300,CONT_DIF_N,555nymous_ ++B 9200,27000,300,300,CONT_DIF_N,609nymous_ ++B 28000,30000,300,300,CONT_DIF_P,1148ymous_ ++B 14000,31000,300,300,CONT_DIF_N,502nymous_ ++B 7600,27000,300,300,CONT_DIF_N,663nymous_ ++B 6000,23000,300,300,CONT_DIF_N,717nymous_ ++B 4400,30000,300,300,CONT_VIA2,771nymous_ ++B 37000,34000,300,300,CONT_VIA2,825nymous_ ++B 3600,37600,300,300,CONT_BODY_P,879nymous_ ++B 26000,12000,300,300,CONT_VIA2,1201ymous_ ++B 3400,36000,300,300,CONT_VIA2,933nymous_ ++B 33200,6000,300,300,CONT_BODY_P,987nymous_ ++B 21200,16000,300,300,CONT_BODY_N,1309ymous_ ++B 24800,13000,300,300,CONT_VIA,1255ymous_ ++B 17800,23200,300,300,CONT_VIA,395nymous_ ++B 10800,33000,300,300,CONT_DIF_N,556nymous_ ++B 31800,9000,300,300,CONT_POLY,1041ymous_ ++B 29600,17000,300,300,CONT_VIA,1095ymous_ ++B 14000,30000,300,300,CONT_DIF_N,503nymous_ ++B 1600,25400,300,300,CONT_BODY_P,449nymous_ ++B 9200,26000,300,300,CONT_DIF_N,610nymous_ ++B 7600,26000,300,300,CONT_VIA2,664nymous_ ++B 28000,28800,300,300,CONT_DIF_P,1149ymous_ ++B 5600,19200,300,300,CONT_BODY_P,718nymous_ ++B 4400,30000,300,300,CONT_VIA,772nymous_ ++B 37000,34000,300,300,CONT_VIA,826nymous_ ++B 36000,19200,300,300,CONT_BODY_N,880nymous_ ++B 3400,32000,300,300,CONT_VIA2,934nymous_ ++B 24800,13000,300,300,CONT_DIF_P,1256ymous_ ++B 26000,8000,300,300,CONT_DIF_N,1202ymous_ ++B 33000,19200,300,300,CONT_BODY_N,988nymous_ ++B 31600,35000,300,300,CONT_VIA2,1042ymous_ ++B 21200,9000,300,300,CONT_DIF_N,1310ymous_ ++B 17800,23200,300,300,CONT_DIF_N,396nymous_ ++B 10800,32000,300,300,CONT_DIF_N,557nymous_ ++B 29600,16000,300,300,CONT_VIA,1096ymous_ ++B 28000,27600,300,300,CONT_DIF_P,1150ymous_ ++B 14000,29000,300,300,CONT_DIF_N,504nymous_ ++B 1600,24400,300,300,CONT_BODY_P,450nymous_ ++B 9200,25000,300,300,CONT_DIF_N,611nymous_ ++B 7600,26000,300,300,CONT_VIA,665nymous_ ++B 5600,17000,300,300,CONT_VIA2,719nymous_ ++B 4400,30000,300,300,CONT_DIF_N,773nymous_ ++B 37000,34000,300,300,CONT_DIF_P,827nymous_ ++B 36000,35000,300,300,CONT_VIA2,881nymous_ ++B 3400,31000,300,300,CONT_VIA2,935nymous_ ++B 24800,8000,300,300,CONT_DIF_N,1257ymous_ ++B 26000,6000,300,300,CONT_VIA2,1203ymous_ ++B 32800,35000,300,300,CONT_VIA2,989nymous_ ++B 31600,34000,300,300,CONT_VIA2,1043ymous_ ++B 21200,6000,300,300,CONT_VIA2,1311ymous_ ++B 1600,23400,300,300,CONT_BODY_P,451nymous_ ++B 17600,19200,300,300,CONT_BODY_P,397nymous_ ++B 10800,31000,300,300,CONT_DIF_N,558nymous_ ++B 9200,24000,300,300,CONT_DIF_N,612nymous_ ++B 29600,16000,300,300,CONT_BODY_N,1097ymous_ ++B 28000,26400,300,300,CONT_DIF_P,1151ymous_ ++B 14000,28000,300,300,CONT_DIF_N,505nymous_ ++B 7600,26000,300,300,CONT_DIF_N,666nymous_ ++B 5600,17000,300,300,CONT_VIA,720nymous_ ++B 4400,29000,300,300,CONT_VIA,774nymous_ ++B 37000,33000,300,300,CONT_VIA2,828nymous_ ++B 36000,34000,300,300,CONT_VIA2,882nymous_ ++B 26000,6000,300,300,CONT_VIA,1204ymous_ ++B 3400,30000,300,300,CONT_VIA2,936nymous_ ++B 32800,34000,300,300,CONT_VIA2,990nymous_ ++B 21200,6000,300,300,CONT_VIA,1312ymous_ ++B 24800,6000,300,300,CONT_VIA2,1258ymous_ ++B 31600,33000,300,300,CONT_VIA2,1044ymous_ ++B 29600,14000,300,300,CONT_DIF_P,1098ymous_ ++B 3400,25000,300,300,CONT_VIA2,938nymous_ ++B 36000,29000,300,300,CONT_VIA2,884nymous_ ++B 37000,33000,300,300,CONT_DIF_P,830nymous_ ++B 4400,28000,300,300,CONT_VIA,776nymous_ ++B 5600,13800,300,300,CONT_DIF_P,722nymous_ ++B 28000,24000,300,300,CONT_DIF_P,1153ymous_ ++B 7600,25000,300,300,CONT_VIA,668nymous_ ++B 8800,37600,300,300,CONT_VIA2,614nymous_ ++B 1600,21400,300,300,CONT_BODY_P,453nymous_ ++B 14000,26000,300,300,CONT_DIF_N,507nymous_ ++B 29600,13000,300,300,CONT_DIF_P,1099ymous_ ++B 31600,29000,300,300,CONT_VIA2,1045ymous_ ++B 10800,29000,300,300,CONT_DIF_N,560nymous_ ++B 17600,17000,300,300,CONT_VIA,399nymous_ ++B 24800,6000,300,300,CONT_VIA,1259ymous_ ++B 21200,6000,300,300,CONT_BODY_P,1313ymous_ ++B 32800,33000,300,300,CONT_VIA2,991nymous_ ++B 3400,26000,300,300,CONT_VIA2,937nymous_ ++B 26000,6000,300,300,CONT_BODY_P,1205ymous_ ++B 1600,22400,300,300,CONT_BODY_P,452nymous_ ++B 17600,17000,300,300,CONT_VIA2,398nymous_ ++B 10800,30000,300,300,CONT_DIF_N,559nymous_ ++B 9200,23000,300,300,CONT_DIF_N,613nymous_ ++B 28000,25200,300,300,CONT_DIF_P,1152ymous_ ++B 14000,27000,300,300,CONT_DIF_N,506nymous_ ++B 7600,25000,300,300,CONT_VIA2,667nymous_ ++B 5600,16000,300,300,CONT_BODY_N,721nymous_ ++B 4400,29000,300,300,CONT_DIF_N,775nymous_ ++B 37000,33000,300,300,CONT_VIA,829nymous_ ++B 36000,33000,300,300,CONT_VIA2,883nymous_ ++B 28000,21600,300,300,CONT_DIF_P,1155ymous_ ++B 29600,10600,300,300,CONT_POLY,1101ymous_ ++B 8800,37600,300,300,CONT_BODY_P,616nymous_ ++B 10800,27000,300,300,CONT_DIF_N,562nymous_ ++B 17600,12800,300,300,CONT_DIF_P,401nymous_ ++B 15800,37600,300,300,CONT_BODY_P,455nymous_ ++B 20800,37600,300,300,CONT_BODY_P,1315ymous_ ++B 31600,27000,300,300,CONT_VIA2,1047ymous_ ++B 32800,28000,300,300,CONT_VIA2,993nymous_ ++B 26000,36400,300,300,CONT_DIF_P,1207ymous_ ++B 24000,19200,300,300,CONT_BODY_N,1261ymous_ ++B 3400,24000,300,300,CONT_VIA2,939nymous_ ++B 36000,28000,300,300,CONT_VIA2,885nymous_ ++B 37000,32000,300,300,CONT_VIA,831nymous_ ++B 4400,28000,300,300,CONT_DIF_N,777nymous_ ++B 5600,12800,300,300,CONT_DIF_P,723nymous_ ++B 7600,25000,300,300,CONT_DIF_N,669nymous_ ++B 8800,37600,300,300,CONT_VIA,615nymous_ ++B 1600,20400,300,300,CONT_BODY_P,454nymous_ ++B 14000,25000,300,300,CONT_DIF_N,508nymous_ ++B 28000,22800,300,300,CONT_DIF_P,1154ymous_ ++B 29600,10600,300,300,CONT_VIA,1100ymous_ ++B 10800,28000,300,300,CONT_DIF_N,561nymous_ ++B 17600,16000,300,300,CONT_BODY_N,400nymous_ ++B 20800,19200,300,300,CONT_BODY_P,1314ymous_ ++B 31600,28000,300,300,CONT_VIA2,1046ymous_ ++B 32800,29000,300,300,CONT_VIA2,992nymous_ ++B 26000,37600,300,300,CONT_BODY_N,1206ymous_ ++B 24800,6000,300,300,CONT_BODY_P,1260ymous_ ++B 5600,37600,300,300,CONT_VIA,731nymous_ ++B 31600,22000,300,300,CONT_VIA2,1049ymous_ ++B 24000,35800,300,300,CONT_VIA,1263ymous_ ++B 20800,35400,300,300,CONT_BODY_P,1317ymous_ ++B 32800,23000,300,300,CONT_VIA2,995nymous_ ++B 33800,36000,300,300,CONT_VIA,941nymous_ ++B 26000,33600,300,300,CONT_VIA,1209ymous_ ++B 36000,23000,300,300,CONT_VIA2,887nymous_ ++B 37000,31000,300,300,CONT_VIA,833nymous_ ++B 4400,27000,300,300,CONT_DIF_N,779nymous_ ++B 5600,9000,300,300,CONT_DIF_N,725nymous_ ++B 7600,24000,300,300,CONT_VIA,671nymous_ ++B 14000,23000,300,300,CONT_DIF_N,510nymous_ ++B 28000,20400,300,300,CONT_DIF_P,1156ymous_ ++B 8600,19200,300,300,CONT_BODY_P,617nymous_ ++B 10800,26000,300,300,CONT_DIF_N,563nymous_ ++B 17600,8600,300,300,CONT_DIF_N,402nymous_ ++B 15800,29000,300,300,CONT_VIA2,456nymous_ ++B 29600,7000,300,300,CONT_DIF_N,1102ymous_ ++B 31600,23000,300,300,CONT_VIA2,1048ymous_ ++B 24000,37600,300,300,CONT_BODY_N,1262ymous_ ++B 20800,36400,300,300,CONT_BODY_P,1316ymous_ ++B 32800,27000,300,300,CONT_VIA2,994nymous_ ++B 34000,19200,300,300,CONT_BODY_N,940nymous_ ++B 26000,35000,300,300,CONT_DIF_P,1208ymous_ ++B 36000,27000,300,300,CONT_VIA2,886nymous_ ++B 37000,32000,300,300,CONT_DIF_P,832nymous_ ++B 4400,27000,300,300,CONT_VIA,778nymous_ ++B 5600,11800,300,300,CONT_DIF_P,724nymous_ ++B 7600,24000,300,300,CONT_VIA2,670nymous_ ++B 14000,24000,300,300,CONT_DIF_N,509nymous_ ++B 27000,36400,300,300,CONT_VIA,1175ymous_ ++B 37000,30000,300,300,CONT_VIA,835nymous_ ++B 4400,26000,300,300,CONT_VIA,781nymous_ ++B 5600,6000,300,300,CONT_VIA2,727nymous_ ++B 7600,23000,300,300,CONT_VIA,673nymous_ ++B 8600,32000,300,300,CONT_VIA2,619nymous_ ++B 15800,27000,300,300,CONT_VIA2,458nymous_ ++B 14000,21800,300,300,CONT_VIA,512nymous_ ++B 28000,0,300,300,CONT_VIA3,1158ymous_ ++B 29600,34000,300,300,CONT_VIA2,1104ymous_ ++B 10800,24000,300,300,CONT_DIF_N,565nymous_ ++B 17600,6000,300,300,CONT_VIA,404nymous_ ++B 20800,34400,300,300,CONT_BODY_P,1318ymous_ ++B 31600,20200,300,300,CONT_POLY,1050ymous_ ++B 32800,22000,300,300,CONT_VIA2,996nymous_ ++B 26000,33600,300,300,CONT_DIF_P,1210ymous_ ++B 24000,35800,300,300,CONT_POLY,1264ymous_ ++B 33800,36000,300,300,CONT_DIF_P,942nymous_ ++B 36000,22000,300,300,CONT_VIA2,888nymous_ ++B 37000,31000,300,300,CONT_DIF_P,834nymous_ ++B 4400,26000,300,300,CONT_VIA2,780nymous_ ++B 5600,8000,300,300,CONT_DIF_N,726nymous_ ++B 28000,0,300,300,CONT_VIA4,1157ymous_ ++B 7600,24000,300,300,CONT_DIF_N,672nymous_ ++B 8600,36000,300,300,CONT_VIA2,618nymous_ ++B 15800,28000,300,300,CONT_VIA2,457nymous_ ++B 14000,21800,300,300,CONT_VIA2,511nymous_ ++B 29600,35000,300,300,CONT_VIA2,1103ymous_ ++B 10800,25000,300,300,CONT_DIF_N,564nymous_ ++B 17600,6000,300,300,CONT_VIA2,403nymous_ ++B 11600,17000,300,300,CONT_VIA2,541nymous_ ++B 18800,6000,300,300,CONT_VIA,354nymous_ ++B 18800,6000,300,300,CONT_BODY_P,355nymous_ ++B 13600,19200,300,300,CONT_BODY_P,514nymous_ ++B 27800,37600,300,300,CONT_BODY_N,1160ymous_ ++B 8600,30000,300,300,CONT_VIA2,621nymous_ ++B 10800,21800,300,300,CONT_VIA2,567nymous_ ++B 17400,11800,300,300,CONT_POLY,406nymous_ ++B 15600,36000,300,300,CONT_DIF_N,460nymous_ ++B 29000,19200,300,300,CONT_BODY_N,1106ymous_ ++B 30800,17000,300,300,CONT_VIA2,1052ymous_ ++B 24000,34200,300,300,CONT_VIA,1266ymous_ ++B 20800,32400,300,300,CONT_BODY_P,1320ymous_ ++B 32200,36000,300,300,CONT_DIF_P,998nymous_ ++B 33800,35000,300,300,CONT_VIA,944nymous_ ++B 26000,31200,300,300,CONT_VIA,1212ymous_ ++B 35600,17000,300,300,CONT_VIA2,890nymous_ ++B 37000,30000,300,300,CONT_DIF_P,836nymous_ ++B 4400,26000,300,300,CONT_DIF_N,782nymous_ ++B 5600,6000,300,300,CONT_VIA,728nymous_ ++B 7600,23000,300,300,CONT_DIF_N,674nymous_ ++B 14000,21800,300,300,CONT_POLY,513nymous_ ++B 28000,0,300,300,CONT_VIA2,1159ymous_ ++B 29600,33000,300,300,CONT_VIA2,1105ymous_ ++B 8600,31000,300,300,CONT_VIA2,620nymous_ ++B 10800,23000,300,300,CONT_DIF_N,566nymous_ ++B 17600,6000,300,300,CONT_BODY_P,405nymous_ ++B 15600,19200,300,300,CONT_BODY_P,459nymous_ ++B 20800,33400,300,300,CONT_BODY_P,1319ymous_ ++B 31000,19200,300,300,CONT_BODY_N,1051ymous_ ++B 32800,20200,300,300,CONT_POLY,997nymous_ ++B 26000,32400,300,300,CONT_DIF_P,1211ymous_ ++B 24000,34200,300,300,CONT_VIA2,1265ymous_ ++B 33800,35000,300,300,CONT_VIA2,943nymous_ ++B 36000,20200,300,300,CONT_POLY,889nymous_ ++B 33800,35000,300,300,CONT_DIF_P,945nymous_ ++B 26000,31200,300,300,CONT_DIF_P,1213ymous_ ++B 35600,17000,300,300,CONT_VIA,891nymous_ ++B 37000,29000,300,300,CONT_VIA2,837nymous_ ++B 4400,25000,300,300,CONT_VIA2,783nymous_ ++B 5600,6000,300,300,CONT_BODY_P,729nymous_ ++B 7600,21800,300,300,CONT_VIA,675nymous_ ++B 32200,35000,300,300,CONT_DIF_P,999nymous_ ++B 20800,31400,300,300,CONT_BODY_P,1321ymous_ ++B 24000,34200,300,300,CONT_POLY,1267ymous_ ++B 16800,37600,300,300,CONT_BODY_P,407nymous_ ++B 10800,21800,300,300,CONT_VIA,568nymous_ ++B 30800,17000,300,300,CONT_VIA,1053ymous_ ++B 29000,33000,300,300,CONT_POLY,1107ymous_ ++B 12800,17000,300,300,CONT_VIA2,515nymous_ ++B 15600,35000,300,300,CONT_DIF_N,461nymous_ ++B 8600,26000,300,300,CONT_VIA2,622nymous_ ++B 7600,21800,300,300,CONT_POLY,676nymous_ ++B 27800,36400,300,300,CONT_DIF_P,1161ymous_ ++B 5600,37600,300,300,CONT_VIA2,730nymous_ ++B 4400,25000,300,300,CONT_VIA,784nymous_ ++B 37000,29000,300,300,CONT_VIA,838nymous_ ++B 35600,16000,300,300,CONT_BODY_N,892nymous_ ++B 33800,34000,300,300,CONT_VIA2,946nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/po_mpx.vbe b/alliance/src/cells/src/mpxlib/po_mpx.vbe +new file mode 100644 +index 0000000..91d5df8 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/po_mpx.vbe +@@ -0,0 +1,29 @@ ++ENTITY po_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_i : NATURAL := 191; ++ CONSTANT tpll_i : NATURAL := 2176; ++ CONSTANT rdown_i : NATURAL := 15; ++ CONSTANT tphh_i : NATURAL := 2032; ++ CONSTANT rup_i : NATURAL := 16 ++ ); ++ PORT ( ++ i : in BIT; ++ pad : out BIT; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END po_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF po_mpx IS ++ ++BEGIN ++ pad <= i; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on po_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pot_mpx.ap b/alliance/src/cells/src/mpxlib/pot_mpx.ap +new file mode 100644 +index 0000000..161daf8 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pot_mpx.ap +@@ -0,0 +1,1543 @@ ++V ALLIANCE : 6 ++H pot_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 28800,9000,29000,9000,200,i,RIGHT,POLY ++S 28000,-300,28000,10900,400,i,UP,ALU2 ++S 28000,0,28000,0,400,i,RIGHT,CALU5 ++S 28000,0,28000,0,400,i,RIGHT,CALU4 ++S 27800,11800,28200,11800,200,i,RIGHT,POLY ++S 30000,-100,30000,10900,400,b,UP,ALU2 ++S 30000,0,30000,0,400,b,RIGHT,CALU5 ++S 30000,0,30000,0,400,b,RIGHT,CALU4 ++S 29600,9800,29600,11400,200,b,UP,POLY ++S 29000,35100,29000,39700,400,pad,UP,ALU1 ++S 29000,25900,29000,34900,400,pad,UP,ALU1 ++S 28600,33000,29000,33000,600,pad,RIGHT,POLY ++S 28600,31800,29000,31800,600,pad,RIGHT,POLY ++S 28600,30600,29000,30600,600,pad,RIGHT,POLY ++S 28600,25800,29000,25800,600,pad,RIGHT,POLY ++S 20000,48100,20000,71900,24400,pad,UP,CALU1 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 16800,33400,17200,33400,200,vdde,RIGHT,POLY ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 3600,22200,5200,22200,200,vdde,RIGHT,POLY ++S 25100,28800,27900,28800,400,vdde,RIGHT,ALU1 ++S 25100,26400,27900,26400,400,vdde,RIGHT,ALU1 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 6800,22200,8400,22200,200,vdde,RIGHT,POLY ++S 25100,21600,27900,21600,400,vdde,RIGHT,ALU1 ++S 24000,35800,24400,35800,600,vdde,RIGHT,POLY ++S 24000,34200,24400,34200,600,vdde,RIGHT,POLY ++S 16800,32200,17200,32200,200,vdde,RIGHT,POLY ++S 16800,35800,17200,35800,200,vdde,RIGHT,POLY ++S 16800,34600,17200,34600,200,vdde,RIGHT,POLY ++S 16800,29900,16800,38300,400,vdde,UP,ALU2 ++S 10500,21800,14300,21800,400,vdde,RIGHT,ALU2 ++S 25100,24000,27900,24000,400,vdde,RIGHT,ALU1 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 3100,16000,36900,16000,2400,vddi,RIGHT,ALU1 ++S 20000,9600,20000,11000,200,vddi,UP,POLY ++S 17800,22900,17800,31900,400,vsse,UP,ALU2 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 7600,22900,7600,37500,400,vsse,UP,ALU1 ++S 4400,22900,4400,37500,400,vsse,UP,ALU1 ++S 30400,36400,30400,36600,200,vsse,UP,POLY ++S 20800,22900,20800,37100,400,vsse,UP,ALU1 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 3100,6000,36900,6000,2400,vssi,RIGHT,ALU1 ++S 17500,22600,19100,22600,200,n6d,RIGHT,NTRANS ++S 28500,8000,30700,8000,400,93onymous_,RIGHT,ALU1 ++S 28400,7500,28400,8100,620,92onymous_,UP,NDIF ++S 7300,21800,10100,21800,400,211nymous_,RIGHT,ALU2 ++S 31700,6000,37100,6000,400,127nymous_,RIGHT,ALU2 ++S 28300,9000,28700,9000,400,91onymous_,RIGHT,ALU1 ++S 10800,22900,10800,39700,400,249nymous_,UP,ALU1 ++S 35600,200,35600,12000,9000,11onymous_,UP,TALU5 ++S 17700,8000,22300,8000,400,321nymous_,RIGHT,ALU1 ++S 15800,9600,15800,10800,200,285nymous_,UP,POLY ++S 24900,30000,28100,30000,420,52onymous_,RIGHT,PDIF ++S 24900,31200,28100,31200,420,53onymous_,RIGHT,PDIF ++S 0,6000,40000,6000,12000,12onymous_,RIGHT,TALU6 ++S 35600,13100,35600,15900,400,169nymous_,UP,ALU1 ++S 10800,22700,10800,36500,620,248nymous_,UP,NDIF ++S 1700,37600,9500,37600,400,286nymous_,RIGHT,ALU1 ++S 20000,40100,20000,59900,4400,13onymous_,UP,ALU1 ++S 31800,12000,31800,12200,200,126nymous_,UP,POLY ++S 7600,21800,7600,22200,600,210nymous_,UP,POLY ++S 17700,36400,18900,36400,620,320nymous_,RIGHT,NDIF ++S 24900,28800,28100,28800,420,51onymous_,RIGHT,PDIF ++S 29000,200,29000,12000,0,10onymous_,UP,TALU5 ++S 17700,35200,18900,35200,620,319nymous_,RIGHT,NDIF ++S 17700,34000,18900,34000,620,318nymous_,RIGHT,NDIF ++S 35000,12700,35000,14700,200,p5b,UP,PTRANS ++S 27800,12500,27800,14500,200,p1,UP,PTRANS ++S 35000,7300,35000,8300,200,n5b,UP,NTRANS ++S 6800,22500,6800,36700,200,n14c,UP,NTRANS ++S 30800,10600,33800,10600,200,cnbb,RIGHT,POLY ++S 30800,8100,30800,12900,400,cnbb,UP,ALU1 ++S 6200,10900,6200,14900,200,p18b,UP,PTRANS ++S 14800,22500,14800,36700,200,n15d,UP,NTRANS ++S 14600,11100,14600,13100,200,p17c,UP,PTRANS ++S 31400,35300,31400,36100,200,p11,UP,PTRANS ++S 31400,20900,31400,34300,200,p14a,UP,PTRANS ++S 20800,19300,20800,37500,400,17onymous_,UP,ALU1 ++S 8000,7500,8000,9100,420,215nymous_,UP,NDIF ++S 20000,6300,20000,8500,400,14onymous_,UP,ALU1 ++S 24900,33600,28100,33600,420,55onymous_,RIGHT,PDIF ++S 1700,19200,20700,19200,400,287nymous_,RIGHT,ALU1 ++S 17600,12500,17600,12900,620,324nymous_,UP,PDIF ++S 35300,17000,37100,17000,400,170nymous_,RIGHT,ALU2 ++S 24900,32400,28100,32400,420,54onymous_,RIGHT,PDIF ++S 17600,8500,17600,9100,620,323nymous_,UP,NDIF ++S 17600,8100,17600,8500,400,322nymous_,UP,ALU1 ++S 36000,20200,36000,20600,600,171nymous_,UP,POLY ++S 17700,12800,18300,12800,400,325nymous_,RIGHT,ALU1 ++S 1480,19200,20920,19200,600,288nymous_,RIGHT,PTIE ++S 24900,35000,28100,35000,820,56onymous_,RIGHT,PDIF ++S 32000,7500,32000,8100,620,128nymous_,UP,NDIF ++S 1600,19300,1600,37500,400,289nymous_,UP,ALU1 ++S 7600,22700,7600,36500,620,212nymous_,UP,NDIF ++S 24900,36400,28100,36400,620,57onymous_,RIGHT,PDIF ++S 11000,9600,11000,10600,200,250nymous_,UP,POLY ++S 3600,22200,5200,22200,200,172nymous_,RIGHT,POLY ++S 31700,7600,37100,7600,1200,129nymous_,RIGHT,ALU2 ++S 20000,11100,20000,15900,400,15onymous_,UP,ALU1 ++S 7600,22900,7600,37500,400,213nymous_,UP,ALU1 ++S 1600,19080,1600,37720,600,290nymous_,UP,PTIE ++S 28400,12700,28400,14300,620,94onymous_,UP,PDIF ++S 24800,7500,24800,8100,620,58onymous_,UP,NDIF ++S 3480,16000,36920,16000,600,173nymous_,RIGHT,NTIE ++S 32000,8100,32000,12900,400,130nymous_,UP,ALU1 ++S 20000,12700,20000,17300,400,16onymous_,UP,ALU2 ++S 7600,22700,7600,38300,2400,214nymous_,UP,ALU2 ++S 25400,8600,25400,12400,200,62onymous_,UP,POLY ++S 17900,25600,18700,25600,400,329nymous_,RIGHT,ALU1 ++S 16400,6100,16400,8900,400,292nymous_,UP,ALU1 ++S 32000,12900,32000,14500,620,131nymous_,UP,PDIF ++S 24800,8100,24800,13900,400,59onymous_,UP,ALU1 ++S 28400,14100,28400,15900,400,95onymous_,UP,ALU1 ++S 17900,24400,18700,24400,400,328nymous_,RIGHT,ALU1 ++S 16400,29900,16400,32300,400,291nymous_,UP,ALU2 ++S 17900,23200,18700,23200,400,327nymous_,RIGHT,ALU1 ++S 2900,20600,15500,20600,400,pad2,RIGHT,ALU1 ++S 2700,20600,15700,20600,400,pad2,RIGHT,ALU1 ++S 20000,8500,20000,9100,620,pad2,UP,NDIF ++S 17900,22000,18700,22000,400,326nymous_,RIGHT,ALU1 ++S 7400,7300,7400,9300,200,n18c,UP,NTRANS ++S 7400,10900,7400,14900,200,p18c,UP,PTRANS ++S 11600,6100,11600,8900,400,251nymous_,UP,ALU1 ++S 28700,24600,30300,24600,400,96onymous_,RIGHT,ALU2 ++S 24800,13100,24800,14500,620,60onymous_,UP,PDIF ++S 3200,5880,3200,8720,600,132nymous_,UP,PTIE ++S 36700,37600,38100,37600,400,174nymous_,RIGHT,ALU1 ++S 16400,7500,16400,9100,620,293nymous_,UP,NDIF ++S 8000,8100,8000,8900,400,216nymous_,UP,ALU1 ++S 11600,7500,11600,9100,420,252nymous_,UP,NDIF ++S 3200,6100,3200,9100,400,133nymous_,UP,ALU1 ++S 36800,5880,36800,8720,600,175nymous_,UP,PTIE ++S 25100,35000,29100,35000,400,61onymous_,RIGHT,ALU1 ++S 29000,8600,29000,9000,200,97onymous_,UP,POLY ++S 36800,6900,36800,17300,400,177nymous_,UP,ALU2 ++S 21200,8500,21200,9100,420,19onymous_,UP,NDIF ++S 36800,6100,36800,9100,400,176nymous_,UP,ALU1 ++S 20800,19080,20800,37720,600,18onymous_,UP,PTIE ++S 11600,11100,11600,14700,620,253nymous_,UP,PDIF ++S 8000,11100,8000,13700,400,217nymous_,UP,ALU1 ++S 16400,11300,16400,12900,620,294nymous_,UP,PDIF ++S 26000,30900,26000,37100,400,65onymous_,UP,ALU2 ++S 26000,23700,26000,29100,400,64onymous_,UP,ALU2 ++S 26000,21300,26000,24300,400,63onymous_,UP,ALU2 ++S 29000,18300,29000,19500,400,101nymous_,UP,ALU2 ++S 3600,22500,3600,36700,200,n14a,UP,NTRANS ++S 15800,11100,15800,13100,200,p17d,UP,PTRANS ++S 20600,8300,20600,9300,200,n16c,UP,NTRANS ++S 17900,26800,18700,26800,400,330nymous_,RIGHT,ALU1 ++S 17900,28000,18700,28000,400,331nymous_,RIGHT,ALU1 ++S 3200,5700,3200,16100,400,134nymous_,UP,ALU2 ++S 16400,12100,16400,15900,400,295nymous_,UP,ALU1 ++S 8000,11100,8000,14700,620,218nymous_,UP,PDIF ++S 17900,30400,18700,30400,400,332nymous_,RIGHT,ALU1 ++S 11600,11900,11600,15900,400,254nymous_,UP,ALU1 ++S 2900,6000,7100,6000,400,135nymous_,RIGHT,ALU2 ++S 17900,31600,18700,31600,400,333nymous_,RIGHT,ALU1 ++S 900,37000,8900,37000,2400,255nymous_,RIGHT,ALU2 ++S 21200,9100,21200,9900,400,20onymous_,UP,ALU1 ++S 2900,10000,6300,10000,2400,136nymous_,RIGHT,ALU2 ++S 36800,11100,36800,15900,400,178nymous_,UP,ALU1 ++S 900,19000,9300,19000,2400,256nymous_,RIGHT,ALU2 ++S 3200,11100,3200,15900,400,137nymous_,UP,ALU1 ++S 36800,10880,36800,16120,600,179nymous_,UP,NTIE ++S 8600,9600,8600,10600,200,219nymous_,UP,POLY ++S 22000,21900,22000,28500,400,21onymous_,UP,ALU2 ++S 29000,11400,29000,12200,200,98onymous_,UP,POLY ++S 37000,21100,37000,36500,620,180nymous_,UP,PDIF ++S 12200,9600,12200,10800,200,257nymous_,UP,POLY ++S 29000,11400,32600,11400,200,99onymous_,RIGHT,POLY ++S 9200,20700,9200,36300,400,220nymous_,UP,ALU1 ++S 28700,18200,34700,18200,400,100nymous_,RIGHT,ALU2 ++S 15800,7300,15800,9300,200,n17d,UP,NTRANS ++S 38200,19300,38200,37500,400,183nymous_,UP,ALU1 ++S 18200,9600,21800,9600,200,337nymous_,RIGHT,POLY ++S 36200,20900,36200,36700,200,p14d,UP,PTRANS ++S 11600,22500,11600,36700,200,n15b,UP,NTRANS ++S 11000,10900,11000,14900,200,p18f,UP,PTRANS ++S 13200,22200,14800,22200,200,cn,RIGHT,POLY ++S 10000,22200,11600,22200,200,cn,RIGHT,POLY ++S 4100,21800,7900,21800,400,cn,RIGHT,ALU2 ++S 25100,22800,27900,22800,400,cn,RIGHT,ALU1 ++S 25100,20400,27900,20400,400,cn,RIGHT,ALU1 ++S 25000,20100,25000,23100,400,cn,UP,ALU2 ++S 25100,37000,27900,37000,1600,fbul,RIGHT,ALU1 ++S 25100,25200,27900,25200,400,fbul,RIGHT,ALU1 ++S 16500,20200,24300,20200,400,296nymous_,RIGHT,ALU2 ++S 16800,20300,16800,23300,400,297nymous_,UP,ALU1 ++S 17900,34000,18700,34000,400,334nymous_,RIGHT,ALU1 ++S 16500,21200,25300,21200,400,298nymous_,RIGHT,ALU2 ++S 17900,36400,18700,36400,400,335nymous_,RIGHT,ALU1 ++S 3200,10880,3200,16120,600,138nymous_,UP,NTIE ++S 16800,20900,16800,24700,400,299nymous_,UP,ALU2 ++S 22000,17900,22000,19500,400,22onymous_,UP,ALU2 ++S 2900,15400,19300,15400,1200,139nymous_,RIGHT,ALU2 ++S 37000,21300,37000,36300,400,181nymous_,UP,ALU1 ++S 1800,17700,1800,38300,1600,336nymous_,UP,ALU2 ++S 21700,18200,25100,18200,400,23onymous_,RIGHT,ALU2 ++S 2900,17000,19100,17000,400,140nymous_,RIGHT,ALU2 ++S 37000,17700,37000,38300,2400,182nymous_,UP,ALU2 ++S 9200,22700,9200,36500,620,221nymous_,UP,NDIF ++S 22000,19300,22000,22100,400,24onymous_,UP,ALU1 ++S 32200,21100,32200,36500,620,141nymous_,UP,PDIF ++S 11000,7300,11000,9300,200,n18f,UP,NTRANS ++S 8900,6000,26300,6000,400,222nymous_,RIGHT,ALU2 ++S 12400,20700,12400,36300,400,258nymous_,UP,ALU1 ++S 22400,8100,22400,8500,400,25onymous_,UP,ALU1 ++S 29300,37000,31900,37000,2400,102nymous_,RIGHT,ALU2 ++S 29480,37600,38520,37600,600,103nymous_,RIGHT,NTIE ++S 26000,6100,26000,7900,400,66onymous_,UP,ALU1 ++S 26000,7500,26000,8100,620,67onymous_,UP,NDIF ++S 16800,24100,16800,29500,400,301nymous_,UP,ALU2 ++S 16800,23200,16800,25400,600,300nymous_,UP,POLY ++S 19500,36800,26300,36800,400,node_cp,RIGHT,ALU2 ++S 17900,35200,19700,35200,400,node_cp,RIGHT,ALU1 ++S 17900,32800,19700,32800,400,node_cp,RIGHT,ALU1 ++S 34600,20600,36200,20600,200,node_cp,RIGHT,POLY ++S 31400,20600,33000,20600,200,node_cp,RIGHT,POLY ++S 28600,24600,29000,24600,600,node_cp,RIGHT,POLY ++S 27700,24600,29300,24600,400,node_cp,RIGHT,ALU2 ++S 28000,24300,28000,31500,400,node_cp,UP,ALU2 ++S 25100,33600,27900,33600,400,node_cp,RIGHT,ALU1 ++S 25100,31200,27900,31200,400,node_cp,RIGHT,ALU1 ++S 21800,8300,21800,9300,200,n16d,UP,NTRANS ++S 18500,31600,25300,31600,400,cpd,RIGHT,ALU2 ++S 18800,21900,18800,36700,400,cpd,UP,ALU2 ++S 25100,32400,27900,32400,400,cpd,RIGHT,ALU1 ++S 25100,30000,27900,30000,400,cpd,RIGHT,ALU1 ++S 25100,27600,27900,27600,400,cpd,RIGHT,ALU1 ++S 25000,27300,25000,32700,400,cpd,UP,ALU2 ++S 29000,7300,29000,8300,200,n1,UP,NTRANS ++S 16900,24400,17700,24400,400,302nymous_,RIGHT,ALU1 ++S 32200,21300,32200,39700,400,142nymous_,UP,ALU1 ++S 38200,19080,38200,37920,600,184nymous_,UP,NTIE ++S 18400,10100,18400,12700,400,338nymous_,UP,ALU1 ++S 16800,25500,16800,28100,400,303nymous_,UP,ALU1 ++S 9200,6100,9200,7900,400,223nymous_,UP,ALU1 ++S 12400,22700,12400,36500,620,259nymous_,UP,NDIF ++S 3900,7600,7300,7600,1200,185nymous_,RIGHT,ALU2 ++S 18800,8500,18800,9100,420,339nymous_,UP,NDIF ++S 9200,5700,9200,11300,400,224nymous_,UP,ALU2 ++S 12400,18500,12400,22100,2400,260nymous_,UP,ALU2 ++S 32600,8600,32600,9800,200,143nymous_,UP,POLY ++S 22400,8500,22400,9100,620,26onymous_,UP,NDIF ++S 4400,21800,4400,22200,600,186nymous_,UP,POLY ++S 9200,7500,9200,9100,620,225nymous_,UP,NDIF ++S 18800,9100,18800,9900,400,340nymous_,UP,ALU1 ++S 12800,7500,12800,9100,620,261nymous_,UP,NDIF ++S 22100,17000,23700,17000,400,27onymous_,RIGHT,ALU2 ++S 32600,11400,32600,12400,200,144nymous_,UP,POLY ++S 4400,22700,4400,36500,620,187nymous_,UP,NDIF ++S 29600,7100,29600,8100,620,104nymous_,UP,NDIF ++S 8900,10000,26300,10000,2400,226nymous_,RIGHT,ALU2 ++S 12800,8100,12800,12500,400,262nymous_,UP,ALU1 ++S 23100,37600,27700,37600,400,28onymous_,RIGHT,ALU1 ++S 29300,10600,30300,10600,400,105nymous_,RIGHT,ALU2 ++S 32800,20200,32800,20600,600,145nymous_,UP,POLY ++S 17400,11800,17400,12000,200,307nymous_,UP,POLY ++S 17400,11100,17400,11700,400,306nymous_,UP,ALU1 ++S 25400,7300,25400,8300,200,n4b,UP,NTRANS ++S 29000,12500,29000,14500,200,p2,UP,PTRANS ++S 8600,10900,8600,14900,200,p18d,UP,PTRANS ++S 12200,7300,12200,9300,200,n17a,UP,NTRANS ++S 8600,7300,8600,9300,200,n18d,UP,NTRANS ++S 8400,22500,8400,36700,200,n14d,UP,NTRANS ++S 19500,28200,24300,28200,400,cpb,RIGHT,ALU2 ++S 19400,26200,19800,26200,200,cpb,RIGHT,POLY ++S 19400,22600,19800,22600,200,cpb,RIGHT,POLY ++S 24000,29200,24400,29200,600,cpb,RIGHT,POLY ++S 24000,28200,24400,28200,600,cpb,RIGHT,POLY ++S 19800,22700,19800,30900,400,cpb,UP,ALU1 ++S 19400,31000,19800,31000,200,cpb,RIGHT,POLY ++S 19400,27400,19800,27400,200,cpb,RIGHT,POLY ++S 24800,12700,24800,18500,400,cpb,UP,ALU2 ++S 24000,27000,24400,27000,600,cpb,RIGHT,POLY ++S 16800,28200,16800,29800,600,304nymous_,UP,POLY ++S 16900,29200,18700,29200,400,305nymous_,RIGHT,ALU1 ++S 18500,17000,20300,17000,400,341nymous_,RIGHT,ALU2 ++S 4400,22900,4400,37500,400,188nymous_,UP,ALU1 ++S 9200,11100,9200,14700,620,227nymous_,UP,PDIF ++S 12900,9000,15100,9000,400,263nymous_,RIGHT,ALU1 ++S 23000,11700,23000,17300,2000,29onymous_,UP,ALU2 ++S 12900,11000,17300,11000,400,264nymous_,RIGHT,ALU1 ++S 29600,12700,29600,14300,620,106nymous_,UP,PDIF ++S 4400,22700,4400,38300,2400,189nymous_,UP,ALU2 ++S 23000,19300,23000,37500,400,30onymous_,UP,ALU1 ++S 12800,11300,12800,12900,620,265nymous_,UP,PDIF ++S 29600,13100,29600,13900,400,107nymous_,UP,ALU1 ++S 4400,6100,4400,8900,400,190nymous_,UP,ALU1 ++S 19800,32900,19800,35100,400,342nymous_,UP,ALU1 ++S 33200,6100,33200,7900,400,146nymous_,UP,ALU1 ++S 23000,19080,23000,37920,600,31onymous_,UP,NTIE ++S 33200,7500,33200,8100,620,147nymous_,UP,NDIF ++S 26000,8700,26000,14300,400,68onymous_,UP,ALU2 ++S 19800,34900,19800,37100,400,343nymous_,UP,ALU2 ++S 33200,12900,33200,14500,620,148nymous_,UP,PDIF ++S 33200,13100,33200,15900,400,149nymous_,UP,ALU1 ++S 24900,21600,28100,21600,420,45onymous_,RIGHT,PDIF ++S 24900,20400,28100,20400,620,44onymous_,RIGHT,PDIF ++S 17700,25600,18900,25600,620,311nymous_,RIGHT,NDIF ++S 17700,24400,18900,24400,620,310nymous_,RIGHT,NDIF ++S 17700,23200,18900,23200,620,309nymous_,RIGHT,NDIF ++S 12200,11100,12200,13100,200,p17a,UP,PTRANS ++S 18200,8300,18200,9300,200,n16a,UP,NTRANS ++S 12200,10000,16400,10000,600,nnt,RIGHT,POLY ++S 17700,22000,18900,22000,620,308nymous_,RIGHT,NDIF ++S 32600,7300,32600,8300,200,n0,UP,NTRANS ++S 27200,8100,27200,12900,400,cpbb,UP,ALU1 ++S 25400,10600,27200,10600,200,cpbb,RIGHT,POLY ++S 25400,12700,25400,14700,200,p4b,UP,PTRANS ++S 9200,12100,9200,15900,400,228nymous_,UP,ALU1 ++S 9300,25000,16100,25000,2400,229nymous_,RIGHT,ALU2 ++S 30000,19900,30000,24900,400,108nymous_,UP,ALU2 ++S 9300,31000,16100,31000,2400,230nymous_,RIGHT,ALU2 ++S 4400,7500,4400,9100,620,191nymous_,UP,NDIF ++S 23100,19200,38100,19200,400,32onymous_,RIGHT,ALU1 ++S 4400,11100,4400,14700,620,192nymous_,UP,PDIF ++S 26000,12900,26000,14500,620,69onymous_,UP,PDIF ++S 22880,19200,38320,19200,600,33onymous_,RIGHT,NTIE ++S 4400,11900,4400,15900,400,193nymous_,UP,ALU1 ++S 13400,9600,13400,10800,200,266nymous_,UP,POLY ++S 23080,37600,29920,37600,600,34onymous_,RIGHT,NTIE ++S 26000,13100,26000,15900,400,70onymous_,UP,ALU1 ++S 4100,13000,20300,13000,2400,194nymous_,RIGHT,ALU2 ++S 30100,20200,35900,20200,400,109nymous_,RIGHT,ALU1 ++S 33400,11700,33400,17300,400,150nymous_,UP,ALU2 ++S 33800,21100,33800,36500,620,151nymous_,UP,PDIF ++S 30200,8600,30200,9000,200,110nymous_,UP,POLY ++S 24900,25200,28100,25200,420,48onymous_,RIGHT,PDIF ++S 24900,24000,28100,24000,420,47onymous_,RIGHT,PDIF ++S 24900,22800,28100,22800,420,46onymous_,RIGHT,PDIF ++S 17700,28000,18900,28000,620,313nymous_,RIGHT,NDIF ++S 17700,26800,18900,26800,620,312nymous_,RIGHT,NDIF ++S 30600,21300,30600,35500,400,114nymous_,UP,ALU1 ++S 30600,21100,30600,35900,620,113nymous_,UP,PDIF ++S 5700,9000,10300,9000,400,197nymous_,RIGHT,ALU1 ++S 32600,12700,32600,14700,200,p0,UP,PTRANS ++S 33000,20900,33000,36700,200,p14b,UP,PTRANS ++S 9800,21500,9800,23100,400,231nymous_,UP,ALU2 ++S 9500,22800,17100,22800,400,232nymous_,RIGHT,ALU2 ++S 9500,37000,17100,37000,2400,233nymous_,RIGHT,ALU2 ++S 26000,13700,26000,16100,400,71onymous_,UP,ALU2 ++S 23600,6100,23600,7900,400,35onymous_,UP,ALU1 ++S 14000,21800,14000,22200,600,267nymous_,UP,POLY ++S 25700,15400,32500,15400,1200,72onymous_,RIGHT,ALU2 ++S 23600,7500,23600,8100,620,36onymous_,UP,NDIF ++S 9800,9600,9800,10600,200,234nymous_,UP,POLY ++S 5000,9600,5000,10600,200,195nymous_,UP,POLY ++S 33800,21300,33800,36300,400,152nymous_,UP,ALU1 ++S 14000,22700,14000,36500,620,268nymous_,UP,NDIF ++S 25700,17000,33500,17000,400,73onymous_,RIGHT,ALU2 ++S 23600,12900,23600,14500,620,37onymous_,UP,PDIF ++S 14000,22900,14000,39700,400,269nymous_,UP,ALU1 ++S 14000,6100,14000,7900,400,270nymous_,UP,ALU1 ++S 30200,12000,30200,12200,200,111nymous_,UP,POLY ++S 5600,7500,5600,9100,420,196nymous_,UP,NDIF ++S 30400,36400,30400,36600,200,112nymous_,UP,POLY ++S 700,25000,8900,25000,2400,237nymous_,RIGHT,ALU2 ++S 33800,12400,35000,12400,200,155nymous_,RIGHT,POLY ++S 27000,6900,27000,14300,400,77onymous_,UP,ALU2 ++S 14100,10000,21100,10000,400,272nymous_,RIGHT,ALU1 ++S 9700,19000,14900,19000,2400,236nymous_,RIGHT,ALU2 ++S 27000,24900,27000,36700,400,76onymous_,UP,ALU2 ++S 33800,8600,35000,8600,200,154nymous_,RIGHT,POLY ++S 24900,26400,28100,26400,420,49onymous_,RIGHT,PDIF ++S 17700,30400,18900,30400,620,315nymous_,RIGHT,NDIF ++S 17700,29200,18900,29200,620,314nymous_,RIGHT,NDIF ++S 6000,20700,6000,36300,400,200nymous_,UP,ALU1 ++S 30600,26700,30600,35300,2400,115nymous_,UP,ALU2 ++S 5700,11000,10300,11000,400,199nymous_,RIGHT,ALU1 ++S 700,28000,15100,28000,2400,238nymous_,RIGHT,ALU2 ++S 5600,11100,5600,14700,620,198nymous_,UP,PDIF ++S 16800,29800,17200,29800,200,cnb,RIGHT,POLY ++S 16800,28600,17200,28600,200,cnb,RIGHT,POLY ++S 16800,25000,17200,25000,200,cnb,RIGHT,POLY ++S 16800,23800,17200,23800,200,cnb,RIGHT,POLY ++S 34400,12700,34400,18500,400,cnb,UP,ALU2 ++S 29000,17900,29000,23700,400,cnb,UP,ALU2 ++S 28600,23400,29000,23400,600,cnb,RIGHT,POLY ++S 28600,22200,29000,22200,600,cnb,RIGHT,POLY ++S 28600,21000,29000,21000,600,cnb,RIGHT,POLY ++S 23700,19200,29300,19200,400,cnb,RIGHT,ALU2 ++S 33800,19100,33800,38300,2400,156nymous_,UP,ALU2 ++S 24000,18900,24000,20500,400,41onymous_,UP,ALU2 ++S 14000,11300,14000,12900,620,273nymous_,UP,PDIF ++S 17000,12300,17000,13100,200,p16,UP,PTRANS ++S 19400,8300,19400,9300,200,n16b,UP,NTRANS ++S 24200,7300,24200,8300,200,n4a,UP,NTRANS ++S 2700,20200,15700,20200,400,74onymous_,RIGHT,ALU1 ++S 23600,13100,23600,15900,400,38onymous_,UP,ALU1 ++S 33800,8600,33800,12400,200,153nymous_,UP,POLY ++S 26400,18600,26400,38600,8400,75onymous_,UP,NWELL ++S 24000,27100,24000,29100,400,39onymous_,UP,ALU1 ++S 10000,22200,11600,22200,200,235nymous_,RIGHT,POLY ++S 14000,7500,14000,9100,620,271nymous_,UP,NDIF ++S 24000,33900,24000,36100,400,40onymous_,UP,ALU2 ++S 24700,22200,28300,22200,200,p7b,RIGHT,PTRANS ++S 33800,7300,33800,8300,200,n5a,UP,NTRANS ++S 17000,12000,17400,12000,200,nt,RIGHT,POLY ++S 5000,10000,11000,10000,600,nt,RIGHT,POLY ++S 24700,21000,28300,21000,200,p7c,RIGHT,PTRANS ++S 24200,12400,25400,12400,200,43onymous_,RIGHT,POLY ++S 30200,7300,30200,8300,200,n3,UP,NTRANS ++S 5000,7300,5000,9300,200,n18a,UP,NTRANS ++S 24200,12700,24200,14700,200,p4a,UP,PTRANS ++S 13400,11100,13400,13100,200,p17b,UP,PTRANS ++S 24200,8600,25400,8600,200,42onymous_,RIGHT,POLY ++S 17500,25000,19100,25000,200,n7c,RIGHT,NTRANS ++S 13400,7300,13400,9300,200,n17b,UP,NTRANS ++S 17500,23800,19100,23800,200,n7d,RIGHT,NTRANS ++S 13200,22500,13200,36700,200,n15c,UP,NTRANS ++S 26700,13000,33700,13000,2400,78onymous_,RIGHT,ALU2 ++S 14000,12100,14000,15900,400,274nymous_,UP,ALU1 ++S 27200,7500,27200,8100,620,79onymous_,UP,NDIF ++S 34000,18200,34000,38200,10400,157nymous_,UP,NWELL ++S 27200,12700,27200,14300,620,80onymous_,UP,PDIF ++S 3280,6000,28520,6000,600,158nymous_,RIGHT,PTIE ++S 27200,13100,27200,13900,400,81onymous_,UP,ALU1 ++S 700,31000,8900,31000,2400,239nymous_,RIGHT,ALU2 ++S 34400,7500,34400,8100,620,159nymous_,UP,NDIF ++S 30600,36400,31400,36400,200,116nymous_,RIGHT,POLY ++S 6000,22700,6000,36500,620,201nymous_,UP,NDIF ++S 700,34000,16100,34000,2400,240nymous_,RIGHT,ALU2 ++S 30680,6000,37120,6000,600,117nymous_,RIGHT,PTIE ++S 6200,9600,6200,10600,200,202nymous_,UP,POLY ++S 10400,7500,10400,9100,420,241nymous_,UP,NDIF ++S 24900,27600,28100,27600,420,50onymous_,RIGHT,PDIF ++S 5600,8100,5600,13700,400,1.nq,UP,ALU1 ++S 33800,12700,33800,14700,200,p5a,UP,PTRANS ++S 24700,25800,28300,25800,200,p13,RIGHT,PTRANS ++S 30200,12500,30200,14500,200,p3,UP,PTRANS ++S 24700,24600,28300,24600,200,p10,RIGHT,PTRANS ++S 5200,22500,5200,36700,200,n14b,UP,NTRANS ++S 24700,23400,28300,23400,200,p7a,RIGHT,PTRANS ++S 5000,10900,5000,14900,200,p18a,UP,PTRANS ++S 30200,12000,31800,12000,200,eb,RIGHT,POLY ++S 30200,9000,31800,9000,200,eb,RIGHT,POLY ++S 10000,22500,10000,36700,200,n15a,UP,NTRANS ++S 9800,10900,9800,14900,200,p18e,UP,PTRANS ++S 17500,29800,19100,29800,200,n7a,RIGHT,NTRANS ++S 17500,28600,19100,28600,200,n7b,RIGHT,NTRANS ++S 9800,7300,9800,9300,200,n18e,UP,NTRANS ++S 17500,27400,19100,27400,200,n6b,RIGHT,NTRANS ++S 17500,26200,19100,26200,200,n6c,RIGHT,NTRANS ++S 24700,27000,28300,27000,200,p6c,RIGHT,PTRANS ++S 1280,37600,21120,37600,600,275nymous_,RIGHT,PTIE ++S 14600,9600,14600,10800,200,276nymous_,UP,POLY ++S 27300,13000,29500,13000,400,82onymous_,RIGHT,ALU1 ++S 50,6000,26800,6000,12000,0nonymous_,RIGHT,TALU2 ++S 34400,8100,34400,13900,400,160nymous_,UP,ALU1 ++S 34400,13100,34400,14500,620,161nymous_,UP,PDIF ++S 30800,7500,30800,8100,620,118nymous_,UP,NDIF ++S 27800,8600,27800,9800,200,83onymous_,UP,POLY ++S 15300,37600,20700,37600,400,277nymous_,RIGHT,ALU1 ++S 31200,6000,39950,6000,12000,2nonymous_,RIGHT,TALU2 ++S 27800,9800,32600,9800,200,84onymous_,RIGHT,POLY ++S 34800,20200,34800,20600,600,162nymous_,UP,POLY ++S 6800,6100,6800,7900,400,203nymous_,UP,ALU1 ++S 10100,7600,27300,7600,1200,242nymous_,RIGHT,ALU2 ++S 17500,34600,19100,34600,200,n8b,RIGHT,NTRANS ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 17500,33400,19100,33400,200,n8c,RIGHT,NTRANS ++S 17500,32200,19100,32200,200,n8d,RIGHT,NTRANS ++S 17500,31000,19100,31000,200,n6a,RIGHT,NTRANS ++S 2800,22700,2800,36500,620,88onymous_,UP,NDIF ++S 24700,28200,28300,28200,200,p6b,RIGHT,PTRANS ++S 24700,29400,28300,29400,200,p6a,RIGHT,PTRANS ++S 24700,30600,28300,30600,200,p8c,RIGHT,PTRANS ++S 15200,7500,15200,9100,620,278nymous_,UP,NDIF ++S 50,6000,26800,6000,12000,3nonymous_,RIGHT,TALU4 ++S 27800,11800,27800,12400,200,85onymous_,UP,POLY ++S 30800,12700,30800,14300,620,119nymous_,UP,PDIF ++S 15200,8100,15200,8900,400,279nymous_,UP,ALU1 ++S 15200,11100,15200,12500,400,280nymous_,UP,ALU1 ++S 31200,6000,39950,6000,12000,5nonymous_,RIGHT,TALU4 ++S 30800,13100,30800,13900,400,120nymous_,UP,ALU1 ++S 15200,11300,15200,12900,620,281nymous_,UP,PDIF ++S 6800,7500,6800,9100,620,204nymous_,UP,NDIF ++S 31000,5700,31000,11300,400,121nymous_,UP,ALU2 ++S 35400,21100,35400,36500,620,163nymous_,UP,PDIF ++S 6900,10000,12700,10000,400,205nymous_,RIGHT,ALU1 ++S 35400,21300,35400,39700,400,164nymous_,UP,ALU1 ++S 10400,8100,10400,8900,400,243nymous_,UP,ALU1 ++S 6800,11100,6800,14700,620,206nymous_,UP,PDIF ++S 35100,13000,37100,13000,2400,165nymous_,RIGHT,ALU2 ++S 10400,11100,10400,13700,400,244nymous_,UP,ALU1 ++S 6800,12100,6800,15900,400,207nymous_,UP,ALU1 ++S 10400,11100,10400,14700,620,245nymous_,UP,PDIF ++S 2800,20500,2800,36300,400,87onymous_,UP,ALU1 ++S 17500,35800,19100,35800,200,n8a,RIGHT,NTRANS ++S 7400,9600,7400,10600,200,209nymous_,UP,POLY ++S 35600,12900,35600,14500,620,168nymous_,UP,PDIF ++S 31400,19100,31400,28300,400,124nymous_,UP,ALU2 ++S 10700,39600,35500,39600,2400,246nymous_,RIGHT,ALU1 ++S 10800,21800,10800,22200,600,247nymous_,UP,POLY ++S 2200,13600,37800,13600,6800,89onymous_,RIGHT,NWELL ++S 31600,20200,31600,20600,600,125nymous_,UP,POLY ++S 28200,9100,28200,11700,400,90onymous_,UP,ALU1 ++S 14600,7300,14600,9300,200,n17c,UP,NTRANS ++S 24700,31800,28300,31800,200,p8b,RIGHT,PTRANS ++S 24700,33000,28300,33000,200,p8a,RIGHT,PTRANS ++S 27800,7300,27800,8300,200,n2,UP,NTRANS ++S 24700,34200,28300,34200,200,p9,RIGHT,PTRANS ++S 6200,7300,6200,9300,200,n18b,UP,NTRANS ++S 24700,35800,28300,35800,200,p12,RIGHT,PTRANS ++S 34600,20900,34600,36700,200,p14c,UP,PTRANS ++S 17700,31600,18900,31600,620,316nymous_,RIGHT,NDIF ++S 13400,200,13400,2000,27000,6nonymous_,UP,TALU3 ++S 17700,32800,18900,32800,620,317nymous_,RIGHT,NDIF ++S 15600,20700,15600,36300,400,282nymous_,UP,ALU1 ++S 29000,200,29000,2000,0,7nonymous_,UP,TALU3 ++S 30700,6000,32300,6000,400,122nymous_,RIGHT,ALU2 ++S 15600,22700,15600,36500,620,283nymous_,UP,NDIF ++S 35600,200,35600,2000,9000,8nonymous_,UP,TALU3 ++S 30700,10000,36100,10000,2400,123nymous_,RIGHT,ALU2 ++S 15800,23700,15800,32300,400,284nymous_,UP,ALU2 ++S 13400,200,13400,12000,27000,9nonymous_,UP,TALU5 ++S 35600,6100,35600,7900,400,166nymous_,UP,ALU1 ++S 7000,6900,7000,14300,400,208nymous_,UP,ALU2 ++S 35600,7500,35600,8100,620,167nymous_,UP,NDIF ++B 21200,10000,200,200,CONT_TURN1,344nymous_ ++B 22400,8000,200,200,CONT_TURN1,345nymous_ ++B 28200,9000,200,200,CONT_TURN1,346nymous_ ++B 17400,11000,200,200,CONT_TURN1,349nymous_ ++B 5000,19000,8300,2300,CONT_VIA2,347nymous_ ++B 10400,11000,200,200,CONT_TURN1,348nymous_ ++B 17800,22000,200,200,CONT_TURN1,351nymous_ ++B 17600,8000,200,200,CONT_TURN1,350nymous_ ++B 18400,12800,200,200,CONT_TURN1,352nymous_ ++B 19800,32800,200,200,CONT_TURN1,353nymous_ ++B 16400,17000,300,300,CONT_VIA,1268ymous_ ++B 15200,9000,300,300,CONT_DIF_N,1214ymous_ ++B 6800,37600,300,300,CONT_VIA,1000ymous_ ++B 18800,23200,300,300,CONT_DIF_N,1322ymous_ ++B 7600,36000,300,300,CONT_VIA2,1054ymous_ ++B 9200,17000,300,300,CONT_VIA,1108ymous_ ++B 26000,20400,300,300,CONT_DIF_P,462nymous_ ++B 23000,35400,300,300,CONT_BODY_N,408nymous_ ++B 28400,14000,300,300,CONT_DIF_P,569nymous_ ++B 30600,31000,300,300,CONT_VIA,623nymous_ ++B 12400,30000,300,300,CONT_DIF_N,1162ymous_ ++B 27000,36400,300,300,CONT_DIF_P,516nymous_ ++B 3200,14000,300,300,CONT_VIA2,677nymous_ ++B 35400,26000,300,300,CONT_DIF_P,785nymous_ ++B 37000,22000,300,300,CONT_VIA2,839nymous_ ++B 38200,30400,300,300,CONT_BODY_N,893nymous_ ++B 15200,10000,300,300,CONT_POLY,1215ymous_ ++B 4400,14800,300,300,CONT_DIF_P,947nymous_ ++B 6800,37600,300,300,CONT_VIA2,1001ymous_ ++B 18800,24400,300,300,CONT_DIF_N,1323ymous_ ++B 16400,17000,300,300,CONT_VIA2,1269ymous_ ++B 23000,36400,300,300,CONT_BODY_N,409nymous_ ++B 28400,16000,300,300,CONT_BODY_N,570nymous_ ++B 7600,19200,300,300,CONT_BODY_P,1055ymous_ ++B 9200,17000,300,300,CONT_VIA2,1109ymous_ ++B 27000,36400,300,300,CONT_VIA,517nymous_ ++B 26000,21600,300,300,CONT_DIF_P,463nymous_ ++B 30600,32000,300,300,CONT_DIF_P,624nymous_ ++B 3200,15000,300,300,CONT_BODY_N,678nymous_ ++B 12400,31000,300,300,CONT_DIF_N,1163ymous_ ++B 33800,28000,300,300,CONT_VIA,732nymous_ ++B 35400,27000,300,300,CONT_DIF_P,786nymous_ ++B 37000,23000,300,300,CONT_DIF_P,840nymous_ ++B 28000,25200,300,300,CONT_DIF_P,540nymous_ ++B 38200,31400,300,300,CONT_BODY_N,894nymous_ ++B 4400,16000,300,300,CONT_BODY_N,948nymous_ ++B 16600,19200,300,300,CONT_BODY_P,1270ymous_ ++B 15200,11600,300,300,CONT_DIF_P,1216ymous_ ++B 6800,6000,300,300,CONT_BODY_P,1002ymous_ ++B 7800,37600,300,300,CONT_BODY_P,1056ymous_ ++B 18800,25600,300,300,CONT_DIF_N,1324ymous_ ++B 23000,37600,300,300,CONT_BODY_N,410nymous_ ++B 20000,6000,300,300,CONT_VIA2,356nymous_ ++B 28400,17000,300,300,CONT_VIA,571nymous_ ++B 9600,37600,300,300,CONT_BODY_P,1110ymous_ ++B 12400,32000,300,300,CONT_DIF_N,1164ymous_ ++B 27000,37600,300,300,CONT_BODY_N,518nymous_ ++B 26000,21600,300,300,CONT_VIA,464nymous_ ++B 30600,32000,300,300,CONT_VIA,625nymous_ ++B 3200,16000,300,300,CONT_BODY_N,679nymous_ ++B 33800,28000,300,300,CONT_VIA2,733nymous_ ++B 35400,28000,300,300,CONT_DIF_P,787nymous_ ++B 37000,23000,300,300,CONT_VIA,841nymous_ ++B 38200,32400,300,300,CONT_BODY_N,895nymous_ ++B 4400,17000,300,300,CONT_VIA,949nymous_ ++B 16800,20200,300,300,CONT_VIA,1271ymous_ ++B 15200,12600,300,300,CONT_DIF_P,1217ymous_ ++B 20000,8600,300,300,CONT_DIF_N,357nymous_ ++B 6800,6000,300,300,CONT_VIA,1003ymous_ ++B 7800,37600,300,300,CONT_VIA,1057ymous_ ++B 18800,26800,300,300,CONT_DIF_N,1325ymous_ ++B 23000,19200,300,300,CONT_BODY_N,411nymous_ ++B 28400,17000,300,300,CONT_VIA2,572nymous_ ++B 9600,19200,300,300,CONT_BODY_P,1111ymous_ ++B 12400,33000,300,300,CONT_DIF_N,1165ymous_ ++B 37000,23000,300,300,CONT_VIA2,842nymous_ ++B 38200,33400,300,300,CONT_BODY_N,896nymous_ ++B 15200,16000,300,300,CONT_BODY_N,1218ymous_ ++B 4400,17000,300,300,CONT_VIA2,950nymous_ ++B 6800,6000,300,300,CONT_VIA2,1004ymous_ ++B 18800,26800,300,300,CONT_VIA,1326ymous_ ++B 16800,23400,300,300,CONT_POLY,1272ymous_ ++B 20000,11000,300,300,CONT_POLY,358nymous_ ++B 7800,37600,300,300,CONT_VIA2,1058ymous_ ++B 10400,6000,300,300,CONT_BODY_P,1112ymous_ ++B 26000,22800,300,300,CONT_DIF_P,466nymous_ ++B 23400,17000,300,300,CONT_VIA,412nymous_ ++B 28800,9000,300,300,CONT_POLY,573nymous_ ++B 30600,33000,300,300,CONT_VIA,627nymous_ ++B 12400,34000,300,300,CONT_DIF_N,1166ymous_ ++B 27000,10000,300,300,CONT_VIA2,520nymous_ ++B 3200,17000,300,300,CONT_VIA2,681nymous_ ++B 33800,29000,300,300,CONT_VIA,735nymous_ ++B 35400,30000,300,300,CONT_DIF_P,789nymous_ ++B 37000,24000,300,300,CONT_DIF_P,843nymous_ ++B 38200,34400,300,300,CONT_BODY_N,897nymous_ ++B 15200,17000,300,300,CONT_VIA,1219ymous_ ++B 4600,37600,300,300,CONT_BODY_P,951nymous_ ++B 6800,7200,300,300,CONT_DIF_N,1005ymous_ ++B 16800,24400,300,300,CONT_VIA,1273ymous_ ++B 20000,16000,300,300,CONT_BODY_N,359nymous_ ++B 26000,21600,300,300,CONT_VIA2,465nymous_ ++B 30600,33000,300,300,CONT_DIF_P,626nymous_ ++B 27000,9000,300,300,CONT_VIA2,519nymous_ ++B 3200,17000,300,300,CONT_VIA,680nymous_ ++B 33800,29000,300,300,CONT_DIF_P,734nymous_ ++B 35400,29000,300,300,CONT_DIF_P,788nymous_ ++B 18800,28000,300,300,CONT_DIF_N,1327ymous_ ++B 23400,17000,300,300,CONT_VIA2,413nymous_ ++B 29000,21000,300,300,CONT_POLY,574nymous_ ++B 8000,8000,300,300,CONT_DIF_N,1059ymous_ ++B 10400,6000,300,300,CONT_VIA,1113ymous_ ++B 27000,11000,300,300,CONT_VIA2,521nymous_ ++B 26000,22800,300,300,CONT_VIA2,467nymous_ ++B 30600,33000,300,300,CONT_VIA2,628nymous_ ++B 32200,22000,300,300,CONT_DIF_P,682nymous_ ++B 33800,29000,300,300,CONT_VIA2,736nymous_ ++B 12400,35000,300,300,CONT_DIF_N,1167ymous_ ++B 35400,31000,300,300,CONT_DIF_P,790nymous_ ++B 37000,24000,300,300,CONT_VIA,844nymous_ ++B 38200,35400,300,300,CONT_BODY_N,898nymous_ ++B 4600,37600,300,300,CONT_VIA,952nymous_ ++B 16800,25400,300,300,CONT_POLY,1274ymous_ ++B 15200,17000,300,300,CONT_VIA2,1220ymous_ ++B 6800,8000,300,300,CONT_DIF_N,1006ymous_ ++B 8000,9000,300,300,CONT_DIF_N,1060ymous_ ++B 18800,29200,300,300,CONT_DIF_N,1328ymous_ ++B 23600,6000,300,300,CONT_BODY_P,414nymous_ ++B 20800,20400,300,300,CONT_BODY_P,360nymous_ ++B 29000,21000,300,300,CONT_VIA,575nymous_ ++B 10400,6000,300,300,CONT_VIA2,1114ymous_ ++B 12400,36000,300,300,CONT_DIF_N,1168ymous_ ++B 27000,19200,300,300,CONT_BODY_N,522nymous_ ++B 26000,24000,300,300,CONT_DIF_P,468nymous_ ++B 30600,34000,300,300,CONT_DIF_P,629nymous_ ++B 32200,23000,300,300,CONT_DIF_P,683nymous_ ++B 33800,30000,300,300,CONT_DIF_P,737nymous_ ++B 35400,32000,300,300,CONT_DIF_P,791nymous_ ++B 37000,25000,300,300,CONT_DIF_P,845nymous_ ++B 38200,36400,300,300,CONT_BODY_N,899nymous_ ++B 4600,37600,300,300,CONT_VIA2,953nymous_ ++B 16800,28200,300,300,CONT_POLY,1275ymous_ ++B 15600,23000,300,300,CONT_DIF_N,1221ymous_ ++B 20800,21400,300,300,CONT_BODY_P,361nymous_ ++B 6800,10000,300,300,CONT_POLY,1007ymous_ ++B 8000,9000,300,300,CONT_VIA,1061ymous_ ++B 18800,30400,300,300,CONT_DIF_N,1329ymous_ ++B 26000,24000,300,300,CONT_VIA,469nymous_ ++B 23600,6000,300,300,CONT_VIA,415nymous_ ++B 29000,22200,300,300,CONT_POLY,576nymous_ ++B 30600,34000,300,300,CONT_VIA,630nymous_ ++B 10400,8000,300,300,CONT_DIF_N,1115ymous_ ++B 12600,19200,300,300,CONT_BODY_P,1169ymous_ ++B 27200,6000,300,300,CONT_BODY_P,523nymous_ ++B 32200,24000,300,300,CONT_DIF_P,684nymous_ ++B 33800,30000,300,300,CONT_VIA,738nymous_ ++B 35400,33000,300,300,CONT_DIF_P,792nymous_ ++B 37000,25000,300,300,CONT_VIA,846nymous_ ++B 38200,37600,300,300,CONT_BODY_N,900nymous_ ++B 15600,24000,300,300,CONT_DIF_N,1222ymous_ ++B 4600,19200,300,300,CONT_BODY_P,954nymous_ ++B 6800,12000,300,300,CONT_DIF_P,1008ymous_ ++B 18800,31600,300,300,CONT_DIF_N,1330ymous_ ++B 16800,29200,300,300,CONT_VIA,1276ymous_ ++B 20800,22400,300,300,CONT_BODY_P,362nymous_ ++B 8000,10000,300,300,CONT_POLY,1062ymous_ ++B 10400,9000,300,300,CONT_DIF_N,1116ymous_ ++B 23600,6000,300,300,CONT_VIA2,416nymous_ ++B 29000,22200,300,300,CONT_VIA,577nymous_ ++B 12800,6000,300,300,CONT_BODY_P,1170ymous_ ++B 27200,8000,300,300,CONT_DIF_N,524nymous_ ++B 15600,25000,300,300,CONT_DIF_N,1223ymous_ ++B 5400,24000,300,300,CONT_VIA2,955nymous_ ++B 6800,12800,300,300,CONT_DIF_P,1009ymous_ ++B 18800,31600,300,300,CONT_VIA,1331ymous_ ++B 16800,32200,300,300,CONT_POLY,1277ymous_ ++B 23600,8000,300,300,CONT_DIF_N,417nymous_ ++B 20800,23400,300,300,CONT_BODY_P,363nymous_ ++B 29000,23400,300,300,CONT_POLY,578nymous_ ++B 8000,11000,300,300,CONT_VIA,1063ymous_ ++B 10400,10000,300,300,CONT_POLY,1117ymous_ ++B 27200,10600,300,300,CONT_POLY,525nymous_ ++B 26000,26400,300,300,CONT_DIF_P,471nymous_ ++B 30600,35000,300,300,CONT_DIF_P,632nymous_ ++B 32200,26000,300,300,CONT_DIF_P,686nymous_ ++B 33800,31000,300,300,CONT_VIA,740nymous_ ++B 12800,6000,300,300,CONT_VIA,1171ymous_ ++B 35400,35000,300,300,CONT_DIF_P,794nymous_ ++B 37000,26000,300,300,CONT_VIA,848nymous_ ++B 4400,21800,300,300,CONT_POLY,902nymous_ ++B 5400,25000,300,300,CONT_VIA2,956nymous_ ++B 16800,32200,300,300,CONT_VIA,1278ymous_ ++B 15600,26000,300,300,CONT_DIF_N,1224ymous_ ++B 6800,13800,300,300,CONT_DIF_P,1010ymous_ ++B 18800,32800,300,300,CONT_DIF_N,1332ymous_ ++B 20800,24400,300,300,CONT_BODY_P,364nymous_ ++B 38200,19200,300,300,CONT_BODY_N,901nymous_ ++B 37000,26000,300,300,CONT_DIF_P,847nymous_ ++B 35400,34000,300,300,CONT_DIF_P,793nymous_ ++B 33800,31000,300,300,CONT_DIF_P,739nymous_ ++B 32200,25000,300,300,CONT_DIF_P,685nymous_ ++B 30600,34000,300,300,CONT_VIA2,631nymous_ ++B 26000,25200,300,300,CONT_DIF_P,470nymous_ ++B 4400,23000,300,300,CONT_DIF_N,904nymous_ ++B 37000,27000,300,300,CONT_VIA,850nymous_ ++B 35600,6000,300,300,CONT_BODY_P,796nymous_ ++B 33800,32000,300,300,CONT_VIA,742nymous_ ++B 32200,28000,300,300,CONT_DIF_P,688nymous_ ++B 27200,14000,300,300,CONT_DIF_P,527nymous_ ++B 12800,8000,300,300,CONT_DIF_N,1173ymous_ ++B 10400,12800,300,300,CONT_DIF_P,1119ymous_ ++B 30600,35000,300,300,CONT_VIA2,634nymous_ ++B 29000,24600,300,300,CONT_POLY,580nymous_ ++B 23600,14000,300,300,CONT_DIF_P,419nymous_ ++B 26000,27600,300,300,CONT_DIF_P,473nymous_ ++B 18800,34000,300,300,CONT_DIF_N,1333ymous_ ++B 8000,12800,300,300,CONT_DIF_P,1065ymous_ ++B 6800,14800,300,300,CONT_DIF_P,1011ymous_ ++B 20800,25400,300,300,CONT_BODY_P,365nymous_ ++B 15600,27000,300,300,CONT_DIF_N,1225ymous_ ++B 16800,33400,300,300,CONT_POLY,1279ymous_ ++B 5400,26000,300,300,CONT_VIA2,957nymous_ ++B 4400,21800,300,300,CONT_VIA,903nymous_ ++B 37000,27000,300,300,CONT_DIF_P,849nymous_ ++B 35400,36000,300,300,CONT_DIF_P,795nymous_ ++B 33800,32000,300,300,CONT_DIF_P,741nymous_ ++B 32200,27000,300,300,CONT_DIF_P,687nymous_ ++B 30600,35000,300,300,CONT_VIA,633nymous_ ++B 26000,26400,300,300,CONT_VIA,472nymous_ ++B 27200,13000,300,300,CONT_DIF_P,526nymous_ ++B 12800,6000,300,300,CONT_VIA2,1172ymous_ ++B 10400,11800,300,300,CONT_DIF_P,1118ymous_ ++B 29000,23400,300,300,CONT_VIA,579nymous_ ++B 23600,13000,300,300,CONT_DIF_P,418nymous_ ++B 8000,11800,300,300,CONT_DIF_P,1064ymous_ ++B 30800,8000,300,300,CONT_DIF_N,636nymous_ ++B 26000,28800,300,300,CONT_DIF_P,475nymous_ ++B 27200,17000,300,300,CONT_VIA,529nymous_ ++B 10400,16000,300,300,CONT_BODY_N,1121ymous_ ++B 8000,16000,300,300,CONT_BODY_N,1067ymous_ ++B 29000,25800,300,300,CONT_POLY,582nymous_ ++B 20800,27400,300,300,CONT_BODY_P,367nymous_ ++B 24000,27000,300,300,CONT_POLY,421nymous_ ++B 16800,33400,300,300,CONT_VIA2,1281ymous_ ++B 18800,35200,300,300,CONT_DIF_N,1335ymous_ ++B 6800,17000,300,300,CONT_VIA,1013ymous_ ++B 5400,31000,300,300,CONT_VIA2,959nymous_ ++B 15600,29000,300,300,CONT_DIF_N,1227ymous_ ++B 4400,23000,300,300,CONT_VIA,905nymous_ ++B 37000,27000,300,300,CONT_VIA2,851nymous_ ++B 35600,6000,300,300,CONT_VIA,797nymous_ ++B 33800,33000,300,300,CONT_DIF_P,743nymous_ ++B 32200,29000,300,300,CONT_DIF_P,689nymous_ ++B 27200,16000,300,300,CONT_BODY_N,528nymous_ ++B 12800,9000,300,300,CONT_DIF_N,1174ymous_ ++B 30800,6000,300,300,CONT_BODY_P,635nymous_ ++B 29000,24600,300,300,CONT_VIA,581nymous_ ++B 23600,16000,300,300,CONT_BODY_N,420nymous_ ++B 26000,27600,300,300,CONT_VIA2,474nymous_ ++B 10400,13800,300,300,CONT_DIF_P,1120ymous_ ++B 8000,13800,300,300,CONT_DIF_P,1066ymous_ ++B 20800,26400,300,300,CONT_BODY_P,366nymous_ ++B 16800,33400,300,300,CONT_VIA,1280ymous_ ++B 18800,34000,300,300,CONT_VIA,1334ymous_ ++B 6800,16000,300,300,CONT_BODY_N,1012ymous_ ++B 5400,30000,300,300,CONT_VIA2,958nymous_ ++B 15600,28000,300,300,CONT_DIF_N,1226ymous_ ++B 15600,30000,300,300,CONT_DIF_N,1228ymous_ ++B 16800,34600,300,300,CONT_POLY,1282ymous_ ++B 5400,32000,300,300,CONT_VIA2,960nymous_ ++B 4400,24000,300,300,CONT_DIF_N,906nymous_ ++B 37000,28000,300,300,CONT_DIF_P,852nymous_ ++B 35600,6000,300,300,CONT_VIA2,798nymous_ ++B 33800,33000,300,300,CONT_VIA,744nymous_ ++B 32200,30000,300,300,CONT_DIF_P,690nymous_ ++B 6800,17000,300,300,CONT_VIA2,1014ymous_ ++B 8000,17000,300,300,CONT_VIA,1068ymous_ ++B 18800,36400,300,300,CONT_DIF_N,1336ymous_ ++B 24000,28200,300,300,CONT_POLY,422nymous_ ++B 20800,28400,300,300,CONT_BODY_P,368nymous_ ++B 29000,30600,300,300,CONT_POLY,583nymous_ ++B 10400,17000,300,300,CONT_VIA,1122ymous_ ++B 12800,12600,300,300,CONT_DIF_P,1176ymous_ ++B 27200,17000,300,300,CONT_VIA2,530nymous_ ++B 26000,28800,300,300,CONT_VIA,476nymous_ ++B 30800,10600,300,300,CONT_POLY,637nymous_ ++B 32200,31000,300,300,CONT_DIF_P,691nymous_ ++B 33800,33000,300,300,CONT_VIA2,745nymous_ ++B 35600,8000,300,300,CONT_DIF_N,799nymous_ ++B 37000,28000,300,300,CONT_VIA,853nymous_ ++B 4400,24000,300,300,CONT_VIA,907nymous_ ++B 5400,36000,300,300,CONT_VIA2,961nymous_ ++B 16800,34600,300,300,CONT_VIA,1283ymous_ ++B 15600,31000,300,300,CONT_DIF_N,1229ymous_ ++B 20800,29400,300,300,CONT_BODY_P,369nymous_ ++B 7000,9000,300,300,CONT_VIA2,1015ymous_ ++B 8000,17000,300,300,CONT_VIA2,1069ymous_ ++B 18800,36400,300,300,CONT_VIA,1337ymous_ ++B 24000,28200,300,300,CONT_VIA,423nymous_ ++B 26000,28800,300,300,CONT_VIA2,477nymous_ ++B 29000,31800,300,300,CONT_POLY,584nymous_ ++B 30800,13000,300,300,CONT_DIF_P,638nymous_ ++B 10400,17000,300,300,CONT_VIA2,1123ymous_ ++B 12800,16000,300,300,CONT_BODY_N,1177ymous_ ++B 27800,36400,300,300,CONT_DIF_P,531nymous_ ++B 32200,32000,300,300,CONT_DIF_P,692nymous_ ++B 33800,34000,300,300,CONT_DIF_P,746nymous_ ++B 35600,13000,300,300,CONT_DIF_P,800nymous_ ++B 37000,28000,300,300,CONT_VIA2,854nymous_ ++B 4400,24000,300,300,CONT_VIA2,908nymous_ ++B 15600,32000,300,300,CONT_DIF_N,1230ymous_ ++B 5600,37600,300,300,CONT_BODY_P,962nymous_ ++B 7000,10000,300,300,CONT_VIA2,1016ymous_ ++B 18800,37600,300,300,CONT_BODY_P,1338ymous_ ++B 16800,34600,300,300,CONT_VIA2,1284ymous_ ++B 20800,30400,300,300,CONT_BODY_P,370nymous_ ++B 8600,24000,300,300,CONT_VIA2,1070ymous_ ++B 10600,19200,300,300,CONT_BODY_P,1124ymous_ ++B 26000,30000,300,300,CONT_DIF_P,478nymous_ ++B 24000,29200,300,300,CONT_POLY,424nymous_ ++B 29000,33000,300,300,CONT_POLY,585nymous_ ++B 30800,14000,300,300,CONT_DIF_P,639nymous_ ++B 12800,17000,300,300,CONT_VIA,1178ymous_ ++B 27800,37600,300,300,CONT_BODY_N,532nymous_ ++B 32200,33000,300,300,CONT_DIF_P,693nymous_ ++B 33800,34000,300,300,CONT_VIA,747nymous_ ++B 35600,14000,300,300,CONT_DIF_P,801nymous_ ++B 37000,29000,300,300,CONT_DIF_P,855nymous_ ++B 4400,25000,300,300,CONT_DIF_N,909nymous_ ++B 5600,37600,300,300,CONT_VIA,963nymous_ ++B 7000,11000,300,300,CONT_VIA2,1017ymous_ ++B 12800,17000,300,300,CONT_VIA2,1179ymous_ ++B 15600,33000,300,300,CONT_DIF_N,1231ymous_ ++B 18800,6000,300,300,CONT_BODY_P,1339ymous_ ++B 16800,35800,300,300,CONT_POLY,1285ymous_ ++B 24000,34200,300,300,CONT_POLY,425nymous_ ++B 20800,31400,300,300,CONT_BODY_P,371nymous_ ++B 29000,19200,300,300,CONT_BODY_N,586nymous_ ++B 8600,25000,300,300,CONT_VIA2,1071ymous_ ++B 10800,21800,300,300,CONT_POLY,1125ymous_ ++B 28000,0,300,300,CONT_VIA2,533nymous_ ++B 26000,31200,300,300,CONT_DIF_P,479nymous_ ++B 30800,16000,300,300,CONT_BODY_N,640nymous_ ++B 32200,34000,300,300,CONT_DIF_P,694nymous_ ++B 33800,34000,300,300,CONT_VIA2,748nymous_ ++B 35600,16000,300,300,CONT_BODY_N,802nymous_ ++B 37000,29000,300,300,CONT_VIA,856nymous_ ++B 4400,25000,300,300,CONT_VIA,910nymous_ ++B 5600,37600,300,300,CONT_VIA2,964nymous_ ++B 16800,35800,300,300,CONT_VIA,1286ymous_ ++B 15600,34000,300,300,CONT_DIF_N,1232ymous_ ++B 7600,21800,300,300,CONT_POLY,1018ymous_ ++B 8600,26000,300,300,CONT_VIA2,1072ymous_ ++B 18800,6000,300,300,CONT_VIA,1340ymous_ ++B 24000,34200,300,300,CONT_VIA,426nymous_ ++B 20800,32400,300,300,CONT_BODY_P,372nymous_ ++B 29600,33000,300,300,CONT_VIA2,587nymous_ ++B 10800,21800,300,300,CONT_VIA,1126ymous_ ++B 28000,0,300,300,CONT_VIA3,534nymous_ ++B 26000,31200,300,300,CONT_VIA,480nymous_ ++B 30800,17000,300,300,CONT_VIA,641nymous_ ++B 32200,35000,300,300,CONT_DIF_P,695nymous_ ++B 33800,35000,300,300,CONT_DIF_P,749nymous_ ++B 35600,17000,300,300,CONT_VIA,803nymous_ ++B 37000,29000,300,300,CONT_VIA2,857nymous_ ++B 4400,25000,300,300,CONT_VIA2,911nymous_ ++B 5600,6000,300,300,CONT_BODY_P,965nymous_ ++B 16800,37600,300,300,CONT_BODY_P,1287ymous_ ++B 15600,35000,300,300,CONT_DIF_N,1233ymous_ ++B 20800,33400,300,300,CONT_BODY_P,373nymous_ ++B 7600,21800,300,300,CONT_VIA,1019ymous_ ++B 8600,30000,300,300,CONT_VIA2,1073ymous_ ++B 18800,6000,300,300,CONT_VIA2,1341ymous_ ++B 26000,32400,300,300,CONT_DIF_P,481nymous_ ++B 24000,34200,300,300,CONT_VIA2,427nymous_ ++B 29600,34000,300,300,CONT_VIA2,588nymous_ ++B 30800,17000,300,300,CONT_VIA2,642nymous_ ++B 10800,21800,300,300,CONT_VIA2,1127ymous_ ++B 28000,0,300,300,CONT_VIA4,535nymous_ ++B 32200,36000,300,300,CONT_DIF_P,696nymous_ ++B 33800,35000,300,300,CONT_VIA,750nymous_ ++B 35600,17000,300,300,CONT_VIA2,804nymous_ ++B 37000,30000,300,300,CONT_DIF_P,858nymous_ ++B 4400,26000,300,300,CONT_DIF_N,912nymous_ ++B 15600,36000,300,300,CONT_DIF_N,1234ymous_ ++B 5600,6000,300,300,CONT_VIA,966nymous_ ++B 7600,23000,300,300,CONT_DIF_N,1020ymous_ ++B 18800,9000,300,300,CONT_DIF_N,1342ymous_ ++B 17400,11800,300,300,CONT_POLY,1288ymous_ ++B 20800,34400,300,300,CONT_BODY_P,374nymous_ ++B 8600,31000,300,300,CONT_VIA2,1074ymous_ ++B 10800,23000,300,300,CONT_DIF_N,1128ymous_ ++B 24000,35800,300,300,CONT_POLY,428nymous_ ++B 29600,35000,300,300,CONT_VIA2,589nymous_ ++B 28000,20400,300,300,CONT_DIF_P,536nymous_ ++B 26000,33600,300,300,CONT_DIF_P,482nymous_ ++B 31000,19200,300,300,CONT_BODY_N,643nymous_ ++B 32800,20200,300,300,CONT_POLY,697nymous_ ++B 33800,35000,300,300,CONT_VIA2,751nymous_ ++B 36000,20200,300,300,CONT_POLY,805nymous_ ++B 37000,30000,300,300,CONT_VIA,859nymous_ ++B 4400,26000,300,300,CONT_VIA,913nymous_ ++B 15600,19200,300,300,CONT_BODY_P,1235ymous_ ++B 5600,6000,300,300,CONT_VIA2,967nymous_ ++B 7600,23000,300,300,CONT_VIA,1021ymous_ ++B 18800,16000,300,300,CONT_BODY_N,1343ymous_ ++B 17600,6000,300,300,CONT_BODY_P,1289ymous_ ++B 24000,35800,300,300,CONT_VIA,429nymous_ ++B 20800,35400,300,300,CONT_BODY_P,375nymous_ ++B 29600,7000,300,300,CONT_DIF_N,590nymous_ ++B 8600,32000,300,300,CONT_VIA2,1075ymous_ ++B 10800,24000,300,300,CONT_DIF_N,1129ymous_ ++B 28000,21600,300,300,CONT_DIF_P,537nymous_ ++B 26000,33600,300,300,CONT_VIA,483nymous_ ++B 31600,20200,300,300,CONT_POLY,644nymous_ ++B 32800,22000,300,300,CONT_VIA2,698nymous_ ++B 33800,36000,300,300,CONT_DIF_P,752nymous_ ++B 36000,22000,300,300,CONT_VIA2,806nymous_ ++B 37000,31000,300,300,CONT_DIF_P,860nymous_ ++B 4400,26000,300,300,CONT_VIA2,914nymous_ ++B 5600,8000,300,300,CONT_DIF_N,968nymous_ ++B 17600,6000,300,300,CONT_VIA,1290ymous_ ++B 15800,27000,300,300,CONT_VIA2,1236ymous_ ++B 7600,24000,300,300,CONT_DIF_N,1022ymous_ ++B 18800,17000,300,300,CONT_VIA,1344ymous_ ++B 20800,36400,300,300,CONT_BODY_P,376nymous_ ++B 14000,21800,300,300,CONT_VIA,1182ymous_ ++B 8600,36000,300,300,CONT_VIA2,1076ymous_ ++B 24000,37600,300,300,CONT_BODY_N,430nymous_ ++B 29600,10600,300,300,CONT_POLY,591nymous_ ++B 10800,25000,300,300,CONT_DIF_N,1130ymous_ ++B 28000,22800,300,300,CONT_DIF_P,538nymous_ ++B 26000,35000,300,300,CONT_DIF_P,484nymous_ ++B 31600,22000,300,300,CONT_VIA2,645nymous_ ++B 32800,23000,300,300,CONT_VIA2,699nymous_ ++B 33800,36000,300,300,CONT_VIA,753nymous_ ++B 36000,23000,300,300,CONT_VIA2,807nymous_ ++B 37000,31000,300,300,CONT_VIA,861nymous_ ++B 4400,27000,300,300,CONT_DIF_N,915nymous_ ++B 5600,9000,300,300,CONT_DIF_N,969nymous_ ++B 17600,6000,300,300,CONT_VIA2,1291ymous_ ++B 15800,28000,300,300,CONT_VIA2,1237ymous_ ++B 20800,37600,300,300,CONT_BODY_P,377nymous_ ++B 7600,24000,300,300,CONT_VIA,1023ymous_ ++B 8600,19200,300,300,CONT_BODY_P,1077ymous_ ++B 18800,17000,300,300,CONT_VIA2,1345ymous_ ++B 26000,36400,300,300,CONT_DIF_P,485nymous_ ++B 24000,19200,300,300,CONT_BODY_N,431nymous_ ++B 29600,10600,300,300,CONT_VIA,592nymous_ ++B 31600,23000,300,300,CONT_VIA2,646nymous_ ++B 10800,26000,300,300,CONT_DIF_N,1131ymous_ ++B 28000,24000,300,300,CONT_DIF_P,539nymous_ ++B 32800,27000,300,300,CONT_VIA2,700nymous_ ++B 34000,19200,300,300,CONT_BODY_N,754nymous_ ++B 36000,27000,300,300,CONT_VIA2,808nymous_ ++B 37000,32000,300,300,CONT_DIF_P,862nymous_ ++B 4400,27000,300,300,CONT_VIA,916nymous_ ++B 14000,23000,300,300,CONT_DIF_N,1184ymous_ ++B 14000,21800,300,300,CONT_VIA2,1183ymous_ ++B 13600,19200,300,300,CONT_BODY_P,1180ymous_ ++B 15800,29000,300,300,CONT_VIA2,1238ymous_ ++B 5600,11800,300,300,CONT_DIF_P,970nymous_ ++B 7600,24000,300,300,CONT_VIA2,1024ymous_ ++B 19600,19200,300,300,CONT_BODY_P,1346ymous_ ++B 17600,8600,300,300,CONT_DIF_N,1292ymous_ ++B 20800,19200,300,300,CONT_BODY_P,378nymous_ ++B 8800,37600,300,300,CONT_BODY_P,1078ymous_ ++B 10800,27000,300,300,CONT_DIF_N,1132ymous_ ++B 26000,37600,300,300,CONT_BODY_N,486nymous_ ++B 24800,6000,300,300,CONT_BODY_P,432nymous_ ++B 29600,13000,300,300,CONT_DIF_P,593nymous_ ++B 31600,27000,300,300,CONT_VIA2,647nymous_ ++B 32800,28000,300,300,CONT_VIA2,701nymous_ ++B 3400,24000,300,300,CONT_VIA2,755nymous_ ++B 36000,28000,300,300,CONT_VIA2,809nymous_ ++B 37000,32000,300,300,CONT_VIA,863nymous_ ++B 4400,28000,300,300,CONT_DIF_N,917nymous_ ++B 15800,37600,300,300,CONT_BODY_P,1239ymous_ ++B 14000,24000,300,300,CONT_DIF_N,1185ymous_ ++B 5600,12800,300,300,CONT_DIF_P,971nymous_ ++B 7600,25000,300,300,CONT_DIF_N,1025ymous_ ++B 19800,22600,300,300,CONT_POLY,1347ymous_ ++B 17600,12800,300,300,CONT_DIF_P,1293ymous_ ++B 24800,6000,300,300,CONT_VIA,433nymous_ ++B 21200,6000,300,300,CONT_BODY_P,379nymous_ ++B 29600,14000,300,300,CONT_DIF_P,594nymous_ ++B 8800,37600,300,300,CONT_VIA,1079ymous_ ++B 10800,28000,300,300,CONT_DIF_N,1133ymous_ ++B 14000,21800,300,300,CONT_POLY,1181ymous_ ++B 26000,6000,300,300,CONT_BODY_P,487nymous_ ++B 31600,28000,300,300,CONT_VIA2,648nymous_ ++B 32800,29000,300,300,CONT_VIA2,702nymous_ ++B 3400,25000,300,300,CONT_VIA2,756nymous_ ++B 36000,29000,300,300,CONT_VIA2,810nymous_ ++B 37000,33000,300,300,CONT_DIF_P,864nymous_ ++B 14000,25000,300,300,CONT_DIF_N,1186ymous_ ++B 4400,28000,300,300,CONT_VIA,918nymous_ ++B 5600,13800,300,300,CONT_DIF_P,972nymous_ ++B 17600,16000,300,300,CONT_BODY_N,1294ymous_ ++B 1600,20400,300,300,CONT_BODY_P,1240ymous_ ++B 7600,25000,300,300,CONT_VIA,1026ymous_ ++B 8800,37600,300,300,CONT_VIA2,1080ymous_ ++B 19800,26200,300,300,CONT_POLY,1348ymous_ ++B 24800,6000,300,300,CONT_VIA2,434nymous_ ++B 21200,6000,300,300,CONT_VIA,380nymous_ ++B 29600,16000,300,300,CONT_BODY_N,595nymous_ ++B 10800,29000,300,300,CONT_DIF_N,1134ymous_ ++B 26000,6000,300,300,CONT_VIA,488nymous_ ++B 31600,29000,300,300,CONT_VIA2,649nymous_ ++B 32800,33000,300,300,CONT_VIA2,703nymous_ ++B 3400,26000,300,300,CONT_VIA2,757nymous_ ++B 36000,33000,300,300,CONT_VIA2,811nymous_ ++B 37000,33000,300,300,CONT_VIA,865nymous_ ++B 14000,26000,300,300,CONT_DIF_N,1187ymous_ ++B 4400,29000,300,300,CONT_DIF_N,919nymous_ ++B 5600,16000,300,300,CONT_BODY_N,973nymous_ ++B 17600,17000,300,300,CONT_VIA,1295ymous_ ++B 1600,21400,300,300,CONT_BODY_P,1241ymous_ ++B 21200,6000,300,300,CONT_VIA2,381nymous_ ++B 7600,25000,300,300,CONT_VIA2,1027ymous_ ++B 9200,23000,300,300,CONT_DIF_N,1081ymous_ ++B 19800,27400,300,300,CONT_POLY,1349ymous_ ++B 24800,8000,300,300,CONT_DIF_N,435nymous_ ++B 26000,6000,300,300,CONT_VIA2,489nymous_ ++B 29600,17000,300,300,CONT_VIA,596nymous_ ++B 31600,33000,300,300,CONT_VIA2,650nymous_ ++B 10800,30000,300,300,CONT_DIF_N,1135ymous_ ++B 32800,34000,300,300,CONT_VIA2,704nymous_ ++B 3400,30000,300,300,CONT_VIA2,758nymous_ ++B 36000,34000,300,300,CONT_VIA2,812nymous_ ++B 37000,33000,300,300,CONT_VIA2,866nymous_ ++B 4400,29000,300,300,CONT_VIA,920nymous_ ++B 1600,22400,300,300,CONT_BODY_P,1242ymous_ ++B 14000,27000,300,300,CONT_DIF_N,1188ymous_ ++B 5600,17000,300,300,CONT_VIA,974nymous_ ++B 7600,26000,300,300,CONT_DIF_N,1028ymous_ ++B 19800,28200,300,300,CONT_VIA,1350ymous_ ++B 17600,17000,300,300,CONT_VIA2,1296ymous_ ++B 21200,9000,300,300,CONT_DIF_N,382nymous_ ++B 28000,28800,300,300,CONT_DIF_P,543nymous_ ++B 9200,24000,300,300,CONT_DIF_N,1082ymous_ ++B 10800,31000,300,300,CONT_DIF_N,1136ymous_ ++B 26000,8000,300,300,CONT_DIF_N,490nymous_ ++B 24800,13000,300,300,CONT_DIF_P,436nymous_ ++B 29600,17000,300,300,CONT_VIA2,597nymous_ ++B 31600,34000,300,300,CONT_VIA2,651nymous_ ++B 32800,35000,300,300,CONT_VIA2,705nymous_ ++B 3400,31000,300,300,CONT_VIA2,759nymous_ ++B 36000,35000,300,300,CONT_VIA2,813nymous_ ++B 37000,34000,300,300,CONT_DIF_P,867nymous_ ++B 4400,30000,300,300,CONT_DIF_N,921nymous_ ++B 14000,28000,300,300,CONT_DIF_N,1189ymous_ ++B 5600,17000,300,300,CONT_VIA2,975nymous_ ++B 7600,26000,300,300,CONT_VIA,1029ymous_ ++B 28000,27600,300,300,CONT_DIF_P,542nymous_ ++B 1600,23400,300,300,CONT_BODY_P,1243ymous_ ++B 19800,31000,300,300,CONT_POLY,1351ymous_ ++B 17600,19200,300,300,CONT_BODY_P,1297ymous_ ++B 24800,13000,300,300,CONT_VIA,437nymous_ ++B 21200,16000,300,300,CONT_BODY_N,383nymous_ ++B 28000,30000,300,300,CONT_DIF_P,544nymous_ ++B 30000,0,300,300,CONT_VIA2,598nymous_ ++B 9200,25000,300,300,CONT_DIF_N,1083ymous_ ++B 10800,32000,300,300,CONT_DIF_N,1137ymous_ ++B 26000,12000,300,300,CONT_VIA2,491nymous_ ++B 31600,35000,300,300,CONT_VIA2,652nymous_ ++B 33000,19200,300,300,CONT_BODY_N,706nymous_ ++B 3400,32000,300,300,CONT_VIA2,760nymous_ ++B 36000,19200,300,300,CONT_BODY_N,814nymous_ ++B 37000,34000,300,300,CONT_VIA,868nymous_ ++B 14000,29000,300,300,CONT_DIF_N,1190ymous_ ++B 4400,30000,300,300,CONT_VIA,922nymous_ ++B 5600,19200,300,300,CONT_BODY_P,976nymous_ ++B 17800,23200,300,300,CONT_DIF_N,1298ymous_ ++B 1600,24400,300,300,CONT_BODY_P,1244ymous_ ++B 7600,26000,300,300,CONT_VIA2,1030ymous_ ++B 9200,26000,300,300,CONT_DIF_N,1084ymous_ ++B 19800,35200,300,300,CONT_VIA,1352ymous_ ++B 24800,14000,300,300,CONT_DIF_P,438nymous_ ++B 22000,22200,300,300,CONT_VIA,384nymous_ ++B 28000,31200,300,300,CONT_DIF_P,545nymous_ ++B 30000,0,300,300,CONT_VIA3,599nymous_ ++B 10800,33000,300,300,CONT_DIF_N,1138ymous_ ++B 26000,13000,300,300,CONT_DIF_P,492nymous_ ++B 31800,9000,300,300,CONT_POLY,653nymous_ ++B 33200,6000,300,300,CONT_BODY_P,707nymous_ ++B 3400,36000,300,300,CONT_VIA2,761nymous_ ++B 3600,37600,300,300,CONT_BODY_P,815nymous_ ++B 37000,34000,300,300,CONT_VIA2,869nymous_ ++B 14000,30000,300,300,CONT_DIF_N,1191ymous_ ++B 4400,30000,300,300,CONT_VIA2,923nymous_ ++B 6000,23000,300,300,CONT_DIF_N,977nymous_ ++B 17800,23200,300,300,CONT_VIA,1299ymous_ ++B 1600,25400,300,300,CONT_BODY_P,1245ymous_ ++B 22000,19200,300,300,CONT_VIA,385nymous_ ++B 28000,31200,300,300,CONT_VIA,546nymous_ ++B 7600,27000,300,300,CONT_DIF_N,1031ymous_ ++B 9200,27000,300,300,CONT_DIF_N,1085ymous_ ++B 19800,37600,300,300,CONT_BODY_P,1353ymous_ ++B 26000,13000,300,300,CONT_VIA2,493nymous_ ++B 24800,14000,300,300,CONT_VIA,439nymous_ ++B 30000,0,300,300,CONT_VIA4,600nymous_ ++B 31800,12200,300,300,CONT_POLY,654nymous_ ++B 10800,34000,300,300,CONT_DIF_N,1139ymous_ ++B 33200,6000,300,300,CONT_VIA,708nymous_ ++B 34400,6000,300,300,CONT_BODY_P,762nymous_ ++B 3600,37600,300,300,CONT_VIA,816nymous_ ++B 37000,35000,300,300,CONT_DIF_P,870nymous_ ++B 4400,31000,300,300,CONT_DIF_N,924nymous_ ++B 1600,26400,300,300,CONT_BODY_P,1246ymous_ ++B 14000,31000,300,300,CONT_DIF_N,1192ymous_ ++B 6000,24000,300,300,CONT_DIF_N,978nymous_ ++B 7600,27000,300,300,CONT_VIA,1032ymous_ ++B 17800,24400,300,300,CONT_DIF_N,1300ymous_ ++B 22400,6000,300,300,CONT_BODY_P,386nymous_ ++B 28000,32400,300,300,CONT_DIF_P,547nymous_ ++B 9200,28000,300,300,CONT_DIF_N,1086ymous_ ++B 24800,16000,300,300,CONT_BODY_N,440nymous_ ++B 10800,35000,300,300,CONT_DIF_N,1140ymous_ ++B 26000,14000,300,300,CONT_DIF_P,494nymous_ ++B 30000,20200,300,300,CONT_VIA,601nymous_ ++B 32000,6000,300,300,CONT_BODY_P,655nymous_ ++B 33200,6000,300,300,CONT_VIA2,709nymous_ ++B 34400,6000,300,300,CONT_VIA,763nymous_ ++B 3600,37600,300,300,CONT_VIA2,817nymous_ ++B 37000,35000,300,300,CONT_VIA,871nymous_ ++B 4400,31000,300,300,CONT_VIA,925nymous_ ++B 1600,27400,300,300,CONT_BODY_P,1247ymous_ ++B 14000,32000,300,300,CONT_DIF_N,1193ymous_ ++B 6000,25000,300,300,CONT_DIF_N,979nymous_ ++B 7600,28000,300,300,CONT_DIF_N,1033ymous_ ++B 17800,24400,300,300,CONT_VIA2,1301ymous_ ++B 25000,20400,300,300,CONT_DIF_P,441nymous_ ++B 22400,6000,300,300,CONT_VIA,387nymous_ ++B 28000,33600,300,300,CONT_DIF_P,548nymous_ ++B 30000,19200,300,300,CONT_BODY_N,602nymous_ ++B 9200,29000,300,300,CONT_DIF_N,1087ymous_ ++B 10800,36000,300,300,CONT_DIF_N,1141ymous_ ++B 26000,14000,300,300,CONT_VIA2,495nymous_ ++B 32000,6000,300,300,CONT_VIA,656nymous_ ++B 33200,8000,300,300,CONT_DIF_N,710nymous_ ++B 34400,6000,300,300,CONT_VIA2,764nymous_ ++B 3600,19200,300,300,CONT_BODY_P,818nymous_ ++B 37000,35000,300,300,CONT_VIA2,872nymous_ ++B 14000,33000,300,300,CONT_DIF_N,1194ymous_ ++B 4400,31000,300,300,CONT_VIA2,926nymous_ ++B 6000,26000,300,300,CONT_DIF_N,980nymous_ ++B 1600,28400,300,300,CONT_BODY_P,1248ymous_ ++B 7600,28000,300,300,CONT_VIA,1034ymous_ ++B 17800,25600,300,300,CONT_DIF_N,1302ymous_ ++B 9200,30000,300,300,CONT_DIF_N,1088ymous_ ++B 25000,20400,300,300,CONT_VIA,442nymous_ ++B 22400,6000,300,300,CONT_VIA2,388nymous_ ++B 28000,35000,300,300,CONT_DIF_P,549nymous_ ++B 30400,36600,300,300,CONT_POLY,603nymous_ ++B 11600,6000,300,300,CONT_BODY_P,1142ymous_ ++B 26000,16000,300,300,CONT_BODY_N,496nymous_ ++B 32000,6000,300,300,CONT_VIA2,657nymous_ ++B 33200,13000,300,300,CONT_DIF_P,711nymous_ ++B 34400,8000,300,300,CONT_DIF_N,765nymous_ ++B 36800,6000,300,300,CONT_BODY_P,819nymous_ ++B 37000,36000,300,300,CONT_DIF_P,873nymous_ ++B 14000,34000,300,300,CONT_DIF_N,1195ymous_ ++B 4400,32000,300,300,CONT_DIF_N,927nymous_ ++B 6000,27000,300,300,CONT_DIF_N,981nymous_ ++B 17800,25600,300,300,CONT_VIA,1303ymous_ ++B 1600,29400,300,300,CONT_BODY_P,1249ymous_ ++B 22400,8600,300,300,CONT_DIF_N,389nymous_ ++B 28000,19200,300,300,CONT_BODY_N,550nymous_ ++B 7600,29000,300,300,CONT_DIF_N,1035ymous_ ++B 9200,31000,300,300,CONT_DIF_N,1089ymous_ ++B 26000,17000,300,300,CONT_VIA,497nymous_ ++B 25000,21600,300,300,CONT_DIF_P,443nymous_ ++B 30400,36600,300,300,CONT_VIA,604nymous_ ++B 32000,8000,300,300,CONT_DIF_N,658nymous_ ++B 11600,6000,300,300,CONT_VIA,1143ymous_ ++B 33200,14000,300,300,CONT_DIF_P,712nymous_ ++B 34400,13000,300,300,CONT_DIF_P,766nymous_ ++B 36800,6000,300,300,CONT_VIA,820nymous_ ++B 37000,36000,300,300,CONT_VIA,874nymous_ ++B 4400,32000,300,300,CONT_VIA,928nymous_ ++B 1600,30400,300,300,CONT_BODY_P,1250ymous_ ++B 14000,35000,300,300,CONT_DIF_N,1196ymous_ ++B 6000,28000,300,300,CONT_DIF_N,982nymous_ ++B 7600,29000,300,300,CONT_VIA,1036ymous_ ++B 17800,25600,300,300,CONT_VIA2,1304ymous_ ++B 22400,16000,300,300,CONT_BODY_N,390nymous_ ++B 2800,23000,300,300,CONT_DIF_N,551nymous_ ++B 9200,32000,300,300,CONT_DIF_N,1090ymous_ ++B 11600,6000,300,300,CONT_VIA2,1144ymous_ ++B 26000,17000,300,300,CONT_VIA2,498nymous_ ++B 25000,22800,300,300,CONT_DIF_P,444nymous_ ++B 30400,36600,300,300,CONT_VIA2,605nymous_ ++B 32000,13000,300,300,CONT_DIF_P,659nymous_ ++B 33200,16000,300,300,CONT_BODY_N,713nymous_ ++B 34400,13000,300,300,CONT_VIA,767nymous_ ++B 36800,6000,300,300,CONT_VIA2,821nymous_ ++B 37000,19200,300,300,CONT_BODY_N,875nymous_ ++B 4400,32000,300,300,CONT_VIA2,929nymous_ ++B 1600,31400,300,300,CONT_BODY_P,1251ymous_ ++B 14000,36000,300,300,CONT_DIF_N,1197ymous_ ++B 6000,29000,300,300,CONT_DIF_N,983nymous_ ++B 7600,30000,300,300,CONT_DIF_N,1037ymous_ ++B 17800,26800,300,300,CONT_DIF_N,1305ymous_ ++B 22400,17000,300,300,CONT_VIA,391nymous_ ++B 2800,24000,300,300,CONT_DIF_N,552nymous_ ++B 9200,33000,300,300,CONT_DIF_N,1091ymous_ ++B 11600,8000,300,300,CONT_DIF_N,1145ymous_ ++B 26000,19200,300,300,CONT_BODY_N,499nymous_ ++B 25000,22800,300,300,CONT_VIA,445nymous_ ++B 30600,22000,300,300,CONT_DIF_P,606nymous_ ++B 32000,16000,300,300,CONT_BODY_N,660nymous_ ++B 33200,17000,300,300,CONT_VIA,714nymous_ ++B 34400,14000,300,300,CONT_DIF_P,768nymous_ ++B 36800,7000,300,300,CONT_BODY_P,822nymous_ ++B 37200,37600,300,300,CONT_BODY_N,876nymous_ ++B 14000,6000,300,300,CONT_BODY_P,1198ymous_ ++B 4400,33000,300,300,CONT_DIF_N,930nymous_ ++B 6000,30000,300,300,CONT_DIF_N,984nymous_ ++B 17800,28000,300,300,CONT_DIF_N,1306ymous_ ++B 1600,32400,300,300,CONT_BODY_P,1252ymous_ ++B 7600,30000,300,300,CONT_VIA,1038ymous_ ++B 9200,34000,300,300,CONT_DIF_N,1092ymous_ ++B 25000,24000,300,300,CONT_DIF_P,446nymous_ ++B 22400,17000,300,300,CONT_VIA2,392nymous_ ++B 2800,25000,300,300,CONT_DIF_N,553nymous_ ++B 30600,23000,300,300,CONT_DIF_P,607nymous_ ++B 11600,9000,300,300,CONT_DIF_N,1146ymous_ ++B 2600,37600,300,300,CONT_BODY_P,500nymous_ ++B 32000,17000,300,300,CONT_VIA,661nymous_ ++B 33200,17000,300,300,CONT_VIA2,715nymous_ ++B 34400,14000,300,300,CONT_VIA,769nymous_ ++B 36800,8000,300,300,CONT_BODY_P,823nymous_ ++B 38000,27000,300,300,CONT_VIA2,877nymous_ ++B 14000,6000,300,300,CONT_VIA,1199ymous_ ++B 4400,33000,300,300,CONT_VIA,931nymous_ ++B 6000,31000,300,300,CONT_DIF_N,985nymous_ ++B 1600,33400,300,300,CONT_BODY_P,1253ymous_ ++B 7600,30000,300,300,CONT_VIA2,1039ymous_ ++B 9200,35000,300,300,CONT_DIF_N,1093ymous_ ++B 17800,28000,300,300,CONT_VIA,1307ymous_ ++B 23000,20400,300,300,CONT_BODY_N,393nymous_ ++B 2800,26000,300,300,CONT_DIF_N,554nymous_ ++B 2600,19200,300,300,CONT_BODY_P,501nymous_ ++B 25000,25200,300,300,CONT_DIF_P,447nymous_ ++B 30600,24000,300,300,CONT_DIF_P,608nymous_ ++B 32000,17000,300,300,CONT_VIA2,662nymous_ ++B 11600,11800,300,300,CONT_DIF_P,1147ymous_ ++B 33800,22000,300,300,CONT_DIF_P,716nymous_ ++B 34400,16000,300,300,CONT_BODY_N,770nymous_ ++B 36800,9000,300,300,CONT_BODY_P,824nymous_ ++B 38000,28000,300,300,CONT_VIA2,878nymous_ ++B 4400,34000,300,300,CONT_DIF_N,932nymous_ ++B 1600,34400,300,300,CONT_BODY_P,1254ymous_ ++B 14000,6000,300,300,CONT_VIA2,1200ymous_ ++B 6000,32000,300,300,CONT_DIF_N,986nymous_ ++B 7600,31000,300,300,CONT_DIF_N,1040ymous_ ++B 17800,29200,300,300,CONT_DIF_N,1308ymous_ ++B 23000,21400,300,300,CONT_BODY_N,394nymous_ ++B 2800,27000,300,300,CONT_DIF_N,555nymous_ ++B 9200,36000,300,300,CONT_DIF_N,1094ymous_ ++B 11600,12800,300,300,CONT_DIF_P,1148ymous_ ++B 27000,20400,300,300,CONT_DIF_P,502nymous_ ++B 25000,26400,300,300,CONT_DIF_P,448nymous_ ++B 30600,25000,300,300,CONT_DIF_P,609nymous_ ++B 32000,19200,300,300,CONT_BODY_N,663nymous_ ++B 33800,22000,300,300,CONT_VIA,717nymous_ ++B 34800,20200,300,300,CONT_POLY,771nymous_ ++B 36800,9000,300,300,CONT_VIA2,825nymous_ ++B 38000,29000,300,300,CONT_VIA2,879nymous_ ++B 4400,34000,300,300,CONT_VIA,933nymous_ ++B 1600,35400,300,300,CONT_BODY_P,1255ymous_ ++B 14000,7200,300,300,CONT_DIF_N,1201ymous_ ++B 6000,33000,300,300,CONT_DIF_N,987nymous_ ++B 7600,31000,300,300,CONT_VIA,1041ymous_ ++B 17800,30400,300,300,CONT_DIF_N,1309ymous_ ++B 25000,27600,300,300,CONT_DIF_P,449nymous_ ++B 23000,22400,300,300,CONT_BODY_N,395nymous_ ++B 2800,28000,300,300,CONT_DIF_N,556nymous_ ++B 30600,26000,300,300,CONT_DIF_P,610nymous_ ++B 9200,6000,300,300,CONT_BODY_P,1095ymous_ ++B 11600,13800,300,300,CONT_DIF_P,1149ymous_ ++B 27000,21600,300,300,CONT_DIF_P,503nymous_ ++B 3200,6000,300,300,CONT_BODY_P,664nymous_ ++B 33800,22000,300,300,CONT_VIA2,718nymous_ ++B 34800,22000,300,300,CONT_VIA2,772nymous_ ++B 36800,10000,300,300,CONT_VIA2,826nymous_ ++B 38000,33000,300,300,CONT_VIA2,880nymous_ ++B 14000,8000,300,300,CONT_DIF_N,1202ymous_ ++B 4400,35000,300,300,CONT_DIF_N,934nymous_ ++B 6000,34000,300,300,CONT_DIF_N,988nymous_ ++B 17800,30400,300,300,CONT_VIA,1310ymous_ ++B 1600,36400,300,300,CONT_BODY_P,1256ymous_ ++B 7600,31000,300,300,CONT_VIA2,1042ymous_ ++B 9200,6000,300,300,CONT_VIA,1096ymous_ ++B 25000,27600,300,300,CONT_VIA,450nymous_ ++B 23000,23400,300,300,CONT_BODY_N,396nymous_ ++B 2800,29000,300,300,CONT_DIF_N,557nymous_ ++B 11600,14800,300,300,CONT_DIF_P,1150ymous_ ++B 27000,22800,300,300,CONT_DIF_P,504nymous_ ++B 30600,27000,300,300,CONT_DIF_P,611nymous_ ++B 3200,6000,300,300,CONT_VIA,665nymous_ ++B 33800,23000,300,300,CONT_DIF_P,719nymous_ ++B 34800,23000,300,300,CONT_VIA2,773nymous_ ++B 36800,11000,300,300,CONT_VIA2,827nymous_ ++B 38000,34000,300,300,CONT_VIA2,881nymous_ ++B 14000,10000,300,300,CONT_POLY,1203ymous_ ++B 4400,35000,300,300,CONT_VIA,935nymous_ ++B 6000,35000,300,300,CONT_DIF_N,989nymous_ ++B 17800,30400,300,300,CONT_VIA2,1311ymous_ ++B 1600,37600,300,300,CONT_BODY_P,1257ymous_ ++B 23000,24400,300,300,CONT_BODY_N,397nymous_ ++B 2800,30000,300,300,CONT_DIF_N,558nymous_ ++B 7600,32000,300,300,CONT_DIF_N,1043ymous_ ++B 9200,6000,300,300,CONT_VIA2,1097ymous_ ++B 27000,24000,300,300,CONT_DIF_P,505nymous_ ++B 25000,28800,300,300,CONT_DIF_P,451nymous_ ++B 30600,27000,300,300,CONT_VIA,612nymous_ ++B 3200,6000,300,300,CONT_VIA2,666nymous_ ++B 11600,16000,300,300,CONT_BODY_N,1151ymous_ ++B 33800,23000,300,300,CONT_VIA,720nymous_ ++B 34800,27000,300,300,CONT_VIA2,774nymous_ ++B 36800,12000,300,300,CONT_BODY_N,828nymous_ ++B 38000,35000,300,300,CONT_VIA2,882nymous_ ++B 4400,36000,300,300,CONT_DIF_N,936nymous_ ++B 1600,19200,300,300,CONT_BODY_P,1258ymous_ ++B 14000,12000,300,300,CONT_DIF_P,1204ymous_ ++B 6000,36000,300,300,CONT_DIF_N,990nymous_ ++B 7600,32000,300,300,CONT_VIA,1044ymous_ ++B 17800,31600,300,300,CONT_DIF_N,1312ymous_ ++B 9200,7000,300,300,CONT_VIA2,1098ymous_ ++B 4400,36000,300,300,CONT_VIA2,938nymous_ ++B 38200,21400,300,300,CONT_BODY_N,884nymous_ ++B 36800,14000,300,300,CONT_BODY_N,830nymous_ ++B 34800,29000,300,300,CONT_VIA2,776nymous_ ++B 33800,24000,300,300,CONT_DIF_P,722nymous_ ++B 3200,7000,300,300,CONT_VIA2,668nymous_ ++B 27000,25200,300,300,CONT_VIA,507nymous_ ++B 11600,17000,300,300,CONT_VIA2,1153ymous_ ++B 9200,7200,300,300,CONT_DIF_N,1099ymous_ ++B 30600,28000,300,300,CONT_DIF_P,614nymous_ ++B 2800,32000,300,300,CONT_DIF_N,560nymous_ ++B 23000,26400,300,300,CONT_BODY_N,399nymous_ ++B 25000,30000,300,300,CONT_VIA,453nymous_ ++B 17800,31600,300,300,CONT_VIA2,1313ymous_ ++B 7600,32000,300,300,CONT_VIA2,1045ymous_ ++B 6600,24000,300,300,CONT_VIA2,991nymous_ ++B 14000,12800,300,300,CONT_DIF_P,1205ymous_ ++B 16400,6000,300,300,CONT_BODY_P,1259ymous_ ++B 4400,36000,300,300,CONT_VIA,937nymous_ ++B 38200,20400,300,300,CONT_BODY_N,883nymous_ ++B 36800,13000,300,300,CONT_BODY_N,829nymous_ ++B 34800,28000,300,300,CONT_VIA2,775nymous_ ++B 33800,23000,300,300,CONT_VIA2,721nymous_ ++B 3200,7000,300,300,CONT_BODY_P,667nymous_ ++B 30600,27000,300,300,CONT_VIA2,613nymous_ ++B 23000,25400,300,300,CONT_BODY_N,398nymous_ ++B 2800,31000,300,300,CONT_DIF_N,559nymous_ ++B 11600,17000,300,300,CONT_VIA,1152ymous_ ++B 27000,25200,300,300,CONT_DIF_P,506nymous_ ++B 25000,30000,300,300,CONT_DIF_P,452nymous_ ++B 12400,23000,300,300,CONT_DIF_N,1155ymous_ ++B 30600,28000,300,300,CONT_VIA2,616nymous_ ++B 25000,32400,300,300,CONT_DIF_P,455nymous_ ++B 9200,8000,300,300,CONT_VIA2,1101ymous_ ++B 7600,33000,300,300,CONT_VIA,1047ymous_ ++B 2800,34000,300,300,CONT_DIF_N,562nymous_ ++B 23000,28400,300,300,CONT_BODY_N,401nymous_ ++B 16400,6000,300,300,CONT_VIA2,1261ymous_ ++B 17800,34000,300,300,CONT_DIF_N,1315ymous_ ++B 6600,26000,300,300,CONT_VIA2,993nymous_ ++B 4400,6000,300,300,CONT_BODY_P,939nymous_ ++B 14000,17000,300,300,CONT_VIA,1207ymous_ ++B 38200,22400,300,300,CONT_BODY_N,885nymous_ ++B 36800,15000,300,300,CONT_BODY_N,831nymous_ ++B 34800,33000,300,300,CONT_VIA2,777nymous_ ++B 33800,24000,300,300,CONT_VIA,723nymous_ ++B 3200,8000,300,300,CONT_BODY_P,669nymous_ ++B 27000,26400,300,300,CONT_DIF_P,508nymous_ ++B 11600,19200,300,300,CONT_BODY_P,1154ymous_ ++B 30600,28000,300,300,CONT_VIA,615nymous_ ++B 2800,33000,300,300,CONT_DIF_N,561nymous_ ++B 23000,27400,300,300,CONT_BODY_N,400nymous_ ++B 25000,31200,300,300,CONT_DIF_P,454nymous_ ++B 9200,8000,300,300,CONT_DIF_N,1100ymous_ ++B 7600,33000,300,300,CONT_DIF_N,1046ymous_ ++B 16400,6000,300,300,CONT_VIA,1260ymous_ ++B 17800,32800,300,300,CONT_DIF_N,1314ymous_ ++B 6600,25000,300,300,CONT_VIA2,992nymous_ ++B 14000,16000,300,300,CONT_BODY_N,1206ymous_ ++B 33800,28000,300,300,CONT_DIF_P,731nymous_ ++B 30600,29000,300,300,CONT_DIF_P,617nymous_ ++B 25000,32400,300,300,CONT_VIA,456nymous_ ++B 27000,28800,300,300,CONT_DIF_P,510nymous_ ++B 12400,24000,300,300,CONT_DIF_N,1156ymous_ ++B 9200,10000,300,300,CONT_POLY,1102ymous_ ++B 2800,35000,300,300,CONT_DIF_N,563nymous_ ++B 23000,29400,300,300,CONT_BODY_N,402nymous_ ++B 17800,35200,300,300,CONT_DIF_N,1316ymous_ ++B 7600,34000,300,300,CONT_DIF_N,1048ymous_ ++B 6600,30000,300,300,CONT_VIA2,994nymous_ ++B 14000,17000,300,300,CONT_VIA2,1208ymous_ ++B 16400,8000,300,300,CONT_DIF_N,1262ymous_ ++B 4400,6000,300,300,CONT_VIA,940nymous_ ++B 38200,23400,300,300,CONT_BODY_N,886nymous_ ++B 36800,15000,300,300,CONT_VIA2,832nymous_ ++B 34800,34000,300,300,CONT_VIA2,778nymous_ ++B 33800,25000,300,300,CONT_DIF_P,724nymous_ ++B 3200,8000,300,300,CONT_VIA2,670nymous_ ++B 27000,27600,300,300,CONT_DIF_P,509nymous_ ++B 12800,11600,300,300,CONT_DIF_P,1175ymous_ ++B 3200,9000,300,300,CONT_BODY_P,671nymous_ ++B 33800,25000,300,300,CONT_VIA,725nymous_ ++B 34800,35000,300,300,CONT_VIA2,779nymous_ ++B 36800,16000,300,300,CONT_BODY_N,833nymous_ ++B 38200,24400,300,300,CONT_BODY_N,887nymous_ ++B 4400,6000,300,300,CONT_VIA2,941nymous_ ++B 16400,9000,300,300,CONT_DIF_N,1263ymous_ ++B 14600,19200,300,300,CONT_BODY_P,1209ymous_ ++B 6600,31000,300,300,CONT_VIA2,995nymous_ ++B 7600,34000,300,300,CONT_VIA,1049ymous_ ++B 17800,36400,300,300,CONT_DIF_N,1317ymous_ ++B 28000,26400,300,300,CONT_DIF_P,541nymous_ ++B 25000,33600,300,300,CONT_DIF_P,457nymous_ ++B 23000,30400,300,300,CONT_BODY_N,403nymous_ ++B 2800,36000,300,300,CONT_DIF_N,564nymous_ ++B 30600,29000,300,300,CONT_VIA,618nymous_ ++B 9200,12000,300,300,CONT_DIF_P,1103ymous_ ++B 12400,25000,300,300,CONT_DIF_N,1157ymous_ ++B 27000,30000,300,300,CONT_DIF_P,511nymous_ ++B 3200,12000,300,300,CONT_BODY_N,672nymous_ ++B 33800,26000,300,300,CONT_DIF_P,726nymous_ ++B 35000,19200,300,300,CONT_BODY_N,780nymous_ ++B 36800,16000,300,300,CONT_VIA2,834nymous_ ++B 38200,25400,300,300,CONT_BODY_N,888nymous_ ++B 15200,6000,300,300,CONT_BODY_P,1210ymous_ ++B 4400,8000,300,300,CONT_DIF_N,942nymous_ ++B 6600,32000,300,300,CONT_VIA2,996nymous_ ++B 17800,37600,300,300,CONT_BODY_P,1318ymous_ ++B 16400,10000,300,300,CONT_POLY,1264ymous_ ++B 7600,35000,300,300,CONT_DIF_N,1050ymous_ ++B 9200,12800,300,300,CONT_DIF_P,1104ymous_ ++B 25000,35000,300,300,CONT_DIF_P,458nymous_ ++B 23000,31400,300,300,CONT_BODY_N,404nymous_ ++B 28200,10600,300,300,CONT_VIA,565nymous_ ++B 30600,29000,300,300,CONT_VIA2,619nymous_ ++B 12400,26000,300,300,CONT_DIF_N,1158ymous_ ++B 27000,31200,300,300,CONT_DIF_P,512nymous_ ++B 3200,12000,300,300,CONT_VIA2,673nymous_ ++B 33800,26000,300,300,CONT_VIA,727nymous_ ++B 35400,22000,300,300,CONT_DIF_P,781nymous_ ++B 36800,17000,300,300,CONT_VIA,835nymous_ ++B 20000,6000,300,300,CONT_BODY_P,354nymous_ ++B 20000,6000,300,300,CONT_VIA,355nymous_ ++B 38200,26400,300,300,CONT_BODY_N,889nymous_ ++B 15200,6000,300,300,CONT_VIA,1211ymous_ ++B 4400,9000,300,300,CONT_DIF_N,943nymous_ ++B 6600,36000,300,300,CONT_VIA2,997nymous_ ++B 18600,19200,300,300,CONT_BODY_P,1319ymous_ ++B 16400,12000,300,300,CONT_DIF_P,1265ymous_ ++B 23000,32400,300,300,CONT_BODY_N,405nymous_ ++B 28200,11800,300,300,CONT_POLY,566nymous_ ++B 7600,35000,300,300,CONT_VIA,1051ymous_ ++B 9200,13800,300,300,CONT_DIF_P,1105ymous_ ++B 27000,32400,300,300,CONT_DIF_P,513nymous_ ++B 25000,36400,300,300,CONT_DIF_P,459nymous_ ++B 30600,30000,300,300,CONT_DIF_P,620nymous_ ++B 3200,13000,300,300,CONT_BODY_N,674nymous_ ++B 12400,27000,300,300,CONT_DIF_N,1159ymous_ ++B 33800,27000,300,300,CONT_DIF_P,728nymous_ ++B 35400,23000,300,300,CONT_DIF_P,782nymous_ ++B 36800,17000,300,300,CONT_VIA2,836nymous_ ++B 38200,27400,300,300,CONT_BODY_N,890nymous_ ++B 4400,11800,300,300,CONT_DIF_P,944nymous_ ++B 16400,12800,300,300,CONT_DIF_P,1266ymous_ ++B 15200,6000,300,300,CONT_VIA2,1212ymous_ ++B 6600,19200,300,300,CONT_BODY_P,998nymous_ ++B 7600,36000,300,300,CONT_DIF_N,1052ymous_ ++B 18800,22000,300,300,CONT_DIF_N,1320ymous_ ++B 23000,33400,300,300,CONT_BODY_N,406nymous_ ++B 28400,6000,300,300,CONT_BODY_P,567nymous_ ++B 9200,14800,300,300,CONT_DIF_P,1106ymous_ ++B 12400,28000,300,300,CONT_DIF_N,1160ymous_ ++B 27000,33600,300,300,CONT_DIF_P,514nymous_ ++B 25000,37600,300,300,CONT_BODY_N,460nymous_ ++B 30600,30000,300,300,CONT_VIA,621nymous_ ++B 3200,13000,300,300,CONT_VIA2,675nymous_ ++B 33800,27000,300,300,CONT_VIA,729nymous_ ++B 35400,24000,300,300,CONT_DIF_P,783nymous_ ++B 37000,22000,300,300,CONT_DIF_P,837nymous_ ++B 38200,28400,300,300,CONT_BODY_N,891nymous_ ++B 4400,12800,300,300,CONT_DIF_P,945nymous_ ++B 16400,16000,300,300,CONT_BODY_N,1267ymous_ ++B 15200,8000,300,300,CONT_DIF_N,1213ymous_ ++B 6800,37600,300,300,CONT_BODY_P,999nymous_ ++B 7600,36000,300,300,CONT_VIA,1053ymous_ ++B 18800,22200,300,300,CONT_VIA,1321ymous_ ++B 25000,19200,300,300,CONT_BODY_N,461nymous_ ++B 23000,34400,300,300,CONT_BODY_N,407nymous_ ++B 28400,8000,300,300,CONT_DIF_N,568nymous_ ++B 30600,31000,300,300,CONT_DIF_P,622nymous_ ++B 9200,16000,300,300,CONT_BODY_N,1107ymous_ ++B 12400,29000,300,300,CONT_DIF_N,1161ymous_ ++B 27000,35000,300,300,CONT_DIF_P,515nymous_ ++B 3200,14000,300,300,CONT_BODY_N,676nymous_ ++B 33800,27000,300,300,CONT_VIA2,730nymous_ ++B 35400,25000,300,300,CONT_DIF_P,784nymous_ ++B 37000,22000,300,300,CONT_VIA,838nymous_ ++B 38200,29400,300,300,CONT_BODY_N,892nymous_ ++B 4400,13800,300,300,CONT_DIF_P,946nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pot_mpx.vbe b/alliance/src/cells/src/mpxlib/pot_mpx.vbe +new file mode 100644 +index 0000000..fd1e07a +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pot_mpx.vbe +@@ -0,0 +1,42 @@ ++ENTITY pot_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT rup : NATURAL := 684404; ++ CONSTANT rdown : NATURAL := 24 ++ ); ++ PORT ( ++ i : in BIT; ++ b : in BIT; ++ pad : out MUX_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pot_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pot_mpx IS ++ SIGNAL b1 : BIT; ++ SIGNAL b2 : BIT; ++ SIGNAL b3 : BIT; ++ SIGNAL b4 : BIT; ++ SIGNAL b5 : BIT; ++ SIGNAL b6 : BIT; ++ ++BEGIN ++ b6 <= b5; ++ b5 <= b4; ++ b4 <= b3; ++ b3 <= b2; ++ b2 <= b1; ++ b1 <= b; ++ label0 : BLOCK (b6 = '1') ++ BEGIN ++ pad <= GUARDED i; ++ END BLOCK label0; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pot_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pvdde_mpx.ap b/alliance/src/cells/src/mpxlib/pvdde_mpx.ap +new file mode 100644 +index 0000000..cc24326 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvdde_mpx.ap +@@ -0,0 +1,90 @@ ++V ALLIANCE : 6 ++H pvdde_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 31200,6000,32800,6000,12000,13onymous_,RIGHT,TALU2 ++S 7200,6000,8800,6000,12000,11onymous_,RIGHT,TALU2 ++S 50,6000,2800,6000,12000,10onymous_,RIGHT,TALU2 ++S 13200,6000,26800,6000,12000,12onymous_,RIGHT,TALU2 ++S 13200,6000,26800,6000,12000,17onymous_,RIGHT,TALU4 ++S 37200,6000,39950,6000,12000,14onymous_,RIGHT,TALU2 ++S 7200,6000,8800,6000,12000,16onymous_,RIGHT,TALU4 ++S 50,6000,2800,6000,12000,15onymous_,RIGHT,TALU4 ++S 31200,6000,32800,6000,12000,18onymous_,RIGHT,TALU4 ++S 37200,6000,39950,6000,12000,19onymous_,RIGHT,TALU4 ++S 23000,18100,23000,59900,4400,21onymous_,UP,ALU1 ++S 8000,200,8000,2000,2000,1nonymous_,UP,TALU3 ++S 1400,200,1400,2000,3000,0nonymous_,UP,TALU3 ++S 0,6000,40000,6000,12000,20onymous_,RIGHT,TALU6 ++S 20000,200,20000,2000,14000,2nonymous_,UP,TALU3 ++S 32000,200,32000,2000,2000,3nonymous_,UP,TALU3 ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 38600,200,38600,2000,3000,4nonymous_,UP,TALU3 ++S 1400,200,1400,12000,3000,5nonymous_,UP,TALU5 ++S 17000,18100,17000,59900,4400,22onymous_,UP,ALU1 ++S 20000,200,20000,12000,14000,7nonymous_,UP,TALU5 ++S 8000,200,8000,12000,2000,6nonymous_,UP,TALU5 ++S 38600,200,38600,12000,3000,9nonymous_,UP,TALU5 ++S 32000,200,32000,12000,2000,8nonymous_,UP,TALU5 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 5000,-300,5000,17300,2400,vssi,UP,CALU2 ++S 5000,-300,5000,2300,2400,vssi,UP,CALU3 ++S 5000,0,5000,2000,2400,vssi,UP,CALU5 ++S 5000,0,5000,2000,2400,vssi,UP,CALU4 ++S 29000,-300,29000,17300,2400,vssi,UP,CALU2 ++S 29000,-300,29000,2300,2400,vssi,UP,CALU3 ++S 29000,0,29000,2000,2400,vssi,UP,CALU5 ++S 29000,0,29000,2000,2400,vssi,UP,CALU4 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 11000,-300,11000,17300,2400,vddi,UP,CALU2 ++S 11000,-300,11000,2300,2400,vddi,UP,CALU3 ++S 11000,0,11000,2000,2400,vddi,UP,CALU5 ++S 11000,0,11000,2000,2400,vddi,UP,CALU4 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 35000,-300,35000,17300,2400,vddi,UP,CALU2 ++S 35000,-300,35000,2300,2400,vddi,UP,CALU3 ++S 35000,0,35000,2000,2400,vddi,UP,CALU5 ++S 35000,0,35000,2000,2400,vddi,UP,CALU4 ++S 20000,48100,20000,71900,24400,vdde,UP,CALU1 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++B 11000,16000,2300,2300,CONT_VIA2,48onymous_ ++B 17000,34000,4300,2300,CONT_VIA,53onymous_ ++B 11000,1000,2300,2300,CONT_VIA3,46onymous_ ++B 17000,28000,4300,2300,CONT_VIA,51onymous_ ++B 35000,1000,2300,2300,CONT_VIA4,37onymous_ ++B 11000,1000,2300,2300,CONT_VIA4,47onymous_ ++B 17000,28000,4300,2300,CONT_VIA2,52onymous_ ++B 35000,1000,2300,2300,CONT_VIA2,35onymous_ ++B 35000,1000,2300,2300,CONT_VIA3,36onymous_ ++B 5000,1000,2300,2300,CONT_VIA2,40onymous_ ++B 17000,34000,4300,2300,CONT_VIA2,54onymous_ ++B 17000,22000,4300,2300,CONT_VIA,49onymous_ ++B 5000,7000,2300,2300,CONT_VIA2,39onymous_ ++B 5000,1000,2300,2300,CONT_VIA3,41onymous_ ++B 35000,16000,2300,2300,CONT_VIA2,38onymous_ ++B 5000,1000,2300,2300,CONT_VIA4,42onymous_ ++B 5000,13000,2300,2300,CONT_VIA2,43onymous_ ++B 17000,22000,4300,2300,CONT_VIA2,50onymous_ ++B 23000,28000,4300,2300,CONT_VIA,25onymous_ ++B 23000,22000,4300,2300,CONT_VIA,23onymous_ ++B 23000,22000,4300,2300,CONT_VIA2,24onymous_ ++B 23000,34000,4300,2300,CONT_VIA2,28onymous_ ++B 23000,34000,4300,2300,CONT_VIA,27onymous_ ++B 23000,28000,4300,2300,CONT_VIA2,26onymous_ ++B 29000,1000,2300,2300,CONT_VIA3,31onymous_ ++B 29000,1000,2300,2300,CONT_VIA2,30onymous_ ++B 29000,7000,2300,2300,CONT_VIA2,29onymous_ ++B 29000,13000,2300,2300,CONT_VIA2,33onymous_ ++B 11000,1000,2300,2300,CONT_VIA2,45onymous_ ++B 29000,1000,2300,2300,CONT_VIA4,32onymous_ ++B 11000,10000,2300,2300,CONT_VIA2,44onymous_ ++B 35000,10000,2300,2300,CONT_VIA2,34onymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pvdde_mpx.vbe b/alliance/src/cells/src/mpxlib/pvdde_mpx.vbe +new file mode 100644 +index 0000000..43fa446 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvdde_mpx.vbe +@@ -0,0 +1,20 @@ ++ENTITY pvdde_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000 ++ ); ++ PORT ( ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvdde_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pvdde_mpx IS ++ ++BEGIN ++ ASSERT ((((not (vssi) and not (vsse)) and vddi) and vdde) = '1') ++ REPORT "power supply is missing on pvdde_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pvddeck_mpx.ap b/alliance/src/cells/src/mpxlib/pvddeck_mpx.ap +new file mode 100644 +index 0000000..a054f08 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvddeck_mpx.ap +@@ -0,0 +1,344 @@ ++V ALLIANCE : 6 ++H pvddeck_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 20000,48100,20000,71900,24400,vdde,UP,CALU1 ++S 26100,15600,31900,15600,1600,vddi,RIGHT,ALU1 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 8100,15600,13900,15600,1600,vddi,RIGHT,ALU1 ++S 35000,0,35000,2000,2400,vddi,UP,CALU4 ++S 35000,0,35000,2000,2400,vddi,UP,CALU5 ++S 35000,-300,35000,2300,2400,vddi,UP,CALU3 ++S 35000,-300,35000,17300,2400,vddi,UP,CALU2 ++S 9000,0,9000,2000,2400,vddi,UP,CALU4 ++S 9000,0,9000,2000,2400,vddi,UP,CALU5 ++S 9000,-300,9000,2300,2400,vddi,UP,CALU3 ++S 9000,-300,9000,17300,2400,vddi,UP,CALU2 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 5000,-300,5000,17300,2400,vssi,UP,CALU2 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 8100,6800,13900,6800,1600,vssi,RIGHT,ALU1 ++S 26100,6800,31900,6800,1600,vssi,RIGHT,ALU1 ++S 31000,0,31000,2000,2400,vssi,UP,CALU5 ++S 31000,-300,31000,2300,2400,vssi,UP,CALU3 ++S 31000,-300,31000,17300,2400,vssi,UP,CALU2 ++S 31000,0,31000,2000,2400,vssi,UP,CALU4 ++S 5000,0,5000,2000,2400,vssi,UP,CALU4 ++S 5000,0,5000,2000,2400,vssi,UP,CALU5 ++S 5000,-300,5000,2300,2400,vssi,UP,CALU3 ++S 26600,11100,26600,15100,200,93onymous_,UP,PTRANS ++S 37200,6000,39950,6000,12000,11onymous_,RIGHT,TALU4 ++S 26600,10200,30200,10200,600,92onymous_,RIGHT,POLY ++S 11000,7500,11000,9500,200,53onymous_,UP,NTRANS ++S 26600,9800,26600,10800,200,91onymous_,UP,POLY ++S 33000,200,33000,2000,0,13onymous_,UP,TALU3 ++S 30800,12100,30800,14900,400,127nymous_,UP,ALU1 ++S 11600,7700,11600,9300,620,51onymous_,UP,NDIF ++S 11600,11300,11600,14900,620,52onymous_,UP,PDIF ++S 26000,12300,26000,14900,400,126nymous_,UP,ALU1 ++S 0,6000,40000,6000,12000,12onymous_,RIGHT,TALU6 ++S 11000,9800,11000,10800,200,54onymous_,UP,POLY ++S 38600,200,38600,2000,3000,17onymous_,UP,TALU3 ++S 7000,200,7000,2000,0,16onymous_,UP,TALU3 ++S 27200,700,27200,11500,400,130nymous_,UP,ALU2 ++S 10400,7700,10400,9300,420,56onymous_,UP,NDIF ++S 11000,11100,11000,15100,200,55onymous_,UP,PTRANS ++S 27200,7700,27200,9300,420,94onymous_,UP,NDIF ++S 14000,200,14000,2000,6000,15onymous_,UP,TALU3 ++S 10400,11300,10400,14900,620,58onymous_,UP,PDIF ++S 28400,700,28400,11500,400,129nymous_,UP,ALU2 ++S 25000,200,25000,2000,8000,14onymous_,UP,TALU3 ++S 10400,11300,10400,13900,400,57onymous_,UP,ALU1 ++S 28400,12300,28400,14900,400,128nymous_,UP,ALU1 ++S 1400,200,1400,2000,3000,18onymous_,UP,TALU3 ++S 9800,11100,9800,15100,200,61onymous_,UP,PTRANS ++S 9800,9800,9800,10800,200,60onymous_,UP,POLY ++S 23000,18100,23000,59900,4400,131nymous_,UP,ALU1 ++S 9800,7500,9800,9500,200,59onymous_,UP,NTRANS ++S 27300,9200,29500,9200,400,95onymous_,RIGHT,ALU1 ++S 9200,7700,9200,9300,420,62onymous_,UP,NDIF ++S 33000,200,33000,12000,0,19onymous_,UP,TALU5 ++S 17000,18100,17000,59900,4400,132nymous_,UP,ALU1 ++S 27300,10200,31900,10200,400,96onymous_,RIGHT,ALU1 ++S 27200,11300,27200,13900,400,97onymous_,UP,ALU1 ++S 8600,9800,8600,10800,200,65onymous_,UP,POLY ++S 14000,200,14000,12000,6000,21onymous_,UP,TALU5 ++S 8600,7500,8600,9500,200,64onymous_,UP,NTRANS ++S 27800,9800,27800,10800,200,101nymous_,UP,POLY ++S 25000,200,25000,12000,8000,20onymous_,UP,TALU5 ++S 9200,11300,9200,14900,620,63onymous_,UP,PDIF ++S 27200,11300,27200,14900,620,98onymous_,UP,PDIF ++S 27300,11200,29500,11200,400,99onymous_,RIGHT,ALU1 ++S 27800,7500,27800,9500,200,100nymous_,UP,NTRANS ++S 7000,200,7000,12000,0,22onymous_,UP,TALU5 ++S 28400,7700,28400,9300,620,103nymous_,UP,NDIF ++S 27800,11100,27800,15100,200,102nymous_,UP,PTRANS ++S 7000,10200,8600,10200,600,66onymous_,RIGHT,POLY ++S 38600,200,38600,12000,3000,23onymous_,UP,TALU5 ++S 8600,11100,8600,15100,200,67onymous_,UP,PTRANS ++S 1400,200,1400,12000,3000,24onymous_,UP,TALU5 ++S 11300,1000,28700,1000,400,25onymous_,RIGHT,ALU3 ++S 11300,2000,28700,2000,400,26onymous_,RIGHT,ALU3 ++S 11300,16200,14300,16200,400,27onymous_,RIGHT,ALU2 ++S 28400,11300,28400,14900,620,104nymous_,UP,PDIF ++S 14000,5900,14000,7700,400,28onymous_,UP,ALU2 ++S 29000,7500,29000,9500,200,105nymous_,UP,NTRANS ++S 8000,7700,8000,9300,620,68onymous_,UP,NDIF ++S 7880,6200,14120,6200,600,30onymous_,RIGHT,PTIE ++S 29000,9800,29000,10800,200,106nymous_,UP,POLY ++S 7000,3700,7000,10500,400,29onymous_,UP,ALU2 ++S 12800,8500,12800,9100,400,31onymous_,UP,ALU1 ++S 29000,11100,29000,15100,200,107nymous_,UP,PTRANS ++S 10400,8500,10400,9100,400,32onymous_,UP,ALU1 ++S 12800,11300,12800,13900,400,45onymous_,UP,ALU1 ++S 29600,7700,29600,9300,420,108nymous_,UP,NDIF ++S 8000,11300,8000,14900,620,69onymous_,UP,PDIF ++S 8100,10200,12700,10200,400,44onymous_,RIGHT,ALU1 ++S 9200,7500,9200,9100,400,70onymous_,UP,ALU1 ++S 29600,11300,29600,13900,400,109nymous_,UP,ALU1 ++S 8000,8500,8000,12700,400,33onymous_,UP,ALU1 ++S 29600,11300,29600,14900,620,110nymous_,UP,PDIF ++S 7880,16200,14120,16200,600,34onymous_,RIGHT,NTIE ++S 30200,11100,30200,15100,200,113nymous_,UP,PTRANS ++S 14000,7700,14000,9300,620,36onymous_,UP,NDIF ++S 30200,9800,30200,10800,200,112nymous_,UP,POLY ++S 7000,13800,15000,13800,6800,35onymous_,RIGHT,NWELL ++S 9300,7400,13900,7400,400,73onymous_,RIGHT,ALU1 ++S 12200,7500,12200,9500,200,48onymous_,UP,NTRANS ++S 30200,7500,30200,9500,200,111nymous_,UP,NTRANS ++S 11600,7500,11600,8100,400,72onymous_,UP,ALU1 ++S 14000,11300,14000,14900,620,37onymous_,UP,PDIF ++S 30800,7700,30800,9300,420,114nymous_,UP,NDIF ++S 12800,11300,12800,14900,620,46onymous_,UP,PDIF ++S 14000,7500,14000,8100,400,71onymous_,UP,ALU1 ++S 10500,11200,12700,11200,400,47onymous_,RIGHT,ALU1 ++S 14000,12300,14000,14900,400,74onymous_,UP,ALU1 ++S 12200,9800,12200,10800,200,49onymous_,UP,POLY ++S 13400,11100,13400,15100,200,41onymous_,UP,PTRANS ++S 30800,11300,30800,14900,620,115nymous_,UP,PDIF ++S 11600,12300,11600,14900,400,76onymous_,UP,ALU1 ++S 13400,7500,13400,9500,200,38onymous_,UP,NTRANS ++S 9200,12100,9200,14900,400,75onymous_,UP,ALU1 ++S 13400,9800,13400,10800,200,39onymous_,UP,POLY ++S 11600,700,11600,11500,400,77onymous_,UP,ALU2 ++S 9800,10200,13400,10200,600,40onymous_,RIGHT,POLY ++S 26000,5900,26000,7700,400,80onymous_,UP,ALU2 ++S 10500,9200,12700,9200,400,43onymous_,RIGHT,ALU1 ++S 12200,11100,12200,15100,200,50onymous_,UP,PTRANS ++S 12800,7700,12800,9300,420,42onymous_,UP,NDIF ++S 25700,16200,28700,16200,400,79onymous_,RIGHT,ALU2 ++S 31400,9800,31400,10800,200,117nymous_,UP,POLY ++S 33000,3700,33000,10500,400,81onymous_,UP,ALU2 ++S 31400,7500,31400,9500,200,116nymous_,UP,NTRANS ++S 12800,700,12800,11500,400,78onymous_,UP,ALU2 ++S 31400,10200,33000,10200,600,118nymous_,RIGHT,POLY ++S 29600,8500,29600,9100,400,84onymous_,UP,ALU1 ++S 25880,6200,32120,6200,600,82onymous_,RIGHT,PTIE ++S 50,6000,2800,6000,12000,0nonymous_,RIGHT,TALU2 ++S 27200,8500,27200,9100,400,83onymous_,UP,ALU1 ++S 11200,6000,16800,6000,12000,2nonymous_,RIGHT,TALU2 ++S 37200,6000,39950,6000,12000,5nonymous_,RIGHT,TALU2 ++S 31400,11100,31400,15100,200,119nymous_,UP,PTRANS ++S 25880,16200,32120,16200,600,86onymous_,RIGHT,NTIE ++S 32000,8500,32000,12700,400,85onymous_,UP,ALU1 ++S 21200,6000,28800,6000,12000,3nonymous_,RIGHT,TALU2 ++S 32000,11300,32000,14900,620,121nymous_,UP,PDIF ++S 26000,7700,26000,9300,620,88onymous_,UP,NDIF ++S 32000,7700,32000,9300,620,120nymous_,UP,NDIF ++S 25000,13800,33000,13800,6800,87onymous_,RIGHT,NWELL ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 26100,7400,30700,7400,400,125nymous_,RIGHT,ALU1 ++S 28400,7500,28400,8100,400,124nymous_,UP,ALU1 ++S 19000,0,19000,2000,2400,cko,UP,CALU5 ++S 19000,0,19000,2000,2400,cko,UP,CALU4 ++S 50,6000,2800,6000,12000,6nonymous_,RIGHT,TALU4 ++S 26000,11300,26000,14900,620,89onymous_,UP,PDIF ++S 30800,7500,30800,9100,400,122nymous_,UP,ALU1 ++S 11200,6000,16800,6000,12000,8nonymous_,RIGHT,TALU4 ++S 26600,7500,26600,9500,200,90onymous_,UP,NTRANS ++S 26000,7500,26000,8100,400,123nymous_,UP,ALU1 ++S 21200,6000,28800,6000,12000,9nonymous_,RIGHT,TALU4 ++B 35000,1000,2300,2300,CONT_VIA3,286nymous_ ++B 26000,7400,300,300,CONT_VIA,211nymous_ ++B 35000,1000,2300,2300,CONT_VIA2,285nymous_ ++B 26000,7400,300,300,CONT_VIA2,210nymous_ ++B 12800,11200,300,300,CONT_VIA,169nymous_ ++B 28400,13000,300,300,CONT_DIF_P,249nymous_ ++B 28400,12200,300,300,CONT_DIF_P,248nymous_ ++B 29600,8400,300,300,CONT_DIF_N,214nymous_ ++B 35000,16000,2300,2300,CONT_VIA2,288nymous_ ++B 11600,7400,300,300,CONT_DIF_N,173nymous_ ++B 33000,4000,300,300,CONT_VIA2,213nymous_ ++B 35000,1000,2300,2300,CONT_VIA4,287nymous_ ++B 12800,14000,300,300,CONT_DIF_P,172nymous_ ++B 26000,6200,300,300,CONT_VIA,212nymous_ ++B 12800,13000,300,300,CONT_DIF_P,171nymous_ ++B 12800,12000,300,300,CONT_DIF_P,170nymous_ ++B 28400,14000,300,300,CONT_DIF_P,250nymous_ ++B 5000,1000,2300,2300,CONT_VIA2,290nymous_ ++B 32000,8400,300,300,CONT_DIF_N,215nymous_ ++B 5000,7000,2300,2300,CONT_VIA2,289nymous_ ++B 11600,8200,300,300,CONT_DIF_N,174nymous_ ++B 14000,16200,300,300,CONT_VIA,133nymous_ ++B 11600,9200,300,300,CONT_VIA,175nymous_ ++B 27200,8400,300,300,CONT_DIF_N,216nymous_ ++B 11600,10200,300,300,CONT_POLY,176nymous_ ++B 5000,1000,2300,2300,CONT_VIA3,291nymous_ ++B 32000,6200,300,300,CONT_BODY_P,217nymous_ ++B 28400,15000,300,300,CONT_DIF_P,251nymous_ ++B 11600,11200,300,300,CONT_VIA,177nymous_ ++B 5000,1000,2300,2300,CONT_VIA4,292nymous_ ++B 29600,9200,300,300,CONT_DIF_N,252nymous_ ++B 5000,13000,2300,2300,CONT_VIA2,293nymous_ ++B 29600,10200,300,300,CONT_POLY,253nymous_ ++B 9000,10000,2300,2300,CONT_VIA2,294nymous_ ++B 11600,12200,300,300,CONT_DIF_P,178nymous_ ++B 29600,6200,300,300,CONT_BODY_P,219nymous_ ++B 11600,13000,300,300,CONT_DIF_P,179nymous_ ++B 28400,6200,300,300,CONT_BODY_P,220nymous_ ++B 29600,12000,300,300,CONT_DIF_P,254nymous_ ++B 11600,14000,300,300,CONT_DIF_P,180nymous_ ++B 30800,6200,300,300,CONT_BODY_P,218nymous_ ++B 12800,16200,300,300,CONT_VIA2,137nymous_ ++B 30800,8200,300,300,CONT_DIF_N,257nymous_ ++B 11600,16200,300,300,CONT_VIA2,136nymous_ ++B 29600,14000,300,300,CONT_DIF_P,256nymous_ ++B 11600,16200,300,300,CONT_VIA,135nymous_ ++B 12800,16200,300,300,CONT_VIA,134nymous_ ++B 9000,1000,2300,2300,CONT_VIA2,295nymous_ ++B 29600,13000,300,300,CONT_DIF_P,255nymous_ ++B 14000,7400,300,300,CONT_VIA2,140nymous_ ++B 14000,6200,300,300,CONT_VIA2,139nymous_ ++B 14000,16200,300,300,CONT_VIA2,138nymous_ ++B 17000,22000,4300,2300,CONT_VIA,299nymous_ ++B 30800,9200,300,300,CONT_DIF_N,258nymous_ ++B 9000,16000,2300,2300,CONT_VIA2,298nymous_ ++B 10400,10200,300,300,CONT_POLY,183nymous_ ++B 9000,1000,2300,2300,CONT_VIA4,297nymous_ ++B 10400,9200,300,300,CONT_DIF_N,182nymous_ ++B 26000,6200,300,300,CONT_BODY_P,222nymous_ ++B 9000,1000,2300,2300,CONT_VIA3,296nymous_ ++B 14000,7400,300,300,CONT_VIA,141nymous_ ++B 11600,15000,300,300,CONT_DIF_P,181nymous_ ++B 27200,6200,300,300,CONT_BODY_P,221nymous_ ++B 17000,28000,4300,2300,CONT_VIA,301nymous_ ++B 10400,14000,300,300,CONT_DIF_P,186nymous_ ++B 30800,13000,300,300,CONT_DIF_P,260nymous_ ++B 28400,16200,300,300,CONT_BODY_N,226nymous_ ++B 17000,22000,4300,2300,CONT_VIA2,300nymous_ ++B 8000,8400,300,300,CONT_DIF_N,145nymous_ ++B 10400,13000,300,300,CONT_DIF_P,185nymous_ ++B 30800,12000,300,300,CONT_DIF_P,259nymous_ ++B 29600,16200,300,300,CONT_BODY_N,225nymous_ ++B 10400,8400,300,300,CONT_DIF_N,144nymous_ ++B 10400,12000,300,300,CONT_DIF_P,184nymous_ ++B 32000,16200,300,300,CONT_BODY_N,224nymous_ ++B 7000,4000,300,300,CONT_VIA2,143nymous_ ++B 30800,16200,300,300,CONT_BODY_N,223nymous_ ++B 14000,6200,300,300,CONT_VIA,142nymous_ ++B 17000,34000,4300,2300,CONT_VIA,303nymous_ ++B 30800,15000,300,300,CONT_DIF_P,262nymous_ ++B 30800,14000,300,300,CONT_DIF_P,261nymous_ ++B 9200,8200,300,300,CONT_DIF_N,187nymous_ ++B 17000,28000,4300,2300,CONT_VIA2,302nymous_ ++B 8000,6200,300,300,CONT_BODY_P,147nymous_ ++B 27200,16200,300,300,CONT_BODY_N,227nymous_ ++B 12800,8400,300,300,CONT_DIF_N,146nymous_ ++B 19000,1000,2300,2300,CONT_VIA4,306nymous_ ++B 32000,12800,300,300,CONT_DIF_P,265nymous_ ++B 19000,1000,2300,2300,CONT_VIA3,305nymous_ ++B 9200,13000,300,300,CONT_DIF_P,190nymous_ ++B 32000,11800,300,300,CONT_DIF_P,264nymous_ ++B 17000,34000,4300,2300,CONT_VIA2,304nymous_ ++B 10400,6200,300,300,CONT_BODY_P,149nymous_ ++B 9200,12000,300,300,CONT_DIF_P,189nymous_ ++B 32000,9200,300,300,CONT_DIF_N,263nymous_ ++B 9200,6200,300,300,CONT_BODY_P,148nymous_ ++B 9200,9200,300,300,CONT_DIF_N,188nymous_ ++B 26000,16200,300,300,CONT_BODY_N,228nymous_ ++B 8000,11800,300,300,CONT_DIF_P,194nymous_ ++B 29600,11200,200,200,CONT_TURN1,229nymous_ ++B 26000,7400,300,300,CONT_DIF_N,230nymous_ ++B 11600,6200,300,300,CONT_BODY_P,150nymous_ ++B 9200,14000,300,300,CONT_DIF_P,191nymous_ ++B 12800,6200,300,300,CONT_BODY_P,151nymous_ ++B 33000,10200,300,300,CONT_POLY,266nymous_ ++B 9200,15000,300,300,CONT_DIF_P,192nymous_ ++B 8000,9200,300,300,CONT_DIF_N,193nymous_ ++B 30800,7400,300,300,CONT_DIF_N,268nymous_ ++B 28400,2000,300,300,CONT_VIA2,269nymous_ ++B 8000,12800,300,300,CONT_DIF_P,195nymous_ ++B 27200,2000,300,300,CONT_VIA2,270nymous_ ++B 7000,10200,300,300,CONT_POLY,196nymous_ ++B 7000,10200,300,300,CONT_VIA,197nymous_ ++B 26000,8200,300,300,CONT_DIF_N,231nymous_ ++B 26000,12200,300,300,CONT_DIF_P,232nymous_ ++B 14000,6200,300,300,CONT_BODY_P,152nymous_ ++B 26000,13000,300,300,CONT_DIF_P,233nymous_ ++B 33000,10200,300,300,CONT_VIA,267nymous_ ++B 26000,14000,300,300,CONT_DIF_P,234nymous_ ++B 8000,16200,300,300,CONT_BODY_N,154nymous_ ++B 26000,15000,300,300,CONT_DIF_P,235nymous_ ++B 10400,16200,300,300,CONT_BODY_N,155nymous_ ++B 27200,9200,300,300,CONT_DIF_N,236nymous_ ++B 11600,16200,300,300,CONT_BODY_N,156nymous_ ++B 27200,9200,300,300,CONT_VIA,237nymous_ ++B 28400,1000,300,300,CONT_VIA2,271nymous_ ++B 27200,10200,300,300,CONT_POLY,238nymous_ ++B 27200,1000,300,300,CONT_VIA2,272nymous_ ++B 9200,7400,300,300,CONT_DIF_N,198nymous_ ++B 23000,22000,4300,2300,CONT_VIA,273nymous_ ++B 11600,2000,300,300,CONT_VIA2,199nymous_ ++B 9200,16200,300,300,CONT_BODY_N,153nymous_ ++B 12800,2000,300,300,CONT_VIA2,200nymous_ ++B 11600,1000,300,300,CONT_VIA2,201nymous_ ++B 27200,13000,300,300,CONT_DIF_P,241nymous_ ++B 12800,1000,300,300,CONT_VIA2,202nymous_ ++B 12800,16200,300,300,CONT_BODY_N,157nymous_ ++B 14000,16200,300,300,CONT_BODY_N,158nymous_ ++B 27200,11200,300,300,CONT_VIA,239nymous_ ++B 10400,11200,200,200,CONT_TURN1,159nymous_ ++B 27200,12000,300,300,CONT_DIF_P,240nymous_ ++B 23000,22000,4300,2300,CONT_VIA2,274nymous_ ++B 23000,28000,4300,2300,CONT_VIA,275nymous_ ++B 14000,7400,300,300,CONT_DIF_N,160nymous_ ++B 27200,14000,300,300,CONT_DIF_P,242nymous_ ++B 14000,8200,300,300,CONT_DIF_N,161nymous_ ++B 23000,28000,4300,2300,CONT_VIA2,276nymous_ ++B 14000,12200,300,300,CONT_DIF_P,162nymous_ ++B 23000,34000,4300,2300,CONT_VIA,277nymous_ ++B 26000,16200,300,300,CONT_VIA,203nymous_ ++B 28400,7400,300,300,CONT_DIF_N,243nymous_ ++B 14000,13000,300,300,CONT_DIF_P,163nymous_ ++B 28400,8200,300,300,CONT_DIF_N,244nymous_ ++B 23000,34000,4300,2300,CONT_VIA2,278nymous_ ++B 27200,16200,300,300,CONT_VIA,204nymous_ ++B 14000,14000,300,300,CONT_DIF_P,164nymous_ ++B 28400,9200,300,300,CONT_VIA,245nymous_ ++B 31000,7000,2300,2300,CONT_VIA2,279nymous_ ++B 28400,16200,300,300,CONT_VIA,205nymous_ ++B 14000,15000,300,300,CONT_DIF_P,165nymous_ ++B 31000,1000,2300,2300,CONT_VIA2,280nymous_ ++B 28400,16200,300,300,CONT_VIA2,206nymous_ ++B 31000,1000,2300,2300,CONT_VIA3,281nymous_ ++B 27200,16200,300,300,CONT_VIA2,207nymous_ ++B 31000,1000,2300,2300,CONT_VIA4,282nymous_ ++B 12800,9200,300,300,CONT_VIA,167nymous_ ++B 26000,16200,300,300,CONT_VIA2,208nymous_ ++B 12800,10200,300,300,CONT_POLY,168nymous_ ++B 31000,13000,2300,2300,CONT_VIA2,283nymous_ ++B 26000,6200,300,300,CONT_VIA2,209nymous_ ++B 35000,10000,2300,2300,CONT_VIA2,284nymous_ ++B 28400,10200,300,300,CONT_POLY,246nymous_ ++B 12800,9200,300,300,CONT_DIF_N,166nymous_ ++B 28400,11200,300,300,CONT_VIA,247nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pvddeck_mpx.vbe b/alliance/src/cells/src/mpxlib/pvddeck_mpx.vbe +new file mode 100644 +index 0000000..ddffa40 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvddeck_mpx.vbe +@@ -0,0 +1,31 @@ ++ENTITY pvddeck_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_ck : NATURAL := 127; ++ CONSTANT tpll_ck : NATURAL := 1055; ++ CONSTANT rdown_ck : NATURAL := 126; ++ CONSTANT tphh_ck : NATURAL := 963; ++ CONSTANT rup_ck : NATURAL := 183 ++ ); ++ PORT ( ++ cko : out WOR_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvddeck_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pvddeck_mpx IS ++ ++BEGIN ++ label0 : BLOCK ('1' = '1') ++ BEGIN ++ cko <= GUARDED ck; ++ END BLOCK label0; ++ ++ ASSERT ((((not (vssi) and not (vsse)) and vddi) and vdde) = '1') ++ REPORT "power supply is missing on pvddeck_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pvddi_mpx.ap b/alliance/src/cells/src/mpxlib/pvddi_mpx.ap +new file mode 100644 +index 0000000..8465dc2 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvddi_mpx.ap +@@ -0,0 +1,86 @@ ++V ALLIANCE : 6 ++H pvddi_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 31200,6000,32800,6000,12000,13onymous_,RIGHT,TALU2 ++S 7200,6000,8800,6000,12000,11onymous_,RIGHT,TALU2 ++S 50,6000,2800,6000,12000,10onymous_,RIGHT,TALU2 ++S 13200,6000,26800,6000,12000,12onymous_,RIGHT,TALU2 ++S 13200,6000,26800,6000,12000,17onymous_,RIGHT,TALU4 ++S 50,6000,2800,6000,12000,15onymous_,RIGHT,TALU4 ++S 37200,6000,39950,6000,12000,14onymous_,RIGHT,TALU2 ++S 7200,6000,8800,6000,12000,16onymous_,RIGHT,TALU4 ++S 31200,6000,32800,6000,12000,18onymous_,RIGHT,TALU4 ++S 37200,6000,39950,6000,12000,19onymous_,RIGHT,TALU4 ++S 17000,6100,17000,59900,4400,21onymous_,UP,ALU1 ++S 8000,200,8000,2000,2000,1nonymous_,UP,TALU3 ++S 1400,200,1400,2000,3000,0nonymous_,UP,TALU3 ++S 0,6000,40000,6000,12000,20onymous_,RIGHT,TALU6 ++S 20000,200,20000,2000,14000,2nonymous_,UP,TALU3 ++S 23000,6100,23000,59900,4400,22onymous_,UP,ALU1 ++S 32000,200,32000,2000,2000,3nonymous_,UP,TALU3 ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 38600,200,38600,2000,3000,4nonymous_,UP,TALU3 ++S 1400,200,1400,12000,3000,5nonymous_,UP,TALU5 ++S 20000,200,20000,12000,14000,7nonymous_,UP,TALU5 ++S 8000,200,8000,12000,2000,6nonymous_,UP,TALU5 ++S 32000,200,32000,12000,2000,8nonymous_,UP,TALU5 ++S 38600,200,38600,12000,3000,9nonymous_,UP,TALU5 ++S 29000,0,29000,2000,2400,vssi,UP,CALU4 ++S 29000,0,29000,2000,2400,vssi,UP,CALU5 ++S 29000,-300,29000,2300,2400,vssi,UP,CALU3 ++S 29000,-300,29000,17300,2400,vssi,UP,CALU2 ++S 5000,0,5000,2000,2400,vssi,UP,CALU4 ++S 5000,0,5000,2000,2400,vssi,UP,CALU5 ++S 5000,-300,5000,2300,2400,vssi,UP,CALU3 ++S 5000,-300,5000,17300,2400,vssi,UP,CALU2 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 11000,0,11000,2000,2400,vddi,UP,CALU5 ++S 11000,0,11000,2000,2400,vddi,UP,CALU4 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 35000,-300,35000,17300,2400,vddi,UP,CALU2 ++S 35000,-300,35000,2300,2400,vddi,UP,CALU3 ++S 35000,0,35000,2000,2400,vddi,UP,CALU5 ++S 35000,0,35000,2000,2400,vddi,UP,CALU4 ++S 20000,48100,20000,71900,24400,vddi,UP,CALU1 ++S 11000,-300,11000,17300,2400,vddi,UP,CALU2 ++S 11000,-300,11000,2300,2400,vddi,UP,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++B 29000,7000,2300,2300,CONT_VIA2,46onymous_ ++B 35000,16000,2300,2300,CONT_VIA2,37onymous_ ++B 23000,16000,4300,2300,CONT_VIA2,47onymous_ ++B 5000,1000,2300,2300,CONT_VIA2,35onymous_ ++B 5000,7000,2300,2300,CONT_VIA2,36onymous_ ++B 23000,16000,4300,2300,CONT_VIA,48onymous_ ++B 35000,1000,2300,2300,CONT_VIA4,38onymous_ ++B 35000,10000,2300,2300,CONT_VIA2,41onymous_ ++B 35000,1000,2300,2300,CONT_VIA2,40onymous_ ++B 23000,10000,4300,2300,CONT_VIA2,49onymous_ ++B 35000,1000,2300,2300,CONT_VIA3,39onymous_ ++B 29000,13000,2300,2300,CONT_VIA2,42onymous_ ++B 29000,1000,2300,2300,CONT_VIA4,43onymous_ ++B 23000,10000,4300,2300,CONT_VIA,50onymous_ ++B 17000,10000,4300,2300,CONT_VIA2,25onymous_ ++B 17000,16000,4300,2300,CONT_VIA2,23onymous_ ++B 17000,16000,4300,2300,CONT_VIA,24onymous_ ++B 11000,1000,2300,2300,CONT_VIA4,28onymous_ ++B 17000,10000,4300,2300,CONT_VIA,26onymous_ ++B 11000,16000,2300,2300,CONT_VIA2,27onymous_ ++B 11000,10000,2300,2300,CONT_VIA2,31onymous_ ++B 11000,1000,2300,2300,CONT_VIA2,30onymous_ ++B 11000,1000,2300,2300,CONT_VIA3,29onymous_ ++B 29000,1000,2300,2300,CONT_VIA2,45onymous_ ++B 5000,1000,2300,2300,CONT_VIA4,33onymous_ ++B 5000,13000,2300,2300,CONT_VIA2,32onymous_ ++B 29000,1000,2300,2300,CONT_VIA3,44onymous_ ++B 5000,1000,2300,2300,CONT_VIA3,34onymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pvddi_mpx.vbe b/alliance/src/cells/src/mpxlib/pvddi_mpx.vbe +new file mode 100644 +index 0000000..cb25d33 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvddi_mpx.vbe +@@ -0,0 +1,20 @@ ++ENTITY pvddi_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000 ++ ); ++ PORT ( ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvddi_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pvddi_mpx IS ++ ++BEGIN ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvddi_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pvddick_mpx.ap b/alliance/src/cells/src/mpxlib/pvddick_mpx.ap +new file mode 100644 +index 0000000..0b164e8 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvddick_mpx.ap +@@ -0,0 +1,340 @@ ++V ALLIANCE : 6 ++H pvddick_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 26100,15600,31900,15600,1600,vddi,RIGHT,ALU1 ++S 9000,-300,9000,17300,2400,vddi,UP,CALU2 ++S 9000,-300,9000,2300,2400,vddi,UP,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 9000,0,9000,2000,2400,vddi,UP,CALU5 ++S 9000,0,9000,2000,2400,vddi,UP,CALU4 ++S 35000,-300,35000,17300,2400,vddi,UP,CALU2 ++S 20000,48100,20000,71900,24400,vddi,UP,CALU1 ++S 8100,15600,13900,15600,1600,vddi,RIGHT,ALU1 ++S 35000,-300,35000,2300,2400,vddi,UP,CALU3 ++S 35000,0,35000,2000,2400,vddi,UP,CALU5 ++S 35000,0,35000,2000,2400,vddi,UP,CALU4 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 31000,0,31000,2000,2400,vssi,UP,CALU4 ++S 26100,6800,31900,6800,1600,vssi,RIGHT,ALU1 ++S 8100,6800,13900,6800,1600,vssi,RIGHT,ALU1 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 5000,-300,5000,17300,2400,vssi,UP,CALU2 ++S 5000,-300,5000,2300,2400,vssi,UP,CALU3 ++S 5000,0,5000,2000,2400,vssi,UP,CALU5 ++S 5000,0,5000,2000,2400,vssi,UP,CALU4 ++S 31000,-300,31000,17300,2400,vssi,UP,CALU2 ++S 31000,-300,31000,2300,2400,vssi,UP,CALU3 ++S 31000,0,31000,2000,2400,vssi,UP,CALU5 ++S 10500,9200,12700,9200,400,91onymous_,RIGHT,ALU1 ++S 25880,6200,32120,6200,600,52onymous_,RIGHT,PTIE ++S 27200,8500,27200,9100,400,51onymous_,UP,ALU1 ++S 32000,11300,32000,14900,620,13onymous_,UP,PDIF ++S 26000,7500,26000,8100,400,11onymous_,UP,ALU1 ++S 13400,11100,13400,15100,200,93onymous_,UP,PTRANS ++S 28400,7500,28400,8100,400,10onymous_,UP,ALU1 ++S 50,6000,2800,6000,12000,126nymous_,RIGHT,TALU4 ++S 30800,7500,30800,9100,400,12onymous_,UP,ALU1 ++S 37200,6000,39950,6000,12000,127nymous_,RIGHT,TALU2 ++S 33000,3700,33000,10500,400,53onymous_,UP,ALU2 ++S 12800,7700,12800,9300,420,92onymous_,UP,NDIF ++S 31400,11100,31400,15100,200,15onymous_,UP,PTRANS ++S 11200,6000,16800,6000,12000,130nymous_,RIGHT,TALU2 ++S 11600,12300,11600,14900,400,58onymous_,UP,ALU1 ++S 32000,7700,32000,9300,620,14onymous_,UP,NDIF ++S 21200,6000,28800,6000,12000,129nymous_,RIGHT,TALU2 ++S 11600,700,11600,11500,400,57onymous_,UP,ALU2 ++S 31400,9800,31400,10800,200,17onymous_,UP,POLY ++S 12800,700,12800,11500,400,56onymous_,UP,ALU2 ++S 9800,10200,13400,10200,600,94onymous_,RIGHT,POLY ++S 26000,5900,26000,7700,400,54onymous_,UP,ALU2 ++S 31400,10200,33000,10200,600,16onymous_,RIGHT,POLY ++S 25700,16200,28700,16200,400,55onymous_,RIGHT,ALU2 ++S 9200,12100,9200,14900,400,59onymous_,UP,ALU1 ++S 14000,11300,14000,14900,620,97onymous_,UP,PDIF ++S 13400,7500,13400,9500,200,96onymous_,UP,NTRANS ++S 9300,7400,13900,7400,400,61onymous_,RIGHT,ALU1 ++S 50,6000,2800,6000,12000,132nymous_,RIGHT,TALU2 ++S 14000,12300,14000,14900,400,60onymous_,UP,ALU1 ++S 31400,7500,31400,9500,200,18onymous_,UP,NTRANS ++S 11600,7500,11600,8100,400,62onymous_,UP,ALU1 ++S 13400,9800,13400,10800,200,95onymous_,UP,POLY ++S 30800,11300,30800,14900,620,19onymous_,UP,PDIF ++S 14000,7500,14000,8100,400,63onymous_,UP,ALU1 ++S 8000,8500,8000,12700,400,101nymous_,UP,ALU1 ++S 7000,13800,15000,13800,6800,99onymous_,RIGHT,NWELL ++S 7880,16200,14120,16200,600,100nymous_,RIGHT,NTIE ++S 30800,7700,30800,9300,420,20onymous_,UP,NDIF ++S 9200,7500,9200,9100,400,64onymous_,UP,ALU1 ++S 30200,11100,30200,15100,200,21onymous_,UP,PTRANS ++S 8000,11300,8000,14900,620,65onymous_,UP,PDIF ++S 14000,7700,14000,9300,620,98onymous_,UP,NDIF ++S 10400,8500,10400,9100,400,102nymous_,UP,ALU1 ++S 29600,11300,29600,13900,400,25onymous_,UP,ALU1 ++S 30200,7500,30200,9500,200,23onymous_,UP,NTRANS ++S 8600,11100,8600,15100,200,67onymous_,UP,PTRANS ++S 29600,11300,29600,14900,620,24onymous_,UP,PDIF ++S 12800,8500,12800,9100,400,103nymous_,UP,ALU1 ++S 30200,9800,30200,10800,200,22onymous_,UP,POLY ++S 8000,7700,8000,9300,620,66onymous_,UP,NDIF ++S 29600,7700,29600,9300,420,26onymous_,UP,NDIF ++S 29000,11100,29000,15100,200,27onymous_,UP,PTRANS ++S 7880,6200,14120,6200,600,104nymous_,RIGHT,PTIE ++S 29000,9800,29000,10800,200,28onymous_,UP,POLY ++S 7000,3700,7000,10500,400,105nymous_,UP,ALU2 ++S 28400,7700,28400,9300,620,31onymous_,UP,NDIF ++S 7000,10200,8600,10200,600,68onymous_,RIGHT,POLY ++S 14000,5900,14000,7700,400,106nymous_,UP,ALU2 ++S 29000,7500,29000,9500,200,29onymous_,UP,NTRANS ++S 28400,11300,28400,14900,620,30onymous_,UP,PDIF ++S 11300,16200,14300,16200,400,107nymous_,RIGHT,ALU2 ++S 7000,200,7000,12000,0,110nymous_,UP,TALU5 ++S 27800,7500,27800,9500,200,34onymous_,UP,NTRANS ++S 26000,11300,26000,14900,620,45onymous_,UP,PDIF ++S 38600,200,38600,12000,3000,109nymous_,UP,TALU5 ++S 27800,9800,27800,10800,200,33onymous_,UP,POLY ++S 8600,7500,8600,9500,200,70onymous_,UP,NTRANS ++S 1400,200,1400,12000,3000,108nymous_,UP,TALU5 ++S 8600,9800,8600,10800,200,69onymous_,UP,POLY ++S 27800,11100,27800,15100,200,32onymous_,UP,PTRANS ++S 26600,7500,26600,9500,200,44onymous_,UP,NTRANS ++S 14000,200,14000,12000,6000,111nymous_,UP,TALU5 ++S 25000,13800,33000,13800,6800,47onymous_,RIGHT,NWELL ++S 27300,11200,29500,11200,400,35onymous_,RIGHT,ALU1 ++S 9200,7700,9200,9300,420,72onymous_,UP,NDIF ++S 26000,7700,26000,9300,620,46onymous_,UP,NDIF ++S 9200,11300,9200,14900,620,71onymous_,UP,PDIF ++S 25880,16200,32120,16200,600,48onymous_,RIGHT,NTIE ++S 9800,11100,9800,15100,200,73onymous_,UP,PTRANS ++S 25000,200,25000,12000,8000,112nymous_,UP,TALU5 ++S 33000,200,33000,12000,0,113nymous_,UP,TALU5 ++S 27200,11300,27200,14900,620,36onymous_,UP,PDIF ++S 1400,200,1400,2000,3000,114nymous_,UP,TALU3 ++S 27200,11300,27200,13900,400,37onymous_,UP,ALU1 ++S 27200,7700,27200,9300,420,40onymous_,UP,NDIF ++S 27300,9200,29500,9200,400,39onymous_,RIGHT,ALU1 ++S 10400,11300,10400,13900,400,77onymous_,UP,ALU1 ++S 27300,10200,31900,10200,400,38onymous_,RIGHT,ALU1 ++S 38600,200,38600,2000,3000,115nymous_,UP,TALU3 ++S 9800,9800,9800,10800,200,74onymous_,UP,POLY ++S 26600,11100,26600,15100,200,41onymous_,UP,PTRANS ++S 32000,8500,32000,12700,400,49onymous_,UP,ALU1 ++S 9800,7500,9800,9500,200,75onymous_,UP,NTRANS ++S 10400,11300,10400,14900,620,76onymous_,UP,PDIF ++S 14000,200,14000,2000,6000,117nymous_,UP,TALU3 ++S 10400,7700,10400,9300,420,78onymous_,UP,NDIF ++S 7000,200,7000,2000,0,116nymous_,UP,TALU3 ++S 26600,10200,30200,10200,600,42onymous_,RIGHT,POLY ++S 11000,9800,11000,10800,200,80onymous_,UP,POLY ++S 11000,11100,11000,15100,200,79onymous_,UP,PTRANS ++S 11000,7500,11000,9500,200,81onymous_,UP,NTRANS ++S 26600,9800,26600,10800,200,43onymous_,UP,POLY ++S 29600,8500,29600,9100,400,50onymous_,UP,ALU1 ++S 12200,11100,12200,15100,200,84onymous_,UP,PTRANS ++S 11600,7700,11600,9300,620,83onymous_,UP,NDIF ++S 25000,200,25000,2000,8000,118nymous_,UP,TALU3 ++S 11300,1000,28700,1000,400,0nonymous_,RIGHT,ALU3 ++S 11300,2000,28700,2000,400,1nonymous_,RIGHT,ALU3 ++S 17000,6100,17000,59900,4400,2nonymous_,UP,ALU1 ++S 11600,11300,11600,14900,620,82onymous_,UP,PDIF ++S 12200,9800,12200,10800,200,85onymous_,UP,POLY ++S 23000,6100,23000,59900,4400,3nonymous_,UP,ALU1 ++S 10500,11200,12700,11200,400,87onymous_,RIGHT,ALU1 ++S 33000,200,33000,2000,0,119nymous_,UP,TALU3 ++S 27200,700,27200,11500,400,4nonymous_,UP,ALU2 ++S 12200,7500,12200,9500,200,86onymous_,UP,NTRANS ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 0,6000,40000,6000,12000,120nymous_,RIGHT,TALU6 ++S 28400,700,28400,11500,400,5nonymous_,UP,ALU2 ++S 12800,11300,12800,14900,620,88onymous_,UP,PDIF ++S 37200,6000,39950,6000,12000,121nymous_,RIGHT,TALU4 ++S 26100,7400,30700,7400,400,9nonymous_,RIGHT,ALU1 ++S 11200,6000,16800,6000,12000,124nymous_,RIGHT,TALU4 ++S 26000,12300,26000,14900,400,8nonymous_,UP,ALU1 ++S 21200,6000,28800,6000,12000,123nymous_,RIGHT,TALU4 ++S 8100,10200,12700,10200,400,90onymous_,RIGHT,ALU1 ++S 30800,12100,30800,14900,400,7nonymous_,UP,ALU1 ++S 19000,0,19000,2000,2400,cko,UP,CALU4 ++S 19000,0,19000,2000,2400,cko,UP,CALU5 ++S 28400,12300,28400,14900,400,6nonymous_,UP,ALU1 ++S 12800,11300,12800,13900,400,89onymous_,UP,ALU1 ++B 10400,6200,300,300,CONT_BODY_P,286nymous_ ++B 32000,16200,300,300,CONT_BODY_N,211nymous_ ++B 11600,6200,300,300,CONT_BODY_P,285nymous_ ++B 29600,16200,300,300,CONT_BODY_N,210nymous_ ++B 33000,10200,300,300,CONT_POLY,169nymous_ ++B 10400,14000,300,300,CONT_DIF_P,249nymous_ ++B 9200,8200,300,300,CONT_DIF_N,248nymous_ ++B 27200,6200,300,300,CONT_BODY_P,214nymous_ ++B 8000,6200,300,300,CONT_BODY_P,288nymous_ ++B 30800,15000,300,300,CONT_DIF_P,173nymous_ ++B 26000,6200,300,300,CONT_BODY_P,213nymous_ ++B 9200,6200,300,300,CONT_BODY_P,287nymous_ ++B 32000,9200,300,300,CONT_DIF_N,172nymous_ ++B 30800,16200,300,300,CONT_BODY_N,212nymous_ ++B 32000,11800,300,300,CONT_DIF_P,171nymous_ ++B 32000,12800,300,300,CONT_DIF_P,170nymous_ ++B 10400,13000,300,300,CONT_DIF_P,250nymous_ ++B 8000,8400,300,300,CONT_DIF_N,290nymous_ ++B 28400,6200,300,300,CONT_BODY_P,215nymous_ ++B 12800,8400,300,300,CONT_DIF_N,289nymous_ ++B 30800,14000,300,300,CONT_DIF_P,174nymous_ ++B 19000,1000,2300,2300,CONT_VIA4,133nymous_ ++B 30800,13000,300,300,CONT_DIF_P,175nymous_ ++B 29600,6200,300,300,CONT_BODY_P,216nymous_ ++B 30800,12000,300,300,CONT_DIF_P,176nymous_ ++B 10400,8400,300,300,CONT_DIF_N,291nymous_ ++B 30800,6200,300,300,CONT_BODY_P,217nymous_ ++B 10400,12000,300,300,CONT_DIF_P,251nymous_ ++B 30800,9200,300,300,CONT_DIF_N,177nymous_ ++B 7000,4000,300,300,CONT_VIA2,292nymous_ ++B 10400,10200,300,300,CONT_POLY,252nymous_ ++B 14000,6200,300,300,CONT_VIA,293nymous_ ++B 10400,9200,300,300,CONT_DIF_N,253nymous_ ++B 14000,7400,300,300,CONT_VIA,294nymous_ ++B 30800,8200,300,300,CONT_DIF_N,178nymous_ ++B 27200,8400,300,300,CONT_DIF_N,219nymous_ ++B 29600,14000,300,300,CONT_DIF_P,179nymous_ ++B 32000,8400,300,300,CONT_DIF_N,220nymous_ ++B 11600,15000,300,300,CONT_DIF_P,254nymous_ ++B 29600,13000,300,300,CONT_DIF_P,180nymous_ ++B 32000,6200,300,300,CONT_BODY_P,218nymous_ ++B 17000,10000,4300,2300,CONT_VIA2,137nymous_ ++B 11600,12200,300,300,CONT_DIF_P,257nymous_ ++B 17000,16000,4300,2300,CONT_VIA,136nymous_ ++B 11600,13000,300,300,CONT_DIF_P,256nymous_ ++B 17000,16000,4300,2300,CONT_VIA2,135nymous_ ++B 19000,1000,2300,2300,CONT_VIA3,134nymous_ ++B 14000,7400,300,300,CONT_VIA2,295nymous_ ++B 11600,14000,300,300,CONT_DIF_P,255nymous_ ++B 9000,1000,2300,2300,CONT_VIA4,140nymous_ ++B 9000,16000,2300,2300,CONT_VIA2,139nymous_ ++B 17000,10000,4300,2300,CONT_VIA,138nymous_ ++B 11600,16200,300,300,CONT_VIA2,299nymous_ ++B 11600,11200,300,300,CONT_VIA,258nymous_ ++B 12800,16200,300,300,CONT_VIA2,298nymous_ ++B 29600,9200,300,300,CONT_DIF_N,183nymous_ ++B 14000,16200,300,300,CONT_VIA2,297nymous_ ++B 29600,10200,300,300,CONT_POLY,182nymous_ ++B 33000,4000,300,300,CONT_VIA2,222nymous_ ++B 14000,6200,300,300,CONT_VIA2,296nymous_ ++B 9000,1000,2300,2300,CONT_VIA3,141nymous_ ++B 29600,12000,300,300,CONT_DIF_P,181nymous_ ++B 29600,8400,300,300,CONT_DIF_N,221nymous_ ++B 12800,16200,300,300,CONT_VIA,301nymous_ ++B 28400,13000,300,300,CONT_DIF_P,186nymous_ ++B 11600,9200,300,300,CONT_VIA,260nymous_ ++B 26000,6200,300,300,CONT_VIA2,226nymous_ ++B 11600,16200,300,300,CONT_VIA,300nymous_ ++B 5000,1000,2300,2300,CONT_VIA4,145nymous_ ++B 28400,14000,300,300,CONT_DIF_P,185nymous_ ++B 11600,10200,300,300,CONT_POLY,259nymous_ ++B 26000,7400,300,300,CONT_VIA2,225nymous_ ++B 5000,13000,2300,2300,CONT_VIA2,144nymous_ ++B 28400,15000,300,300,CONT_DIF_P,184nymous_ ++B 26000,7400,300,300,CONT_VIA,224nymous_ ++B 9000,10000,2300,2300,CONT_VIA2,143nymous_ ++B 26000,6200,300,300,CONT_VIA,223nymous_ ++B 9000,1000,2300,2300,CONT_VIA2,142nymous_ ++B 11600,7400,300,300,CONT_DIF_N,262nymous_ ++B 11600,8200,300,300,CONT_DIF_N,261nymous_ ++B 28400,12200,300,300,CONT_DIF_P,187nymous_ ++B 14000,16200,300,300,CONT_VIA,302nymous_ ++B 5000,1000,2300,2300,CONT_VIA2,147nymous_ ++B 26000,16200,300,300,CONT_VIA2,227nymous_ ++B 5000,1000,2300,2300,CONT_VIA3,146nymous_ ++B 12800,12000,300,300,CONT_DIF_P,265nymous_ ++B 28400,9200,300,300,CONT_VIA,190nymous_ ++B 12800,13000,300,300,CONT_DIF_P,264nymous_ ++B 35000,16000,2300,2300,CONT_VIA2,149nymous_ ++B 28400,10200,300,300,CONT_POLY,189nymous_ ++B 12800,14000,300,300,CONT_DIF_P,263nymous_ ++B 5000,7000,2300,2300,CONT_VIA2,148nymous_ ++B 28400,11200,300,300,CONT_VIA,188nymous_ ++B 27200,16200,300,300,CONT_VIA2,228nymous_ ++B 27200,13000,300,300,CONT_DIF_P,194nymous_ ++B 28400,16200,300,300,CONT_VIA2,229nymous_ ++B 28400,16200,300,300,CONT_VIA,230nymous_ ++B 35000,1000,2300,2300,CONT_VIA4,150nymous_ ++B 28400,8200,300,300,CONT_DIF_N,191nymous_ ++B 35000,1000,2300,2300,CONT_VIA3,151nymous_ ++B 12800,11200,300,300,CONT_VIA,266nymous_ ++B 28400,7400,300,300,CONT_DIF_N,192nymous_ ++B 27200,14000,300,300,CONT_DIF_P,193nymous_ ++B 12800,9200,300,300,CONT_VIA,268nymous_ ++B 12800,9200,300,300,CONT_DIF_N,269nymous_ ++B 27200,12000,300,300,CONT_DIF_P,195nymous_ ++B 14000,15000,300,300,CONT_DIF_P,270nymous_ ++B 27200,11200,300,300,CONT_VIA,196nymous_ ++B 27200,10200,300,300,CONT_POLY,197nymous_ ++B 27200,16200,300,300,CONT_VIA,231nymous_ ++B 26000,16200,300,300,CONT_VIA,232nymous_ ++B 35000,1000,2300,2300,CONT_VIA2,152nymous_ ++B 12800,1000,300,300,CONT_VIA2,233nymous_ ++B 12800,10200,300,300,CONT_POLY,267nymous_ ++B 11600,1000,300,300,CONT_VIA2,234nymous_ ++B 31000,13000,2300,2300,CONT_VIA2,154nymous_ ++B 12800,2000,300,300,CONT_VIA2,235nymous_ ++B 31000,1000,2300,2300,CONT_VIA4,155nymous_ ++B 11600,2000,300,300,CONT_VIA2,236nymous_ ++B 31000,1000,2300,2300,CONT_VIA3,156nymous_ ++B 9200,7400,300,300,CONT_DIF_N,237nymous_ ++B 14000,14000,300,300,CONT_DIF_P,271nymous_ ++B 7000,10200,300,300,CONT_VIA,238nymous_ ++B 14000,13000,300,300,CONT_DIF_P,272nymous_ ++B 27200,9200,300,300,CONT_VIA,198nymous_ ++B 14000,12200,300,300,CONT_DIF_P,273nymous_ ++B 27200,9200,300,300,CONT_DIF_N,199nymous_ ++B 35000,10000,2300,2300,CONT_VIA2,153nymous_ ++B 26000,15000,300,300,CONT_DIF_P,200nymous_ ++B 26000,14000,300,300,CONT_DIF_P,201nymous_ ++B 8000,11800,300,300,CONT_DIF_P,241nymous_ ++B 26000,13000,300,300,CONT_DIF_P,202nymous_ ++B 31000,1000,2300,2300,CONT_VIA2,157nymous_ ++B 31000,7000,2300,2300,CONT_VIA2,158nymous_ ++B 7000,10200,300,300,CONT_POLY,239nymous_ ++B 23000,16000,4300,2300,CONT_VIA2,159nymous_ ++B 8000,12800,300,300,CONT_DIF_P,240nymous_ ++B 14000,8200,300,300,CONT_DIF_N,274nymous_ ++B 14000,7400,300,300,CONT_DIF_N,275nymous_ ++B 23000,16000,4300,2300,CONT_VIA,160nymous_ ++B 8000,9200,300,300,CONT_DIF_N,242nymous_ ++B 23000,10000,4300,2300,CONT_VIA2,161nymous_ ++B 10400,11200,200,200,CONT_TURN1,276nymous_ ++B 23000,10000,4300,2300,CONT_VIA,162nymous_ ++B 14000,16200,300,300,CONT_BODY_N,277nymous_ ++B 26000,12200,300,300,CONT_DIF_P,203nymous_ ++B 9200,15000,300,300,CONT_DIF_P,243nymous_ ++B 27200,1000,300,300,CONT_VIA2,163nymous_ ++B 9200,14000,300,300,CONT_DIF_P,244nymous_ ++B 12800,16200,300,300,CONT_BODY_N,278nymous_ ++B 26000,8200,300,300,CONT_DIF_N,204nymous_ ++B 28400,1000,300,300,CONT_VIA2,164nymous_ ++B 9200,13000,300,300,CONT_DIF_P,245nymous_ ++B 11600,16200,300,300,CONT_BODY_N,279nymous_ ++B 26000,7400,300,300,CONT_DIF_N,205nymous_ ++B 27200,2000,300,300,CONT_VIA2,165nymous_ ++B 10400,16200,300,300,CONT_BODY_N,280nymous_ ++B 29600,11200,200,200,CONT_TURN1,206nymous_ ++B 8000,16200,300,300,CONT_BODY_N,281nymous_ ++B 26000,16200,300,300,CONT_BODY_N,207nymous_ ++B 9200,16200,300,300,CONT_BODY_N,282nymous_ ++B 30800,7400,300,300,CONT_DIF_N,167nymous_ ++B 27200,16200,300,300,CONT_BODY_N,208nymous_ ++B 33000,10200,300,300,CONT_VIA,168nymous_ ++B 14000,6200,300,300,CONT_BODY_P,283nymous_ ++B 28400,16200,300,300,CONT_BODY_N,209nymous_ ++B 12800,6200,300,300,CONT_BODY_P,284nymous_ ++B 9200,12000,300,300,CONT_DIF_P,246nymous_ ++B 28400,2000,300,300,CONT_VIA2,166nymous_ ++B 9200,9200,300,300,CONT_DIF_N,247nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pvddick_mpx.vbe b/alliance/src/cells/src/mpxlib/pvddick_mpx.vbe +new file mode 100644 +index 0000000..a195fbd +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvddick_mpx.vbe +@@ -0,0 +1,31 @@ ++ENTITY pvddick_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_ck : NATURAL := 127; ++ CONSTANT tpll_ck : NATURAL := 1235; ++ CONSTANT rdown_ck : NATURAL := 253; ++ CONSTANT tphh_ck : NATURAL := 1109; ++ CONSTANT rup_ck : NATURAL := 311 ++ ); ++ PORT ( ++ cko : out WOR_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvddick_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pvddick_mpx IS ++ ++BEGIN ++ label0 : BLOCK ('1' = '1') ++ BEGIN ++ cko <= GUARDED ck; ++ END BLOCK label0; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvddick_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pvsse_mpx.ap b/alliance/src/cells/src/mpxlib/pvsse_mpx.ap +new file mode 100644 +index 0000000..54ce412 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvsse_mpx.ap +@@ -0,0 +1,94 @@ ++V ALLIANCE : 6 ++H pvsse_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 31200,6000,32800,6000,12000,13onymous_,RIGHT,TALU2 ++S 7200,6000,8800,6000,12000,11onymous_,RIGHT,TALU2 ++S 50,6000,2800,6000,12000,10onymous_,RIGHT,TALU2 ++S 13200,6000,26800,6000,12000,12onymous_,RIGHT,TALU2 ++S 37200,6000,39950,6000,12000,14onymous_,RIGHT,TALU2 ++S 7200,6000,8800,6000,12000,16onymous_,RIGHT,TALU4 ++S 50,6000,2800,6000,12000,15onymous_,RIGHT,TALU4 ++S 13200,6000,26800,6000,12000,17onymous_,RIGHT,TALU4 ++S 31200,6000,32800,6000,12000,18onymous_,RIGHT,TALU4 ++S 37200,6000,39950,6000,12000,19onymous_,RIGHT,TALU4 ++S 17000,18100,17000,59900,4400,21onymous_,UP,ALU1 ++S 8000,200,8000,2000,2000,1nonymous_,UP,TALU3 ++S 1400,200,1400,2000,3000,0nonymous_,UP,TALU3 ++S 0,6000,40000,6000,12000,20onymous_,RIGHT,TALU6 ++S 20000,200,20000,2000,14000,2nonymous_,UP,TALU3 ++S 1400,200,1400,12000,3000,5nonymous_,UP,TALU5 ++S 38600,200,38600,2000,3000,4nonymous_,UP,TALU3 ++S 23000,18100,23000,59900,4400,22onymous_,UP,ALU1 ++S 32000,200,32000,2000,2000,3nonymous_,UP,TALU3 ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 20000,200,20000,12000,14000,7nonymous_,UP,TALU5 ++S 8000,200,8000,12000,2000,6nonymous_,UP,TALU5 ++S 38600,200,38600,12000,3000,9nonymous_,UP,TALU5 ++S 32000,200,32000,12000,2000,8nonymous_,UP,TALU5 ++S 29000,0,29000,2000,2400,vssi,UP,CALU4 ++S 29000,0,29000,2000,2400,vssi,UP,CALU5 ++S 29000,-300,29000,2300,2400,vssi,UP,CALU3 ++S 29000,-300,29000,17300,2400,vssi,UP,CALU2 ++S 5000,0,5000,2000,2400,vssi,UP,CALU4 ++S 5000,0,5000,2000,2400,vssi,UP,CALU5 ++S 5000,-300,5000,2300,2400,vssi,UP,CALU3 ++S 5000,-300,5000,17300,2400,vssi,UP,CALU2 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 20000,48100,20000,71900,24400,vsse,UP,CALU1 ++S 35000,0,35000,2000,2400,vddi,UP,CALU4 ++S 35000,0,35000,2000,2400,vddi,UP,CALU5 ++S 35000,-300,35000,2300,2400,vddi,UP,CALU3 ++S 35000,-300,35000,17300,2400,vddi,UP,CALU2 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 11000,0,11000,2000,2400,vddi,UP,CALU4 ++S 11000,0,11000,2000,2400,vddi,UP,CALU5 ++S 11000,-300,11000,2300,2400,vddi,UP,CALU3 ++S 11000,-300,11000,17300,2400,vddi,UP,CALU2 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++B 29000,1000,2300,2300,CONT_VIA3,48onymous_ ++B 23000,37000,4300,2300,CONT_VIA2,53onymous_ ++B 29000,13000,2300,2300,CONT_VIA2,46onymous_ ++B 23000,19000,4300,2300,CONT_VIA2,51onymous_ ++B 5000,1000,2300,2300,CONT_VIA4,37onymous_ ++B 29000,1000,2300,2300,CONT_VIA4,47onymous_ ++B 23000,19000,4300,2300,CONT_VIA,52onymous_ ++B 11000,10000,2300,2300,CONT_VIA2,35onymous_ ++B 5000,13000,2300,2300,CONT_VIA2,36onymous_ ++B 5000,7000,2300,2300,CONT_VIA2,40onymous_ ++B 23000,25000,4300,2300,CONT_VIA2,57onymous_ ++B 23000,37000,4300,2300,CONT_VIA,54onymous_ ++B 29000,1000,2300,2300,CONT_VIA2,49onymous_ ++B 5000,1000,2300,2300,CONT_VIA2,39onymous_ ++B 23000,31000,4300,2300,CONT_VIA,56onymous_ ++B 23000,25000,4300,2300,CONT_VIA,58onymous_ ++B 35000,16000,2300,2300,CONT_VIA2,41onymous_ ++B 5000,1000,2300,2300,CONT_VIA3,38onymous_ ++B 23000,31000,4300,2300,CONT_VIA2,55onymous_ ++B 35000,1000,2300,2300,CONT_VIA4,42onymous_ ++B 35000,1000,2300,2300,CONT_VIA3,43onymous_ ++B 29000,7000,2300,2300,CONT_VIA2,50onymous_ ++B 17000,19000,4300,2300,CONT_VIA,24onymous_ ++B 17000,19000,4300,2300,CONT_VIA2,23onymous_ ++B 17000,37000,4300,2300,CONT_VIA2,25onymous_ ++B 17000,31000,4300,2300,CONT_VIA,28onymous_ ++B 17000,31000,4300,2300,CONT_VIA2,27onymous_ ++B 17000,37000,4300,2300,CONT_VIA,26onymous_ ++B 11000,16000,2300,2300,CONT_VIA2,31onymous_ ++B 17000,25000,4300,2300,CONT_VIA,30onymous_ ++B 17000,25000,4300,2300,CONT_VIA2,29onymous_ ++B 11000,1000,2300,2300,CONT_VIA3,33onymous_ ++B 35000,10000,2300,2300,CONT_VIA2,45onymous_ ++B 11000,1000,2300,2300,CONT_VIA4,32onymous_ ++B 35000,1000,2300,2300,CONT_VIA2,44onymous_ ++B 11000,1000,2300,2300,CONT_VIA2,34onymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pvsse_mpx.vbe b/alliance/src/cells/src/mpxlib/pvsse_mpx.vbe +new file mode 100644 +index 0000000..413e4b4 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvsse_mpx.vbe +@@ -0,0 +1,20 @@ ++ENTITY pvsse_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000 ++ ); ++ PORT ( ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvsse_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pvsse_mpx IS ++ ++BEGIN ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvsse_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pvsseck_mpx.ap b/alliance/src/cells/src/mpxlib/pvsseck_mpx.ap +new file mode 100644 +index 0000000..76c42d5 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvsseck_mpx.ap +@@ -0,0 +1,348 @@ ++V ALLIANCE : 6 ++H pvsseck_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 35000,-300,35000,17300,2400,vddi,UP,CALU2 ++S 9000,-300,9000,17300,2400,vddi,UP,CALU2 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 8100,15600,13900,15600,1600,vddi,RIGHT,ALU1 ++S 35000,0,35000,2000,2400,vddi,UP,CALU4 ++S 35000,0,35000,2000,2400,vddi,UP,CALU5 ++S 35000,-300,35000,2300,2400,vddi,UP,CALU3 ++S 9000,0,9000,2000,2400,vddi,UP,CALU4 ++S 9000,0,9000,2000,2400,vddi,UP,CALU5 ++S 9000,-300,9000,2300,2400,vddi,UP,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 26100,15600,31900,15600,1600,vddi,RIGHT,ALU1 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 20000,48100,20000,71900,24400,vsse,UP,CALU1 ++S 5000,0,5000,2000,2400,vssi,UP,CALU5 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 5000,-300,5000,2300,2400,vssi,UP,CALU3 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 8100,6800,13900,6800,1600,vssi,RIGHT,ALU1 ++S 31000,0,31000,2000,2400,vssi,UP,CALU5 ++S 31000,-300,31000,2300,2400,vssi,UP,CALU3 ++S 31000,-300,31000,17300,2400,vssi,UP,CALU2 ++S 5000,-300,5000,17300,2400,vssi,UP,CALU2 ++S 26100,6800,31900,6800,1600,vssi,RIGHT,ALU1 ++S 31000,0,31000,2000,2400,vssi,UP,CALU4 ++S 5000,0,5000,2000,2400,vssi,UP,CALU4 ++S 31400,9800,31400,10800,200,92onymous_,UP,POLY ++S 12800,700,12800,11500,400,53onymous_,UP,ALU2 ++S 31400,7500,31400,9500,200,91onymous_,UP,NTRANS ++S 50,6000,2800,6000,12000,126nymous_,RIGHT,TALU4 ++S 14000,11300,14000,14900,620,12onymous_,UP,PDIF ++S 14000,7700,14000,9300,620,11onymous_,UP,NDIF ++S 13400,7500,13400,9500,200,13onymous_,UP,NTRANS ++S 11600,12300,11600,14900,400,51onymous_,UP,ALU1 ++S 37200,6000,39950,6000,12000,127nymous_,RIGHT,TALU2 ++S 11600,700,11600,11500,400,52onymous_,UP,ALU2 ++S 7000,13800,15000,13800,6800,10onymous_,RIGHT,NWELL ++S 31400,10200,33000,10200,600,93onymous_,RIGHT,POLY ++S 12800,7700,12800,9300,420,17onymous_,UP,NDIF ++S 25700,16200,28700,16200,400,54onymous_,RIGHT,ALU2 ++S 11200,6000,16800,6000,12000,130nymous_,RIGHT,TALU2 ++S 13400,11100,13400,15100,200,16onymous_,UP,PTRANS ++S 21200,6000,28800,6000,12000,129nymous_,RIGHT,TALU2 ++S 9800,10200,13400,10200,600,15onymous_,RIGHT,POLY ++S 13400,9800,13400,10800,200,14onymous_,UP,POLY ++S 27200,8500,27200,9100,400,58onymous_,UP,ALU1 ++S 25880,6200,32120,6200,600,57onymous_,RIGHT,PTIE ++S 31400,11100,31400,15100,200,94onymous_,UP,PTRANS ++S 26000,5900,26000,7700,400,55onymous_,UP,ALU2 ++S 33000,3700,33000,10500,400,56onymous_,UP,ALU2 ++S 25880,16200,32120,16200,600,61onymous_,RIGHT,NTIE ++S 32000,8500,32000,12700,400,60onymous_,UP,ALU1 ++S 29600,8500,29600,9100,400,59onymous_,UP,ALU1 ++S 8100,10200,12700,10200,400,19onymous_,RIGHT,ALU1 ++S 32000,7700,32000,9300,620,95onymous_,UP,NDIF ++S 25000,13800,33000,13800,6800,62onymous_,RIGHT,NWELL ++S 50,6000,2800,6000,12000,132nymous_,RIGHT,TALU2 ++S 10500,9200,12700,9200,400,18onymous_,RIGHT,ALU1 ++S 32000,11300,32000,14900,620,96onymous_,UP,PDIF ++S 30800,7500,30800,9100,400,97onymous_,UP,ALU1 ++S 26000,11300,26000,14900,620,64onymous_,UP,PDIF ++S 12800,11300,12800,13900,400,20onymous_,UP,ALU1 ++S 26000,7700,26000,9300,620,63onymous_,UP,NDIF ++S 26000,12300,26000,14900,400,101nymous_,UP,ALU1 ++S 12800,11300,12800,14900,620,21onymous_,UP,PDIF ++S 26600,7500,26600,9500,200,65onymous_,UP,NTRANS ++S 26000,7500,26000,8100,400,98onymous_,UP,ALU1 ++S 28400,7500,28400,8100,400,99onymous_,UP,ALU1 ++S 26100,7400,30700,7400,400,100nymous_,RIGHT,ALU1 ++S 28400,12300,28400,14900,400,103nymous_,UP,ALU1 ++S 30800,12100,30800,14900,400,102nymous_,UP,ALU1 ++S 12200,9800,12200,10800,200,24onymous_,UP,POLY ++S 12200,11100,12200,15100,200,25onymous_,UP,PTRANS ++S 10500,11200,12700,11200,400,22onymous_,RIGHT,ALU1 ++S 26600,9800,26600,10800,200,66onymous_,UP,POLY ++S 12200,7500,12200,9500,200,23onymous_,UP,NTRANS ++S 26600,10200,30200,10200,600,67onymous_,RIGHT,POLY ++S 11600,11300,11600,14900,620,27onymous_,UP,PDIF ++S 11600,7700,11600,9300,620,26onymous_,UP,NDIF ++S 28400,700,28400,11500,400,104nymous_,UP,ALU2 ++S 11000,7500,11000,9500,200,28onymous_,UP,NTRANS ++S 27200,700,27200,11500,400,105nymous_,UP,ALU2 ++S 11000,11100,11000,15100,200,30onymous_,UP,PTRANS ++S 23000,18100,23000,59900,4400,106nymous_,UP,ALU1 ++S 11000,9800,11000,10800,200,29onymous_,UP,POLY ++S 26600,11100,26600,15100,200,68onymous_,UP,PTRANS ++S 10400,7700,10400,9300,420,31onymous_,UP,NDIF ++S 17000,18100,17000,59900,4400,107nymous_,UP,ALU1 ++S 7000,200,7000,12000,0,110nymous_,UP,TALU5 ++S 38600,200,38600,12000,3000,109nymous_,UP,TALU5 ++S 10400,11300,10400,13900,400,32onymous_,UP,ALU1 ++S 9200,7500,9200,9100,400,45onymous_,UP,ALU1 ++S 27200,7700,27200,9300,420,69onymous_,UP,NDIF ++S 8000,11300,8000,14900,620,44onymous_,UP,PDIF ++S 1400,200,1400,12000,3000,108nymous_,UP,TALU5 ++S 27300,9200,29500,9200,400,70onymous_,RIGHT,ALU1 ++S 10400,11300,10400,14900,620,33onymous_,UP,PDIF ++S 9800,7500,9800,9500,200,34onymous_,UP,NTRANS ++S 14000,200,14000,12000,6000,111nymous_,UP,TALU5 ++S 9800,11100,9800,15100,200,36onymous_,UP,PTRANS ++S 27200,11300,27200,14900,620,73onymous_,UP,PDIF ++S 9800,9800,9800,10800,200,35onymous_,UP,POLY ++S 9300,7400,13900,7400,400,48onymous_,RIGHT,ALU1 ++S 27200,11300,27200,13900,400,72onymous_,UP,ALU1 ++S 33000,200,33000,12000,0,113nymous_,UP,TALU5 ++S 9200,7700,9200,9300,420,37onymous_,UP,NDIF ++S 25000,200,25000,12000,8000,112nymous_,UP,TALU5 ++S 14000,7500,14000,8100,400,46onymous_,UP,ALU1 ++S 1400,200,1400,2000,3000,114nymous_,UP,TALU3 ++S 27300,10200,31900,10200,400,71onymous_,RIGHT,ALU1 ++S 11600,7500,11600,8100,400,47onymous_,UP,ALU1 ++S 27300,11200,29500,11200,400,74onymous_,RIGHT,ALU1 ++S 14000,12300,14000,14900,400,49onymous_,UP,ALU1 ++S 7000,10200,8600,10200,600,41onymous_,RIGHT,POLY ++S 27800,7500,27800,9500,200,75onymous_,UP,NTRANS ++S 9200,11300,9200,14900,620,38onymous_,UP,PDIF ++S 8600,7500,8600,9500,200,39onymous_,UP,NTRANS ++S 27800,9800,27800,10800,200,76onymous_,UP,POLY ++S 8600,9800,8600,10800,200,40onymous_,UP,POLY ++S 27800,11100,27800,15100,200,77onymous_,UP,PTRANS ++S 38600,200,38600,2000,3000,115nymous_,UP,TALU3 ++S 29000,7500,29000,9500,200,80onymous_,UP,NTRANS ++S 8000,7700,8000,9300,620,43onymous_,UP,NDIF ++S 9200,12100,9200,14900,400,50onymous_,UP,ALU1 ++S 14000,200,14000,2000,6000,117nymous_,UP,TALU3 ++S 28400,11300,28400,14900,620,79onymous_,UP,PDIF ++S 8600,11100,8600,15100,200,42onymous_,UP,PTRANS ++S 7000,200,7000,2000,0,116nymous_,UP,TALU3 ++S 28400,7700,28400,9300,620,78onymous_,UP,NDIF ++S 29000,9800,29000,10800,200,81onymous_,UP,POLY ++S 29000,11100,29000,15100,200,82onymous_,UP,PTRANS ++S 25000,200,25000,2000,8000,118nymous_,UP,TALU3 ++S 11300,1000,28700,1000,400,0nonymous_,RIGHT,ALU3 ++S 11300,2000,28700,2000,400,1nonymous_,RIGHT,ALU3 ++S 29600,7700,29600,9300,420,83onymous_,UP,NDIF ++S 11300,16200,14300,16200,400,2nonymous_,RIGHT,ALU2 ++S 29600,11300,29600,13900,400,84onymous_,UP,ALU1 ++S 7000,3700,7000,10500,400,4nonymous_,UP,ALU2 ++S 30200,7500,30200,9500,200,86onymous_,UP,NTRANS ++S 14000,5900,14000,7700,400,3nonymous_,UP,ALU2 ++S 29600,11300,29600,14900,620,85onymous_,UP,PDIF ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 33000,200,33000,2000,0,119nymous_,UP,TALU3 ++S 30200,11100,30200,15100,200,88onymous_,UP,PTRANS ++S 7880,6200,14120,6200,600,5nonymous_,RIGHT,PTIE ++S 30200,9800,30200,10800,200,87onymous_,UP,POLY ++S 0,6000,40000,6000,12000,120nymous_,RIGHT,TALU6 ++S 37200,6000,39950,6000,12000,121nymous_,RIGHT,TALU4 ++S 11200,6000,16800,6000,12000,124nymous_,RIGHT,TALU4 ++S 21200,6000,28800,6000,12000,123nymous_,RIGHT,TALU4 ++S 7880,16200,14120,16200,600,9nonymous_,RIGHT,NTIE ++S 8000,8500,8000,12700,400,8nonymous_,UP,ALU1 ++S 19000,0,19000,2000,2400,cko,UP,CALU5 ++S 19000,0,19000,2000,2400,cko,UP,CALU4 ++S 12800,8500,12800,9100,400,6nonymous_,UP,ALU1 ++S 30800,7700,30800,9300,420,89onymous_,UP,NDIF ++S 10400,8500,10400,9100,400,7nonymous_,UP,ALU1 ++S 30800,11300,30800,14900,620,90onymous_,UP,PDIF ++B 35000,10000,2300,2300,CONT_VIA2,286nymous_ ++B 26000,7400,300,300,CONT_VIA,211nymous_ ++B 31000,13000,2300,2300,CONT_VIA2,285nymous_ ++B 26000,7400,300,300,CONT_VIA2,210nymous_ ++B 12800,11200,300,300,CONT_VIA,169nymous_ ++B 28400,13000,300,300,CONT_DIF_P,249nymous_ ++B 28400,12200,300,300,CONT_DIF_P,248nymous_ ++B 29600,8400,300,300,CONT_DIF_N,214nymous_ ++B 35000,1000,2300,2300,CONT_VIA3,288nymous_ ++B 11600,7400,300,300,CONT_DIF_N,173nymous_ ++B 33000,4000,300,300,CONT_VIA2,213nymous_ ++B 35000,1000,2300,2300,CONT_VIA2,287nymous_ ++B 12800,14000,300,300,CONT_DIF_P,172nymous_ ++B 26000,6200,300,300,CONT_VIA,212nymous_ ++B 12800,13000,300,300,CONT_DIF_P,171nymous_ ++B 12800,12000,300,300,CONT_DIF_P,170nymous_ ++B 28400,14000,300,300,CONT_DIF_P,250nymous_ ++B 35000,16000,2300,2300,CONT_VIA2,290nymous_ ++B 32000,8400,300,300,CONT_DIF_N,215nymous_ ++B 35000,1000,2300,2300,CONT_VIA4,289nymous_ ++B 11600,8200,300,300,CONT_DIF_N,174nymous_ ++B 14000,16200,300,300,CONT_VIA,133nymous_ ++B 11600,9200,300,300,CONT_VIA,175nymous_ ++B 27200,8400,300,300,CONT_DIF_N,216nymous_ ++B 11600,10200,300,300,CONT_POLY,176nymous_ ++B 5000,7000,2300,2300,CONT_VIA2,291nymous_ ++B 32000,6200,300,300,CONT_BODY_P,217nymous_ ++B 28400,15000,300,300,CONT_DIF_P,251nymous_ ++B 11600,11200,300,300,CONT_VIA,177nymous_ ++B 5000,1000,2300,2300,CONT_VIA2,292nymous_ ++B 29600,9200,300,300,CONT_DIF_N,252nymous_ ++B 5000,1000,2300,2300,CONT_VIA3,293nymous_ ++B 29600,10200,300,300,CONT_POLY,253nymous_ ++B 5000,1000,2300,2300,CONT_VIA4,294nymous_ ++B 11600,12200,300,300,CONT_DIF_P,178nymous_ ++B 29600,6200,300,300,CONT_BODY_P,219nymous_ ++B 11600,13000,300,300,CONT_DIF_P,179nymous_ ++B 28400,6200,300,300,CONT_BODY_P,220nymous_ ++B 29600,12000,300,300,CONT_DIF_P,254nymous_ ++B 11600,14000,300,300,CONT_DIF_P,180nymous_ ++B 30800,6200,300,300,CONT_BODY_P,218nymous_ ++B 12800,16200,300,300,CONT_VIA2,137nymous_ ++B 30800,8200,300,300,CONT_DIF_N,257nymous_ ++B 11600,16200,300,300,CONT_VIA2,136nymous_ ++B 29600,14000,300,300,CONT_DIF_P,256nymous_ ++B 11600,16200,300,300,CONT_VIA,135nymous_ ++B 12800,16200,300,300,CONT_VIA,134nymous_ ++B 5000,13000,2300,2300,CONT_VIA2,295nymous_ ++B 29600,13000,300,300,CONT_DIF_P,255nymous_ ++B 14000,7400,300,300,CONT_VIA2,140nymous_ ++B 14000,6200,300,300,CONT_VIA2,139nymous_ ++B 14000,16200,300,300,CONT_VIA2,138nymous_ ++B 9000,1000,2300,2300,CONT_VIA4,299nymous_ ++B 30800,9200,300,300,CONT_DIF_N,258nymous_ ++B 9000,1000,2300,2300,CONT_VIA3,298nymous_ ++B 10400,10200,300,300,CONT_POLY,183nymous_ ++B 9000,1000,2300,2300,CONT_VIA2,297nymous_ ++B 10400,9200,300,300,CONT_DIF_N,182nymous_ ++B 26000,6200,300,300,CONT_BODY_P,222nymous_ ++B 9000,10000,2300,2300,CONT_VIA2,296nymous_ ++B 14000,7400,300,300,CONT_VIA,141nymous_ ++B 11600,15000,300,300,CONT_DIF_P,181nymous_ ++B 27200,6200,300,300,CONT_BODY_P,221nymous_ ++B 17000,25000,4300,2300,CONT_VIA,301nymous_ ++B 10400,14000,300,300,CONT_DIF_P,186nymous_ ++B 30800,13000,300,300,CONT_DIF_P,260nymous_ ++B 28400,16200,300,300,CONT_BODY_N,226nymous_ ++B 9000,16000,2300,2300,CONT_VIA2,300nymous_ ++B 8000,8400,300,300,CONT_DIF_N,145nymous_ ++B 10400,13000,300,300,CONT_DIF_P,185nymous_ ++B 30800,12000,300,300,CONT_DIF_P,259nymous_ ++B 29600,16200,300,300,CONT_BODY_N,225nymous_ ++B 10400,8400,300,300,CONT_DIF_N,144nymous_ ++B 10400,12000,300,300,CONT_DIF_P,184nymous_ ++B 32000,16200,300,300,CONT_BODY_N,224nymous_ ++B 7000,4000,300,300,CONT_VIA2,143nymous_ ++B 30800,16200,300,300,CONT_BODY_N,223nymous_ ++B 14000,6200,300,300,CONT_VIA,142nymous_ ++B 17000,31000,4300,2300,CONT_VIA,303nymous_ ++B 30800,15000,300,300,CONT_DIF_P,262nymous_ ++B 30800,14000,300,300,CONT_DIF_P,261nymous_ ++B 9200,8200,300,300,CONT_DIF_N,187nymous_ ++B 17000,25000,4300,2300,CONT_VIA2,302nymous_ ++B 8000,6200,300,300,CONT_BODY_P,147nymous_ ++B 27200,16200,300,300,CONT_BODY_N,227nymous_ ++B 12800,8400,300,300,CONT_DIF_N,146nymous_ ++B 17000,19000,4300,2300,CONT_VIA,307nymous_ ++B 17000,37000,4300,2300,CONT_VIA2,306nymous_ ++B 32000,12800,300,300,CONT_DIF_P,265nymous_ ++B 17000,37000,4300,2300,CONT_VIA,305nymous_ ++B 9200,13000,300,300,CONT_DIF_P,190nymous_ ++B 32000,11800,300,300,CONT_DIF_P,264nymous_ ++B 17000,31000,4300,2300,CONT_VIA2,304nymous_ ++B 10400,6200,300,300,CONT_BODY_P,149nymous_ ++B 9200,12000,300,300,CONT_DIF_P,189nymous_ ++B 32000,9200,300,300,CONT_DIF_N,263nymous_ ++B 9200,6200,300,300,CONT_BODY_P,148nymous_ ++B 9200,9200,300,300,CONT_DIF_N,188nymous_ ++B 26000,16200,300,300,CONT_BODY_N,228nymous_ ++B 8000,11800,300,300,CONT_DIF_P,194nymous_ ++B 19000,1000,2300,2300,CONT_VIA3,309nymous_ ++B 19000,1000,2300,2300,CONT_VIA4,310nymous_ ++B 29600,11200,200,200,CONT_TURN1,229nymous_ ++B 26000,7400,300,300,CONT_DIF_N,230nymous_ ++B 11600,6200,300,300,CONT_BODY_P,150nymous_ ++B 9200,14000,300,300,CONT_DIF_P,191nymous_ ++B 12800,6200,300,300,CONT_BODY_P,151nymous_ ++B 33000,10200,300,300,CONT_POLY,266nymous_ ++B 9200,15000,300,300,CONT_DIF_P,192nymous_ ++B 8000,9200,300,300,CONT_DIF_N,193nymous_ ++B 17000,19000,4300,2300,CONT_VIA2,308nymous_ ++B 30800,7400,300,300,CONT_DIF_N,268nymous_ ++B 28400,2000,300,300,CONT_VIA2,269nymous_ ++B 8000,12800,300,300,CONT_DIF_P,195nymous_ ++B 27200,2000,300,300,CONT_VIA2,270nymous_ ++B 7000,10200,300,300,CONT_POLY,196nymous_ ++B 7000,10200,300,300,CONT_VIA,197nymous_ ++B 26000,8200,300,300,CONT_DIF_N,231nymous_ ++B 26000,12200,300,300,CONT_DIF_P,232nymous_ ++B 14000,6200,300,300,CONT_BODY_P,152nymous_ ++B 26000,13000,300,300,CONT_DIF_P,233nymous_ ++B 33000,10200,300,300,CONT_VIA,267nymous_ ++B 26000,14000,300,300,CONT_DIF_P,234nymous_ ++B 8000,16200,300,300,CONT_BODY_N,154nymous_ ++B 26000,15000,300,300,CONT_DIF_P,235nymous_ ++B 10400,16200,300,300,CONT_BODY_N,155nymous_ ++B 27200,9200,300,300,CONT_DIF_N,236nymous_ ++B 11600,16200,300,300,CONT_BODY_N,156nymous_ ++B 27200,9200,300,300,CONT_VIA,237nymous_ ++B 28400,1000,300,300,CONT_VIA2,271nymous_ ++B 27200,10200,300,300,CONT_POLY,238nymous_ ++B 27200,1000,300,300,CONT_VIA2,272nymous_ ++B 9200,7400,300,300,CONT_DIF_N,198nymous_ ++B 23000,25000,4300,2300,CONT_VIA,273nymous_ ++B 11600,2000,300,300,CONT_VIA2,199nymous_ ++B 9200,16200,300,300,CONT_BODY_N,153nymous_ ++B 12800,2000,300,300,CONT_VIA2,200nymous_ ++B 11600,1000,300,300,CONT_VIA2,201nymous_ ++B 27200,13000,300,300,CONT_DIF_P,241nymous_ ++B 12800,1000,300,300,CONT_VIA2,202nymous_ ++B 12800,16200,300,300,CONT_BODY_N,157nymous_ ++B 14000,16200,300,300,CONT_BODY_N,158nymous_ ++B 27200,11200,300,300,CONT_VIA,239nymous_ ++B 10400,11200,200,200,CONT_TURN1,159nymous_ ++B 27200,12000,300,300,CONT_DIF_P,240nymous_ ++B 23000,25000,4300,2300,CONT_VIA2,274nymous_ ++B 23000,31000,4300,2300,CONT_VIA,275nymous_ ++B 14000,7400,300,300,CONT_DIF_N,160nymous_ ++B 27200,14000,300,300,CONT_DIF_P,242nymous_ ++B 14000,8200,300,300,CONT_DIF_N,161nymous_ ++B 23000,31000,4300,2300,CONT_VIA2,276nymous_ ++B 14000,12200,300,300,CONT_DIF_P,162nymous_ ++B 23000,37000,4300,2300,CONT_VIA,277nymous_ ++B 26000,16200,300,300,CONT_VIA,203nymous_ ++B 28400,7400,300,300,CONT_DIF_N,243nymous_ ++B 14000,13000,300,300,CONT_DIF_P,163nymous_ ++B 28400,8200,300,300,CONT_DIF_N,244nymous_ ++B 23000,37000,4300,2300,CONT_VIA2,278nymous_ ++B 27200,16200,300,300,CONT_VIA,204nymous_ ++B 14000,14000,300,300,CONT_DIF_P,164nymous_ ++B 28400,9200,300,300,CONT_VIA,245nymous_ ++B 23000,19000,4300,2300,CONT_VIA,279nymous_ ++B 28400,16200,300,300,CONT_VIA,205nymous_ ++B 14000,15000,300,300,CONT_DIF_P,165nymous_ ++B 23000,19000,4300,2300,CONT_VIA2,280nymous_ ++B 28400,16200,300,300,CONT_VIA2,206nymous_ ++B 31000,7000,2300,2300,CONT_VIA2,281nymous_ ++B 27200,16200,300,300,CONT_VIA2,207nymous_ ++B 31000,1000,2300,2300,CONT_VIA2,282nymous_ ++B 12800,9200,300,300,CONT_VIA,167nymous_ ++B 26000,16200,300,300,CONT_VIA2,208nymous_ ++B 12800,10200,300,300,CONT_POLY,168nymous_ ++B 31000,1000,2300,2300,CONT_VIA3,283nymous_ ++B 26000,6200,300,300,CONT_VIA2,209nymous_ ++B 31000,1000,2300,2300,CONT_VIA4,284nymous_ ++B 28400,10200,300,300,CONT_POLY,246nymous_ ++B 12800,9200,300,300,CONT_DIF_N,166nymous_ ++B 28400,11200,300,300,CONT_VIA,247nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pvsseck_mpx.vbe b/alliance/src/cells/src/mpxlib/pvsseck_mpx.vbe +new file mode 100644 +index 0000000..3ef6010 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvsseck_mpx.vbe +@@ -0,0 +1,31 @@ ++ENTITY pvsseck_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_ck : NATURAL := 127; ++ CONSTANT tpll_ck : NATURAL := 1055; ++ CONSTANT rdown_ck : NATURAL := 126; ++ CONSTANT tphh_ck : NATURAL := 963; ++ CONSTANT rup_ck : NATURAL := 183 ++ ); ++ PORT ( ++ cko : out WOR_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvsseck_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pvsseck_mpx IS ++ ++BEGIN ++ label0 : BLOCK ('1' = '1') ++ BEGIN ++ cko <= GUARDED ck; ++ END BLOCK label0; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvsseck_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pvssi_mpx.ap b/alliance/src/cells/src/mpxlib/pvssi_mpx.ap +new file mode 100644 +index 0000000..1073dd8 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvssi_mpx.ap +@@ -0,0 +1,86 @@ ++V ALLIANCE : 6 ++H pvssi_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 31200,6000,32800,6000,12000,13onymous_,RIGHT,TALU2 ++S 7200,6000,8800,6000,12000,11onymous_,RIGHT,TALU2 ++S 50,6000,2800,6000,12000,10onymous_,RIGHT,TALU2 ++S 13200,6000,26800,6000,12000,12onymous_,RIGHT,TALU2 ++S 13200,6000,26800,6000,12000,17onymous_,RIGHT,TALU4 ++S 50,6000,2800,6000,12000,15onymous_,RIGHT,TALU4 ++S 37200,6000,39950,6000,12000,14onymous_,RIGHT,TALU2 ++S 7200,6000,8800,6000,12000,16onymous_,RIGHT,TALU4 ++S 31200,6000,32800,6000,12000,18onymous_,RIGHT,TALU4 ++S 37200,6000,39950,6000,12000,19onymous_,RIGHT,TALU4 ++S 17000,6100,17000,59900,4400,21onymous_,UP,ALU1 ++S 8000,200,8000,2000,2000,1nonymous_,UP,TALU3 ++S 1400,200,1400,2000,3000,0nonymous_,UP,TALU3 ++S 0,6000,40000,6000,12000,20onymous_,RIGHT,TALU6 ++S 20000,200,20000,2000,14000,2nonymous_,UP,TALU3 ++S 23000,6100,23000,59900,4400,22onymous_,UP,ALU1 ++S 32000,200,32000,2000,2000,3nonymous_,UP,TALU3 ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 38600,200,38600,2000,3000,4nonymous_,UP,TALU3 ++S 1400,200,1400,12000,3000,5nonymous_,UP,TALU5 ++S 20000,200,20000,12000,14000,7nonymous_,UP,TALU5 ++S 8000,200,8000,12000,2000,6nonymous_,UP,TALU5 ++S 32000,200,32000,12000,2000,8nonymous_,UP,TALU5 ++S 38600,200,38600,12000,3000,9nonymous_,UP,TALU5 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 20000,48100,20000,71900,24400,vssi,UP,CALU1 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 5000,-300,5000,17300,2400,vssi,UP,CALU2 ++S 5000,-300,5000,2300,2400,vssi,UP,CALU3 ++S 5000,0,5000,2000,2400,vssi,UP,CALU5 ++S 5000,0,5000,2000,2400,vssi,UP,CALU4 ++S 29000,-300,29000,17300,2400,vssi,UP,CALU2 ++S 29000,-300,29000,2300,2400,vssi,UP,CALU3 ++S 29000,0,29000,2000,2400,vssi,UP,CALU5 ++S 29000,0,29000,2000,2400,vssi,UP,CALU4 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 35000,0,35000,2000,2400,vddi,UP,CALU4 ++S 35000,0,35000,2000,2400,vddi,UP,CALU5 ++S 35000,-300,35000,2300,2400,vddi,UP,CALU3 ++S 35000,-300,35000,17300,2400,vddi,UP,CALU2 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 11000,0,11000,2000,2400,vddi,UP,CALU4 ++S 11000,0,11000,2000,2400,vddi,UP,CALU5 ++S 11000,-300,11000,2300,2400,vddi,UP,CALU3 ++S 11000,-300,11000,17300,2400,vddi,UP,CALU2 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++B 29000,7000,2300,2300,CONT_VIA2,46onymous_ ++B 35000,16000,2300,2300,CONT_VIA2,37onymous_ ++B 23000,13000,4300,2300,CONT_VIA2,47onymous_ ++B 5000,1000,2300,2300,CONT_VIA2,35onymous_ ++B 5000,7000,2300,2300,CONT_VIA2,36onymous_ ++B 23000,13000,4300,2300,CONT_VIA,48onymous_ ++B 35000,1000,2300,2300,CONT_VIA4,38onymous_ ++B 35000,10000,2300,2300,CONT_VIA2,41onymous_ ++B 35000,1000,2300,2300,CONT_VIA2,40onymous_ ++B 23000,7000,4300,2300,CONT_VIA2,49onymous_ ++B 35000,1000,2300,2300,CONT_VIA3,39onymous_ ++B 29000,13000,2300,2300,CONT_VIA2,42onymous_ ++B 29000,1000,2300,2300,CONT_VIA4,43onymous_ ++B 23000,7000,4300,2300,CONT_VIA,50onymous_ ++B 17000,7000,4300,2300,CONT_VIA2,25onymous_ ++B 17000,13000,4300,2300,CONT_VIA2,23onymous_ ++B 17000,13000,4300,2300,CONT_VIA,24onymous_ ++B 11000,1000,2300,2300,CONT_VIA4,28onymous_ ++B 17000,7000,4300,2300,CONT_VIA,26onymous_ ++B 11000,16000,2300,2300,CONT_VIA2,27onymous_ ++B 11000,10000,2300,2300,CONT_VIA2,31onymous_ ++B 11000,1000,2300,2300,CONT_VIA2,30onymous_ ++B 11000,1000,2300,2300,CONT_VIA3,29onymous_ ++B 29000,1000,2300,2300,CONT_VIA2,45onymous_ ++B 5000,1000,2300,2300,CONT_VIA4,33onymous_ ++B 5000,13000,2300,2300,CONT_VIA2,32onymous_ ++B 29000,1000,2300,2300,CONT_VIA3,44onymous_ ++B 5000,1000,2300,2300,CONT_VIA3,34onymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pvssi_mpx.vbe b/alliance/src/cells/src/mpxlib/pvssi_mpx.vbe +new file mode 100644 +index 0000000..a2d978a +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvssi_mpx.vbe +@@ -0,0 +1,20 @@ ++ENTITY pvssi_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000 ++ ); ++ PORT ( ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvssi_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pvssi_mpx IS ++ ++BEGIN ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvssi_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/mpxlib/pvssick_mpx.ap b/alliance/src/cells/src/mpxlib/pvssick_mpx.ap +new file mode 100644 +index 0000000..5f10aff +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvssick_mpx.ap +@@ -0,0 +1,337 @@ ++V ALLIANCE : 6 ++H pvssick_mpx,P,14/9/2014,100 ++A 0,0,40000,80000 ++I 0,40000,padreal_mpx,padreal,NOSYM ++S 700,4000,39300,4000,1000,ck,RIGHT,CALU3 ++S 700,22000,39300,22000,2400,vdde,RIGHT,CALU3 ++S 700,28000,39300,28000,2400,vdde,RIGHT,CALU3 ++S 700,34000,39300,34000,2400,vdde,RIGHT,CALU3 ++S 35000,-300,35000,2300,2400,vddi,UP,CALU3 ++S 35000,0,35000,2000,2400,vddi,UP,CALU5 ++S 8100,15600,13900,15600,1600,vddi,RIGHT,ALU1 ++S 9000,-300,9000,17300,2400,vddi,UP,CALU2 ++S 700,16000,39300,16000,2400,vddi,RIGHT,CALU3 ++S 700,10000,39300,10000,2400,vddi,RIGHT,CALU3 ++S 35000,-300,35000,17300,2400,vddi,UP,CALU2 ++S 35000,0,35000,2000,2400,vddi,UP,CALU4 ++S 26100,15600,31900,15600,1600,vddi,RIGHT,ALU1 ++S 9000,-300,9000,2300,2400,vddi,UP,CALU3 ++S 9000,0,9000,2000,2400,vddi,UP,CALU4 ++S 9000,0,9000,2000,2400,vddi,UP,CALU5 ++S 700,25000,39300,25000,2400,vsse,RIGHT,CALU3 ++S 700,31000,39300,31000,2400,vsse,RIGHT,CALU3 ++S 700,37000,39300,37000,2400,vsse,RIGHT,CALU3 ++S 700,19000,39300,19000,2400,vsse,RIGHT,CALU3 ++S 5000,-300,5000,17300,2400,vssi,UP,CALU2 ++S 700,7000,39300,7000,2400,vssi,RIGHT,CALU3 ++S 8100,6800,13900,6800,1600,vssi,RIGHT,ALU1 ++S 700,13000,39300,13000,2400,vssi,RIGHT,CALU3 ++S 5000,-300,5000,2300,2400,vssi,UP,CALU3 ++S 5000,0,5000,2000,2400,vssi,UP,CALU5 ++S 26100,6800,31900,6800,1600,vssi,RIGHT,ALU1 ++S 20000,48100,20000,71900,24400,vssi,UP,CALU1 ++S 5000,0,5000,2000,2400,vssi,UP,CALU4 ++S 31000,0,31000,2000,2400,vssi,UP,CALU5 ++S 31000,0,31000,2000,2400,vssi,UP,CALU4 ++S 31000,-300,31000,17300,2400,vssi,UP,CALU2 ++S 31000,-300,31000,2300,2400,vssi,UP,CALU3 ++S 26000,12300,26000,14900,400,10onymous_,UP,ALU1 ++S 12800,7700,12800,9300,420,92onymous_,UP,NDIF ++S 27200,8500,27200,9100,400,53onymous_,UP,ALU1 ++S 10500,9200,12700,9200,400,91onymous_,RIGHT,ALU1 ++S 26000,7500,26000,8100,400,13onymous_,UP,ALU1 ++S 50,6000,2800,6000,12000,126nymous_,RIGHT,TALU4 ++S 28400,7500,28400,8100,400,12onymous_,UP,ALU1 ++S 32000,8500,32000,12700,400,51onymous_,UP,ALU1 ++S 37200,6000,39950,6000,12000,127nymous_,RIGHT,TALU2 ++S 29600,8500,29600,9100,400,52onymous_,UP,ALU1 ++S 13400,11100,13400,15100,200,93onymous_,UP,PTRANS ++S 26100,7400,30700,7400,400,11onymous_,RIGHT,ALU1 ++S 33000,3700,33000,10500,400,55onymous_,UP,ALU2 ++S 31400,11100,31400,15100,200,17onymous_,UP,PTRANS ++S 11200,6000,16800,6000,12000,130nymous_,RIGHT,TALU2 ++S 25880,6200,32120,6200,600,54onymous_,RIGHT,PTIE ++S 32000,7700,32000,9300,620,16onymous_,UP,NDIF ++S 21200,6000,28800,6000,12000,129nymous_,RIGHT,TALU2 ++S 32000,11300,32000,14900,620,15onymous_,UP,PDIF ++S 11600,12300,11600,14900,400,58onymous_,UP,ALU1 ++S 30800,7500,30800,9100,400,14onymous_,UP,ALU1 ++S 11600,700,11600,11500,400,57onymous_,UP,ALU2 ++S 9800,10200,13400,10200,600,94onymous_,RIGHT,POLY ++S 12800,700,12800,11500,400,56onymous_,UP,ALU2 ++S 9300,7400,13900,7400,400,61onymous_,RIGHT,ALU1 ++S 14000,12300,14000,14900,400,60onymous_,UP,ALU1 ++S 9200,12100,9200,14900,400,59onymous_,UP,ALU1 ++S 13400,9800,13400,10800,200,95onymous_,UP,POLY ++S 31400,9800,31400,10800,200,19onymous_,UP,POLY ++S 50,6000,2800,6000,12000,132nymous_,RIGHT,TALU2 ++S 11600,7500,11600,8100,400,62onymous_,UP,ALU1 ++S 31400,10200,33000,10200,600,18onymous_,RIGHT,POLY ++S 13400,7500,13400,9500,200,96onymous_,UP,NTRANS ++S 14000,11300,14000,14900,620,97onymous_,UP,PDIF ++S 30800,11300,30800,14900,620,21onymous_,UP,PDIF ++S 9200,7500,9200,9100,400,64onymous_,UP,ALU1 ++S 31400,7500,31400,9500,200,20onymous_,UP,NTRANS ++S 14000,7500,14000,8100,400,63onymous_,UP,ALU1 ++S 8000,8500,8000,12700,400,101nymous_,UP,ALU1 ++S 8000,11300,8000,14900,620,65onymous_,UP,PDIF ++S 14000,7700,14000,9300,620,98onymous_,UP,NDIF ++S 7000,13800,15000,13800,6800,99onymous_,RIGHT,NWELL ++S 7880,16200,14120,16200,600,100nymous_,RIGHT,NTIE ++S 12800,8500,12800,9100,400,103nymous_,UP,ALU1 ++S 30200,7500,30200,9500,200,25onymous_,UP,NTRANS ++S 10400,8500,10400,9100,400,102nymous_,UP,ALU1 ++S 30800,7700,30800,9300,420,22onymous_,UP,NDIF ++S 8000,7700,8000,9300,620,66onymous_,UP,NDIF ++S 30200,11100,30200,15100,200,23onymous_,UP,PTRANS ++S 8600,11100,8600,15100,200,67onymous_,UP,PTRANS ++S 30200,9800,30200,10800,200,24onymous_,UP,POLY ++S 29600,7700,29600,9300,420,28onymous_,UP,NDIF ++S 29600,11300,29600,13900,400,27onymous_,UP,ALU1 ++S 29600,11300,29600,14900,620,26onymous_,UP,PDIF ++S 7880,6200,14120,6200,600,104nymous_,RIGHT,PTIE ++S 7000,3700,7000,10500,400,105nymous_,UP,ALU2 ++S 23000,6100,23000,59900,4400,107nymous_,UP,ALU1 ++S 29000,7500,29000,9500,200,31onymous_,UP,NTRANS ++S 7000,10200,8600,10200,600,68onymous_,RIGHT,POLY ++S 29000,11100,29000,15100,200,29onymous_,UP,PTRANS ++S 29000,9800,29000,10800,200,30onymous_,UP,POLY ++S 17000,6100,17000,59900,4400,106nymous_,UP,ALU1 ++S 7000,200,7000,12000,0,110nymous_,UP,TALU5 ++S 38600,200,38600,12000,3000,109nymous_,UP,TALU5 ++S 1400,200,1400,12000,3000,108nymous_,UP,TALU5 ++S 8600,9800,8600,10800,200,69onymous_,UP,POLY ++S 28400,11300,28400,14900,620,32onymous_,UP,PDIF ++S 26600,9800,26600,10800,200,45onymous_,UP,POLY ++S 26600,10200,30200,10200,600,44onymous_,RIGHT,POLY ++S 28400,7700,28400,9300,620,33onymous_,UP,NDIF ++S 8600,7500,8600,9500,200,70onymous_,UP,NTRANS ++S 27800,11100,27800,15100,200,34onymous_,UP,PTRANS ++S 14000,200,14000,12000,6000,111nymous_,UP,TALU5 ++S 27300,11200,29500,11200,400,37onymous_,RIGHT,ALU1 ++S 9800,11100,9800,15100,200,73onymous_,UP,PTRANS ++S 27800,7500,27800,9500,200,36onymous_,UP,NTRANS ++S 9200,7700,9200,9300,420,72onymous_,UP,NDIF ++S 27800,9800,27800,10800,200,35onymous_,UP,POLY ++S 26000,7700,26000,9300,620,48onymous_,UP,NDIF ++S 33000,200,33000,12000,0,113nymous_,UP,TALU5 ++S 25000,200,25000,12000,8000,112nymous_,UP,TALU5 ++S 26600,7500,26600,9500,200,46onymous_,UP,NTRANS ++S 1400,200,1400,2000,3000,114nymous_,UP,TALU3 ++S 26000,11300,26000,14900,620,47onymous_,UP,PDIF ++S 9200,11300,9200,14900,620,71onymous_,UP,PDIF ++S 9800,9800,9800,10800,200,74onymous_,UP,POLY ++S 25000,13800,33000,13800,6800,49onymous_,RIGHT,NWELL ++S 38600,200,38600,2000,3000,115nymous_,UP,TALU3 ++S 27200,11300,27200,13900,400,39onymous_,UP,ALU1 ++S 9800,7500,9800,9500,200,75onymous_,UP,NTRANS ++S 27200,11300,27200,14900,620,38onymous_,UP,PDIF ++S 10400,11300,10400,14900,620,76onymous_,UP,PDIF ++S 27300,10200,31900,10200,400,40onymous_,RIGHT,ALU1 ++S 10400,11300,10400,13900,400,77onymous_,UP,ALU1 ++S 27300,9200,29500,9200,400,41onymous_,RIGHT,ALU1 ++S 11000,9800,11000,10800,200,80onymous_,UP,POLY ++S 14000,200,14000,2000,6000,117nymous_,UP,TALU3 ++S 26600,11100,26600,15100,200,43onymous_,UP,PTRANS ++S 11000,11100,11000,15100,200,79onymous_,UP,PTRANS ++S 7000,200,7000,2000,0,116nymous_,UP,TALU3 ++S 27200,7700,27200,9300,420,42onymous_,UP,NDIF ++S 10400,7700,10400,9300,420,78onymous_,UP,NDIF ++S 11000,7500,11000,9500,200,81onymous_,UP,NTRANS ++S 25880,16200,32120,16200,600,50onymous_,RIGHT,NTIE ++S 11600,11300,11600,14900,620,82onymous_,UP,PDIF ++S 25000,200,25000,2000,8000,118nymous_,UP,TALU3 ++S 11300,1000,28700,1000,400,0nonymous_,RIGHT,ALU3 ++S 11300,2000,28700,2000,400,1nonymous_,RIGHT,ALU3 ++S 11600,7700,11600,9300,620,83onymous_,UP,NDIF ++S 25700,16200,28700,16200,400,2nonymous_,RIGHT,ALU2 ++S 12200,11100,12200,15100,200,84onymous_,UP,PTRANS ++S 10500,11200,12700,11200,400,87onymous_,RIGHT,ALU1 ++S 14000,5900,14000,7700,400,4nonymous_,UP,ALU2 ++S 12200,7500,12200,9500,200,86onymous_,UP,NTRANS ++S 26000,5900,26000,7700,400,3nonymous_,UP,ALU2 ++S 12200,9800,12200,10800,200,85onymous_,UP,POLY ++S 33000,200,33000,2000,0,119nymous_,UP,TALU3 ++S 12800,11300,12800,14900,620,88onymous_,UP,PDIF ++S 8700,16200,14300,16200,400,5nonymous_,RIGHT,ALU2 ++S 50,17000,39950,17000,10000,blockagenet,RIGHT,TALU2 ++S 0,6000,40000,6000,12000,120nymous_,RIGHT,TALU6 ++S 37200,6000,39950,6000,12000,121nymous_,RIGHT,TALU4 ++S 11200,6000,16800,6000,12000,124nymous_,RIGHT,TALU4 ++S 21200,6000,28800,6000,12000,123nymous_,RIGHT,TALU4 ++S 30800,12100,30800,14900,400,9nonymous_,UP,ALU1 ++S 27200,700,27200,11500,400,6nonymous_,UP,ALU2 ++S 19000,0,19000,2000,2400,cko,UP,CALU4 ++S 19000,0,19000,2000,2400,cko,UP,CALU5 ++S 12800,11300,12800,13900,400,89onymous_,UP,ALU1 ++S 28400,700,28400,11500,400,7nonymous_,UP,ALU2 ++S 8100,10200,12700,10200,400,90onymous_,RIGHT,ALU1 ++S 28400,12300,28400,14900,400,8nonymous_,UP,ALU1 ++B 35000,16000,2300,2300,CONT_VIA2,286nymous_ ++B 11600,1000,300,300,CONT_VIA2,211nymous_ ++B 5000,7000,2300,2300,CONT_VIA2,285nymous_ ++B 12800,1000,300,300,CONT_VIA2,210nymous_ ++B 29600,10200,300,300,CONT_POLY,169nymous_ ++B 14000,13000,300,300,CONT_DIF_P,249nymous_ ++B 14000,14000,300,300,CONT_DIF_P,248nymous_ ++B 9200,7400,300,300,CONT_DIF_N,214nymous_ ++B 35000,1000,2300,2300,CONT_VIA3,288nymous_ ++B 28400,13000,300,300,CONT_DIF_P,173nymous_ ++B 11600,2000,300,300,CONT_VIA2,213nymous_ ++B 35000,1000,2300,2300,CONT_VIA4,287nymous_ ++B 28400,14000,300,300,CONT_DIF_P,172nymous_ ++B 12800,2000,300,300,CONT_VIA2,212nymous_ ++B 28400,15000,300,300,CONT_DIF_P,171nymous_ ++B 29600,9200,300,300,CONT_DIF_N,170nymous_ ++B 14000,12200,300,300,CONT_DIF_P,250nymous_ ++B 35000,10000,2300,2300,CONT_VIA2,290nymous_ ++B 7000,10200,300,300,CONT_VIA,215nymous_ ++B 35000,1000,2300,2300,CONT_VIA2,289nymous_ ++B 28400,12200,300,300,CONT_DIF_P,174nymous_ ++B 26000,16200,300,300,CONT_VIA2,133nymous_ ++B 28400,11200,300,300,CONT_VIA,175nymous_ ++B 7000,10200,300,300,CONT_POLY,216nymous_ ++B 28400,10200,300,300,CONT_POLY,176nymous_ ++B 23000,13000,4300,2300,CONT_VIA2,291nymous_ ++B 8000,12800,300,300,CONT_DIF_P,217nymous_ ++B 14000,8200,300,300,CONT_DIF_N,251nymous_ ++B 28400,9200,300,300,CONT_VIA,177nymous_ ++B 23000,13000,4300,2300,CONT_VIA,292nymous_ ++B 14000,7400,300,300,CONT_DIF_N,252nymous_ ++B 23000,7000,4300,2300,CONT_VIA2,293nymous_ ++B 10400,11200,200,200,CONT_TURN1,253nymous_ ++B 23000,7000,4300,2300,CONT_VIA,294nymous_ ++B 28400,8200,300,300,CONT_DIF_N,178nymous_ ++B 8000,9200,300,300,CONT_DIF_N,219nymous_ ++B 28400,7400,300,300,CONT_DIF_N,179nymous_ ++B 9200,15000,300,300,CONT_DIF_P,220nymous_ ++B 14000,16200,300,300,CONT_BODY_N,254nymous_ ++B 27200,14000,300,300,CONT_DIF_P,180nymous_ ++B 8000,11800,300,300,CONT_DIF_P,218nymous_ ++B 27200,16200,300,300,CONT_VIA,137nymous_ ++B 10400,16200,300,300,CONT_BODY_N,257nymous_ ++B 28400,16200,300,300,CONT_VIA,136nymous_ ++B 11600,16200,300,300,CONT_BODY_N,256nymous_ ++B 28400,16200,300,300,CONT_VIA2,135nymous_ ++B 27200,16200,300,300,CONT_VIA2,134nymous_ ++B 31000,1000,2300,2300,CONT_VIA4,295nymous_ ++B 12800,16200,300,300,CONT_BODY_N,255nymous_ ++B 26000,7400,300,300,CONT_VIA,140nymous_ ++B 26000,6200,300,300,CONT_VIA,139nymous_ ++B 26000,16200,300,300,CONT_VIA,138nymous_ ++B 31000,1000,2300,2300,CONT_VIA2,299nymous_ ++B 8000,16200,300,300,CONT_BODY_N,258nymous_ ++B 31000,7000,2300,2300,CONT_VIA2,298nymous_ ++B 27200,11200,300,300,CONT_VIA,183nymous_ ++B 31000,13000,2300,2300,CONT_VIA2,297nymous_ ++B 27200,12000,300,300,CONT_DIF_P,182nymous_ ++B 9200,13000,300,300,CONT_DIF_P,222nymous_ ++B 31000,1000,2300,2300,CONT_VIA3,296nymous_ ++B 27200,13000,300,300,CONT_DIF_P,181nymous_ ++B 9200,14000,300,300,CONT_DIF_P,221nymous_ ++B 26000,7400,300,300,CONT_VIA2,141nymous_ ++B 27200,9200,300,300,CONT_DIF_N,186nymous_ ++B 14000,6200,300,300,CONT_BODY_P,260nymous_ ++B 10400,14000,300,300,CONT_DIF_P,226nymous_ ++B 27200,9200,300,300,CONT_VIA,185nymous_ ++B 14000,6200,300,300,CONT_VIA,145nymous_ ++B 9200,16200,300,300,CONT_BODY_N,259nymous_ ++B 9200,8200,300,300,CONT_DIF_N,225nymous_ ++B 14000,6200,300,300,CONT_VIA2,144nymous_ ++B 27200,10200,300,300,CONT_POLY,184nymous_ ++B 9200,9200,300,300,CONT_DIF_N,224nymous_ ++B 14000,7400,300,300,CONT_VIA2,143nymous_ ++B 9200,12000,300,300,CONT_DIF_P,223nymous_ ++B 26000,6200,300,300,CONT_VIA2,142nymous_ ++B 11600,6200,300,300,CONT_BODY_P,262nymous_ ++B 12800,6200,300,300,CONT_BODY_P,261nymous_ ++B 26000,15000,300,300,CONT_DIF_P,187nymous_ ++B 10400,13000,300,300,CONT_DIF_P,227nymous_ ++B 14000,7400,300,300,CONT_VIA,146nymous_ ++B 8000,6200,300,300,CONT_BODY_P,265nymous_ ++B 26000,12200,300,300,CONT_DIF_P,190nymous_ ++B 9200,6200,300,300,CONT_BODY_P,264nymous_ ++B 26000,13000,300,300,CONT_DIF_P,189nymous_ ++B 11600,16200,300,300,CONT_VIA,149nymous_ ++B 10400,6200,300,300,CONT_BODY_P,263nymous_ ++B 12800,16200,300,300,CONT_VIA,148nymous_ ++B 26000,14000,300,300,CONT_DIF_P,188nymous_ ++B 14000,16200,300,300,CONT_VIA,147nymous_ ++B 10400,12000,300,300,CONT_DIF_P,228nymous_ ++B 26000,16200,300,300,CONT_BODY_N,194nymous_ ++B 10400,10200,300,300,CONT_POLY,229nymous_ ++B 10400,9200,300,300,CONT_DIF_N,230nymous_ ++B 27200,1000,300,300,CONT_VIA2,150nymous_ ++B 26000,8200,300,300,CONT_DIF_N,191nymous_ ++B 28400,1000,300,300,CONT_VIA2,151nymous_ ++B 12800,8400,300,300,CONT_DIF_N,266nymous_ ++B 29600,11200,200,200,CONT_TURN1,193nymous_ ++B 26000,7400,300,300,CONT_DIF_N,192nymous_ ++B 10400,8400,300,300,CONT_DIF_N,268nymous_ ++B 7000,4000,300,300,CONT_VIA2,269nymous_ ++B 27200,16200,300,300,CONT_BODY_N,195nymous_ ++B 9000,1000,2300,2300,CONT_VIA2,270nymous_ ++B 28400,16200,300,300,CONT_BODY_N,196nymous_ ++B 29600,16200,300,300,CONT_BODY_N,197nymous_ ++B 11600,15000,300,300,CONT_DIF_P,231nymous_ ++B 11600,14000,300,300,CONT_DIF_P,232nymous_ ++B 27200,2000,300,300,CONT_VIA2,152nymous_ ++B 11600,13000,300,300,CONT_DIF_P,233nymous_ ++B 8000,8400,300,300,CONT_DIF_N,267nymous_ ++B 11600,12200,300,300,CONT_DIF_P,234nymous_ ++B 30800,7400,300,300,CONT_DIF_N,154nymous_ ++B 11600,11200,300,300,CONT_VIA,235nymous_ ++B 33000,10200,300,300,CONT_VIA,155nymous_ ++B 11600,10200,300,300,CONT_POLY,236nymous_ ++B 33000,10200,300,300,CONT_POLY,156nymous_ ++B 11600,9200,300,300,CONT_VIA,237nymous_ ++B 9000,16000,2300,2300,CONT_VIA2,271nymous_ ++B 11600,8200,300,300,CONT_DIF_N,238nymous_ ++B 9000,10000,2300,2300,CONT_VIA2,272nymous_ ++B 32000,16200,300,300,CONT_BODY_N,198nymous_ ++B 9000,1000,2300,2300,CONT_VIA3,273nymous_ ++B 30800,16200,300,300,CONT_BODY_N,199nymous_ ++B 28400,2000,300,300,CONT_VIA2,153nymous_ ++B 26000,6200,300,300,CONT_BODY_P,200nymous_ ++B 27200,6200,300,300,CONT_BODY_P,201nymous_ ++B 12800,13000,300,300,CONT_DIF_P,241nymous_ ++B 28400,6200,300,300,CONT_BODY_P,202nymous_ ++B 32000,12800,300,300,CONT_DIF_P,157nymous_ ++B 32000,11800,300,300,CONT_DIF_P,158nymous_ ++B 11600,7400,300,300,CONT_DIF_N,239nymous_ ++B 32000,9200,300,300,CONT_DIF_N,159nymous_ ++B 12800,14000,300,300,CONT_DIF_P,240nymous_ ++B 9000,1000,2300,2300,CONT_VIA4,274nymous_ ++B 19000,1000,2300,2300,CONT_VIA4,275nymous_ ++B 30800,15000,300,300,CONT_DIF_P,160nymous_ ++B 12800,12000,300,300,CONT_DIF_P,242nymous_ ++B 30800,14000,300,300,CONT_DIF_P,161nymous_ ++B 19000,1000,2300,2300,CONT_VIA3,276nymous_ ++B 30800,13000,300,300,CONT_DIF_P,162nymous_ ++B 17000,13000,4300,2300,CONT_VIA2,277nymous_ ++B 29600,6200,300,300,CONT_BODY_P,203nymous_ ++B 12800,11200,300,300,CONT_VIA,243nymous_ ++B 30800,12000,300,300,CONT_DIF_P,163nymous_ ++B 12800,10200,300,300,CONT_POLY,244nymous_ ++B 17000,13000,4300,2300,CONT_VIA,278nymous_ ++B 30800,6200,300,300,CONT_BODY_P,204nymous_ ++B 30800,9200,300,300,CONT_DIF_N,164nymous_ ++B 12800,9200,300,300,CONT_VIA,245nymous_ ++B 17000,7000,4300,2300,CONT_VIA2,279nymous_ ++B 32000,6200,300,300,CONT_BODY_P,205nymous_ ++B 30800,8200,300,300,CONT_DIF_N,165nymous_ ++B 17000,7000,4300,2300,CONT_VIA,280nymous_ ++B 27200,8400,300,300,CONT_DIF_N,206nymous_ ++B 5000,13000,2300,2300,CONT_VIA2,281nymous_ ++B 32000,8400,300,300,CONT_DIF_N,207nymous_ ++B 5000,1000,2300,2300,CONT_VIA4,282nymous_ ++B 29600,13000,300,300,CONT_DIF_P,167nymous_ ++B 29600,8400,300,300,CONT_DIF_N,208nymous_ ++B 29600,12000,300,300,CONT_DIF_P,168nymous_ ++B 5000,1000,2300,2300,CONT_VIA3,283nymous_ ++B 33000,4000,300,300,CONT_VIA2,209nymous_ ++B 5000,1000,2300,2300,CONT_VIA2,284nymous_ ++B 12800,9200,300,300,CONT_DIF_N,246nymous_ ++B 29600,14000,300,300,CONT_DIF_P,166nymous_ ++B 14000,15000,300,300,CONT_DIF_P,247nymous_ ++EOF +diff --git a/alliance/src/cells/src/mpxlib/pvssick_mpx.vbe b/alliance/src/cells/src/mpxlib/pvssick_mpx.vbe +new file mode 100644 +index 0000000..95d24f3 +--- /dev/null ++++ b/alliance/src/cells/src/mpxlib/pvssick_mpx.vbe +@@ -0,0 +1,32 @@ ++ENTITY pvssick_mpx IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_ck : NATURAL := 127; ++ CONSTANT tpll_ck : NATURAL := 1235; ++ CONSTANT rdown_ck : NATURAL := 253; ++ CONSTANT tphh_ck : NATURAL := 1109; ++ CONSTANT rup_ck : NATURAL := 311 ++ ); ++ PORT ( ++ cko : out WOR_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvssick_mpx; ++ ++ARCHITECTURE behaviour_data_flow OF pvssick_mpx IS ++ ++BEGIN ++ ++ label0 : BLOCK ('1' = '1') ++ BEGIN ++ cko <= GUARDED ck; ++ END BLOCK label0; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvssick_mpx" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/CATAL b/alliance/src/cells/src/msxlib/CATAL +new file mode 100644 +index 0000000..6fd9b7e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/CATAL +@@ -0,0 +1,123 @@ ++an2_x05 C ++an2_x1 C ++an2_x2 C ++an3_x1 C ++an3_x2 C ++an4_x1 C ++an4_x2 C ++an4_x3 C ++aoi21_x05 C ++aoi21_x1 C ++aoi21_x2 C ++aoi22_x05 C ++aoi22_x1 C ++aoi22_x2 C ++aon21_x1 C ++aon21_x2 C ++aon22_x1 C ++aon22_x2 C ++bf1_w05 C ++bf1_w2 C ++bf1_x1 C ++bf1_x2 C ++bf1_x4 C ++bf1_x8 C ++bf1_y05 C ++bf1_y1 C ++bf1_y2 C ++cgi2a_x05 C ++cgi2a_x1 C ++cgi2a_x2 C ++cgi2_x05 C ++cgi2_x1 C ++cgi2_x2 C ++cgn2_x1 C ++cgn2_x2 C ++cgn2_x3 C ++cgn2_x4 C ++ha2_x2 C ++iv1_w2 C ++iv1_x05 C ++iv1_x1 C ++iv1_x2 C ++iv1_x3 C ++iv1_x4 C ++iv1_x8 C ++iv1_y2 C ++mxi2_x05 C ++mxi2_x1 C ++nd2ab_x1 C ++nd2ab_x2 C ++nd2a_x1 C ++nd2a_x2 C ++nd2_x05 C ++nd2_x1 C ++nd2_x2 C ++nd2_x4 C ++nd3_x05 C ++nd3_x1 C ++nd3_x2 C ++nd3_x4 C ++nd4_x05 C ++nd4_x1 C ++nd4_x2 C ++nd4_x3 C ++nr2a_x05 C ++nr2a_x1 C ++nr2_x05 C ++nr2_x1 C ++nr2_x2 C ++nr3_x05 C ++nr3_x1 C ++nr4_x05 C ++nr4_x1 C ++oai21_x05 C ++oai21_x1 C ++oai21_x2 C ++oai22_x05 C ++oai22_x1 C ++oai22_x2 C ++oan21_x1 C ++oan21_x2 C ++oan22_x1 C ++oan22_x2 C ++or2_x1 C ++or3_x1 C ++or4_x1 C ++powmid_x0 C ++powmid_x0 F ++rowend_x0 C ++rowend_x0 F ++sff1_x4 C ++sff2_x4 C ++sff3_x4 C ++tie_x0 C ++tie_x0 F ++vddtie C ++vfeed1 C ++vfeed1 F ++vfeed2 C ++vfeed2 F ++vfeed3 C ++vfeed3 F ++vfeed4 C ++vfeed4 F ++vfeed5 C ++vfeed5 F ++vfeed6 C ++vfeed6 F ++vfeed7 C ++vfeed7 F ++vfeed8 C ++vfeed8 F ++vsstie C ++xaoi21_x05 C ++xaoi21_x1 C ++xaon21_x05 C ++xaon21_x1 C ++xaon22_x05 C ++xaon22_x1 C ++xnr2_x05 C ++xnr2_x1 C ++xor2_x05 C ++xor2_x1 C +diff --git a/alliance/src/cells/src/msxlib/Makefile.am b/alliance/src/cells/src/msxlib/Makefile.am +new file mode 100644 +index 0000000..d67fc5b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/Makefile.am +@@ -0,0 +1,232 @@ ++ ++msxlibdir=$(prefix)/cells/msxlib ++ ++msxlib_DATA=CATAL \ ++ an2_x05.ap \ ++ an2_x05.vbe \ ++ an2_x1.ap \ ++ an2_x1.vbe \ ++ an2_x2.ap \ ++ an2_x2.vbe \ ++ an3_x1.ap \ ++ an3_x1.vbe \ ++ an3_x2.ap \ ++ an3_x2.vbe \ ++ an4_x1.ap \ ++ an4_x1.vbe \ ++ an4_x2.ap \ ++ an4_x2.vbe \ ++ an4_x3.ap \ ++ an4_x3.vbe \ ++ aoi21_x05.ap \ ++ aoi21_x05.vbe \ ++ aoi21_x1.ap \ ++ aoi21_x1.vbe \ ++ aoi21_x2.ap \ ++ aoi21_x2.vbe \ ++ aoi22_x05.ap \ ++ aoi22_x05.vbe \ ++ aoi22_x1.ap \ ++ aoi22_x1.vbe \ ++ aoi22_x2.ap \ ++ aoi22_x2.vbe \ ++ aon21_x1.ap \ ++ aon21_x1.vbe \ ++ aon21_x2.ap \ ++ aon21_x2.vbe \ ++ aon22_x1.ap \ ++ aon22_x1.vbe \ ++ aon22_x2.ap \ ++ aon22_x2.vbe \ ++ bf1_w05.ap \ ++ bf1_w05.vbe \ ++ bf1_w2.ap \ ++ bf1_w2.vbe \ ++ bf1_x1.ap \ ++ bf1_x1.vbe \ ++ bf1_x2.ap \ ++ bf1_x2.vbe \ ++ bf1_x4.ap \ ++ bf1_x4.vbe \ ++ bf1_x8.ap \ ++ bf1_x8.vbe \ ++ bf1_y05.ap \ ++ bf1_y05.vbe \ ++ bf1_y1.ap \ ++ bf1_y1.vbe \ ++ bf1_y2.ap \ ++ bf1_y2.vbe \ ++ cgi2a_x05.ap \ ++ cgi2a_x05.vbe \ ++ cgi2a_x1.ap \ ++ cgi2a_x1.vbe \ ++ cgi2a_x2.ap \ ++ cgi2a_x2.vbe \ ++ cgi2_x05.ap \ ++ cgi2_x05.vbe \ ++ cgi2_x1.ap \ ++ cgi2_x1.vbe \ ++ cgi2_x2.ap \ ++ cgi2_x2.vbe \ ++ cgn2_x1.ap \ ++ cgn2_x1.vbe \ ++ cgn2_x2.ap \ ++ cgn2_x2.vbe \ ++ cgn2_x3.ap \ ++ cgn2_x3.vbe \ ++ cgn2_x4.ap \ ++ cgn2_x4.vbe \ ++ ha2_x2.ap \ ++ ha2_x2.vbe \ ++ iv1_w2.ap \ ++ iv1_w2.vbe \ ++ iv1_x05.ap \ ++ iv1_x05.vbe \ ++ iv1_x1.ap \ ++ iv1_x1.vbe \ ++ iv1_x2.ap \ ++ iv1_x2.vbe \ ++ iv1_x3.ap \ ++ iv1_x3.vbe \ ++ iv1_x4.ap \ ++ iv1_x4.vbe \ ++ iv1_x8.ap \ ++ iv1_x8.vbe \ ++ iv1_y2.ap \ ++ iv1_y2.vbe \ ++ Makefile.am \ ++ mxi2_x05.ap \ ++ mxi2_x05.vbe \ ++ mxi2_x1.ap \ ++ mxi2_x1.vbe \ ++ nd2ab_x1.ap \ ++ nd2ab_x1.vbe \ ++ nd2ab_x2.ap \ ++ nd2ab_x2.vbe \ ++ nd2a_x1.ap \ ++ nd2a_x1.vbe \ ++ nd2a_x2.ap \ ++ nd2a_x2.vbe \ ++ nd2_x05.ap \ ++ nd2_x05.vbe \ ++ nd2_x1.ap \ ++ nd2_x1.vbe \ ++ nd2_x2.ap \ ++ nd2_x2.vbe \ ++ nd2_x4.ap \ ++ nd2_x4.vbe \ ++ nd3_x05.ap \ ++ nd3_x05.vbe \ ++ nd3_x1.ap \ ++ nd3_x1.vbe \ ++ nd3_x2.ap \ ++ nd3_x2.vbe \ ++ nd3_x4.ap \ ++ nd3_x4.vbe \ ++ nd4_x05.ap \ ++ nd4_x05.vbe \ ++ nd4_x1.ap \ ++ nd4_x1.vbe \ ++ nd4_x2.ap \ ++ nd4_x2.vbe \ ++ nd4_x3.ap \ ++ nd4_x3.vbe \ ++ nr2a_x05.ap \ ++ nr2a_x05.vbe \ ++ nr2a_x1.ap \ ++ nr2a_x1.vbe \ ++ nr2_x05.ap \ ++ nr2_x05.vbe \ ++ nr2_x1.ap \ ++ nr2_x1.vbe \ ++ nr2_x2.ap \ ++ nr2_x2.vbe \ ++ nr3_x05.ap \ ++ nr3_x05.vbe \ ++ nr3_x1.ap \ ++ nr3_x1.vbe \ ++ nr4_x05.ap \ ++ nr4_x05.vbe \ ++ nr4_x1.ap \ ++ nr4_x1.vbe \ ++ oai21_x05.ap \ ++ oai21_x05.vbe \ ++ oai21_x1.ap \ ++ oai21_x1.vbe \ ++ oai21_x2.ap \ ++ oai21_x2.vbe \ ++ oai22_x05.ap \ ++ oai22_x05.vbe \ ++ oai22_x1.ap \ ++ oai22_x1.vbe \ ++ oai22_x2.ap \ ++ oai22_x2.vbe \ ++ oan21_x1.ap \ ++ oan21_x1.vbe \ ++ oan21_x2.ap \ ++ oan21_x2.vbe \ ++ oan22_x1.ap \ ++ oan22_x1.vbe \ ++ oan22_x2.ap \ ++ oan22_x2.vbe \ ++ or2_x1.ap \ ++ or2_x1.vbe \ ++ or3_x1.ap \ ++ or3_x1.vbe \ ++ or4_x1.ap \ ++ or4_x1.vbe \ ++ powmid_x0.ap \ ++ powmid_x0.vbe \ ++ rowend_x0.ap \ ++ rowend_x0.vbe \ ++ sff1_x4.ap \ ++ sff1_x4.vbe \ ++ sff2_x4.ap \ ++ sff2_x4.vbe \ ++ sff3_x4.ap \ ++ sff3_x4.vbe \ ++ tie_x0.ap \ ++ tie_x0.vbe \ ++ vddtie.ap \ ++ vddtie.vbe \ ++ vfeed1.ap \ ++ vfeed1.vbe \ ++ vfeed2.ap \ ++ vfeed2.vbe \ ++ vfeed3.ap \ ++ vfeed3.vbe \ ++ vfeed4.ap \ ++ vfeed4.vbe \ ++ vfeed5.ap \ ++ vfeed5.vbe \ ++ vfeed6.ap \ ++ vfeed6.vbe \ ++ vfeed7.ap \ ++ vfeed7.vbe \ ++ vfeed8.ap \ ++ vfeed8.vbe \ ++ vsstie.ap \ ++ vsstie.vbe \ ++ xaoi21_x05.ap \ ++ xaoi21_x05.vbe \ ++ xaoi21_x1.ap \ ++ xaoi21_x1.vbe \ ++ xaon21_x05.ap \ ++ xaon21_x05.vbe \ ++ xaon21_x1.ap \ ++ xaon21_x1.vbe \ ++ xaon22_x05.ap \ ++ xaon22_x05.vbe \ ++ xaon22_x1.ap \ ++ xaon22_x1.vbe \ ++ xnr2_x05.ap \ ++ xnr2_x05.vbe \ ++ xnr2_x1.ap \ ++ xnr2_x1.vbe \ ++ xor2_x05.ap \ ++ xor2_x05.vbe \ ++ xor2_x1.ap \ ++ xor2_x1.vbe ++ ++EXTRA_DIST=$(msxlib_DATA) ++ +diff --git a/alliance/src/cells/src/msxlib/README b/alliance/src/cells/src/msxlib/README +new file mode 100644 +index 0000000..5455f04 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/README +@@ -0,0 +1,5 @@ ++ ++This library is derived from the 130um vsxlib from Graham Petley . ++ ++It has been modificated to better fit the MOSIS scn6m_deep technology. ++ +diff --git a/alliance/src/cells/src/msxlib/an2_x05.ap b/alliance/src/cells/src/msxlib/an2_x05.ap +new file mode 100644 +index 0000000..dd93d6d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an2_x05.ap +@@ -0,0 +1,85 @@ ++V ALLIANCE : 6 ++H an2_x05,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 3000,5000,ref_ref,a_50 ++R 3000,4000,ref_ref,a_40 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 4000,6000,ref_ref,b_60 ++R 4000,7000,ref_ref,b_70 ++R 3000,7000,ref_ref,b_70 ++R 4000,5000,ref_ref,b_50 ++R 2000,7000,ref_ref,z_70 ++R 4000,4000,ref_ref,a_40 ++S 1100,700,1700,700,600,*,LEFT,PTIE ++S 1100,9300,1900,9300,600,*,LEFT,NTIE ++S 4000,4900,4000,7000,400,*,UP,ALU1 ++S 3000,7000,3000,7000,400,b,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,an2_x05,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,6100,3200,6100,600,*,LEFT,ALU1 ++S 4000,5000,4000,7000,400,b,UP,CALU1 ++S 4400,6000,4400,8100,600,*,DOWN,PDIF ++S 2600,5200,2600,5800,200,*,DOWN,POLY ++S 1000,7000,2100,7000,400,*,RIGHT,ALU1 ++S 1000,7100,2100,7100,400,*,RIGHT,ALU1 ++S 2900,7100,4000,7100,400,*,LEFT,ALU1 ++S 2900,7000,4000,7000,400,*,LEFT,ALU1 ++S 2000,6000,2000,7600,600,*,DOWN,PDIF ++S 2000,7900,2000,9300,400,*,DOWN,ALU1 ++S 4400,7900,4400,9300,400,*,DOWN,ALU1 ++S 1000,4000,1000,7000,400,z,DOWN,CALU1 ++S 1600,3800,1600,4600,200,*,UP,POLY ++S 1400,4500,1400,5500,200,*,DOWN,POLY ++S 1000,6000,1000,6800,400,*,UP,PDIF ++S 1400,5800,1400,7000,200,1z,DOWN,PTRANS ++S 1400,7000,1400,7400,200,*,DOWN,POLY ++S 900,6000,900,6200,600,*,UP,ALU1 ++S 2600,5800,2600,7000,200,1a,DOWN,PTRANS ++S 3800,5800,3800,7000,200,1b,DOWN,PTRANS ++S 3200,6000,3200,6800,400,*,UP,PDIF ++S 2600,7000,2600,7400,200,*,DOWN,POLY ++S 3800,7000,3800,7400,200,*,DOWN,POLY ++S 1600,3200,1600,3800,200,2z,UP,NTRANS ++S 1600,2800,1600,3200,200,*,UP,POLY ++S 1000,3400,1000,7100,400,*,DOWN,ALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 3000,3900,3000,5200,400,*,DOWN,ALU1 ++S 3000,4000,3000,5000,400,a,DOWN,CALU1 ++S 2000,3000,4500,3000,400,*,LEFT,ALU1 ++S 3400,2500,3400,3100,600,n1,DOWN,NDIF ++S 3000,2300,3000,3300,200,2a,UP,NTRANS ++S 4200,2500,4200,3100,400,*,UP,NDIF ++S 3800,2300,3800,3300,200,2b,UP,NTRANS ++S 3000,1900,3000,2300,200,*,UP,POLY ++S 3800,1900,3800,2300,200,*,UP,POLY ++S 3000,3300,3000,4900,200,*,UP,POLY ++S 3800,3300,3800,5800,200,*,DOWN,POLY ++S 2000,3000,2000,6200,400,*,UP,ALU1 ++S 2300,700,2300,2100,400,*,DOWN,ALU1 ++S 2300,1900,2300,3600,800,*,UP,NDIF ++S 2600,5300,3000,5300,200,*,RIGHT,POLY ++S 1400,4400,2200,4400,600,*,LEFT,POLY ++V 1800,700,CONT_BODY_P,* ++V 1100,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1100,9300,CONT_BODY_N,* ++V 3000,5100,CONT_POLY,* ++V 3200,6100,CONT_DIF_P,zn ++V 2000,4400,CONT_POLY,zn ++V 1000,3500,CONT_DIF_N,* ++V 2000,8000,CONT_DIF_P,* ++V 4400,8000,CONT_DIF_P,* ++V 4000,5000,CONT_POLY,* ++V 800,6100,CONT_DIF_P,* ++V 4400,3000,CONT_DIF_N,zn ++V 2300,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/an2_x05.vbe b/alliance/src/cells/src/msxlib/an2_x05.vbe +new file mode 100644 +index 0000000..2f01024 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an2_x05.vbe +@@ -0,0 +1,32 @@ ++ENTITY an2_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_b : NATURAL := 3; ++ CONSTANT cin_a : NATURAL := 3; ++ CONSTANT rdown_b_z : NATURAL := 3810; ++ CONSTANT rdown_a_z : NATURAL := 3830; ++ CONSTANT rup_b_z : NATURAL := 4940; ++ CONSTANT rup_a_z : NATURAL := 4940; ++ CONSTANT tphh_a_z : NATURAL := 71; ++ CONSTANT tphh_b_z : NATURAL := 70; ++ CONSTANT tpll_b_z : NATURAL := 87; ++ CONSTANT tpll_a_z : NATURAL := 97; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END an2_x05; ++ ++ARCHITECTURE behaviour_data_flow OF an2_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on an2_x05" ++ SEVERITY WARNING; ++ z <= (b and a) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/an2_x1.ap b/alliance/src/cells/src/msxlib/an2_x1.ap +new file mode 100644 +index 0000000..3637824 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an2_x1.ap +@@ -0,0 +1,90 @@ ++V ALLIANCE : 6 ++H an2_x1,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 4000,4000,ref_ref,a_40 ++R 2000,7000,ref_ref,z_70 ++R 4000,5000,ref_ref,b_50 ++R 3000,7000,ref_ref,b_70 ++R 4000,7000,ref_ref,b_70 ++R 4000,6000,ref_ref,b_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,7000,ref_ref,z_70 ++R 3000,4000,ref_ref,a_40 ++R 3000,5000,ref_ref,a_50 ++S 1100,700,1700,700,600,*,LEFT,PTIE ++S 1100,9300,1900,9300,600,*,LEFT,NTIE ++S 2300,700,2300,2000,600,*,DOWN,ALU1 ++S 2300,1900,2300,3600,800,*,UP,NDIF ++S 4400,2100,4400,2700,600,*,DOWN,NDIF ++S 4400,2000,4400,2800,600,*,DOWN,ALU1 ++S 2000,2800,2000,6200,400,*,UP,ALU1 ++S 2000,2800,4500,2800,400,*,LEFT,ALU1 ++S 3000,4000,3000,5000,400,a,DOWN,CALU1 ++S 3000,3900,3000,5200,400,*,DOWN,ALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 900,6000,900,7000,600,*,UP,ALU1 ++S 800,7000,2100,7000,400,*,RIGHT,ALU1 ++S 3000,2700,3000,4900,200,*,UP,POLY ++S 3800,2700,3800,5800,200,*,DOWN,POLY ++S 1400,4500,1400,5500,200,*,DOWN,POLY ++S 1600,3800,1600,4600,200,*,UP,POLY ++S 1000,3400,1000,7000,400,*,DOWN,ALU1 ++S 1000,4000,1000,7000,400,z,DOWN,CALU1 ++S 4400,7900,4400,9300,400,*,DOWN,ALU1 ++S 2000,7900,2000,9300,400,*,DOWN,ALU1 ++S 2000,6000,2000,7600,600,*,DOWN,PDIF ++S 2900,7000,4000,7000,400,*,LEFT,ALU1 ++S 2900,7100,4000,7100,400,*,LEFT,ALU1 ++S 2600,5200,2600,5800,200,*,DOWN,POLY ++S 4400,6000,4400,8100,600,*,DOWN,PDIF ++S 4000,5000,4000,7000,400,b,UP,CALU1 ++S 2000,6100,3200,6100,600,*,LEFT,ALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,an2_x1,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 3000,1300,3000,1700,200,*,UP,POLY ++S 3800,1300,3800,1700,200,*,UP,POLY ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,7000,3000,7000,400,b,LEFT,CALU1 ++S 4000,4900,4000,7000,400,*,UP,ALU1 ++S 1400,5800,1400,7800,200,1z,DOWN,PTRANS ++S 1000,6000,1000,7600,400,*,UP,PDIF ++S 1400,7800,1400,8200,200,*,DOWN,POLY ++S 3800,5800,3800,7400,200,1b,DOWN,PTRANS ++S 2600,5800,2600,7400,200,1a,DOWN,PTRANS ++S 3200,6000,3200,7200,400,*,UP,PDIF ++S 2600,7400,2600,7800,200,*,DOWN,POLY ++S 3800,7400,3800,7800,200,*,DOWN,POLY ++S 800,6200,800,6800,600,*,UP,PDIF ++S 1600,2800,1600,3800,200,2z,UP,NTRANS ++S 1600,2400,1600,2800,200,*,UP,POLY ++S 1200,3000,1200,3600,400,*,UP,NDIF ++S 3400,1900,3400,2900,600,n1,DOWN,NDIF ++S 3000,1700,3000,3100,200,2a,UP,NTRANS ++S 3800,1700,3800,3100,200,2b,UP,NTRANS ++S 4200,1900,4200,2900,400,*,UP,NDIF ++S 2600,5300,3000,5300,200,*,RIGHT,POLY ++S 1400,4400,2200,4400,600,*,LEFT,POLY ++V 1800,700,CONT_BODY_P,* ++V 1100,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1100,9300,CONT_BODY_N,* ++V 2300,2000,CONT_DIF_N,* ++V 4400,2000,CONT_DIF_N,zn ++V 4400,2800,CONT_DIF_N,zn ++V 800,6100,CONT_DIF_P,* ++V 4000,5000,CONT_POLY,* ++V 4400,8000,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,* ++V 1000,3500,CONT_DIF_N,* ++V 2000,4400,CONT_POLY,zn ++V 3200,6100,CONT_DIF_P,zn ++V 3000,5100,CONT_POLY,* ++V 800,6900,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/an2_x1.vbe b/alliance/src/cells/src/msxlib/an2_x1.vbe +new file mode 100644 +index 0000000..11d6ba4 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an2_x1.vbe +@@ -0,0 +1,32 @@ ++ENTITY an2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT rdown_b_z : NATURAL := 2290; ++ CONSTANT rdown_a_z : NATURAL := 2290; ++ CONSTANT rup_b_z : NATURAL := 2960; ++ CONSTANT rup_a_z : NATURAL := 2960; ++ CONSTANT tphh_a_z : NATURAL := 68; ++ CONSTANT tphh_b_z : NATURAL := 68; ++ CONSTANT tpll_b_z : NATURAL := 87; ++ CONSTANT tpll_a_z : NATURAL := 97; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END an2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF an2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on an2_x1" ++ SEVERITY WARNING; ++ z <= (b and a) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/an2_x2.ap b/alliance/src/cells/src/msxlib/an2_x2.ap +new file mode 100644 +index 0000000..c747c4c +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an2_x2.ap +@@ -0,0 +1,94 @@ ++V ALLIANCE : 6 ++H an2_x2,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 4000,4000,ref_ref,a_40 ++R 3000,5000,ref_ref,a_50 ++R 3000,4000,ref_ref,a_40 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 4000,6000,ref_ref,b_60 ++R 4000,7000,ref_ref,b_70 ++R 3000,7000,ref_ref,b_70 ++R 4000,5000,ref_ref,b_50 ++R 2000,7000,ref_ref,z_70 ++S 1100,700,1700,700,600,*,RIGHT,PTIE ++S 3300,9300,3900,9300,600,*,LEFT,NTIE ++S 2600,5300,3000,5300,200,*,RIGHT,POLY ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 4400,1900,4400,3000,400,*,DOWN,ALU1 ++S 2000,3000,4400,3000,400,*,LEFT,ALU1 ++S 4400,2100,4400,2700,600,*,UP,NDIF ++S 2300,700,2300,2200,400,*,DOWN,ALU1 ++S 2300,1900,2300,3600,800,*,UP,NDIF ++S 2000,3000,2000,6200,400,*,UP,ALU1 ++S 3000,3900,3000,5200,400,*,DOWN,ALU1 ++S 3000,4000,3000,5000,400,a,DOWN,CALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 800,7000,2100,7000,400,*,RIGHT,ALU1 ++S 900,5700,900,7000,600,*,UP,ALU1 ++S 4000,4900,4000,7100,400,*,UP,ALU1 ++S 3000,7000,3000,7000,400,b,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 1400,4200,1400,5500,200,*,DOWN,POLY ++S 1000,2600,1000,7000,400,*,DOWN,ALU1 ++S 1000,2800,1000,3400,600,*,DOWN,NDIF ++S 1600,1900,1600,3800,200,2z,UP,NTRANS ++S 3000,1700,3000,3800,200,2a,UP,NTRANS ++S 3800,1700,3800,3800,200,2b,UP,NTRANS ++S 1400,5500,1400,9300,200,1z,DOWN,PTRANS ++S 2600,5800,2600,8300,200,1a,DOWN,PTRANS ++S 3800,5800,3800,8300,200,1b,DOWN,PTRANS ++S 4200,1900,4200,3600,400,*,UP,NDIF ++S 3800,1300,3800,1700,200,*,UP,POLY ++S 3000,1300,3000,1700,200,*,UP,POLY ++S 3400,1900,3400,3600,600,n1,DOWN,NDIF ++S 1200,2100,1200,3600,400,*,UP,NDIF ++S 1400,9300,1400,9700,200,*,DOWN,POLY ++S 1000,5700,1000,9100,400,*,UP,PDIF ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,an2_x2,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 3000,3800,3000,4900,200,*,UP,POLY ++S 2000,6100,3200,6100,600,*,LEFT,ALU1 ++S 4000,5000,4000,7000,400,b,UP,CALU1 ++S 3200,6000,3200,8100,400,*,UP,PDIF ++S 4400,6000,4400,8100,600,*,DOWN,PDIF ++S 2600,5200,2600,5800,200,*,DOWN,POLY ++S 3800,3800,3800,5800,200,*,DOWN,POLY ++S 3800,8300,3800,8700,200,*,DOWN,POLY ++S 2600,8300,2600,8700,200,*,DOWN,POLY ++S 2900,7100,4000,7100,400,*,LEFT,ALU1 ++S 2900,7000,4000,7000,400,*,LEFT,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1600,1500,1600,1900,200,*,UP,POLY ++S 2000,7900,2000,9300,400,*,DOWN,ALU1 ++S 4400,7900,4400,9300,400,*,DOWN,ALU1 ++S 1600,3800,1600,4600,200,*,UP,POLY ++S 2000,5700,2000,9100,600,*,DOWN,PDIF ++S 800,6200,800,7000,600,*,UP,PDIF ++V 1800,700,CONT_BODY_P,* ++V 1100,700,CONT_BODY_P,* ++V 3200,9300,CONT_BODY_N,* ++V 3900,9300,CONT_BODY_N,* ++V 4400,2800,CONT_DIF_N,zn ++V 4400,2000,CONT_DIF_N,zn ++V 2300,2100,CONT_DIF_N,* ++V 3000,5100,CONT_POLY,* ++V 1000,2700,CONT_DIF_N,* ++V 3200,6100,CONT_DIF_P,zn ++V 2000,4400,CONT_POLY,zn ++V 1000,3500,CONT_DIF_N,* ++V 2000,8000,CONT_DIF_P,* ++V 2000,9000,CONT_DIF_P,* ++V 4400,8000,CONT_DIF_P,* ++V 4000,5000,CONT_POLY,* ++V 800,6900,CONT_DIF_P,* ++V 800,6100,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/an2_x2.vbe b/alliance/src/cells/src/msxlib/an2_x2.vbe +new file mode 100644 +index 0000000..e0be85f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an2_x2.vbe +@@ -0,0 +1,32 @@ ++ENTITY an2_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT cin_a : NATURAL := 6; ++ CONSTANT rdown_b_z : NATURAL := 1200; ++ CONSTANT rdown_a_z : NATURAL := 1200; ++ CONSTANT rup_b_z : NATURAL := 1560; ++ CONSTANT rup_a_z : NATURAL := 1560; ++ CONSTANT tphh_a_z : NATURAL := 68; ++ CONSTANT tphh_b_z : NATURAL := 68; ++ CONSTANT tpll_b_z : NATURAL := 87; ++ CONSTANT tpll_a_z : NATURAL := 96; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END an2_x2; ++ ++ARCHITECTURE behaviour_data_flow OF an2_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on an2_x2" ++ SEVERITY WARNING; ++ z <= (b and a) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/an3_x1.ap b/alliance/src/cells/src/msxlib/an3_x1.ap +new file mode 100644 +index 0000000..0d5304a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an3_x1.ap +@@ -0,0 +1,110 @@ ++V ALLIANCE : 6 ++H an3_x1,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 2000,3000,ref_ref,z_30 ++R 5000,3000,ref_ref,c_30 ++R 4000,3000,ref_ref,c_30 ++R 4000,6000,ref_ref,b_60 ++R 5000,6000,ref_ref,b_60 ++R 3000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,a_60 ++R 3000,7000,ref_ref,a_70 ++R 4000,7000,ref_ref,a_70 ++R 5000,7000,ref_ref,a_70 ++R 5000,4000,ref_ref,c_40 ++R 5000,5000,ref_ref,c_50 ++R 4000,5000,ref_ref,b_50 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,4000,ref_ref,z_40 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 4000,4000,ref_ref,b_40 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 3000,5000,3000,7000,400,a,DOWN,CALU1 ++S 4000,3000,4000,3000,400,c,LEFT,CALU1 ++S 5000,3000,5000,5000,400,c,DOWN,CALU1 ++S 5000,2900,5000,5100,400,*,DOWN,ALU1 ++S 3900,3000,5000,3000,400,*,RIGHT,ALU1 ++S 4000,6100,5100,6100,400,*,RIGHT,ALU1 ++S 4000,6000,5100,6000,400,*,RIGHT,ALU1 ++S 4000,4000,4000,6000,400,b,DOWN,CALU1 ++S 4000,3900,4000,6100,400,*,DOWN,ALU1 ++S 5000,6000,5000,6000,400,b,LEFT,CALU1 ++S 3900,2900,5000,2900,400,*,RIGHT,ALU1 ++S 5000,7000,5000,7000,400,a,LEFT,CALU1 ++S 4000,7000,4000,7000,400,a,LEFT,CALU1 ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,an3_x1,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,8000,5500,8000,400,*,RIGHT,ALU1 ++S 3000,7000,5100,7000,400,*,RIGHT,ALU1 ++S 3000,7100,5100,7100,400,*,RIGHT,ALU1 ++S 3000,2000,5300,2000,400,*,LEFT,ALU1 ++S 3600,6700,3600,8300,200,1b,UP,PTRANS ++S 2400,6700,2400,8300,200,1a,UP,PTRANS ++S 3000,6900,3000,8100,1000,*,DOWN,PDIF ++S 4200,6900,4200,9100,600,*,UP,PDIF ++S 4800,6700,4800,8300,200,1c,UP,PTRANS ++S 5200,6900,5200,8100,400,*,DOWN,PDIF ++S 2400,8300,2400,8700,200,*,DOWN,POLY ++S 3600,8300,3600,8700,200,*,DOWN,POLY ++S 4800,8300,4800,8700,200,*,DOWN,POLY ++S 3400,1900,3400,3100,600,n1,UP,NDIF ++S 3000,1700,3000,3300,200,2a,DOWN,NTRANS ++S 3800,1700,3800,3300,200,2b,DOWN,NTRANS ++S 4200,1900,4200,3100,600,n2,UP,NDIF ++S 4600,1700,4600,3300,200,2c,DOWN,NTRANS ++S 5000,1900,5000,3100,400,*,UP,NDIF ++S 1200,2500,1200,3100,400,*,UP,NDIF ++S 1600,2300,1600,3300,200,2z,DOWN,NTRANS ++S 1600,1900,1600,2300,200,*,DOWN,POLY ++S 3000,1300,3000,1700,200,*,DOWN,POLY ++S 3800,1300,3800,1700,200,*,DOWN,POLY ++S 4600,1300,4600,1700,200,*,DOWN,POLY ++S 2300,1900,2300,3100,800,*,UP,NDIF ++S 3600,6100,3600,6700,200,*,DOWN,POLY ++S 4600,3300,4600,3800,200,*,UP,POLY ++S 4800,3900,4800,6700,200,*,DOWN,POLY ++S 3800,3300,3800,6000,200,*,UP,POLY ++S 2400,5200,2400,6700,200,*,DOWN,POLY ++S 2400,5200,3000,5200,200,*,RIGHT,POLY ++S 3000,3300,3000,5200,200,*,DOWN,POLY ++S 1000,2900,1000,7100,400,*,DOWN,ALU1 ++S 1000,3000,2000,3000,600,*,RIGHT,ALU1 ++S 3000,4900,3000,7000,400,*,DOWN,ALU1 ++S 2000,4000,3000,4000,400,*,RIGHT,ALU1 ++S 2000,4000,2000,8000,400,*,UP,ALU1 ++S 3000,2000,3000,4000,400,*,DOWN,ALU1 ++S 1200,4300,1800,4300,200,*,RIGHT,POLY ++S 1600,3300,1600,4300,200,*,UP,POLY ++S 500,7100,1000,7100,400,*,RIGHT,ALU1 ++S 1200,6000,1200,8000,200,1z,UP,PTRANS ++S 800,6200,800,7800,400,*,UP,PDIF ++S 600,6400,600,7000,600,*,UP,PDIF ++S 1800,6200,1800,9100,600,*,DOWN,PDIF ++S 500,6300,1000,6300,400,*,RIGHT,ALU1 ++S 1200,8000,1200,8400,200,*,DOWN,POLY ++S 1200,4300,1200,6000,200,*,DOWN,POLY ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3000,9300,CONT_BODY_N,* ++V 2200,2000,CONT_DIF_N,* ++V 5400,8000,CONT_DIF_P,zn ++V 3000,8000,CONT_DIF_P,zn ++V 5200,2000,CONT_DIF_N,zn ++V 1800,9000,CONT_DIF_P,* ++V 4200,9000,CONT_DIF_P,* ++V 4000,6000,CONT_POLY,* ++V 5000,3900,CONT_POLY,* ++V 3000,5000,CONT_POLY,* ++V 1000,3000,CONT_DIF_N,* ++V 2000,4100,CONT_POLY,zn ++V 600,7100,CONT_DIF_P,* ++V 600,6300,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/an3_x1.vbe b/alliance/src/cells/src/msxlib/an3_x1.vbe +new file mode 100644 +index 0000000..0f9f78c +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an3_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY an3_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT cin_c : NATURAL := 4; ++ CONSTANT rdown_a_z : NATURAL := 2310; ++ CONSTANT rdown_b_z : NATURAL := 2300; ++ CONSTANT rdown_c_z : NATURAL := 2290; ++ CONSTANT rup_a_z : NATURAL := 2970; ++ CONSTANT rup_b_z : NATURAL := 2970; ++ CONSTANT rup_c_z : NATURAL := 2970; ++ CONSTANT tphh_c_z : NATURAL := 88; ++ CONSTANT tphh_b_z : NATURAL := 91; ++ CONSTANT tphh_a_z : NATURAL := 93; ++ CONSTANT tpll_a_z : NATURAL := 121; ++ CONSTANT tpll_b_z : NATURAL := 111; ++ CONSTANT tpll_c_z : NATURAL := 100; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END an3_x1; ++ ++ARCHITECTURE behaviour_data_flow OF an3_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on an3_x1" ++ SEVERITY WARNING; ++ z <= ((a and b) and c) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/an3_x2.ap b/alliance/src/cells/src/msxlib/an3_x2.ap +new file mode 100644 +index 0000000..291cb56 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an3_x2.ap +@@ -0,0 +1,114 @@ ++V ALLIANCE : 6 ++H an3_x2,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 2000,8000,ref_ref,z_80 ++R 1000,8000,ref_ref,z_80 ++R 4000,4000,ref_ref,a_40 ++R 3000,4000,ref_ref,a_40 ++R 5000,7000,ref_ref,b_70 ++R 5000,3000,ref_ref,c_30 ++R 4000,3000,ref_ref,c_30 ++R 4000,6000,ref_ref,b_60 ++R 5000,6000,ref_ref,b_60 ++R 3000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,a_60 ++R 5000,4000,ref_ref,c_40 ++R 5000,5000,ref_ref,c_50 ++R 4000,5000,ref_ref,b_50 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,4000,ref_ref,z_40 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++S 4800,4200,4800,6900,200,*,DOWN,POLY ++S 4800,9300,4800,9700,200,*,DOWN,POLY ++S 5200,7100,5200,9100,400,*,DOWN,PDIF ++S 4800,6900,4800,9300,200,1c,UP,PTRANS ++S 500,6200,1000,6200,400,*,RIGHT,ALU1 ++S 600,6300,600,6900,600,*,UP,PDIF ++S 500,7000,1000,7000,400,*,RIGHT,ALU1 ++S 2000,8000,2000,8000,400,z,LEFT,CALU1 ++S 1000,8000,2000,8000,600,*,RIGHT,ALU1 ++S 1000,2600,1000,8100,400,*,DOWN,ALU1 ++S 1000,3000,1000,8000,400,z,DOWN,CALU1 ++S 3000,8000,5500,8000,400,*,RIGHT,ALU1 ++S 3000,7000,3000,8000,400,*,UP,ALU1 ++S 2000,7000,3000,7000,400,*,RIGHT,ALU1 ++S 2000,3000,2000,7000,400,*,UP,ALU1 ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 3000,2000,3000,3000,400,*,DOWN,ALU1 ++S 2000,3000,3000,3000,400,*,RIGHT,ALU1 ++S 4000,5000,4000,6000,400,b,DOWN,CALU1 ++S 4000,4900,4000,6100,400,*,DOWN,ALU1 ++S 5000,6000,5000,7000,600,*,UP,ALU1 ++S 5000,6000,5000,7000,400,b,UP,CALU1 ++S 1200,9300,1200,9700,200,*,DOWN,POLY ++S 3600,8400,3600,8800,200,*,DOWN,POLY ++S 2400,8400,2400,8800,200,*,DOWN,POLY ++S 3600,5500,3600,6000,200,*,DOWN,POLY ++S 2800,4600,2800,5600,200,*,DOWN,POLY ++S 2400,5600,2800,5600,200,*,RIGHT,POLY ++S 4200,6200,4200,9100,600,*,UP,PDIF ++S 3000,6200,3000,8200,1000,*,DOWN,PDIF ++S 2400,6000,2400,8400,200,1a,UP,PTRANS ++S 3600,6000,3600,8400,200,1b,UP,PTRANS ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 3000,3800,3000,4600,200,*,UP,POLY ++S 4600,3800,4600,4300,200,*,UP,POLY ++S 4000,3000,4000,3000,400,c,LEFT,CALU1 ++S 5000,3000,5000,5000,400,c,DOWN,CALU1 ++S 5000,2900,5000,5100,400,*,DOWN,ALU1 ++S 3900,3000,5000,3000,400,*,RIGHT,ALU1 ++S 3800,4100,3800,5300,200,*,UP,POLY ++S 4000,6100,5100,6100,400,*,RIGHT,ALU1 ++S 4000,6000,5100,6000,400,*,RIGHT,ALU1 ++S 3900,2900,5000,2900,400,*,RIGHT,ALU1 ++S 1000,2800,1000,3400,600,*,DOWN,NDIF ++S 1600,1900,1600,3800,200,2z,DOWN,NTRANS ++S 3000,1400,3000,3800,200,2a,DOWN,NTRANS ++S 3800,1400,3800,3800,200,2b,DOWN,NTRANS ++S 4600,1400,4600,3800,200,2c,DOWN,NTRANS ++S 1200,5500,1200,9300,200,1z,UP,PTRANS ++S 1200,4600,1800,4600,200,*,RIGHT,POLY ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,an3_x2,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 1800,5700,1800,9100,600,*,DOWN,PDIF ++S 800,5700,800,9100,400,*,UP,PDIF ++S 3000,1000,3000,1400,200,*,DOWN,POLY ++S 3800,1000,3800,1400,200,*,DOWN,POLY ++S 4600,1000,4600,1400,200,*,DOWN,POLY ++S 5000,1600,5000,3600,400,*,UP,NDIF ++S 1600,1500,1600,1900,200,*,DOWN,POLY ++S 1200,2100,1200,3600,400,*,UP,NDIF ++S 2300,900,2300,3600,800,*,UP,NDIF ++S 1200,4600,1200,5500,200,*,DOWN,POLY ++S 1600,3800,1600,4600,200,*,UP,POLY ++S 3000,2000,5300,2000,400,*,LEFT,ALU1 ++S 3400,1600,3400,3600,600,n1,UP,NDIF ++S 4200,1600,4200,3600,600,n2,UP,NDIF ++V 1000,700,CONT_BODY_P,* ++V 3000,9300,CONT_BODY_N,* ++V 5400,8000,CONT_DIF_P,zn ++V 600,6200,CONT_DIF_P,* ++V 600,7000,CONT_DIF_P,* ++V 3000,7900,CONT_DIF_P,zn ++V 3000,7100,CONT_DIF_P,zn ++V 4000,5400,CONT_POLY,* ++V 3000,4700,CONT_POLY,* ++V 2200,1000,CONT_DIF_N,* ++V 2200,2000,CONT_DIF_N,* ++V 5000,4400,CONT_POLY,* ++V 1000,2700,CONT_DIF_N,* ++V 2000,4400,CONT_POLY,zn ++V 5200,2000,CONT_DIF_N,zn ++V 1800,9000,CONT_DIF_P,* ++V 1000,3500,CONT_DIF_N,* ++V 4200,9000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/an3_x2.vbe b/alliance/src/cells/src/msxlib/an3_x2.vbe +new file mode 100644 +index 0000000..2fb10d6 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an3_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY an3_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 6; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT cin_c : NATURAL := 6; ++ CONSTANT rdown_a_z : NATURAL := 1210; ++ CONSTANT rdown_b_z : NATURAL := 1210; ++ CONSTANT rdown_c_z : NATURAL := 1210; ++ CONSTANT rup_a_z : NATURAL := 1560; ++ CONSTANT rup_b_z : NATURAL := 1560; ++ CONSTANT rup_c_z : NATURAL := 1560; ++ CONSTANT tphh_c_z : NATURAL := 86; ++ CONSTANT tphh_b_z : NATURAL := 89; ++ CONSTANT tphh_a_z : NATURAL := 91; ++ CONSTANT tpll_a_z : NATURAL := 119; ++ CONSTANT tpll_b_z : NATURAL := 109; ++ CONSTANT tpll_c_z : NATURAL := 98; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END an3_x2; ++ ++ARCHITECTURE behaviour_data_flow OF an3_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on an3_x2" ++ SEVERITY WARNING; ++ z <= ((a and b) and c) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/an4_x1.ap b/alliance/src/cells/src/msxlib/an4_x1.ap +new file mode 100644 +index 0000000..73b6d84 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an4_x1.ap +@@ -0,0 +1,132 @@ ++V ALLIANCE : 6 ++H an4_x1,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 2000,3000,ref_ref,z_30 ++R 4000,5000,ref_ref,b_50 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,4000,ref_ref,z_40 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 4000,4000,ref_ref,b_40 ++R 4000,3000,ref_ref,b_30 ++R 5000,3000,ref_ref,b_30 ++R 5000,7000,ref_ref,d_70 ++R 6000,7000,ref_ref,d_70 ++R 6000,6000,ref_ref,d_60 ++R 6000,5000,ref_ref,d_50 ++R 4000,6000,ref_ref,c_60 ++R 5000,6000,ref_ref,c_60 ++R 5000,5000,ref_ref,c_50 ++R 5000,4000,ref_ref,c_40 ++R 4000,7000,ref_ref,a_70 ++R 3000,7000,ref_ref,a_70 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++R 1000,8000,ref_ref,z_80 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 4000,2900,4000,5200,400,*,DOWN,ALU1 ++S 3100,2000,6000,2000,400,*,LEFT,ALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 6000,8300,6000,8600,200,*,DOWN,POLY ++S 2000,8000,5500,8000,400,*,RIGHT,ALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,an4_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 4800,8300,4800,8700,200,*,DOWN,POLY ++S 500,6600,1000,6600,400,*,RIGHT,ALU1 ++S 3600,8300,3600,8700,200,*,DOWN,POLY ++S 2400,8300,2400,8700,200,*,DOWN,POLY ++S 5000,7000,5000,7000,400,d,LEFT,CALU1 ++S 5000,3000,5000,3000,400,b,LEFT,CALU1 ++S 4000,6000,4000,6000,400,c,LEFT,CALU1 ++S 4000,7000,4000,7000,400,a,LEFT,CALU1 ++S 4000,3000,4000,5000,400,b,DOWN,CALU1 ++S 4000,2900,5100,2900,400,*,RIGHT,ALU1 ++S 4000,3000,5100,3000,400,*,RIGHT,ALU1 ++S 5000,3900,5000,6100,400,*,DOWN,ALU1 ++S 3900,6000,5000,6000,400,*,RIGHT,ALU1 ++S 3900,6100,5000,6100,400,*,RIGHT,ALU1 ++S 3000,7000,4100,7000,400,*,RIGHT,ALU1 ++S 3000,7100,4100,7100,400,*,RIGHT,ALU1 ++S 6000,5000,6000,7000,400,d,UP,CALU1 ++S 6000,4900,6000,7000,400,*,UP,ALU1 ++S 4900,7000,6000,7000,400,*,LEFT,ALU1 ++S 4900,7100,6000,7100,400,*,LEFT,ALU1 ++S 5000,4000,5000,6000,400,c,DOWN,CALU1 ++S 3000,4900,3000,7000,400,*,DOWN,ALU1 ++S 3000,5000,3000,7000,400,a,DOWN,CALU1 ++S 3600,6700,3600,8300,200,1b,UP,PTRANS ++S 3000,6900,3000,8100,1000,*,DOWN,PDIF ++S 2400,6700,2400,8300,200,1a,UP,PTRANS ++S 5400,6900,5400,8100,600,*,DOWN,PDIF ++S 6000,6700,6000,8300,200,1d,UP,PTRANS ++S 4800,6700,4800,8300,200,1c,UP,PTRANS ++S 4200,6900,4200,9100,600,*,UP,PDIF ++S 6500,6900,6500,9300,400,*,UP,PDIF ++S 6000,4800,6000,6700,200,*,DOWN,POLY ++S 1800,6500,1800,9100,600,*,DOWN,PDIF ++S 1200,6300,1200,8300,200,1z,UP,PTRANS ++S 800,6500,800,8100,400,*,UP,PDIF ++S 1200,8300,1200,8700,200,*,DOWN,POLY ++S 1000,3000,2000,3000,600,*,RIGHT,ALU1 ++S 2300,1900,2300,3400,800,*,UP,NDIF ++S 2300,700,2300,2100,400,*,DOWN,ALU1 ++S 1600,2600,1600,3600,200,2z,DOWN,NTRANS ++S 1200,2800,1200,3400,400,*,UP,NDIF ++S 1600,2200,1600,2600,200,*,DOWN,POLY ++S 3000,1300,3000,1700,200,*,DOWN,POLY ++S 3800,1300,3800,1700,200,*,DOWN,POLY ++S 4600,1300,4600,1700,200,*,DOWN,POLY ++S 5400,1300,5400,1700,200,*,DOWN,POLY ++S 3000,1700,3000,3600,200,2a,DOWN,NTRANS ++S 3400,1900,3400,3400,600,n1,UP,NDIF ++S 3800,1700,3800,3600,200,2b,DOWN,NTRANS ++S 5000,1900,5000,3400,600,n3,UP,NDIF ++S 4600,1700,4600,3600,200,2c,DOWN,NTRANS ++S 5400,1700,5400,3600,200,2d,DOWN,NTRANS ++S 5800,1900,5800,3400,400,*,UP,NDIF ++S 4200,1900,4200,3400,600,n2,UP,NDIF ++S 3800,3600,3800,4800,200,*,UP,POLY ++S 6000,2100,6000,2700,600,*,UP,NDIF ++S 6000,2000,6000,2800,600,*,UP,ALU1 ++S 5400,4000,5800,4000,200,*,RIGHT,POLY ++S 5800,4000,5800,4800,200,*,UP,POLY ++S 4800,4000,4800,6700,200,*,DOWN,POLY ++S 4600,3600,4600,4100,200,*,UP,POLY ++S 3600,4700,3600,6700,200,*,DOWN,POLY ++S 2000,4100,3100,4100,400,*,RIGHT,ALU1 ++S 2000,4100,2000,8000,400,*,UP,ALU1 ++S 3100,2000,3100,4100,400,*,DOWN,ALU1 ++S 1200,4400,1600,4400,200,*,RIGHT,POLY ++S 1200,4400,1200,6300,200,*,DOWN,POLY ++S 1600,3600,1600,4400,200,*,UP,POLY ++S 2400,5800,2400,6700,200,*,DOWN,POLY ++S 3000,3600,3000,5900,200,*,UP,POLY ++S 2800,6000,3000,6000,600,*,RIGHT,ALU1 ++S 600,6700,600,7300,600,*,DOWN,PDIF ++S 500,7400,1000,7400,400,*,RIGHT,ALU1 ++S 1000,3000,1000,8000,400,z,DOWN,CALU1 ++S 1000,2900,1000,8100,400,*,DOWN,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3000,9300,CONT_BODY_N,* ++V 6400,9200,CONT_DIF_P,* ++V 5400,8000,CONT_DIF_P,zn ++V 4200,9000,CONT_DIF_P,* ++V 3000,8000,CONT_DIF_P,zn ++V 1800,9000,CONT_DIF_P,* ++V 600,6600,CONT_DIF_P,* ++V 6000,5000,CONT_POLY,* ++V 2300,2000,CONT_DIF_N,* ++V 1000,3300,CONT_DIF_N,* ++V 6000,2000,CONT_DIF_N,zn ++V 6000,2800,CONT_DIF_N,zn ++V 4000,4900,CONT_POLY,* ++V 5000,6000,CONT_POLY,* ++V 2000,4200,CONT_POLY,zn ++V 2800,6000,CONT_POLY,* ++V 600,7400,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/an4_x1.vbe b/alliance/src/cells/src/msxlib/an4_x1.vbe +new file mode 100644 +index 0000000..bdfe74f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an4_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY an4_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_c : NATURAL := 5; ++ CONSTANT cin_d : NATURAL := 4; ++ CONSTANT rdown_a_z : NATURAL := 2330; ++ CONSTANT rdown_b_z : NATURAL := 2320; ++ CONSTANT rdown_c_z : NATURAL := 2310; ++ CONSTANT rdown_d_z : NATURAL := 2300; ++ CONSTANT rup_a_z : NATURAL := 2980; ++ CONSTANT rup_b_z : NATURAL := 2980; ++ CONSTANT rup_c_z : NATURAL := 2980; ++ CONSTANT rup_d_z : NATURAL := 2980; ++ CONSTANT tphh_a_z : NATURAL := 115; ++ CONSTANT tphh_b_z : NATURAL := 112; ++ CONSTANT tpll_d_z : NATURAL := 107; ++ CONSTANT tphh_c_z : NATURAL := 106; ++ CONSTANT tpll_c_z : NATURAL := 121; ++ CONSTANT tphh_d_z : NATURAL := 98; ++ CONSTANT tpll_b_z : NATURAL := 133; ++ CONSTANT tpll_a_z : NATURAL := 142; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ d : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END an4_x1; ++ ++ARCHITECTURE behaviour_data_flow OF an4_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on an4_x1" ++ SEVERITY WARNING; ++ z <= (((a and b) and c) and d) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/an4_x2.ap b/alliance/src/cells/src/msxlib/an4_x2.ap +new file mode 100644 +index 0000000..fda7322 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an4_x2.ap +@@ -0,0 +1,133 @@ ++V ALLIANCE : 6 ++H an4_x2,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 2000,3000,ref_ref,z_30 ++R 4000,5000,ref_ref,b_50 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,4000,ref_ref,z_40 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 4000,4000,ref_ref,b_40 ++R 4000,3000,ref_ref,b_30 ++R 5000,3000,ref_ref,b_30 ++R 5000,7000,ref_ref,d_70 ++R 6000,7000,ref_ref,d_70 ++R 6000,6000,ref_ref,d_60 ++R 6000,5000,ref_ref,d_50 ++R 4000,6000,ref_ref,c_60 ++R 5000,6000,ref_ref,c_60 ++R 5000,5000,ref_ref,c_50 ++R 5000,4000,ref_ref,c_40 ++R 4000,7000,ref_ref,a_70 ++R 3000,7000,ref_ref,a_70 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++R 1000,2000,ref_ref,z_20 ++S 3800,3800,3800,5100,200,*,UP,POLY ++S 4600,3800,4600,4300,200,*,UP,POLY ++S 4000,2900,4000,5200,400,*,DOWN,ALU1 ++S 3600,4900,3600,5900,200,*,DOWN,POLY ++S 2300,700,2300,2200,400,*,DOWN,ALU1 ++S 2300,1200,2300,3600,800,*,UP,NDIF ++S 2000,4000,3100,4000,400,*,RIGHT,ALU1 ++S 3100,2000,6000,2000,400,*,LEFT,ALU1 ++S 3100,2000,3100,4000,400,*,DOWN,ALU1 ++S 1000,3000,2100,3000,400,*,RIGHT,ALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 6000,2300,6000,2900,600,*,UP,NDIF ++S 6000,2000,6000,3100,400,*,UP,ALU1 ++S 6000,8300,6000,8600,200,*,DOWN,POLY ++S 6500,6100,6500,9300,400,*,UP,PDIF ++S 2000,8000,5500,8000,400,*,RIGHT,ALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,an4_x2,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 6000,4800,6000,5900,200,*,DOWN,POLY ++S 4800,4200,4800,5900,200,*,DOWN,POLY ++S 4800,8300,4800,8700,200,*,DOWN,POLY ++S 5400,6100,5400,8100,600,*,DOWN,PDIF ++S 6000,5900,6000,8300,200,1d,UP,PTRANS ++S 4800,5900,4800,8300,200,1c,UP,PTRANS ++S 4200,6100,4200,9100,600,*,UP,PDIF ++S 500,6600,1000,6600,400,*,RIGHT,ALU1 ++S 500,5800,1000,5800,400,*,RIGHT,ALU1 ++S 2900,4900,2900,5200,600,*,UP,ALU1 ++S 2400,5200,2400,5900,200,*,DOWN,POLY ++S 1800,4400,2000,4400,600,*,RIGHT,ALU1 ++S 1200,4600,1600,4600,200,*,RIGHT,POLY ++S 1200,4600,1200,5500,200,*,DOWN,POLY ++S 3600,8300,3600,8700,200,*,DOWN,POLY ++S 2400,8300,2400,8700,200,*,DOWN,POLY ++S 3600,5900,3600,8300,200,1b,UP,PTRANS ++S 2400,5900,2400,8300,200,1a,UP,PTRANS ++S 3000,6100,3000,8100,1000,*,DOWN,PDIF ++S 1800,5700,1800,9100,600,*,DOWN,PDIF ++S 1200,9300,1200,9700,200,*,DOWN,POLY ++S 600,5900,600,6700,600,*,UP,PDIF ++S 1200,5500,1200,9300,200,1z,UP,PTRANS ++S 800,5700,800,9100,400,*,UP,PDIF ++S 5000,7000,5000,7000,400,d,LEFT,CALU1 ++S 5000,3000,5000,3000,400,b,LEFT,CALU1 ++S 4000,6000,4000,6000,400,c,LEFT,CALU1 ++S 4000,7000,4000,7000,400,a,LEFT,CALU1 ++S 1000,2800,1000,3400,600,*,DOWN,NDIF ++S 5400,600,5400,1000,200,*,DOWN,POLY ++S 4600,600,4600,1000,200,*,DOWN,POLY ++S 3800,600,3800,1000,200,*,DOWN,POLY ++S 3000,600,3000,1000,200,*,DOWN,POLY ++S 5800,1200,5800,3600,400,*,UP,NDIF ++S 5400,1000,5400,3800,200,2d,DOWN,NTRANS ++S 5000,1200,5000,3600,600,n3,UP,NDIF ++S 4600,1000,4600,3800,200,2c,DOWN,NTRANS ++S 4200,1200,4200,3600,600,n2,UP,NDIF ++S 3000,1000,3000,3800,200,2a,DOWN,NTRANS ++S 3800,1000,3800,3800,200,2b,DOWN,NTRANS ++S 3400,1200,3400,3600,600,n1,UP,NDIF ++S 4000,3000,4000,5000,400,b,DOWN,CALU1 ++S 4000,2900,5100,2900,400,*,RIGHT,ALU1 ++S 4000,3000,5100,3000,400,*,RIGHT,ALU1 ++S 5000,3900,5000,6100,400,*,DOWN,ALU1 ++S 3900,6000,5000,6000,400,*,RIGHT,ALU1 ++S 3900,6100,5000,6100,400,*,RIGHT,ALU1 ++S 1600,1500,1600,1900,200,*,DOWN,POLY ++S 1200,2100,1200,3600,400,*,UP,NDIF ++S 3000,3800,3000,4900,200,*,UP,POLY ++S 5400,4200,5800,4200,200,*,RIGHT,POLY ++S 5800,4200,5800,4800,200,*,UP,POLY ++S 3000,7000,4100,7000,400,*,RIGHT,ALU1 ++S 3000,7100,4100,7100,400,*,RIGHT,ALU1 ++S 6000,5000,6000,7000,400,d,UP,CALU1 ++S 6000,4900,6000,7000,400,*,UP,ALU1 ++S 4900,7000,6000,7000,400,*,LEFT,ALU1 ++S 4900,7100,6000,7100,400,*,LEFT,ALU1 ++S 5000,4000,5000,6000,400,c,DOWN,CALU1 ++S 3000,4900,3000,7000,400,*,DOWN,ALU1 ++S 3000,5000,3000,7000,400,a,DOWN,CALU1 ++S 2000,4000,2000,8000,400,*,UP,ALU1 ++S 1600,1900,1600,3800,200,2z,DOWN,NTRANS ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,1900,1000,7100,400,*,DOWN,ALU1 ++V 1000,700,CONT_BODY_P,* ++V 3000,9300,CONT_BODY_N,* ++V 5000,5100,CONT_POLY,* ++V 4000,5100,CONT_POLY,* ++V 2300,1300,CONT_DIF_N,* ++V 2300,2100,CONT_DIF_N,* ++V 6000,2200,CONT_DIF_N,zn ++V 6000,3000,CONT_DIF_N,zn ++V 6400,9200,CONT_DIF_P,* ++V 5400,8000,CONT_DIF_P,zn ++V 4200,9000,CONT_DIF_P,* ++V 2800,5100,CONT_POLY,* ++V 1800,4400,CONT_POLY,zn ++V 3000,8000,CONT_DIF_P,zn ++V 1800,9000,CONT_DIF_P,* ++V 600,6600,CONT_DIF_P,* ++V 600,5800,CONT_DIF_P,* ++V 1000,2700,CONT_DIF_N,* ++V 1000,3500,CONT_DIF_N,* ++V 6000,5000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/an4_x2.vbe b/alliance/src/cells/src/msxlib/an4_x2.vbe +new file mode 100644 +index 0000000..ac82e4f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an4_x2.vbe +@@ -0,0 +1,44 @@ ++ENTITY an4_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT cin_c : NATURAL := 6; ++ CONSTANT cin_d : NATURAL := 6; ++ CONSTANT rdown_a_z : NATURAL := 1220; ++ CONSTANT rdown_b_z : NATURAL := 1220; ++ CONSTANT rdown_c_z : NATURAL := 1210; ++ CONSTANT rdown_d_z : NATURAL := 1210; ++ CONSTANT rup_a_z : NATURAL := 1570; ++ CONSTANT rup_b_z : NATURAL := 1570; ++ CONSTANT rup_c_z : NATURAL := 1570; ++ CONSTANT rup_d_z : NATURAL := 1570; ++ CONSTANT tphh_a_z : NATURAL := 112; ++ CONSTANT tphh_b_z : NATURAL := 110; ++ CONSTANT tpll_d_z : NATURAL := 105; ++ CONSTANT tphh_c_z : NATURAL := 104; ++ CONSTANT tpll_c_z : NATURAL := 118; ++ CONSTANT tphh_d_z : NATURAL := 97; ++ CONSTANT tpll_b_z : NATURAL := 130; ++ CONSTANT tpll_a_z : NATURAL := 139; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ d : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END an4_x2; ++ ++ARCHITECTURE behaviour_data_flow OF an4_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on an4_x2" ++ SEVERITY WARNING; ++ z <= (((a and b) and c) and d) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/an4_x3.ap b/alliance/src/cells/src/msxlib/an4_x3.ap +new file mode 100644 +index 0000000..d1daacf +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an4_x3.ap +@@ -0,0 +1,137 @@ ++V ALLIANCE : 6 ++H an4_x3,P, 8/ 8/2014,100 ++A 0,0,9000,10000 ++R 8000,5000,ref_ref,d_50 ++R 8000,7000,ref_ref,d_70 ++R 8000,6000,ref_ref,d_60 ++R 1000,7000,ref_ref,z_70 ++R 6000,6000,ref_ref,d_60 ++R 7000,5000,ref_ref,d_50 ++R 6000,5000,ref_ref,c_50 ++R 6000,6000,ref_ref,c_60 ++R 5000,6000,ref_ref,c_60 ++R 5000,7000,ref_ref,a_70 ++R 4000,7000,ref_ref,a_70 ++R 4000,6000,ref_ref,a_60 ++R 6000,3000,ref_ref,b_30 ++R 6000,4000,ref_ref,c_40 ++R 5000,3000,ref_ref,b_30 ++R 5000,4000,ref_ref,b_40 ++R 5000,5000,ref_ref,b_50 ++R 4000,5000,ref_ref,a_50 ++R 2000,7000,ref_ref,z_70 ++R 2000,8000,ref_ref,z_80 ++R 2000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,z_40 ++R 2000,5000,ref_ref,z_50 ++R 2000,6000,ref_ref,z_60 ++S 8000,4900,8000,7100,400,*,UP,ALU1 ++S 3000,8000,6600,8000,400,*,RIGHT,ALU1 ++S 6600,6900,6600,8000,400,*,DOWN,ALU1 ++S 6900,5000,8000,5000,600,*,LEFT,ALU1 ++S 7000,5000,7000,5000,400,d,LEFT,CALU1 ++S 8000,5000,8000,7000,400,d,UP,CALU1 ++S 7800,7900,7800,9300,400,*,DOWN,ALU1 ++S 1200,9300,1200,9700,200,*,DOWN,POLY ++S 7200,2300,7200,2900,600,*,UP,NDIF ++S 0,600,9000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,9000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,9000,5000,10000,an4_x3,LEFT,TALU8 ++S 0,2200,9000,2200,5200,*,LEFT,PWELL ++S 0,7600,9000,7600,5600,*,LEFT,NWELL ++S 6000,4000,6000,6000,400,c,DOWN,CALU1 ++S 6000,3900,6000,6100,400,*,DOWN,ALU1 ++S 4900,6000,6000,6000,400,*,RIGHT,ALU1 ++S 4900,6100,6000,6100,400,*,RIGHT,ALU1 ++S 5000,6000,5000,6000,400,c,LEFT,CALU1 ++S 4000,7000,5100,7000,400,*,RIGHT,ALU1 ++S 4000,7100,5100,7100,400,*,RIGHT,ALU1 ++S 5000,7000,5000,7000,400,a,LEFT,CALU1 ++S 4000,4900,4000,7000,400,*,DOWN,ALU1 ++S 4000,5000,4000,7000,400,a,DOWN,CALU1 ++S 7200,2000,7200,3100,400,*,UP,ALU1 ++S 5000,3000,6100,3000,400,*,RIGHT,ALU1 ++S 6000,3000,6000,3000,400,b,LEFT,CALU1 ++S 5000,2900,6100,2900,400,*,RIGHT,ALU1 ++S 5000,3000,5000,5000,400,b,DOWN,CALU1 ++S 5400,1200,5400,3700,600,n2,UP,NDIF ++S 5800,3900,5800,6000,200,*,UP,POLY ++S 5000,3900,5000,5100,200,*,UP,POLY ++S 1200,6700,1200,9300,200,1z,UP,PTRANS ++S 1800,6900,1800,9100,600,*,DOWN,PDIF ++S 4800,6400,4800,9300,200,1b,UP,PTRANS ++S 4200,6600,4200,9100,1000,*,DOWN,PDIF ++S 3600,6400,3600,9300,200,1a,UP,PTRANS ++S 3000,6600,3000,9100,600,*,DOWN,PDIF ++S 5400,6600,5400,9100,600,*,UP,PDIF ++S 6000,6400,6000,9300,200,1c,UP,PTRANS ++S 7200,6400,7200,9300,200,1d,UP,PTRANS ++S 6600,6600,6600,9100,600,*,DOWN,PDIF ++S 4200,3900,4200,5800,200,*,UP,POLY ++S 6600,3900,6600,4900,200,*,UP,POLY ++S 5000,2900,5000,5100,400,*,DOWN,ALU1 ++S 7200,4800,7200,6400,200,*,DOWN,POLY ++S 4800,4900,4800,6400,200,*,DOWN,POLY ++S 3600,5600,3600,6400,200,*,DOWN,POLY ++S 1000,7000,1800,7000,600,*,RIGHT,ALU1 ++S 1900,6900,1900,8100,600,*,DOWN,ALU1 ++S 1200,6300,2400,6300,200,*,RIGHT,POLY ++S 2400,6700,2400,9300,200,2z,UP,PTRANS ++S 600,6900,600,9100,600,*,DOWN,PDIF ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 7900,6600,7900,9100,600,*,DOWN,PDIF ++S 4000,2000,4000,4000,400,*,UP,ALU1 ++S 3000,4000,4000,4000,400,*,LEFT,ALU1 ++S 3000,4000,3000,8000,400,*,DOWN,ALU1 ++S 4000,2000,7200,2000,400,*,LEFT,ALU1 ++S 3200,700,3200,3100,400,*,DOWN,ALU1 ++S 2600,1300,2600,3900,200,3z,DOWN,NTRANS ++S 2600,3900,2600,5000,200,*,UP,POLY ++S 2400,4600,2400,6700,200,*,DOWN,POLY ++S 2200,1500,2200,3700,400,*,UP,NDIF ++S 2000,2900,2000,3500,600,*,DOWN,NDIF ++S 2000,3000,2000,8000,400,z,UP,CALU1 ++S 2000,2700,2000,8100,400,*,DOWN,ALU1 ++S 1000,7000,1000,7000,400,z,LEFT,CALU1 ++S 2400,9300,2400,9700,200,*,UP,POLY ++S 3600,9300,3600,9700,200,*,UP,POLY ++S 4800,9300,4800,9700,200,*,UP,POLY ++S 6000,9300,6000,9700,200,*,UP,POLY ++S 7200,9300,7200,9700,200,*,UP,POLY ++S 6200,800,6200,3700,600,n3,UP,NDIF ++S 5800,600,5800,3900,200,2c,DOWN,NTRANS ++S 6600,600,6600,3900,200,2d,DOWN,NTRANS ++S 4600,800,4600,3700,600,n1,UP,NDIF ++S 4200,600,4200,3900,200,2a,DOWN,NTRANS ++S 5000,600,5000,3900,200,2b,DOWN,NTRANS ++S 7000,800,7000,3700,400,*,UP,NDIF ++S 3300,800,3300,3700,800,*,UP,NDIF ++S 4200,300,4200,600,200,*,DOWN,POLY ++S 5000,300,5000,600,200,*,DOWN,POLY ++S 5800,300,5800,600,200,*,DOWN,POLY ++S 6600,300,6600,600,200,*,DOWN,POLY ++S 2600,1000,2600,1300,200,*,DOWN,POLY ++V 1000,700,CONT_BODY_P,* ++V 6600,7800,CONT_DIF_P,zn ++V 6600,7000,CONT_DIF_P,zn ++V 7800,8000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,zn ++V 7000,5000,CONT_POLY,* ++V 7200,3000,CONT_DIF_N,zn ++V 7200,2200,CONT_DIF_N,zn ++V 5400,9000,CONT_DIF_P,* ++V 3000,9000,CONT_DIF_P,* ++V 600,9000,CONT_DIF_P,* ++V 7800,9000,CONT_DIF_P,* ++V 3000,4800,CONT_POLY,zn ++V 1800,7000,CONT_DIF_P,* ++V 1800,8000,CONT_DIF_P,* ++V 4000,5800,CONT_POLY,* ++V 6000,5800,CONT_POLY,* ++V 5000,5000,CONT_POLY,* ++V 600,8000,CONT_DIF_P,* ++V 3200,2100,CONT_DIF_N,* ++V 3200,3000,CONT_DIF_N,* ++V 2000,3600,CONT_DIF_N,* ++V 2000,2800,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/an4_x3.vbe b/alliance/src/cells/src/msxlib/an4_x3.vbe +new file mode 100644 +index 0000000..f5dae13 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/an4_x3.vbe +@@ -0,0 +1,44 @@ ++ENTITY an4_x3 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 9000; ++ CONSTANT cin_a : NATURAL := 8; ++ CONSTANT cin_b : NATURAL := 8; ++ CONSTANT cin_c : NATURAL := 7; ++ CONSTANT cin_d : NATURAL := 7; ++ CONSTANT rdown_a_z : NATURAL := 890; ++ CONSTANT rdown_b_z : NATURAL := 890; ++ CONSTANT rdown_c_z : NATURAL := 880; ++ CONSTANT rdown_d_z : NATURAL := 880; ++ CONSTANT rup_a_z : NATURAL := 1140; ++ CONSTANT rup_b_z : NATURAL := 1140; ++ CONSTANT rup_c_z : NATURAL := 1140; ++ CONSTANT rup_d_z : NATURAL := 1150; ++ CONSTANT tphh_a_z : NATURAL := 114; ++ CONSTANT tphh_b_z : NATURAL := 111; ++ CONSTANT tpll_d_z : NATURAL := 105; ++ CONSTANT tphh_c_z : NATURAL := 105; ++ CONSTANT tpll_c_z : NATURAL := 118; ++ CONSTANT tphh_d_z : NATURAL := 98; ++ CONSTANT tpll_b_z : NATURAL := 129; ++ CONSTANT tpll_a_z : NATURAL := 138; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ d : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END an4_x3; ++ ++ARCHITECTURE behaviour_data_flow OF an4_x3 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on an4_x3" ++ SEVERITY WARNING; ++ z <= (((a and b) and c) and d) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aoi21_x05.ap b/alliance/src/cells/src/msxlib/aoi21_x05.ap +new file mode 100644 +index 0000000..0a9ddcc +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi21_x05.ap +@@ -0,0 +1,94 @@ ++V ALLIANCE : 6 ++H aoi21_x05,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 2000,7000,ref_ref,b_70 ++R 3000,6000,ref_ref,a2_60 ++R 3000,3000,ref_ref,a1_30 ++R 2000,4000,ref_ref,z_40 ++R 4000,4000,ref_ref,a1_40 ++R 2000,3000,ref_ref,z_30 ++R 1000,8000,ref_ref,z_80 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 2000,5000,ref_ref,b_50 ++R 2000,6000,ref_ref,b_60 ++R 3000,7000,ref_ref,b_70 ++R 3000,5000,ref_ref,a2_50 ++R 4000,6000,ref_ref,a2_60 ++R 4000,5000,ref_ref,a1_50 ++R 3000,4000,ref_ref,a1_40 ++R 4000,7000,ref_ref,a2_70 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 3800,8300,3800,8700,200,*,DOWN,POLY ++S 2600,8300,2600,8700,200,*,DOWN,POLY ++S 1400,8300,1400,8700,200,*,DOWN,POLY ++S 1900,4900,1900,5100,600,*,UP,ALU1 ++S 2000,7100,3100,7100,400,*,RIGHT,ALU1 ++S 2000,5000,2000,7000,400,b,DOWN,CALU1 ++S 2000,4900,2000,7000,400,*,DOWN,ALU1 ++S 4000,6000,4000,7000,400,a2,DOWN,CALU1 ++S 4000,6000,4000,7100,400,*,UP,ALU1 ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 3000,4900,3000,6000,400,*,UP,ALU1 ++S 3000,5000,3000,6000,400,a2,DOWN,CALU1 ++S 1400,3300,1400,6300,200,*,DOWN,POLY ++S 2600,3600,2600,6300,200,*,DOWN,POLY ++S 3800,4000,3800,6300,200,*,UP,POLY ++S 3400,4000,3800,4000,200,*,RIGHT,POLY ++S 4000,700,4000,3100,400,*,UP,ALU1 ++S 4000,2900,4000,3400,600,*,UP,NDIF ++S 3000,2900,3000,4000,400,*,DOWN,ALU1 ++S 3000,4000,4000,4000,600,*,RIGHT,ALU1 ++S 4000,4000,4000,5100,400,*,UP,ALU1 ++S 4000,4000,4000,5000,400,a1,UP,CALU1 ++S 3000,3000,3000,4000,400,a1,DOWN,CALU1 ++S 2200,2900,2200,3400,400,*,UP,NDIF ++S 3000,2900,3000,3400,600,n1,UP,NDIF ++S 3400,2700,3400,3600,200,4,UP,NTRANS ++S 3400,2300,3400,2700,200,*,UP,POLY ++S 2600,2700,2600,3600,200,5,UP,NTRANS ++S 2600,2300,2600,2700,200,*,UP,POLY ++S 1400,2700,1400,3300,200,6,UP,NTRANS ++S 1400,2300,1400,2700,200,*,UP,POLY ++S 800,700,800,3100,400,*,UP,ALU1 ++S 2000,2900,2000,4000,400,*,DOWN,ALU1 ++S 1000,4000,2000,4000,600,*,RIGHT,ALU1 ++S 2000,3000,2000,4000,400,z,DOWN,CALU1 ++S 1000,4000,1000,8000,400,z,DOWN,CALU1 ++S 1000,4000,1000,6600,400,*,DOWN,ALU1 ++S 0,5000,5000,5000,10000,aoi21_x05,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 3200,6500,3200,9100,600,*,UP,PDIF ++S 1000,6500,1000,8100,400,*,UP,PDIF ++S 3800,6300,3800,8300,200,1,DOWN,PTRANS ++S 4200,6500,4200,8100,400,*,UP,PDIF ++S 2600,6300,2600,8300,200,2,DOWN,PTRANS ++S 2000,6500,2000,8100,1000,*,UP,PDIF ++S 1400,6300,1400,8300,200,3,DOWN,PTRANS ++S 1900,8000,4500,8000,400,*,RIGHT,ALU1 ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,7000,3100,7000,400,*,RIGHT,ALU1 ++S 3000,7000,3000,7000,400,b,LEFT,CALU1 ++S 800,7100,800,8100,600,*,UP,PDIF ++S 900,7100,900,8100,600,*,UP,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 4000,3000,CONT_DIF_N,* ++V 2000,3000,CONT_DIF_N,* ++V 800,3000,CONT_DIF_N,* ++V 3000,5700,CONT_POLY,* ++V 1800,5000,CONT_POLY,* ++V 3200,9000,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,n2 ++V 4400,8000,CONT_DIF_P,n2 ++V 800,8000,CONT_DIF_P,* ++V 4000,5000,CONT_POLY,* ++V 800,7200,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/aoi21_x05.vbe b/alliance/src/cells/src/msxlib/aoi21_x05.vbe +new file mode 100644 +index 0000000..db51972 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi21_x05.vbe +@@ -0,0 +1,38 @@ ++ENTITY aoi21_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a1 : NATURAL := 4; ++ CONSTANT cin_a2 : NATURAL := 4; ++ CONSTANT cin_b : NATURAL := 3; ++ CONSTANT rdown_a1_z : NATURAL := 4130; ++ CONSTANT rdown_a2_z : NATURAL := 4130; ++ CONSTANT rdown_b_z : NATURAL := 3810; ++ CONSTANT rup_a1_z : NATURAL := 5810; ++ CONSTANT rup_a2_z : NATURAL := 5830; ++ CONSTANT rup_b_z : NATURAL := 5310; ++ CONSTANT tphl_a1_z : NATURAL := 57; ++ CONSTANT tphl_a2_z : NATURAL := 58; ++ CONSTANT tphl_b_z : NATURAL := 45; ++ CONSTANT tplh_b_z : NATURAL := 48; ++ CONSTANT tplh_a2_z : NATURAL := 69; ++ CONSTANT tplh_a1_z : NATURAL := 76; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aoi21_x05; ++ ++ARCHITECTURE behaviour_data_flow OF aoi21_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aoi21_x05" ++ SEVERITY WARNING; ++ z <= not (((a1 and a2) or b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aoi21_x1.ap b/alliance/src/cells/src/msxlib/aoi21_x1.ap +new file mode 100644 +index 0000000..d16aa44 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi21_x1.ap +@@ -0,0 +1,102 @@ ++V ALLIANCE : 6 ++H aoi21_x1,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 3000,3000,ref_ref,a1_30 ++R 4000,4000,ref_ref,a1_40 ++R 2000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 2000,5000,ref_ref,b_50 ++R 2000,6000,ref_ref,b_60 ++R 3000,5000,ref_ref,a2_50 ++R 4000,6000,ref_ref,a2_60 ++R 4000,3000,ref_ref,a1_30 ++R 2000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 3000,2000,ref_ref,a1_20 ++R 3000,4000,ref_ref,a2_40 ++R 4000,5000,ref_ref,a2_50 ++R 3000,6000,ref_ref,b_60 ++R 2000,4000,ref_ref,b_40 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 4100,1900,4100,3200,600,*,UP,NDIF ++S 3400,3800,3800,3800,200,*,RIGHT,POLY ++S 1900,4800,1900,5000,600,*,UP,ALU1 ++S 3400,1300,3400,1700,200,*,UP,POLY ++S 3400,1700,3400,3400,200,4,UP,NTRANS ++S 3000,1900,3000,3200,600,n1,UP,NDIF ++S 2600,1300,2600,1700,200,*,UP,POLY ++S 2600,3400,2600,5500,200,*,DOWN,POLY ++S 2600,1700,2600,3400,200,5,UP,NTRANS ++S 2200,1900,2200,3200,400,*,UP,NDIF ++S 900,5700,900,7100,600,*,UP,ALU1 ++S 800,5700,800,6500,600,*,UP,PDIF ++S 2000,5700,2000,9200,600,*,UP,PDIF ++S 3200,5700,3200,9200,600,*,UP,PDIF ++S 4200,5700,4200,9200,400,*,UP,PDIF ++S 3800,5500,3800,9400,200,1,DOWN,PTRANS ++S 2600,5500,2600,9400,200,2,DOWN,PTRANS ++S 1000,5700,1000,9200,400,*,UP,PDIF ++S 1400,5500,1400,9400,200,3,DOWN,PTRANS ++S 3800,9400,3800,9700,200,*,DOWN,POLY ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 1400,9400,1400,9700,200,*,DOWN,POLY ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,aoi21_x1,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 4000,700,4000,2100,400,*,UP,ALU1 ++S 3000,3000,4000,3000,600,*,RIGHT,ALU1 ++S 1400,1700,1400,2700,200,6,UP,NTRANS ++S 1400,1300,1400,1700,200,*,UP,POLY ++S 2000,1900,2000,2500,1000,*,UP,NDIF ++S 1400,2700,1400,5500,200,*,DOWN,POLY ++S 800,1900,800,2500,600,*,UP,NDIF ++S 700,1900,700,2500,600,*,UP,NDIF ++S 800,700,800,2100,400,*,UP,ALU1 ++S 1000,3000,2000,3000,400,*,RIGHT,ALU1 ++S 1000,2900,2000,2900,400,*,RIGHT,ALU1 ++S 2000,2000,2000,3000,600,*,DOWN,ALU1 ++S 2000,2000,2000,3000,400,z,DOWN,CALU1 ++S 1000,2900,1000,7000,400,*,DOWN,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 2000,4000,2000,6000,400,b,DOWN,CALU1 ++S 3000,2000,3000,3000,400,a1,DOWN,CALU1 ++S 3000,1900,3000,3100,400,*,DOWN,ALU1 ++S 3800,3800,3800,5500,200,*,UP,POLY ++S 4000,3000,4000,4100,400,*,UP,ALU1 ++S 4000,3000,4000,4000,400,a1,UP,CALU1 ++S 3000,5000,4000,5000,600,*,RIGHT,ALU1 ++S 4000,5000,4000,6000,400,a2,DOWN,CALU1 ++S 3000,3900,3000,5100,400,*,UP,ALU1 ++S 3000,4000,3000,5000,400,a2,DOWN,CALU1 ++S 4000,4900,4000,6100,400,*,UP,ALU1 ++S 2000,6100,3100,6100,400,*,RIGHT,ALU1 ++S 2000,6000,3100,6000,400,*,RIGHT,ALU1 ++S 3000,6000,3000,6000,400,b,LEFT,CALU1 ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 3200,7900,3200,9300,400,*,DOWN,ALU1 ++S 4400,7000,4400,8100,400,*,DOWN,ALU1 ++S 2000,7000,2000,8100,400,*,DOWN,ALU1 ++S 2000,7000,4400,7000,400,*,RIGHT,ALU1 ++S 4400,7300,4400,7900,600,*,UP,PDIF ++V 2100,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1800,4900,CONT_POLY,* ++V 4000,2000,CONT_DIF_N,* ++V 3000,4900,CONT_POLY,* ++V 800,6600,CONT_DIF_P,* ++V 800,5800,CONT_DIF_P,* ++V 3200,9000,CONT_DIF_P,* ++V 800,2000,CONT_DIF_N,* ++V 2000,2000,CONT_DIF_N,* ++V 4000,4000,CONT_POLY,* ++V 3200,8000,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,n2 ++V 4400,8000,CONT_DIF_P,n2 ++V 2000,7200,CONT_DIF_P,n2 ++V 4400,7200,CONT_DIF_P,n2 ++EOF +diff --git a/alliance/src/cells/src/msxlib/aoi21_x1.vbe b/alliance/src/cells/src/msxlib/aoi21_x1.vbe +new file mode 100644 +index 0000000..b53540f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi21_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY aoi21_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a1 : NATURAL := 6; ++ CONSTANT cin_a2 : NATURAL := 6; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT rdown_a1_z : NATURAL := 2190; ++ CONSTANT rdown_a2_z : NATURAL := 2180; ++ CONSTANT rdown_b_z : NATURAL := 2280; ++ CONSTANT rup_a1_z : NATURAL := 2980; ++ CONSTANT rup_a2_z : NATURAL := 2990; ++ CONSTANT rup_b_z : NATURAL := 2720; ++ CONSTANT tphl_a1_z : NATURAL := 55; ++ CONSTANT tphl_a2_z : NATURAL := 56; ++ CONSTANT tphl_b_z : NATURAL := 45; ++ CONSTANT tplh_b_z : NATURAL := 45; ++ CONSTANT tplh_a2_z : NATURAL := 64; ++ CONSTANT tplh_a1_z : NATURAL := 71; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aoi21_x1; ++ ++ARCHITECTURE behaviour_data_flow OF aoi21_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aoi21_x1" ++ SEVERITY WARNING; ++ z <= not (((a1 and a2) or b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aoi21_x2.ap b/alliance/src/cells/src/msxlib/aoi21_x2.ap +new file mode 100644 +index 0000000..c4a05d0 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi21_x2.ap +@@ -0,0 +1,136 @@ ++V ALLIANCE : 6 ++H aoi21_x2,P, 8/ 8/2014,100 ++A 0,0,9000,10000 ++R 1000,3000,ref_ref,z_30 ++R 4000,4000,ref_ref,b_40 ++R 8000,4000,ref_ref,a1_40 ++R 8000,6000,ref_ref,a1_60 ++R 3000,5000,ref_ref,b_50 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 3000,3000,ref_ref,z_30 ++R 2000,3000,ref_ref,z_30 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 4000,3000,ref_ref,z_30 ++R 2000,5000,ref_ref,a1_50 ++R 8000,5000,ref_ref,a1_50 ++R 7000,6000,ref_ref,a1_60 ++R 6000,6000,ref_ref,a1_60 ++R 5000,6000,ref_ref,a1_60 ++R 4000,6000,ref_ref,a1_60 ++R 3000,6000,ref_ref,a1_60 ++R 6000,5000,ref_ref,a2_50 ++R 5000,5000,ref_ref,a2_50 ++R 1000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,a1_60 ++R 4000,5000,ref_ref,b_50 ++R 6000,4000,ref_ref,a2_40 ++R 6000,3000,ref_ref,a2_30 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 4900,5000,6000,5000,600,*,RIGHT,ALU1 ++S 3800,3900,3800,5100,200,*,UP,POLY ++S 3100,1900,3100,3700,600,*,UP,NDIF ++S 3200,700,3200,2100,400,*,UP,ALU1 ++S 3800,1700,3800,3900,200,09,UP,NTRANS ++S 3800,1300,3800,1700,200,*,DOWN,POLY ++S 4400,1900,4400,3700,1000,*,UP,NDIF ++S 4600,800,4600,3700,400,*,UP,NDIF ++S 5800,4300,7600,4300,200,*,LEFT,POLY ++S 5000,3900,5000,4800,200,*,UP,POLY ++S 5000,300,5000,600,200,*,DOWN,POLY ++S 5000,600,5000,3900,200,08,UP,NTRANS ++S 5800,300,5800,600,200,*,DOWN,POLY ++S 5800,600,5800,3900,200,07,UP,NTRANS ++S 6500,800,6500,3700,600,*,UP,NDIF ++S 6400,700,6400,2000,400,*,UP,ALU1 ++S 5000,5000,5000,5000,400,a2,LEFT,CALU1 ++S 3000,5000,3000,5000,400,b,LEFT,CALU1 ++S 7000,6000,7000,6000,400,a1,LEFT,CALU1 ++S 6000,6000,6000,6000,400,a1,LEFT,CALU1 ++S 5000,6000,5000,6000,400,a1,LEFT,CALU1 ++S 4000,6000,4000,6000,400,a1,LEFT,CALU1 ++S 3000,6000,3000,6000,400,a1,LEFT,CALU1 ++S 4000,3000,4000,3000,400,z,LEFT,CALU1 ++S 3000,3000,3000,3000,400,z,LEFT,CALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 0,9400,9000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,9000,5000,10000,aoi21_x2,LEFT,TALU8 ++S 0,2200,9000,2200,5200,*,LEFT,PWELL ++S 0,7600,9000,7600,5600,*,LEFT,NWELL ++S 2000,6000,8000,6000,400,*,RIGHT,ALU1 ++S 0,600,9000,600,1200,vss,RIGHT,CALU1 ++S 1600,5500,1600,9400,200,02,DOWN,PTRANS ++S 900,5700,900,9200,600,*,DOWN,PDIF ++S 2800,5500,2800,9400,200,06,DOWN,PTRANS ++S 2200,5700,2200,9200,1000,*,UP,PDIF ++S 4000,5500,4000,9400,200,05,DOWN,PTRANS ++S 3400,5700,3400,9200,1000,*,UP,PDIF ++S 4600,5700,4600,9200,1000,*,UP,PDIF ++S 5200,5500,5200,9400,200,04,DOWN,PTRANS ++S 5800,5700,5800,9200,1000,*,UP,PDIF ++S 6400,5500,6400,9400,200,03,DOWN,PTRANS ++S 7000,5700,7000,9200,1000,*,UP,PDIF ++S 7600,5500,7600,9400,200,01,DOWN,PTRANS ++S 8300,5700,8300,9200,600,*,DOWN,PDIF ++S 1000,7000,3500,7000,400,*,RIGHT,ALU1 ++S 1000,7100,3500,7100,400,*,RIGHT,ALU1 ++S 8000,4000,8000,6000,400,a1,DOWN,CALU1 ++S 8000,4000,8000,6000,600,*,UP,ALU1 ++S 2000,5000,2000,6000,400,a1,DOWN,CALU1 ++S 2000,4900,2000,6000,600,*,UP,ALU1 ++S 1600,5000,1600,5500,200,*,DOWN,POLY ++S 2800,5100,4000,5100,200,*,LEFT,POLY ++S 5200,5100,6400,5100,200,*,RIGHT,POLY ++S 1600,9400,1600,9700,200,*,DOWN,POLY ++S 2800,9400,2800,9700,200,*,DOWN,POLY ++S 4000,9400,4000,9700,200,*,DOWN,POLY ++S 5200,9400,5200,9700,200,*,DOWN,POLY ++S 6400,9400,6400,9700,200,*,DOWN,POLY ++S 7600,9400,7600,9700,200,*,DOWN,POLY ++S 7600,4300,7600,5500,200,*,DOWN,POLY ++S 4000,3900,4000,5000,400,*,DOWN,ALU1 ++S 4000,4000,4000,5000,400,b,DOWN,CALU1 ++S 6000,2900,6000,5000,400,*,DOWN,ALU1 ++S 6000,3000,6000,5000,400,a2,DOWN,CALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1000,3000,1000,7000,400,*,DOWN,ALU1 ++S 3000,5000,4000,5000,600,*,RIGHT,ALU1 ++S 1000,3000,4400,3000,400,*,RIGHT,ALU1 ++S 1000,2900,4400,2900,400,*,RIGHT,ALU1 ++S 4400,1900,4400,3000,400,*,DOWN,ALU1 ++S 2100,8000,4600,8000,400,*,RIGHT,ALU1 ++S 4600,7000,7000,7000,400,*,RIGHT,ALU1 ++S 4600,7000,4600,8000,400,*,UP,ALU1 ++S 7000,7000,7000,8000,400,*,UP,ALU1 ++S 5800,7900,5800,9300,400,*,DOWN,ALU1 ++S 1000,7900,1000,9300,400,*,UP,ALU1 ++S 8200,6900,8200,9300,400,*,UP,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3200,2000,CONT_DIF_N,* ++V 5000,4900,CONT_POLY,* ++V 6400,900,CONT_DIF_N,* ++V 6400,1900,CONT_DIF_N,* ++V 3400,7000,CONT_DIF_P,* ++V 2200,8000,CONT_DIF_P,n2 ++V 1000,8000,CONT_DIF_P,* ++V 8200,8000,CONT_DIF_P,* ++V 8200,9000,CONT_DIF_P,* ++V 5800,9000,CONT_DIF_P,* ++V 1000,9000,CONT_DIF_P,* ++V 2000,4900,CONT_POLY,* ++V 8000,4500,CONT_POLY,* ++V 3800,4900,CONT_POLY,* ++V 8200,7000,CONT_DIF_P,* ++V 4400,2000,CONT_DIF_N,* ++V 4400,2800,CONT_DIF_N,* ++V 4600,7900,CONT_DIF_P,n2 ++V 4600,7100,CONT_DIF_P,n2 ++V 7000,7100,CONT_DIF_P,n2 ++V 7000,7900,CONT_DIF_P,n2 ++V 5800,8000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/aoi21_x2.vbe b/alliance/src/cells/src/msxlib/aoi21_x2.vbe +new file mode 100644 +index 0000000..705fdb4 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi21_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY aoi21_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 9000; ++ CONSTANT cin_a1 : NATURAL := 13; ++ CONSTANT cin_a2 : NATURAL := 12; ++ CONSTANT cin_b : NATURAL := 10; ++ CONSTANT rdown_a1_z : NATURAL := 1120; ++ CONSTANT rdown_a2_z : NATURAL := 1120; ++ CONSTANT rdown_b_z : NATURAL := 1040; ++ CONSTANT rup_a1_z : NATURAL := 1490; ++ CONSTANT rup_a2_z : NATURAL := 1490; ++ CONSTANT rup_b_z : NATURAL := 1360; ++ CONSTANT tphl_a1_z : NATURAL := 53; ++ CONSTANT tphl_a2_z : NATURAL := 54; ++ CONSTANT tphl_b_z : NATURAL := 41; ++ CONSTANT tplh_b_z : NATURAL := 43; ++ CONSTANT tplh_a2_z : NATURAL := 60; ++ CONSTANT tplh_a1_z : NATURAL := 68; ++ CONSTANT transistors : NATURAL := 9 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aoi21_x2; ++ ++ARCHITECTURE behaviour_data_flow OF aoi21_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aoi21_x2" ++ SEVERITY WARNING; ++ z <= not (((a1 and a2) or b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aoi22_x05.ap b/alliance/src/cells/src/msxlib/aoi22_x05.ap +new file mode 100644 +index 0000000..dab8c9b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi22_x05.ap +@@ -0,0 +1,126 @@ ++V ALLIANCE : 6 ++H aoi22_x05,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 2000,7000,ref_ref,z_70 ++R 2000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 3000,2000,ref_ref,z_20 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 2000,5000,ref_ref,b1_50 ++R 2000,4000,ref_ref,b1_40 ++R 3000,3000,ref_ref,b1_30 ++R 3000,6000,ref_ref,b2_60 ++R 2000,6000,ref_ref,b2_60 ++R 3000,5000,ref_ref,b2_50 ++R 3000,4000,ref_ref,b2_40 ++R 4000,6000,ref_ref,a2_60 ++R 4000,5000,ref_ref,a2_50 ++R 4000,4000,ref_ref,a2_40 ++R 5000,4000,ref_ref,a1_40 ++R 4000,3000,ref_ref,a1_30 ++R 1000,7000,ref_ref,z_70 ++R 5000,6000,ref_ref,a2_60 ++R 5000,3000,ref_ref,a1_30 ++R 2000,3000,ref_ref,b1_30 ++R 1000,2000,ref_ref,z_20 ++R 4000,2000,ref_ref,a1_20 ++S 4100,700,4900,700,600,*,RIGHT,PTIE ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 3000,7000,5400,7000,400,*,LEFT,ALU1 ++S 5400,7000,5400,8100,400,*,DOWN,ALU1 ++S 5400,7300,5400,7900,600,*,UP,PDIF ++S 2000,3000,2000,5100,400,*,UP,ALU1 ++S 5000,6000,5000,6000,400,a2,LEFT,CALU1 ++S 2000,6000,2000,6000,400,b2,LEFT,CALU1 ++S 3000,3000,3000,3000,400,b1,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 3600,5600,3600,6300,200,*,DOWN,POLY ++S 2400,4600,2400,6300,200,*,DOWN,POLY ++S 4600,2600,4600,3400,200,*,UP,POLY ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 2600,1700,2600,2600,200,7,UP,NTRANS ++S 3800,1700,3800,2600,200,8,UP,NTRANS ++S 4600,1700,4600,2600,200,6,UP,NTRANS ++S 2200,1900,2200,2400,600,n2,UP,NDIF ++S 5300,1900,5300,2400,600,*,UP,NDIF ++S 4200,1900,4200,2400,600,n1,UP,NDIF ++S 3200,1900,3200,2400,1000,*,UP,NDIF ++S 1200,900,1200,2400,600,*,UP,NDIF ++S 1800,1700,1800,2600,200,5,UP,NTRANS ++S 2000,4900,2000,5100,400,*,UP,ALU1 ++S 2000,3000,3100,3000,400,*,LEFT,ALU1 ++S 1800,1300,1800,1700,200,*,UP,POLY ++S 2600,1300,2600,1700,200,*,UP,POLY ++S 3800,1300,3800,1700,200,*,UP,POLY ++S 4600,1300,4600,1700,200,*,UP,POLY ++S 0,5000,6000,5000,10000,aoi22_x05,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 1800,6500,1800,8100,1000,*,UP,PDIF ++S 2400,6300,2400,8300,200,3,DOWN,PTRANS ++S 1200,6300,1200,8300,200,1,DOWN,PTRANS ++S 3600,6300,3600,8300,200,4,DOWN,PTRANS ++S 4800,6300,4800,8300,200,2,DOWN,PTRANS ++S 800,6500,800,8100,400,*,UP,PDIF ++S 5200,6500,5200,8100,400,*,UP,PDIF ++S 3000,6500,3000,8100,1000,*,UP,PDIF ++S 1200,8300,1200,8700,200,*,DOWN,POLY ++S 2400,8300,2400,8700,200,*,DOWN,POLY ++S 3600,8300,3600,8700,200,*,DOWN,POLY ++S 4800,8300,4800,8700,200,*,DOWN,POLY ++S 3000,4000,3000,6000,400,b2,DOWN,CALU1 ++S 3000,3900,3000,6000,400,*,DOWN,ALU1 ++S 1900,6000,3000,6000,400,*,RIGHT,ALU1 ++S 1900,6100,3000,6100,400,*,RIGHT,ALU1 ++S 1000,7000,2100,7000,400,*,RIGHT,ALU1 ++S 1000,7100,2100,7100,400,*,RIGHT,ALU1 ++S 4000,6000,5100,6000,400,*,RIGHT,ALU1 ++S 4000,6100,5100,6100,400,*,RIGHT,ALU1 ++S 4000,3900,4000,6000,400,*,UP,ALU1 ++S 4000,4000,4000,6000,400,a2,DOWN,CALU1 ++S 500,8000,3000,8000,400,*,RIGHT,ALU1 ++S 3000,7000,3000,8000,600,*,UP,ALU1 ++S 4200,7900,4200,9300,400,*,UP,ALU1 ++S 4200,6500,4200,8100,600,*,UP,PDIF ++S 2000,3000,2000,5000,400,b1,UP,CALU1 ++S 2000,2900,3100,2900,400,*,LEFT,ALU1 ++S 5200,700,5200,2100,400,*,UP,ALU1 ++S 3800,2600,3800,5300,200,*,UP,POLY ++S 4800,3600,4800,6300,200,*,DOWN,POLY ++S 1800,2600,1800,3400,200,*,UP,POLY ++S 1200,3700,1500,3700,200,*,RIGHT,POLY ++S 1200,3700,1200,6300,200,*,DOWN,POLY ++S 2600,2600,2600,4700,200,*,DOWN,POLY ++S 1800,3500,2000,3500,600,*,RIGHT,ALU1 ++S 4000,2000,4000,3000,400,a1,DOWN,CALU1 ++S 4000,1900,4000,3100,400,*,DOWN,ALU1 ++S 4000,3000,5000,3000,600,*,RIGHT,ALU1 ++S 1000,1900,1000,7000,400,*,DOWN,ALU1 ++S 1000,2000,3200,2000,600,*,RIGHT,ALU1 ++S 5000,3000,5000,4100,400,*,UP,ALU1 ++S 5000,3000,5000,4000,400,a1,UP,CALU1 ++V 5000,700,CONT_BODY_P,* ++V 4000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 5400,7200,CONT_DIF_P,n3 ++V 5400,8000,CONT_DIF_P,n3 ++V 1800,7000,CONT_DIF_P,* ++V 5200,2000,CONT_DIF_N,* ++V 1200,1000,CONT_DIF_N,* ++V 3200,2000,CONT_DIF_N,* ++V 3000,8000,CONT_DIF_P,n3 ++V 600,8000,CONT_DIF_P,n3 ++V 3000,7000,CONT_DIF_P,n3 ++V 4200,8000,CONT_DIF_P,* ++V 4000,5500,CONT_POLY,* ++V 5000,3500,CONT_POLY,* ++V 1800,3500,CONT_POLY,* ++V 3000,4500,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/aoi22_x05.vbe b/alliance/src/cells/src/msxlib/aoi22_x05.vbe +new file mode 100644 +index 0000000..995b188 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi22_x05.vbe +@@ -0,0 +1,44 @@ ++ENTITY aoi22_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_b1 : NATURAL := 4; ++ CONSTANT cin_b2 : NATURAL := 4; ++ CONSTANT cin_a1 : NATURAL := 4; ++ CONSTANT cin_a2 : NATURAL := 4; ++ CONSTANT rdown_b1_z : NATURAL := 4100; ++ CONSTANT rdown_b2_z : NATURAL := 4090; ++ CONSTANT rdown_a1_z : NATURAL := 4140; ++ CONSTANT rdown_a2_z : NATURAL := 4140; ++ CONSTANT rup_b1_z : NATURAL := 5310; ++ CONSTANT rup_b2_z : NATURAL := 5310; ++ CONSTANT rup_a1_z : NATURAL := 5370; ++ CONSTANT rup_a2_z : NATURAL := 5390; ++ CONSTANT tphl_b1_z : NATURAL := 49; ++ CONSTANT tphl_b2_z : NATURAL := 49; ++ CONSTANT tplh_a2_z : NATURAL := 83; ++ CONSTANT tphl_a1_z : NATURAL := 70; ++ CONSTANT tplh_b2_z : NATURAL := 55; ++ CONSTANT tplh_a1_z : NATURAL := 90; ++ CONSTANT tplh_b1_z : NATURAL := 63; ++ CONSTANT tphl_a2_z : NATURAL := 71; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aoi22_x05; ++ ++ARCHITECTURE behaviour_data_flow OF aoi22_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aoi22_x05" ++ SEVERITY WARNING; ++ z <= not (((b1 and b2) or (a1 and a2))) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aoi22_x1.ap b/alliance/src/cells/src/msxlib/aoi22_x1.ap +new file mode 100644 +index 0000000..14246d4 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi22_x1.ap +@@ -0,0 +1,124 @@ ++V ALLIANCE : 6 ++H aoi22_x1,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 3000,6000,ref_ref,b2_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 3000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 2000,2000,ref_ref,z_20 ++R 2000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,b1_50 ++R 2000,4000,ref_ref,b1_40 ++R 3000,3000,ref_ref,b1_30 ++R 2000,6000,ref_ref,b2_60 ++R 3000,5000,ref_ref,b2_50 ++R 3000,4000,ref_ref,b2_40 ++R 4000,6000,ref_ref,a2_60 ++R 4000,5000,ref_ref,a2_50 ++R 5000,4000,ref_ref,a1_40 ++R 5000,5000,ref_ref,a1_50 ++R 5000,3000,ref_ref,a1_30 ++R 4000,3000,ref_ref,a1_30 ++R 5000,6000,ref_ref,a2_60 ++R 4000,4000,ref_ref,a2_40 ++R 2000,3000,ref_ref,b1_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,2000,ref_ref,z_20 ++S 4100,700,4900,700,600,*,RIGHT,PTIE ++S 3600,5000,3600,5500,200,*,DOWN,POLY ++S 4600,3400,4600,3900,200,*,UP,POLY ++S 3000,7000,5400,7000,400,*,RIGHT,ALU1 ++S 5400,7000,5400,8100,400,*,DOWN,ALU1 ++S 5400,7300,5400,7900,600,*,DOWN,PDIF ++S 5000,6000,5000,6000,400,a2,LEFT,CALU1 ++S 4000,3000,4000,3000,400,a1,LEFT,CALU1 ++S 3000,3000,3000,3000,400,b1,LEFT,CALU1 ++S 2000,6000,2000,6000,400,b2,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 2600,1700,2600,3400,200,7,UP,NTRANS ++S 3800,1700,3800,3400,200,8,UP,NTRANS ++S 4600,1700,4600,3400,200,6,UP,NTRANS ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,aoi22_x1,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 4600,1300,4600,1700,200,*,UP,POLY ++S 3800,1300,3800,1700,200,*,UP,POLY ++S 2200,1900,2200,3200,600,n2,UP,NDIF ++S 1800,1700,1800,3400,200,5,UP,NTRANS ++S 4200,1900,4200,3200,600,n1,UP,NDIF ++S 3200,1900,3200,3200,1000,*,UP,NDIF ++S 5300,1900,5300,3200,600,*,UP,NDIF ++S 2600,1300,2600,1700,200,*,UP,POLY ++S 1800,1300,1800,1700,200,*,UP,POLY ++S 1200,900,1200,3200,600,*,UP,NDIF ++S 2000,3000,3100,3000,400,*,LEFT,ALU1 ++S 2000,4900,2000,5100,400,*,UP,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 1800,5700,1800,9200,1000,*,UP,PDIF ++S 1200,5500,1200,9400,200,1,DOWN,PTRANS ++S 2400,5500,2400,9400,200,3,DOWN,PTRANS ++S 800,5700,800,9200,400,*,UP,PDIF ++S 3600,5500,3600,9400,200,4,DOWN,PTRANS ++S 4800,5500,4800,9400,200,2,DOWN,PTRANS ++S 4200,5700,4200,9200,1000,*,UP,PDIF ++S 3000,5700,3000,9200,1000,*,UP,PDIF ++S 5200,5700,5200,9200,400,*,UP,PDIF ++S 3900,2900,5000,2900,400,*,RIGHT,ALU1 ++S 3900,3000,5000,3000,400,*,RIGHT,ALU1 ++S 5000,3000,5000,5000,400,a1,UP,CALU1 ++S 5000,3000,5000,5100,400,*,UP,ALU1 ++S 4000,4000,4000,6000,400,a2,DOWN,CALU1 ++S 4000,3900,4000,6000,400,*,UP,ALU1 ++S 4000,6000,5100,6000,400,*,RIGHT,ALU1 ++S 4000,6100,5100,6100,400,*,RIGHT,ALU1 ++S 3000,4000,3000,6000,400,b2,DOWN,CALU1 ++S 3000,3900,3000,6000,400,*,DOWN,ALU1 ++S 1900,6000,3000,6000,400,*,RIGHT,ALU1 ++S 1900,6100,3000,6100,400,*,RIGHT,ALU1 ++S 500,8000,3000,8000,400,*,RIGHT,ALU1 ++S 3000,7000,3000,8000,600,*,DOWN,ALU1 ++S 4200,7900,4200,9300,400,*,DOWN,ALU1 ++S 2000,3000,2000,5000,400,b1,UP,CALU1 ++S 2000,3000,2000,3900,400,*,UP,ALU1 ++S 2000,2900,3100,2900,400,*,LEFT,ALU1 ++S 1000,2000,3300,2000,400,*,RIGHT,ALU1 ++S 1000,7000,2100,7000,400,*,RIGHT,ALU1 ++S 1800,4000,2000,4000,600,*,RIGHT,ALU1 ++S 1200,4200,1500,4200,200,*,RIGHT,POLY ++S 1200,4200,1200,5500,200,*,DOWN,POLY ++S 3800,3400,3800,4700,200,*,UP,POLY ++S 4800,3800,4800,5500,200,*,DOWN,POLY ++S 5200,700,5200,2100,400,*,UP,ALU1 ++S 1000,7100,2100,7100,400,*,RIGHT,ALU1 ++S 1000,1900,3300,1900,400,*,RIGHT,ALU1 ++S 2600,3400,2600,5100,200,*,DOWN,POLY ++S 2400,5000,2400,5500,200,*,DOWN,POLY ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 4800,9400,4800,9700,200,*,DOWN,POLY ++V 5000,700,CONT_BODY_P,* ++V 4000,700,CONT_BODY_P,* ++V 5400,7200,CONT_DIF_P,n3 ++V 5400,8000,CONT_DIF_P,n3 ++V 3200,2000,CONT_DIF_N,* ++V 1200,1000,CONT_DIF_N,* ++V 5200,2000,CONT_DIF_N,* ++V 600,8000,CONT_DIF_P,n3 ++V 3000,8000,CONT_DIF_P,n3 ++V 1800,7000,CONT_DIF_P,* ++V 4200,9000,CONT_DIF_P,* ++V 4000,4900,CONT_POLY,* ++V 3000,7000,CONT_DIF_P,n3 ++V 4200,8000,CONT_DIF_P,* ++V 1800,4000,CONT_POLY,* ++V 3000,4000,CONT_POLY,* ++V 5000,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/aoi22_x1.vbe b/alliance/src/cells/src/msxlib/aoi22_x1.vbe +new file mode 100644 +index 0000000..c6b647e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi22_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY aoi22_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_b1 : NATURAL := 6; ++ CONSTANT cin_b2 : NATURAL := 6; ++ CONSTANT cin_a1 : NATURAL := 6; ++ CONSTANT cin_a2 : NATURAL := 6; ++ CONSTANT rdown_b1_z : NATURAL := 2170; ++ CONSTANT rdown_b2_z : NATURAL := 2160; ++ CONSTANT rdown_a1_z : NATURAL := 2190; ++ CONSTANT rdown_a2_z : NATURAL := 2190; ++ CONSTANT rup_b1_z : NATURAL := 2720; ++ CONSTANT rup_b2_z : NATURAL := 2720; ++ CONSTANT rup_a1_z : NATURAL := 2750; ++ CONSTANT rup_a2_z : NATURAL := 2760; ++ CONSTANT tphl_b1_z : NATURAL := 46; ++ CONSTANT tphl_b2_z : NATURAL := 47; ++ CONSTANT tplh_a2_z : NATURAL := 77; ++ CONSTANT tphl_a1_z : NATURAL := 67; ++ CONSTANT tplh_b2_z : NATURAL := 51; ++ CONSTANT tplh_a1_z : NATURAL := 83; ++ CONSTANT tplh_b1_z : NATURAL := 58; ++ CONSTANT tphl_a2_z : NATURAL := 68; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aoi22_x1; ++ ++ARCHITECTURE behaviour_data_flow OF aoi22_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aoi22_x1" ++ SEVERITY WARNING; ++ z <= not (((b1 and b2) or (a1 and a2))) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aoi22_x2.ap b/alliance/src/cells/src/msxlib/aoi22_x2.ap +new file mode 100644 +index 0000000..4677497 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi22_x2.ap +@@ -0,0 +1,168 @@ ++V ALLIANCE : 6 ++H aoi22_x2,P, 8/ 8/2014,100 ++A 0,0,11000,10000 ++R 1000,2000,ref_ref,z_20 ++R 9000,5000,ref_ref,a2_50 ++R 9000,4000,ref_ref,a2_40 ++R 7000,5000,ref_ref,a1_50 ++R 4000,5000,ref_ref,b1_50 ++R 5000,6000,ref_ref,b2_60 ++R 2000,6000,ref_ref,b2_60 ++R 1000,7000,ref_ref,z_70 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 4000,6000,ref_ref,b2_60 ++R 2000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 3000,2000,ref_ref,z_20 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 6000,5000,ref_ref,a2_50 ++R 10000,5000,ref_ref,a2_50 ++R 7000,6000,ref_ref,a2_60 ++R 8000,6000,ref_ref,a2_60 ++R 9000,6000,ref_ref,a2_60 ++R 2000,5000,ref_ref,b2_50 ++R 5000,5000,ref_ref,b2_50 ++R 3000,6000,ref_ref,b2_60 ++R 2000,4000,ref_ref,b2_40 ++R 4000,7000,ref_ref,z_70 ++R 4000,2000,ref_ref,z_20 ++R 5000,2000,ref_ref,z_20 ++R 4000,4000,ref_ref,b1_40 ++R 4000,3000,ref_ref,b1_30 ++R 3000,5000,ref_ref,b1_50 ++R 7000,4000,ref_ref,a1_40 ++R 7000,3000,ref_ref,a1_30 ++R 8000,5000,ref_ref,a1_50 ++R 6000,6000,ref_ref,a2_60 ++S 9100,700,9900,700,600,*,RIGHT,PTIE ++S 10200,5800,10200,7000,400,*,UP,ALU1 ++S 10200,6000,10200,6600,600,*,DOWN,PDIF ++S 5400,7000,10200,7000,400,*,RIGHT,ALU1 ++S 6800,3900,6800,5200,200,*,UP,POLY ++S 6000,3900,6000,4700,200,*,UP,POLY ++S 4000,3900,4000,4700,200,*,UP,POLY ++S 4800,3900,4800,4700,200,*,UP,POLY ++S 1200,4600,1200,5600,200,*,DOWN,POLY ++S 9600,9300,9600,9700,200,*,DOWN,POLY ++S 8400,9300,8400,9700,200,*,DOWN,POLY ++S 7200,9300,7200,9700,200,*,DOWN,POLY ++S 6000,9300,6000,9700,200,*,DOWN,POLY ++S 4800,9300,4800,9700,200,*,DOWN,POLY ++S 3600,9300,3600,9700,200,*,DOWN,POLY ++S 2400,9300,2400,9700,200,*,DOWN,POLY ++S 1200,9300,1200,9700,200,*,DOWN,POLY ++S 7400,700,7400,2100,400,*,DOWN,ALU1 ++S 5400,1900,5400,3100,400,*,UP,ALU1 ++S 1000,1900,5400,1900,400,*,RIGHT,ALU1 ++S 9000,5000,10100,5000,400,*,RIGHT,ALU1 ++S 6000,6000,9000,6000,400,*,RIGHT,ALU1 ++S 9000,4000,9000,6000,600,*,UP,ALU1 ++S 9000,4000,9000,6000,400,a2,UP,CALU1 ++S 7000,3000,7000,5000,400,a1,DOWN,CALU1 ++S 7000,2900,7000,5000,400,*,DOWN,ALU1 ++S 7000,5100,8100,5100,400,*,RIGHT,ALU1 ++S 1000,2000,5400,2000,400,*,RIGHT,ALU1 ++S 2000,4000,2000,6000,600,*,DOWN,ALU1 ++S 2900,5100,4000,5100,400,*,RIGHT,ALU1 ++S 4000,2900,4000,5000,400,*,DOWN,ALU1 ++S 4000,3000,4000,5000,400,b1,UP,CALU1 ++S 2000,4000,2000,6000,400,b2,UP,CALU1 ++S 6000,5000,6000,6000,600,*,UP,ALU1 ++S 5000,5000,5000,6000,600,*,DOWN,ALU1 ++S 5000,5000,5000,6000,400,b2,UP,CALU1 ++S 6600,7900,6600,9300,400,*,UP,ALU1 ++S 5400,7000,5400,8000,600,*,UP,ALU1 ++S 7800,7000,7800,8100,400,*,DOWN,ALU1 ++S 500,8000,5400,8000,400,*,RIGHT,ALU1 ++S 6000,5000,6000,6000,400,a2,UP,CALU1 ++S 1000,7000,4300,7000,400,*,RIGHT,ALU1 ++S 1000,7100,4300,7100,400,*,RIGHT,ALU1 ++S 9000,7900,9000,9300,400,*,UP,ALU1 ++S 4800,5600,4800,9300,200,4b,DOWN,PTRANS ++S 1200,5600,1200,9300,200,4a,DOWN,PTRANS ++S 3600,5600,3600,9300,200,3b,DOWN,PTRANS ++S 2400,5600,2400,9300,200,3a,DOWN,PTRANS ++S 6000,5600,6000,9300,200,2a,DOWN,PTRANS ++S 7200,5600,7200,9300,200,1a,DOWN,PTRANS ++S 8400,5600,8400,9300,200,1b,DOWN,PTRANS ++S 9600,5600,9600,9300,200,2b,DOWN,PTRANS ++S 4000,300,4000,600,200,*,UP,POLY ++S 4800,300,4800,600,200,*,UP,POLY ++S 6000,300,6000,600,200,*,UP,POLY ++S 6800,300,6800,600,200,*,UP,POLY ++S 7500,800,7500,3700,600,*,UP,NDIF ++S 5400,800,5400,3700,1000,*,UP,NDIF ++S 6000,600,6000,3900,200,6,UP,NTRANS ++S 6800,600,6800,3900,200,5,UP,NTRANS ++S 6400,800,6400,3700,600,n1,UP,NDIF ++S 3300,800,3300,3700,600,*,UP,NDIF ++S 4000,600,4000,3900,200,7,UP,NTRANS ++S 4800,600,4800,3900,200,8,UP,NTRANS ++S 4400,800,4400,3600,600,n2,UP,NDIF ++S 0,9400,11000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,11000,5000,10000,aoi22_x2,LEFT,TALU8 ++S 0,2200,11000,2200,5200,*,LEFT,PWELL ++S 0,7600,11000,7600,5600,*,LEFT,NWELL ++S 0,600,11000,600,1200,vss,RIGHT,CALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 4200,5800,4200,9100,1000,*,UP,PDIF ++S 3000,5800,3000,9100,1000,*,UP,PDIF ++S 1800,5800,1800,9100,1000,*,UP,PDIF ++S 7200,5200,8400,5200,200,*,RIGHT,POLY ++S 2000,6000,5000,6000,400,*,RIGHT,ALU1 ++S 2400,5200,3600,5200,200,*,RIGHT,POLY ++S 1200,4600,1700,4600,200,*,RIGHT,POLY ++S 5400,5800,5400,9100,1000,*,UP,PDIF ++S 6600,5800,6600,9100,1000,*,UP,PDIF ++S 7800,5800,7800,9100,1000,*,UP,PDIF ++S 9000,5800,9000,9100,1000,*,UP,PDIF ++S 2900,5000,4000,5000,400,*,RIGHT,ALU1 ++S 7000,5000,8100,5000,400,*,RIGHT,ALU1 ++S 10000,5800,10000,9100,400,*,UP,PDIF ++S 800,5800,800,9100,400,*,UP,PDIF ++S 7000,6000,7000,6000,400,a2,LEFT,CALU1 ++S 8000,6000,8000,6000,400,a2,LEFT,CALU1 ++S 10000,5000,10000,5000,400,a2,LEFT,CALU1 ++S 8000,5000,8000,5000,400,a1,LEFT,CALU1 ++S 3000,6000,3000,6000,400,b2,LEFT,CALU1 ++S 4000,6000,4000,6000,400,b2,LEFT,CALU1 ++S 3000,5000,3000,5000,400,b1,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 4000,7000,4000,7000,400,z,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 4000,2000,4000,2000,400,z,LEFT,CALU1 ++S 5000,2000,5000,2000,400,z,LEFT,CALU1 ++V 10000,700,CONT_BODY_P,* ++V 9000,700,CONT_BODY_P,* ++V 10200,6700,CONT_DIF_P,n3 ++V 10200,5900,CONT_DIF_P,n3 ++V 9400,5000,CONT_POLY,* ++V 7400,2000,CONT_DIF_N,* ++V 6600,8000,CONT_DIF_P,* ++V 5400,7000,CONT_DIF_P,n3 ++V 9000,8000,CONT_DIF_P,* ++V 7800,7000,CONT_DIF_P,n3 ++V 5000,5000,CONT_POLY,* ++V 600,8000,CONT_DIF_P,n3 ++V 3000,8000,CONT_DIF_P,n3 ++V 5400,8000,CONT_DIF_P,n3 ++V 7800,8000,CONT_DIF_P,n3 ++V 6000,5000,CONT_POLY,* ++V 2000,4400,CONT_POLY,* ++V 3800,5000,CONT_POLY,* ++V 6600,9000,CONT_DIF_P,* ++V 9000,9000,CONT_DIF_P,* ++V 1800,7000,CONT_DIF_P,* ++V 4200,7000,CONT_DIF_P,* ++V 5400,2000,CONT_DIF_N,* ++V 7400,1000,CONT_DIF_N,* ++V 3400,1000,CONT_DIF_N,* ++V 5400,3000,CONT_DIF_N,* ++V 7100,5000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/aoi22_x2.vbe b/alliance/src/cells/src/msxlib/aoi22_x2.vbe +new file mode 100644 +index 0000000..329506d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aoi22_x2.vbe +@@ -0,0 +1,44 @@ ++ENTITY aoi22_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 11000; ++ CONSTANT cin_b1 : NATURAL := 11; ++ CONSTANT cin_b2 : NATURAL := 12; ++ CONSTANT cin_a1 : NATURAL := 11; ++ CONSTANT cin_a2 : NATURAL := 12; ++ CONSTANT rdown_b1_z : NATURAL := 1110; ++ CONSTANT rdown_b2_z : NATURAL := 1110; ++ CONSTANT rdown_a1_z : NATURAL := 1120; ++ CONSTANT rdown_a2_z : NATURAL := 1120; ++ CONSTANT rup_b1_z : NATURAL := 1430; ++ CONSTANT rup_b2_z : NATURAL := 1430; ++ CONSTANT rup_a1_z : NATURAL := 1450; ++ CONSTANT rup_a2_z : NATURAL := 1450; ++ CONSTANT tphl_b1_z : NATURAL := 44; ++ CONSTANT tphl_b2_z : NATURAL := 46; ++ CONSTANT tplh_a2_z : NATURAL := 75; ++ CONSTANT tphl_a1_z : NATURAL := 64; ++ CONSTANT tplh_b2_z : NATURAL := 51; ++ CONSTANT tplh_a1_z : NATURAL := 81; ++ CONSTANT tplh_b1_z : NATURAL := 57; ++ CONSTANT tphl_a2_z : NATURAL := 66; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aoi22_x2; ++ ++ARCHITECTURE behaviour_data_flow OF aoi22_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aoi22_x2" ++ SEVERITY WARNING; ++ z <= not (((b1 and b2) or (a1 and a2))) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aon21_x1.ap b/alliance/src/cells/src/msxlib/aon21_x1.ap +new file mode 100644 +index 0000000..bfdcb14 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aon21_x1.ap +@@ -0,0 +1,110 @@ ++V ALLIANCE : 6 ++H aon21_x1,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 6000,6000,ref_ref,a2_60 ++R 5000,5000,ref_ref,a2_50 ++R 5000,7000,ref_ref,b_70 ++R 4000,6000,ref_ref,b_60 ++R 4000,5000,ref_ref,b_50 ++R 6000,4000,ref_ref,a1_40 ++R 6000,7000,ref_ref,a2_70 ++R 4000,7000,ref_ref,b_70 ++R 5000,6000,ref_ref,a2_60 ++R 5000,4000,ref_ref,a1_40 ++R 6000,5000,ref_ref,a1_50 ++R 5000,3000,ref_ref,a1_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 2000,7000,ref_ref,z_70 ++R 5000,2000,ref_ref,a1_20 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 5800,8900,5800,9300,200,*,DOWN,POLY ++S 4600,8900,4600,9300,200,*,DOWN,POLY ++S 3400,8900,3400,9300,200,*,DOWN,POLY ++S 5800,6300,5800,8900,200,1,DOWN,PTRANS ++S 6200,6500,6200,8700,400,*,UP,PDIF ++S 3000,6500,3000,8700,400,*,UP,PDIF ++S 4600,6300,4600,8900,200,2,DOWN,PTRANS ++S 3400,6300,3400,8900,200,3,DOWN,PTRANS ++S 4000,6500,4000,8700,600,*,UP,PDIF ++S 6100,2700,6100,3500,600,*,UP,NDIF ++S 4200,2700,4200,3500,400,*,UP,NDIF ++S 4600,2500,4600,3700,200,5,UP,NTRANS ++S 5400,2500,5400,3700,200,4,UP,NTRANS ++S 5000,2700,5000,3500,600,n1,UP,NDIF ++S 5400,2100,5400,2500,200,*,UP,POLY ++S 4600,2100,4600,2500,200,*,UP,POLY ++S 3400,3000,3400,3700,200,6,UP,NTRANS ++S 4000,3200,4000,3500,1000,*,UP,NDIF ++S 3400,2600,3400,3000,200,*,UP,POLY ++S 4600,3700,4600,6300,200,*,DOWN,POLY ++S 1600,3700,1600,5100,200,*,UP,POLY ++S 3400,3700,3400,6300,200,*,DOWN,POLY ++S 4000,3300,4000,4000,400,*,DOWN,ALU1 ++S 5800,4100,5800,6300,200,*,UP,POLY ++S 5400,4100,5800,4100,200,*,RIGHT,POLY ++S 1200,5100,1200,6300,200,*,DOWN,POLY ++S 1600,2300,1600,2700,200,*,UP,POLY ++S 1000,2900,1000,7100,400,*,DOWN,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 2500,2900,2500,3500,1200,*,UP,NDIF ++S 1600,2700,1600,3700,200,5,UP,NTRANS ++S 1200,2900,1200,3500,400,*,DOWN,NDIF ++S 5200,6500,5200,8800,600,*,UP,PDIF ++S 1200,8300,1200,8700,200,*,DOWN,POLY ++S 800,6500,800,8100,400,*,UP,PDIF ++S 1700,6500,1700,8100,400,*,UP,PDIF ++S 1200,6300,1200,8300,200,3,DOWN,PTRANS ++S 1800,7700,1800,8100,600,*,UP,PDIF ++S 4000,7000,5100,7000,400,*,RIGHT,ALU1 ++S 3900,8000,6500,8000,400,*,RIGHT,ALU1 ++S 4000,7100,5100,7100,400,*,RIGHT,ALU1 ++S 5000,5000,5000,6000,400,a2,DOWN,CALU1 ++S 5000,4800,5000,6000,400,*,UP,ALU1 ++S 5000,6000,6000,6000,600,*,RIGHT,ALU1 ++S 6000,6000,6000,7100,400,*,UP,ALU1 ++S 6000,6000,6000,7000,400,a2,UP,CALU1 ++S 3900,4800,3900,5000,600,*,UP,ALU1 ++S 4000,5000,4000,7000,400,b,DOWN,CALU1 ++S 4000,5000,4000,7000,400,*,DOWN,ALU1 ++S 6000,4000,6000,5000,400,a1,UP,CALU1 ++S 6000,4000,6000,5000,600,*,UP,ALU1 ++S 5000,4000,6000,4000,400,*,RIGHT,ALU1 ++S 6000,700,6000,3100,400,*,UP,ALU1 ++S 5000,7000,5000,7000,400,b,LEFT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,aon21_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 2200,700,2200,3100,400,*,UP,ALU1 ++S 1200,5100,1900,5100,200,*,RIGHT,POLY ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 2800,4000,4000,4000,400,*,RIGHT,ALU1 ++S 1800,4900,2800,4900,400,*,RIGHT,ALU1 ++S 1800,7900,1800,9300,400,*,UP,ALU1 ++S 600,7000,2000,7000,600,*,LEFT,ALU1 ++S 2800,4000,2800,6700,400,*,DOWN,ALU1 ++S 5000,2000,5000,4000,600,*,DOWN,ALU1 ++S 5000,2000,5000,4000,400,a1,DOWN,CALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1000,9300,CONT_BODY_N,* ++V 4000,3400,CONT_DIF_N,zn ++V 1000,3400,CONT_DIF_N,* ++V 5000,4900,CONT_POLY,* ++V 6000,4900,CONT_POLY,* ++V 3800,4900,CONT_POLY,* ++V 6000,3000,CONT_DIF_N,* ++V 5200,9000,CONT_DIF_P,* ++V 6400,8000,CONT_DIF_P,n2 ++V 4000,8000,CONT_DIF_P,n2 ++V 1800,8000,CONT_DIF_P,* ++V 2200,3000,CONT_DIF_N,* ++V 1900,4900,CONT_POLY,zn ++V 2800,6600,CONT_DIF_P,zn ++V 600,7000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/aon21_x1.vbe b/alliance/src/cells/src/msxlib/aon21_x1.vbe +new file mode 100644 +index 0000000..b1daf14 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aon21_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY aon21_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a1 : NATURAL := 5; ++ CONSTANT cin_a2 : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT rdown_a1_z : NATURAL := 2310; ++ CONSTANT rdown_a2_z : NATURAL := 2300; ++ CONSTANT rdown_b_z : NATURAL := 2290; ++ CONSTANT rup_a1_z : NATURAL := 2980; ++ CONSTANT rup_a2_z : NATURAL := 2980; ++ CONSTANT rup_b_z : NATURAL := 2960; ++ CONSTANT tphh_a1_z : NATURAL := 94; ++ CONSTANT tphh_b_z : NATURAL := 80; ++ CONSTANT tpll_b_z : NATURAL := 91; ++ CONSTANT tphh_a2_z : NATURAL := 95; ++ CONSTANT tpll_a2_z : NATURAL := 113; ++ CONSTANT tpll_a1_z : NATURAL := 123; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aon21_x1; ++ ++ARCHITECTURE behaviour_data_flow OF aon21_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aon21_x1" ++ SEVERITY WARNING; ++ z <= ((a1 and a2) or b) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aon21_x2.ap b/alliance/src/cells/src/msxlib/aon21_x2.ap +new file mode 100644 +index 0000000..cb0ae11 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aon21_x2.ap +@@ -0,0 +1,119 @@ ++V ALLIANCE : 6 ++H aon21_x2,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 6000,6000,ref_ref,a2_60 ++R 5000,5000,ref_ref,a2_50 ++R 5000,7000,ref_ref,b_70 ++R 4000,6000,ref_ref,b_60 ++R 4000,5000,ref_ref,b_50 ++R 6000,4000,ref_ref,a1_40 ++R 6000,7000,ref_ref,a2_70 ++R 4000,7000,ref_ref,b_70 ++R 5000,6000,ref_ref,a2_60 ++R 5000,4000,ref_ref,a1_40 ++R 6000,5000,ref_ref,a1_50 ++R 5000,3000,ref_ref,a1_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 1000,2000,ref_ref,z_20 ++R 2000,7000,ref_ref,z_70 ++R 5000,2000,ref_ref,a1_20 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 4600,1400,4600,1800,200,*,UP,POLY ++S 5400,1400,5400,1800,200,*,UP,POLY ++S 6100,2000,6100,3300,600,*,UP,NDIF ++S 5400,1800,5400,3500,200,4,UP,NTRANS ++S 5000,2000,5000,3300,600,n1,UP,NDIF ++S 4600,1800,4600,3500,200,5,UP,NTRANS ++S 4200,2000,4200,3300,400,*,UP,NDIF ++S 1600,1200,1600,1600,200,*,UP,POLY ++S 1000,2500,1000,3100,600,*,UP,NDIF ++S 1200,1800,1200,3300,400,*,DOWN,NDIF ++S 1600,1600,1600,3500,200,5,UP,NTRANS ++S 2500,1800,2500,3300,1200,*,UP,NDIF ++S 4000,3100,4000,4000,400,*,DOWN,ALU1 ++S 4600,3500,4600,5500,200,*,DOWN,POLY ++S 3400,2100,3400,2500,200,*,UP,POLY ++S 3400,2500,3400,3500,200,6,UP,NTRANS ++S 4000,2700,4000,3300,1000,*,UP,NDIF ++S 5800,3900,5800,4700,200,*,UP,POLY ++S 5400,3900,5800,3900,200,*,RIGHT,POLY ++S 3400,3300,3400,5500,200,*,DOWN,POLY ++S 4000,7000,5100,7000,400,*,RIGHT,ALU1 ++S 3900,8000,6500,8000,400,*,RIGHT,ALU1 ++S 4000,7100,5100,7100,400,*,RIGHT,ALU1 ++S 5000,5000,5000,6000,400,a2,DOWN,CALU1 ++S 5000,4800,5000,6000,400,*,UP,ALU1 ++S 5000,6000,6000,6000,600,*,RIGHT,ALU1 ++S 6000,6000,6000,7100,400,*,UP,ALU1 ++S 6000,6000,6000,7000,400,a2,UP,CALU1 ++S 3900,4800,3900,5000,600,*,UP,ALU1 ++S 4000,5000,4000,7000,400,b,DOWN,CALU1 ++S 4000,5000,4000,7000,400,*,DOWN,ALU1 ++S 6000,4000,6000,5000,400,a1,UP,CALU1 ++S 6000,4000,6000,5000,600,*,UP,ALU1 ++S 5000,4000,6000,4000,400,*,RIGHT,ALU1 ++S 6000,700,6000,3100,400,*,UP,ALU1 ++S 5000,7000,5000,7000,400,b,LEFT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,aon21_x2,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 2200,700,2200,3100,400,*,UP,ALU1 ++S 1600,3600,1600,5100,200,*,UP,POLY ++S 1200,5100,1900,5100,200,*,RIGHT,POLY ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 2800,4000,4000,4000,400,*,RIGHT,ALU1 ++S 1800,4900,2800,4900,400,*,RIGHT,ALU1 ++S 1800,7900,1800,9300,400,*,UP,ALU1 ++S 600,7000,2000,7000,600,*,LEFT,ALU1 ++S 600,6100,600,6900,600,*,DOWN,PDIF ++S 1000,1900,1000,7100,400,*,DOWN,ALU1 ++S 600,6000,1000,6000,600,*,RIGHT,ALU1 ++S 2800,4000,2800,6700,400,*,DOWN,ALU1 ++S 2800,5900,2800,6500,600,*,UP,PDIF ++S 1200,5500,1200,9300,200,3,DOWN,PTRANS ++S 1700,5700,1700,9100,400,*,UP,PDIF ++S 1800,7700,1800,9100,600,*,UP,PDIF ++S 800,5700,800,9100,400,*,UP,PDIF ++S 4000,5700,4000,9100,600,*,UP,PDIF ++S 4600,5500,4600,9300,200,2,DOWN,PTRANS ++S 3400,5500,3400,9300,200,3,DOWN,PTRANS ++S 3000,5700,3000,9100,400,*,UP,PDIF ++S 6200,5700,6200,9100,400,*,UP,PDIF ++S 5800,5500,5800,9300,200,1,DOWN,PTRANS ++S 5200,5700,5200,9100,600,*,UP,PDIF ++S 5800,9300,5800,9700,200,*,DOWN,POLY ++S 4600,9300,4600,9700,200,*,DOWN,POLY ++S 3400,9300,3400,9700,200,*,DOWN,POLY ++S 1200,9300,1200,9700,200,*,DOWN,POLY ++S 5000,2000,5000,4000,600,*,DOWN,ALU1 ++S 5000,2000,5000,4000,400,a1,DOWN,CALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 6000,2100,CONT_DIF_N,* ++V 1000,2400,CONT_DIF_N,* ++V 1000,3200,CONT_DIF_N,* ++V 4000,3200,CONT_DIF_N,zn ++V 5000,4900,CONT_POLY,* ++V 6000,4900,CONT_POLY,* ++V 3800,4900,CONT_POLY,* ++V 6000,3000,CONT_DIF_N,* ++V 5200,9000,CONT_DIF_P,* ++V 6400,8000,CONT_DIF_P,n2 ++V 4000,8000,CONT_DIF_P,n2 ++V 1800,9000,CONT_DIF_P,* ++V 1800,8000,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,* ++V 2200,3000,CONT_DIF_N,* ++V 2800,5800,CONT_DIF_P,zn ++V 1900,4900,CONT_POLY,zn ++V 2800,6600,CONT_DIF_P,zn ++V 600,7000,CONT_DIF_P,* ++V 600,6000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/aon21_x2.vbe b/alliance/src/cells/src/msxlib/aon21_x2.vbe +new file mode 100644 +index 0000000..cec020d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aon21_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY aon21_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a1 : NATURAL := 7; ++ CONSTANT cin_a2 : NATURAL := 7; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT rdown_a1_z : NATURAL := 1210; ++ CONSTANT rdown_a2_z : NATURAL := 1210; ++ CONSTANT rdown_b_z : NATURAL := 1210; ++ CONSTANT rup_a1_z : NATURAL := 1570; ++ CONSTANT rup_a2_z : NATURAL := 1570; ++ CONSTANT rup_b_z : NATURAL := 1560; ++ CONSTANT tphh_a1_z : NATURAL := 97; ++ CONSTANT tphh_b_z : NATURAL := 83; ++ CONSTANT tpll_b_z : NATURAL := 94; ++ CONSTANT tphh_a2_z : NATURAL := 98; ++ CONSTANT tpll_a2_z : NATURAL := 116; ++ CONSTANT tpll_a1_z : NATURAL := 126; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aon21_x2; ++ ++ARCHITECTURE behaviour_data_flow OF aon21_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aon21_x2" ++ SEVERITY WARNING; ++ z <= ((a1 and a2) or b) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aon22_x1.ap b/alliance/src/cells/src/msxlib/aon22_x1.ap +new file mode 100644 +index 0000000..a1f15c4 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aon22_x1.ap +@@ -0,0 +1,140 @@ ++V ALLIANCE : 6 ++H aon22_x1,P, 8/ 8/2014,100 ++A 0,0,8000,10000 ++R 6000,7000,ref_ref,a2_70 ++R 5000,7000,ref_ref,b2_70 ++R 6000,6000,ref_ref,a2_60 ++R 6000,5000,ref_ref,a2_50 ++R 7000,5000,ref_ref,a1_50 ++R 7000,3000,ref_ref,a1_30 ++R 6000,3000,ref_ref,a1_30 ++R 7000,6000,ref_ref,a2_60 ++R 6000,4000,ref_ref,a2_40 ++R 4000,3000,ref_ref,b1_30 ++R 4000,5000,ref_ref,b1_50 ++R 5000,6000,ref_ref,b2_60 ++R 7000,4000,ref_ref,a1_40 ++R 4000,4000,ref_ref,b1_40 ++R 5000,3000,ref_ref,b1_30 ++R 4000,6000,ref_ref,b2_60 ++R 5000,5000,ref_ref,b2_50 ++R 5000,4000,ref_ref,b2_40 ++R 2000,6000,ref_ref,z_60 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 1000,2000,ref_ref,z_20 ++S 2100,9300,2900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 6200,5900,6200,9100,600,*,UP,PDIF ++S 6000,4000,6000,7000,400,a2,DOWN,CALU1 ++S 5000,4000,5000,7000,400,b2,DOWN,CALU1 ++S 5000,3900,5000,7100,400,*,DOWN,ALU1 ++S 6000,3900,6000,7100,400,*,UP,ALU1 ++S 7400,7300,7400,8100,600,*,DOWN,PDIF ++S 7400,7000,7400,8000,400,*,DOWN,ALU1 ++S 2500,8000,7400,8000,400,*,RIGHT,ALU1 ++S 4000,3000,4000,5000,400,b1,UP,CALU1 ++S 4000,3000,4000,3900,400,*,UP,ALU1 ++S 4000,2900,5100,2900,400,*,LEFT,ALU1 ++S 3000,2000,5300,2000,400,*,RIGHT,ALU1 ++S 7200,700,7200,2100,400,*,UP,ALU1 ++S 6000,6000,7100,6000,400,*,RIGHT,ALU1 ++S 3900,6000,5000,6000,400,*,RIGHT,ALU1 ++S 3000,2000,3000,7000,400,*,DOWN,ALU1 ++S 5900,2900,7000,2900,400,*,RIGHT,ALU1 ++S 5900,3000,7000,3000,400,*,RIGHT,ALU1 ++S 7000,3000,7000,5000,400,a1,UP,CALU1 ++S 7000,3000,7000,5100,400,*,UP,ALU1 ++S 7000,6000,7000,6000,400,a2,LEFT,CALU1 ++S 6000,3000,6000,3000,400,a1,LEFT,CALU1 ++S 5000,3000,5000,3000,400,b1,LEFT,CALU1 ++S 4000,6000,4000,6000,400,b2,LEFT,CALU1 ++S 4000,3000,5100,3000,400,*,LEFT,ALU1 ++S 4000,4900,4000,5100,400,*,UP,ALU1 ++S 1000,6000,2000,6000,600,*,LEFT,ALU1 ++S 2000,6000,2000,6000,400,z,LEFT,CALU1 ++S 3000,7000,3900,7000,400,*,RIGHT,ALU1 ++S 600,8400,600,9300,400,*,UP,ALU1 ++S 1800,4900,3000,4900,400,*,RIGHT,ALU1 ++S 1700,5900,1700,6900,400,*,DOWN,ALU1 ++S 6600,1300,6600,1700,200,*,UP,POLY ++S 5800,1300,5800,1700,200,*,UP,POLY ++S 4600,1300,4600,1700,200,*,UP,POLY ++S 3800,1300,3800,1700,200,*,UP,POLY ++S 6600,2900,6600,3900,200,*,UP,POLY ++S 5800,2900,5800,4700,200,*,UP,POLY ++S 4600,2900,4600,5100,200,*,DOWN,POLY ++S 3800,2900,3800,4000,200,*,UP,POLY ++S 1100,5100,1900,5100,200,*,RIGHT,POLY ++S 1100,7500,1100,7900,200,*,UP,POLY ++S 6800,8300,6800,8700,200,*,DOWN,POLY ++S 5600,8300,5600,8700,200,*,DOWN,POLY ++S 3200,8300,3200,8700,200,*,DOWN,POLY ++S 4400,8300,4400,8700,200,*,DOWN,POLY ++S 4200,1900,4200,2700,600,n2,UP,NDIF ++S 5200,1900,5200,2700,1000,*,UP,NDIF ++S 7300,1900,7300,2700,600,*,UP,NDIF ++S 6200,1900,6200,2700,600,n1,UP,NDIF ++S 6600,1700,6600,2900,200,6,UP,NTRANS ++S 3800,1700,3800,2900,200,5,UP,NTRANS ++S 4600,1700,4600,2900,200,7,UP,NTRANS ++S 5800,1700,5800,2900,200,8,UP,NTRANS ++S 600,5700,600,8600,400,*,DOWN,PDIF ++S 500,5700,500,8600,400,*,DOWN,PDIF ++S 3800,5900,3800,8100,1000,*,UP,PDIF ++S 5000,5900,5000,8100,1000,*,UP,PDIF ++S 6800,5700,6800,8300,200,2,DOWN,PTRANS ++S 2800,5900,2800,8100,400,*,UP,PDIF ++S 1100,5500,1100,7500,200,1z,DOWN,PTRANS ++S 4400,5700,4400,8300,200,3,DOWN,PTRANS ++S 3200,5700,3200,8300,200,1,DOWN,PTRANS ++S 1500,5700,1500,7300,400,*,UP,PDIF ++S 1700,6100,1700,6700,600,*,UP,PDIF ++S 5600,5700,5600,8300,200,4,DOWN,PTRANS ++S 7200,5900,7200,8100,400,*,UP,PDIF ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,8000,5000,10000,aon22_x1,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 1600,2900,1600,3900,200,2z,UP,NTRANS ++S 1200,3100,1200,3700,400,*,UP,NDIF ++S 1600,2500,1600,2900,200,*,DOWN,POLY ++S 2500,1900,2500,3700,1200,*,UP,NDIF ++S 2200,700,2200,3100,400,*,DOWN,ALU1 ++S 3200,1900,3200,2700,600,*,UP,NDIF ++S 3200,4300,3500,4300,200,*,RIGHT,POLY ++S 3200,4300,3200,5700,200,*,DOWN,POLY ++S 4400,5000,4400,5700,200,*,DOWN,POLY ++S 5600,5000,5600,5700,200,*,DOWN,POLY ++S 6800,3800,6800,5700,200,*,DOWN,POLY ++S 3800,4100,4000,4100,600,*,RIGHT,ALU1 ++S 1600,3900,1600,5100,200,*,UP,POLY ++S 1000,1900,1000,6000,400,*,DOWN,ALU1 ++S 1000,2000,1000,6000,400,z,DOWN,CALU1 ++V 3000,9300,CONT_BODY_N,* ++V 2000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 7400,7100,CONT_DIF_P,n3 ++V 7400,7900,CONT_DIF_P,n3 ++V 6200,9000,CONT_DIF_P,* ++V 5000,4000,CONT_POLY,* ++V 6000,4900,CONT_POLY,* ++V 7000,4000,CONT_POLY,* ++V 1900,4900,CONT_POLY,zn ++V 7200,2000,CONT_DIF_N,* ++V 5200,2000,CONT_DIF_N,zn ++V 2200,2000,CONT_DIF_N,* ++V 1700,6000,CONT_DIF_P,* ++V 600,8500,CONT_DIF_P,* ++V 1700,6800,CONT_DIF_P,* ++V 2600,8000,CONT_DIF_P,n3 ++V 5000,8000,CONT_DIF_P,n3 ++V 3800,7000,CONT_DIF_P,zn ++V 1000,3600,CONT_DIF_N,* ++V 2200,3000,CONT_DIF_N,* ++V 3800,4100,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/aon22_x1.vbe b/alliance/src/cells/src/msxlib/aon22_x1.vbe +new file mode 100644 +index 0000000..ffdc6d2 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aon22_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY aon22_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_b1 : NATURAL := 5; ++ CONSTANT cin_b2 : NATURAL := 5; ++ CONSTANT cin_a2 : NATURAL := 5; ++ CONSTANT cin_a1 : NATURAL := 5; ++ CONSTANT rdown_b1_z : NATURAL := 2310; ++ CONSTANT rdown_b2_z : NATURAL := 2310; ++ CONSTANT rdown_a2_z : NATURAL := 2320; ++ CONSTANT rdown_a1_z : NATURAL := 2320; ++ CONSTANT rup_b1_z : NATURAL := 2960; ++ CONSTANT rup_b2_z : NATURAL := 2960; ++ CONSTANT rup_a2_z : NATURAL := 2990; ++ CONSTANT rup_a1_z : NATURAL := 2990; ++ CONSTANT tphh_b1_z : NATURAL := 87; ++ CONSTANT tpll_a2_z : NATURAL := 133; ++ CONSTANT tphh_b2_z : NATURAL := 88; ++ CONSTANT tpll_a1_z : NATURAL := 142; ++ CONSTANT tpll_b2_z : NATURAL := 104; ++ CONSTANT tphh_a1_z : NATURAL := 114; ++ CONSTANT tpll_b1_z : NATURAL := 114; ++ CONSTANT tphh_a2_z : NATURAL := 115; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a2 : in BIT; ++ a1 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aon22_x1; ++ ++ARCHITECTURE behaviour_data_flow OF aon22_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aon22_x1" ++ SEVERITY WARNING; ++ z <= ((b1 and b2) or (a2 and a1)) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/aon22_x2.ap b/alliance/src/cells/src/msxlib/aon22_x2.ap +new file mode 100644 +index 0000000..c7a228c +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aon22_x2.ap +@@ -0,0 +1,142 @@ ++V ALLIANCE : 6 ++H aon22_x2,P, 8/ 8/2014,100 ++A 0,0,9000,10000 ++R 1000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,z_50 ++R 2000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,2000,ref_ref,z_20 ++R 5000,5000,ref_ref,b1_50 ++R 6000,6000,ref_ref,b2_60 ++R 8000,4000,ref_ref,a1_40 ++R 5000,4000,ref_ref,b1_40 ++R 6000,3000,ref_ref,b1_30 ++R 5000,6000,ref_ref,b2_60 ++R 6000,5000,ref_ref,b2_50 ++R 6000,4000,ref_ref,b2_40 ++R 7000,6000,ref_ref,a2_60 ++R 7000,5000,ref_ref,a2_50 ++R 8000,5000,ref_ref,a1_50 ++R 8000,3000,ref_ref,a1_30 ++R 7000,3000,ref_ref,a1_30 ++R 8000,6000,ref_ref,a2_60 ++R 7000,4000,ref_ref,a2_40 ++R 5000,3000,ref_ref,b1_30 ++R 6000,7000,ref_ref,b2_70 ++R 7000,7000,ref_ref,a2_70 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 1200,5500,1200,9300,200,1z,DOWN,PTRANS ++S 5400,5000,5400,5500,200,*,DOWN,POLY ++S 5600,3400,5600,5100,200,*,DOWN,POLY ++S 2800,4900,4000,4900,400,*,RIGHT,ALU1 ++S 1200,5100,2900,5100,200,*,RIGHT,POLY ++S 1900,6000,1900,7100,600,*,UP,ALU1 ++S 2000,1900,2000,6000,400,*,DOWN,ALU1 ++S 900,6000,2000,6000,400,*,LEFT,ALU1 ++S 1000,6000,1000,6000,400,z,LEFT,CALU1 ++S 1800,6100,1800,6700,600,*,UP,PDIF ++S 2000,2000,2000,7000,400,z,DOWN,CALU1 ++S 600,5700,600,9100,600,*,DOWN,PDIF ++S 1600,5700,1600,9100,400,*,UP,PDIF ++S 1200,9300,1200,9700,200,*,UP,POLY ++S 600,6900,600,9300,400,*,UP,ALU1 ++S 4000,7000,4900,7000,400,*,RIGHT,ALU1 ++S 3200,700,3200,3100,400,*,DOWN,ALU1 ++S 4200,9300,4200,9700,200,*,DOWN,POLY ++S 5400,9300,5400,9700,200,*,DOWN,POLY ++S 6600,9300,6600,9700,200,*,DOWN,POLY ++S 7800,9300,7800,9700,200,*,DOWN,POLY ++S 8200,5700,8200,9100,400,*,UP,PDIF ++S 6000,5700,6000,9100,1000,*,UP,PDIF ++S 7200,5700,7200,9100,1000,*,UP,PDIF ++S 7800,5500,7800,9300,200,2,DOWN,PTRANS ++S 6600,5500,6600,9300,200,4,DOWN,PTRANS ++S 3800,5700,3800,9100,400,*,UP,PDIF ++S 4800,5700,4800,9100,1000,*,UP,PDIF ++S 5400,5500,5400,9300,200,3,DOWN,PTRANS ++S 4200,5500,4200,9300,200,1,DOWN,PTRANS ++S 0,5000,9000,5000,10000,aon22_x2,LEFT,TALU8 ++S 0,2200,9000,2200,5200,*,LEFT,PWELL ++S 0,7600,9000,7600,5600,*,LEFT,NWELL ++S 0,9400,9000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,9000,600,1200,vss,RIGHT,CALU1 ++S 7600,3400,7600,3900,200,*,UP,POLY ++S 6800,3400,6800,4700,200,*,UP,POLY ++S 7800,3800,7800,5500,200,*,DOWN,POLY ++S 7600,1300,7600,1700,200,*,UP,POLY ++S 6800,1300,6800,1700,200,*,UP,POLY ++S 5600,1300,5600,1700,200,*,UP,POLY ++S 4800,1300,4800,1700,200,*,UP,POLY ++S 6600,5000,6600,5500,200,*,DOWN,POLY ++S 4200,4200,4500,4200,200,*,RIGHT,POLY ++S 4200,4200,4200,5500,200,*,DOWN,POLY ++S 8000,6000,8000,6000,400,a2,LEFT,CALU1 ++S 7000,3000,7000,3000,400,a1,LEFT,CALU1 ++S 6000,3000,6000,3000,400,b1,LEFT,CALU1 ++S 5000,6000,5000,6000,400,b2,LEFT,CALU1 ++S 5000,3000,6100,3000,400,*,LEFT,ALU1 ++S 5000,4900,5000,5100,400,*,UP,ALU1 ++S 4000,2000,4000,7000,400,*,DOWN,ALU1 ++S 6900,2900,8000,2900,400,*,RIGHT,ALU1 ++S 6900,3000,8000,3000,400,*,RIGHT,ALU1 ++S 8000,3000,8000,5000,400,a1,UP,CALU1 ++S 8000,3000,8000,5100,400,*,UP,ALU1 ++S 7000,6000,8100,6000,400,*,RIGHT,ALU1 ++S 4900,6000,6000,6000,400,*,RIGHT,ALU1 ++S 5000,3000,5000,5000,400,b1,UP,CALU1 ++S 5000,3000,5000,3900,400,*,UP,ALU1 ++S 5000,2900,6100,2900,400,*,LEFT,ALU1 ++S 4000,2000,6300,2000,400,*,RIGHT,ALU1 ++S 4800,4000,5000,4000,600,*,RIGHT,ALU1 ++S 8200,700,8200,2100,400,*,UP,ALU1 ++S 8300,1900,8300,3200,600,*,UP,NDIF ++S 7200,1900,7200,3200,600,n1,UP,NDIF ++S 7600,1700,7600,3400,200,6,UP,NTRANS ++S 6800,1700,6800,3400,200,8,UP,NTRANS ++S 5200,1900,5200,3200,600,n2,UP,NDIF ++S 4800,1700,4800,3400,200,5,UP,NTRANS ++S 5600,1700,5600,3400,200,7,UP,NTRANS ++S 6200,1900,6200,3200,1000,*,UP,NDIF ++S 4200,1900,4200,3200,600,*,UP,NDIF ++S 4800,3400,4800,4000,200,*,UP,POLY ++S 2600,1300,2600,1700,200,*,DOWN,POLY ++S 2200,1900,2200,3400,400,*,UP,NDIF ++S 2600,1700,2600,3600,200,2z,UP,NTRANS ++S 2000,2600,2000,3200,600,*,UP,NDIF ++S 3500,1900,3500,3400,1200,*,UP,NDIF ++S 2600,3600,2600,5100,200,*,UP,POLY ++S 3500,8000,8400,8000,400,*,RIGHT,ALU1 ++S 8400,7200,8400,7800,600,*,DOWN,PDIF ++S 8400,7000,8400,8000,400,*,DOWN,ALU1 ++S 6000,3900,6000,7100,400,*,DOWN,ALU1 ++S 6000,4000,6000,7000,400,b2,DOWN,CALU1 ++S 7000,3900,7000,7100,400,*,UP,ALU1 ++S 7000,4000,7000,7000,400,a2,DOWN,CALU1 ++V 2700,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2900,4900,CONT_POLY,zn ++V 6200,2000,CONT_DIF_N,zn ++V 4800,7000,CONT_DIF_P,zn ++V 1800,6800,CONT_DIF_P,* ++V 1800,6000,CONT_DIF_P,* ++V 600,9000,CONT_DIF_P,* ++V 600,7000,CONT_DIF_P,* ++V 600,8000,CONT_DIF_P,* ++V 3200,3000,CONT_DIF_N,* ++V 3200,2000,CONT_DIF_N,* ++V 3600,8000,CONT_DIF_P,n3 ++V 6000,8000,CONT_DIF_P,n3 ++V 7200,9000,CONT_DIF_P,* ++V 8200,2000,CONT_DIF_N,* ++V 7000,4900,CONT_POLY,* ++V 4800,4000,CONT_POLY,* ++V 6000,4000,CONT_POLY,* ++V 8000,4000,CONT_POLY,* ++V 2000,2500,CONT_DIF_N,* ++V 2000,3300,CONT_DIF_N,* ++V 8400,7100,CONT_DIF_P,n3 ++V 8400,7900,CONT_DIF_P,n3 ++EOF +diff --git a/alliance/src/cells/src/msxlib/aon22_x2.vbe b/alliance/src/cells/src/msxlib/aon22_x2.vbe +new file mode 100644 +index 0000000..2b7c10b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/aon22_x2.vbe +@@ -0,0 +1,44 @@ ++ENTITY aon22_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 9000; ++ CONSTANT cin_b1 : NATURAL := 7; ++ CONSTANT cin_b2 : NATURAL := 7; ++ CONSTANT cin_a2 : NATURAL := 6; ++ CONSTANT cin_a1 : NATURAL := 6; ++ CONSTANT rdown_b1_z : NATURAL := 1220; ++ CONSTANT rdown_b2_z : NATURAL := 1210; ++ CONSTANT rdown_a2_z : NATURAL := 1220; ++ CONSTANT rdown_a1_z : NATURAL := 1220; ++ CONSTANT rup_b1_z : NATURAL := 1560; ++ CONSTANT rup_b2_z : NATURAL := 1560; ++ CONSTANT rup_a2_z : NATURAL := 1570; ++ CONSTANT rup_a1_z : NATURAL := 1570; ++ CONSTANT tphh_b1_z : NATURAL := 88; ++ CONSTANT tpll_a2_z : NATURAL := 132; ++ CONSTANT tphh_b2_z : NATURAL := 89; ++ CONSTANT tpll_a1_z : NATURAL := 141; ++ CONSTANT tpll_b2_z : NATURAL := 105; ++ CONSTANT tphh_a1_z : NATURAL := 115; ++ CONSTANT tpll_b1_z : NATURAL := 114; ++ CONSTANT tphh_a2_z : NATURAL := 117; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a2 : in BIT; ++ a1 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END aon22_x2; ++ ++ARCHITECTURE behaviour_data_flow OF aon22_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on aon22_x2" ++ SEVERITY WARNING; ++ z <= ((b1 and b2) or (a2 and a1)) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_w05.ap b/alliance/src/cells/src/msxlib/bf1_w05.ap +new file mode 100644 +index 0000000..5fba830 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_w05.ap +@@ -0,0 +1,59 @@ ++V ALLIANCE : 6 ++H bf1_w05,P, 8/ 8/2014,100 ++A 0,0,3000,10000 ++R 2000,5000,ref_ref,z_50 ++R 2000,4000,ref_ref,z_40 ++R 2000,6000,ref_ref,z_60 ++R 2000,8000,ref_ref,a_80 ++R 2000,7000,ref_ref,a_70 ++R 1000,5000,ref_ref,z_50 ++S 2000,7000,2300,7000,600,*,RIGHT,ALU1 ++S 0,5000,3000,5000,10000,bf1_w05,LEFT,TALU8 ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 1200,5500,1200,6400,200,1z,UP,PTRANS ++S 800,5700,800,6200,400,*,UP,PDIF ++S 1600,5700,1600,6200,400,*,DOWN,PDIF ++S 1200,3300,1200,3900,200,2z,DOWN,NTRANS ++S 400,6100,700,6100,400,*,LEFT,ALU1 ++S 400,6100,400,9300,400,*,UP,ALU1 ++S 400,6000,700,6000,400,*,LEFT,ALU1 ++S 1200,3900,1200,5500,200,*,DOWN,POLY ++S 400,700,400,3600,400,*,DOWN,ALU1 ++S 400,3600,700,3600,400,*,RIGHT,ALU1 ++S 400,3700,700,3700,400,*,LEFT,ALU1 ++S 1600,7800,1600,8300,400,*,DOWN,PDIF ++S 2000,7600,2000,8500,200,1a,UP,PTRANS ++S 2000,8500,2000,8800,200,*,UP,POLY ++S 2500,7800,2500,9500,400,*,DOWN,PDIF ++S 2000,4000,2000,6000,400,z,DOWN,CALU1 ++S 1200,6900,1200,8000,400,*,DOWN,ALU1 ++S 2000,7000,2000,8000,400,a,UP,CALU1 ++S 2000,6900,2000,8100,400,*,DOWN,ALU1 ++S 2000,6800,2000,7600,200,*,DOWN,POLY ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 1900,3600,1900,6100,600,*,UP,ALU1 ++S 900,5000,2000,5000,400,*,LEFT,ALU1 ++S 1000,5000,1000,5000,400,z,LEFT,CALU1 ++S 2000,1600,2000,2200,200,2a,DOWN,NTRANS ++S 2000,2600,2500,2600,200,*,RIGHT,POLY ++S 2500,2600,2500,7200,200,*,DOWN,POLY ++S 2500,500,2500,2000,400,*,UP,NDIF ++S 2000,1200,2000,1600,200,*,DOWN,POLY ++S 1300,1900,1300,2800,600,*,DOWN,ALU1 ++S 2000,2200,2000,2600,200,*,UP,POLY ++V 1000,700,CONT_BODY_P,* ++V 1000,9300,CONT_BODY_N,* ++V 2200,7000,CONT_POLY,* ++V 1800,5800,CONT_DIF_P,* ++V 600,6100,CONT_DIF_P,* ++V 600,3600,CONT_DIF_N,* ++V 2400,9400,CONT_DIF_P,* ++V 1200,2700,CONT_POLY,an ++V 1200,7900,CONT_DIF_P,an ++V 2400,600,CONT_DIF_N,* ++V 1900,3600,CONT_DIF_N,* ++V 1200,7000,CONT_POLY,an ++V 1300,1900,CONT_DIF_N,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_w05.vbe b/alliance/src/cells/src/msxlib/bf1_w05.vbe +new file mode 100644 +index 0000000..aee4efe +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_w05.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_w05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT cin_a : NATURAL := 2; ++ CONSTANT rdown_a_z : NATURAL := 3810; ++ CONSTANT rup_a_z : NATURAL := 6580; ++ CONSTANT tpll_a_z : NATURAL := 80; ++ CONSTANT tphh_a_z : NATURAL := 61; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_w05; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_w05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_w05" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_w2.ap b/alliance/src/cells/src/msxlib/bf1_w2.ap +new file mode 100644 +index 0000000..47d5bb1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_w2.ap +@@ -0,0 +1,65 @@ ++V ALLIANCE : 6 ++H bf1_w2,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 1000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 3000,4000,ref_ref,a_40 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 2200,1900,2200,3400,600,*,UP,NDIF ++S 3400,7000,3400,7900,400,*,UP,ALU1 ++S 2000,6900,3400,6900,400,*,RIGHT,ALU1 ++S 1600,9300,1600,9700,200,*,DOWN,POLY ++S 2200,5700,2200,9100,600,*,DOWN,PDIF ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 1200,5700,1200,9100,400,*,UP,PDIF ++S 1200,1900,1200,3400,400,*,DOWN,NDIF ++S 1600,3600,1600,5500,200,*,UP,POLY ++S 1600,1300,1600,1700,200,*,UP,POLY ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 1000,1900,1000,7100,400,*,UP,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,4000,5000,10000,bf1_w2,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 2800,3600,2800,5500,200,*,UP,POLY ++S 3400,7300,3400,7900,600,*,UP,PDIF ++S 1000,5700,1000,6500,600,*,UP,PDIF ++S 1000,2900,1000,3310,600,*,UP,NDIF ++S 1600,5500,1600,9300,200,1z,UP,PTRANS ++S 1600,1700,1600,3600,200,2z,DOWN,NTRANS ++S 2800,9300,2800,9700,200,*,DOWN,POLY ++S 2800,5500,2800,9300,200,1a,UP,PTRANS ++S 3200,5700,3200,9100,400,*,UP,PDIF ++S 2800,1300,2800,1700,200,*,UP,POLY ++S 3200,1900,3200,3400,400,*,DOWN,NDIF ++S 2800,1700,2800,3600,200,2a,DOWN,NTRANS ++S 2000,3000,2000,6900,400,*,UP,ALU1 ++S 3400,1900,3400,3000,400,*,UP,ALU1 ++S 2000,3000,3400,3000,400,*,LEFT,ALU1 ++S 3400,2100,3400,2700,600,*,UP,NDIF ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3400,7800,CONT_DIF_P,an ++V 3400,7000,CONT_DIF_P,an ++V 2200,8000,CONT_DIF_P,* ++V 2200,9000,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,* ++V 3000,4700,CONT_POLY,* ++V 2000,4700,CONT_POLY,an ++V 1000,5800,CONT_DIF_P,* ++V 1000,6600,CONT_DIF_P,* ++V 1000,3300,CONT_DIF_N,* ++V 1000,2500,CONT_DIF_N,* ++V 3400,2000,CONT_DIF_N,an ++V 3400,2800,CONT_DIF_N,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_w2.vbe b/alliance/src/cells/src/msxlib/bf1_w2.vbe +new file mode 100644 +index 0000000..b4b7b0d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_w2.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_w2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT rdown_a_z : NATURAL := 1200; ++ CONSTANT rup_a_z : NATURAL := 1560; ++ CONSTANT tpll_a_z : NATURAL := 69; ++ CONSTANT tphh_a_z : NATURAL := 56; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_w2; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_w2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_w2" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_x1.ap b/alliance/src/cells/src/msxlib/bf1_x1.ap +new file mode 100644 +index 0000000..78c6bb1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_x1.ap +@@ -0,0 +1,61 @@ ++V ALLIANCE : 6 ++H bf1_x1,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 3000,4000,ref_ref,a_40 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 2000,3000,3500,3000,400,*,LEFT,ALU1 ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,4000,5000,10000,bf1_x1,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 1600,6300,1600,8300,200,1z,UP,PTRANS ++S 1600,8300,1600,8700,200,*,DOWN,POLY ++S 2800,8300,2800,8700,200,*,DOWN,POLY ++S 3200,6500,3200,8100,400,*,UP,PDIF ++S 2800,6300,2800,8300,200,1a,UP,PTRANS ++S 1200,6500,1200,8100,400,*,UP,PDIF ++S 1000,6590,1000,7200,600,*,UP,PDIF ++S 1000,2900,1000,7500,400,*,UP,ALU1 ++S 3400,7300,3400,7900,600,*,DOWN,PDIF ++S 2000,7000,3400,7000,400,*,RIGHT,ALU1 ++S 3400,7000,3400,8100,400,*,DOWN,ALU1 ++S 2000,3000,2000,7000,400,*,UP,ALU1 ++S 2200,6500,2200,8100,600,*,DOWN,PDIF ++S 3200,2500,3200,3100,400,*,DOWN,NDIF ++S 2200,1900,2200,3100,600,*,UP,NDIF ++S 1200,2500,1200,3100,400,*,DOWN,NDIF ++S 1600,2300,1600,3300,200,2z,DOWN,NTRANS ++S 1600,3300,1600,6300,200,*,UP,POLY ++S 2800,3300,2800,6300,200,*,UP,POLY ++S 2800,2300,2800,3300,200,2a,DOWN,NTRANS ++S 2800,1900,2800,2300,200,*,UP,POLY ++S 1600,1900,1600,2300,200,*,UP,POLY ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3400,3000,CONT_DIF_N,an ++V 2200,8000,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,* ++V 3000,4700,CONT_POLY,* ++V 2000,4700,CONT_POLY,an ++V 1000,6600,CONT_DIF_P,* ++V 1000,7400,CONT_DIF_P,* ++V 3400,8000,CONT_DIF_P,an ++V 3400,7200,CONT_DIF_P,an ++V 1000,3000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_x1.vbe b/alliance/src/cells/src/msxlib/bf1_x1.vbe +new file mode 100644 +index 0000000..c296d8e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_x1.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT rdown_a_z : NATURAL := 2280; ++ CONSTANT rup_a_z : NATURAL := 2960; ++ CONSTANT tpll_a_z : NATURAL := 73; ++ CONSTANT tphh_a_z : NATURAL := 61; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_x1; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_x1" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_x2.ap b/alliance/src/cells/src/msxlib/bf1_x2.ap +new file mode 100644 +index 0000000..25ca522 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_x2.ap +@@ -0,0 +1,63 @@ ++V ALLIANCE : 6 ++H bf1_x2,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 1000,2000,ref_ref,z_20 ++R 3000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,a_60 ++R 3000,4000,ref_ref,a_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,6000,ref_ref,z_60 ++R 1000,7000,ref_ref,z_70 ++R 1000,3000,ref_ref,z_30 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 1600,1700,1600,3600,200,2z,DOWN,NTRANS ++S 1600,5500,1600,9300,200,1z,UP,PTRANS ++S 1000,2900,1000,3310,600,*,UP,NDIF ++S 1000,5700,1000,6500,600,*,UP,PDIF ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 0,5000,4000,5000,10000,bf1_x2,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,1900,1000,7100,400,*,UP,ALU1 ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 1600,1300,1600,1700,200,*,UP,POLY ++S 1600,3600,1600,5500,200,*,UP,POLY ++S 1200,1900,1200,3400,400,*,DOWN,NDIF ++S 1200,5700,1200,9100,400,*,UP,PDIF ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 2200,5700,2200,9100,600,*,DOWN,PDIF ++S 1600,9300,1600,9700,200,*,DOWN,POLY ++S 2200,1900,2200,3400,600,*,UP,NDIF ++S 2000,3000,3500,3000,400,*,LEFT,ALU1 ++S 3200,2200,3200,3100,400,*,DOWN,NDIF ++S 2800,2000,2800,3300,200,2a,DOWN,NTRANS ++S 2800,1600,2800,2000,200,*,UP,POLY ++S 3400,7500,3400,8100,600,*,UP,PDIF ++S 2800,5700,2800,8300,200,1a,UP,PTRANS ++S 3200,5900,3200,8100,400,*,UP,PDIF ++S 2000,7000,3400,7000,400,*,RIGHT,ALU1 ++S 2000,3000,2000,7000,400,*,UP,ALU1 ++S 3400,7000,3400,8100,400,*,UP,ALU1 ++S 2800,8300,2800,8700,200,*,DOWN,POLY ++S 2800,3300,2800,5700,200,*,UP,POLY ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3300,9300,CONT_BODY_N,* ++V 1000,2500,CONT_DIF_N,* ++V 1000,3300,CONT_DIF_N,* ++V 1000,6600,CONT_DIF_P,* ++V 1000,5800,CONT_DIF_P,* ++V 2000,4700,CONT_POLY,an ++V 3000,4700,CONT_POLY,* ++V 2200,2000,CONT_DIF_N,* ++V 2200,9000,CONT_DIF_P,* ++V 2200,8000,CONT_DIF_P,* ++V 3400,3000,CONT_DIF_N,an ++V 3400,8000,CONT_DIF_P,an ++V 3400,7200,CONT_DIF_P,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_x2.vbe b/alliance/src/cells/src/msxlib/bf1_x2.vbe +new file mode 100644 +index 0000000..ef9a368 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_x2.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT rdown_a_z : NATURAL := 1200; ++ CONSTANT rup_a_z : NATURAL := 1560; ++ CONSTANT tpll_a_z : NATURAL := 78; ++ CONSTANT tphh_a_z : NATURAL := 64; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_x2; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_x2" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_x4.ap b/alliance/src/cells/src/msxlib/bf1_x4.ap +new file mode 100644 +index 0000000..bcdef37 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_x4.ap +@@ -0,0 +1,88 @@ ++V ALLIANCE : 6 ++H bf1_x4,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 3000,6000,ref_ref,a_60 ++R 2000,5000,ref_ref,a_50 ++R 2000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 3000,5000,ref_ref,a_50 ++R 2000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 3000,7000,ref_ref,a_70 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 800,6900,800,9300,400,*,UP,ALU1 ++S 1400,3600,1400,5600,200,*,UP,POLY ++S 2600,3600,2600,5600,200,*,UP,POLY ++S 3200,700,3200,3100,400,*,DOWN,ALU1 ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 1400,9400,1400,9700,200,*,DOWN,POLY ++S 2000,5800,2000,9200,1000,*,DOWN,PDIF ++S 1000,6000,2000,6000,600,*,RIGHT,ALU1 ++S 800,5800,800,9200,800,*,DOWN,PDIF ++S 3200,5800,3200,9200,800,*,DOWN,PDIF ++S 2000,6000,2000,7100,400,*,UP,ALU1 ++S 2000,5000,2000,5000,400,a,LEFT,CALU1 ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 3800,9400,3800,9700,200,*,DOWN,POLY ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,bf1_x4,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 3800,3600,3800,5600,200,*,DOWN,POLY ++S 3000,5000,3000,7000,400,a,DOWN,CALU1 ++S 800,700,800,2100,400,*,DOWN,ALU1 ++S 1000,3000,2000,3000,600,*,LEFT,ALU1 ++S 1000,3000,1000,6000,400,z,DOWN,CALU1 ++S 1000,3000,1000,6000,400,*,UP,ALU1 ++S 2000,2000,2000,3000,400,z,DOWN,CALU1 ++S 2000,1900,2000,3000,400,*,UP,ALU1 ++S 1400,4000,2600,4000,600,*,RIGHT,POLY ++S 800,1700,800,3200,600,*,UP,NDIF ++S 700,1700,700,3200,600,*,UP,NDIF ++S 2000,1700,2000,3200,600,*,UP,NDIF ++S 3300,1700,3300,3200,600,*,UP,NDIF ++S 3200,1700,3200,3200,600,*,UP,NDIF ++S 4400,2200,4400,6800,400,*,UP,ALU1 ++S 4400,2400,4400,3000,600,*,UP,NDIF ++S 4200,1700,4200,3200,400,*,UP,NDIF ++S 2300,4000,4400,4000,400,*,RIGHT,ALU1 ++S 1900,5000,3600,5000,400,*,RIGHT,ALU1 ++S 3000,5000,3000,7100,400,*,UP,ALU1 ++S 3200,7900,3200,9300,400,*,UP,ALU1 ++S 4200,5800,4200,9200,400,*,DOWN,PDIF ++S 4400,6000,4400,6600,600,*,UP,PDIF ++S 3800,5600,3800,9400,200,1a,UP,PTRANS ++S 3800,1500,3800,3400,200,1b,DOWN,NTRANS ++S 2600,5600,2600,9400,200,1z,UP,PTRANS ++S 1400,5600,1400,9400,200,2z,UP,PTRANS ++S 2600,1500,2600,3400,200,3z,DOWN,NTRANS ++S 1400,1500,1400,3400,200,4z,DOWN,NTRANS ++S 1400,1200,1400,1500,200,*,UP,POLY ++S 2600,1100,2600,1500,200,*,UP,POLY ++S 3800,1100,3800,1500,200,*,UP,POLY ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 800,9000,CONT_DIF_P,* ++V 3200,9000,CONT_DIF_P,* ++V 3200,8000,CONT_DIF_P,* ++V 800,8000,CONT_DIF_P,* ++V 800,7000,CONT_DIF_P,* ++V 2000,3000,CONT_DIF_N,* ++V 2000,7000,CONT_DIF_P,* ++V 2000,6000,CONT_DIF_P,* ++V 3200,3000,CONT_DIF_N,* ++V 800,2000,CONT_DIF_N,* ++V 4400,6700,CONT_DIF_P,an ++V 4400,5900,CONT_DIF_P,an ++V 4400,2300,CONT_DIF_N,an ++V 4400,3100,CONT_DIF_N,an ++V 3200,2000,CONT_DIF_N,* ++V 2000,2000,CONT_DIF_N,* ++V 2400,4000,CONT_POLY,an ++V 3500,5000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_x4.vbe b/alliance/src/cells/src/msxlib/bf1_x4.vbe +new file mode 100644 +index 0000000..475fb08 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_x4.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_x4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT rdown_a_z : NATURAL := 600; ++ CONSTANT rup_a_z : NATURAL := 780; ++ CONSTANT tpll_a_z : NATURAL := 82; ++ CONSTANT tphh_a_z : NATURAL := 66; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_x4; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_x4 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_x4" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_x8.ap b/alliance/src/cells/src/msxlib/bf1_x8.ap +new file mode 100644 +index 0000000..971f02e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_x8.ap +@@ -0,0 +1,138 @@ ++V ALLIANCE : 6 ++H bf1_x8,P, 8/ 8/2014,100 ++A 0,0,9000,10000 ++R 4000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 2000,7000,ref_ref,z_70 ++R 2000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,z_60 ++R 3000,6000,ref_ref,z_60 ++R 4000,6000,ref_ref,z_60 ++R 4000,7000,ref_ref,z_70 ++R 3000,4000,ref_ref,z_40 ++R 4000,4000,ref_ref,z_40 ++R 4000,3000,ref_ref,z_30 ++R 8000,6000,ref_ref,a_60 ++R 8000,5000,ref_ref,a_50 ++R 8000,4000,ref_ref,a_40 ++R 2000,5000,ref_ref,z_50 ++R 7000,4000,ref_ref,a_40 ++S 2400,700,3200,700,600,*,LEFT,PTIE ++S 5400,700,5400,3100,400,*,DOWN,ALU1 ++S 3000,4000,3000,4000,400,z,LEFT,CALU1 ++S 4000,2000,4000,4000,400,z,DOWN,CALU1 ++S 3000,6000,3000,6000,400,z,LEFT,CALU1 ++S 4000,6000,4000,7000,400,z,UP,CALU1 ++S 4100,6000,4100,7100,600,*,DOWN,ALU1 ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 600,6900,600,9300,400,*,UP,ALU1 ++S 3000,6900,3000,9300,400,*,UP,ALU1 ++S 5400,6900,5400,9300,400,*,UP,ALU1 ++S 600,700,600,3100,400,*,DOWN,ALU1 ++S 4100,1900,4100,4000,600,*,DOWN,ALU1 ++S 3000,700,3000,3100,400,*,DOWN,ALU1 ++S 4800,1300,4800,1700,200,*,UP,POLY ++S 3600,1300,3600,1700,200,*,UP,POLY ++S 2400,1300,2400,1700,200,*,UP,POLY ++S 1200,1300,1200,1700,200,*,UP,POLY ++S 1200,5500,1200,9400,200,1,UP,PTRANS ++S 600,5700,600,9200,600,*,DOWN,PDIF ++S 1800,5700,1800,9200,600,*,DOWN,PDIF ++S 2400,5500,2400,9400,200,2,UP,PTRANS ++S 3600,5500,3600,9400,200,3,UP,PTRANS ++S 3000,5700,3000,9200,600,*,DOWN,PDIF ++S 5400,5700,5400,8100,600,*,DOWN,PDIF ++S 4800,5500,4800,8300,200,4,UP,PTRANS ++S 4200,5700,4200,8100,600,*,UP,PDIF ++S 4000,8500,4000,9200,400,*,UP,PDIF ++S 4800,8400,4800,8700,200,*,DOWN,POLY ++S 6600,5700,6600,8100,600,*,UP,PDIF ++S 6000,8400,6000,8700,200,*,DOWN,POLY ++S 0,9400,9000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,9000,5000,10000,bf1_x8,LEFT,TALU8 ++S 0,2200,9000,2200,5200,*,LEFT,PWELL ++S 0,7600,9000,7600,5600,*,LEFT,NWELL ++S 7800,6900,7800,9300,400,*,UP,ALU1 ++S 8000,3900,8000,6100,400,*,DOWN,ALU1 ++S 8000,4000,8000,6000,400,a,DOWN,CALU1 ++S 6600,1900,6600,2800,600,*,UP,NDIF ++S 7600,1900,7600,3100,400,*,UP,NDIF ++S 7800,700,7800,3100,400,*,DOWN,ALU1 ++S 0,600,9000,600,1200,vss,RIGHT,CALU1 ++S 7900,1900,7900,3100,600,*,UP,NDIF ++S 7900,5700,7900,8900,600,*,DOWN,PDIF ++S 6800,5700,6800,8900,400,*,UP,PDIF ++S 7200,9100,7200,9500,200,*,DOWN,POLY ++S 7200,5500,7200,9100,200,1a,UP,PTRANS ++S 6000,5500,6000,8300,200,2a,UP,PTRANS ++S 7200,1700,7200,3300,200,3a,DOWN,NTRANS ++S 6000,1700,6000,3300,200,4a,DOWN,NTRANS ++S 6000,1300,6000,1700,200,*,UP,POLY ++S 7200,1300,7200,1700,200,*,UP,POLY ++S 2400,4900,3600,4900,600,*,RIGHT,POLY ++S 1200,5100,4800,5100,200,*,RIGHT,POLY ++S 1800,6000,4200,6000,400,*,LEFT,ALU1 ++S 1800,4000,4200,4000,400,*,RIGHT,ALU1 ++S 1900,1900,1900,7100,600,*,DOWN,ALU1 ++S 2000,2000,2000,7000,400,z,UP,CALU1 ++S 6000,4000,7200,4000,600,*,RIGHT,POLY ++S 7200,3300,7200,5500,200,*,DOWN,POLY ++S 6000,3300,6000,5500,200,*,UP,POLY ++S 7000,4000,8000,4000,600,*,RIGHT,ALU1 ++S 7000,4000,7000,4000,400,a,LEFT,CALU1 ++S 6200,3100,6200,4900,400,*,DOWN,ALU1 ++S 2900,4900,6600,4900,400,*,RIGHT,ALU1 ++S 6600,4900,6600,7100,400,*,DOWN,ALU1 ++S 6600,1900,6600,3100,400,*,UP,ALU1 ++S 700,1900,700,3300,800,*,UP,NDIF ++S 1200,1700,1200,3500,200,5,DOWN,NTRANS ++S 1800,1900,1800,3300,1000,*,UP,NDIF ++S 3000,1900,3000,3300,1000,*,UP,NDIF ++S 2400,1700,2400,3500,200,6,DOWN,NTRANS ++S 1200,3500,1200,5500,200,*,UP,POLY ++S 2400,3500,2400,5500,200,*,UP,POLY ++S 3600,1700,3600,3500,200,7,DOWN,NTRANS ++S 3600,3500,3600,5500,200,*,UP,POLY ++S 4200,1900,4200,3300,1000,*,UP,NDIF ++S 4800,1700,4800,3500,200,8,DOWN,NTRANS ++S 4800,3500,4800,5500,200,*,UP,POLY ++S 5300,1900,5300,3300,800,*,UP,NDIF ++V 5400,9300,CONT_BODY_N,* ++V 3300,700,CONT_BODY_P,* ++V 2300,700,CONT_BODY_P,* ++V 5400,3000,CONT_DIF_N,* ++V 1800,7000,CONT_DIF_P,* ++V 4200,7000,CONT_DIF_P,* ++V 600,7000,CONT_DIF_P,* ++V 600,8000,CONT_DIF_P,* ++V 600,9000,CONT_DIF_P,* ++V 3000,7000,CONT_DIF_P,* ++V 3000,8000,CONT_DIF_P,* ++V 3000,9000,CONT_DIF_P,* ++V 5400,7000,CONT_DIF_P,* ++V 5400,8000,CONT_DIF_P,* ++V 600,3000,CONT_DIF_N,* ++V 600,2000,CONT_DIF_N,* ++V 3000,3000,CONT_DIF_N,* ++V 3000,2000,CONT_DIF_N,* ++V 1800,2000,CONT_DIF_N,* ++V 1800,3000,CONT_DIF_N,* ++V 4200,3000,CONT_DIF_N,* ++V 4200,2000,CONT_DIF_N,* ++V 5400,2000,CONT_DIF_N,* ++V 7800,8000,CONT_DIF_P,* ++V 7800,7000,CONT_DIF_P,* ++V 6600,6000,CONT_DIF_P,an ++V 6600,7000,CONT_DIF_P,an ++V 7800,3000,CONT_DIF_N,* ++V 7800,2200,CONT_DIF_N,* ++V 6600,3000,CONT_DIF_N,an ++V 3000,4900,CONT_POLY,* ++V 1800,6200,CONT_DIF_P,* ++V 4200,6200,CONT_DIF_P,* ++V 7000,4000,CONT_POLY,* ++V 6600,2000,CONT_DIF_N,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_x8.vbe b/alliance/src/cells/src/msxlib/bf1_x8.vbe +new file mode 100644 +index 0000000..9d99611 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_x8.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_x8 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 9000; ++ CONSTANT cin_a : NATURAL := 11; ++ CONSTANT rdown_a_z : NATURAL := 320; ++ CONSTANT rup_a_z : NATURAL := 410; ++ CONSTANT tpll_a_z : NATURAL := 84; ++ CONSTANT tphh_a_z : NATURAL := 68; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_x8; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_x8 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_x8" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_y05.ap b/alliance/src/cells/src/msxlib/bf1_y05.ap +new file mode 100644 +index 0000000..d82bc19 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_y05.ap +@@ -0,0 +1,55 @@ ++V ALLIANCE : 6 ++H bf1_y05,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 3000,4000,ref_ref,a_40 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 1600,2300,1600,2700,200,*,UP,POLY ++S 1600,2700,1600,3300,200,2z,DOWN,NTRANS ++S 1200,2900,1200,3100,400,*,DOWN,NDIF ++S 1000,2900,1000,7100,400,*,UP,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 2200,1900,2200,3100,600,*,UP,NDIF ++S 2000,3000,3500,3000,400,*,LEFT,ALU1 ++S 2000,7000,3500,7000,400,*,RIGHT,ALU1 ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,4000,5000,10000,bf1_y05,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 2000,3000,2000,7000,400,*,UP,ALU1 ++S 2800,2700,2800,3300,200,2a,DOWN,NTRANS ++S 2800,2300,2800,2700,200,*,UP,POLY ++S 3200,6900,3200,7700,400,*,UP,PDIF ++S 2800,6700,2800,7900,200,1a,UP,PTRANS ++S 1200,6900,1200,7700,400,*,UP,PDIF ++S 1600,6700,1600,7900,200,1z,UP,PTRANS ++S 2200,6900,2200,8100,600,*,DOWN,PDIF ++S 1600,3300,1600,6700,200,*,UP,POLY ++S 2800,3300,2800,6700,200,*,UP,POLY ++S 1600,7900,1600,8300,200,*,DOWN,POLY ++S 2800,7900,2800,8300,200,*,DOWN,POLY ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1000,3000,CONT_DIF_N,* ++V 3400,3000,CONT_DIF_N,an ++V 3400,7000,CONT_DIF_P,an ++V 2200,8000,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,* ++V 3000,4700,CONT_POLY,* ++V 2000,4700,CONT_POLY,an ++V 1000,7000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_y05.vbe b/alliance/src/cells/src/msxlib/bf1_y05.vbe +new file mode 100644 +index 0000000..9d7eeb6 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_y05.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_y05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 3; ++ CONSTANT rdown_a_z : NATURAL := 3810; ++ CONSTANT rup_a_z : NATURAL := 4940; ++ CONSTANT tpll_a_z : NATURAL := 78; ++ CONSTANT tphh_a_z : NATURAL := 66; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_y05; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_y05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_y05" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_y1.ap b/alliance/src/cells/src/msxlib/bf1_y1.ap +new file mode 100644 +index 0000000..1a88dac +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_y1.ap +@@ -0,0 +1,57 @@ ++V ALLIANCE : 6 ++H bf1_y1,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 3000,4000,ref_ref,a_40 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1600,3300,1600,6300,200,*,UP,POLY ++S 1000,2900,1000,7500,400,*,UP,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1600,1900,1600,2300,200,*,UP,POLY ++S 1600,2300,1600,3300,200,2z,DOWN,NTRANS ++S 1200,2500,1200,3100,400,*,DOWN,NDIF ++S 2200,1900,2200,3100,600,*,UP,NDIF ++S 1600,8300,1600,8700,200,*,DOWN,POLY ++S 2200,6500,2200,8100,600,*,DOWN,PDIF ++S 1000,6500,1000,7300,600,*,UP,PDIF ++S 1600,6300,1600,8300,200,1z,UP,PTRANS ++S 1200,6500,1200,8100,400,*,UP,PDIF ++S 2000,3000,3500,3000,400,*,LEFT,ALU1 ++S 2000,7000,3500,7000,400,*,RIGHT,ALU1 ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,4000,5000,10000,bf1_y1,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 2000,3000,2000,7000,400,*,UP,ALU1 ++S 2800,2700,2800,3300,200,2a,DOWN,NTRANS ++S 2800,2300,2800,2700,200,*,UP,POLY ++S 3200,6900,3200,7700,400,*,UP,PDIF ++S 2800,6700,2800,7900,200,1a,UP,PTRANS ++S 2800,3300,2800,6700,200,*,UP,POLY ++S 2800,7900,2800,8300,200,*,DOWN,POLY ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 1000,3000,CONT_DIF_N,* ++V 1000,6600,CONT_DIF_P,* ++V 1000,7400,CONT_DIF_P,* ++V 3400,3000,CONT_DIF_N,an ++V 3400,7000,CONT_DIF_P,an ++V 2200,8000,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,* ++V 3000,4700,CONT_POLY,* ++V 2000,4700,CONT_POLY,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_y1.vbe b/alliance/src/cells/src/msxlib/bf1_y1.vbe +new file mode 100644 +index 0000000..c63f067 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_y1.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_y1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 3; ++ CONSTANT rdown_a_z : NATURAL := 2290; ++ CONSTANT rup_a_z : NATURAL := 2960; ++ CONSTANT tpll_a_z : NATURAL := 87; ++ CONSTANT tphh_a_z : NATURAL := 72; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_y1; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_y1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_y1" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/bf1_y2.ap b/alliance/src/cells/src/msxlib/bf1_y2.ap +new file mode 100644 +index 0000000..0692c2b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_y2.ap +@@ -0,0 +1,59 @@ ++V ALLIANCE : 6 ++H bf1_y2,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 3000,4000,ref_ref,a_40 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++R 1000,2000,ref_ref,z_20 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 2800,3300,2800,6700,200,*,UP,POLY ++S 2800,6700,2800,7900,200,1a,UP,PTRANS ++S 3200,6900,3200,7700,400,*,UP,PDIF ++S 2000,3000,3500,3000,400,*,LEFT,ALU1 ++S 2000,7000,3500,7000,400,*,RIGHT,ALU1 ++S 2200,1900,2200,3400,600,*,UP,NDIF ++S 1600,9300,1600,9700,200,*,DOWN,POLY ++S 2200,5700,2200,9100,600,*,DOWN,PDIF ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 1200,5700,1200,9100,400,*,UP,PDIF ++S 1200,1900,1200,3400,400,*,DOWN,NDIF ++S 1600,3600,1600,5500,200,*,UP,POLY ++S 1600,1300,1600,1700,200,*,UP,POLY ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 1000,1900,1000,7100,400,*,UP,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,4000,5000,10000,bf1_y2,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 2000,3000,2000,7000,400,*,UP,ALU1 ++S 1000,5700,1000,6500,600,*,UP,PDIF ++S 1000,2900,1000,3310,600,*,UP,NDIF ++S 1600,5500,1600,9300,200,1z,UP,PTRANS ++S 1600,1700,1600,3600,200,2z,DOWN,NTRANS ++S 2800,2700,2800,3300,200,2a,DOWN,NTRANS ++S 2800,2300,2800,2700,200,*,UP,POLY ++S 2800,7900,2800,8300,200,*,DOWN,POLY ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3300,9300,CONT_BODY_N,* ++V 3400,3000,CONT_DIF_N,an ++V 3400,7000,CONT_DIF_P,an ++V 2200,8000,CONT_DIF_P,* ++V 2200,9000,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,* ++V 3000,4700,CONT_POLY,* ++V 2000,4700,CONT_POLY,an ++V 1000,5800,CONT_DIF_P,* ++V 1000,6600,CONT_DIF_P,* ++V 1000,3300,CONT_DIF_N,* ++V 1000,2500,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/bf1_y2.vbe b/alliance/src/cells/src/msxlib/bf1_y2.vbe +new file mode 100644 +index 0000000..adcc717 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/bf1_y2.vbe +@@ -0,0 +1,26 @@ ++ENTITY bf1_y2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 2; ++ CONSTANT rdown_a_z : NATURAL := 1210; ++ CONSTANT rup_a_z : NATURAL := 1560; ++ CONSTANT tpll_a_z : NATURAL := 106; ++ CONSTANT tphh_a_z : NATURAL := 87; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END bf1_y2; ++ ++ARCHITECTURE behaviour_data_flow OF bf1_y2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on bf1_y2" ++ SEVERITY WARNING; ++ z <= a after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgi2_x05.ap b/alliance/src/cells/src/msxlib/cgi2_x05.ap +new file mode 100644 +index 0000000..817c429 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2_x05.ap +@@ -0,0 +1,120 @@ ++V ALLIANCE : 6 ++H cgi2_x05,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 4000,6000,ref_ref,z_60 ++R 6000,4000,ref_ref,b_40 ++R 5000,4000,ref_ref,b_40 ++R 6000,7000,ref_ref,c_70 ++R 5000,7000,ref_ref,c_70 ++R 5000,6000,ref_ref,c_60 ++R 3000,3000,ref_ref,z_30 ++R 1000,6000,ref_ref,a_60 ++R 1000,5000,ref_ref,a_50 ++R 6000,6000,ref_ref,b_60 ++R 3000,6000,ref_ref,z_60 ++R 3000,5000,ref_ref,z_50 ++R 3000,4000,ref_ref,z_40 ++R 4000,3000,ref_ref,z_30 ++R 4000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,a_50 ++R 4000,4000,ref_ref,b_40 ++R 6000,5000,ref_ref,b_50 ++R 5000,5000,ref_ref,c_50 ++R 1000,4000,ref_ref,a_40 ++S 5100,700,5900,700,600,*,RIGHT,PTIE ++S 4100,9300,4900,9300,600,*,RIGHT,NTIE ++S 2000,6500,2000,8100,600,*,UP,PDIF ++S 800,7000,800,8100,400,*,UP,ALU1 ++S 3000,7000,3000,8000,400,*,UP,ALU1 ++S 800,7000,3000,7000,400,*,RIGHT,ALU1 ++S 2000,7900,2000,9300,400,*,DOWN,ALU1 ++S 3000,8000,5300,8000,400,*,RIGHT,ALU1 ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 4000,5900,4000,7100,400,*,UP,ALU1 ++S 3000,2900,3000,6100,400,*,UP,ALU1 ++S 3000,3000,3000,6000,400,z,DOWN,CALU1 ++S 4000,6000,4000,7000,400,z,DOWN,CALU1 ++S 1400,1300,1400,1700,200,*,DOWN,POLY ++S 700,2000,5200,2000,400,*,RIGHT,ALU1 ++S 1400,2600,1400,6300,200,*,UP,POLY ++S 1400,1700,1400,2600,200,07,UP,NTRANS ++S 1000,1900,1000,2400,400,*,DOWN,NDIF ++S 6400,7900,6400,9300,400,*,UP,ALU1 ++S 6400,6500,6400,8100,600,*,DOWN,PDIF ++S 1400,8300,1400,8700,200,*,DOWN,POLY ++S 2600,8300,2600,8700,200,*,DOWN,POLY ++S 3400,8300,3400,8700,200,*,DOWN,POLY ++S 4600,8300,4600,8700,200,*,DOWN,POLY ++S 5800,8300,5800,8700,200,*,DOWN,POLY ++S 2600,2100,2600,2500,200,*,DOWN,POLY ++S 6400,700,6400,3100,400,*,DOWN,ALU1 ++S 5200,2000,5200,3100,400,*,UP,ALU1 ++S 5800,2100,5800,2500,200,*,DOWN,POLY ++S 4600,2100,4600,2500,200,*,DOWN,POLY ++S 3400,2100,3400,2500,200,*,DOWN,POLY ++S 1000,5000,2100,5000,600,*,LEFT,ALU1 ++S 1400,5000,2600,5000,600,*,RIGHT,POLY ++S 5800,3400,5800,6300,200,*,UP,POLY ++S 4600,3400,4600,6300,200,*,UP,POLY ++S 2600,3400,2600,6300,200,*,UP,POLY ++S 3400,3400,3400,6300,200,*,UP,POLY ++S 2600,2500,2600,3400,200,06,UP,NTRANS ++S 3000,2700,3000,3200,600,n3,UP,NDIF ++S 3400,2500,3400,3400,200,08,UP,NTRANS ++S 4000,2700,4000,3200,1000,*,UP,NDIF ++S 4600,2500,4600,3400,200,10,UP,NTRANS ++S 5200,2700,5200,3200,1000,*,UP,NDIF ++S 5800,2500,5800,3400,200,09,UP,NTRANS ++S 6400,2700,6400,3200,600,*,UP,NDIF ++S 3800,4000,6000,4000,600,*,RIGHT,ALU1 ++S 6000,4000,6000,6100,400,*,DOWN,ALU1 ++S 5000,4900,5000,7000,400,*,UP,ALU1 ++S 5000,7100,6100,7100,400,*,LEFT,ALU1 ++S 5000,7000,6100,7000,400,*,LEFT,ALU1 ++S 5000,5000,5000,7000,400,c,DOWN,CALU1 ++S 6000,4000,6000,6000,400,b,UP,CALU1 ++S 3000,2900,4100,2900,400,*,RIGHT,ALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,cgi2_x05,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 3000,3000,4100,3000,400,*,RIGHT,ALU1 ++S 5800,6300,5800,8300,200,04,DOWN,PTRANS ++S 4600,6300,4600,8300,200,05,DOWN,PTRANS ++S 5200,6500,5200,8100,1000,*,UP,PDIF ++S 3000,6500,3000,8100,600,n1,DOWN,PDIF ++S 2600,6300,2600,8300,200,01,DOWN,PTRANS ++S 3400,6300,3400,8300,200,03,DOWN,PTRANS ++S 1400,6300,1400,8300,200,02,DOWN,PTRANS ++S 1000,6500,1000,8100,400,*,UP,PDIF ++S 4000,6500,4000,8100,1000,*,UP,PDIF ++S 2000,5000,2000,5000,400,a,LEFT,CALU1 ++S 4000,3000,4000,3000,400,z,LEFT,CALU1 ++S 4000,4000,4000,4000,400,b,LEFT,CALU1 ++S 5000,4000,5000,4000,400,b,LEFT,CALU1 ++S 6000,7000,6000,7000,400,c,LEFT,CALU1 ++S 2000,900,2000,3200,600,*,UP,NDIF ++S 1000,4000,1000,6000,400,a,DOWN,CALU1 ++S 1000,3900,1000,6100,400,*,DOWN,ALU1 ++S 800,7300,800,7900,600,*,UP,PDIF ++V 5000,700,CONT_BODY_P,* ++V 6000,700,CONT_BODY_P,* ++V 5000,9300,CONT_BODY_N,* ++V 4000,9300,CONT_BODY_N,* ++V 2000,8000,CONT_DIF_P,* ++V 800,2000,CONT_DIF_N,n4 ++V 6400,8000,CONT_DIF_P,* ++V 5200,3000,CONT_DIF_N,n4 ++V 4000,3000,CONT_DIF_N,* ++V 2000,5000,CONT_POLY,* ++V 3800,4000,CONT_POLY,* ++V 6000,5000,CONT_POLY,* ++V 5000,5000,CONT_POLY,* ++V 4000,7000,CONT_DIF_P,* ++V 2000,1000,CONT_DIF_N,* ++V 800,8000,CONT_DIF_P,n2 ++V 5200,8000,CONT_DIF_P,n2 ++V 6400,3000,CONT_DIF_N,* ++V 800,7200,CONT_DIF_P,n2 ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgi2_x05.vbe b/alliance/src/cells/src/msxlib/cgi2_x05.vbe +new file mode 100644 +index 0000000..889ec26 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2_x05.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgi2_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a : NATURAL := 6; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT cin_c : NATURAL := 3; ++ CONSTANT rdown_a_z : NATURAL := 4120; ++ CONSTANT rdown_b_z : NATURAL := 4130; ++ CONSTANT rdown_c_z : NATURAL := 4100; ++ CONSTANT rup_a_z : NATURAL := 5810; ++ CONSTANT rup_b_z : NATURAL := 5850; ++ CONSTANT rup_c_z : NATURAL := 5850; ++ CONSTANT tphl_c_z : NATURAL := 53; ++ CONSTANT tphl_b_z : NATURAL := 62; ++ CONSTANT tplh_a_z : NATURAL := 81; ++ CONSTANT tplh_c_z : NATURAL := 58; ++ CONSTANT tplh_b_z : NATURAL := 75; ++ CONSTANT tphl_a_z : NATURAL := 61; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgi2_x05; ++ ++ARCHITECTURE behaviour_data_flow OF cgi2_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgi2_x05" ++ SEVERITY WARNING; ++ z <= not((b or (a and c)) and (a or c)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgi2_x1.ap b/alliance/src/cells/src/msxlib/cgi2_x1.ap +new file mode 100644 +index 0000000..5dd80f3 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2_x1.ap +@@ -0,0 +1,128 @@ ++V ALLIANCE : 6 ++H cgi2_x1,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 4000,5000,ref_ref,b_50 ++R 4000,6000,ref_ref,z_60 ++R 1000,6000,ref_ref,a_60 ++R 1000,5000,ref_ref,a_50 ++R 6000,6000,ref_ref,b_60 ++R 3000,6000,ref_ref,z_60 ++R 3000,5000,ref_ref,z_50 ++R 3000,4000,ref_ref,z_40 ++R 4000,3000,ref_ref,z_30 ++R 4000,7000,ref_ref,z_70 ++R 1000,4000,ref_ref,a_40 ++R 2000,5000,ref_ref,a_50 ++R 4000,4000,ref_ref,b_40 ++R 6000,5000,ref_ref,b_50 ++R 5000,5000,ref_ref,c_50 ++R 3000,3000,ref_ref,z_30 ++R 5000,6000,ref_ref,c_60 ++R 5000,7000,ref_ref,c_70 ++R 6000,7000,ref_ref,c_70 ++R 5000,4000,ref_ref,b_40 ++R 6000,4000,ref_ref,b_40 ++S 5100,700,5900,700,600,*,RIGHT,PTIE ++S 1400,9400,1400,9700,200,*,DOWN,POLY ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 3400,9400,3400,9700,200,*,DOWN,POLY ++S 4600,9400,4600,9700,200,*,DOWN,POLY ++S 5800,9400,5800,9700,200,*,DOWN,POLY ++S 1400,1300,1400,1700,200,*,DOWN,POLY ++S 2600,1300,2600,1700,200,*,DOWN,POLY ++S 3400,1300,3400,1700,200,*,DOWN,POLY ++S 4600,1300,4600,1700,200,*,DOWN,POLY ++S 5800,1300,5800,1700,200,*,DOWN,POLY ++S 4000,4000,4000,5000,400,b,UP,CALU1 ++S 3900,3900,3900,5100,600,*,UP,ALU1 ++S 4000,4000,6000,4000,400,*,RIGHT,ALU1 ++S 4000,3900,6000,3900,400,*,RIGHT,ALU1 ++S 6000,4000,6000,6100,400,*,DOWN,ALU1 ++S 700,2000,5200,2000,400,*,RIGHT,ALU1 ++S 2000,900,2000,3300,600,*,UP,NDIF ++S 1400,1700,1400,3500,200,07,UP,NTRANS ++S 1000,1900,1000,3300,400,*,DOWN,NDIF ++S 2000,7900,2000,9300,400,*,DOWN,ALU1 ++S 3000,8000,5300,8000,400,*,RIGHT,ALU1 ++S 3000,7000,3000,8000,400,*,UP,ALU1 ++S 1000,3900,1000,6100,400,*,DOWN,ALU1 ++S 1000,4000,1000,6000,400,a,DOWN,CALU1 ++S 5000,4900,5000,7000,600,*,UP,ALU1 ++S 1400,3900,1400,5500,200,*,UP,POLY ++S 2600,3500,2600,5500,200,*,UP,POLY ++S 1400,4900,2600,4900,600,*,RIGHT,POLY ++S 1000,4900,2100,4900,600,*,LEFT,ALU1 ++S 4000,6000,4000,7100,400,*,UP,ALU1 ++S 4000,6000,4000,7000,400,z,UP,CALU1 ++S 3000,3000,3000,6000,400,*,UP,ALU1 ++S 3000,3000,3000,6000,400,z,DOWN,CALU1 ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,cgi2_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 3000,3000,4100,3000,400,*,RIGHT,ALU1 ++S 6400,5700,6400,9200,600,*,DOWN,PDIF ++S 1000,5700,1000,9200,400,*,UP,PDIF ++S 5200,5700,5200,9200,1000,*,UP,PDIF ++S 4000,5700,4000,9200,1000,*,UP,PDIF ++S 2000,5700,2000,9200,1000,*,UP,PDIF ++S 2600,5500,2600,9400,200,01,DOWN,PTRANS ++S 1400,5500,1400,9400,200,02,DOWN,PTRANS ++S 3400,5500,3400,9400,200,03,DOWN,PTRANS ++S 5800,5500,5800,9400,200,04,DOWN,PTRANS ++S 4600,5500,4600,9400,200,05,DOWN,PTRANS ++S 3000,5700,3000,9200,600,n1,DOWN,PDIF ++S 6400,7900,6400,9300,400,*,UP,ALU1 ++S 6400,1900,6400,3300,600,*,UP,NDIF ++S 5800,1700,5800,3500,200,09,UP,NTRANS ++S 5200,1900,5200,3300,1000,*,UP,NDIF ++S 4600,1700,4600,3500,200,10,UP,NTRANS ++S 4000,1900,4000,3300,1000,*,UP,NDIF ++S 3400,1700,3400,3500,200,08,UP,NTRANS ++S 3000,1900,3000,3300,600,n3,UP,NDIF ++S 2600,1700,2600,3500,200,06,UP,NTRANS ++S 5300,2000,5300,3100,400,*,UP,ALU1 ++S 5200,2000,5200,3100,400,*,UP,ALU1 ++S 6400,700,6400,3100,400,*,DOWN,ALU1 ++S 3000,2900,4100,2900,400,*,RIGHT,ALU1 ++S 5000,7000,6100,7000,400,*,LEFT,ALU1 ++S 6000,4000,6000,6000,400,b,UP,CALU1 ++S 3400,3500,3400,5500,200,*,UP,POLY ++S 4600,3500,4600,5500,200,*,UP,POLY ++S 5800,3500,5800,5500,200,*,UP,POLY ++S 5000,5000,5000,7000,400,c,DOWN,CALU1 ++S 800,7000,3000,7000,400,*,RIGHT,ALU1 ++S 800,7000,800,8100,400,*,DOWN,ALU1 ++S 800,7300,800,7900,600,*,DOWN,PDIF ++S 2000,5000,2000,5000,400,a,LEFT,CALU1 ++S 4000,3000,4000,3000,400,z,LEFT,CALU1 ++S 5000,4000,5000,4000,400,b,LEFT,CALU1 ++S 6000,7000,6000,7000,400,c,LEFT,CALU1 ++S 800,2100,800,2700,600,*,UP,NDIF ++S 800,2000,800,2800,600,*,DOWN,ALU1 ++V 6000,700,CONT_BODY_P,* ++V 5000,700,CONT_BODY_P,* ++V 4000,7000,CONT_DIF_P,* ++V 3800,4900,CONT_POLY,* ++V 800,2000,CONT_DIF_N,n4 ++V 2000,8000,CONT_DIF_P,* ++V 4000,6000,CONT_DIF_P,* ++V 2000,4900,CONT_POLY,* ++V 6000,4900,CONT_POLY,* ++V 5000,4900,CONT_POLY,* ++V 4000,3000,CONT_DIF_N,* ++V 2000,1000,CONT_DIF_N,* ++V 5200,8000,CONT_DIF_P,n2 ++V 2000,9000,CONT_DIF_P,* ++V 6400,9000,CONT_DIF_P,* ++V 6400,8000,CONT_DIF_P,* ++V 6400,2000,CONT_DIF_N,* ++V 5200,2000,CONT_DIF_N,n4 ++V 5200,3000,CONT_DIF_N,n4 ++V 6400,3000,CONT_DIF_N,* ++V 800,8000,CONT_DIF_P,n2 ++V 800,7200,CONT_DIF_P,n2 ++V 800,2800,CONT_DIF_N,n4 ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgi2_x1.vbe b/alliance/src/cells/src/msxlib/cgi2_x1.vbe +new file mode 100644 +index 0000000..161a55e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgi2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a : NATURAL := 12; ++ CONSTANT cin_b : NATURAL := 12; ++ CONSTANT cin_c : NATURAL := 6; ++ CONSTANT rdown_a_z : NATURAL := 2050; ++ CONSTANT rdown_b_z : NATURAL := 2060; ++ CONSTANT rdown_c_z : NATURAL := 2050; ++ CONSTANT rup_a_z : NATURAL := 2980; ++ CONSTANT rup_b_z : NATURAL := 3000; ++ CONSTANT rup_c_z : NATURAL := 3000; ++ CONSTANT tphl_c_z : NATURAL := 51; ++ CONSTANT tphl_b_z : NATURAL := 58; ++ CONSTANT tplh_a_z : NATURAL := 76; ++ CONSTANT tplh_c_z : NATURAL := 56; ++ CONSTANT tplh_b_z : NATURAL := 71; ++ CONSTANT tphl_a_z : NATURAL := 57; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgi2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF cgi2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgi2_x1" ++ SEVERITY WARNING; ++ z <= not((b or (a and c)) and (a or c)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgi2_x2.ap b/alliance/src/cells/src/msxlib/cgi2_x2.ap +new file mode 100644 +index 0000000..190441e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2_x2.ap +@@ -0,0 +1,214 @@ ++V ALLIANCE : 6 ++H cgi2_x2,P, 8/ 8/2014,100 ++A 0,0,13000,10000 ++R 1000,4000,ref_ref,a_50 ++R 8000,2000,ref_ref,z_20 ++R 5000,5000,ref_ref,b_50 ++R 2000,3000,ref_ref,c_30 ++R 6000,4000,ref_ref,b_40 ++R 7000,4000,ref_ref,b_40 ++R 8000,4000,ref_ref,b_40 ++R 9000,4000,ref_ref,b_40 ++R 5000,4000,ref_ref,b_40 ++R 9000,6000,ref_ref,a_60 ++R 1000,6000,ref_ref,a_60 ++R 2000,7000,ref_ref,a_70 ++R 3000,7000,ref_ref,a_70 ++R 4000,7000,ref_ref,a_70 ++R 5000,7000,ref_ref,a_70 ++R 6000,7000,ref_ref,a_70 ++R 7000,7000,ref_ref,a_70 ++R 8000,7000,ref_ref,a_70 ++R 8000,5000,ref_ref,a_50 ++R 7000,5000,ref_ref,a_50 ++R 9000,7000,ref_ref,a_70 ++R 9000,5000,ref_ref,a_50 ++R 6000,5000,ref_ref,a_50 ++R 1000,5000,ref_ref,a_50 ++R 7000,3000,ref_ref,z_30 ++R 6000,3000,ref_ref,z_30 ++R 5000,3000,ref_ref,z_30 ++R 3000,3000,ref_ref,z_30 ++R 4000,3000,ref_ref,z_30 ++R 4000,4000,ref_ref,z_40 ++R 4000,5000,ref_ref,z_50 ++R 3000,6000,ref_ref,z_60 ++R 4000,6000,ref_ref,z_60 ++R 5000,6000,ref_ref,z_60 ++R 6000,6000,ref_ref,z_60 ++R 7000,6000,ref_ref,z_60 ++R 10000,4000,ref_ref,b_40 ++R 2000,5000,ref_ref,c_50 ++R 2000,6000,ref_ref,c_60 ++R 3000,5000,ref_ref,c_50 ++R 2000,4000,ref_ref,c_40 ++R 11000,5000,ref_ref,b_50 ++R 11000,3000,ref_ref,b_30 ++R 11000,4000,ref_ref,b_40 ++S 11100,700,11900,700,600,*,RIGHT,PTIE ++S 1000,3900,1000,7000,400,*,UP,ALU1 ++S 5700,800,5700,3700,1200,*,UP,NDIF ++S 5700,700,5700,2100,400,*,DOWN,ALU1 ++S 5800,4600,6600,4600,200,*,LEFT,POLY ++S 6600,3400,6600,4600,200,*,UP,POLY ++S 6000,5000,6000,5700,200,*,DOWN,POLY ++S 6600,1300,6600,1700,200,*,DOWN,POLY ++S 6600,1700,6600,3400,200,7a,UP,NTRANS ++S 7000,1900,7000,3200,400,n3b,UP,NDIF ++S 7400,3400,7400,5300,200,*,UP,POLY ++S 6800,5300,8000,5300,200,*,LEFT,POLY ++S 8000,2000,8000,2000,400,z,LEFT,CALU1 ++S 2900,3000,8000,3000,400,*,RIGHT,ALU1 ++S 7400,1300,7400,1700,200,*,DOWN,POLY ++S 7400,1700,7400,3400,200,7b,UP,NTRANS ++S 8000,1900,8000,3200,600,*,DOWN,NDIF ++S 8000,1900,8000,3000,400,*,DOWN,ALU1 ++S 7800,3800,8600,3800,200,*,LEFT,POLY ++S 8600,1300,8600,1700,200,*,DOWN,POLY ++S 8600,1700,8600,3400,200,8b,UP,NTRANS ++S 9000,1900,9000,3200,400,n3a,UP,NDIF ++S 9400,3400,9400,5200,200,*,UP,POLY ++S 8800,5000,8800,5700,200,*,DOWN,POLY ++S 9400,1700,9400,3400,200,8a,UP,NTRANS ++S 9400,1300,9400,1700,200,*,DOWN,POLY ++S 10100,1900,10100,3200,600,*,UP,NDIF ++S 10000,700,10000,3100,400,*,DOWN,ALU1 ++S 5000,4000,5000,5000,400,b,UP,CALU1 ++S 5000,4000,5000,5000,600,*,DOWN,ALU1 ++S 2000,3000,2000,6000,400,c,DOWN,CALU1 ++S 2000,2900,2000,6100,400,*,DOWN,ALU1 ++S 1700,2000,4300,2000,400,*,RIGHT,ALU1 ++S 6400,5900,6400,9200,400,n1b,UP,PDIF ++S 8400,5900,8400,9200,400,n1a,UP,PDIF ++S 4800,600,4800,3900,200,5b,UP,NTRANS ++S 8000,5700,8000,9400,200,4b,DOWN,PTRANS ++S 6800,5700,6800,9400,200,3b,DOWN,PTRANS ++S 10000,5700,10000,9400,200,2b,DOWN,PTRANS ++S 11200,5700,11200,9400,200,1b,DOWN,PTRANS ++S 1200,600,1200,3900,200,5a,UP,NTRANS ++S 8800,5700,8800,9400,200,4a,DOWN,PTRANS ++S 6000,5700,6000,9400,200,3a,DOWN,PTRANS ++S 4800,5700,4800,9400,200,2a,DOWN,PTRANS ++S 1200,5700,1200,9400,200,1a,DOWN,PTRANS ++S 3600,1700,3600,3400,200,4c,UP,NTRANS ++S 2400,1700,2400,3400,200,3c,UP,NTRANS ++S 3600,5700,3600,9400,200,2c,DOWN,PTRANS ++S 2400,5700,2400,9400,200,1c,DOWN,PTRANS ++S 11200,9400,11200,9700,200,*,DOWN,POLY ++S 10000,9400,10000,9700,200,*,DOWN,POLY ++S 8800,9400,8800,9700,200,*,DOWN,POLY ++S 8000,9400,8000,9700,200,*,DOWN,POLY ++S 6800,9400,6800,9700,200,*,DOWN,POLY ++S 6000,9400,6000,9700,200,*,DOWN,POLY ++S 4800,9400,4800,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 1200,300,1200,600,200,*,DOWN,POLY ++S 3600,1300,3600,1700,200,*,DOWN,POLY ++S 4800,300,4800,600,200,*,DOWN,POLY ++S 600,700,600,3100,400,*,DOWN,ALU1 ++S 11800,6900,11800,9300,400,*,UP,ALU1 ++S 10600,6900,10600,8000,400,*,DOWN,ALU1 ++S 1700,8000,10600,8000,400,*,RIGHT,ALU1 ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 600,5900,600,9200,600,*,DOWN,PDIF ++S 10600,5900,10600,9200,600,*,UP,PDIF ++S 9400,5900,9400,9200,600,*,UP,PDIF ++S 7400,5900,7400,9200,600,*,UP,PDIF ++S 5400,5900,5400,9200,600,*,UP,PDIF ++S 4200,5900,4200,9200,600,*,UP,PDIF ++S 1800,5900,1800,9200,600,*,DOWN,PDIF ++S 2400,3400,2400,5700,200,*,DOWN,POLY ++S 3600,3400,3600,5700,200,*,DOWN,POLY ++S 1200,3900,1200,5700,200,*,DOWN,POLY ++S 4800,5300,6200,5300,200,*,RIGHT,POLY ++S 10000,5200,10000,5700,200,*,DOWN,POLY ++S 11200,5200,11200,5700,200,*,DOWN,POLY ++S 10000,5200,11200,5200,200,*,LEFT,POLY ++S 11900,5900,11900,9200,600,*,DOWN,PDIF ++S 3000,5900,3000,9200,1000,*,UP,PDIF ++S 4400,800,4400,3700,400,*,DOWN,NDIF ++S 4200,1900,4200,3200,600,*,UP,NDIF ++S 1600,800,1600,3700,400,*,UP,NDIF ++S 1800,1900,1800,3200,600,*,UP,NDIF ++S 600,800,600,3700,600,*,UP,NDIF ++S 3000,1900,3000,3200,600,*,DOWN,NDIF ++S 9000,4000,9000,4000,400,b,LEFT,CALU1 ++S 8000,4000,8000,4000,400,b,LEFT,CALU1 ++S 7000,4000,7000,4000,400,b,LEFT,CALU1 ++S 6000,4000,6000,4000,400,b,LEFT,CALU1 ++S 9000,5000,9000,7000,600,*,UP,ALU1 ++S 9000,5000,9000,7000,400,a,UP,CALU1 ++S 6000,5000,6000,5000,400,a,LEFT,CALU1 ++S 8000,5000,8000,5000,400,a,LEFT,CALU1 ++S 7000,5000,7000,5000,400,a,LEFT,CALU1 ++S 5900,5000,9000,5000,400,*,RIGHT,ALU1 ++S 8000,7000,8000,7000,400,a,LEFT,CALU1 ++S 7000,7000,7000,7000,400,a,LEFT,CALU1 ++S 6000,7000,6000,7000,400,a,LEFT,CALU1 ++S 5000,7000,5000,7000,400,a,LEFT,CALU1 ++S 4000,7000,4000,7000,400,a,LEFT,CALU1 ++S 3000,7000,3000,7000,400,a,LEFT,CALU1 ++S 2000,7000,2000,7000,400,a,LEFT,CALU1 ++S 2900,6000,7500,6000,400,*,RIGHT,ALU1 ++S 5000,6000,5000,6000,400,z,LEFT,CALU1 ++S 6000,6000,6000,6000,400,z,LEFT,CALU1 ++S 7000,6000,7000,6000,400,z,LEFT,CALU1 ++S 0,5000,13000,5000,10000,cgi2_x2,LEFT,TALU8 ++S 0,2200,13000,2200,5200,*,LEFT,PWELL ++S 0,7600,13000,7600,5600,*,LEFT,NWELL ++S 0,600,13000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,13000,9400,1200,vdd,RIGHT,CALU1 ++S 5000,3000,5000,3000,400,z,LEFT,CALU1 ++S 3000,6000,3000,6000,400,z,LEFT,CALU1 ++S 3000,3000,3000,3000,400,z,LEFT,CALU1 ++S 6000,3000,6000,3000,400,z,LEFT,CALU1 ++S 7000,3000,7000,3000,400,z,LEFT,CALU1 ++S 4000,3000,4000,6000,400,*,DOWN,ALU1 ++S 4000,3000,4000,6000,400,z,DOWN,CALU1 ++S 3000,5000,3000,5000,400,c,LEFT,CALU1 ++S 2400,5000,3600,5000,600,*,RIGHT,POLY ++S 2000,5000,3100,5000,400,*,LEFT,ALU1 ++S 1000,7000,9000,7000,400,*,RIGHT,ALU1 ++S 2400,1300,2400,1700,200,*,DOWN,POLY ++S 11000,3000,11000,5000,400,b,DOWN,CALU1 ++S 11000,2900,11000,5100,400,*,DOWN,ALU1 ++S 10000,4000,10000,4000,400,b,LEFT,CALU1 ++S 4900,4000,11000,4000,400,*,RIGHT,ALU1 ++S 1000,4000,1000,6000,400,a,UP,CALU1 ++V 12000,700,CONT_BODY_P,* ++V 11000,700,CONT_BODY_P,* ++V 5700,1000,CONT_DIF_N,* ++V 5700,2000,CONT_DIF_N,* ++V 7600,4000,CONT_POLY,* ++V 8000,2800,CONT_DIF_N,* ++V 8000,2000,CONT_DIF_N,* ++V 10000,3000,CONT_DIF_N,* ++V 10000,2000,CONT_DIF_N,* ++V 1800,2000,CONT_DIF_N,n4 ++V 9400,9000,CONT_DIF_P,* ++V 600,3000,CONT_DIF_N,* ++V 600,2000,CONT_DIF_N,* ++V 11800,7000,CONT_DIF_P,* ++V 10600,7800,CONT_DIF_P,n2 ++V 10600,7000,CONT_DIF_P,n2 ++V 600,8000,CONT_DIF_P,* ++V 5000,4500,CONT_POLY,* ++V 9000,5000,CONT_POLY,* ++V 6000,5000,CONT_POLY,* ++V 3000,6000,CONT_DIF_P,* ++V 11800,9000,CONT_DIF_P,* ++V 11800,8000,CONT_DIF_P,* ++V 7400,6000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,n2 ++V 5400,9000,CONT_DIF_P,* ++V 1800,8000,CONT_DIF_P,n2 ++V 4200,2000,CONT_DIF_N,n4 ++V 3000,3000,CONT_DIF_N,* ++V 600,1000,CONT_DIF_N,* ++V 600,9000,CONT_DIF_P,* ++V 3000,5000,CONT_POLY,* ++V 1000,5000,CONT_POLY,* ++V 11000,5000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgi2_x2.vbe b/alliance/src/cells/src/msxlib/cgi2_x2.vbe +new file mode 100644 +index 0000000..f45887b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgi2_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 13000; ++ CONSTANT cin_a : NATURAL := 24; ++ CONSTANT cin_b : NATURAL := 21; ++ CONSTANT cin_c : NATURAL := 11; ++ CONSTANT rdown_a_z : NATURAL := 1090; ++ CONSTANT rdown_b_z : NATURAL := 1100; ++ CONSTANT rdown_c_z : NATURAL := 1100; ++ CONSTANT rup_a_z : NATURAL := 1570; ++ CONSTANT rup_b_z : NATURAL := 1580; ++ CONSTANT rup_c_z : NATURAL := 1580; ++ CONSTANT tphl_c_z : NATURAL := 52; ++ CONSTANT tphl_b_z : NATURAL := 58; ++ CONSTANT tplh_a_z : NATURAL := 77; ++ CONSTANT tplh_c_z : NATURAL := 57; ++ CONSTANT tplh_b_z : NATURAL := 70; ++ CONSTANT tphl_a_z : NATURAL := 58; ++ CONSTANT transistors : NATURAL := 18 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgi2_x2; ++ ++ARCHITECTURE behaviour_data_flow OF cgi2_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgi2_x2" ++ SEVERITY WARNING; ++ z <= not((b or (a and c)) and (a or c)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgi2a_x05.ap b/alliance/src/cells/src/msxlib/cgi2a_x05.ap +new file mode 100644 +index 0000000..d4dd197 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2a_x05.ap +@@ -0,0 +1,138 @@ ++V ALLIANCE : 6 ++H cgi2a_x05,P, 8/ 8/2014,100 ++A 0,0,8000,10000 ++R 7000,7000,ref_ref,a_70 ++R 6000,7000,ref_ref,a_70 ++R 6000,6000,ref_ref,a_60 ++R 6000,5000,ref_ref,a_50 ++R 5000,7000,ref_ref,c_70 ++R 4000,5000,ref_ref,c_50 ++R 5000,6000,ref_ref,c_60 ++R 3000,3000,ref_ref,z_30 ++R 4000,7000,ref_ref,z_70 ++R 3000,4000,ref_ref,z_40 ++R 3000,5000,ref_ref,z_50 ++R 3000,6000,ref_ref,z_60 ++R 4000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,b_40 ++R 2000,5000,ref_ref,b_50 ++R 1000,5000,ref_ref,b_50 ++R 1000,6000,ref_ref,b_60 ++R 5000,5000,ref_ref,c_50 ++R 4000,3000,ref_ref,z_30 ++S 4100,700,4900,700,600,*,LEFT,PTIE ++S 1100,9300,1900,9300,600,*,LEFT,NTIE ++S 1400,1300,1400,1700,200,*,DOWN,POLY ++S 1400,2600,1400,5200,200,*,UP,POLY ++S 1400,1700,1400,2600,200,3b,UP,NTRANS ++S 1000,1900,1000,2400,400,*,DOWN,NDIF ++S 2400,4800,2400,6300,200,*,UP,POLY ++S 1800,5000,2400,5000,600,*,RIGHT,POLY ++S 6800,3800,6800,5700,200,*,DOWN,POLY ++S 5600,3700,5600,6300,200,*,UP,POLY ++S 4400,5100,4400,6300,200,*,DOWN,POLY ++S 3200,4000,3200,6300,200,*,UP,POLY ++S 6400,700,6400,1500,400,*,UP,ALU1 ++S 6300,1300,6300,3500,400,*,UP,NDIF ++S 6800,2000,6800,2400,200,*,DOWN,POLY ++S 7400,3300,7400,6100,400,*,UP,ALU1 ++S 6800,2400,6800,3700,200,2a,UP,NTRANS ++S 7200,2600,7200,3500,400,*,UP,NDIF ++S 2600,2000,2600,2400,200,*,DOWN,POLY ++S 3400,2000,3400,2400,200,*,DOWN,POLY ++S 4600,2000,4600,2400,200,*,DOWN,POLY ++S 5800,2000,5800,2400,200,*,DOWN,POLY ++S 700,2000,5300,2000,400,*,RIGHT,ALU1 ++S 5200,2000,5200,2700,600,*,UP,ALU1 ++S 2600,2400,2600,3300,200,4b,UP,NTRANS ++S 3000,2600,3000,3100,600,n3,UP,NDIF ++S 3400,2400,3400,3300,200,5a,UP,NTRANS ++S 4000,2600,4000,3100,1000,*,UP,NDIF ++S 5800,2400,5800,3300,200,6a,UP,NTRANS ++S 4600,2400,4600,3300,200,2c,UP,NTRANS ++S 5200,2600,5200,3100,1000,*,UP,NDIF ++S 6200,7900,6200,9300,400,*,UP,ALU1 ++S 6200,5900,6200,8100,600,*,DOWN,PDIF ++S 6000,4800,6000,7100,400,*,DOWN,ALU1 ++S 6000,5000,6000,7000,400,a,DOWN,CALU1 ++S 7000,7000,7000,7000,400,a,LEFT,CALU1 ++S 6000,7000,7000,7000,600,*,LEFT,ALU1 ++S 4000,6000,4000,7000,400,z,UP,CALU1 ++S 2000,5000,2000,5000,400,b,LEFT,CALU1 ++S 1000,4000,1000,6000,400,b,DOWN,CALU1 ++S 3400,3300,3400,4100,200,*,UP,POLY ++S 5800,3300,5800,4100,200,*,UP,POLY ++S 4600,3300,4600,5100,200,*,UP,POLY ++S 3000,2900,3000,6000,400,*,UP,ALU1 ++S 3000,3000,4100,3000,400,*,RIGHT,ALU1 ++S 3000,2900,4100,2900,400,*,RIGHT,ALU1 ++S 2000,900,2000,3100,600,*,UP,NDIF ++S 6000,4900,6600,4900,600,*,LEFT,ALU1 ++S 5000,4900,5000,7100,400,*,DOWN,ALU1 ++S 4000,5000,5000,5000,600,*,LEFT,ALU1 ++S 5000,5000,5000,7000,400,c,UP,CALU1 ++S 2800,8000,5100,8000,400,*,RIGHT,ALU1 ++S 3800,3900,7400,3900,600,*,RIGHT,ALU1 ++S 1800,7900,1800,9300,400,*,DOWN,ALU1 ++S 2800,7000,2800,8000,400,*,UP,ALU1 ++S 600,7000,600,8100,400,*,DOWN,ALU1 ++S 600,7000,2800,7000,400,*,RIGHT,ALU1 ++S 600,7300,600,7900,600,*,DOWN,PDIF ++S 1000,3900,1000,6100,400,*,DOWN,ALU1 ++S 1000,5000,2000,5000,600,*,LEFT,ALU1 ++S 0,5000,8000,5000,10000,cgi2a_x05,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 3000,3000,3000,6000,400,z,DOWN,CALU1 ++S 3900,6000,3900,7100,600,*,UP,ALU1 ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 4000,3000,4000,3000,400,z,LEFT,CALU1 ++S 7200,5900,7200,8100,400,*,DOWN,PDIF ++S 6800,5700,6800,8300,200,1a,DOWN,PTRANS ++S 6200,5900,6200,8100,600,*,DOWN,PDIF ++S 5600,6300,5600,8300,200,4a,DOWN,PTRANS ++S 5000,6500,5000,8100,1000,*,UP,PDIF ++S 4400,6300,4400,8300,200,1c,DOWN,PTRANS ++S 3200,6300,3200,8300,200,3a,DOWN,PTRANS ++S 3800,6500,3800,8100,1000,*,UP,PDIF ++S 1800,6500,1800,8100,1000,*,UP,PDIF ++S 1200,6300,1200,8300,200,1b,DOWN,PTRANS ++S 2400,6300,2400,8300,200,2b,DOWN,PTRANS ++S 800,6500,800,8100,400,*,UP,PDIF ++S 2800,6500,2800,8100,600,n1,DOWN,PDIF ++S 3200,8300,3200,8700,200,*,DOWN,POLY ++S 4400,8300,4400,8700,200,*,DOWN,POLY ++S 5600,8300,5600,8700,200,*,DOWN,POLY ++S 6800,8300,6800,8700,200,*,DOWN,POLY ++S 1200,8300,1200,8700,200,*,DOWN,POLY ++S 2400,8300,2400,8700,200,*,DOWN,POLY ++S 4000,5000,4000,5000,400,c,LEFT,CALU1 ++S 2600,3300,2600,5200,200,*,UP,POLY ++S 1200,4800,1200,6300,200,*,UP,POLY ++S 1200,5000,2600,5000,600,*,LEFT,POLY ++S 3200,3900,4000,3900,600,*,LEFT,POLY ++V 5000,700,CONT_BODY_P,* ++V 4000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 800,2000,CONT_DIF_N,n4 ++V 1800,5000,CONT_POLY,* ++V 6400,1400,CONT_DIF_N,* ++V 7400,3400,CONT_DIF_N,an ++V 5200,2700,CONT_DIF_N,n4 ++V 6200,8000,CONT_DIF_P,* ++V 5600,3900,CONT_POLY,an ++V 4000,3000,CONT_DIF_N,* ++V 5000,8000,CONT_DIF_P,n2 ++V 3800,3900,CONT_POLY,an ++V 2000,1000,CONT_DIF_N,* ++V 6600,4900,CONT_POLY,* ++V 1800,8000,CONT_DIF_P,* ++V 3800,7000,CONT_DIF_P,* ++V 600,7200,CONT_DIF_P,n2 ++V 600,8000,CONT_DIF_P,n2 ++V 7400,6000,CONT_DIF_P,an ++V 4600,5100,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgi2a_x05.vbe b/alliance/src/cells/src/msxlib/cgi2a_x05.vbe +new file mode 100644 +index 0000000..2695f96 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2a_x05.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgi2a_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT cin_c : NATURAL := 4; ++ CONSTANT rdown_a_z : NATURAL := 4130; ++ CONSTANT rdown_b_z : NATURAL := 4120; ++ CONSTANT rdown_c_z : NATURAL := 4110; ++ CONSTANT rup_a_z : NATURAL := 5840; ++ CONSTANT rup_b_z : NATURAL := 5820; ++ CONSTANT rup_c_z : NATURAL := 5850; ++ CONSTANT tphl_c_z : NATURAL := 54; ++ CONSTANT tphl_b_z : NATURAL := 62; ++ CONSTANT tphh_a_z : NATURAL := 103; ++ CONSTANT tplh_c_z : NATURAL := 59; ++ CONSTANT tplh_b_z : NATURAL := 81; ++ CONSTANT tpll_a_z : NATURAL := 107; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgi2a_x05; ++ ++ARCHITECTURE behaviour_data_flow OF cgi2a_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgi2a_x05" ++ SEVERITY WARNING; ++ z <= not((not(a) or (b and c)) and (b or c)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgi2a_x1.ap b/alliance/src/cells/src/msxlib/cgi2a_x1.ap +new file mode 100644 +index 0000000..791922e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2a_x1.ap +@@ -0,0 +1,132 @@ ++V ALLIANCE : 6 ++H cgi2a_x1,P, 8/ 8/2014,100 ++A 0,0,8000,10000 ++R 4000,5000,ref_ref,z_50 ++R 4000,4000,ref_ref,z_40 ++R 6000,7000,ref_ref,a_70 ++R 6000,6000,ref_ref,a_60 ++R 6000,5000,ref_ref,a_50 ++R 5000,7000,ref_ref,c_70 ++R 5000,6000,ref_ref,c_60 ++R 3000,6000,ref_ref,z_60 ++R 4000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,b_40 ++R 2000,5000,ref_ref,b_50 ++R 1000,5000,ref_ref,b_50 ++R 1000,6000,ref_ref,b_60 ++R 5000,5000,ref_ref,c_50 ++R 4000,3000,ref_ref,z_30 ++R 7000,7000,ref_ref,a_70 ++R 4000,7000,ref_ref,c_70 ++S 4000,7000,4000,7000,400,c,LEFT,CALU1 ++S 3800,3000,4000,3000,600,*,RIGHT,ALU1 ++S 3000,6000,3000,6000,400,z,LEFT,CALU1 ++S 4000,3000,4000,6000,400,z,DOWN,CALU1 ++S 4000,2900,4000,6000,400,*,UP,ALU1 ++S 5300,3900,7400,3900,400,*,RIGHT,ALU1 ++S 3200,500,3200,1500,200,*,DOWN,POLY ++S 5600,500,5600,1500,200,*,DOWN,POLY ++S 3200,500,5600,500,200,*,RIGHT,POLY ++S 2000,5000,2000,5000,400,b,LEFT,CALU1 ++S 1000,4000,1000,6000,400,b,DOWN,CALU1 ++S 5000,5000,5000,7000,400,c,UP,CALU1 ++S 2800,8000,5100,8000,400,*,RIGHT,ALU1 ++S 1800,7900,1800,9300,400,*,DOWN,ALU1 ++S 2800,7000,2800,8000,400,*,UP,ALU1 ++S 600,7000,600,8100,400,*,DOWN,ALU1 ++S 600,7000,2800,7000,400,*,RIGHT,ALU1 ++S 5600,9400,5600,9700,200,*,DOWN,POLY ++S 4400,9400,4400,9700,200,*,DOWN,POLY ++S 3200,9400,3200,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 1800,5700,1800,9200,1000,*,UP,PDIF ++S 3800,5700,3800,9200,1000,*,UP,PDIF ++S 5000,5700,5000,9200,1000,*,UP,PDIF ++S 800,5700,800,9200,400,*,UP,PDIF ++S 600,7300,600,7900,600,*,DOWN,PDIF ++S 2800,5700,2800,9200,600,n1,DOWN,PDIF ++S 1000,3900,1000,6100,400,*,DOWN,ALU1 ++S 1000,5000,2000,5000,600,*,LEFT,ALU1 ++S 0,5000,8000,5000,10000,cgi2a_x1,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 6200,5700,6200,9200,600,*,DOWN,PDIF ++S 7200,5700,7200,9200,400,*,DOWN,PDIF ++S 6800,9400,6800,9700,200,*,DOWN,POLY ++S 6800,5500,6800,9400,200,1a,DOWN,PTRANS ++S 1200,5500,1200,9400,200,1b,DOWN,PTRANS ++S 2400,5500,2400,9400,200,2b,DOWN,PTRANS ++S 4400,5500,4400,9400,200,1c,DOWN,PTRANS ++S 3200,5500,3200,9400,200,3a,DOWN,PTRANS ++S 5600,5500,5600,9400,200,4a,DOWN,PTRANS ++S 7000,7000,7000,7000,400,a,LEFT,CALU1 ++S 6000,7000,7000,7000,600,*,LEFT,ALU1 ++S 6000,5000,6000,7000,400,a,DOWN,CALU1 ++S 6000,4800,6000,7100,400,*,DOWN,ALU1 ++S 6200,7900,6200,9300,400,*,UP,ALU1 ++S 4000,7000,5000,7000,600,*,LEFT,ALU1 ++S 600,2300,600,2900,600,*,UP,NDIF ++S 1200,4900,2400,4900,600,*,RIGHT,POLY ++S 2400,1100,2400,1500,200,*,DOWN,POLY ++S 2400,1500,2400,3300,200,4b,UP,NTRANS ++S 2400,3300,2400,5500,200,*,UP,POLY ++S 2800,1700,2800,3100,600,n3,UP,NDIF ++S 3200,1500,3200,3300,200,5a,UP,NTRANS ++S 3200,3300,3200,5500,200,*,UP,POLY ++S 3800,1700,3800,3100,1000,*,UP,NDIF ++S 4400,1500,4400,3300,200,2c,UP,NTRANS ++S 4400,1100,4400,1500,200,*,DOWN,POLY ++S 4400,3300,4400,5500,200,*,DOWN,POLY ++S 5000,1700,5000,3100,1000,*,UP,NDIF ++S 5600,1500,5600,3300,200,6a,UP,NTRANS ++S 5000,2000,5000,3100,400,*,UP,ALU1 ++S 6800,1700,6800,2100,200,*,DOWN,POLY ++S 6800,2100,6800,3900,200,2a,UP,NTRANS ++S 7200,2300,7200,3700,400,*,UP,NDIF ++S 7400,3000,7400,3610,600,*,DOWN,NDIF ++S 7400,2700,7400,5900,400,*,UP,ALU1 ++S 6800,3900,6800,5500,200,*,DOWN,POLY ++S 5600,3300,5600,5500,200,*,UP,POLY ++S 6200,1700,6200,3700,600,*,UP,NDIF ++S 6200,700,6200,3100,400,*,DOWN,ALU1 ++S 6000,4900,6400,4900,600,*,LEFT,ALU1 ++S 3000,2000,5000,2000,400,*,RIGHT,ALU1 ++S 600,3100,3000,3100,400,*,LEFT,ALU1 ++S 3000,2000,3000,3100,400,*,UP,ALU1 ++S 600,2100,600,3100,400,*,DOWN,ALU1 ++S 1800,700,1800,2100,400,*,DOWN,ALU1 ++S 800,1700,800,3100,400,*,DOWN,NDIF ++S 1200,1500,1200,3300,200,3b,UP,NTRANS ++S 1200,1100,1200,1500,200,*,DOWN,POLY ++S 1800,1700,1800,3100,600,*,UP,NDIF ++S 1200,3300,1200,5500,200,*,UP,POLY ++S 4900,4800,4900,7100,600,*,DOWN,ALU1 ++V 7000,700,CONT_BODY_P,* ++V 5000,8000,CONT_DIF_P,n2 ++V 1800,4900,CONT_POLY,* ++V 3800,6000,CONT_DIF_P,* ++V 1800,8000,CONT_DIF_P,* ++V 600,7200,CONT_DIF_P,n2 ++V 600,8000,CONT_DIF_P,n2 ++V 6200,9000,CONT_DIF_P,* ++V 1800,9000,CONT_DIF_P,* ++V 7400,5800,CONT_DIF_P,an ++V 6200,8000,CONT_DIF_P,* ++V 4800,4900,CONT_POLY,* ++V 600,3000,CONT_DIF_N,n4 ++V 600,2200,CONT_DIF_N,n4 ++V 3800,3000,CONT_DIF_N,* ++V 5000,3000,CONT_DIF_N,n4 ++V 5000,2200,CONT_DIF_N,n4 ++V 5400,3900,CONT_POLY,an ++V 7400,3600,CONT_DIF_N,an ++V 7400,2800,CONT_DIF_N,an ++V 6200,3000,CONT_DIF_N,* ++V 6200,2000,CONT_DIF_N,* ++V 6400,4900,CONT_POLY,* ++V 1800,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgi2a_x1.vbe b/alliance/src/cells/src/msxlib/cgi2a_x1.vbe +new file mode 100644 +index 0000000..4c4a0aa +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2a_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgi2a_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT cin_b : NATURAL := 12; ++ CONSTANT cin_c : NATURAL := 6; ++ CONSTANT rdown_a_z : NATURAL := 2060; ++ CONSTANT rdown_b_z : NATURAL := 2060; ++ CONSTANT rdown_c_z : NATURAL := 2050; ++ CONSTANT rup_a_z : NATURAL := 3000; ++ CONSTANT rup_b_z : NATURAL := 2980; ++ CONSTANT rup_c_z : NATURAL := 3000; ++ CONSTANT tphl_c_z : NATURAL := 50; ++ CONSTANT tphl_b_z : NATURAL := 57; ++ CONSTANT tphh_a_z : NATURAL := 103; ++ CONSTANT tplh_c_z : NATURAL := 56; ++ CONSTANT tplh_b_z : NATURAL := 76; ++ CONSTANT tpll_a_z : NATURAL := 105; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgi2a_x1; ++ ++ARCHITECTURE behaviour_data_flow OF cgi2a_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgi2a_x1" ++ SEVERITY WARNING; ++ z <= not((not(a) or (b and c)) and (b or c)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgi2a_x2.ap b/alliance/src/cells/src/msxlib/cgi2a_x2.ap +new file mode 100644 +index 0000000..8992b3b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2a_x2.ap +@@ -0,0 +1,238 @@ ++V ALLIANCE : 6 ++H cgi2a_x2,P, 8/ 8/2014,100 ++A 0,0,15000,10000 ++R 14000,6000,ref_ref,a_60 ++R 14000,4000,ref_ref,a_40 ++R 14000,5000,ref_ref,a_50 ++R 13000,5000,ref_ref,a_50 ++R 1000,5000,ref_ref,b_50 ++R 1000,6000,ref_ref,b_60 ++R 1000,7000,ref_ref,b_70 ++R 2000,7000,ref_ref,b_70 ++R 3000,7000,ref_ref,b_70 ++R 4000,7000,ref_ref,b_70 ++R 5000,7000,ref_ref,b_70 ++R 6000,7000,ref_ref,b_70 ++R 7000,7000,ref_ref,b_70 ++R 8000,7000,ref_ref,b_70 ++R 9000,7000,ref_ref,b_70 ++R 9000,6000,ref_ref,b_60 ++R 9000,5000,ref_ref,b_50 ++R 8000,5000,ref_ref,b_50 ++R 7000,5000,ref_ref,b_50 ++R 6000,5000,ref_ref,b_50 ++R 2000,4000,ref_ref,c_40 ++R 3000,5000,ref_ref,c_50 ++R 2000,6000,ref_ref,c_60 ++R 2000,5000,ref_ref,c_50 ++R 7000,6000,ref_ref,z_60 ++R 6000,6000,ref_ref,z_60 ++R 5000,6000,ref_ref,z_60 ++R 4000,6000,ref_ref,z_60 ++R 3000,6000,ref_ref,z_60 ++R 4000,5000,ref_ref,z_50 ++R 4000,4000,ref_ref,z_40 ++R 4000,3000,ref_ref,z_30 ++R 3000,3000,ref_ref,z_30 ++R 5000,3000,ref_ref,z_30 ++R 6000,3000,ref_ref,z_30 ++R 7000,3000,ref_ref,z_30 ++S 13100,9300,13900,9300,600,*,RIGHT,NTIE ++S 11100,700,11900,700,600,*,RIGHT,PTIE ++S 13600,1900,13600,3400,200,4i,UP,NTRANS ++S 12400,1900,12400,3400,200,3i,UP,NTRANS ++S 11200,5100,11200,5700,200,*,DOWN,POLY ++S 10000,5100,10000,5700,200,*,DOWN,POLY ++S 13000,5000,14000,5000,600,*,LEFT,ALU1 ++S 10000,5100,11200,5100,200,*,LEFT,POLY ++S 12400,4900,13600,4900,600,*,LEFT,POLY ++S 11800,5700,11800,9200,600,*,DOWN,PDIF ++S 12400,8500,12400,8900,200,*,UP,POLY ++S 14300,5700,14300,8300,600,*,DOWN,PDIF ++S 13600,5500,13600,8500,200,2i,DOWN,PTRANS ++S 13000,5700,13000,8300,600,*,UP,PDIF ++S 12400,5500,12400,8500,200,1i,DOWN,PTRANS ++S 13600,1500,13600,1900,200,*,DOWN,POLY ++S 12400,1500,12400,1900,200,*,DOWN,POLY ++S 11800,700,11800,3100,400,*,DOWN,ALU1 ++S 9400,700,9400,3100,400,*,DOWN,ALU1 ++S 11600,6000,13000,6000,400,*,RIGHT,ALU1 ++S 11600,4000,11600,6000,400,*,DOWN,ALU1 ++S 14000,3900,14000,6100,400,*,UP,ALU1 ++S 13000,5000,13000,5000,400,a,LEFT,CALU1 ++S 14000,4000,14000,6000,400,a,DOWN,CALU1 ++S 12400,3400,12400,5700,200,*,DOWN,POLY ++S 13600,3400,13600,5700,200,*,DOWN,POLY ++S 14200,700,14200,3100,400,*,DOWN,ALU1 ++S 13000,2100,13000,3200,600,*,UP,NDIF ++S 14300,2100,14300,3200,600,*,UP,NDIF ++S 11700,2100,11700,3200,600,*,UP,NDIF ++S 4900,4000,13000,4000,400,*,RIGHT,ALU1 ++S 13000,6000,13000,7100,400,*,UP,ALU1 ++S 6000,5000,6000,5000,400,b,LEFT,CALU1 ++S 7000,5000,7000,5000,400,b,LEFT,CALU1 ++S 8000,5000,8000,5000,400,b,LEFT,CALU1 ++S 8000,7000,8000,7000,400,b,LEFT,CALU1 ++S 9000,5000,9000,7000,400,b,UP,CALU1 ++S 7000,7000,7000,7000,400,b,LEFT,CALU1 ++S 6000,7000,6000,7000,400,b,LEFT,CALU1 ++S 5000,7000,5000,7000,400,b,LEFT,CALU1 ++S 4000,7000,4000,7000,400,b,LEFT,CALU1 ++S 3000,7000,3000,7000,400,b,LEFT,CALU1 ++S 2000,7000,2000,7000,400,b,LEFT,CALU1 ++S 1000,5000,1000,7000,400,b,UP,CALU1 ++S 14200,6900,14200,9300,400,*,UP,ALU1 ++S 0,5000,15000,5000,10000,cgi2a_x2,LEFT,TALU8 ++S 0,2200,15000,2200,5200,*,LEFT,PWELL ++S 0,7600,15000,7600,5600,*,LEFT,NWELL ++S 0,600,15000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,15000,9400,1200,vdd,RIGHT,CALU1 ++S 2400,1300,2400,1700,200,*,DOWN,POLY ++S 1000,7000,9000,7000,400,*,RIGHT,ALU1 ++S 1000,4900,1000,7000,400,*,UP,ALU1 ++S 2000,5000,3100,5000,400,*,LEFT,ALU1 ++S 2400,5000,3600,5000,600,*,RIGHT,POLY ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 3000,5000,3000,5000,400,c,LEFT,CALU1 ++S 2000,4000,2000,6000,400,c,DOWN,CALU1 ++S 4000,3000,4000,6000,400,z,DOWN,CALU1 ++S 4000,3000,4000,6000,400,*,DOWN,ALU1 ++S 7000,3000,7000,3000,400,z,LEFT,CALU1 ++S 6000,3000,6000,3000,400,z,LEFT,CALU1 ++S 3000,3000,3000,3000,400,z,LEFT,CALU1 ++S 3000,6000,3000,6000,400,z,LEFT,CALU1 ++S 5000,3000,5000,3000,400,z,LEFT,CALU1 ++S 7000,6000,7000,6000,400,z,LEFT,CALU1 ++S 6000,6000,6000,6000,400,z,LEFT,CALU1 ++S 5000,6000,5000,6000,400,z,LEFT,CALU1 ++S 2900,6000,7500,6000,400,*,RIGHT,ALU1 ++S 5900,5000,9000,5000,400,*,RIGHT,ALU1 ++S 9000,5000,9000,7000,600,*,UP,ALU1 ++S 5400,800,5400,3700,600,*,UP,NDIF ++S 7400,1900,7400,3200,600,*,DOWN,NDIF ++S 3000,1900,3000,3200,600,*,DOWN,NDIF ++S 600,800,600,3700,600,*,UP,NDIF ++S 1800,1900,1800,3200,600,*,UP,NDIF ++S 1600,800,1600,3700,400,*,UP,NDIF ++S 4200,1900,4200,3200,600,*,UP,NDIF ++S 4400,800,4400,3700,400,*,DOWN,NDIF ++S 3000,5900,3000,9200,1000,*,UP,PDIF ++S 4800,5300,6200,5300,200,*,RIGHT,POLY ++S 8800,3400,8800,5700,200,*,DOWN,POLY ++S 8000,3400,8000,5700,200,*,DOWN,POLY ++S 6800,3400,6800,5700,200,*,DOWN,POLY ++S 6000,3400,6000,5700,200,*,DOWN,POLY ++S 1200,3900,1200,5700,200,*,DOWN,POLY ++S 3600,3400,3600,5700,200,*,DOWN,POLY ++S 2400,3400,2400,5700,200,*,DOWN,POLY ++S 5000,4000,5000,4600,600,*,DOWN,ALU1 ++S 1800,5900,1800,9200,600,*,DOWN,PDIF ++S 4200,5900,4200,9200,600,*,UP,PDIF ++S 5400,5900,5400,9200,600,*,UP,PDIF ++S 7400,5900,7400,9200,600,*,UP,PDIF ++S 9400,5900,9400,9200,600,*,UP,PDIF ++S 10600,5900,10600,9200,600,*,UP,PDIF ++S 600,5900,600,9200,600,*,DOWN,PDIF ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 1700,8000,10600,8000,400,*,RIGHT,ALU1 ++S 10600,6900,10600,8000,400,*,DOWN,ALU1 ++S 11800,6900,11800,9300,400,*,UP,ALU1 ++S 600,700,600,3100,400,*,DOWN,ALU1 ++S 1800,2000,4300,2000,400,*,RIGHT,ALU1 ++S 1800,2000,1800,3100,400,*,DOWN,ALU1 ++S 5400,700,5400,2100,400,*,DOWN,ALU1 ++S 2900,3000,7400,3000,400,*,RIGHT,ALU1 ++S 7400,1900,7400,3000,400,*,DOWN,ALU1 ++S 9500,1900,9500,3200,600,*,UP,NDIF ++S 9400,1900,9400,3200,600,*,UP,NDIF ++S 8800,1300,8800,1700,200,*,DOWN,POLY ++S 8000,1300,8000,1700,200,*,DOWN,POLY ++S 6800,1300,6800,1700,200,*,DOWN,POLY ++S 6000,1300,6000,1700,200,*,DOWN,POLY ++S 4800,300,4800,600,200,*,DOWN,POLY ++S 3600,1300,3600,1700,200,*,DOWN,POLY ++S 1200,300,1200,600,200,*,DOWN,POLY ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 4800,9400,4800,9700,200,*,DOWN,POLY ++S 6000,9400,6000,9700,200,*,DOWN,POLY ++S 6800,9400,6800,9700,200,*,DOWN,POLY ++S 8000,9400,8000,9700,200,*,DOWN,POLY ++S 8800,9400,8800,9700,200,*,DOWN,POLY ++S 10000,9400,10000,9700,200,*,DOWN,POLY ++S 11200,9400,11200,9700,200,*,DOWN,POLY ++S 2400,5700,2400,9400,200,1c,DOWN,PTRANS ++S 3600,5700,3600,9400,200,2c,DOWN,PTRANS ++S 2400,1700,2400,3400,200,3c,UP,NTRANS ++S 3600,1700,3600,3400,200,4c,UP,NTRANS ++S 1200,5700,1200,9400,200,1a,DOWN,PTRANS ++S 4800,5700,4800,9400,200,2a,DOWN,PTRANS ++S 6000,5700,6000,9400,200,3a,DOWN,PTRANS ++S 8800,5700,8800,9400,200,4a,DOWN,PTRANS ++S 1200,600,1200,3900,200,5a,UP,NTRANS ++S 6000,1700,6000,3400,200,7a,UP,NTRANS ++S 8800,1700,8800,3400,200,8a,UP,NTRANS ++S 11200,5700,11200,9400,200,1b,DOWN,PTRANS ++S 10000,5700,10000,9400,200,2b,DOWN,PTRANS ++S 6800,4000,8000,4000,600,*,RIGHT,POLY ++S 6800,5700,6800,9400,200,3b,DOWN,PTRANS ++S 8000,5700,8000,9400,200,4b,DOWN,PTRANS ++S 4800,600,4800,3900,200,5b,UP,NTRANS ++S 6800,1700,6800,3400,200,7b,UP,NTRANS ++S 8000,1700,8000,3400,200,8b,UP,NTRANS ++S 8400,5900,8400,9200,400,n1a,UP,PDIF ++S 6400,5900,6400,9200,400,n1b,UP,PDIF ++S 8400,1900,8400,3200,400,n3a,UP,NDIF ++S 6400,1900,6400,3200,400,n3b,UP,NDIF ++S 13600,8500,13600,8800,200,*,UP,POLY ++S 13000,2200,13000,4000,400,*,UP,ALU1 ++V 14000,9300,CONT_BODY_N,* ++V 13000,9300,CONT_BODY_N,* ++V 12000,700,CONT_BODY_P,* ++V 11000,700,CONT_BODY_P,* ++V 13000,6100,CONT_DIF_P,an ++V 13300,4900,CONT_POLY,* ++V 13000,2300,CONT_DIF_N,an ++V 13000,3100,CONT_DIF_N,an ++V 13000,7000,CONT_DIF_P,an ++V 11600,4900,CONT_POLY,an ++V 7400,4000,CONT_POLY,an ++V 5000,4500,CONT_POLY,an ++V 11800,3000,CONT_DIF_N,* ++V 9400,3000,CONT_DIF_N,* ++V 14200,3000,CONT_DIF_N,* ++V 11800,2200,CONT_DIF_N,* ++V 14200,2200,CONT_DIF_N,* ++V 14200,8000,CONT_DIF_P,* ++V 14200,7000,CONT_DIF_P,* ++V 1000,5000,CONT_POLY,* ++V 3000,5000,CONT_POLY,* ++V 600,9000,CONT_DIF_P,* ++V 600,1000,CONT_DIF_N,* ++V 5400,1000,CONT_DIF_N,* ++V 3000,3000,CONT_DIF_N,* ++V 4200,2000,CONT_DIF_N,n4 ++V 1800,8000,CONT_DIF_P,n2 ++V 5400,9000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,n2 ++V 7400,6000,CONT_DIF_P,* ++V 11800,8000,CONT_DIF_P,* ++V 11800,9000,CONT_DIF_P,* ++V 3000,6000,CONT_DIF_P,* ++V 6000,5000,CONT_POLY,* ++V 9000,5000,CONT_POLY,* ++V 600,8000,CONT_DIF_P,* ++V 10600,7000,CONT_DIF_P,n2 ++V 10600,7800,CONT_DIF_P,n2 ++V 11800,7000,CONT_DIF_P,* ++V 600,2000,CONT_DIF_N,* ++V 600,3000,CONT_DIF_N,* ++V 1800,3000,CONT_DIF_N,n4 ++V 1800,2200,CONT_DIF_N,n4 ++V 5400,2000,CONT_DIF_N,* ++V 7400,2000,CONT_DIF_N,* ++V 7400,2800,CONT_DIF_N,* ++V 9400,2000,CONT_DIF_N,* ++V 9400,9000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgi2a_x2.vbe b/alliance/src/cells/src/msxlib/cgi2a_x2.vbe +new file mode 100644 +index 0000000..61ab612 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgi2a_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgi2a_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 15000; ++ CONSTANT cin_a : NATURAL := 11; ++ CONSTANT cin_b : NATURAL := 24; ++ CONSTANT cin_c : NATURAL := 11; ++ CONSTANT rdown_a_z : NATURAL := 1100; ++ CONSTANT rdown_b_z : NATURAL := 1090; ++ CONSTANT rdown_c_z : NATURAL := 1100; ++ CONSTANT rup_a_z : NATURAL := 1580; ++ CONSTANT rup_b_z : NATURAL := 1570; ++ CONSTANT rup_c_z : NATURAL := 1580; ++ CONSTANT tphl_c_z : NATURAL := 51; ++ CONSTANT tphl_b_z : NATURAL := 58; ++ CONSTANT tphh_a_z : NATURAL := 103; ++ CONSTANT tplh_c_z : NATURAL := 56; ++ CONSTANT tplh_b_z : NATURAL := 77; ++ CONSTANT tpll_a_z : NATURAL := 110; ++ CONSTANT transistors : NATURAL := 22 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgi2a_x2; ++ ++ARCHITECTURE behaviour_data_flow OF cgi2a_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgi2a_x2" ++ SEVERITY WARNING; ++ z <= not((not(a) or (b and c)) and (b or c)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgn2_x1.ap b/alliance/src/cells/src/msxlib/cgn2_x1.ap +new file mode 100644 +index 0000000..f8ecadf +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgn2_x1.ap +@@ -0,0 +1,136 @@ ++V ALLIANCE : 6 ++H cgn2_x1,P, 8/ 8/2014,100 ++A 0,0,8000,10000 ++R 7000,7000,ref_ref,c_70 ++R 7000,8000,ref_ref,c_80 ++R 4000,5000,ref_ref,b_50 ++R 1000,6000,ref_ref,a_60 ++R 1000,5000,ref_ref,a_50 ++R 1000,4000,ref_ref,a_40 ++R 2000,5000,ref_ref,a_50 ++R 4000,4000,ref_ref,b_40 ++R 5000,6000,ref_ref,c_60 ++R 5000,7000,ref_ref,c_70 ++R 6000,7000,ref_ref,c_70 ++R 7000,4000,ref_ref,z_40 ++R 7000,5000,ref_ref,z_50 ++R 7000,6000,ref_ref,z_60 ++R 7000,3000,ref_ref,z_30 ++R 4000,6000,ref_ref,b_60 ++R 6000,6000,ref_ref,z_60 ++R 5000,5000,ref_ref,b_50 ++S 2800,700,3600,700,600,*,RIGHT,PTIE ++S 7100,7000,7100,8100,400,*,UP,ALU1 ++S 7000,7000,7000,8100,400,*,UP,ALU1 ++S 6200,7900,6200,9300,400,*,UP,ALU1 ++S 5000,7000,7000,7000,400,*,LEFT,ALU1 ++S 7000,7000,7000,8000,400,c,DOWN,CALU1 ++S 6800,7700,6800,8100,200,*,DOWN,POLY ++S 6200,5900,6200,9100,600,*,DOWN,PDIF ++S 7000,3000,7000,6000,400,z,DOWN,CALU1 ++S 5900,6000,7500,6000,400,*,LEFT,ALU1 ++S 6800,5700,6800,7700,200,1z,DOWN,PTRANS ++S 7200,5900,7200,7500,400,*,UP,PDIF ++S 2400,6700,2400,9300,200,2a,DOWN,PTRANS ++S 1200,6700,1200,9300,200,1a,DOWN,PTRANS ++S 5600,6700,5600,9300,200,2b,DOWN,PTRANS ++S 3200,6700,3200,9300,200,1b,DOWN,PTRANS ++S 4400,6700,4400,9300,200,1c,DOWN,PTRANS ++S 500,1900,4900,1900,400,*,RIGHT,ALU1 ++S 1000,3900,1000,6100,400,*,DOWN,ALU1 ++S 1000,4000,1000,6000,400,a,DOWN,CALU1 ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,8000,5000,10000,cgn2_x1,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 1200,5000,2400,5000,600,*,RIGHT,POLY ++S 1000,5000,2000,5000,600,*,LEFT,ALU1 ++S 3600,5000,4000,5000,600,*,LEFT,ALU1 ++S 4000,4000,4000,6000,400,b,UP,CALU1 ++S 3800,6900,3800,9100,1000,*,UP,PDIF ++S 5000,6900,5000,9100,1000,*,UP,PDIF ++S 2800,7000,3900,7000,400,*,RIGHT,ALU1 ++S 2800,3000,2800,7000,400,*,UP,ALU1 ++S 5600,9300,5600,9700,200,*,DOWN,POLY ++S 4400,9300,4400,9700,200,*,DOWN,POLY ++S 3200,9300,3200,9700,200,*,DOWN,POLY ++S 2400,9300,2400,9700,200,*,DOWN,POLY ++S 2800,6900,2800,9100,600,n1,DOWN,PDIF ++S 1800,6900,1800,9100,1000,*,UP,PDIF ++S 800,6900,800,9100,400,*,UP,PDIF ++S 1200,9300,1200,9700,200,*,DOWN,POLY ++S 4400,3800,4400,6700,200,*,UP,POLY ++S 3200,4800,3200,6700,200,*,UP,POLY ++S 2400,4800,2400,6700,200,*,UP,POLY ++S 5000,6000,5000,7000,400,c,DOWN,CALU1 ++S 4900,5900,4900,7000,600,*,UP,ALU1 ++S 4000,5000,5300,5000,600,*,RIGHT,ALU1 ++S 5600,4800,5600,6700,200,*,UP,POLY ++S 4000,3900,4000,6100,400,*,UP,ALU1 ++S 600,6900,600,8000,400,*,UP,ALU1 ++S 600,8000,5100,8000,400,*,RIGHT,ALU1 ++S 600,7100,600,7700,600,*,UP,PDIF ++S 2800,3000,5000,3000,400,*,RIGHT,ALU1 ++S 5000,4000,6200,4000,600,*,RIGHT,ALU1 ++S 5000,3000,5000,4100,400,*,UP,ALU1 ++S 7000,3000,7200,3000,600,*,LEFT,ALU1 ++S 7000,2500,7000,3100,400,*,UP,NDIF ++S 6600,2300,6600,3300,200,2z,UP,NTRANS ++S 6800,4100,6800,6700,200,*,DOWN,POLY ++S 6600,3300,6600,4200,200,*,UP,POLY ++S 7000,3000,7000,6000,400,*,DOWN,ALU1 ++S 6000,700,6000,3100,400,*,DOWN,ALU1 ++S 6600,1900,6600,2300,200,*,UP,POLY ++S 6000,2100,6000,3100,600,*,UP,NDIF ++S 5400,1500,5400,1900,200,*,DOWN,POLY ++S 5400,1900,5400,3100,200,4b,UP,NTRANS ++S 4200,1500,4200,1900,200,*,DOWN,POLY ++S 4200,1900,4200,3100,200,2c,UP,NTRANS ++S 3000,1500,3000,1900,200,*,DOWN,POLY ++S 3000,1900,3000,3100,200,3b,UP,NTRANS ++S 2200,1500,2200,1900,200,*,DOWN,POLY ++S 2200,1900,2200,3100,200,4a,UP,NTRANS ++S 3600,2100,3600,2900,600,*,UP,NDIF ++S 2600,2100,2600,2900,600,n3,UP,NDIF ++S 4800,2100,4800,2900,600,*,UP,NDIF ++S 4800,1900,4800,2200,600,*,UP,ALU1 ++S 3600,2800,3600,3000,600,*,DOWN,ALU1 ++S 1200,1900,1200,3100,200,3a,UP,NTRANS ++S 800,2100,800,2900,400,*,DOWN,NDIF ++S 600,1900,600,2200,600,*,UP,ALU1 ++S 1700,900,1700,2900,400,*,UP,NDIF ++S 1200,1600,1200,1900,200,*,DOWN,POLY ++S 1200,3100,1200,6700,200,*,UP,POLY ++S 2200,3100,2200,4700,200,*,UP,POLY ++S 3000,3100,3000,5200,200,*,UP,POLY ++S 4200,3100,4200,3900,200,*,UP,POLY ++S 5400,3100,5400,4700,200,*,UP,POLY ++S 2000,5000,2000,5000,400,a,LEFT,CALU1 ++S 5000,5000,5000,5000,400,b,LEFT,CALU1 ++S 6000,6000,6000,6000,400,z,LEFT,CALU1 ++S 6000,7000,6000,7000,400,c,LEFT,CALU1 ++V 3800,700,CONT_BODY_P,* ++V 2800,700,CONT_BODY_P,* ++V 7300,9300,CONT_BODY_N,* ++V 6200,8000,CONT_DIF_P,* ++V 7400,6000,CONT_DIF_P,* ++V 1800,9000,CONT_DIF_P,* ++V 5000,8000,CONT_DIF_P,n2 ++V 6200,9000,CONT_DIF_P,* ++V 2000,5000,CONT_POLY,* ++V 3600,5000,CONT_POLY,* ++V 3800,7000,CONT_DIF_P,zn ++V 4800,6000,CONT_POLY,* ++V 5200,5000,CONT_POLY,* ++V 600,7000,CONT_DIF_P,n2 ++V 600,7800,CONT_DIF_P,n2 ++V 6200,4000,CONT_POLY,zn ++V 6000,3000,CONT_DIF_N,* ++V 7200,3000,CONT_DIF_N,* ++V 6000,2200,CONT_DIF_N,* ++V 4800,2200,CONT_DIF_N,n4 ++V 3600,2800,CONT_DIF_N,zn ++V 600,2200,CONT_DIF_N,n4 ++V 1600,1000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgn2_x1.vbe b/alliance/src/cells/src/msxlib/cgn2_x1.vbe +new file mode 100644 +index 0000000..b86bf48 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgn2_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgn2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_a : NATURAL := 8; ++ CONSTANT cin_b : NATURAL := 9; ++ CONSTANT cin_c : NATURAL := 5; ++ CONSTANT rdown_a_z : NATURAL := 2320; ++ CONSTANT rdown_b_z : NATURAL := 2330; ++ CONSTANT rdown_c_z : NATURAL := 2340; ++ CONSTANT rup_a_z : NATURAL := 2980; ++ CONSTANT rup_b_z : NATURAL := 2970; ++ CONSTANT rup_c_z : NATURAL := 2970; ++ CONSTANT tphh_c_z : NATURAL := 95; ++ CONSTANT tpll_c_z : NATURAL := 118; ++ CONSTANT tpll_a_z : NATURAL := 134; ++ CONSTANT tphh_b_z : NATURAL := 104; ++ CONSTANT tpll_b_z : NATURAL := 132; ++ CONSTANT tphh_a_z : NATURAL := 102; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgn2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF cgn2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgn2_x1" ++ SEVERITY WARNING; ++ z <= ((b and (a or c)) or (a and c)) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgn2_x2.ap b/alliance/src/cells/src/msxlib/cgn2_x2.ap +new file mode 100644 +index 0000000..c708cbc +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgn2_x2.ap +@@ -0,0 +1,137 @@ ++V ALLIANCE : 6 ++H cgn2_x2,P, 8/ 8/2014,100 ++A 0,0,8000,10000 ++R 4000,5000,ref_ref,b_50 ++R 1000,6000,ref_ref,a_60 ++R 1000,5000,ref_ref,a_50 ++R 1000,4000,ref_ref,a_40 ++R 2000,5000,ref_ref,a_50 ++R 4000,4000,ref_ref,b_40 ++R 5000,5000,ref_ref,c_50 ++R 5000,6000,ref_ref,c_60 ++R 5000,7000,ref_ref,c_70 ++R 6000,7000,ref_ref,c_70 ++R 5000,4000,ref_ref,b_40 ++R 7000,4000,ref_ref,z_40 ++R 7000,5000,ref_ref,z_50 ++R 7000,6000,ref_ref,z_60 ++R 7000,3000,ref_ref,z_30 ++R 4000,6000,ref_ref,b_60 ++R 7000,7000,ref_ref,z_70 ++R 7000,2000,ref_ref,z_20 ++R 6000,5000,ref_ref,z_50 ++S 2800,700,3600,700,600,*,RIGHT,PTIE ++S 6800,5600,6800,9400,200,1z,DOWN,PTRANS ++S 4400,5600,4400,9400,200,1c,DOWN,PTRANS ++S 5600,5600,5600,9400,200,2b,DOWN,PTRANS ++S 3200,5600,3200,9400,200,1b,DOWN,PTRANS ++S 1200,5600,1200,9400,200,2a,DOWN,PTRANS ++S 2400,5600,2400,9400,200,1a,DOWN,PTRANS ++S 1000,3900,1000,6100,400,*,DOWN,ALU1 ++S 1000,4000,1000,6000,400,a,DOWN,CALU1 ++S 5000,7000,6100,7000,400,*,LEFT,ALU1 ++S 5000,5000,5000,7000,400,c,DOWN,CALU1 ++S 3200,9400,3200,9700,200,*,DOWN,POLY ++S 4400,9400,4400,9700,200,*,DOWN,POLY ++S 5600,9400,5600,9700,200,*,DOWN,POLY ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 6200,7900,6200,9300,400,*,UP,ALU1 ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,8000,5000,10000,cgn2_x2,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 1000,5000,2000,5000,600,*,LEFT,ALU1 ++S 3600,5000,4000,5000,600,*,LEFT,ALU1 ++S 4900,4900,4900,7000,600,*,UP,ALU1 ++S 4000,4000,4000,6000,400,b,UP,CALU1 ++S 4000,4000,4000,6100,400,*,UP,ALU1 ++S 2800,3000,6200,3000,400,*,RIGHT,ALU1 ++S 6000,700,6000,2100,400,*,DOWN,ALU1 ++S 600,2000,4900,2000,400,*,RIGHT,ALU1 ++S 7000,7100,7500,7100,400,*,LEFT,ALU1 ++S 4000,4000,5300,4000,600,*,RIGHT,ALU1 ++S 800,5800,800,9200,400,*,UP,PDIF ++S 1800,5800,1800,9200,1000,*,UP,PDIF ++S 3800,5800,3800,9200,1000,*,UP,PDIF ++S 2800,5800,2800,9200,600,n1,DOWN,PDIF ++S 5000,5800,5000,9200,1000,*,UP,PDIF ++S 6200,5800,6200,9200,600,*,DOWN,PDIF ++S 7200,5800,7200,9200,400,*,UP,PDIF ++S 6800,9400,6800,9700,200,*,DOWN,POLY ++S 2800,7000,3900,7000,400,*,RIGHT,ALU1 ++S 2800,3000,2800,7000,400,*,UP,ALU1 ++S 600,7100,600,7700,600,*,UP,PDIF ++S 600,6900,600,8000,400,*,UP,ALU1 ++S 600,8000,5100,8000,400,*,RIGHT,ALU1 ++S 1200,5000,2200,5000,600,*,RIGHT,POLY ++S 2400,5100,2400,5600,200,*,UP,POLY ++S 3200,4800,3200,5600,200,*,UP,POLY ++S 4400,3800,4400,5600,200,*,UP,POLY ++S 5600,4100,5600,5600,200,*,UP,POLY ++S 7000,2000,7200,2000,600,*,LEFT,ALU1 ++S 7000,2000,7000,7100,400,*,DOWN,ALU1 ++S 7000,2000,7000,7000,400,z,DOWN,CALU1 ++S 6200,3000,6200,3400,400,*,UP,ALU1 ++S 6800,3400,6800,5600,200,*,DOWN,POLY ++S 2200,1600,2200,3300,200,3a,UP,NTRANS ++S 1200,1600,1200,3300,200,4a,UP,NTRANS ++S 800,1800,800,3100,400,*,DOWN,NDIF ++S 2600,1800,2600,3100,600,n3,UP,NDIF ++S 3600,1800,3600,3100,1000,*,UP,NDIF ++S 4200,1600,4200,3300,200,2c,UP,NTRANS ++S 3000,1600,3000,3300,200,3b,UP,NTRANS ++S 4600,1800,4600,3100,400,*,UP,NDIF ++S 600,2000,600,3100,400,*,DOWN,ALU1 ++S 600,2300,600,2900,600,*,UP,NDIF ++S 1200,3300,1200,5500,200,*,UP,POLY ++S 2200,3300,2200,4700,200,*,UP,POLY ++S 3000,3300,3000,4900,200,*,UP,POLY ++S 4200,3300,4200,3900,200,*,UP,POLY ++S 1200,1200,1200,1600,200,*,DOWN,POLY ++S 2200,1200,2200,1600,200,*,DOWN,POLY ++S 3000,1200,3000,1600,200,*,DOWN,POLY ++S 4200,1200,4200,1600,200,*,DOWN,POLY ++S 1700,500,1700,3100,400,*,UP,NDIF ++S 2000,5000,2000,5000,400,a,LEFT,CALU1 ++S 5000,4000,5000,4000,400,b,LEFT,CALU1 ++S 6000,7000,6000,7000,400,c,LEFT,CALU1 ++S 6000,5000,6000,5000,400,z,LEFT,CALU1 ++S 5900,5000,7000,5000,400,*,LEFT,ALU1 ++S 7000,6300,7500,6300,400,*,LEFT,ALU1 ++S 7400,6200,7400,7000,600,*,UP,PDIF ++S 6600,300,6600,700,200,*,UP,POLY ++S 6600,700,6600,2600,200,2z,UP,NTRANS ++S 7000,900,7000,2400,400,*,UP,NDIF ++S 6000,900,6000,2400,600,*,UP,NDIF ++S 5400,500,5400,900,200,*,DOWN,POLY ++S 5400,900,5400,2600,200,4b,UP,NTRANS ++S 5000,1100,5000,2400,400,*,UP,NDIF ++S 5400,2600,5400,3800,200,*,UP,POLY ++S 6600,2600,6600,3500,200,*,UP,POLY ++V 3800,700,CONT_BODY_P,* ++V 2800,700,CONT_BODY_P,* ++V 1800,9000,CONT_DIF_P,* ++V 5000,8000,CONT_DIF_P,n2 ++V 6200,8000,CONT_DIF_P,* ++V 6200,9000,CONT_DIF_P,* ++V 2000,5000,CONT_POLY,* ++V 3600,5000,CONT_POLY,* ++V 4800,5000,CONT_POLY,* ++V 4800,2000,CONT_DIF_N,n4 ++V 5200,4000,CONT_POLY,* ++V 6000,2000,CONT_DIF_N,* ++V 7400,7100,CONT_DIF_P,* ++V 3600,3000,CONT_DIF_N,zn ++V 3800,7000,CONT_DIF_P,zn ++V 600,7000,CONT_DIF_P,n2 ++V 600,7800,CONT_DIF_P,n2 ++V 6200,3300,CONT_POLY,zn ++V 7200,2000,CONT_DIF_N,* ++V 600,3000,CONT_DIF_N,n4 ++V 600,2200,CONT_DIF_N,n4 ++V 1600,600,CONT_DIF_N,* ++V 7400,6300,CONT_DIF_P,* ++V 6000,1000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgn2_x2.vbe b/alliance/src/cells/src/msxlib/cgn2_x2.vbe +new file mode 100644 +index 0000000..1812601 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgn2_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgn2_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_a : NATURAL := 12; ++ CONSTANT cin_b : NATURAL := 12; ++ CONSTANT cin_c : NATURAL := 7; ++ CONSTANT rdown_a_z : NATURAL := 1220; ++ CONSTANT rdown_b_z : NATURAL := 1230; ++ CONSTANT rdown_c_z : NATURAL := 1230; ++ CONSTANT rup_a_z : NATURAL := 1560; ++ CONSTANT rup_b_z : NATURAL := 1560; ++ CONSTANT rup_c_z : NATURAL := 1560; ++ CONSTANT tphh_c_z : NATURAL := 98; ++ CONSTANT tpll_c_z : NATURAL := 120; ++ CONSTANT tpll_a_z : NATURAL := 135; ++ CONSTANT tphh_b_z : NATURAL := 106; ++ CONSTANT tpll_b_z : NATURAL := 133; ++ CONSTANT tphh_a_z : NATURAL := 105; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgn2_x2; ++ ++ARCHITECTURE behaviour_data_flow OF cgn2_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgn2_x2" ++ SEVERITY WARNING; ++ z <= ((b and (a or c)) or (a and c)) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgn2_x3.ap b/alliance/src/cells/src/msxlib/cgn2_x3.ap +new file mode 100644 +index 0000000..684e15a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgn2_x3.ap +@@ -0,0 +1,226 @@ ++V ALLIANCE : 6 ++H cgn2_x3,P, 8/ 8/2014,100 ++A 0,0,15000,10000 ++R 13000,7000,ref_ref,z_70 ++R 13000,6000,ref_ref,z_60 ++R 14000,5000,ref_ref,z_50 ++R 13000,5000,ref_ref,z_50 ++R 13000,3000,ref_ref,z_30 ++R 13000,4000,ref_ref,z_40 ++R 10000,6000,ref_ref,b_60 ++R 2000,4000,ref_ref,c_40 ++R 3000,5000,ref_ref,c_50 ++R 2000,6000,ref_ref,c_60 ++R 2000,5000,ref_ref,c_50 ++R 10000,4000,ref_ref,b_40 ++R 10000,5000,ref_ref,b_50 ++R 1000,5000,ref_ref,a_50 ++R 6000,5000,ref_ref,a_50 ++R 9000,5000,ref_ref,a_50 ++R 9000,7000,ref_ref,a_70 ++R 7000,5000,ref_ref,a_50 ++R 8000,5000,ref_ref,a_50 ++R 8000,7000,ref_ref,a_70 ++R 7000,7000,ref_ref,a_70 ++R 6000,7000,ref_ref,a_70 ++R 5000,7000,ref_ref,a_70 ++R 4000,7000,ref_ref,a_70 ++R 3000,7000,ref_ref,a_70 ++R 2000,7000,ref_ref,a_70 ++R 1000,7000,ref_ref,a_70 ++R 1000,6000,ref_ref,a_60 ++R 9000,6000,ref_ref,a_60 ++R 5000,4000,ref_ref,b_40 ++R 9000,4000,ref_ref,b_40 ++R 8000,4000,ref_ref,b_40 ++R 7000,4000,ref_ref,b_40 ++R 6000,4000,ref_ref,b_40 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 9400,700,9400,2200,400,*,DOWN,ALU1 ++S 6000,3000,6000,5700,200,*,DOWN,POLY ++S 6800,3000,6800,5700,200,*,DOWN,POLY ++S 8000,3000,8000,5700,200,*,DOWN,POLY ++S 8800,3000,8800,5700,200,*,DOWN,POLY ++S 9500,2000,9500,2800,600,*,UP,NDIF ++S 7400,2500,7400,3000,400,*,DOWN,ALU1 ++S 7400,2000,7400,2800,600,*,DOWN,NDIF ++S 8000,1800,8000,3000,200,8b,UP,NTRANS ++S 8800,1800,8800,3000,200,8a,UP,NTRANS ++S 8400,2000,8400,2800,400,n3a,UP,NDIF ++S 6800,1800,6800,3000,200,7b,UP,NTRANS ++S 6000,1800,6000,3000,200,7a,UP,NTRANS ++S 6400,2000,6400,2800,400,n3b,UP,NDIF ++S 3000,2700,3000,3000,600,*,UP,ALU1 ++S 4200,2000,4200,2800,600,*,DOWN,NDIF ++S 1800,2000,1800,2800,600,*,DOWN,NDIF ++S 5400,700,5400,2200,400,*,DOWN,ALU1 ++S 5400,2000,5400,3700,600,*,UP,NDIF ++S 4800,1800,4800,3900,200,5b,UP,NTRANS ++S 4400,2000,4400,3700,400,*,DOWN,NDIF ++S 3600,3000,3600,5700,200,*,DOWN,POLY ++S 2400,3000,2400,5700,200,*,DOWN,POLY ++S 1200,3900,1200,5700,200,*,DOWN,POLY ++S 600,2000,600,3700,600,*,UP,NDIF ++S 1800,1900,1800,2100,600,*,DOWN,ALU1 ++S 1700,1900,4300,1900,400,*,RIGHT,ALU1 ++S 1200,1800,1200,3900,200,5a,UP,NTRANS ++S 1600,2000,1600,3700,400,*,UP,NDIF ++S 4200,1900,4200,2100,600,*,DOWN,ALU1 ++S 3600,1800,3600,3000,200,4c,UP,NTRANS ++S 2400,1800,2400,3000,200,3c,UP,NTRANS ++S 3000,2000,3000,2800,600,*,DOWN,NDIF ++S 2900,3000,11000,3000,400,*,RIGHT,ALU1 ++S 11700,2400,11700,3500,600,*,UP,NDIF ++S 14300,2400,14300,3500,600,*,UP,NDIF ++S 14200,700,14200,3500,400,*,DOWN,ALU1 ++S 11800,700,11800,3500,400,*,DOWN,ALU1 ++S 13600,2200,13600,3700,200,4z,UP,NTRANS ++S 12400,2200,12400,3700,200,3z,UP,NTRANS ++S 13000,2400,13000,3500,600,*,UP,NDIF ++S 14300,5700,14300,8100,600,*,DOWN,PDIF ++S 11800,5700,11800,8100,600,*,DOWN,PDIF ++S 13100,5700,13100,8100,600,*,DOWN,PDIF ++S 13600,5500,13600,8300,200,2z,DOWN,PTRANS ++S 12400,5500,12400,8300,200,1z,DOWN,PTRANS ++S 11200,5700,11200,8300,200,1b,DOWN,PTRANS ++S 10600,5900,10600,8100,600,*,UP,PDIF ++S 9400,5900,9400,9100,600,*,UP,PDIF ++S 5400,5900,5400,9100,600,*,UP,PDIF ++S 8400,5900,8400,8100,400,n1a,UP,PDIF ++S 10000,5700,10000,8300,200,2b,DOWN,PTRANS ++S 8800,5700,8800,8300,200,4a,DOWN,PTRANS ++S 6400,5900,6400,8100,400,n1b,UP,PDIF ++S 6000,5700,6000,8300,200,3a,DOWN,PTRANS ++S 6800,5700,6800,8300,200,3b,DOWN,PTRANS ++S 8000,5700,8000,8300,200,4b,DOWN,PTRANS ++S 7400,5900,7400,8100,600,*,UP,PDIF ++S 3000,5900,3000,8100,600,*,UP,PDIF ++S 3600,5700,3600,8300,200,2c,DOWN,PTRANS ++S 4800,5700,4800,8300,200,2a,DOWN,PTRANS ++S 4200,5900,4200,8100,600,*,UP,PDIF ++S 600,5900,600,8100,600,*,DOWN,PDIF ++S 2400,5700,2400,8300,200,1c,DOWN,PTRANS ++S 1200,5700,1200,8300,200,1a,DOWN,PTRANS ++S 1800,5900,1800,8100,600,*,DOWN,PDIF ++S 14000,5000,14000,5000,400,z,LEFT,CALU1 ++S 13000,5000,14100,5000,400,*,RIGHT,ALU1 ++S 13000,3000,13000,7000,400,z,UP,CALU1 ++S 12400,4600,13600,4600,200,*,RIGHT,POLY ++S 11000,4400,12200,4400,400,*,RIGHT,ALU1 ++S 11000,3000,11000,4400,400,*,UP,ALU1 ++S 10000,4000,10000,6000,600,*,DOWN,ALU1 ++S 10000,4000,10000,6000,400,b,DOWN,CALU1 ++S 13600,3700,13600,5700,200,*,DOWN,POLY ++S 12400,3700,12400,5700,200,*,DOWN,POLY ++S 13000,2500,13000,7100,400,*,DOWN,ALU1 ++S 14200,6900,14200,9300,400,*,UP,ALU1 ++S 0,5000,15000,5000,10000,cgn2_x3,LEFT,TALU8 ++S 0,2200,15000,2200,5200,*,LEFT,PWELL ++S 0,7600,15000,7600,5600,*,LEFT,NWELL ++S 0,9400,15000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,15000,600,1200,vss,RIGHT,CALU1 ++S 1000,7000,9000,7000,400,*,RIGHT,ALU1 ++S 1000,4900,1000,7000,400,*,UP,ALU1 ++S 2000,5000,3100,5000,400,*,LEFT,ALU1 ++S 2400,5000,3600,5000,600,*,RIGHT,POLY ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 3000,5000,3000,5000,400,c,LEFT,CALU1 ++S 2000,4000,2000,6000,400,c,DOWN,CALU1 ++S 4000,3000,4000,6000,400,*,DOWN,ALU1 ++S 2900,6000,7500,6000,400,*,RIGHT,ALU1 ++S 1000,5000,1000,7000,400,a,UP,CALU1 ++S 2000,7000,2000,7000,400,a,LEFT,CALU1 ++S 3000,7000,3000,7000,400,a,LEFT,CALU1 ++S 4000,7000,4000,7000,400,a,LEFT,CALU1 ++S 5000,7000,5000,7000,400,a,LEFT,CALU1 ++S 6000,7000,6000,7000,400,a,LEFT,CALU1 ++S 7000,7000,7000,7000,400,a,LEFT,CALU1 ++S 8000,7000,8000,7000,400,a,LEFT,CALU1 ++S 5900,5000,9000,5000,400,*,RIGHT,ALU1 ++S 7000,5000,7000,5000,400,a,LEFT,CALU1 ++S 8000,5000,8000,5000,400,a,LEFT,CALU1 ++S 6000,5000,6000,5000,400,a,LEFT,CALU1 ++S 9000,5000,9000,7000,400,a,UP,CALU1 ++S 9000,5000,9000,7000,600,*,UP,ALU1 ++S 5000,4000,5000,4000,400,b,LEFT,CALU1 ++S 6000,4000,6000,4000,400,b,LEFT,CALU1 ++S 7000,4000,7000,4000,400,b,LEFT,CALU1 ++S 8000,4000,8000,4000,400,b,LEFT,CALU1 ++S 9000,4000,9000,4000,400,b,LEFT,CALU1 ++S 4900,4000,10000,4000,400,*,RIGHT,ALU1 ++S 10000,5200,11200,5200,200,*,LEFT,POLY ++S 11200,5200,11200,5700,200,*,DOWN,POLY ++S 10000,5200,10000,5700,200,*,DOWN,POLY ++S 4800,5300,6200,5300,200,*,RIGHT,POLY ++S 5000,4000,5000,4600,600,*,DOWN,ALU1 ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 1700,8000,10600,8000,400,*,RIGHT,ALU1 ++S 10600,6900,10600,8000,400,*,DOWN,ALU1 ++S 11800,6900,11800,9300,400,*,UP,ALU1 ++S 600,700,600,3100,400,*,DOWN,ALU1 ++S 6800,4000,8000,4000,600,*,RIGHT,POLY ++S 1200,8300,1200,8700,200,*,UP,POLY ++S 2400,8300,2400,8700,200,*,UP,POLY ++S 3600,8300,3600,8700,200,*,UP,POLY ++S 4800,8300,4800,8700,200,*,UP,POLY ++S 6000,8300,6000,8700,200,*,UP,POLY ++S 6800,8300,6800,8700,200,*,UP,POLY ++S 8000,8300,8000,8700,200,*,UP,POLY ++S 8800,8300,8800,8700,200,*,UP,POLY ++S 10000,8300,10000,8700,200,*,UP,POLY ++S 11200,8300,11200,8700,200,*,UP,POLY ++S 12400,8300,12400,8700,200,*,UP,POLY ++S 13600,8300,13600,8700,200,*,UP,POLY ++S 1200,1400,1200,1800,200,*,DOWN,POLY ++S 2400,1400,2400,1800,200,*,DOWN,POLY ++S 3600,1400,3600,1800,200,*,DOWN,POLY ++S 4800,1400,4800,1800,200,*,DOWN,POLY ++S 6000,1400,6000,1800,200,*,DOWN,POLY ++S 6800,1400,6800,1800,200,*,DOWN,POLY ++S 8000,1400,8000,1800,200,*,DOWN,POLY ++S 8800,1400,8800,1800,200,*,DOWN,POLY ++S 13600,1800,13600,2200,200,*,DOWN,POLY ++S 12400,1800,12400,2200,200,*,DOWN,POLY ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 9400,2100,CONT_DIF_N,* ++V 7400,2600,CONT_DIF_N,zn ++V 5400,2100,CONT_DIF_N,* ++V 600,2200,CONT_DIF_N,* ++V 1800,2100,CONT_DIF_N,n4 ++V 4200,2100,CONT_DIF_N,n4 ++V 3000,2700,CONT_DIF_N,zn ++V 14200,2600,CONT_DIF_N,* ++V 14200,3400,CONT_DIF_N,* ++V 11800,2600,CONT_DIF_N,* ++V 11800,3400,CONT_DIF_N,* ++V 7400,6000,CONT_DIF_P,zn ++V 3000,6000,CONT_DIF_P,zn ++V 12100,4400,CONT_POLY,zn ++V 13000,2600,CONT_DIF_N,* ++V 13000,3400,CONT_DIF_N,* ++V 13000,7000,CONT_DIF_P,* ++V 13000,6000,CONT_DIF_P,* ++V 14200,7000,CONT_DIF_P,* ++V 14200,8000,CONT_DIF_P,* ++V 1000,5000,CONT_POLY,* ++V 3000,5000,CONT_POLY,* ++V 1800,8000,CONT_DIF_P,n2 ++V 5400,9000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,n2 ++V 11800,8000,CONT_DIF_P,* ++V 6000,5000,CONT_POLY,* ++V 9000,5000,CONT_POLY,* ++V 10000,5000,CONT_POLY,* ++V 5000,4500,CONT_POLY,* ++V 600,8000,CONT_DIF_P,* ++V 10600,7000,CONT_DIF_P,n2 ++V 10600,7800,CONT_DIF_P,n2 ++V 11800,7000,CONT_DIF_P,* ++V 600,3000,CONT_DIF_N,* ++V 9400,9000,CONT_DIF_P,* ++V 7400,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgn2_x3.vbe b/alliance/src/cells/src/msxlib/cgn2_x3.vbe +new file mode 100644 +index 0000000..d2b043a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgn2_x3.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgn2_x3 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 15000; ++ CONSTANT cin_a : NATURAL := 18; ++ CONSTANT cin_b : NATURAL := 17; ++ CONSTANT cin_c : NATURAL := 8; ++ CONSTANT rdown_a_z : NATURAL := 770; ++ CONSTANT rdown_b_z : NATURAL := 780; ++ CONSTANT rdown_c_z : NATURAL := 780; ++ CONSTANT rup_a_z : NATURAL := 1060; ++ CONSTANT rup_b_z : NATURAL := 1060; ++ CONSTANT rup_c_z : NATURAL := 1060; ++ CONSTANT tphh_c_z : NATURAL := 102; ++ CONSTANT tpll_c_z : NATURAL := 122; ++ CONSTANT tpll_a_z : NATURAL := 138; ++ CONSTANT tphh_b_z : NATURAL := 108; ++ CONSTANT tpll_b_z : NATURAL := 134; ++ CONSTANT tphh_a_z : NATURAL := 108; ++ CONSTANT transistors : NATURAL := 22 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgn2_x3; ++ ++ARCHITECTURE behaviour_data_flow OF cgn2_x3 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgn2_x3" ++ SEVERITY WARNING; ++ z <= ((b and (a or c)) or (a and c)) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/cgn2_x4.ap b/alliance/src/cells/src/msxlib/cgn2_x4.ap +new file mode 100644 +index 0000000..9b6749f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgn2_x4.ap +@@ -0,0 +1,227 @@ ++V ALLIANCE : 6 ++H cgn2_x4,P, 8/ 8/2014,100 ++A 0,0,15000,10000 ++R 6000,4000,ref_ref,b_40 ++R 7000,4000,ref_ref,b_40 ++R 8000,4000,ref_ref,b_40 ++R 9000,4000,ref_ref,b_40 ++R 5000,4000,ref_ref,b_40 ++R 9000,6000,ref_ref,a_60 ++R 1000,6000,ref_ref,a_60 ++R 1000,7000,ref_ref,a_70 ++R 2000,7000,ref_ref,a_70 ++R 3000,7000,ref_ref,a_70 ++R 4000,7000,ref_ref,a_70 ++R 5000,7000,ref_ref,a_70 ++R 6000,7000,ref_ref,a_70 ++R 7000,7000,ref_ref,a_70 ++R 8000,7000,ref_ref,a_70 ++R 8000,5000,ref_ref,a_50 ++R 7000,5000,ref_ref,a_50 ++R 9000,7000,ref_ref,a_70 ++R 9000,5000,ref_ref,a_50 ++R 6000,5000,ref_ref,a_50 ++R 1000,5000,ref_ref,a_50 ++R 10000,5000,ref_ref,b_50 ++R 10000,4000,ref_ref,b_40 ++R 2000,5000,ref_ref,c_50 ++R 2000,6000,ref_ref,c_60 ++R 3000,5000,ref_ref,c_50 ++R 2000,4000,ref_ref,c_40 ++R 10000,6000,ref_ref,b_60 ++R 13000,4000,ref_ref,z_40 ++R 13000,3000,ref_ref,z_30 ++R 13000,5000,ref_ref,z_50 ++R 14000,5000,ref_ref,z_50 ++R 13000,6000,ref_ref,z_60 ++R 13000,7000,ref_ref,z_70 ++S 11100,700,11900,700,600,*,RIGHT,PTIE ++S 13600,9300,13600,9700,200,*,DOWN,POLY ++S 12400,9300,12400,9700,200,*,DOWN,POLY ++S 11200,8700,11200,9100,200,*,DOWN,POLY ++S 10000,8700,10000,9100,200,*,DOWN,POLY ++S 8800,8700,8800,9100,200,*,DOWN,POLY ++S 8000,8700,8000,9100,200,*,DOWN,POLY ++S 6800,8700,6800,9100,200,*,DOWN,POLY ++S 6000,8700,6000,9100,200,*,DOWN,POLY ++S 4800,8700,4800,9100,200,*,DOWN,POLY ++S 3600,8700,3600,9100,200,*,DOWN,POLY ++S 2400,8700,2400,9100,200,*,DOWN,POLY ++S 1200,8700,1200,9100,200,*,DOWN,POLY ++S 10000,5600,10000,8700,200,2b,DOWN,PTRANS ++S 11200,5600,11200,8700,200,1b,DOWN,PTRANS ++S 10600,5800,10600,8500,600,*,UP,PDIF ++S 7400,5800,7400,8500,600,*,UP,PDIF ++S 8400,5800,8400,8500,400,n1a,UP,PDIF ++S 8800,5600,8800,8700,200,4a,DOWN,PTRANS ++S 8000,5600,8000,8700,200,4b,DOWN,PTRANS ++S 6400,5800,6400,8500,400,n1b,UP,PDIF ++S 6000,5600,6000,8700,200,3a,DOWN,PTRANS ++S 6800,5600,6800,8700,200,3b,DOWN,PTRANS ++S 4800,5600,4800,8700,200,2a,DOWN,PTRANS ++S 4200,5800,4200,8500,600,*,UP,PDIF ++S 600,5800,600,8500,600,*,DOWN,PDIF ++S 1800,5800,1800,8500,600,*,DOWN,PDIF ++S 1200,5600,1200,8700,200,1a,DOWN,PTRANS ++S 3600,5600,3600,8700,200,2c,DOWN,PTRANS ++S 3000,5800,3000,8500,1000,*,UP,PDIF ++S 2400,5600,2400,8700,200,1c,DOWN,PTRANS ++S 14300,5800,14300,9100,600,*,DOWN,PDIF ++S 13600,5600,13600,9300,200,2z,DOWN,PTRANS ++S 13100,5800,13100,9100,600,*,DOWN,PDIF ++S 12400,5600,12400,9300,200,1z,DOWN,PTRANS ++S 11900,5800,11900,9100,600,*,DOWN,PDIF ++S 9400,5800,9400,9100,600,*,UP,PDIF ++S 5400,5800,5400,9100,600,*,UP,PDIF ++S 4800,5200,6200,5200,200,*,RIGHT,POLY ++S 4800,3300,4800,4000,200,*,UP,POLY ++S 8800,1500,8800,1900,200,*,DOWN,POLY ++S 8000,1500,8000,1900,200,*,DOWN,POLY ++S 6800,1500,6800,1900,200,*,DOWN,POLY ++S 6000,1500,6000,1900,200,*,DOWN,POLY ++S 8800,3300,8800,5700,200,*,DOWN,POLY ++S 8000,3300,8000,5700,200,*,DOWN,POLY ++S 6800,3300,6800,5700,200,*,DOWN,POLY ++S 6000,3300,6000,5700,200,*,DOWN,POLY ++S 9400,700,9400,2200,600,*,DOWN,ALU1 ++S 6000,1900,6000,3300,200,7a,UP,NTRANS ++S 6400,2100,6400,3100,400,n3b,UP,NDIF ++S 9500,2100,9500,3100,600,*,UP,NDIF ++S 8800,1900,8800,3300,200,8a,UP,NTRANS ++S 8400,2100,8400,3100,400,n3a,UP,NDIF ++S 8000,1900,8000,3300,200,8b,UP,NTRANS ++S 6800,1900,6800,3300,200,7b,UP,NTRANS ++S 7400,2100,7400,3100,600,*,DOWN,NDIF ++S 5400,800,5400,3100,600,*,UP,NDIF ++S 4800,600,4800,3300,200,5b,UP,NTRANS ++S 4400,800,4400,3100,400,*,DOWN,NDIF ++S 1200,3300,1200,5700,200,*,DOWN,POLY ++S 600,800,600,3100,600,*,UP,NDIF ++S 1200,600,1200,3300,200,5a,UP,NTRANS ++S 1600,800,1600,3100,400,*,UP,NDIF ++S 4200,2100,4200,3100,600,*,UP,NDIF ++S 3600,3300,3600,5600,200,*,DOWN,POLY ++S 2400,3300,2400,5600,200,*,DOWN,POLY ++S 2400,1500,2400,1900,200,*,DOWN,POLY ++S 3600,1500,3600,1900,200,*,DOWN,POLY ++S 1800,2100,1800,3100,600,*,UP,NDIF ++S 1800,2200,1800,3000,600,*,DOWN,ALU1 ++S 1800,2200,4300,2200,400,*,RIGHT,ALU1 ++S 3600,1900,3600,3300,200,4c,UP,NTRANS ++S 2400,1900,2400,3300,200,3c,UP,NTRANS ++S 3000,2100,3000,3100,600,*,DOWN,NDIF ++S 6800,4000,8000,4000,600,*,RIGHT,POLY ++S 1200,300,1200,600,200,*,DOWN,POLY ++S 4800,300,4800,600,200,*,DOWN,POLY ++S 5400,700,5400,2100,400,*,DOWN,ALU1 ++S 600,700,600,3100,400,*,DOWN,ALU1 ++S 11800,6900,11800,9300,400,*,UP,ALU1 ++S 10600,6900,10600,8000,400,*,DOWN,ALU1 ++S 1700,8000,10600,8000,400,*,RIGHT,ALU1 ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 10000,5200,10000,5700,200,*,DOWN,POLY ++S 11200,5200,11200,5700,200,*,DOWN,POLY ++S 10000,5200,11200,5200,200,*,LEFT,POLY ++S 4900,4000,10000,4000,400,*,RIGHT,ALU1 ++S 9000,4000,9000,4000,400,b,LEFT,CALU1 ++S 8000,4000,8000,4000,400,b,LEFT,CALU1 ++S 7000,4000,7000,4000,400,b,LEFT,CALU1 ++S 6000,4000,6000,4000,400,b,LEFT,CALU1 ++S 5000,4000,5000,4000,400,b,LEFT,CALU1 ++S 9000,5000,9000,7000,600,*,UP,ALU1 ++S 9000,5000,9000,7000,400,a,UP,CALU1 ++S 6000,5000,6000,5000,400,a,LEFT,CALU1 ++S 8000,5000,8000,5000,400,a,LEFT,CALU1 ++S 7000,5000,7000,5000,400,a,LEFT,CALU1 ++S 5900,5000,9000,5000,400,*,RIGHT,ALU1 ++S 8000,7000,8000,7000,400,a,LEFT,CALU1 ++S 7000,7000,7000,7000,400,a,LEFT,CALU1 ++S 6000,7000,6000,7000,400,a,LEFT,CALU1 ++S 5000,7000,5000,7000,400,a,LEFT,CALU1 ++S 4000,7000,4000,7000,400,a,LEFT,CALU1 ++S 3000,7000,3000,7000,400,a,LEFT,CALU1 ++S 2000,7000,2000,7000,400,a,LEFT,CALU1 ++S 1000,5000,1000,7000,400,a,UP,CALU1 ++S 2900,6000,7500,6000,400,*,RIGHT,ALU1 ++S 4000,3000,4000,6000,400,*,DOWN,ALU1 ++S 2000,4000,2000,6000,400,c,DOWN,CALU1 ++S 3000,5000,3000,5000,400,c,LEFT,CALU1 ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 2400,5000,3600,5000,600,*,RIGHT,POLY ++S 2000,5000,3100,5000,400,*,LEFT,ALU1 ++S 1000,4900,1000,7000,400,*,UP,ALU1 ++S 1000,7000,9000,7000,400,*,RIGHT,ALU1 ++S 0,600,15000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,15000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,15000,5000,10000,cgn2_x4,LEFT,TALU8 ++S 0,2200,15000,2200,5200,*,LEFT,PWELL ++S 0,7600,15000,7600,5600,*,LEFT,NWELL ++S 14200,6900,14200,9300,400,*,UP,ALU1 ++S 13000,2500,13000,7100,400,*,DOWN,ALU1 ++S 14200,700,14200,3100,400,*,DOWN,ALU1 ++S 11800,700,11800,3100,400,*,DOWN,ALU1 ++S 14300,2100,14300,3500,600,*,UP,NDIF ++S 11700,2100,11700,3500,600,*,UP,NDIF ++S 13000,2100,13000,3500,600,*,UP,NDIF ++S 12400,1900,12400,3700,200,3z,UP,NTRANS ++S 13600,1900,13600,3700,200,4z,UP,NTRANS ++S 12400,3700,12400,5700,200,*,DOWN,POLY ++S 13600,3700,13600,5700,200,*,DOWN,POLY ++S 10000,4000,10000,6000,400,b,DOWN,CALU1 ++S 10000,4000,10000,6000,600,*,DOWN,ALU1 ++S 7400,2100,7400,3000,400,*,DOWN,ALU1 ++S 2900,3000,11000,3000,400,*,RIGHT,ALU1 ++S 11000,3000,11000,4400,400,*,UP,ALU1 ++S 11000,4400,12200,4400,400,*,RIGHT,ALU1 ++S 12400,4600,13600,4600,200,*,RIGHT,POLY ++S 13000,3000,13000,7000,400,z,UP,CALU1 ++S 13000,5000,14100,5000,400,*,RIGHT,ALU1 ++S 14000,5000,14000,5000,400,z,LEFT,CALU1 ++S 12400,1500,12400,1900,200,*,DOWN,POLY ++S 13600,1500,13600,1900,200,*,DOWN,POLY ++V 12000,700,CONT_BODY_P,* ++V 11000,700,CONT_BODY_P,* ++V 5000,4000,CONT_POLY,* ++V 9400,2200,CONT_DIF_N,* ++V 4200,2200,CONT_DIF_N,n4 ++V 7400,4000,CONT_POLY,* ++V 9400,9000,CONT_DIF_P,* ++V 5400,2000,CONT_DIF_N,* ++V 1800,2200,CONT_DIF_N,n4 ++V 1800,3000,CONT_DIF_N,n4 ++V 600,3000,CONT_DIF_N,* ++V 600,2000,CONT_DIF_N,* ++V 11800,7000,CONT_DIF_P,* ++V 10600,7800,CONT_DIF_P,n2 ++V 10600,7000,CONT_DIF_P,n2 ++V 600,8000,CONT_DIF_P,* ++V 10000,5000,CONT_POLY,* ++V 9000,5000,CONT_POLY,* ++V 6000,5000,CONT_POLY,* ++V 11800,9000,CONT_DIF_P,* ++V 11800,8000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,n2 ++V 5400,9000,CONT_DIF_P,* ++V 1800,8000,CONT_DIF_P,n2 ++V 5400,1000,CONT_DIF_N,* ++V 600,1000,CONT_DIF_N,* ++V 3000,5000,CONT_POLY,* ++V 1000,5000,CONT_POLY,* ++V 14200,9000,CONT_DIF_P,* ++V 14200,8000,CONT_DIF_P,* ++V 14200,7000,CONT_DIF_P,* ++V 13000,6000,CONT_DIF_P,* ++V 13000,7000,CONT_DIF_P,* ++V 14200,2200,CONT_DIF_N,* ++V 11800,2200,CONT_DIF_N,* ++V 11800,3000,CONT_DIF_N,* ++V 14200,3000,CONT_DIF_N,* ++V 13000,3400,CONT_DIF_N,* ++V 13000,2600,CONT_DIF_N,* ++V 12100,4400,CONT_POLY,zn ++V 7400,3000,CONT_DIF_N,zn ++V 7400,2200,CONT_DIF_N,zn ++V 3000,3000,CONT_DIF_N,zn ++V 3000,6000,CONT_DIF_P,zn ++V 7400,6000,CONT_DIF_P,zn ++EOF +diff --git a/alliance/src/cells/src/msxlib/cgn2_x4.vbe b/alliance/src/cells/src/msxlib/cgn2_x4.vbe +new file mode 100644 +index 0000000..4092bec +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/cgn2_x4.vbe +@@ -0,0 +1,38 @@ ++ENTITY cgn2_x4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 15000; ++ CONSTANT cin_a : NATURAL := 21; ++ CONSTANT cin_b : NATURAL := 19; ++ CONSTANT cin_c : NATURAL := 10; ++ CONSTANT rdown_a_z : NATURAL := 640; ++ CONSTANT rdown_b_z : NATURAL := 650; ++ CONSTANT rdown_c_z : NATURAL := 650; ++ CONSTANT rup_a_z : NATURAL := 800; ++ CONSTANT rup_b_z : NATURAL := 800; ++ CONSTANT rup_c_z : NATURAL := 800; ++ CONSTANT tphh_c_z : NATURAL := 100; ++ CONSTANT tpll_c_z : NATURAL := 123; ++ CONSTANT tpll_a_z : NATURAL := 139; ++ CONSTANT tphh_b_z : NATURAL := 107; ++ CONSTANT tpll_b_z : NATURAL := 135; ++ CONSTANT tphh_a_z : NATURAL := 107; ++ CONSTANT transistors : NATURAL := 22 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END cgn2_x4; ++ ++ARCHITECTURE behaviour_data_flow OF cgn2_x4 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on cgn2_x4" ++ SEVERITY WARNING; ++ z <= ((b and (a or c)) or (a and c)) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/ha2_x2.ap b/alliance/src/cells/src/msxlib/ha2_x2.ap +new file mode 100644 +index 0000000..bb459fe +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/ha2_x2.ap +@@ -0,0 +1,161 @@ ++V ALLIANCE : 6 ++H ha2_x2,P, 8/ 8/2014,100 ++A 0,0,10000,10000 ++R 6000,5000,ref_ref,a_50 ++R 9000,3000,ref_ref,co_30 ++R 5000,4000,ref_ref,a_40 ++R 5000,3000,ref_ref,a_30 ++R 5000,5000,ref_ref,a_50 ++R 7000,5000,ref_ref,b_50 ++R 6000,6000,ref_ref,b_60 ++R 5000,6000,ref_ref,b_60 ++R 7000,6000,ref_ref,b_60 ++R 4000,5000,ref_ref,b_50 ++R 4000,4000,ref_ref,b_40 ++R 4000,6000,ref_ref,b_60 ++R 9000,4000,ref_ref,co_40 ++R 9000,5000,ref_ref,co_50 ++R 9000,6000,ref_ref,co_60 ++R 9000,7000,ref_ref,co_70 ++R 1000,7000,ref_ref,so_70 ++R 1000,6000,ref_ref,so_60 ++R 1000,5000,ref_ref,so_50 ++R 1000,4000,ref_ref,so_40 ++R 1000,3000,ref_ref,so_30 ++S 8800,900,8800,1300,200,*,DOWN,POLY ++S 7600,300,7600,600,200,*,DOWN,POLY ++S 6800,300,6800,600,200,*,DOWN,POLY ++S 4600,1200,4600,1600,200,*,DOWN,POLY ++S 3400,900,3400,1300,200,*,DOWN,POLY ++S 2200,900,2200,1300,200,*,DOWN,POLY ++S 1200,1200,1200,1500,200,*,DOWN,POLY ++S 8400,9400,8400,9700,200,*,UP,POLY ++S 7200,9400,7200,9700,200,*,UP,POLY ++S 6000,9400,6000,9700,200,*,UP,POLY ++S 4600,9000,4600,9400,200,*,UP,POLY ++S 3800,9000,3800,9400,200,*,UP,POLY ++S 2600,7400,2600,7800,200,*,UP,POLY ++S 1400,9400,1400,9700,200,*,UP,POLY ++S 6000,5000,6000,5000,400,a,LEFT,CALU1 ++S 6000,6000,6000,6000,400,b,LEFT,CALU1 ++S 5000,6000,5000,6000,400,b,LEFT,CALU1 ++S 7000,5000,7000,6000,400,b,DOWN,CALU1 ++S 4000,4000,4000,6000,400,b,UP,CALU1 ++S 5000,3000,5000,5000,400,a,UP,CALU1 ++S 9000,3000,9000,7000,400,co,UP,CALU1 ++S 1000,3000,1000,7000,400,so,UP,CALU1 ++S 4200,5800,4200,8800,400,n3,UP,PDIF ++S 7200,800,7200,3600,400,n1,UP,NDIF ++S 7600,3800,7600,4200,200,*,UP,POLY ++S 3800,4000,4000,4000,600,*,LEFT,ALU1 ++S 3800,4000,3800,5600,200,*,DOWN,POLY ++S 3400,2800,3400,4200,200,*,UP,POLY ++S 4600,3100,4600,5600,200,*,DOWN,POLY ++S 2700,1900,5300,1900,400,*,RIGHT,ALU1 ++S 2200,3200,2600,3200,200,*,LEFT,POLY ++S 2200,1300,2200,2800,200,2,UP,NTRANS ++S 4600,1600,4600,3100,200,3a,UP,NTRANS ++S 3400,1300,3400,2800,200,3b,UP,NTRANS ++S 5000,1800,5000,2900,400,*,UP,NDIF ++S 3800,1500,3800,2600,400,*,UP,NDIF ++S 4000,1800,4000,2900,600,*,UP,NDIF ++S 2800,1500,2800,2600,600,*,UP,NDIF ++S 8400,5600,8400,9400,200,1c,DOWN,PTRANS ++S 2600,5600,2600,7400,200,1,DOWN,PTRANS ++S 6800,600,6800,3800,200,4a,UP,NTRANS ++S 4600,5600,4600,9000,200,1a,DOWN,PTRANS ++S 7600,600,7600,3800,200,4b,UP,NTRANS ++S 7200,5600,7200,9400,200,2b,DOWN,PTRANS ++S 3800,5600,3800,9000,200,1b,DOWN,PTRANS ++S 8800,1300,8800,3200,200,2c,UP,NTRANS ++S 1200,1500,1200,3400,200,2s,UP,NTRANS ++S 1400,5600,1400,9400,200,1s,DOWN,PTRANS ++S 5000,5000,6000,5000,600,*,LEFT,ALU1 ++S 5000,5000,5800,5000,600,*,LEFT,POLY ++S 6000,4200,6800,4200,200,*,RIGHT,POLY ++S 600,2200,600,3200,400,*,UP,ALU1 ++S 600,2400,600,3000,600,*,DOWN,NDIF ++S 1000,2900,1000,7100,400,*,DOWN,ALU1 ++S 8800,3200,8800,4800,200,*,UP,POLY ++S 9400,2000,9400,3000,400,*,UP,ALU1 ++S 9400,2200,9400,2700,600,*,UP,NDIF ++S 9200,1500,9200,3000,400,*,UP,NDIF ++S 9000,2900,9000,7100,400,*,DOWN,ALU1 ++S 5200,5800,5200,9200,600,*,DOWN,PDIF ++S 8200,700,8200,2100,400,*,DOWN,ALU1 ++S 4000,3900,4000,6000,400,*,DOWN,ALU1 ++S 4000,6000,7000,6000,400,*,RIGHT,ALU1 ++S 3000,6000,3200,6000,600,*,RIGHT,ALU1 ++S 3000,2800,3000,6100,400,*,DOWN,ALU1 ++S 3000,2800,4100,2800,400,*,LEFT,ALU1 ++S 2200,7000,8200,7000,400,*,LEFT,ALU1 ++S 1800,4000,3000,4000,600,*,RIGHT,ALU1 ++S 2200,4900,2200,7000,400,*,UP,ALU1 ++S 2600,3200,2600,5600,200,*,DOWN,POLY ++S 9000,6000,9000,6600,600,*,UP,PDIF ++S 8800,5800,8800,9200,400,*,DOWN,PDIF ++S 6600,7000,6600,8100,400,*,UP,ALU1 ++S 7800,5800,7800,9200,600,*,UP,PDIF ++S 6600,5800,6600,9200,600,*,DOWN,PDIF ++S 3400,5800,3400,8800,400,*,DOWN,PDIF ++S 3200,5800,3200,7200,600,*,UP,PDIF ++S 6100,3500,8200,3500,400,*,RIGHT,ALU1 ++S 8200,800,8200,3600,600,*,UP,NDIF ++S 6400,800,6400,3600,400,*,UP,NDIF ++S 8200,4800,8800,4800,200,*,LEFT,POLY ++S 7400,4200,7400,5200,200,*,UP,POLY ++S 1700,500,1700,3200,400,*,UP,NDIF ++S 800,1700,800,3200,400,*,UP,NDIF ++S 1400,3800,1400,5600,200,*,DOWN,POLY ++S 1200,3400,1200,4200,200,*,DOWN,POLY ++S 900,5800,900,7100,600,*,UP,ALU1 ++S 800,6000,800,6600,600,*,DOWN,PDIF ++S 1000,5800,1000,9200,400,*,DOWN,PDIF ++S 2000,7900,2000,9300,400,*,UP,ALU1 ++S 1900,5800,1900,9200,800,*,DOWN,PDIF ++S 8200,3500,8200,7000,400,*,DOWN,ALU1 ++S 7000,4900,7000,6000,400,*,DOWN,ALU1 ++S 6000,4200,6000,5600,200,*,DOWN,POLY ++S 5000,2900,5000,5100,400,*,UP,ALU1 ++S 7800,7900,7800,9300,400,*,UP,ALU1 ++S 5400,7900,5400,9300,400,*,UP,ALU1 ++S 0,600,10000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,10000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,10000,5000,10000,ha2_x2,LEFT,TALU8 ++S 0,2200,10000,2200,5200,*,LEFT,PWELL ++S 0,7600,10000,7600,5600,*,LEFT,NWELL ++S 6000,5600,6000,9400,200,2a,DOWN,PTRANS ++S 4000,6100,7000,6100,400,*,RIGHT,ALU1 ++V 5000,700,CONT_BODY_P,* ++V 3800,4000,CONT_POLY,* ++V 5200,1900,CONT_DIF_N,n2 ++V 4000,2800,CONT_DIF_N,son ++V 2800,1900,CONT_DIF_N,n2 ++V 1600,600,CONT_DIF_N,* ++V 5000,5000,CONT_POLY,* ++V 5800,5000,CONT_POLY,* ++V 600,2300,CONT_DIF_N,* ++V 600,3100,CONT_DIF_N,* ++V 9400,2100,CONT_DIF_N,* ++V 9400,2900,CONT_DIF_N,* ++V 8200,2000,CONT_DIF_N,* ++V 2200,5000,CONT_POLY,con ++V 2000,9000,CONT_DIF_P,* ++V 8200,1000,CONT_DIF_N,* ++V 6200,3500,CONT_DIF_N,con ++V 800,6700,CONT_DIF_P,* ++V 800,5900,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,* ++V 8200,5000,CONT_POLY,con ++V 7000,5000,CONT_POLY,* ++V 1800,4000,CONT_POLY,son ++V 3200,6000,CONT_DIF_P,son ++V 6600,8000,CONT_DIF_P,con ++V 6600,7000,CONT_DIF_P,con ++V 7800,9000,CONT_DIF_P,* ++V 7800,8000,CONT_DIF_P,* ++V 5400,8000,CONT_DIF_P,* ++V 9000,6700,CONT_DIF_P,* ++V 9000,5900,CONT_DIF_P,* ++V 5400,9000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/ha2_x2.vbe b/alliance/src/cells/src/msxlib/ha2_x2.vbe +new file mode 100644 +index 0000000..7315db1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/ha2_x2.vbe +@@ -0,0 +1,46 @@ ++ENTITY ha2_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 10000; ++ CONSTANT cin_a : NATURAL := 13; ++ CONSTANT cin_b : NATURAL := 13; ++ CONSTANT rdown_a_co : NATURAL := 1210; ++ CONSTANT rdown_a_so : NATURAL := 1210; ++ CONSTANT rdown_b_co : NATURAL := 1210; ++ CONSTANT rdown_b_so : NATURAL := 1210; ++ CONSTANT rup_a_co : NATURAL := 1560; ++ CONSTANT rup_a_so : NATURAL := 1560; ++ CONSTANT rup_b_co : NATURAL := 1560; ++ CONSTANT rup_b_so : NATURAL := 1560; ++ CONSTANT tphh_a_co : NATURAL := 70; ++ CONSTANT tpll_b_co : NATURAL := 99; ++ CONSTANT tphh_b_co : NATURAL := 70; ++ CONSTANT tpll_a_co : NATURAL := 89; ++ CONSTANT tphh_a_so : NATURAL := 100; ++ CONSTANT tpll_b_so : NATURAL := 108; ++ CONSTANT tphl_b_so : NATURAL := 154; ++ CONSTANT tplh_b_so : NATURAL := 160; ++ CONSTANT tphh_b_so : NATURAL := 87; ++ CONSTANT tpll_a_so : NATURAL := 117; ++ CONSTANT tphl_a_so : NATURAL := 155; ++ CONSTANT tplh_a_so : NATURAL := 144; ++ CONSTANT transistors : NATURAL := 14 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ co : out BIT; ++ so : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END ha2_x2; ++ ++ARCHITECTURE behaviour_data_flow OF ha2_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on ha2_x2" ++ SEVERITY WARNING; ++ so <= (a xor b) after 1200 ps; ++ co <= (a and b) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/iv1_w2.ap b/alliance/src/cells/src/msxlib/iv1_w2.ap +new file mode 100644 +index 0000000..edb6592 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_w2.ap +@@ -0,0 +1,46 @@ ++V ALLIANCE : 6 ++H iv1_w2,P, 7/ 8/2004,100 ++A 0,0,3000,10000 ++R 1000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,a_40 ++R 1000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,a_60 ++R 2000,5000,ref_ref,a_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 2000,7000,ref_ref,z_70 ++S 1000,2700,1000,7100,400,*,UP,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1000,2900,1000,3500,600,*,UP,NDIF ++S 1000,5900,1000,6500,600,*,UP,PDIF ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,5000,3000,5000,10000,iv1_w2,LEFT,TALU8 ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 1600,9400,1600,9700,200,*,DOWN,POLY ++S 2200,5700,2200,9200,800,*,DOWN,PDIF ++S 1600,5500,1600,9400,200,1,UP,PTRANS ++S 1200,5700,1200,9200,400,*,UP,PDIF ++S 1200,1500,1200,3700,400,*,DOWN,NDIF ++S 1600,1300,1600,3900,200,2,DOWN,NTRANS ++S 2300,1500,2300,3700,600,*,UP,NDIF ++S 1600,900,1600,1300,200,*,UP,POLY ++S 1600,3900,1600,5500,200,*,UP,POLY ++S 2000,4000,2000,6000,400,a,DOWN,CALU1 ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 1000,7000,2000,7000,600,*,RIGHT,ALU1 ++S 2200,700,2200,3100,400,*,UP,ALU1 ++V 1000,2800,CONT_DIF_N,* ++V 1000,6600,CONT_DIF_P,* ++V 2200,8000,CONT_DIF_P,* ++V 2200,9000,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,* ++V 2000,4700,CONT_POLY,* ++V 1000,5800,CONT_DIF_P,* ++V 1000,3600,CONT_DIF_N,* ++V 2200,3000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/iv1_w2.vbe b/alliance/src/cells/src/msxlib/iv1_w2.vbe +new file mode 100644 +index 0000000..def2c41 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_w2.vbe +@@ -0,0 +1,26 @@ ++ENTITY iv1_w2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT rdown_a_z : NATURAL := 880; ++ CONSTANT rup_a_z : NATURAL := 1520; ++ CONSTANT tphl_a_z : NATURAL := 32; ++ CONSTANT tplh_a_z : NATURAL := 39; ++ CONSTANT transistors : NATURAL := 2 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END iv1_w2; ++ ++ARCHITECTURE behaviour_data_flow OF iv1_w2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on iv1_w2" ++ SEVERITY WARNING; ++ z <= not (a) after 700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/iv1_x05.ap b/alliance/src/cells/src/msxlib/iv1_x05.ap +new file mode 100644 +index 0000000..d97eef5 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x05.ap +@@ -0,0 +1,47 @@ ++V ALLIANCE : 6 ++H iv1_x05,P, 8/ 8/2014,100 ++A 0,0,3000,10000 ++R 1000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,a_60 ++R 2000,5000,ref_ref,a_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 2000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,a_40 ++R 1000,7000,ref_ref,z_70 ++R 1000,2000,ref_ref,z_20 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 2300,6300,2300,7100,600,*,DOWN,PDIF ++S 1600,7300,1600,7700,200,*,DOWN,POLY ++S 1600,6100,1600,7300,200,1,UP,PTRANS ++S 1200,6300,1200,7100,400,*,UP,PDIF ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 2200,6900,2200,9300,400,*,UP,ALU1 ++S 1000,2900,2100,2900,400,*,RIGHT,ALU1 ++S 1000,3000,2100,3000,400,*,RIGHT,ALU1 ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 2000,4000,2000,6000,400,a,DOWN,CALU1 ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,3000,5000,10000,iv1_x05,LEFT,TALU8 ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 1600,1300,1600,1700,200,*,UP,POLY ++S 1600,1700,1600,2300,200,2,DOWN,NTRANS ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,1900,1000,7100,400,*,UP,ALU1 ++S 1600,2300,1600,6100,200,*,UP,POLY ++S 2300,1900,2300,2100,600,*,UP,NDIF ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1000,6400,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,* ++V 2000,4700,CONT_POLY,* ++V 2200,7000,CONT_DIF_P,* ++V 1000,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/iv1_x05.vbe b/alliance/src/cells/src/msxlib/iv1_x05.vbe +new file mode 100644 +index 0000000..5542313 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x05.vbe +@@ -0,0 +1,26 @@ ++ENTITY iv1_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT cin_a : NATURAL := 2; ++ CONSTANT rdown_a_z : NATURAL := 3800; ++ CONSTANT rup_a_z : NATURAL := 4930; ++ CONSTANT tphl_a_z : NATURAL := 36; ++ CONSTANT tplh_a_z : NATURAL := 41; ++ CONSTANT transistors : NATURAL := 2 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END iv1_x05; ++ ++ARCHITECTURE behaviour_data_flow OF iv1_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on iv1_x05" ++ SEVERITY WARNING; ++ z <= not (a) after 700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/iv1_x1.ap b/alliance/src/cells/src/msxlib/iv1_x1.ap +new file mode 100644 +index 0000000..2cd20f6 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x1.ap +@@ -0,0 +1,50 @@ ++V ALLIANCE : 6 ++H iv1_x1,P, 8/ 8/2014,100 ++A 0,0,3000,10000 ++R 2000,4000,ref_ref,a_40 ++R 1000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,a_60 ++R 2000,5000,ref_ref,a_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 2000,3000,ref_ref,z_30 ++R 1000,3000,ref_ref,z_30 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 1600,7500,1600,7900,200,*,DOWN,POLY ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,3000,5000,10000,iv1_x1,LEFT,TALU8 ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,4000,2000,6000,400,a,DOWN,CALU1 ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 2200,6900,2200,9300,400,*,UP,ALU1 ++S 1600,5500,1600,7500,200,1,UP,PTRANS ++S 2200,5700,2200,7300,800,*,DOWN,PDIF ++S 1200,5700,1200,7300,400,*,UP,PDIF ++S 1000,3000,1000,7100,400,*,UP,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1000,3000,2100,3000,400,*,RIGHT,ALU1 ++S 1000,2900,2100,2900,400,*,RIGHT,ALU1 ++S 2200,700,2200,2100,400,*,UP,ALU1 ++S 1200,2500,1200,3100,400,*,UP,NDIF ++S 1600,2300,1600,3300,200,2,DOWN,NTRANS ++S 2300,1900,2300,3100,600,*,UP,NDIF ++S 2200,1900,2200,3100,600,*,UP,NDIF ++S 1600,3300,1600,5500,200,*,UP,POLY ++S 1600,1900,1600,2300,200,*,UP,POLY ++S 1000,6100,1000,6700,600,*,UP,PDIF ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2200,7000,CONT_DIF_P,* ++V 1000,6800,CONT_DIF_P,* ++V 2000,4700,CONT_POLY,* ++V 2200,2000,CONT_DIF_N,* ++V 1000,3000,CONT_DIF_N,* ++V 1000,6000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/iv1_x1.vbe b/alliance/src/cells/src/msxlib/iv1_x1.vbe +new file mode 100644 +index 0000000..7b09188 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x1.vbe +@@ -0,0 +1,26 @@ ++ENTITY iv1_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT cin_a : NATURAL := 3; ++ CONSTANT rdown_a_z : NATURAL := 2280; ++ CONSTANT rup_a_z : NATURAL := 2960; ++ CONSTANT tphl_a_z : NATURAL := 35; ++ CONSTANT tplh_a_z : NATURAL := 39; ++ CONSTANT transistors : NATURAL := 2 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END iv1_x1; ++ ++ARCHITECTURE behaviour_data_flow OF iv1_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on iv1_x1" ++ SEVERITY WARNING; ++ z <= not (a) after 700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/iv1_x2.ap b/alliance/src/cells/src/msxlib/iv1_x2.ap +new file mode 100644 +index 0000000..3a53b27 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x2.ap +@@ -0,0 +1,50 @@ ++V ALLIANCE : 6 ++H iv1_x2,P, 8/ 8/2014,100 ++A 0,0,3000,10000 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,a_50 ++R 2000,6000,ref_ref,a_60 ++R 1000,7000,ref_ref,z_70 ++R 2000,4000,ref_ref,a_40 ++R 1000,3000,ref_ref,z_30 ++R 1000,2000,ref_ref,z_20 ++R 2000,7000,ref_ref,z_70 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 1000,5900,1000,6500,600,*,UP,PDIF ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,1900,1000,7100,400,*,UP,ALU1 ++S 1600,1300,1600,1700,200,*,UP,POLY ++S 1600,1700,1600,3600,200,2,DOWN,NTRANS ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,3000,5000,10000,iv1_x2,LEFT,TALU8 ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 1600,3600,1600,5500,200,*,UP,POLY ++S 1200,1900,1200,3400,400,*,DOWN,NDIF ++S 1600,5500,1600,9300,200,1,UP,PTRANS ++S 2200,5700,2200,9100,800,*,DOWN,PDIF ++S 1200,5700,1200,9100,400,*,UP,PDIF ++S 2300,1900,2300,3400,600,*,UP,NDIF ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 2000,4000,2000,6000,400,a,DOWN,CALU1 ++S 1600,9300,1600,9700,200,*,DOWN,POLY ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 1000,7000,2000,7000,600,*,RIGHT,ALU1 ++S 2200,700,2200,3100,400,*,UP,ALU1 ++S 1000,2600,1000,3200,600,*,UP,NDIF ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1000,6600,CONT_DIF_P,* ++V 1000,5800,CONT_DIF_P,* ++V 2000,4700,CONT_POLY,* ++V 2200,2000,CONT_DIF_N,* ++V 1000,3300,CONT_DIF_N,* ++V 2200,9000,CONT_DIF_P,* ++V 2200,8000,CONT_DIF_P,* ++V 2200,3000,CONT_DIF_N,* ++V 1000,2500,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/iv1_x2.vbe b/alliance/src/cells/src/msxlib/iv1_x2.vbe +new file mode 100644 +index 0000000..0e18871 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x2.vbe +@@ -0,0 +1,26 @@ ++ENTITY iv1_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT cin_a : NATURAL := 6; ++ CONSTANT rdown_a_z : NATURAL := 1200; ++ CONSTANT rup_a_z : NATURAL := 1560; ++ CONSTANT tphl_a_z : NATURAL := 34; ++ CONSTANT tplh_a_z : NATURAL := 38; ++ CONSTANT transistors : NATURAL := 2 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END iv1_x2; ++ ++ARCHITECTURE behaviour_data_flow OF iv1_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on iv1_x2" ++ SEVERITY WARNING; ++ z <= not (a) after 700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/iv1_x3.ap b/alliance/src/cells/src/msxlib/iv1_x3.ap +new file mode 100644 +index 0000000..447a9df +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x3.ap +@@ -0,0 +1,70 @@ ++V ALLIANCE : 6 ++H iv1_x3,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++R 3000,4000,ref_ref,a_40 ++R 2000,5000,ref_ref,a_50 ++R 2000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++R 2000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 2000,3000,2000,4000,400,z,DOWN,CALU1 ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 2000,5000,2000,5000,400,a,LEFT,CALU1 ++S 2000,2700,2000,3700,600,*,UP,NDIF ++S 3300,2700,3300,3700,600,*,UP,NDIF ++S 700,2700,700,3700,600,*,UP,NDIF ++S 1400,8500,1400,8800,200,*,DOWN,POLY ++S 2600,8500,2600,8800,200,*,DOWN,POLY ++S 2000,5800,2000,8200,1000,*,DOWN,PDIF ++S 2600,5600,2600,8400,200,2,UP,PTRANS ++S 1400,5600,1400,8400,200,1,UP,PTRANS ++S 1400,5000,2600,5000,600,*,RIGHT,POLY ++S 0,5000,4000,5000,10000,iv1_x3,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 1000,4000,2000,4000,600,*,LEFT,ALU1 ++S 1000,6000,2000,6000,600,*,RIGHT,ALU1 ++S 800,6900,800,9300,400,*,UP,ALU1 ++S 800,5800,800,8200,800,*,DOWN,PDIF ++S 3200,5800,3200,8200,800,*,DOWN,PDIF ++S 2600,4100,2600,5600,200,*,UP,POLY ++S 1400,4100,1400,5600,200,*,UP,POLY ++S 3200,700,3200,3100,400,*,DOWN,ALU1 ++S 800,700,800,3100,400,*,DOWN,ALU1 ++S 1900,5000,3000,5000,400,*,RIGHT,ALU1 ++S 1000,4000,1000,6000,400,*,UP,ALU1 ++S 1400,2100,1400,2500,200,*,UP,POLY ++S 1400,2500,1400,3900,200,3,DOWN,NTRANS ++S 2600,2100,2600,2500,200,*,UP,POLY ++S 2600,2500,2600,3900,200,4,DOWN,NTRANS ++S 2000,6000,2000,7100,400,*,UP,ALU1 ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 3200,6900,3200,9300,400,*,UP,ALU1 ++S 1000,4000,1000,6000,400,z,DOWN,CALU1 ++S 2000,2700,2000,4000,400,*,UP,ALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,7000,CONT_DIF_P,* ++V 2000,6000,CONT_DIF_P,* ++V 2200,5000,CONT_POLY,* ++V 800,7000,CONT_DIF_P,* ++V 800,8000,CONT_DIF_P,* ++V 3200,8000,CONT_DIF_P,* ++V 800,3000,CONT_DIF_N,* ++V 3200,3000,CONT_DIF_N,* ++V 2000,2800,CONT_DIF_N,* ++V 2000,3600,CONT_DIF_N,* ++V 3200,7000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/iv1_x3.vbe b/alliance/src/cells/src/msxlib/iv1_x3.vbe +new file mode 100644 +index 0000000..b064273 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x3.vbe +@@ -0,0 +1,26 @@ ++ENTITY iv1_x3 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 9; ++ CONSTANT rdown_a_z : NATURAL := 810; ++ CONSTANT rup_a_z : NATURAL := 1060; ++ CONSTANT tphl_a_z : NATURAL := 33; ++ CONSTANT tplh_a_z : NATURAL := 37; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END iv1_x3; ++ ++ARCHITECTURE behaviour_data_flow OF iv1_x3 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on iv1_x3" ++ SEVERITY WARNING; ++ z <= not (a) after 700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/iv1_x4.ap b/alliance/src/cells/src/msxlib/iv1_x4.ap +new file mode 100644 +index 0000000..da8d69d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x4.ap +@@ -0,0 +1,74 @@ ++V ALLIANCE : 6 ++H iv1_x4,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 2000,2000,ref_ref,z_20 ++R 3000,5000,ref_ref,a_50 ++R 1000,5000,ref_ref,z_50 ++R 2000,6000,ref_ref,z_60 ++R 2000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,z_40 ++R 1000,4000,ref_ref,z_40 ++R 1000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,a_50 ++R 3000,4000,ref_ref,a_40 ++R 3000,6000,ref_ref,a_60 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 2000,2000,2000,4000,400,z,DOWN,CALU1 ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 3200,6900,3200,9300,400,*,UP,ALU1 ++S 2000,5000,2000,5000,400,a,LEFT,CALU1 ++S 3000,3900,3000,6100,400,*,UP,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 2000,6000,2000,7100,400,*,UP,ALU1 ++S 3200,5800,3200,9200,800,*,DOWN,PDIF ++S 800,5800,800,9200,800,*,DOWN,PDIF ++S 1000,6000,2000,6000,600,*,RIGHT,ALU1 ++S 1000,4000,2000,4000,600,*,LEFT,ALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,4000,5000,10000,iv1_x4,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 1400,1300,1400,1700,200,*,UP,POLY ++S 2600,1300,2600,1700,200,*,UP,POLY ++S 1400,1700,1400,3600,200,3,DOWN,NTRANS ++S 2600,1700,2600,3600,200,4,DOWN,NTRANS ++S 1400,5000,2600,5000,600,*,RIGHT,POLY ++S 2000,5800,2000,9200,1000,*,DOWN,PDIF ++S 1400,5600,1400,9400,200,1,UP,PTRANS ++S 2600,5600,2600,9400,200,2,UP,PTRANS ++S 1400,9400,1400,9700,200,*,DOWN,POLY ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 3300,1900,3300,3400,600,*,UP,NDIF ++S 700,1900,700,3400,600,*,UP,NDIF ++S 2000,1900,2000,3400,600,*,UP,NDIF ++S 800,700,800,3100,400,*,DOWN,ALU1 ++S 3200,700,3200,3100,400,*,DOWN,ALU1 ++S 2600,3600,2600,5600,200,*,UP,POLY ++S 1400,3600,1400,5600,200,*,UP,POLY ++S 800,6900,800,9300,400,*,UP,ALU1 ++S 2000,1900,2000,4000,400,*,UP,ALU1 ++S 1900,5000,3000,5000,400,*,RIGHT,ALU1 ++S 1000,4000,1000,6000,400,*,UP,ALU1 ++S 800,1900,800,3400,600,*,UP,NDIF ++S 3200,1900,3200,3400,600,*,UP,NDIF ++S 1000,4000,1000,6000,400,z,DOWN,CALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3200,7000,CONT_DIF_P,* ++V 2200,5000,CONT_POLY,* ++V 800,3000,CONT_DIF_N,* ++V 800,2000,CONT_DIF_N,* ++V 3200,2000,CONT_DIF_N,* ++V 3200,3000,CONT_DIF_N,* ++V 2000,6000,CONT_DIF_P,* ++V 2000,7000,CONT_DIF_P,* ++V 2000,2000,CONT_DIF_N,* ++V 2000,3000,CONT_DIF_N,* ++V 800,7000,CONT_DIF_P,* ++V 800,8000,CONT_DIF_P,* ++V 3200,8000,CONT_DIF_P,* ++V 3200,9000,CONT_DIF_P,* ++V 800,9000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/iv1_x4.vbe b/alliance/src/cells/src/msxlib/iv1_x4.vbe +new file mode 100644 +index 0000000..ddeb12e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x4.vbe +@@ -0,0 +1,26 @@ ++ENTITY iv1_x4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 12; ++ CONSTANT rdown_a_z : NATURAL := 600; ++ CONSTANT rup_a_z : NATURAL := 780; ++ CONSTANT tphl_a_z : NATURAL := 33; ++ CONSTANT tplh_a_z : NATURAL := 37; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END iv1_x4; ++ ++ARCHITECTURE behaviour_data_flow OF iv1_x4 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on iv1_x4" ++ SEVERITY WARNING; ++ z <= not (a) after 700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/iv1_x8.ap b/alliance/src/cells/src/msxlib/iv1_x8.ap +new file mode 100644 +index 0000000..9c363c1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x8.ap +@@ -0,0 +1,120 @@ ++V ALLIANCE : 6 ++H iv1_x8,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 5000,4000,ref_ref,a_40 ++R 5000,6000,ref_ref,a_60 ++R 5000,5000,ref_ref,a_50 ++R 4000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 2000,5000,ref_ref,a_50 ++R 2000,7000,ref_ref,z_70 ++R 2000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 3000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,z_60 ++R 4000,6000,ref_ref,z_60 ++R 4000,7000,ref_ref,z_70 ++R 4000,5000,ref_ref,a_50 ++R 3000,4000,ref_ref,z_40 ++R 4000,4000,ref_ref,z_40 ++R 4000,3000,ref_ref,z_30 ++R 1000,6000,ref_ref,z_60 ++R 1000,4000,ref_ref,z_40 ++S 2400,700,3200,700,600,*,LEFT,PTIE ++S 5400,700,5400,3100,400,*,DOWN,ALU1 ++S 5000,4000,5000,6000,400,a,DOWN,CALU1 ++S 5000,3900,5000,6100,400,*,DOWN,ALU1 ++S 2000,5000,2000,5000,400,a,LEFT,CALU1 ++S 3000,5000,3000,5000,400,a,LEFT,CALU1 ++S 4000,5000,4000,5000,400,a,LEFT,CALU1 ++S 3000,4000,3000,4000,400,z,LEFT,CALU1 ++S 4000,2000,4000,4000,400,z,DOWN,CALU1 ++S 2000,2000,2000,4000,400,z,DOWN,CALU1 ++S 3000,6000,3000,6000,400,z,LEFT,CALU1 ++S 4000,6000,4000,7000,400,z,UP,CALU1 ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 4100,6000,4100,7100,600,*,DOWN,ALU1 ++S 1900,6000,1900,7100,600,*,DOWN,ALU1 ++S 1000,4000,4200,4000,400,*,RIGHT,ALU1 ++S 1000,6000,4200,6000,400,*,LEFT,ALU1 ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,iv1_x8,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 600,6900,600,9300,400,*,UP,ALU1 ++S 3000,6900,3000,9300,400,*,UP,ALU1 ++S 1000,4000,1000,6000,400,*,DOWN,ALU1 ++S 1000,6100,4200,6100,400,*,LEFT,ALU1 ++S 1900,5000,5000,5000,400,*,LEFT,ALU1 ++S 5400,6900,5400,9300,400,*,UP,ALU1 ++S 700,1900,700,3300,800,*,UP,NDIF ++S 1800,1900,1800,3300,1000,*,UP,NDIF ++S 1200,1700,1200,3500,200,5,DOWN,NTRANS ++S 3000,1900,3000,3300,1000,*,UP,NDIF ++S 2400,1700,2400,3500,200,6,DOWN,NTRANS ++S 3600,1700,3600,3500,200,7,DOWN,NTRANS ++S 4200,1900,4200,3300,1000,*,UP,NDIF ++S 4800,1700,4800,3500,200,8,DOWN,NTRANS ++S 5300,1900,5300,3300,800,*,UP,NDIF ++S 600,700,600,3100,400,*,DOWN,ALU1 ++S 1900,1900,1900,4000,600,*,DOWN,ALU1 ++S 4100,1900,4100,4000,600,*,DOWN,ALU1 ++S 3000,700,3000,3100,400,*,DOWN,ALU1 ++S 4800,1300,4800,1700,200,*,UP,POLY ++S 3600,1300,3600,1700,200,*,UP,POLY ++S 2400,1300,2400,1700,200,*,UP,POLY ++S 1200,1300,1200,1700,200,*,UP,POLY ++S 1200,3500,1200,5500,200,*,UP,POLY ++S 2400,3500,2400,5500,200,*,UP,POLY ++S 3600,3500,3600,5500,200,*,UP,POLY ++S 4800,3500,4800,5500,200,*,UP,POLY ++S 1000,3900,4200,3900,400,*,RIGHT,ALU1 ++S 1200,5500,1200,9400,200,1,UP,PTRANS ++S 600,5700,600,9200,600,*,DOWN,PDIF ++S 1800,5700,1800,9200,600,*,DOWN,PDIF ++S 2400,5500,2400,9400,200,2,UP,PTRANS ++S 3600,5500,3600,9400,200,3,UP,PTRANS ++S 3000,5700,3000,9200,600,*,DOWN,PDIF ++S 1200,4900,2400,4900,600,*,RIGHT,POLY ++S 3600,4900,4800,4900,600,*,RIGHT,POLY ++S 1900,4900,5000,4900,400,*,LEFT,ALU1 ++S 5400,5700,5400,8100,600,*,DOWN,PDIF ++S 4800,5500,4800,8300,200,4,UP,PTRANS ++S 4200,5700,4200,8100,600,*,UP,PDIF ++S 4000,8500,4000,9200,400,*,UP,PDIF ++S 4800,8400,4800,8700,200,*,DOWN,POLY ++S 1000,4000,1000,6000,400,z,DOWN,CALU1 ++V 5100,9300,CONT_BODY_N,* ++V 3300,700,CONT_BODY_P,* ++V 2300,700,CONT_BODY_P,* ++V 5400,3000,CONT_DIF_N,* ++V 1800,7000,CONT_DIF_P,* ++V 1800,6000,CONT_DIF_P,* ++V 4200,7000,CONT_DIF_P,* ++V 4200,6000,CONT_DIF_P,* ++V 600,7000,CONT_DIF_P,* ++V 600,8000,CONT_DIF_P,* ++V 600,9000,CONT_DIF_P,* ++V 3000,7000,CONT_DIF_P,* ++V 3000,8000,CONT_DIF_P,* ++V 3000,9000,CONT_DIF_P,* ++V 5400,7000,CONT_DIF_P,* ++V 5400,8000,CONT_DIF_P,* ++V 600,3000,CONT_DIF_N,* ++V 600,2000,CONT_DIF_N,* ++V 3000,3000,CONT_DIF_N,* ++V 3000,2000,CONT_DIF_N,* ++V 1800,2000,CONT_DIF_N,* ++V 1800,3000,CONT_DIF_N,* ++V 4200,3000,CONT_DIF_N,* ++V 4200,2000,CONT_DIF_N,* ++V 5400,2000,CONT_DIF_N,* ++V 2200,4900,CONT_POLY,* ++V 3800,4900,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/iv1_x8.vbe b/alliance/src/cells/src/msxlib/iv1_x8.vbe +new file mode 100644 +index 0000000..02c61a0 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_x8.vbe +@@ -0,0 +1,26 @@ ++ENTITY iv1_x8 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 22; ++ CONSTANT rdown_a_z : NATURAL := 320; ++ CONSTANT rup_a_z : NATURAL := 410; ++ CONSTANT tphl_a_z : NATURAL := 33; ++ CONSTANT tplh_a_z : NATURAL := 37; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END iv1_x8; ++ ++ARCHITECTURE behaviour_data_flow OF iv1_x8 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on iv1_x8" ++ SEVERITY WARNING; ++ z <= not (a) after 700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/iv1_y2.ap b/alliance/src/cells/src/msxlib/iv1_y2.ap +new file mode 100644 +index 0000000..7df6e39 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_y2.ap +@@ -0,0 +1,50 @@ ++V ALLIANCE : 6 ++H iv1_y2,P, 8/ 8/2014,100 ++A 0,0,3000,10000 ++R 1000,2000,ref_ref,z_20 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,a_50 ++R 2000,6000,ref_ref,a_60 ++R 1000,7000,ref_ref,z_70 ++R 2000,4000,ref_ref,a_40 ++R 1000,3000,ref_ref,z_30 ++R 2000,7000,ref_ref,z_70 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 2000,3900,2000,6100,400,*,DOWN,ALU1 ++S 2000,4000,2000,6000,400,a,DOWN,CALU1 ++S 1000,2300,1000,2900,600,*,UP,NDIF ++S 1600,1300,1600,1700,200,*,UP,POLY ++S 1600,3300,1600,5500,200,*,UP,POLY ++S 2300,1900,2300,3100,600,*,UP,NDIF ++S 1600,1700,1600,3300,200,2,DOWN,NTRANS ++S 1200,1900,1200,3100,400,*,DOWN,NDIF ++S 1200,5900,1200,9100,400,*,UP,PDIF ++S 1600,5700,1600,9300,200,1,UP,PTRANS ++S 2200,5900,2200,9100,800,*,DOWN,PDIF ++S 1600,9300,1600,9700,200,*,DOWN,POLY ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,1900,1000,7100,400,*,UP,ALU1 ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,3000,5000,10000,iv1_y2,LEFT,TALU8 ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 1000,6100,1000,6700,600,*,UP,PDIF ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 1000,7000,2000,7000,600,*,RIGHT,ALU1 ++S 2200,700,2200,3100,400,*,UP,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1000,2200,CONT_DIF_N,* ++V 1000,3000,CONT_DIF_N,* ++V 1000,6000,CONT_DIF_P,* ++V 2000,4700,CONT_POLY,* ++V 2200,2000,CONT_DIF_N,* ++V 2200,9000,CONT_DIF_P,* ++V 2200,8000,CONT_DIF_P,* ++V 1000,6800,CONT_DIF_P,* ++V 2200,3000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/iv1_y2.vbe b/alliance/src/cells/src/msxlib/iv1_y2.vbe +new file mode 100644 +index 0000000..db20bd0 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/iv1_y2.vbe +@@ -0,0 +1,26 @@ ++ENTITY iv1_y2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT rdown_a_z : NATURAL := 1420; ++ CONSTANT rup_a_z : NATURAL := 1640; ++ CONSTANT tphl_a_z : NATURAL := 36; ++ CONSTANT tplh_a_z : NATURAL := 38; ++ CONSTANT transistors : NATURAL := 2 ++); ++PORT ( ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END iv1_y2; ++ ++ARCHITECTURE behaviour_data_flow OF iv1_y2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on iv1_y2" ++ SEVERITY WARNING; ++ z <= not (a) after 700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/mxi2_x05.ap b/alliance/src/cells/src/msxlib/mxi2_x05.ap +new file mode 100644 +index 0000000..618a5c1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/mxi2_x05.ap +@@ -0,0 +1,136 @@ ++V ALLIANCE : 6 ++H mxi2_x05,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 3000,2000,ref_ref,z_20 ++R 1000,5000,ref_ref,s_50 ++R 1000,6000,ref_ref,s_60 ++R 1000,7000,ref_ref,s_70 ++R 2000,7000,ref_ref,s_70 ++R 3000,7000,ref_ref,s_70 ++R 4000,7000,ref_ref,s_70 ++R 5000,7000,ref_ref,s_70 ++R 1000,4000,ref_ref,a1_40 ++R 2000,4000,ref_ref,a1_40 ++R 2000,5000,ref_ref,a1_50 ++R 3000,5000,ref_ref,a1_50 ++R 2000,6000,ref_ref,a1_60 ++R 3000,6000,ref_ref,z_60 ++R 4000,6000,ref_ref,z_60 ++R 4000,2000,ref_ref,z_20 ++R 3000,4000,ref_ref,a0_40 ++R 3000,3000,ref_ref,a0_30 ++R 2000,3000,ref_ref,a0_30 ++R 1000,3000,ref_ref,a0_30 ++R 1000,2000,ref_ref,a0_30 ++R 5000,6000,ref_ref,s_60 ++R 5000,5000,ref_ref,s_50 ++R 4000,3000,ref_ref,z_30 ++R 4000,4000,ref_ref,z_40 ++R 4000,5000,ref_ref,z_50 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 2100,700,2900,700,600,*,RIGHT,PTIE ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,mxi2_x05,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 900,4000,2000,4000,600,*,RIGHT,ALU1 ++S 1000,3000,3000,3000,400,*,LEFT,ALU1 ++S 1000,4900,1000,7000,600,*,UP,ALU1 ++S 2000,3900,2000,6100,400,*,UP,ALU1 ++S 1000,7900,1000,9300,400,*,UP,ALU1 ++S 5000,7900,5000,9300,400,*,UP,ALU1 ++S 6400,6000,6400,6600,600,*,UP,PDIF ++S 1000,5000,1600,5000,600,*,RIGHT,POLY ++S 2000,5000,3200,5000,600,*,RIGHT,ALU1 ++S 4000,2000,4000,6000,400,*,DOWN,ALU1 ++S 2500,2000,4000,2000,400,*,LEFT,ALU1 ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 2500,1900,4000,1900,400,*,LEFT,ALU1 ++S 2400,4200,2400,5600,200,*,DOWN,POLY ++S 2400,4200,3000,4200,200,*,RIGHT,POLY ++S 3200,5000,3600,5000,600,*,RIGHT,POLY ++S 1000,2000,1000,3000,600,*,DOWN,ALU1 ++S 3000,3000,3000,4100,600,*,DOWN,ALU1 ++S 5000,4900,5000,7000,600,*,DOWN,ALU1 ++S 1000,7000,5100,7000,400,*,RIGHT,ALU1 ++S 4900,5000,5500,5000,600,*,RIGHT,ALU1 ++S 1000,2000,1000,3000,400,a0,UP,CALU1 ++S 2000,3000,2000,3000,400,a0,LEFT,CALU1 ++S 3000,3000,3000,4000,400,a0,UP,CALU1 ++S 4000,2000,4000,6000,400,z,UP,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 3000,6000,3000,6000,400,z,LEFT,CALU1 ++S 2000,4000,2000,6000,400,a1,UP,CALU1 ++S 1000,4000,1000,4000,400,a1,LEFT,CALU1 ++S 3000,5000,3000,5000,400,a1,LEFT,CALU1 ++S 1000,5000,1000,7000,400,s,UP,CALU1 ++S 5000,5000,5000,7000,400,s,DOWN,CALU1 ++S 2000,7000,2000,7000,400,s,LEFT,CALU1 ++S 3000,7000,3000,7000,400,s,LEFT,CALU1 ++S 4000,7000,4000,7000,400,s,LEFT,CALU1 ++S 3600,5600,3600,7600,200,4,DOWN,PTRANS ++S 3000,5800,3000,7400,600,*,UP,PDIF ++S 2400,5600,2400,7600,200,3,DOWN,PTRANS ++S 2000,5800,2000,7400,400,n1,UP,PDIF ++S 1600,5600,1600,7600,200,1,DOWN,PTRANS ++S 4400,5600,4400,7600,200,2,DOWN,PTRANS ++S 4000,5800,4000,7400,400,n2,UP,PDIF ++S 900,5800,900,8100,600,*,DOWN,PDIF ++S 1000,5800,1000,8100,600,*,DOWN,PDIF ++S 1600,7600,1600,8000,200,*,UP,POLY ++S 2400,7600,2400,8000,200,*,UP,POLY ++S 3600,7600,3600,8000,200,*,UP,POLY ++S 4400,7600,4400,8000,200,*,UP,POLY ++S 5100,5800,5100,8100,800,*,DOWN,PDIF ++S 5800,5600,5800,7400,200,1s,DOWN,PTRANS ++S 6200,5800,6200,7200,400,*,DOWN,PDIF ++S 5800,7400,5800,7800,200,*,UP,POLY ++S 1800,3500,1800,4900,200,*,UP,POLY ++S 2600,1900,2600,2400,1000,*,UP,NDIF ++S 3200,1700,3200,2600,200,8,UP,NTRANS ++S 2000,1700,2000,2600,200,7,UP,NTRANS ++S 3600,1900,3600,2400,600,n4,UP,NDIF ++S 4000,1700,4000,2600,200,6,UP,NTRANS ++S 1600,1900,1600,2400,600,n3,UP,NDIF ++S 1200,1700,1200,2600,200,5,UP,NTRANS ++S 600,800,600,2400,600,*,UP,NDIF ++S 4900,1900,4900,2400,1200,*,UP,NDIF ++S 4000,1300,4000,1700,200,*,DOWN,POLY ++S 3200,1300,3200,1700,200,*,DOWN,POLY ++S 2000,1300,2000,1700,200,*,DOWN,POLY ++S 1200,1300,1200,1700,200,*,DOWN,POLY ++S 5800,1300,5800,1700,200,*,DOWN,POLY ++S 5800,1700,5800,2600,200,2s,UP,NTRANS ++S 6200,1900,6200,2400,400,*,UP,NDIF ++S 6400,2200,6400,6800,400,*,DOWN,ALU1 ++S 5800,2600,5800,5200,200,*,UP,POLY ++S 5000,700,5000,2100,400,*,DOWN,ALU1 ++S 4800,3400,6400,3400,400,*,RIGHT,ALU1 ++S 4400,3400,5000,3400,600,*,LEFT,POLY ++S 4000,3200,5000,3200,200,*,RIGHT,POLY ++S 4400,3200,4400,5600,200,*,DOWN,POLY ++S 4000,2600,4000,3200,200,*,UP,POLY ++S 3200,2600,3200,4000,200,*,UP,POLY ++S 2000,2600,2000,3600,200,*,UP,POLY ++S 1200,2600,1200,4000,200,*,UP,POLY ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 3000,700,CONT_BODY_P,* ++V 2000,700,CONT_BODY_P,* ++V 600,900,CONT_DIF_N,* ++V 3000,4000,CONT_POLY,* ++V 1000,4000,CONT_POLY,* ++V 2600,2000,CONT_DIF_N,* ++V 1000,8000,CONT_DIF_P,* ++V 3000,6000,CONT_DIF_P,* ++V 5000,8000,CONT_DIF_P,* ++V 3200,5000,CONT_POLY,* ++V 1100,5000,CONT_POLY,* ++V 5400,5000,CONT_POLY,* ++V 6400,5900,CONT_DIF_P,sn ++V 6400,6700,CONT_DIF_P,sn ++V 5000,2000,CONT_DIF_N,* ++V 6400,2300,CONT_DIF_N,sn ++V 4900,3400,CONT_POLY,sn ++EOF +diff --git a/alliance/src/cells/src/msxlib/mxi2_x05.vbe b/alliance/src/cells/src/msxlib/mxi2_x05.vbe +new file mode 100644 +index 0000000..1d94014 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/mxi2_x05.vbe +@@ -0,0 +1,40 @@ ++ENTITY mxi2_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_s : NATURAL := 8; ++ CONSTANT cin_a0 : NATURAL := 4; ++ CONSTANT cin_a1 : NATURAL := 4; ++ CONSTANT rdown_s_z : NATURAL := 4090; ++ CONSTANT rdown_a0_z : NATURAL := 4100; ++ CONSTANT rdown_a1_z : NATURAL := 4110; ++ CONSTANT rup_s_z : NATURAL := 5780; ++ CONSTANT rup_a0_z : NATURAL := 5850; ++ CONSTANT rup_a1_z : NATURAL := 5840; ++ CONSTANT tphl_a0_z : NATURAL := 54; ++ CONSTANT tphl_a1_z : NATURAL := 54; ++ CONSTANT tphl_s_z : NATURAL := 58; ++ CONSTANT tplh_a0_z : NATURAL := 58; ++ CONSTANT tplh_a1_z : NATURAL := 69; ++ CONSTANT tplh_s_z : NATURAL := 66; ++ CONSTANT tphh_s_z : NATURAL := 101; ++ CONSTANT tpll_s_z : NATURAL := 97; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ s : in BIT; ++ a0 : in BIT; ++ a1 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END mxi2_x05; ++ ++ARCHITECTURE behaviour_data_flow OF mxi2_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on mxi2_x05" ++ SEVERITY WARNING; ++ z <= not (((a0 and not (s)) or (a1 and s))) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/mxi2_x1.ap b/alliance/src/cells/src/msxlib/mxi2_x1.ap +new file mode 100644 +index 0000000..35332b1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/mxi2_x1.ap +@@ -0,0 +1,134 @@ ++V ALLIANCE : 6 ++H mxi2_x1,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 3000,2000,ref_ref,z_20 ++R 1000,5000,ref_ref,s_50 ++R 1000,6000,ref_ref,s_60 ++R 1000,7000,ref_ref,s_70 ++R 2000,7000,ref_ref,s_70 ++R 3000,7000,ref_ref,s_70 ++R 4000,7000,ref_ref,s_70 ++R 5000,7000,ref_ref,s_70 ++R 1000,4000,ref_ref,a1_40 ++R 2000,4000,ref_ref,a1_40 ++R 2000,5000,ref_ref,a1_50 ++R 3000,5000,ref_ref,a1_50 ++R 2000,6000,ref_ref,a1_60 ++R 3000,6000,ref_ref,z_60 ++R 4000,6000,ref_ref,z_60 ++R 4000,2000,ref_ref,z_20 ++R 3000,4000,ref_ref,a0_40 ++R 3000,3000,ref_ref,a0_30 ++R 2000,3000,ref_ref,a0_30 ++R 1000,3000,ref_ref,a0_30 ++R 1000,2000,ref_ref,a0_30 ++R 5000,6000,ref_ref,s_60 ++R 5000,5000,ref_ref,s_50 ++R 4000,3000,ref_ref,z_30 ++R 4000,4000,ref_ref,z_40 ++R 4000,5000,ref_ref,z_50 ++S 4400,3800,4400,5600,200,*,DOWN,POLY ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,mxi2_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 5800,3400,5800,5200,200,*,UP,POLY ++S 900,4000,2000,4000,600,*,RIGHT,ALU1 ++S 1000,3000,3000,3000,400,*,LEFT,ALU1 ++S 5200,5800,5200,9200,600,*,DOWN,PDIF ++S 6200,5800,6200,7800,400,*,DOWN,PDIF ++S 5800,8000,5800,8400,200,*,UP,POLY ++S 1000,4900,1000,7000,600,*,UP,ALU1 ++S 2000,3900,2000,6100,400,*,UP,ALU1 ++S 1000,7900,1000,9300,400,*,UP,ALU1 ++S 1600,5600,1600,9400,200,1,DOWN,PTRANS ++S 900,5800,900,9200,600,*,DOWN,PDIF ++S 2400,5600,2400,9400,200,3,DOWN,PTRANS ++S 3600,5600,3600,9400,200,4,DOWN,PTRANS ++S 3000,5800,3000,9200,600,*,UP,PDIF ++S 4400,5600,4400,9400,200,2,DOWN,PTRANS ++S 5000,7900,5000,9300,400,*,UP,ALU1 ++S 1600,9400,1600,9700,200,*,UP,POLY ++S 2400,9400,2400,9700,200,*,UP,POLY ++S 3600,9400,3600,9700,200,*,UP,POLY ++S 4400,9400,4400,9700,200,*,UP,POLY ++S 6400,6000,6400,6600,600,*,UP,PDIF ++S 1000,5000,1600,5000,600,*,RIGHT,POLY ++S 2000,5000,3200,5000,600,*,RIGHT,ALU1 ++S 4000,2000,4000,6000,400,*,DOWN,ALU1 ++S 2500,2000,4000,2000,400,*,LEFT,ALU1 ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 2500,1900,4000,1900,400,*,LEFT,ALU1 ++S 2400,4200,2400,5600,200,*,DOWN,POLY ++S 2400,4200,3000,4200,200,*,RIGHT,POLY ++S 3200,5000,3600,5000,600,*,RIGHT,POLY ++S 1000,2000,1000,3000,600,*,DOWN,ALU1 ++S 3000,3000,3000,4100,600,*,DOWN,ALU1 ++S 5000,4900,5000,7000,600,*,DOWN,ALU1 ++S 1000,7000,5100,7000,400,*,RIGHT,ALU1 ++S 4900,5000,5500,5000,600,*,RIGHT,ALU1 ++S 5800,5600,5800,8000,200,1s,DOWN,PTRANS ++S 2000,5800,2000,9200,400,n1,UP,PDIF ++S 4000,5800,4000,9200,400,n2,UP,PDIF ++S 1000,2000,1000,3000,400,a0,UP,CALU1 ++S 2000,3000,2000,3000,400,a0,LEFT,CALU1 ++S 3000,3000,3000,4000,400,a0,UP,CALU1 ++S 4000,2000,4000,6000,400,z,UP,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 3000,6000,3000,6000,400,z,LEFT,CALU1 ++S 2000,4000,2000,6000,400,a1,UP,CALU1 ++S 1000,4000,1000,4000,400,a1,LEFT,CALU1 ++S 3000,5000,3000,5000,400,a1,LEFT,CALU1 ++S 1000,5000,1000,7000,400,s,UP,CALU1 ++S 5000,5000,5000,7000,400,s,DOWN,CALU1 ++S 2000,7000,2000,7000,400,s,LEFT,CALU1 ++S 3000,7000,3000,7000,400,s,LEFT,CALU1 ++S 4000,7000,4000,7000,400,s,LEFT,CALU1 ++S 1800,3500,1800,4900,200,*,UP,POLY ++S 1600,1600,1600,2900,600,n3,UP,NDIF ++S 2000,1400,2000,3100,200,7,UP,NTRANS ++S 1200,1400,1200,3100,200,5,UP,NTRANS ++S 2600,1600,2600,2900,1000,*,UP,NDIF ++S 3200,1400,3200,3100,200,8,UP,NTRANS ++S 3600,1600,3600,2900,600,n4,UP,NDIF ++S 4000,1400,4000,3100,200,6,UP,NTRANS ++S 4000,1000,4000,1400,200,*,DOWN,POLY ++S 3200,1000,3200,1400,200,*,DOWN,POLY ++S 2000,1000,2000,1400,200,*,DOWN,POLY ++S 1200,1000,1200,1400,200,*,DOWN,POLY ++S 600,890,600,2900,600,*,UP,NDIF ++S 6200,2100,6200,2900,400,*,UP,NDIF ++S 4900,1600,4900,2900,1200,*,UP,NDIF ++S 5000,700,5000,2900,400,*,DOWN,ALU1 ++S 6400,2700,6400,6800,400,*,DOWN,ALU1 ++S 5800,1900,5800,3100,200,2s,UP,NTRANS ++S 5800,1500,5800,1900,200,*,DOWN,POLY ++S 4800,3800,6400,3800,400,*,RIGHT,ALU1 ++S 4400,3800,5000,3800,600,*,LEFT,POLY ++S 4000,3600,5000,3600,200,*,RIGHT,POLY ++S 4000,3100,4000,3600,200,*,UP,POLY ++S 3200,3100,3200,4000,200,*,UP,POLY ++S 2000,3100,2000,3600,200,*,UP,POLY ++S 1200,3100,1200,4000,200,*,UP,POLY ++V 6300,9300,CONT_BODY_N,* ++V 6300,700,CONT_BODY_P,* ++V 600,900,CONT_DIF_N,* ++V 3000,4000,CONT_POLY,* ++V 1000,4000,CONT_POLY,* ++V 2600,2000,CONT_DIF_N,* ++V 1000,8000,CONT_DIF_P,* ++V 3000,6000,CONT_DIF_P,* ++V 5000,8000,CONT_DIF_P,* ++V 5000,9000,CONT_DIF_P,* ++V 1000,9000,CONT_DIF_P,* ++V 3200,5000,CONT_POLY,* ++V 1100,5000,CONT_POLY,* ++V 5400,5000,CONT_POLY,* ++V 6400,5900,CONT_DIF_P,sn ++V 6400,6700,CONT_DIF_P,sn ++V 5000,2000,CONT_DIF_N,* ++V 5000,2800,CONT_DIF_N,* ++V 6400,2800,CONT_DIF_N,sn ++V 4900,3800,CONT_POLY,sn ++EOF +diff --git a/alliance/src/cells/src/msxlib/mxi2_x1.vbe b/alliance/src/cells/src/msxlib/mxi2_x1.vbe +new file mode 100644 +index 0000000..9867123 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/mxi2_x1.vbe +@@ -0,0 +1,40 @@ ++ENTITY mxi2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_s : NATURAL := 11; ++ CONSTANT cin_a0 : NATURAL := 6; ++ CONSTANT cin_a1 : NATURAL := 6; ++ CONSTANT rdown_s_z : NATURAL := 2170; ++ CONSTANT rdown_a0_z : NATURAL := 2170; ++ CONSTANT rdown_a1_z : NATURAL := 2180; ++ CONSTANT rup_s_z : NATURAL := 3040; ++ CONSTANT rup_a0_z : NATURAL := 3080; ++ CONSTANT rup_a1_z : NATURAL := 3070; ++ CONSTANT tphl_a0_z : NATURAL := 51; ++ CONSTANT tphl_a1_z : NATURAL := 51; ++ CONSTANT tphl_s_z : NATURAL := 55; ++ CONSTANT tplh_a0_z : NATURAL := 54; ++ CONSTANT tplh_a1_z : NATURAL := 65; ++ CONSTANT tplh_s_z : NATURAL := 62; ++ CONSTANT tphh_s_z : NATURAL := 101; ++ CONSTANT tpll_s_z : NATURAL := 99; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ s : in BIT; ++ a0 : in BIT; ++ a1 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END mxi2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF mxi2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on mxi2_x1" ++ SEVERITY WARNING; ++ z <= not (((a0 and not (s)) or (a1 and s))) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd2_x05.ap b/alliance/src/cells/src/msxlib/nd2_x05.ap +new file mode 100644 +index 0000000..930e7fb +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2_x05.ap +@@ -0,0 +1,72 @@ ++V ALLIANCE : 6 ++H nd2_x05,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 2000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++R 2000,5000,ref_ref,b_50 ++R 2000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 3000,4000,ref_ref,b_40 ++R 3000,6000,ref_ref,a_60 ++R 2000,4000,ref_ref,b_40 ++R 1000,7000,ref_ref,z_70 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 3000,4000,3000,4000,400,b,LEFT,CALU1 ++S 2000,7000,2000,7400,600,*,DOWN,ALU1 ++S 700,7300,700,8100,800,*,DOWN,PDIF ++S 3300,7300,3300,8100,800,*,DOWN,PDIF ++S 1400,7100,1400,8300,200,1,UP,PTRANS ++S 2000,7300,2000,8100,1000,*,DOWN,PDIF ++S 2600,7100,2600,8300,200,2,UP,PTRANS ++S 1400,4500,1400,7200,200,*,DOWN,POLY ++S 2600,6000,2600,7200,200,*,DOWN,POLY ++S 3000,5000,3000,6000,400,a,DOWN,CALU1 ++S 3000,4900,3000,6100,400,*,DOWN,ALU1 ++S 2000,6000,3000,6000,600,*,RIGHT,ALU1 ++S 2800,2300,2800,2700,200,*,UP,POLY ++S 2000,2300,2000,2700,200,*,UP,POLY ++S 2000,3700,2000,4300,200,*,UP,POLY ++S 2800,3700,2800,6000,200,*,UP,POLY ++S 3400,2900,3400,3500,600,*,UP,NDIF ++S 1600,2900,1600,3500,400,*,UP,NDIF ++S 2000,2700,2000,3700,200,3,DOWN,NTRANS ++S 2800,2700,2800,3700,200,4,DOWN,NTRANS ++S 2400,2900,2400,3500,600,n1,UP,NDIF ++S 3400,700,3400,3100,400,*,DOWN,ALU1 ++S 1500,4500,1700,4500,200,*,RIGHT,POLY ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 2000,6000,2000,6000,400,a,LEFT,CALU1 ++S 2000,4000,3000,4000,600,*,LEFT,ALU1 ++S 1000,7000,2100,7000,400,*,RIGHT,ALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,4000,5000,10000,nd2_x05,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 1000,2900,1500,2900,400,*,RIGHT,ALU1 ++S 1000,3000,1500,3000,400,*,RIGHT,ALU1 ++S 2000,4000,2000,5100,400,*,UP,ALU1 ++S 2000,4000,2000,5000,400,b,DOWN,CALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1000,2900,1000,7000,400,*,DOWN,ALU1 ++S 1000,7100,2100,7100,400,*,RIGHT,ALU1 ++S 800,7900,800,9300,400,*,UP,ALU1 ++S 3200,7900,3200,9300,400,*,UP,ALU1 ++S 1400,8300,1400,8700,200,*,DOWN,POLY ++S 2600,8300,2600,8700,200,*,DOWN,POLY ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,7400,CONT_DIF_P,* ++V 3400,3000,CONT_DIF_N,* ++V 2000,4300,CONT_POLY,* ++V 1400,3000,CONT_DIF_N,* ++V 800,8000,CONT_DIF_P,* ++V 3200,8000,CONT_DIF_P,* ++V 2800,6000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd2_x05.vbe b/alliance/src/cells/src/msxlib/nd2_x05.vbe +new file mode 100644 +index 0000000..fa5b61e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2_x05.vbe +@@ -0,0 +1,32 @@ ++ENTITY nd2_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 3; ++ CONSTANT cin_b : NATURAL := 3; ++ CONSTANT rdown_a_z : NATURAL := 3680; ++ CONSTANT rdown_b_z : NATURAL := 3680; ++ CONSTANT rup_a_z : NATURAL := 4930; ++ CONSTANT rup_b_z : NATURAL := 4940; ++ CONSTANT tphl_a_z : NATURAL := 35; ++ CONSTANT tphl_b_z : NATURAL := 36; ++ CONSTANT tplh_b_z : NATURAL := 46; ++ CONSTANT tplh_a_z : NATURAL := 52; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd2_x05; ++ ++ARCHITECTURE behaviour_data_flow OF nd2_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd2_x05" ++ SEVERITY WARNING; ++ z <= not ((a and b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd2_x1.ap b/alliance/src/cells/src/msxlib/nd2_x1.ap +new file mode 100644 +index 0000000..99a3aa2 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2_x1.ap +@@ -0,0 +1,75 @@ ++V ALLIANCE : 6 ++H nd2_x1,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 2000,4000,ref_ref,b_40 ++R 1000,3000,ref_ref,z_30 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 3000,4000,ref_ref,a_40 ++R 2000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,b_50 ++R 3000,5000,ref_ref,b_50 ++R 3000,3000,ref_ref,a_30 ++R 2000,3000,ref_ref,a_30 ++R 1000,2000,ref_ref,z_20 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 2000,3000,3000,3000,600,*,LEFT,ALU1 ++S 0,5000,4000,5000,10000,nd2_x1,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 1400,7700,1400,8000,200,*,DOWN,POLY ++S 1400,5600,1400,7600,200,1,UP,PTRANS ++S 2000,5800,2000,7400,1000,*,DOWN,PDIF ++S 2600,7700,2600,8000,200,*,DOWN,POLY ++S 2600,5600,2600,7600,200,2,UP,PTRANS ++S 1000,6000,2000,6000,600,*,LEFT,ALU1 ++S 2000,6000,2000,7100,400,*,UP,ALU1 ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 3200,5900,3200,9300,400,*,UP,ALU1 ++S 800,6900,800,9300,400,*,UP,ALU1 ++S 3300,5800,3300,7400,600,*,DOWN,PDIF ++S 700,5800,700,7400,600,*,DOWN,PDIF ++S 1000,2300,1000,2900,600,*,UP,NDIF ++S 1200,1800,1200,3100,400,*,UP,NDIF ++S 2000,1800,2000,3100,600,n1,UP,NDIF ++S 1600,1600,1600,3300,200,3,DOWN,NTRANS ++S 2400,1600,2400,3300,200,4,DOWN,NTRANS ++S 1600,1200,1600,1600,200,*,UP,POLY ++S 2400,1200,2400,1600,200,*,UP,POLY ++S 3000,700,3000,2100,400,*,DOWN,ALU1 ++S 3100,1800,3100,3100,600,*,UP,NDIF ++S 3000,5000,3000,5000,400,b,LEFT,CALU1 ++S 3000,2900,3000,4100,400,*,DOWN,ALU1 ++S 3000,3000,3000,4000,400,a,DOWN,CALU1 ++S 2000,4000,2000,5000,400,b,DOWN,CALU1 ++S 2000,3900,2000,5100,400,*,DOWN,ALU1 ++S 2000,3000,2000,3000,400,a,LEFT,CALU1 ++S 1400,4800,1400,5600,200,*,DOWN,POLY ++S 1600,3300,1600,5200,200,*,UP,POLY ++S 1400,5000,1800,5000,600,*,LEFT,POLY ++S 1800,5000,3000,5000,600,*,RIGHT,ALU1 ++S 2600,3800,2600,5600,200,*,DOWN,POLY ++S 2400,3300,2400,4200,200,*,UP,POLY ++S 2400,4000,3000,4000,600,*,LEFT,POLY ++S 1000,2000,1000,6000,400,z,DOWN,CALU1 ++S 1000,1900,1000,6000,400,*,DOWN,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,7000,CONT_DIF_P,* ++V 2000,6000,CONT_DIF_P,* ++V 800,7000,CONT_DIF_P,* ++V 3200,7000,CONT_DIF_P,* ++V 3200,6000,CONT_DIF_P,* ++V 1000,3000,CONT_DIF_N,* ++V 1000,2200,CONT_DIF_N,* ++V 3000,2000,CONT_DIF_N,* ++V 3000,4000,CONT_POLY,* ++V 1800,5000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd2_x1.vbe b/alliance/src/cells/src/msxlib/nd2_x1.vbe +new file mode 100644 +index 0000000..e179081 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2_x1.vbe +@@ -0,0 +1,32 @@ ++ENTITY nd2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT rdown_a_z : NATURAL := 2160; ++ CONSTANT rdown_b_z : NATURAL := 2160; ++ CONSTANT rup_a_z : NATURAL := 2960; ++ CONSTANT rup_b_z : NATURAL := 2960; ++ CONSTANT tphl_a_z : NATURAL := 34; ++ CONSTANT tphl_b_z : NATURAL := 35; ++ CONSTANT tplh_b_z : NATURAL := 45; ++ CONSTANT tplh_a_z : NATURAL := 51; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nd2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd2_x1" ++ SEVERITY WARNING; ++ z <= not ((a and b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd2_x2.ap b/alliance/src/cells/src/msxlib/nd2_x2.ap +new file mode 100644 +index 0000000..946cd48 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2_x2.ap +@@ -0,0 +1,74 @@ ++V ALLIANCE : 6 ++H nd2_x2,P, 9/10/2005,100 ++A 0,0,4000,10000 ++R 3000,5000,ref_ref,a_50 ++R 2000,5000,ref_ref,b_50 ++R 2000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 2000,8000,ref_ref,z_80 ++R 2000,6000,ref_ref,b_60 ++R 3000,6000,ref_ref,b_60 ++R 3000,4000,ref_ref,a_40 ++R 2000,4000,ref_ref,a_40 ++R 1000,7000,ref_ref,z_70 ++R 1000,3000,ref_ref,z_30 ++R 1000,2000,ref_ref,z_20 ++R 3000,3000,ref_ref,a_30 ++S 3000,3000,3000,5000,400,a,DOWN,CALU1 ++S 1800,3900,1800,4900,200,*,UP,POLY ++S 2600,4900,3200,4900,600,*,LEFT,POLY ++S 1900,4000,3000,4000,400,*,LEFT,ALU1 ++S 3000,6000,3000,6000,400,b,LEFT,CALU1 ++S 2800,9400,2800,9700,200,*,UP,POLY ++S 1600,9400,1600,9700,200,*,UP,POLY ++S 1000,7000,2200,7000,600,*,LEFT,ALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,5000,4000,5000,10000,nd2_x2,LEFT,TALU8 ++S 2000,6000,3000,6000,600,*,RIGHT,ALU1 ++S 2000,5000,2000,6000,400,b,UP,CALU1 ++S 1000,8000,1000,9300,400,*,UP,ALU1 ++S 3400,8000,3400,9300,400,*,UP,ALU1 ++S 2100,7000,2100,8100,600,*,DOWN,ALU1 ++S 2000,7000,2000,8000,400,z,UP,CALU1 ++S 3400,5700,3400,9100,600,*,DOWN,PDIF ++S 2800,5500,2800,9400,200,2,UP,PTRANS ++S 2200,5700,2200,9200,1000,*,DOWN,PDIF ++S 1600,5500,1600,9400,200,1,UP,PTRANS ++S 1000,5700,1000,9200,1000,*,DOWN,PDIF ++S 2000,4800,2000,6000,400,*,UP,ALU1 ++S 1600,5100,1600,5500,200,*,DOWN,POLY ++S 1200,2100,1200,2900,600,*,UP,NDIF ++S 1400,800,1400,3700,400,*,UP,NDIF ++S 1800,600,1800,3900,200,3,DOWN,NTRANS ++S 1800,300,1800,600,200,*,UP,POLY ++S 2200,800,2200,3700,600,n1,UP,NDIF ++S 2600,600,2600,3900,200,4,DOWN,NTRANS ++S 2600,300,2600,600,200,*,UP,POLY ++S 3200,700,3200,2100,400,*,DOWN,ALU1 ++S 3300,800,3300,3700,600,*,UP,NDIF ++S 1100,1900,1100,3100,600,*,UP,ALU1 ++S 2000,4000,2000,4000,400,a,LEFT,CALU1 ++S 1800,4900,2000,4900,600,*,RIGHT,ALU1 ++S 2800,4700,2800,5500,200,*,UP,POLY ++S 2600,3900,2600,5100,200,*,UP,POLY ++S 1000,1900,1000,7000,400,*,DOWN,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 3000,2900,3000,5100,400,*,DOWN,ALU1 ++V 1200,2200,CONT_DIF_N,* ++V 1000,8100,CONT_DIF_P,* ++V 3400,8100,CONT_DIF_P,* ++V 1000,9100,CONT_DIF_P,* ++V 3400,9100,CONT_DIF_P,* ++V 2200,7000,CONT_DIF_P,* ++V 2200,8000,CONT_DIF_P,* ++V 3000,4900,CONT_POLY,* ++V 1800,4900,CONT_POLY,* ++V 1200,3000,CONT_DIF_N,* ++V 3200,2000,CONT_DIF_N,* ++V 3200,1000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd2_x2.vbe b/alliance/src/cells/src/msxlib/nd2_x2.vbe +new file mode 100644 +index 0000000..3b871e5 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2_x2.vbe +@@ -0,0 +1,32 @@ ++ENTITY nd2_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 8; ++ CONSTANT cin_b : NATURAL := 8; ++ CONSTANT rdown_a_z : NATURAL := 1110; ++ CONSTANT rdown_b_z : NATURAL := 1110; ++ CONSTANT rup_a_z : NATURAL := 1520; ++ CONSTANT rup_b_z : NATURAL := 1520; ++ CONSTANT tphl_a_z : NATURAL := 33; ++ CONSTANT tphl_b_z : NATURAL := 34; ++ CONSTANT tplh_b_z : NATURAL := 44; ++ CONSTANT tplh_a_z : NATURAL := 50; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd2_x2; ++ ++ARCHITECTURE behaviour_data_flow OF nd2_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd2_x2" ++ SEVERITY WARNING; ++ z <= not ((a and b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd2_x4.ap b/alliance/src/cells/src/msxlib/nd2_x4.ap +new file mode 100644 +index 0000000..7868c0c +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2_x4.ap +@@ -0,0 +1,114 @@ ++V ALLIANCE : 6 ++H nd2_x4,P,29/ 9/2005,100 ++A 0,0,6000,10000 ++R 3000,2000,ref_ref,z_20 ++R 2000,4000,ref_ref,a_40 ++R 1000,3000,ref_ref,z_30 ++R 5000,6000,ref_ref,b_60 ++R 4000,8000,ref_ref,z_80 ++R 5000,4000,ref_ref,a_40 ++R 4000,6000,ref_ref,b_60 ++R 2000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 3000,3000,ref_ref,z_30 ++R 3000,7000,ref_ref,z_70 ++R 4000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,a_50 ++R 3000,4000,ref_ref,a_40 ++R 4000,4000,ref_ref,a_40 ++R 4000,5000,ref_ref,b_50 ++R 5000,5000,ref_ref,a_50 ++R 2000,6000,ref_ref,z_60 ++S 4600,4200,5000,4200,200,*,RIGHT,POLY ++S 4600,3800,4600,4300,200,*,UP,POLY ++S 3800,6000,5100,6000,400,*,RIGHT,ALU1 ++S 5000,6000,5000,6000,400,b,UP,CALU1 ++S 5000,3900,5000,5100,400,*,UP,ALU1 ++S 5000,4000,5000,5000,400,a,UP,CALU1 ++S 1000,2900,1000,6100,400,*,DOWN,ALU1 ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 2400,4800,2400,5600,200,*,DOWN,POLY ++S 4600,300,4600,600,200,*,UP,POLY ++S 3800,300,3800,600,200,*,UP,POLY ++S 2600,300,2600,600,200,*,UP,POLY ++S 1800,300,1800,600,200,*,UP,POLY ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 3000,4000,3000,4000,400,a,LEFT,CALU1 ++S 3100,1900,3100,3000,600,*,DOWN,ALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 3000,2000,3000,3000,400,z,DOWN,CALU1 ++S 1000,3000,3200,3000,600,*,RIGHT,ALU1 ++S 3900,4900,3900,6000,600,*,DOWN,ALU1 ++S 3700,4300,3700,4800,400,*,UP,POLY ++S 1800,3800,1800,4700,200,*,UP,POLY ++S 5200,800,5200,3600,600,*,UP,NDIF ++S 5200,700,5200,2100,400,*,DOWN,ALU1 ++S 4600,600,4600,3800,200,8,DOWN,NTRANS ++S 4200,900,4200,3600,600,n2,UP,NDIF ++S 2600,4200,3800,4200,200,*,RIGHT,POLY ++S 3800,600,3800,3800,200,7,DOWN,NTRANS ++S 3200,800,3200,3600,600,*,UP,NDIF ++S 2600,600,2600,3800,200,6,DOWN,NTRANS ++S 2200,900,2200,3600,600,n1,UP,NDIF ++S 1800,600,1800,3800,200,5,DOWN,NTRANS ++S 1100,800,1100,3600,600,*,UP,NDIF ++S 1200,700,1200,2100,400,*,DOWN,ALU1 ++S 2000,3900,5000,3900,400,*,RIGHT,ALU1 ++S 2000,4000,5000,4000,400,*,RIGHT,ALU1 ++S 4000,5000,4000,6000,400,b,DOWN,CALU1 ++S 4000,7000,4000,8000,400,z,UP,CALU1 ++S 4100,7000,4100,8100,600,*,DOWN,ALU1 ++S 3000,5800,3000,9200,600,*,DOWN,PDIF ++S 5400,7900,5400,9300,400,*,UP,ALU1 ++S 3000,7900,3000,9300,400,*,UP,ALU1 ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,5000,6000,5000,10000,nd2_x4,LEFT,TALU8 ++S 1200,5600,1200,9400,200,1,UP,PTRANS ++S 600,5800,600,9200,600,*,DOWN,PDIF ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 1800,5800,1800,9200,1000,*,DOWN,PDIF ++S 2400,5600,2400,9400,200,2,UP,PTRANS ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 3600,5600,3600,9400,200,3,UP,PTRANS ++S 4800,5600,4800,9400,200,4,UP,PTRANS ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 5400,5800,5400,9200,600,*,DOWN,PDIF ++S 4200,5800,4200,9200,1000,*,DOWN,PDIF ++S 1200,5200,2400,5200,200,*,RIGHT,POLY ++S 3600,5200,4800,5200,200,*,RIGHT,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 4800,9400,4800,9700,200,*,DOWN,POLY ++S 2000,4000,2000,5000,400,a,DOWN,CALU1 ++S 2000,4000,2000,5100,400,*,DOWN,ALU1 ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 1000,3000,1000,6000,400,z,DOWN,CALU1 ++S 1800,7000,4200,7000,400,*,LEFT,ALU1 ++S 1800,7100,4200,7100,400,*,LEFT,ALU1 ++S 1000,6000,2000,6000,600,*,RIGHT,ALU1 ++S 1900,5900,1900,7100,600,*,DOWN,ALU1 ++V 4200,7100,CONT_DIF_P,* ++V 3800,5000,CONT_POLY,* ++V 5200,1000,CONT_DIF_N,* ++V 5200,2000,CONT_DIF_N,* ++V 3200,3000,CONT_DIF_N,* ++V 3200,2000,CONT_DIF_N,* ++V 1200,1000,CONT_DIF_N,* ++V 1200,2000,CONT_DIF_N,* ++V 5000,4400,CONT_POLY,* ++V 4200,8000,CONT_DIF_P,* ++V 5400,9000,CONT_DIF_P,* ++V 3000,9000,CONT_DIF_P,* ++V 600,9000,CONT_DIF_P,* ++V 5400,8000,CONT_DIF_P,* ++V 3000,8000,CONT_DIF_P,* ++V 600,8000,CONT_DIF_P,* ++V 2000,5000,CONT_POLY,* ++V 1800,7000,CONT_DIF_P,* ++V 1800,6000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd2_x4.vbe b/alliance/src/cells/src/msxlib/nd2_x4.vbe +new file mode 100644 +index 0000000..481418a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2_x4.vbe +@@ -0,0 +1,32 @@ ++ENTITY nd2_x4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 15; ++ CONSTANT cin_b : NATURAL := 14; ++ CONSTANT rdown_a_z : NATURAL := 570; ++ CONSTANT rdown_b_z : NATURAL := 570; ++ CONSTANT rup_a_z : NATURAL := 780; ++ CONSTANT rup_b_z : NATURAL := 780; ++ CONSTANT tphl_a_z : NATURAL := 32; ++ CONSTANT tphl_b_z : NATURAL := 34; ++ CONSTANT tplh_b_z : NATURAL := 43; ++ CONSTANT tplh_a_z : NATURAL := 49; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd2_x4; ++ ++ARCHITECTURE behaviour_data_flow OF nd2_x4 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd2_x4" ++ SEVERITY WARNING; ++ z <= not ((a and b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd2a_x1.ap b/alliance/src/cells/src/msxlib/nd2a_x1.ap +new file mode 100644 +index 0000000..a56c70a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2a_x1.ap +@@ -0,0 +1,91 @@ ++V ALLIANCE : 6 ++H nd2a_x1,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 2000,2000,ref_ref,a_20 ++R 3000,2000,ref_ref,a_20 ++R 2000,5000,ref_ref,b_50 ++R 2000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 2000,8000,ref_ref,z_80 ++R 2000,6000,ref_ref,b_60 ++R 3000,6000,ref_ref,b_60 ++R 3000,7000,ref_ref,b_70 ++R 3000,4000,ref_ref,a_40 ++R 3000,3000,ref_ref,a_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,3000,ref_ref,z_30 ++R 1000,2000,ref_ref,z_20 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 3800,8300,3800,8700,200,*,UP,POLY ++S 2600,8300,2600,8700,200,*,UP,POLY ++S 1400,8300,1400,8700,200,*,UP,POLY ++S 1400,4700,1400,6300,200,*,DOWN,POLY ++S 3800,3300,3800,6300,200,*,DOWN,POLY ++S 3000,4000,3600,4000,600,*,LEFT,ALU1 ++S 2000,2000,3000,2000,600,*,RIGHT,ALU1 ++S 2000,2000,2000,2000,400,a,LEFT,CALU1 ++S 2600,3700,2600,6300,200,*,DOWN,POLY ++S 2400,3300,2400,3800,200,*,UP,POLY ++S 2400,1200,2400,1600,200,*,DOWN,POLY ++S 2400,1600,2400,3300,200,4,DOWN,NTRANS ++S 2000,1800,2000,3100,600,n1,UP,NDIF ++S 1600,3300,1600,4500,200,*,UP,POLY ++S 1600,1200,1600,1600,200,*,DOWN,POLY ++S 1600,1600,1600,3300,200,3,DOWN,NTRANS ++S 1200,1800,1200,3100,400,*,UP,NDIF ++S 1000,2100,1000,2900,600,*,UP,NDIF ++S 2800,5000,4400,5000,400,*,RIGHT,ALU1 ++S 4400,2900,4400,7500,400,*,DOWN,ALU1 ++S 3200,900,3200,3100,600,*,UP,NDIF ++S 3800,1900,3800,2300,200,*,DOWN,POLY ++S 4200,2500,4200,3100,400,*,UP,NDIF ++S 3800,2300,3800,3300,200,2a,DOWN,NTRANS ++S 4400,6700,4400,7300,600,*,UP,PDIF ++S 3200,6500,3200,8100,600,*,DOWN,PDIF ++S 4200,6500,4200,8100,400,*,DOWN,PDIF ++S 3800,6300,3800,8300,200,1a,UP,PTRANS ++S 700,6500,700,8100,600,*,DOWN,PDIF ++S 2000,6500,2000,8100,1000,*,DOWN,PDIF ++S 1400,6300,1400,8300,200,1,UP,PTRANS ++S 2600,6300,2600,8300,200,2,UP,PTRANS ++S 3200,7900,3200,9300,400,*,UP,ALU1 ++S 800,7900,800,9300,400,*,UP,ALU1 ++S 3000,1900,3000,4000,400,*,DOWN,ALU1 ++S 3000,2000,3000,4000,400,a,DOWN,CALU1 ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,nd2a_x1,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 1000,7000,2000,7000,600,*,LEFT,ALU1 ++S 2000,7000,2000,8100,400,*,DOWN,ALU1 ++S 3000,6000,3000,7100,400,*,UP,ALU1 ++S 2000,6000,3000,6000,600,*,RIGHT,ALU1 ++S 3000,6000,3000,7000,400,b,UP,CALU1 ++S 2000,5000,2000,6000,400,b,UP,CALU1 ++S 2000,7000,2000,8000,400,z,UP,CALU1 ++S 2000,4800,2000,6000,400,*,UP,ALU1 ++S 1800,4900,2000,4900,600,*,RIGHT,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,1900,1000,7000,400,*,DOWN,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2900,5000,CONT_POLY,an ++V 4400,3000,CONT_DIF_N,an ++V 4400,6600,CONT_DIF_P,an ++V 4400,7400,CONT_DIF_P,an ++V 1000,2200,CONT_DIF_N,* ++V 1000,3000,CONT_DIF_N,* ++V 3500,4000,CONT_POLY,* ++V 800,8000,CONT_DIF_P,* ++V 3200,8000,CONT_DIF_P,* ++V 2000,7000,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,* ++V 1800,4900,CONT_POLY,* ++V 3200,1000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd2a_x1.vbe b/alliance/src/cells/src/msxlib/nd2a_x1.vbe +new file mode 100644 +index 0000000..d6c5c83 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2a_x1.vbe +@@ -0,0 +1,32 @@ ++ENTITY nd2a_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT rdown_b_z : NATURAL := 2160; ++ CONSTANT rdown_a_z : NATURAL := 2160; ++ CONSTANT rup_b_z : NATURAL := 2960; ++ CONSTANT rup_a_z : NATURAL := 2960; ++ CONSTANT tphl_b_z : NATURAL := 36; ++ CONSTANT tplh_b_z : NATURAL := 45; ++ CONSTANT tpll_a_z : NATURAL := 78; ++ CONSTANT tphh_a_z : NATURAL := 75; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd2a_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nd2a_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd2a_x1" ++ SEVERITY WARNING; ++ z <= (not (b) or a) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd2a_x2.ap b/alliance/src/cells/src/msxlib/nd2a_x2.ap +new file mode 100644 +index 0000000..657916c +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2a_x2.ap +@@ -0,0 +1,95 @@ ++V ALLIANCE : 6 ++H nd2a_x2,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 3000,4000,ref_ref,a_40 ++R 3000,7000,ref_ref,b_70 ++R 3000,6000,ref_ref,b_60 ++R 2000,6000,ref_ref,b_60 ++R 2000,8000,ref_ref,z_80 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,b_50 ++R 2000,2000,ref_ref,a_20 ++R 2000,3000,ref_ref,a_30 ++R 3000,3000,ref_ref,a_30 ++S 1800,4900,2000,4900,600,*,RIGHT,ALU1 ++S 2600,300,2600,600,200,*,UP,POLY ++S 2600,600,2600,3900,200,4,DOWN,NTRANS ++S 2200,800,2200,3700,600,n1,UP,NDIF ++S 1800,3900,1800,4500,200,*,UP,POLY ++S 1800,300,1800,600,200,*,UP,POLY ++S 1800,600,1800,3900,200,3,DOWN,NTRANS ++S 1400,800,1400,3700,400,*,UP,NDIF ++S 2000,4800,2000,6000,400,*,UP,ALU1 ++S 2000,7000,2000,8000,400,z,UP,CALU1 ++S 2000,5000,2000,6000,400,b,UP,CALU1 ++S 3000,6000,3000,7000,400,b,UP,CALU1 ++S 2000,6000,3000,6000,600,*,RIGHT,ALU1 ++S 3000,6000,3000,7100,400,*,UP,ALU1 ++S 1400,5500,1400,9400,200,1,UP,PTRANS ++S 1400,9400,1400,9700,200,*,UP,POLY ++S 2000,7000,2000,8100,400,*,DOWN,ALU1 ++S 1000,7000,2000,7000,600,*,LEFT,ALU1 ++S 1400,5000,1400,5500,200,*,DOWN,POLY ++S 2000,5700,2000,9200,1000,*,DOWN,PDIF ++S 2600,5500,2600,9400,200,2,UP,PTRANS ++S 2600,9400,2600,9700,200,*,UP,POLY ++S 2600,3900,2600,5500,200,*,UP,POLY ++S 3200,8000,3200,9300,400,*,UP,ALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,nd2a_x2,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 4400,5900,4400,6500,600,*,UP,PDIF ++S 4200,5700,4200,8300,400,*,DOWN,PDIF ++S 3200,5700,3200,9200,600,*,DOWN,PDIF ++S 3800,8400,3800,8900,200,*,UP,POLY ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 3800,3900,3800,5500,200,*,DOWN,POLY ++S 3800,5500,3800,8500,200,1a,UP,PTRANS ++S 3000,800,3000,3700,400,*,DOWN,NDIF ++S 2800,4900,4600,4900,400,*,RIGHT,ALU1 ++S 4600,2100,4600,4900,400,*,DOWN,ALU1 ++S 4400,4900,4400,6700,400,*,DOWN,ALU1 ++S 3800,1800,3800,3300,200,2a,DOWN,NTRANS ++S 3200,800,3200,3100,600,*,UP,NDIF ++S 4500,2000,4500,3000,600,*,UP,ALU1 ++S 4400,2200,4400,3100,600,*,UP,NDIF ++S 3800,1400,3800,1800,200,*,DOWN,POLY ++S 700,5700,700,9200,600,*,DOWN,PDIF ++S 800,8000,800,9300,400,*,UP,ALU1 ++S 3200,700,3200,2100,400,*,DOWN,ALU1 ++S 3000,3000,3000,4000,400,a,DOWN,CALU1 ++S 2000,2000,2000,3000,400,a,DOWN,CALU1 ++S 2000,1900,2000,3100,400,*,DOWN,ALU1 ++S 1200,2700,1200,3500,600,*,UP,NDIF ++S 1000,2700,1000,7000,400,*,DOWN,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1100,2700,1100,3700,600,*,UP,ALU1 ++S 3000,3900,3800,3900,600,*,LEFT,ALU1 ++S 3000,2900,3000,4000,600,*,DOWN,ALU1 ++S 2000,3000,3100,3000,600,*,RIGHT,ALU1 ++V 4300,9300,CONT_BODY_N,* ++V 4300,700,CONT_BODY_P,* ++V 3200,1000,CONT_DIF_N,* ++V 1800,4900,CONT_POLY,* ++V 800,8100,CONT_DIF_P,* ++V 800,9100,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,* ++V 2000,7000,CONT_DIF_P,* ++V 3200,8100,CONT_DIF_P,* ++V 3200,9100,CONT_DIF_P,* ++V 4400,5800,CONT_DIF_P,* ++V 4400,6600,CONT_DIF_P,* ++V 2900,4900,CONT_POLY,* ++V 4400,2100,CONT_DIF_N,* ++V 4400,2900,CONT_DIF_N,* ++V 3200,2000,CONT_DIF_N,* ++V 1200,3600,CONT_DIF_N,* ++V 1200,2800,CONT_DIF_N,* ++V 3800,3900,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd2a_x2.vbe b/alliance/src/cells/src/msxlib/nd2a_x2.vbe +new file mode 100644 +index 0000000..535da81 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2a_x2.vbe +@@ -0,0 +1,32 @@ ++ENTITY nd2a_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_b : NATURAL := 8; ++ CONSTANT cin_a : NATURAL := 6; ++ CONSTANT rdown_b_z : NATURAL := 1110; ++ CONSTANT rdown_a_z : NATURAL := 1110; ++ CONSTANT rup_b_z : NATURAL := 1520; ++ CONSTANT rup_a_z : NATURAL := 1520; ++ CONSTANT tphl_b_z : NATURAL := 34; ++ CONSTANT tplh_b_z : NATURAL := 44; ++ CONSTANT tpll_a_z : NATURAL := 80; ++ CONSTANT tphh_a_z : NATURAL := 76; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd2a_x2; ++ ++ARCHITECTURE behaviour_data_flow OF nd2a_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd2a_x2" ++ SEVERITY WARNING; ++ z <= (not (b) or a) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd2ab_x1.ap b/alliance/src/cells/src/msxlib/nd2ab_x1.ap +new file mode 100644 +index 0000000..cec8334 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2ab_x1.ap +@@ -0,0 +1,104 @@ ++V ALLIANCE : 6 ++H nd2ab_x1,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 3000,4000,ref_ref,z_40 ++R 3000,3000,ref_ref,z_30 ++R 3000,2000,ref_ref,z_20 ++R 2000,6000,ref_ref,b_60 ++R 3000,5000,ref_ref,z_50 ++R 2000,2000,ref_ref,z_20 ++R 4000,6000,ref_ref,a_60 ++R 4000,7000,ref_ref,a_70 ++R 1000,7000,ref_ref,b_70 ++R 2000,7000,ref_ref,b_70 ++R 1000,8000,ref_ref,b_80 ++R 5000,7000,ref_ref,a_70 ++R 4000,5000,ref_ref,a_50 ++R 3000,7000,ref_ref,z_70 ++R 3000,6000,ref_ref,z_60 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 600,700,600,3400,400,*,DOWN,ALU1 ++S 2000,6000,2000,7000,400,b,DOWN,CALU1 ++S 2000,5900,2000,7000,400,*,DOWN,ALU1 ++S 4200,700,4200,3100,400,*,DOWN,ALU1 ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 5400,2900,5400,5900,400,*,UP,ALU1 ++S 4000,4900,4600,4900,400,*,LEFT,ALU1 ++S 4000,5000,4000,7000,400,*,DOWN,ALU1 ++S 4000,5000,4000,7000,400,a,DOWN,CALU1 ++S 600,4900,600,5900,400,*,UP,ALU1 ++S 1000,7000,2000,7000,600,*,RIGHT,ALU1 ++S 3000,2000,3000,7000,400,z,UP,CALU1 ++S 2000,2000,3000,2000,600,*,RIGHT,ALU1 ++S 4200,7900,4200,9300,400,*,UP,ALU1 ++S 4000,7000,5100,7000,400,*,LEFT,ALU1 ++S 4000,7100,5100,7100,400,*,LEFT,ALU1 ++S 3900,3900,5400,3900,400,*,RIGHT,ALU1 ++S 1000,7000,1000,8100,400,*,UP,ALU1 ++S 1800,3500,1800,4900,400,*,DOWN,ALU1 ++S 1800,7900,1800,9300,400,*,UP,ALU1 ++S 3000,2000,3000,7100,400,*,DOWN,ALU1 ++S 1000,7000,1000,8000,400,b,UP,CALU1 ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 600,4900,2100,4900,400,*,RIGHT,ALU1 ++S 2400,4700,2400,5500,200,*,DOWN,POLY ++S 2200,4700,2800,4700,200,*,LEFT,POLY ++S 2800,2300,2800,4700,200,*,UP,POLY ++S 3600,300,3600,700,200,*,DOWN,POLY ++S 3600,2400,3600,5500,200,*,DOWN,POLY ++S 4800,2000,4800,2400,200,*,DOWN,POLY ++S 1200,3900,1200,5500,200,*,DOWN,POLY ++S 2800,300,2800,700,200,*,DOWN,POLY ++S 4800,7300,4800,7700,200,*,UP,POLY ++S 3600,7500,3600,7900,200,*,UP,POLY ++S 2400,7500,2400,7900,200,*,UP,POLY ++S 1200,7300,1200,7800,200,*,UP,POLY ++S 4800,3300,4800,5500,200,*,UP,POLY ++S 1200,2600,1200,3000,200,*,DOWN,POLY ++S 5200,2600,5200,3100,400,*,UP,NDIF ++S 2400,900,2400,2200,400,*,UP,NDIF ++S 1600,3200,1600,3700,400,*,UP,NDIF ++S 3200,900,3200,2200,600,n1,UP,NDIF ++S 600,3200,600,3700,600,*,UP,NDIF ++S 4200,900,4200,3100,600,*,UP,NDIF ++S 3600,700,3600,2400,200,3z,DOWN,NTRANS ++S 2800,700,2800,2400,200,4z,DOWN,NTRANS ++S 1200,3000,1200,3900,200,2b,DOWN,NTRANS ++S 4800,2400,4800,3300,200,2a,DOWN,NTRANS ++S 1800,5700,1800,7300,600,*,DOWN,PDIF ++S 800,5700,800,7100,400,*,DOWN,PDIF ++S 3600,5500,3600,7500,200,1z,UP,PTRANS ++S 2400,5500,2400,7500,200,2z,UP,PTRANS ++S 3000,5700,3000,7300,600,*,DOWN,PDIF ++S 0,5000,6000,5000,10000,nd2ab_x1,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 1800,5700,1800,8100,600,*,DOWN,PDIF ++S 4200,5700,4200,8100,600,*,DOWN,PDIF ++S 5200,5700,5200,7100,400,*,DOWN,PDIF ++S 4800,5500,4800,7300,200,1a,UP,PTRANS ++S 4000,5700,4000,7300,400,*,UP,PDIF ++S 1200,5500,1200,7300,200,1b,UP,PTRANS ++S 5000,7000,5000,7000,400,a,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 1000,700,CONT_BODY_P,* ++V 1000,8000,CONT_POLY,* ++V 4500,4900,CONT_POLY,* ++V 4000,3900,CONT_POLY,an ++V 2000,4900,CONT_POLY,bn ++V 4200,2000,CONT_DIF_N,* ++V 5400,3000,CONT_DIF_N,an ++V 4200,3000,CONT_DIF_N,* ++V 4200,1000,CONT_DIF_N,* ++V 2200,2100,CONT_DIF_N,* ++V 1800,3600,CONT_DIF_N,bn ++V 600,3300,CONT_DIF_N,* ++V 1800,8000,CONT_DIF_P,* ++V 3000,7000,CONT_DIF_P,* ++V 600,5800,CONT_DIF_P,bn ++V 5400,5800,CONT_DIF_P,an ++V 3000,6000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd2ab_x1.vbe b/alliance/src/cells/src/msxlib/nd2ab_x1.vbe +new file mode 100644 +index 0000000..755c209 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2ab_x1.vbe +@@ -0,0 +1,32 @@ ++ENTITY nd2ab_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT rdown_a_z : NATURAL := 2160; ++ CONSTANT rdown_b_z : NATURAL := 2160; ++ CONSTANT rup_a_z : NATURAL := 2960; ++ CONSTANT rup_b_z : NATURAL := 2970; ++ CONSTANT tpll_a_z : NATURAL := 81; ++ CONSTANT tphh_b_z : NATURAL := 70; ++ CONSTANT tpll_b_z : NATURAL := 77; ++ CONSTANT tphh_a_z : NATURAL := 76; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd2ab_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nd2ab_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd2ab_x1" ++ SEVERITY WARNING; ++ z <= (a or b) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd2ab_x2.ap b/alliance/src/cells/src/msxlib/nd2ab_x2.ap +new file mode 100644 +index 0000000..e609e55 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2ab_x2.ap +@@ -0,0 +1,118 @@ ++V ALLIANCE : 6 ++H nd2ab_x2,P, 8/ 8/2014,100 ++A 0,0,7000,10000 ++R 4000,7000,ref_ref,z_70 ++R 4000,6000,ref_ref,z_60 ++R 4000,5000,ref_ref,z_50 ++R 4000,4000,ref_ref,z_40 ++R 4000,3000,ref_ref,z_30 ++R 3000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,b_30 ++R 2000,4000,ref_ref,b_40 ++R 5000,6000,ref_ref,a_60 ++R 5000,7000,ref_ref,a_70 ++R 5000,8000,ref_ref,a_80 ++R 6000,8000,ref_ref,a_80 ++R 3000,3000,ref_ref,z_30 ++R 2000,5000,ref_ref,b_50 ++R 3000,4000,ref_ref,b_40 ++S 800,9300,1600,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 800,1900,800,6000,400,*,DOWN,ALU1 ++S 1400,3100,1400,4700,200,*,UP,POLY ++S 1400,1300,1400,1700,200,*,DOWN,POLY ++S 2000,1900,2000,2900,600,*,UP,NDIF ++S 800,2100,800,2700,600,*,UP,NDIF ++S 1400,1700,1400,3100,200,2b,DOWN,NTRANS ++S 1000,1900,1000,2900,400,*,UP,NDIF ++S 0,5000,7000,5000,10000,nd2ab_x2,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 4200,800,4200,3700,600,n1,UP,NDIF ++S 3400,800,3400,3700,400,*,UP,NDIF ++S 5000,6000,5000,8000,400,*,DOWN,ALU1 ++S 5000,6000,5000,8000,400,a,DOWN,CALU1 ++S 5000,6000,5800,6000,600,*,LEFT,ALU1 ++S 5000,8000,6100,8000,400,*,LEFT,ALU1 ++S 5000,8100,6100,8100,400,*,LEFT,ALU1 ++S 6300,7000,6600,7000,600,*,LEFT,ALU1 ++S 6600,4900,6600,7100,400,*,DOWN,ALU1 ++S 4900,4900,6600,4900,400,*,RIGHT,ALU1 ++S 5200,700,5200,3100,400,*,DOWN,ALU1 ++S 6400,2700,6400,4900,400,*,UP,ALU1 ++S 2800,6900,2800,9200,400,*,UP,ALU1 ++S 2800,5700,2800,9200,600,*,DOWN,PDIF ++S 4000,5700,4000,9200,600,*,DOWN,PDIF ++S 5000,5700,5000,9200,400,*,UP,PDIF ++S 6400,2900,6400,3500,600,*,DOWN,NDIF ++S 5200,800,5200,3700,600,*,UP,NDIF ++S 4600,3900,4600,5500,200,*,DOWN,POLY ++S 3400,4700,3400,5500,200,*,DOWN,POLY ++S 3800,3900,3800,4700,200,*,UP,POLY ++S 3200,4700,3800,4700,200,*,LEFT,POLY ++S 1800,5700,1800,8100,400,*,DOWN,PDIF ++S 6200,6800,6200,9200,400,*,DOWN,PDIF ++S 5200,6800,5200,9200,600,*,DOWN,PDIF ++S 6400,6800,6400,7100,600,*,UP,PDIF ++S 5800,3900,5800,5900,200,*,UP,POLY ++S 2200,8300,2200,8700,200,*,UP,POLY ++S 3400,9400,3400,9700,200,*,UP,POLY ++S 4600,9400,4600,9700,200,*,UP,POLY ++S 5800,9400,5800,9700,200,*,UP,POLY ++S 3800,300,3800,600,200,*,DOWN,POLY ++S 4600,300,4600,600,200,*,DOWN,POLY ++S 5800,2100,5800,2500,200,*,DOWN,POLY ++S 3000,3000,4000,3000,600,*,RIGHT,ALU1 ++S 3100,1900,3100,3100,600,*,DOWN,ALU1 ++S 3000,2000,3000,3000,400,z,DOWN,CALU1 ++S 4000,3000,4000,7000,400,z,UP,CALU1 ++S 4000,3000,4000,7100,400,*,DOWN,ALU1 ++S 3200,2100,3200,2900,600,*,UP,NDIF ++S 2200,5500,2200,8300,200,1b,UP,PTRANS ++S 5800,6600,5800,9400,200,1a,UP,PTRANS ++S 5800,2500,5800,3900,200,2a,DOWN,NTRANS ++S 4600,5500,4600,9400,200,1z,UP,PTRANS ++S 3400,5500,3400,9400,200,2z,UP,PTRANS ++S 4600,600,4600,3900,200,3z,DOWN,NTRANS ++S 3800,600,3800,3900,200,4z,DOWN,NTRANS ++S 6000,8000,6000,8000,400,a,LEFT,CALU1 ++S 1600,6100,1600,6700,600,*,UP,PDIF ++S 800,6000,3000,6000,400,*,LEFT,ALU1 ++S 3000,4800,3000,6000,400,*,UP,ALU1 ++S 2000,3000,2000,5000,400,b,UP,CALU1 ++S 2000,4000,3100,4000,400,*,RIGHT,ALU1 ++S 3000,4000,3000,4000,400,b,LEFT,CALU1 ++S 2000,2900,2000,5100,400,*,UP,ALU1 ++S 2000,700,2000,2100,400,*,DOWN,ALU1 ++S 1400,4700,1800,4700,200,*,RIGHT,POLY ++S 1600,6000,1600,6900,400,*,DOWN,ALU1 ++V 1600,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 800,2800,CONT_DIF_N,bn ++V 800,2000,CONT_DIF_N,bn ++V 5200,1000,CONT_DIF_N,* ++V 3200,2000,CONT_DIF_N,* ++V 3000,4900,CONT_POLY,* ++V 5800,6000,CONT_POLY,* ++V 5200,3000,CONT_DIF_N,* ++V 5200,2000,CONT_DIF_N,* ++V 4000,6000,CONT_DIF_P,* ++V 4000,7000,CONT_DIF_P,* ++V 2800,9000,CONT_DIF_P,* ++V 2800,8000,CONT_DIF_P,* ++V 2800,7000,CONT_DIF_P,* ++V 5200,9000,CONT_DIF_P,* ++V 6400,2800,CONT_DIF_N,an ++V 6400,3600,CONT_DIF_N,an ++V 5000,4900,CONT_POLY,an ++V 6400,7000,CONT_DIF_P,an ++V 3200,3000,CONT_DIF_N,* ++V 1600,6800,CONT_DIF_P,bn ++V 1600,6000,CONT_DIF_P,bn ++V 2000,4900,CONT_POLY,* ++V 2000,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd2ab_x2.vbe b/alliance/src/cells/src/msxlib/nd2ab_x2.vbe +new file mode 100644 +index 0000000..0e7a960 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd2ab_x2.vbe +@@ -0,0 +1,32 @@ ++ENTITY nd2ab_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT rdown_a_z : NATURAL := 1120; ++ CONSTANT rdown_b_z : NATURAL := 1110; ++ CONSTANT rup_a_z : NATURAL := 1520; ++ CONSTANT rup_b_z : NATURAL := 1520; ++ CONSTANT tpll_a_z : NATURAL := 84; ++ CONSTANT tphh_b_z : NATURAL := 73; ++ CONSTANT tpll_b_z : NATURAL := 80; ++ CONSTANT tphh_a_z : NATURAL := 78; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd2ab_x2; ++ ++ARCHITECTURE behaviour_data_flow OF nd2ab_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd2ab_x2" ++ SEVERITY WARNING; ++ z <= (a or b) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd3_x05.ap b/alliance/src/cells/src/msxlib/nd3_x05.ap +new file mode 100644 +index 0000000..dc0610f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd3_x05.ap +@@ -0,0 +1,95 @@ ++V ALLIANCE : 6 ++H nd3_x05,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 2000,3000,ref_ref,z_30 ++R 3000,4000,ref_ref,a_40 ++R 3000,5000,ref_ref,c_50 ++R 1000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,c_60 ++R 4000,6000,ref_ref,b_60 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,c_50 ++R 4000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,b_60 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 4000,7000,ref_ref,b_70 ++R 4000,4000,ref_ref,a_40 ++R 3000,3000,ref_ref,a_30 ++R 2000,4000,ref_ref,c_40 ++R 4000,8000,ref_ref,b_80 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 4400,700,4400,3100,400,*,DOWN,ALU1 ++S 3800,2300,3800,2700,200,*,UP,POLY ++S 3000,2300,3000,2700,200,*,UP,POLY ++S 2200,2300,2200,2700,200,*,UP,POLY ++S 1000,2900,2100,2900,400,*,RIGHT,ALU1 ++S 1000,3000,2100,3000,400,*,RIGHT,ALU1 ++S 4400,2900,4400,3700,600,*,UP,NDIF ++S 3800,2700,3800,3900,200,6,UP,NTRANS ++S 3400,2900,3400,3700,600,n1,DOWN,NDIF ++S 3000,2700,3000,3900,200,5,UP,NTRANS ++S 2600,2900,2600,3700,600,n2,UP,NDIF ++S 2200,2700,2200,3900,200,4,UP,NTRANS ++S 1800,2900,1800,3700,400,*,UP,NDIF ++S 3800,3900,3800,7100,200,*,DOWN,POLY ++S 3000,3900,3000,5900,200,*,UP,POLY ++S 2200,3900,2200,4800,200,*,UP,POLY ++S 4000,4000,4000,5100,400,*,DOWN,ALU1 ++S 4000,4000,4000,5000,400,a,DOWN,CALU1 ++S 1400,5200,1400,7100,200,*,DOWN,POLY ++S 1400,5200,1800,5200,200,*,LEFT,POLY ++S 2600,5800,2600,7100,200,*,DOWN,POLY ++S 3200,7000,3200,7500,400,*,DOWN,ALU1 ++S 3800,8300,3800,8700,200,*,DOWN,POLY ++S 2600,8300,2600,8700,200,*,DOWN,POLY ++S 2000,7300,2000,8100,600,*,DOWN,PDIF ++S 3200,7300,3200,8100,1000,*,UP,PDIF ++S 3800,7100,3800,8300,200,3,DOWN,PTRANS ++S 2600,7100,2600,8300,200,2,DOWN,PTRANS ++S 1000,7300,1000,8100,400,*,UP,PDIF ++S 1400,7100,1400,8300,200,1,DOWN,PTRANS ++S 1400,8300,1400,8700,200,*,DOWN,POLY ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 2000,7900,2000,9300,400,*,DOWN,ALU1 ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,nd3_x05,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 800,7000,3200,7000,400,*,LEFT,ALU1 ++S 900,7000,900,7500,600,*,DOWN,ALU1 ++S 3000,3000,3000,4000,400,a,UP,CALU1 ++S 3000,4000,4000,4000,600,*,RIGHT,ALU1 ++S 3000,2900,3000,4000,400,*,DOWN,ALU1 ++S 2000,4000,2000,6000,400,c,DOWN,CALU1 ++S 2000,3900,2000,6100,400,*,UP,ALU1 ++S 2000,5000,3000,5000,600,*,LEFT,ALU1 ++S 4000,6000,4000,8100,400,*,UP,ALU1 ++S 4000,6000,4000,8000,400,b,UP,CALU1 ++S 4400,7300,4400,9100,600,*,DOWN,PDIF ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1000,3000,1000,7500,400,*,DOWN,ALU1 ++S 3000,6000,3000,6000,400,b,LEFT,CALU1 ++S 3000,5000,3000,5000,400,c,LEFT,CALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1600,3000,CONT_DIF_N,* ++V 4400,3000,CONT_DIF_N,* ++V 4000,4500,CONT_POLY,* ++V 2000,5000,CONT_POLY,* ++V 3200,7400,CONT_DIF_P,* ++V 800,7400,CONT_DIF_P,* ++V 3000,6000,CONT_POLY,* ++V 2000,8000,CONT_DIF_P,* ++V 4400,9000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd3_x05.vbe b/alliance/src/cells/src/msxlib/nd3_x05.vbe +new file mode 100644 +index 0000000..b18016d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd3_x05.vbe +@@ -0,0 +1,38 @@ ++ENTITY nd3_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a : NATURAL := 3; ++ CONSTANT cin_b : NATURAL := 3; ++ CONSTANT cin_c : NATURAL := 3; ++ CONSTANT rdown_a_z : NATURAL := 4240; ++ CONSTANT rdown_b_z : NATURAL := 4240; ++ CONSTANT rdown_c_z : NATURAL := 4240; ++ CONSTANT rup_a_z : NATURAL := 4940; ++ CONSTANT rup_b_z : NATURAL := 4940; ++ CONSTANT rup_c_z : NATURAL := 4950; ++ CONSTANT tphl_a_z : NATURAL := 47; ++ CONSTANT tphl_b_z : NATURAL := 46; ++ CONSTANT tphl_c_z : NATURAL := 43; ++ CONSTANT tplh_c_z : NATURAL := 54; ++ CONSTANT tplh_b_z : NATURAL := 62; ++ CONSTANT tplh_a_z : NATURAL := 69; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd3_x05; ++ ++ARCHITECTURE behaviour_data_flow OF nd3_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd3_x05" ++ SEVERITY WARNING; ++ z <= not (((a and b) and c)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd3_x1.ap b/alliance/src/cells/src/msxlib/nd3_x1.ap +new file mode 100644 +index 0000000..5e402ae +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd3_x1.ap +@@ -0,0 +1,101 @@ ++V ALLIANCE : 6 ++H nd3_x1,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 3000,8000,ref_ref,z_80 ++R 4000,4000,ref_ref,a_40 ++R 4000,7000,ref_ref,b_70 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,7000,ref_ref,z_70 ++R 3000,4000,ref_ref,c_40 ++R 3000,6000,ref_ref,b_60 ++R 4000,5000,ref_ref,a_50 ++R 2000,5000,ref_ref,c_50 ++R 2000,7000,ref_ref,z_70 ++R 3000,7000,ref_ref,z_70 ++R 4000,6000,ref_ref,b_60 ++R 2000,6000,ref_ref,c_60 ++R 2000,4000,ref_ref,c_40 ++R 3000,5000,ref_ref,b_50 ++R 4000,3000,ref_ref,a_30 ++R 3000,3000,ref_ref,a_30 ++R 1000,3000,ref_ref,z_30 ++R 1000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,a_30 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 3000,3000,3000,3000,400,a,LEFT,CALU1 ++S 3000,4000,3000,4000,400,c,LEFT,CALU1 ++S 2000,3000,2000,3000,400,a,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,7000,3000,8000,400,z,DOWN,CALU1 ++S 3100,6900,3100,8100,600,*,DOWN,ALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,nd3_x1,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 1000,6600,1000,8200,400,*,UP,PDIF ++S 1400,6400,1400,8400,200,1,DOWN,PTRANS ++S 2600,6400,2600,8400,200,2,DOWN,PTRANS ++S 2000,6600,2000,8200,1000,*,DOWN,PDIF ++S 3800,6400,3800,8400,200,3,DOWN,PTRANS ++S 3200,6600,3200,8200,1000,*,UP,PDIF ++S 4400,6600,4400,8200,600,*,UP,PDIF ++S 1400,8400,1400,8800,200,*,DOWN,POLY ++S 2600,8400,2600,8800,200,*,DOWN,POLY ++S 3800,8400,3800,8800,200,*,DOWN,POLY ++S 2000,7900,2000,9300,400,*,DOWN,ALU1 ++S 4400,7900,4400,9300,400,*,DOWN,ALU1 ++S 700,7000,3200,7000,600,*,LEFT,ALU1 ++S 4000,6000,4000,7100,400,*,UP,ALU1 ++S 4000,6000,4000,7000,400,b,UP,CALU1 ++S 1400,4700,1400,6400,200,*,DOWN,POLY ++S 2000,4000,2000,6000,400,c,DOWN,CALU1 ++S 2000,4000,2000,6100,400,*,DOWN,ALU1 ++S 2000,4000,3000,4000,600,*,RIGHT,ALU1 ++S 3000,5000,3000,6000,400,b,UP,CALU1 ++S 3000,4900,3000,6000,400,*,UP,ALU1 ++S 3000,6000,4000,6000,600,*,RIGHT,ALU1 ++S 4000,3000,4000,5000,400,a,DOWN,CALU1 ++S 3800,1300,3800,1600,200,*,UP,POLY ++S 3800,1700,3800,3700,200,6,UP,NTRANS ++S 3000,1300,3000,1600,200,*,UP,POLY ++S 3000,1700,3000,3700,200,5,UP,NTRANS ++S 2200,1300,2200,1600,200,*,UP,POLY ++S 2200,1700,2200,3700,200,4,UP,NTRANS ++S 1800,1900,1800,3500,400,*,UP,NDIF ++S 2600,1900,2600,3500,600,n2,UP,NDIF ++S 3400,1900,3400,3500,600,n1,DOWN,NDIF ++S 4400,1900,4400,3500,600,*,UP,NDIF ++S 4400,700,4400,2100,400,*,DOWN,ALU1 ++S 1000,2000,2100,2000,400,*,RIGHT,ALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1900,3000,4000,3000,400,*,RIGHT,ALU1 ++S 4000,3000,4000,5100,400,*,DOWN,ALU1 ++S 1900,2900,4000,2900,400,*,RIGHT,ALU1 ++S 2200,3700,2200,4300,200,*,UP,POLY ++S 3800,3700,3800,6400,200,*,UP,POLY ++S 3000,3700,3000,5600,200,*,UP,POLY ++S 2600,5600,2600,6400,200,*,DOWN,POLY ++S 1400,4600,1800,4600,200,*,LEFT,POLY ++S 1000,1900,2100,1900,400,*,RIGHT,ALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3200,8000,CONT_DIF_P,* ++V 3200,7000,CONT_DIF_P,* ++V 4400,8000,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,* ++V 800,7000,CONT_DIF_P,* ++V 3000,5800,CONT_POLY,* ++V 4400,2000,CONT_DIF_N,* ++V 1600,2000,CONT_DIF_N,* ++V 4000,4400,CONT_POLY,* ++V 2000,4400,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd3_x1.vbe b/alliance/src/cells/src/msxlib/nd3_x1.vbe +new file mode 100644 +index 0000000..4ed7287 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd3_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY nd3_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_c : NATURAL := 5; ++ CONSTANT rdown_a_z : NATURAL := 2540; ++ CONSTANT rdown_b_z : NATURAL := 2540; ++ CONSTANT rdown_c_z : NATURAL := 2540; ++ CONSTANT rup_a_z : NATURAL := 2960; ++ CONSTANT rup_b_z : NATURAL := 2960; ++ CONSTANT rup_c_z : NATURAL := 2960; ++ CONSTANT tphl_a_z : NATURAL := 45; ++ CONSTANT tphl_b_z : NATURAL := 44; ++ CONSTANT tphl_c_z : NATURAL := 41; ++ CONSTANT tplh_c_z : NATURAL := 52; ++ CONSTANT tplh_b_z : NATURAL := 59; ++ CONSTANT tplh_a_z : NATURAL := 67; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd3_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nd3_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd3_x1" ++ SEVERITY WARNING; ++ z <= not (((a and b) and c)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd3_x2.ap b/alliance/src/cells/src/msxlib/nd3_x2.ap +new file mode 100644 +index 0000000..56de21a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd3_x2.ap +@@ -0,0 +1,100 @@ ++V ALLIANCE : 6 ++H nd3_x2,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 3000,8000,ref_ref,z_80 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,c_50 ++R 4000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,b_60 ++R 3000,4000,ref_ref,c_40 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 4000,3000,ref_ref,a_30 ++R 4000,4000,ref_ref,a_40 ++R 1000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,c_40 ++R 3000,3000,ref_ref,a_30 ++R 4000,6000,ref_ref,b_60 ++R 4000,7000,ref_ref,b_70 ++R 2000,6000,ref_ref,c_60 ++R 1000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,a_30 ++R 3000,5000,ref_ref,b_50 ++S 2000,3000,2000,3000,400,a,LEFT,CALU1 ++S 3000,3000,3000,3000,400,a,LEFT,CALU1 ++S 3000,4000,3000,4000,400,c,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,3900,3000,5600,200,*,UP,POLY ++S 3800,3900,3800,6100,200,*,DOWN,POLY ++S 2600,5300,2600,6100,200,*,DOWN,POLY ++S 1400,4700,1400,6100,200,*,DOWN,POLY ++S 3000,7000,3000,8000,400,z,UP,CALU1 ++S 3100,7000,3100,8100,600,*,DOWN,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 900,6300,900,7300,600,*,UP,ALU1 ++S 800,6500,800,7300,600,*,UP,PDIF ++S 1800,800,1800,3700,400,*,UP,NDIF ++S 4400,800,4400,3700,600,*,UP,NDIF ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,nd3_x2,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 3800,300,3800,600,200,*,UP,POLY ++S 3000,300,3000,600,200,*,UP,POLY ++S 2200,300,2200,600,200,*,UP,POLY ++S 1400,4700,1800,4700,200,*,LEFT,POLY ++S 3400,800,3400,3700,600,n1,DOWN,NDIF ++S 2600,800,2600,3700,600,n2,UP,NDIF ++S 4400,700,4400,2100,400,*,DOWN,ALU1 ++S 2000,4000,3000,4000,600,*,RIGHT,ALU1 ++S 4000,3000,4000,5100,400,*,DOWN,ALU1 ++S 4000,3000,4000,5000,400,a,DOWN,CALU1 ++S 4000,6000,4000,7100,400,*,UP,ALU1 ++S 3000,6000,4000,6000,400,*,LEFT,ALU1 ++S 3000,5900,4000,5900,400,*,LEFT,ALU1 ++S 2000,4000,2000,6000,400,c,DOWN,CALU1 ++S 2000,4000,2000,6100,400,*,DOWN,ALU1 ++S 1000,2000,1600,2000,600,*,RIGHT,ALU1 ++S 1900,2900,4000,2900,400,*,LEFT,ALU1 ++S 1900,3000,4000,3000,400,*,LEFT,ALU1 ++S 3000,5000,3000,6000,600,*,UP,ALU1 ++S 3000,5000,3000,6000,400,b,DOWN,CALU1 ++S 1000,7000,3200,7000,400,*,LEFT,ALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 1400,9400,1400,9700,200,*,DOWN,POLY ++S 3800,9400,3800,9700,200,*,DOWN,POLY ++S 2000,7900,2000,9300,400,*,DOWN,ALU1 ++S 4400,7900,4400,9300,400,*,DOWN,ALU1 ++S 1000,6900,3200,6900,400,*,LEFT,ALU1 ++S 1000,6300,1000,9200,400,*,UP,PDIF ++S 2000,6300,2000,9200,1000,*,DOWN,PDIF ++S 3200,6300,3200,9200,400,*,UP,PDIF ++S 4400,6300,4400,9200,600,*,DOWN,PDIF ++S 3800,6100,3800,9400,200,1a,DOWN,PTRANS ++S 2600,6100,2600,9400,200,1b,DOWN,PTRANS ++S 1400,6100,1400,9400,200,1z,DOWN,PTRANS ++S 3800,600,3800,3900,200,2a,UP,NTRANS ++S 3000,600,3000,3900,200,2b,UP,NTRANS ++S 2200,600,2200,3900,200,2c,UP,NTRANS ++S 4000,6000,4000,7000,400,b,UP,CALU1 ++V 700,700,CONT_BODY_P,* ++V 800,7200,CONT_DIF_P,* ++V 800,6400,CONT_DIF_P,* ++V 4000,5000,CONT_POLY,* ++V 1600,2000,CONT_DIF_N,* ++V 2000,4500,CONT_POLY,* ++V 4400,1000,CONT_DIF_N,* ++V 4400,2000,CONT_DIF_N,* ++V 3200,7000,CONT_DIF_P,* ++V 3200,8000,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,* ++V 4400,8000,CONT_DIF_P,* ++V 4400,9000,CONT_DIF_P,* ++V 2000,9000,CONT_DIF_P,* ++V 3000,5500,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd3_x2.vbe b/alliance/src/cells/src/msxlib/nd3_x2.vbe +new file mode 100644 +index 0000000..f23d898 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd3_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY nd3_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT cin_b : NATURAL := 7; ++ CONSTANT cin_c : NATURAL := 7; ++ CONSTANT rdown_a_z : NATURAL := 1540; ++ CONSTANT rdown_b_z : NATURAL := 1540; ++ CONSTANT rdown_c_z : NATURAL := 1540; ++ CONSTANT rup_a_z : NATURAL := 1800; ++ CONSTANT rup_b_z : NATURAL := 1790; ++ CONSTANT rup_c_z : NATURAL := 1800; ++ CONSTANT tphl_a_z : NATURAL := 43; ++ CONSTANT tphl_b_z : NATURAL := 42; ++ CONSTANT tphl_c_z : NATURAL := 39; ++ CONSTANT tplh_c_z : NATURAL := 50; ++ CONSTANT tplh_b_z : NATURAL := 58; ++ CONSTANT tplh_a_z : NATURAL := 64; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd3_x2; ++ ++ARCHITECTURE behaviour_data_flow OF nd3_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd3_x2" ++ SEVERITY WARNING; ++ z <= not (((a and b) and c)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd3_x4.ap b/alliance/src/cells/src/msxlib/nd3_x4.ap +new file mode 100644 +index 0000000..1c3f183 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd3_x4.ap +@@ -0,0 +1,166 @@ ++V ALLIANCE : 6 ++H nd3_x4,P, 8/ 8/2014,100 ++A 0,0,9000,10000 ++R 7000,7000,ref_ref,z_70 ++R 2000,8000,ref_ref,z_80 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,c_50 ++R 4000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,b_60 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 4000,7000,ref_ref,z_70 ++R 5000,7000,ref_ref,z_70 ++R 6000,7000,ref_ref,z_70 ++R 7000,5000,ref_ref,c_50 ++R 5000,5000,ref_ref,a_50 ++R 4000,6000,ref_ref,b_60 ++R 5000,6000,ref_ref,b_60 ++R 7000,6000,ref_ref,c_60 ++R 6000,3000,ref_ref,c_30 ++R 6000,5000,ref_ref,b_50 ++R 3000,5000,ref_ref,b_50 ++R 2000,6000,ref_ref,z_60 ++R 2000,4000,ref_ref,c_40 ++R 7000,4000,ref_ref,c_40 ++R 6000,6000,ref_ref,b_60 ++R 1000,3000,ref_ref,z_30 ++R 7000,3000,ref_ref,c_30 ++R 1000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 3000,2000,ref_ref,z_20 ++R 4000,2000,ref_ref,z_20 ++R 5000,3000,ref_ref,c_30 ++R 4000,3000,ref_ref,c_30 ++R 3000,3000,ref_ref,c_30 ++R 2000,3000,ref_ref,c_30 ++R 3000,4000,ref_ref,b_40 ++R 5000,4000,ref_ref,a_40 ++S 1000,6000,2000,6000,600,*,RIGHT,ALU1 ++S 6000,3000,6000,3000,400,c,LEFT,CALU1 ++S 5000,3000,5000,3000,400,c,LEFT,CALU1 ++S 4000,3000,4000,3000,400,c,LEFT,CALU1 ++S 3000,3000,3000,3000,400,c,LEFT,CALU1 ++S 4000,5000,4000,5000,400,a,LEFT,CALU1 ++S 5000,6000,5000,6000,400,b,LEFT,CALU1 ++S 4000,6000,4000,6000,400,b,LEFT,CALU1 ++S 8000,6900,8000,9300,400,*,DOWN,ALU1 ++S 800,6900,800,9300,400,*,DOWN,ALU1 ++S 3200,7900,3200,9300,400,*,DOWN,ALU1 ++S 5600,7900,5600,9300,400,*,DOWN,ALU1 ++S 2000,7000,7100,7000,400,*,LEFT,ALU1 ++S 6800,7000,6800,8100,400,*,DOWN,ALU1 ++S 7000,7000,7000,7000,400,z,LEFT,CALU1 ++S 6000,7000,6000,7000,400,z,LEFT,CALU1 ++S 5000,7000,5000,7000,400,z,LEFT,CALU1 ++S 4000,7000,4000,7000,400,z,LEFT,CALU1 ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 4000,2000,4000,2000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 1000,1900,4500,1900,400,*,RIGHT,ALU1 ++S 2600,5500,2600,6000,200,*,DOWN,POLY ++S 6600,3900,6600,4400,200,*,UP,POLY ++S 1800,800,1800,3700,400,*,UP,NDIF ++S 4400,800,4400,3700,600,*,UP,NDIF ++S 3800,300,3800,600,200,*,UP,POLY ++S 3000,300,3000,600,200,*,UP,POLY ++S 2200,300,2200,600,200,*,UP,POLY ++S 3800,9200,3800,9700,200,*,DOWN,POLY ++S 2600,9200,2600,9700,200,*,DOWN,POLY ++S 1400,9200,1400,9700,200,*,DOWN,POLY ++S 1400,4700,1800,4700,200,*,LEFT,POLY ++S 5000,9200,5000,9700,200,*,DOWN,POLY ++S 6200,9200,6200,9700,200,*,DOWN,POLY ++S 7400,9200,7400,9700,200,*,DOWN,POLY ++S 0,9400,9000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,9000,5000,10000,nd3_x4,LEFT,TALU8 ++S 0,2200,9000,2200,5200,*,LEFT,PWELL ++S 0,7600,9000,7600,5600,*,LEFT,NWELL ++S 0,600,9000,600,1200,vss,RIGHT,CALU1 ++S 1600,800,1600,3700,800,*,UP,NDIF ++S 3800,5000,5000,5000,600,*,RIGHT,POLY ++S 5000,600,5000,3900,200,10,UP,NTRANS ++S 5800,600,5800,3900,200,11,UP,NTRANS ++S 6600,600,6600,3900,200,12,UP,NTRANS ++S 3800,600,3800,3900,200,09,UP,NTRANS ++S 3000,600,3000,3900,200,08,UP,NTRANS ++S 2200,600,2200,3900,200,07,UP,NTRANS ++S 2600,800,2600,3700,600,n1,UP,NDIF ++S 3400,800,3400,3700,600,n2,DOWN,NDIF ++S 5400,800,5400,3700,600,n4,DOWN,NDIF ++S 6200,800,6200,3700,600,n3,DOWN,NDIF ++S 4400,7000,4400,8100,400,*,DOWN,ALU1 ++S 2000,6000,2000,8000,400,z,UP,CALU1 ++S 2000,6000,2000,8100,400,*,DOWN,ALU1 ++S 1400,6000,1400,9300,200,01,DOWN,PTRANS ++S 800,6200,800,9100,800,*,UP,PDIF ++S 2600,6000,2600,9300,200,02,DOWN,PTRANS ++S 2000,6200,2000,9100,1000,*,DOWN,PDIF ++S 3200,6200,3200,9100,400,*,UP,PDIF ++S 3800,6000,3800,9300,200,03,DOWN,PTRANS ++S 4400,6200,4400,9100,400,*,UP,PDIF ++S 5000,6000,5000,9300,200,04,DOWN,PTRANS ++S 5600,6200,5600,9100,400,*,UP,PDIF ++S 6200,6000,6200,9300,200,05,DOWN,PTRANS ++S 7400,6000,7400,9300,200,06,DOWN,PTRANS ++S 6800,6200,6800,9100,400,*,UP,PDIF ++S 8000,6200,8000,9100,800,*,UP,PDIF ++S 1400,4700,1400,6000,200,*,DOWN,POLY ++S 7400,4300,7400,6000,200,*,DOWN,POLY ++S 5800,3900,5800,5600,200,*,UP,POLY ++S 5000,3900,5000,6000,200,*,DOWN,POLY ++S 3800,3900,3800,6000,200,*,DOWN,POLY ++S 3000,3900,3000,5600,200,*,UP,POLY ++S 6000,5000,6000,6000,600,*,UP,ALU1 ++S 3000,6000,6000,6000,400,*,RIGHT,ALU1 ++S 6000,5000,6000,6000,400,b,DOWN,CALU1 ++S 7200,700,7200,2100,400,*,DOWN,ALU1 ++S 7000,3000,7000,6100,400,*,UP,ALU1 ++S 7000,3000,7000,6000,400,c,DOWN,CALU1 ++S 7100,3000,7100,6100,400,*,UP,ALU1 ++S 1000,2000,1000,6000,400,*,DOWN,ALU1 ++S 1000,2000,1000,6000,400,z,DOWN,CALU1 ++S 2000,3000,2000,5000,400,c,DOWN,CALU1 ++S 2000,3000,2000,5000,600,*,DOWN,ALU1 ++S 2000,3000,7000,3000,400,*,RIGHT,ALU1 ++S 1000,2000,4500,2000,400,*,RIGHT,ALU1 ++S 3000,4000,3000,6000,400,b,UP,CALU1 ++S 4000,5000,5000,5000,600,*,RIGHT,ALU1 ++S 5000,4000,5000,5000,400,a,DOWN,CALU1 ++S 5000,3900,5000,5000,400,*,UP,ALU1 ++S 2900,3900,2900,6000,400,*,DOWN,ALU1 ++S 3000,3900,3000,6000,400,*,DOWN,ALU1 ++S 5000,300,5000,600,200,*,UP,POLY ++S 5800,300,5800,600,200,*,UP,POLY ++S 6600,300,6600,600,200,*,UP,POLY ++S 7200,800,7200,3700,600,*,UP,NDIF ++V 8300,700,CONT_BODY_P,* ++V 800,7000,CONT_DIF_P,* ++V 800,8000,CONT_DIF_P,* ++V 3200,8000,CONT_DIF_P,* ++V 5600,8000,CONT_DIF_P,* ++V 8000,8000,CONT_DIF_P,* ++V 8000,7000,CONT_DIF_P,* ++V 2000,4500,CONT_POLY,* ++V 4400,5000,CONT_POLY,* ++V 6800,8000,CONT_DIF_P,* ++V 2000,8000,CONT_DIF_P,* ++V 4400,7000,CONT_DIF_P,* ++V 2000,7000,CONT_DIF_P,* ++V 4400,8000,CONT_DIF_P,* ++V 6800,7000,CONT_DIF_P,* ++V 4400,2000,CONT_DIF_N,* ++V 7000,4500,CONT_POLY,* ++V 3000,5400,CONT_POLY,* ++V 6000,5400,CONT_POLY,* ++V 8000,9000,CONT_DIF_P,* ++V 5600,9000,CONT_DIF_P,* ++V 3200,9000,CONT_DIF_P,* ++V 800,9000,CONT_DIF_P,* ++V 7200,2000,CONT_DIF_N,* ++V 7200,1000,CONT_DIF_N,* ++V 1600,1000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd3_x4.vbe b/alliance/src/cells/src/msxlib/nd3_x4.vbe +new file mode 100644 +index 0000000..a46b93f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd3_x4.vbe +@@ -0,0 +1,38 @@ ++ENTITY nd3_x4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 9000; ++ CONSTANT cin_a : NATURAL := 13; ++ CONSTANT cin_b : NATURAL := 15; ++ CONSTANT cin_c : NATURAL := 15; ++ CONSTANT rdown_a_z : NATURAL := 770; ++ CONSTANT rdown_b_z : NATURAL := 770; ++ CONSTANT rdown_c_z : NATURAL := 770; ++ CONSTANT rup_a_z : NATURAL := 900; ++ CONSTANT rup_b_z : NATURAL := 900; ++ CONSTANT rup_c_z : NATURAL := 900; ++ CONSTANT tphl_a_z : NATURAL := 37; ++ CONSTANT tphl_b_z : NATURAL := 41; ++ CONSTANT tphl_c_z : NATURAL := 42; ++ CONSTANT tplh_c_z : NATURAL := 63; ++ CONSTANT tplh_b_z : NATURAL := 56; ++ CONSTANT tplh_a_z : NATURAL := 48; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd3_x4; ++ ++ARCHITECTURE behaviour_data_flow OF nd3_x4 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd3_x4" ++ SEVERITY WARNING; ++ z <= not (((a and b) and c)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd4_x05.ap b/alliance/src/cells/src/msxlib/nd4_x05.ap +new file mode 100644 +index 0000000..ff25b3e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd4_x05.ap +@@ -0,0 +1,122 @@ ++V ALLIANCE : 6 ++H nd4_x05,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 5000,5000,ref_ref,b_50 ++R 4000,2000,ref_ref,a_20 ++R 4000,3000,ref_ref,a_30 ++R 5000,6000,ref_ref,b_60 ++R 1000,3000,ref_ref,z_30 ++R 3000,5000,ref_ref,c_50 ++R 2000,4000,ref_ref,d_40 ++R 1000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 1000,5000,ref_ref,z_50 ++R 4000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,d_50 ++R 3000,6000,ref_ref,c_60 ++R 2000,6000,ref_ref,c_60 ++R 4000,6000,ref_ref,b_60 ++R 1000,4000,ref_ref,z_40 ++R 3000,7000,ref_ref,z_70 ++R 5000,7000,ref_ref,b_70 ++R 5000,4000,ref_ref,a_40 ++R 3000,3000,ref_ref,d_30 ++R 1000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,d_30 ++R 3000,4000,ref_ref,c_40 ++R 4000,4000,ref_ref,a_40 ++S 1100,9300,1900,9300,600,*,LEFT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 5000,4900,5000,7100,400,*,UP,ALU1 ++S 5000,5000,5000,7000,400,b,UP,CALU1 ++S 4800,4200,4800,6900,200,*,DOWN,POLY ++S 4600,3300,4600,4200,200,*,UP,POLY ++S 3900,5900,5000,5900,400,*,RIGHT,ALU1 ++S 5200,1800,5200,3100,800,*,UP,NDIF ++S 4600,1200,4600,1600,200,*,DOWN,POLY ++S 3800,1200,3800,1600,200,*,DOWN,POLY ++S 3000,1200,3000,1600,200,*,DOWN,POLY ++S 2200,1200,2200,1600,200,*,DOWN,POLY ++S 2200,3300,2200,4600,200,*,UP,POLY ++S 3000,3300,3000,6200,200,*,UP,POLY ++S 3800,3300,3800,5700,200,*,UP,POLY ++S 1800,1800,1800,3100,400,*,UP,NDIF ++S 3400,1800,3400,3100,600,n2,UP,NDIF ++S 4600,1600,4600,3300,200,8,DOWN,NTRANS ++S 3800,1600,3800,3300,200,7,DOWN,NTRANS ++S 4200,1800,4200,3100,600,n1,UP,NDIF ++S 3000,1600,3000,3300,200,6,DOWN,NTRANS ++S 2200,1600,2200,3300,200,5,DOWN,NTRANS ++S 2600,1800,2600,3100,600,n3,UP,NDIF ++S 5400,7900,5400,9300,400,*,UP,ALU1 ++S 3000,7900,3000,9300,400,*,UP,ALU1 ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 3600,5800,3600,6900,200,*,DOWN,POLY ++S 2400,5800,2400,6900,200,*,DOWN,POLY ++S 1200,5200,1200,6900,200,*,DOWN,POLY ++S 1000,7000,4200,7000,400,*,LEFT,ALU1 ++S 1000,7100,4200,7100,400,*,LEFT,ALU1 ++S 1900,6100,3000,6100,400,*,LEFT,ALU1 ++S 1900,6000,3000,6000,400,*,LEFT,ALU1 ++S 600,7100,600,8100,600,*,DOWN,PDIF ++S 5300,7100,5300,8100,800,*,DOWN,PDIF ++S 3000,7100,3000,8100,600,*,DOWN,PDIF ++S 4200,7100,4200,8100,1000,*,UP,PDIF ++S 4800,6900,4800,8300,200,4,UP,PTRANS ++S 3600,6900,3600,8300,200,3,UP,PTRANS ++S 2400,6900,2400,8300,200,2,UP,PTRANS ++S 1800,7100,1800,8100,1000,*,DOWN,PDIF ++S 1200,6900,1200,8300,200,1,UP,PTRANS ++S 4800,8400,4800,8700,200,*,DOWN,POLY ++S 3600,8400,3600,8700,200,*,DOWN,POLY ++S 2400,8400,2400,8700,200,*,DOWN,POLY ++S 1200,8400,1200,8700,200,*,DOWN,POLY ++S 0,5000,6000,5000,10000,nd4_x05,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 1200,5200,1800,5200,200,*,RIGHT,POLY ++S 3900,6000,5000,6000,400,*,RIGHT,ALU1 ++S 1000,1900,2100,1900,400,*,RIGHT,ALU1 ++S 1000,2000,2100,2000,400,*,RIGHT,ALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 2000,3000,3000,3000,600,*,LEFT,ALU1 ++S 2000,3000,2000,5000,400,d,DOWN,CALU1 ++S 2000,3000,2000,5100,400,*,DOWN,ALU1 ++S 3000,3000,3000,3000,400,d,LEFT,CALU1 ++S 3000,4000,3000,6000,400,c,DOWN,CALU1 ++S 3000,3900,3000,6000,400,*,DOWN,ALU1 ++S 4000,4000,5000,4000,600,*,RIGHT,ALU1 ++S 4000,1900,4000,4000,400,*,DOWN,ALU1 ++S 4000,2000,4000,4000,400,a,DOWN,CALU1 ++S 5000,4000,5000,4000,400,a,LEFT,CALU1 ++S 5200,700,5200,3100,400,*,UP,ALU1 ++S 2000,6000,2000,6000,400,c,LEFT,CALU1 ++S 4000,6000,4000,6000,400,b,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 4000,7000,4000,7000,400,z,LEFT,CALU1 ++S 1800,7000,1800,7500,400,*,DOWN,ALU1 ++S 4200,7000,4200,7500,400,*,DOWN,ALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,5000,CONT_POLY,* ++V 4000,6000,CONT_POLY,* ++V 5200,2000,CONT_DIF_N,* ++V 2700,6000,CONT_POLY,* ++V 3000,8000,CONT_DIF_P,* ++V 600,8000,CONT_DIF_P,* ++V 5400,8000,CONT_DIF_P,* ++V 1600,1900,CONT_DIF_N,* ++V 4600,4000,CONT_POLY,* ++V 5200,3000,CONT_DIF_N,* ++V 1800,7400,CONT_DIF_P,* ++V 4200,7400,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd4_x05.vbe b/alliance/src/cells/src/msxlib/nd4_x05.vbe +new file mode 100644 +index 0000000..49ad07a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd4_x05.vbe +@@ -0,0 +1,44 @@ ++ENTITY nd4_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT cin_c : NATURAL := 4; ++ CONSTANT cin_d : NATURAL := 4; ++ CONSTANT rdown_a_z : NATURAL := 3830; ++ CONSTANT rdown_b_z : NATURAL := 3830; ++ CONSTANT rdown_c_z : NATURAL := 3840; ++ CONSTANT rdown_d_z : NATURAL := 3830; ++ CONSTANT rup_a_z : NATURAL := 4270; ++ CONSTANT rup_b_z : NATURAL := 4250; ++ CONSTANT rup_c_z : NATURAL := 4240; ++ CONSTANT rup_d_z : NATURAL := 4250; ++ CONSTANT tphl_a_z : NATURAL := 59; ++ CONSTANT tphl_b_z : NATURAL := 56; ++ CONSTANT tphl_c_z : NATURAL := 51; ++ CONSTANT tphl_d_z : NATURAL := 44; ++ CONSTANT tplh_d_z : NATURAL := 58; ++ CONSTANT tplh_c_z : NATURAL := 68; ++ CONSTANT tplh_b_z : NATURAL := 76; ++ CONSTANT tplh_a_z : NATURAL := 84; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ d : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd4_x05; ++ ++ARCHITECTURE behaviour_data_flow OF nd4_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd4_x05" ++ SEVERITY WARNING; ++ z <= not ((((a and b) and c) and d)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd4_x1.ap b/alliance/src/cells/src/msxlib/nd4_x1.ap +new file mode 100644 +index 0000000..43c34b5 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd4_x1.ap +@@ -0,0 +1,123 @@ ++V ALLIANCE : 6 ++H nd4_x1,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 2000,8000,ref_ref,z_80 ++R 2000,7000,ref_ref,z_70 ++R 1000,5000,ref_ref,z_50 ++R 4000,7000,ref_ref,z_70 ++R 4000,8000,ref_ref,z_80 ++R 1000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,d_50 ++R 3000,6000,ref_ref,c_60 ++R 2000,6000,ref_ref,c_60 ++R 4000,6000,ref_ref,b_60 ++R 1000,4000,ref_ref,z_40 ++R 3000,7000,ref_ref,z_70 ++R 5000,7000,ref_ref,b_70 ++R 5000,4000,ref_ref,a_40 ++R 5000,3000,ref_ref,a_30 ++R 3000,3000,ref_ref,d_30 ++R 1000,7000,ref_ref,z_70 ++R 1000,3000,ref_ref,z_30 ++R 5000,5000,ref_ref,a_50 ++R 4000,3000,ref_ref,a_30 ++R 4000,5000,ref_ref,b_50 ++R 2000,4000,ref_ref,d_40 ++R 3000,5000,ref_ref,c_50 ++R 1000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,d_30 ++R 3000,4000,ref_ref,c_40 ++R 5000,6000,ref_ref,b_60 ++S 2200,700,2200,3900,200,2d,DOWN,NTRANS ++S 3000,700,3000,3900,200,2c,DOWN,NTRANS ++S 3800,700,3800,3900,200,2b,DOWN,NTRANS ++S 4600,700,4600,3900,200,2a,DOWN,NTRANS ++S 3600,6600,3600,9300,200,1b,UP,PTRANS ++S 4800,6600,4800,9300,200,1a,UP,PTRANS ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,nd4_x1,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 4200,900,4200,3700,600,n1,UP,NDIF ++S 3400,900,3400,3700,600,n2,UP,NDIF ++S 2600,900,2600,3700,600,n3,UP,NDIF ++S 1800,900,1800,3700,400,*,UP,NDIF ++S 3800,4100,3800,5700,200,*,UP,POLY ++S 2200,3900,2200,4600,200,*,UP,POLY ++S 4200,6800,4200,9100,1000,*,UP,PDIF ++S 5300,6800,5300,9100,800,*,DOWN,PDIF ++S 3000,7900,3000,9300,400,*,UP,ALU1 ++S 5400,7900,5400,9300,400,*,UP,ALU1 ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 2000,7000,2000,8000,400,z,UP,CALU1 ++S 4000,7000,4000,8000,400,z,UP,CALU1 ++S 1900,7000,1900,8100,600,*,DOWN,ALU1 ++S 4100,7000,4100,8100,600,*,DOWN,ALU1 ++S 1000,7000,4000,7000,400,*,LEFT,ALU1 ++S 1000,7100,4000,7100,400,*,LEFT,ALU1 ++S 5000,6000,5000,7000,400,b,UP,CALU1 ++S 5000,6000,5000,7100,400,*,UP,ALU1 ++S 4000,6000,5000,6000,600,*,RIGHT,ALU1 ++S 3900,3000,5000,3000,400,*,RIGHT,ALU1 ++S 5000,3000,5000,5000,400,a,DOWN,CALU1 ++S 4600,3800,4600,5200,200,*,UP,POLY ++S 5000,2900,5000,5100,400,*,DOWN,ALU1 ++S 3900,2900,5000,2900,400,*,RIGHT,ALU1 ++S 4000,5000,4000,6000,400,b,DOWN,CALU1 ++S 4000,4900,4000,6000,400,*,DOWN,ALU1 ++S 1900,6000,3000,6000,400,*,LEFT,ALU1 ++S 1900,6100,3000,6100,400,*,LEFT,ALU1 ++S 5200,900,5200,3700,800,*,UP,NDIF ++S 2200,300,2200,700,200,*,DOWN,POLY ++S 3000,300,3000,700,200,*,DOWN,POLY ++S 3800,300,3800,700,200,*,DOWN,POLY ++S 4600,300,4600,700,200,*,DOWN,POLY ++S 1000,2000,2100,2000,400,*,RIGHT,ALU1 ++S 1000,1900,2100,1900,400,*,RIGHT,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 2000,3000,3000,3000,600,*,LEFT,ALU1 ++S 2000,3000,2000,5000,400,d,DOWN,CALU1 ++S 2000,3000,2000,5100,400,*,DOWN,ALU1 ++S 3000,3000,3000,3000,400,d,LEFT,CALU1 ++S 4000,3000,4000,3000,400,a,LEFT,CALU1 ++S 3000,4000,3000,6000,400,c,DOWN,CALU1 ++S 3000,3900,3000,6000,400,*,DOWN,ALU1 ++S 2000,6000,2000,6000,400,c,LEFT,CALU1 ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 5200,700,5200,2100,400,*,UP,ALU1 ++S 1200,4700,1800,4700,200,*,RIGHT,POLY ++S 1800,5900,1800,8200,1000,*,DOWN,PDIF ++S 1200,5700,1200,8400,200,1z,UP,PTRANS ++S 2400,5700,2400,8400,200,1c,UP,PTRANS ++S 700,5900,700,8200,800,*,DOWN,PDIF ++S 3000,5900,3000,9100,600,*,DOWN,PDIF ++S 1200,8400,1200,8800,200,*,DOWN,POLY ++S 2400,8400,2400,8800,200,*,DOWN,POLY ++S 3600,9300,3600,9700,200,*,DOWN,POLY ++S 4800,9300,4800,9700,200,*,DOWN,POLY ++S 1200,4700,1200,5700,200,*,DOWN,POLY ++S 4800,5300,4800,6600,200,*,DOWN,POLY ++S 2400,5300,2800,5300,200,*,LEFT,POLY ++S 3600,6100,3600,6600,200,*,DOWN,POLY ++S 3000,3900,3000,4900,200,*,UP,POLY ++V 700,700,CONT_BODY_P,* ++V 1800,8000,CONT_DIF_P,* ++V 1800,7000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,* ++V 4000,6000,CONT_POLY,* ++V 5200,2000,CONT_DIF_N,* ++V 1600,2000,CONT_DIF_N,* ++V 5200,1000,CONT_DIF_N,* ++V 5400,9000,CONT_DIF_P,* ++V 3000,9000,CONT_DIF_P,* ++V 3000,8000,CONT_DIF_P,* ++V 600,8000,CONT_DIF_P,* ++V 5400,8000,CONT_DIF_P,* ++V 5000,5000,CONT_POLY,* ++V 2000,4500,CONT_POLY,* ++V 3000,5100,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd4_x1.vbe b/alliance/src/cells/src/msxlib/nd4_x1.vbe +new file mode 100644 +index 0000000..64c5e05 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd4_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY nd4_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT cin_b : NATURAL := 7; ++ CONSTANT cin_c : NATURAL := 7; ++ CONSTANT cin_d : NATURAL := 6; ++ CONSTANT rdown_a_z : NATURAL := 2040; ++ CONSTANT rdown_b_z : NATURAL := 2040; ++ CONSTANT rdown_c_z : NATURAL := 2040; ++ CONSTANT rdown_d_z : NATURAL := 2030; ++ CONSTANT rup_a_z : NATURAL := 2210; ++ CONSTANT rup_b_z : NATURAL := 2200; ++ CONSTANT rup_c_z : NATURAL := 2200; ++ CONSTANT rup_d_z : NATURAL := 2200; ++ CONSTANT tphl_a_z : NATURAL := 56; ++ CONSTANT tphl_b_z : NATURAL := 53; ++ CONSTANT tphl_c_z : NATURAL := 49; ++ CONSTANT tphl_d_z : NATURAL := 42; ++ CONSTANT tplh_d_z : NATURAL := 55; ++ CONSTANT tplh_c_z : NATURAL := 64; ++ CONSTANT tplh_b_z : NATURAL := 73; ++ CONSTANT tplh_a_z : NATURAL := 80; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ d : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd4_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nd4_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd4_x1" ++ SEVERITY WARNING; ++ z <= not ((((a and b) and c) and d)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd4_x2.ap b/alliance/src/cells/src/msxlib/nd4_x2.ap +new file mode 100644 +index 0000000..e54fc17 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd4_x2.ap +@@ -0,0 +1,167 @@ ++V ALLIANCE : 6 ++H nd4_x2,P, 8/ 8/2014,100 ++A 0,0,9000,10000 ++R 2000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++R 1000,3000,ref_ref,z_30 ++R 4000,5000,ref_ref,c_50 ++R 3000,5000,ref_ref,b_50 ++R 7000,7000,ref_ref,b_70 ++R 6000,7000,ref_ref,b_70 ++R 5000,7000,ref_ref,b_70 ++R 3000,8000,ref_ref,z_80 ++R 4000,7000,ref_ref,b_70 ++R 2000,8000,ref_ref,z_80 ++R 1000,5000,ref_ref,z_50 ++R 4000,8000,ref_ref,z_80 ++R 1000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,b_60 ++R 4000,6000,ref_ref,c_60 ++R 1000,4000,ref_ref,z_40 ++R 1000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 3000,2000,ref_ref,z_20 ++R 4000,2000,ref_ref,z_20 ++R 5000,2000,ref_ref,z_20 ++R 5000,5000,ref_ref,d_50 ++R 6000,5000,ref_ref,d_50 ++R 4000,4000,ref_ref,c_40 ++R 5000,4000,ref_ref,c_40 ++R 6000,4000,ref_ref,c_40 ++R 8000,4000,ref_ref,a_40 ++R 8000,3000,ref_ref,a_30 ++R 7000,3000,ref_ref,a_30 ++R 6000,3000,ref_ref,a_30 ++R 5000,3000,ref_ref,a_30 ++R 4000,3000,ref_ref,a_30 ++R 3000,3000,ref_ref,a_30 ++R 2000,3000,ref_ref,a_30 ++R 2000,4000,ref_ref,a_40 ++R 3000,7000,ref_ref,b_70 ++R 7000,6000,ref_ref,d_60 ++R 7000,5000,ref_ref,d_50 ++R 7000,4000,ref_ref,d_50 ++S 900,6900,900,9300,400,*,DOWN,ALU1 ++S 1000,2000,1000,6000,400,z,DOWN,CALU1 ++S 1000,2000,1000,6100,400,*,DOWN,ALU1 ++S 2000,6000,2000,8000,400,z,DOWN,CALU1 ++S 2000,5900,2000,8000,600,*,UP,ALU1 ++S 1000,6000,2000,6000,600,*,RIGHT,ALU1 ++S 7800,300,7800,700,200,*,UP,POLY ++S 7000,300,7000,700,200,*,UP,POLY ++S 6200,300,6200,700,200,*,UP,POLY ++S 5400,300,5400,700,200,*,UP,POLY ++S 4200,300,4200,700,200,*,UP,POLY ++S 3400,300,3400,700,200,*,UP,POLY ++S 2600,300,2600,700,200,*,UP,POLY ++S 1800,300,1800,700,200,*,UP,POLY ++S 2000,8000,4600,8000,400,*,LEFT,ALU1 ++S 5800,5700,5800,9200,600,*,DOWN,PDIF ++S 5700,7900,5700,9300,400,*,DOWN,ALU1 ++S 5400,3000,5400,4900,200,*,DOWN,POLY ++S 3300,5700,3300,9200,1000,*,DOWN,PDIF ++S 3900,4300,3900,5500,200,*,DOWN,POLY ++S 5100,9400,5100,9700,200,*,DOWN,POLY ++S 3900,9400,3900,9700,200,*,DOWN,POLY ++S 5100,5500,5100,9400,200,04,UP,PTRANS ++S 4500,5700,4500,9200,1000,*,UP,PDIF ++S 3900,5500,3900,9400,200,03,UP,PTRANS ++S 2700,9400,2700,9700,200,*,DOWN,POLY ++S 1500,9400,1500,9700,200,*,DOWN,POLY ++S 1500,4700,1500,5500,200,*,DOWN,POLY ++S 1800,3000,1800,4900,200,*,UP,POLY ++S 2700,3900,2700,5500,200,*,UP,POLY ++S 800,5700,800,9200,600,*,DOWN,PDIF ++S 1500,5500,1500,9400,200,01,UP,PTRANS ++S 2700,5500,2700,9400,200,02,UP,PTRANS ++S 2100,5700,2100,9200,1000,*,DOWN,PDIF ++S 4000,8000,4000,8000,400,z,LEFT,CALU1 ++S 3000,8000,3000,8000,400,z,LEFT,CALU1 ++S 4000,7000,4000,7000,400,b,LEFT,CALU1 ++S 5000,7000,5000,7000,400,b,LEFT,CALU1 ++S 6000,7000,6000,7000,400,b,LEFT,CALU1 ++S 6000,5000,6000,5000,400,d,LEFT,CALU1 ++S 6000,4000,6000,4000,400,c,LEFT,CALU1 ++S 5000,4000,5000,4000,400,c,LEFT,CALU1 ++S 7000,3000,7000,3000,400,a,LEFT,CALU1 ++S 6000,3000,6000,3000,400,a,LEFT,CALU1 ++S 5000,3000,5000,3000,400,a,LEFT,CALU1 ++S 4000,3000,4000,3000,400,a,LEFT,CALU1 ++S 3000,3000,3000,3000,400,a,LEFT,CALU1 ++S 5000,2000,5000,2000,400,z,LEFT,CALU1 ++S 4000,2000,4000,2000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 0,600,9000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,9000,5000,10000,nd4_x2,LEFT,TALU8 ++S 0,2200,9000,2200,5200,*,LEFT,PWELL ++S 0,7600,9000,7600,5600,*,LEFT,NWELL ++S 0,9400,9000,9400,1200,vdd,RIGHT,CALU1 ++S 1800,700,1800,3000,200,09,DOWN,NTRANS ++S 2200,900,2200,2800,600,n3,UP,NDIF ++S 2600,700,2600,3000,200,10,DOWN,NTRANS ++S 3000,900,3000,2800,600,n2,UP,NDIF ++S 3400,700,3400,3000,200,11,DOWN,NTRANS ++S 3800,900,3800,2800,600,n1,UP,NDIF ++S 4200,700,4200,3000,200,12,DOWN,NTRANS ++S 4700,900,4700,2800,800,*,UP,NDIF ++S 5400,700,5400,3000,200,13,DOWN,NTRANS ++S 6600,900,6600,2800,600,n5,UP,NDIF ++S 7000,700,7000,3000,200,15,DOWN,NTRANS ++S 6200,700,6200,3000,200,14,DOWN,NTRANS ++S 5800,900,5800,2800,600,n4,UP,NDIF ++S 7400,900,7400,2800,600,n6,UP,NDIF ++S 7800,700,7800,3000,200,16,DOWN,NTRANS ++S 8400,900,8400,2800,600,*,UP,NDIF ++S 4200,3400,5400,3400,200,*,RIGHT,POLY ++S 3400,3000,3400,4000,200,*,UP,POLY ++S 3400,4000,3800,4000,200,*,RIGHT,POLY ++S 6200,3000,6200,3900,200,*,UP,POLY ++S 4000,4000,4000,6000,400,c,UP,CALU1 ++S 4000,4000,4000,6000,600,*,DOWN,ALU1 ++S 3900,4000,6200,4000,600,*,RIGHT,ALU1 ++S 7800,3000,7800,4200,200,*,UP,POLY ++S 2000,3000,8000,3000,400,*,RIGHT,ALU1 ++S 8000,3000,8000,4000,400,a,DOWN,CALU1 ++S 8000,3000,8000,4000,600,*,DOWN,ALU1 ++S 2600,3000,2600,4000,200,*,UP,POLY ++S 3000,5000,3000,7000,400,b,DOWN,CALU1 ++S 3000,4900,3000,7000,600,*,UP,ALU1 ++S 1000,2000,5100,2000,400,*,RIGHT,ALU1 ++S 1000,1900,5100,1900,400,*,RIGHT,ALU1 ++S 1200,900,1200,2800,800,*,UP,NDIF ++S 2000,3000,2000,5000,400,a,DOWN,CALU1 ++S 2000,3000,2000,5100,400,*,DOWN,ALU1 ++S 1900,3000,1900,5100,400,*,DOWN,ALU1 ++S 7000,3000,7000,6800,200,*,UP,POLY ++S 3000,7000,7100,7000,400,*,RIGHT,ALU1 ++S 7000,4000,7000,6000,400,d,UP,CALU1 ++S 7000,3900,7000,6100,400,*,UP,ALU1 ++S 5000,5000,7000,5000,600,*,RIGHT,ALU1 ++S 7000,7000,7000,7000,400,b,LEFT,CALU1 ++S 5000,5000,5000,5000,400,d,LEFT,CALU1 ++S 8400,700,8400,2100,400,*,DOWN,ALU1 ++V 7900,9300,CONT_BODY_N,* ++V 900,7000,CONT_DIF_P,* ++V 2100,6000,CONT_DIF_P,* ++V 6800,7000,CONT_POLY,* ++V 900,8000,CONT_DIF_P,* ++V 2100,7000,CONT_DIF_P,* ++V 5700,9000,CONT_DIF_P,* ++V 5700,8000,CONT_DIF_P,* ++V 5200,4900,CONT_POLY,* ++V 3300,9000,CONT_DIF_P,* ++V 4100,4200,CONT_POLY,* ++V 4500,8000,CONT_DIF_P,* ++V 2100,8000,CONT_DIF_P,* ++V 900,9000,CONT_DIF_P,* ++V 1900,4900,CONT_POLY,* ++V 1200,1000,CONT_DIF_N,* ++V 4800,2000,CONT_DIF_N,* ++V 8400,2000,CONT_DIF_N,* ++V 8400,1000,CONT_DIF_N,* ++V 3000,4900,CONT_POLY,* ++V 6200,4000,CONT_POLY,* ++V 8000,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd4_x2.vbe b/alliance/src/cells/src/msxlib/nd4_x2.vbe +new file mode 100644 +index 0000000..0a511a2 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd4_x2.vbe +@@ -0,0 +1,44 @@ ++ENTITY nd4_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 9000; ++ CONSTANT cin_a : NATURAL := 10; ++ CONSTANT cin_b : NATURAL := 10; ++ CONSTANT cin_c : NATURAL := 10; ++ CONSTANT cin_d : NATURAL := 9; ++ CONSTANT rdown_a_z : NATURAL := 1420; ++ CONSTANT rdown_b_z : NATURAL := 1420; ++ CONSTANT rdown_c_z : NATURAL := 1420; ++ CONSTANT rdown_d_z : NATURAL := 1410; ++ CONSTANT rup_a_z : NATURAL := 1530; ++ CONSTANT rup_b_z : NATURAL := 1520; ++ CONSTANT rup_c_z : NATURAL := 1520; ++ CONSTANT rup_d_z : NATURAL := 1520; ++ CONSTANT tphl_a_z : NATURAL := 56; ++ CONSTANT tphl_b_z : NATURAL := 53; ++ CONSTANT tphl_c_z : NATURAL := 48; ++ CONSTANT tphl_d_z : NATURAL := 40; ++ CONSTANT tplh_d_z : NATURAL := 53; ++ CONSTANT tplh_c_z : NATURAL := 63; ++ CONSTANT tplh_b_z : NATURAL := 72; ++ CONSTANT tplh_a_z : NATURAL := 79; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ d : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd4_x2; ++ ++ARCHITECTURE behaviour_data_flow OF nd4_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd4_x2" ++ SEVERITY WARNING; ++ z <= not ((((a and b) and c) and d)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nd4_x3.ap b/alliance/src/cells/src/msxlib/nd4_x3.ap +new file mode 100644 +index 0000000..6dda1c9 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd4_x3.ap +@@ -0,0 +1,215 @@ ++V ALLIANCE : 6 ++H nd4_x3,P, 8/ 8/2014,100 ++A 0,0,11000,10000 ++R 1000,3000,ref_ref,z_30 ++R 9000,4000,ref_ref,a_40 ++R 4000,5000,ref_ref,c_50 ++R 3000,5000,ref_ref,b_50 ++R 2000,7000,ref_ref,a_70 ++R 2000,6000,ref_ref,a_60 ++R 1000,7000,ref_ref,z_70 ++R 8000,4000,ref_ref,a_40 ++R 7000,4000,ref_ref,a_40 ++R 6000,4000,ref_ref,a_40 ++R 5000,4000,ref_ref,a_40 ++R 4000,4000,ref_ref,a_40 ++R 3000,4000,ref_ref,a_40 ++R 7000,7000,ref_ref,b_70 ++R 6000,7000,ref_ref,b_70 ++R 5000,7000,ref_ref,b_70 ++R 5000,3000,ref_ref,z_30 ++R 4000,3000,ref_ref,z_30 ++R 3000,3000,ref_ref,z_30 ++R 8000,8000,ref_ref,z_80 ++R 7000,8000,ref_ref,z_80 ++R 6000,8000,ref_ref,z_80 ++R 5000,8000,ref_ref,z_80 ++R 3000,8000,ref_ref,z_80 ++R 4000,7000,ref_ref,b_70 ++R 7000,6000,ref_ref,c_60 ++R 6000,6000,ref_ref,c_60 ++R 6000,5000,ref_ref,d_50 ++R 2000,8000,ref_ref,z_80 ++R 1000,5000,ref_ref,z_50 ++R 4000,8000,ref_ref,z_80 ++R 1000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,b_60 ++R 5000,5000,ref_ref,d_50 ++R 4000,6000,ref_ref,c_60 ++R 5000,6000,ref_ref,c_60 ++R 1000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 8000,7000,ref_ref,b_70 ++R 3000,7000,ref_ref,b_70 ++R 10000,4000,ref_ref,a_40 ++R 5000,2000,ref_ref,z_20 ++R 1000,8000,ref_ref,z_80 ++R 2000,4000,ref_ref,a_40 ++R 9000,8000,ref_ref,z_80 ++R 10000,5000,ref_ref,a_50 ++R 9000,5000,ref_ref,b_50 ++R 7000,5000,ref_ref,d_50 ++R 9000,6000,ref_ref,b_60 ++R 8000,6000,ref_ref,d_60 ++S 9100,9300,10300,9300,600,*,RIGHT,NTIE ++S 900,2900,900,8000,400,*,DOWN,ALU1 ++S 1000,2900,1000,8000,400,*,DOWN,ALU1 ++S 8000,8000,8000,8000,400,z,LEFT,CALU1 ++S 7000,8000,7000,8000,400,z,LEFT,CALU1 ++S 6000,8000,6000,8000,400,z,LEFT,CALU1 ++S 5000,8000,5000,8000,400,z,LEFT,CALU1 ++S 4000,8000,4000,8000,400,z,LEFT,CALU1 ++S 3000,8000,3000,8000,400,z,LEFT,CALU1 ++S 2000,8000,2000,8000,400,z,LEFT,CALU1 ++S 7000,7000,7000,7000,400,b,LEFT,CALU1 ++S 6000,7000,6000,7000,400,b,LEFT,CALU1 ++S 5000,7000,5000,7000,400,b,LEFT,CALU1 ++S 4000,7000,4000,7000,400,b,LEFT,CALU1 ++S 5000,6000,5000,6000,400,c,LEFT,CALU1 ++S 7000,6000,7000,6000,400,c,LEFT,CALU1 ++S 6000,6000,6000,6000,400,c,LEFT,CALU1 ++S 6000,5000,6000,5000,400,d,LEFT,CALU1 ++S 5000,5000,5000,5000,400,d,LEFT,CALU1 ++S 7200,5800,7200,6700,200,*,DOWN,POLY ++S 6000,4800,6000,6700,200,*,DOWN,POLY ++S 9000,4000,9000,4000,400,a,LEFT,CALU1 ++S 8000,4000,8000,4000,400,a,LEFT,CALU1 ++S 7000,4000,7000,4000,400,a,LEFT,CALU1 ++S 6000,4000,6000,4000,400,a,LEFT,CALU1 ++S 5000,4000,5000,4000,400,a,LEFT,CALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 3000,4000,3000,4000,400,a,LEFT,CALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 3000,3000,3000,3000,400,z,LEFT,CALU1 ++S 4000,3000,4000,3000,400,z,LEFT,CALU1 ++S 5000,2000,5000,3000,400,z,DOWN,CALU1 ++S 0,600,11000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,11000,5000,10000,nd4_x3,LEFT,TALU8 ++S 0,2200,11000,2200,5200,*,LEFT,PWELL ++S 0,7600,11000,7600,5600,*,LEFT,NWELL ++S 4800,5000,6000,5000,600,*,RIGHT,POLY ++S 1200,4600,1800,4600,200,*,RIGHT,POLY ++S 4000,6000,7100,6000,400,*,RIGHT,ALU1 ++S 4000,5000,4000,6000,400,c,DOWN,CALU1 ++S 4000,5000,4000,6000,600,*,DOWN,ALU1 ++S 3000,5000,3000,7000,400,b,DOWN,CALU1 ++S 3000,5000,3000,7000,600,*,UP,ALU1 ++S 2400,5200,2700,5200,200,*,RIGHT,POLY ++S 0,9400,11000,9400,1200,vdd,RIGHT,CALU1 ++S 600,6900,600,9100,600,*,DOWN,PDIF ++S 1200,6700,1200,9300,200,01,UP,PTRANS ++S 2400,6700,2400,9300,200,02,UP,PTRANS ++S 1800,6900,1800,9100,1000,*,DOWN,PDIF ++S 3000,6900,3000,9100,1000,*,DOWN,PDIF ++S 3600,6700,3600,9300,200,03,UP,PTRANS ++S 4200,6900,4200,9100,1000,*,UP,PDIF ++S 4800,6700,4800,9300,200,04,UP,PTRANS ++S 5400,6900,5400,9100,600,*,DOWN,PDIF ++S 6000,6700,6000,9300,200,05,UP,PTRANS ++S 6600,6900,6600,9100,1000,*,DOWN,PDIF ++S 7200,6700,7200,9300,200,06,UP,PTRANS ++S 9000,6000,9000,8200,1000,*,DOWN,PDIF ++S 8400,5800,8400,8400,200,07,UP,PTRANS ++S 9600,5800,9600,8400,200,08,UP,PTRANS ++S 10200,6000,10200,8200,600,*,DOWN,PDIF ++S 7800,6000,7800,9100,600,*,DOWN,PDIF ++S 9600,8400,9600,8800,200,*,DOWN,POLY ++S 8400,8400,8400,8800,200,*,DOWN,POLY ++S 7200,9300,7200,9700,200,*,DOWN,POLY ++S 9600,4200,9600,5800,200,*,DOWN,POLY ++S 2000,4000,10100,4000,400,*,RIGHT,ALU1 ++S 6000,9300,6000,9700,200,*,DOWN,POLY ++S 2200,700,2200,3800,200,09,DOWN,NTRANS ++S 1600,700,1600,2100,400,*,DOWN,ALU1 ++S 2200,300,2200,700,200,*,UP,POLY ++S 3000,300,3000,700,200,*,UP,POLY ++S 3800,300,3800,700,200,*,UP,POLY ++S 4600,300,4600,700,200,*,UP,POLY ++S 5800,300,5800,700,200,*,UP,POLY ++S 6600,300,6600,700,200,*,UP,POLY ++S 7400,300,7400,700,200,*,UP,POLY ++S 8200,300,8200,700,200,*,UP,POLY ++S 2600,900,2600,3600,600,n3,UP,NDIF ++S 3000,700,3000,3800,200,10,DOWN,NTRANS ++S 3400,900,3400,3600,600,n2,UP,NDIF ++S 3800,700,3800,3800,200,11,DOWN,NTRANS ++S 4200,900,4200,3600,600,n1,UP,NDIF ++S 4600,700,4600,3800,200,12,DOWN,NTRANS ++S 5100,900,5100,3600,800,*,UP,NDIF ++S 5800,700,5800,3800,200,13,DOWN,NTRANS ++S 6200,900,6200,3600,600,n4,UP,NDIF ++S 6600,700,6600,3800,200,14,DOWN,NTRANS ++S 7000,900,7000,3600,600,n5,UP,NDIF ++S 7400,700,7400,3800,200,15,DOWN,NTRANS ++S 7800,900,7800,3600,600,n6,UP,NDIF ++S 8200,700,8200,3800,200,16,DOWN,NTRANS ++S 3000,3800,3000,5000,200,*,UP,POLY ++S 1200,4600,1200,6700,200,*,DOWN,POLY ++S 2400,5200,2400,6700,200,*,DOWN,POLY ++S 3600,5800,3600,6700,200,*,DOWN,POLY ++S 3800,3800,3800,5700,200,*,UP,POLY ++S 4800,4800,4800,6700,200,*,DOWN,POLY ++S 4600,3800,4600,5200,200,*,UP,POLY ++S 5800,3800,5800,4800,200,*,UP,POLY ++S 6600,4100,6600,5700,200,*,UP,POLY ++S 8200,4200,9700,4200,200,*,RIGHT,POLY ++S 5100,1900,5100,3000,600,*,DOWN,ALU1 ++S 1600,900,1600,3600,800,*,UP,NDIF ++S 1000,3000,5000,3000,400,*,RIGHT,ALU1 ++S 1000,2900,5000,2900,400,*,RIGHT,ALU1 ++S 8800,700,8800,2100,400,*,DOWN,ALU1 ++S 8800,900,8800,3600,600,*,UP,NDIF ++S 1000,3000,1000,8000,400,z,DOWN,CALU1 ++S 2000,4000,2000,7100,400,*,DOWN,ALU1 ++S 2000,4000,2000,7000,400,a,DOWN,CALU1 ++S 1900,4000,1900,7100,400,*,DOWN,ALU1 ++S 1200,9300,1200,9700,200,*,DOWN,POLY ++S 2400,9300,2400,9700,200,*,DOWN,POLY ++S 3600,9300,3600,9700,200,*,DOWN,POLY ++S 4800,9300,4800,9700,200,*,DOWN,POLY ++S 10200,6900,10200,9300,400,*,UP,ALU1 ++S 10000,4000,10000,5000,600,*,UP,ALU1 ++S 10000,4000,10000,5000,400,a,DOWN,CALU1 ++S 10000,600,10000,3400,600,*,UP,PTIE ++S 1000,8000,9100,8000,400,*,LEFT,ALU1 ++S 7000,5000,7000,5000,400,d,LEFT,CALU1 ++S 3000,7000,9000,7000,400,*,RIGHT,ALU1 ++S 8000,7000,8000,7000,400,b,LEFT,CALU1 ++S 8900,4900,8900,7000,600,*,DOWN,ALU1 ++S 8400,4900,8400,5800,200,*,DOWN,POLY ++S 8400,5100,8800,5100,600,*,LEFT,POLY ++S 7400,4900,8400,4900,200,*,RIGHT,POLY ++S 7400,3800,7400,4900,200,*,DOWN,POLY ++S 9000,5000,9000,6000,400,b,DOWN,CALU1 ++S 4900,5000,8000,5000,400,*,RIGHT,ALU1 ++S 8000,6000,8000,6000,400,d,LEFT,CALU1 ++S 8000,5000,8000,6100,400,*,UP,ALU1 ++S 9000,8000,9000,8000,400,z,LEFT,CALU1 ++V 10300,9300,CONT_BODY_N,* ++V 9000,9300,CONT_BODY_N,* ++V 7800,9000,CONT_DIF_P,* ++V 6600,8000,CONT_DIF_P,* ++V 6800,6000,CONT_POLY,* ++V 5400,5000,CONT_POLY,* ++V 1800,8000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,* ++V 4000,6000,CONT_POLY,* ++V 10200,8000,CONT_DIF_P,* ++V 2000,4400,CONT_POLY,* ++V 3000,5000,CONT_POLY,* ++V 600,9000,CONT_DIF_P,* ++V 3000,9000,CONT_DIF_P,* ++V 5400,9000,CONT_DIF_P,* ++V 1600,2000,CONT_DIF_N,* ++V 1600,1000,CONT_DIF_N,* ++V 5200,2000,CONT_DIF_N,* ++V 5200,3000,CONT_DIF_N,* ++V 8800,2000,CONT_DIF_N,* ++V 8800,1000,CONT_DIF_N,* ++V 10000,600,CONT_BODY_P,* ++V 9000,8000,CONT_DIF_P,* ++V 10200,7000,CONT_DIF_P,* ++V 9900,4400,CONT_POLY,* ++V 8800,5100,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nd4_x3.vbe b/alliance/src/cells/src/msxlib/nd4_x3.vbe +new file mode 100644 +index 0000000..97aaf28 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nd4_x3.vbe +@@ -0,0 +1,44 @@ ++ENTITY nd4_x3 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 11000; ++ CONSTANT cin_a : NATURAL := 14; ++ CONSTANT cin_b : NATURAL := 14; ++ CONSTANT cin_c : NATURAL := 13; ++ CONSTANT cin_d : NATURAL := 12; ++ CONSTANT rdown_a_z : NATURAL := 1050; ++ CONSTANT rdown_b_z : NATURAL := 1050; ++ CONSTANT rdown_c_z : NATURAL := 1050; ++ CONSTANT rdown_d_z : NATURAL := 1050; ++ CONSTANT rup_a_z : NATURAL := 1150; ++ CONSTANT rup_b_z : NATURAL := 1140; ++ CONSTANT rup_c_z : NATURAL := 1140; ++ CONSTANT rup_d_z : NATURAL := 1140; ++ CONSTANT tphl_a_z : NATURAL := 56; ++ CONSTANT tphl_b_z : NATURAL := 53; ++ CONSTANT tphl_c_z : NATURAL := 48; ++ CONSTANT tphl_d_z : NATURAL := 41; ++ CONSTANT tplh_d_z : NATURAL := 54; ++ CONSTANT tplh_c_z : NATURAL := 63; ++ CONSTANT tplh_b_z : NATURAL := 73; ++ CONSTANT tplh_a_z : NATURAL := 80; ++ CONSTANT transistors : NATURAL := 16 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ d : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nd4_x3; ++ ++ARCHITECTURE behaviour_data_flow OF nd4_x3 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nd4_x3" ++ SEVERITY WARNING; ++ z <= not ((((a and b) and c) and d)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr2_x05.ap b/alliance/src/cells/src/msxlib/nr2_x05.ap +new file mode 100644 +index 0000000..2ba4146 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2_x05.ap +@@ -0,0 +1,70 @@ ++V ALLIANCE : 6 ++H nr2_x05,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 2000,4000,ref_ref,b_40 ++R 1000,3000,ref_ref,z_30 ++R 3000,5000,ref_ref,a_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 3000,4000,ref_ref,b_40 ++R 2000,3000,ref_ref,z_30 ++R 3000,3000,ref_ref,b_30 ++R 2000,2000,ref_ref,z_20 ++R 2000,5000,ref_ref,a_60 ++R 2000,6000,ref_ref,a_60 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,4000,5000,10000,nr2_x05,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 1600,5600,1600,7800,200,1,UP,PTRANS ++S 2400,5600,2400,7800,200,2,UP,PTRANS ++S 2000,5800,2000,7600,600,n1,UP,PDIF ++S 1200,5800,1200,7600,400,*,UP,PDIF ++S 1400,1700,1400,2300,200,3,DOWN,NTRANS ++S 1400,1300,1400,1700,200,*,UP,POLY ++S 800,700,800,2100,400,*,DOWN,ALU1 ++S 2000,1900,2000,2100,1000,*,UP,NDIF ++S 2600,1300,2600,1700,200,*,UP,POLY ++S 2600,1700,2600,2300,200,4,DOWN,NTRANS ++S 2000,2000,2000,3000,400,z,DOWN,CALU1 ++S 1000,3000,2000,3000,600,*,RIGHT,ALU1 ++S 1800,4000,3000,4000,600,*,LEFT,ALU1 ++S 2600,2300,2600,5200,200,*,UP,POLY ++S 1600,3800,1600,5600,200,*,DOWN,POLY ++S 1400,2300,1400,4200,200,*,UP,POLY ++S 2000,5000,3000,5000,600,*,LEFT,ALU1 ++S 2000,4000,2000,4000,400,b,LEFT,CALU1 ++S 1000,3000,1000,6000,400,z,DOWN,CALU1 ++S 3000,5000,3000,5000,400,a,LEFT,CALU1 ++S 3000,5900,3000,9300,400,*,UP,ALU1 ++S 3100,5800,3100,7600,600,*,DOWN,PDIF ++S 2400,7800,2400,8200,200,*,DOWN,POLY ++S 1600,7800,1600,8200,200,*,DOWN,POLY ++S 2000,4900,2000,6100,400,*,UP,ALU1 ++S 2000,5000,2000,6000,400,a,UP,CALU1 ++S 1000,6000,1000,6600,600,*,DOWN,PDIF ++S 3000,3000,3000,4000,400,b,DOWN,CALU1 ++S 3000,2900,3000,4000,400,*,DOWN,ALU1 ++S 3200,1900,3200,2100,600,*,UP,NDIF ++S 3200,700,3200,2100,400,*,DOWN,ALU1 ++S 2000,1900,2000,3100,400,*,DOWN,ALU1 ++S 1000,2900,1000,6800,400,*,DOWN,ALU1 ++S 1400,4000,2000,4000,600,*,LEFT,POLY ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 1000,5900,CONT_DIF_P,* ++V 2000,2000,CONT_DIF_N,* ++V 800,2000,CONT_DIF_N,* ++V 1800,4000,CONT_POLY,* ++V 2600,5000,CONT_POLY,* ++V 3000,7000,CONT_DIF_P,* ++V 3000,6000,CONT_DIF_P,* ++V 1000,6700,CONT_DIF_P,* ++V 3200,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr2_x05.vbe b/alliance/src/cells/src/msxlib/nr2_x05.vbe +new file mode 100644 +index 0000000..41e5133 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2_x05.vbe +@@ -0,0 +1,32 @@ ++ENTITY nr2_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 3; ++ CONSTANT cin_b : NATURAL := 3; ++ CONSTANT rdown_a_z : NATURAL := 3820; ++ CONSTANT rdown_b_z : NATURAL := 3810; ++ CONSTANT rup_a_z : NATURAL := 5280; ++ CONSTANT rup_b_z : NATURAL := 5280; ++ CONSTANT tplh_a_z : NATURAL := 55; ++ CONSTANT tplh_b_z : NATURAL := 45; ++ CONSTANT tphl_b_z : NATURAL := 44; ++ CONSTANT tphl_a_z : NATURAL := 53; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr2_x05; ++ ++ARCHITECTURE behaviour_data_flow OF nr2_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr2_x05" ++ SEVERITY WARNING; ++ z <= not ((a or b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr2_x1.ap b/alliance/src/cells/src/msxlib/nr2_x1.ap +new file mode 100644 +index 0000000..edd6c77 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2_x1.ap +@@ -0,0 +1,73 @@ ++V ALLIANCE : 6 ++H nr2_x1,P, 8/ 8/2014,100 ++A 0,0,4000,10000 ++R 2000,6000,ref_ref,a_60 ++R 1000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,b_40 ++R 1000,7000,ref_ref,z_70 ++R 3000,6000,ref_ref,a_60 ++R 2000,3000,ref_ref,z_30 ++R 3000,4000,ref_ref,b_40 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,b_50 ++R 3000,5000,ref_ref,a_50 ++R 2000,2000,ref_ref,z_20 ++R 3000,7000,ref_ref,a_70 ++S 1100,700,1900,700,600,*,LEFT,PTIE ++S 2000,3900,2000,5100,400,*,UP,ALU1 ++S 1000,2900,1000,7000,400,*,DOWN,ALU1 ++S 1400,4000,2000,4000,600,*,LEFT,POLY ++S 3000,4000,3000,4000,400,b,LEFT,CALU1 ++S 2000,6000,2000,6000,400,a,LEFT,CALU1 ++S 2400,5100,2600,5100,200,*,RIGHT,POLY ++S 2000,4000,2000,5000,400,b,DOWN,CALU1 ++S 1200,5700,1200,9200,400,*,UP,PDIF ++S 3100,5700,3100,9200,600,*,DOWN,PDIF ++S 3000,7900,3000,9300,400,*,UP,ALU1 ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 2000,5700,2000,9200,600,n1,UP,PDIF ++S 2400,5500,2400,9400,200,2,UP,PTRANS ++S 1600,9400,1600,9700,200,*,DOWN,POLY ++S 1600,5500,1600,9400,200,1,UP,PTRANS ++S 0,5000,4000,5000,10000,nr2_x1,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 1400,1300,1400,1700,200,*,UP,POLY ++S 1400,1700,1400,2800,200,3,DOWN,NTRANS ++S 2600,1300,2600,1700,200,*,UP,POLY ++S 2600,1700,2600,2800,200,4,DOWN,NTRANS ++S 2000,1900,2000,2600,1000,*,UP,NDIF ++S 3200,700,3200,2100,400,*,DOWN,ALU1 ++S 3300,1900,3300,2600,600,*,UP,NDIF ++S 1600,3800,1600,5500,200,*,DOWN,POLY ++S 1800,4000,3000,4000,600,*,RIGHT,ALU1 ++S 1000,3000,2000,3000,600,*,RIGHT,ALU1 ++S 2000,2000,2000,3000,400,z,DOWN,CALU1 ++S 2000,1900,2000,3000,400,*,UP,ALU1 ++S 1000,5900,1000,6500,600,*,DOWN,PDIF ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1000,7000,1000,7100,400,*,UP,ALU1 ++S 2600,2800,2600,5100,200,*,UP,POLY ++S 2400,5000,2400,5500,200,*,DOWN,POLY ++S 1400,2800,1400,4200,200,*,UP,POLY ++S 800,700,800,2100,400,*,DOWN,ALU1 ++S 700,1900,700,2600,600,*,UP,NDIF ++S 3000,4900,3000,7000,600,*,UP,ALU1 ++S 3000,5000,3000,7000,400,a,UP,CALU1 ++S 1900,6000,3100,6000,400,*,LEFT,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,2500,CONT_DIF_N,* ++V 3000,9000,CONT_DIF_P,* ++V 3000,8000,CONT_DIF_P,* ++V 3000,4900,CONT_POLY,* ++V 3200,2000,CONT_DIF_N,* ++V 1800,4000,CONT_POLY,* ++V 1000,5800,CONT_DIF_P,* ++V 1000,6600,CONT_DIF_P,* ++V 800,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr2_x1.vbe b/alliance/src/cells/src/msxlib/nr2_x1.vbe +new file mode 100644 +index 0000000..dd781df +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2_x1.vbe +@@ -0,0 +1,32 @@ ++ENTITY nr2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT cin_a : NATURAL := 6; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT rdown_a_z : NATURAL := 2080; ++ CONSTANT rdown_b_z : NATURAL := 2080; ++ CONSTANT rup_a_z : NATURAL := 2980; ++ CONSTANT rup_b_z : NATURAL := 2980; ++ CONSTANT tplh_a_z : NATURAL := 53; ++ CONSTANT tplh_b_z : NATURAL := 44; ++ CONSTANT tphl_b_z : NATURAL := 42; ++ CONSTANT tphl_a_z : NATURAL := 50; ++ CONSTANT transistors : NATURAL := 4 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nr2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr2_x1" ++ SEVERITY WARNING; ++ z <= not ((a or b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr2_x2.ap b/alliance/src/cells/src/msxlib/nr2_x2.ap +new file mode 100644 +index 0000000..9563816 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2_x2.ap +@@ -0,0 +1,92 @@ ++V ALLIANCE : 6 ++H nr2_x2,P, 8/ 8/2014,100 ++A 0,0,6000,10000 ++R 4000,4000,ref_ref,a_40 ++R 3000,4000,ref_ref,a_40 ++R 2000,4000,ref_ref,a_40 ++R 2000,5000,ref_ref,a_50 ++R 3000,5000,ref_ref,b_50 ++R 4000,5000,ref_ref,b_50 ++R 4000,6000,ref_ref,b_60 ++R 1000,6000,ref_ref,z_60 ++R 2000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,z_30 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,3000,ref_ref,z_30 ++R 3000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,z_60 ++R 3000,6000,ref_ref,z_60 ++S 2000,4000,2000,5000,400,a,DOWN,CALU1 ++S 3000,4000,3000,4000,400,a,LEFT,CALU1 ++S 3000,5000,3000,5000,400,b,LEFT,CALU1 ++S 4400,3800,4400,5500,200,*,DOWN,POLY ++S 2800,3400,2800,4700,200,*,UP,POLY ++S 1600,3400,1600,5500,200,*,DOWN,POLY ++S 1600,900,1600,1300,200,*,UP,POLY ++S 2800,900,2800,1300,200,*,UP,POLY ++S 1000,1500,1000,3200,800,*,UP,NDIF ++S 3500,1500,3500,3200,600,*,DOWN,NDIF ++S 2800,1300,2800,3400,200,6,DOWN,NTRANS ++S 1600,1300,1600,3400,200,5,DOWN,NTRANS ++S 2200,1500,2200,3200,1000,*,UP,NDIF ++S 5000,5700,5000,9200,800,*,DOWN,PDIF ++S 1000,5700,1000,9200,800,*,DOWN,PDIF ++S 2400,5100,3600,5100,200,*,LEFT,POLY ++S 4400,5500,4400,9400,200,4,UP,PTRANS ++S 4000,5800,4000,9200,600,n2,DOWN,PDIF ++S 3000,5700,3000,9200,1000,*,DOWN,PDIF ++S 2400,5500,2400,9400,200,2,UP,PTRANS ++S 2000,5700,2000,9200,600,n1,UP,PDIF ++S 1600,5500,1600,9400,200,1,UP,PTRANS ++S 3600,5500,3600,9400,200,3,UP,PTRANS ++S 4400,9400,4400,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 1600,9400,1600,9700,200,*,DOWN,POLY ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,nr2_x2,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,2000,2000,3000,400,z,DOWN,CALU1 ++S 1000,3000,2200,3000,600,*,RIGHT,ALU1 ++S 1000,700,1000,2100,400,*,DOWN,ALU1 ++S 2000,4000,2000,5100,400,*,UP,ALU1 ++S 1900,4000,1900,5100,400,*,UP,ALU1 ++S 2900,5000,4000,5000,600,*,LEFT,ALU1 ++S 4000,4900,4000,6100,400,*,UP,ALU1 ++S 4000,5000,4000,6000,400,b,UP,CALU1 ++S 1900,4000,4100,4000,400,*,LEFT,ALU1 ++S 3800,4000,4400,4000,600,*,RIGHT,POLY ++S 3000,6000,3000,7000,400,z,UP,CALU1 ++S 3000,6000,3000,7000,600,*,UP,ALU1 ++S 1000,6100,3000,6100,400,*,RIGHT,ALU1 ++S 1000,6000,3000,6000,400,*,RIGHT,ALU1 ++S 2000,6000,2000,6000,400,z,LEFT,CALU1 ++S 1000,3000,1000,6000,400,z,DOWN,CALU1 ++S 1000,2900,1000,6100,400,*,DOWN,ALU1 ++S 2100,1900,2100,3100,600,*,DOWN,ALU1 ++S 3400,700,3400,3100,400,*,DOWN,ALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 5000,6900,5000,9300,400,*,UP,ALU1 ++S 1000,6900,1000,9300,400,*,UP,ALU1 ++S 5000,600,5000,3500,600,*,UP,PTIE ++V 5000,700,CONT_BODY_P,* ++V 2000,4000,CONT_POLY,* ++V 4000,4000,CONT_POLY,* ++V 3000,7000,CONT_DIF_P,* ++V 1000,8000,CONT_DIF_P,* ++V 5000,8000,CONT_DIF_P,* ++V 5000,9000,CONT_DIF_P,* ++V 1000,9000,CONT_DIF_P,* ++V 2200,3000,CONT_DIF_N,* ++V 3000,4900,CONT_POLY,* ++V 2200,2000,CONT_DIF_N,* ++V 1000,2000,CONT_DIF_N,* ++V 3400,2000,CONT_DIF_N,* ++V 3000,6000,CONT_DIF_P,* ++V 3400,3000,CONT_DIF_N,* ++V 1000,7000,CONT_DIF_P,* ++V 5000,7000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr2_x2.vbe b/alliance/src/cells/src/msxlib/nr2_x2.vbe +new file mode 100644 +index 0000000..ddb1eaa +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2_x2.vbe +@@ -0,0 +1,32 @@ ++ENTITY nr2_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 11; ++ CONSTANT cin_b : NATURAL := 10; ++ CONSTANT rdown_a_z : NATURAL := 1090; ++ CONSTANT rdown_b_z : NATURAL := 1090; ++ CONSTANT rup_a_z : NATURAL := 1490; ++ CONSTANT rup_b_z : NATURAL := 1490; ++ CONSTANT tplh_a_z : NATURAL := 51; ++ CONSTANT tplh_b_z : NATURAL := 41; ++ CONSTANT tphl_b_z : NATURAL := 40; ++ CONSTANT tphl_a_z : NATURAL := 50; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr2_x2; ++ ++ARCHITECTURE behaviour_data_flow OF nr2_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr2_x2" ++ SEVERITY WARNING; ++ z <= not ((a or b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr2a_x05.ap b/alliance/src/cells/src/msxlib/nr2a_x05.ap +new file mode 100644 +index 0000000..b63165e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2a_x05.ap +@@ -0,0 +1,91 @@ ++V ALLIANCE : 6 ++H nr2a_x05,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 2000,7000,ref_ref,a_70 ++R 2000,2000,ref_ref,z_20 ++R 3000,5000,ref_ref,a_50 ++R 2000,5000,ref_ref,b_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 3000,6000,ref_ref,a_60 ++R 3000,3000,ref_ref,b_30 ++R 1000,7000,ref_ref,z_70 ++R 2000,4000,ref_ref,b_40 ++R 1000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,a_60 ++R 1000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,b_30 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 2100,700,2900,700,600,*,LEFT,PTIE ++S 3200,5800,3200,7600,600,*,DOWN,PDIF ++S 2600,2300,2600,5100,200,*,UP,POLY ++S 1400,2300,1400,4200,200,*,UP,POLY ++S 1400,1700,1400,2300,200,4z,DOWN,NTRANS ++S 800,900,800,2100,600,*,UP,NDIF ++S 700,900,700,2100,600,*,UP,NDIF ++S 2600,1700,2600,2300,200,3z,DOWN,NTRANS ++S 2000,1900,2000,2100,1000,*,UP,NDIF ++S 3800,2600,3800,5500,200,*,UP,POLY ++S 3300,1900,3300,2400,600,*,UP,NDIF ++S 3800,1700,3800,2600,200,2a,DOWN,NTRANS ++S 4200,1900,4200,2400,400,*,UP,NDIF ++S 3800,7300,3800,7700,200,*,DOWN,POLY ++S 1600,7800,1600,8100,200,*,DOWN,POLY ++S 2400,7800,2400,8100,200,*,DOWN,POLY ++S 1000,6000,1000,6600,600,*,DOWN,PDIF ++S 4400,6000,4400,6600,600,*,UP,PDIF ++S 1200,5800,1200,7600,400,*,UP,PDIF ++S 1600,5600,1600,7800,200,2z,UP,PTRANS ++S 2000,5800,2000,7600,600,n1,UP,PDIF ++S 2400,5600,2400,7800,200,1z,UP,PTRANS ++S 4200,5800,4200,7100,400,*,DOWN,PDIF ++S 3800,5600,3800,7300,200,1a,UP,PTRANS ++S 2400,5000,2400,5500,200,*,DOWN,POLY ++S 1000,7000,1000,7100,400,*,UP,ALU1 ++S 3200,700,3200,2100,400,*,DOWN,ALU1 ++S 2600,1300,2600,1700,200,*,UP,POLY ++S 1400,1300,1400,1700,200,*,UP,POLY ++S 1600,3900,1600,5500,200,*,DOWN,POLY ++S 1800,4100,2000,4100,600,*,RIGHT,ALU1 ++S 2000,6000,2000,7000,400,a,DOWN,CALU1 ++S 3000,5000,3000,6000,400,a,UP,CALU1 ++S 2000,5900,2000,7100,400,*,UP,ALU1 ++S 3000,6900,3000,9300,400,*,UP,ALU1 ++S 1000,2000,2000,2000,600,*,RIGHT,ALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 2000,3000,2000,5100,400,*,UP,ALU1 ++S 2000,3000,2000,5000,400,b,DOWN,CALU1 ++S 3000,3000,3000,3000,400,b,LEFT,CALU1 ++S 2000,2900,3100,2900,400,*,RIGHT,ALU1 ++S 2000,3000,3100,3000,400,*,RIGHT,ALU1 ++S 2800,3900,4400,3900,400,*,RIGHT,ALU1 ++S 3000,4900,3000,6100,400,*,UP,ALU1 ++S 2000,6000,3000,6000,600,*,LEFT,ALU1 ++S 3000,4900,3600,4900,400,*,LEFT,ALU1 ++S 0,5000,5000,5000,10000,nr2a_x05,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 3800,1300,3800,1700,200,*,UP,POLY ++S 4400,2200,4400,6800,400,*,UP,ALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 3000,700,CONT_BODY_P,* ++V 2000,700,CONT_BODY_P,* ++V 4400,5900,CONT_DIF_P,an ++V 4400,2300,CONT_DIF_N,an ++V 1000,6700,CONT_DIF_P,* ++V 1000,5900,CONT_DIF_P,* ++V 4400,6700,CONT_DIF_P,an ++V 3200,2000,CONT_DIF_N,* ++V 2000,2000,CONT_DIF_N,* ++V 3500,4900,CONT_POLY,* ++V 3000,7000,CONT_DIF_P,* ++V 800,1000,CONT_DIF_N,* ++V 2900,3900,CONT_POLY,an ++V 1800,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr2a_x05.vbe b/alliance/src/cells/src/msxlib/nr2a_x05.vbe +new file mode 100644 +index 0000000..8e51c8d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2a_x05.vbe +@@ -0,0 +1,32 @@ ++ENTITY nr2a_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_b : NATURAL := 3; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT rdown_b_z : NATURAL := 3810; ++ CONSTANT rdown_a_z : NATURAL := 3820; ++ CONSTANT rup_b_z : NATURAL := 5280; ++ CONSTANT rup_a_z : NATURAL := 5270; ++ CONSTANT tplh_b_z : NATURAL := 46; ++ CONSTANT tphl_b_z : NATURAL := 45; ++ CONSTANT tphh_a_z : NATURAL := 78; ++ CONSTANT tpll_a_z : NATURAL := 93; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr2a_x05; ++ ++ARCHITECTURE behaviour_data_flow OF nr2a_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr2a_x05" ++ SEVERITY WARNING; ++ z <= (not (b) and a) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr2a_x1.ap b/alliance/src/cells/src/msxlib/nr2a_x1.ap +new file mode 100644 +index 0000000..169e377 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2a_x1.ap +@@ -0,0 +1,91 @@ ++V ALLIANCE : 6 ++H nr2a_x1,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 2000,7000,ref_ref,a_70 ++R 2000,2000,ref_ref,z_20 ++R 3000,5000,ref_ref,a_50 ++R 2000,5000,ref_ref,b_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 3000,6000,ref_ref,a_60 ++R 3000,3000,ref_ref,b_30 ++R 1000,7000,ref_ref,z_70 ++R 2000,4000,ref_ref,b_40 ++R 1000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,a_60 ++R 1000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,b_30 ++S 2100,700,2900,700,600,*,LEFT,PTIE ++S 2400,5000,2400,5500,200,*,DOWN,POLY ++S 2600,2800,2600,5100,200,*,UP,POLY ++S 1000,7000,1000,7100,400,*,UP,ALU1 ++S 1000,5900,1000,6500,600,*,DOWN,PDIF ++S 3300,1900,3300,2600,600,*,UP,NDIF ++S 3200,700,3200,2100,400,*,DOWN,ALU1 ++S 2000,1900,2000,2600,1000,*,UP,NDIF ++S 2600,1300,2600,1700,200,*,UP,POLY ++S 1400,1300,1400,1700,200,*,UP,POLY ++S 1600,9400,1600,9700,200,*,DOWN,POLY ++S 2000,5700,2000,9200,600,n1,UP,PDIF ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 1200,5700,1200,9200,400,*,UP,PDIF ++S 4400,2400,4400,6700,400,*,UP,ALU1 ++S 3800,2800,3800,5500,200,*,UP,POLY ++S 1600,3900,1600,5500,200,*,DOWN,POLY ++S 1800,4100,2000,4100,600,*,RIGHT,ALU1 ++S 2000,6000,2000,7000,400,a,DOWN,CALU1 ++S 3000,5000,3000,6000,400,a,UP,CALU1 ++S 2000,5900,2000,7100,400,*,UP,ALU1 ++S 3000,6900,3000,9300,400,*,UP,ALU1 ++S 700,900,700,2600,600,*,UP,NDIF ++S 800,900,800,2600,600,*,UP,NDIF ++S 1000,2000,2000,2000,600,*,RIGHT,ALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 2000,3000,2000,5100,400,*,UP,ALU1 ++S 2000,3000,2000,5000,400,b,DOWN,CALU1 ++S 3000,3000,3000,3000,400,b,LEFT,CALU1 ++S 2000,2900,3100,2900,400,*,RIGHT,ALU1 ++S 2000,3000,3100,3000,400,*,RIGHT,ALU1 ++S 2800,3900,4400,3900,400,*,RIGHT,ALU1 ++S 4400,5900,4400,6500,600,*,UP,PDIF ++S 4200,1900,4200,2600,400,*,UP,NDIF ++S 4200,5700,4200,7500,400,*,DOWN,PDIF ++S 3800,7700,3800,8100,200,*,DOWN,POLY ++S 3000,4900,3000,6100,400,*,UP,ALU1 ++S 2000,6000,3000,6000,600,*,LEFT,ALU1 ++S 3000,4900,3600,4900,400,*,LEFT,ALU1 ++S 0,5000,5000,5000,10000,nr2a_x1,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 3800,5500,3800,7700,200,1a,UP,PTRANS ++S 3800,1700,3800,2800,200,2a,DOWN,NTRANS ++S 2400,5500,2400,9400,200,1z,UP,PTRANS ++S 1600,5500,1600,9400,200,2z,UP,PTRANS ++S 2600,1700,2600,2800,200,3z,DOWN,NTRANS ++S 1400,1700,1400,2800,200,4z,DOWN,NTRANS ++S 3800,1300,3800,1700,200,*,UP,POLY ++S 3200,5700,3200,9200,600,*,DOWN,PDIF ++S 1400,2800,1400,4200,200,*,UP,POLY ++V 3000,700,CONT_BODY_P,* ++V 2000,700,CONT_BODY_P,* ++V 4300,9300,CONT_BODY_N,* ++V 1000,6600,CONT_DIF_P,* ++V 1000,5800,CONT_DIF_P,* ++V 3200,2000,CONT_DIF_N,* ++V 2000,2000,CONT_DIF_N,* ++V 3000,8000,CONT_DIF_P,* ++V 3000,9000,CONT_DIF_P,* ++V 4400,5800,CONT_DIF_P,* ++V 3500,4900,CONT_POLY,* ++V 3000,7000,CONT_DIF_P,* ++V 800,1000,CONT_DIF_N,* ++V 4400,6600,CONT_DIF_P,an ++V 4400,2500,CONT_DIF_N,an ++V 2900,3900,CONT_POLY,an ++V 1800,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr2a_x1.vbe b/alliance/src/cells/src/msxlib/nr2a_x1.vbe +new file mode 100644 +index 0000000..4a7dc13 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr2a_x1.vbe +@@ -0,0 +1,32 @@ ++ENTITY nr2a_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT rdown_b_z : NATURAL := 2080; ++ CONSTANT rdown_a_z : NATURAL := 2080; ++ CONSTANT rup_b_z : NATURAL := 2980; ++ CONSTANT rup_a_z : NATURAL := 2980; ++ CONSTANT tplh_b_z : NATURAL := 44; ++ CONSTANT tphl_b_z : NATURAL := 42; ++ CONSTANT tphh_a_z : NATURAL := 82; ++ CONSTANT tpll_a_z : NATURAL := 95; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr2a_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nr2a_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr2a_x1" ++ SEVERITY WARNING; ++ z <= (not (b) and a) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr3_x05.ap b/alliance/src/cells/src/msxlib/nr3_x05.ap +new file mode 100644 +index 0000000..e081561 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr3_x05.ap +@@ -0,0 +1,96 @@ ++V ALLIANCE : 6 ++H nr3_x05,P, 8/ 8/2014,100 ++A 0,0,5000,10000 ++R 4000,6000,ref_ref,a_60 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 3000,4000,ref_ref,b_40 ++R 4000,5000,ref_ref,a_50 ++R 1000,3000,ref_ref,z_30 ++R 3000,5000,ref_ref,b_50 ++R 2000,4000,ref_ref,c_40 ++R 2000,3000,ref_ref,c_30 ++R 3000,3000,ref_ref,c_30 ++R 4000,3000,ref_ref,c_30 ++R 1000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 3000,2000,ref_ref,z_20 ++R 1000,7000,ref_ref,z_70 ++R 3000,6000,ref_ref,a_60 ++R 4000,4000,ref_ref,b_40 ++S 3600,700,4200,700,600,*,LEFT,PTIE ++S 2800,2800,2800,4400,200,*,UP,POLY ++S 2600,2400,2600,2900,200,*,UP,POLY ++S 1400,2400,1400,3900,200,*,UP,POLY ++S 1600,3500,1600,5500,200,*,DOWN,POLY ++S 2400,4500,2800,4500,200,*,LEFT,POLY ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 4000,3000,4000,3000,400,c,LEFT,CALU1 ++S 3000,3000,3000,3000,400,c,LEFT,CALU1 ++S 1000,5700,1000,6700,600,*,UP,PDIF ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,nr3_x05,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 1200,5700,1200,9200,400,*,UP,PDIF ++S 1600,5500,1600,9400,200,1,UP,PTRANS ++S 1600,9400,1600,9700,200,*,DOWN,POLY ++S 2400,5500,2400,9400,200,2,UP,PTRANS ++S 2000,5700,2000,9200,600,n2,DOWN,PDIF ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 3200,5500,3200,9400,200,3,UP,PTRANS ++S 2800,5700,2800,9200,600,n1,DOWN,PDIF ++S 3200,9400,3200,9700,200,*,DOWN,POLY ++S 3800,5700,3800,9200,800,*,DOWN,PDIF ++S 3200,5100,3800,5100,200,*,RIGHT,POLY ++S 2400,4500,2400,5500,200,*,UP,POLY ++S 1400,1600,1400,2400,200,4,DOWN,NTRANS ++S 2600,1600,2600,2400,200,5,DOWN,NTRANS ++S 3800,1600,3800,2400,200,6,DOWN,NTRANS ++S 2000,900,2000,2200,600,*,UP,NDIF ++S 900,1800,900,2200,800,*,DOWN,NDIF ++S 3200,1800,3200,2200,1000,*,UP,NDIF ++S 700,2000,3300,2000,400,*,RIGHT,ALU1 ++S 4400,700,4400,2100,400,*,DOWN,ALU1 ++S 4400,1800,4400,2200,600,*,UP,NDIF ++S 3800,2400,3800,4600,200,*,UP,POLY ++S 2000,3000,4100,3000,400,*,LEFT,ALU1 ++S 2000,2900,4100,2900,400,*,LEFT,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,2000,1000,7100,400,*,DOWN,ALU1 ++S 1400,1200,1400,1600,200,*,DOWN,POLY ++S 2600,1200,2600,1600,200,*,DOWN,POLY ++S 3800,1200,3800,1600,200,*,DOWN,POLY ++S 2600,2800,2800,2800,200,*,RIGHT,POLY ++S 2600,2900,2800,2900,200,*,RIGHT,POLY ++S 2000,3000,2000,4000,400,c,UP,CALU1 ++S 3000,3900,3000,5100,400,*,DOWN,ALU1 ++S 3000,4000,3000,5000,400,b,UP,CALU1 ++S 2900,6000,4000,6000,400,*,RIGHT,ALU1 ++S 2900,6100,4000,6100,400,*,RIGHT,ALU1 ++S 3000,6000,3000,6000,400,a,LEFT,CALU1 ++S 4000,4800,4000,6100,400,*,UP,ALU1 ++S 4000,5000,4000,6000,400,a,UP,CALU1 ++S 4000,4000,4000,4000,400,b,LEFT,CALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 2000,2900,2000,4100,400,*,DOWN,ALU1 ++S 3800,6900,3800,9300,400,*,UP,ALU1 ++V 4200,700,CONT_BODY_P,* ++V 3500,700,CONT_BODY_P,* ++V 2000,3700,CONT_POLY,* ++V 3000,4300,CONT_POLY,* ++V 1000,6600,CONT_DIF_P,* ++V 4400,2000,CONT_DIF_N,* ++V 4000,4900,CONT_POLY,* ++V 3200,2000,CONT_DIF_N,* ++V 800,2000,CONT_DIF_N,* ++V 2000,1000,CONT_DIF_N,* ++V 1000,5800,CONT_DIF_P,* ++V 3800,8000,CONT_DIF_P,* ++V 3800,9000,CONT_DIF_P,* ++V 3800,7000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr3_x05.vbe b/alliance/src/cells/src/msxlib/nr3_x05.vbe +new file mode 100644 +index 0000000..7d04efe +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr3_x05.vbe +@@ -0,0 +1,38 @@ ++ENTITY nr3_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_c : NATURAL := 5; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT rdown_b_z : NATURAL := 2890; ++ CONSTANT rdown_c_z : NATURAL := 2880; ++ CONSTANT rdown_a_z : NATURAL := 2940; ++ CONSTANT rup_b_z : NATURAL := 4480; ++ CONSTANT rup_c_z : NATURAL := 4480; ++ CONSTANT rup_a_z : NATURAL := 4480; ++ CONSTANT tplh_a_z : NATURAL := 80; ++ CONSTANT tphl_c_z : NATURAL := 49; ++ CONSTANT tplh_c_z : NATURAL := 50; ++ CONSTANT tplh_b_z : NATURAL := 71; ++ CONSTANT tphl_b_z : NATURAL := 62; ++ CONSTANT tphl_a_z : NATURAL := 70; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ b : in BIT; ++ c : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr3_x05; ++ ++ARCHITECTURE behaviour_data_flow OF nr3_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr3_x05" ++ SEVERITY WARNING; ++ z <= not (((b or c) or a)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr3_x1.ap b/alliance/src/cells/src/msxlib/nr3_x1.ap +new file mode 100644 +index 0000000..5804880 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr3_x1.ap +@@ -0,0 +1,127 @@ ++V ALLIANCE : 6 ++H nr3_x1,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 3000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 1000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 3000,7000,ref_ref,z_70 ++R 2000,4000,ref_ref,a_40 ++R 2000,3000,ref_ref,a_30 ++R 6000,5000,ref_ref,a_50 ++R 2000,5000,ref_ref,a_50 ++R 2000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 3000,4000,ref_ref,b_40 ++R 3000,6000,ref_ref,a_60 ++R 4000,6000,ref_ref,a_60 ++R 5000,6000,ref_ref,a_60 ++R 6000,6000,ref_ref,a_60 ++R 5000,5000,ref_ref,b_50 ++R 4000,5000,ref_ref,b_50 ++R 3000,5000,ref_ref,b_50 ++R 3000,3000,ref_ref,b_30 ++R 1000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,a_60 ++R 6000,3000,ref_ref,c_30 ++R 6000,2000,ref_ref,c_20 ++R 6000,4000,ref_ref,c_40 ++R 5000,3000,ref_ref,c_30 ++R 4000,3000,ref_ref,c_30 ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 3000,6000,3000,6000,400,a,LEFT,CALU1 ++S 4000,6000,4000,6000,400,a,LEFT,CALU1 ++S 5000,6000,5000,6000,400,a,LEFT,CALU1 ++S 5000,5000,5000,5000,400,b,LEFT,CALU1 ++S 4000,5000,4000,5000,400,b,LEFT,CALU1 ++S 800,5700,800,9200,800,*,DOWN,PDIF ++S 2000,2900,2000,3100,400,*,DOWN,ALU1 ++S 4000,4900,4000,5000,600,*,UP,ALU1 ++S 5400,5700,5400,9200,600,n3,DOWN,PDIF ++S 4600,5700,4600,9200,600,n4,DOWN,PDIF ++S 1800,5700,1800,9200,600,n1,DOWN,PDIF ++S 2600,5700,2600,9200,600,n2,DOWN,PDIF ++S 5800,5500,5800,9400,200,6,UP,PTRANS ++S 5000,5500,5000,9400,200,5,UP,PTRANS ++S 4200,5500,4200,9400,200,4,UP,PTRANS ++S 6300,5700,6300,9200,800,*,DOWN,PDIF ++S 5800,9400,5800,9700,200,*,DOWN,POLY ++S 5000,9400,5000,9700,200,*,DOWN,POLY ++S 4200,9400,4200,9700,200,*,DOWN,POLY ++S 1400,9400,1400,9700,200,*,DOWN,POLY ++S 2200,4500,2600,4500,200,*,LEFT,POLY ++S 3500,5700,3500,9200,800,*,DOWN,PDIF ++S 3000,5500,3000,9400,200,3,UP,PTRANS ++S 1400,5500,1400,9400,200,1,UP,PTRANS ++S 2200,5500,2200,9400,200,2,UP,PTRANS ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,nr3_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 3000,9400,3000,9700,200,*,DOWN,POLY ++S 2200,9400,2200,9700,200,*,DOWN,POLY ++S 3000,3000,3000,5000,400,b,UP,CALU1 ++S 3000,2900,3000,5100,400,*,UP,ALU1 ++S 3000,5100,4200,5100,200,*,RIGHT,POLY ++S 3000,5000,5100,5000,600,*,RIGHT,ALU1 ++S 1400,3800,1400,5500,200,*,UP,POLY ++S 2200,4500,2200,5500,200,*,UP,POLY ++S 2000,3000,2000,6000,400,a,UP,CALU1 ++S 2000,4100,2000,6000,400,*,UP,ALU1 ++S 2000,6000,6000,6000,400,*,LEFT,ALU1 ++S 6000,5000,6000,6000,400,a,UP,CALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 3600,7000,3600,8100,400,*,UP,ALU1 ++S 800,7900,800,9300,400,*,UP,ALU1 ++S 6400,7900,6400,9300,400,*,UP,ALU1 ++S 1900,2900,1900,6000,400,*,UP,ALU1 ++S 1400,3800,1800,3800,200,*,RIGHT,POLY ++S 1000,2000,3700,2000,400,*,RIGHT,ALU1 ++S 1000,1900,3700,1900,400,*,RIGHT,ALU1 ++S 6000,4900,6000,6000,600,*,UP,ALU1 ++S 1400,900,1400,2000,400,*,DOWN,NDIF ++S 1800,700,1800,2200,200,7,DOWN,NTRANS ++S 1800,300,1800,700,200,*,UP,POLY ++S 1800,2200,1800,3600,200,*,UP,POLY ++S 3600,900,3600,2000,1000,*,UP,NDIF ++S 4200,700,4200,2200,200,9,DOWN,NTRANS ++S 3000,700,3000,2200,200,8,DOWN,NTRANS ++S 2400,900,2400,2000,600,*,UP,NDIF ++S 4900,900,4900,2000,600,*,UP,NDIF ++S 4200,2200,4200,5100,200,*,UP,POLY ++S 3000,2200,3000,4500,200,*,UP,POLY ++S 1000,7100,3600,7100,400,*,RIGHT,ALU1 ++S 1000,7000,3600,7000,400,*,RIGHT,ALU1 ++S 6000,2000,6000,4000,400,c,UP,CALU1 ++S 4000,3000,4000,3000,400,c,LEFT,CALU1 ++S 5000,3000,5000,3000,400,c,LEFT,CALU1 ++S 4000,3000,6000,3000,600,*,RIGHT,ALU1 ++S 4200,300,4200,700,200,*,UP,POLY ++S 3000,300,3000,700,200,*,UP,POLY ++S 4800,700,4800,1900,400,*,UP,ALU1 ++S 6000,1900,6000,4100,400,*,UP,ALU1 ++V 6200,700,CONT_BODY_P,* ++V 3600,7100,CONT_DIF_P,* ++V 6000,4900,CONT_POLY,* ++V 3600,8000,CONT_DIF_P,* ++V 3000,4300,CONT_POLY,* ++V 5000,4900,CONT_POLY,* ++V 2000,3600,CONT_POLY,* ++V 800,8000,CONT_DIF_P,* ++V 6400,8000,CONT_DIF_P,* ++V 800,9000,CONT_DIF_P,* ++V 6400,9000,CONT_DIF_P,* ++V 4800,1000,CONT_DIF_N,* ++V 2400,1000,CONT_DIF_N,* ++V 1200,1900,CONT_DIF_N,* ++V 3600,1900,CONT_DIF_N,* ++V 4000,3000,CONT_POLY,* ++V 4800,1800,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr3_x1.vbe b/alliance/src/cells/src/msxlib/nr3_x1.vbe +new file mode 100644 +index 0000000..d4c2e89 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr3_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY nr3_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_b : NATURAL := 10; ++ CONSTANT cin_c : NATURAL := 9; ++ CONSTANT cin_a : NATURAL := 11; ++ CONSTANT rdown_b_z : NATURAL := 1540; ++ CONSTANT rdown_c_z : NATURAL := 1540; ++ CONSTANT rdown_a_z : NATURAL := 1570; ++ CONSTANT rup_b_z : NATURAL := 2240; ++ CONSTANT rup_c_z : NATURAL := 2230; ++ CONSTANT rup_a_z : NATURAL := 2240; ++ CONSTANT tplh_a_z : NATURAL := 78; ++ CONSTANT tphl_c_z : NATURAL := 47; ++ CONSTANT tplh_c_z : NATURAL := 45; ++ CONSTANT tplh_b_z : NATURAL := 67; ++ CONSTANT tphl_b_z : NATURAL := 62; ++ CONSTANT tphl_a_z : NATURAL := 71; ++ CONSTANT transistors : NATURAL := 9 ++); ++PORT ( ++ b : in BIT; ++ c : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr3_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nr3_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr3_x1" ++ SEVERITY WARNING; ++ z <= not (((b or c) or a)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr4_x05.ap b/alliance/src/cells/src/msxlib/nr4_x05.ap +new file mode 100644 +index 0000000..af0a64d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr4_x05.ap +@@ -0,0 +1,118 @@ ++V ALLIANCE : 6 ++H nr4_x05,P, 9/ 8/2014,100 ++A 0,0,6000,10000 ++R 3000,5000,ref_ref,d_50 ++R 1000,6000,ref_ref,z_60 ++R 3000,6000,ref_ref,d_60 ++R 5000,7000,ref_ref,a_70 ++R 5000,6000,ref_ref,a_60 ++R 5000,4000,ref_ref,b_40 ++R 2000,4000,ref_ref,d_40 ++R 4000,5000,ref_ref,c_50 ++R 3000,3000,ref_ref,c_30 ++R 2000,7000,ref_ref,z_70 ++R 4000,2000,ref_ref,z_20 ++R 3000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 4000,3000,ref_ref,b_30 ++R 5000,5000,ref_ref,a_50 ++R 1000,3000,ref_ref,z_30 ++R 1000,4000,ref_ref,z_40 ++R 4000,4000,ref_ref,c_40 ++R 2000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 5000,3000,ref_ref,b_30 ++R 3000,4000,ref_ref,c_40 ++R 2000,5000,ref_ref,d_50 ++R 1000,2000,ref_ref,z_20 ++R 4000,7000,ref_ref,a_70 ++S 4300,700,5100,700,600,*,RIGHT,PTIE ++S 4800,4900,5000,4900,600,*,RIGHT,POLY ++S 2200,5100,2400,5100,200,*,LEFT,POLY ++S 1000,6000,2000,6000,600,*,LEFT,ALU1 ++S 3900,3000,5000,3000,400,*,RIGHT,ALU1 ++S 5000,5000,5000,7000,400,a,UP,CALU1 ++S 4800,9400,4800,9700,200,*,DOWN,POLY ++S 4000,9400,4000,9700,200,*,DOWN,POLY ++S 3200,9400,3200,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 1800,1900,1800,2100,1000,*,UP,NDIF ++S 3000,900,3000,2100,600,*,UP,NDIF ++S 4200,1900,4200,2100,1000,*,UP,NDIF ++S 600,900,600,2100,600,*,UP,NDIF ++S 0,5000,6000,5000,10000,nr4_x05,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 2400,3800,2800,3800,200,*,LEFT,POLY ++S 1200,1300,1200,1900,200,*,UP,POLY ++S 2400,1300,2400,1900,200,*,UP,POLY ++S 3600,1300,3600,1900,200,*,UP,POLY ++S 4800,1300,4800,1900,200,*,UP,POLY ++S 1200,1700,1200,2300,200,5,DOWN,NTRANS ++S 2400,1700,2400,2300,200,6,DOWN,NTRANS ++S 3600,1700,3600,2300,200,7,DOWN,NTRANS ++S 4800,1700,4800,2300,200,8,DOWN,NTRANS ++S 1200,4700,2000,4700,200,*,LEFT,POLY ++S 2400,5500,2400,9400,200,1,UP,PTRANS ++S 2800,5700,2800,9200,600,n3,UP,PDIF ++S 3200,5500,3200,9400,200,2,UP,PTRANS ++S 3600,5700,3600,9200,600,n2,UP,PDIF ++S 4000,5500,4000,9400,200,3,UP,PTRANS ++S 4800,5500,4800,9400,200,4,UP,PTRANS ++S 4400,5700,4400,9200,600,n1,UP,PDIF ++S 5400,5700,5400,9200,600,*,DOWN,PDIF ++S 5400,7900,5400,9300,400,*,DOWN,ALU1 ++S 1800,5900,1800,7100,600,*,UP,PDIF ++S 2000,5700,2000,9200,400,*,DOWN,PDIF ++S 5000,4900,5000,7000,600,*,DOWN,ALU1 ++S 5000,3000,5000,4100,400,*,UP,ALU1 ++S 5000,3000,5000,4000,400,b,UP,CALU1 ++S 3900,2900,5000,2900,400,*,RIGHT,ALU1 ++S 3000,3000,3000,4000,400,c,DOWN,CALU1 ++S 3000,2900,3000,4000,400,*,DOWN,ALU1 ++S 3000,4000,4000,4000,600,*,RIGHT,ALU1 ++S 4000,4000,4000,5000,400,c,UP,CALU1 ++S 4000,4000,4000,5100,400,*,UP,ALU1 ++S 2000,5000,3000,5000,600,*,RIGHT,ALU1 ++S 2000,3900,2000,4600,400,*,DOWN,ALU1 ++S 3000,5000,3000,6100,400,*,UP,ALU1 ++S 3000,5000,3000,6000,400,d,UP,CALU1 ++S 3200,4000,3200,5500,200,*,DOWN,POLY ++S 4000,3200,4000,5500,200,*,DOWN,POLY ++S 3600,2300,3600,3200,200,*,UP,POLY ++S 4800,2300,4800,5500,200,*,DOWN,POLY ++S 2400,2300,2400,3800,200,*,DOWN,POLY ++S 1200,2300,1200,4700,200,*,DOWN,POLY ++S 1000,2000,1000,6000,400,z,DOWN,CALU1 ++S 1000,2000,1000,6000,400,*,DOWN,ALU1 ++S 1000,2000,4300,2000,400,*,RIGHT,ALU1 ++S 5400,700,5400,2100,400,*,DOWN,ALU1 ++S 1000,1900,4300,1900,400,*,RIGHT,ALU1 ++S 3900,7000,5000,7000,400,*,RIGHT,ALU1 ++S 1900,5900,1900,7100,600,*,DOWN,ALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 4000,2000,4000,2000,400,z,LEFT,CALU1 ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 2000,4000,2000,5000,400,d,DOWN,CALU1 ++S 4000,3000,4000,3000,400,b,LEFT,CALU1 ++S 4000,7000,4000,7000,400,a,LEFT,CALU1 ++V 700,9300,CONT_BODY_N,* ++V 5200,700,CONT_BODY_P,* ++V 4200,700,CONT_BODY_P,* ++V 4000,3000,CONT_POLY,* ++V 600,1000,CONT_DIF_N,* ++V 3000,1000,CONT_DIF_N,* ++V 1800,2000,CONT_DIF_N,* ++V 4200,2000,CONT_DIF_N,* ++V 1800,7000,CONT_DIF_P,* ++V 1800,6000,CONT_DIF_P,* ++V 3200,4000,CONT_POLY,* ++V 5400,8000,CONT_DIF_P,* ++V 5400,9000,CONT_DIF_P,* ++V 5000,4900,CONT_POLY,* ++V 2200,4900,CONT_POLY,* ++V 5400,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr4_x05.vbe b/alliance/src/cells/src/msxlib/nr4_x05.vbe +new file mode 100644 +index 0000000..d7f5ce1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr4_x05.vbe +@@ -0,0 +1,44 @@ ++ENTITY nr4_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_c : NATURAL := 5; ++ CONSTANT cin_d : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT rdown_c_z : NATURAL := 3840; ++ CONSTANT rdown_d_z : NATURAL := 3840; ++ CONSTANT rdown_b_z : NATURAL := 3910; ++ CONSTANT rdown_a_z : NATURAL := 4010; ++ CONSTANT rup_c_z : NATURAL := 5980; ++ CONSTANT rup_d_z : NATURAL := 5980; ++ CONSTANT rup_b_z : NATURAL := 5980; ++ CONSTANT rup_a_z : NATURAL := 5980; ++ CONSTANT tphl_d_z : NATURAL := 58; ++ CONSTANT tplh_a_z : NATURAL := 117; ++ CONSTANT tplh_d_z : NATURAL := 52; ++ CONSTANT tphl_c_z : NATURAL := 77; ++ CONSTANT tplh_b_z : NATURAL := 107; ++ CONSTANT tplh_c_z : NATURAL := 86; ++ CONSTANT tphl_b_z : NATURAL := 90; ++ CONSTANT tphl_a_z : NATURAL := 97; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ c : in BIT; ++ d : in BIT; ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr4_x05; ++ ++ARCHITECTURE behaviour_data_flow OF nr4_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr4_x05" ++ SEVERITY WARNING; ++ z <= not ((((c or d) or b) or a)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/nr4_x1.ap b/alliance/src/cells/src/msxlib/nr4_x1.ap +new file mode 100644 +index 0000000..583cb7d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr4_x1.ap +@@ -0,0 +1,170 @@ ++V ALLIANCE : 6 ++H nr4_x1,P, 9/ 8/2014,100 ++A 0,0,9000,10000 ++R 7000,5000,ref_ref,d_50 ++R 7000,7000,ref_ref,d_70 ++R 7000,6000,ref_ref,d_60 ++R 2000,2000,ref_ref,z_20 ++R 7000,4000,ref_ref,b_40 ++R 7000,3000,ref_ref,b_30 ++R 5000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,a_60 ++R 3000,5000,ref_ref,a_50 ++R 5000,7000,ref_ref,z_70 ++R 4000,7000,ref_ref,z_70 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,z_60 ++R 7000,8000,ref_ref,d_80 ++R 6000,8000,ref_ref,d_80 ++R 5000,8000,ref_ref,d_80 ++R 4000,8000,ref_ref,d_80 ++R 3000,8000,ref_ref,d_80 ++R 2000,8000,ref_ref,d_80 ++R 1000,8000,ref_ref,d_80 ++R 1000,7000,ref_ref,d_70 ++R 4000,3000,ref_ref,b_30 ++R 3000,3000,ref_ref,b_30 ++R 4000,5000,ref_ref,a_50 ++R 6000,4000,ref_ref,c_40 ++R 6000,3000,ref_ref,b_30 ++R 1000,5000,ref_ref,d_50 ++R 4000,2000,ref_ref,z_20 ++R 3000,2000,ref_ref,z_20 ++R 4000,4000,ref_ref,c_40 ++R 5000,3000,ref_ref,b_30 ++R 5000,4000,ref_ref,c_40 ++R 2000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,d_60 ++R 8000,5000,ref_ref,d_50 ++R 3000,4000,ref_ref,a_40 ++R 6000,5000,ref_ref,c_50 ++R 6000,6000,ref_ref,c_60 ++R 7000,2000,ref_ref,b_20 ++R 5000,6000,ref_ref,z_60 ++S 7100,700,7900,700,600,*,RIGHT,PTIE ++S 7100,4900,7100,8000,400,*,UP,ALU1 ++S 7000,4900,7000,8000,400,*,UP,ALU1 ++S 900,4800,900,8000,400,*,DOWN,ALU1 ++S 8400,6900,8400,9300,400,*,DOWN,ALU1 ++S 7000,4900,8100,4900,400,*,RIGHT,ALU1 ++S 7000,5000,8100,5000,400,*,RIGHT,ALU1 ++S 1000,8000,7000,8000,400,*,LEFT,ALU1 ++S 5000,900,5000,1300,200,*,UP,POLY ++S 3800,900,3800,1300,200,*,UP,POLY ++S 2000,1900,4500,1900,400,*,RIGHT,ALU1 ++S 2000,2000,4500,2000,400,*,RIGHT,ALU1 ++S 2000,2000,2000,7000,400,*,DOWN,ALU1 ++S 2000,2000,2000,7000,400,z,DOWN,CALU1 ++S 7000,1900,7000,4100,400,*,DOWN,ALU1 ++S 7000,2000,7000,4000,400,b,DOWN,CALU1 ++S 5000,2400,5000,5100,200,*,UP,POLY ++S 4200,5100,5400,5100,200,*,RIGHT,POLY ++S 3900,4000,6000,4000,400,*,LEFT,ALU1 ++S 3900,3900,6000,3900,400,*,LEFT,ALU1 ++S 5000,1300,5000,2400,200,12,DOWN,NTRANS ++S 4400,1500,4400,2200,1000,*,UP,NDIF ++S 3800,2400,3800,3900,200,*,UP,POLY ++S 3800,1300,3800,2400,200,11,DOWN,NTRANS ++S 3200,900,3200,2200,600,*,UP,NDIF ++S 2600,900,2600,1300,200,*,UP,POLY ++S 1400,900,1400,1300,200,*,UP,POLY ++S 2600,2400,2600,5500,200,*,DOWN,POLY ++S 2600,1300,2600,2400,200,10,DOWN,NTRANS ++S 2000,1500,2000,2200,1000,*,UP,NDIF ++S 1400,1300,1400,2400,200,9,DOWN,NTRANS ++S 7000,3200,7000,5500,200,*,DOWN,POLY ++S 6200,4200,6200,5500,200,*,DOWN,POLY ++S 6000,4000,6000,6000,400,c,UP,CALU1 ++S 6000,4000,6000,6100,400,*,UP,ALU1 ++S 3000,3900,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,a,DOWN,CALU1 ++S 3400,4100,3400,5500,200,*,DOWN,POLY ++S 3400,4100,4200,4100,200,*,RIGHT,POLY ++S 1000,4800,1000,8000,400,*,DOWN,ALU1 ++S 1000,5000,1000,8000,400,d,UP,CALU1 ++S 1200,5700,1200,9200,600,*,UP,PDIF ++S 8400,5700,8400,9200,600,*,DOWN,PDIF ++S 7800,5500,7800,9400,200,08,UP,PTRANS ++S 7400,5700,7400,9200,600,n4,UP,PDIF ++S 7000,5500,7000,9400,200,07,UP,PTRANS ++S 6600,5700,6600,9200,600,n5,UP,PDIF ++S 6200,5500,6200,9400,200,06,UP,PTRANS ++S 5800,5700,5800,9200,600,n6,UP,PDIF ++S 4800,5700,4800,9200,600,*,DOWN,PDIF ++S 5400,5500,5400,9400,200,05,UP,PTRANS ++S 4200,5500,4200,9400,200,04,UP,PTRANS ++S 3800,5700,3800,9200,600,n3,UP,PDIF ++S 3400,5500,3400,9400,200,03,UP,PTRANS ++S 3000,5700,3000,9200,600,n2,UP,PDIF ++S 2600,5500,2600,9400,200,02,UP,PTRANS ++S 2200,5700,2200,9200,600,n1,UP,PDIF ++S 1800,5500,1800,9400,200,01,UP,PTRANS ++S 0,5000,9000,5000,10000,nr4_x1,LEFT,TALU8 ++S 0,2200,9000,2200,5200,*,LEFT,PWELL ++S 0,7600,9000,7600,5600,*,LEFT,NWELL ++S 0,9400,9000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,9000,600,1200,vss,RIGHT,CALU1 ++S 4200,9400,4200,9700,200,*,DOWN,POLY ++S 3400,9400,3400,9700,200,*,DOWN,POLY ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 1800,9400,1800,9700,200,*,DOWN,POLY ++S 5400,9400,5400,9700,200,*,DOWN,POLY ++S 6200,9400,6200,9700,200,*,DOWN,POLY ++S 7000,9400,7000,9700,200,*,DOWN,POLY ++S 7800,9400,7800,9700,200,*,DOWN,POLY ++S 2900,3000,7000,3000,400,*,RIGHT,ALU1 ++S 800,700,800,2100,400,*,DOWN,ALU1 ++S 700,1500,700,2200,600,*,UP,NDIF ++S 5600,700,5600,2100,400,*,DOWN,ALU1 ++S 5700,1500,5700,2200,600,*,UP,NDIF ++S 2000,7000,5000,7000,400,*,LEFT,ALU1 ++S 2000,7100,5000,7100,400,*,LEFT,ALU1 ++S 4900,5900,4900,7000,600,*,UP,ALU1 ++S 2000,8000,2000,8000,400,d,LEFT,CALU1 ++S 3000,8000,3000,8000,400,d,LEFT,CALU1 ++S 4000,8000,4000,8000,400,d,LEFT,CALU1 ++S 5000,8000,5000,8000,400,d,LEFT,CALU1 ++S 6000,8000,6000,8000,400,d,LEFT,CALU1 ++S 8000,5000,8000,5000,400,d,LEFT,CALU1 ++S 7000,5000,7000,8000,400,d,DOWN,CALU1 ++S 1400,2400,1400,5100,200,*,DOWN,POLY ++S 1400,5100,1800,5100,200,*,LEFT,POLY ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 4000,7000,4000,7000,400,z,LEFT,CALU1 ++S 4000,2000,4000,2000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 5000,6000,5000,7000,400,z,DOWN,CALU1 ++S 6000,3000,6000,3000,400,b,LEFT,CALU1 ++S 5000,3000,5000,3000,400,b,LEFT,CALU1 ++S 4000,3000,4000,3000,400,b,LEFT,CALU1 ++S 3000,3000,3000,3000,400,b,LEFT,CALU1 ++S 4000,4000,4000,4000,400,c,LEFT,CALU1 ++S 5000,4000,5000,4000,400,c,LEFT,CALU1 ++S 4000,5000,4000,5000,400,a,LEFT,CALU1 ++S 5000,5000,5000,5000,400,a,LEFT,CALU1 ++S 3000,4900,5100,4900,400,*,RIGHT,ALU1 ++S 3000,5000,5100,5000,400,*,RIGHT,ALU1 ++V 8000,700,CONT_BODY_P,* ++V 7000,700,CONT_BODY_P,* ++V 8400,7000,CONT_DIF_P,* ++V 8400,8000,CONT_DIF_P,* ++V 4800,6000,CONT_DIF_P,* ++V 4800,4900,CONT_POLY,* ++V 6000,4000,CONT_POLY,* ++V 4400,2000,CONT_DIF_N,* ++V 4000,3900,CONT_POLY,* ++V 3200,1000,CONT_DIF_N,* ++V 3000,3000,CONT_POLY,* ++V 2000,2000,CONT_DIF_N,* ++V 4800,7000,CONT_DIF_P,* ++V 8400,9000,CONT_DIF_P,* ++V 1200,9000,CONT_DIF_P,* ++V 1000,4900,CONT_POLY,* ++V 8000,4900,CONT_POLY,* ++V 6800,3000,CONT_POLY,* ++V 800,2000,CONT_DIF_N,* ++V 5600,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/nr4_x1.vbe b/alliance/src/cells/src/msxlib/nr4_x1.vbe +new file mode 100644 +index 0000000..126605b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/nr4_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY nr4_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 9000; ++ CONSTANT cin_c : NATURAL := 9; ++ CONSTANT cin_d : NATURAL := 11; ++ CONSTANT cin_b : NATURAL := 10; ++ CONSTANT cin_a : NATURAL := 9; ++ CONSTANT rdown_c_z : NATURAL := 2100; ++ CONSTANT rdown_d_z : NATURAL := 2180; ++ CONSTANT rdown_b_z : NATURAL := 2130; ++ CONSTANT rdown_a_z : NATURAL := 2100; ++ CONSTANT rup_c_z : NATURAL := 2990; ++ CONSTANT rup_d_z : NATURAL := 3000; ++ CONSTANT rup_b_z : NATURAL := 2990; ++ CONSTANT rup_a_z : NATURAL := 2990; ++ CONSTANT tphl_d_z : NATURAL := 102; ++ CONSTANT tplh_a_z : NATURAL := 46; ++ CONSTANT tplh_d_z : NATURAL := 112; ++ CONSTANT tphl_c_z : NATURAL := 78; ++ CONSTANT tplh_b_z : NATURAL := 102; ++ CONSTANT tplh_c_z : NATURAL := 80; ++ CONSTANT tphl_b_z : NATURAL := 92; ++ CONSTANT tphl_a_z : NATURAL := 57; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ c : in BIT; ++ d : in BIT; ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END nr4_x1; ++ ++ARCHITECTURE behaviour_data_flow OF nr4_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on nr4_x1" ++ SEVERITY WARNING; ++ z <= not ((((c or d) or b) or a)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oai21_x05.ap b/alliance/src/cells/src/msxlib/oai21_x05.ap +new file mode 100644 +index 0000000..62ae640 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai21_x05.ap +@@ -0,0 +1,96 @@ ++V ALLIANCE : 6 ++H oai21_x05,P, 9/ 8/2014,100 ++A 0,0,5000,10000 ++R 1000,2000,ref_ref,z_20 ++R 3000,7000,ref_ref,a1_70 ++R 3000,4000,ref_ref,a2_40 ++R 2000,3000,ref_ref,b_30 ++R 3000,3000,ref_ref,b_30 ++R 2000,4000,ref_ref,b_40 ++R 4000,5000,ref_ref,a1_50 ++R 3000,5000,ref_ref,a2_50 ++R 1000,3000,ref_ref,z_30 ++R 2000,5000,ref_ref,b_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 4000,4000,ref_ref,a2_40 ++R 3000,6000,ref_ref,a2_60 ++R 4000,6000,ref_ref,a1_60 ++R 4000,7000,ref_ref,a1_70 ++R 2000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 4000,7900,4000,9300,400,*,UP,ALU1 ++S 800,6900,800,9300,400,*,UP,ALU1 ++S 3800,1300,3800,1700,200,*,DOWN,POLY ++S 2600,1300,2600,1700,200,*,DOWN,POLY ++S 1400,1300,1400,1700,200,*,DOWN,POLY ++S 3800,2700,3800,4800,200,*,UP,POLY ++S 2900,7100,4000,7100,400,*,LEFT,ALU1 ++S 2900,7000,4000,7000,400,*,LEFT,ALU1 ++S 2000,3000,2000,5000,400,b,DOWN,CALU1 ++S 2000,2900,2000,5100,400,*,DOWN,ALU1 ++S 2000,2900,3100,2900,400,*,RIGHT,ALU1 ++S 2000,3000,3100,3000,400,*,RIGHT,ALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,oai21_x05,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 1900,2000,4500,2000,400,*,RIGHT,ALU1 ++S 700,2000,1000,2000,600,*,RIGHT,ALU1 ++S 1800,1900,1800,2500,400,*,DOWN,NDIF ++S 1400,1700,1400,2700,200,6,UP,NTRANS ++S 1000,1900,1000,2500,400,*,UP,NDIF ++S 2000,1900,2000,2500,1000,*,DOWN,NDIF ++S 2600,1700,2600,2700,200,5,UP,NTRANS ++S 4200,1900,4200,2500,400,*,UP,NDIF ++S 3800,1700,3800,2700,200,4,UP,NTRANS ++S 3200,900,3200,2500,600,*,UP,NDIF ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 4000,5000,4000,7000,400,a1,UP,CALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,3000,6000,400,a2,DOWN,CALU1 ++S 3000,4000,3000,6100,400,*,UP,ALU1 ++S 1000,2000,1000,6000,400,z,DOWN,CALU1 ++S 1000,2000,1000,6000,400,*,DOWN,ALU1 ++S 1400,7300,1400,7700,200,*,DOWN,POLY ++S 1400,6100,1400,7300,200,3,DOWN,PTRANS ++S 2000,6300,2000,7100,600,*,UP,PDIF ++S 800,6300,800,7100,600,*,DOWN,PDIF ++S 1000,6000,2000,6000,600,*,RIGHT,ALU1 ++S 2000,6000,2000,7100,400,*,UP,ALU1 ++S 3400,6100,3400,8400,200,1,DOWN,PTRANS ++S 3000,6300,3000,8200,400,n1,UP,PDIF ++S 2600,6100,2600,8400,200,2,DOWN,PTRANS ++S 2200,6300,2200,8200,400,*,DOWN,PDIF ++S 4000,6300,4000,8200,600,*,DOWN,PDIF ++S 3400,8400,3400,8800,200,*,DOWN,POLY ++S 2600,8400,2600,8800,200,*,DOWN,POLY ++S 1400,2700,1400,6100,200,*,UP,POLY ++S 2600,2700,2600,6100,200,*,UP,POLY ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 3400,5200,3800,5200,200,*,RIGHT,POLY ++S 3400,5200,3400,6100,200,*,DOWN,POLY ++S 4000,4900,4000,7000,400,*,UP,ALU1 ++S 1800,5000,2000,5000,600,*,RIGHT,ALU1 ++S 3000,3000,3000,3000,400,b,LEFT,CALU1 ++S 4000,4000,4000,4000,400,a2,LEFT,CALU1 ++S 3000,7000,3000,7000,400,a1,LEFT,CALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 4000,8000,CONT_DIF_P,* ++V 800,7000,CONT_DIF_P,* ++V 3200,1000,CONT_DIF_N,* ++V 4400,2000,CONT_DIF_N,n2 ++V 2000,2000,CONT_DIF_N,n2 ++V 800,2000,CONT_DIF_N,* ++V 2000,7000,CONT_DIF_P,* ++V 4000,5000,CONT_POLY,* ++V 3000,4000,CONT_POLY,* ++V 1800,5000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oai21_x05.vbe b/alliance/src/cells/src/msxlib/oai21_x05.vbe +new file mode 100644 +index 0000000..ec2c4e0 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai21_x05.vbe +@@ -0,0 +1,38 @@ ++ENTITY oai21_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a1 : NATURAL := 4; ++ CONSTANT cin_a2 : NATURAL := 4; ++ CONSTANT cin_b : NATURAL := 3; ++ CONSTANT rdown_a1_z : NATURAL := 3700; ++ CONSTANT rdown_a2_z : NATURAL := 3700; ++ CONSTANT rdown_b_z : NATURAL := 3420; ++ CONSTANT rup_a1_z : NATURAL := 5060; ++ CONSTANT rup_a2_z : NATURAL := 5060; ++ CONSTANT rup_b_z : NATURAL := 4960; ++ CONSTANT tphl_b_z : NATURAL := 42; ++ CONSTANT tphl_a2_z : NATURAL := 47; ++ CONSTANT tplh_a1_z : NATURAL := 72; ++ CONSTANT tplh_b_z : NATURAL := 50; ++ CONSTANT tplh_a2_z : NATURAL := 62; ++ CONSTANT tphl_a1_z : NATURAL := 57; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oai21_x05; ++ ++ARCHITECTURE behaviour_data_flow OF oai21_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oai21_x05" ++ SEVERITY WARNING; ++ z <= not (((a1 or a2) and b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oai21_x1.ap b/alliance/src/cells/src/msxlib/oai21_x1.ap +new file mode 100644 +index 0000000..4cd76d4 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai21_x1.ap +@@ -0,0 +1,100 @@ ++V ALLIANCE : 6 ++H oai21_x1,P, 9/ 8/2014,100 ++A 0,0,5000,10000 ++R 1000,2000,ref_ref,z_20 ++R 4000,4000,ref_ref,a2_40 ++R 3000,4000,ref_ref,a2_40 ++R 4000,6000,ref_ref,a1_60 ++R 4000,7000,ref_ref,a1_70 ++R 3000,7000,ref_ref,a1_70 ++R 2000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++R 2000,3000,ref_ref,b_30 ++R 3000,3000,ref_ref,b_30 ++R 2000,4000,ref_ref,b_40 ++R 3000,6000,ref_ref,a2_60 ++R 4000,5000,ref_ref,a1_50 ++R 3000,5000,ref_ref,a2_50 ++R 1000,3000,ref_ref,z_30 ++R 2000,5000,ref_ref,b_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 1800,4000,2000,4000,600,*,RIGHT,ALU1 ++S 3800,3300,3800,4800,200,*,UP,POLY ++S 2600,3300,2600,5500,200,*,UP,POLY ++S 1400,3300,1400,5500,200,*,UP,POLY ++S 1000,1800,1000,3100,400,*,UP,NDIF ++S 800,2300,800,2900,600,*,UP,NDIF ++S 3200,900,3200,3100,600,*,UP,NDIF ++S 3800,1600,3800,3300,200,4,UP,NTRANS ++S 4200,1800,4200,3100,400,*,UP,NDIF ++S 1400,1600,1400,3300,200,6,UP,NTRANS ++S 2600,1600,2600,3300,200,5,UP,NTRANS ++S 2000,1800,2000,3100,600,*,DOWN,NDIF ++S 1400,1200,1400,1600,200,*,UP,POLY ++S 2600,1200,2600,1600,200,*,UP,POLY ++S 3800,1200,3800,1600,200,*,UP,POLY ++S 4400,2300,4400,2900,600,*,UP,NDIF ++S 4400,2000,4400,3100,400,*,UP,ALU1 ++S 1900,2000,4400,2000,400,*,RIGHT,ALU1 ++S 3000,3000,3000,3000,400,b,LEFT,CALU1 ++S 4000,4000,4000,4000,400,a2,LEFT,CALU1 ++S 3000,7000,3000,7000,400,a1,LEFT,CALU1 ++S 1000,2000,1000,6000,400,*,DOWN,ALU1 ++S 1000,2000,1000,6000,400,z,DOWN,CALU1 ++S 3400,5100,3900,5100,200,*,RIGHT,POLY ++S 3400,5100,3400,5500,200,*,DOWN,POLY ++S 3000,4000,3000,6100,400,*,UP,ALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 3000,4000,3000,6000,400,a2,DOWN,CALU1 ++S 2900,7100,4000,7100,400,*,RIGHT,ALU1 ++S 4000,4800,4000,7000,400,*,UP,ALU1 ++S 4000,5000,4000,7000,400,a1,UP,CALU1 ++S 2900,7000,4000,7000,400,*,RIGHT,ALU1 ++S 800,5700,800,7300,600,*,DOWN,PDIF ++S 800,6900,800,9300,400,*,UP,ALU1 ++S 1000,6000,2000,6000,600,*,RIGHT,ALU1 ++S 2000,6000,2000,7100,400,*,UP,ALU1 ++S 2000,6000,2000,7000,400,z,UP,CALU1 ++S 1400,7500,1400,7900,200,*,DOWN,POLY ++S 4000,7900,4000,9300,400,*,UP,ALU1 ++S 2000,5700,2000,7300,1000,*,UP,PDIF ++S 1400,5500,1400,7500,200,3,DOWN,PTRANS ++S 2000,2900,3100,2900,400,*,RIGHT,ALU1 ++S 2000,3000,2000,5100,400,*,DOWN,ALU1 ++S 2000,3000,3100,3000,400,*,RIGHT,ALU1 ++S 2000,3000,2000,5000,400,b,DOWN,CALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,oai21_x1,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 3100,5700,3100,9200,400,n1,UP,PDIF ++S 3400,5500,3400,9400,200,1,DOWN,PTRANS ++S 2600,5500,2600,9400,200,2,DOWN,PTRANS ++S 2200,5700,2200,9200,400,*,DOWN,PDIF ++S 4000,5700,4000,9200,600,*,DOWN,PDIF ++S 3400,9400,3400,9700,200,*,DOWN,POLY ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 900,1900,900,3100,600,*,DOWN,ALU1 ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1800,4000,CONT_POLY,* ++V 3000,4000,CONT_POLY,* ++V 800,2200,CONT_DIF_N,* ++V 800,3000,CONT_DIF_N,* ++V 2000,2000,CONT_DIF_N,n2 ++V 4400,2200,CONT_DIF_N,n2 ++V 4400,3000,CONT_DIF_N,n2 ++V 800,7000,CONT_DIF_P,* ++V 2000,6800,CONT_DIF_P,* ++V 2000,6000,CONT_DIF_P,* ++V 4000,9000,CONT_DIF_P,* ++V 4000,8000,CONT_DIF_P,* ++V 3200,1000,CONT_DIF_N,* ++V 4000,4900,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oai21_x1.vbe b/alliance/src/cells/src/msxlib/oai21_x1.vbe +new file mode 100644 +index 0000000..5ab3443 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai21_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY oai21_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a1 : NATURAL := 6; ++ CONSTANT cin_a2 : NATURAL := 6; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT rdown_a1_z : NATURAL := 2170; ++ CONSTANT rdown_a2_z : NATURAL := 2170; ++ CONSTANT rdown_b_z : NATURAL := 2010; ++ CONSTANT rup_a1_z : NATURAL := 2980; ++ CONSTANT rup_a2_z : NATURAL := 2980; ++ CONSTANT rup_b_z : NATURAL := 2970; ++ CONSTANT tphl_b_z : NATURAL := 41; ++ CONSTANT tphl_a2_z : NATURAL := 45; ++ CONSTANT tplh_a1_z : NATURAL := 69; ++ CONSTANT tplh_b_z : NATURAL := 49; ++ CONSTANT tplh_a2_z : NATURAL := 60; ++ CONSTANT tphl_a1_z : NATURAL := 55; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oai21_x1; ++ ++ARCHITECTURE behaviour_data_flow OF oai21_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oai21_x1" ++ SEVERITY WARNING; ++ z <= not (((a1 or a2) and b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oai21_x2.ap b/alliance/src/cells/src/msxlib/oai21_x2.ap +new file mode 100644 +index 0000000..3fbf730 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai21_x2.ap +@@ -0,0 +1,123 @@ ++V ALLIANCE : 6 ++H oai21_x2,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 6000,4000,ref_ref,a1_40 ++R 6000,6000,ref_ref,a1_60 ++R 2000,4000,ref_ref,b_40 ++R 5000,4000,ref_ref,a1_40 ++R 5000,7000,ref_ref,a2_70 ++R 4000,8000,ref_ref,z_80 ++R 4000,7000,ref_ref,z_70 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 5000,6000,ref_ref,a2_60 ++R 6000,5000,ref_ref,a1_50 ++R 4000,5000,ref_ref,a2_50 ++R 4000,4000,ref_ref,a1_40 ++R 1000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 2000,5000,ref_ref,b_50 ++R 1000,3000,ref_ref,z_30 ++R 4000,6000,ref_ref,a2_60 ++R 3000,4000,ref_ref,a1_40 ++R 2000,6000,ref_ref,b_60 ++R 3000,6000,ref_ref,b_60 ++S 5100,700,5900,700,600,*,RIGHT,PTIE ++S 5600,4800,5600,5600,200,*,DOWN,POLY ++S 5000,4000,5000,4000,400,a1,LEFT,CALU1 ++S 6100,4000,6100,6100,400,*,UP,ALU1 ++S 2900,4000,6000,4000,400,*,RIGHT,ALU1 ++S 6000,4000,6000,6000,400,a1,UP,CALU1 ++S 6000,4000,6000,6100,400,*,UP,ALU1 ++S 4000,4000,4000,4000,400,a1,LEFT,CALU1 ++S 3000,4000,3000,4000,400,a1,LEFT,CALU1 ++S 3000,6000,3000,6000,400,b,LEFT,CALU1 ++S 4000,7000,4000,8000,400,z,UP,CALU1 ++S 3000,7000,3000,7000,400,z,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 5600,9400,5600,9700,200,*,DOWN,POLY ++S 4800,9400,4800,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 2800,9400,2800,9700,200,*,DOWN,POLY ++S 1600,9400,1600,9700,200,*,DOWN,POLY ++S 1600,300,1600,700,200,*,UP,POLY ++S 1600,5600,1600,9400,200,5,DOWN,PTRANS ++S 1200,5800,1200,9200,400,*,UP,PDIF ++S 2200,5800,2200,9200,600,*,DOWN,PDIF ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,oai21_x2,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 2200,7900,2200,9300,400,*,DOWN,ALU1 ++S 6200,7900,6200,9300,400,*,DOWN,ALU1 ++S 1000,6000,1000,6800,600,*,UP,PDIF ++S 1000,7000,4000,7000,600,*,RIGHT,ALU1 ++S 4100,6900,4100,8100,600,*,UP,ALU1 ++S 4000,6000,5000,6000,600,*,RIGHT,ALU1 ++S 4000,5000,4000,6000,400,a2,DOWN,CALU1 ++S 4000,4900,4000,6000,400,*,UP,ALU1 ++S 5000,6000,5000,7000,400,a2,UP,CALU1 ++S 5000,6000,5000,7100,400,*,UP,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 3200,5800,3200,9200,600,n2,DOWN,PDIF ++S 3600,5600,3600,9400,200,4,DOWN,PTRANS ++S 2800,5600,2800,9400,200,3,DOWN,PTRANS ++S 4800,5600,4800,9400,200,2,DOWN,PTRANS ++S 4200,5800,4200,9200,1000,*,UP,PDIF ++S 6200,5800,6200,9200,800,*,DOWN,PDIF ++S 5600,5600,5600,9400,200,1,DOWN,PTRANS ++S 5200,5800,5200,9200,600,n1,UP,PDIF ++S 3600,5200,4800,5200,200,*,RIGHT,POLY ++S 2800,300,2800,700,200,*,UP,POLY ++S 1200,800,1200,3600,400,*,UP,NDIF ++S 1000,2600,1000,3400,600,*,UP,NDIF ++S 2200,800,2200,3600,600,*,UP,NDIF ++S 3400,800,3400,3600,600,*,UP,NDIF ++S 5200,2200,5200,3800,200,6,UP,NTRANS ++S 4600,2400,4600,3600,600,*,UP,NDIF ++S 4000,1800,4000,2200,200,*,UP,POLY ++S 5200,1800,5200,2200,200,*,UP,POLY ++S 5800,700,5800,3100,400,*,DOWN,ALU1 ++S 5900,2400,5900,3600,600,*,UP,NDIF ++S 2000,6000,3100,6000,400,*,RIGHT,ALU1 ++S 2000,6100,3100,6100,400,*,RIGHT,ALU1 ++S 2000,4000,2000,6000,400,b,DOWN,CALU1 ++S 2000,3900,2000,6000,400,*,DOWN,ALU1 ++S 3000,4000,3000,4500,600,*,UP,ALU1 ++S 2200,3000,4700,3000,400,*,RIGHT,ALU1 ++S 2200,2000,2200,3000,600,*,DOWN,ALU1 ++S 4000,4200,5200,4200,200,*,LEFT,POLY ++S 3400,700,3400,2100,400,*,UP,ALU1 ++S 4100,4200,4100,4800,400,*,DOWN,POLY ++S 4000,2200,4000,3800,200,7,UP,NTRANS ++S 2800,600,2800,3800,200,8,UP,NTRANS ++S 1600,600,1600,3800,200,9,UP,NTRANS ++S 1600,3800,1600,5300,200,*,UP,POLY ++S 2800,4400,2800,5600,200,*,UP,POLY ++S 1000,2600,1000,7000,400,*,DOWN,ALU1 ++V 6000,700,CONT_BODY_P,* ++V 5000,700,CONT_BODY_P,* ++V 6000,5000,CONT_POLY,* ++V 4200,8000,CONT_DIF_P,* ++V 2200,2000,CONT_DIF_N,n3 ++V 2200,9000,CONT_DIF_P,* ++V 6200,9000,CONT_DIF_P,* ++V 2200,8000,CONT_DIF_P,* ++V 6200,8000,CONT_DIF_P,* ++V 1000,5900,CONT_DIF_P,* ++V 1000,6700,CONT_DIF_P,* ++V 4200,7000,CONT_DIF_P,* ++V 4000,5000,CONT_POLY,* ++V 3400,1000,CONT_DIF_N,* ++V 1000,3500,CONT_DIF_N,* ++V 1000,2700,CONT_DIF_N,* ++V 4600,3000,CONT_DIF_N,n3 ++V 5800,3000,CONT_DIF_N,* ++V 3000,4400,CONT_POLY,* ++V 2000,5000,CONT_POLY,* ++V 2200,3000,CONT_DIF_N,n3 ++V 3400,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oai21_x2.vbe b/alliance/src/cells/src/msxlib/oai21_x2.vbe +new file mode 100644 +index 0000000..a55d6ec +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai21_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY oai21_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a1 : NATURAL := 12; ++ CONSTANT cin_a2 : NATURAL := 11; ++ CONSTANT cin_b : NATURAL := 8; ++ CONSTANT rdown_a1_z : NATURAL := 1150; ++ CONSTANT rdown_a2_z : NATURAL := 1150; ++ CONSTANT rdown_b_z : NATURAL := 1060; ++ CONSTANT rup_a1_z : NATURAL := 1530; ++ CONSTANT rup_a2_z : NATURAL := 1530; ++ CONSTANT rup_b_z : NATURAL := 1560; ++ CONSTANT tphl_b_z : NATURAL := 41; ++ CONSTANT tphl_a2_z : NATURAL := 44; ++ CONSTANT tplh_a1_z : NATURAL := 66; ++ CONSTANT tplh_b_z : NATURAL := 48; ++ CONSTANT tplh_a2_z : NATURAL := 57; ++ CONSTANT tphl_a1_z : NATURAL := 54; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oai21_x2; ++ ++ARCHITECTURE behaviour_data_flow OF oai21_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oai21_x2" ++ SEVERITY WARNING; ++ z <= not (((a1 or a2) and b)) after 900 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oai22_x05.ap b/alliance/src/cells/src/msxlib/oai22_x05.ap +new file mode 100644 +index 0000000..81b196c +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai22_x05.ap +@@ -0,0 +1,124 @@ ++V ALLIANCE : 6 ++H oai22_x05,P, 9/ 8/2014,100 ++A 0,0,6000,10000 ++R 5000,4000,ref_ref,a2_40 ++R 2000,4000,ref_ref,z_40 ++R 3000,4000,ref_ref,b2_40 ++R 4000,4000,ref_ref,b2_40 ++R 2000,5000,ref_ref,b1_50 ++R 2000,6000,ref_ref,b1_60 ++R 3000,7000,ref_ref,b1_70 ++R 3000,5000,ref_ref,b2_50 ++R 4000,5000,ref_ref,a2_50 ++R 5000,6000,ref_ref,a1_60 ++R 4000,7000,ref_ref,a1_70 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,7000,ref_ref,z_70 ++R 3000,8000,ref_ref,z_80 ++R 2000,8000,ref_ref,z_80 ++R 2000,3000,ref_ref,z_30 ++R 5000,7000,ref_ref,a1_70 ++R 4000,8000,ref_ref,a1_80 ++R 4000,6000,ref_ref,a2_60 ++R 5000,5000,ref_ref,a2_50 ++R 1000,8000,ref_ref,z_80 ++R 2000,7000,ref_ref,b1_70 ++R 3000,6000,ref_ref,b2_60 ++S 4100,9300,4900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 5000,4000,5000,5000,400,a2,DOWN,CALU1 ++S 3000,4000,4000,4000,600,*,RIGHT,ALU1 ++S 1000,4000,2000,4000,600,*,RIGHT,ALU1 ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,oai22_x05,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 5200,7900,5200,9300,400,*,UP,ALU1 ++S 4600,6500,4600,8500,200,1,DOWN,PTRANS ++S 3800,6500,3800,8500,200,2,DOWN,PTRANS ++S 4200,6700,4200,8300,600,n1,UP,PDIF ++S 3200,6700,3200,8300,1000,*,UP,PDIF ++S 2600,6500,2600,8500,200,4,DOWN,PTRANS ++S 1800,6500,1800,8500,200,3,DOWN,PTRANS ++S 2200,6700,2200,8300,600,n2,UP,PDIF ++S 4000,7000,4000,8000,400,a1,UP,CALU1 ++S 4000,7000,4000,8100,400,*,UP,ALU1 ++S 4000,7000,5000,7000,600,*,RIGHT,ALU1 ++S 5000,6000,5000,7000,400,a1,UP,CALU1 ++S 5000,5800,5000,7000,400,*,UP,ALU1 ++S 5000,3900,5000,5000,400,*,DOWN,ALU1 ++S 4000,5000,5000,5000,400,*,RIGHT,ALU1 ++S 5100,3900,5100,5000,400,*,DOWN,ALU1 ++S 4000,5000,4000,6000,400,a2,UP,CALU1 ++S 4000,5000,4000,6100,400,*,UP,ALU1 ++S 4000,4900,5000,4900,400,*,RIGHT,ALU1 ++S 4600,6000,4600,6500,200,*,DOWN,POLY ++S 5200,2900,5200,3400,400,*,DOWN,NDIF ++S 4800,2700,4800,3600,200,5,UP,NTRANS ++S 3000,2900,3000,3400,1000,*,UP,NDIF ++S 3600,2700,3600,3600,200,6,UP,NTRANS ++S 1800,2900,1800,3400,1000,*,UP,NDIF ++S 2400,2700,2400,3600,200,8,UP,NTRANS ++S 1200,2700,1200,3600,200,7,UP,NTRANS ++S 800,2900,800,3400,400,*,DOWN,NDIF ++S 1800,5300,1800,6500,200,*,DOWN,POLY ++S 4800,3600,4800,5600,200,*,UP,POLY ++S 3800,4000,3800,6500,200,*,DOWN,POLY ++S 3600,3600,3600,4100,200,*,UP,POLY ++S 2400,3600,2400,4000,200,*,UP,POLY ++S 2400,4000,2800,4000,200,*,RIGHT,POLY ++S 1200,3600,1200,4800,200,*,UP,POLY ++S 1200,4800,1800,4800,200,*,RIGHT,POLY ++S 2600,8500,2600,8900,200,*,DOWN,POLY ++S 2000,3000,2000,4000,400,z,UP,CALU1 ++S 1900,2900,1900,4000,600,*,UP,ALU1 ++S 600,2000,600,3100,400,*,UP,ALU1 ++S 4800,2300,4800,2700,200,*,UP,POLY ++S 3600,2300,3600,2700,200,*,UP,POLY ++S 2400,2300,2400,2700,200,*,UP,POLY ++S 1200,2300,1200,2700,200,*,UP,POLY ++S 1800,8500,1800,8900,200,*,DOWN,POLY ++S 1000,8000,3200,8000,600,*,RIGHT,ALU1 ++S 1000,4000,1000,8000,400,z,DOWN,CALU1 ++S 1000,4400,1000,8000,400,*,DOWN,ALU1 ++S 2000,7000,3000,7000,600,*,RIGHT,ALU1 ++S 2000,4900,2000,7000,400,*,UP,ALU1 ++S 2000,5000,2000,7000,400,b1,UP,CALU1 ++S 2800,4000,2800,6100,200,*,DOWN,POLY ++S 2600,6000,2600,6500,200,*,DOWN,POLY ++S 2000,8000,2000,8000,400,z,LEFT,CALU1 ++S 3000,8000,3000,8000,400,z,LEFT,CALU1 ++S 3000,7000,3000,7000,400,b1,LEFT,CALU1 ++S 3000,4000,3000,6100,400,*,DOWN,ALU1 ++S 3000,4000,3000,6000,400,b2,DOWN,CALU1 ++S 4000,4000,4000,4000,400,b2,LEFT,CALU1 ++S 3800,8500,3800,8800,200,*,DOWN,POLY ++S 4600,8500,4600,8800,200,*,DOWN,POLY ++S 600,2000,2900,2000,400,*,RIGHT,ALU1 ++S 2900,2000,2900,3000,400,*,DOWN,ALU1 ++S 2900,3000,5500,3000,400,*,RIGHT,ALU1 ++S 4200,1800,4200,3400,600,*,UP,NDIF ++S 4200,700,4200,2100,400,*,DOWN,ALU1 ++S 1200,6700,1200,9100,600,*,DOWN,PDIF ++S 1100,6700,1100,9100,600,*,DOWN,PDIF ++S 5300,6700,5300,8300,600,*,DOWN,PDIF ++V 4000,9300,CONT_BODY_N,* ++V 5000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 1800,3000,CONT_DIF_N,* ++V 3200,8000,CONT_DIF_P,* ++V 5200,8000,CONT_DIF_P,* ++V 5000,5900,CONT_POLY,* ++V 4000,5000,CONT_POLY,* ++V 5400,3000,CONT_DIF_N,n3 ++V 3000,3000,CONT_DIF_N,n3 ++V 600,3000,CONT_DIF_N,n3 ++V 3000,5000,CONT_POLY,* ++V 2000,5000,CONT_POLY,* ++V 1200,9000,CONT_DIF_P,* ++V 4200,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oai22_x05.vbe b/alliance/src/cells/src/msxlib/oai22_x05.vbe +new file mode 100644 +index 0000000..0dfc79e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai22_x05.vbe +@@ -0,0 +1,44 @@ ++ENTITY oai22_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_b1 : NATURAL := 4; ++ CONSTANT cin_b2 : NATURAL := 4; ++ CONSTANT cin_a1 : NATURAL := 4; ++ CONSTANT cin_a2 : NATURAL := 4; ++ CONSTANT rdown_b1_z : NATURAL := 3810; ++ CONSTANT rdown_b2_z : NATURAL := 3800; ++ CONSTANT rdown_a1_z : NATURAL := 3760; ++ CONSTANT rdown_a2_z : NATURAL := 3760; ++ CONSTANT rup_b1_z : NATURAL := 5850; ++ CONSTANT rup_b2_z : NATURAL := 5830; ++ CONSTANT rup_a1_z : NATURAL := 5840; ++ CONSTANT rup_a2_z : NATURAL := 5840; ++ CONSTANT tphl_a2_z : NATURAL := 58; ++ CONSTANT tphl_b2_z : NATURAL := 49; ++ CONSTANT tplh_b1_z : NATURAL := 68; ++ CONSTANT tphl_a1_z : NATURAL := 67; ++ CONSTANT tplh_b2_z : NATURAL := 57; ++ CONSTANT tphl_b1_z : NATURAL := 59; ++ CONSTANT tplh_a1_z : NATURAL := 87; ++ CONSTANT tplh_a2_z : NATURAL := 77; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oai22_x05; ++ ++ARCHITECTURE behaviour_data_flow OF oai22_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oai22_x05" ++ SEVERITY WARNING; ++ z <= not (((b1 or b2) and (a1 or a2))) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oai22_x1.ap b/alliance/src/cells/src/msxlib/oai22_x1.ap +new file mode 100644 +index 0000000..e80a678 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai22_x1.ap +@@ -0,0 +1,121 @@ ++V ALLIANCE : 6 ++H oai22_x1,P, 9/ 8/2014,100 ++A 0,0,6000,10000 ++R 1000,3000,ref_ref,z_30 ++R 3000,3000,ref_ref,b2_30 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 5000,4000,ref_ref,a2_40 ++R 5000,7000,ref_ref,a1_70 ++R 2000,4000,ref_ref,b1_40 ++R 2000,5000,ref_ref,b1_50 ++R 2000,6000,ref_ref,b1_60 ++R 4000,3000,ref_ref,b2_30 ++R 3000,4000,ref_ref,b2_40 ++R 3000,5000,ref_ref,b2_50 ++R 4000,4000,ref_ref,a2_40 ++R 4000,5000,ref_ref,a2_50 ++R 5000,5000,ref_ref,a1_50 ++R 5000,6000,ref_ref,a1_60 ++R 4000,7000,ref_ref,a1_70 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 1000,7000,ref_ref,z_70 ++R 3000,8000,ref_ref,z_80 ++R 2000,3000,ref_ref,z_30 ++R 4000,6000,ref_ref,a2_60 ++R 3000,6000,ref_ref,b1_60 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 1000,2900,2100,2900,400,*,RIGHT,ALU1 ++S 1000,7000,3200,7000,600,*,RIGHT,ALU1 ++S 4000,7000,5000,7000,600,*,RIGHT,ALU1 ++S 1000,3000,2100,3000,400,*,RIGHT,ALU1 ++S 1200,4700,1500,4700,200,*,RIGHT,POLY ++S 1800,4900,2000,4900,600,*,RIGHT,ALU1 ++S 2000,3900,2000,6000,400,*,UP,ALU1 ++S 3000,3000,3000,5100,400,*,DOWN,ALU1 ++S 3000,3000,3000,5000,400,b2,DOWN,CALU1 ++S 3000,2900,4100,2900,400,*,RIGHT,ALU1 ++S 2600,3800,2600,5500,200,*,DOWN,POLY ++S 3600,3400,3600,3900,200,*,UP,POLY ++S 3000,3000,4100,3000,400,*,RIGHT,ALU1 ++S 1200,7900,1200,9300,400,*,UP,ALU1 ++S 3000,7000,3000,8000,400,z,UP,CALU1 ++S 3100,7000,3100,8100,600,*,UP,ALU1 ++S 1000,3000,1000,7000,400,*,DOWN,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 2000,6100,3100,6100,400,*,RIGHT,ALU1 ++S 2000,4000,2000,6000,400,b1,UP,CALU1 ++S 2000,6000,3100,6000,400,*,RIGHT,ALU1 ++S 3800,4200,3800,5500,200,*,DOWN,POLY ++S 4800,3400,4800,4700,200,*,UP,POLY ++S 5000,4800,5000,7000,400,*,UP,ALU1 ++S 5000,5000,5000,7000,400,a1,UP,CALU1 ++S 5200,7900,5200,9300,400,*,UP,ALU1 ++S 4600,9400,4600,9700,200,*,DOWN,POLY ++S 3800,9400,3800,9700,200,*,DOWN,POLY ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 1800,9400,1800,9700,200,*,DOWN,POLY ++S 5300,5700,5300,9200,600,*,DOWN,PDIF ++S 4200,5700,4200,9200,600,n1,UP,PDIF ++S 4600,5500,4600,9400,200,1,DOWN,PTRANS ++S 3800,5500,3800,9400,200,2,DOWN,PTRANS ++S 3200,5700,3200,9200,1000,*,UP,PDIF ++S 2200,5700,2200,9200,600,n2,UP,PDIF ++S 2600,5500,2600,9400,200,4,DOWN,PTRANS ++S 1800,5500,1800,9400,200,3,DOWN,PTRANS ++S 1100,5700,1100,9200,600,*,DOWN,PDIF ++S 2400,1700,2400,3400,200,8,UP,NTRANS ++S 1200,1700,1200,3400,200,7,UP,NTRANS ++S 3600,1700,3600,3400,200,6,UP,NTRANS ++S 4800,1700,4800,3400,200,5,UP,NTRANS ++S 4200,900,4200,3200,600,*,UP,NDIF ++S 5200,1900,5200,3200,400,*,DOWN,NDIF ++S 800,1900,800,3200,400,*,DOWN,NDIF ++S 500,2000,5500,2000,400,*,RIGHT,ALU1 ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,oai22_x1,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 1200,1300,1200,1700,200,*,UP,POLY ++S 2400,1300,2400,1700,200,*,UP,POLY ++S 3600,1300,3600,1700,200,*,UP,POLY ++S 4800,1300,4800,1700,200,*,UP,POLY ++S 1800,1900,1800,3200,1000,*,UP,NDIF ++S 3000,1900,3000,3200,1000,*,UP,NDIF ++S 4000,4000,4000,6100,400,*,UP,ALU1 ++S 3900,4000,3900,6100,400,*,UP,ALU1 ++S 4000,4000,4000,6000,400,a2,DOWN,CALU1 ++S 4000,4000,5100,4000,400,*,RIGHT,ALU1 ++S 5000,4000,5000,4000,400,a2,LEFT,CALU1 ++S 5400,2100,5400,2700,600,*,UP,NDIF ++S 5400,2000,5400,2800,600,*,UP,ALU1 ++S 4000,7000,4000,7000,400,a1,LEFT,CALU1 ++S 4000,3000,4000,3000,400,b2,LEFT,CALU1 ++S 3000,6000,3000,6000,400,b1,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 2400,3400,2400,3900,200,*,UP,POLY ++S 4600,5000,4600,5500,200,*,DOWN,POLY ++S 1200,3400,1200,4700,200,*,UP,POLY ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 3200,7000,CONT_DIF_P,* ++V 3000,4900,CONT_POLY,* ++V 1200,8000,CONT_DIF_P,* ++V 5200,8000,CONT_DIF_P,* ++V 1800,4900,CONT_POLY,* ++V 5000,4900,CONT_POLY,* ++V 5200,9000,CONT_DIF_P,* ++V 1200,9000,CONT_DIF_P,* ++V 4200,1000,CONT_DIF_N,* ++V 600,2000,CONT_DIF_N,n3 ++V 3000,2000,CONT_DIF_N,n3 ++V 5400,2000,CONT_DIF_N,n3 ++V 1800,3000,CONT_DIF_N,* ++V 3200,8000,CONT_DIF_P,* ++V 5400,2800,CONT_DIF_N,n3 ++V 4000,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oai22_x1.vbe b/alliance/src/cells/src/msxlib/oai22_x1.vbe +new file mode 100644 +index 0000000..1975abc +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai22_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY oai22_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_b1 : NATURAL := 7; ++ CONSTANT cin_b2 : NATURAL := 6; ++ CONSTANT cin_a1 : NATURAL := 6; ++ CONSTANT cin_a2 : NATURAL := 6; ++ CONSTANT rdown_b1_z : NATURAL := 2010; ++ CONSTANT rdown_b2_z : NATURAL := 2010; ++ CONSTANT rdown_a1_z : NATURAL := 1990; ++ CONSTANT rdown_a2_z : NATURAL := 1990; ++ CONSTANT rup_b1_z : NATURAL := 2990; ++ CONSTANT rup_b2_z : NATURAL := 2990; ++ CONSTANT rup_a1_z : NATURAL := 2990; ++ CONSTANT rup_a2_z : NATURAL := 2990; ++ CONSTANT tphl_a2_z : NATURAL := 55; ++ CONSTANT tphl_b2_z : NATURAL := 48; ++ CONSTANT tplh_b1_z : NATURAL := 63; ++ CONSTANT tphl_a1_z : NATURAL := 64; ++ CONSTANT tplh_b2_z : NATURAL := 53; ++ CONSTANT tphl_b1_z : NATURAL := 57; ++ CONSTANT tplh_a1_z : NATURAL := 80; ++ CONSTANT tplh_a2_z : NATURAL := 70; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oai22_x1; ++ ++ARCHITECTURE behaviour_data_flow OF oai22_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oai22_x1" ++ SEVERITY WARNING; ++ z <= not (((b1 or b2) and (a1 or a2))) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oai22_x2.ap b/alliance/src/cells/src/msxlib/oai22_x2.ap +new file mode 100644 +index 0000000..e51c32a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai22_x2.ap +@@ -0,0 +1,167 @@ ++V ALLIANCE : 6 ++H oai22_x2,P, 9/ 8/2014,100 ++A 0,0,10000,10000 ++R 6000,4000,ref_ref,a2_40 ++R 8000,4000,ref_ref,a1_40 ++R 8000,7000,ref_ref,a2_70 ++R 8000,6000,ref_ref,a2_60 ++R 4000,4000,ref_ref,b2_40 ++R 3000,5000,ref_ref,b2_50 ++R 3000,6000,ref_ref,b1_60 ++R 4000,5000,ref_ref,b1_50 ++R 2000,5000,ref_ref,b1_50 ++R 2000,4000,ref_ref,b1_40 ++R 9000,4000,ref_ref,a1_40 ++R 9000,5000,ref_ref,a1_50 ++R 6000,5000,ref_ref,a1_50 ++R 8000,5000,ref_ref,a2_50 ++R 7000,4000,ref_ref,a2_40 ++R 4000,3000,ref_ref,z_30 ++R 3000,3000,ref_ref,z_30 ++R 2000,3000,ref_ref,z_30 ++R 6000,7000,ref_ref,z_70 ++R 3000,8000,ref_ref,z_80 ++R 3000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 4000,7000,ref_ref,z_70 ++R 5000,7000,ref_ref,z_70 ++R 5000,3000,ref_ref,b2_30 ++R 7000,7000,ref_ref,z_70 ++R 1000,7000,ref_ref,z_70 ++R 1000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,b1_60 ++R 4000,6000,ref_ref,b1_60 ++R 3000,4000,ref_ref,b2_40 ++R 5000,4000,ref_ref,b2_40 ++R 7000,5000,ref_ref,a2_50 ++R 9000,6000,ref_ref,a1_60 ++R 7000,6000,ref_ref,z_60 ++S 8500,700,9300,700,600,*,RIGHT,PTIE ++S 6000,7000,6000,7000,400,z,LEFT,CALU1 ++S 5000,7000,5000,7000,400,z,LEFT,CALU1 ++S 4000,7000,4000,7000,400,z,LEFT,CALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 4000,3000,4000,3000,400,z,LEFT,CALU1 ++S 3000,3000,3000,3000,400,z,LEFT,CALU1 ++S 2000,3000,2000,3000,400,z,LEFT,CALU1 ++S 3000,6000,3000,6000,400,b1,LEFT,CALU1 ++S 4000,4000,4000,4000,400,b2,LEFT,CALU1 ++S 7400,2300,7400,2900,600,*,UP,NDIF ++S 7400,2000,7400,3100,400,*,UP,ALU1 ++S 2500,2000,7400,2000,400,*,RIGHT,ALU1 ++S 7000,4000,7000,4000,400,a1,LEFT,CALU1 ++S 8000,4000,8000,4000,400,a1,LEFT,CALU1 ++S 7000,5000,7000,5000,400,a2,LEFT,CALU1 ++S 8000,5000,8000,7100,400,*,DOWN,ALU1 ++S 6000,4000,6000,5100,600,*,UP,ALU1 ++S 6000,4000,6000,5000,400,a1,UP,CALU1 ++S 8000,5000,8000,7000,400,a2,DOWN,CALU1 ++S 6000,4000,9000,4000,400,*,RIGHT,ALU1 ++S 0,600,10000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,10000,5000,10000,oai22_x2,LEFT,TALU8 ++S 0,2200,10000,2200,5200,*,LEFT,PWELL ++S 0,7600,10000,7600,5600,*,LEFT,NWELL ++S 0,9400,10000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,5800,2000,9100,600,n2a,UP,PDIF ++S 4000,5800,4000,9100,600,n2b,UP,PDIF ++S 6000,5800,6000,9100,600,n1a,UP,PDIF ++S 8000,5800,8000,9100,600,n1b,UP,PDIF ++S 3200,600,3200,3900,200,8,UP,NTRANS ++S 4400,600,4400,3900,200,7,UP,NTRANS ++S 6800,600,6800,3900,200,6,UP,NTRANS ++S 5600,600,5600,3900,200,5,UP,NTRANS ++S 7000,5800,7000,9100,1000,*,UP,PDIF ++S 5000,5800,5000,9100,1000,*,UP,PDIF ++S 3000,5800,3000,9100,1000,*,UP,PDIF ++S 900,5800,900,9100,600,*,DOWN,PDIF ++S 9100,5800,9100,9100,600,*,DOWN,PDIF ++S 3000,4000,3000,5000,400,b2,UP,CALU1 ++S 3200,300,3200,600,200,*,UP,POLY ++S 4400,300,4400,600,200,*,UP,POLY ++S 5600,300,5600,600,200,*,UP,POLY ++S 6800,300,6800,600,200,*,UP,POLY ++S 7200,800,7200,3700,400,*,UP,NDIF ++S 6200,800,6200,3700,1000,*,UP,NDIF ++S 5000,800,5000,3700,1000,*,UP,NDIF ++S 3800,800,3800,3700,1000,*,UP,NDIF ++S 2800,800,2800,3700,400,*,UP,NDIF ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 1000,3000,1000,7000,400,*,DOWN,ALU1 ++S 5500,5000,6000,5000,600,*,LEFT,ALU1 ++S 2000,6000,4000,6000,400,*,RIGHT,ALU1 ++S 2400,5200,3600,5200,200,*,RIGHT,POLY ++S 8400,5200,8600,5200,200,*,RIGHT,POLY ++S 6400,5200,7600,5200,200,*,RIGHT,POLY ++S 8400,5600,8400,9300,200,1b,DOWN,PTRANS ++S 7600,5600,7600,9300,200,2b,DOWN,PTRANS ++S 6400,5600,6400,9300,200,2a,DOWN,PTRANS ++S 5600,5600,5600,9300,200,1a,DOWN,PTRANS ++S 4400,5600,4400,9300,200,3b,DOWN,PTRANS ++S 2400,5600,2400,9300,200,4a,DOWN,PTRANS ++S 1600,5600,1600,9300,200,3a,DOWN,PTRANS ++S 3600,5600,3600,9300,200,4b,DOWN,PTRANS ++S 3000,7000,3000,8100,400,*,UP,ALU1 ++S 3000,7000,3000,8000,400,z,UP,CALU1 ++S 900,3000,900,7000,400,*,DOWN,ALU1 ++S 1000,7000,7000,7000,400,*,RIGHT,ALU1 ++S 1000,3000,4100,3000,400,*,RIGHT,ALU1 ++S 2000,3900,2000,6000,400,*,DOWN,ALU1 ++S 2000,4000,2000,6000,400,b1,UP,CALU1 ++S 4000,5400,4000,6000,400,*,DOWN,ALU1 ++S 4000,5000,4000,6000,400,b1,UP,CALU1 ++S 2000,6100,4000,6100,400,*,RIGHT,ALU1 ++S 4000,5000,4500,5000,600,*,RIGHT,ALU1 ++S 3000,4000,5000,4000,400,*,RIGHT,ALU1 ++S 3000,4000,3000,5000,600,*,DOWN,ALU1 ++S 1600,4500,1600,5600,200,*,DOWN,POLY ++S 5000,3000,5000,4000,400,b2,DOWN,CALU1 ++S 5000,3000,5000,4000,600,*,DOWN,ALU1 ++S 9000,4000,9000,6000,400,a1,UP,CALU1 ++S 7000,5000,8000,5000,600,*,RIGHT,ALU1 ++S 8400,9300,8400,9700,200,*,DOWN,POLY ++S 7600,9300,7600,9700,200,*,DOWN,POLY ++S 6400,9300,6400,9700,200,*,DOWN,POLY ++S 5600,9300,5600,9700,200,*,DOWN,POLY ++S 4400,9300,4400,9700,200,*,DOWN,POLY ++S 3600,9300,3600,9700,200,*,DOWN,POLY ++S 2400,9300,2400,9700,200,*,DOWN,POLY ++S 1600,9300,1600,9700,200,*,DOWN,POLY ++S 3200,3900,3200,4600,200,*,UP,POLY ++S 4400,3900,4400,4600,200,*,UP,POLY ++S 5600,3900,5600,4600,200,*,UP,POLY ++S 6800,3900,6800,5200,200,*,UP,POLY ++S 9000,4000,9000,6000,600,*,UP,ALU1 ++S 7000,6000,7000,7000,400,z,UP,CALU1 ++S 7000,6000,7000,7000,600,*,UP,ALU1 ++S 1000,7900,1000,9300,400,*,UP,ALU1 ++S 5000,7900,5000,9300,400,*,UP,ALU1 ++S 9000,6900,9000,9300,400,*,UP,ALU1 ++V 9300,700,CONT_BODY_P,* ++V 8400,700,CONT_BODY_P,* ++V 7400,2200,CONT_DIF_N,n3 ++V 7400,3000,CONT_DIF_N,n3 ++V 7000,5000,CONT_POLY,* ++V 6200,1000,CONT_DIF_N,* ++V 5000,2000,CONT_DIF_N,n3 ++V 2600,2000,CONT_DIF_N,n3 ++V 3800,3000,CONT_DIF_N,* ++V 3000,5000,CONT_POLY,* ++V 9000,5000,CONT_POLY,* ++V 5600,5000,CONT_POLY,* ++V 1000,8000,CONT_DIF_P,* ++V 9000,8000,CONT_DIF_P,* ++V 5000,8000,CONT_DIF_P,* ++V 3000,8000,CONT_DIF_P,* ++V 3000,7000,CONT_DIF_P,* ++V 1000,9000,CONT_DIF_P,* ++V 5000,9000,CONT_DIF_P,* ++V 2000,4400,CONT_POLY,* ++V 9000,9000,CONT_DIF_P,* ++V 7000,7000,CONT_DIF_P,* ++V 4400,5000,CONT_POLY,* ++V 7000,6000,CONT_DIF_P,* ++V 9000,7000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oai22_x2.vbe b/alliance/src/cells/src/msxlib/oai22_x2.vbe +new file mode 100644 +index 0000000..4e3796b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oai22_x2.vbe +@@ -0,0 +1,44 @@ ++ENTITY oai22_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 10000; ++ CONSTANT cin_b1 : NATURAL := 12; ++ CONSTANT cin_b2 : NATURAL := 11; ++ CONSTANT cin_a1 : NATURAL := 12; ++ CONSTANT cin_a2 : NATURAL := 11; ++ CONSTANT rdown_b1_z : NATURAL := 1040; ++ CONSTANT rdown_b2_z : NATURAL := 1030; ++ CONSTANT rdown_a1_z : NATURAL := 1020; ++ CONSTANT rdown_a2_z : NATURAL := 1020; ++ CONSTANT rup_b1_z : NATURAL := 1580; ++ CONSTANT rup_b2_z : NATURAL := 1570; ++ CONSTANT rup_a1_z : NATURAL := 1570; ++ CONSTANT rup_a2_z : NATURAL := 1570; ++ CONSTANT tphl_a2_z : NATURAL := 53; ++ CONSTANT tphl_b2_z : NATURAL := 47; ++ CONSTANT tplh_b1_z : NATURAL := 62; ++ CONSTANT tphl_a1_z : NATURAL := 62; ++ CONSTANT tplh_b2_z : NATURAL := 52; ++ CONSTANT tphl_b1_z : NATURAL := 56; ++ CONSTANT tplh_a1_z : NATURAL := 78; ++ CONSTANT tplh_a2_z : NATURAL := 69; ++ CONSTANT transistors : NATURAL := 12 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oai22_x2; ++ ++ARCHITECTURE behaviour_data_flow OF oai22_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oai22_x2" ++ SEVERITY WARNING; ++ z <= not (((b1 or b2) and (a1 or a2))) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oan21_x1.ap b/alliance/src/cells/src/msxlib/oan21_x1.ap +new file mode 100644 +index 0000000..ae856ff +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oan21_x1.ap +@@ -0,0 +1,117 @@ ++V ALLIANCE : 6 ++H oan21_x1,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 5000,6000,ref_ref,a2_60 ++R 6000,5000,ref_ref,a1_50 ++R 5000,5000,ref_ref,a2_50 ++R 4000,5000,ref_ref,b_50 ++R 6000,6000,ref_ref,a1_60 ++R 6000,7000,ref_ref,a1_70 ++R 5000,7000,ref_ref,a1_70 ++R 4000,3000,ref_ref,b_30 ++R 5000,3000,ref_ref,b_30 ++R 4000,4000,ref_ref,b_40 ++R 6000,4000,ref_ref,a2_40 ++R 5000,4000,ref_ref,a2_40 ++R 1000,6000,ref_ref,z_60 ++R 2000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,z_50 ++R 2000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 6000,7900,6000,9300,400,*,UP,ALU1 ++S 4000,2900,5100,2900,400,*,RIGHT,ALU1 ++S 4000,3000,4000,5100,400,*,DOWN,ALU1 ++S 4000,3000,5100,3000,400,*,RIGHT,ALU1 ++S 4000,3000,4000,5000,400,b,DOWN,CALU1 ++S 5000,4000,5000,6000,400,a2,DOWN,CALU1 ++S 4900,7100,6000,7100,400,*,RIGHT,ALU1 ++S 6000,4800,6000,7000,400,*,UP,ALU1 ++S 6000,5000,6000,7000,400,a1,UP,CALU1 ++S 4900,7000,6000,7000,400,*,RIGHT,ALU1 ++S 2800,6900,2800,9300,400,*,UP,ALU1 ++S 5000,3000,5000,3000,400,b,LEFT,CALU1 ++S 6000,4000,6000,4000,400,a2,LEFT,CALU1 ++S 5000,7000,5000,7000,400,a1,LEFT,CALU1 ++S 5000,4000,5000,6100,400,*,UP,ALU1 ++S 5000,3900,6100,3900,400,*,RIGHT,ALU1 ++S 5000,4000,6100,4000,400,*,RIGHT,ALU1 ++S 5400,5100,5900,5100,200,*,RIGHT,POLY ++S 5400,5100,5400,5500,200,*,DOWN,POLY ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,oan21_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 4600,3800,4600,5500,200,*,UP,POLY ++S 600,700,600,3100,400,*,DOWN,ALU1 ++S 1600,6100,1600,6700,600,*,DOWN,PDIF ++S 1000,6000,2000,6000,600,*,LEFT,ALU1 ++S 1600,5900,1600,6900,400,*,DOWN,ALU1 ++S 3400,4700,3400,5500,200,*,UP,POLY ++S 3900,4800,3900,5100,600,*,DOWN,ALU1 ++S 2800,3900,3000,3900,600,*,RIGHT,ALU1 ++S 2000,3000,2000,6000,400,z,UP,CALU1 ++S 1000,6000,1000,6000,400,z,LEFT,CALU1 ++S 5400,8300,5400,8700,200,*,DOWN,POLY ++S 4600,8300,4600,8700,200,*,DOWN,POLY ++S 5100,5900,5100,8100,400,n1,UP,PDIF ++S 5400,5700,5400,8300,200,1,DOWN,PTRANS ++S 4600,5700,4600,8300,200,2,DOWN,PTRANS ++S 6000,5900,6000,8100,600,*,DOWN,PDIF ++S 4200,5900,4200,8100,400,*,DOWN,PDIF ++S 4000,5900,4000,6900,1000,*,UP,PDIF ++S 3400,5700,3400,7100,200,3,DOWN,PTRANS ++S 4000,6000,4000,6900,400,*,UP,ALU1 ++S 3000,5900,4000,5900,400,*,RIGHT,ALU1 ++S 3400,7100,3400,7500,200,*,DOWN,POLY ++S 4200,1900,4200,2700,600,*,DOWN,NDIF ++S 4800,1700,4800,2900,200,5,UP,NTRANS ++S 5800,1700,5800,2900,200,4,UP,NTRANS ++S 3200,1900,3200,2700,400,*,UP,NDIF ++S 3600,1700,3600,2900,200,6,UP,NTRANS ++S 3000,2500,3000,5900,400,*,DOWN,ALU1 ++S 4100,2000,6500,2000,400,*,RIGHT,ALU1 ++S 6200,1900,6200,2700,400,*,UP,NDIF ++S 5800,2900,5800,4800,200,*,UP,POLY ++S 4800,2900,4800,4000,200,*,UP,POLY ++S 3600,2900,3600,4800,200,*,UP,POLY ++S 3600,1300,3600,1700,200,*,UP,POLY ++S 4800,1300,4800,1700,200,*,UP,POLY ++S 5800,1300,5800,1700,200,*,UP,POLY ++S 5300,600,5300,2700,400,*,UP,NDIF ++S 2200,5700,2200,7700,200,2,DOWN,PTRANS ++S 2800,5900,2800,7500,600,*,DOWN,PDIF ++S 1800,5900,1800,7500,400,*,UP,PDIF ++S 2200,7700,2200,8100,200,*,DOWN,POLY ++S 1200,2300,1200,3300,200,6,UP,NTRANS ++S 1600,2500,1600,3100,400,*,UP,NDIF ++S 1200,1900,1200,2300,200,*,UP,POLY ++S 600,2500,600,3100,600,*,UP,NDIF ++S 1200,3700,2800,3700,200,*,LEFT,POLY ++S 2200,3700,2200,5500,200,*,DOWN,POLY ++S 2200,3900,2800,3900,600,*,LEFT,POLY ++S 2000,2900,2000,6000,400,*,UP,ALU1 ++S 1900,2900,1900,3400,600,*,UP,ALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 5000,4000,CONT_POLY,* ++V 6000,4900,CONT_POLY,* ++V 2800,7000,CONT_DIF_P,* ++V 6000,8000,CONT_DIF_P,* ++V 4200,2000,CONT_DIF_N,n2 ++V 600,3000,CONT_DIF_N,* ++V 1600,6000,CONT_DIF_P,* ++V 1600,6800,CONT_DIF_P,* ++V 3800,4900,CONT_POLY,* ++V 2800,3900,CONT_POLY,zn ++V 4000,6000,CONT_DIF_P,zn ++V 4000,6800,CONT_DIF_P,zn ++V 3000,2600,CONT_DIF_N,zn ++V 6400,2000,CONT_DIF_N,n2 ++V 5400,700,CONT_DIF_N,* ++V 1800,3000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oan21_x1.vbe b/alliance/src/cells/src/msxlib/oan21_x1.vbe +new file mode 100644 +index 0000000..543780b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oan21_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY oan21_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a1 : NATURAL := 5; ++ CONSTANT cin_a2 : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT rdown_a1_z : NATURAL := 2310; ++ CONSTANT rdown_a2_z : NATURAL := 2310; ++ CONSTANT rdown_b_z : NATURAL := 2300; ++ CONSTANT rup_a1_z : NATURAL := 2970; ++ CONSTANT rup_a2_z : NATURAL := 2960; ++ CONSTANT rup_b_z : NATURAL := 2960; ++ CONSTANT tphh_b_z : NATURAL := 77; ++ CONSTANT tpll_b_z : NATURAL := 100; ++ CONSTANT tpll_a1_z : NATURAL := 125; ++ CONSTANT tphh_a2_z : NATURAL := 83; ++ CONSTANT tpll_a2_z : NATURAL := 116; ++ CONSTANT tphh_a1_z : NATURAL := 95; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oan21_x1; ++ ++ARCHITECTURE behaviour_data_flow OF oan21_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oan21_x1" ++ SEVERITY WARNING; ++ z <= ((a1 or a2) and b) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oan21_x2.ap b/alliance/src/cells/src/msxlib/oan21_x2.ap +new file mode 100644 +index 0000000..9016472 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oan21_x2.ap +@@ -0,0 +1,126 @@ ++V ALLIANCE : 6 ++H oan21_x2,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 5000,6000,ref_ref,a2_60 ++R 6000,5000,ref_ref,a1_50 ++R 5000,5000,ref_ref,a2_50 ++R 4000,5000,ref_ref,b_50 ++R 6000,6000,ref_ref,a1_60 ++R 6000,7000,ref_ref,a1_70 ++R 5000,7000,ref_ref,a1_70 ++R 4000,3000,ref_ref,b_30 ++R 5000,3000,ref_ref,b_30 ++R 4000,4000,ref_ref,b_40 ++R 6000,4000,ref_ref,a2_40 ++R 5000,4000,ref_ref,a2_40 ++R 1000,6000,ref_ref,z_60 ++R 2000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,z_50 ++R 2000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 6000,7900,6000,9300,400,*,UP,ALU1 ++S 4000,2900,5100,2900,400,*,RIGHT,ALU1 ++S 4000,3000,4000,5100,400,*,DOWN,ALU1 ++S 4000,3000,5100,3000,400,*,RIGHT,ALU1 ++S 4000,3000,4000,5000,400,b,DOWN,CALU1 ++S 5000,4000,5000,6000,400,a2,DOWN,CALU1 ++S 4900,7100,6000,7100,400,*,RIGHT,ALU1 ++S 6000,4800,6000,7000,400,*,UP,ALU1 ++S 6000,5000,6000,7000,400,a1,UP,CALU1 ++S 4900,7000,6000,7000,400,*,RIGHT,ALU1 ++S 2800,6900,2800,9300,400,*,UP,ALU1 ++S 5000,3000,5000,3000,400,b,LEFT,CALU1 ++S 6000,4000,6000,4000,400,a2,LEFT,CALU1 ++S 5000,7000,5000,7000,400,a1,LEFT,CALU1 ++S 5000,4000,5000,6100,400,*,UP,ALU1 ++S 5000,3900,6100,3900,400,*,RIGHT,ALU1 ++S 5000,4000,6100,4000,400,*,RIGHT,ALU1 ++S 6400,2000,6400,3100,400,*,UP,ALU1 ++S 5400,5100,5900,5100,200,*,RIGHT,POLY ++S 5400,5100,5400,5500,200,*,DOWN,POLY ++S 3400,7500,3400,7900,200,*,DOWN,POLY ++S 5800,1200,5800,1600,200,*,UP,POLY ++S 5800,3300,5800,4800,200,*,UP,POLY ++S 6200,1800,6200,3100,400,*,UP,NDIF ++S 6400,2300,6400,2900,600,*,UP,NDIF ++S 5800,1600,5800,3300,200,4,UP,NTRANS ++S 4000,5700,4000,7300,1000,*,UP,PDIF ++S 3400,5500,3400,7500,200,3,DOWN,PTRANS ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,oan21_x2,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 4600,5500,4600,9300,200,2,DOWN,PTRANS ++S 5400,5500,5400,9300,200,1,DOWN,PTRANS ++S 5100,5700,5100,9100,400,n1,UP,PDIF ++S 4200,5700,4200,9100,400,*,DOWN,PDIF ++S 6000,5700,6000,9100,600,*,DOWN,PDIF ++S 5400,9300,5400,9700,200,*,DOWN,POLY ++S 4600,9300,4600,9700,200,*,DOWN,POLY ++S 5300,500,5300,3100,400,*,UP,NDIF ++S 4800,1600,4800,3300,200,5,UP,NTRANS ++S 4800,1200,4800,1600,200,*,UP,POLY ++S 4200,1800,4200,3100,600,*,DOWN,NDIF ++S 3600,1600,3600,3300,200,6,UP,NTRANS ++S 3600,1200,3600,1600,200,*,UP,POLY ++S 3000,2300,3000,2900,600,*,UP,NDIF ++S 3200,1800,3200,3100,400,*,UP,NDIF ++S 4600,3800,4600,5500,200,*,UP,POLY ++S 4800,3300,4800,4000,200,*,UP,POLY ++S 1200,1700,1200,3600,200,6,UP,NTRANS ++S 600,700,600,3100,400,*,DOWN,ALU1 ++S 600,1900,600,3400,600,*,UP,NDIF ++S 1600,1900,1600,3400,400,*,UP,NDIF ++S 1200,1200,1200,1600,200,*,UP,POLY ++S 2200,5500,2200,9300,200,2,DOWN,PTRANS ++S 1600,6100,1600,6700,600,*,DOWN,PDIF ++S 1800,5700,1800,9100,400,*,UP,PDIF ++S 2800,5700,2800,9100,600,*,DOWN,PDIF ++S 1000,6000,2000,6000,600,*,LEFT,ALU1 ++S 1600,5900,1600,6900,400,*,DOWN,ALU1 ++S 3600,3300,3600,4800,200,*,UP,POLY ++S 3400,4700,3400,5500,200,*,UP,POLY ++S 3900,4800,3900,5100,600,*,DOWN,ALU1 ++S 2800,3900,3000,3900,600,*,RIGHT,ALU1 ++S 3000,6000,4000,6000,400,*,RIGHT,ALU1 ++S 4000,6000,4000,7100,400,*,UP,ALU1 ++S 1200,4100,2800,4100,200,*,LEFT,POLY ++S 1200,3600,1200,4100,200,*,DOWN,POLY ++S 2200,4100,2200,5500,200,*,DOWN,POLY ++S 3000,2100,3000,6000,400,*,DOWN,ALU1 ++S 2000,3000,2000,6000,400,z,UP,CALU1 ++S 1000,6000,1000,6000,400,z,LEFT,CALU1 ++S 2200,9300,2200,9700,200,*,DOWN,POLY ++S 4100,2000,6400,2000,400,*,RIGHT,ALU1 ++S 1800,2600,1800,3200,600,*,DOWN,NDIF ++S 2000,2400,2000,6000,400,*,UP,ALU1 ++S 1900,2400,1900,3400,600,*,UP,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 700,9300,CONT_BODY_N,* ++V 5000,4000,CONT_POLY,* ++V 6000,4900,CONT_POLY,* ++V 6400,2200,CONT_DIF_N,n2 ++V 6400,3000,CONT_DIF_N,n2 ++V 2800,7000,CONT_DIF_P,* ++V 6000,9000,CONT_DIF_P,* ++V 6000,8000,CONT_DIF_P,* ++V 5400,600,CONT_DIF_N,* ++V 4200,2000,CONT_DIF_N,n2 ++V 600,2000,CONT_DIF_N,* ++V 1800,3300,CONT_DIF_N,* ++V 600,3000,CONT_DIF_N,* ++V 1600,6000,CONT_DIF_P,* ++V 1600,6800,CONT_DIF_P,* ++V 2800,8000,CONT_DIF_P,* ++V 2800,9000,CONT_DIF_P,* ++V 3800,4900,CONT_POLY,* ++V 4000,7000,CONT_DIF_P,zn ++V 4000,6200,CONT_DIF_P,zn ++V 2800,3900,CONT_POLY,zn ++V 3000,3000,CONT_DIF_N,zn ++V 3000,2200,CONT_DIF_N,zn ++V 1800,2500,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oan21_x2.vbe b/alliance/src/cells/src/msxlib/oan21_x2.vbe +new file mode 100644 +index 0000000..b05bce2 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oan21_x2.vbe +@@ -0,0 +1,38 @@ ++ENTITY oan21_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_a1 : NATURAL := 6; ++ CONSTANT cin_a2 : NATURAL := 7; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT rdown_a1_z : NATURAL := 1220; ++ CONSTANT rdown_a2_z : NATURAL := 1220; ++ CONSTANT rdown_b_z : NATURAL := 1210; ++ CONSTANT rup_a1_z : NATURAL := 1560; ++ CONSTANT rup_a2_z : NATURAL := 1560; ++ CONSTANT rup_b_z : NATURAL := 1560; ++ CONSTANT tphh_b_z : NATURAL := 80; ++ CONSTANT tpll_b_z : NATURAL := 103; ++ CONSTANT tpll_a1_z : NATURAL := 126; ++ CONSTANT tphh_a2_z : NATURAL := 85; ++ CONSTANT tpll_a2_z : NATURAL := 117; ++ CONSTANT tphh_a1_z : NATURAL := 98; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a1 : in BIT; ++ a2 : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oan21_x2; ++ ++ARCHITECTURE behaviour_data_flow OF oan21_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oan21_x2" ++ SEVERITY WARNING; ++ z <= ((a1 or a2) and b) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oan22_x1.ap b/alliance/src/cells/src/msxlib/oan22_x1.ap +new file mode 100644 +index 0000000..36f6622 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oan22_x1.ap +@@ -0,0 +1,137 @@ ++V ALLIANCE : 6 ++H oan22_x1,P, 9/ 8/2014,100 ++A 0,0,8000,10000 ++R 1000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,z_40 ++R 2000,5000,ref_ref,z_50 ++R 2000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++R 5000,6000,ref_ref,b1_60 ++R 6000,7000,ref_ref,a1_70 ++R 6000,6000,ref_ref,a2_60 ++R 4000,6000,ref_ref,b1_60 ++R 6000,3000,ref_ref,b2_30 ++R 5000,4000,ref_ref,b2_40 ++R 5000,5000,ref_ref,b2_50 ++R 6000,4000,ref_ref,a2_40 ++R 6000,5000,ref_ref,a2_50 ++R 7000,5000,ref_ref,a1_50 ++R 7000,6000,ref_ref,a1_60 ++R 5000,3000,ref_ref,b2_30 ++R 7000,4000,ref_ref,a2_40 ++R 7000,7000,ref_ref,a1_70 ++R 4000,4000,ref_ref,b1_40 ++R 4000,5000,ref_ref,b1_50 ++R 2000,8000,ref_ref,z_80 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 2000,6700,2000,7300,600,*,UP,PDIF ++S 6300,700,6300,2800,400,*,UP,NDIF ++S 6800,1400,6800,1800,200,*,UP,POLY ++S 5800,1400,5800,1800,200,*,UP,POLY ++S 4600,1400,4600,1800,200,*,UP,POLY ++S 3400,1400,3400,1800,200,*,UP,POLY ++S 3400,3000,3400,3900,200,*,UP,POLY ++S 4600,3000,4600,5500,200,*,DOWN,POLY ++S 6800,3000,6800,4700,200,*,UP,POLY ++S 5800,3000,5800,5500,200,*,DOWN,POLY ++S 7400,1900,7400,2100,600,*,UP,ALU1 ++S 2800,1900,2800,2100,600,*,UP,ALU1 ++S 5200,1900,5200,2100,600,*,DOWN,ALU1 ++S 4000,2700,4000,3000,600,*,UP,ALU1 ++S 7200,2000,7200,2800,400,*,DOWN,NDIF ++S 6800,1800,6800,3000,200,5,UP,NTRANS ++S 5800,1800,5800,3000,200,6,UP,NTRANS ++S 5200,2000,5200,2800,1000,*,UP,NDIF ++S 3000,2000,3000,2800,400,*,DOWN,NDIF ++S 4600,1800,4600,3000,200,8,UP,NTRANS ++S 3400,1800,3400,3000,200,7,UP,NTRANS ++S 4000,2000,4000,2800,1000,*,UP,NDIF ++S 2800,1900,7400,1900,400,*,RIGHT,ALU1 ++S 1300,3700,1300,4700,200,*,DOWN,POLY ++S 1300,2300,1300,2700,200,*,UP,POLY ++S 600,2900,600,3500,600,*,UP,NDIF ++S 1300,2700,1300,3700,200,2z,UP,NTRANS ++S 1700,2900,1700,3500,400,*,UP,NDIF ++S 2600,4900,2600,6300,200,*,DOWN,POLY ++S 6600,8300,6600,8700,200,*,DOWN,POLY ++S 5800,8300,5800,8700,200,*,DOWN,POLY ++S 4600,8300,4600,8700,200,*,DOWN,POLY ++S 3800,8300,3800,8700,200,*,DOWN,POLY ++S 2600,8300,2600,8700,200,*,DOWN,POLY ++S 3200,5900,3200,8100,600,*,DOWN,PDIF ++S 2200,6500,2200,8100,400,*,DOWN,PDIF ++S 2600,6300,2600,8300,200,1z,DOWN,PTRANS ++S 4200,5900,4200,8100,600,n2,UP,PDIF ++S 3800,5700,3800,8300,200,3,DOWN,PTRANS ++S 6200,5900,6200,8100,600,n1,UP,PDIF ++S 6600,5700,6600,8300,200,1,DOWN,PTRANS ++S 7300,5900,7300,8100,600,*,DOWN,PDIF ++S 4600,5700,4600,8300,200,4,DOWN,PTRANS ++S 5200,5900,5200,8100,1000,*,UP,PDIF ++S 5800,5700,5800,8300,200,2,DOWN,PTRANS ++S 3000,3000,3000,7000,400,*,DOWN,ALU1 ++S 3000,7000,5200,7000,400,*,RIGHT,ALU1 ++S 5200,7000,5200,8100,400,*,UP,ALU1 ++S 2800,4900,3000,4900,600,*,RIGHT,ALU1 ++S 1300,4700,2800,4700,200,*,LEFT,POLY ++S 900,4000,2000,4000,400,*,LEFT,ALU1 ++S 1000,4000,1000,4000,400,z,LEFT,CALU1 ++S 1900,2900,1900,4000,400,*,DOWN,ALU1 ++S 3800,4000,4000,4000,600,*,RIGHT,ALU1 ++S 3800,4000,3800,5500,200,*,DOWN,POLY ++S 700,700,700,3100,400,*,DOWN,ALU1 ++S 0,5000,8000,5000,10000,oan22_x1,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 6600,5000,6600,5500,200,*,DOWN,POLY ++S 5000,6000,5000,6000,400,b1,LEFT,CALU1 ++S 6000,4000,6000,6100,400,*,UP,ALU1 ++S 5900,4000,5900,6100,400,*,UP,ALU1 ++S 6000,4000,6000,6000,400,a2,DOWN,CALU1 ++S 6000,4000,7100,4000,400,*,RIGHT,ALU1 ++S 7000,4000,7000,4000,400,a2,LEFT,CALU1 ++S 6000,7000,6000,7000,400,a1,LEFT,CALU1 ++S 6000,3000,6000,3000,400,b2,LEFT,CALU1 ++S 4000,4000,4000,6000,400,b1,UP,CALU1 ++S 4000,6000,5100,6000,400,*,RIGHT,ALU1 ++S 7000,4800,7000,7000,400,*,UP,ALU1 ++S 7000,5000,7000,7000,400,a1,UP,CALU1 ++S 7200,7900,7200,9300,400,*,UP,ALU1 ++S 5000,2900,6100,2900,400,*,RIGHT,ALU1 ++S 5000,3000,6100,3000,400,*,RIGHT,ALU1 ++S 3200,7900,3200,9300,400,*,UP,ALU1 ++S 4000,6100,5100,6100,400,*,RIGHT,ALU1 ++S 6000,7000,7000,7000,600,*,RIGHT,ALU1 ++S 3000,3000,4100,3000,400,*,RIGHT,ALU1 ++S 4000,3900,4000,6000,400,*,UP,ALU1 ++S 5000,3000,5000,5100,400,*,DOWN,ALU1 ++S 5000,3000,5000,5000,400,b2,DOWN,CALU1 ++S 2000,3000,2000,8000,400,z,DOWN,CALU1 ++S 2000,2900,2000,8100,400,*,DOWN,ALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 2000,7400,CONT_DIF_P,* ++V 6400,800,CONT_DIF_N,* ++V 7400,2100,CONT_DIF_N,n3 ++V 5200,2100,CONT_DIF_N,n3 ++V 2800,2100,CONT_DIF_N,n3 ++V 4000,2700,CONT_DIF_N,zn ++V 1900,3400,CONT_DIF_N,* ++V 5200,7200,CONT_DIF_P,zn ++V 5200,8000,CONT_DIF_P,zn ++V 2800,4900,CONT_POLY,zn ++V 2000,6600,CONT_DIF_P,* ++V 3800,4000,CONT_POLY,* ++V 700,3000,CONT_DIF_N,* ++V 3200,8000,CONT_DIF_P,* ++V 7200,8000,CONT_DIF_P,* ++V 5000,4900,CONT_POLY,* ++V 7000,4900,CONT_POLY,* ++V 6000,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oan22_x1.vbe b/alliance/src/cells/src/msxlib/oan22_x1.vbe +new file mode 100644 +index 0000000..6c4adb3 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oan22_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY oan22_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_b1 : NATURAL := 5; ++ CONSTANT cin_b2 : NATURAL := 5; ++ CONSTANT cin_a2 : NATURAL := 5; ++ CONSTANT cin_a1 : NATURAL := 5; ++ CONSTANT rdown_b1_z : NATURAL := 2320; ++ CONSTANT rdown_b2_z : NATURAL := 2320; ++ CONSTANT rdown_a2_z : NATURAL := 2340; ++ CONSTANT rdown_a1_z : NATURAL := 2340; ++ CONSTANT rup_b1_z : NATURAL := 2970; ++ CONSTANT rup_b2_z : NATURAL := 2960; ++ CONSTANT rup_a2_z : NATURAL := 2960; ++ CONSTANT rup_a1_z : NATURAL := 2970; ++ CONSTANT tphh_a2_z : NATURAL := 96; ++ CONSTANT tpll_b1_z : NATURAL := 122; ++ CONSTANT tphh_a1_z : NATURAL := 107; ++ CONSTANT tphh_b2_z : NATURAL := 87; ++ CONSTANT tpll_a1_z : NATURAL := 146; ++ CONSTANT tpll_b2_z : NATURAL := 112; ++ CONSTANT tphh_b1_z : NATURAL := 99; ++ CONSTANT tpll_a2_z : NATURAL := 136; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a2 : in BIT; ++ a1 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oan22_x1; ++ ++ARCHITECTURE behaviour_data_flow OF oan22_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oan22_x1" ++ SEVERITY WARNING; ++ z <= ((b1 or b2) and (a2 or a1)) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/oan22_x2.ap b/alliance/src/cells/src/msxlib/oan22_x2.ap +new file mode 100644 +index 0000000..5ba3758 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oan22_x2.ap +@@ -0,0 +1,136 @@ ++V ALLIANCE : 6 ++H oan22_x2,P, 9/ 8/2014,100 ++A 0,0,8000,10000 ++R 1000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,z_40 ++R 2000,5000,ref_ref,z_50 ++R 2000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++R 5000,6000,ref_ref,b1_60 ++R 6000,7000,ref_ref,a1_70 ++R 6000,6000,ref_ref,a2_60 ++R 4000,6000,ref_ref,b1_60 ++R 6000,3000,ref_ref,b2_30 ++R 5000,4000,ref_ref,b2_40 ++R 5000,5000,ref_ref,b2_50 ++R 6000,4000,ref_ref,a2_40 ++R 6000,5000,ref_ref,a2_50 ++R 7000,5000,ref_ref,a1_50 ++R 7000,6000,ref_ref,a1_60 ++R 5000,3000,ref_ref,b2_30 ++R 7000,4000,ref_ref,a2_40 ++R 7000,7000,ref_ref,a1_70 ++R 4000,4000,ref_ref,b1_40 ++R 4000,5000,ref_ref,b1_50 ++R 2000,8000,ref_ref,z_80 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 2600,9400,2600,9700,200,*,DOWN,POLY ++S 3000,3000,3000,7000,400,*,DOWN,ALU1 ++S 3000,7000,5200,7000,400,*,RIGHT,ALU1 ++S 2600,5500,2600,9400,200,1z,DOWN,PTRANS ++S 5200,7000,5200,8100,400,*,UP,ALU1 ++S 2800,4900,3000,4900,600,*,RIGHT,ALU1 ++S 1300,3600,1300,4700,200,*,DOWN,POLY ++S 1300,4700,2800,4700,200,*,LEFT,POLY ++S 3400,3400,3400,3900,200,*,UP,POLY ++S 900,4000,2000,4000,400,*,LEFT,ALU1 ++S 1000,4000,1000,4000,400,z,LEFT,CALU1 ++S 1900,2900,1900,4000,400,*,DOWN,ALU1 ++S 2000,5900,2000,6500,600,*,DOWN,PDIF ++S 2200,5700,2200,9200,400,*,DOWN,PDIF ++S 3800,4000,4000,4000,600,*,RIGHT,ALU1 ++S 3800,4000,3800,5500,200,*,DOWN,POLY ++S 700,700,700,3100,400,*,DOWN,ALU1 ++S 600,1900,600,3400,600,*,UP,NDIF ++S 1700,1900,1700,3400,400,*,UP,NDIF ++S 1300,1700,1300,3600,200,2z,UP,NTRANS ++S 1300,1300,1300,1700,200,*,UP,POLY ++S 2700,2000,7500,2000,400,*,RIGHT,ALU1 ++S 3000,1900,3000,3200,400,*,DOWN,NDIF ++S 3400,1300,3400,1700,200,*,UP,POLY ++S 3400,1700,3400,3400,200,7,UP,NTRANS ++S 4000,1900,4000,3200,1000,*,UP,NDIF ++S 4600,3400,4600,5500,200,*,DOWN,POLY ++S 4600,1300,4600,1700,200,*,UP,POLY ++S 4600,1700,4600,3400,200,8,UP,NTRANS ++S 5200,1900,5200,3200,1000,*,UP,NDIF ++S 5800,1300,5800,1700,200,*,UP,POLY ++S 5800,1700,5800,3400,200,6,UP,NTRANS ++S 6300,600,6300,3200,400,*,UP,NDIF ++S 0,5000,8000,5000,10000,oan22_x2,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 3100,5700,3100,9200,600,*,DOWN,PDIF ++S 7300,5700,7300,9200,600,*,DOWN,PDIF ++S 6200,5700,6200,9200,600,n1,UP,PDIF ++S 6600,5500,6600,9400,200,1,DOWN,PTRANS ++S 5800,5500,5800,9400,200,2,DOWN,PTRANS ++S 5200,5700,5200,9200,1000,*,UP,PDIF ++S 4200,5700,4200,9200,600,n2,UP,PDIF ++S 4600,5500,4600,9400,200,4,DOWN,PTRANS ++S 3800,5500,3800,9400,200,3,DOWN,PTRANS ++S 6800,1700,6800,3400,200,5,UP,NTRANS ++S 7200,1900,7200,3200,400,*,DOWN,NDIF ++S 7400,2100,7400,2700,600,*,UP,NDIF ++S 6800,1300,6800,1700,200,*,UP,POLY ++S 6600,5000,6600,5500,200,*,DOWN,POLY ++S 3800,9400,3800,9700,200,*,DOWN,POLY ++S 5800,4200,5800,5500,200,*,DOWN,POLY ++S 6800,3400,6800,4700,200,*,UP,POLY ++S 6600,9400,6600,9700,200,*,DOWN,POLY ++S 5800,9400,5800,9700,200,*,DOWN,POLY ++S 4600,9400,4600,9700,200,*,DOWN,POLY ++S 5000,6000,5000,6000,400,b1,LEFT,CALU1 ++S 6000,4000,6000,6100,400,*,UP,ALU1 ++S 5900,4000,5900,6100,400,*,UP,ALU1 ++S 6000,4000,6000,6000,400,a2,DOWN,CALU1 ++S 6000,4000,7100,4000,400,*,RIGHT,ALU1 ++S 7000,4000,7000,4000,400,a2,LEFT,CALU1 ++S 7400,2000,7400,2800,600,*,UP,ALU1 ++S 6000,7000,6000,7000,400,a1,LEFT,CALU1 ++S 6000,3000,6000,3000,400,b2,LEFT,CALU1 ++S 4000,4000,4000,6000,400,b1,UP,CALU1 ++S 4000,6000,5100,6000,400,*,RIGHT,ALU1 ++S 7000,4800,7000,7000,400,*,UP,ALU1 ++S 7000,5000,7000,7000,400,a1,UP,CALU1 ++S 7200,7900,7200,9300,400,*,UP,ALU1 ++S 5000,2900,6100,2900,400,*,RIGHT,ALU1 ++S 5000,3000,6100,3000,400,*,RIGHT,ALU1 ++S 3200,7900,3200,9300,400,*,UP,ALU1 ++S 4000,6100,5100,6100,400,*,RIGHT,ALU1 ++S 6000,7000,7000,7000,600,*,RIGHT,ALU1 ++S 3000,3000,4100,3000,400,*,RIGHT,ALU1 ++S 4000,3900,4000,6000,400,*,UP,ALU1 ++S 5000,3000,5000,5100,400,*,DOWN,ALU1 ++S 5000,3000,5000,5000,400,b2,DOWN,CALU1 ++S 2000,3000,2000,8000,400,z,DOWN,CALU1 ++S 2000,2900,2000,8100,400,*,DOWN,ALU1 ++V 1000,9300,CONT_BODY_N,* ++V 2100,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 5200,7200,CONT_DIF_P,zn ++V 5200,8000,CONT_DIF_P,zn ++V 4000,3000,CONT_DIF_N,zn ++V 2800,4900,CONT_POLY,zn ++V 2000,6600,CONT_DIF_P,* ++V 2000,5800,CONT_DIF_P,* ++V 3800,4000,CONT_POLY,* ++V 1900,3300,CONT_DIF_N,* ++V 700,2000,CONT_DIF_N,* ++V 700,3000,CONT_DIF_N,* ++V 2800,2000,CONT_DIF_N,n3 ++V 5200,2000,CONT_DIF_N,n3 ++V 6400,700,CONT_DIF_N,* ++V 3200,8000,CONT_DIF_P,* ++V 7200,8000,CONT_DIF_P,* ++V 7200,9000,CONT_DIF_P,* ++V 3200,9000,CONT_DIF_P,* ++V 7400,2000,CONT_DIF_N,n3 ++V 7400,2800,CONT_DIF_N,n3 ++V 5000,4900,CONT_POLY,* ++V 7000,4900,CONT_POLY,* ++V 6000,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/oan22_x2.vbe b/alliance/src/cells/src/msxlib/oan22_x2.vbe +new file mode 100644 +index 0000000..f3d6f6e +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/oan22_x2.vbe +@@ -0,0 +1,44 @@ ++ENTITY oan22_x2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_b1 : NATURAL := 7; ++ CONSTANT cin_b2 : NATURAL := 7; ++ CONSTANT cin_a2 : NATURAL := 7; ++ CONSTANT cin_a1 : NATURAL := 7; ++ CONSTANT rdown_b1_z : NATURAL := 1220; ++ CONSTANT rdown_b2_z : NATURAL := 1220; ++ CONSTANT rdown_a2_z : NATURAL := 1230; ++ CONSTANT rdown_a1_z : NATURAL := 1230; ++ CONSTANT rup_b1_z : NATURAL := 1520; ++ CONSTANT rup_b2_z : NATURAL := 1520; ++ CONSTANT rup_a2_z : NATURAL := 1520; ++ CONSTANT rup_a1_z : NATURAL := 1520; ++ CONSTANT tphh_a2_z : NATURAL := 97; ++ CONSTANT tpll_b1_z : NATURAL := 122; ++ CONSTANT tphh_a1_z : NATURAL := 109; ++ CONSTANT tphh_b2_z : NATURAL := 89; ++ CONSTANT tpll_a1_z : NATURAL := 143; ++ CONSTANT tpll_b2_z : NATURAL := 112; ++ CONSTANT tphh_b1_z : NATURAL := 101; ++ CONSTANT tpll_a2_z : NATURAL := 134; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a2 : in BIT; ++ a1 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END oan22_x2; ++ ++ARCHITECTURE behaviour_data_flow OF oan22_x2 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on oan22_x2" ++ SEVERITY WARNING; ++ z <= ((b1 or b2) and (a2 or a1)) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/or2_x1.ap b/alliance/src/cells/src/msxlib/or2_x1.ap +new file mode 100644 +index 0000000..80412bf +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/or2_x1.ap +@@ -0,0 +1,93 @@ ++V ALLIANCE : 6 ++H or2_x1,P, 9/ 8/2014,100 ++A 0,0,5000,10000 ++R 4000,6000,ref_ref,b_60 ++R 4000,5000,ref_ref,b_50 ++R 3000,5000,ref_ref,a_50 ++R 3000,4000,ref_ref,a_40 ++R 4000,4000,ref_ref,a_40 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 1000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 1000,7000,ref_ref,z_70 ++R 3000,6000,ref_ref,b_60 ++S 3500,9300,4300,9300,600,*,RIGHT,NTIE ++S 3500,700,4300,700,600,*,RIGHT,PTIE ++S 800,3100,1000,3100,600,*,RIGHT,ALU1 ++S 1000,1900,2100,1900,400,*,RIGHT,ALU1 ++S 1000,2000,2100,2000,400,*,RIGHT,ALU1 ++S 1000,2600,1000,3200,400,*,DOWN,NDIF ++S 1400,2000,1400,2400,200,*,DOWN,POLY ++S 1400,2400,1400,3400,200,2z,DOWN,NTRANS ++S 2600,3400,2600,3900,200,*,UP,POLY ++S 3600,5100,3600,5600,200,*,DOWN,POLY ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 2600,2700,2600,3400,200,2a,DOWN,NTRANS ++S 3800,2700,3800,3400,200,2b,DOWN,NTRANS ++S 1600,5600,1600,7600,200,1z,UP,PTRANS ++S 2800,5600,2800,8300,200,1a,UP,PTRANS ++S 3600,5600,3600,8300,200,1b,UP,PTRANS ++S 2000,900,2000,3200,600,*,UP,NDIF ++S 4400,700,4400,3100,400,*,DOWN,ALU1 ++S 2000,3000,3300,3000,400,*,LEFT,ALU1 ++S 2800,4400,2800,5600,200,*,UP,POLY ++S 2600,2300,2600,2700,200,*,DOWN,POLY ++S 3800,2300,3800,2700,200,*,DOWN,POLY ++S 4400,2900,4400,3200,600,*,UP,NDIF ++S 3200,2900,3200,3200,1000,*,UP,NDIF ++S 4000,5800,4000,8100,400,*,UP,PDIF ++S 3600,8300,3600,8700,200,*,DOWN,POLY ++S 2800,8300,2800,8700,200,*,DOWN,POLY ++S 1600,7600,1600,8000,200,*,DOWN,POLY ++S 1200,5800,1200,7400,400,*,UP,PDIF ++S 3200,5800,3200,8100,600,n1,DOWN,PDIF ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 1000,5800,1000,6600,600,*,UP,PDIF ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,5000,5000,10000,or2_x1,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 3800,3400,3800,4800,200,*,UP,POLY ++S 1000,1900,1000,7100,400,*,DOWN,ALU1 ++S 1600,4800,1600,5600,200,*,DOWN,POLY ++S 1400,3400,1400,5200,200,*,UP,POLY ++S 1400,5000,2200,5000,600,*,LEFT,POLY ++S 2600,3800,3000,3800,200,*,RIGHT,POLY ++S 3600,5200,4000,5200,200,*,RIGHT,POLY ++S 3000,4000,3000,5000,400,a,UP,CALU1 ++S 3000,3900,3000,5100,400,*,DOWN,ALU1 ++S 2900,6000,4000,6000,400,*,RIGHT,ALU1 ++S 2900,6100,4000,6100,400,*,RIGHT,ALU1 ++S 3000,6000,3000,6000,400,b,LEFT,CALU1 ++S 4000,5000,4000,6000,400,b,UP,CALU1 ++S 4000,4900,4000,6100,400,*,UP,ALU1 ++S 4200,7300,4200,7900,600,*,DOWN,PDIF ++S 2000,7000,4200,7000,400,*,LEFT,ALU1 ++S 4200,7000,4200,8100,400,*,UP,ALU1 ++S 2000,3000,2000,7000,400,*,UP,ALU1 ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 2200,5800,2200,8100,600,n2,DOWN,PDIF ++V 4300,9300,CONT_BODY_N,* ++V 3400,9300,CONT_BODY_N,* ++V 4300,700,CONT_BODY_P,* ++V 3400,700,CONT_BODY_P,* ++V 800,3100,CONT_DIF_N,* ++V 3200,3000,CONT_DIF_N,zn ++V 3000,4000,CONT_POLY,* ++V 4400,3000,CONT_DIF_N,* ++V 1000,6700,CONT_DIF_P,* ++V 1000,5900,CONT_DIF_P,* ++V 4000,5000,CONT_POLY,* ++V 2000,1000,CONT_DIF_N,* ++V 2000,5000,CONT_POLY,zn ++V 4200,8000,CONT_DIF_P,zn ++V 4200,7200,CONT_DIF_P,zn ++V 2200,8000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/or2_x1.vbe b/alliance/src/cells/src/msxlib/or2_x1.vbe +new file mode 100644 +index 0000000..2147c77 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/or2_x1.vbe +@@ -0,0 +1,32 @@ ++ENTITY or2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT cin_b : NATURAL := 4; ++ CONSTANT rdown_a_z : NATURAL := 2300; ++ CONSTANT rdown_b_z : NATURAL := 2300; ++ CONSTANT rup_a_z : NATURAL := 2970; ++ CONSTANT rup_b_z : NATURAL := 2960; ++ CONSTANT tpll_a_z : NATURAL := 102; ++ CONSTANT tphh_b_z : NATURAL := 80; ++ CONSTANT tpll_b_z : NATURAL := 93; ++ CONSTANT tphh_a_z : NATURAL := 93; ++ CONSTANT transistors : NATURAL := 6 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END or2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF or2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on or2_x1" ++ SEVERITY WARNING; ++ z <= (a or b) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/or3_x1.ap b/alliance/src/cells/src/msxlib/or3_x1.ap +new file mode 100644 +index 0000000..aeca76b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/or3_x1.ap +@@ -0,0 +1,106 @@ ++V ALLIANCE : 6 ++H or3_x1,P, 9/ 8/2014,100 ++A 0,0,6000,10000 ++R 4000,3000,ref_ref,c_30 ++R 5000,3000,ref_ref,c_30 ++R 5000,5000,ref_ref,c_50 ++R 5000,4000,ref_ref,c_40 ++R 1000,7000,ref_ref,z_70 ++R 2000,2000,ref_ref,z_20 ++R 1000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 4000,4000,ref_ref,a_40 ++R 3000,4000,ref_ref,a_40 ++R 3000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,a_60 ++R 4000,5000,ref_ref,b_50 ++R 4000,6000,ref_ref,b_60 ++R 4000,7000,ref_ref,b_70 ++R 3000,7000,ref_ref,b_70 ++S 5400,6900,5400,8000,400,*,DOWN,ALU1 ++S 2000,8000,5400,8000,400,*,LEFT,ALU1 ++S 5400,7100,5400,7700,600,*,UP,PDIF ++S 3000,7000,3000,7000,400,b,LEFT,CALU1 ++S 4000,3000,4000,3000,400,c,LEFT,CALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 3600,2400,3600,2900,200,*,UP,POLY ++S 3200,9300,3200,9700,200,*,DOWN,POLY ++S 4000,9300,4000,9700,200,*,DOWN,POLY ++S 4800,9300,4800,9700,200,*,DOWN,POLY ++S 1800,900,1800,2500,600,*,UP,NDIF ++S 3900,2900,5000,2900,400,*,RIGHT,ALU1 ++S 5000,3000,5000,5100,400,*,UP,ALU1 ++S 3900,3000,5000,3000,400,*,RIGHT,ALU1 ++S 5000,3000,5000,5000,400,c,UP,CALU1 ++S 3000,2000,5500,2000,400,*,RIGHT,ALU1 ++S 3000,2000,3000,3000,400,*,DOWN,ALU1 ++S 2000,3000,3000,3000,400,*,LEFT,ALU1 ++S 2800,2800,2800,4500,200,*,UP,POLY ++S 2400,2800,2800,2800,200,*,RIGHT,POLY ++S 3800,2800,3800,4800,200,*,DOWN,POLY ++S 4800,2400,4800,5600,200,*,DOWN,POLY ++S 2400,1300,2400,1700,200,*,DOWN,POLY ++S 3600,1300,3600,1700,200,*,DOWN,POLY ++S 4800,1300,4800,1700,200,*,DOWN,POLY ++S 4200,900,4200,2200,600,*,UP,NDIF ++S 4800,1700,4800,2400,200,2c,DOWN,NTRANS ++S 5400,1900,5400,2200,600,*,UP,NDIF ++S 2400,1700,2400,2400,200,2a,DOWN,NTRANS ++S 3600,1700,3600,2400,200,2b,DOWN,NTRANS ++S 3000,1900,3000,2200,1000,*,UP,NDIF ++S 5200,5800,5200,9100,400,*,UP,PDIF ++S 3200,5600,3200,9300,200,1a,UP,PTRANS ++S 3600,5800,3600,9100,600,n1,DOWN,PDIF ++S 4800,5600,4800,9300,200,1c,UP,PTRANS ++S 4000,5600,4000,9300,200,1b,UP,PTRANS ++S 4400,5800,4400,9100,600,n2,DOWN,PDIF ++S 1200,4400,1600,4400,200,*,RIGHT,POLY ++S 2400,5800,2400,9100,1000,n2,DOWN,PDIF ++S 3200,4400,3200,5600,200,*,UP,POLY ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,6000,5000,10000,or3_x1,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 2900,7100,4000,7100,400,*,RIGHT,ALU1 ++S 2900,7000,4000,7000,400,*,RIGHT,ALU1 ++S 1000,5800,1000,6600,600,*,UP,PDIF ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,3000,6100,400,*,DOWN,ALU1 ++S 4000,4900,4000,7100,400,*,UP,ALU1 ++S 1000,2000,1000,7100,400,*,DOWN,ALU1 ++S 2000,3000,2000,8000,400,*,UP,ALU1 ++S 1200,5800,1200,7400,400,*,UP,PDIF ++S 1600,7600,1600,8000,200,*,DOWN,POLY ++S 1600,4400,1600,5600,200,*,DOWN,POLY ++S 4000,5000,4000,7000,400,b,UP,CALU1 ++S 3000,4000,3000,6000,400,a,UP,CALU1 ++S 1600,5600,1600,7600,200,1z,UP,PTRANS ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 800,1900,800,2500,400,*,DOWN,NDIF ++S 1200,1700,1200,2700,200,2z,DOWN,NTRANS ++S 1200,1300,1200,1700,200,*,DOWN,POLY ++S 1200,2700,1200,4400,200,*,UP,POLY ++S 500,2000,2100,2000,400,*,RIGHT,ALU1 ++V 1000,9300,CONT_BODY_N,* ++V 3000,700,CONT_BODY_P,* ++V 5400,7800,CONT_DIF_P,zn ++V 5400,7000,CONT_DIF_P,zn ++V 5000,3000,CONT_POLY,* ++V 4200,1000,CONT_DIF_N,* ++V 5400,2000,CONT_DIF_N,zn ++V 2400,9000,CONT_DIF_P,* ++V 3000,4600,CONT_POLY,* ++V 4000,5000,CONT_POLY,* ++V 1000,5900,CONT_DIF_P,* ++V 1000,6700,CONT_DIF_P,* ++V 2000,4600,CONT_POLY,zn ++V 600,2000,CONT_DIF_N,* ++V 1800,1000,CONT_DIF_N,* ++V 3000,2100,CONT_DIF_N,zn ++EOF +diff --git a/alliance/src/cells/src/msxlib/or3_x1.vbe b/alliance/src/cells/src/msxlib/or3_x1.vbe +new file mode 100644 +index 0000000..4c2892b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/or3_x1.vbe +@@ -0,0 +1,38 @@ ++ENTITY or3_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_c : NATURAL := 5; ++ CONSTANT rdown_a_z : NATURAL := 2330; ++ CONSTANT rdown_b_z : NATURAL := 2330; ++ CONSTANT rdown_c_z : NATURAL := 2330; ++ CONSTANT rup_a_z : NATURAL := 2990; ++ CONSTANT rup_b_z : NATURAL := 2970; ++ CONSTANT rup_c_z : NATURAL := 2960; ++ CONSTANT tphh_c_z : NATURAL := 93; ++ CONSTANT tpll_a_z : NATURAL := 143; ++ CONSTANT tphh_b_z : NATURAL := 112; ++ CONSTANT tpll_b_z : NATURAL := 134; ++ CONSTANT tphh_a_z : NATURAL := 125; ++ CONSTANT tpll_c_z : NATURAL := 111; ++ CONSTANT transistors : NATURAL := 8 ++); ++PORT ( ++ a : in BIT; ++ b : in BIT; ++ c : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END or3_x1; ++ ++ARCHITECTURE behaviour_data_flow OF or3_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on or3_x1" ++ SEVERITY WARNING; ++ z <= ((a or b) or c) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/or4_x1.ap b/alliance/src/cells/src/msxlib/or4_x1.ap +new file mode 100644 +index 0000000..4748a86 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/or4_x1.ap +@@ -0,0 +1,124 @@ ++V ALLIANCE : 6 ++H or4_x1,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 5000,7000,ref_ref,d_70 ++R 6000,7000,ref_ref,d_70 ++R 6000,6000,ref_ref,d_60 ++R 6000,4000,ref_ref,c_40 ++R 3000,7000,ref_ref,b_70 ++R 5000,5000,ref_ref,c_50 ++R 5000,4000,ref_ref,c_40 ++R 1000,7000,ref_ref,z_70 ++R 2000,2000,ref_ref,z_20 ++R 1000,2000,ref_ref,z_20 ++R 1000,3000,ref_ref,z_30 ++R 1000,4000,ref_ref,z_40 ++R 1000,5000,ref_ref,z_50 ++R 1000,6000,ref_ref,z_60 ++R 4000,4000,ref_ref,a_40 ++R 3000,4000,ref_ref,a_40 ++R 3000,5000,ref_ref,a_50 ++R 3000,6000,ref_ref,a_60 ++R 4000,5000,ref_ref,b_50 ++R 4000,6000,ref_ref,b_60 ++R 4000,7000,ref_ref,b_70 ++R 6000,5000,ref_ref,d_50 ++R 5000,6000,ref_ref,c_60 ++S 5100,700,5900,700,600,*,RIGHT,PTIE ++S 5600,9400,5600,9700,200,*,DOWN,POLY ++S 4800,9400,4800,9700,200,*,DOWN,POLY ++S 4000,9400,4000,9700,200,*,DOWN,POLY ++S 3200,9400,3200,9700,200,*,DOWN,POLY ++S 3600,3300,3600,3800,200,*,UP,POLY ++S 4800,3900,4800,5500,200,*,DOWN,POLY ++S 3200,4400,3200,5500,200,*,UP,POLY ++S 3800,3700,3800,4700,200,*,DOWN,POLY ++S 500,3000,1000,3000,400,*,RIGHT,ALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,7000,5000,10000,or4_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 6400,700,6400,3100,400,*,DOWN,ALU1 ++S 6000,4800,6000,7000,400,*,DOWN,ALU1 ++S 5000,4000,5000,6100,400,*,UP,ALU1 ++S 4900,7100,6000,7100,400,*,LEFT,ALU1 ++S 4900,7000,6000,7000,400,*,LEFT,ALU1 ++S 6000,5000,6000,7000,400,d,DOWN,CALU1 ++S 4600,3300,4600,3900,200,*,UP,POLY ++S 5000,3900,6100,3900,400,*,RIGHT,ALU1 ++S 5600,5000,5600,5500,200,*,DOWN,POLY ++S 5000,4000,6100,4000,400,*,RIGHT,ALU1 ++S 2900,7000,4000,7000,400,*,RIGHT,ALU1 ++S 2900,7100,4000,7100,400,*,RIGHT,ALU1 ++S 2000,3000,5300,3000,400,*,LEFT,ALU1 ++S 4000,700,4000,1900,400,*,DOWN,ALU1 ++S 5800,3300,5800,4700,200,*,UP,POLY ++S 5800,2300,5800,2700,200,*,DOWN,POLY ++S 5800,2700,5800,3300,200,2d,DOWN,NTRANS ++S 4600,2700,4600,3300,200,2c,DOWN,NTRANS ++S 4600,2300,4600,2700,200,*,DOWN,POLY ++S 4100,1700,4100,3100,400,*,UP,NDIF ++S 3600,2400,3600,2700,200,*,DOWN,POLY ++S 2400,3700,2800,3700,200,*,RIGHT,POLY ++S 2800,3700,2800,4500,200,*,UP,POLY ++S 2400,2300,2400,2700,200,*,DOWN,POLY ++S 3600,2700,3600,3300,200,2b,DOWN,NTRANS ++S 2400,2700,2400,3300,200,2a,DOWN,NTRANS ++S 1800,900,1800,3100,600,*,UP,NDIF ++S 1600,4400,1600,5500,200,*,DOWN,POLY ++S 1200,4400,1600,4400,200,*,RIGHT,POLY ++S 1200,3300,1200,4400,200,*,UP,POLY ++S 1200,1900,1200,2300,200,*,DOWN,POLY ++S 1200,2300,1200,3300,200,2z,DOWN,NTRANS ++S 800,2500,800,3100,400,*,DOWN,NDIF ++S 1000,1900,2100,1900,400,*,RIGHT,ALU1 ++S 1000,2000,2100,2000,400,*,RIGHT,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 3000,4000,4100,4000,400,*,RIGHT,ALU1 ++S 3000,3900,4100,3900,400,*,RIGHT,ALU1 ++S 3000,4000,3000,6100,400,*,DOWN,ALU1 ++S 1000,2000,1000,7100,400,*,DOWN,ALU1 ++S 2000,3000,2000,8000,400,*,UP,ALU1 ++S 4000,5000,4000,7000,400,b,UP,CALU1 ++S 3000,4000,3000,6000,400,a,UP,CALU1 ++S 2000,8000,6300,8000,400,*,LEFT,ALU1 ++S 4000,4800,4000,7100,400,*,UP,ALU1 ++S 1000,5700,1000,6500,600,*,UP,PDIF ++S 1200,5700,1200,7300,400,*,UP,PDIF ++S 1600,5500,1600,7500,200,1z,UP,PTRANS ++S 1600,7500,1600,7900,200,*,DOWN,POLY ++S 2400,5700,2400,9200,1000,n2,DOWN,PDIF ++S 3200,5500,3200,9400,200,1a,UP,PTRANS ++S 3600,5700,3600,9200,600,n1,DOWN,PDIF ++S 4000,5500,4000,9400,200,1b,UP,PTRANS ++S 4400,5700,4400,9200,600,n2,DOWN,PDIF ++S 4800,5500,4800,9400,200,1c,UP,PTRANS ++S 5600,5500,5600,9400,200,1d,UP,PTRANS ++S 5200,5700,5200,9200,600,n2,DOWN,PDIF ++S 6000,5700,6000,9200,400,n3,UP,PDIF ++S 5000,4000,5000,6000,400,c,UP,CALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 5000,7000,5000,7000,400,d,LEFT,CALU1 ++S 6000,4000,6000,4000,400,c,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 3000,7000,3000,7000,400,b,LEFT,CALU1 ++V 1000,9300,CONT_BODY_N,* ++V 6000,700,CONT_BODY_P,* ++V 5000,700,CONT_BODY_P,* ++V 6400,3000,CONT_DIF_N,* ++V 5000,4000,CONT_POLY,* ++V 5200,3000,CONT_DIF_N,zn ++V 4000,1800,CONT_DIF_N,* ++V 3000,3000,CONT_DIF_N,zn ++V 1800,1000,CONT_DIF_N,* ++V 600,3000,CONT_DIF_N,* ++V 2400,9000,CONT_DIF_P,* ++V 3000,4600,CONT_POLY,* ++V 1000,6700,CONT_DIF_P,* ++V 2000,4600,CONT_POLY,zn ++V 6200,8000,CONT_DIF_P,zn ++V 4000,4900,CONT_POLY,* ++V 1000,5800,CONT_DIF_P,* ++V 6000,4900,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/or4_x1.vbe b/alliance/src/cells/src/msxlib/or4_x1.vbe +new file mode 100644 +index 0000000..7c861e3 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/or4_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY or4_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_c : NATURAL := 5; ++ CONSTANT cin_a : NATURAL := 5; ++ CONSTANT cin_d : NATURAL := 5; ++ CONSTANT rdown_b_z : NATURAL := 2400; ++ CONSTANT rdown_c_z : NATURAL := 2400; ++ CONSTANT rdown_a_z : NATURAL := 2400; ++ CONSTANT rdown_d_z : NATURAL := 2400; ++ CONSTANT rup_b_z : NATURAL := 2990; ++ CONSTANT rup_c_z : NATURAL := 2970; ++ CONSTANT rup_a_z : NATURAL := 3020; ++ CONSTANT rup_d_z : NATURAL := 2970; ++ CONSTANT tphh_d_z : NATURAL := 103; ++ CONSTANT tphh_c_z : NATURAL := 127; ++ CONSTANT tphh_b_z : NATURAL := 145; ++ CONSTANT tpll_a_z : NATURAL := 191; ++ CONSTANT tphh_a_z : NATURAL := 157; ++ CONSTANT tpll_b_z : NATURAL := 181; ++ CONSTANT tpll_d_z : NATURAL := 125; ++ CONSTANT tpll_c_z : NATURAL := 159; ++ CONSTANT transistors : NATURAL := 10 ++); ++PORT ( ++ b : in BIT; ++ c : in BIT; ++ a : in BIT; ++ d : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END or4_x1; ++ ++ARCHITECTURE behaviour_data_flow OF or4_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on or4_x1" ++ SEVERITY WARNING; ++ z <= (((b or c) or a) or d) after 1200 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/powmid_x0.ap b/alliance/src/cells/src/msxlib/powmid_x0.ap +new file mode 100644 +index 0000000..ce2c8fd +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/powmid_x0.ap +@@ -0,0 +1,23 @@ ++V ALLIANCE : 6 ++H powmid_x0,P, 4/ 1/2008,100 ++A 0,0,7000,10000 ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,5000,7000,5000,10000,powmid_x0,LEFT,TALU8 ++S 1000,600,6000,600,1200,vss,RIGHT,CALU2 ++S 900,500,6100,500,1400,*,RIGHT,ALU2 ++S 0,500,7000,500,1400,*,RIGHT,ALU1 ++S 900,9500,6100,9500,1400,*,RIGHT,ALU2 ++S 1000,9400,6000,9400,1200,vdd,RIGHT,CALU2 ++S 0,9500,7000,9500,1400,*,RIGHT,ALU1 ++S 5000,0,5000,10000,2400,vss,DOWN,CALU3 ++S 2000,0,2000,10000,2400,vdd,DOWN,CALU3 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 5000,0,5000,10000,2400,*,UP,ALU3 ++S 2000,0,2000,10000,2400,*,UP,ALU3 ++B 2000,500,2300,1200,CONT_VIA,* ++B 5000,500,2300,1200,CONT_VIA2,* ++B 5000,9500,2300,1200,CONT_VIA,* ++B 2000,9500,2300,1200,CONT_VIA2,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/powmid_x0.vbe b/alliance/src/cells/src/msxlib/powmid_x0.vbe +new file mode 100644 +index 0000000..3d677ef +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/powmid_x0.vbe +@@ -0,0 +1,18 @@ ++ENTITY powmid_x0 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END powmid_x0; ++ ++ARCHITECTURE behaviour_data_flow OF powmid_x0 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on powmid_x0" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/rowend_x0.ap b/alliance/src/cells/src/msxlib/rowend_x0.ap +new file mode 100644 +index 0000000..8ebdfe4 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/rowend_x0.ap +@@ -0,0 +1,9 @@ ++V ALLIANCE : 6 ++H rowend_x0,P,17/ 6/2004,100 ++A 0,0,1000,10000 ++S 0,9400,1000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,1000,600,1200,vss,RIGHT,CALU1 ++S 0,7600,1000,7600,5600,*,LEFT,NWELL ++S 0,2200,1000,2200,5200,*,LEFT,PWELL ++S 0,5000,1000,5000,10000,rowend_x0,LEFT,TALU8 ++EOF +diff --git a/alliance/src/cells/src/msxlib/rowend_x0.vbe b/alliance/src/cells/src/msxlib/rowend_x0.vbe +new file mode 100644 +index 0000000..bb2015f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/rowend_x0.vbe +@@ -0,0 +1,18 @@ ++ENTITY rowend_x0 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 1000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END rowend_x0; ++ ++ARCHITECTURE behaviour_data_flow OF rowend_x0 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on rowend_x0" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/sff1_x4.ap b/alliance/src/cells/src/msxlib/sff1_x4.ap +new file mode 100644 +index 0000000..7f03573 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/sff1_x4.ap +@@ -0,0 +1,234 @@ ++V ALLIANCE : 6 ++H sff1_x4,P,14/ 8/2014,100 ++A 0,0,18000,10000 ++R 16000,4000,ref_ref,q_40 ++R 2000,8000,ref_ref,ck_80 ++R 2000,7000,ref_ref,ck_70 ++R 2000,6000,ref_ref,ck_60 ++R 2000,5000,ref_ref,ck_50 ++R 2000,4000,ref_ref,ck_40 ++R 2000,3000,ref_ref,ck_30 ++R 2000,2000,ref_ref,ck_20 ++R 5000,7000,ref_ref,i_70 ++R 5000,6000,ref_ref,i_60 ++R 5000,5000,ref_ref,i_50 ++R 5000,4000,ref_ref,i_40 ++R 5000,3000,ref_ref,i_30 ++R 6000,2000,ref_ref,i_20 ++R 16000,8000,ref_ref,q_80 ++R 16000,7000,ref_ref,q_70 ++R 16000,6000,ref_ref,q_60 ++R 16000,5000,ref_ref,q_50 ++R 16000,3000,ref_ref,q_30 ++R 16000,2000,ref_ref,q_20 ++R 6000,8000,ref_ref,i_80 ++R 15000,5000,ref_ref,q_50 ++R 15000,3000,ref_ref,q_30 ++S 9600,7500,9600,9400,200,*,DOWN,PTRANS ++S 10000,7700,10000,9200,600,*,DOWN,PDIF ++S 12800,700,13600,700,600,*,RIGHT,PTIE ++S 6800,700,7600,700,600,*,RIGHT,PTIE ++S 3200,700,4000,700,600,*,RIGHT,PTIE ++S 14600,4000,16800,4000,600,sff_s,RIGHT,POLY ++S 13800,4000,14900,4000,400,*,RIGHT,ALU1 ++S 14400,4800,14400,7200,200,*,UP,POLY ++S 4100,2000,4100,8000,400,*,DOWN,ALU1 ++S 5100,8000,6100,8000,400,*,RIGHT,ALU1 ++S 5100,2000,6100,2000,400,*,RIGHT,ALU1 ++S 5100,2000,5100,8000,400,*,DOWN,ALU1 ++S 600,6900,600,8100,400,*,DOWN,ALU1 ++S 3000,1900,3000,7100,400,*,DOWN,ALU1 ++S 9900,7000,11400,7000,400,*,LEFT,ALU1 ++S 11400,1900,11400,8100,400,y,DOWN,ALU1 ++S 14700,3000,16200,3000,400,*,RIGHT,ALU1 ++S 14700,5000,16200,5000,400,*,RIGHT,ALU1 ++S 15000,900,15000,2100,400,*,DOWN,ALU1 ++S 17400,900,17400,2100,400,*,DOWN,ALU1 ++S 15000,5900,15000,9100,400,*,DOWN,ALU1 ++S 17400,5900,17400,9100,400,*,DOWN,ALU1 ++S 9000,3000,10500,3000,400,*,LEFT,ALU1 ++S 7700,2000,9000,2000,400,*,RIGHT,ALU1 ++S 9900,2000,11400,2000,400,*,RIGHT,ALU1 ++S 12600,4000,12600,7000,400,*,DOWN,ALU1 ++S 9000,6000,10500,6000,400,*,RIGHT,ALU1 ++S 0,9400,18000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,18000,600,1200,vss,RIGHT,CALU1 ++S 13200,2800,13200,5000,200,*,DOWN,POLY ++S 15600,2800,15600,5200,200,*,DOWN,POLY ++S 14400,3000,15000,3000,600,*,RIGHT,POLY ++S 14400,5000,15000,5000,600,*,RIGHT,POLY ++S 16800,2800,16800,5200,200,*,DOWN,POLY ++S 12000,2800,12000,4000,200,*,DOWN,POLY ++S 10800,1800,10800,3000,200,*,UP,POLY ++S 10800,6000,10800,7200,200,*,DOWN,POLY ++S 12000,5000,12000,7200,200,*,DOWN,POLY ++S 8400,2800,8400,4000,200,*,DOWN,POLY ++S 11200,7700,11200,9200,600,*,DOWN,PDIF ++S 10800,7500,10800,9400,200,*,UP,PTRANS ++S 16200,5700,16200,9200,600,*,DOWN,PDIF ++S 16800,5500,16800,9400,200,*,DOWN,PTRANS ++S 17400,5700,17400,9200,600,*,DOWN,PDIF ++S 15600,5500,15600,9400,200,*,DOWN,PTRANS ++S 15000,5700,15000,9200,600,*,DOWN,PDIF ++S 6000,7500,6000,9400,200,*,DOWN,PTRANS ++S 10800,600,10800,1500,200,*,UP,NTRANS ++S 11400,800,11400,1300,600,*,DOWN,NDIF ++S 11400,800,11400,2300,600,*,DOWN,NDIF ++S 16200,800,16200,2300,600,*,DOWN,NDIF ++S 16800,600,16800,2500,200,*,UP,NTRANS ++S 17400,800,17400,2300,600,*,DOWN,NDIF ++S 15600,600,15600,2500,200,*,UP,NTRANS ++S 9000,800,9000,2300,600,*,DOWN,NDIF ++S 0,5000,18000,5000,10000,sff1_x4,RIGHT,TALU8 ++S 0,2200,18000,2200,5200,*,RIGHT,PWELL ++S 0,7600,18000,7600,5600,*,RIGHT,NWELL ++S 1200,6600,1200,8600,200,*,DOWN,PTRANS ++S 600,6800,600,8400,600,*,UP,PDIF ++S 1800,6800,1800,9100,600,*,UP,PDIF ++S 7000,2900,7000,5100,400,*,DOWN,ALU1 ++S 1200,6000,1800,6000,600,*,RIGHT,POLY ++S 12000,4000,12600,4000,600,*,RIGHT,POLY ++S 7800,4000,8400,4000,600,*,RIGHT,POLY ++S 10200,6000,10800,6000,600,*,RIGHT,POLY ++S 12600,7000,13200,7000,600,*,RIGHT,POLY ++S 9600,7000,10200,7000,600,*,RIGHT,POLY ++S 10200,3000,10800,3000,600,*,RIGHT,POLY ++S 9600,2000,10200,2000,600,*,RIGHT,POLY ++S 4000,6000,6000,6000,200,*,RIGHT,POLY ++S 3000,1700,3000,2300,600,*,DOWN,NDIF ++S 2400,1500,2400,2500,200,*,UP,NTRANS ++S 600,1900,600,7100,400,*,DOWN,ALU1 ++S 2400,2800,2400,6200,200,*,DOWN,POLY ++S 1200,3000,1800,3000,600,*,RIGHT,POLY ++S 600,5000,13200,5000,200,nckr,RIGHT,POLY ++S 3200,4000,12000,4000,200,ckr,RIGHT,POLY ++S 6900,6000,8000,6000,400,*,RIGHT,ALU1 ++S 7800,6800,7800,8400,600,*,UP,PDIF ++S 8400,5000,8400,6200,200,*,DOWN,POLY ++S 8000,3900,8000,6000,400,*,UP,ALU1 ++S 9000,6700,9000,9200,600,*,UP,PDIF ++S 6000,6200,6000,7200,200,*,UP,POLY ++S 6000,2900,6000,6100,400,u,DOWN,ALU1 ++S 7700,7000,9000,7000,400,*,RIGHT,ALU1 ++S 13800,2000,13800,8000,400,*,DOWN,ALU1 ++S 9000,2000,9000,7000,400,sff_m,DOWN,ALU1 ++S 6600,6800,6600,9200,600,*,UP,PDIF ++S 7200,6600,7200,8600,200,*,DOWN,PTRANS ++S 8400,1500,8400,2500,200,*,UP,NTRANS ++S 12000,1500,12000,2500,200,*,UP,NTRANS ++S 12000,7500,12000,9400,200,*,DOWN,PTRANS ++S 14400,7500,14400,9400,200,*,DOWN,PTRANS ++S 13200,1500,13200,2500,200,*,UP,NTRANS ++S 12600,1700,12600,2300,600,*,DOWN,NDIF ++S 12500,2000,13800,2000,400,*,RIGHT,ALU1 ++S 12500,8000,13800,8000,400,*,RIGHT,ALU1 ++S 16000,2000,16000,8000,400,q,DOWN,CALU1 ++S 2000,2000,2000,8000,400,ck,DOWN,CALU1 ++S 2000,1900,2000,8100,400,*,DOWN,ALU1 ++S 1500,6000,2000,6000,400,*,RIGHT,ALU1 ++S 1500,3000,2000,3000,400,*,RIGHT,ALU1 ++S 5000,3000,5000,7000,400,i,DOWN,CALU1 ++S 6000,8000,6000,8000,400,i,LEFT,CALU1 ++S 6000,2000,6000,2000,400,i,LEFT,CALU1 ++S 16000,1900,16000,8100,400,*,DOWN,ALU1 ++S 5000,2900,5000,7100,400,*,DOWN,ALU1 ++S 4100,8000,4300,8000,400,*,RIGHT,ALU1 ++S 4100,2000,4300,2000,400,*,RIGHT,ALU1 ++S 3900,6000,4100,6000,400,*,RIGHT,ALU1 ++S 3100,4000,3300,4000,400,*,RIGHT,ALU1 ++S 16100,8000,16300,8000,400,*,RIGHT,ALU1 ++S 16100,7000,16300,7000,400,*,RIGHT,ALU1 ++S 16100,6000,16300,6000,400,*,RIGHT,ALU1 ++S 16100,2000,16300,2000,400,*,RIGHT,ALU1 ++S 12700,7000,12900,7000,400,*,RIGHT,ALU1 ++S 12300,4000,12500,4000,400,*,RIGHT,ALU1 ++S 15000,5000,15000,5000,400,q,LEFT,CALU1 ++S 15000,3000,15000,3000,400,q,LEFT,CALU1 ++S 2400,6600,2400,8600,200,*,DOWN,PTRANS ++S 3000,6800,3000,8400,600,*,UP,PDIF ++S 8400,6600,8400,8600,200,*,DOWN,PTRANS ++S 14400,1500,14400,2500,200,*,UP,NTRANS ++S 15000,800,15000,2300,600,*,DOWN,NDIF ++S 13800,1700,13800,2300,600,*,DOWN,NDIF ++S 9600,600,9600,1500,200,*,UP,NTRANS ++S 10200,800,10200,1300,600,*,DOWN,NDIF ++S 1800,1000,1800,2300,600,*,DOWN,NDIF ++S 1200,1500,1200,2500,200,*,UP,NTRANS ++S 600,1700,600,2300,600,*,DOWN,NDIF ++S 4800,7500,4800,9400,200,*,DOWN,PTRANS ++S 5400,7700,5400,9200,600,*,UP,PDIF ++S 4200,7700,4200,9200,600,*,UP,PDIF ++S 13200,7500,13200,9400,200,*,DOWN,PTRANS ++S 12600,7700,12600,9200,600,*,DOWN,PDIF ++S 13800,7700,13800,9200,600,*,UP,PDIF ++S 7200,1500,7200,2500,200,*,UP,NTRANS ++S 7800,1700,7800,2300,600,*,DOWN,NDIF ++S 6600,1700,6600,2300,600,*,DOWN,NDIF ++S 6000,1500,6000,2500,200,*,UP,NTRANS ++S 5400,900,5400,2300,600,*,DOWN,NDIF ++S 4800,1500,4800,2500,200,*,UP,NTRANS ++S 4200,1700,4200,2300,600,*,DOWN,NDIF ++V 13800,700,CONT_BODY_P,* ++V 12600,700,CONT_BODY_P,* ++V 7800,700,CONT_BODY_P,* ++V 6600,700,CONT_BODY_P,* ++V 4200,700,CONT_BODY_P,* ++V 3000,700,CONT_BODY_P,* ++V 14800,4000,CONT_POLY,* ++V 600,8000,CONT_DIF_P,* ++V 3000,7000,CONT_DIF_P,* ++V 10000,7000,CONT_POLY,* ++V 14800,5000,CONT_POLY,* ++V 14800,3000,CONT_POLY,* ++V 10400,3000,CONT_POLY,* ++V 12400,4000,CONT_POLY,* ++V 10400,6000,CONT_POLY,* ++V 8000,4000,CONT_POLY,* ++V 10000,2000,CONT_POLY,* ++V 12800,7000,CONT_POLY,* ++V 12600,8000,CONT_DIF_P,* ++V 10200,9000,CONT_DIF_P,* ++V 11400,8000,CONT_DIF_P,* ++V 17400,6000,CONT_DIF_P,* ++V 16200,6000,CONT_DIF_P,* ++V 15000,6000,CONT_DIF_P,* ++V 15000,7000,CONT_DIF_P,* ++V 15000,8000,CONT_DIF_P,* ++V 17400,9000,CONT_DIF_P,* ++V 15000,9000,CONT_DIF_P,* ++V 17400,8000,CONT_DIF_P,* ++V 17400,7000,CONT_DIF_P,* ++V 5400,9000,CONT_DIF_P,* ++V 12600,2000,CONT_DIF_N,* ++V 10200,1000,CONT_DIF_N,* ++V 7800,2000,CONT_DIF_N,* ++V 11400,2000,CONT_DIF_N,* ++V 17400,1000,CONT_DIF_N,* ++V 15000,1000,CONT_DIF_N,* ++V 17400,2000,CONT_DIF_N,* ++V 15000,2000,CONT_DIF_N,* ++V 16200,2000,CONT_DIF_N,* ++V 5400,1000,CONT_DIF_N,* ++V 4200,2000,CONT_DIF_N,* ++V 1800,1000,CONT_DIF_N,* ++V 600,7000,CONT_DIF_P,* ++V 1800,9000,CONT_DIF_P,* ++V 1600,6000,CONT_POLY,* ++V 600,5000,CONT_POLY,* ++V 3200,4000,CONT_POLY,* ++V 4000,6000,CONT_POLY,* ++V 5000,7000,CONT_POLY,* ++V 5000,3000,CONT_POLY,* ++V 6000,3000,CONT_POLY,* ++V 6000,6000,CONT_POLY,* ++V 7000,5000,CONT_POLY,* ++V 7000,3000,CONT_POLY,* ++V 600,2000,CONT_DIF_N,* ++V 3000,2000,CONT_DIF_N,* ++V 1600,3000,CONT_POLY,* ++V 16200,8000,CONT_DIF_P,* ++V 16200,7000,CONT_DIF_P,* ++V 4200,8000,CONT_DIF_P,* ++V 7000,6000,CONT_POLY,* ++V 7800,7000,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/sff1_x4.vbe b/alliance/src/cells/src/msxlib/sff1_x4.vbe +new file mode 100644 +index 0000000..4756bfd +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/sff1_x4.vbe +@@ -0,0 +1,39 @@ ++ENTITY sff1_x4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4500; ++ CONSTANT cin_ck : NATURAL := 8; ++ CONSTANT cin_i : NATURAL := 8; ++ CONSTANT rdown_ck_q : NATURAL := 800; ++ CONSTANT rup_ck_q : NATURAL := 890; ++ CONSTANT taf_ck_q : NATURAL := 500; ++ CONSTANT tar_ck_q : NATURAL := 500; ++ CONSTANT thf_i_ck : NATURAL := 0; ++ CONSTANT thr_i_ck : NATURAL := 0; ++ CONSTANT tsf_i_ck : NATURAL := 585; ++ CONSTANT tsr_i_ck : NATURAL := 476; ++ CONSTANT transistors : NATURAL := 26 ++); ++PORT ( ++ ck : in BIT; ++ i : in BIT; ++ q : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END sff1_x4; ++ ++ARCHITECTURE VBE OF sff1_x4 IS ++ SIGNAL sff_m : REG_BIT REGISTER; ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on sff1_x4" ++ SEVERITY WARNING; ++ ++ label0 : BLOCK ((ck and not (ck'STABLE)) = '1') ++ BEGIN ++ sff_m <= GUARDED i; ++ END BLOCK label0; ++ ++ q <= sff_m after 1700 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/sff2_x4.ap b/alliance/src/cells/src/msxlib/sff2_x4.ap +new file mode 100644 +index 0000000..1cc235b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/sff2_x4.ap +@@ -0,0 +1,276 @@ ++V ALLIANCE : 6 ++H sff2_x4,P,14/ 8/2014,100 ++A 0,0,24000,10000 ++R 9000,2000,ref_ref,ck_20 ++R 9000,7000,ref_ref,ck_70 ++R 9000,6000,ref_ref,ck_60 ++R 9000,5000,ref_ref,ck_50 ++R 9000,4000,ref_ref,ck_40 ++R 9000,3000,ref_ref,ck_30 ++R 2000,3000,ref_ref,i0_30 ++R 2000,4000,ref_ref,i0_40 ++R 2000,5000,ref_ref,i0_50 ++R 2000,7000,ref_ref,i0_70 ++R 2000,6000,ref_ref,i0_60 ++R 2000,8000,ref_ref,i0_80 ++R 6000,2000,ref_ref,i1_20 ++R 6000,3000,ref_ref,i1_30 ++R 6000,4000,ref_ref,i1_40 ++R 6000,5000,ref_ref,i1_50 ++R 6000,6000,ref_ref,i1_60 ++R 6000,7000,ref_ref,i1_70 ++R 3000,5000,ref_ref,cmd_50 ++R 3000,6000,ref_ref,cmd_60 ++R 3000,7000,ref_ref,cmd_70 ++R 3000,8000,ref_ref,cmd_80 ++R 22000,2000,ref_ref,q_20 ++R 22000,3000,ref_ref,q_30 ++R 22000,5000,ref_ref,q_50 ++R 22000,6000,ref_ref,q_60 ++R 22000,7000,ref_ref,q_70 ++R 22000,8000,ref_ref,q_80 ++R 22000,4000,ref_ref,q_40 ++R 21000,5000,ref_ref,q_50 ++R 21000,3000,ref_ref,q_30 ++S 3200,9300,4800,9300,600,*,RIGHT,NTIE ++S 18800,700,19600,700,600,*,RIGHT,PTIE ++S 12800,700,13600,700,600,*,RIGHT,PTIE ++S 3200,700,4800,700,600,*,RIGHT,PTIE ++S 22000,1900,22000,8100,400,*,DOWN,ALU1 ++S 20400,1500,20400,2400,200,*,UP,NTRANS ++S 19200,1500,19200,2500,200,*,UP,NTRANS ++S 20400,7500,20400,9400,200,*,DOWN,PTRANS ++S 19200,7600,19200,9400,200,*,DOWN,PTRANS ++S 18000,7500,18000,9400,200,*,DOWN,PTRANS ++S 18000,1500,18000,2500,200,*,UP,NTRANS ++S 15600,600,15600,1400,200,*,UP,NTRANS ++S 14400,1500,14400,2500,200,*,UP,NTRANS ++S 15600,7600,15600,9400,200,*,DOWN,PTRANS ++S 14400,6500,14400,8500,200,*,DOWN,PTRANS ++S 13200,6600,13200,8600,200,*,DOWN,PTRANS ++S 13200,1500,13200,2400,200,*,UP,NTRANS ++S 0,5000,24000,5000,10000,sff2_x4,RIGHT,TALU8 ++S 0,2200,24000,2200,5200,*,RIGHT,PWELL ++S 0,7600,24000,7600,5600,*,RIGHT,NWELL ++S 1800,900,1800,2200,600,*,UP,NDIF ++S 600,1700,600,2300,600,*,UP,NDIF ++S 1200,1500,1200,2500,200,*,UP,NTRANS ++S 2400,1500,2400,2400,200,*,UP,NTRANS ++S 5000,1500,5000,2400,200,*,UP,NTRANS ++S 3800,1700,3800,2200,600,*,UP,NDIF ++S 3200,1500,3200,2400,200,*,UP,NTRANS ++S 6400,900,6400,2200,600,*,UP,NDIF ++S 5800,1500,5800,2400,200,*,UP,NTRANS ++S 4200,1700,4200,3100,1000,*,DOWN,NDIF ++S 9600,1500,9600,2500,200,*,UP,NTRANS ++S 9000,900,9000,2200,600,*,DOWN,NDIF ++S 7800,1600,7800,2200,600,*,DOWN,NDIF ++S 8400,1400,8400,2400,200,*,UP,NTRANS ++S 10200,1700,10200,2300,600,*,DOWN,NDIF ++S 16200,800,16200,1200,600,*,DOWN,NDIF ++S 17400,800,17400,1300,600,*,DOWN,NDIF ++S 16800,600,16800,1500,200,*,UP,NTRANS ++S 23400,800,23400,2300,600,*,DOWN,NDIF ++S 22800,600,22800,2500,200,*,UP,NTRANS ++S 22200,800,22200,2300,600,*,DOWN,NDIF ++S 21000,800,21000,2200,600,*,DOWN,NDIF ++S 17400,800,17400,2300,600,*,DOWN,NDIF ++S 18600,1700,18600,2300,600,*,DOWN,NDIF ++S 21600,600,21600,2500,200,*,UP,NTRANS ++S 19800,1700,19800,2200,600,*,DOWN,NDIF ++S 11400,900,11400,2200,600,*,DOWN,NDIF ++S 12000,1500,12000,2400,200,*,UP,NTRANS ++S 12600,1700,12600,2200,600,*,DOWN,NDIF ++S 15000,800,15000,2300,600,*,DOWN,NDIF ++S 13800,1700,13800,2200,600,*,DOWN,NDIF ++S 2400,6600,2400,8500,200,*,DOWN,PTRANS ++S 1800,6800,1800,9100,600,*,DOWN,PDIF ++S 600,6700,600,8300,600,*,DOWN,PDIF ++S 1200,6500,1200,8500,200,*,DOWN,PTRANS ++S 5800,6600,5800,8500,200,*,DOWN,PTRANS ++S 4000,6800,4000,8300,1000,*,DOWN,PDIF ++S 3200,6600,3200,8500,200,*,DOWN,PTRANS ++S 6400,6800,6400,9100,600,*,DOWN,PDIF ++S 5000,6600,5000,8500,200,*,DOWN,PTRANS ++S 10200,6700,10200,8300,600,*,UP,PDIF ++S 9600,6500,9600,8500,200,*,DOWN,PTRANS ++S 8400,6600,8400,8600,200,*,DOWN,PTRANS ++S 7800,6800,7800,8400,600,*,UP,PDIF ++S 16000,7800,16000,9200,600,*,DOWN,PDIF ++S 18600,7800,18600,9200,600,*,DOWN,PDIF ++S 17200,7700,17200,9200,600,*,DOWN,PDIF ++S 9000,6800,9000,9100,600,*,UP,PDIF ++S 23400,5700,23400,9200,600,*,DOWN,PDIF ++S 22800,5500,22800,9400,200,*,DOWN,PTRANS ++S 22200,5700,22200,9200,600,*,DOWN,PDIF ++S 16800,7500,16800,9400,200,*,UP,PTRANS ++S 19800,7800,19800,9200,600,*,UP,PDIF ++S 12000,7600,12000,9400,200,*,DOWN,PTRANS ++S 21000,5700,21000,9200,600,*,DOWN,PDIF ++S 21600,5500,21600,9400,200,*,DOWN,PTRANS ++S 15000,6700,15000,9200,600,*,UP,PDIF ++S 13800,6800,13800,8400,600,*,UP,PDIF ++S 12600,6800,12600,9200,600,*,UP,PDIF ++S 11400,7800,11400,9200,600,*,UP,PDIF ++S 15600,2000,16200,2000,600,*,RIGHT,POLY ++S 16800,1800,16800,3000,200,*,UP,POLY ++S 1200,5000,5000,5000,200,*,RIGHT,POLY ++S 1200,2800,1200,6200,200,*,DOWN,POLY ++S 1800,3000,2400,3000,600,*,RIGHT,POLY ++S 1800,6000,2400,6000,600,*,RIGHT,POLY ++S 5000,2800,5000,5000,200,*,DOWN,POLY ++S 3200,2800,3200,4000,200,*,DOWN,POLY ++S 3200,5000,3200,6200,200,*,DOWN,POLY ++S 8400,6000,9000,6000,600,*,RIGHT,POLY ++S 10200,4000,18000,4000,200,ckr,RIGHT,POLY ++S 7800,5000,19200,5000,200,nckr,RIGHT,POLY ++S 20400,5000,21000,5000,600,*,RIGHT,POLY ++S 20400,3000,21000,3000,600,*,RIGHT,POLY ++S 21600,2800,21600,5200,200,*,DOWN,POLY ++S 19200,2800,19200,5000,200,*,DOWN,POLY ++S 9600,2800,9600,6200,200,*,DOWN,POLY ++S 8400,3000,9000,3000,600,*,RIGHT,POLY ++S 13800,4000,14400,4000,600,*,RIGHT,POLY ++S 18000,4000,18600,4000,600,*,RIGHT,POLY ++S 14400,2800,14400,4000,200,*,DOWN,POLY ++S 18000,5000,18000,7200,200,*,DOWN,POLY ++S 16800,6000,16800,7200,200,*,DOWN,POLY ++S 18000,2800,18000,4000,200,*,DOWN,POLY ++S 22800,2800,22800,5200,200,*,DOWN,POLY ++S 14400,5000,14400,6200,200,*,DOWN,POLY ++S 16200,3000,16800,3000,600,*,RIGHT,POLY ++S 15600,7000,16200,7000,600,*,RIGHT,POLY ++S 18600,7000,19200,7000,600,*,RIGHT,POLY ++S 16200,6000,16800,6000,600,*,RIGHT,POLY ++S 0,600,24000,600,1200,vss,RIGHT,CALU1 ++S 600,2000,5000,2000,400,*,RIGHT,ALU1 ++S 600,1900,600,7100,400,*,DOWN,ALU1 ++S 9000,1900,9000,7100,400,*,DOWN,ALU1 ++S 10200,1900,10200,7100,400,*,DOWN,ALU1 ++S 5000,2000,5000,6100,400,*,DOWN,ALU1 ++S 3000,2000,3000,4100,400,*,UP,ALU1 ++S 17400,1900,17400,8100,400,y,DOWN,ALU1 ++S 6000,1900,6000,7100,400,*,DOWN,ALU1 ++S 7800,1900,7800,7100,400,*,DOWN,ALU1 ++S 15900,2000,17400,2000,400,*,RIGHT,ALU1 ++S 13700,2000,15000,2000,400,*,RIGHT,ALU1 ++S 18500,2000,19800,2000,400,*,RIGHT,ALU1 ++S 23400,900,23400,2100,400,*,DOWN,ALU1 ++S 21000,900,21000,2100,400,*,DOWN,ALU1 ++S 0,9400,24000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,2900,2000,8100,400,*,DOWN,ALU1 ++S 4000,8000,12000,8000,400,*,RIGHT,ALU1 ++S 3000,4900,3000,8100,400,*,DOWN,ALU1 ++S 4000,2900,4000,8000,400,*,DOWN,ALU1 ++S 15900,7000,17400,7000,400,*,LEFT,ALU1 ++S 23400,5900,23400,9100,400,*,DOWN,ALU1 ++S 21000,5900,21000,9100,400,*,DOWN,ALU1 ++S 20700,5000,22200,5000,400,*,RIGHT,ALU1 ++S 20700,3000,22200,3000,400,*,RIGHT,ALU1 ++S 15000,6000,16500,6000,400,*,RIGHT,ALU1 ++S 18600,4000,18600,7000,400,*,DOWN,ALU1 ++S 15000,3000,16500,3000,400,*,LEFT,ALU1 ++S 18500,8000,19800,8000,400,*,RIGHT,ALU1 ++S 13700,7000,15000,7000,400,*,RIGHT,ALU1 ++S 12000,2900,12000,8000,400,u,DOWN,ALU1 ++S 14000,3900,14000,6000,400,*,UP,ALU1 ++S 12900,6000,14000,6000,400,*,RIGHT,ALU1 ++S 13000,2900,13000,5100,400,*,DOWN,ALU1 ++S 15000,2000,15000,7000,400,sff_m,DOWN,ALU1 ++S 19800,2000,19800,8000,400,sff_s,DOWN,ALU1 ++S 20400,4800,20400,7200,200,*,DOWN,POLY ++S 19800,4000,20900,4000,400,*,RIGHT,ALU1 ++S 20800,4000,22800,4000,600,*,RIGHT,POLY ++S 9000,2000,9000,7000,400,ck,DOWN,CALU1 ++S 2000,3000,2000,8000,400,i0,DOWN,CALU1 ++S 6000,2000,6000,7000,400,i1,DOWN,CALU1 ++S 3000,5000,3000,8000,400,cmd,DOWN,CALU1 ++S 22000,2000,22000,8000,400,q,DOWN,CALU1 ++S 8700,6000,8900,6000,400,*,RIGHT,ALU1 ++S 8700,3000,8900,3000,400,*,RIGHT,ALU1 ++S 7900,5000,8100,5000,400,*,RIGHT,ALU1 ++S 22100,8000,22300,8000,400,*,RIGHT,ALU1 ++S 22100,7000,22300,7000,400,*,RIGHT,ALU1 ++S 22100,6000,22300,6000,400,*,RIGHT,ALU1 ++S 22100,2000,22300,2000,400,*,RIGHT,ALU1 ++S 18700,7000,18900,7000,400,*,RIGHT,ALU1 ++S 18300,4000,18500,4000,400,*,RIGHT,ALU1 ++S 11700,7000,11900,7000,400,*,RIGHT,ALU1 ++S 10300,4000,10500,4000,400,*,RIGHT,ALU1 ++S 21000,5000,21000,5000,400,q,LEFT,CALU1 ++S 21000,3000,21000,3000,400,q,LEFT,CALU1 ++V 5000,9300,CONT_BODY_N,* ++V 3000,9300,CONT_BODY_N,* ++V 19800,700,CONT_BODY_P,* ++V 18600,700,CONT_BODY_P,* ++V 13800,700,CONT_BODY_P,* ++V 12600,700,CONT_BODY_P,* ++V 5000,700,CONT_BODY_P,* ++V 3000,700,CONT_BODY_P,* ++V 8000,5000,CONT_POLY,* ++V 1800,1000,CONT_DIF_N,* ++V 600,2000,CONT_DIF_N,* ++V 6400,1000,CONT_DIF_N,* ++V 18600,2000,CONT_DIF_N,* ++V 10200,2000,CONT_DIF_N,* ++V 9000,1000,CONT_DIF_N,* ++V 7800,2000,CONT_DIF_N,* ++V 22200,2000,CONT_DIF_N,* ++V 21000,2000,CONT_DIF_N,* ++V 23400,2000,CONT_DIF_N,* ++V 21000,1000,CONT_DIF_N,* ++V 23400,1000,CONT_DIF_N,* ++V 17400,2000,CONT_DIF_N,* ++V 13800,2000,CONT_DIF_N,* ++V 16200,1000,CONT_DIF_N,* ++V 11400,1000,CONT_DIF_N,* ++V 4000,3000,CONT_DIF_N,* ++V 1800,9000,CONT_DIF_P,* ++V 600,7000,CONT_DIF_P,* ++V 7800,7000,CONT_DIF_P,* ++V 10200,7000,CONT_DIF_P,* ++V 6400,9000,CONT_DIF_P,* ++V 21000,6000,CONT_DIF_P,* ++V 22200,6000,CONT_DIF_P,* ++V 23400,6000,CONT_DIF_P,* ++V 17400,8000,CONT_DIF_P,* ++V 16200,9000,CONT_DIF_P,* ++V 18600,8000,CONT_DIF_P,* ++V 9000,9000,CONT_DIF_P,* ++V 4000,7000,CONT_DIF_P,* ++V 22200,8000,CONT_DIF_P,* ++V 11400,9000,CONT_DIF_P,* ++V 23400,7000,CONT_DIF_P,* ++V 23400,8000,CONT_DIF_P,* ++V 21000,9000,CONT_DIF_P,* ++V 23400,9000,CONT_DIF_P,* ++V 21000,8000,CONT_DIF_P,* ++V 21000,7000,CONT_DIF_P,* ++V 13800,7000,CONT_DIF_P,* ++V 22200,7000,CONT_DIF_P,* ++V 16000,2000,CONT_POLY,* ++V 2000,3000,CONT_POLY,* ++V 2000,6000,CONT_POLY,* ++V 5000,6000,CONT_POLY,* ++V 3000,5000,CONT_POLY,* ++V 3000,4000,CONT_POLY,* ++V 16000,7000,CONT_POLY,* ++V 8800,3000,CONT_POLY,* ++V 8800,6000,CONT_POLY,* ++V 6000,3000,CONT_POLY,* ++V 10400,4000,CONT_POLY,* ++V 11800,7000,CONT_POLY,* ++V 18800,7000,CONT_POLY,* ++V 14000,4000,CONT_POLY,* ++V 16400,6000,CONT_POLY,* ++V 18400,4000,CONT_POLY,* ++V 16400,3000,CONT_POLY,* ++V 20800,3000,CONT_POLY,* ++V 20800,5000,CONT_POLY,* ++V 13000,6000,CONT_POLY,* ++V 13000,3000,CONT_POLY,* ++V 13000,5000,CONT_POLY,* ++V 12000,3000,CONT_POLY,* ++V 6000,6000,CONT_POLY,* ++V 20800,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/sff2_x4.vbe b/alliance/src/cells/src/msxlib/sff2_x4.vbe +new file mode 100644 +index 0000000..59eaa64 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/sff2_x4.vbe +@@ -0,0 +1,51 @@ ++ENTITY sff2_x4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT cin_ck : NATURAL := 8; ++ CONSTANT cin_cmd : NATURAL := 16; ++ CONSTANT cin_i0 : NATURAL := 8; ++ CONSTANT cin_i1 : NATURAL := 7; ++ CONSTANT rdown_ck_q : NATURAL := 800; ++ CONSTANT rup_ck_q : NATURAL := 890; ++ CONSTANT taf_ck_q : NATURAL := 500; ++ CONSTANT tar_ck_q : NATURAL := 500; ++ CONSTANT thf_cmd_ck : NATURAL := 0; ++ CONSTANT thf_i0_ck : NATURAL := 0; ++ CONSTANT thf_i1_ck : NATURAL := 0; ++ CONSTANT thr_cmd_ck : NATURAL := 0; ++ CONSTANT thr_i0_ck : NATURAL := 0; ++ CONSTANT thr_i1_ck : NATURAL := 0; ++ CONSTANT tsf_cmd_ck : NATURAL := 833; ++ CONSTANT tsf_i0_ck : NATURAL := 764; ++ CONSTANT tsf_i1_ck : NATURAL := 764; ++ CONSTANT tsr_cmd_ck : NATURAL := 770; ++ CONSTANT tsr_i0_ck : NATURAL := 666; ++ CONSTANT tsr_i1_ck : NATURAL := 666; ++ CONSTANT transistors : NATURAL := 34 ++); ++PORT ( ++ ck : in BIT; ++ cmd : in BIT; ++ i0 : in BIT; ++ i1 : in BIT; ++ q : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END sff2_x4; ++ ++ARCHITECTURE VBE OF sff2_x4 IS ++ SIGNAL sff_m : REG_BIT REGISTER; ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on sff2_x4" ++ SEVERITY WARNING; ++ ++ label0 : BLOCK ((ck and not (ck'STABLE)) = '1') ++ BEGIN ++ sff_m <= GUARDED ((i1 and cmd) or (i0 and not (cmd))); ++ END BLOCK label0; ++ ++ q <= sff_m after 2000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/sff3_x4.ap b/alliance/src/cells/src/msxlib/sff3_x4.ap +new file mode 100644 +index 0000000..7f7d585 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/sff3_x4.ap +@@ -0,0 +1,358 @@ ++V ALLIANCE : 6 ++H sff3_x4,P,14/ 8/2014,100 ++A 0,0,28000,10000 ++R 9000,5000,ref_ref,i0_50 ++R 8000,6000,ref_ref,i0_60 ++R 8000,4000,ref_ref,i0_40 ++R 7000,6000,ref_ref,cmd0_60 ++R 7000,5000,ref_ref,cmd0_50 ++R 7000,4000,ref_ref,cmd0_40 ++R 5000,5000,ref_ref,i1_50 ++R 3000,5000,ref_ref,i2_50 ++R 1000,7000,ref_ref,cmd1_70 ++R 1000,6000,ref_ref,cmd1_60 ++R 1000,5000,ref_ref,cmd1_50 ++R 1000,4000,ref_ref,cmd1_40 ++R 1000,3000,ref_ref,cmd1_30 ++R 26000,7000,ref_ref,q_70 ++R 26000,8000,ref_ref,q_80 ++R 26000,4000,ref_ref,q_40 ++R 26000,3000,ref_ref,q_30 ++R 26000,5000,ref_ref,q_50 ++R 26000,6000,ref_ref,q_60 ++R 26000,2000,ref_ref,q_20 ++R 12000,4000,ref_ref,ck_40 ++R 12000,3000,ref_ref,ck_30 ++R 12000,5000,ref_ref,ck_50 ++R 12000,6000,ref_ref,ck_60 ++R 12000,7000,ref_ref,ck_70 ++R 12000,2000,ref_ref,ck_20 ++R 25000,5000,ref_ref,q_50 ++R 25000,3000,ref_ref,q_30 ++S 16600,9300,17800,9300,600,*,RIGHT,NTIE ++S 12800,9300,14200,9300,600,*,RIGHT,NTIE ++S 22800,700,23600,700,600,*,RIGHT,PTIE ++S 16800,700,17600,700,600,*,RIGHT,PTIE ++S 12800,700,14200,700,600,*,RIGHT,PTIE ++S 8800,6000,9200,6000,600,*,RIGHT,POLY ++S 8800,4000,9200,4000,600,*,RIGHT,POLY ++S 3600,7000,4000,7000,600,*,RIGHT,POLY ++S 3600,3000,4000,3000,600,*,RIGHT,POLY ++S 26000,1900,26000,8100,400,*,DOWN,ALU1 ++S 8000,4000,8000,4000,400,i0,LEFT,CALU1 ++S 8000,6000,8000,6000,400,i0,LEFT,CALU1 ++S 9000,5000,9000,5000,400,i0,LEFT,CALU1 ++S 7000,4000,7000,6000,400,cmd0,DOWN,CALU1 ++S 5000,5000,5000,5000,400,i1,LEFT,CALU1 ++S 3000,5000,3000,5000,400,i2,LEFT,CALU1 ++S 1000,3000,1000,7000,400,cmd1,DOWN,CALU1 ++S 26000,2000,26000,8000,400,q,DOWN,CALU1 ++S 12000,2000,12000,7000,400,ck,DOWN,CALU1 ++S 7000,5000,7900,5000,400,*,RIGHT,ALU1 ++S 9800,3000,9800,3500,400,*,DOWN,ALU1 ++S 7900,6000,8800,6000,400,*,RIGHT,ALU1 ++S 7900,4000,8800,4000,400,*,RIGHT,ALU1 ++S 7000,3900,7000,6100,400,*,DOWN,ALU1 ++S 8800,3900,8800,6100,400,*,UP,ALU1 ++S 1000,7900,1000,9100,400,*,UP,ALU1 ++S 2100,2000,6700,2000,400,*,RIGHT,ALU1 ++S 7000,3000,7000,7200,200,*,UP,POLY ++S 7000,7200,7200,7200,200,*,RIGHT,POLY ++S 8800,6000,9200,6000,200,*,RIGHT,POLY ++S 9200,6000,9200,7200,200,*,UP,POLY ++S 8000,3800,8000,6600,200,*,DOWN,POLY ++S 9000,4000,9200,4000,200,*,RIGHT,POLY ++S 9200,2200,9200,4000,200,*,DOWN,POLY ++S 8400,2200,8400,3000,200,*,UP,POLY ++S 10400,4000,10400,5200,200,*,DOWN,POLY ++S 8000,7200,8400,7200,200,*,LEFT,POLY ++S 8000,6600,8000,7200,200,*,UP,POLY ++S 6000,2600,6000,7200,200,*,DOWN,POLY ++S 7200,2200,7600,2200,200,*,RIGHT,POLY ++S 6600,3000,6800,3000,200,*,LEFT,POLY ++S 8000,5000,10400,5000,200,*,RIGHT,POLY ++S 7600,2200,7600,3800,200,*,DOWN,POLY ++S 7600,3800,8000,3800,200,*,LEFT,POLY ++S 4000,4000,4000,7200,200,*,DOWN,POLY ++S 1000,5000,1600,5000,600,*,RIGHT,POLY ++S 3600,3000,4000,3000,200,*,RIGHT,POLY ++S 5200,6000,5200,7200,200,*,UP,POLY ++S 5200,2600,5200,4000,200,*,UP,POLY ++S 4000,2600,4000,3000,200,*,DOWN,POLY ++S 2800,2600,2800,7200,200,*,DOWN,POLY ++S 5000,5000,6000,5000,200,*,RIGHT,POLY ++S 4000,4000,5200,4000,200,*,RIGHT,POLY ++S 9800,3100,9800,3300,600,*,DOWN,NDIF ++S 10400,2900,10400,3700,200,*,DOWN,NTRANS ++S 6600,800,6600,2100,600,*,DOWN,NDIF ++S 9200,700,9200,1900,200,*,UP,NTRANS ++S 9800,1100,9800,1900,600,*,UP,NDIF ++S 7200,600,7200,1800,200,*,UP,NTRANS ++S 7800,800,7800,1600,400,*,DOWN,NDIF ++S 8400,700,8400,1900,200,*,UP,NTRANS ++S 4000,1100,4000,2300,200,*,UP,NTRANS ++S 5200,1100,5200,2300,200,*,UP,NTRANS ++S 6000,1100,6000,2300,200,*,UP,NTRANS ++S 2800,1100,2800,2300,200,*,UP,NTRANS ++S 2200,1300,2200,1900,600,*,DOWN,NDIF ++S 3400,1300,3400,2100,400,*,DOWN,NDIF ++S 4600,1300,4600,3100,600,*,UP,NDIF ++S 9800,7800,9800,9200,600,*,UP,PDIF ++S 7800,7800,7800,9200,400,*,UP,PDIF ++S 9200,7600,9200,9400,200,*,UP,PTRANS ++S 6600,7800,6600,9200,400,*,UP,PDIF ++S 9800,5700,9800,6700,600,*,UP,PDIF ++S 10400,5500,10400,6900,200,*,UP,PTRANS ++S 8400,7600,8400,9400,200,*,UP,PTRANS ++S 7200,7600,7200,9400,200,*,UP,PTRANS ++S 6000,7500,6000,9400,200,*,UP,PTRANS ++S 5200,7500,5200,9400,200,*,UP,PTRANS ++S 2200,5800,2200,6800,600,*,UP,PDIF ++S 1600,5600,1600,7000,200,*,UP,PTRANS ++S 1000,5800,1000,7900,600,*,UP,PDIF ++S 4000,7600,4000,9400,200,*,UP,PTRANS ++S 4600,7100,4600,9200,600,*,UP,PDIF ++S 3400,7800,3400,9200,400,*,DOWN,PDIF ++S 2800,7500,2800,9400,200,*,UP,PTRANS ++S 2200,7700,2200,9200,600,*,UP,PDIF ++S 27400,5900,27400,9100,400,*,DOWN,ALU1 ++S 25000,5900,25000,9100,400,*,DOWN,ALU1 ++S 27400,900,27400,2100,400,*,DOWN,ALU1 ++S 25000,900,25000,2100,400,*,DOWN,ALU1 ++S 24400,5000,25000,5000,600,*,RIGHT,POLY ++S 24400,3000,25000,3000,600,*,RIGHT,POLY ++S 25600,2800,25600,5200,200,*,DOWN,POLY ++S 23200,2800,23200,5000,200,*,DOWN,POLY ++S 17800,4000,18400,4000,600,*,RIGHT,POLY ++S 22000,4000,22600,4000,600,*,RIGHT,POLY ++S 18400,2800,18400,4000,200,*,DOWN,POLY ++S 22000,5000,22000,7200,200,*,DOWN,POLY ++S 20800,6000,20800,7200,200,*,DOWN,POLY ++S 22000,2800,22000,4000,200,*,DOWN,POLY ++S 20200,3000,20800,3000,600,*,RIGHT,POLY ++S 19600,7000,20200,7000,600,*,RIGHT,POLY ++S 22600,7000,23200,7000,600,*,RIGHT,POLY ++S 20200,6000,20800,6000,600,*,RIGHT,POLY ++S 24400,4800,24400,7200,200,*,DOWN,POLY ++S 24800,4000,26800,4000,600,*,RIGHT,POLY ++S 26800,2800,26800,5200,200,*,DOWN,POLY ++S 18400,5000,18400,6200,200,*,DOWN,POLY ++S 14200,6200,14800,6200,200,*,RIGHT,POLY ++S 14200,2800,14800,2800,200,*,RIGHT,POLY ++S 14200,2800,14200,6200,200,*,DOWN,POLY ++S 15000,4000,22000,4000,200,ckr,RIGHT,POLY ++S 19600,2000,20200,2000,600,*,RIGHT,POLY ++S 20800,1800,20800,3000,200,*,UP,POLY ++S 17200,1500,17200,2400,200,*,UP,NTRANS ++S 24400,1500,24400,2400,200,*,UP,NTRANS ++S 23200,1500,23200,2500,200,*,UP,NTRANS ++S 22000,1500,22000,2500,200,*,UP,NTRANS ++S 19600,600,19600,1400,200,*,UP,NTRANS ++S 18400,1500,18400,2500,200,*,UP,NTRANS ++S 21400,800,21400,1300,600,*,DOWN,NDIF ++S 20800,600,20800,1500,200,*,UP,NTRANS ++S 25000,800,25000,2200,600,*,DOWN,NDIF ++S 21400,800,21400,2300,600,*,DOWN,NDIF ++S 22600,1700,22600,2300,600,*,DOWN,NDIF ++S 25600,600,25600,2500,200,*,UP,NTRANS ++S 14200,1700,14200,2200,600,*,DOWN,NDIF ++S 20200,800,20200,1200,600,*,DOWN,NDIF ++S 16600,1700,16600,2200,600,*,DOWN,NDIF ++S 19000,800,19000,2300,600,*,DOWN,NDIF ++S 17800,1700,17800,2200,600,*,DOWN,NDIF ++S 27400,800,27400,2300,600,*,DOWN,NDIF ++S 26800,600,26800,2500,200,*,UP,NTRANS ++S 26200,800,26200,2300,600,*,DOWN,NDIF ++S 23800,1700,23800,2200,600,*,DOWN,NDIF ++S 15400,900,15400,2200,600,*,DOWN,NDIF ++S 16000,1500,16000,2400,200,*,UP,NTRANS ++S 14800,1500,14800,2400,200,*,UP,NTRANS ++S 22000,7500,22000,9400,200,*,DOWN,PTRANS ++S 19600,7600,19600,9400,200,*,DOWN,PTRANS ++S 18400,6500,18400,8500,200,*,DOWN,PTRANS ++S 24400,7500,24400,9400,200,*,DOWN,PTRANS ++S 23200,7600,23200,9400,200,*,DOWN,PTRANS ++S 27400,5700,27400,9200,600,*,DOWN,PDIF ++S 26800,5500,26800,9400,200,*,DOWN,PTRANS ++S 26200,5700,26200,9200,600,*,DOWN,PDIF ++S 20800,7500,20800,9400,200,*,UP,PTRANS ++S 14200,6800,14200,8300,600,*,UP,PDIF ++S 17200,6600,17200,8500,200,*,DOWN,PTRANS ++S 19000,6700,19000,9200,600,*,UP,PDIF ++S 17800,6800,17800,8300,600,*,UP,PDIF ++S 20000,7800,20000,9200,600,*,DOWN,PDIF ++S 22600,7800,22600,9200,600,*,DOWN,PDIF ++S 21200,7700,21200,9200,600,*,DOWN,PDIF ++S 23800,7800,23800,9200,600,*,UP,PDIF ++S 25000,5700,25000,9200,600,*,DOWN,PDIF ++S 25600,5500,25600,9400,200,*,DOWN,PTRANS ++S 16600,6800,16600,8300,600,*,UP,PDIF ++S 15400,6800,15400,9100,600,*,UP,PDIF ++S 16000,6600,16000,8500,200,*,DOWN,PTRANS ++S 14800,6600,14800,8500,200,*,DOWN,PTRANS ++S 0,5000,28000,5000,10000,sff3_x4,RIGHT,TALU8 ++S 0,2200,28000,2200,5200,*,RIGHT,PWELL ++S 0,7600,28000,7600,5600,*,RIGHT,NWELL ++S 0,9400,28000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,28000,600,1200,vss,RIGHT,CALU1 ++S 12200,2800,12200,6200,200,*,DOWN,POLY ++S 12200,6500,12200,8500,200,*,DOWN,PTRANS ++S 12200,1500,12200,2500,200,*,UP,NTRANS ++S 12800,1700,12800,2300,600,*,DOWN,NDIF ++S 12800,6700,12800,8300,600,*,UP,PDIF ++S 11200,5700,11200,9100,1000,*,DOWN,PDIF ++S 11200,900,11200,3500,1000,*,DOWN,NDIF ++S 13000,6700,13000,8300,600,*,UP,PDIF ++S 13000,1700,13000,2300,600,*,DOWN,NDIF ++S 13200,5000,23200,5000,200,nckr,RIGHT,POLY ++S 1000,700,1000,2100,400,*,DOWN,ALU1 ++S 2200,3100,2200,3500,600,*,UP,NDIF ++S 1600,2900,1600,3700,200,*,DOWN,NTRANS ++S 1000,1900,1000,3500,600,*,DOWN,NDIF ++S 1600,4000,1600,5200,200,*,DOWN,POLY ++S 2200,3000,3700,3000,400,*,LEFT,ALU1 ++S 4100,5000,5100,5000,400,*,LEFT,ALU1 ++S 3000,4300,3000,5100,400,*,DOWN,ALU1 ++S 2000,3200,2000,6000,400,*,UP,ALU1 ++S 2100,6000,5100,6000,400,*,LEFT,ALU1 ++S 4500,3000,5600,3000,400,*,RIGHT,ALU1 ++S 5600,3000,5600,4000,400,*,UP,ALU1 ++S 5600,4000,6000,4000,400,*,RIGHT,ALU1 ++S 6000,4000,6000,6900,400,*,UP,ALU1 ++S 1000,7000,3700,7000,400,*,LEFT,ALU1 ++S 2100,8000,6700,8000,400,*,RIGHT,ALU1 ++S 4500,7000,11000,7000,400,*,RIGHT,ALU1 ++S 6700,3000,9800,3000,400,*,RIGHT,ALU1 ++S 10000,3400,10000,6000,400,*,DOWN,ALU1 ++S 9800,7100,9800,8100,400,*,DOWN,ALU1 ++S 9800,8000,16000,8000,400,*,RIGHT,ALU1 ++S 11000,2000,11000,7000,400,*,DOWN,ALU1 ++S 9700,2000,11000,2000,400,*,RIGHT,ALU1 ++S 13000,1900,13000,7100,400,*,DOWN,ALU1 ++S 14200,6900,15000,6900,400,*,LEFT,ALU1 ++S 15000,2100,15000,6900,400,*,UP,ALU1 ++S 14200,2100,15000,2100,400,*,RIGHT,ALU1 ++S 16000,2900,16000,8000,400,u,DOWN,ALU1 ++S 17000,3000,17000,5100,400,*,DOWN,ALU1 ++S 19000,2000,19000,7000,400,sff_m,DOWN,ALU1 ++S 17700,7000,19000,7000,400,*,RIGHT,ALU1 ++S 19100,6000,20500,6000,400,*,RIGHT,ALU1 ++S 19100,3000,20500,3000,400,*,LEFT,ALU1 ++S 17700,2000,19000,2000,400,*,RIGHT,ALU1 ++S 19900,2000,21400,2000,400,*,RIGHT,ALU1 ++S 21400,1900,21400,8100,400,y,DOWN,ALU1 ++S 19900,7000,21300,7000,400,*,LEFT,ALU1 ++S 22600,4000,22600,7000,400,*,DOWN,ALU1 ++S 23800,2000,23800,8000,400,sff_s,DOWN,ALU1 ++S 22500,8000,23800,8000,400,*,RIGHT,ALU1 ++S 23900,4000,24900,4000,400,*,RIGHT,ALU1 ++S 22500,2000,23800,2000,400,*,RIGHT,ALU1 ++S 24700,3000,26100,3000,400,*,RIGHT,ALU1 ++S 24700,5000,26100,5000,400,*,RIGHT,ALU1 ++S 17100,6000,18000,6000,400,*,RIGHT,ALU1 ++S 18000,3900,18000,6000,400,*,UP,ALU1 ++S 8900,5000,9100,5000,400,*,LEFT,ALU1 ++S 1000,2900,1000,7100,400,*,DOWN,ALU1 ++S 12000,1900,12000,7100,400,*,DOWN,ALU1 ++S 9700,6000,9900,6000,400,*,RIGHT,ALU1 ++S 2100,3200,2300,3200,400,*,RIGHT,ALU1 ++S 26100,8000,26300,8000,400,*,RIGHT,ALU1 ++S 26100,7000,26300,7000,400,*,RIGHT,ALU1 ++S 26100,6000,26300,6000,400,*,RIGHT,ALU1 ++S 26100,2000,26300,2000,400,*,RIGHT,ALU1 ++S 22700,7000,22900,7000,400,*,RIGHT,ALU1 ++S 22300,4000,22500,4000,400,*,RIGHT,ALU1 ++S 17100,3000,17300,3000,400,*,RIGHT,ALU1 ++S 14100,7000,14300,7000,400,*,RIGHT,ALU1 ++S 14100,2000,14300,2000,400,*,RIGHT,ALU1 ++S 13100,5000,13300,5000,400,*,RIGHT,ALU1 ++S 25000,5000,25000,5000,400,q,LEFT,CALU1 ++S 25000,3000,25000,3000,400,q,LEFT,CALU1 ++V 17800,9300,CONT_BODY_N,* ++V 16600,9300,CONT_BODY_N,* ++V 14200,9300,CONT_BODY_N,* ++V 12800,9300,CONT_BODY_N,* ++V 23800,700,CONT_BODY_P,* ++V 22600,700,CONT_BODY_P,* ++V 17800,700,CONT_BODY_P,* ++V 16600,700,CONT_BODY_P,* ++V 14200,700,CONT_BODY_P,* ++V 12800,700,CONT_BODY_P,* ++V 11000,9000,CONT_DIF_P,* ++V 8800,6000,CONT_POLY,* ++V 8800,4000,CONT_POLY,* ++V 7800,5000,CONT_POLY,* ++V 8400,3000,CONT_POLY,* ++V 6800,3000,CONT_POLY,* ++V 5000,6000,CONT_POLY,* ++V 3000,5000,CONT_POLY,* ++V 5000,5000,CONT_POLY,* ++V 1000,5000,CONT_POLY,* ++V 3600,3000,CONT_POLY,* ++V 3600,7000,CONT_POLY,* ++V 9800,3400,CONT_DIF_N,* ++V 4600,3000,CONT_DIF_N,* ++V 6600,2000,CONT_DIF_N,* ++V 7800,1000,CONT_DIF_N,* ++V 9800,2000,CONT_DIF_N,* ++V 11000,1000,CONT_DIF_N,* ++V 1000,2000,CONT_DIF_N,* ++V 2200,2000,CONT_DIF_N,* ++V 6600,8000,CONT_DIF_P,* ++V 7800,9000,CONT_DIF_P,* ++V 9800,8000,CONT_DIF_P,* ++V 9800,6000,CONT_DIF_P,* ++V 4600,7000,CONT_DIF_P,* ++V 2200,8000,CONT_DIF_P,* ++V 2200,6000,CONT_DIF_P,* ++V 1000,8000,CONT_DIF_P,* ++V 20000,7000,CONT_POLY,* ++V 22800,7000,CONT_POLY,* ++V 18000,4000,CONT_POLY,* ++V 20400,6000,CONT_POLY,* ++V 22400,4000,CONT_POLY,* ++V 20400,3000,CONT_POLY,* ++V 24800,3000,CONT_POLY,* ++V 24800,5000,CONT_POLY,* ++V 17000,5000,CONT_POLY,* ++V 24800,4000,CONT_POLY,* ++V 15000,4000,CONT_POLY,* ++V 17200,6000,CONT_POLY,* ++V 16000,6000,CONT_POLY,* ++V 17200,3000,CONT_POLY,* ++V 16000,3000,CONT_POLY,* ++V 20000,2000,CONT_POLY,* ++V 14200,2000,CONT_DIF_N,* ++V 26200,2000,CONT_DIF_N,* ++V 25000,2000,CONT_DIF_N,* ++V 27400,2000,CONT_DIF_N,* ++V 25000,1000,CONT_DIF_N,* ++V 27400,1000,CONT_DIF_N,* ++V 21400,2000,CONT_DIF_N,* ++V 17800,2000,CONT_DIF_N,* ++V 22600,2000,CONT_DIF_N,* ++V 20200,1000,CONT_DIF_N,* ++V 15400,1000,CONT_DIF_N,* ++V 25000,6000,CONT_DIF_P,* ++V 26200,6000,CONT_DIF_P,* ++V 27400,6000,CONT_DIF_P,* ++V 21400,8000,CONT_DIF_P,* ++V 20200,9000,CONT_DIF_P,* ++V 26200,8000,CONT_DIF_P,* ++V 27400,7000,CONT_DIF_P,* ++V 27400,8000,CONT_DIF_P,* ++V 25000,9000,CONT_DIF_P,* ++V 14200,7000,CONT_DIF_P,* ++V 27400,9000,CONT_DIF_P,* ++V 25000,8000,CONT_DIF_P,* ++V 25000,7000,CONT_DIF_P,* ++V 17800,7000,CONT_DIF_P,* ++V 26200,7000,CONT_DIF_P,* ++V 22600,8000,CONT_DIF_P,* ++V 15400,9200,CONT_DIF_P,* ++V 12000,5000,CONT_POLY,* ++V 13200,5000,CONT_POLY,* ++V 13000,2000,CONT_DIF_N,* ++V 13000,7000,CONT_DIF_P,* ++V 2200,3200,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/sff3_x4.vbe b/alliance/src/cells/src/msxlib/sff3_x4.vbe +new file mode 100644 +index 0000000..a1953ab +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/sff3_x4.vbe +@@ -0,0 +1,65 @@ ++ENTITY sff3_x4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_ck : NATURAL := 8; ++ CONSTANT cin_cmd0 : NATURAL := 15; ++ CONSTANT cin_cmd1 : NATURAL := 15; ++ CONSTANT cin_i0 : NATURAL := 9; ++ CONSTANT cin_i1 : NATURAL := 8; ++ CONSTANT cin_i2 : NATURAL := 8; ++ CONSTANT rdown_ck_q : NATURAL := 890; ++ CONSTANT rup_ck_q : NATURAL := 810; ++ CONSTANT taf_ck_q : NATURAL := 600; ++ CONSTANT tar_ck_q : NATURAL := 600; ++ CONSTANT thf_ck_q : NATURAL := 0; ++ CONSTANT thf_cmd0_ck : NATURAL := 0; ++ CONSTANT thf_cmd1_ck : NATURAL := 0; ++ CONSTANT thf_i0_ck : NATURAL := 0; ++ CONSTANT thf_i1_ck : NATURAL := 0; ++ CONSTANT thf_i2_ck : NATURAL := 0; ++ CONSTANT thr_ck_q : NATURAL := 0; ++ CONSTANT thr_cmd0_ck : NATURAL := 0; ++ CONSTANT thr_cmd1_ck : NATURAL := 0; ++ CONSTANT thr_i0_ck : NATURAL := 0; ++ CONSTANT thr_i1_ck : NATURAL := 0; ++ CONSTANT thr_i2_ck : NATURAL := 0; ++ CONSTANT tsf_cmd0_ck : NATURAL := 1200; ++ CONSTANT tsf_cmd1_ck : NATURAL := 1200; ++ CONSTANT tsf_i0_ck : NATURAL := 1200; ++ CONSTANT tsf_i1_ck : NATURAL := 1200; ++ CONSTANT tsf_i2_ck : NATURAL := 1200; ++ CONSTANT tsr_cmd0_ck : NATURAL := 1100; ++ CONSTANT tsr_cmd1_ck : NATURAL := 1100; ++ CONSTANT tsr_i0_ck : NATURAL := 850; ++ CONSTANT tsr_i1_ck : NATURAL := 950; ++ CONSTANT tsr_i2_ck : NATURAL := 950; ++ CONSTANT transistors : NATURAL := 42 ++); ++PORT ( ++ ck : in BIT; ++ cmd0 : in BIT; ++ cmd1 : in BIT; ++ i0 : in BIT; ++ i1 : in BIT; ++ i2 : in BIT; ++ q : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END sff3_x4; ++ ++ARCHITECTURE behaviour_data_flow OF sff3_x4 IS ++ SIGNAL sff_m : REG_BIT REGISTER; ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on sff3_x4" ++ SEVERITY WARNING; ++ ++ label0 : BLOCK ((ck and not (ck'STABLE)) = '1') ++ BEGIN ++ sff_m <= GUARDED ((not (cmd0) and i0) or (cmd0 and ((cmd1 and i1) or (not (cmd1) and i2)))); ++ END BLOCK label0; ++ ++ q <= sff_m after 2400 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/tie_x0.ap b/alliance/src/cells/src/msxlib/tie_x0.ap +new file mode 100644 +index 0000000..250d3cf +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/tie_x0.ap +@@ -0,0 +1,15 @@ ++V ALLIANCE : 6 ++H tie_x0,P, 9/ 8/2014,100 ++A 0,0,2000,10000 ++S 1000,5700,1000,9500,1200,*,UP,NTIE ++S 1000,500,1000,3700,1200,*,DOWN,PTIE ++S 0,600,2000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,2000,5000,10000,tie_x0,LEFT,TALU8 ++S 0,2200,2000,2200,5200,*,LEFT,PWELL ++S 0,7600,2000,7600,5600,*,LEFT,NWELL ++S 0,9400,2000,9400,1200,vdd,RIGHT,CALU1 ++V 1300,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++V 1300,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/tie_x0.vbe b/alliance/src/cells/src/msxlib/tie_x0.vbe +new file mode 100644 +index 0000000..fa318aa +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/tie_x0.vbe +@@ -0,0 +1,18 @@ ++ENTITY tie_x0 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 2000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END tie_x0; ++ ++ARCHITECTURE behaviour_data_flow OF tie_x0 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on tie_x0" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vddtie.ap b/alliance/src/cells/src/msxlib/vddtie.ap +new file mode 100644 +index 0000000..18a1269 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vddtie.ap +@@ -0,0 +1,53 @@ ++V ALLIANCE : 6 ++H vddtie,P, 9/ 8/2014,100 ++A 0,0,3000,10000 ++R 2000,2000,ref_ref,z_20 ++R 2000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,z_40 ++R 2000,5000,ref_ref,z_50 ++R 2000,6000,ref_ref,z_60 ++R 2000,7000,ref_ref,z_70 ++R 2000,8000,ref_ref,z_80 ++R 1000,6000,ref_ref,z_60 ++S 600,9300,2400,9300,600,*,RIGHT,NTIE ++S 600,700,2400,700,600,*,RIGHT,PTIE ++S 2000,1900,2000,8100,400,*,DOWN,ALU1 ++S 1400,8500,1400,8800,200,*,UP,POLY ++S 700,5700,700,8300,600,*,UP,PDIF ++S 1400,5500,1400,8500,200,1,UP,PTRANS ++S 2100,5700,2100,8300,600,*,UP,PDIF ++S 1400,1600,1400,3900,200,2,DOWN,NTRANS ++S 1400,1200,1400,1600,200,*,DOWN,POLY ++S 2100,1800,2100,3700,600,*,DOWN,NDIF ++S 700,1800,700,3700,600,*,UP,NDIF ++S 800,4700,1400,4700,600,*,RIGHT,POLY ++S 800,700,800,4800,400,*,DOWN,ALU1 ++S 1400,3900,1400,5500,200,*,DOWN,POLY ++S 2000,2000,2000,8000,400,z,DOWN,CALU1 ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,3000,5000,10000,vddtie,LEFT,TALU8 ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 800,6000,2000,6000,400,*,LEFT,ALU1 ++S 800,7300,800,9300,400,*,UP,ALU1 ++S 1000,6000,1000,6000,400,z,LEFT,CALU1 ++V 2300,9300,CONT_BODY_N,* ++V 1500,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++V 2300,700,CONT_BODY_P,* ++V 1500,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++V 800,2000,CONT_DIF_N,* ++V 800,2800,CONT_DIF_N,* ++V 800,3600,CONT_DIF_N,* ++V 800,7400,CONT_DIF_P,* ++V 800,8200,CONT_DIF_P,* ++V 2000,2000,CONT_DIF_N,* ++V 800,4700,CONT_POLY,* ++V 2000,2800,CONT_DIF_N,* ++V 2000,3600,CONT_DIF_N,* ++V 2000,7400,CONT_DIF_P,* ++V 2000,6600,CONT_DIF_P,* ++V 2000,5800,CONT_DIF_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vddtie.vbe b/alliance/src/cells/src/msxlib/vddtie.vbe +new file mode 100644 +index 0000000..bf325ef +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vddtie.vbe +@@ -0,0 +1,20 @@ ++ENTITY vddtie IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END vddtie; ++ ++ARCHITECTURE behaviour_data_flow OF vddtie IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vddtie" ++ SEVERITY WARNING; ++ z <= '1'; ++END; +diff --git a/alliance/src/cells/src/msxlib/vfeed1.ap b/alliance/src/cells/src/msxlib/vfeed1.ap +new file mode 100644 +index 0000000..ab4bca1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed1.ap +@@ -0,0 +1,9 @@ ++V ALLIANCE : 6 ++H vfeed1,P,16/ 6/2004,100 ++A 0,0,1000,10000 ++S 0,7600,1000,7600,5600,*,LEFT,NWELL ++S 0,2200,1000,2200,5200,*,LEFT,PWELL ++S 0,5000,1000,5000,10000,vfeed1,LEFT,TALU8 ++S 0,600,1000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,1000,9400,1200,vdd,RIGHT,CALU1 ++EOF +diff --git a/alliance/src/cells/src/msxlib/vfeed1.vbe b/alliance/src/cells/src/msxlib/vfeed1.vbe +new file mode 100644 +index 0000000..5f0117f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed1.vbe +@@ -0,0 +1,18 @@ ++ENTITY vfeed1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 1000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END vfeed1; ++ ++ARCHITECTURE behaviour_data_flow OF vfeed1 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vfeed1" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vfeed2.ap b/alliance/src/cells/src/msxlib/vfeed2.ap +new file mode 100644 +index 0000000..578a4f4 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed2.ap +@@ -0,0 +1,15 @@ ++V ALLIANCE : 6 ++H vfeed2,P, 9/ 8/2014,100 ++A 0,0,2000,10000 ++S 1000,5700,1000,9500,1400,*,UP,NTIE ++S 1000,500,1000,3700,1400,*,DOWN,PTIE ++S 0,600,2000,600,1200,vss,RIGHT,CALU1 ++S 0,5000,2000,5000,10000,vfeed2,LEFT,TALU8 ++S 0,2200,2000,2200,5200,*,LEFT,PWELL ++S 0,7600,2000,7600,5600,*,LEFT,NWELL ++S 0,9400,2000,9400,1200,vdd,RIGHT,CALU1 ++V 1300,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++V 1300,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vfeed2.vbe b/alliance/src/cells/src/msxlib/vfeed2.vbe +new file mode 100644 +index 0000000..4ad9833 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed2.vbe +@@ -0,0 +1,18 @@ ++ENTITY vfeed2 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 2000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END vfeed2; ++ ++ARCHITECTURE behaviour_data_flow OF vfeed2 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vfeed2" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vfeed3.ap b/alliance/src/cells/src/msxlib/vfeed3.ap +new file mode 100644 +index 0000000..d0a4d80 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed3.ap +@@ -0,0 +1,17 @@ ++V ALLIANCE : 6 ++H vfeed3,P, 9/ 8/2014,100 ++A 0,0,3000,10000 ++S 0,5000,3000,5000,10000,vfeed3,LEFT,TALU8 ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 1500,5700,1500,9500,2400,*,UP,NTIE ++S 1500,500,1500,3700,2400,*,DOWN,PTIE ++V 2300,700,CONT_BODY_P,* ++V 1500,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++V 700,9300,CONT_BODY_N,* ++V 2300,9300,CONT_BODY_N,* ++V 1500,9300,CONT_BODY_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vfeed3.vbe b/alliance/src/cells/src/msxlib/vfeed3.vbe +new file mode 100644 +index 0000000..ca6ce9f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed3.vbe +@@ -0,0 +1,18 @@ ++ENTITY vfeed3 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END vfeed3; ++ ++ARCHITECTURE behaviour_data_flow OF vfeed3 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vfeed3" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vfeed4.ap b/alliance/src/cells/src/msxlib/vfeed4.ap +new file mode 100644 +index 0000000..eab369c +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed4.ap +@@ -0,0 +1,19 @@ ++V ALLIANCE : 6 ++H vfeed4,P, 9/ 8/2014,100 ++A 0,0,4000,10000 ++S 0,5000,4000,5000,10000,vfeed4,LEFT,TALU8 ++S 0,2200,4000,2200,5200,*,LEFT,PWELL ++S 0,7600,4000,7600,5600,*,LEFT,NWELL ++S 0,9400,4000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,4000,600,1200,vss,RIGHT,CALU1 ++S 2000,5700,2000,9500,3400,*,UP,NTIE ++S 2000,500,2000,3700,3400,*,DOWN,PTIE ++V 3300,700,CONT_BODY_P,* ++V 3300,9300,CONT_BODY_N,* ++V 2400,9300,CONT_BODY_N,* ++V 1500,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++V 2500,700,CONT_BODY_P,* ++V 1500,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vfeed4.vbe b/alliance/src/cells/src/msxlib/vfeed4.vbe +new file mode 100644 +index 0000000..436550b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed4.vbe +@@ -0,0 +1,18 @@ ++ENTITY vfeed4 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 4000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END vfeed4; ++ ++ARCHITECTURE behaviour_data_flow OF vfeed4 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vfeed4" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vfeed5.ap b/alliance/src/cells/src/msxlib/vfeed5.ap +new file mode 100644 +index 0000000..fdafd35 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed5.ap +@@ -0,0 +1,21 @@ ++V ALLIANCE : 6 ++H vfeed5,P, 9/ 8/2014,100 ++A 0,0,5000,10000 ++S 0,5000,5000,5000,10000,vfeed5,LEFT,TALU8 ++S 0,2200,5000,2200,5200,*,LEFT,PWELL ++S 0,7600,5000,7600,5600,*,LEFT,NWELL ++S 0,600,5000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,5000,9400,1200,vdd,RIGHT,CALU1 ++S 2500,5700,2500,9500,4400,*,UP,NTIE ++S 2500,500,2500,3700,4400,*,DOWN,PTIE ++V 3500,9300,CONT_BODY_N,* ++V 2500,9300,CONT_BODY_N,* ++V 1500,9300,CONT_BODY_N,* ++V 4300,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++V 2500,700,CONT_BODY_P,* ++V 3500,700,CONT_BODY_P,* ++V 4300,700,CONT_BODY_P,* ++V 1500,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vfeed5.vbe b/alliance/src/cells/src/msxlib/vfeed5.vbe +new file mode 100644 +index 0000000..57242e7 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed5.vbe +@@ -0,0 +1,18 @@ ++ENTITY vfeed5 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 5000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END vfeed5; ++ ++ARCHITECTURE behaviour_data_flow OF vfeed5 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vfeed5" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vfeed6.ap b/alliance/src/cells/src/msxlib/vfeed6.ap +new file mode 100644 +index 0000000..5ea319b +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed6.ap +@@ -0,0 +1,23 @@ ++V ALLIANCE : 6 ++H vfeed6,P, 9/ 8/2014,100 ++A 0,0,6000,10000 ++S 0,5000,6000,5000,10000,vfeed6,LEFT,TALU8 ++S 0,2200,6000,2200,5200,*,LEFT,PWELL ++S 0,7600,6000,7600,5600,*,LEFT,NWELL ++S 0,600,6000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,6000,9400,1200,vdd,RIGHT,CALU1 ++S 3000,500,3000,3700,5400,*,DOWN,PTIE ++S 3000,5700,3000,9500,5400,*,UP,NTIE ++V 1500,700,CONT_BODY_P,* ++V 2500,700,CONT_BODY_P,* ++V 3500,700,CONT_BODY_P,* ++V 4500,700,CONT_BODY_P,* ++V 5300,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++V 1500,9300,CONT_BODY_N,* ++V 2500,9300,CONT_BODY_N,* ++V 3500,9300,CONT_BODY_N,* ++V 4500,9300,CONT_BODY_N,* ++V 5300,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vfeed6.vbe b/alliance/src/cells/src/msxlib/vfeed6.vbe +new file mode 100644 +index 0000000..a603a3a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed6.vbe +@@ -0,0 +1,18 @@ ++ENTITY vfeed6 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 6000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END vfeed6; ++ ++ARCHITECTURE behaviour_data_flow OF vfeed6 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vfeed6" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vfeed7.ap b/alliance/src/cells/src/msxlib/vfeed7.ap +new file mode 100644 +index 0000000..d01c623 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed7.ap +@@ -0,0 +1,25 @@ ++V ALLIANCE : 6 ++H vfeed7,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++S 0,5000,7000,5000,10000,vfeed7,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 3500,5700,3500,9500,6400,*,UP,NTIE ++S 3500,500,3500,3700,6400,*,DOWN,PTIE ++V 1500,700,CONT_BODY_P,* ++V 2500,700,CONT_BODY_P,* ++V 3500,700,CONT_BODY_P,* ++V 4500,700,CONT_BODY_P,* ++V 5500,700,CONT_BODY_P,* ++V 6300,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++V 1500,9300,CONT_BODY_N,* ++V 2500,9300,CONT_BODY_N,* ++V 3500,9300,CONT_BODY_N,* ++V 4500,9300,CONT_BODY_N,* ++V 5500,9300,CONT_BODY_N,* ++V 6300,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vfeed7.vbe b/alliance/src/cells/src/msxlib/vfeed7.vbe +new file mode 100644 +index 0000000..94fa2ee +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed7.vbe +@@ -0,0 +1,18 @@ ++ENTITY vfeed7 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END vfeed7; ++ ++ARCHITECTURE behaviour_data_flow OF vfeed7 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vfeed7" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vfeed8.ap b/alliance/src/cells/src/msxlib/vfeed8.ap +new file mode 100644 +index 0000000..d4f75bd +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed8.ap +@@ -0,0 +1,27 @@ ++V ALLIANCE : 6 ++H vfeed8,P, 9/ 8/2014,100 ++A 0,0,8000,10000 ++S 0,5000,8000,5000,10000,vfeed8,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 4000,500,4000,3700,7400,*,DOWN,PTIE ++S 4000,5700,4000,9500,7400,*,UP,NTIE ++V 1500,9300,CONT_BODY_N,* ++V 2500,9300,CONT_BODY_N,* ++V 3500,9300,CONT_BODY_N,* ++V 4500,9300,CONT_BODY_N,* ++V 5500,9300,CONT_BODY_N,* ++V 6500,9300,CONT_BODY_N,* ++V 6500,700,CONT_BODY_P,* ++V 5500,700,CONT_BODY_P,* ++V 4500,700,CONT_BODY_P,* ++V 3500,700,CONT_BODY_P,* ++V 2500,700,CONT_BODY_P,* ++V 1500,700,CONT_BODY_P,* ++V 700,700,CONT_BODY_P,* ++V 7300,700,CONT_BODY_P,* ++V 7300,9300,CONT_BODY_N,* ++V 700,9300,CONT_BODY_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vfeed8.vbe b/alliance/src/cells/src/msxlib/vfeed8.vbe +new file mode 100644 +index 0000000..01c51c3 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vfeed8.vbe +@@ -0,0 +1,18 @@ ++ENTITY vfeed8 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ vdd : in BIT; ++ vss : in BIT ++); ++END vfeed8; ++ ++ARCHITECTURE behaviour_data_flow OF vfeed8 IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vfeed8" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/msxlib/vsstie.ap b/alliance/src/cells/src/msxlib/vsstie.ap +new file mode 100644 +index 0000000..2dd552a +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vsstie.ap +@@ -0,0 +1,54 @@ ++V ALLIANCE : 6 ++H vsstie,P,17/ 8/2004,100 ++A 0,0,3000,10000 ++R 2000,8000,ref_ref,z_80 ++R 2000,7000,ref_ref,z_70 ++R 2000,6000,ref_ref,z_60 ++R 2000,5000,ref_ref,z_50 ++R 2000,4000,ref_ref,z_40 ++R 2000,3000,ref_ref,z_30 ++R 2000,2000,ref_ref,z_20 ++R 1000,4000,ref_ref,z_40 ++S 0,7600,3000,7600,5600,*,LEFT,NWELL ++S 0,2200,3000,2200,5200,*,LEFT,PWELL ++S 0,5000,3000,5000,10000,vsstie,LEFT,TALU8 ++S 0,600,3000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,3000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,2000,2000,8000,400,z,DOWN,CALU1 ++S 1400,3900,1400,5500,200,*,DOWN,POLY ++S 700,1800,700,3700,600,*,UP,NDIF ++S 2100,1800,2100,3700,600,*,DOWN,NDIF ++S 1400,1200,1400,1600,200,*,DOWN,POLY ++S 1400,1600,1400,3900,200,2,DOWN,NTRANS ++S 600,600,2400,600,600,*,RIGHT,PTIE ++S 600,9400,2400,9400,600,*,RIGHT,NTIE ++S 2100,5700,2100,8300,600,*,UP,PDIF ++S 1400,5500,1400,8500,200,1,UP,PTRANS ++S 700,5700,700,8300,600,*,UP,PDIF ++S 1400,8500,1400,8800,200,*,UP,POLY ++S 2000,1900,2000,8100,400,*,DOWN,ALU1 ++S 800,700,800,2900,400,*,DOWN,ALU1 ++S 800,4800,800,9300,400,*,UP,ALU1 ++S 800,4900,1400,4900,600,*,RIGHT,POLY ++S 1000,4000,1000,4000,400,z,LEFT,CALU1 ++S 800,4000,2000,4000,400,*,LEFT,ALU1 ++V 2000,5800,CONT_DIF_P,* ++V 2000,6600,CONT_DIF_P,* ++V 2000,7400,CONT_DIF_P,* ++V 2000,3600,CONT_DIF_N,* ++V 2000,2800,CONT_DIF_N,* ++V 2000,2000,CONT_DIF_N,* ++V 700,600,CONT_BODY_P,* ++V 1500,600,CONT_BODY_P,* ++V 2300,600,CONT_BODY_P,* ++V 700,9400,CONT_BODY_N,* ++V 1500,9400,CONT_BODY_N,* ++V 2300,9400,CONT_BODY_N,* ++V 800,8200,CONT_DIF_P,* ++V 800,7400,CONT_DIF_P,* ++V 800,6600,CONT_DIF_P,* ++V 800,5800,CONT_DIF_P,* ++V 800,2800,CONT_DIF_N,* ++V 800,2000,CONT_DIF_N,* ++V 800,4900,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/vsstie.vbe b/alliance/src/cells/src/msxlib/vsstie.vbe +new file mode 100644 +index 0000000..9f430c7 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/vsstie.vbe +@@ -0,0 +1,20 @@ ++ENTITY vsstie IS ++GENERIC ( ++ CONSTANT area : NATURAL := 3000; ++ CONSTANT transistors : NATURAL := 0 ++); ++PORT ( ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END vsstie; ++ ++ARCHITECTURE behaviour_data_flow OF vsstie IS ++ ++BEGIN ++ ASSERT (vdd and not (vss)) ++ REPORT "power supply is missing on vsstie" ++ SEVERITY WARNING; ++ z <= '0'; ++END; +diff --git a/alliance/src/cells/src/msxlib/xaoi21_x05.ap b/alliance/src/cells/src/msxlib/xaoi21_x05.ap +new file mode 100644 +index 0000000..aa036e2 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaoi21_x05.ap +@@ -0,0 +1,142 @@ ++V ALLIANCE : 6 ++H xaoi21_x05,P, 9/ 8/2014,100 ++A 0,0,8000,10000 ++R 4000,8000,ref_ref,b_80 ++R 5000,8000,ref_ref,b_80 ++R 6000,8000,ref_ref,b_80 ++R 6000,7000,ref_ref,b_70 ++R 5000,2000,ref_ref,z_20 ++R 5000,3000,ref_ref,z_30 ++R 5000,4000,ref_ref,z_40 ++R 4000,4000,ref_ref,z_40 ++R 4000,5000,ref_ref,z_50 ++R 4000,6000,ref_ref,z_60 ++R 2000,6000,ref_ref,a2_60 ++R 3000,6000,ref_ref,a2_60 ++R 3000,5000,ref_ref,a2_50 ++R 3000,4000,ref_ref,a2_40 ++R 4000,3000,ref_ref,a1_30 ++R 3000,3000,ref_ref,a1_30 ++R 2000,3000,ref_ref,a1_30 ++R 2000,4000,ref_ref,a1_40 ++R 2000,5000,ref_ref,a1_50 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 3100,700,3900,700,600,*,RIGHT,PTIE ++S 6000,1900,6000,5100,400,*,UP,ALU1 ++S 5000,8000,5000,8000,400,b,LEFT,CALU1 ++S 4000,8000,4000,8000,400,b,LEFT,CALU1 ++S 6000,7000,6000,8000,400,b,DOWN,CALU1 ++S 6000,6900,6600,6900,400,*,RIGHT,ALU1 ++S 3300,8000,6000,8000,400,*,LEFT,ALU1 ++S 3300,8100,6000,8100,400,*,LEFT,ALU1 ++S 6600,5900,6600,6900,400,*,UP,ALU1 ++S 6000,6900,6000,8100,400,*,DOWN,ALU1 ++S 5000,6000,5000,7000,400,*,UP,ALU1 ++S 5000,6000,5700,6000,400,*,LEFT,ALU1 ++S 700,7000,5000,7000,400,*,RIGHT,ALU1 ++S 3600,5100,3600,5500,200,*,DOWN,POLY ++S 2200,1300,2200,1700,200,*,DOWN,POLY ++S 3000,1300,3000,1700,200,*,DOWN,POLY ++S 4200,1300,4200,1700,200,*,DOWN,POLY ++S 5400,1300,5400,1700,200,*,DOWN,POLY ++S 6600,1300,6600,1700,200,*,DOWN,POLY ++S 6800,8700,6800,9100,200,*,UP,POLY ++S 5600,8700,5600,9100,200,*,UP,POLY ++S 4800,8700,4800,9100,200,*,UP,POLY ++S 2400,7500,2400,7900,200,*,UP,POLY ++S 1200,7500,1200,7900,200,*,UP,POLY ++S 1800,7900,1800,9300,400,*,UP,ALU1 ++S 7400,5100,7400,7900,400,*,DOWN,ALU1 ++S 6000,5100,7400,5100,400,*,LEFT,ALU1 ++S 5000,5000,6000,5000,600,*,RIGHT,ALU1 ++S 4000,5700,4000,7300,400,*,UP,PDIF ++S 4200,5900,4200,7300,600,*,UP,PDIF ++S 7200,6900,7200,8500,400,*,DOWN,PDIF ++S 4400,6900,4400,8500,400,*,DOWN,PDIF ++S 800,5700,800,7300,400,*,DOWN,PDIF ++S 6200,6900,6200,9100,600,*,DOWN,PDIF ++S 7200,700,7200,2100,400,*,DOWN,ALU1 ++S 7200,1900,7200,2400,600,*,UP,NDIF ++S 7300,1900,7300,2400,600,*,UP,NDIF ++S 6600,2600,6600,6000,200,*,UP,POLY ++S 6000,1900,6000,2400,600,*,UP,NDIF ++S 4000,4000,4000,6000,400,z,UP,CALU1 ++S 5000,2000,5000,4000,400,z,UP,CALU1 ++S 4000,4000,5000,4000,600,*,RIGHT,ALU1 ++S 4900,1900,4900,4000,600,*,DOWN,ALU1 ++S 3000,5700,3000,7300,600,*,DOWN,PDIF ++S 1800,5700,1800,8100,600,*,DOWN,PDIF ++S 600,5900,600,6500,600,*,UP,PDIF ++S 2000,6000,2000,6000,400,a2,LEFT,CALU1 ++S 3000,4000,3000,6000,400,a2,UP,CALU1 ++S 2000,6000,3000,6000,600,*,LEFT,ALU1 ++S 2000,2900,2000,5100,400,*,UP,ALU1 ++S 3000,3000,3000,3000,400,a1,LEFT,CALU1 ++S 4000,3000,4000,3000,400,a1,LEFT,CALU1 ++S 2000,3000,2000,5000,400,a1,DOWN,CALU1 ++S 2400,4500,2400,5500,200,*,DOWN,POLY ++S 3000,4000,3000,4300,200,*,DOWN,POLY ++S 2400,4500,3000,4500,200,*,RIGHT,POLY ++S 2000,3000,4000,3000,600,*,LEFT,ALU1 ++S 3000,3900,3000,6100,400,*,UP,ALU1 ++S 5800,3000,5800,6000,200,*,DOWN,POLY ++S 5400,3000,5800,3000,200,*,RIGHT,POLY ++S 4100,4000,4100,6100,600,*,DOWN,ALU1 ++S 600,2000,600,7000,400,*,DOWN,ALU1 ++S 600,2000,3700,2000,400,*,RIGHT,ALU1 ++S 7400,7100,7400,7700,600,*,UP,PDIF ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,8000,5000,10000,xaoi21_x05,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 6800,6000,6800,6700,200,*,DOWN,POLY ++S 5600,6000,5600,6700,200,*,DOWN,POLY ++S 5100,6900,5100,8500,400,n1,DOWN,PDIF ++S 4200,4500,4800,4500,200,*,RIGHT,POLY ++S 4800,4500,4800,6700,200,*,DOWN,POLY ++S 4200,2900,4200,4500,200,*,UP,POLY ++S 3600,1900,3600,2700,600,*,UP,NDIF ++S 3000,2900,3000,4000,200,*,UP,POLY ++S 2600,1900,2600,2700,400,n2,UP,NDIF ++S 1500,900,1500,2700,600,*,UP,NDIF ++S 1600,900,1600,2700,600,*,UP,NDIF ++S 1200,3700,2200,3700,200,*,RIGHT,POLY ++S 1200,3700,1200,5500,200,*,DOWN,POLY ++S 4600,1900,4600,2700,400,*,UP,NDIF ++S 4800,1900,4800,2400,600,*,UP,NDIF ++S 6800,6700,6800,8700,200,1b,DOWN,PTRANS ++S 1200,5500,1200,7500,200,1a,DOWN,PTRANS ++S 2200,1700,2200,2900,200,2a,UP,NTRANS ++S 2400,5500,2400,7500,200,3a,DOWN,PTRANS ++S 3000,1700,3000,2900,200,4a,UP,NTRANS ++S 3600,5500,3600,7500,200,2b,DOWN,PTRANS ++S 6600,1700,6600,2600,200,3b,UP,NTRANS ++S 4800,6700,4800,8700,200,2z,DOWN,PTRANS ++S 5600,6700,5600,8700,200,1z,DOWN,PTRANS ++S 5400,1700,5400,2600,200,3z,UP,NTRANS ++S 4200,1700,4200,2900,200,4z,UP,NTRANS ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 4000,700,CONT_BODY_P,* ++V 3000,700,CONT_BODY_P,* ++V 6000,2000,CONT_DIF_N,bn ++V 4800,2000,CONT_DIF_N,* ++V 5000,5000,CONT_POLY,bn ++V 7200,2000,CONT_DIF_N,* ++V 3000,4300,CONT_POLY,* ++V 3600,2000,CONT_DIF_N,an ++V 6600,6000,CONT_POLY,* ++V 5600,6000,CONT_POLY,an ++V 1600,1000,CONT_DIF_N,* ++V 600,6600,CONT_DIF_P,an ++V 600,5800,CONT_DIF_P,an ++V 1800,8000,CONT_DIF_P,* ++V 3000,7000,CONT_DIF_P,an ++V 4200,6000,CONT_DIF_P,* ++V 3400,8100,CONT_POLY,* ++V 7400,7000,CONT_DIF_P,bn ++V 7400,7800,CONT_DIF_P,bn ++V 6200,9000,CONT_DIF_P,* ++V 2000,3500,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/xaoi21_x05.vbe b/alliance/src/cells/src/msxlib/xaoi21_x05.vbe +new file mode 100644 +index 0000000..a74687d +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaoi21_x05.vbe +@@ -0,0 +1,44 @@ ++ENTITY xaoi21_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT cin_a1 : NATURAL := 5; ++ CONSTANT cin_a2 : NATURAL := 4; ++ CONSTANT rdown_b_z : NATURAL := 3960; ++ CONSTANT rdown_a1_z : NATURAL := 3890; ++ CONSTANT rdown_a2_z : NATURAL := 3890; ++ CONSTANT rup_b_z : NATURAL := 3690; ++ CONSTANT rup_a1_z : NATURAL := 4780; ++ CONSTANT rup_a2_z : NATURAL := 4770; ++ CONSTANT tphl_a1_z : NATURAL := 83; ++ CONSTANT tphl_a2_z : NATURAL := 84; ++ CONSTANT tphl_b_z : NATURAL := 68; ++ CONSTANT tplh_b_z : NATURAL := 42; ++ CONSTANT tplh_a1_z : NATURAL := 88; ++ CONSTANT tplh_a2_z : NATURAL := 83; ++ CONSTANT tphh_b_z : NATURAL := 87; ++ CONSTANT tpll_b_z : NATURAL := 66; ++ CONSTANT tphh_a1_z : NATURAL := 120; ++ CONSTANT tphh_a2_z : NATURAL := 121; ++ CONSTANT tpll_a1_z : NATURAL := 118; ++ CONSTANT tpll_a2_z : NATURAL := 111; ++ CONSTANT transistors : NATURAL := 11 ++); ++PORT ( ++ b : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xaoi21_x05; ++ ++ARCHITECTURE behaviour_data_flow OF xaoi21_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xaoi21_x05" ++ SEVERITY WARNING; ++ z <= not ((b xor (a1 and a2))) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xaoi21_x1.ap b/alliance/src/cells/src/msxlib/xaoi21_x1.ap +new file mode 100644 +index 0000000..8d1d5ea +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaoi21_x1.ap +@@ -0,0 +1,146 @@ ++V ALLIANCE : 6 ++H xaoi21_x1,P, 9/ 8/2014,100 ++A 0,0,9000,10000 ++R 2000,5000,ref_ref,a1_50 ++R 2000,4000,ref_ref,a1_40 ++R 2000,3000,ref_ref,a1_30 ++R 3000,3000,ref_ref,a1_30 ++R 4000,3000,ref_ref,a1_30 ++R 3000,4000,ref_ref,a2_40 ++R 3000,5000,ref_ref,a2_50 ++R 3000,6000,ref_ref,a2_60 ++R 2000,6000,ref_ref,a2_60 ++R 7000,7000,ref_ref,b_70 ++R 7000,8000,ref_ref,b_80 ++R 6000,8000,ref_ref,b_80 ++R 5000,8000,ref_ref,b_80 ++R 4000,8000,ref_ref,b_80 ++R 5000,6000,ref_ref,z_60 ++R 5000,5000,ref_ref,z_50 ++R 5000,4000,ref_ref,z_40 ++R 5000,3000,ref_ref,z_30 ++R 5000,2000,ref_ref,z_20 ++R 7000,6000,ref_ref,b_60 ++R 4000,5000,ref_ref,z_50 ++S 600,2000,3700,2000,400,*,RIGHT,ALU1 ++S 600,2000,600,7000,400,*,DOWN,ALU1 ++S 3000,3900,3000,6100,400,*,UP,ALU1 ++S 2000,3000,4000,3000,600,*,LEFT,ALU1 ++S 2400,4500,3000,4500,200,*,RIGHT,POLY ++S 3000,4000,3000,4300,200,*,DOWN,POLY ++S 2400,4500,2400,5500,200,*,DOWN,POLY ++S 2000,3000,2000,5000,400,a1,DOWN,CALU1 ++S 4000,3000,4000,3000,400,a1,LEFT,CALU1 ++S 3000,3000,3000,3000,400,a1,LEFT,CALU1 ++S 2000,2900,2000,5100,400,*,UP,ALU1 ++S 2000,6000,3000,6000,600,*,LEFT,ALU1 ++S 3000,4000,3000,6000,400,a2,UP,CALU1 ++S 2000,6000,2000,6000,400,a2,LEFT,CALU1 ++S 0,9400,9000,9400,1200,vdd,RIGHT,CALU1 ++S 6000,8000,6000,8000,400,b,LEFT,CALU1 ++S 5000,8000,5000,8000,400,b,LEFT,CALU1 ++S 0,5000,9000,5000,10000,xaoi21_x1,LEFT,TALU8 ++S 0,2200,9000,2200,5200,*,LEFT,PWELL ++S 0,7600,9000,7600,5600,*,LEFT,NWELL ++S 600,7900,600,9300,400,*,UP,ALU1 ++S 4600,5100,4600,5500,200,*,DOWN,POLY ++S 3400,8000,7000,8000,400,*,LEFT,ALU1 ++S 4000,8000,4000,8000,400,b,LEFT,CALU1 ++S 4600,5500,4600,9300,200,2b,DOWN,PTRANS ++S 3700,8000,3700,9700,200,*,UP,POLY ++S 3700,9700,4600,9700,200,*,RIGHT,POLY ++S 4200,5700,4200,9100,400,*,UP,PDIF ++S 2400,9300,2400,9700,200,*,UP,POLY ++S 1200,9300,1200,9700,200,*,UP,POLY ++S 2400,5500,2400,9300,200,3a,DOWN,PTRANS ++S 2800,5700,2800,9100,400,*,DOWN,PDIF ++S 1200,5500,1200,9300,200,1a,DOWN,PTRANS ++S 1800,5700,1800,9100,600,*,DOWN,PDIF ++S 600,5700,600,9100,600,*,DOWN,PDIF ++S 1800,7000,1800,7900,400,*,UP,ALU1 ++S 600,7000,6000,7000,400,*,RIGHT,ALU1 ++S 5800,9300,5800,9700,200,*,UP,POLY ++S 6600,9300,6600,9700,200,*,UP,POLY ++S 7800,9300,7800,9700,200,*,UP,POLY ++S 8200,6900,8200,9100,400,*,DOWN,PDIF ++S 5000,2000,5000,6000,400,z,UP,CALU1 ++S 6600,5500,6600,9300,200,1z,DOWN,PTRANS ++S 5800,5500,5800,9300,200,2z,DOWN,PTRANS ++S 7200,5700,7200,9100,600,*,DOWN,PDIF ++S 7800,5500,7800,9300,200,1b,DOWN,PTRANS ++S 8400,5900,8400,6500,600,*,UP,PDIF ++S 7000,6000,7000,8000,400,b,DOWN,CALU1 ++S 6000,4900,6000,7000,400,*,UP,ALU1 ++S 8400,3900,8400,6700,400,*,DOWN,ALU1 ++S 7000,6000,7600,6000,400,*,RIGHT,ALU1 ++S 7000,6000,7000,8000,600,*,DOWN,ALU1 ++S 7600,4800,7600,6000,400,*,UP,ALU1 ++S 0,600,9000,600,1200,vss,RIGHT,CALU1 ++S 5000,1900,5000,6100,400,*,DOWN,ALU1 ++S 5000,6000,5200,6000,600,*,LEFT,ALU1 ++S 4800,2000,5000,2000,600,*,RIGHT,ALU1 ++S 6700,3900,8400,3900,400,*,LEFT,ALU1 ++S 5800,4100,5800,5500,200,*,DOWN,POLY ++S 4200,4100,6400,4100,200,*,RIGHT,POLY ++S 5800,3200,5800,4900,400,*,UP,ALU1 ++S 5800,4900,6700,4900,400,*,LEFT,ALU1 ++S 6600,700,6600,2400,200,3b,UP,NTRANS ++S 5400,700,5400,2400,200,3z,UP,NTRANS ++S 4600,900,4600,2900,400,*,UP,NDIF ++S 4200,700,4200,3100,200,4z,UP,NTRANS ++S 2600,900,2600,2900,400,n2,UP,NDIF ++S 2200,700,2200,3100,200,2a,UP,NTRANS ++S 3000,700,3000,3100,200,4a,UP,NTRANS ++S 1600,900,1600,2900,600,*,UP,NDIF ++S 1500,900,1500,2900,600,*,UP,NDIF ++S 3600,900,3600,2900,600,*,UP,NDIF ++S 4800,900,4800,2200,600,*,UP,NDIF ++S 6000,900,6000,2200,600,*,UP,NDIF ++S 7200,900,7200,2200,600,*,UP,NDIF ++S 6600,2800,7600,2800,200,*,RIGHT,POLY ++S 7600,2800,7600,5000,200,*,UP,POLY ++S 5200,5700,5200,9100,600,*,UP,PDIF ++S 4000,6300,4000,6900,600,*,DOWN,PDIF ++S 4000,6100,4000,7000,400,*,UP,ALU1 ++S 4000,5000,4000,5000,400,z,LEFT,CALU1 ++S 3900,5000,5000,5000,400,*,RIGHT,ALU1 ++S 1200,3900,2200,3900,200,*,RIGHT,POLY ++S 1200,3900,1200,5500,200,*,DOWN,POLY ++S 3000,3100,3000,4000,200,*,UP,POLY ++S 4200,3100,4200,4100,200,*,UP,POLY ++S 5400,2400,5400,3500,200,*,UP,POLY ++S 2200,300,2200,700,200,*,DOWN,POLY ++S 3000,300,3000,700,200,*,DOWN,POLY ++S 4200,300,4200,700,200,*,DOWN,POLY ++S 5400,300,5400,700,200,*,DOWN,POLY ++S 6600,300,6600,700,200,*,DOWN,POLY ++S 6600,2000,6600,3900,400,*,UP,ALU1 ++S 5900,2000,6600,2000,400,*,RIGHT,ALU1 ++S 7400,700,7400,2100,400,*,UP,ALU1 ++S 7500,1800,7500,2200,600,*,DOWN,NDIF ++V 8300,700,CONT_BODY_P,* ++V 1600,1000,CONT_DIF_N,* ++V 3600,2000,CONT_DIF_N,an ++V 3000,4300,CONT_POLY,* ++V 7200,9000,CONT_DIF_P,* ++V 600,8000,CONT_DIF_P,* ++V 1800,7000,CONT_DIF_P,an ++V 5200,6000,CONT_DIF_P,* ++V 4000,7000,CONT_DIF_P,an ++V 3000,9000,CONT_DIF_P,* ++V 3500,8000,CONT_POLY,* ++V 600,9000,CONT_DIF_P,* ++V 1800,7800,CONT_DIF_P,an ++V 4800,2000,CONT_DIF_N,* ++V 8400,5800,CONT_DIF_P,bn ++V 8400,6600,CONT_DIF_P,bn ++V 6600,4900,CONT_POLY,an ++V 7600,4900,CONT_POLY,* ++V 5800,3300,CONT_POLY,an ++V 6000,2000,CONT_DIF_N,bn ++V 7200,1000,CONT_DIF_N,* ++V 6800,3900,CONT_POLY,bn ++V 4000,6200,CONT_DIF_P,an ++V 2000,3700,CONT_POLY,* ++V 7400,2000,CONT_DIF_N,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/xaoi21_x1.vbe b/alliance/src/cells/src/msxlib/xaoi21_x1.vbe +new file mode 100644 +index 0000000..2c54cf0 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaoi21_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY xaoi21_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 9000; ++ CONSTANT cin_b : NATURAL := 11; ++ CONSTANT cin_a1 : NATURAL := 8; ++ CONSTANT cin_a2 : NATURAL := 8; ++ CONSTANT rdown_b_z : NATURAL := 2070; ++ CONSTANT rdown_a1_z : NATURAL := 2010; ++ CONSTANT rdown_a2_z : NATURAL := 2010; ++ CONSTANT rup_b_z : NATURAL := 1940; ++ CONSTANT rup_a1_z : NATURAL := 2500; ++ CONSTANT rup_a2_z : NATURAL := 2500; ++ CONSTANT tphl_a1_z : NATURAL := 74; ++ CONSTANT tphl_a2_z : NATURAL := 75; ++ CONSTANT tphl_b_z : NATURAL := 63; ++ CONSTANT tplh_b_z : NATURAL := 39; ++ CONSTANT tplh_a1_z : NATURAL := 82; ++ CONSTANT tplh_a2_z : NATURAL := 77; ++ CONSTANT tphh_b_z : NATURAL := 79; ++ CONSTANT tpll_b_z : NATURAL := 60; ++ CONSTANT tphh_a1_z : NATURAL := 110; ++ CONSTANT tphh_a2_z : NATURAL := 111; ++ CONSTANT tpll_a1_z : NATURAL := 112; ++ CONSTANT tpll_a2_z : NATURAL := 105; ++ CONSTANT transistors : NATURAL := 11 ++); ++PORT ( ++ b : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xaoi21_x1; ++ ++ARCHITECTURE behaviour_data_flow OF xaoi21_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xaoi21_x1" ++ SEVERITY WARNING; ++ z <= not ((b xor (a1 and a2))) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xaon21_x05.ap b/alliance/src/cells/src/msxlib/xaon21_x05.ap +new file mode 100644 +index 0000000..8b813d0 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaon21_x05.ap +@@ -0,0 +1,131 @@ ++V ALLIANCE : 6 ++H xaon21_x05,P, 9/ 8/2014,100 ++A 0,0,8000,10000 ++R 1000,3000,ref_ref,a1_30 ++R 1000,4000,ref_ref,a1_40 ++R 3000,3000,ref_ref,z_30 ++R 2000,3000,ref_ref,a1_30 ++R 3000,6000,ref_ref,a2_60 ++R 4000,4000,ref_ref,z_40 ++R 4000,5000,ref_ref,z_50 ++R 4000,6000,ref_ref,z_60 ++R 4000,3000,ref_ref,z_30 ++R 6000,2000,ref_ref,b_20 ++R 6000,3000,ref_ref,b_30 ++R 6000,4000,ref_ref,b_40 ++R 2000,6000,ref_ref,a2_60 ++R 3000,5000,ref_ref,a2_50 ++R 3000,4000,ref_ref,a2_40 ++R 7000,2000,ref_ref,b_20 ++R 1000,2000,ref_ref,a1_20 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 3200,400,6800,400,200,*,RIGHT,POLY ++S 1200,2900,1200,5200,200,*,UP,POLY ++S 1000,3000,2000,3000,600,*,LEFT,ALU1 ++S 2000,3000,2000,3000,400,a1,LEFT,CALU1 ++S 2000,2900,2000,4300,200,*,UP,POLY ++S 2600,1900,2600,2700,600,*,UP,NDIF ++S 2500,2000,5200,2000,400,*,LEFT,ALU1 ++S 1600,1900,1600,2700,400,n2,UP,NDIF ++S 1200,1700,1200,2900,200,09,UP,NTRANS ++S 1200,1300,1200,1700,200,*,DOWN,POLY ++S 2000,1700,2000,2900,200,10,UP,NTRANS ++S 2000,1300,2000,1700,200,*,DOWN,POLY ++S 3000,3000,3000,3000,400,z,LEFT,CALU1 ++S 3000,3000,4000,3000,600,*,RIGHT,ALU1 ++S 6800,400,6800,2800,200,*,UP,POLY ++S 6600,4900,7400,4900,400,*,RIGHT,ALU1 ++S 3200,400,3200,1700,200,*,DOWN,POLY ++S 2000,4300,2800,4300,200,*,RIGHT,POLY ++S 4000,3000,4000,6000,400,z,DOWN,CALU1 ++S 2800,4300,2800,5000,200,*,UP,POLY ++S 2000,6000,2000,6000,400,a2,LEFT,CALU1 ++S 3000,3900,3000,6100,400,*,UP,ALU1 ++S 3000,4000,3000,6000,400,a2,DOWN,CALU1 ++S 2000,6000,3000,6000,600,*,LEFT,ALU1 ++S 6000,1900,6000,4100,400,*,DOWN,ALU1 ++S 6000,2000,6000,4000,400,b,DOWN,CALU1 ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,8000,5000,10000,xaon21_x05,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 7000,2000,7000,2000,400,b,LEFT,CALU1 ++S 6000,2000,7000,2000,600,*,LEFT,ALU1 ++S 4700,2500,4700,3000,400,n1,UP,NDIF ++S 5200,2300,5200,3200,200,07,UP,NTRANS ++S 4400,2300,4400,3200,200,06,UP,NTRANS ++S 3600,2500,3600,3000,600,*,UP,NDIF ++S 3600,2200,3600,3000,400,*,DOWN,NDIF ++S 3200,2000,3200,3200,200,08,UP,NTRANS ++S 2800,2200,2800,3000,400,*,DOWN,NDIF ++S 3200,3200,3200,3600,200,*,UP,POLY ++S 4400,1900,4400,2300,200,*,DOWN,POLY ++S 5200,1900,5200,2300,200,*,DOWN,POLY ++S 7200,2900,7200,3400,400,*,UP,NDIF ++S 6800,2700,6800,3600,200,11,UP,NTRANS ++S 6100,900,6100,3400,800,*,UP,NDIF ++S 7400,3200,7400,4900,400,*,UP,ALU1 ++S 6800,4000,7500,4000,200,*,RIGHT,POLY ++S 5200,5400,5800,5400,400,*,RIGHT,ALU1 ++S 5200,2000,5200,5400,400,*,UP,ALU1 ++S 5500,6000,5500,8000,200,04,DOWN,PTRANS ++S 4300,6000,4300,8000,200,03,DOWN,PTRANS ++S 4900,6200,4900,7800,600,*,UP,PDIF ++S 4400,3300,4400,4600,200,*,UP,POLY ++S 4300,4600,4300,6000,200,*,DOWN,POLY ++S 4300,4600,6900,4600,200,*,LEFT,POLY ++S 4000,6300,5000,6300,400,*,LEFT,ALU1 ++S 4000,2900,4000,6300,400,*,DOWN,ALU1 ++S 3200,7100,5800,7100,400,*,LEFT,ALU1 ++S 3200,6900,3200,7100,400,*,UP,ALU1 ++S 5800,5400,5800,7100,400,*,UP,ALU1 ++S 5900,6200,5900,7800,400,*,UP,PDIF ++S 5500,8000,5500,8400,200,*,UP,POLY ++S 4300,8000,4300,8400,200,*,UP,POLY ++S 6000,7900,6600,7900,400,*,LEFT,ALU1 ++S 6600,4900,6600,7900,400,*,DOWN,ALU1 ++S 6200,6400,6200,8000,600,*,DOWN,PDIF ++S 7500,4000,7500,5800,200,*,DOWN,POLY ++S 7400,6400,7400,8000,600,*,DOWN,PDIF ++S 7400,6700,7400,9300,400,*,UP,ALU1 ++S 6700,8200,6700,8600,200,*,UP,POLY ++S 6700,6200,6700,8200,200,05,DOWN,PTRANS ++S 6700,5800,7500,5800,200,*,RIGHT,POLY ++S 3800,6200,3800,7800,600,*,UP,PDIF ++S 2300,7700,2300,9300,600,*,UP,ALU1 ++S 2500,6200,2500,7800,600,*,UP,PDIF ++S 1700,6000,1700,8000,200,01,DOWN,PTRANS ++S 1300,6200,1300,7800,400,*,UP,PDIF ++S 1700,8000,1700,8400,200,*,UP,POLY ++S 1700,5200,1700,6100,200,*,DOWN,POLY ++S 1200,5200,1700,5200,200,*,RIGHT,POLY ++S 600,900,600,2700,600,*,UP,NDIF ++S 1000,2000,1000,4000,400,a1,DOWN,CALU1 ++S 1000,1900,1000,4100,400,*,DOWN,ALU1 ++S 3100,8000,3100,8400,200,*,UP,POLY ++S 3100,6000,3100,8000,200,02,DOWN,PTRANS ++S 3100,4800,3100,6100,200,*,DOWN,POLY ++S 1000,6900,3200,6900,400,*,LEFT,ALU1 ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,3500,CONT_POLY,* ++V 2600,2000,CONT_DIF_N,an ++V 6700,4900,CONT_POLY,bn ++V 6100,1000,CONT_DIF_N,* ++V 7000,2000,CONT_POLY,* ++V 3000,5000,CONT_POLY,* ++V 5200,3800,CONT_POLY,an ++V 3800,2900,CONT_DIF_N,* ++V 7400,3300,CONT_DIF_N,bn ++V 4900,6300,CONT_DIF_P,* ++V 6100,7900,CONT_DIF_P,bn ++V 7400,6800,CONT_DIF_P,* ++V 7400,7800,CONT_DIF_P,* ++V 5300,5400,CONT_POLY,an ++V 2300,7700,CONT_DIF_P,* ++V 1100,6900,CONT_DIF_P,an ++V 600,1000,CONT_DIF_N,* ++V 3700,7100,CONT_DIF_P,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/xaon21_x05.vbe b/alliance/src/cells/src/msxlib/xaon21_x05.vbe +new file mode 100644 +index 0000000..a437136 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaon21_x05.vbe +@@ -0,0 +1,44 @@ ++ENTITY xaon21_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_a1 : NATURAL := 4; ++ CONSTANT cin_a2 : NATURAL := 4; ++ CONSTANT rdown_b_z : NATURAL := 3870; ++ CONSTANT rdown_a1_z : NATURAL := 3870; ++ CONSTANT rdown_a2_z : NATURAL := 3870; ++ CONSTANT rup_b_z : NATURAL := 3790; ++ CONSTANT rup_a1_z : NATURAL := 4790; ++ CONSTANT rup_a2_z : NATURAL := 4780; ++ CONSTANT tplh_a1_z : NATURAL := 82; ++ CONSTANT tplh_a2_z : NATURAL := 78; ++ CONSTANT tphl_b_z : NATURAL := 29; ++ CONSTANT tplh_b_z : NATURAL := 88; ++ CONSTANT tphh_b_z : NATURAL := 55; ++ CONSTANT tphl_a1_z : NATURAL := 76; ++ CONSTANT tphl_a2_z : NATURAL := 78; ++ CONSTANT tpll_a1_z : NATURAL := 111; ++ CONSTANT tpll_a2_z : NATURAL := 105; ++ CONSTANT tpll_b_z : NATURAL := 88; ++ CONSTANT tphh_a1_z : NATURAL := 113; ++ CONSTANT tphh_a2_z : NATURAL := 114; ++ CONSTANT transistors : NATURAL := 11 ++); ++PORT ( ++ b : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xaon21_x05; ++ ++ARCHITECTURE behaviour_data_flow OF xaon21_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xaon21_x05" ++ SEVERITY WARNING; ++ z <= (b xor (a1 and a2)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xaon21_x1.ap b/alliance/src/cells/src/msxlib/xaon21_x1.ap +new file mode 100644 +index 0000000..ec6bccd +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaon21_x1.ap +@@ -0,0 +1,130 @@ ++V ALLIANCE : 6 ++H xaon21_x1,P, 9/ 8/2014,100 ++A 0,0,8000,10000 ++R 4000,4000,ref_ref,z_40 ++R 4000,5000,ref_ref,z_50 ++R 3000,7000,ref_ref,a2_70 ++R 2000,7000,ref_ref,a2_70 ++R 2000,5000,ref_ref,a2_50 ++R 1000,5000,ref_ref,a1_50 ++R 1000,3000,ref_ref,a1_30 ++R 1000,4000,ref_ref,a1_40 ++R 3000,3000,ref_ref,z_30 ++R 2000,3000,ref_ref,a1_30 ++R 4000,6000,ref_ref,z_60 ++R 4000,3000,ref_ref,z_30 ++R 2000,6000,ref_ref,a2_60 ++R 7000,5000,ref_ref,b_50 ++R 3000,5000,ref_ref,b_50 ++R 7000,6000,ref_ref,b_60 ++R 3000,4000,ref_ref,b_40 ++S 6800,3800,6800,5200,200,*,DOWN,POLY ++S 6800,300,6800,2100,200,*,UP,POLY ++S 6100,1400,6100,3600,800,*,UP,NDIF ++S 7400,2600,7400,4000,400,*,UP,ALU1 ++S 7400,2800,7400,3400,600,*,UP,NDIF ++S 7200,2300,7200,3600,400,*,UP,NDIF ++S 6800,2100,6800,3800,200,11,UP,NTRANS ++S 3200,300,3200,1200,200,*,DOWN,POLY ++S 1200,3600,1200,5200,200,*,UP,POLY ++S 6000,9400,6000,9700,200,*,DOWN,POLY ++S 4800,9400,4800,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 6000,700,6000,3100,400,*,DOWN,ALU1 ++S 600,7100,600,7700,600,*,UP,PDIF ++S 600,8000,4200,8000,400,*,LEFT,ALU1 ++S 600,6900,600,8000,400,*,UP,ALU1 ++S 6800,5800,6800,9200,800,*,DOWN,PDIF ++S 6800,6900,6800,9300,400,*,UP,ALU1 ++S 6000,4000,6000,8000,400,*,DOWN,ALU1 ++S 6000,4000,7400,4000,400,*,LEFT,ALU1 ++S 3800,1400,3800,3000,600,*,DOWN,NDIF ++S 1200,800,1200,1200,200,*,DOWN,POLY ++S 2000,800,2000,1200,200,*,DOWN,POLY ++S 2000,3600,2000,4600,200,*,UP,POLY ++S 5200,900,5200,1200,200,*,DOWN,POLY ++S 4400,900,4400,1200,200,*,DOWN,POLY ++S 7000,4900,7000,6100,400,*,DOWN,ALU1 ++S 3000,3900,3000,5100,400,*,DOWN,ALU1 ++S 2400,5100,2400,5600,200,*,DOWN,POLY ++S 4000,6000,4200,6000,600,*,LEFT,ALU1 ++S 3000,3000,3000,3000,400,z,LEFT,CALU1 ++S 4000,3000,4000,6000,400,z,DOWN,CALU1 ++S 4000,2900,4000,6100,400,*,DOWN,ALU1 ++S 600,1400,600,3400,600,*,UP,NDIF ++S 1200,1200,1200,3600,200,09,UP,NTRANS ++S 1600,1400,1600,3400,400,n2,UP,NDIF ++S 2800,2000,2800,3400,400,*,DOWN,NDIF ++S 3600,1400,3600,3400,400,*,UP,NDIF ++S 3200,1200,3200,3600,200,08,UP,NTRANS ++S 2000,1200,2000,3600,200,10,UP,NTRANS ++S 2600,1400,2600,3400,600,*,UP,NDIF ++S 2500,2000,5000,2000,400,*,LEFT,ALU1 ++S 5000,3400,5200,3400,600,*,RIGHT,ALU1 ++S 4200,7000,5000,7000,400,*,LEFT,ALU1 ++S 5000,2000,5000,7000,400,*,UP,ALU1 ++S 6000,5200,6800,5200,200,*,RIGHT,POLY ++S 5300,8000,6000,8000,400,*,LEFT,ALU1 ++S 3600,5200,4000,5200,200,*,RIGHT,POLY ++S 4800,5600,4800,9400,200,04,DOWN,PTRANS ++S 5400,5800,5400,9200,600,*,DOWN,PDIF ++S 6000,5600,6000,9400,200,05,DOWN,PTRANS ++S 2400,5600,2400,9400,200,02,DOWN,PTRANS ++S 3000,5800,3000,9200,600,*,UP,PDIF ++S 3600,5600,3600,9400,200,03,DOWN,PTRANS ++S 4000,4200,6000,4200,200,*,RIGHT,POLY ++S 4000,4200,4000,5200,200,*,DOWN,POLY ++S 4200,7000,4200,8000,400,*,UP,ALU1 ++S 4000,5800,4000,9200,600,*,UP,PDIF ++S 1700,5800,1700,9200,600,*,UP,PDIF ++S 4400,2800,4400,4200,200,*,UP,POLY ++S 3000,7000,3000,7000,400,a2,LEFT,CALU1 ++S 2000,7000,3000,7000,600,*,LEFT,ALU1 ++S 2000,4900,2000,7100,400,*,UP,ALU1 ++S 2000,5000,2000,7000,400,a2,DOWN,CALU1 ++S 1200,5600,1200,9400,200,01,DOWN,PTRANS ++S 800,5800,800,9200,400,*,UP,PDIF ++S 4400,1200,4400,2800,200,06,UP,NTRANS ++S 5200,1200,5200,2800,200,07,UP,NTRANS ++S 4700,1400,4700,2600,400,n1,UP,NDIF ++S 3200,300,6800,300,200,*,RIGHT,POLY ++S 1000,3000,2000,3000,600,*,LEFT,ALU1 ++S 1000,3000,1000,5000,400,a1,DOWN,CALU1 ++S 1000,2900,1000,5100,400,*,DOWN,ALU1 ++S 2000,3000,2000,3000,400,a1,LEFT,CALU1 ++S 600,700,600,2100,400,*,DOWN,ALU1 ++S 3000,3000,4000,3000,600,*,RIGHT,ALU1 ++S 0,600,8000,600,1200,vss,RIGHT,CALU1 ++S 0,9400,8000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,8000,5000,10000,xaon21_x1,LEFT,TALU8 ++S 0,2200,8000,2200,5200,*,LEFT,PWELL ++S 0,7600,8000,7600,5600,*,LEFT,NWELL ++S 7000,5000,7000,6000,400,b,DOWN,CALU1 ++S 3000,4000,3000,5000,400,b,UP,CALU1 ++V 7300,700,CONT_BODY_P,* ++V 7400,2700,CONT_DIF_N,bn ++V 7400,3500,CONT_DIF_N,bn ++V 6000,3000,CONT_DIF_N,* ++V 6000,2000,CONT_DIF_N,* ++V 600,7800,CONT_DIF_P,an ++V 600,7000,CONT_DIF_P,an ++V 6800,9000,CONT_DIF_P,* ++V 6800,8000,CONT_DIF_P,* ++V 6800,7000,CONT_DIF_P,* ++V 3800,2900,CONT_DIF_N,* ++V 7000,5000,CONT_POLY,* ++V 3000,4200,CONT_POLY,* ++V 5000,5000,CONT_POLY,an ++V 6000,4400,CONT_POLY,bn ++V 5400,8000,CONT_DIF_P,bn ++V 4200,6000,CONT_DIF_P,* ++V 1800,9000,CONT_DIF_P,* ++V 3000,8000,CONT_DIF_P,an ++V 2000,5000,CONT_POLY,* ++V 1000,5000,CONT_POLY,* ++V 5200,3400,CONT_POLY,an ++V 600,2000,CONT_DIF_N,* ++V 2600,2000,CONT_DIF_N,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/xaon21_x1.vbe b/alliance/src/cells/src/msxlib/xaon21_x1.vbe +new file mode 100644 +index 0000000..79f01d2 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaon21_x1.vbe +@@ -0,0 +1,44 @@ ++ENTITY xaon21_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 8000; ++ CONSTANT cin_b : NATURAL := 10; ++ CONSTANT cin_a1 : NATURAL := 7; ++ CONSTANT cin_a2 : NATURAL := 8; ++ CONSTANT rdown_b_z : NATURAL := 2130; ++ CONSTANT rdown_a1_z : NATURAL := 2060; ++ CONSTANT rdown_a2_z : NATURAL := 2060; ++ CONSTANT rup_b_z : NATURAL := 1980; ++ CONSTANT rup_a1_z : NATURAL := 2500; ++ CONSTANT rup_a2_z : NATURAL := 2500; ++ CONSTANT tplh_a1_z : NATURAL := 78; ++ CONSTANT tplh_a2_z : NATURAL := 73; ++ CONSTANT tphl_b_z : NATURAL := 27; ++ CONSTANT tplh_b_z : NATURAL := 82; ++ CONSTANT tphh_b_z : NATURAL := 51; ++ CONSTANT tphl_a1_z : NATURAL := 69; ++ CONSTANT tphl_a2_z : NATURAL := 70; ++ CONSTANT tpll_a1_z : NATURAL := 105; ++ CONSTANT tpll_a2_z : NATURAL := 99; ++ CONSTANT tpll_b_z : NATURAL := 83; ++ CONSTANT tphh_a1_z : NATURAL := 100; ++ CONSTANT tphh_a2_z : NATURAL := 101; ++ CONSTANT transistors : NATURAL := 11 ++); ++PORT ( ++ b : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xaon21_x1; ++ ++ARCHITECTURE behaviour_data_flow OF xaon21_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xaon21_x1" ++ SEVERITY WARNING; ++ z <= (b xor (a1 and a2)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xaon22_x05.ap b/alliance/src/cells/src/msxlib/xaon22_x05.ap +new file mode 100644 +index 0000000..f014b42 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaon22_x05.ap +@@ -0,0 +1,164 @@ ++V ALLIANCE : 6 ++H xaon22_x05,P, 9/ 8/2014,100 ++A 0,0,10000,10000 ++R 2000,4000,ref_ref,a1_40 ++R 8000,7000,ref_ref,b1_70 ++R 8000,6000,ref_ref,b1_60 ++R 8000,4000,ref_ref,b2_40 ++R 8000,3000,ref_ref,b2_30 ++R 8000,2000,ref_ref,b2_20 ++R 5000,3000,ref_ref,z_30 ++R 3000,4000,ref_ref,a2_40 ++R 3000,5000,ref_ref,a2_50 ++R 2000,6000,ref_ref,a2_60 ++R 4000,3000,ref_ref,z_30 ++R 4000,6000,ref_ref,z_60 ++R 4000,5000,ref_ref,z_50 ++R 4000,4000,ref_ref,z_40 ++R 3000,6000,ref_ref,a2_60 ++R 1000,4000,ref_ref,a1_40 ++R 1000,3000,ref_ref,a1_30 ++R 1000,5000,ref_ref,a1_50 ++R 7000,6000,ref_ref,b1_60 ++R 8000,5000,ref_ref,b1_50 ++R 9000,2000,ref_ref,b2_20 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 7000,6000,8000,6000,600,*,RIGHT,ALU1 ++S 8000,4900,8000,7100,400,*,UP,ALU1 ++S 6200,4800,6200,8000,400,*,UP,ALU1 ++S 1600,1900,1600,3100,400,n2,UP,NDIF ++S 2600,2000,6000,2000,400,*,LEFT,ALU1 ++S 2600,2000,2600,3100,400,*,DOWN,ALU1 ++S 2000,4000,2000,4000,400,a1,LEFT,CALU1 ++S 1000,4000,2000,4000,600,*,LEFT,ALU1 ++S 5200,2400,5200,3300,200,6z,UP,NTRANS ++S 6000,2400,6000,3300,200,5z,UP,NTRANS ++S 4000,1700,4000,3300,200,4z,UP,NTRANS ++S 3200,1700,3200,3300,200,3z,UP,NTRANS ++S 8600,1700,8600,3300,200,4b,UP,NTRANS ++S 7800,1700,7800,3300,200,3b,UP,NTRANS ++S 2000,1700,2000,3300,200,4a,UP,NTRANS ++S 1200,1700,1200,3300,200,3a,UP,NTRANS ++S 5600,2600,5600,3100,400,n1,UP,NDIF ++S 6800,1900,6800,3100,1000,*,UP,NDIF ++S 9000,1900,9000,3100,400,*,UP,NDIF ++S 3200,700,8600,700,200,*,RIGHT,POLY ++S 8600,3300,8600,4000,200,*,UP,POLY ++S 8600,700,8600,1700,200,*,DOWN,POLY ++S 2000,3300,2000,4600,200,*,UP,POLY ++S 2000,4600,2800,4600,200,*,RIGHT,POLY ++S 1200,3300,1200,5200,200,*,UP,POLY ++S 2000,1300,2000,1700,200,*,DOWN,POLY ++S 1200,1300,1200,1700,200,*,DOWN,POLY ++S 3200,700,3200,1700,200,*,DOWN,POLY ++S 4400,1900,4400,3100,400,*,DOWN,NDIF ++S 600,1900,600,3100,600,*,UP,NDIF ++S 2600,1900,2600,3100,600,*,UP,NDIF ++S 3200,3300,3200,3700,200,*,UP,POLY ++S 4000,3300,4000,3700,200,*,UP,POLY ++S 5200,2000,5200,2400,200,*,DOWN,POLY ++S 6000,2000,6000,2400,200,*,DOWN,POLY ++S 4000,1300,7800,1300,200,*,RIGHT,POLY ++S 7800,3300,7800,5500,200,*,UP,POLY ++S 7000,700,7000,3100,400,*,DOWN,ALU1 ++S 8000,2000,8000,4000,400,b2,DOWN,CALU1 ++S 4000,3000,5000,3000,600,*,RIGHT,ALU1 ++S 5000,3000,5000,3000,400,z,LEFT,CALU1 ++S 5200,3300,5200,4700,200,*,UP,POLY ++S 4400,2600,4400,3100,600,*,UP,NDIF ++S 0,9400,10000,9400,1200,vdd,RIGHT,CALU1 ++S 0,5000,10000,5000,10000,xaon22_x05,LEFT,TALU8 ++S 0,2200,10000,2200,5200,*,LEFT,PWELL ++S 0,7600,10000,7600,5600,*,LEFT,NWELL ++S 0,600,10000,600,1200,vss,RIGHT,CALU1 ++S 2000,6000,3000,6000,600,*,LEFT,ALU1 ++S 3000,4000,3000,6000,400,a2,DOWN,CALU1 ++S 3000,3900,3000,6100,400,*,UP,ALU1 ++S 2000,6000,2000,6000,400,a2,LEFT,CALU1 ++S 4000,3000,4000,6000,400,z,DOWN,CALU1 ++S 600,700,600,2100,400,*,DOWN,ALU1 ++S 2800,2300,2800,3100,400,*,DOWN,NDIF ++S 1000,2900,1000,5100,400,*,DOWN,ALU1 ++S 1000,3000,1000,5000,400,a1,DOWN,CALU1 ++S 6000,2000,6000,4000,400,*,UP,ALU1 ++S 2200,7700,2200,9300,400,*,UP,ALU1 ++S 1200,5200,1600,5200,200,*,RIGHT,POLY ++S 5400,4000,6000,4000,400,*,RIGHT,ALU1 ++S 6800,5800,8000,5800,200,*,LEFT,POLY ++S 8000,1900,8000,4000,400,*,DOWN,ALU1 ++S 6800,6200,6800,8200,200,1b,DOWN,PTRANS ++S 7000,6000,7000,6000,400,b1,LEFT,CALU1 ++S 8000,5000,8000,7000,400,b1,UP,CALU1 ++S 6200,8000,9400,8000,400,*,RIGHT,ALU1 ++S 7800,6400,7800,9100,1400,*,DOWN,PDIF ++S 8800,6200,8800,8200,200,2b,DOWN,PTRANS ++S 9200,6400,9200,8000,400,*,DOWN,PDIF ++S 9400,6600,9400,7200,600,*,UP,PDIF ++S 9000,2000,9000,2000,400,b2,LEFT,CALU1 ++S 8000,4000,8600,4000,600,*,LEFT,ALU1 ++S 8000,2000,9000,2000,600,*,RIGHT,ALU1 ++S 9400,2900,9400,8000,400,*,UP,ALU1 ++S 9100,3000,9400,3000,600,*,RIGHT,ALU1 ++S 8800,4000,8800,6200,200,*,UP,POLY ++S 8800,8200,8800,8600,200,*,UP,POLY ++S 6800,8200,6800,8600,200,*,UP,POLY ++S 4000,4700,6400,4700,200,*,LEFT,POLY ++S 4000,6500,4600,6500,600,*,LEFT,ALU1 ++S 5200,6200,5200,8200,200,2z,DOWN,PTRANS ++S 4600,6400,4600,8000,600,*,UP,PDIF ++S 4000,6200,4000,8200,200,1z,DOWN,PTRANS ++S 4000,2900,4000,6600,400,*,DOWN,ALU1 ++S 5400,4000,5400,7500,400,*,DOWN,ALU1 ++S 6000,6400,6000,8000,600,*,UP,PDIF ++S 5200,8200,5200,8600,200,*,UP,POLY ++S 4000,8200,4000,8600,200,*,UP,POLY ++S 5200,5500,5200,6200,200,*,DOWN,POLY ++S 4900,5500,5400,5500,400,*,LEFT,ALU1 ++S 2800,6200,2800,8200,200,2a,DOWN,PTRANS ++S 3400,6400,3400,8000,600,*,UP,PDIF ++S 2200,6400,2200,8000,600,*,UP,PDIF ++S 1600,6200,1600,8200,200,1a,DOWN,PTRANS ++S 1200,6400,1200,8000,400,*,UP,PDIF ++S 3000,6900,3000,7500,400,*,UP,ALU1 ++S 3000,7500,5400,7500,400,*,LEFT,ALU1 ++S 1000,6900,3000,6900,400,*,LEFT,ALU1 ++S 2800,8200,2800,8600,200,*,UP,POLY ++S 1600,8200,1600,8600,200,*,UP,POLY ++S 1600,5200,1600,6200,200,*,DOWN,POLY ++S 2800,4800,2800,6200,200,*,DOWN,POLY ++S 4000,4700,4000,6200,200,*,UP,POLY ++S 1000,7200,1000,7800,600,*,UP,PDIF ++S 1000,6900,1000,8000,400,*,UP,ALU1 ++S 3600,1900,3600,3100,400,n3,UP,NDIF ++S 8200,1900,8200,3100,400,n4,UP,NDIF ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 6200,4900,CONT_POLY,bn ++V 6200,7300,CONT_DIF_P,bn ++V 6200,6500,CONT_DIF_P,bn ++V 8200,9000,CONT_DIF_P,* ++V 7400,9000,CONT_DIF_P,* ++V 2600,2200,CONT_DIF_N,an ++V 2600,3000,CONT_DIF_N,an ++V 9200,3000,CONT_DIF_N,bn ++V 3000,4800,CONT_POLY,* ++V 1000,5000,CONT_POLY,* ++V 7000,2000,CONT_DIF_N,* ++V 8600,4000,CONT_POLY,* ++V 7000,3000,CONT_DIF_N,* ++V 6000,3900,CONT_POLY,an ++V 4600,3000,CONT_DIF_N,* ++V 600,2000,CONT_DIF_N,* ++V 2200,7800,CONT_DIF_P,* ++V 8000,5600,CONT_POLY,* ++V 9400,6500,CONT_DIF_P,bn ++V 9400,7300,CONT_DIF_P,bn ++V 4600,6500,CONT_DIF_P,* ++V 5000,5500,CONT_POLY,an ++V 3400,7500,CONT_DIF_P,an ++V 1000,7900,CONT_DIF_P,an ++V 1000,7100,CONT_DIF_P,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/xaon22_x05.vbe b/alliance/src/cells/src/msxlib/xaon22_x05.vbe +new file mode 100644 +index 0000000..94984ef +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaon22_x05.vbe +@@ -0,0 +1,52 @@ ++ENTITY xaon22_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 10000; ++ CONSTANT cin_b1 : NATURAL := 7; ++ CONSTANT cin_b2 : NATURAL := 7; ++ CONSTANT cin_a1 : NATURAL := 5; ++ CONSTANT cin_a2 : NATURAL := 5; ++ CONSTANT rdown_b1_z : NATURAL := 3810; ++ CONSTANT rdown_b2_z : NATURAL := 3830; ++ CONSTANT rdown_a1_z : NATURAL := 3880; ++ CONSTANT rdown_a2_z : NATURAL := 3870; ++ CONSTANT rup_b1_z : NATURAL := 3950; ++ CONSTANT rup_b2_z : NATURAL := 3980; ++ CONSTANT rup_a1_z : NATURAL := 5000; ++ CONSTANT rup_a2_z : NATURAL := 4990; ++ CONSTANT tplh_a1_z : NATURAL := 100; ++ CONSTANT tplh_a2_z : NATURAL := 94; ++ CONSTANT tphl_b1_z : NATURAL := 34; ++ CONSTANT tphl_b2_z : NATURAL := 36; ++ CONSTANT tplh_b1_z : NATURAL := 115; ++ CONSTANT tplh_b2_z : NATURAL := 118; ++ CONSTANT tphh_b1_z : NATURAL := 61; ++ CONSTANT tphh_b2_z : NATURAL := 67; ++ CONSTANT tphl_a1_z : NATURAL := 75; ++ CONSTANT tphl_a2_z : NATURAL := 77; ++ CONSTANT tpll_a1_z : NATURAL := 121; ++ CONSTANT tpll_a2_z : NATURAL := 114; ++ CONSTANT tpll_b1_z : NATURAL := 111; ++ CONSTANT tpll_b2_z : NATURAL := 107; ++ CONSTANT tphh_a1_z : NATURAL := 107; ++ CONSTANT tphh_a2_z : NATURAL := 107; ++ CONSTANT transistors : NATURAL := 14 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xaon22_x05; ++ ++ARCHITECTURE behaviour_data_flow OF xaon22_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xaon22_x05" ++ SEVERITY WARNING; ++ z <= ((b1 and b2) xor (a1 and a2)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xaon22_x1.ap b/alliance/src/cells/src/msxlib/xaon22_x1.ap +new file mode 100644 +index 0000000..5f59fce +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaon22_x1.ap +@@ -0,0 +1,166 @@ ++V ALLIANCE : 6 ++H xaon22_x1,P,21/10/2004,100 ++A 0,0,10000,10000 ++R 8000,7000,ref_ref,b1_70 ++R 8000,6000,ref_ref,b1_60 ++R 8000,4000,ref_ref,b2_40 ++R 8000,3000,ref_ref,b2_30 ++R 8000,2000,ref_ref,b2_20 ++R 5000,3000,ref_ref,z_30 ++R 3000,4000,ref_ref,a2_40 ++R 3000,5000,ref_ref,a2_50 ++R 2000,6000,ref_ref,a2_60 ++R 4000,3000,ref_ref,z_30 ++R 4000,6000,ref_ref,z_60 ++R 4000,5000,ref_ref,z_50 ++R 4000,4000,ref_ref,z_40 ++R 3000,6000,ref_ref,a2_60 ++R 1000,4000,ref_ref,a1_40 ++R 1000,3000,ref_ref,a1_30 ++R 9000,2000,ref_ref,b2_20 ++R 4000,7000,ref_ref,z_70 ++R 2000,5000,ref_ref,a1_50 ++R 1000,5000,ref_ref,a1_50 ++R 8000,5000,ref_ref,b1_50 ++R 7000,7000,ref_ref,b1_70 ++S 4000,3000,4000,7000,400,z,DOWN,CALU1 ++S 4200,1500,4200,3400,400,n3,UP,NDIF ++S 8000,2000,8000,4000,400,b2,DOWN,CALU1 ++S 5000,3000,5000,3000,400,z,LEFT,CALU1 ++S 0,9400,10000,9400,1200,vdd,RIGHT,CALU1 ++S 0,7600,10000,7600,5600,*,LEFT,NWELL ++S 0,2200,10000,2200,5200,*,LEFT,PWELL ++S 0,5000,10000,5000,10000,xaon22_x1,LEFT,TALU8 ++S 0,600,10000,600,1200,vss,RIGHT,CALU1 ++S 2000,6000,3000,6000,600,*,LEFT,ALU1 ++S 3000,4000,3000,6000,400,a2,DOWN,CALU1 ++S 3000,3900,3000,6100,400,*,UP,ALU1 ++S 2000,6000,2000,6000,400,a2,LEFT,CALU1 ++S 8000,5000,8000,7000,400,b1,UP,CALU1 ++S 6200,8000,9400,8000,400,*,RIGHT,ALU1 ++S 9000,2000,9000,2000,400,b2,LEFT,CALU1 ++S 8000,2000,9000,2000,600,*,RIGHT,ALU1 ++S 5200,5500,5200,6200,200,*,DOWN,POLY ++S 1000,6900,3000,6900,400,*,LEFT,ALU1 ++S 7200,700,7200,3100,400,*,DOWN,ALU1 ++S 6600,1500,6600,1900,200,*,DOWN,POLY ++S 5800,1500,5800,1900,200,*,DOWN,POLY ++S 4600,900,7800,900,200,*,RIGHT,POLY ++S 3800,300,3800,1300,200,*,DOWN,POLY ++S 3800,300,8600,300,200,*,RIGHT,POLY ++S 3000,8000,5400,8000,400,*,LEFT,ALU1 ++S 3000,6900,3000,8000,400,*,UP,ALU1 ++S 4000,7000,4600,7000,600,*,LEFT,ALU1 ++S 4000,2900,4000,7100,400,*,DOWN,ALU1 ++S 3000,800,3000,3700,400,*,DOWN,NDIF ++S 2600,600,2600,3900,200,4a,UP,NTRANS ++S 3200,2000,3200,3100,400,*,DOWN,ALU1 ++S 3200,2000,6000,2000,400,*,LEFT,ALU1 ++S 2200,800,2200,3700,400,n2,UP,NDIF ++S 1800,600,1800,3900,200,3a,UP,NTRANS ++S 1200,700,1200,2100,400,*,DOWN,ALU1 ++S 1100,800,1100,3700,600,*,UP,NDIF ++S 1800,3900,1800,5200,200,*,UP,POLY ++S 2600,3900,2600,4700,200,*,UP,POLY ++S 1000,5000,2000,5000,600,*,LEFT,ALU1 ++S 2000,5000,2000,5000,400,a1,LEFT,CALU1 ++S 1000,2900,1000,5100,400,*,DOWN,ALU1 ++S 1000,3000,1000,5000,400,a1,DOWN,CALU1 ++S 4000,3000,5200,3000,600,*,RIGHT,ALU1 ++S 2800,5900,2800,9400,200,2a,DOWN,PTRANS ++S 3400,6100,3400,9200,600,*,UP,PDIF ++S 4000,5900,4000,9400,200,1z,DOWN,PTRANS ++S 2200,6100,2200,9200,600,*,UP,PDIF ++S 1600,5900,1600,9400,200,1a,DOWN,PTRANS ++S 1200,6100,1200,9200,400,*,UP,PDIF ++S 6000,6100,6000,9200,600,*,UP,PDIF ++S 5200,5900,5200,9400,200,2z,DOWN,PTRANS ++S 4600,6100,4600,9200,600,*,UP,PDIF ++S 6800,5900,6800,9400,200,1b,DOWN,PTRANS ++S 7800,6100,7800,9200,1400,*,DOWN,PDIF ++S 8800,5900,8800,9400,200,2b,DOWN,PTRANS ++S 4000,4500,5800,4500,200,*,LEFT,POLY ++S 5900,5300,6200,5300,400,*,LEFT,ALU1 ++S 6200,5300,6200,8000,400,*,UP,ALU1 ++S 5400,6100,5400,8000,400,*,DOWN,ALU1 ++S 2200,7900,2200,9300,400,*,UP,ALU1 ++S 4000,4500,4000,5900,200,*,UP,POLY ++S 1600,5200,1600,5900,200,*,DOWN,POLY ++S 2800,4800,2800,5900,200,*,DOWN,POLY ++S 4600,3600,4600,3900,200,*,UP,POLY ++S 3800,3600,3800,3900,200,*,UP,POLY ++S 4600,1300,4600,3600,200,4z,UP,NTRANS ++S 3800,1300,3800,3600,200,3z,UP,NTRANS ++S 3200,1500,3200,3400,600,*,UP,NDIF ++S 5000,1500,5000,3400,400,*,DOWN,NDIF ++S 5200,2000,5200,3400,600,*,DOWN,NDIF ++S 5800,1800,5800,3600,200,6z,UP,NTRANS ++S 6600,1800,6600,3600,200,5z,UP,NTRANS ++S 6200,2000,6200,3400,400,n1,UP,NDIF ++S 5400,2000,5400,3400,400,*,DOWN,NDIF ++S 5800,3600,5800,5100,200,*,UP,POLY ++S 5000,4200,5000,6100,400,*,DOWN,ALU1 ++S 6000,2000,6000,4200,400,*,UP,ALU1 ++S 5000,4200,6700,4200,400,*,LEFT,ALU1 ++S 9200,6100,9200,9200,400,*,DOWN,PDIF ++S 9100,3300,9600,3300,400,*,LEFT,ALU1 ++S 7000,7000,7000,7000,400,b1,LEFT,CALU1 ++S 7000,7000,8000,7000,600,*,RIGHT,ALU1 ++S 8800,4200,8800,5900,200,*,UP,POLY ++S 1800,300,1800,600,200,*,DOWN,POLY ++S 2600,300,2600,600,200,*,DOWN,POLY ++S 1600,9400,1600,9700,200,*,UP,POLY ++S 2800,9400,2800,9700,200,*,UP,POLY ++S 4000,9400,4000,9700,200,*,UP,POLY ++S 5200,9400,5200,9700,200,*,UP,POLY ++S 6800,9400,6800,9700,200,*,UP,POLY ++S 8800,9400,8800,9700,200,*,UP,POLY ++S 1000,7300,1000,7900,600,*,UP,PDIF ++S 1000,6900,1000,8100,400,*,UP,ALU1 ++S 8200,1500,8200,3400,400,n4,UP,NDIF ++S 9000,1500,9000,3400,400,*,UP,NDIF ++S 8600,1300,8600,3600,200,4b,UP,NTRANS ++S 7400,1500,7400,3400,400,*,DOWN,NDIF ++S 7800,1300,7800,3600,200,3b,UP,NTRANS ++S 7200,1500,7200,3400,600,*,UP,NDIF ++S 7800,900,7800,1300,200,*,DOWN,POLY ++S 8600,300,8600,1300,200,*,DOWN,POLY ++S 7800,3600,7800,4900,200,*,UP,POLY ++S 8000,5000,8000,7100,600,*,UP,ALU1 ++S 6800,5200,7600,5200,200,*,RIGHT,POLY ++S 6800,5200,6800,5900,200,*,DOWN,POLY ++S 7500,5000,8100,5000,400,*,RIGHT,ALU1 ++S 8000,4200,8700,4200,400,*,LEFT,ALU1 ++S 8000,1900,8000,4200,400,*,DOWN,ALU1 ++S 9400,6300,9400,6900,600,*,UP,PDIF ++S 9600,3300,9600,6100,400,*,DOWN,ALU1 ++S 9400,6100,9400,8000,400,*,UP,ALU1 ++V 7400,9000,CONT_DIF_P,* ++V 8200,9000,CONT_DIF_P,* ++V 7200,3000,CONT_DIF_N,* ++V 5200,3000,CONT_DIF_N,* ++V 3400,8000,CONT_DIF_P,an ++V 4600,7000,CONT_DIF_P,* ++V 3200,3000,CONT_DIF_N,an ++V 3200,2200,CONT_DIF_N,an ++V 1200,2000,CONT_DIF_N,* ++V 1200,1000,CONT_DIF_N,* ++V 3000,4500,CONT_POLY,* ++V 1600,5000,CONT_POLY,* ++V 6200,7800,CONT_DIF_P,bn ++V 6200,7000,CONT_DIF_P,bn ++V 6200,6200,CONT_DIF_P,bn ++V 5000,5300,CONT_POLY,an ++V 6000,5300,CONT_POLY,bn ++V 2200,8000,CONT_DIF_P,* ++V 2200,9000,CONT_DIF_P,* ++V 6600,4200,CONT_POLY,an ++V 9200,3300,CONT_DIF_N,bn ++V 1000,8000,CONT_DIF_P,an ++V 1000,7200,CONT_DIF_P,an ++V 7600,5000,CONT_POLY,* ++V 8600,4200,CONT_POLY,* ++V 7200,2000,CONT_DIF_N,* ++V 9400,6200,CONT_DIF_P,bn ++V 9400,7000,CONT_DIF_P,bn ++EOF +diff --git a/alliance/src/cells/src/msxlib/xaon22_x1.vbe b/alliance/src/cells/src/msxlib/xaon22_x1.vbe +new file mode 100644 +index 0000000..fb62fa3 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xaon22_x1.vbe +@@ -0,0 +1,52 @@ ++ENTITY xaon22_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 10000; ++ CONSTANT cin_b1 : NATURAL := 10; ++ CONSTANT cin_b2 : NATURAL := 10; ++ CONSTANT cin_a1 : NATURAL := 8; ++ CONSTANT cin_a2 : NATURAL := 8; ++ CONSTANT rdown_b1_z : NATURAL := 1960; ++ CONSTANT rdown_b2_z : NATURAL := 1970; ++ CONSTANT rdown_a1_z : NATURAL := 1970; ++ CONSTANT rdown_a2_z : NATURAL := 1970; ++ CONSTANT rup_b1_z : NATURAL := 2330; ++ CONSTANT rup_b2_z : NATURAL := 2350; ++ CONSTANT rup_a1_z : NATURAL := 2880; ++ CONSTANT rup_a2_z : NATURAL := 2870; ++ CONSTANT tplh_a1_z : NATURAL := 98; ++ CONSTANT tplh_a2_z : NATURAL := 89; ++ CONSTANT tphl_b1_z : NATURAL := 37; ++ CONSTANT tphl_b2_z : NATURAL := 39; ++ CONSTANT tplh_b1_z : NATURAL := 103; ++ CONSTANT tplh_b2_z : NATURAL := 106; ++ CONSTANT tphh_b1_z : NATURAL := 66; ++ CONSTANT tphh_b2_z : NATURAL := 71; ++ CONSTANT tphl_a1_z : NATURAL := 65; ++ CONSTANT tphl_a2_z : NATURAL := 66; ++ CONSTANT tpll_a1_z : NATURAL := 113; ++ CONSTANT tpll_a2_z : NATURAL := 104; ++ CONSTANT tpll_b1_z : NATURAL := 100; ++ CONSTANT tpll_b2_z : NATURAL := 96; ++ CONSTANT tphh_a1_z : NATURAL := 94; ++ CONSTANT tphh_a2_z : NATURAL := 94; ++ CONSTANT transistors : NATURAL := 14 ++); ++PORT ( ++ b1 : in BIT; ++ b2 : in BIT; ++ a1 : in BIT; ++ a2 : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xaon22_x1; ++ ++ARCHITECTURE behaviour_data_flow OF xaon22_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xaon22_x1" ++ SEVERITY WARNING; ++ z <= ((b1 and b2) xor (a1 and a2)) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xnr2_x05.ap b/alliance/src/cells/src/msxlib/xnr2_x05.ap +new file mode 100644 +index 0000000..d4efc72 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xnr2_x05.ap +@@ -0,0 +1,120 @@ ++V ALLIANCE : 6 ++H xnr2_x05,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 2000,7000,ref_ref,z_70 ++R 5000,7000,ref_ref,b_70 ++R 5000,8000,ref_ref,b_80 ++R 4000,6000,ref_ref,b_60 ++R 5000,6000,ref_ref,b_60 ++R 2000,8000,ref_ref,z_80 ++R 5000,3000,ref_ref,a_30 ++R 3000,8000,ref_ref,z_80 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,7000,ref_ref,z_70 ++R 2000,3000,ref_ref,z_30 ++R 2000,4000,ref_ref,z_40 ++R 5000,4000,ref_ref,a_40 ++R 5000,2000,ref_ref,a_20 ++R 6000,2000,ref_ref,a_20 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 2200,8500,2200,8800,200,*,UP,POLY ++S 1400,8500,1400,8800,200,*,UP,POLY ++S 800,7900,800,9300,400,*,UP,ALU1 ++S 800,6700,800,8300,600,*,DOWN,PDIF ++S 700,6700,700,8300,600,*,DOWN,PDIF ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 2000,7000,2000,8000,400,*,DOWN,ALU1 ++S 1000,7000,2000,7000,600,*,RIGHT,ALU1 ++S 2000,8100,3100,8100,400,*,LEFT,ALU1 ++S 2000,8000,3100,8000,400,*,LEFT,ALU1 ++S 1000,4000,1000,7000,400,*,UP,ALU1 ++S 1000,4000,1000,7000,400,z,UP,CALU1 ++S 2000,7000,2000,8000,400,z,DOWN,CALU1 ++S 5000,6000,5000,8000,400,b,UP,CALU1 ++S 4000,7000,4000,8100,400,*,UP,ALU1 ++S 4700,900,4700,3100,1600,*,UP,NDIF ++S 0,5000,7000,5000,10000,xnr2_x05,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 6200,2600,6200,3100,400,*,UP,NDIF ++S 5800,2400,5800,3300,200,9,UP,NTRANS ++S 3000,2600,3000,3100,600,*,UP,NDIF ++S 2400,2400,2400,3300,200,7,UP,NTRANS ++S 3600,2400,3600,3300,200,8,UP,NTRANS ++S 3600,2000,3600,2400,200,*,DOWN,POLY ++S 5800,2000,5800,2400,200,*,DOWN,POLY ++S 1800,2600,1800,3100,600,*,UP,NDIF ++S 1200,2400,1200,3300,200,6,UP,NTRANS ++S 800,2600,800,3100,400,*,DOWN,NDIF ++S 1000,4000,2000,4000,600,*,LEFT,ALU1 ++S 2000,3000,2000,4000,400,z,DOWN,CALU1 ++S 1900,2900,1900,4100,600,*,DOWN,ALU1 ++S 600,2000,600,2800,400,*,DOWN,ALU1 ++S 1200,2000,1200,2400,200,*,DOWN,POLY ++S 2400,2000,2400,2400,200,*,DOWN,POLY ++S 3000,2900,3000,7000,400,*,UP,ALU1 ++S 3000,7000,4000,7000,400,*,LEFT,ALU1 ++S 3800,5900,5500,5900,600,*,RIGHT,ALU1 ++S 2200,6100,2600,6100,200,*,RIGHT,POLY ++S 2600,3700,2600,6100,200,*,DOWN,POLY ++S 5800,3300,5800,6500,200,*,DOWN,POLY ++S 6200,6700,6200,8300,400,*,DOWN,PDIF ++S 5800,6500,5800,8500,200,5,DOWN,PTRANS ++S 4600,6500,4600,8500,200,4,DOWN,PTRANS ++S 4000,6700,4000,8300,600,*,UP,PDIF ++S 3400,6500,3400,8500,200,3,DOWN,PTRANS ++S 2200,6500,2200,8500,200,2,DOWN,PTRANS ++S 2800,6700,2800,8300,600,*,UP,PDIF ++S 1400,6500,1400,8500,200,1,DOWN,PTRANS ++S 1700,6700,1700,8300,400,n1,UP,PDIF ++S 5200,6700,5200,9100,600,*,UP,PDIF ++S 3400,8500,3400,8900,200,*,UP,POLY ++S 4600,8500,4600,8900,200,*,UP,POLY ++S 5800,8500,5800,8900,200,*,UP,POLY ++S 5000,6000,5000,8100,400,*,UP,ALU1 ++S 4000,6000,4000,6000,400,b,LEFT,CALU1 ++S 3000,8000,3000,8000,400,z,LEFT,CALU1 ++S 2400,3300,2400,3800,200,*,UP,POLY ++S 3400,5700,3400,6500,200,*,DOWN,POLY ++S 6000,2000,6000,2000,400,a,LEFT,CALU1 ++S 5000,2000,6100,2000,400,*,RIGHT,ALU1 ++S 5000,2000,5000,4000,600,*,DOWN,ALU1 ++S 5000,2000,5000,4000,400,a,DOWN,CALU1 ++S 600,2000,3800,2000,400,*,RIGHT,ALU1 ++S 4600,3700,4600,6500,200,*,DOWN,POLY ++S 3600,3700,4600,3700,200,*,LEFT,POLY ++S 2800,5000,3700,5000,200,*,LEFT,POLY ++S 3800,4900,6400,4900,400,*,RIGHT,ALU1 ++S 3800,2000,3800,4900,400,*,UP,ALU1 ++S 6400,6900,6400,7500,600,*,UP,PDIF ++S 6400,2900,6400,7700,400,*,UP,ALU1 ++S 1800,5000,3000,5000,600,*,LEFT,ALU1 ++S 1400,4800,1400,6500,200,*,DOWN,POLY ++S 1200,3300,1200,4900,200,*,UP,POLY ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 800,8000,CONT_DIF_P,* ++V 4000,8000,CONT_DIF_P,an ++V 4200,1000,CONT_DIF_N,* ++V 5200,9000,CONT_DIF_P,* ++V 5200,1000,CONT_DIF_N,* ++V 3000,3000,CONT_DIF_N,an ++V 6400,3000,CONT_DIF_N,bn ++V 2800,8000,CONT_DIF_P,* ++V 1800,3000,CONT_DIF_N,* ++V 600,2700,CONT_DIF_N,bn ++V 3800,5900,CONT_POLY,* ++V 5400,5900,CONT_POLY,* ++V 6400,6800,CONT_DIF_P,bn ++V 4000,7200,CONT_DIF_P,an ++V 5000,3900,CONT_POLY,* ++V 3800,4800,CONT_POLY,bn ++V 6400,7600,CONT_DIF_P,bn ++V 1800,5000,CONT_POLY,an ++EOF +diff --git a/alliance/src/cells/src/msxlib/xnr2_x05.vbe b/alliance/src/cells/src/msxlib/xnr2_x05.vbe +new file mode 100644 +index 0000000..283bce3 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xnr2_x05.vbe +@@ -0,0 +1,36 @@ ++ENTITY xnr2_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_b : NATURAL := 6; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT rdown_b_z : NATURAL := 3580; ++ CONSTANT rdown_a_z : NATURAL := 3690; ++ CONSTANT rup_b_z : NATURAL := 4620; ++ CONSTANT rup_a_z : NATURAL := 4840; ++ CONSTANT tphl_a_z : NATURAL := 67; ++ CONSTANT tphl_b_z : NATURAL := 72; ++ CONSTANT tplh_b_z : NATURAL := 42; ++ CONSTANT tplh_a_z : NATURAL := 72; ++ CONSTANT tphh_b_z : NATURAL := 86; ++ CONSTANT tpll_b_z : NATURAL := 70; ++ CONSTANT tphh_a_z : NATURAL := 101; ++ CONSTANT tpll_a_z : NATURAL := 97; ++ CONSTANT transistors : NATURAL := 9 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xnr2_x05; ++ ++ARCHITECTURE behaviour_data_flow OF xnr2_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xnr2_x05" ++ SEVERITY WARNING; ++ z <= not ((b xor a)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xnr2_x1.ap b/alliance/src/cells/src/msxlib/xnr2_x1.ap +new file mode 100644 +index 0000000..b9d72a3 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xnr2_x1.ap +@@ -0,0 +1,114 @@ ++V ALLIANCE : 6 ++H xnr2_x1,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 1000,8000,ref_ref,z_80 ++R 2000,8000,ref_ref,z_80 ++R 4000,3000,ref_ref,a_30 ++R 5000,5000,ref_ref,b_50 ++R 4000,5000,ref_ref,b_50 ++R 4000,4000,ref_ref,b_40 ++R 5000,4000,ref_ref,a_40 ++R 5000,3000,ref_ref,a_30 ++R 3000,8000,ref_ref,z_80 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++S 1100,700,1900,700,600,*,RIGHT,PTIE ++S 1000,8000,3100,8000,400,*,LEFT,ALU1 ++S 1000,8100,3100,8100,400,*,LEFT,ALU1 ++S 1400,9400,1400,9700,200,*,UP,POLY ++S 2200,9400,2200,9700,200,*,UP,POLY ++S 3400,9400,3400,9700,200,*,UP,POLY ++S 4600,9400,4600,9700,200,*,UP,POLY ++S 5800,9400,5800,9700,200,*,UP,POLY ++S 5800,1300,5800,1700,200,*,DOWN,POLY ++S 2400,1300,2400,1700,200,*,DOWN,POLY ++S 3600,1300,3600,1700,200,*,DOWN,POLY ++S 1200,1300,1200,1700,200,*,DOWN,POLY ++S 6200,5900,6200,9200,400,*,DOWN,PDIF ++S 700,5900,700,9200,600,*,DOWN,PDIF ++S 5200,5900,5200,9200,600,*,UP,PDIF ++S 4000,5900,4000,9200,600,*,UP,PDIF ++S 2800,5900,2800,9200,600,*,UP,PDIF ++S 1700,5900,1700,9200,400,n1,UP,PDIF ++S 5200,6900,5200,9300,400,*,UP,ALU1 ++S 2000,7000,4000,7000,400,*,LEFT,ALU1 ++S 4000,7000,4000,8100,400,*,UP,ALU1 ++S 6400,2000,6400,6900,400,*,UP,ALU1 ++S 2800,4400,2800,6000,400,*,DOWN,ALU1 ++S 2800,6000,6400,6000,400,*,LEFT,ALU1 ++S 6400,6100,6400,6700,600,*,UP,PDIF ++S 1800,4500,2000,4500,600,*,LEFT,ALU1 ++S 3000,2900,3000,3600,400,*,UP,ALU1 ++S 2000,3600,2000,7000,400,*,UP,ALU1 ++S 4700,900,4700,3100,1600,*,UP,NDIF ++S 800,1900,800,3100,400,*,DOWN,NDIF ++S 6200,1900,6200,3100,400,*,UP,NDIF ++S 3000,1900,3000,3100,600,*,UP,NDIF ++S 1800,1900,1800,3100,600,*,UP,NDIF ++S 5000,3000,5000,4000,600,*,DOWN,ALU1 ++S 3900,3000,5000,3000,400,*,RIGHT,ALU1 ++S 4000,4000,4000,5000,400,b,UP,CALU1 ++S 5000,3000,5000,4000,400,a,DOWN,CALU1 ++S 3400,5300,4000,5300,200,*,RIGHT,POLY ++S 2000,3600,3000,3600,400,*,LEFT,ALU1 ++S 1000,2800,1900,2800,400,*,LEFT,ALU1 ++S 500,2000,6400,2000,400,*,RIGHT,ALU1 ++S 1200,1700,1200,3300,200,6,UP,NTRANS ++S 2400,1700,2400,3300,200,7,UP,NTRANS ++S 3600,1700,3600,3300,200,8,UP,NTRANS ++S 5800,5700,5800,9400,200,5,DOWN,PTRANS ++S 1000,3000,1000,8000,400,*,UP,ALU1 ++S 1000,3000,1000,8000,400,z,UP,CALU1 ++S 0,5000,7000,5000,10000,xnr2_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 1400,4500,2000,4500,600,*,LEFT,POLY ++S 5800,3300,5800,5700,200,*,DOWN,POLY ++S 3600,3700,4600,3700,200,*,LEFT,POLY ++S 2600,3700,2600,5300,200,*,DOWN,POLY ++S 4600,3700,4600,5700,200,*,DOWN,POLY ++S 4600,5700,4600,9400,200,4,DOWN,PTRANS ++S 3400,5700,3400,9400,200,3,DOWN,PTRANS ++S 1400,5700,1400,9400,200,1,DOWN,PTRANS ++S 2200,5700,2200,9400,200,2,DOWN,PTRANS ++S 2200,5300,2600,5300,200,*,RIGHT,POLY ++S 1400,4300,1400,5700,200,*,DOWN,POLY ++S 2400,3700,2600,3700,200,*,LEFT,POLY ++S 5800,1700,5800,3300,200,9,UP,NTRANS ++S 4000,3000,4000,3000,400,a,LEFT,CALU1 ++S 5000,5000,5000,5000,400,b,LEFT,CALU1 ++S 1200,3300,1200,4400,200,*,UP,POLY ++S 2000,8000,2000,8000,400,z,LEFT,CALU1 ++S 3000,8000,3000,8000,400,z,LEFT,CALU1 ++S 6400,2300,6400,2900,600,*,UP,NDIF ++S 3900,3900,3900,5000,600,*,UP,ALU1 ++S 3800,5000,5500,5000,400,*,RIGHT,ALU1 ++V 2000,700,CONT_BODY_P,* ++V 1000,700,CONT_BODY_P,* ++V 5200,7000,CONT_DIF_P,* ++V 5200,8000,CONT_DIF_P,* ++V 4000,8000,CONT_DIF_P,an ++V 6400,6800,CONT_DIF_P,bn ++V 4200,1000,CONT_DIF_N,* ++V 2800,4500,CONT_POLY,bn ++V 1800,2800,CONT_DIF_N,* ++V 600,2000,CONT_DIF_N,bn ++V 6400,6000,CONT_DIF_P,bn ++V 5200,9000,CONT_DIF_P,* ++V 5200,1000,CONT_DIF_N,* ++V 3000,3000,CONT_DIF_N,an ++V 1800,4500,CONT_POLY,an ++V 6400,3000,CONT_DIF_N,bn ++V 5000,3900,CONT_POLY,* ++V 2800,8000,CONT_DIF_P,* ++V 800,9000,CONT_DIF_P,* ++V 5400,5000,CONT_POLY,* ++V 4000,7200,CONT_DIF_P,an ++V 6400,2200,CONT_DIF_N,bn ++V 3800,4900,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/xnr2_x1.vbe b/alliance/src/cells/src/msxlib/xnr2_x1.vbe +new file mode 100644 +index 0000000..55a219f +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xnr2_x1.vbe +@@ -0,0 +1,36 @@ ++ENTITY xnr2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_b : NATURAL := 10; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT rdown_b_z : NATURAL := 2020; ++ CONSTANT rdown_a_z : NATURAL := 2060; ++ CONSTANT rup_b_z : NATURAL := 2510; ++ CONSTANT rup_a_z : NATURAL := 2620; ++ CONSTANT tphl_a_z : NATURAL := 66; ++ CONSTANT tphl_b_z : NATURAL := 67; ++ CONSTANT tplh_b_z : NATURAL := 38; ++ CONSTANT tplh_a_z : NATURAL := 69; ++ CONSTANT tphh_b_z : NATURAL := 80; ++ CONSTANT tpll_b_z : NATURAL := 65; ++ CONSTANT tphh_a_z : NATURAL := 96; ++ CONSTANT tpll_a_z : NATURAL := 93; ++ CONSTANT transistors : NATURAL := 9 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xnr2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF xnr2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xnr2_x1" ++ SEVERITY WARNING; ++ z <= not ((b xor a)) after 1100 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xor2_x05.ap b/alliance/src/cells/src/msxlib/xor2_x05.ap +new file mode 100644 +index 0000000..fb2b7d1 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xor2_x05.ap +@@ -0,0 +1,122 @@ ++V ALLIANCE : 6 ++H xor2_x05,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 6000,7000,ref_ref,b_70 ++R 5000,6000,ref_ref,b_60 ++R 5000,4000,ref_ref,a_40 ++R 5000,3000,ref_ref,a_30 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 5000,2000,ref_ref,a_20 ++R 2000,2000,ref_ref,z_20 ++R 3000,2000,ref_ref,z_20 ++R 5000,7000,ref_ref,b_70 ++R 6000,8000,ref_ref,b_80 ++R 4000,4000,ref_ref,a_40 ++R 2000,3000,ref_ref,z_30 ++S 1100,9300,1900,9300,600,*,RIGHT,NTIE ++S 1200,700,1900,700,600,*,RIGHT,PTIE ++S 6400,1900,6400,5900,400,bn,DOWN,ALU1 ++S 4700,6500,4700,9100,1600,*,UP,PDIF ++S 5800,2600,5800,5500,200,*,UP,POLY ++S 6000,7000,6000,8000,400,b,UP,CALU1 ++S 5000,6000,5000,7000,400,b,DOWN,CALU1 ++S 5000,5900,5000,7000,400,*,DOWN,ALU1 ++S 6200,5700,6200,7300,400,*,UP,PDIF ++S 5800,5500,5800,7500,200,4,DOWN,PTRANS ++S 0,5000,7000,5000,10000,xor2_x05,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 5000,2000,5000,4000,400,a,UP,CALU1 ++S 1000,7000,2100,7000,400,*,LEFT,ALU1 ++S 1200,6300,1200,8300,200,1,DOWN,PTRANS ++S 1800,6500,1800,8100,800,*,UP,PDIF ++S 2400,6300,2400,8300,200,2,DOWN,PTRANS ++S 1200,8300,1200,8700,200,*,UP,POLY ++S 2400,8300,2400,8700,200,*,UP,POLY ++S 3600,6300,3600,8300,200,3,DOWN,PTRANS ++S 3000,6500,3000,8100,600,*,UP,PDIF ++S 1000,7100,2100,7100,400,*,LEFT,ALU1 ++S 800,6500,800,7800,400,*,UP,PDIF ++S 3600,8300,3600,8700,200,*,UP,POLY ++S 3400,400,5800,400,200,*,RIGHT,POLY ++S 4000,1900,4000,3000,400,an,DOWN,ALU1 ++S 5000,1900,5000,4000,400,*,DOWN,ALU1 ++S 3900,4000,5000,4000,400,*,LEFT,ALU1 ++S 3900,4100,5000,4100,400,*,LEFT,ALU1 ++S 6200,1900,6200,2400,400,*,UP,NDIF ++S 5800,1700,5800,2600,200,9,UP,NTRANS ++S 4000,1900,4000,2400,1000,*,DOWN,NDIF ++S 4600,1700,4600,2600,200,8,UP,NTRANS ++S 3400,1700,3400,2600,200,7,UP,NTRANS ++S 2800,1900,2800,2400,1000,*,DOWN,NDIF ++S 2200,1700,2200,2600,200,6,UP,NTRANS ++S 1800,1900,1800,2400,600,n1,UP,NDIF ++S 1400,1700,1400,2600,200,5,UP,NTRANS ++S 3400,2600,3400,3000,200,*,UP,POLY ++S 2200,1300,2200,1700,200,*,UP,POLY ++S 1400,1300,1400,1700,200,*,UP,POLY ++S 3400,400,3400,1700,200,*,DOWN,POLY ++S 4600,1300,4600,1700,200,*,UP,POLY ++S 5800,600,5800,1700,200,*,UP,POLY ++S 5200,900,5200,2400,600,*,UP,NDIF ++S 2200,3000,2600,3000,200,*,LEFT,POLY ++S 3000,3000,4000,3000,400,*,RIGHT,ALU1 ++S 1000,3000,2000,3000,600,*,RIGHT,ALU1 ++S 2000,2000,2000,3000,400,*,DOWN,ALU1 ++S 2000,1900,3100,1900,400,*,RIGHT,ALU1 ++S 2000,2000,3100,2000,400,*,RIGHT,ALU1 ++S 1000,3000,1000,7000,400,*,DOWN,ALU1 ++S 1000,3000,1000,7000,400,z,DOWN,CALU1 ++S 2000,2000,2000,3000,400,z,DOWN,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 700,1900,700,2400,600,*,UP,NDIF ++S 800,700,800,2100,400,*,DOWN,ALU1 ++S 3600,5900,3600,6300,200,*,UP,POLY ++S 3000,3000,3000,7100,400,*,UP,ALU1 ++S 4900,6500,4900,8100,1200,*,DOWN,PDIF ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 5200,7900,5200,9300,400,*,UP,ALU1 ++S 6100,6900,6100,8100,600,*,UP,ALU1 ++S 5000,7000,6200,7000,600,*,RIGHT,ALU1 ++S 5800,7500,5800,8300,200,*,UP,POLY ++S 2600,3000,2600,5300,200,*,DOWN,POLY ++S 2400,5300,3800,5300,200,*,LEFT,POLY ++S 2400,5200,2400,6300,200,*,DOWN,POLY ++S 1800,4400,3000,4400,600,*,RIGHT,ALU1 ++S 1400,2600,1400,4600,200,*,UP,POLY ++S 1200,4500,1200,6300,200,*,DOWN,POLY ++S 4600,2600,4600,5900,200,*,UP,POLY ++S 3600,5900,4600,5900,200,*,LEFT,POLY ++S 3800,5000,3800,8000,400,*,DOWN,ALU1 ++S 3800,5000,6400,5000,400,*,LEFT,ALU1 ++S 500,8000,3800,8000,400,*,RIGHT,ALU1 ++S 5300,5700,5300,7300,600,*,UP,PDIF ++V 2000,9300,CONT_BODY_N,* ++V 1000,9300,CONT_BODY_N,* ++V 2000,700,CONT_BODY_P,* ++V 1100,700,CONT_BODY_P,* ++V 6400,5800,CONT_DIF_P,bn ++V 4800,4000,CONT_POLY,* ++V 1800,7000,CONT_DIF_P,* ++V 600,8000,CONT_DIF_P,bn ++V 3000,7000,CONT_DIF_P,an ++V 5200,1000,CONT_DIF_N,* ++V 2800,2000,CONT_DIF_N,* ++V 4000,2000,CONT_DIF_N,an ++V 4200,9000,CONT_DIF_P,* ++V 6400,2000,CONT_DIF_N,bn ++V 800,2000,CONT_DIF_N,* ++V 5200,8000,CONT_DIF_P,* ++V 5200,9000,CONT_DIF_P,* ++V 6100,8100,CONT_POLY,* ++V 1800,4400,CONT_POLY,an ++V 3800,5100,CONT_POLY,bn ++EOF +diff --git a/alliance/src/cells/src/msxlib/xor2_x05.vbe b/alliance/src/cells/src/msxlib/xor2_x05.vbe +new file mode 100644 +index 0000000..9bb09a8 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xor2_x05.vbe +@@ -0,0 +1,36 @@ ++ENTITY xor2_x05 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_b : NATURAL := 5; ++ CONSTANT cin_a : NATURAL := 4; ++ CONSTANT rdown_b_z : NATURAL := 3520; ++ CONSTANT rdown_a_z : NATURAL := 3620; ++ CONSTANT rup_b_z : NATURAL := 4790; ++ CONSTANT rup_a_z : NATURAL := 4890; ++ CONSTANT tplh_a_z : NATURAL := 69; ++ CONSTANT tphl_b_z : NATURAL := 35; ++ CONSTANT tplh_b_z : NATURAL := 89; ++ CONSTANT tphh_b_z : NATURAL := 64; ++ CONSTANT tphl_a_z : NATURAL := 65; ++ CONSTANT tpll_a_z : NATURAL := 93; ++ CONSTANT tpll_b_z : NATURAL := 94; ++ CONSTANT tphh_a_z : NATURAL := 91; ++ CONSTANT transistors : NATURAL := 9 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xor2_x05; ++ ++ARCHITECTURE behaviour_data_flow OF xor2_x05 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xor2_x05" ++ SEVERITY WARNING; ++ z <= (b xor a) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/msxlib/xor2_x1.ap b/alliance/src/cells/src/msxlib/xor2_x1.ap +new file mode 100644 +index 0000000..05b2324 +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xor2_x1.ap +@@ -0,0 +1,120 @@ ++V ALLIANCE : 6 ++H xor2_x1,P, 9/ 8/2014,100 ++A 0,0,7000,10000 ++R 5000,2000,ref_ref,a_20 ++R 5000,6000,ref_ref,b_60 ++R 5000,4000,ref_ref,a_40 ++R 5000,3000,ref_ref,a_30 ++R 1000,6000,ref_ref,z_60 ++R 1000,5000,ref_ref,z_50 ++R 1000,4000,ref_ref,z_40 ++R 1000,3000,ref_ref,z_30 ++R 1000,7000,ref_ref,z_70 ++R 2000,7000,ref_ref,z_70 ++R 1000,2000,ref_ref,z_20 ++R 2000,2000,ref_ref,z_20 ++R 5000,7000,ref_ref,b_70 ++R 4000,4000,ref_ref,a_40 ++R 3000,2000,ref_ref,z_20 ++R 6000,8000,ref_ref,b_80 ++R 6000,7000,ref_ref,b_70 ++S 6400,2000,6400,5000,400,*,UP,ALU1 ++S 2000,7000,2000,7000,400,z,LEFT,CALU1 ++S 3000,2000,3000,2000,400,z,LEFT,CALU1 ++S 2000,2000,2000,2000,400,z,LEFT,CALU1 ++S 4000,4000,4000,4000,400,a,LEFT,CALU1 ++S 2000,6000,3000,6000,400,*,LEFT,ALU1 ++S 0,5000,7000,5000,10000,xor2_x1,LEFT,TALU8 ++S 0,2200,7000,2200,5200,*,LEFT,PWELL ++S 0,7600,7000,7600,5600,*,LEFT,NWELL ++S 0,9400,7000,9400,1200,vdd,RIGHT,CALU1 ++S 0,600,7000,600,1200,vss,RIGHT,CALU1 ++S 5000,2000,5000,4000,400,a,UP,CALU1 ++S 1000,7000,2100,7000,400,*,RIGHT,ALU1 ++S 1000,7100,2100,7100,400,*,RIGHT,ALU1 ++S 1000,2000,1000,7000,400,*,DOWN,ALU1 ++S 1000,2000,1000,7000,400,z,DOWN,CALU1 ++S 4000,1900,4000,3000,400,an,DOWN,ALU1 ++S 2000,3000,2000,6000,400,*,UP,ALU1 ++S 2000,3000,4000,3000,400,*,RIGHT,ALU1 ++S 3400,400,5600,400,200,*,RIGHT,POLY ++S 1200,9400,1200,9700,200,*,DOWN,POLY ++S 2400,9400,2400,9700,200,*,DOWN,POLY ++S 3600,9400,3600,9700,200,*,DOWN,POLY ++S 3000,6000,3000,7100,400,*,DOWN,ALU1 ++S 3900,4000,5000,4000,400,*,LEFT,ALU1 ++S 3900,4100,5000,4100,400,*,LEFT,ALU1 ++S 1000,2000,3000,2000,600,*,RIGHT,ALU1 ++S 3000,5000,6400,5000,400,*,RIGHT,ALU1 ++S 5200,9400,5200,9700,200,*,DOWN,POLY ++S 5000,6000,5000,7000,400,b,UP,CALU1 ++S 5000,5900,5000,7000,400,*,DOWN,ALU1 ++S 6000,7000,6000,8000,400,b,UP,CALU1 ++S 5000,7000,6500,7000,600,*,RIGHT,ALU1 ++S 5000,1900,5000,4000,400,*,DOWN,ALU1 ++S 4600,7900,4600,9300,400,*,UP,ALU1 ++S 3800,5000,3800,8000,400,*,UP,ALU1 ++S 500,8000,3800,8000,400,*,RIGHT,ALU1 ++S 6000,7000,6000,8100,400,*,UP,ALU1 ++S 6200,1700,6200,2900,400,*,UP,NDIF ++S 1400,1200,1400,1500,200,*,UP,POLY ++S 2200,1200,2200,1500,200,*,UP,POLY ++S 3400,400,3400,1500,200,*,DOWN,POLY ++S 4600,1100,4600,1500,200,*,UP,POLY ++S 5800,400,5800,1500,200,*,UP,POLY ++S 700,900,700,3000,600,*,UP,NDIF ++S 800,900,800,3000,600,*,UP,NDIF ++S 1800,1700,1800,3000,600,n1,UP,NDIF ++S 1400,1500,1400,3200,200,5,UP,NTRANS ++S 2200,1500,2200,3200,200,6,UP,NTRANS ++S 2200,3600,2800,3600,200,*,LEFT,POLY ++S 3400,3200,3400,3600,200,*,UP,POLY ++S 1500,4400,2000,4400,600,*,LEFT,POLY ++S 4000,1700,4000,3000,1000,*,DOWN,NDIF ++S 4600,1500,4600,3200,200,8,UP,NTRANS ++S 3400,1500,3400,3200,200,7,UP,NTRANS ++S 2800,1700,2800,3000,1000,*,DOWN,NDIF ++S 5200,900,5200,3000,600,*,UP,NDIF ++S 5800,1500,5800,3200,200,9,UP,NTRANS ++S 2400,5200,2800,5200,200,*,RIGHT,POLY ++S 1400,3200,1400,4600,200,*,UP,POLY ++S 1200,4500,1200,5700,200,*,UP,POLY ++S 2400,5600,2400,9400,200,2,DOWN,PTRANS ++S 3600,5600,3600,9400,200,3,DOWN,PTRANS ++S 3000,5800,3000,9200,600,*,UP,PDIF ++S 800,5800,800,9200,400,*,UP,PDIF ++S 1200,5600,1200,9400,200,1,DOWN,PTRANS ++S 1800,5800,1800,9200,1000,*,UP,PDIF ++S 4400,5800,4400,9200,800,*,DOWN,PDIF ++S 5200,5600,5200,9400,200,4,DOWN,PTRANS ++S 5600,5800,5600,9200,400,*,UP,PDIF ++S 5800,5000,5800,6000,400,*,DOWN,ALU1 ++S 5800,3200,5800,5200,200,*,UP,POLY ++S 2800,3600,2800,5200,200,*,DOWN,POLY ++S 5200,5200,6600,5200,200,*,LEFT,POLY ++S 6600,5200,6600,6800,200,*,DOWN,POLY ++S 6400,2200,6400,2800,600,*,DOWN,NDIF ++S 3000,4300,3000,5000,400,*,DOWN,ALU1 ++S 4600,3200,4600,4000,200,*,DOWN,POLY ++S 4200,4000,4200,5200,200,*,UP,POLY ++S 3600,5200,4200,5200,200,*,LEFT,POLY ++V 2000,700,CONT_BODY_P,* ++V 3000,6200,CONT_DIF_P,an ++V 600,8000,CONT_DIF_P,bn ++V 1800,7000,CONT_DIF_P,* ++V 5200,1000,CONT_DIF_N,* ++V 4000,2000,CONT_DIF_N,an ++V 2800,2000,CONT_DIF_N,* ++V 3000,7000,CONT_DIF_P,an ++V 6400,7000,CONT_POLY,* ++V 4600,9000,CONT_DIF_P,* ++V 4600,8000,CONT_DIF_P,* ++V 800,1000,CONT_DIF_N,* ++V 4000,2800,CONT_DIF_N,an ++V 3000,4400,CONT_POLY,bn ++V 2000,4400,CONT_POLY,an ++V 6400,2900,CONT_DIF_N,bn ++V 5800,5900,CONT_DIF_P,bn ++V 6400,2100,CONT_DIF_N,bn ++V 4400,4000,CONT_POLY,* ++EOF +diff --git a/alliance/src/cells/src/msxlib/xor2_x1.vbe b/alliance/src/cells/src/msxlib/xor2_x1.vbe +new file mode 100644 +index 0000000..82248ab +--- /dev/null ++++ b/alliance/src/cells/src/msxlib/xor2_x1.vbe +@@ -0,0 +1,36 @@ ++ENTITY xor2_x1 IS ++GENERIC ( ++ CONSTANT area : NATURAL := 7000; ++ CONSTANT cin_b : NATURAL := 9; ++ CONSTANT cin_a : NATURAL := 7; ++ CONSTANT rdown_b_z : NATURAL := 1860; ++ CONSTANT rdown_a_z : NATURAL := 1910; ++ CONSTANT rup_b_z : NATURAL := 2530; ++ CONSTANT rup_a_z : NATURAL := 2570; ++ CONSTANT tplh_a_z : NATURAL := 65; ++ CONSTANT tphl_b_z : NATURAL := 33; ++ CONSTANT tplh_b_z : NATURAL := 82; ++ CONSTANT tphh_b_z : NATURAL := 59; ++ CONSTANT tphl_a_z : NATURAL := 62; ++ CONSTANT tpll_a_z : NATURAL := 88; ++ CONSTANT tpll_b_z : NATURAL := 87; ++ CONSTANT tphh_a_z : NATURAL := 86; ++ CONSTANT transistors : NATURAL := 9 ++); ++PORT ( ++ b : in BIT; ++ a : in BIT; ++ z : out BIT; ++ vdd : in BIT; ++ vss : in BIT ++); ++END xor2_x1; ++ ++ARCHITECTURE behaviour_data_flow OF xor2_x1 IS ++ ++BEGIN ++ ASSERT ((vdd and not (vss)) = '1') ++ REPORT "power supply is missing on xor2_x1" ++ SEVERITY WARNING; ++ z <= (b xor a) after 1000 ps; ++END; +diff --git a/alliance/src/cells/src/pxlib/CATAL b/alliance/src/cells/src/pxlib/CATAL +index 1c60cc6..f0f8a4d 100644 +--- a/alliance/src/cells/src/pxlib/CATAL ++++ b/alliance/src/cells/src/pxlib/CATAL +@@ -11,3 +11,16 @@ pvsseck_px C + pvsse_px C + pvssick_px C + pvssi_px C ++pck_sp C ++piot_sp C ++pi_sp C ++po_sp C ++pot_sp C ++pvddeck_sp C ++pvdde_sp C ++pvddick_sp C ++pvddi_sp C ++pvsseck_sp C ++pvsse_sp C ++pvssick_sp C ++pvssi_sp C +diff --git a/alliance/src/cells/src/pxlib/Makefile.am b/alliance/src/cells/src/pxlib/Makefile.am +index f286c75..3a2ed65 100644 +--- a/alliance/src/cells/src/pxlib/Makefile.am ++++ b/alliance/src/cells/src/pxlib/Makefile.am +@@ -29,7 +29,33 @@ pxlib_DATA=CATAL \ + pvssick_px.ap \ + pvssick_px.vbe \ + pvssi_px.ap \ +- pvssi_px.vbe ++ pvssi_px.vbe \ ++ pck_sp.ap \ ++ pck_sp.vbe \ ++ piot_sp.ap \ ++ piot_sp.vbe \ ++ pi_sp.ap \ ++ pi_sp.vbe \ ++ po_sp.ap \ ++ po_sp.vbe \ ++ pot_sp.ap \ ++ pot_sp.vbe \ ++ pvddeck_sp.ap \ ++ pvddeck_sp.vbe \ ++ pvdde_sp.ap \ ++ pvdde_sp.vbe \ ++ pvddick_sp.ap \ ++ pvddick_sp.vbe \ ++ pvddi_sp.ap \ ++ pvddi_sp.vbe \ ++ pvsseck_sp.ap \ ++ pvsseck_sp.vbe \ ++ pvsse_sp.ap \ ++ pvsse_sp.vbe \ ++ pvssick_sp.ap \ ++ pvssick_sp.vbe \ ++ pvssi_sp.ap \ ++ pvssi_sp.vbe + + EXTRA_DIST=$(pxlib_DATA) + +diff --git a/alliance/src/cells/src/pxlib/pck_sp.ap b/alliance/src/cells/src/pxlib/pck_sp.ap +new file mode 100644 +index 0000000..6bc30b2 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pck_sp.ap +@@ -0,0 +1,55 @@ ++V ALLIANCE : 6 ++H pck_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 20000,2000,500,ck,3,EAST,ALU3 ++C 0,2000,500,ck,2,WEST,ALU3 ++C 20000,5000,1200,vddi,1,EAST,ALU3 ++C 20000,3500,1200,vssi,1,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,5000,1200,vddi,0,WEST,ALU3 ++C 0,3500,1200,vssi,0,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 20000,8000,1200,vddi,3,EAST,ALU3 ++C 20000,6500,1200,vssi,3,EAST,ALU3 ++C 0,6500,1200,vssi,2,WEST,ALU3 ++C 0,8000,1200,vddi,2,WEST,ALU3 ++C 10000,40000,100,pad,0,NORTH,ALU1 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++I 0,0,pck_px,a,NOSYM ++EOF +diff --git a/alliance/src/cells/src/pxlib/pck_sp.vbe b/alliance/src/cells/src/pxlib/pck_sp.vbe +new file mode 100644 +index 0000000..a0cc38b +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pck_sp.vbe +@@ -0,0 +1,29 @@ ++ENTITY pck_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_pad : NATURAL := 1326; ++ CONSTANT tpll_pad : NATURAL := 1443; ++ CONSTANT rdown_pad : NATURAL := 58; ++ CONSTANT tphh_pad : NATURAL := 228; ++ CONSTANT rup_pad : NATURAL := 68 ++ ); ++ PORT ( ++ pad : in BIT; ++ ck : out BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pck_sp; ++ ++ ++ARCHITECTURE behaviour_data_flow OF pck_sp IS ++ ++BEGIN ++ ck <= pad; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pck_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pi_sp.ap b/alliance/src/cells/src/pxlib/pi_sp.ap +new file mode 100644 +index 0000000..712c9e8 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pi_sp.ap +@@ -0,0 +1,58 @@ ++V ALLIANCE : 6 ++H pi_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,40000,100,pad,0,NORTH,ALU1 ++C 4000,0,200,t,0,SOUTH,ALU1 ++C 4000,0,200,t,1,SOUTH,ALU2 ++C 0,8000,1200,vddi,6,WEST,ALU3 ++C 0,6500,1200,vssi,6,WEST,ALU3 ++C 20000,6500,1200,vssi,7,EAST,ALU3 ++C 20000,8000,1200,vddi,7,EAST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,3500,1200,vssi,4,WEST,ALU3 ++C 0,5000,1200,vddi,4,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,3500,1200,vssi,5,EAST,ALU3 ++C 20000,5000,1200,vddi,5,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,2000,500,ck,1,EAST,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++I 0,0,pi_px,a,NOSYM ++V 4000,0,CONT_VIA,* ++EOF +diff --git a/alliance/src/cells/src/pxlib/pi_sp.vbe b/alliance/src/cells/src/pxlib/pi_sp.vbe +new file mode 100644 +index 0000000..44119b8 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pi_sp.vbe +@@ -0,0 +1,30 @@ ++ENTITY pi_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_pad : NATURAL := 654; ++ CONSTANT tpll_pad : NATURAL := 1487; ++ CONSTANT rdown_pad : NATURAL := 234; ++ CONSTANT tphh_pad : NATURAL := 233; ++ CONSTANT rup_pad : NATURAL := 273 ++ ); ++ PORT ( ++ pad : in BIT; ++ t : out BIT; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pi_sp; ++ ++ ++ARCHITECTURE behaviour_data_flow OF pi_sp IS ++ ++BEGIN ++ t <= pad; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pi_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/piot_sp.ap b/alliance/src/cells/src/pxlib/piot_sp.ap +new file mode 100644 +index 0000000..12d6bdf +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/piot_sp.ap +@@ -0,0 +1,64 @@ ++V ALLIANCE : 6 ++H piot_sp,P, 5/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,40000,100,pad,2,NORTH,ALU1 ++C 4000,0,200,t,0,SOUTH,ALU1 ++C 4000,0,200,t,1,SOUTH,ALU2 ++C 14000,0,200,i,0,SOUTH,ALU1 ++C 14000,0,200,i,1,SOUTH,ALU2 ++C 0,8000,1200,vddi,2,WEST,ALU3 ++C 0,6500,1200,vssi,2,WEST,ALU3 ++C 20000,6500,1200,vssi,3,EAST,ALU3 ++C 20000,8000,1200,vddi,3,EAST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,3500,1200,vssi,0,WEST,ALU3 ++C 0,5000,1200,vddi,0,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,3500,1200,vssi,1,EAST,ALU3 ++C 20000,5000,1200,vddi,1,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,2000,500,ck,1,EAST,ALU3 ++C 15000,0,200,b,1,SOUTH,ALU2 ++C 15000,0,200,b,0,SOUTH,ALU1 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++I 0,0,piot_px,a,NOSYM ++V 4000,0,CONT_VIA,* ++V 14000,0,CONT_VIA,* ++V 15000,0,CONT_VIA,b ++EOF +diff --git a/alliance/src/cells/src/pxlib/piot_sp.vbe b/alliance/src/cells/src/pxlib/piot_sp.vbe +new file mode 100644 +index 0000000..ceac775 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/piot_sp.vbe +@@ -0,0 +1,44 @@ ++ENTITY piot_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT rup : NATURAL := 402; ++ CONSTANT rdown : NATURAL := 0 ++ ); ++ PORT ( ++ i : in BIT; ++ b : in BIT; ++ t : out BIT; ++ pad : inout MUX_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END piot_sp; ++ ++ARCHITECTURE behaviour_data_flow OF piot_sp IS ++ SIGNAL b1 : BIT; ++ SIGNAL b2 : BIT; ++ SIGNAL b3 : BIT; ++ SIGNAL b4 : BIT; ++ SIGNAL b5 : BIT; ++ SIGNAL b6 : BIT; ++ ++BEGIN ++ b6 <= b5; ++ b5 <= b4; ++ b4 <= b3; ++ b3 <= b2; ++ b2 <= b1; ++ b1 <= b; ++ label0 : BLOCK (b6 = '1') ++ BEGIN ++ pad <= GUARDED i; ++ END BLOCK label0; ++ t <= pad; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on piot_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/po_sp.ap b/alliance/src/cells/src/pxlib/po_sp.ap +new file mode 100644 +index 0000000..914038a +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/po_sp.ap +@@ -0,0 +1,58 @@ ++V ALLIANCE : 6 ++H po_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,40000,100,pad,0,NORTH,ALU1 ++C 14000,0,200,i,0,SOUTH,ALU1 ++C 14000,0,200,i,1,SOUTH,ALU2 ++C 0,8000,1200,vddi,6,WEST,ALU3 ++C 0,6500,1200,vssi,6,WEST,ALU3 ++C 20000,6500,1200,vssi,7,EAST,ALU3 ++C 20000,8000,1200,vddi,7,EAST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,3500,1200,vssi,4,WEST,ALU3 ++C 0,5000,1200,vddi,4,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,3500,1200,vssi,5,EAST,ALU3 ++C 20000,5000,1200,vddi,5,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,2000,500,ck,1,EAST,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++I 0,0,po_px,a,NOSYM ++V 14000,0,CONT_VIA,* ++EOF +diff --git a/alliance/src/cells/src/pxlib/po_sp.vbe b/alliance/src/cells/src/pxlib/po_sp.vbe +new file mode 100644 +index 0000000..6d9d9d7 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/po_sp.vbe +@@ -0,0 +1,29 @@ ++ENTITY po_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_i : NATURAL := 191; ++ CONSTANT tpll_i : NATURAL := 2176; ++ CONSTANT rdown_i : NATURAL := 15; ++ CONSTANT tphh_i : NATURAL := 2032; ++ CONSTANT rup_i : NATURAL := 16 ++ ); ++ PORT ( ++ i : in BIT; ++ pad : out BIT; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END po_sp; ++ ++ARCHITECTURE behaviour_data_flow OF po_sp IS ++ ++BEGIN ++ pad <= i; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on po_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pot_sp.ap b/alliance/src/cells/src/pxlib/pot_sp.ap +new file mode 100644 +index 0000000..918c64f +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pot_sp.ap +@@ -0,0 +1,61 @@ ++V ALLIANCE : 6 ++H pot_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,40000,100,pad,0,NORTH,ALU1 ++C 14000,0,200,i,0,SOUTH,ALU1 ++C 14000,0,200,i,1,SOUTH,ALU2 ++C 0,8000,1200,vddi,6,WEST,ALU3 ++C 0,6500,1200,vssi,6,WEST,ALU3 ++C 20000,6500,1200,vssi,7,EAST,ALU3 ++C 20000,8000,1200,vddi,7,EAST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,3500,1200,vssi,4,WEST,ALU3 ++C 0,5000,1200,vddi,4,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,3500,1200,vssi,5,EAST,ALU3 ++C 20000,5000,1200,vddi,5,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,2000,500,ck,1,EAST,ALU3 ++C 15000,0,200,b,1,SOUTH,ALU2 ++C 15000,0,200,b,0,SOUTH,ALU1 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++I 0,0,pot_px,a,NOSYM ++V 14000,0,CONT_VIA,* ++V 15000,0,CONT_VIA,b ++EOF +diff --git a/alliance/src/cells/src/pxlib/pot_sp.vbe b/alliance/src/cells/src/pxlib/pot_sp.vbe +new file mode 100644 +index 0000000..fc54a73 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pot_sp.vbe +@@ -0,0 +1,42 @@ ++ENTITY pot_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT rup : NATURAL := 684404; ++ CONSTANT rdown : NATURAL := 24 ++ ); ++ PORT ( ++ i : in BIT; ++ b : in BIT; ++ pad : out MUX_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pot_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pot_sp IS ++ SIGNAL b1 : BIT; ++ SIGNAL b2 : BIT; ++ SIGNAL b3 : BIT; ++ SIGNAL b4 : BIT; ++ SIGNAL b5 : BIT; ++ SIGNAL b6 : BIT; ++ ++BEGIN ++ b6 <= b5; ++ b5 <= b4; ++ b4 <= b3; ++ b3 <= b2; ++ b2 <= b1; ++ b1 <= b; ++ label0 : BLOCK (b6 = '1') ++ BEGIN ++ pad <= GUARDED i; ++ END BLOCK label0; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pot_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pvdde_sp.ap b/alliance/src/cells/src/pxlib/pvdde_sp.ap +new file mode 100644 +index 0000000..e3e5973 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvdde_sp.ap +@@ -0,0 +1,55 @@ ++V ALLIANCE : 6 ++H pvdde_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,40000,100,vdde,6,NORTH,ALU1 ++C 0,8000,1200,vddi,6,WEST,ALU3 ++C 0,6500,1200,vssi,6,WEST,ALU3 ++C 20000,6500,1200,vssi,7,EAST,ALU3 ++C 20000,8000,1200,vddi,7,EAST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,3500,1200,vssi,4,WEST,ALU3 ++C 0,5000,1200,vddi,4,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,3500,1200,vssi,5,EAST,ALU3 ++C 20000,5000,1200,vddi,5,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,2000,500,ck,1,EAST,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++I 0,0,pvdde_px,a,NOSYM ++EOF +diff --git a/alliance/src/cells/src/pxlib/pvdde_sp.vbe b/alliance/src/cells/src/pxlib/pvdde_sp.vbe +new file mode 100644 +index 0000000..a22d525 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvdde_sp.vbe +@@ -0,0 +1,20 @@ ++ENTITY pvdde_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000 ++ ); ++ PORT ( ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvdde_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pvdde_sp IS ++ ++BEGIN ++ ASSERT ((((not (vssi) and not (vsse)) and vddi) and vdde) = '1') ++ REPORT "power supply is missing on pvdde_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pvddeck_px.ap b/alliance/src/cells/src/pxlib/pvddeck_px.ap +index ab2760c..f221151 100644 +--- a/alliance/src/cells/src/pxlib/pvddeck_px.ap ++++ b/alliance/src/cells/src/pxlib/pvddeck_px.ap +@@ -88,8 +88,10 @@ S 4900,5100,6700,5100,300,40onymous_,RIGHT,POLY + S 5500,3000,8500,3000,6000,2nonymous_,RIGHT,TALU2 + S 13000,3700,13000,4100,200,123nymous_,UP,ALU1 + S 4300,4900,4300,5400,100,65onymous_,UP,POLY +-S 9500,0,9500,1000,1200,cko,UP,CALU5 +-S 9500,0,9500,1000,1200,cko,UP,CALU4 ++S 9500,0,9500,1000,1200,cko,UP,ALU5 ++S 9500,0,9500,1000,1200,cko,UP,ALU4 ++S 9500,-450,9500,200,1200,cko,UP,CALU5 ++S 9500,-450,9500,200,1200,cko,UP,CALU4 + S 3500,100,3500,1500,200,22onymous_,UP,TALU5 + S 13600,5600,13600,7000,200,97onymous_,UP,ALU1 + S 14800,5600,14800,7500,300,110nymous_,UP,PDIF +diff --git a/alliance/src/cells/src/pxlib/pvddeck_sp.ap b/alliance/src/cells/src/pxlib/pvddeck_sp.ap +new file mode 100644 +index 0000000..0157fd1 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvddeck_sp.ap +@@ -0,0 +1,59 @@ ++V ALLIANCE : 6 ++H pvddeck_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 20000,2000,500,ck,5,EAST,ALU3 ++C 0,2000,500,ck,4,WEST,ALU3 ++C 20000,5000,1200,vddi,1,EAST,ALU3 ++C 20000,3500,1200,vssi,1,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,5000,1200,vddi,0,WEST,ALU3 ++C 0,3500,1200,vssi,0,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 20000,8000,1200,vddi,3,EAST,ALU3 ++C 20000,6500,1200,vssi,3,EAST,ALU3 ++C 0,6500,1200,vssi,2,WEST,ALU3 ++C 0,8000,1200,vddi,2,WEST,ALU3 ++C 10000,40000,100,vdde,6,NORTH,ALU1 ++C 9500,0,200,cko,1,SOUTH,ALU2 ++C 9500,0,200,cko,0,SOUTH,ALU1 ++S 5800,700,14200,700,800,cko,RIGHT,ALU2 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++I 0,0,pvddeck_px,a,NOSYM ++B 9500,500,1200,1200,CONT_VIA,* ++EOF +diff --git a/alliance/src/cells/src/pxlib/pvddeck_sp.vbe b/alliance/src/cells/src/pxlib/pvddeck_sp.vbe +new file mode 100644 +index 0000000..298d1aa +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvddeck_sp.vbe +@@ -0,0 +1,31 @@ ++ENTITY pvddeck_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_ck : NATURAL := 127; ++ CONSTANT tpll_ck : NATURAL := 1055; ++ CONSTANT rdown_ck : NATURAL := 126; ++ CONSTANT tphh_ck : NATURAL := 963; ++ CONSTANT rup_ck : NATURAL := 183 ++ ); ++ PORT ( ++ cko : out WOR_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvddeck_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pvddeck_sp IS ++ ++BEGIN ++ label0 : BLOCK ('1' = '1') ++ BEGIN ++ cko <= GUARDED ck; ++ END BLOCK label0; ++ ++ ASSERT ((((not (vssi) and not (vsse)) and vddi) and vdde) = '1') ++ REPORT "power supply is missing on pvddeck_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pvddi_sp.ap b/alliance/src/cells/src/pxlib/pvddi_sp.ap +new file mode 100644 +index 0000000..2d1d104 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvddi_sp.ap +@@ -0,0 +1,61 @@ ++V ALLIANCE : 6 ++H pvddi_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,0,5200,vddi,10,SOUTH,ALU2 ++C 10000,0,5200,vddi,8,SOUTH,ALU1 ++S 10000,0,10000,8500,5200,*,UP,ALU2 ++B 10000,1100,5200,2400,CONT_VIA,* ++C 20000,2000,500,ck,1,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,5000,1200,vddi,14,EAST,ALU3 ++C 20000,3500,1200,vssi,1,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,5000,1200,vddi,13,WEST,ALU3 ++C 0,3500,1200,vssi,0,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 20000,8000,1200,vddi,16,EAST,ALU3 ++C 20000,6500,1200,vssi,3,EAST,ALU3 ++C 0,6500,1200,vssi,2,WEST,ALU3 ++C 0,8000,1200,vddi,15,WEST,ALU3 ++C 10000,40000,100,vddi,17,NORTH,ALU1 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 10000,0,10000,8500,5200,*,UP,ALU2 ++B 10000,1100,5200,2400,CONT_VIA,* ++I 0,0,pvddi_px,a,NOSYM ++EOF +diff --git a/alliance/src/cells/src/pxlib/pvddi_sp.vbe b/alliance/src/cells/src/pxlib/pvddi_sp.vbe +new file mode 100644 +index 0000000..a000348 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvddi_sp.vbe +@@ -0,0 +1,20 @@ ++ENTITY pvddi_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000 ++ ); ++ PORT ( ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvddi_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pvddi_sp IS ++ ++BEGIN ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvddi_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pvddick_px.ap b/alliance/src/cells/src/pxlib/pvddick_px.ap +index 0cfbd82..e2549ab 100644 +--- a/alliance/src/cells/src/pxlib/pvddick_px.ap ++++ b/alliance/src/cells/src/pxlib/pvddick_px.ap +@@ -91,8 +91,10 @@ S 13900,5400,13900,7700,100,32onymous_,UP,PTRANS + S 18500,3000,20000,3000,6000,121nymous_,RIGHT,TALU4 + S 7000,3700,7000,4100,200,63onymous_,UP,ALU1 + S 14200,6100,14200,7500,200,6nonymous_,UP,ALU1 +-S 9500,0,9500,1000,1200,cko,UP,CALU4 +-S 9500,0,9500,1000,1200,cko,UP,CALU5 ++S 9500,0,9500,1000,1200,cko,UP,ALU4 ++S 9500,0,9500,1000,1200,cko,UP,ALU5 ++S 9500,-450,9500,200,1200,cko,UP,CALU5 ++S 9500,-450,9500,200,1200,cko,UP,CALU4 + S 15400,5600,15400,7500,300,19onymous_,UP,PDIF + S 6400,5600,6400,7000,200,89onymous_,UP,ALU1 + S 5200,4200,5200,4600,200,102nymous_,UP,ALU1 +diff --git a/alliance/src/cells/src/pxlib/pvddick_sp.ap b/alliance/src/cells/src/pxlib/pvddick_sp.ap +new file mode 100644 +index 0000000..65566d0 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvddick_sp.ap +@@ -0,0 +1,70 @@ ++V ALLIANCE : 6 ++H pvddick_sp,P, 5/ 9/2014,100 ++A 0,0,20000,40000 ++C 6500,0,200,cko,4,SOUTH,ALU2 ++C 5500,0,200,cko,0,SOUTH,ALU2 ++C 10000,40000,100,vddi,6,NORTH,ALU1 ++C 0,8000,1200,vddi,4,WEST,ALU3 ++C 0,6500,1200,vssi,2,WEST,ALU3 ++C 20000,6500,1200,vssi,3,EAST,ALU3 ++C 20000,8000,1200,vddi,5,EAST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,3500,1200,vssi,0,WEST,ALU3 ++C 0,5000,1200,vddi,2,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,3500,1200,vssi,1,EAST,ALU3 ++C 20000,5000,1200,vddi,3,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,2000,500,ck,1,EAST,ALU3 ++C 10000,0,5200,vddi,0,SOUTH,ALU1 ++C 10000,0,5200,vddi,1,SOUTH,ALU2 ++S 6500,0,6500,1000,200,*,DOWN,ALU2 ++S 5500,500,5500,1000,200,*,UP,ALU2 ++S 5500,0,5500,500,200,*,DOWN,ALU2 ++S 5500,1000,5700,1000,200,*,LEFT,ALU3 ++S 5500,500,5700,500,200,*,LEFT,ALU3 ++S 6000,0,6000,1000,1200,cko,DOWN,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++S 5800,1000,14200,1000,200,*,RIGHT,ALU3 ++S 5800,500,14200,500,200,*,RIGHT,ALU3 ++S 10000,0,10000,8500,5200,*,UP,ALU2 ++I 0,0,pvddick_px,a,NOSYM ++B 6000,500,1200,1200,CONT_VIA,* ++B 10000,1100,5200,2400,CONT_VIA,* ++EOF +diff --git a/alliance/src/cells/src/pxlib/pvddick_sp.vbe b/alliance/src/cells/src/pxlib/pvddick_sp.vbe +new file mode 100644 +index 0000000..954ac35 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvddick_sp.vbe +@@ -0,0 +1,31 @@ ++ENTITY pvddick_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_ck : NATURAL := 127; ++ CONSTANT tpll_ck : NATURAL := 1235; ++ CONSTANT rdown_ck : NATURAL := 253; ++ CONSTANT tphh_ck : NATURAL := 1109; ++ CONSTANT rup_ck : NATURAL := 311 ++ ); ++ PORT ( ++ cko : out WOR_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvddick_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pvddick_sp IS ++ ++BEGIN ++ label0 : BLOCK ('1' = '1') ++ BEGIN ++ cko <= GUARDED ck; ++ END BLOCK label0; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvddick_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pvsse_sp.ap b/alliance/src/cells/src/pxlib/pvsse_sp.ap +new file mode 100644 +index 0000000..a669894 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvsse_sp.ap +@@ -0,0 +1,55 @@ ++V ALLIANCE : 6 ++H pvsse_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,40000,100,vsse,8,NORTH,ALU1 ++C 0,8000,1200,vddi,6,WEST,ALU3 ++C 0,6500,1200,vssi,6,WEST,ALU3 ++C 20000,6500,1200,vssi,7,EAST,ALU3 ++C 20000,8000,1200,vddi,7,EAST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,3500,1200,vssi,4,WEST,ALU3 ++C 0,5000,1200,vddi,4,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,3500,1200,vssi,5,EAST,ALU3 ++C 20000,5000,1200,vddi,5,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,2000,500,ck,1,EAST,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++I 0,0,pvsse_px,a,NOSYM ++EOF +diff --git a/alliance/src/cells/src/pxlib/pvsse_sp.vbe b/alliance/src/cells/src/pxlib/pvsse_sp.vbe +new file mode 100644 +index 0000000..b6445e9 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvsse_sp.vbe +@@ -0,0 +1,20 @@ ++ENTITY pvsse_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000 ++ ); ++ PORT ( ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvsse_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pvsse_sp IS ++ ++BEGIN ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvsse_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pvsseck_px.ap b/alliance/src/cells/src/pxlib/pvsseck_px.ap +index 85af7b6..40f1818 100644 +--- a/alliance/src/cells/src/pxlib/pvsseck_px.ap ++++ b/alliance/src/cells/src/pxlib/pvsseck_px.ap +@@ -90,8 +90,10 @@ S 4300,4900,4300,5400,100,40onymous_,UP,POLY + S 5800,5600,5800,7500,300,27onymous_,UP,PDIF + S 13900,5400,13900,7700,100,77onymous_,UP,PTRANS + S 6700,4900,6700,5400,100,14onymous_,UP,POLY +-S 9500,0,9500,1000,1200,cko,UP,CALU5 +-S 9500,0,9500,1000,1200,cko,UP,CALU4 ++S 9500,0,9500,1000,1200,cko,UP,ALU5 ++S 9500,0,9500,1000,1200,cko,UP,ALU4 ++S 9500,-450,9500,200,1200,cko,UP,CALU5 ++S 9500,-450,9500,200,1200,cko,UP,CALU4 + S 15400,3700,15400,4600,200,97onymous_,UP,ALU1 + S 13600,5100,16000,5100,200,71onymous_,RIGHT,ALU1 + S 5800,500,5800,5600,200,52onymous_,UP,ALU2 +diff --git a/alliance/src/cells/src/pxlib/pvsseck_sp.ap b/alliance/src/cells/src/pxlib/pvsseck_sp.ap +new file mode 100644 +index 0000000..0bc0abb +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvsseck_sp.ap +@@ -0,0 +1,59 @@ ++V ALLIANCE : 6 ++H pvsseck_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,40000,100,vsse,8,NORTH,ALU1 ++C 0,8000,1200,vddi,6,WEST,ALU3 ++C 0,6500,1200,vssi,6,WEST,ALU3 ++C 20000,6500,1200,vssi,7,EAST,ALU3 ++C 20000,8000,1200,vddi,7,EAST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,3500,1200,vssi,4,WEST,ALU3 ++C 0,5000,1200,vddi,4,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,3500,1200,vssi,5,EAST,ALU3 ++C 20000,5000,1200,vddi,5,EAST,ALU3 ++C 0,2000,500,ck,2,WEST,ALU3 ++C 20000,2000,500,ck,3,EAST,ALU3 ++C 9500,0,200,cko,1,SOUTH,ALU2 ++C 9500,0,200,cko,0,SOUTH,ALU1 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++S 5800,700,14200,700,800,cko,RIGHT,ALU2 ++I 0,0,pvsseck_px,a,NOSYM ++B 9500,500,1200,1200,CONT_VIA,* ++EOF +diff --git a/alliance/src/cells/src/pxlib/pvsseck_sp.vbe b/alliance/src/cells/src/pxlib/pvsseck_sp.vbe +new file mode 100644 +index 0000000..c044150 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvsseck_sp.vbe +@@ -0,0 +1,31 @@ ++ENTITY pvsseck_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_ck : NATURAL := 127; ++ CONSTANT tpll_ck : NATURAL := 1055; ++ CONSTANT rdown_ck : NATURAL := 126; ++ CONSTANT tphh_ck : NATURAL := 963; ++ CONSTANT rup_ck : NATURAL := 183 ++ ); ++ PORT ( ++ cko : out WOR_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvsseck_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pvsseck_sp IS ++ ++BEGIN ++ label0 : BLOCK ('1' = '1') ++ BEGIN ++ cko <= GUARDED ck; ++ END BLOCK label0; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvsseck_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pvssi_sp.ap b/alliance/src/cells/src/pxlib/pvssi_sp.ap +new file mode 100644 +index 0000000..ba2b620 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvssi_sp.ap +@@ -0,0 +1,59 @@ ++V ALLIANCE : 6 ++H pvssi_sp,P, 4/ 9/2014,100 ++A 0,0,20000,40000 ++C 10000,0,5200,vssi,10,SOUTH,ALU2 ++C 10000,0,5200,vssi,8,SOUTH,ALU1 ++C 20000,2000,500,ck,1,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,5000,1200,vddi,1,EAST,ALU3 ++C 20000,3500,1200,vssi,5,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,5000,1200,vddi,0,WEST,ALU3 ++C 0,3500,1200,vssi,4,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 20000,8000,1200,vddi,3,EAST,ALU3 ++C 20000,6500,1200,vssi,7,EAST,ALU3 ++C 0,6500,1200,vssi,6,WEST,ALU3 ++C 0,8000,1200,vddi,2,WEST,ALU3 ++C 10000,40000,100,vssi,8,NORTH,ALU1 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++I 0,0,pvssi_px,a,NOSYM ++B 10000,1100,5200,2400,CONT_VIA,* ++S 10000,0,10000,8500,5200,*,UP,ALU2 ++EOF +diff --git a/alliance/src/cells/src/pxlib/pvssi_sp.vbe b/alliance/src/cells/src/pxlib/pvssi_sp.vbe +new file mode 100644 +index 0000000..17bed49 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvssi_sp.vbe +@@ -0,0 +1,20 @@ ++ENTITY pvssi_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000 ++ ); ++ PORT ( ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvssi_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pvssi_sp IS ++ ++BEGIN ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvssi_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/cells/src/pxlib/pvssick_px.ap b/alliance/src/cells/src/pxlib/pvssick_px.ap +index f8d408d..ed19770 100644 +--- a/alliance/src/cells/src/pxlib/pvssick_px.ap ++++ b/alliance/src/cells/src/pxlib/pvssick_px.ap +@@ -90,8 +90,10 @@ S 14200,6100,14200,7500,200,8nonymous_,UP,ALU1 + S 15400,5600,15400,7500,300,21onymous_,UP,PDIF + S 4600,5600,4600,7500,300,71onymous_,UP,PDIF + S 14800,4200,14800,4600,200,52onymous_,UP,ALU1 +-S 9500,0,9500,1000,1200,cko,UP,CALU4 +-S 9500,0,9500,1000,1200,cko,UP,CALU5 ++S 9500,0,9500,1000,1200,cko,UP,ALU4 ++S 9500,0,9500,1000,1200,cko,UP,ALU5 ++S 9500,-450,9500,200,1200,cko,UP,CALU5 ++S 9500,-450,9500,200,1200,cko,UP,CALU4 + S 7000,5600,7000,7500,300,97onymous_,UP,PDIF + S 16500,3000,16500,3000,6000,128nymous_,RIGHT,TALU2 + S 5800,6100,5800,7500,200,58onymous_,UP,ALU1 +diff --git a/alliance/src/cells/src/pxlib/pvssick_sp.ap b/alliance/src/cells/src/pxlib/pvssick_sp.ap +new file mode 100644 +index 0000000..ab70336 +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvssick_sp.ap +@@ -0,0 +1,73 @@ ++V ALLIANCE : 6 ++H pvssick_sp,P,10/ 9/2014,100 ++A 0,0,20000,40000 ++C 6400,0,100,cko,3,SOUTH,ALU1 ++C 6400,0,200,cko,4,SOUTH,ALU2 ++C 20000,2000,500,ck,1,EAST,ALU3 ++C 0,2000,500,ck,0,WEST,ALU3 ++C 20000,5000,1200,vddi,1,EAST,ALU3 ++C 20000,3500,1200,vssi,3,EAST,ALU3 ++C 20000,17000,1200,vdde,5,EAST,ALU3 ++C 20000,14000,1200,vdde,3,EAST,ALU3 ++C 20000,11000,1200,vdde,1,EAST,ALU3 ++C 20000,9500,1200,vsse,1,EAST,ALU3 ++C 20000,12500,1200,vsse,3,EAST,ALU3 ++C 20000,15500,1200,vsse,5,EAST,ALU3 ++C 20000,18500,1200,vsse,7,EAST,ALU3 ++C 0,17000,1200,vdde,4,WEST,ALU3 ++C 0,14000,1200,vdde,2,WEST,ALU3 ++C 0,11000,1200,vdde,0,WEST,ALU3 ++C 0,9500,1200,vsse,0,WEST,ALU3 ++C 0,5000,1200,vddi,0,WEST,ALU3 ++C 0,3500,1200,vssi,2,WEST,ALU3 ++C 0,12500,1200,vsse,2,WEST,ALU3 ++C 0,15500,1200,vsse,4,WEST,ALU3 ++C 0,18500,1200,vsse,6,WEST,ALU3 ++C 20000,8000,1200,vddi,3,EAST,ALU3 ++C 20000,6500,1200,vssi,5,EAST,ALU3 ++C 0,6500,1200,vssi,4,WEST,ALU3 ++C 0,8000,1200,vddi,2,WEST,ALU3 ++C 10000,40000,100,vssi,6,NORTH,ALU1 ++C 10000,0,5200,vssi,0,SOUTH,ALU1 ++C 10000,0,5200,vssi,1,SOUTH,ALU2 ++C 5800,0,200,cko,2,SOUTH,ALU2 ++C 5800,0,200,cko,0,SOUTH,ALU1 ++C 5800,0,100,cko,1,SOUTH,ALU1 ++S 6400,0,6400,1000,200,*,UP,ALU2 ++S 5800,500,14200,500,200,*,RIGHT,ALU3 ++S 5800,1000,14200,1000,200,*,RIGHT,ALU3 ++S 0,6500,400,6500,1200,*,RIGHT,ALU3 ++S 0,5000,400,5000,1200,*,RIGHT,ALU3 ++S 0,3500,400,3500,1200,*,RIGHT,ALU3 ++S 0,2000,400,2000,500,*,RIGHT,ALU3 ++S 0,18500,400,18500,1200,*,RIGHT,ALU3 ++S 0,17000,400,17000,1200,*,RIGHT,ALU3 ++S 0,12500,400,12500,1200,*,RIGHT,ALU3 ++S 0,15500,400,15500,1200,*,RIGHT,ALU3 ++S 0,14000,400,14000,1200,*,RIGHT,ALU3 ++S 0,11000,400,11000,1200,*,RIGHT,ALU3 ++S 0,9500,400,9500,1200,*,RIGHT,ALU3 ++S 0,8000,400,8000,1200,*,RIGHT,ALU3 ++S 19600,2000,20000,2000,500,*,RIGHT,ALU3 ++S 19600,3500,20000,3500,1200,*,RIGHT,ALU3 ++S 19600,5000,20000,5000,1200,*,RIGHT,ALU3 ++S 19600,6500,20000,6500,1200,*,RIGHT,ALU3 ++S 19600,8000,20000,8000,1200,*,RIGHT,ALU3 ++S 19600,9500,20000,9500,1200,*,RIGHT,ALU3 ++S 19600,11000,20000,11000,1200,*,RIGHT,ALU3 ++S 19600,12500,20000,12500,1200,*,RIGHT,ALU3 ++S 19600,14000,20000,14000,1200,*,RIGHT,ALU3 ++S 19600,15500,20000,15500,1200,*,RIGHT,ALU3 ++S 19600,17000,20000,17000,1200,*,RIGHT,ALU3 ++S 19600,18500,20000,18500,1200,*,RIGHT,ALU3 ++S 10000,30000,10000,40000,100,*,DOWN,ALU1 ++S 10000,0,10000,8500,5200,*,UP,ALU2 ++S 6000,0,6000,1000,1200,cko,DOWN,ALU3 ++S 5800,0,5800,1000,200,*,UP,ALU2 ++I 0,0,pvssick_px,a,NOSYM ++V 6400,0,CONT_VIA,* ++B 10000,1100,5200,2400,CONT_VIA,* ++V 5800,500,CONT_VIA2,* ++V 5800,1000,CONT_VIA2,* ++V 5800,0,CONT_VIA,* ++EOF +diff --git a/alliance/src/cells/src/pxlib/pvssick_sp.vbe b/alliance/src/cells/src/pxlib/pvssick_sp.vbe +new file mode 100644 +index 0000000..569407c +--- /dev/null ++++ b/alliance/src/cells/src/pxlib/pvssick_sp.vbe +@@ -0,0 +1,32 @@ ++ENTITY pvssick_sp IS ++ GENERIC ( ++ CONSTANT area : NATURAL := 80000; ++ CONSTANT cin_ck : NATURAL := 127; ++ CONSTANT tpll_ck : NATURAL := 1235; ++ CONSTANT rdown_ck : NATURAL := 253; ++ CONSTANT tphh_ck : NATURAL := 1109; ++ CONSTANT rup_ck : NATURAL := 311 ++ ); ++ PORT ( ++ cko : out WOR_BIT BUS; ++ ck : in BIT; ++ vdde : in BIT; ++ vddi : in BIT; ++ vsse : in BIT; ++ vssi : in BIT ++ ); ++END pvssick_sp; ++ ++ARCHITECTURE behaviour_data_flow OF pvssick_sp IS ++ ++BEGIN ++ ++ label0 : BLOCK ('1' = '1') ++ BEGIN ++ cko <= GUARDED ck; ++ END BLOCK label0; ++ ++ ASSERT ((((vddi and vdde) and not (vssi)) and not (vsse)) = '1') ++ REPORT "power supply is missing on pvssick_sp" ++ SEVERITY WARNING; ++END; +diff --git a/alliance/src/distrib/etc/alc_env.csh.in b/alliance/src/distrib/etc/alc_env.csh.in +index 18a1802..cea6941 100644 +--- a/alliance/src/distrib/etc/alc_env.csh.in ++++ b/alliance/src/distrib/etc/alc_env.csh.in +@@ -53,7 +53,7 @@ + setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${CELLS_TOP}/romlib" + setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${CELLS_TOP}/ramlib" + setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${CELLS_TOP}/pxlib" +- setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${CELLS_TOP}/padlib" ++#setenv MBK_CATA_LIB "${MBK_CATA_LIB}:${CELLS_TOP}/padlib" + setenv MBK_TARGET_LIB "${CELLS_TOP}/sxlib" + setenv MBK_C4_LIB ./cellsC4 + +@@ -93,9 +93,9 @@ + endif + + if ( $?MANPATH ) then +- setenv MANPATH "${MANPATH}:${ALLIANCE_TOP}/man" ++ setenv MANPATH "${MANPATH}:${ALLIANCE_TOP}/share/man" + else +- setenv MANPATH ":${ALLIANCE_TOP}/man:`manpath`" ++ setenv MANPATH ":${ALLIANCE_TOP}/share/man:`manpath`" + endif + endif + +diff --git a/alliance/src/distrib/etc/alc_env.sh.in b/alliance/src/distrib/etc/alc_env.sh.in +index ee283b7..a4115f2 100644 +--- a/alliance/src/distrib/etc/alc_env.sh.in ++++ b/alliance/src/distrib/etc/alc_env.sh.in +@@ -55,7 +55,7 @@ + MBK_CATA_LIB=$MBK_CATA_LIB:$CELLS_TOP/ramlib + MBK_CATA_LIB=$MBK_CATA_LIB:$CELLS_TOP/romlib + MBK_CATA_LIB=$MBK_CATA_LIB:$CELLS_TOP/pxlib +- MBK_CATA_LIB=$MBK_CATA_LIB:$CELLS_TOP/padlib ++ #MBK_CATA_LIB=$MBK_CATA_LIB:$CELLS_TOP/padlib + export MBK_CATA_LIB + + MBK_TARGET_LIB=$CELLS_TOP/sxlib; export MBK_TARGET_LIB +@@ -92,9 +92,9 @@ + #fi + + if [ -z "${MANPATH}" ]; then +- MANPATH=:$ALLIANCE_TOP/man:$(manpath) ++ MANPATH=:$ALLIANCE_TOP/share/man:$(manpath) + else +- MANPATH=$MANPATH:$ALLIANCE_TOP/man ++ MANPATH=$MANPATH:$ALLIANCE_TOP/share/man + fi + export MANPATH + fi +diff --git a/alliance/src/documentation/alliance-examples/etc/techno-035.rds b/alliance/src/documentation/alliance-examples/etc/techno-035.rds +index 8c78141..746fd27 100644 +--- a/alliance/src/documentation/alliance-examples/etc/techno-035.rds ++++ b/alliance/src/documentation/alliance-examples/etc/techno-035.rds +@@ -415,3 +415,37 @@ CONT_TURN3 RDS_ALU8 .0 ALL + + END + ++##------------------------------------------------------------------- ++# TABLE MBK_WIRESETTING : ++##------------------------------------------------------------------- ++# ++# This table is used by ocp, nero & ring. It supplies *symbolic* ++# information about the routing grid, the cell gauge and the power ++# wires. ++ ++TABLE MBK_WIRESETTING ++ ++ X_GRID 5 ++ Y_GRID 5 ++ Y_SLICE 50 ++ WIDTH_VDD 6 ++ WIDTH_VSS 6 ++ TRACK_WIDTH_ALU8 0 ++ TRACK_WIDTH_ALU7 2 ++ TRACK_WIDTH_ALU6 2 ++ TRACK_WIDTH_ALU5 2 ++ TRACK_WIDTH_ALU4 2 ++ TRACK_WIDTH_ALU3 2 ++ TRACK_WIDTH_ALU2 2 ++ TRACK_WIDTH_ALU1 2 ++ TRACK_SPACING_ALU8 0 ++ TRACK_SPACING_ALU7 8 ++ TRACK_SPACING_ALU6 8 ++ TRACK_SPACING_ALU5 3 ++ TRACK_SPACING_ALU4 3 ++ TRACK_SPACING_ALU3 3 ++ TRACK_SPACING_ALU2 3 ++ TRACK_SPACING_ALU1 3 ++ ++END ++ +diff --git a/alliance/src/documentation/alliance-examples/etc/techno-symb.rds b/alliance/src/documentation/alliance-examples/etc/techno-symb.rds +index 38bb0ce..2d890b8 100644 +--- a/alliance/src/documentation/alliance-examples/etc/techno-symb.rds ++++ b/alliance/src/documentation/alliance-examples/etc/techno-symb.rds +@@ -422,6 +422,40 @@ TABLE S2R_MINIMUM_LAYER_WIDTH + END + + ##------------------------------------------------------------------- ++# TABLE MBK_WIRESETTING : ++##------------------------------------------------------------------- ++# ++# This table is used by ocp, nero & ring. It supplies *symbolic* ++# information about the routing grid, the cell gauge and the power ++# wires. ++ ++TABLE MBK_WIRESETTING ++ ++ X_GRID 5 ++ Y_GRID 5 ++ Y_SLICE 50 ++ WIDTH_VDD 6 ++ WIDTH_VSS 6 ++ TRACK_WIDTH_ALU8 0 ++ TRACK_WIDTH_ALU7 2 ++ TRACK_WIDTH_ALU6 2 ++ TRACK_WIDTH_ALU5 2 ++ TRACK_WIDTH_ALU4 2 ++ TRACK_WIDTH_ALU3 2 ++ TRACK_WIDTH_ALU2 2 ++ TRACK_WIDTH_ALU1 2 ++ TRACK_SPACING_ALU8 0 ++ TRACK_SPACING_ALU7 8 ++ TRACK_SPACING_ALU6 8 ++ TRACK_SPACING_ALU5 3 ++ TRACK_SPACING_ALU4 3 ++ TRACK_SPACING_ALU3 3 ++ TRACK_SPACING_ALU2 3 ++ TRACK_SPACING_ALU1 3 ++ ++END ++ ++##------------------------------------------------------------------- + # TABLE CIF_LAYER : + ##------------------------------------------------------------------- + +diff --git a/alliance/src/genlib/man3/GENLIB_GET_REF_X.3 b/alliance/src/genlib/man3/GENLIB_GET_REF_X.3 +index e274b98..e64064e 100644 +--- a/alliance/src/genlib/man3/GENLIB_GET_REF_X.3 ++++ b/alliance/src/genlib/man3/GENLIB_GET_REF_X.3 +@@ -27,7 +27,7 @@ Name of the instance in the which the reference is to be searched for + .TP + \fIrefname\fP + Name of the reference +-SH DESCRIPTION ++.SH DESCRIPTION + \fBGET_REF_X\fP looks for + the reference, \fIrefname\fP, in the instance called \fIinsname\fP. + .SH RETURN VALUE +diff --git a/alliance/src/mbk/src/alc_pars_p.c b/alliance/src/mbk/src/alc_pars_p.c +index f65c6cb..a5212b7 100644 +--- a/alliance/src/mbk/src/alc_pars_p.c ++++ b/alliance/src/mbk/src/alc_pars_p.c +@@ -63,28 +63,28 @@ + #define MAXLBUFFER 256 + #define MAXLBUFF 256 + +-#define EVAL -2 +-#define EVER -3 +-#define EOPEN -4 +-#define ECLOSE -5 +-#define ESETUP -6 +-#define ELAYER -7 +-#define EOPGEO -8 +-#define ESYNTAX -9 +-#define EORIENT -10 +-#define EHEADER -11 +-#define EMISSEOF -12 +-#define ETYPESEG -13 +-#define ETYPEVIA -14 +-#define ENAMETRS -15 +-#define ENBFIELDS -16 +-#define EFILENAME -17 +-#define EFILETYPE -18 +-#define EBOUNDBOX -19 +-#define EABUTMBOX -20 +-#define EALLOCFIG -21 +-#define ECOMPONENT -22 +-#define ETRANSORIENT -23 ++#define EVAL 2 ++#define EVER 3 ++#define EOPEN 4 ++#define ECLOSE 5 ++#define ESETUP 6 ++#define ELAYER 7 ++#define EOPGEO 8 ++#define ESYNTAX 9 ++#define EORIENT 10 ++#define EHEADER 11 ++#define EMISSEOF 12 ++#define ETYPESEG 13 ++#define ETYPEVIA 14 ++#define ENAMETRS 15 ++#define ENBFIELDS 16 ++#define EFILENAME 17 ++#define EFILETYPE 18 ++#define EBOUNDBOX 19 ++#define EABUTMBOX 20 ++#define EALLOCFIG 21 ++#define ECOMPONENT 22 ++#define ETRANSORIENT 23 + + + #define mc_nexttoken(p_head,p_next,error_code) \ +@@ -1125,10 +1125,10 @@ static void alc_printerror(error_code) + fprintf( stderr, "ptfig not allocated"); break; + case ECOMPONENT : + fprintf( stderr, "invalid component"); break; +- default : fprintf( stderr, "unknow error"); ++ default : fprintf( stderr, "unknow error code %ld", error_code ); + } + fprintf( stderr, "\n( line %ld parsing %s )\n",parser.curr_line, +- parser.file_name ); EXIT( 1); ++ parser.file_name ); EXIT( 1); + } + + +diff --git a/alliance/src/mbk/src/mbk_util.c b/alliance/src/mbk/src/mbk_util.c +index 88ccfde..cc04f5b 100644 +--- a/alliance/src/mbk/src/mbk_util.c ++++ b/alliance/src/mbk/src/mbk_util.c +@@ -90,6 +90,15 @@ long MBK_TRACK_SPACING_ALU5 = 8; + long MBK_TRACK_SPACING_ALU6 = 8; + long MBK_TRACK_SPACING_ALU7 = 8; + long MBK_TRACK_SPACING_ALU8 = 0; ++unsigned long RING_WMIN_ALU1 = 2; ++unsigned long RING_WMIN_ALU2 = 2; ++unsigned long RING_DMIN_ALU1_ALU1 = 3; ++unsigned long RING_DMIN_ALU2_ALU2 = 3; ++unsigned long RING_WVIA_ALU1 = 2; ++unsigned long RING_WVIA_ALU2 = 3; ++unsigned long RING_EXTENSION_ALU2 = 1; ++unsigned long RING_BV_VIA_VIA = 4; ++unsigned long RING_WALIM = 60; + char PARSER_INFO[100] = "nothing yet"; /* version number, and so on */ + char *VDD = NULL; /* user name for power high */ + char *VSS = NULL; /* user name for power ground */ +@@ -302,6 +311,43 @@ static char MBK_RAND_SEED[] = { 0x62, + if (str != NULL) + MBK_TRACK_SPACING_ALU8 = (long)atoi(str); + ++ str = mbkgetenv("RING_WMIN_ALU1"); ++ if (str != NULL) ++ RING_WMIN_ALU1 = (long)atoi(str); ++ ++ str = mbkgetenv("RING_WMIN_ALU2"); ++ if (str != NULL) ++ RING_WMIN_ALU2 = (long)atoi(str); ++ ++ str = mbkgetenv("RING_DMIN_ALU1_ALU1"); ++ if (str != NULL) ++ RING_DMIN_ALU1_ALU1 = (long)atoi(str); ++ ++ str = mbkgetenv("RING_DMIN_ALU2_ALU2"); ++ if (str != NULL) ++ RING_DMIN_ALU2_ALU2 = (long)atoi(str); ++ ++ str = mbkgetenv("RING_WVIA_ALU1"); ++ if (str != NULL) ++ RING_WVIA_ALU1 = (long)atoi(str); ++ ++ str = mbkgetenv("RING_WVIA_ALU2"); ++ if (str != NULL) ++ RING_WVIA_ALU2 = (long)atoi(str); ++ ++ str = mbkgetenv("RING_EXTENSION_ALU2"); ++ if (str != NULL) ++ RING_EXTENSION_ALU2 = (long)atoi(str); ++ ++ str = mbkgetenv("RING_BV_VIA_VIA"); ++ if (str != NULL) ++ RING_BV_VIA_VIA = (long)atoi(str); ++ ++ str = mbkgetenv("RING_WALIM"); ++ if (str != NULL) ++ RING_WALIM = (long)atoi(str); ++ ++ + srand((unsigned int) MBK_RAND_SEED); + + str = mbkgetenv("MBK_IN_LO"); +diff --git a/alliance/src/mbk/src/mut.h b/alliance/src/mbk/src/mut.h +index 9e87261..11c2914 100644 +--- a/alliance/src/mbk/src/mut.h ++++ b/alliance/src/mbk/src/mut.h +@@ -211,6 +211,17 @@ extern long MBK_TRACK_SPACING_ALU5; + extern long MBK_TRACK_SPACING_ALU6; + extern long MBK_TRACK_SPACING_ALU7; + extern long MBK_TRACK_SPACING_ALU8; ++ ++extern unsigned long RING_WMIN_ALU1; ++extern unsigned long RING_WMIN_ALU2; ++extern unsigned long RING_DMIN_ALU1_ALU1; ++extern unsigned long RING_DMIN_ALU2_ALU2; ++extern unsigned long RING_WVIA_ALU1; ++extern unsigned long RING_WVIA_ALU2; ++extern unsigned long RING_EXTENSION_ALU2; ++extern unsigned long RING_BV_VIA_VIA; ++extern unsigned long RING_WALIM; ++ + extern char PARSER_INFO[]; /* version number, and so on */ + extern char *VDD; /* user name for power high */ + extern char *VSS; /* user name for power ground */ +diff --git a/alliance/src/nero/src/UDefs.h b/alliance/src/nero/src/UDefs.h +index f756e26..042e705 100644 +--- a/alliance/src/nero/src/UDefs.h ++++ b/alliance/src/nero/src/UDefs.h +@@ -38,7 +38,7 @@ + # include + # include + +-# include ++//# include + + + +diff --git a/alliance/src/nero/src/UOpts.cpp b/alliance/src/nero/src/UOpts.cpp +index 8fb4fd8..a369fd6 100644 +--- a/alliance/src/nero/src/UOpts.cpp ++++ b/alliance/src/nero/src/UOpts.cpp +@@ -16,12 +16,10 @@ + + + +-# include "unistd.h" ++# include + # include "UDefs.h" + + +- +- + // +----------------------------------------------------------------+ + // | Methods Definitions | + // +----------------------------------------------------------------+ +@@ -119,7 +117,7 @@ void COpts::getopts (int argc, char *argv[]) throw (except_done) + extern char *optarg; + int key; + long key_index; +- string key_string; ++ string key_string; + const char *short_format; + + +@@ -127,9 +125,9 @@ void COpts::getopts (int argc, char *argv[]) throw (except_done) + + short_format = tShort.c_str(); + +- // Loop over getopt. ++// Loop over getopt. + while (true) { +- key = getopt (argc, argv, short_format); ++ key = ::getopt (argc, argv, short_format); + + if (key == -1) break; + +diff --git a/alliance/src/nero/src/nero.cpp b/alliance/src/nero/src/nero.cpp +index d59566d..7a70240 100644 +--- a/alliance/src/nero/src/nero.cpp ++++ b/alliance/src/nero/src/nero.cpp +@@ -17,6 +17,11 @@ + + + # include "RDefs.h" ++# ifdef __CYGWIN__ ++extern "C" { ++ int getopt ( int argc, char * const argv[], const char *optstring ); ++} ++# endif + + + +diff --git a/alliance/src/ocp/src/placer/PCon.cpp b/alliance/src/ocp/src/placer/PCon.cpp +index e236e98..d69a635 100644 +--- a/alliance/src/ocp/src/placer/PCon.cpp ++++ b/alliance/src/ocp/src/placer/PCon.cpp +@@ -60,7 +60,7 @@ PCon::Save(struct phfig *physicalfig, const double dx, const double dy) const { + , (int)(GetPosX() * PITCH + dx) + , (int)(GetPosY() * PITCH + dy) + , _orient==NORTH || _orient == SOUTH ? ALU2 : ALU3 +- , (_orient==NORTH || _orient == SOUTH ? 2 : 1) * (PITCH/MBK_X_GRID)); ++ , (_orient==NORTH || _orient == SOUTH ? MBK_TRACK_WIDTH_ALU2:MBK_TRACK_WIDTH_ALU3)*SCALE_X); + } else { + #if 0 + addphcon(physicalfig, +@@ -89,7 +89,7 @@ PCon::RingSave(struct phfig *physicalfig, const double dx, const double dy) cons + (int)(GetPosX() * PITCH + dx), + (int)(GetPosY() * PITCH + dy), + ALU2, +- 2 * (PITCH/MBK_X_GRID)); ++ MBK_TRACK_WIDTH_ALU2*SCALE_X); + } + + ostream& +diff --git a/alliance/src/ocp/src/placer/iocscan.l b/alliance/src/ocp/src/placer/iocscan.l +index db95f60..3279e05 100644 +--- a/alliance/src/ocp/src/placer/iocscan.l ++++ b/alliance/src/ocp/src/placer/iocscan.l +@@ -1,6 +1,7 @@ + + %option noinput + %option nounput ++%option yylineno + + /* This file is part of the Alliance Project. + Copyright (C) Laboratoire LIP6 - Departement ASIM +diff --git a/alliance/src/rds/etc/Makefile.am b/alliance/src/rds/etc/Makefile.am +index ab78e4e..d5cca76 100644 +--- a/alliance/src/rds/etc/Makefile.am ++++ b/alliance/src/rds/etc/Makefile.am +@@ -1,8 +1,7 @@ +-# $Id: Makefile.am,v 1.5 2002/05/08 21:07:26 jpc Exp $ + + etcdir=$(prefix)/etc + +-etc_DATA=cmos.rds ++etc_DATA=cmos.rds scn6m_deep_09.rds + + EXTRA_DIST=$(etc_DATA) + +diff --git a/alliance/src/rds/etc/cmos.rds b/alliance/src/rds/etc/cmos.rds +index d1a6bed..b597366 100644 +--- a/alliance/src/rds/etc/cmos.rds ++++ b/alliance/src/rds/etc/cmos.rds +@@ -396,6 +396,42 @@ TABLE S2R_MINIMUM_LAYER_WIDTH + END + + ##------------------------------------------------------------------- ++# TABLE MBK_WIRESETTING : ++##------------------------------------------------------------------- ++# ++# This table is used by ocp, nero & ring. It supplies *symbolic* ++# information about the routing grid, the cell gauge and the power ++# wires. ++ ++ ++TABLE MBK_WIRESETTING ++ ++ X_GRID 5 ++ Y_GRID 5 ++ Y_SLICE 50 ++ WIDTH_VDD 6 ++ WIDTH_VSS 6 ++ TRACK_WIDTH_ALU8 0 ++ TRACK_WIDTH_ALU7 2 ++ TRACK_WIDTH_ALU6 2 ++ TRACK_WIDTH_ALU5 2 ++ TRACK_WIDTH_ALU4 2 ++ TRACK_WIDTH_ALU3 2 ++ TRACK_WIDTH_ALU2 2 ++ TRACK_WIDTH_ALU1 2 ++ TRACK_SPACING_ALU8 0 ++ TRACK_SPACING_ALU7 8 ++ TRACK_SPACING_ALU6 8 ++ TRACK_SPACING_ALU5 3 ++ TRACK_SPACING_ALU4 3 ++ TRACK_SPACING_ALU3 3 ++ TRACK_SPACING_ALU2 3 ++ TRACK_SPACING_ALU1 3 ++ ++END ++ ++ ++##------------------------------------------------------------------- + # TABLE CIF_LAYER : + ##------------------------------------------------------------------- + +diff --git a/alliance/src/rds/etc/scn6m_deep_09.rds b/alliance/src/rds/etc/scn6m_deep_09.rds +new file mode 100644 +index 0000000..86b2ac8 +--- /dev/null ++++ b/alliance/src/rds/etc/scn6m_deep_09.rds +@@ -0,0 +1,2134 @@ ++ ++# ================================================================== ++# COPYRIGHT IS UNCERTAIN YET. ++# ++# This file is a derived from the Alliance cmos.rds, adapted by ++# Graham Petley for 0.13um and finally to MOSIS scn6m_deep by ++# Naohiko Shimizu. It is a 2lambdas rules. ++# ++# To be used with the msxlib and mpxlib libraries (the leading 'm' ++# standing for MOSIS). ++# ++# The design rules are listed (i) the 0.13um generic rule set; ++# (ii) the vsclib 2um rules scaled by the value of lambda (0.055); ++# (iii) the MOSIS SCMOS and (iv) DEEP rules scaled by 0.06; ++# (v) the vsclib 2um rules. ++#------------------------------------+-----+-----+-----+-----+-----+ ++# DESIGN RULES | notes ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 0.13 vsclib MOSIS DEEP 2um ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 1.1 NWELL width 0.64 0.99 0.60 0.72 18.0 ++# 1.1 PWELL width 0.64 0.99 0.60 0.72 18.0 ++# 1.3 NWELL space 0.64 0.99 0.36 0.36 18.0 ++# 1.3 PWELL space 0.64 0.99 0.36 0.36 18.0 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 2.1a PDIF/NDIF width 0.20 0.22 0.18 0.18 4.0 ++# 2.1b PTIE/NTIE width 0.20 0.22 0.18 0.18 4.0 ++# 2.2a PDIF space 0.20 0.22 0.18 0.18 4.0 ++# 2.2a NDIF space 0.20 0.22 0.18 0.18 4.0 ++# 2.2b PTIE space 0.20 0.22 0.18 0.18 4.0 ++# 2.2b NTIE space 0.20 0.22 0.18 0.18 4.0 ++# 2.3a NWELL to NDIF space 0.32 0.33 0.30 0.36 6.0 ++# 2.3b NWELL overlap of PDIF 0.32 0.33 0.30 0.36 6.0 ++# 2.4a NWELL to PTIE space 0.24 0.275 0.18 0.18 5.0 ++# 2.4b NWELL overlap of NTIE 0.24 0.275 0.18 0.18 5.0 ++# 2.5 NDIF to PTIE space 0.20 0.22 0.24 0.24 4.0 ++# 2.5 PDIF to NTIE space 0.20 0.22 0.24 0.24 4.0 ++# 2.8a PDIF to NDIF space 0.64 0.66 0.60 0.72 12.0 ++# 2.8b PDIF to PTIE space 0.54 0.55 0.48 0.54 11.0 ++# 2.8b NTIE to NDIF space 0.54 0.55 0.48 0.54 11.0 ++# 2.8c NTIE to PTIE space 0.44 0.44 0.36 0.36 10.0 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 3.1 POLY width 0.12 0.11 0.12 0.12 2.0 ++# 3.2 POLY space over field 0.20 0.22 0.12 0.18 4.0 ++# 3.2a POLY space over diffusion 0.24 0.275 0.12 0.24 5.0 ++# 3.3 POLY overlap of transistor 0.18 0.22 0.12 0.15 4.0 ++# 3.4 Source/drain width 0.26 0.275 0.18 0.24 5.0 ++# 3.5 PDIF or NDIF to POLY space 0.10 0.11 0.06 0.06 2.0 ++# 3.5a POLY to CHANNEL space 0.10 0.165 0.06 0.06 3.0 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 4.1 SELECT to CHANNEL space 0.28 0.275 0.18 0.18 5.0 ++# 4.2a SELECT overlap of PDIF or NDIF 0.18 0.165 0.12 0.12 3.0 ++# 4.2b SELECT overlap of PTIE or NTIE 0.04 0.055 0.12 0.12 1.0 ++# 4.4 SELECT width 0.24 0.22 0.12 0.24 4.0 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 5.1 Exact POLY CONTACT size 0.16 0.11 0.12 0.12 2.0 ++# 5.2 POLY overlap of CONTACT 0.08 0.11 0.09 0.09 2.0 ++# 5.3 CONTACT space 0.20 0.275 0.12 0.24 5.0 ++# 5.4 POLY CONTACT to CHANNEL space 0.16 0.165 0.12 0.12 3.0 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 6.1 Exact PDIF or NDIF CONTACT size .16 0.11 0.12 0.12 2.0 ++# 6.1 Exact PTIE or NTIE CONTACT size .16 0.11 0.12 0.12 2.0 ++# 6.2a PDIF or NDIF overlap of CONTACT .08 0.11 0.09 0.09 2.0 ++# 6.2b PTIE or NTIE overlap of CONTACT .08 0.11 0.09 0.09 2.0 ++# 6.3 CONTACT space 0.20 0.275 0.12 0.24 5.0 ++# 6.4 PDIF CONTACT to CHANNEL space 0.12 0.165 0.12 0.12 3.0 ++# 6.4 NDIF CONTACT to CHANNEL space 0.12 0.165 0.12 0.12 3.0 ++# 6.4a PTIE CONTACT to CHANNEL space 0.40 0.44 0.39 0.39 8.0 ++# 6.4a NTIE CONTACT to CHANNEL space 0.40 0.44 0.39 0.39 8.0 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 7.1 Metal-1 width 0.18 0.22 0.18 0.18 4.0 ++# 7.2 Metal-1 space 0.18 0.165 0.12 0.18 3.0 ++# 7.3a Metal-1 side overlap of CONTACT .01 0.055 0.06 0.06 1.0 1 ++# 7.3b Metal-1 end overlap of CONTACT 0.06 0.11 0.06 0.06 2.0 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 8.1 VIA1 width 0.20 0.11 0.12 0.18 2.0 ++# 8.2 VIA1 space 0.24 0.33 0.18 0.18 6.0 ++# 8.3a Metal-1 side overlap of VIA1 0.01 0.055 0.06 0.06 1.0 1 ++# 8.3b Metal-1 end overlap of VIA1 0.06 0.11 0.06 0.06 2.0 2 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 9.x=Metal-2 15.x=Metal-3 22.x=Metal-4 26.x=Metal-5 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 9.1 Metal-2 width 0.22 0.22 0.18 0.18 4.0 ++# 9.2 Metal-2 space 0.22 0.22 0.18 0.24 4.0 ++# 9.3a Metal-2 side overlap of VIA1 0.01 0.055 0.06 0.06 1.0 1 ++# 9.3b Metal-2 end overlap of VIA1 0.06 0.11 0.06 0.06 2.0 2 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 14.x=VIA2 21.x=VIA3 25.x=VIA4 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 14.1 VIA2 width 0.20 0.11 0.12 0.18 2.0 ++# 14.2 VIA2 space 0.24 0.33 0.18 0.18 6.0 ++# 14.3a Metal-2 side overlap of VIA2 0.01 0.055 0.06 0.06 1.0 1 ++# 14.3b Metal-2 end overlap of VIA2 0.06 0.11 0.06 0.06 2.0 2 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 29.1 VIA5 width 0.40 0.22 0.18 0.24 2.0 3 ++# 29.2 VIA5 space 0.48 0.66 0.24 0.24 14.0 ++# 29.3a Metal-5 side overlap of VIA5 0.02 0.11 0.06 0.06 3.0 1 ++# 29.3b Metal-5 end overlap of VIA5 0.06 0.165 0.06 0.06 4.0 2 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# 30.1 Metal-6 width 0.44 0.44 0.30 0.30 8.0 ++# 30.2 Metal-6 space 0.44 0.44 0.30 0.30 8.0 ++# 30.3a Metal-6 side overlap of VIA5 0.13 0.22 0.06 0.12 3.0 ++# 30.3b Metal-6 end overlap of VIA5 0.13 0.22 0.06 0.12 4.0 ++#------------------------------------+-----+-----+-----+-----+-----+ ++# ++#notes ++# 1. Metal overlap of CONTACT and VIA rules have been divided ++# into two. Modern technologies have one (small) side ++# overlap (1 in the drawing) and a ++# 1 larger end overlap (2 in the drawing). ++# |--| For metal-1, the vsclib uses 1.0 for (1) ++# +--------+ - and 2.0 for (2). The rule set has checks ++# |////////| | for these different values. The checks ++# |////////| | 2 for the higher metal overlap rules (934, ++# |//+--+//| + 1434, 1534, 2134, 2234, 2534, 2634, ++# |//| |//| 2934) are present. They have been ++# |//+--+//| commented (except for ALU6) in the vsc013x ++# |////////| RDS file. ++# ++# 2. The end overlap of metal over via should be 2 lambda, but ++# this isn't supported by NERO. For metal-1 the support is in the ++# cell layout. For the upper metal layers the end overlap must ++# be added by a script. Checks are made in vsc013.rds but not in ++# vsc013x.rds. ++# 3. Rules are for a 6 layer metal process. For fewer layers, ++# apply metal-6 to top metal and VIA5 to top via. ++# ++##------------------------------------------------------------------- ++# PHYSICAL_GRID : ++##------------------------------------------------------------------- ++ ++DEFINE PHYSICAL_GRID 0.005 ++ ++##------------------------------------------------------------------- ++# LAMBDA : ++##------------------------------------------------------------------- ++ ++DEFINE LAMBDA 0.09 ++ ++##------------------------------------------------------------------- ++# TABLE MBK_TO_RDS_SEGMENT : ++# ++# MBK RDS layer 1 RDS layer 2 ++# name name TRANS DLR DWR OFFSET name TRANS DLR DWR OFFSET ... ++##------------------------------------------------------------------- ++ ++TABLE MBK_TO_RDS_SEGMENT ++ ++ PWELL RDS_PWELL VW 0.36 0.0 0.0 ALL \ ++ RDS_USER6 VW 0.36 0.0 0.0 DRC ++ NWELL RDS_NWELL VW 0.36 0.0 0.0 ALL \ ++ RDS_USER3 VW 0.36 0.0 0.0 DRC ++ ++# The NIMP/PIMP layers are not visualised in ++# Graal. If you want to see the layers, change ++# the keyword in the NIMP/PIMP entry from DRC to ALL. ++# TVIA3 and TVIA4 are replicas of PIMP and NIMP ++# to ensure geometries written to CIF and GDS. ++ NDIF RDS_NDIF VW 0.18 0.0 0.0 ALL \ ++ RDS_ACTIV VW 0.18 0.0 0.0 DRC \ ++ RDS_NIMP VW 0.36 0.36 0.0 DRC \ ++ RDS_TVIA4 VW 0.36 0.36 0.0 DRC ++ PDIF RDS_PDIF VW 0.18 0.0 0.0 ALL \ ++ RDS_ACTIV VW 0.18 0.0 0.0 DRC \ ++ RDS_PIMP VW 0.36 0.36 0.0 DRC \ ++ RDS_TVIA3 VW 0.36 0.36 0.0 DRC ++ ++# RDS_NTIE EXT is for visualisation in Graal. ++# RDS_NTIE DRC makes a NIMP layer the same as RDS_NIMP. ++# The NTIE is used to make an implant layer because ++# s2r with the -i option uses NTIE to "cut" a hole in ++# the PIMP implant generated from NWELL. The real NTIE ++# layer is too small for this hole, so the layer is ++# redefined in DRC mode to give the right size hole. ++# RDS_ACTIV is the diffusion layer. ++# RDS_NIMP makes a second implant layer which is the same ++# as the RDS_NTIE. It is included so that the implant layer ++# can be seen in Graal if the DRC entry is changed to ALL. ++# RDS_TPOLY is used to write out an NTIE geometry to ++# CIF and GDS, and for design rule checks to the diffusion ++# layer. NTIE cannot be used for this because it must be ++# oversized to the implant layer. ++# s2r must be run twice to make a single correct ++# CIF or GDS file for cell fred.ap, ++# $ s2r -i fred ++# $ s2r -p fred ++# These should not be combined and must be run one after ++# the other. ++# Make sure old CIF files are removed before running s2r. ++# NTIE RDS_NTIE VW 0.495 0.54 0.0 EXT \ ++# RDS_NTIE VW 0.495 0.54 0.0 DRC \ ++# RDS_ACTIV VW 0.135 -0.09 0.0 DRC \ ++# RDS_NIMP VW 0.495 0.54 0.0 DRC \ ++# RDS_TPOLY VW 0.135 -0.09 0.0 DRC ++# PTIE RDS_PTIE VW 0.495 0.54 0.0 EXT \ ++# RDS_PTIE VW 0.495 0.54 0.0 DRC \ ++# RDS_ACTIV VW 0.135 -0.09 0.0 DRC \ ++# RDS_PIMP VW 0.495 0.54 0.0 DRC \ ++# RDS_VPOLY VW 0.135 -0.09 0.0 DRC ++ ++ NTIE RDS_NTIE VW 0.045 -0.09 0.0 EXT \ ++ RDS_NTIE VW 0.225 0.27 0.0 DRC \ ++ RDS_ACTIV VW 0.045 -0.09 0.0 DRC \ ++ RDS_NIMP VW 0.225 0.27 0.0 DRC \ ++ RDS_TPOLY VW 0.045 -0.09 0.0 DRC ++ PTIE RDS_PTIE VW 0.045 -0.09 0.0 EXT \ ++ RDS_PTIE VW 0.225 0.27 0.0 DRC \ ++ RDS_ACTIV VW 0.045 -0.09 0.0 DRC \ ++ RDS_PIMP VW 0.225 0.27 0.0 DRC \ ++ RDS_VPOLY VW 0.045 -0.09 0.0 DRC ++ ++# The GATE layer is the poly which makes the ++# transistor. It is used to measure the ENDCAP ++# value. ++ NTRANS RDS_POLY VW 0.27 0.00 0.0 ALL \ ++ RDS_GATE VW 0.27 0.00 0.0 DRC \ ++ RDS_NDIF LCW 0.0 0.27 0.0 EXT \ ++ RDS_NDIF RCW 0.0 0.27 0.0 EXT \ ++ RDS_NDIF VW 0.0 0.72 0.0 DRC \ ++ RDS_ACTIV VW 0.0 0.72 0.0 ALL \ ++ RDS_NIMP VW 0.18 1.26 0.0 DRC \ ++ RDS_NIMP VW 0.18 1.26 0.0 DRC \ ++ RDS_TVIA4 VW 0.18 1.26 0.0 DRC \ ++ RDS_TVIA4 VW 0.18 1.26 0.0 DRC ++ PTRANS RDS_POLY VW 0.27 0.00 0.0 ALL \ ++ RDS_GATE VW 0.27 0.00 0.0 DRC \ ++ RDS_PDIF LCW 0.0 0.27 0.0 EXT \ ++ RDS_PDIF RCW 0.0 0.27 0.0 EXT \ ++ RDS_PDIF VW 0.0 0.72 0.0 DRC \ ++ RDS_ACTIV VW 0.0 0.72 0.0 ALL \ ++ RDS_PIMP VW 0.18 1.26 0.0 ALL \ ++ RDS_PIMP VW 0.18 1.26 0.0 DRC \ ++ RDS_TVIA3 VW 0.18 1.26 0.0 DRC \ ++ RDS_TVIA3 VW 0.18 1.26 0.0 DRC ++ POLY RDS_POLY VW 0.09 0.00 0.0 ALL ++ ++# POLY2 layer used to define metal-1 which ++# has a 7 lambda pitch. ALU1 layer is used for ++# metal-1 which has an 8 lambda pitch ++# Layer USER0 is used to check for the end overlap of ++# 2 lambda wide metal-1 to CONT. Layer USER1 checks 4 lambda ++# wide metal-1. Their DLR is ++# metal-1_DLR + lambda + CONT_width/2 + end_overlap ++# = 0.095 + 0.055 + 0.08 + 0.06 = 0.29 ++# USER0 DWR is 0.0. ++# USER1 DWR set to size USER1 to CONT width (0.22-0.06=0.16). ++# Layer USER2 is used to check for the end overlap of ++# 4 lambda metal-1. Its DWR is ++# max(CONT+2*end_overlap,width of 4 lambda metal-1)-4 ++# = max(0.16+2*0.06,0.22)-0.22 = max(0.28,0.22)-0.22 = 0.06 ++# USER2 DLR is set to half CONT width (0.08) ++# USER4 and USER5 match USER1 and USER2 for VIA ++# POLY2 RDS_POLY2 VW 0.18 0.09 0.0 ALL \ ++# RDS_USER0 VW 0.18 0.09 0.0 DRC \ ++# RDS_USER1 VW 0.18 0.09 0.0 DRC \ ++# RDS_USER2 VW 0.18 0.09 0.0 DRC \ ++# RDS_USER4 VW 0.18 0.09 0.0 DRC \ ++# RDS_USER5 VW 0.18 0.09 0.0 DRC ++ ++ ALU1 RDS_ALU1 VW 0.18 0.09 0.0 ALL \ ++ RDS_USER0 VW 0.18 0.09 0.0 DRC \ ++ RDS_USER1 VW 0.18 0.09 0.0 DRC \ ++ RDS_USER2 VW 0.18 0.09 0.0 DRC \ ++ RDS_USER4 VW 0.18 0.09 0.0 DRC \ ++ RDS_USER5 VW 0.18 0.09 0.0 DRC ++ ++# Layers VALU2-VALU6 and TALU2-TALU6 are used to ++# check for the end overlap of the metal to via. ++ ALU2 RDS_ALU2 VW 0.135 0.00 0.0 ALL \ ++ RDS_TALU2 VW 0.135 0.00 0.0 DRC \ ++ RDS_VALU2 VW 0.135 0.00 0.0 DRC ++ ALU3 RDS_ALU3 VW 0.135 0.00 0.0 ALL \ ++ RDS_TALU3 VW 0.135 0.00 0.0 DRC \ ++ RDS_VALU3 VW 0.135 0.00 0.0 DRC ++ ALU4 RDS_ALU4 VW 0.135 0.00 0.0 ALL \ ++ RDS_TALU4 VW 0.135 0.00 0.0 DRC \ ++ RDS_VALU4 VW 0.135 0.00 0.0 DRC ++ ALU5 RDS_ALU5 VW 0.135 0.00 0.0 ALL \ ++ RDS_TALU5 VW 0.135 0.00 0.0 DRC \ ++ RDS_VALU5 VW 0.135 0.00 0.0 DRC ++ ALU6 RDS_ALU6 VW 0.225 0.00 0.0 ALL \ ++ RDS_TALU6 VW 0.225 0.00 0.0 DRC \ ++ RDS_VALU6 VW 0.225 0.00 0.0 DRC ++ ++ CALU1 RDS_ALU1 VW 0.18 0.0 0.0 ALL ++ CALU2 RDS_ALU2 VW 0.135 0.0 0.0 ALL ++ CALU3 RDS_ALU3 VW 0.135 0.0 0.0 ALL ++ CALU4 RDS_ALU4 VW 0.135 0.0 0.0 ALL ++ CALU5 RDS_ALU5 VW 0.135 0.0 0.0 ALL ++ CALU6 RDS_ALU6 VW 0.225 0.0 0.0 ALL ++ TALU1 RDS_TALU1 VW 0.18 0.0 0.0 ALL ++ TALU2 RDS_TALU2 VW 0.135 0.0 0.0 ALL ++ TALU3 RDS_TALU3 VW 0.135 0.0 0.0 ALL ++ TALU4 RDS_TALU4 VW 0.135 0.0 0.0 ALL ++ TALU5 RDS_TALU5 VW 0.135 0.0 0.0 ALL ++ TALU6 RDS_TALU6 VW 0.225 0.0 0.0 ALL ++ TALU8 RDS_TALU8 VW 0.00 0.0 0.0 ALL ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE MBK_TO_RDS_CONNECTOR : ++# ++# MBK RDS layer ++# name name DER DWR ++##------------------------------------------------------------------- ++ ++TABLE MBK_TO_RDS_CONNECTOR ++ ++ POLY RDS_POLY 0.00 0.00 ++# POLY2 RDS_POLY2 0.00 0.00 ++ ALU1 RDS_ALU1 0.00 0.00 ++ ALU2 RDS_ALU2 0.00 0.00 ++ ALU3 RDS_ALU3 0.00 0.00 ++ ALU4 RDS_ALU4 0.00 0.00 ++ ALU5 RDS_ALU5 0.00 0.00 ++ ALU6 RDS_ALU6 0.00 0.00 ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE MBK_TO_RDS_REFERENCE : ++# ++# MBK ref RDS layer ++# name name width ++##------------------------------------------------------------------- ++ ++TABLE MBK_TO_RDS_REFERENCE ++ ++ REF_REF RDS_REF 0.27 ++ REF_CON RDS_VALU1 0.27 RDS_TVIA1 0.27 RDS_TALU2 0.36 ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE MBK_TO_RDS_VIA : ++# ++# MBK via RDS layer 1 RDS layer 2 RDS layer 3 RDS layer 4 ++# name name width name width name width name width ++##------------------------------------------------------------------- ++ ++TABLE MBK_TO_RDS_VIA ++# The NIMP/PIMP layers are not visualised in Graal. If you want to ++# see the layers, change the keyword for NIMP/PIMP from DRC to ALL. ++ ++ CONT_BODY_P\ ++ RDS_PTIE 0.81 DRC\ ++ RDS_PTIE 0.45 EXT\ ++ RDS_VPOLY 0.45 DRC\ ++ RDS_CONT 0.18 ALL\ ++ RDS_ALU1 0.36 ALL\ ++ RDS_ACTIV 0.45 DRC\ ++ RDS_PIMP 0.81 DRC ++ CONT_BODY_N\ ++ RDS_NTIE 0.81 DRC\ ++ RDS_NTIE 0.45 EXT\ ++ RDS_TPOLY 0.45 DRC\ ++ RDS_CONT 0.18 ALL\ ++ RDS_ALU1 0.36 ALL\ ++ RDS_ACTIV 0.45 DRC\ ++ RDS_NIMP 0.81 DRC ++ CONT_DIF_N\ ++ RDS_NDIF 0.54 ALL\ ++ RDS_CONT 0.18 ALL\ ++ RDS_ALU1 0.36 ALL\ ++ RDS_ACTIV 0.54 DRC\ ++ RDS_NIMP 0.90 DRC\ ++ RDS_TVIA4 0.90 DRC ++ CONT_DIF_P\ ++ RDS_PDIF 0.54 ALL\ ++ RDS_CONT 0.18 ALL\ ++ RDS_ALU1 0.36 ALL\ ++ RDS_ACTIV 0.54 DRC\ ++ RDS_PIMP 0.90 DRC\ ++ RDS_TVIA3 0.90 DRC ++ CONT_POLY\ ++ RDS_POLY 0.54 ALL\ ++ RDS_CONT 0.18 ALL\ ++ RDS_ALU1 0.36 ALL ++ CONT_VIA\ ++ RDS_ALU1 0.45 ALL\ ++ RDS_VIA1 0.27 ALL\ ++ RDS_ALU2 0.45 ALL ++ CONT_VIA2\ ++ RDS_ALU2 0.45 ALL\ ++ RDS_VIA2 0.27 ALL\ ++ RDS_VALU3 0.45 ALL\ ++ RDS_TALU3 0.45 ALL\ ++ RDS_ALU3 0.45 ALL ++ CONT_VIA3\ ++ RDS_ALU3 0.45 ALL\ ++ RDS_VIA3 0.27 ALL\ ++ RDS_VALU4 0.45 ALL\ ++ RDS_TALU4 0.45 ALL\ ++ RDS_ALU4 0.45 ALL ++ CONT_VIA4\ ++ RDS_ALU4 0.45 ALL\ ++ RDS_VIA4 0.27 ALL\ ++ RDS_VALU5 0.45 ALL\ ++ RDS_TALU5 0.45 ALL\ ++ RDS_ALU5 0.45 ALL ++ CONT_VIA5\ ++ RDS_ALU5 0.63 ALL\ ++ RDS_VIA5 0.45 ALL\ ++ RDS_VALU6 0.72 ALL\ ++ RDS_TALU6 0.72 ALL\ ++ RDS_ALU6 0.72 ALL ++ C_X_N\ ++ RDS_POLY 0.36 ALL\ ++ RDS_NDIF 0.55 ALL\ ++ RDS_ACTIV 0.55 ALL ++ C_X_P\ ++ RDS_POLY 0.36 ALL\ ++ RDS_PDIF 0.55 ALL\ ++ RDS_ACTIV 0.55 ALL ++END ++ ++##------------------------------------------------------------------- ++# TABLE MBK_TO_RDS_BIGVIA_HOLE : ++# ++# MBK via RDS Hole ++# name name side step mode ++##------------------------------------------------------------------- ++ ++TABLE MBK_TO_RDS_BIGVIA_HOLE ++ ++CONT_VIA RDS_VIA1 0.27 0.27 ALL ++CONT_VIA2 RDS_VIA2 0.27 0.27 ALL ++CONT_VIA3 RDS_VIA3 0.27 0.27 ALL ++CONT_VIA4 RDS_VIA4 0.27 0.27 ALL ++CONT_VIA5 RDS_VIA5 0.36 0.36 ALL ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE MBK_TO_RDS_BIGVIA_METAL : ++# ++# MBK via RDS layer 1 ... ++# name name delta-width overlap mode ++##------------------------------------------------------------------- ++ ++TABLE MBK_TO_RDS_BIGVIA_METAL ++ ++CONT_VIA RDS_ALU1 0.0 0.09 ALL RDS_ALU2 0.0 0.09 ALL ++CONT_VIA2 RDS_ALU2 0.0 0.09 ALL RDS_ALU3 0.0 0.09 ALL ++CONT_VIA3 RDS_ALU3 0.0 0.09 ALL RDS_ALU4 0.0 0.09 ALL ++CONT_VIA4 RDS_ALU4 0.0 0.09 ALL RDS_ALU5 0.0 0.09 ALL ++CONT_VIA5 RDS_ALU5 0.0 0.09 ALL RDS_ALU6 0.0 0.18 ALL ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE MBK_TO_RDS_TURNVIA : ++# ++# MBK via RDS layer 1 ... ++# name name DWR MODE ++##------------------------------------------------------------------- ++ ++TABLE MBK_TO_RDS_TURNVIA ++ ++CONT_TURN1 RDS_ALU1 0.0 ALL ++CONT_TURN2 RDS_ALU2 0.0 ALL ++CONT_TURN3 RDS_ALU3 0.0 ALL ++CONT_TURN4 RDS_ALU4 0.0 ALL ++CONT_TURN5 RDS_ALU5 0.0 ALL ++CONT_TURN6 RDS_ALU6 0.0 ALL ++ ++END ++ ++TABLE MBK_WIRESETTING ++X_GRID 10 ++Y_GRID 10 ++Y_SLICE 100 ++WIDTH_VDD 12 ++WIDTH_VSS 12 ++TRACK_WIDTH_ALU8 0 ++TRACK_WIDTH_ALU7 4 ++TRACK_WIDTH_ALU6 4 ++TRACK_WIDTH_ALU5 4 ++TRACK_WIDTH_ALU4 3 ++TRACK_WIDTH_ALU3 3 ++TRACK_WIDTH_ALU2 3 ++TRACK_WIDTH_ALU1 3 ++TRACK_SPACING_ALU8 0 ++TRACK_SPACING_ALU7 4 ++TRACK_SPACING_ALU6 4 ++TRACK_SPACING_ALU5 4 ++TRACK_SPACING_ALU4 4 ++TRACK_SPACING_ALU3 4 ++TRACK_SPACING_ALU2 4 ++TRACK_SPACING_ALU1 3 ++WMIN_ALU1 3 ++WMIN_ALU2 3 ++DMIN_ALU1_ALU1 5 ++DMIN_ALU2_ALU2 5 ++WVIA_ALU1 5 ++WVIA_ALU2 5 ++EXTENSION_ALU2 1 ++BV_VIA_VIA 8 ++WALIM 60 ++END ++ ++ ++##------------------------------------------------------------------- ++# TABLE LYNX_GRAPH : ++# ++# RDS layer Rds layer 1 Rds layer 2 ... ++# name name name ... ++##------------------------------------------------------------------- ++ ++TABLE LYNX_GRAPH ++ ++##--------------------------- ++ ++ RDS_NDIF RDS_CONT RDS_NDIF ++ RDS_PDIF RDS_CONT RDS_PDIF ++ RDS_NTIE RDS_CONT RDS_TPOLY RDS_NTIE ++ RDS_PTIE RDS_CONT RDS_VPOLY RDS_PTIE ++ ++ RDS_POLY RDS_CONT RDS_POLY ++ RDS_CONT RDS_PDIF RDS_NDIF RDS_POLY RDS_PTIE RDS_NTIE RDS_ALU1 RDS_POLY2 RDS_CONT ++ RDS_POLY2 RDS_CONT RDS_ALU1 RDS_POLY2 ++ RDS_ALU1 RDS_CONT RDS_VIA1 RDS_POLY2 RDS_ALU1 ++ ++ RDS_VIA1 RDS_ALU1 RDS_ALU2 RDS_VIA1 ++ RDS_VIA2 RDS_ALU2 RDS_ALU3 RDS_VIA2 ++ RDS_VIA3 RDS_ALU3 RDS_ALU4 RDS_VIA3 ++ RDS_VIA4 RDS_ALU4 RDS_ALU5 RDS_VIA4 ++ RDS_VIA5 RDS_ALU5 RDS_ALU6 RDS_VIA5 ++ RDS_ALU2 RDS_VIA1 RDS_VIA2 RDS_ALU2 ++ RDS_ALU3 RDS_VIA2 RDS_VIA3 RDS_ALU3 ++ RDS_ALU4 RDS_VIA3 RDS_VIA4 RDS_ALU4 ++ RDS_ALU5 RDS_VIA4 RDS_VIA5 RDS_ALU5 ++ RDS_ALU6 RDS_VIA5 RDS_ALU6 ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE LYNX_CAPA : ++# ++# RDS layer Surface capacitance Perimetric capacitance ++# name piF / Micron^2 piF / Micron ++##------------------------------------------------------------------- ++ ++TABLE LYNX_CAPA ++# poly alu0 alu1 alu2 alu3 alu4 alu5 alu6 ++# pitch 7 14 14 16 16 16 16 36 ++ RDS_POLY 10.10E-05 10.00e-05 ++ RDS_POLY2 3.400e-05 5.300e-05 ++ RDS_ALU1 3.400e-05 5.300e-05 ++ RDS_ALU2 1.400e-05 3.600e-05 ++ RDS_ALU3 0.900e-05 2.900e-05 ++ RDS_ALU4 0.700e-05 2.400e-05 ++ RDS_ALU5 0.500e-05 2.100e-05 ++ RDS_ALU6 0.400e-05 1.900e-05 ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE LYNX_RESISTOR : ++# ++# RDS layer Surface resistor ++# name Ohm / Micron^2 ++##------------------------------------------------------------------- ++ ++TABLE LYNX_RESISTOR ++ ++ RDS_POLY 8.3 ++ RDS_POLY2 0.08 ++ RDS_ALU1 0.08 ++ RDS_ALU2 0.08 ++ RDS_ALU3 0.08 ++ RDS_ALU4 0.08 ++ RDS_ALU5 0.07 ++ RDS_ALU6 0.01 ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE LYNX_TRANSISTOR : ++# ++# MBK layer Transistor Type MBK via ++# name name name ++##------------------------------------------------------------------- ++ ++TABLE LYNX_TRANSISTOR ++ ++ NTRANS NTRANS C_X_N RDS_POLY RDS_NDIF RDS_NDIF RDS_PWELL ++ PTRANS PTRANS C_X_P RDS_POLY RDS_PDIF RDS_PDIF RDS_NWELL ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE LYNX_DIFFUSION : ++# ++# RDS layer RDS layer ++# name name ++##------------------------------------------------------------------- ++ ++TABLE LYNX_DIFFUSION ++END ++ ++##------------------------------------------------------------------- ++# TABLE LYNX_BULK_IMPLICIT : ++# ++# RDS layer Bulk type ++# name EXPLICIT/IMPLICIT ++##------------------------------------------------------------------- ++ ++TABLE LYNX_BULK_IMPLICIT ++END ++ ++ ++ ++##------------------------------------------------------------------- ++# TABLE S2R_OVERSIZE_DENOTCH : ++##------------------------------------------------------------------- ++ ++TABLE S2R_OVERSIZE_DENOTCH ++ RDS_NWELL 1.075 ++ RDS_PWELL 1.075 ++ RDS_ACTIV 0.175 ++ RDS_PDIF 0.265 ++ RDS_NDIF 0.265 ++ RDS_TPOLY 0.265 ++ RDS_VPOLY 0.265 ++ RDS_NTIE 0.265 ++ RDS_PTIE 0.265 ++# The NIMP and PIMP values are used to set the width of WELL and ++# IMPlant beyond the Abox. Values set equal to the NIMP/PIMP ++# overlap of TIE contact so that thin slivers of IMPlant are not ++# inserted between the TIE implant and well edge. ++ RDS_PIMP 0.355 ++ RDS_NIMP 0.355 ++# Denotch NIMP and PIMP with user layers allowing single implant ++# contact between two implant edges. ++# Width is (2.5+6.2a)*2+6.1=(0.20+0.08)*2+0.16=0.72. Denotch just below. ++ RDS_TVIA3 0.0 ++ RDS_TVIA4 0.0 ++ RDS_POLY 0.0 ++ RDS_POLY2 0.0 ++ RDS_ALU1 0.0 ++ RDS_ALU2 0.0 ++ RDS_ALU3 0.0 ++ RDS_ALU4 0.0 ++ RDS_ALU5 0.0 ++ RDS_ALU6 0.0 ++END ++ ++##------------------------------------------------------------------- ++# TABLE S2R_BLOC_RING_WIDTH : ++##------------------------------------------------------------------- ++ ++TABLE S2R_BLOC_RING_WIDTH ++END ++ ++##------------------------------------------------------------------- ++# TABLE S2R_MINIMUM_LAYER_WIDTH : ++##------------------------------------------------------------------- ++ ++TABLE S2R_MINIMUM_LAYER_WIDTH ++ ++ RDS_NWELL 1.08 ++ RDS_PWELL 1.08 ++ RDS_NDIF 0.27 ++ RDS_PDIF 0.27 ++ RDS_NTIE 0.27 ++ RDS_PTIE 0.27 ++ RDS_TPOLY 0.27 ++ RDS_VPOLY 0.27 ++ RDS_PIMP 0.36 ++ RDS_NIMP 0.36 ++ RDS_POLY 0.18 ++ RDS_CONT 0.18 ++ RDS_POLY2 0.27 ++ RDS_ALU1 0.27 ++ RDS_TALU1 0.27 ++ RDS_VIA1 0.27 ++ RDS_ALU2 0.27 ++ RDS_TALU2 0.27 ++ RDS_VIA2 0.27 ++ RDS_ALU3 0.27 ++ RDS_TALU3 0.27 ++ RDS_VIA3 0.27 ++ RDS_ALU4 0.27 ++ RDS_TALU4 0.27 ++ RDS_VIA4 0.27 ++ RDS_ALU5 0.27 ++ RDS_TALU5 0.27 ++ RDS_VIA5 0.27 ++ RDS_ALU6 0.44 ++ RDS_TALU6 0.44 ++ RDS_REF 0.36 ++ RDS_TALU8 3.96 ++ ++END ++ ++##------------------------------------------------------------------- ++# TABLE CIF_LAYER : ++##------------------------------------------------------------------- ++ ++TABLE CIF_LAYER ++# Layer definitions used by MOSIS ++#-------------------------------- ++ RDS_NWELL CWN ++ RDS_PWELL CWP ++ RDS_USER3 CWN ++ RDS_USER6 CWP ++ RDS_NDIF CND ++ RDS_PDIF CPD ++ RDS_TPOLY CNS ++ RDS_VPOLY CPS ++# PTIE and NTIE actually provide the implants ++# around the cutouts for CONT_BODY_N and _P. ++ RDS_PTIE CSP ++ RDS_NTIE CSN ++ RDS_ACTIV CAA ++ RDS_PIMP CSP ++ RDS_NIMP CSN ++# If using 's2r -i' then the TVIA3 and TVIA4 ++# lines should be commented. If using 's2r' ++# only then the lines should be uncommented. ++# RDS_TVIA3 CSP ++# RDS_TVIA4 CSN ++ RDS_POLY CPG ++ RDS_CONT CCC ++# RDS_POLY2 CM1 ++ RDS_ALU1 CM1 ++# RDS_TALU1 TM1 ++ RDS_VIA1 CV1 ++ RDS_ALU2 CM2 ++# RDS_TALU2 TM2 ++ RDS_VIA2 CV2 ++ RDS_ALU3 CM3 ++# RDS_TALU3 TM3 ++ RDS_VIA3 CV3 ++ RDS_ALU4 CM4 ++# RDS_TALU4 TM4 ++ RDS_VIA4 CV4 ++ RDS_ALU5 CM5 ++# RDS_TALU5 TM5 ++ RDS_VIA5 CV5 ++ RDS_ALU6 CM6 ++# RDS_TALU6 TM6 ++ RDS_REF REF ++ RDS_TALU8 AB ++ ++# Layer definitions used by Alliance ++#----------------------------------- ++# RDS_NWELL LNWELL ++# RDS_PWELL LPWELL ++# RDS_NDIF LNDIF ++# RDS_PDIF LPDIF ++# RDS_TPOLY LTPOLY ++# RDS_VPOLY LVPOLY ++# RDS_NTIE LNTIE ++# RDS_PTIE LPTIE ++# RDS_PIMP LPIMP ++# RDS_NIMP LNIMP ++# RDS_POLY LPOLY ++# RDS_POLY2 LPOLY2 ++# RDS_CONT LCONT ++# RDS_POLY2 LALU1 ++# RDS_ALU1 LALU1 ++# RDS_TALU1 LTALU1 ++# RDS_VIA1 LVIA ++# RDS_ALU2 LALU2 ++# RDS_TALU2 LTALU2 ++# RDS_VIA2 LVIA2 ++# RDS_ALU3 LALU3 ++# RDS_TALU3 LTALU3 ++# RDS_VIA3 LVIA3 ++# RDS_ALU4 LALU4 ++# RDS_TALU4 LTALU4 ++# RDS_VIA4 LVIA4 ++# RDS_ALU5 LALU5 ++# RDS_TALU5 LTALU5 ++# RDS_VIA5 LVIA5 ++# RDS_ALU6 LALU6 ++# RDS_TALU6 LTALU6 ++# RDS_REF LREF ++END ++ ++##------------------------------------------------------------------- ++# TABLE GDS_LAYER : ++##------------------------------------------------------------------- ++ ++TABLE GDS_LAYER ++# Layer definitions used by MOSIS ++#-------------------------------- ++ RDS_PWELL 41 ++ RDS_NWELL 42 ++ RDS_USER6 41 ++ RDS_USER3 42 ++ RDS_NDIF 43 ++ RDS_PDIF 43 ++ RDS_TPOLY 43 ++ RDS_VPOLY 43 ++ RDS_PTIE 44 ++ RDS_NTIE 45 ++ RDS_ACTIV 43 ++ RDS_PIMP 44 ++ RDS_NIMP 45 ++# RDS_TVIA3 44 ++# RDS_TVIA4 45 ++ RDS_POLY 46 46 ++ RDS_CONT 25 ++# RDS_POLY2 49 49 ++ RDS_ALU1 49 49 ++# RDS_TALU1 13 ++ RDS_VIA1 50 ++ RDS_ALU2 51 51 ++# RDS_TALU2 17 ++ RDS_VIA2 61 ++ RDS_ALU3 62 62 ++# RDS_TALU3 20 ++ RDS_VIA3 30 ++ RDS_ALU4 31 31 ++# RDS_TALU4 23 ++ RDS_VIA4 32 ++ RDS_ALU5 33 33 ++# RDS_TALU5 27 ++ RDS_VIA5 36 ++ RDS_ALU6 37 37 ++# RDS_TALU6 30 ++# RDS_REF 24 ++# RDS_TALU8 63 ++ ++# Layer definitions used by Alliance ++#----------------------------------- ++# RDS_NWELL 1 ++# RDS_PWELL 2 ++# RDS_NDIF 3 ++# RDS_PDIF 4 ++# RDS_NTIE 5 ++# RDS_PTIE 6 ++# RDS_POLY 7 ++# RDS_POLY2 8 ++# RDS_TPOLY 9 ++# RDS_CONT 10 ++# RDS_POLY2 11 ++# RDS_ALU1 11 ++# RDS_TALU1 13 ++# RDS_VIA1 14 ++# RDS_ALU2 16 ++# RDS_TALU2 17 ++# RDS_VIA2 18 ++# RDS_ALU3 19 ++# RDS_TALU3 20 ++# RDS_VIA3 21 ++# RDS_ALU4 22 ++# RDS_TALU4 23 ++# RDS_VIA4 25 ++# RDS_ALU5 26 ++# RDS_TALU5 27 ++# RDS_VIA5 28 ++# RDS_ALU6 29 ++# RDS_TALU6 30 ++# RDS_REF 24 ++END ++ ++##------------------------------------------------------------------- ++# TABLE S2R_POST_TREAT : ++##------------------------------------------------------------------- ++ ++TABLE S2R_POST_TREAT ++ ++ RDS_NWELL TREAT NULL ++ RDS_PWELL TREAT NULL ++ RDS_NDIF TREAT NULL ++ RDS_PDIF TREAT NULL ++ RDS_NTIE TREAT NULL ++ RDS_PTIE TREAT NULL ++ RDS_TPOLY TREAT NULL ++ RDS_VPOLY TREAT NULL ++ RDS_NIMP TREAT NULL ++ RDS_PIMP TREAT NULL ++ RDS_TVIA4 TREAT NULL ++ RDS_TVIA3 TREAT NULL ++ RDS_ACTIV TREAT NULL ++ RDS_POLY TREAT NULL ++ RDS_CONT NOTREAT NULL ++ RDS_VIA1 NOTREAT NULL ++ RDS_VIA2 NOTREAT NULL ++ RDS_VIA3 NOTREAT NULL ++ RDS_VIA4 NOTREAT NULL ++ RDS_VIA5 NOTREAT NULL ++ RDS_POLY2 TREAT NULL ++ RDS_ALU1 TREAT NULL ++ RDS_ALU2 TREAT NULL ++ RDS_ALU3 TREAT NULL ++ RDS_ALU4 TREAT NULL ++ RDS_ALU5 TREAT NULL ++ RDS_ALU6 TREAT NULL ++ RDS_TALU1 TREAT NULL ++ RDS_TALU2 TREAT NULL ++ RDS_TALU3 TREAT NULL ++ RDS_TALU4 TREAT NULL ++ RDS_TALU5 TREAT NULL ++ RDS_TALU6 TREAT NULL ++ ++# Two RDS_TALU8 rectangles are written, one with no name and ++# one with the cell name. When merged, the name is lost. ++# It is prefered to have a single rectangle with no name rather ++# than two, one of which is named. ++ RDS_TALU8 TREAT NULL ++ ++END ++ ++##------------------------------------------------------------------- ++## All layers used in the regles must be listed here first. ++## Otherwise you get an error like : ++# DRUC ERR: Undefined RDS LAYER ++##------------------------------------------------------------------- ++DRC_RULES ++ ++layer RDS_USER0 0.27; ++layer RDS_USER1 0.27; ++layer RDS_USER2 0.27; ++layer RDS_USER4 0.27; ++layer RDS_USER5 0.27; ++layer RDS_NWELL 1.08; ++layer RDS_PWELL 1.08; ++layer RDS_NTIE 0.27; ++layer RDS_PTIE 0.27; ++layer RDS_NDIF 0.27; ++layer RDS_PDIF 0.27; ++layer RDS_TPOLY 0.27; ++layer RDS_VPOLY 0.27; ++layer RDS_ACTIV 0.27; ++layer RDS_PIMP 0.45; ++layer RDS_NIMP 0.45; ++layer RDS_CONT 0.18; ++layer RDS_VIA1 0.27; ++layer RDS_VIA2 0.27; ++layer RDS_VIA3 0.27; ++layer RDS_VIA4 0.27; ++layer RDS_VIA5 0.36; ++layer RDS_POLY 0.18; ++layer RDS_GATE 0.18; ++layer RDS_ALU1 0.27; ++layer RDS_ALU2 0.27; ++layer RDS_ALU3 0.27; ++layer RDS_ALU4 0.27; ++layer RDS_ALU5 0.27; ++layer RDS_ALU6 0.45; ++ ++layer RDS_REF 0.20; ++layer RDS_TALU1 0.27; ++layer RDS_TALU2 0.27; ++layer RDS_TALU3 0.27; ++layer RDS_TALU4 0.27; ++layer RDS_TALU5 0.27; ++layer RDS_TALU6 0.45; ++layer RDS_TALU8 3.96; ++layer RDS_POLY2 0.27; ++layer RDS_VALU2 0.27; ++layer RDS_VALU3 0.27; ++layer RDS_VALU4 0.27; ++layer RDS_VALU5 0.27; ++layer RDS_VALU6 0.45; ++ ++regles ++ ++# Note : ``min'' is different from ``>=''. ++# min is applied on polygons and >= is applied on rectangles. ++# There is the same difference between max and <=. ++# >= is faster than min, but min must be used where it is ++# required to consider polygons, for example distance of ++# two objects in the same layer ++#----------------------------------------------------------- ++# Check the NWELL shapes ++#----------------------- ++caracterise RDS_NWELL ( ++ regle 110 : largeur >= 1.08 ; ++ regle 111 : longueur_inter min 1.08 ; ++ regle 130 : notch >= 1.08 ; ++); ++relation RDS_NWELL , RDS_NWELL ( ++ regle 131 : distance axiale min 0.54 ; ++); ++ ++# Check the PWELL shapes ++#----------------------- ++caracterise RDS_PWELL ( ++ regle 112 : largeur >= 1.08 ; ++ regle 113 : longueur_inter min 1.08 ; ++ regle 132 : notch >= 1.08 ; ++); ++relation RDS_PWELL , RDS_PWELL ( ++ regle 133 : distance axiale min 0.54 ; ++); ++ ++define RDS_NWELL , RDS_PWELL intersection -> BOTH_WELLS; ++ ++# Check no NWELL and PWELL overlap ++#--------------------------------- ++# Won't work with PWELL made from symbolic NWELL ++caracterise BOTH_WELLS ( ++ regle 140 : largeur max 0.0 ; ++); ++relation RDS_PWELL , RDS_NWELL ( ++ regle 141 : distance axiale min 0.0 ; ++); ++ ++undefine BOTH_WELLS; ++ ++# Check the RDS_PDIF shapes ++#-------------------------- ++caracterise RDS_PDIF ( ++ regle 210 : largeur >= 0.27 ; ++ regle 211 : longueur_inter min 0.27 ; ++ regle 220 : notch >= 0.27 ; ++); ++relation RDS_PDIF , RDS_PDIF ( ++ regle 221 : distance axiale min 0.27 ; ++); ++ ++# Check the RDS_NDIF shapes ++#-------------------------- ++caracterise RDS_NDIF ( ++ regle 212 : largeur >= 0.27 ; ++ regle 213 : longueur_inter min 0.27 ; ++ regle 222 : notch >= 0.27 ; ++); ++relation RDS_NDIF , RDS_NDIF ( ++ regle 223 : distance axiale min 0.27 ; ++); ++ ++# define PSUB and NSUB layers for easier ++# understanding of design rules ++define RDS_VPOLY , RDS_PTIE intersection -> PSUB; ++define RDS_TPOLY , RDS_NTIE intersection -> NSUB; ++ ++# Check the RDS_PTIE shapes ++#-------------------------- ++caracterise PSUB ( ++ regle 214 : largeur >= 0.27 ; ++ regle 215 : longueur_inter min 0.27 ; ++ regle 224 : notch >= 0.27 ; ++); ++relation PSUB , PSUB ( ++ regle 225 : distance axiale min 0.27 ; ++); ++ ++# Check the RDS_NTIE shapes ++#-------------------------- ++caracterise NSUB ( ++ regle 216 : largeur >= 0.27 ; ++ regle 217 : longueur_inter min 0.27 ; ++ regle 226 : notch >= 0.27 ; ++); ++relation NSUB , NSUB ( ++ regle 227 : distance axiale min 0.27 ; ++); ++ ++# Check RDS_NDIF is outside NWELL ++#-------------------------------- ++relation RDS_NDIF , RDS_NWELL ( ++ regle 230 : distance axiale >= 0.54 ; ++ regle 231 : enveloppe longueur_inter < 0.0 ; ++ regle 232 : croix longueur_inter < 0.0 ; ++ regle 233 : intersection longueur_inter < 0.0 ; ++ regle 234 : extension longueur_inter < 0.0 ; ++ regle 235 : inclusion longueur_inter < 0.0 ; ++); ++relation RDS_NWELL , RDS_NDIF ( ++ regle 236 : marge longueur_inter < 0.0 ; ++); ++ ++# Check RDS_PDIF is inside NWELL ++#------------------------------- ++relation RDS_NWELL , RDS_PDIF ( ++ regle 237 : enveloppe inferieure min 0.54 ; ++); ++ ++# Check RDS_PTIE is outside NWELL ++#-------------------------------- ++relation PSUB , RDS_NWELL ( ++ regle 240 : distance axiale >= 0.27 ; ++ regle 241 : enveloppe longueur_inter < 0.0 ; ++ regle 242 : croix longueur_inter < 0.0 ; ++ regle 243 : intersection longueur_inter < 0.0 ; ++ regle 244 : extension longueur_inter < 0.0 ; ++ regle 245 : inclusion longueur_inter < 0.0 ; ++); ++relation RDS_NWELL , PSUB ( ++ regle 246 : marge longueur_inter < 0.0 ; ++); ++ ++# Check RDS_NTIE is inside NWELL ++#------------------------------- ++relation RDS_NWELL , NSUB ( ++ regle 247 : enveloppe inferieure min 0.27 ; ++); ++ ++# Check NDIF and PDIF separation ++#------------------------------- ++relation RDS_NDIF , PSUB ( ++ regle 250 : distance axiale min 0.36 ; ++ regle 251 : intersection longueur_inter < 0.0 ; ++ regle 252 : extension longueur_inter < 0.0 ; ++ regle 253 : inclusion longueur_inter < 0.0 ; ++); ++relation RDS_PDIF , NSUB ( ++ regle 254 : distance axiale min 0.36 ; ++ regle 255 : intersection longueur_inter < 0.0 ; ++ regle 256 : extension longueur_inter < 0.0 ; ++ regle 257 : inclusion longueur_inter < 0.0 ; ++); ++ ++# Check RDS_PDIF is outside PWELL ++#--------------------------------- ++relation RDS_PDIF , RDS_PWELL ( ++ regle 260 : distance axiale >= 0.54 ; ++ regle 261 : enveloppe longueur_inter < 0.0 ; ++ regle 262 : croix longueur_inter < 0.0 ; ++ regle 263 : intersection longueur_inter < 0.0 ; ++ regle 264 : extension longueur_inter < 0.0 ; ++ regle 265 : inclusion longueur_inter < 0.0 ; ++); ++relation RDS_PWELL , RDS_PDIF ( ++ regle 266 : marge longueur_inter < 0.0 ; ++); ++ ++# Check RDS_NDIF is inside PWELL ++#------------------------------- ++relation RDS_PWELL , RDS_NDIF ( ++ regle 267 : enveloppe inferieure min 0.54 ; ++); ++ ++# Check RDS_NTIE is outside PWELL ++#-------------------------------- ++relation NSUB , RDS_PWELL ( ++ regle 270 : distance axiale >= 0.27 ; ++ regle 271 : enveloppe longueur_inter < 0.0 ; ++ regle 272 : croix longueur_inter < 0.0 ; ++ regle 273 : intersection longueur_inter < 0.0 ; ++ regle 274 : extension longueur_inter < 0.0 ; ++ regle 275 : inclusion longueur_inter < 0.0 ; ++); ++relation RDS_PWELL , NSUB ( ++ regle 276 : marge longueur_inter < 0.0 ; ++); ++ ++# Check RDS_PTIE is inside PWELL ++#------------------------------- ++relation RDS_PWELL , PSUB ( ++ regle 277 : enveloppe inferieure min 0.27 ; ++); ++ ++# Check opposite implant diffusion spacings ++#------------------------------------------ ++# These rules added to flag DRC errors even if ++# NWELL and PWELL are not visualised in Graal ++#--------------------------------------------- ++relation RDS_PDIF , RDS_NDIF ( ++# distance is nwell overlap pdif plus nwell space to ndif ++ regle 280 : distance axiale min 1.08 ; ++); ++relation RDS_PDIF , PSUB ( ++# distance is nwell overlap pdif plus nwell space to ptie ++ regle 281 : distance axiale min 0.81 ; ++); ++relation NSUB , RDS_NDIF ( ++# distance is nwell overlap ntie plus nwell space to ndif ++ regle 282 : distance axiale min 0.81 ; ++); ++# distance is nwell overlap ntie plus nwell space to ptie ++relation NSUB , PSUB ( ++ regle 283 : distance axiale min 0.54 ; ++); ++ ++define RDS_ACTIV , RDS_POLY intersection -> CHANNEL; ++ ++# Check the RDS_POLY shapes ++#-------------------------- ++caracterise RDS_POLY ( ++ regle 310 : largeur >= 0.18 ; ++ regle 311 : longueur_inter >= 0.18 ; ++ regle 320 : notch >= 0.27 ; ++); ++relation RDS_POLY , RDS_POLY ( ++ regle 321 : distance axiale min 0.27 ; ++); ++ ++# Check the CHANNEL shapes ++#-------------------------- ++caracterise CHANNEL ( ++ regle 322 : notch >= 0.27 ; ++); ++relation CHANNEL , CHANNEL ( ++ regle 323 : distance axiale min 0.27 ; ++); ++ ++# Check POLY overlap of TRANSISTOR (ENDCAP) ++#------------------------------------------ ++relation RDS_POLY , RDS_PDIF ( ++ regle 330 : croix longueur_min min 0.225 ; ++); ++relation RDS_POLY , RDS_NDIF ( ++ regle 331 : croix longueur_min min 0.225 ; ++); ++ ++# Check SOURCE/DRAIN width ++#------------------------- ++relation RDS_PDIF , RDS_GATE ( ++ regle 340 : croix longueur_min min 0.36 ; ++); ++relation RDS_NDIF , RDS_GATE ( ++ regle 341 : croix longueur_min min 0.36 ; ++); ++ ++# Check RDS_POLY separation to DIF ++#--------------------------------- ++relation RDS_POLY , RDS_PDIF ( ++ regle 350 : distance axiale min 0.09 ; ++); ++relation RDS_POLY , RDS_NDIF ( ++ regle 351 : distance axiale min 0.09 ; ++); ++relation RDS_POLY , PSUB ( ++ regle 352 : distance axiale min 0.09 ; ++); ++relation RDS_POLY , NSUB ( ++ regle 353 : distance axiale min 0.09 ; ++); ++ ++# Check RDS_POLY separation to TRANSISTOR CHANNEL ++#------------------------------------------------ ++relation RDS_POLY , CHANNEL ( ++ regle 354 : distance axiale >= 0.09 ; ++); ++ ++undefine NSUB; ++undefine PSUB; ++define RDS_POLY , CHANNEL exclusion -> FIELD_POLY; ++define RDS_PDIF , RDS_POLY intersection -> PGATE; ++ ++# Check RDS_POLY does not overlap PDIF ++#------------------------------------- ++relation PGATE , FIELD_POLY ( ++ regle 355 : inclusion longueur_inter < 0.0 ; ++); ++relation FIELD_POLY , PGATE ( ++ regle 356 : extension longueur_inter < 0.0 ; ++); ++ ++undefine PGATE; ++define RDS_NDIF , RDS_POLY intersection -> NGATE; ++ ++# Check RDS_POLY does not overlap NDIF ++#------------------------------------- ++relation NGATE , FIELD_POLY ( ++ regle 357 : inclusion longueur_inter < 0.0 ; ++); ++relation FIELD_POLY , NGATE ( ++ regle 358 : extension longueur_inter < 0.0 ; ++); ++ ++undefine NGATE; ++define RDS_PDIF , CHANNEL intersection -> PTR; ++ ++# N-select and P-select rules ++#---------------------------- ++relation PTR , RDS_NIMP ( ++ regle 410 : distance axiale min 0.27 ; ++); ++ ++undefine PTR; ++define RDS_NDIF , CHANNEL intersection -> NTR; ++ ++relation NTR , RDS_PIMP ( ++ regle 411 : distance axiale min 0.27 ; ++); ++ ++undefine NTR; ++undefine FIELD_POLY; ++define RDS_VPOLY , RDS_PTIE intersection -> PSUB; ++define RDS_TPOLY , RDS_NTIE intersection -> NSUB; ++ ++relation RDS_PIMP , RDS_PDIF ( ++ regle 420 : enveloppe inferieure min 0.18 ; ++); ++relation RDS_PIMP , PSUB ( ++ regle 421 : enveloppe inferieure min 0.18 ; ++); ++relation RDS_NIMP , RDS_NDIF ( ++ regle 422 : enveloppe inferieure min 0.18 ; ++); ++relation RDS_NIMP , NSUB ( ++ regle 423 : enveloppe inferieure min 0.18 ; ++); ++ ++undefine NSUB; ++undefine PSUB; ++define RDS_PIMP , RDS_PWELL intersection -> TIE_PIMP; ++define RDS_NIMP , RDS_NWELL intersection -> TIE_NIMP; ++ ++# Check min SELECT widths for TIE implant ++#---------------------------------------- ++caracterise TIE_PIMP ( ++ regle 440 : largeur >= 0.36 ; ++ regle 441 : longueur_inter min 0.36 ; ++); ++# This is the min NIMP width rule ++relation TIE_PIMP , TIE_PIMP ( ++ regle 444 : distance axiale min 0.36 ; ++); ++caracterise TIE_NIMP ( ++ regle 442 : largeur >= 0.36 ; ++ regle 443 : longueur_inter min 0.36 ; ++); ++# This is the min PIMP width rule ++relation TIE_NIMP , TIE_NIMP ( ++ regle 445 : distance axiale min 0.36 ; ++); ++ ++undefine TIE_NIMP; ++undefine TIE_PIMP; ++define RDS_POLY , RDS_CONT intersection -> POLY_CONT; ++ ++# Check CONT layer size, separation and overlaps ++#----------------------------------------------- ++caracterise POLY_CONT ( ++ regle 510 : largeur max 0.185 ; ++ regle 511 : largeur min 0.18 ; ++); ++relation RDS_POLY , RDS_CONT ( ++ regle 520 : enveloppe inferieure min 0.09 ; ++); ++relation RDS_CONT , RDS_CONT ( ++ regle 530 : distance axiale min 0.36 ; ++); ++ ++# Check POLY CONTACT separation from TRANSISTOR CHANNEL ++#------------------------------------------------------ ++relation CHANNEL , POLY_CONT ( ++ regle 540 : distance axiale >= 0.27 ; ++); ++ ++undefine POLY_CONT; ++define RDS_CONT , CHANNEL intersection -> BAD_CONT; ++ ++# CONTACT not allowed over TRANSISTOR ++#------------------------------------ ++caracterise BAD_CONT ( ++ regle 580 : largeur max 0.0 ; ++); ++ ++undefine BAD_CONT; ++ ++define RDS_PDIF , RDS_CONT intersection -> PDIF_CONT; ++caracterise PDIF_CONT ( ++ regle 610 : longueur max 0.185 ; ++ regle 611 : longueur_inter min 0.18 ; ++); ++# Check PDIF CONTACT separation from TRANSISTOR CHANNEL ++#------------------------------------------------------ ++relation CHANNEL , PDIF_CONT ( ++ regle 640 : distance axiale >= 0.18 ; ++); ++ ++undefine PDIF_CONT; ++define RDS_NDIF , RDS_CONT intersection -> NDIF_CONT; ++ ++caracterise NDIF_CONT ( ++ regle 612 : longueur max 0.185 ; ++ regle 613 : longueur_inter min 0.18 ; ++); ++# Check NDIF CONTACT separation from TRANSISTOR CHANNEL ++#------------------------------------------------------ ++relation CHANNEL , NDIF_CONT ( ++ regle 641 : distance axiale >= 0.18 ; ++); ++ ++undefine NDIF_CONT; ++define RDS_PTIE , RDS_CONT intersection -> PTIE_CONT; ++caracterise PTIE_CONT ( ++ regle 614 : longueur max 0.185 ; ++ regle 615 : longueur_inter min 0.18 ; ++); ++# Check PTIE CONTACT separation from TRANSISTOR CHANNEL ++#------------------------------------------------------ ++relation CHANNEL , PTIE_CONT ( ++ regle 642 : distance axiale >= 0.27 ; ++); ++ ++undefine PTIE_CONT; ++define RDS_NTIE , RDS_CONT intersection -> NTIE_CONT; ++ ++caracterise NTIE_CONT ( ++ regle 616 : longueur max 0.185 ; ++ regle 617 : longueur_inter min 0.18 ; ++); ++# Check NTIE CONTACT separation from TRANSISTOR CHANNEL ++#------------------------------------------------------ ++relation CHANNEL , NTIE_CONT ( ++ regle 643 : distance axiale >= 0.27 ; ++); ++ ++undefine NTIE_CONT; ++ ++relation RDS_PDIF , RDS_CONT ( ++ regle 620 : enveloppe inferieure min 0.09 ; ++); ++relation RDS_NDIF , RDS_CONT ( ++ regle 621 : enveloppe inferieure min 0.09 ; ++); ++relation RDS_PTIE , RDS_CONT ( ++ regle 622 : enveloppe inferieure min 0.09 ; ++); ++relation RDS_NTIE , RDS_CONT ( ++ regle 623 : enveloppe inferieure min 0.09 ; ++); ++ ++undefine CHANNEL; ++define RDS_ALU1 , RDS_POLY2 union -> ANY_ALU1; ++ ++# Check RDS_ALU1 shapes ++#---------------------- ++caracterise RDS_ALU1 ( ++ regle 710 : largeur >= 0.27 ; ++ regle 711 : longueur_inter min 0.27 ; ++); ++caracterise ANY_ALU1 ( ++ regle 720 : notch >= 0.27 ; ++); ++caracterise RDS_POLY2 ( ++ regle 712 : largeur >= 0.27 ; ++ regle 713 : longueur_inter min 0.27 ; ++ regle 721 : notch >= 0.27 ; ++); ++caracterise RDS_TALU1 ( ++ regle 714 : largeur >= 0.27 ; ++ regle 715 : longueur_inter min 0.27 ; ++ regle 722 : notch >= 0.27 ; ++); ++relation ANY_ALU1 , ANY_ALU1 ( ++ regle 723 : distance axiale min 0.27 ; ++); ++relation RDS_ALU1 , RDS_ALU1 ( ++ regle 724 : distance axiale min 0.27 ; ++); ++relation RDS_TALU1 , RDS_TALU1 ( ++ regle 725 : distance axiale min 0.27 ; ++); ++ ++# Check ALU1 side overlap of CONT ++#-------------------------------- ++relation ANY_ALU1 , RDS_CONT ( ++# Case where ALU1 overlap of CONT is positive but less than design rule ++ regle 730 : enveloppe inferieure min 0.09 ; ++); ++ ++define ANY_ALU1 , RDS_USER2 union -> WIDE_ALU1; ++define WIDE_ALU1 , RDS_USER1 intersection -> THIN_ALU1; ++undefine WIDE_ALU1; ++ ++relation THIN_ALU1 , RDS_CONT ( ++# Case where ALU1 is 2 lambda wide ++# Side overlap rule used for end overlap ++ regle 733 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 734 : croix longueur_min min 0.09 ; ++); ++ ++undefine THIN_ALU1; ++#define ANY_ALU1 , RDS_USER0 intersection -> THIN_ALU1; ++ ++#relation THIN_ALU1 , RDS_CONT ( ++# Case where ALU1 is 1 lambda wide ++# Side overlap rule used for end overlap ++# regle 735 : croix longueur_min min 0.01 ; ++# Optional larger value of end overlap ++# regle 736 : croix longueur_min min 0.06 ; ++#); ++ ++#undefine THIN_ALU1; ++define ANY_ALU1 , RDS_USER5 union -> WIDE_ALU1; ++define WIDE_ALU1 , RDS_USER4 intersection -> THIN_ALU1; ++ ++# Check REF size and RDS_ALU1 overlap of REF ++#------------------------------------------- ++#caracterise RDS_REF ( ++# regle 750 : largeur max 0.205 ; ++# regle 751 : largeur min 0.20 ; ++#); ++#relation RDS_REF , RDS_REF ( ++# regle 760 : distance axiale min 0.24 ; ++#); ++#relation RDS_REF , RDS_ALU1 ( ++# regle 770 : intersection longueur_inter max 0.0 ; ++#); ++#relation RDS_REF ,RDS_TALU1 ( ++# regle 772 : intersection longueur_inter max 0.0 ; ++#); ++#relation RDS_ALU1 , RDS_REF ( ++# regle 773 : enveloppe inferieure min 0.01 ; ++# regle 774 : marge longueur_inter max 0.01 ; ++#); ++#relation RDS_TALU1 , RDS_REF ( ++# regle 775 : enveloppe inferieure min 0.01 ; ++# regle 776 : marge longueur_inter max 0.01 ; ++#); ++#relation THIN_ALU1 , RDS_REF ( ++# regle 780 : croix longueur_min min 0.01 ; ++# regle 781 : croix longueur_min min 0.06 ; ++#); ++ ++# Check VIA layer size and separation ++#------------------------------------ ++caracterise RDS_VIA1 ( ++ regle 810 : largeur <= 0.275 ; ++ regle 811 : largeur >= 0.27 ; ++); ++relation RDS_VIA1 , RDS_VIA1 ( ++ regle 820 : distance axiale min 0.27 ; ++); ++ ++# Check ALU1 overlap of VIA1 ++#--------------------------- ++relation RDS_ALU1 , RDS_VIA1 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 830 : enveloppe inferieure min 0.09 ; ++ regle 831 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA1 , RDS_ALU1 ( ++# regle 832 : intersection longueur_inter max 0.0 ; ++#); ++ ++relation THIN_ALU1 , RDS_VIA1 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 833 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 834 : croix longueur_min min 0.09 ; ++); ++ ++undefine WIDE_ALU1; ++undefine THIN_ALU1; ++undefine ANY_ALU1; ++ ++# Check RDS_ALU2 shapes ++#---------------------- ++caracterise RDS_ALU2 ( ++ regle 910 : largeur >= 0.27 ; ++ regle 911 : longueur_inter min 0.27 ; ++ regle 920 : notch >= 0.36 ; ++); ++relation RDS_ALU2 , RDS_ALU2 ( ++ regle 921 : distance axiale min 0.36 ; ++); ++# Check ALU2 overlap of VIA1 ++#--------------------------- ++relation RDS_ALU2 , RDS_VIA1 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 930 : enveloppe inferieure min 0.09 ; ++ regle 931 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA1 , RDS_ALU2 ( ++# regle 932 : intersection longueur_inter max 0.0 ; ++#); ++ ++define RDS_ALU2 , RDS_TALU2 union -> WIDE_ALU2; ++define WIDE_ALU2 , RDS_VALU2 intersection -> THIN_ALU2; ++ ++relation THIN_ALU2 , RDS_VIA1 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 933 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 934 : croix longueur_min min 0.09 ; ++); ++ ++# Check VIA2 layer size and separation ++#------------------------------------- ++caracterise RDS_VIA2 ( ++ regle 1410 : largeur <= 0.275 ; ++ regle 1411 : largeur >= 0.27 ; ++); ++relation RDS_VIA2 , RDS_VIA2 ( ++ regle 1420 : distance axiale min 0.27 ; ++); ++ ++# Check ALU2 overlap of VIA2 ++#--------------------------- ++relation RDS_ALU2 , RDS_VIA2 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 1430 : enveloppe inferieure min 0.09 ; ++ regle 1431 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA2 , RDS_ALU2 ( ++# regle 1432 : intersection longueur_inter max 0.0 ; ++#); ++ ++relation THIN_ALU2 , RDS_VIA2 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 1433 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 1434 : croix longueur_min min 0.09 ; ++); ++ ++undefine WIDE_ALU2; ++undefine THIN_ALU2; ++ ++# Check RDS_ALU3 shapes ++#---------------------- ++caracterise RDS_ALU3 ( ++ regle 1510 : largeur >= 0.27 ; ++ regle 1511 : longueur_inter min 0.27 ; ++ regle 1520 : notch >= 0.36 ; ++); ++relation RDS_ALU3 , RDS_ALU3 ( ++ regle 1521 : distance axiale min 0.27 ; ++); ++# Check ALU3 overlap of VIA2 ++#--------------------------- ++relation RDS_ALU3 , RDS_VIA2 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 1530 : enveloppe inferieure min 0.09 ; ++ regle 1531 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA2 , RDS_ALU3 ( ++# regle 1532 : intersection longueur_inter max 0.0 ; ++#); ++ ++define RDS_ALU3 , RDS_TALU3 union -> WIDE_ALU3; ++define WIDE_ALU3 , RDS_VALU3 intersection -> THIN_ALU3; ++ ++relation THIN_ALU3 , RDS_VIA2 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 1533 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 1534 : croix longueur_min min 0.09 ; ++); ++ ++# Check VIA3 layer size and separation ++#------------------------------------- ++caracterise RDS_VIA3 ( ++ regle 2110 : largeur <= 0.275 ; ++ regle 2111 : largeur >= 0.27 ; ++); ++relation RDS_VIA3 , RDS_VIA3 ( ++ regle 2120 : distance axiale min 0.27 ; ++); ++ ++# Check ALU3 overlap of VIA3 ++#--------------------------- ++relation RDS_ALU3 , RDS_VIA3 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 2130 : enveloppe inferieure min 0.09 ; ++ regle 2131 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA3 , RDS_ALU3 ( ++# regle 2132 : intersection longueur_inter max 0.0 ; ++#); ++ ++relation THIN_ALU3 , RDS_VIA3 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 2133 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 2134 : croix longueur_min min 0.09 ; ++); ++ ++undefine WIDE_ALU3; ++undefine THIN_ALU3; ++ ++# Check RDS_ALU4 shapes ++#---------------------- ++caracterise RDS_ALU4 ( ++ regle 2210 : largeur >= 0.27 ; ++ regle 2211 : longueur_inter min 0.27 ; ++ regle 2220 : notch >= 0.36 ; ++); ++relation RDS_ALU4 , RDS_ALU4 ( ++ regle 2221 : distance axiale min 0.36 ; ++); ++# Check ALU4 overlap of VIA3 ++#--------------------------- ++relation RDS_ALU4 , RDS_VIA3 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 2230 : enveloppe inferieure min 0.09 ; ++ regle 2231 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA3 , RDS_ALU4 ( ++# regle 2232 : intersection longueur_inter max 0.0 ; ++#); ++ ++define RDS_ALU4 , RDS_TALU4 union -> WIDE_ALU4; ++define WIDE_ALU4 , RDS_VALU4 intersection -> THIN_ALU4; ++ ++relation THIN_ALU4 , RDS_VIA3 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 2233 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 2234 : croix longueur_min min 0.09 ; ++); ++ ++# Check VIA4 layer size and separation ++#------------------------------------- ++caracterise RDS_VIA4 ( ++ regle 2510 : largeur <= 0.275 ; ++ regle 2511 : largeur >= 0.27 ; ++); ++relation RDS_VIA4 , RDS_VIA4 ( ++ regle 2520 : distance axiale min 0.27 ; ++); ++ ++# Check ALU4 overlap of VIA4 ++#--------------------------- ++relation RDS_ALU4 , RDS_VIA4 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 2530 : enveloppe inferieure min 0.09 ; ++ regle 2531 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA4 , RDS_ALU4 ( ++# regle 2532 : intersection longueur_inter max 0.0 ; ++#); ++ ++relation THIN_ALU4 , RDS_VIA4 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 2533 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 2534 : croix longueur_min min 0.09 ; ++); ++ ++undefine WIDE_ALU4; ++undefine THIN_ALU4; ++ ++# Check RDS_ALU5 shapes ++#---------------------- ++caracterise RDS_ALU5 ( ++ regle 2610 : largeur >= 0.27 ; ++ regle 2611 : longueur_inter min 0.27 ; ++ regle 2620 : notch >= 0.36 ; ++); ++relation RDS_ALU5 , RDS_ALU5 ( ++ regle 2621 : distance axiale min 0.36 ; ++); ++# Check ALU5 overlap of VIA4 ++#--------------------------- ++relation RDS_ALU5 , RDS_VIA4 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 2630 : enveloppe inferieure min 0.09 ; ++ regle 2631 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA4 , RDS_ALU5 ( ++# regle 2632 : intersection longueur_inter max 0.0 ; ++#); ++ ++define RDS_ALU5 , RDS_TALU5 union -> WIDE_ALU5; ++define WIDE_ALU5 , RDS_VALU5 intersection -> THIN_ALU5; ++ ++relation THIN_ALU5 , RDS_VIA4 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 2633 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 2634 : croix longueur_min min 0.09 ; ++); ++ ++# VIA5 and ALU6 width and spacings ++# larger than lower layers ++#------------------------------------- ++caracterise RDS_VIA5 ( ++ regle 2910 : largeur <= 0.365 ; ++ regle 2911 : largeur >= 0.36 ; ++); ++relation RDS_VIA5 , RDS_VIA5 ( ++ regle 2920 : distance axiale min 0.36 ; ++); ++ ++# Check ALU5 overlap of VIA5 ++#--------------------------- ++relation RDS_ALU5 , RDS_VIA5 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 2930 : enveloppe inferieure min 0.09 ; ++ regle 2931 : marge longueur_inter max 0.09 ; ++); ++#relation RDS_VIA5 , RDS_ALU5 ( ++# regle 2932 : intersection longueur_inter max 0.0 ; ++#); ++ ++relation THIN_ALU5 , RDS_VIA5 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 2933 : croix longueur_min min 0.09 ; ++# Optional larger value of end overlap ++ regle 2934 : croix longueur_min min 0.09 ; ++); ++ ++undefine WIDE_ALU5; ++undefine THIN_ALU5; ++ ++# Check RDS_ALU6 shapes ++#---------------------- ++caracterise RDS_ALU6 ( ++ regle 3010 : largeur >= 0.45 ; ++ regle 3011 : longueur_inter min 0.45 ; ++ regle 3020 : notch >= 0.45 ; ++); ++relation RDS_ALU6 , RDS_ALU6 ( ++ regle 3021 : distance axiale min 0.45 ; ++); ++# Check ALU6 overlap of VIA5 ++#--------------------------- ++relation RDS_ALU6 , RDS_VIA5 ( ++# Case 1: side overlap ++# Basic side overlap checked on all sides ++ regle 3030 : enveloppe inferieure min 0.18 ; ++ regle 3031 : marge longueur_inter max 0.18 ; ++); ++#relation RDS_VIA5 , RDS_ALU6 ( ++# regle 3032 : intersection longueur_inter max 0.0 ; ++#); ++ ++define RDS_ALU6 , RDS_TALU6 union -> WIDE_ALU6; ++define WIDE_ALU6 , RDS_VALU6 intersection -> THIN_ALU6; ++ ++relation THIN_ALU6 , RDS_VIA5 ( ++# Case 2: end overlap ++# Side overlap rule used for end overlap ++ regle 3033 : croix longueur_min min 0.18 ; ++# Optional larger value of end overlap ++ regle 3034 : croix longueur_min min 0.18 ; ++); ++ ++undefine WIDE_ALU6; ++undefine THIN_ALU6; ++define RDS_VPOLY , RDS_PTIE intersection -> PSUB; ++define RDS_TPOLY , RDS_NTIE intersection -> NSUB; ++ ++# Rule only applies if an AB in TALU8 has been manually ++# drawn around the cell ++# Check all layers half design rule inside layer AB ++#-------------------------------------------------- ++# Equals 4.4/2+4.2b = 0.24/2+0.04 = 0.16 ++#relation RDS_TALU8 , PSUB ( ++# regle 5010 : enveloppe inferieure min 0.16 ; ++#); ++#relation RDS_TALU8 , NSUB ( ++# regle 5011 : enveloppe inferieure min 0.16 ; ++#); ++# Equals 2.2/2 = 0.20/2 = 0.10 ++#relation RDS_TALU8 , RDS_PDIF ( ++# regle 5020 : enveloppe inferieure min 0.10 ; ++#); ++#relation RDS_TALU8 , RDS_NDIF ( ++# regle 5021 : enveloppe inferieure min 0.10 ; ++#); ++# Equals 3.2/2 = 0.20/2 = 0.10 ++#relation RDS_TALU8 , RDS_POLY ( ++# regle 5030 : enveloppe inferieure min 0.10 ; ++#); ++# Equals 7.2/2 = 0.22/2 = 0.11 ++#relation RDS_TALU8 , RDS_ALU1 ( ++# regle 5040 : enveloppe inferieure min 0.11 ; ++#); ++# Equals 7.2/2 = 0.18/2 = 0.09 ++#relation RDS_TALU8 , RDS_POLY2 ( ++# regle 5041 : enveloppe inferieure min 0.09 ; ++#); ++#relation RDS_TALU8 , RDS_REF ( ++# regle 5050 : enveloppe inferieure min 0.12 ; ++#); ++ ++undefine NSUB; ++undefine PSUB; ++ ++fin regles ++DRC_COMMENT ++110 1.1 NWELL Width < 1.08um ( 12 lambda) ++111 1.1 NWELL Width < 1.08um ( 12 lambda) ++112 1.1 PWELL Width < 1.08um ( 12 lambda) ++113 1.1 PWELL Width < 1.08um ( 12 lambda) ++130 1.3 NWELL Notch < 0.54um ( 6 lambda) ++131 1.3 NWELL Space < 0.54um ( 6 lambda) ++132 1.3 PWELL Notch < 0.54um ( 6 lambda) ++133 1.3 PWELL Space < 0.54um ( 6 lambda) ++140 1.4 NWELL and PWELL must not overlap (misaligned NWELL?) ++141 1.4 NWELL and PWELL Space < 0um ++210 2.1a PDIF Width < 0.27um ( 3 lambda) ++211 2.1a PDIF Width < 0.27um ( 3 lambda) ++220 2.2a PDIF Notch < 0.27um ( 3 lambda) ++221 2.2a PDIF Space < 0.27um ( 3 lambda) ++212 2.1a NDIF Width < 0.27um ( 3 lambda) ++213 2.1a NDIF Width < 0.27um ( 3 lambda) ++222 2.2a NDIF Notch < 0.27um ( 3 lambda) ++223 2.2a NDIF Space < 0.27um ( 3 lambda) ++214 2.1b PTIE Width < 0.27um ( 3 lambda) ++215 2.1b PTIE Width < 0.27um ( 3 lambda) ++224 2.2b PTIE Notch < 0.27um ( 3 lambda) ++225 2.2b PTIE Space < 0.27um ( 3 lambda) ++216 2.1b NTIE Width < 0.27um ( 3 lambda) ++217 2.1b NTIE Width < 0.27um ( 3 lambda) ++226 2.2b NTIE Notch < 0.27um ( 3 lambda) ++227 2.2b NTIE Space < 0.27um ( 3 lambda) ++230 2.3a NWELL to NDIF Space < 0.54um ( 6 lambda) ++231 2.3a NDIF must not touch NWELL ++232 2.3a NDIF must not touch NWELL ++233 2.3a NDIF must not touch NWELL ++234 2.3a NDIF must not touch NWELL ++235 2.3a NDIF must not touch NWELL ++236 2.3a NDIF must not touch NWELL ++237 2.3b NWELL Overlap of PDIF < 0.54um ( 6 lambda) ++240 2.4a NWELL to PTIE Space < 0.27um (3 lambda) ++241 2.4a PTIE must not touch NWELL ++242 2.4a PTIE must not touch NWELL ++243 2.4a PTIE must not touch NWELL ++244 2.4a PTIE must not touch NWELL ++245 2.4a PTIE must not touch NWELL ++246 2.4a PTIE must not touch NWELL ++247 2.4b NWELL Overlap of NTIE < 0.27um (3 lambda) ++250 2.5 NDIF to PTIE Space < 0.36um (4 lambda) ++251 2.5 NDIF must not touch or overlap PTIE ++252 2.5 NDIF must not touch or overlap PTIE ++253 2.5 NDIF must not touch or overlap PTIE ++254 2.5 PDIF to NTIE Space < 0.36um (4 lambda) ++255 2.5 PDIF must not touch or overlap NTIE ++256 2.5 PDIF must not touch or overlap NTIE ++257 2.5 PDIF must not touch or overlap NTIE ++260 2.3b PWELL to PDIF Space < 0.54um (6 lambda) ++261 2.3b PDIF must not touch PWELL ++262 2.3b PDIF must not touch PWELL ++263 2.3b PDIF must not touch PWELL ++264 2.3b PDIF must not touch PWELL ++265 2.3b PDIF must not touch PWELL ++266 2.3b PDIF must not touch PWELL ++267 2.3a PWELL Overlap of NDIF 0.54um (6 lambda) ++270 2.4b PWELL to NTIE Space 0.27um (3 lambda) ++271 2.4b NTIE must not touch PWELL ++272 2.4b NTIE must not touch PWELL ++273 2.4b NTIE must not touch PWELL ++274 2.4b NTIE must not touch PWELL ++275 2.4b NTIE must not touch PWELL ++276 2.4b NTIE must not touch PWELL ++277 2.4a PWELL Overlap of PTIE < 0.27um (3 lambda) ++280 2.8a PDIF to NDIF Space < 1.08um (12 lambda) ++281 2.8b PDIF to PTIE Space < 0.81um (9 lambda) ++282 2.8b NTIE to NDIF Space < 0.81um (9 lambda) ++283 2.8c NTIE to PTIE Space < 0.54um (6 lambda) ++310 3.1 POLY Width < 0.18um (2 lambda) ++311 3.1 POLY Width < 0.18um (2 lambda) ++320 3.2 POLY Notch < 0.27um (3 lambda) ++321 3.2 POLY Space < 0.27um (3 lambda) ++322 3.2a CHANNEL Space < 0.36um (4 lambda) ++323 3.2a CHANNEL Space < 0.36um (4 lambda) ++330 3.3 POLY Overlap of P-TRANSISTOR < 0.225um (2.5 lambda) ++331 3.3 POLY Overlap of N-TRANSISTOR < 0.225um (2.5 lambda) ++340 3.4 P-TRANSISTOR SOURCE/DRAIN Width < 0.36um (4 lambda) ++341 3.4 N-TRANSISTOR SOURCE/DRAIN Width < 0.36um (4 lambda) ++350 3.5 PDIF to POLY Space < 0.09um (1 lambda) ++351 3.5 NDIF to POLY Space < 0.09um (1 lambda) ++352 3.5 PTIE to POLY Space < 0.09um (1 lambda) ++353 3.5 NTIE to POLY Space < 0.09um (1 lambda) ++354 3.5a POLY to GATE Space < 0.09um (1 lambda) ++355 3.5 POLY must not touch or overlap PDIF ++356 3.5 POLY must not touch or overlap PDIF ++357 3.5 POLY must not touch or overlap NDIF ++358 3.5 POLY must not touch or overlap NDIF ++410 4.1 NIMP to P-TRANSISTOR Space < 0.27um (3 lambda) ++411 4.1 PIMP to N-TRANSISTOR Space < 0.27um (3 lambda) ++420 4.2a PIMP Overlap of PDIF < 0.18um (2 lambda) ++421 4.2b PIMP Overlap of PTIE < 0.18um (2 lambda) ++422 4.2a NIMP Overlap of NDIF < 0.18um (2 lambda) ++423 4.2b NIMP Overlap of NTIE < 0.18um (2 lambda) ++440 4.4 PIMP in PWELL Width < 0.36um (4 lambda) ++441 4.4 PIMP in PWELL Width < 0.36um (4 lambda) ++442 4.4 NIMP in NWELL Width < 0.36um (4 lambda) ++443 4.4 NIMP in NWELL Width < 0.36um (4 lambda) ++444 4.4 NIMP in PWELL Width < 0.36um (4 lambda) ++445 4.4 PIMP in NWELL Width < 0.36um (4 lambda) ++510 5.1 POLY CONTACT Width > 0.18um (2 lambda) ++511 5.1 POLY CONTACT Width < 0.18um (2 lambda) ++520 5.2 POLY Overlap of CONTACT < 0.135um (1.5 lambda) ++530 5.3 CONTACT Space < 0.36um (4 lambda) ++540 5.4 POLY CONTACT to CHANNEL Space < 0.18um (2 lambda) ++580 5.8 CONTACT not allowed over TRANSISTOR ++610 6.1 PDIF CONTACT Width > 0.18um (2 lambda) ++611 6.1 PDIF CONTACT Width < 0.18um (2 lambda) ++612 6.1 NDIF CONTACT Width > 0.18um (2 lambda) ++613 6.1 NDIF CONTACT Width < 0.18um (2 lambda) ++614 6.1 PTIE CONTACT Width > 0.18um (2 lambda) ++615 6.1 PTIE CONTACT Width < 0.18um (2 lambda) ++616 6.1 NTIE CONTACT Width > 0.18um (2 lambda) ++617 6.1 NTIE CONTACT Width < 0.18um (2 lambda) ++620 6.2a PDIF Overlap of CONT < 0.135um (1.5 lambda) ++621 6.2a NDIF Overlap of CONT < 0.135um (1.5 lambda) ++622 6.2b PTIE Overlap of CONT < 0.135um (1.5 lambda) ++623 6.2b NTIE Overlap of CONT < 0.135um (1.5 lambda) ++640 6.4 PDIF CONTACT to CHANNEL Space < 0.18um (2 lambda) ++641 6.4 NDIF CONTACT to CHANNEL Space < 0.18um (2 lambda) ++642 4.1+4.2b+6.2b PTIE CONTACT to CHANNEL Space < 0.585um (6.5 lambda) ++643 4.1+4.2b+6.2b NTIE CONTACT to CHANNEL Space < 0.585um (6.5 lambda) ++710 7.1 ALU1 Width < 0.27um (3 lambda) ++711 7.1 ALU1 Width < 0.27um (3 lambda) ++720 7.2 ALU1 Notch < 0.27um (3 lambda) ++712 7.1 ALU0 Width < 0.27um (3 lambda) ++713 7.1 ALU0 Width < 0.27um (3 lambda) ++721 7.2 ALU0 Notch < 0.27um (3 lambda) ++714 7.1 TALU1 Width < 0.27um (3 lambda) ++715 7.1 TALU1 Width < 0.27um (3 lambda) ++722 7.2 TALU1 Notch < 0.27um (3 lambda) ++723 7.2 ALU0 Space < 0.27um (3 lambda) ++724 7.2 ALU1 Space < 0.27um (3 lambda) ++725 7.2 TALU1 Space < 0.27um (3 lambda) ++730 7.3a ALU1 side Overlap of CONTACT < 0.09um (1 lambda) ++731 7.3a ALU1 side Overlap of CONTACT < 0.09um (1 lambda) ++732 7.3b ALU1 end Overlap of CONTACT <= 0.09um (1 lambda) ++733 7.3b ALU1 end Overlap of CONTACT < 0.09um (small) (1 lambda) ++734 7.3b ALU1 end Overlap of CONTACT < 0.09um (big) (1 lambda) ++735 7.3b ALU1 end Overlap of CONTACT < 0.09um (small) (1 lambda) ++736 7.3b ALU1 end Overlap of CONTACT < 0.09um (big) (1 lambda) ++750 7.5 REF Width > 0.27um (3 lambda) ++751 7.5 REF Width < 0.27um (3 lambda) ++760 7.6 REF Space < 0.27um (3 lambda) ++770 7.7 ALU1 must not touch or intersect REF ++772 7.7 TALU1 must not touch or intersect REF ++773 7.7 ALU1 Overlap of REF < 0.09um (1 lambda) ++774 7.7 ALU1 Overlap of REF < 0.09um (1 lambda) ++775 7.7 TALU1 Overlap of REF < 0.09um (1 lambda) ++776 7.7 TALU1 Overlap of REF < 0.09um (1 lambda) ++780 7.8 ALU1 end Overlap of REF < 0.09um (small) (1 lambda) ++781 7.8 ALU1 end Overlap of REF < 0.09um (big) (1 lambda) ++810 8.1 VIA1 Width > 0.27um (3 lambda) ++811 8.1 VIA1 Width < 0.27um (3 lambda) ++820 8.2 VIA1 Space < 0.27um (3 lambda) ++830 8.3a ALU1 side Overlap of VIA1 < 0.09um (1 lambda) ++831 8.3a ALU1 side Overlap of VIA1 < 0.09um (1 lambda) ++832 8.3 ALU1 must not touch or intersect VIA1 ++833 8.3b ALU1 end Overlap of VIA1 < 0.09um (small) (1 lambda) ++834 8.3b ALU1 end Overlap of VIA1 < 0.09um (big) (1 lambda) ++910 9.1 ALU2 Width < 0.27um (3 lambda) ++911 9.1 ALU2 Width < 0.27um (3 lambda) ++920 9.2 ALU2 Notch < 0.36um (4 lambda) ++921 9.2 ALU2 Space < 0.36um (4 lambda) ++930 9.3a ALU2 side Overlap of VIA1 < 0.09um (1 lambda) ++931 9.3a ALU2 side Overlap of VIA1 < 0.09um (1 lambda) ++932 9.3 ALU2 must not touch or intersect VIA1 ++933 9.3b ALU2 end Overlap of VIA1 < 0.09um (small) (1 lambda) ++934 9.3b ALU2 end Overlap of VIA1 < 0.09um (big) (1 lambda) ++1410 14.1 VIA2 Width > 0.27um (3 lambda) ++1411 14.1 VIA2 Width < 0.27um (3 lambda) ++1420 14.2 VIA2 Space < 0.36um (4 lambda) ++1430 14.3a ALU2 side Overlap of VIA2 < 0.09um (1 lambda) ++1431 14.3a ALU2 side Overlap of VIA2 < 0.09um (1 lambda) ++1432 14.3 ALU2 must not touch or intersect VIA2 ++1433 14.3b ALU2 end Overlap of VIA2 < 0.09um (small) (1 lambda) ++1434 14.3b ALU2 end Overlap of VIA2 < 0.09um (big) (1 lambda) ++1510 15.1 ALU3 Width < 0.27um (3 lambda) ++1511 15.1 ALU3 Width < 0.27um (3 lambda) ++1520 15.2 ALU3 Notch < 0.36um (4 lambda) ++1521 15.2 ALU3 Space < 0.36um (4 lambda) ++1530 15.3a ALU3 side Overlap of VIA2 < 0.09um (1 lambda) ++1531 15.3a ALU3 side Overlap of VIA2 < 0.09um (1 lambda) ++1532 15.3 ALU3 must not touch or intersect VIA2 ++1533 15.3b ALU3 end Overlap of VIA2 < 0.09um (small) (1 lambda) ++1534 15.3b ALU3 end Overlap of VIA2 < 0.09um (big) (1 lambda) ++2110 21.1 VIA3 Width > 0.27um (3 lambda) ++2111 21.1 VIA3 Width < 0.27um (3 lambda) ++2120 21.2 VIA3 Space < 0.36um (4 lambda) ++2130 21.3a ALU3 side Overlap of VIA3 < 0.09um (1 lambda) ++2131 21.3a ALU3 side Overlap of VIA3 < 0.09um (1 lambda) ++2132 21.3 ALU3 must not touch or intersect VIA3 ++2133 21.3b ALU3 end Overlap of VIA3 < 0.09um (small) (1 lambda) ++2134 21.3b ALU3 end Overlap of VIA3 < 0.09um (big) (1 lambda) ++2210 22.1 ALU4 Width < 0.27um (3 lambda) ++2211 22.1 ALU4 Width < 0.27um (3 lambda) ++2220 22.2 ALU4 Notch < 0.36um (4 lambda) ++2221 22.2 ALU4 Space < 0.36um (4 lambda) ++2230 22.3a ALU4 side Overlap of VIA3 < 0.09um (1 lambda) ++2231 22.3a ALU4 side Overlap of VIA3 < 0.09um (1 lambda) ++2232 22.3 ALU4 must not touch or intersect VIA3 ++2233 22.3b ALU4 end Overlap of VIA3 < 0.09um (small) (1 lambda) ++2234 22.3b ALU4 end Overlap of VIA3 < 0.09um (big) (1 lambda) ++2510 25.1 VIA4 Width > 0.27um (3 lambda) ++2511 25.1 VIA4 Width < 0.27um (3 lambda) ++2520 25.2 VIA4 Space < 0.36um (4 lambda) ++2530 25.3a ALU4 side Overlap of VIA4 < 0.09um (1 lambda) ++2531 25.3a ALU4 side Overlap of VIA4 < 0.09um (1 lambda) ++2532 25.3 ALU4 must not touch or intersect VIA4 ++2533 25.3b ALU4 end Overlap of VIA4 < 0.09um (small) (1 lambda) ++2534 25.3b ALU4 end Overlap of VIA4 < 0.09um (big) (1 lambda) ++2610 26.1 ALU5 Width < 0.27um (3 lambda) ++2611 26.1 ALU5 Width < 0.27um (3 lambda) ++2620 26.2 ALU5 Notch < 0.36um (4 lambda) ++2621 26.2 ALU5 Space < 0.36um (4 lambda) ++2630 26.3a ALU5 side Overlap of VIA4 < 0.09um (1 lambda) ++2631 26.3a ALU5 side Overlap of VIA4 < 0.09um (1 lambda) ++2632 26.3 ALU5 must not touch or intersect VIA4 ++2633 26.3b ALU5 end Overlap of VIA4 < 0.09um (small) (1 lambda) ++2634 26.3b ALU5 end Overlap of VIA4 < 0.09um (big) (1 lambda) ++2910 29.1 VIA5 Width > 0.36um (4 lambda) ++2911 29.1 VIA5 Width < 0.36um (4 lambda) ++2920 29.2 VIA5 Space < 0.36um (4 lambda) ++2930 29.3a ALU5 side Overlap of VIA5 < 0.09um (1 lambda) ++2931 29.3a ALU5 side Overlap of VIA5 < 0.09um (1 lambda) ++2932 29.3 ALU5 must not touch or intersect VIA5 ++2933 29.3b ALU5 end Overlap of VIA5 < 0.09um (small) (1 lambda) ++2934 29.3b ALU5 end Overlap of VIA5 < 0.09um (big) (1 lambda) ++3010 30.1 ALU6 Width < 0.45um (5 lambda) ++3011 30.1 ALU6 Width < 0.45um (5 lambda) ++3020 30.2 ALU6 Notch < 0.45um (5 lambda) ++3021 30.2 ALU6 Space < 0.45um (5 lambda) ++3030 30.3a ALU6 side Overlap of VIA5 < 0.18um (2 lambda) ++3031 30.3a ALU6 side Overlap of VIA5 < 0.18um (2 lambda) ++3032 30.3 ALU6 must not touch or intersect VIA5 ++3033 30.3b ALU6 end Overlap of VIA5 < 0.18um (small) (2 lambda) ++3034 30.3b ALU6 end Overlap of VIA5 < 0.18um (big) (2 lambda) ++5010 50.1 AB Overlap of PTIE < 0.36um (4 lambda) ++5011 50.1 AB Overlap of NTIE < 0.36um (4 lambda) ++5020 50.2 AB Overlap of PDIF < 0.135um (1.5 lambda) ++5021 50.2 AB Overlap of NDIF < 0.135um (1.5 lambda) ++5030 50.3 AB Overlap of POLY < 0.135um (1.5 lambda) ++5040 50.4 AB Overlap of ALU1 < 0.135um (1.5 lambda) ++5041 50.4 AB Overlap of ALU0 < 0.135um (1.5 lambda) ++5050 50.5 AB Overlap of REF < 0.18um (2 lambda) ++END_DRC_COMMENT ++END_DRC_RULES +diff --git a/alliance/src/rds/src/rfmacces.c b/alliance/src/rds/src/rfmacces.c +index 1c87652..74879af 100644 +--- a/alliance/src/rds/src/rfmacces.c ++++ b/alliance/src/rds/src/rfmacces.c +@@ -478,8 +478,8 @@ rdsrec_list *viambkrds( Figure, Via, Lynx ) + ( ( USE == RDS_USE_DRC ) && ( ! Lynx ) ) ) + { + if ( SIDE_STEP == 0 ) break; +- if ( WSX < (SIDE_STEP << 1) ) break; +- if ( WSY < (SIDE_STEP << 1) ) break; ++ if ( WSX < SIDE+(SIDE>>1) ) break; ++ if ( WSY < SIDE+(SIDE>>1) ) break; + + X1R = Xvia + OVERLAP - ( ( WSX + DWR ) >> 1 ); + Y1R = Yvia + OVERLAP - ( ( WSY + DWR ) >> 1 ); +diff --git a/alliance/src/rds/src/rprparse.c b/alliance/src/rds/src/rprparse.c +index 2f1e97b..da68e71 100644 +--- a/alliance/src/rds/src/rprparse.c ++++ b/alliance/src/rds/src/rprparse.c +@@ -103,6 +103,10 @@ extern long MBK_X_GRID, MBK_Y_GRID, MBK_Y_SLICE, MBK_WIDTH_VSS, MBK_WIDTH_VDD, + MBK_TRACK_SPACING_ALU7, MBK_TRACK_SPACING_ALU8; + long *RDS_WIRESETTING_TABLE [ MBK_MAX_WIRESETTING ] = + { ++ &RING_BV_VIA_VIA, ++ &RING_DMIN_ALU1_ALU1, ++ &RING_DMIN_ALU2_ALU2, ++ &RING_EXTENSION_ALU2, + &MBK_TRACK_SPACING_ALU1, &MBK_TRACK_SPACING_ALU2, + &MBK_TRACK_SPACING_ALU3, &MBK_TRACK_SPACING_ALU4, + &MBK_TRACK_SPACING_ALU5, &MBK_TRACK_SPACING_ALU6, +@@ -111,9 +115,15 @@ extern long MBK_X_GRID, MBK_Y_GRID, MBK_Y_SLICE, MBK_WIDTH_VSS, MBK_WIDTH_VDD, + &MBK_TRACK_WIDTH_ALU3, &MBK_TRACK_WIDTH_ALU4, + &MBK_TRACK_WIDTH_ALU5, &MBK_TRACK_WIDTH_ALU6, + &MBK_TRACK_WIDTH_ALU7, &MBK_TRACK_WIDTH_ALU8, ++ &RING_WALIM, + &MBK_WIDTH_VDD, + &MBK_WIDTH_VSS, ++ &RING_WMIN_ALU1, ++ &RING_WMIN_ALU2, ++ &RING_WVIA_ALU1, ++ &RING_WVIA_ALU2, + &MBK_X_GRID, &MBK_Y_GRID, &MBK_Y_SLICE ++ + }; + /*------------------------------------------------------------\ + | | +@@ -412,6 +422,10 @@ extern long MBK_X_GRID, MBK_Y_GRID, MBK_Y_SLICE, MBK_WIDTH_VSS, MBK_WIDTH_VDD, + char MBK_WIRESETTING_NAME [ MBK_MAX_WIRESETTING ][ MBK_MAX_WIRESETTING_TLEN ] = + + { ++ "bv_via_via", ++ "dmin_alu1_alu1", ++ "dmin_alu2_alu2", ++ "extension_alu2", + "track_spacing_alu1", + "track_spacing_alu2", + "track_spacing_alu3", +@@ -428,8 +442,13 @@ extern long MBK_X_GRID, MBK_Y_GRID, MBK_Y_SLICE, MBK_WIDTH_VSS, MBK_WIDTH_VDD, + "track_width_alu6", + "track_width_alu7", + "track_width_alu8", ++ "walim", + "width_vdd", + "width_vss", ++ "wmin_alu1", ++ "wmin_alu2", ++ "wvia_alu1", ++ "wvia_alu2", + "x_grid", + "y_grid", + "y_slice" +diff --git a/alliance/src/rds/src/rprparse.h b/alliance/src/rds/src/rprparse.h +index 03f35e3..dfb548e 100644 +--- a/alliance/src/rds/src/rprparse.h ++++ b/alliance/src/rds/src/rprparse.h +@@ -33,7 +33,7 @@ + # define RPR_MAX_BUFFER 512 + # define RPR_MAX_KEYWORD 151 + +-# define MBK_MAX_WIRESETTING 21 ++# define MBK_MAX_WIRESETTING 30 + # define RPR_SEPARATORS_STRING " \t\n" + # define RPR_COMMENT_CHAR '#' + +diff --git a/alliance/src/ring/src/Makefile.am b/alliance/src/ring/src/Makefile.am +index e630fc7..65e1653 100644 +--- a/alliance/src/ring/src/Makefile.am ++++ b/alliance/src/ring/src/Makefile.am +@@ -11,7 +11,8 @@ bin_PROGRAMS = ring + ring_LDADD = @ALLIANCE_LIBS@ \ + -L$(top_builddir)/genlib/src \ + -L$(top_builddir)/mbk/src \ +- -lMgn -lMpu -lMlu -lMlo -lMph -lMut -lRcn ++ -L$(top_builddir)/rds/src \ ++ -lMgn -lMpu -lMlu -lMlo -lMph -lMut -lRcn -lRds + + ring_SOURCES = bigvia.c bigvia.h \ + compress.c compress.h \ +diff --git a/alliance/src/ring/src/param.c b/alliance/src/ring/src/param.c +index ecd3af1..52589e6 100644 +--- a/alliance/src/ring/src/param.c ++++ b/alliance/src/ring/src/param.c +@@ -126,11 +126,22 @@ void lecture_param(int nbarg, char** tab, char** nom_circuit_lo, + /* arguments de mbk */ + /* ---------------- */ + ++ rdsenv(); ++ loadrdsparam(); ++ + mbkenv(); /* choix de l'utilisateur mis dans des variables UNIX */ + /* on recupere (long) SCALE_X */ + +- if (mode_debug) ++ if (mode_debug) { + printf("CATALNAME is %s\n", CATAL); ++ printf("WMIN_ALU1 is %ld\n", WMIN_ALU1); ++ printf("WVIA_ALU1 is %ld\n", WVIA_ALU1); ++ printf("WMIN_ALU2 is %ld\n", WMIN_ALU2); ++ printf("WVIA_ALU2 is %ld\n", WVIA_ALU2); ++ printf("DMIN_ALU1_ALU1 is %ld\n", DMIN_ALU1_ALU1); ++ printf("DMIN_ALU2_ALU2 is %ld\n", DMIN_ALU2_ALU2); ++ printf("BV_VIA_VIA is %ld\n", BV_VIA_VIA); ++ } + + if (NULL == (f_catal = mbkfopen(CATAL, NULL, READ_TEXT))) + ringerreur(ERR_CATAL, CATAL, NULL); +diff --git a/alliance/src/ring/src/sesame.c b/alliance/src/ring/src/sesame.c +index 9b48fc2..7ac61ea 100644 +--- a/alliance/src/ring/src/sesame.c ++++ b/alliance/src/ring/src/sesame.c +@@ -51,6 +51,13 @@ + + void ringerreur(int code, void *pt_liste, void *pt_liste2) + { ++ fprintf( stderr, "WMIN_ALU1: %d\n", (int)WMIN_ALU1 ); ++ fprintf( stderr, "WMIN_ALU2: %d\n", (int)WMIN_ALU2 ); ++ fprintf( stderr, "DMIN_ALU1_ALU1: %d\n", (int)DMIN_ALU1_ALU1 ); ++ fprintf( stderr, "DMIN_ALU2_ALU2: %d\n", (int)DMIN_ALU2_ALU2 ); ++ fprintf( stderr, "WVIA_ALU1: %d\n", (int)WVIA_ALU1 ); ++ fprintf( stderr, "WVIA_ALU2: %d\n", (int)WVIA_ALU2 ); ++ + loins_list * circuit_inst, *liste_inst; + locon_list * con_lo; + chain_list * liste; +diff --git a/alliance/src/ring/src/struct.h b/alliance/src/ring/src/struct.h +index 8b46130..0d54a94 100644 +--- a/alliance/src/ring/src/struct.h ++++ b/alliance/src/ring/src/struct.h +@@ -77,19 +77,20 @@ + #define OUEST 2 + #define EST 3 + /* Nombres entiers obligatoires ! */ +-#define WMIN_ALU1 2 /* largeur minimum de l'alu1,l'alu2,dist mini alu1<->alu2 */ +-#define WMIN_ALU2 2 /* et largeur du via */ +-#define DMIN_ALU1_ALU1 3 /* dmin en a1 a1 2.5 arrondi a 3 */ +-#define DMIN_ALU2_ALU2 3 +-#define WVIA_ALU1 2 /* largeur du via pour l'alu1 */ +-#define WVIA_ALU2 3 /* largeur du via pour l'alu2 */ ++#define WMIN_ALU1 RING_WMIN_ALU1 ++#define WMIN_ALU2 RING_WMIN_ALU2 ++#define DMIN_ALU1_ALU1 RING_DMIN_ALU1_ALU1 ++#define DMIN_ALU2_ALU2 RING_DMIN_ALU2_ALU2 ++#define WVIA_ALU1 RING_WVIA_ALU1 + +-#define EXTENSION_ALU2 1 /* extension alu2 pour fignoler coin couronne */ ++#define WVIA_ALU2 RING_WVIA_ALU2 /* largeur du via pour l'alu2 */ + +-#define BV_VIA_VIA 4 /* must be even, whatever! */ ++#define EXTENSION_ALU2 RING_EXTENSION_ALU2 /* pour fignoler coin couronne */ ++ ++#define BV_VIA_VIA RING_BV_VIA_VIA /* must be even, whatever! */ + #define BV_VIASIZE WVIA_ALU2 /* design rule for equipotential vias */ + +-#define WALIM 60 /* largeur prdefinie des alim */ ++#define WALIM RING_WALIM /* largeur prdefinie des alim */ + + /*#define PISTE_DEP_ALIMPLOT 10 Nombre de piste a considerer pour une deport alim plot */ + /* code des ringerreurs traitees par ringerreur(code) */ +diff --git a/alliance/src/s2r/doc/s2r.1 b/alliance/src/s2r/doc/s2r.1 +index 8cc9e3c..18fe38d 100644 +--- a/alliance/src/s2r/doc/s2r.1 ++++ b/alliance/src/s2r/doc/s2r.1 +@@ -141,7 +141,7 @@ example below. + setenv RDS_TECHNO_NAME /labo/etc/prol15.rds + setenv RDS_IN gds + setenv RDS_OUT gds +- s2r -c na2_y ++ s2r \-c na2_y + .fi + .ft R + .RS diff --git a/0001-Remove-stray-files.patch b/0001-Remove-stray-files.patch new file mode 100644 index 0000000..20eeef7 --- /dev/null +++ b/0001-Remove-stray-files.patch @@ -0,0 +1,1475 @@ +From fad51c8b32248c47cee6ed5ace1620551ed382aa Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Sun, 28 Feb 2016 13:12:16 +0100 +Subject: [PATCH 01/10] Remove stray files. + +--- + alliance/src/elp/src/Makefile | 719 -------------------------------------- + alliance/src/genpat/src/Makefile | 729 --------------------------------------- + 2 files changed, 1448 deletions(-) + delete mode 100644 alliance/src/elp/src/Makefile + delete mode 100644 alliance/src/genpat/src/Makefile + +diff --git a/alliance/src/elp/src/Makefile b/alliance/src/elp/src/Makefile +deleted file mode 100644 +index 79ed72d..0000000 +--- a/alliance/src/elp/src/Makefile ++++ /dev/null +@@ -1,719 +0,0 @@ +-# Makefile.in generated by automake 1.8.5 from Makefile.am. +-# elp/src/Makefile. Generated from Makefile.in by configure. +- +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. +-# This Makefile.in is free software; the Free Software Foundation +-# gives unlimited permission to copy and/or distribute it, +-# with or without modifications, as long as this notice is preserved. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +-# PARTICULAR PURPOSE. +- +- +- +- +-SOURCES = $(libElp_la_SOURCES) +- +-srcdir = . +-top_srcdir = ../.. +- +-pkgdatadir = $(datadir)/alliance +-pkglibdir = $(libdir)/alliance +-pkgincludedir = $(includedir)/alliance +-top_builddir = ../.. +-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +-INSTALL = /usr/bin/install -c +-install_sh_DATA = $(install_sh) -c -m 644 +-install_sh_PROGRAM = $(install_sh) -c +-install_sh_SCRIPT = $(install_sh) -c +-INSTALL_HEADER = $(INSTALL_DATA) +-transform = $(program_transform_name) +-NORMAL_INSTALL = : +-PRE_INSTALL = : +-POST_INSTALL = : +-NORMAL_UNINSTALL = : +-PRE_UNINSTALL = : +-POST_UNINSTALL = : +-host_triplet = i686-pc-linux-gnu +-subdir = elp/src +-DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ +- $(srcdir)/Makefile.in elp_l.c elp_y.c +-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/./alliance.m4 \ +- $(top_srcdir)/./motif.m4 $(top_srcdir)/./xpm.m4 \ +- $(top_srcdir)/configure.in +-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +- $(ACLOCAL_M4) +-mkinstalldirs = $(mkdir_p) +-CONFIG_CLEAN_FILES = +-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" +-libLTLIBRARIES_INSTALL = $(INSTALL) +-LTLIBRARIES = $(lib_LTLIBRARIES) +-libElp_la_LIBADD = +-am_libElp_la_OBJECTS = elp_y.lo elp_l.lo elp.lo elperror.lo +-libElp_la_OBJECTS = $(am_libElp_la_OBJECTS) +-DEFAULT_INCLUDES = -I. -I$(srcdir) +-depcomp = $(SHELL) $(top_srcdir)/depcomp +-am__depfiles_maybe = depfiles +-DEP_FILES = ./$(DEPDIR)/elp.Plo ./$(DEPDIR)/elp_l.Plo \ +- ./$(DEPDIR)/elp_y.Plo ./$(DEPDIR)/elperror.Plo +-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ +- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ +- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ +- $(AM_CFLAGS) $(CFLAGS) +-CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +- $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) +-LTLEXCOMPILE = $(LIBTOOL) --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +-YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +-LTYACCCOMPILE = $(LIBTOOL) --mode=compile $(YACC) $(YFLAGS) \ +- $(AM_YFLAGS) +-SOURCES = $(libElp_la_SOURCES) +-DIST_SOURCES = $(libElp_la_SOURCES) +-includeHEADERS_INSTALL = $(INSTALL_HEADER) +-HEADERS = $(include_HEADERS) +-ETAGS = etags +-CTAGS = ctags +-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +-ABE_DLL_VERSION = 2:1:0 +-ABL_DLL_VERSION = 1:3:0 +-ABT_DLL_VERSION = 2:1:0 +-ABV_DLL_VERSION = 2:1:0 +-ACLOCAL = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run aclocal-1.8 +-ALCBANNER_MAJOR_VERSION = 1 +-ALCBANNER_MINOR_VERSION = 1 +-ALCBANNER_VERSION = 1.1 +-ALLIANCE_BUILD_FALSE = # +-ALLIANCE_BUILD_TRUE = +-ALLIANCE_CFLAGS = -I/users/outil/alliance/Linux.FC2/include +-ALLIANCE_LIBS = -L/users/outil/alliance/Linux.FC2/lib +-ALLIANCE_TOP = /users/outil/alliance/Linux.FC2 +-AMDEP_FALSE = # +-AMDEP_TRUE = +-AMTAR = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run tar +-AR = ar +-ATTILA_MAJOR_VERSION = 0 +-ATTILA_MINOR_VERSION = 1 +-ATTILA_VERSION = 0.1 +-AUTOCONF = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run autoconf +-AUTOHEADER = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run autoheader +-AUTOMAKE = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run automake-1.8 +-AUT_DLL_VERSION = 1:3:0 +-AWK = gawk +-B2F_MAJOR_VERSION = 1 +-B2F_MINOR_VERSION = 2 +-B2F_VERSION = 1.2 +-BDD_DLL_VERSION = 1:5:0 +-BEH_DLL_VERSION = 1:11:0 +-BHL_DLL_VERSION = 1:11:0 +-BOOG_MAJOR_VERSION = 1 +-BOOG_MINOR_VERSION = 7 +-BOOG_VERSION = 1.7 +-BOOM_MAJOR_VERSION = 1 +-BOOM_MINOR_VERSION = 2 +-BOOM_VERSION = 1.2 +-BTR_DLL_VERSION = 1:3:0 +-BVL_DLL_VERSION = 1:14:0 +-CC = gcc +-CCDEPMODE = depmode=gcc3 +-CFLAGS = -I/users/outil/alliance/Linux.FC2/include -g -O2 +-CPP = gcc -E +-CPPFLAGS = +-CST_DLL_VERSION = 3:2:0 +-CTL_DLL_VERSION = 1:1:0 +-CTP_DLL_VERSION = 1:1:0 +-CXX = g++ +-CXXCPP = g++ -E +-CXXDEPMODE = depmode=gcc3 +-CXXFLAGS = -g -O2 +-CYGPATH_W = echo +-DEFS = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"alliance\" -DVERSION=\"5.0\" -DYYTEXT_POINTER=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FCNTL_H=1 -DHAVE_MALLOC_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRINGS_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBIBERTY=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_UNISTD_H=1 -DHAVE_FORK=1 -DHAVE_VFORK=1 -DHAVE_WORKING_VFORK=1 -DHAVE_WORKING_FORK=1 -DSTDC_HEADERS=1 -DHAVE_SYS_WAIT_H=1 -DRETSIGTYPE=void -DHAVE_MOTIF=1 -DHAVE_XPM=1 -DHAVE_XPM=1 -DHAVE_X11_XPM_H=1 -DHAVE_XP=1 -DHAVE_MOTIF=1 -DHAVE_XMUSEVERSION=1 -DHAVE_XMINSTALLIMAGE=1 -DALLIANCE_VERSION=\"5.0\" -DALLIANCE_TOP=\"/users/outil/alliance/Linux.FC2\" -DHAVE_LIBIBERTY=1 +-DEPDIR = .deps +-DOC_MAJOR_VERSION = 1 +-DOC_MINOR_VERSION = 0 +-DOC_VERSION = 1.0 +-DREAL_MAJOR_VERSION = 1 +-DREAL_MINOR_VERSION = 14 +-DREAL_VERSION = 1.14 +-ECHO = echo +-ECHO_C = +-ECHO_N = -n +-ECHO_T = +-EGREP = grep -E +-ELP_DLL_VERSION = 1:5:0 +-EMULBS_MAJOR_VERSION = 3 +-EMULBS_MINOR_VERSION = 2 +-EMULBS_VERSION = 3.2 +-EXEEXT = +-EXP_MAJOR_VERSION = 1 +-EXP_MINOR_VERSION = 0 +-EXP_VERSION = 1.0 +-F77 = g77 +-FFLAGS = -g -O2 +-FKS_DLL_VERSION = 1:4:0 +-FLATBEH_MAJOR_VERSION = 1 +-FLATBEH_MINOR_VERSION = 1 +-FLATBEH_VERSION = 1.1 +-FMI_MAJOR_VERSION = 1 +-FMI_MINOR_VERSION = 1 +-FMI_VERSION = 1.1 +-FSM_DLL_VERSION = 1:4:0 +-FSP_MAJOR_VERSION = 1 +-FSP_MINOR_VERSION = 1 +-FSP_VERSION = 1.1 +-FTL_DLL_VERSION = 1:4:0 +-FVH_DLL_VERSION = 1:4:0 +-GRAAL_MAJOR_VERSION = 1 +-GRAAL_MINOR_VERSION = 27 +-GRAAL_VERSION = 1.27 +-GROWSTK_MAJOR_VERSION = 1 +-GROWSTK_MINOR_VERSION = 5 +-GROWSTK_VERSION = 1.5 +-INCLUDE_MOTIF = +-INSTALL_DATA = ${INSTALL} -m 664 +-INSTALL_PROGRAM = ${INSTALL} -m 775 +-INSTALL_SCRIPT = ${INSTALL} +-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s +-K2F_MAJOR_VERSION = 1 +-K2F_MINOR_VERSION = 1 +-K2F_VERSION = 1.1 +-L2P_MAJOR_VERSION = 1 +-L2P_MINOR_VERSION = 12 +-L2P_VERSION = 1.12 +-LDFLAGS = -static -L/users/outil/alliance/Linux.FC2/lib +-LEX = flex +-LEXLIB = -lfl +-LEX_OUTPUT_ROOT = lex.yy +-LIBOBJS = +-LIBS = -liberty -lm -lm -lm -lm -liberty +-LIBTOOL = $(SHELL) $(top_builddir)/libtool +-LINK_MOTIF = -lXm +-LINK_XPM = -lXpm +-LN_S = ln -s +-LOG_DLL_VERSION = 2:1:0 +-LOON_MAJOR_VERSION = 1 +-LOON_MINOR_VERSION = 7 +-LOON_VERSION = 1.7 +-LTLIBOBJS = +-LVX_MAJOR_VERSION = 1 +-LVX_MINOR_VERSION = 2 +-LVX_VERSION = 1.2 +-LYNX_MAJOR_VERSION = 1 +-LYNX_MINOR_VERSION = 21 +-LYNX_VERSION = 1.21 +-M2E_MAJOR_VERSION = 1 +-M2E_MINOR_VERSION = 0 +-M2E_VERSION = 1.0 +-MAKEINFO = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run makeinfo +-MAL_DLL_VERSION = 6:0:0 +-MAP_DLL_VERSION = 6:0:0 +-MBK_CUR = 4 +-MBK_DLL_VERSION = 4:2:0 +-MBK_REL = 0 +-MBK_REV = 2 +-MBK_VERSION = 4.2 +-MCL_DLL_VERSION = 4:9:0 +-MCP_DLL_VERSION = 4:9:0 +-MEL_DLL_VERSION = 4:9:0 +-MGL_DLL_VERSION = 0:8:0 +-MGN_DLL_VERSION = 3:3:0 +-MHL_DLL_VERSION = 2:1:0 +-MIPS_ASM_MAJOR_VERSION = 1 +-MIPS_ASM_MINOR_VERSION = 0 +-MIPS_ASM_VERSION = 1.0 +-MMG_DLL_VERSION = 1:0:0 +-MOCHA_MAJOR_VERSION = 1 +-MOCHA_MINOR_VERSION = 1 +-MOCHA_VERSION = 1.1 +-MSL_DLL_VERSION = 7:0:0 +-MVG_DLL_VERSION = 4:1:0 +-MVL_DLL_VERSION = 4:1:0 +-NERO_MAJOR_VERSION = 1 +-NERO_MINOR_VERSION = 0 +-NERO_VERSION = 1.0 +-OBJEXT = o +-OCP_MAJOR_VERSION = 1 +-OCP_MINOR_VERSION = 0 +-OCP_VERSION = 1.0 +-OCR_MAJOR_VERSION = 1 +-OCR_MINOR_VERSION = 0 +-OCR_VERSION = 1.0 +-PACKAGE = alliance +-PACKAGE_BUGREPORT = +-PACKAGE_NAME = +-PACKAGE_STRING = +-PACKAGE_TARNAME = +-PACKAGE_VERSION = +-PAT2SPI_MAJOR_VERSION = 1 +-PAT2SPI_MINOR_VERSION = 1 +-PAT2SPI_VERSION = 1.1 +-PATH_SEPARATOR = : +-PAT_DLL_VERSION = 1:9:0 +-PCBS_MAJOR_VERSION = 2 +-PCBS_MINOR_VERSION = 1 +-PCBS_VERSION = 2.1 +-PGN_DLL_VERSION = 3:3:0 +-PHL_DLL_VERSION = 1:9:0 +-PPT_DLL_VERSION = 1:9:0 +-PROOF_MAJOR_VERSION = 4 +-PROOF_MINOR_VERSION = 9 +-PROOF_VERSION = 4.9 +-RANLIB = ranlib +-RCF_DLL_VERSION = 2:1:0 +-RDS_DLL_VERSION = 2:1:0 +-RFM_DLL_VERSION = 2:1:0 +-RGS_DLL_VERSION = 2:1:0 +-RING_MAJOR_VERSION = 3 +-RING_MINOR_VERSION = 0 +-RING_VERSION = 3.0 +-RPR_DLL_VERSION = 2:1:0 +-RTD_DLL_VERSION = 1:1:0 +-RTL_DLL_VERSION = 2:1:0 +-RTN_DLL_VERSION = 1:1:0 +-RUT_DLL_VERSION = 2:1:0 +-RWI_DLL_VERSION = 2:1:0 +-S2R_MAJOR_VERSION = 4 +-S2R_MINOR_VERSION = 4 +-S2R_VERSION = 4.4 +-SCAPIN_MAJOR_VERSION = 1 +-SCAPIN_MINOR_VERSION = 1 +-SCAPIN_VERSION = 1.1 +-SCH_DLL_VERSION = 3:2:0 +-SCL_DLL_VERSION = 1:5:0 +-SEA_MAJOR_VERSION = 1 +-SEA_MINOR_VERSION = 0 +-SEA_VERSION = 1.0 +-SED = /bin/sed +-SET_MAKE = +-SHELL = /bin/sh +-STRIP = strip +-SYF_MAJOR_VERSION = 3 +-SYF_MINOR_VERSION = 6 +-SYF_VERSION = 3.6 +-TOOLSDIRS = mbk mbkal mbkap mbkedif mbkhilo mbkmg mbkspice mbkvhdl mbkvrlog mbkvti mbkvhdlg aut rds rdscif rdsgds elp abl bdd log btr vex ctl ctp abe abt abv fsm fks fvh ftl rtn rtd scl vbh vbl vpn vpd vvh vtl pat ppt phl gcp druc beh bhl bvl alcban asimut attila b2f boog boom cells distrib dreal exp flatbeh flatlo flatph fmi fsp genlib genpat graal k2f l2p loon lvx lynx m2e mips_asm mocha nero ocp pat2spi proof ring s2r scapin sea syf vasy vst2xnf x2y xfsm xpat xsch xvpn documentation +-VASY_MAJOR_VERSION = 1 +-VASY_MINOR_VERSION = 5 +-VASY_VERSION = 1.5 +-VBH_DLL_VERSION = 1:4:0 +-VBL_DLL_VERSION = 1:4:0 +-VERSION = 5.0 +-VEX_DLL_VERSION = 1:3:0 +-VPD_DLL_VERSION = 1:5:0 +-VPN_DLL_VERSION = 1:5:0 +-VRD_DLL_VERSION = 3:4:0 +-VST2XNF_MAJOR_VERSION = 1 +-VST2XNF_MINOR_VERSION = 0 +-VST2XNF_VERSION = 1.0 +-VTL_DLL_VERSION = 1:5:0 +-VVH_DLL_VERSION = 1:5:0 +-X11_LIBS = -lX11 +-XEXT_LIBS = -lXext +-XFSM_MAJOR_VERSION = 1 +-XFSM_MINOR_VERSION = 4 +-XFSM_VERSION = 1.4 +-XM_LIBS = -lXm +-XPAT_MAJOR_VERSION = 1 +-XPAT_MINOR_VERSION = 4 +-XPAT_VERSION = 1.4 +-XPM_LIBS = -lXpm +-XP_LIBS = -lXp +-XSCH_MAJOR_VERSION = 1 +-XSCH_MINOR_VERSION = 4 +-XSCH_VERSION = 1.4 +-XT_LIBS = -lXt +-XVPN_MAJOR_VERSION = 1 +-XVPN_MINOR_VERSION = 5 +-XVPN_VERSION = 1.5 +-X_CFLAGS = -I/usr/X11R6/include +-X_EXTRA_LIBS = +-X_LIBS = -L/usr/X11R6/lib +-X_PRE_LIBS = -lSM -lICE +-YACC = bison -y +-ac_ct_AR = ar +-ac_ct_CC = gcc +-ac_ct_CXX = g++ +-ac_ct_F77 = g77 +-ac_ct_RANLIB = ranlib +-ac_ct_STRIP = strip +-am__fastdepCC_FALSE = # +-am__fastdepCC_TRUE = +-am__fastdepCXX_FALSE = # +-am__fastdepCXX_TRUE = +-am__include = include +-am__leading_dot = . +-am__quote = +-bindir = ${exec_prefix}/bin +-build = i686-pc-linux-gnu +-build_alias = +-build_cpu = i686 +-build_os = linux-gnu +-build_vendor = pc +-datadir = ${prefix}/share +-exec_prefix = ${prefix} +-host = i686-pc-linux-gnu +-host_alias = +-host_cpu = i686 +-host_os = linux-gnu +-host_vendor = pc +-includedir = ${prefix}/include +-infodir = ${prefix}/info +-install_sh = /dsk/l1/misc/hcl/alliance/src/install-sh +-libdir = ${exec_prefix}/lib +-libexecdir = ${exec_prefix}/libexec +-localstatedir = ${prefix}/var +-mandir = ${prefix}/man +-mkdir_p = mkdir -p -- . +-oldincludedir = /usr/include +-prefix = /dsk/l1/misc/hcl/altest +-program_transform_name = s,x,x, +-sbindir = ${exec_prefix}/sbin +-sharedstatedir = ${prefix}/com +-sysconfdir = ${prefix}/etc +-target_alias = +-AM_CFLAGS = -DTECHNOLOGY=\"etc/prol.elp\" -I$(top_srcdir)/mbk/src +-lib_LTLIBRARIES = libElp.la +-include_HEADERS = elp.h +-libElp_la_SOURCES = elp_y.y elp_l.l \ +-elp.c elperror.c elp.h +- +-libElp_la_LDFLAGS = -version-info 1:5:0 +-CLEANFILES = elp_y.c elp_y.h elp_l.c +-all: all-am +- +-.SUFFIXES: +-.SUFFIXES: .c .l .lo .o .obj .y +-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) +- @for dep in $?; do \ +- case '$(am__configure_deps)' in \ +- *$$dep*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ +- && exit 0; \ +- exit 1;; \ +- esac; \ +- done; \ +- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign elp/src/Makefile'; \ +- cd $(top_srcdir) && \ +- $(AUTOMAKE) --foreign elp/src/Makefile +-.PRECIOUS: Makefile +-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +- @case '$?' in \ +- *config.status*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ +- *) \ +- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ +- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ +- esac; +- +-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +- +-$(top_srcdir)/configure: $(am__configure_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-$(ACLOCAL_M4): $(am__aclocal_m4_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-install-libLTLIBRARIES: $(lib_LTLIBRARIES) +- @$(NORMAL_INSTALL) +- test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" +- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +- if test -f $$p; then \ +- f="`echo $$p | sed -e 's|^.*/||'`"; \ +- echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ +- $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ +- else :; fi; \ +- done +- +-uninstall-libLTLIBRARIES: +- @$(NORMAL_UNINSTALL) +- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +- p="`echo $$p | sed -e 's|^.*/||'`"; \ +- echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ +- $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ +- done +- +-clean-libLTLIBRARIES: +- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) +- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +- test "$$dir" != "$$p" || dir=.; \ +- echo "rm -f \"$${dir}/so_locations\""; \ +- rm -f "$${dir}/so_locations"; \ +- done +-libElp.la: $(libElp_la_OBJECTS) $(libElp_la_DEPENDENCIES) +- $(LINK) -rpath $(libdir) $(libElp_la_LDFLAGS) $(libElp_la_OBJECTS) $(libElp_la_LIBADD) $(LIBS) +- +-mostlyclean-compile: +- -rm -f *.$(OBJEXT) +- +-distclean-compile: +- -rm -f *.tab.c +- +-include ./$(DEPDIR)/elp.Plo +-include ./$(DEPDIR)/elp_l.Plo +-include ./$(DEPDIR)/elp_y.Plo +-include ./$(DEPDIR)/elperror.Plo +- +-.c.o: +- if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-# source='$<' object='$@' libtool=no \ +-# depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ +-# $(CCDEPMODE) $(depcomp) \ +-# $(COMPILE) -c $< +- +-.c.obj: +- if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-# source='$<' object='$@' libtool=no \ +-# depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ +-# $(CCDEPMODE) $(depcomp) \ +-# $(COMPILE) -c `$(CYGPATH_W) '$<'` +- +-.c.lo: +- if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-# source='$<' object='$@' libtool=yes \ +-# depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ +-# $(CCDEPMODE) $(depcomp) \ +-# $(LTCOMPILE) -c -o $@ $< +- +-.l.c: +- $(LEXCOMPILE) $< +- sed '/^#/ s|$(LEX_OUTPUT_ROOT)\.c|$@|' $(LEX_OUTPUT_ROOT).c >$@ +- rm -f $(LEX_OUTPUT_ROOT).c +- +-.y.c: +- $(YACCCOMPILE) $< +- if test -f y.tab.h; then \ +- to=`echo "$*_H" | sed \ +- -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ +- -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \ +- sed "/^#/ s/Y_TAB_H/$$to/g" y.tab.h >$*.ht; \ +- rm -f y.tab.h; \ +- if cmp -s $*.ht $*.h; then \ +- rm -f $*.ht ;\ +- else \ +- mv $*.ht $*.h; \ +- fi; \ +- fi +- if test -f y.output; then \ +- mv y.output $*.output; \ +- fi +- sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@ +- rm -f y.tab.c +- +-mostlyclean-libtool: +- -rm -f *.lo +- +-clean-libtool: +- -rm -rf .libs _libs +- +-distclean-libtool: +- -rm -f libtool +-uninstall-info-am: +-install-includeHEADERS: $(include_HEADERS) +- @$(NORMAL_INSTALL) +- test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" +- @list='$(include_HEADERS)'; for p in $$list; do \ +- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ +- f="`echo $$p | sed -e 's|^.*/||'`"; \ +- echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ +- $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ +- done +- +-uninstall-includeHEADERS: +- @$(NORMAL_UNINSTALL) +- @list='$(include_HEADERS)'; for p in $$list; do \ +- f="`echo $$p | sed -e 's|^.*/||'`"; \ +- echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ +- rm -f "$(DESTDIR)$(includedir)/$$f"; \ +- done +- +-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- mkid -fID $$unique +-tags: TAGS +- +-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ +- test -n "$$unique" || unique=$$empty_fix; \ +- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +- $$tags $$unique; \ +- fi +-ctags: CTAGS +-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- test -z "$(CTAGS_ARGS)$$tags$$unique" \ +- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ +- $$tags $$unique +- +-GTAGS: +- here=`$(am__cd) $(top_builddir) && pwd` \ +- && cd $(top_srcdir) \ +- && gtags -i $(GTAGS_ARGS) $$here +- +-distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +- +-distdir: $(DISTFILES) +- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ +- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ +- list='$(DISTFILES)'; for file in $$list; do \ +- case $$file in \ +- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ +- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ +- esac; \ +- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ +- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ +- if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +- dir="/$$dir"; \ +- $(mkdir_p) "$(distdir)$$dir"; \ +- else \ +- dir=''; \ +- fi; \ +- if test -d $$d/$$file; then \ +- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ +- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ +- fi; \ +- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ +- else \ +- test -f $(distdir)/$$file \ +- || cp -p $$d/$$file $(distdir)/$$file \ +- || exit 1; \ +- fi; \ +- done +-check-am: all-am +-check: check-am +-all-am: Makefile $(LTLIBRARIES) $(HEADERS) +-installdirs: +- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ +- test -z "$$dir" || $(mkdir_p) "$$dir"; \ +- done +-install: install-am +-install-exec: install-exec-am +-install-data: install-data-am +-uninstall: uninstall-am +- +-install-am: all-am +- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +- +-installcheck: installcheck-am +-install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +-mostlyclean-generic: +- +-clean-generic: +- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) +- +-distclean-generic: +- -rm -f $(CONFIG_CLEAN_FILES) +- +-maintainer-clean-generic: +- @echo "This command is intended for maintainers to use" +- @echo "it deletes files that may require special tools to rebuild." +- -rm -f elp_l.c +- -rm -f elp_y.c +-clean: clean-am +- +-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ +- mostlyclean-am +- +-distclean: distclean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-distclean-am: clean-am distclean-compile distclean-generic \ +- distclean-libtool distclean-tags +- +-dvi: dvi-am +- +-dvi-am: +- +-html: html-am +- +-info: info-am +- +-info-am: +- +-install-data-am: install-includeHEADERS +- +-install-exec-am: install-libLTLIBRARIES +- +-install-info: install-info-am +- +-install-man: +- +-installcheck-am: +- +-maintainer-clean: maintainer-clean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-maintainer-clean-am: distclean-am maintainer-clean-generic +- +-mostlyclean: mostlyclean-am +- +-mostlyclean-am: mostlyclean-compile mostlyclean-generic \ +- mostlyclean-libtool +- +-pdf: pdf-am +- +-pdf-am: +- +-ps: ps-am +- +-ps-am: +- +-uninstall-am: uninstall-includeHEADERS uninstall-info-am \ +- uninstall-libLTLIBRARIES +- +-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ +- clean-libLTLIBRARIES clean-libtool ctags distclean \ +- distclean-compile distclean-generic distclean-libtool \ +- distclean-tags distdir dvi dvi-am html html-am info info-am \ +- install install-am install-data install-data-am install-exec \ +- install-exec-am install-includeHEADERS install-info \ +- install-info-am install-libLTLIBRARIES install-man \ +- install-strip installcheck installcheck-am installdirs \ +- maintainer-clean maintainer-clean-generic mostlyclean \ +- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ +- pdf pdf-am ps ps-am tags uninstall uninstall-am \ +- uninstall-includeHEADERS uninstall-info-am \ +- uninstall-libLTLIBRARIES +- +- +-elp_y.c elp_y.h : $(srcdir)/elp_y.y +- $(YACC) -d $(YFLAGS) $(srcdir)/elp_y.y && sed -e "s/yy/elpyy/g" -e "s/YY/elpYY/g" y.tab.c > elp_y.c && sed -e "s/yy/elpyy/g" -e "s/YY/elpYY/g" y.tab.h > elp_y.h +- +-elp_l.c : $(srcdir)/elp_l.l elp_y.h +- $(LEX) -t $(srcdir)/elp_l.l | sed -e "s/yy/elpyy/g" -e "s/YY/elpYY/g" > elp_l.c +-# Tell versions [3.59,3.63) of GNU make to not export all variables. +-# Otherwise a system limit (for SysV at least) may be exceeded. +-.NOEXPORT: +diff --git a/alliance/src/genpat/src/Makefile b/alliance/src/genpat/src/Makefile +deleted file mode 100644 +index 51fe5cc..0000000 +--- a/alliance/src/genpat/src/Makefile ++++ /dev/null +@@ -1,729 +0,0 @@ +-# Makefile.in generated by automake 1.8.5 from Makefile.am. +-# genpat/src/Makefile. Generated from Makefile.in by configure. +- +-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +-# 2003, 2004 Free Software Foundation, Inc. +-# This Makefile.in is free software; the Free Software Foundation +-# gives unlimited permission to copy and/or distribute it, +-# with or without modifications, as long as this notice is preserved. +- +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +-# PARTICULAR PURPOSE. +- +- +- +- +- +-SOURCES = $(libPgn_la_SOURCES) +- +-srcdir = . +-top_srcdir = ../.. +- +-pkgdatadir = $(datadir)/alliance +-pkglibdir = $(libdir)/alliance +-pkgincludedir = $(includedir)/alliance +-top_builddir = ../.. +-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +-INSTALL = /usr/bin/install -c +-install_sh_DATA = $(install_sh) -c -m 644 +-install_sh_PROGRAM = $(install_sh) -c +-install_sh_SCRIPT = $(install_sh) -c +-INSTALL_HEADER = $(INSTALL_DATA) +-transform = $(program_transform_name) +-NORMAL_INSTALL = : +-PRE_INSTALL = : +-POST_INSTALL = : +-NORMAL_UNINSTALL = : +-PRE_UNINSTALL = : +-POST_UNINSTALL = : +-host_triplet = i686-pc-linux-gnu +-subdir = genpat/src +-DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ +- $(srcdir)/Makefile.in +-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-am__aclocal_m4_deps = $(top_srcdir)/./alliance.m4 \ +- $(top_srcdir)/./motif.m4 $(top_srcdir)/./xpm.m4 \ +- $(top_srcdir)/configure.in +-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +- $(ACLOCAL_M4) +-mkinstalldirs = $(mkdir_p) +-CONFIG_CLEAN_FILES = +-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)" +-libLTLIBRARIES_INSTALL = $(INSTALL) +-LTLIBRARIES = $(lib_LTLIBRARIES) +-libPgn_la_LIBADD = +-am_libPgn_la_OBJECTS = AFFECT.lo ARRAY.lo CONV.lo DECLAR.lo DEF_GEN.lo \ +- GETCPAT.lo INIT.lo LABEL.lo SAVE.lo SAV_GEN.lo SETTUNIT.lo \ +- libpat_l.lo +-libPgn_la_OBJECTS = $(am_libPgn_la_OBJECTS) +-binSCRIPT_INSTALL = $(INSTALL_SCRIPT) +-SCRIPTS = $(bin_SCRIPTS) +-DEFAULT_INCLUDES = -I. -I$(srcdir) +-depcomp = $(SHELL) $(top_srcdir)/depcomp +-am__depfiles_maybe = depfiles +-DEP_FILES = ./$(DEPDIR)/AFFECT.Plo ./$(DEPDIR)/ARRAY.Plo \ +- ./$(DEPDIR)/CONV.Plo ./$(DEPDIR)/DECLAR.Plo \ +- ./$(DEPDIR)/DEF_GEN.Plo ./$(DEPDIR)/GETCPAT.Plo \ +- ./$(DEPDIR)/INIT.Plo ./$(DEPDIR)/LABEL.Plo \ +- ./$(DEPDIR)/SAVE.Plo ./$(DEPDIR)/SAV_GEN.Plo \ +- ./$(DEPDIR)/SETTUNIT.Plo ./$(DEPDIR)/libpat_l.Plo +-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ +- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ +- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ +- $(AM_CFLAGS) $(CFLAGS) +-CCLD = $(CC) +-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +- $(AM_LDFLAGS) $(LDFLAGS) -o $@ +-SOURCES = $(libPgn_la_SOURCES) +-DIST_SOURCES = $(libPgn_la_SOURCES) +-includeHEADERS_INSTALL = $(INSTALL_HEADER) +-HEADERS = $(include_HEADERS) +-ETAGS = etags +-CTAGS = ctags +-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +-ABE_DLL_VERSION = 2:1:0 +-ABL_DLL_VERSION = 1:3:0 +-ABT_DLL_VERSION = 2:1:0 +-ABV_DLL_VERSION = 2:1:0 +-ACLOCAL = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run aclocal-1.8 +-ALCBANNER_MAJOR_VERSION = 1 +-ALCBANNER_MINOR_VERSION = 1 +-ALCBANNER_VERSION = 1.1 +-ALLIANCE_BUILD_FALSE = # +-ALLIANCE_BUILD_TRUE = +-ALLIANCE_CFLAGS = -I/users/outil/alliance/Linux.FC2/include +-ALLIANCE_LIBS = -L/users/outil/alliance/Linux.FC2/lib +-ALLIANCE_TOP = /users/outil/alliance/Linux.FC2 +-AMDEP_FALSE = # +-AMDEP_TRUE = +-AMTAR = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run tar +-AR = ar +-ATTILA_MAJOR_VERSION = 0 +-ATTILA_MINOR_VERSION = 1 +-ATTILA_VERSION = 0.1 +-AUTOCONF = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run autoconf +-AUTOHEADER = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run autoheader +-AUTOMAKE = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run automake-1.8 +-AUT_DLL_VERSION = 1:3:0 +-AWK = gawk +-B2F_MAJOR_VERSION = 1 +-B2F_MINOR_VERSION = 2 +-B2F_VERSION = 1.2 +-BDD_DLL_VERSION = 1:5:0 +-BEH_DLL_VERSION = 1:11:0 +-BHL_DLL_VERSION = 1:11:0 +-BOOG_MAJOR_VERSION = 1 +-BOOG_MINOR_VERSION = 7 +-BOOG_VERSION = 1.7 +-BOOM_MAJOR_VERSION = 1 +-BOOM_MINOR_VERSION = 2 +-BOOM_VERSION = 1.2 +-BTR_DLL_VERSION = 1:3:0 +-BVL_DLL_VERSION = 1:14:0 +-CC = gcc +-CCDEPMODE = depmode=gcc3 +-CFLAGS = -I/users/outil/alliance/Linux.FC2/include -g -O2 +-CPP = gcc -E +-CPPFLAGS = +-CST_DLL_VERSION = 3:2:0 +-CTL_DLL_VERSION = 1:1:0 +-CTP_DLL_VERSION = 1:1:0 +-CXX = g++ +-CXXCPP = g++ -E +-CXXDEPMODE = depmode=gcc3 +-CXXFLAGS = -g -O2 +-CYGPATH_W = echo +-DEFS = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"alliance\" -DVERSION=\"5.0\" -DYYTEXT_POINTER=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FCNTL_H=1 -DHAVE_MALLOC_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRINGS_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBIBERTY=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_LIBM=1 -DHAVE_UNISTD_H=1 -DHAVE_FORK=1 -DHAVE_VFORK=1 -DHAVE_WORKING_VFORK=1 -DHAVE_WORKING_FORK=1 -DSTDC_HEADERS=1 -DHAVE_SYS_WAIT_H=1 -DRETSIGTYPE=void -DHAVE_MOTIF=1 -DHAVE_XPM=1 -DHAVE_XPM=1 -DHAVE_X11_XPM_H=1 -DHAVE_XP=1 -DHAVE_MOTIF=1 -DHAVE_XMUSEVERSION=1 -DHAVE_XMINSTALLIMAGE=1 -DALLIANCE_VERSION=\"5.0\" -DALLIANCE_TOP=\"/users/outil/alliance/Linux.FC2\" -DHAVE_LIBIBERTY=1 +-DEPDIR = .deps +-DOC_MAJOR_VERSION = 1 +-DOC_MINOR_VERSION = 0 +-DOC_VERSION = 1.0 +-DREAL_MAJOR_VERSION = 1 +-DREAL_MINOR_VERSION = 14 +-DREAL_VERSION = 1.14 +-ECHO = echo +-ECHO_C = +-ECHO_N = -n +-ECHO_T = +-EGREP = grep -E +-ELP_DLL_VERSION = 1:5:0 +-EMULBS_MAJOR_VERSION = 3 +-EMULBS_MINOR_VERSION = 2 +-EMULBS_VERSION = 3.2 +-EXEEXT = +-EXP_MAJOR_VERSION = 1 +-EXP_MINOR_VERSION = 0 +-EXP_VERSION = 1.0 +-F77 = g77 +-FFLAGS = -g -O2 +-FKS_DLL_VERSION = 1:4:0 +-FLATBEH_MAJOR_VERSION = 1 +-FLATBEH_MINOR_VERSION = 1 +-FLATBEH_VERSION = 1.1 +-FMI_MAJOR_VERSION = 1 +-FMI_MINOR_VERSION = 1 +-FMI_VERSION = 1.1 +-FSM_DLL_VERSION = 1:4:0 +-FSP_MAJOR_VERSION = 1 +-FSP_MINOR_VERSION = 1 +-FSP_VERSION = 1.1 +-FTL_DLL_VERSION = 1:4:0 +-FVH_DLL_VERSION = 1:4:0 +-GRAAL_MAJOR_VERSION = 1 +-GRAAL_MINOR_VERSION = 27 +-GRAAL_VERSION = 1.27 +-GROWSTK_MAJOR_VERSION = 1 +-GROWSTK_MINOR_VERSION = 5 +-GROWSTK_VERSION = 1.5 +-INCLUDE_MOTIF = +-INSTALL_DATA = ${INSTALL} -m 664 +-INSTALL_PROGRAM = ${INSTALL} -m 775 +-INSTALL_SCRIPT = ${INSTALL} +-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s +-K2F_MAJOR_VERSION = 1 +-K2F_MINOR_VERSION = 1 +-K2F_VERSION = 1.1 +-L2P_MAJOR_VERSION = 1 +-L2P_MINOR_VERSION = 12 +-L2P_VERSION = 1.12 +-LDFLAGS = -static -L/users/outil/alliance/Linux.FC2/lib +-LEX = flex +-LEXLIB = -lfl +-LEX_OUTPUT_ROOT = lex.yy +-LIBOBJS = +-LIBS = -liberty -lm -lm -lm -lm -liberty +-LIBTOOL = $(SHELL) $(top_builddir)/libtool +-LINK_MOTIF = -lXm +-LINK_XPM = -lXpm +-LN_S = ln -s +-LOG_DLL_VERSION = 2:1:0 +-LOON_MAJOR_VERSION = 1 +-LOON_MINOR_VERSION = 7 +-LOON_VERSION = 1.7 +-LTLIBOBJS = +-LVX_MAJOR_VERSION = 1 +-LVX_MINOR_VERSION = 2 +-LVX_VERSION = 1.2 +-LYNX_MAJOR_VERSION = 1 +-LYNX_MINOR_VERSION = 21 +-LYNX_VERSION = 1.21 +-M2E_MAJOR_VERSION = 1 +-M2E_MINOR_VERSION = 0 +-M2E_VERSION = 1.0 +-MAKEINFO = ${SHELL} /dsk/l1/misc/hcl/alliance/src/missing --run makeinfo +-MAL_DLL_VERSION = 6:0:0 +-MAP_DLL_VERSION = 6:0:0 +-MBK_CUR = 4 +-MBK_DLL_VERSION = 4:2:0 +-MBK_REL = 0 +-MBK_REV = 2 +-MBK_VERSION = 4.2 +-MCL_DLL_VERSION = 4:9:0 +-MCP_DLL_VERSION = 4:9:0 +-MEL_DLL_VERSION = 4:9:0 +-MGL_DLL_VERSION = 0:8:0 +-MGN_DLL_VERSION = 3:3:0 +-MHL_DLL_VERSION = 2:1:0 +-MIPS_ASM_MAJOR_VERSION = 1 +-MIPS_ASM_MINOR_VERSION = 0 +-MIPS_ASM_VERSION = 1.0 +-MMG_DLL_VERSION = 1:0:0 +-MOCHA_MAJOR_VERSION = 1 +-MOCHA_MINOR_VERSION = 1 +-MOCHA_VERSION = 1.1 +-MSL_DLL_VERSION = 7:0:0 +-MVG_DLL_VERSION = 4:1:0 +-MVL_DLL_VERSION = 4:1:0 +-NERO_MAJOR_VERSION = 1 +-NERO_MINOR_VERSION = 0 +-NERO_VERSION = 1.0 +-OBJEXT = o +-OCP_MAJOR_VERSION = 1 +-OCP_MINOR_VERSION = 0 +-OCP_VERSION = 1.0 +-OCR_MAJOR_VERSION = 1 +-OCR_MINOR_VERSION = 0 +-OCR_VERSION = 1.0 +-PACKAGE = alliance +-PACKAGE_BUGREPORT = +-PACKAGE_NAME = +-PACKAGE_STRING = +-PACKAGE_TARNAME = +-PACKAGE_VERSION = +-PAT2SPI_MAJOR_VERSION = 1 +-PAT2SPI_MINOR_VERSION = 1 +-PAT2SPI_VERSION = 1.1 +-PATH_SEPARATOR = : +-PAT_DLL_VERSION = 1:9:0 +-PCBS_MAJOR_VERSION = 2 +-PCBS_MINOR_VERSION = 1 +-PCBS_VERSION = 2.1 +-PGN_DLL_VERSION = 3:3:0 +-PHL_DLL_VERSION = 1:9:0 +-PPT_DLL_VERSION = 1:9:0 +-PROOF_MAJOR_VERSION = 4 +-PROOF_MINOR_VERSION = 9 +-PROOF_VERSION = 4.9 +-RANLIB = ranlib +-RCF_DLL_VERSION = 2:1:0 +-RDS_DLL_VERSION = 2:1:0 +-RFM_DLL_VERSION = 2:1:0 +-RGS_DLL_VERSION = 2:1:0 +-RING_MAJOR_VERSION = 3 +-RING_MINOR_VERSION = 0 +-RING_VERSION = 3.0 +-RPR_DLL_VERSION = 2:1:0 +-RTD_DLL_VERSION = 1:1:0 +-RTL_DLL_VERSION = 2:1:0 +-RTN_DLL_VERSION = 1:1:0 +-RUT_DLL_VERSION = 2:1:0 +-RWI_DLL_VERSION = 2:1:0 +-S2R_MAJOR_VERSION = 4 +-S2R_MINOR_VERSION = 4 +-S2R_VERSION = 4.4 +-SCAPIN_MAJOR_VERSION = 1 +-SCAPIN_MINOR_VERSION = 1 +-SCAPIN_VERSION = 1.1 +-SCH_DLL_VERSION = 3:2:0 +-SCL_DLL_VERSION = 1:5:0 +-SEA_MAJOR_VERSION = 1 +-SEA_MINOR_VERSION = 0 +-SEA_VERSION = 1.0 +-SED = /bin/sed +-SET_MAKE = +-SHELL = /bin/sh +-STRIP = strip +-SYF_MAJOR_VERSION = 3 +-SYF_MINOR_VERSION = 6 +-SYF_VERSION = 3.6 +-TOOLSDIRS = mbk mbkal mbkap mbkedif mbkhilo mbkmg mbkspice mbkvhdl mbkvrlog mbkvti mbkvhdlg aut rds rdscif rdsgds elp abl bdd log btr vex ctl ctp abe abt abv fsm fks fvh ftl rtn rtd scl vbh vbl vpn vpd vvh vtl pat ppt phl gcp druc beh bhl bvl alcban asimut attila b2f boog boom cells distrib dreal exp flatbeh flatlo flatph fmi fsp genlib genpat graal k2f l2p loon lvx lynx m2e mips_asm mocha nero ocp pat2spi proof ring s2r scapin sea syf vasy vst2xnf x2y xfsm xpat xsch xvpn documentation +-VASY_MAJOR_VERSION = 1 +-VASY_MINOR_VERSION = 5 +-VASY_VERSION = 1.5 +-VBH_DLL_VERSION = 1:4:0 +-VBL_DLL_VERSION = 1:4:0 +-VERSION = 5.0 +-VEX_DLL_VERSION = 1:3:0 +-VPD_DLL_VERSION = 1:5:0 +-VPN_DLL_VERSION = 1:5:0 +-VRD_DLL_VERSION = 3:4:0 +-VST2XNF_MAJOR_VERSION = 1 +-VST2XNF_MINOR_VERSION = 0 +-VST2XNF_VERSION = 1.0 +-VTL_DLL_VERSION = 1:5:0 +-VVH_DLL_VERSION = 1:5:0 +-X11_LIBS = -lX11 +-XEXT_LIBS = -lXext +-XFSM_MAJOR_VERSION = 1 +-XFSM_MINOR_VERSION = 4 +-XFSM_VERSION = 1.4 +-XM_LIBS = -lXm +-XPAT_MAJOR_VERSION = 1 +-XPAT_MINOR_VERSION = 4 +-XPAT_VERSION = 1.4 +-XPM_LIBS = -lXpm +-XP_LIBS = -lXp +-XSCH_MAJOR_VERSION = 1 +-XSCH_MINOR_VERSION = 4 +-XSCH_VERSION = 1.4 +-XT_LIBS = -lXt +-XVPN_MAJOR_VERSION = 1 +-XVPN_MINOR_VERSION = 5 +-XVPN_VERSION = 1.5 +-X_CFLAGS = -I/usr/X11R6/include +-X_EXTRA_LIBS = +-X_LIBS = -L/usr/X11R6/lib +-X_PRE_LIBS = -lSM -lICE +-YACC = bison -y +-ac_ct_AR = ar +-ac_ct_CC = gcc +-ac_ct_CXX = g++ +-ac_ct_F77 = g77 +-ac_ct_RANLIB = ranlib +-ac_ct_STRIP = strip +-am__fastdepCC_FALSE = # +-am__fastdepCC_TRUE = +-am__fastdepCXX_FALSE = # +-am__fastdepCXX_TRUE = +-am__include = include +-am__leading_dot = . +-am__quote = +-bindir = ${exec_prefix}/bin +-build = i686-pc-linux-gnu +-build_alias = +-build_cpu = i686 +-build_os = linux-gnu +-build_vendor = pc +-datadir = ${prefix}/share +-exec_prefix = ${prefix} +-host = i686-pc-linux-gnu +-host_alias = +-host_cpu = i686 +-host_os = linux-gnu +-host_vendor = pc +-includedir = ${prefix}/include +-infodir = ${prefix}/info +-install_sh = /dsk/l1/misc/hcl/alliance/src/install-sh +-libdir = ${exec_prefix}/lib +-libexecdir = ${exec_prefix}/libexec +-localstatedir = ${prefix}/var +-mandir = ${prefix}/man +-mkdir_p = mkdir -p -- . +-oldincludedir = /usr/include +-prefix = /dsk/l1/misc/hcl/altest +-program_transform_name = s,x,x, +-sbindir = ${exec_prefix}/sbin +-sharedstatedir = ${prefix}/com +-sysconfdir = ${prefix}/etc +-target_alias = +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ +--I$(top_srcdir)/pat/src \ +--I$(top_srcdir)/ppt/src \ +--I$(top_srcdir)/phl/src +- +-lib_LTLIBRARIES = libPgn.la +-include_HEADERS = genpat.h +-libPgn_la_SOURCES = AFFECT.c ARRAY.c CONV.c DECLAR.c DEF_GEN.c GETCPAT.c \ +- INIT.c LABEL.c SAVE.c SAV_GEN.c SETTUNIT.c \ +- libpat_l.c libpat_l.h +- +-libPgn_la_LDFLAGS = -version-info 3:3:0 +-bin_SCRIPTS = genpat +-CLEANFILES = genpat +-EXTRA_DIST = genpat.sh +-all: all-am +- +-.SUFFIXES: +-.SUFFIXES: .c .lo .o .obj +-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) +- @for dep in $?; do \ +- case '$(am__configure_deps)' in \ +- *$$dep*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ +- && exit 0; \ +- exit 1;; \ +- esac; \ +- done; \ +- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign genpat/src/Makefile'; \ +- cd $(top_srcdir) && \ +- $(AUTOMAKE) --foreign genpat/src/Makefile +-.PRECIOUS: Makefile +-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +- @case '$?' in \ +- *config.status*) \ +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ +- *) \ +- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ +- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ +- esac; +- +-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +- +-$(top_srcdir)/configure: $(am__configure_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-$(ACLOCAL_M4): $(am__aclocal_m4_deps) +- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +-install-libLTLIBRARIES: $(lib_LTLIBRARIES) +- @$(NORMAL_INSTALL) +- test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" +- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +- if test -f $$p; then \ +- f="`echo $$p | sed -e 's|^.*/||'`"; \ +- echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ +- $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ +- else :; fi; \ +- done +- +-uninstall-libLTLIBRARIES: +- @$(NORMAL_UNINSTALL) +- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +- p="`echo $$p | sed -e 's|^.*/||'`"; \ +- echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ +- $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ +- done +- +-clean-libLTLIBRARIES: +- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) +- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ +- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +- test "$$dir" != "$$p" || dir=.; \ +- echo "rm -f \"$${dir}/so_locations\""; \ +- rm -f "$${dir}/so_locations"; \ +- done +-libPgn.la: $(libPgn_la_OBJECTS) $(libPgn_la_DEPENDENCIES) +- $(LINK) -rpath $(libdir) $(libPgn_la_LDFLAGS) $(libPgn_la_OBJECTS) $(libPgn_la_LIBADD) $(LIBS) +-install-binSCRIPTS: $(bin_SCRIPTS) +- @$(NORMAL_INSTALL) +- test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" +- @list='$(bin_SCRIPTS)'; for p in $$list; do \ +- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ +- if test -f $$d$$p; then \ +- f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ +- echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ +- $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ +- else :; fi; \ +- done +- +-uninstall-binSCRIPTS: +- @$(NORMAL_UNINSTALL) +- @list='$(bin_SCRIPTS)'; for p in $$list; do \ +- f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ +- echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ +- rm -f "$(DESTDIR)$(bindir)/$$f"; \ +- done +- +-mostlyclean-compile: +- -rm -f *.$(OBJEXT) +- +-distclean-compile: +- -rm -f *.tab.c +- +-include ./$(DEPDIR)/AFFECT.Plo +-include ./$(DEPDIR)/ARRAY.Plo +-include ./$(DEPDIR)/CONV.Plo +-include ./$(DEPDIR)/DECLAR.Plo +-include ./$(DEPDIR)/DEF_GEN.Plo +-include ./$(DEPDIR)/GETCPAT.Plo +-include ./$(DEPDIR)/INIT.Plo +-include ./$(DEPDIR)/LABEL.Plo +-include ./$(DEPDIR)/SAVE.Plo +-include ./$(DEPDIR)/SAV_GEN.Plo +-include ./$(DEPDIR)/SETTUNIT.Plo +-include ./$(DEPDIR)/libpat_l.Plo +- +-.c.o: +- if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-# source='$<' object='$@' libtool=no \ +-# depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ +-# $(CCDEPMODE) $(depcomp) \ +-# $(COMPILE) -c $< +- +-.c.obj: +- if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-# source='$<' object='$@' libtool=no \ +-# depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' \ +-# $(CCDEPMODE) $(depcomp) \ +-# $(COMPILE) -c `$(CYGPATH_W) '$<'` +- +-.c.lo: +- if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +-# source='$<' object='$@' libtool=yes \ +-# depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' \ +-# $(CCDEPMODE) $(depcomp) \ +-# $(LTCOMPILE) -c -o $@ $< +- +-mostlyclean-libtool: +- -rm -f *.lo +- +-clean-libtool: +- -rm -rf .libs _libs +- +-distclean-libtool: +- -rm -f libtool +-uninstall-info-am: +-install-includeHEADERS: $(include_HEADERS) +- @$(NORMAL_INSTALL) +- test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" +- @list='$(include_HEADERS)'; for p in $$list; do \ +- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ +- f="`echo $$p | sed -e 's|^.*/||'`"; \ +- echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ +- $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ +- done +- +-uninstall-includeHEADERS: +- @$(NORMAL_UNINSTALL) +- @list='$(include_HEADERS)'; for p in $$list; do \ +- f="`echo $$p | sed -e 's|^.*/||'`"; \ +- echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ +- rm -f "$(DESTDIR)$(includedir)/$$f"; \ +- done +- +-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- mkid -fID $$unique +-tags: TAGS +- +-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ +- test -n "$$unique" || unique=$$empty_fix; \ +- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +- $$tags $$unique; \ +- fi +-ctags: CTAGS +-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ +- $(TAGS_FILES) $(LISP) +- tags=; \ +- here=`pwd`; \ +- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +- unique=`for i in $$list; do \ +- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +- done | \ +- $(AWK) ' { files[$$0] = 1; } \ +- END { for (i in files) print i; }'`; \ +- test -z "$(CTAGS_ARGS)$$tags$$unique" \ +- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ +- $$tags $$unique +- +-GTAGS: +- here=`$(am__cd) $(top_builddir) && pwd` \ +- && cd $(top_srcdir) \ +- && gtags -i $(GTAGS_ARGS) $$here +- +-distclean-tags: +- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +- +-distdir: $(DISTFILES) +- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ +- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ +- list='$(DISTFILES)'; for file in $$list; do \ +- case $$file in \ +- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ +- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ +- esac; \ +- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ +- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ +- if test "$$dir" != "$$file" && test "$$dir" != "."; then \ +- dir="/$$dir"; \ +- $(mkdir_p) "$(distdir)$$dir"; \ +- else \ +- dir=''; \ +- fi; \ +- if test -d $$d/$$file; then \ +- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ +- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ +- fi; \ +- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ +- else \ +- test -f $(distdir)/$$file \ +- || cp -p $$d/$$file $(distdir)/$$file \ +- || exit 1; \ +- fi; \ +- done +-check-am: all-am +-check: check-am +-all-am: Makefile $(LTLIBRARIES) $(SCRIPTS) $(HEADERS) +-installdirs: +- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \ +- test -z "$$dir" || $(mkdir_p) "$$dir"; \ +- done +-install: install-am +-install-exec: install-exec-am +-install-data: install-data-am +-uninstall: uninstall-am +- +-install-am: all-am +- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +- +-installcheck: installcheck-am +-install-strip: +- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +- `test -z '$(STRIP)' || \ +- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +-mostlyclean-generic: +- +-clean-generic: +- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) +- +-distclean-generic: +- -rm -f $(CONFIG_CLEAN_FILES) +- +-maintainer-clean-generic: +- @echo "This command is intended for maintainers to use" +- @echo "it deletes files that may require special tools to rebuild." +-clean: clean-am +- +-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ +- mostlyclean-am +- +-distclean: distclean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-distclean-am: clean-am distclean-compile distclean-generic \ +- distclean-libtool distclean-tags +- +-dvi: dvi-am +- +-dvi-am: +- +-html: html-am +- +-info: info-am +- +-info-am: +- +-install-data-am: install-includeHEADERS +- +-install-exec-am: install-binSCRIPTS install-libLTLIBRARIES +- +-install-info: install-info-am +- +-install-man: +- +-installcheck-am: +- +-maintainer-clean: maintainer-clean-am +- -rm -rf ./$(DEPDIR) +- -rm -f Makefile +-maintainer-clean-am: distclean-am maintainer-clean-generic +- +-mostlyclean: mostlyclean-am +- +-mostlyclean-am: mostlyclean-compile mostlyclean-generic \ +- mostlyclean-libtool +- +-pdf: pdf-am +- +-pdf-am: +- +-ps: ps-am +- +-ps-am: +- +-uninstall-am: uninstall-binSCRIPTS uninstall-includeHEADERS \ +- uninstall-info-am uninstall-libLTLIBRARIES +- +-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ +- clean-libLTLIBRARIES clean-libtool ctags distclean \ +- distclean-compile distclean-generic distclean-libtool \ +- distclean-tags distdir dvi dvi-am html html-am info info-am \ +- install install-am install-binSCRIPTS install-data \ +- install-data-am install-exec install-exec-am \ +- install-includeHEADERS install-info install-info-am \ +- install-libLTLIBRARIES install-man install-strip installcheck \ +- installcheck-am installdirs maintainer-clean \ +- maintainer-clean-generic mostlyclean mostlyclean-compile \ +- mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +- tags uninstall uninstall-am uninstall-binSCRIPTS \ +- uninstall-includeHEADERS uninstall-info-am \ +- uninstall-libLTLIBRARIES +- +- +-genpat : ${srcdir}/genpat.sh +- ${SED} 's,__ALLIANCE_INSTALL_DIR__,$(ALLIANCE_INSTALL_DIR),' $< > $@ +- chmod a+x $@ +-# Tell versions [3.59,3.63) of GNU make to not export all variables. +-# Otherwise a system limit (for SysV at least) may be exceeded. +-.NOEXPORT: +-- +2.5.0 + diff --git a/0002-Update-autostuff.patch b/0002-Update-autostuff.patch new file mode 100644 index 0000000..d188265 --- /dev/null +++ b/0002-Update-autostuff.patch @@ -0,0 +1,191 @@ +From c4b1cb8e7cbf8e36282f42b9307fe46b6cc6a92f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Sun, 28 Feb 2016 10:07:48 +0100 +Subject: [PATCH 02/10] Update autostuff + +--- + alliance/src/Makefile.am | 2 + + alliance/src/autostuff | 123 ++++++++++++++++++++++++----------------------- + 2 files changed, 66 insertions(+), 59 deletions(-) + +diff --git a/alliance/src/Makefile.am b/alliance/src/Makefile.am +index 061389e..e23b5c2 100644 +--- a/alliance/src/Makefile.am ++++ b/alliance/src/Makefile.am +@@ -1,3 +1,5 @@ ++ACLOCAL_AMFLAGS = -I. ++ + SUBDIRS = @TOOLSDIRS@ + + EXTRA_DIST = autostuff alliance.m4 motif.m4 oldgcc.m4 xpm.m4 build depcomp \ +diff --git a/alliance/src/autostuff b/alliance/src/autostuff +index 53083eb..2955c8b 100755 +--- a/alliance/src/autostuff ++++ b/alliance/src/autostuff +@@ -89,38 +89,40 @@ ordered_dirs="$ordered_dirs $dirs" + + AC_OUTPUT=`find $ordered_dirs -name Makefile.am | sed "s,\.am,,"` + +-rm -f configure.in +-echo "" >> configure.in +-echo "AC_INIT(./autostuff)" >> configure.in +-echo "AM_INIT_AUTOMAKE(alliance, 5.0)" >> configure.in +-echo "" >> configure.in +-echo "AM_PROG_LEX" >> configure.in +-echo "AM_PROG_LIBTOOL" >> configure.in +-echo "AC_CHECK_HEADERS(fcntl.h malloc.h strings.h sys/time.h unistd.h)" >> configure.in +-echo "AC_CHECK_HEADERS(strings.h unistd.h)" >> configure.in +-echo "AC_CHECK_LIB(gen, basename)" >> configure.in +-echo "AC_CHECK_LIB(iberty, basename)" >> configure.in +-echo "AC_CHECK_LIB(m, exp)" >> configure.in +-echo "AC_CHECK_LIB(m, floor)" >> configure.in +-echo "AC_CHECK_LIB(m, pow)" >> configure.in +-echo "AC_CHECK_LIB(m, sqrt)" >> configure.in +-echo "AC_CHECK_PROG(SED, sed, sed)" >> configure.in +-echo "AC_CHECK_PROGS(SED, gsed sed)" >> configure.in +-echo "AC_C_CONST" >> configure.in +-echo "AC_FUNC_VFORK" >> configure.in +-echo "AC_HEADER_STDC" >> configure.in +-echo "AC_HEADER_SYS_WAIT" >> configure.in +-echo "AC_PATH_XTRA" >> configure.in +-echo "AC_PROG_CC" >> configure.in +-echo "AC_PROG_CPP" >> configure.in +-echo "AC_PROG_CXX" >> configure.in +-echo "AC_PROG_INSTALL" >> configure.in +-echo "AC_PROG_MAKE_SET" >> configure.in +-echo "AC_PROG_LIBTOOL" >> configure.in +-echo "AC_PROG_YACC" >> configure.in +-echo "AC_TYPE_SIGNAL" >> configure.in ++rm -f configure.ac ++echo "" >> configure.ac ++echo "AC_INIT(alliance,5.0)" >> configure.ac ++echo "AC_CONFIG_SRCDIR(./autostuff)" >> configure.ac ++echo "AM_INIT_AUTOMAKE(foreign)" >> configure.ac ++echo "AC_CONFIG_MACRO_DIRS([.])" >> configure.ac ++echo "" >> configure.ac ++echo "AM_PROG_LEX" >> configure.ac ++echo "AM_PROG_LIBTOOL" >> configure.ac ++echo "AC_CHECK_HEADERS(fcntl.h malloc.h strings.h sys/time.h unistd.h)" >> configure.ac ++echo "AC_CHECK_HEADERS(strings.h unistd.h)" >> configure.ac ++echo "AC_CHECK_LIB(gen, basename)" >> configure.ac ++echo "AC_CHECK_LIB(iberty, basename)" >> configure.ac ++echo "AC_CHECK_LIB(m, exp)" >> configure.ac ++echo "AC_CHECK_LIB(m, floor)" >> configure.ac ++echo "AC_CHECK_LIB(m, pow)" >> configure.ac ++echo "AC_CHECK_LIB(m, sqrt)" >> configure.ac ++echo "AC_CHECK_PROG(SED, sed, sed)" >> configure.ac ++echo "AC_CHECK_PROGS(SED, gsed sed)" >> configure.ac ++echo "AC_C_CONST" >> configure.ac ++echo "AC_FUNC_VFORK" >> configure.ac ++echo "AC_HEADER_STDC" >> configure.ac ++echo "AC_HEADER_SYS_WAIT" >> configure.ac ++echo "AC_PATH_XTRA" >> configure.ac ++echo "AC_PROG_CC" >> configure.ac ++echo "AC_PROG_CPP" >> configure.ac ++echo "AC_PROG_CXX" >> configure.ac ++echo "AC_PROG_INSTALL" >> configure.ac ++echo "AC_PROG_MAKE_SET" >> configure.ac ++echo "AC_PROG_LIBTOOL" >> configure.ac ++echo "AC_PROG_YACC" >> configure.ac ++echo "AC_TYPE_SIGNAL" >> configure.ac + +-cat >> configure.in <<"EOF" ++cat >> configure.ac <<"EOF" + dnl + dnl Check for X stuff + dnl +@@ -283,60 +285,63 @@ LDFLAGS="$ice_save_LDFLAGS" + fi + EOF + +-echo "AM_ALLIANCE" >> configure.in +-echo "AM_CONDITIONAL([ALLIANCE_BUILD],[(exit 0)])" >> configure.in ++echo "AM_ALLIANCE" >> configure.ac ++echo "AM_CONDITIONAL([ALLIANCE_BUILD],[(exit 0)])" >> configure.ac + + find $ordered_dirs -name configure.in | while read config; do + echo "Scanning $config" +- echo "" >> configure.in +- echo "dnl Infos extracted from $config" >> configure.in ++ echo "" >> configure.ac ++ echo "dnl Infos extracted from $config" >> configure.ac + + for version_line in `grep -ah _CUR= $config`; do +- echo "$version_line" >> configure.in ++ echo "$version_line" >> configure.ac + version_name=`echo $version_line | sed 's,=.*,,'` +- echo "AC_SUBST($version_name)" >> configure.in ++ echo "AC_SUBST($version_name)" >> configure.ac + done + for version_line in `grep -ah _REV= $config`; do +- echo "$version_line" >> configure.in ++ echo "$version_line" >> configure.ac + version_name=`echo $version_line | sed 's,=.*,,'` +- echo "AC_SUBST($version_name)" >> configure.in ++ echo "AC_SUBST($version_name)" >> configure.ac + done + for version_line in `grep -ah _REL= $config`; do +- echo "$version_line" >> configure.in ++ echo "$version_line" >> configure.ac + version_name=`echo $version_line | sed 's,=.*,,'` +- echo "AC_SUBST($version_name)" >> configure.in ++ echo "AC_SUBST($version_name)" >> configure.ac + done + + for dll_line in `grep -ah _DLL_VERSION= $config`; do +- echo "$dll_line" >> configure.in ++ echo "$dll_line" >> configure.ac + dll_name=`echo $dll_line | sed 's,=.*,,'` +- echo "AC_SUBST($dll_name)" >> configure.in ++ echo "AC_SUBST($dll_name)" >> configure.ac + done + for version_line in `grep -ah _VERSION= $config | grep -v DLL`; do +- echo "$version_line" >> configure.in ++ echo "$version_line" >> configure.ac + version_name=`echo $version_line | sed 's,=.*,,'` +- echo "AC_SUBST($version_name)" >> configure.in ++ echo "AC_SUBST($version_name)" >> configure.ac + done + done + +-echo "" >> configure.in +-echo "TOOLSDIRS=\"$ordered_dirs\"" >> configure.in +-echo "AC_SUBST(TOOLSDIRS)" >> configure.in ++echo "" >> configure.ac ++echo "TOOLSDIRS=\"$ordered_dirs\"" >> configure.ac ++echo "AC_SUBST(TOOLSDIRS)" >> configure.ac + +-echo "" >> configure.in +-echo "AC_OUTPUT([" >> configure.in +-echo "Makefile" >> configure.in +-echo "distrib/etc/alc_env.sh" >> configure.in +-echo "distrib/etc/alc_env.csh" >> configure.in ++echo "" >> configure.ac ++echo "# HACK: Set to empty." >> configure.ac ++echo "AC_SUBST([ALLIANCE_LIB],[ ])" >> configure.ac ++echo "AC_SUBST([ALLIANCE_CFLAGS],[ ])" >> configure.ac ++echo "AC_SUBST([ALLIANCE_TOP],[ ])" >> configure.ac ++ ++echo "" >> configure.ac ++echo "AC_OUTPUT([" >> configure.ac ++echo "Makefile" >> configure.ac ++echo "distrib/etc/alc_env.sh" >> configure.ac ++echo "distrib/etc/alc_env.csh" >> configure.ac + for template in $AC_OUTPUT; do +- echo "$template" >> configure.in ++ echo "$template" >> configure.ac + done +-echo "])" >> configure.in ++echo "])" >> configure.ac + + +-aclocal -I . +-libtoolize --force --copy --automake +-automake --foreign --add-missing --copy +-autoconf ++autoreconf -fi + + exit 0 +-- +2.5.0 + diff --git a/0003-Consolidate-installation-dirs.patch b/0003-Consolidate-installation-dirs.patch new file mode 100644 index 0000000..26fe6ee --- /dev/null +++ b/0003-Consolidate-installation-dirs.patch @@ -0,0 +1,151 @@ +From 9397e394dfbb0162236e85d6046862fb7e9bae58 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Mon, 29 Feb 2016 14:49:22 +0100 +Subject: [PATCH 03/10] Consolidate installation dirs + +--- + alliance/src/cells/src/dp_sxlib/Makefile.am | 2 +- + alliance/src/cells/src/mpxlib/Makefile.am | 2 +- + alliance/src/cells/src/msxlib/Makefile.am | 2 +- + alliance/src/cells/src/padlib/Makefile.am | 2 +- + alliance/src/cells/src/pxlib/Makefile.am | 2 +- + alliance/src/cells/src/ramlib/Makefile.am | 2 +- + alliance/src/cells/src/rf2lib/Makefile.am | 2 +- + alliance/src/cells/src/rflib/Makefile.am | 2 +- + alliance/src/cells/src/romlib/Makefile.am | 2 +- + alliance/src/cells/src/sxlib/Makefile.am | 14 +++++++------- + 10 files changed, 16 insertions(+), 16 deletions(-) + +diff --git a/alliance/src/cells/src/dp_sxlib/Makefile.am b/alliance/src/cells/src/dp_sxlib/Makefile.am +index 58fa1a2..5d1b32f 100644 +--- a/alliance/src/cells/src/dp_sxlib/Makefile.am ++++ b/alliance/src/cells/src/dp_sxlib/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.4 2002/05/08 21:07:13 jpc Exp $ + +-dp_sxlibdir=$(prefix)/cells/dp_sxlib ++dp_sxlibdir=$(pkgdatadir)/cells/dp_sxlib + + dp_sxlib_DATA=CATAL dp_dff_scan_x4.ap dp_dff_scan_x4.vbe dp_dff_scan_x4_buf.ap dp_dff_scan_x4_buf.vbe dp_dff_x4.ap dp_dff_x4.vbe dp_dff_x4_buf.ap dp_dff_x4_buf.vbe dp_mux_x2.ap dp_mux_x2.vbe dp_mux_x2_buf.ap dp_mux_x2_buf.vbe dp_mux_x4.ap dp_mux_x4.vbe dp_mux_x4_buf.ap dp_mux_x4_buf.vbe dp_nmux_x1.ap dp_nmux_x1.vbe dp_nmux_x1_buf.ap dp_nmux_x1_buf.vbe dp_nts_x2.ap dp_nts_x2.vbe dp_nts_x2_buf.ap dp_nts_x2_buf.vbe dp_rom2_buf.ap dp_rom2_buf.vbe dp_rom4_buf.ap dp_rom4_buf.vbe dp_rom4_nxr2_x4.ap dp_rom4_nxr2_x4.vbe dp_rom4_xr2_x4.ap dp_rom4_xr2_x4.vbe dp_sff_scan_x4.ap dp_sff_scan_x4.vbe dp_sff_scan_x4_buf.ap dp_sff_scan_x4_buf.vbe dp_sff_x4.ap dp_sff_x4.vbe dp_sff_x4_buf.ap dp_sff_x4_buf.vbe dp_sxlib.lef dp_ts_x4.ap dp_ts_x4.vbe dp_ts_x4_buf.ap dp_ts_x4_buf.vbe dp_ts_x8.ap dp_ts_x8.vbe dp_ts_x8_buf.ap dp_ts_x8_buf.vbe + +diff --git a/alliance/src/cells/src/mpxlib/Makefile.am b/alliance/src/cells/src/mpxlib/Makefile.am +index 9469aab..47166af 100644 +--- a/alliance/src/cells/src/mpxlib/Makefile.am ++++ b/alliance/src/cells/src/mpxlib/Makefile.am +@@ -1,5 +1,5 @@ + +-mpxlibdir=$(prefix)/cells/mpxlib ++mpxlibdir=$(pkgdatadir)/cells/mpxlib + + mpxlib_DATA=CATAL \ + pck_mpx.ap \ +diff --git a/alliance/src/cells/src/msxlib/Makefile.am b/alliance/src/cells/src/msxlib/Makefile.am +index d67fc5b..5300de0 100644 +--- a/alliance/src/cells/src/msxlib/Makefile.am ++++ b/alliance/src/cells/src/msxlib/Makefile.am +@@ -1,5 +1,5 @@ + +-msxlibdir=$(prefix)/cells/msxlib ++msxlibdir=$(pkgdatadir)/cells/msxlib + + msxlib_DATA=CATAL \ + an2_x05.ap \ +diff --git a/alliance/src/cells/src/padlib/Makefile.am b/alliance/src/cells/src/padlib/Makefile.am +index 9b14265..b28a371 100644 +--- a/alliance/src/cells/src/padlib/Makefile.am ++++ b/alliance/src/cells/src/padlib/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.4 2002/05/08 21:07:24 jpc Exp $ + +-padlibdir=$(prefix)/cells/padlib ++padlibdir=$(pkgdatadir)/cells/padlib + + padlib_DATA=CATAL corner_sp.ap corner_sp.vbe padreal.ap padreal.cif padsymb.db palck_sp.ap pali_sp.ap paliot_sp.ap paliotw_sp.ap palo_sp.ap palot_sp.ap palotw_sp.ap palow_sp.ap palvdde_sp.ap palvddeck_sp.ap palvddi_sp.ap palvddick_sp.ap palvsse_sp.ap palvsseck_sp.ap palvssi_sp.ap palvssick_sp.ap pck_sp.al pck_sp.ap pck_sp.vbe pi_sp.al pi_sp.ap pi_sp.vbe piot_sp.al piot_sp.ap piot_sp.vbe piotw_sp.al piotw_sp.ap piotw_sp.vbe po_sp.al po_sp.ap po_sp.vbe pot_sp.al pot_sp.ap pot_sp.vbe potw_sp.al potw_sp.ap potw_sp.vbe pow_sp.al pow_sp.ap pow_sp.vbe pvdde_sp.al pvdde_sp.ap pvdde_sp.vbe pvddeck_sp.al pvddeck_sp.ap pvddeck_sp.vbe pvddi_sp.al pvddi_sp.ap pvddi_sp.vbe pvddick_sp.al pvddick_sp.ap pvddick_sp.vbe pvsse_sp.al pvsse_sp.ap pvsse_sp.vbe pvsseck_sp.al pvsseck_sp.ap pvsseck_sp.vbe pvssi_sp.al pvssi_sp.ap pvssi_sp.vbe pvssick_sp.al pvssick_sp.ap pvssick_sp.vbe + +diff --git a/alliance/src/cells/src/pxlib/Makefile.am b/alliance/src/cells/src/pxlib/Makefile.am +index 3a2ed65..d0f631f 100644 +--- a/alliance/src/cells/src/pxlib/Makefile.am ++++ b/alliance/src/cells/src/pxlib/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.2 2005/11/08 10:13:51 franck Exp $ + +-pxlibdir=$(prefix)/cells/pxlib ++pxlibdir=$(pkgdatadir)/cells/pxlib + + pxlib_DATA=CATAL \ + pck_px.ap \ +diff --git a/alliance/src/cells/src/ramlib/Makefile.am b/alliance/src/cells/src/ramlib/Makefile.am +index 66febd9..63a92ff 100644 +--- a/alliance/src/cells/src/ramlib/Makefile.am ++++ b/alliance/src/cells/src/ramlib/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.1 2002/07/15 22:23:32 jpc Exp $ + +-ramlibdir = $(prefix)/cells/ramlib ++ramlibdir = $(pkgdatadir)/cells/ramlib + + ramlib_DATA = ramlib.lef \ + CATAL \ +diff --git a/alliance/src/cells/src/rf2lib/Makefile.am b/alliance/src/cells/src/rf2lib/Makefile.am +index fd9318a..fc80cd3 100644 +--- a/alliance/src/cells/src/rf2lib/Makefile.am ++++ b/alliance/src/cells/src/rf2lib/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.2 2004/09/29 21:50:28 jpc Exp $ + +-rf2libdir=$(prefix)/cells/rf2lib ++rf2libdir=$(pkgdatadir)/cells/rf2lib + + rf2lib_DATA=CATAL \ + rf2lib.lef \ +diff --git a/alliance/src/cells/src/rflib/Makefile.am b/alliance/src/cells/src/rflib/Makefile.am +index 33ee5ac..6f8ffa7 100644 +--- a/alliance/src/cells/src/rflib/Makefile.am ++++ b/alliance/src/cells/src/rflib/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.4 2002/05/08 21:07:24 jpc Exp $ + +-rflibdir=$(prefix)/cells/rflib ++rflibdir=$(pkgdatadir)/cells/rflib + + rflib_DATA=CATAL rf_dec_bufad0.ap rf_dec_bufad0.vbe rf_dec_bufad1.ap rf_dec_bufad1.vbe rf_dec_bufad2.ap rf_dec_bufad2.vbe rf_dec_nand2.ap rf_dec_nand2.vbe rf_dec_nand3.ap rf_dec_nand3.vbe rf_dec_nand4.ap rf_dec_nand4.vbe rf_dec_nao3.ap rf_dec_nao3.vbe rf_dec_nbuf.ap rf_dec_nbuf.vbe rf_dec_nor3.ap rf_dec_nor3.vbe rf_fifo_buf.ap rf_fifo_buf.vbe rf_fifo_clock.ap rf_fifo_clock.vbe rf_fifo_empty.ap rf_fifo_empty.vbe rf_fifo_full.ap rf_fifo_full.vbe rf_fifo_inc.ap rf_fifo_inc.vbe rf_fifo_nop.ap rf_fifo_nop.vbe rf_fifo_ok.ap rf_fifo_ok.vbe rf_fifo_orand4.ap rf_fifo_orand4.vbe rf_fifo_orand5.ap rf_fifo_orand5.vbe rf_fifo_ptreset.ap rf_fifo_ptreset.vbe rf_fifo_ptset.ap rf_fifo_ptset.vbe rf_inmux_buf_2.ap rf_inmux_buf_2.vbe rf_inmux_buf_4.ap rf_inmux_buf_4.vbe rf_inmux_mem.ap rf_inmux_mem.vbe rf_mid_buf_2.ap rf_mid_buf_2.vbe rf_mid_buf_4.ap rf_mid_buf_4.vbe rf_mid_mem.ap rf_mid_mem.vbe rf_mid_mem_r0.ap rf_mid_mem_r0.vbe rf_out_buf_2.ap rf_out_buf_2.vbe rf_out_buf_4.ap rf_out_buf_4.vbe rf_out_mem.ap rf_out_mem.vbe rflib.lef + +diff --git a/alliance/src/cells/src/romlib/Makefile.am b/alliance/src/cells/src/romlib/Makefile.am +index 578081e..b9ae364 100644 +--- a/alliance/src/cells/src/romlib/Makefile.am ++++ b/alliance/src/cells/src/romlib/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.2 2006/06/07 19:20:03 jpc Exp $ + +-romlibdir = $(prefix)/cells/romlib ++romlibdir = $(pkgdatadir)/cells/romlib + + romlib_DATA = romlib.lef \ + CATAL \ +diff --git a/alliance/src/cells/src/sxlib/Makefile.am b/alliance/src/cells/src/sxlib/Makefile.am +index fdadefe..ef8957c 100644 +--- a/alliance/src/cells/src/sxlib/Makefile.am ++++ b/alliance/src/cells/src/sxlib/Makefile.am +@@ -1,12 +1,12 @@ + # $Id: Makefile.am,v 1.5 2002/05/08 21:07:24 jpc Exp $ + +-sxlibvbedir=$(prefix)/cells/sxlib +-sxlibapdir=$(prefix)/cells/sxlib +-sxlibaldir=$(prefix)/cells/sxlib +-sxlibdatdir=$(prefix)/cells/sxlib +-sxlibvhddir=$(prefix)/cells/sxlib +-sxlibetcdir=$(prefix)/cells/sxlib +-sxlibsymdir=$(prefix)/cells/sxlib ++sxlibvbedir=$(pkgdatadir)/cells/sxlib ++sxlibapdir=$(pkgdatadir)/cells/sxlib ++sxlibaldir=$(pkgdatadir)/cells/sxlib ++sxlibdatdir=$(pkgdatadir)/cells/sxlib ++sxlibvhddir=$(pkgdatadir)/cells/sxlib ++sxlibetcdir=$(pkgdatadir)/cells/sxlib ++sxlibsymdir=$(pkgdatadir)/cells/sxlib + + sxlibvbe_DATA = a2_x2.vbe a2_x4.vbe a3_x2.vbe a3_x4.vbe \ + a4_x2.vbe a4_x4.vbe an12_x1.vbe an12_x4.vbe ao22_x2.vbe \ +-- +2.5.0 + diff --git a/0004-Misc-installation-dirs-fixes.patch b/0004-Misc-installation-dirs-fixes.patch new file mode 100644 index 0000000..947f9e3 --- /dev/null +++ b/0004-Misc-installation-dirs-fixes.patch @@ -0,0 +1,316 @@ +From d0a8e157bca76b7686d632e15f6360e549241dbf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Mon, 29 Feb 2016 14:53:11 +0100 +Subject: [PATCH 04/10] Misc installation dirs fixes. + +--- + alliance/src/attila/doc/Makefile.am | 1 - + alliance/src/attila/doc/attila/Makefile.am | 5 +---- + alliance/src/attila/etc/Makefile.am | 2 +- + alliance/src/distrib/etc/Makefile.am | 4 ++-- + alliance/src/documentation/Makefile.am | 5 +---- + alliance/src/documentation/tutorials/Makefile.am | 2 +- + alliance/src/dreal/etc/Makefile.am | 2 +- + alliance/src/elp/etc/Makefile.am | 2 +- + alliance/src/genlib/doc/Makefile.am | 1 - + alliance/src/genlib/doc/genlib/Makefile.am | 2 +- + alliance/src/graal/etc/Makefile.am | 2 +- + alliance/src/mbk/etc/Makefile.am | 2 +- + alliance/src/nero/doc/Makefile.am | 1 - + alliance/src/nero/doc/nero/Makefile.am | 5 +---- + alliance/src/rds/etc/Makefile.am | 2 +- + alliance/src/scapin/etc/Makefile.am | 2 +- + alliance/src/sea/etc/Makefile.am | 2 +- + alliance/src/xfsm/etc/Makefile.am | 2 +- + alliance/src/xgra/etc/Makefile.am | 2 +- + alliance/src/xpat/etc/Makefile.am | 2 +- + alliance/src/xsch/etc/Makefile.am | 2 +- + alliance/src/xvpn/etc/Makefile.am | 2 +- + 22 files changed, 20 insertions(+), 32 deletions(-) + +diff --git a/alliance/src/attila/doc/Makefile.am b/alliance/src/attila/doc/Makefile.am +index ff3f0f1..46665bd 100644 +--- a/alliance/src/attila/doc/Makefile.am ++++ b/alliance/src/attila/doc/Makefile.am +@@ -1,7 +1,6 @@ + + SUBDIRS = attila man1 + +-pdfdir = $(prefix)/doc/pdf + pdf_DATA = attila.pdf + + EXTRA_DIST = $(pdf_DATA) \ +diff --git a/alliance/src/attila/doc/attila/Makefile.am b/alliance/src/attila/doc/attila/Makefile.am +index d342379..86e7e1e 100644 +--- a/alliance/src/attila/doc/attila/Makefile.am ++++ b/alliance/src/attila/doc/attila/Makefile.am +@@ -1,12 +1,9 @@ + + +-pkghtmldir = $(prefix)/doc/html/@PACKAGE@ ++pkghtmldir = $(htmldir)/@PACKAGE@ + pkghtml_DATA = \ + ./attila.html \ + ./ref_attila.html \ + ./man_attila.html + + EXTRA_DIST = $(pkghtml_DATA) +- +-install-data-hook: +- find $(DESTDIR)$(prefix)/doc/html/@PACKAGE@ -type f | xargs chmod g+w +diff --git a/alliance/src/attila/etc/Makefile.am b/alliance/src/attila/etc/Makefile.am +index b69a787..0902c40 100644 +--- a/alliance/src/attila/etc/Makefile.am ++++ b/alliance/src/attila/etc/Makefile.am +@@ -1,4 +1,4 @@ +-etcdir = $(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA = attila.conf + +diff --git a/alliance/src/distrib/etc/Makefile.am b/alliance/src/distrib/etc/Makefile.am +index 39d2d29..f84b52b 100644 +--- a/alliance/src/distrib/etc/Makefile.am ++++ b/alliance/src/distrib/etc/Makefile.am +@@ -1,7 +1,7 @@ + # $Id: Makefile.am,v 1.9 2012/05/03 15:32:24 jpc Exp $ + +-etcdir=$(sysconfdir)/profile.d ++profileddir=$(sysconfdir)/profile.d + +-etc_SCRIPTS=alc_env.csh alc_env.sh ++profiled_DATA=alc_env.csh alc_env.sh + + EXTRA_DIST=alc_env.csh.in alc_env.sh.in +diff --git a/alliance/src/documentation/Makefile.am b/alliance/src/documentation/Makefile.am +index f937897..5a2c299 100644 +--- a/alliance/src/documentation/Makefile.am ++++ b/alliance/src/documentation/Makefile.am +@@ -1,9 +1,6 @@ + + SUBDIRS = tutorials + +- +-docdir = $(prefix)/doc +- + nobase_doc_DATA = overview/datapath.gif \ + overview/genview.gif \ + overview/graal.gif \ +@@ -51,7 +48,7 @@ nobase_doc_DATA = overview/datapath.gif \ + design-flow/xpat.gif \ + design-flow/xsch.gif + +-examplesdir = $(prefix)/examples ++examplesdir = $(docdir)/examples + + nobase_examples_DATA = regression.sh \ + alliance-examples/go-all.sh \ +diff --git a/alliance/src/documentation/tutorials/Makefile.am b/alliance/src/documentation/tutorials/Makefile.am +index f97c255..547c094 100644 +--- a/alliance/src/documentation/tutorials/Makefile.am ++++ b/alliance/src/documentation/tutorials/Makefile.am +@@ -1,5 +1,5 @@ + +-tutorialsdir = $(prefix)/tutorials ++tutorialsdir = $(docdir)/tutorials + + nobase_tutorials_DATA = place_and_route/src/Makefile \ + place_and_route/src/amd2901/Makefile \ +diff --git a/alliance/src/dreal/etc/Makefile.am b/alliance/src/dreal/etc/Makefile.am +index debdb76..3e3d097 100644 +--- a/alliance/src/dreal/etc/Makefile.am ++++ b/alliance/src/dreal/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.5 2002/05/08 21:07:25 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=cmos.dreal + +diff --git a/alliance/src/elp/etc/Makefile.am b/alliance/src/elp/etc/Makefile.am +index b8ef276..c833a67 100644 +--- a/alliance/src/elp/etc/Makefile.am ++++ b/alliance/src/elp/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.5 2002/05/08 21:07:25 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=prol.elp + +diff --git a/alliance/src/genlib/doc/Makefile.am b/alliance/src/genlib/doc/Makefile.am +index ec53916..b4e44c5 100644 +--- a/alliance/src/genlib/doc/Makefile.am ++++ b/alliance/src/genlib/doc/Makefile.am +@@ -1,7 +1,6 @@ + + SUBDIRS = genlib + +-pdfdir = $(prefix)/doc/pdf + pdf_DATA = genlib.pdf + + EXTRA_DIST = $(pdf_DATA) \ +diff --git a/alliance/src/genlib/doc/genlib/Makefile.am b/alliance/src/genlib/doc/genlib/Makefile.am +index 448eabb..b398869 100644 +--- a/alliance/src/genlib/doc/genlib/Makefile.am ++++ b/alliance/src/genlib/doc/genlib/Makefile.am +@@ -1,6 +1,6 @@ + + +-pkghtmldir = $(prefix)/doc/html/@PACKAGE@ ++pkghtmldir = $(htmldir)/@PACKAGE@ + pkghtml_DATA = \ + ./genlib.html \ + ./ref_genlib.html \ +diff --git a/alliance/src/graal/etc/Makefile.am b/alliance/src/graal/etc/Makefile.am +index 3ca5068..dfec7cb 100644 +--- a/alliance/src/graal/etc/Makefile.am ++++ b/alliance/src/graal/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.6 2002/05/08 21:07:25 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=cmos.graal + +diff --git a/alliance/src/mbk/etc/Makefile.am b/alliance/src/mbk/etc/Makefile.am +index 2e75ab1..ba1b61d 100644 +--- a/alliance/src/mbk/etc/Makefile.am ++++ b/alliance/src/mbk/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.4 2002/05/08 21:07:25 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=spimodel.cfg + +diff --git a/alliance/src/nero/doc/Makefile.am b/alliance/src/nero/doc/Makefile.am +index 0c33137..56d01bc 100644 +--- a/alliance/src/nero/doc/Makefile.am ++++ b/alliance/src/nero/doc/Makefile.am +@@ -1,7 +1,6 @@ + + SUBDIRS = nero man1 + +-pdfdir = $(prefix)/doc/pdf + pdf_DATA = nero.pdf + + EXTRA_DIST = $(pdf_DATA) \ +diff --git a/alliance/src/nero/doc/nero/Makefile.am b/alliance/src/nero/doc/nero/Makefile.am +index 11d58e1..8e29a17 100644 +--- a/alliance/src/nero/doc/nero/Makefile.am ++++ b/alliance/src/nero/doc/nero/Makefile.am +@@ -1,12 +1,9 @@ + + +-pkghtmldir = $(prefix)/doc/html/@PACKAGE@ ++pkghtmldir = $(htmldir)/@PACKAGE@ + pkghtml_DATA = \ + ./nero.html \ + ./ref_nero.html \ + ./man_nero.html + + EXTRA_DIST = $(pkghtml_DATA) +- +-install-data-hook: +- find $(DESTDIR)$(prefix)/doc/html/@PACKAGE@ -type f | xargs chmod g+w +diff --git a/alliance/src/rds/etc/Makefile.am b/alliance/src/rds/etc/Makefile.am +index d5cca76..fac05cd 100644 +--- a/alliance/src/rds/etc/Makefile.am ++++ b/alliance/src/rds/etc/Makefile.am +@@ -1,5 +1,5 @@ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=cmos.rds scn6m_deep_09.rds + +diff --git a/alliance/src/scapin/etc/Makefile.am b/alliance/src/scapin/etc/Makefile.am +index 9684d1f..ddb68bd 100644 +--- a/alliance/src/scapin/etc/Makefile.am ++++ b/alliance/src/scapin/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.5 2002/05/08 21:07:26 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=sxlib.scapin + +diff --git a/alliance/src/sea/etc/Makefile.am b/alliance/src/sea/etc/Makefile.am +index d1f3aca..fab246b 100644 +--- a/alliance/src/sea/etc/Makefile.am ++++ b/alliance/src/sea/etc/Makefile.am +@@ -1,4 +1,4 @@ +-etcdir = $(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA = se_defaults.mac cmos.lef + +diff --git a/alliance/src/xfsm/etc/Makefile.am b/alliance/src/xfsm/etc/Makefile.am +index 2b35b64..63387be 100644 +--- a/alliance/src/xfsm/etc/Makefile.am ++++ b/alliance/src/xfsm/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.5 2002/05/08 21:07:26 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=xfsm.par + +diff --git a/alliance/src/xgra/etc/Makefile.am b/alliance/src/xgra/etc/Makefile.am +index 4c9feb5..37edcd1 100644 +--- a/alliance/src/xgra/etc/Makefile.am ++++ b/alliance/src/xgra/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.1 2007/11/27 20:41:31 ludo Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=xgra.par + +diff --git a/alliance/src/xpat/etc/Makefile.am b/alliance/src/xpat/etc/Makefile.am +index 8f2fa0d..43175c2 100644 +--- a/alliance/src/xpat/etc/Makefile.am ++++ b/alliance/src/xpat/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.6 2002/05/08 21:07:26 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=xpat.par + +diff --git a/alliance/src/xsch/etc/Makefile.am b/alliance/src/xsch/etc/Makefile.am +index 973ab38..2d88390 100644 +--- a/alliance/src/xsch/etc/Makefile.am ++++ b/alliance/src/xsch/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.5 2002/05/08 21:07:26 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=xsch.par + +diff --git a/alliance/src/xvpn/etc/Makefile.am b/alliance/src/xvpn/etc/Makefile.am +index ba70004..f28560a 100644 +--- a/alliance/src/xvpn/etc/Makefile.am ++++ b/alliance/src/xvpn/etc/Makefile.am +@@ -1,6 +1,6 @@ + # $Id: Makefile.am,v 1.5 2002/05/08 21:07:26 jpc Exp $ + +-etcdir=$(prefix)/etc ++etcdir=$(sysconfdir)/alliance + + etc_DATA=xvpn.par + +-- +2.5.0 + diff --git a/0005-Use-inttypes-macros-to-print-int32_t.patch b/0005-Use-inttypes-macros-to-print-int32_t.patch new file mode 100644 index 0000000..f3c2d4b --- /dev/null +++ b/0005-Use-inttypes-macros-to-print-int32_t.patch @@ -0,0 +1,36 @@ +From 5305097fa027775bc96ae58e0e938a1ef85f1fff Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Sun, 28 Feb 2016 09:33:27 +0100 +Subject: [PATCH 05/10] Use inttypes-macros to print int32_t. + +--- + alliance/src/rds/src/gds_parse.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/alliance/src/rds/src/gds_parse.c b/alliance/src/rds/src/gds_parse.c +index dfa2239..18e4ec6 100644 +--- a/alliance/src/rds/src/gds_parse.c ++++ b/alliance/src/rds/src/gds_parse.c +@@ -21,6 +21,7 @@ + # include + # include + # include ++# include + + # include + # include +@@ -742,9 +743,9 @@ FILE *fp; + } + } + if ((coord_nb < 5) || (ispolyrec(coord_tab, coord_nb) == 0)) { +- sprintf(texte, "(%ld, %ld", coord_tab[0].X, coord_tab[0].Y); ++ sprintf(texte, "(%" PRId32 ", %" PRId32 "", coord_tab[0].X, coord_tab[0].Y); + for (i = 1; i < coord_nb; i++) +- sprintf(&texte[strlen(texte)], ", %ld, %ld", coord_tab[i].X, coord_tab[i].Y); ++ sprintf(&texte[strlen(texte)], ", %" PRId32 ", %" PRId32 "", coord_tab[i].X, coord_tab[i].Y); + strcat(texte, ")"); + pv_emet_warning(pv_model->NAME, "Non rectangle polygon here", texte); + FLAG = -1; +-- +2.5.0 + diff --git a/0006-Use-ring_yy-instead-of-yy.patch b/0006-Use-ring_yy-instead-of-yy.patch new file mode 100644 index 0000000..9b1f7f1 --- /dev/null +++ b/0006-Use-ring_yy-instead-of-yy.patch @@ -0,0 +1,77 @@ +From b689820c62058c0e3b205efc0d604e15a128a5d4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Sun, 28 Feb 2016 09:31:44 +0100 +Subject: [PATCH 06/10] Use ring_yy instead of yy. + +--- + alliance/src/ring/src/lireplace.c | 2 +- + alliance/src/ring/src/ringram.y | 9 +++++++++ + alliance/src/ring/src/rinscan.l | 4 ++-- + alliance/src/ring/src/struct.h | 4 ++-- + 4 files changed, 14 insertions(+), 5 deletions(-) + +diff --git a/alliance/src/ring/src/lireplace.c b/alliance/src/ring/src/lireplace.c +index 296bb03..b057784 100644 +--- a/alliance/src/ring/src/lireplace.c ++++ b/alliance/src/ring/src/lireplace.c +@@ -100,7 +100,7 @@ void lecture_fic(char *nomfic, lofig_list *circuit_lo, + if (mode_debug) + printf("Avant analyse lex et yacc \n"); + +- yyin = mbkfopen(nomfic, NULL, READ_TEXT); ++ ring_yyin = mbkfopen(nomfic, NULL, READ_TEXT); + + /* ------------------------------------------------------------------ */ + /* lancement de lex et yacc pour interpreter le fichier de parametres */ +diff --git a/alliance/src/ring/src/ringram.y b/alliance/src/ring/src/ringram.y +index 1bb548c..677bd52 100644 +--- a/alliance/src/ring/src/ringram.y ++++ b/alliance/src/ring/src/ringram.y +@@ -51,3 +51,12 @@ lnomchiffre: lnomchiffre IDENT NOMBRE { declaration_width($2,$3);if (mode_debug) + | IDENT NOMBRE { declaration_width($1,$2);if (mode_debug) printf("yacc lnomchiffre \n");} + ; + ++%% ++ ++ ++void ++yyerror (char const *s) ++{ ++ ++ fprintf (stderr, "%s\n", s); ++} +diff --git a/alliance/src/ring/src/rinscan.l b/alliance/src/ring/src/rinscan.l +index 2c74c9e..a98e354 100644 +--- a/alliance/src/ring/src/rinscan.l ++++ b/alliance/src/ring/src/rinscan.l +@@ -24,10 +24,10 @@ comment [#]({lettre}*{chiffre}*{esp}*{pct}*)*{rc} + "west" {if (mode_debug) ECHO; return(M_WEST) ;} + "east" {if (mode_debug) ECHO; return(M_EAST) ;} + "width" {if (mode_debug) ECHO; return(M_WIDTH);} +-{nombre} {if (mode_debug) ECHO; sscanf(yytext,"%ld",&yylval.i); ++{nombre} {if (mode_debug) ECHO; sscanf(yytext,"%ld",&ring_yylval.i); + return(NOMBRE); + } +-{ident} {if (mode_debug) ECHO; yylval.s = namealloc(yytext); ++{ident} {if (mode_debug) ECHO; ring_yylval.s = namealloc(yytext); + return(IDENT); + } + {comment} {if (mode_debug) {ECHO; printf("commentaire\n");}} +diff --git a/alliance/src/ring/src/struct.h b/alliance/src/ring/src/struct.h +index 0d54a94..1cb5b7a 100644 +--- a/alliance/src/ring/src/struct.h ++++ b/alliance/src/ring/src/struct.h +@@ -321,8 +321,8 @@ extern char *pvssi_p; + + extern char *nom_fic_param; /* nom du fichier parametre */ + +-extern FILE *yyin; /* pointeur sur fichier lex */ +-extern int yylineno; /* no de la ligne traitee par lex */ ++extern FILE *ring_yyin; /* pointeur sur fichier lex */ ++extern int ring_yylineno; /* no de la ligne traitee par lex */ + extern chain_list *nom_plot[NB_FACES]; /* liste pour l'analyseur des noms de + plots */ + extern chain_list *liste_width; /* liste pour l'analyseur des noms +-- +2.5.0 + diff --git a/0007-Eliminate-CFLAGS.patch b/0007-Eliminate-CFLAGS.patch new file mode 100644 index 0000000..331593d --- /dev/null +++ b/0007-Eliminate-CFLAGS.patch @@ -0,0 +1,62 @@ +From 6c48c76ab601dd1f608e716bc598e16794b42789 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Wed, 24 Feb 2016 08:03:54 +0100 +Subject: [PATCH 07/10] Eliminate CFLAGS. + +--- + alliance/src/druc/src/Makefile.am | 5 ++--- + alliance/src/m2e/src/Makefile.am | 2 +- + alliance/src/nero/src/Makefile.am | 3 --- + 3 files changed, 3 insertions(+), 7 deletions(-) + +diff --git a/alliance/src/druc/src/Makefile.am b/alliance/src/druc/src/Makefile.am +index 16ecb34..bb31154 100644 +--- a/alliance/src/druc/src/Makefile.am ++++ b/alliance/src/druc/src/Makefile.am +@@ -8,7 +8,8 @@ drucompi.h drucring.c drucring.h drucutil.c drucutil.h vmcaract.c vmcaract.h \ + vmcasmld.c vmcasmld.h vmcerror.c vmcerror.h vmcmesur.c vmcmesur.h vmcrelat.c \ + vmcrelat.h vmctools.c vmctools.h vmcunify.c vmcunify.h + +-CFLAGS = $(ALLIANCE_CFLAGS) -g -O0 ++AM_CFLAGS = $(ALLIANCE_CFLAGS) ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/rds/src + libVrd_la_LDFLAGS = -version-info @VRD_DLL_VERSION@ + libVrd_la_LIBADD = -lRds -lMut + +@@ -22,8 +23,6 @@ drucompi_l.c : $(srcdir)/drucompi_l.l drucompi_y.h + + bin_PROGRAMS = druc + +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/rds/src +- + druc_LDADD = $(ALLIANCE_LIBS) -L. libVrd.la \ + -L$(builddir)/../../rds/src/.libs -lRds \ + -L$(builddir)/../../mbk/src/.libs -lMpu -lMut +diff --git a/alliance/src/m2e/src/Makefile.am b/alliance/src/m2e/src/Makefile.am +index 969bc1a..04a817b 100644 +--- a/alliance/src/m2e/src/Makefile.am ++++ b/alliance/src/m2e/src/Makefile.am +@@ -1,6 +1,6 @@ + ## Process this file with automake to produce Makefile.in + +-AM_CFLAGS = -g -I$(top_srcdir)/mbk/src ++AM_CFLAGS = -I$(top_srcdir)/mbk/src + + bin_PROGRAMS = m2e + +diff --git a/alliance/src/nero/src/Makefile.am b/alliance/src/nero/src/Makefile.am +index 71e2810..f3a5abd 100644 +--- a/alliance/src/nero/src/Makefile.am ++++ b/alliance/src/nero/src/Makefile.am +@@ -1,8 +1,5 @@ + ## Process this file with automake to produce Makefile.in + +-#CXXFLAGS = -g -pg -O2 +-CXXFLAGS = -g -O2 +-#CXXFLAGS = -O2 + AM_CXXFLAGS = @ALLIANCE_CFLAGS@ \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/aut/src \ +-- +2.5.0 + diff --git a/0008-Rework-Makefile.ams.patch b/0008-Rework-Makefile.ams.patch new file mode 100644 index 0000000..5cf87b0 --- /dev/null +++ b/0008-Rework-Makefile.ams.patch @@ -0,0 +1,1923 @@ +From 9346ac619fd8314e023ac3cc658119358945d872 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Sun, 28 Feb 2016 09:44:14 +0100 +Subject: [PATCH 08/10] Rework Makefile.ams. + +--- + alliance/src/abe/src/Makefile.am | 7 ++++-- + alliance/src/abl/src/Makefile.am | 6 +++-- + alliance/src/abt/src/Makefile.am | 9 +++++-- + alliance/src/abv/src/Makefile.am | 10 ++++++-- + alliance/src/alcban/src/Makefile.am | 7 +++--- + alliance/src/asimut/src/Makefile.am | 16 +++--------- + alliance/src/aut/src/Makefile.am | 5 ++-- + alliance/src/b2f/src/Makefile.am | 31 +++++++++++------------ + alliance/src/bdd/src/Makefile.am | 4 +-- + alliance/src/beh/src/Makefile.am | 4 +-- + alliance/src/bhl/src/Makefile.am | 10 ++++++-- + alliance/src/boog/src/Makefile.am | 27 ++++++++++---------- + alliance/src/btr/src/Makefile.am | 7 ++++-- + alliance/src/bvl/src/Makefile.am | 13 ++++++++-- + alliance/src/ctl/src/Makefile.am | 5 ++-- + alliance/src/ctp/src/Makefile.am | 16 +++++++++--- + alliance/src/druc/src/Makefile.am | 13 ++++++---- + alliance/src/elp/src/Makefile.am | 9 +++++-- + alliance/src/exp/src/Makefile.am | 4 +-- + alliance/src/fks/src/Makefile.am | 9 +++++-- + alliance/src/flatbeh/src/Makefile.am | 14 +++-------- + alliance/src/flatph/src/Makefile.am | 12 ++++----- + alliance/src/fmi/src/Makefile.am | 24 +++++++++--------- + alliance/src/fsm/src/Makefile.am | 8 ++++-- + alliance/src/fsp/src/Makefile.am | 15 +++-------- + alliance/src/ftl/src/Makefile.am | 22 ++++++++++++++--- + alliance/src/fvh/src/Makefile.am | 11 +++++++-- + alliance/src/genlib/src/Makefile.am | 10 +++++--- + alliance/src/genpat/src/Makefile.am | 6 +++-- + alliance/src/graal/src/Makefile.am | 12 ++++----- + alliance/src/k2f/src/Makefile.am | 15 +++-------- + alliance/src/l2p/src/Makefile.am | 7 +++--- + alliance/src/log/src/Makefile.am | 5 ++-- + alliance/src/loon/src/Makefile.am | 16 ++++-------- + alliance/src/lvx/src/Makefile.am | 7 +++--- + alliance/src/lynx/src/Makefile.am | 11 +++------ + alliance/src/mbk/src/Makefile.am | 10 +++++--- + alliance/src/mips_asm/src/Makefile.am | 11 +++------ + alliance/src/mocha/src/Makefile.am | 41 +++++++++++++++--------------- + alliance/src/nero/src/Makefile.am | 22 +++++------------ + alliance/src/ocp/src/placer/Makefile.am | 31 ++++++++++++----------- + alliance/src/pat/src/Makefile.am | 7 ++++-- + alliance/src/pat2spi/src/Makefile.am | 8 +++--- + alliance/src/proof/src/Makefile.am | 18 ++++++-------- + alliance/src/rds/src/Makefile.am | 4 +-- + alliance/src/ring/src/Makefile.am | 26 ++++++++++--------- + alliance/src/rtd/src/Makefile.am | 7 ++++-- + alliance/src/rtn/src/Makefile.am | 7 ++++-- + alliance/src/s2r/src/Makefile.am | 17 +++++++------ + alliance/src/scapin/src/Makefile.am | 9 +++---- + alliance/src/scl/src/Makefile.am | 15 ++++++++--- + alliance/src/sea/src/Makefile.am | 15 ++++------- + alliance/src/syf/src/Makefile.am | 27 ++++++++++---------- + alliance/src/vasy/src/Makefile.am | 44 ++++++++++++++++----------------- + alliance/src/vbh/src/Makefile.am | 9 +++++-- + alliance/src/vex/src/Makefile.am | 6 +++-- + alliance/src/vpn/src/Makefile.am | 7 ++++-- + alliance/src/x2y/src/Makefile.am | 16 +++++++----- + alliance/src/xfsm/src/Makefile.am | 25 +++++++++---------- + alliance/src/xgra/src/Makefile.am | 8 +++--- + alliance/src/xpat/src/Makefile.am | 18 +++++++------- + alliance/src/xsch/src/Makefile.am | 23 ++++++++--------- + alliance/src/xvpn/src/Makefile.am | 18 +++++++------- + 63 files changed, 455 insertions(+), 401 deletions(-) + +diff --git a/alliance/src/abe/src/Makefile.am b/alliance/src/abe/src/Makefile.am +index 8b29638..10cff00 100644 +--- a/alliance/src/abe/src/Makefile.am ++++ b/alliance/src/abe/src/Makefile.am +@@ -1,7 +1,10 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/abl/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/abl/src + lib_LTLIBRARIES = libAbe.la + include_HEADERS = abe.h + libAbe_la_SOURCES = abe.h beh_del.c beh_error.c beh_getgenva.c beh_rmv.c beh_view.c \ + beh_add.c beh_dict.c beh_fre.c beh_message.c beh_toolbug.c + libAbe_la_LDFLAGS = -version-info @ABE_DLL_VERSION@ +-libAbe_la_LIBADD = -lAbl -lAut -lMut ++libAbe_la_LIBADD = ++libAbe_la_LIBADD += $(top_builddir)/abl/src/libAbl.la ++libAbe_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libAbe_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/abl/src/Makefile.am b/alliance/src/abl/src/Makefile.am +index bae65f3..44462ab 100644 +--- a/alliance/src/abl/src/Makefile.am ++++ b/alliance/src/abl/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src + lib_LTLIBRARIES = libAbl.la + include_HEADERS = abl.h + libAbl_la_SOURCES = abldel.h ablflat.h abloptim.h ablunflat.h \ +@@ -12,4 +12,6 @@ libAbl_la_SOURCES = abldel.h ablflat.h abloptim.h ablunflat.h + ablctlsimp.h ablerror.h ablmap.h ablsubst.h \ + abldel.c ablflat.c abloptim.c ablunflat.c + libAbl_la_LDFLAGS = -version-info @ABL_DLL_VERSION@ +-libAbl_la_LIBADD = -lAut -lMut ++libAbl_la_LIBADD = ++libAbl_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libAbl_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/abt/src/Makefile.am b/alliance/src/abt/src/Makefile.am +index 28da65d..a22b830 100644 +--- a/alliance/src/abt/src/Makefile.am ++++ b/alliance/src/abt/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/bdd/src \ +@@ -9,4 +9,9 @@ libAbt_la_SOURCES = abt.h bhl_depend.c bhl_freabl.c bhl_makgex.c \ + bhl_delaux.c bhl_error.c bhl_makbdd.c bhl_orderbdd.c \ + bhl_delaux.h bhl_error.h bhl_makbdd.h bhl_orderbdd.h + libAbt_la_LDFLAGS = -version-info @ABT_DLL_VERSION@ +-libAbt_la_LIBADD = -lBdd -lAbe -lAbl -lAut -lMut ++libAbt_la_LIBADD = ++libAbt_la_LIBADD += $(top_builddir)/bdd/src/libBdd.la ++libAbt_la_LIBADD += $(top_builddir)/abe/src/libAbe.la ++libAbt_la_LIBADD += $(top_builddir)/abl/src/libAbl.la ++libAbt_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libAbt_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/abv/src/Makefile.am b/alliance/src/abv/src/Makefile.am +index 73e5fdb..d7ec3b6 100644 +--- a/alliance/src/abv/src/Makefile.am ++++ b/alliance/src/abv/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/bdd/src \ +@@ -9,7 +9,11 @@ libAbv_la_SOURCES = bvl_bcomp_y.y bvl_bcomp_l.l \ + abv.h bvl_bspec.c bvl_drive.c bvl_parse.h bvl_util.h \ + bvl_bedef.h bvl_bspec.h bvl_drive.h bvl_utdef.h bvl_utype.h \ + bvl_blex.h bvl_byacc.h bvl_parse.c bvl_util.c +-libAbv_la_LIBADD = -lAbe -lBdd -lMut ++libAbv_la_LIBADD = ++libAbv_la_LIBADD += $(top_builddir)/abe/src/libAbe.la ++libAbv_la_LIBADD += $(top_builddir)/bdd/src/libBdd.la ++libAbv_la_LIBADD += $(top_builddir)/mbk/src/libMut.la ++ + + CLEANFILES = bvl_bcomp_y.c bvl_bcomp_y.h bvl_bcomp_l.c + +@@ -21,3 +25,5 @@ bvl_bcomp_l.c : $(srcdir)/bvl_bcomp_l.l bvl_bcomp_y.h + $(LEX) -t $(srcdir)/bvl_bcomp_l.l | sed -e "s/yy/bvl_y_/g" -e "s/YY/BVL_Y_/g" > bvl_bcomp_l.c + + libAbv_la_LDFLAGS = -version-info @ABV_DLL_VERSION@ ++ ++CLEANFILES += y.tab.c y.tab.h +diff --git a/alliance/src/alcban/src/Makefile.am b/alliance/src/alcban/src/Makefile.am +index 033fa40..f6b02d4 100644 +--- a/alliance/src/alcban/src/Makefile.am ++++ b/alliance/src/alcban/src/Makefile.am +@@ -2,9 +2,10 @@ + + bin_PROGRAMS = alcbanner + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/mbk/src ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src + +-alcbanner_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/mbk/src/.libs -lMut ++alcbanner_LDADD = @ALLIANCE_LIBS@ ++alcbanner_LDADD += $(top_builddir)/mbk/src/libMut.la + + alcbanner_SOURCES = alcbanner.c +diff --git a/alliance/src/asimut/src/Makefile.am b/alliance/src/asimut/src/Makefile.am +index d7b5e77..aaad8cf 100644 +--- a/alliance/src/asimut/src/Makefile.am ++++ b/alliance/src/asimut/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/log/src \ + -I$(top_srcdir)/beh/src \ + -I$(top_srcdir)/pat/src \ +@@ -17,20 +17,12 @@ libSch_la_SOURCES = sch_addshent.c sch_CrtSch.c sch_GetCTim.c sch.h sch_r + sch_bug.c sch_Free.c sch_GoNTim.c sch_message.c + + libSch_la_LDFLAGS = -version-info @SCH_DLL_VERSION@ +-libSch_la_LIBADD = -lMut ++libSch_la_LIBADD = $(top_builddir)/mbk/src/libMut.la + + bin_PROGRAMS = asimut + +-asimut_LDADD = -L. libSch.la -lBvl -lBhl \ +- -L$(top_builddir)/mbk/src \ +- -L$(top_builddir)/bvl/src \ +- -L$(top_builddir)/bhl/src \ +- -L$(top_builddir)/beh/src \ +- -L$(top_builddir)/pat/src \ +- -L$(top_builddir)/log/src \ +- -L$(top_builddir)/abl/src \ +- -L$(top_builddir)/aut/src \ +- -lAut -lAbl -lMlu -lRcn -lBvl -lBhl -lBeh -lPat -lLog -lMut ++asimut_LDADD = libSch.la $(top_builddir)/bvl/src/libBvl.la $(top_builddir)/bhl/src/libBhl.la \ ++ $(top_builddir)/aut/src/libAut.la $(top_builddir)/abl/src/libAbl.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libRcn.la $(top_builddir)/bvl/src/libBvl.la $(top_builddir)/bhl/src/libBhl.la $(top_builddir)/beh/src/libBeh.la $(top_builddir)/pat/src/libPat.la $(top_builddir)/log/src/libLog.la $(top_builddir)/mbk/src/libMut.la + + asimut_SOURCES = beh_delay.h c_fsyn_sr1k_56.c vh_debug.c vh_lspec.c vh_util.h vh_init.h \ + beh_setdelay.c c_fsyn_sr4k_10.c vh_debug.h vh_lspec.h vh_xcomm.c \ +diff --git a/alliance/src/aut/src/Makefile.am b/alliance/src/aut/src/Makefile.am +index d26d76a..ae9af96 100644 +--- a/alliance/src/aut/src/Makefile.am ++++ b/alliance/src/aut/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src + lib_LTLIBRARIES = libAut.la + include_HEADERS = aut.h + libAut_la_SOURCES = autenv.h autfree.h authash2.h autsort.h \ +@@ -9,4 +9,5 @@ autdebug.h autexit.h authash.h autresize.h \ + autenv.c autfree.c authash2.c autsort.c + + libAut_la_LDFLAGS = -version-info @AUT_DLL_VERSION@ +-libAut_la_LIBADD = -lMut ++libAut_la_LIBADD = ++libAut_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/b2f/src/Makefile.am b/alliance/src/b2f/src/Makefile.am +index 883d4af..9ef32d6 100644 +--- a/alliance/src/b2f/src/Makefile.am ++++ b/alliance/src/b2f/src/Makefile.am +@@ -2,7 +2,8 @@ + + bin_PROGRAMS = b2f + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/abe/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/abe/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/abt/src \ + -I$(top_srcdir)/abv/src \ +@@ -13,21 +14,19 @@ AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/abe/src \ + -I$(top_srcdir)/ftl/src \ + -I$(top_srcdir)/mbk/src + +-b2f_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abt/src/.libs \ +--L$(top_builddir)/abv/src/.libs \ +--L$(top_builddir)/abe/src/.libs \ +--L$(top_builddir)/ftl/src/.libs \ +--L$(top_builddir)/fks/src/.libs \ +--L$(top_builddir)/fvh/src/.libs \ +--L$(top_builddir)/fsm/src/.libs \ +--L$(top_builddir)/btr/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +- -lAbt -lAbv -lAbe -lFtl -lFks -lFvh -lFsm \ +- -lBtr -lBdd -lAbl -lAut -lMut ++b2f_LDADD = @ALLIANCE_LIBS@ ++b2f_LDADD += $(top_builddir)/abt/src/libAbt.la ++b2f_LDADD += $(top_builddir)/abv/src/libAbv.la ++b2f_LDADD += $(top_builddir)/abe/src/libAbe.la ++b2f_LDADD += $(top_builddir)/ftl/src/libFtl.la ++b2f_LDADD += $(top_builddir)/fks/src/libFks.la ++b2f_LDADD += $(top_builddir)/fvh/src/libFvh.la ++b2f_LDADD += $(top_builddir)/fsm/src/libFsm.la ++b2f_LDADD += $(top_builddir)/btr/src/libBtr.la ++b2f_LDADD += $(top_builddir)/bdd/src/libBdd.la ++b2f_LDADD += $(top_builddir)/abl/src/libAbl.la ++b2f_LDADD += $(top_builddir)/aut/src/libAut.la ++b2f_LDADD += $(top_builddir)/mbk/src/libMut.la + + b2f_SOURCES = \ + b2f_beh2fsm.c b2f_error.c b2f_main.c \ +diff --git a/alliance/src/bdd/src/Makefile.am b/alliance/src/bdd/src/Makefile.am +index 8b4df4e..41bf95a 100644 +--- a/alliance/src/bdd/src/Makefile.am ++++ b/alliance/src/bdd/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/abl/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/abl/src + lib_LTLIBRARIES = libBdd.la + include_HEADERS = bdd.h + libBdd_la_SOURCES = bdd.h bddenv.h bddimply.h bddsimpdc.h \ +@@ -25,4 +25,4 @@ libBdd_la_SOURCES = bdd.h bddenv.h bddimply.h bddsimp + bddenv.c bddimply.c bddsimpdc.c + + libBdd_la_LDFLAGS = -version-info @BDD_DLL_VERSION@ +-libBdd_la_LIBADD = -lAbl -lAut ++libBdd_la_LIBADD = $(top_builddir)/abl/src/libAbl.la $(top_builddir)/aut/src/libAut.la +diff --git a/alliance/src/beh/src/Makefile.am b/alliance/src/beh/src/Makefile.am +index f087c94..5f70ef1 100644 +--- a/alliance/src/beh/src/Makefile.am ++++ b/alliance/src/beh/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/log/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/log/src + lib_LTLIBRARIES = libBeh.la + include_HEADERS = beh.h cst.h + libBeh_la_SOURCES = beh_addbeaux.c beh_delbebus.c beh_frebeaux.c beh_message.c \ +@@ -25,4 +25,4 @@ libBeh_la_SOURCES = beh_addbeaux.c beh_delbebus.c beh_frebeaux.c beh_mess + cst_DisjunctSet.c cst_GetPrevElt.c cst_SetCmp.c + + libBeh_la_LDFLAGS = -version-info @BEH_DLL_VERSION@ +-libBeh_la_LIBADD = -lLog -lAbl -lAut -lMut ++libBeh_la_LIBADD = $(top_builddir)/log/src/libLog.la $(top_builddir)/abl/src/libAbl.la $(top_builddir)/aut/src/libAut.la $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/bhl/src/Makefile.am b/alliance/src/bhl/src/Makefile.am +index 1d52002..97936f3 100644 +--- a/alliance/src/bhl/src/Makefile.am ++++ b/alliance/src/bhl/src/Makefile.am +@@ -1,4 +1,7 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/log/src -I$(top_srcdir)/beh/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS += -I$(top_srcdir)/log/src ++AM_CPPFLAGS += -I$(top_srcdir)/beh/src ++ + lib_LTLIBRARIES = libBhl.la + include_HEADERS = bhl.h + libBhl_la_SOURCES = beh_chkbefig.c beh_dly2sta.c beh_makbdd.c beh_makvarlist.c \ +@@ -7,4 +10,7 @@ libBhl_la_SOURCES = beh_chkbefig.c beh_dly2sta.c beh_makbdd.c beh_makvarlis + beh_debug.h beh_indexbdd.c beh_maknode.c beh_unamlist.c \ + beh_depend.c beh_makquad.c bhl.h + libBhl_la_LDFLAGS = -version-info @BHL_DLL_VERSION@ +-libBhl_la_LIBADD = -lBeh -lAut -lMut ++libBhl_la_LIBADD = ++libBhl_la_LIBADD += $(top_builddir)/beh/src/libBeh.la ++libBhl_la_LIBADD += $(top_builddir)/log/src/libLog.la ++libBhl_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/boog/src/Makefile.am b/alliance/src/boog/src/Makefile.am +index 3581883..d66b486 100644 +--- a/alliance/src/boog/src/Makefile.am ++++ b/alliance/src/boog/src/Makefile.am +@@ -1,25 +1,26 @@ + ## Process this file with automake to produce Makefile.in + +-AM_CFLAGS = -I$(top_srcdir)/abe/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/abe/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/abv/src \ + -I$(top_srcdir)/bdd/src \ + -I$(top_srcdir)/aut/src \ +- -I$(top_srcdir)/mbk/src \ +- @ALLIANCE_CFLAGS@ ++ -I$(top_srcdir)/mbk/src + + bin_PROGRAMS = boog + +-boog_LDADD = @ALLIANCE_LIBS@ \ +- -L$(builddir)/../../abv/src \ +- -L$(builddir)/../../abe/src \ +- -L$(builddir)/../../abt/src \ +- -L$(builddir)/../../mbk/src \ +- -L$(builddir)/../../mbk/src \ +- -L$(builddir)/../../bdd/src \ +- -L$(builddir)/../../abl/src \ +- -L$(builddir)/../../aut/src \ +- -lAbv -lAbe -lAbt -lMlu -lRcn -lMlo -lBdd -lAbl -lAut -lMut ++boog_LDADD = @ALLIANCE_LIBS@ ++boog_LDADD += $(top_builddir)/abv/src/libAbv.la ++boog_LDADD += $(top_builddir)/abe/src/libAbe.la ++boog_LDADD += $(top_builddir)/abt/src/libAbt.la ++boog_LDADD += $(top_builddir)/mbk/src/libMlu.la ++boog_LDADD += $(top_builddir)/mbk/src/libRcn.la ++boog_LDADD += $(top_builddir)/mbk/src/libMlo.la ++boog_LDADD += $(top_builddir)/bdd/src/libBdd.la ++boog_LDADD += $(top_builddir)/abl/src/libAbl.la ++boog_LDADD += $(top_builddir)/aut/src/libAut.la ++boog_LDADD += $(top_builddir)/mbk/src/libMut.la + + boog_SOURCES = bog_lax_param.c bog_map_adapt.h bog_normalize_simplify.h \ + bog_lax_param.h bog_map_befig.c bog_signal_adapt.c \ +diff --git a/alliance/src/btr/src/Makefile.am b/alliance/src/btr/src/Makefile.am +index d9eb2c3..f988e2d 100644 +--- a/alliance/src/btr/src/Makefile.am ++++ b/alliance/src/btr/src/Makefile.am +@@ -1,8 +1,11 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/abl/src -I$(top_srcdir)/bdd/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS += -I$(top_srcdir)/aut/src ++AM_CPPFLAGS += -I$(top_srcdir)/abl/src ++AM_CPPFLAGS += -I$(top_srcdir)/bdd/src + lib_LTLIBRARIES = libBtr.la + include_HEADERS = btr.h + libBtr_la_SOURCES = btr.h btrenv.c btrerror.h btrfunc.c btrresize.h \ + btralloc.c btrenv.h btrfree.c btrfunc.h btrtrans.c \ + btralloc.h btrerror.c btrfree.h btrresize.c btrtrans.h + libBtr_la_LDFLAGS = -version-info @BTR_DLL_VERSION@ +-libBtr_la_LIBADD = -lBdd ++libBtr_la_LIBADD = $(top_builddir)/bdd/src/libBdd.la +diff --git a/alliance/src/bvl/src/Makefile.am b/alliance/src/bvl/src/Makefile.am +index 5d81aec..89fa559 100644 +--- a/alliance/src/bvl/src/Makefile.am ++++ b/alliance/src/bvl/src/Makefile.am +@@ -1,11 +1,18 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/log/src -I$(top_srcdir)/beh/src -I$(top_srcdir)/bhl/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS += -I$(top_srcdir)/log/src ++AM_CPPFLAGS += -I$(top_srcdir)/beh/src ++AM_CPPFLAGS += -I$(top_srcdir)/bhl/src + lib_LTLIBRARIES = libBvl.la + include_HEADERS = bvl.h + libBvl_la_SOURCES = bvl_bcomp_y.y bvl_bcomp_l.l bvl_bcomp_y.h \ + bvl_bedef.h bvl_drive.c bvl.h bvl_util.c \ + bvl_byacc.h bvl_globals.c bvl_parse.c + libBvl_la_LDFLAGS = -version-info @BVL_DLL_VERSION@ +-libBvl_la_LIBADD = -lBhl -lBeh -lMut ++libBvl_la_LIBADD = ++libBvl_la_LIBADD += $(top_builddir)/bhl/src/libBhl.la ++libBvl_la_LIBADD += $(top_builddir)/beh/src/libBeh.la ++libBvl_la_LIBADD += $(top_builddir)/log/src/libLog.la ++libBvl_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + + CLEANFILES = bvl_bcomp_y.c bvl_bcomp_y.h bvl_bcomp_l.c + +@@ -13,3 +20,5 @@ bvl_bcomp_y.c bvl_bcomp_y.h : $(srcdir)/bvl_bcomp_y.y + $(YACC) -d $(YFLAGS) $(srcdir)/bvl_bcomp_y.y && sed -e "s/yy/bvl_y_/g" -e "s/YY/BVL_Y_/g" y.tab.c > bvl_bcomp_y.c && sed -e "s/yy/bvl_y_/g" -e "s/YY/BVL_Y_/g" y.tab.h > bvl_bcomp_y.h + bvl_bcomp_l.c : $(srcdir)/bvl_bcomp_l.l bvl_bcomp_y.h + $(LEX) -t $(srcdir)/bvl_bcomp_l.l | sed -e "s/yy/bvl_y_/g" -e "s/YY/BVL_Y_/g" > bvl_bcomp_l.c ++ ++CLEANFILES += y.tab.c y.tab.h +diff --git a/alliance/src/ctl/src/Makefile.am b/alliance/src/ctl/src/Makefile.am +index b4c6000..3e441fd 100644 +--- a/alliance/src/ctl/src/Makefile.am ++++ b/alliance/src/ctl/src/Makefile.am +@@ -1,8 +1,9 @@ +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/vex/src ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/vex/src + lib_LTLIBRARIES = libCtl.la + include_HEADERS = ctl.h + libCtl_la_SOURCES = ctladd.c ctlalloc.h ctlenv.c ctlerror.h ctl.h ctlview.c \ + ctladd.h ctldel.c ctlenv.h ctlfree.c ctlsearch.c ctlview.h \ + ctlalloc.c ctldel.h ctlerror.c ctlfree.h ctlsearch.h + libCtl_la_LDFLAGS = -version-info @CTL_DLL_VERSION@ +-libCtl_la_LIBADD = -lVex -lAut -lMut ++libCtl_la_LIBADD = $(top_builddir)/vex/src/libVex.la $(top_builddir)/aut/src/libAut.la $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/ctp/src/Makefile.am b/alliance/src/ctp/src/Makefile.am +index 165e582..7c52107 100644 +--- a/alliance/src/ctp/src/Makefile.am ++++ b/alliance/src/ctp/src/Makefile.am +@@ -1,11 +1,15 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/vex/src -I$(top_srcdir)/ctl/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/vex/src -I$(top_srcdir)/ctl/src + lib_LTLIBRARIES = libCtp.la + include_HEADERS = ctp.h + libCtp_la_SOURCES = ctp_y.y ctp_l.l ctp.h \ + ctp_bedef.h ctp_bspec.c ctp_byacc.h ctp_parse.c ctp_util.h \ + ctp_blex.h ctp_bspec.h ctp_util.c ctp_utype.h + libCtp_la_LDFLAGS = -version-info @CTP_DLL_VERSION@ +-libCtp_la_LIBADD = -lCtl -lVex -lAut -lMut ++libCtp_la_LIBADD = ++libCtp_la_LIBADD += $(top_builddir)/ctl/src/libCtl.la ++libCtp_la_LIBADD += $(top_builddir)/vex/src/libVex.la ++libCtp_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libCtp_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + + CLEANFILES = ctp_y.c ctp_y.h ctp_l.c + +@@ -19,6 +23,12 @@ ctp_l.c : $(srcdir)/ctp_l.l ctp_y.h + + EXTRA_PROGRAMS = ctptest + +-ctptest_LDADD = -L. -lCtp -lCtl -lVex -lAut -lMut ++ctptest_LDADD = libCtp.la ++ctptest_LDADD += $(top_builddir)/ctl/src/libCtl.la ++ctptest_LDADD += $(top_builddir)/vex/src/libVex.la ++ctptest_LDADD += $(top_builddir)/aut/src/libAut.la ++ctptest_LDADD += $(top_builddir)/mbk/src/libMut.la + + ctptest_SOURCES = main.c ++ ++CLEANFILES += y.tab.c y.tab.h +diff --git a/alliance/src/druc/src/Makefile.am b/alliance/src/druc/src/Makefile.am +index bb31154..f4c125e 100644 +--- a/alliance/src/druc/src/Makefile.am ++++ b/alliance/src/druc/src/Makefile.am +@@ -8,10 +8,11 @@ drucompi.h drucring.c drucring.h drucutil.c drucutil.h vmcaract.c vmcaract.h \ + vmcasmld.c vmcasmld.h vmcerror.c vmcerror.h vmcmesur.c vmcmesur.h vmcrelat.c \ + vmcrelat.h vmctools.c vmctools.h vmcunify.c vmcunify.h + +-AM_CFLAGS = $(ALLIANCE_CFLAGS) + AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/rds/src + libVrd_la_LDFLAGS = -version-info @VRD_DLL_VERSION@ +-libVrd_la_LIBADD = -lRds -lMut ++libVrd_la_LIBADD = ++libVrd_la_LIBADD += $(top_builddir)/rds/src/libRds.la ++libVrd_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + + CLEANFILES = drucompi_l.c drucompi_y.h drucompi_y.c + +@@ -23,9 +24,11 @@ drucompi_l.c : $(srcdir)/drucompi_l.l drucompi_y.h + + bin_PROGRAMS = druc + +-druc_LDADD = $(ALLIANCE_LIBS) -L. libVrd.la \ +--L$(builddir)/../../rds/src/.libs -lRds \ +--L$(builddir)/../../mbk/src/.libs -lMpu -lMut ++druc_LDADD = libVrd.la ++druc_LDADD += $(top_builddir)/rds/src/libRds.la ++druc_LDADD += $(top_builddir)/mbk/src/libMut.la + + druc_SOURCES = \ + drucbath.c drucbath.h ++ ++CLEANFILES += y.tab.c y.tab.h +diff --git a/alliance/src/elp/src/Makefile.am b/alliance/src/elp/src/Makefile.am +index 41969ab..28581fa 100644 +--- a/alliance/src/elp/src/Makefile.am ++++ b/alliance/src/elp/src/Makefile.am +@@ -1,11 +1,14 @@ +-AM_CFLAGS = -DTECHNOLOGY=\"etc/prol.elp\" -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS = -DTECHNOLOGY=\"etc/prol.elp\" ++AM_CPPFLAGS += -I$(top_srcdir)/mbk/src + + lib_LTLIBRARIES = libElp.la + include_HEADERS = elp.h + libElp_la_SOURCES = elp_y.y elp_l.l elp.c elperror.c elp.h + + libElp_la_LDFLAGS = -version-info @ELP_DLL_VERSION@ +-libElp_la_LIBADD = -lRcn -lMut ++libElp_la_LIBADD = ++libElp_la_LIBADD += $(top_builddir)/mbk/src/libRcn.la ++libElp_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + + CLEANFILES = elp_y.c elp_y.h elp_l.c + +@@ -14,3 +17,5 @@ elp_y.c elp_y.h : $(srcdir)/elp_y.y + + elp_l.c : $(srcdir)/elp_l.l elp_y.h + $(LEX) -t $(srcdir)/elp_l.l | sed -e "s/yy/elpyy/g" -e "s/YY/elpYY/g" > elp_l.c ++ ++CLEANFILES += y.tab.c y.tab.h +diff --git a/alliance/src/exp/src/Makefile.am b/alliance/src/exp/src/Makefile.am +index 03f8892..21fdf5f 100644 +--- a/alliance/src/exp/src/Makefile.am ++++ b/alliance/src/exp/src/Makefile.am +@@ -2,9 +2,7 @@ + + bin_PROGRAMS = exp + +-YACC = @YACC@ -d -v --debug +-CFLAGS = @CFLAGS@ @ALLIANCE_CFLAGS@ +-exp_LDADD = ++AM_YFLAGS = -d --debug + + exp_SOURCES = exp.h expy.y expl.l ht.c ht.h main.c + +diff --git a/alliance/src/fks/src/Makefile.am b/alliance/src/fks/src/Makefile.am +index 49f46ba..884e6bd 100644 +--- a/alliance/src/fks/src/Makefile.am ++++ b/alliance/src/fks/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/bdd/src \ +@@ -7,4 +7,9 @@ lib_LTLIBRARIES = libFks.la + include_HEADERS = fks.h + libFks_la_SOURCES = fks.h fksdrive.c fksdrive.h fkserror.c fkserror.h fksparse.c fksparse.h + libFks_la_LDFLAGS = -version-info @FKS_DLL_VERSION@ +-libFks_la_LIBADD = -lFsm -lAbl -lBdd -lAut -lMut ++libFks_la_LIBADD = ++libFks_la_LIBADD += $(top_builddir)/fsm/src/libFsm.la ++libFks_la_LIBADD += $(top_builddir)/abl/src/libAbl.la ++libFks_la_LIBADD += $(top_builddir)/bdd/src/libBdd.la ++libFks_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libFks_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/flatbeh/src/Makefile.am b/alliance/src/flatbeh/src/Makefile.am +index 9419dd8..fa6a82a 100644 +--- a/alliance/src/flatbeh/src/Makefile.am ++++ b/alliance/src/flatbeh/src/Makefile.am +@@ -1,6 +1,7 @@ + ## Process this file with automake to produce Makefile.in + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/abe/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/abv/src \ +@@ -11,14 +12,7 @@ AM_CFLAGS = @ALLIANCE_CFLAGS@ \ + bin_PROGRAMS = flatbeh + + flatbeh_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abv/src/.libs \ +--L$(top_builddir)/abe/src/.libs \ +--L$(top_builddir)/abt/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +- -lAbv -lAbe -lAbt -lMlu -lRcn -lMlo -lBdd -lAbl -lAut -lMut +- ++ $(top_builddir)/abv/src/libAbv.la $(top_builddir)/abe/src/libAbe.la $(top_builddir)/abt/src/libAbt.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libRcn.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/bdd/src/libBdd.la $(top_builddir)/abl/src/libAbl.la $(top_builddir)/aut/src/libAut.la $(top_builddir)/mbk/src/libMut.la ++ + flatbeh_SOURCES = abstract.c abstract.h utils.c utils.h main.c + +diff --git a/alliance/src/flatph/src/Makefile.am b/alliance/src/flatph/src/Makefile.am +index 6fcf5bd..6ecbbfd 100644 +--- a/alliance/src/flatph/src/Makefile.am ++++ b/alliance/src/flatph/src/Makefile.am +@@ -1,14 +1,12 @@ + # $Id: Makefile.am,v 1.5 2005/01/19 15:13:50 hcl Exp $ + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/mbk/src ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src + + bin_PROGRAMS = flatph + +-flatph_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/mbk/src/.libs \ +- -lMpu -lMlu \ +- -lMlo \ +- -lMph -lMut \ +- -lRcn ++flatph_LDADD = @ALLIANCE_LIBS@ ++flatph_LDADD += $(top_builddir)/mbk/src/libMpu.la ++flatph_LDADD += $(top_builddir)/mbk/src/libMut.la + + flatph_SOURCES = flatph.c +diff --git a/alliance/src/fmi/src/Makefile.am b/alliance/src/fmi/src/Makefile.am +index 0248fd3..157f536 100644 +--- a/alliance/src/fmi/src/Makefile.am ++++ b/alliance/src/fmi/src/Makefile.am +@@ -2,24 +2,24 @@ + + bin_PROGRAMS = fmi + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/abl/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ ++-I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/bdd/src \ + -I$(top_srcdir)/fsm/src \ + -I$(top_srcdir)/ftl/src \ + -I$(top_srcdir)/mbk/src + +-fmi_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/fks/src/.libs \ +--L$(top_builddir)/fsm/src/.libs \ +--L$(top_builddir)/ftl/src/.libs \ +--L$(top_builddir)/fvh/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +- -lFtl -lFks -lFvh -lFsm \ +- -lBdd -lAbl -lAut -lMut ++fmi_LDADD = @ALLIANCE_LIBS@ ++fmi_LDADD += $(top_builddir)/abl/src/libAbl.la ++fmi_LDADD += $(top_builddir)/aut/src/libAut.la ++fmi_LDADD += $(top_builddir)/bdd/src/libBdd.la ++fmi_LDADD += $(top_builddir)/fks/src/libFks.la ++fmi_LDADD += $(top_builddir)/fsm/src/libFsm.la ++fmi_LDADD += $(top_builddir)/ftl/src/libFtl.la ++fmi_LDADD += $(top_builddir)/fvh/src/libFvh.la ++fmi_LDADD += $(top_builddir)/mbk/src/libMut.la + + fmi_SOURCES = \ + fmi_bdd.c fmi_main.c fmi_optim.c fmi_parse.c \ +diff --git a/alliance/src/fsm/src/Makefile.am b/alliance/src/fsm/src/Makefile.am +index 47f639a..b52b63e 100644 +--- a/alliance/src/fsm/src/Makefile.am ++++ b/alliance/src/fsm/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/abl/src -I$(top_srcdir)/bdd/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/abl/src -I$(top_srcdir)/bdd/src + lib_LTLIBRARIES = libFsm.la + include_HEADERS = fsm.h + libFsm_la_SOURCES = fsm.h fsmalloc.h fsmdel.h fsmfree.h fsmsearch.h fsmview.h \ +@@ -6,4 +6,8 @@ libFsm_la_SOURCES = fsm.h fsmalloc.h fsmdel.h fsmfree.h fsmsearch.h f + fsmadd.h fsmbdd.h fsmerror.h fsmorder.h fsmsimp.h \ + fsmalloc.c fsmdel.c fsmfree.c fsmsearch.c fsmview.c + libFsm_la_LDFLAGS = -version-info @FSM_DLL_VERSION@ +-libFsm_la_LIBADD = -lBdd -lAbl -lAut -lMut ++libFsm_la_LIBADD = ++libFsm_la_LIBADD += $(top_builddir)/bdd/src/libBdd.la ++libFsm_la_LIBADD += $(top_builddir)/abl/src/libAbl.la ++libFsm_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libFsm_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/fsp/src/Makefile.am b/alliance/src/fsp/src/Makefile.am +index dca3a4a..198270a 100644 +--- a/alliance/src/fsp/src/Makefile.am ++++ b/alliance/src/fsp/src/Makefile.am +@@ -2,7 +2,8 @@ + + bin_PROGRAMS = fsp + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/bdd/src \ +@@ -11,16 +12,8 @@ AM_CFLAGS = @ALLIANCE_CFLAGS@ \ + -I$(top_srcdir)/mbk/src + + fsp_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/fks/src/.libs \ +--L$(top_builddir)/fsm/src/.libs \ +--L$(top_builddir)/ftl/src/.libs \ +--L$(top_builddir)/fvh/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +- -lFtl -lFks -lFvh -lFsm \ +- -lBdd -lAbl -lAut -lMut ++ $(top_builddir)/ftl/src/libFtl.la $(top_builddir)/fks/src/libFks.la $(top_builddir)/fvh/src/libFvh.la $(top_builddir)/fsm/src/libFsm.la \ ++ $(top_builddir)/bdd/src/libBdd.la $(top_builddir)/abl/src/libAbl.la $(top_builddir)/aut/src/libAut.la $(top_builddir)/mbk/src/libMut.la + + + fsp_SOURCES = \ +diff --git a/alliance/src/ftl/src/Makefile.am b/alliance/src/ftl/src/Makefile.am +index b50d0ad..2c4b10d 100644 +--- a/alliance/src/ftl/src/Makefile.am ++++ b/alliance/src/ftl/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/bdd/src \ +@@ -7,10 +7,24 @@ lib_LTLIBRARIES = libFtl.la + include_HEADERS = ftl.h + libFtl_la_SOURCES = ftl.h ftlacces.c ftlacces.h ftlerror.c ftlerror.h + libFtl_la_LDFLAGS = -version-info @FTL_DLL_VERSION@ +-libFtl_la_LIBADD = -lFks -lFvh -lFsm -lBdd -lAbl -lAut -lMut +- ++libFtl_la_LIBADD = ++libFtl_la_LIBADD += $(top_builddir)/fks/src/libFks.la ++libFtl_la_LIBADD += $(top_builddir)/fvh/src/libFvh.la ++libFtl_la_LIBADD += $(top_builddir)/fsm/src/libFsm.la ++libFtl_la_LIBADD += $(top_builddir)/bdd/src/libBdd.la ++libFtl_la_LIBADD += $(top_builddir)/abl/src/libAbl.la ++libFtl_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libFtl_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + EXTRA_PROGRAMS = fsmtest + + +-fsmtest_LDADD = -L. -lFtl -lFks -lFvh -lFsm -lBdd -lAbl -lAut -lMut ++fsmtest_LDADD = libFtl.la ++fsmtest_LDADD += $(top_builddir)/fks/src/libFks.la ++fsmtest_LDADD += $(top_builddir)/fvh/src/libFvh.la ++fsmtest_LDADD += $(top_builddir)/fsm/src/libFsm.la ++fsmtest_LDADD += $(top_builddir)/bdd/src/libBdd.la ++fsmtest_LDADD += $(top_builddir)/abl/src/libAbl.la ++fsmtest_LDADD += $(top_builddir)/aut/src/libAut.la ++fsmtest_LDADD += $(top_builddir)/mbk/src/libMut.la ++ + fsmtest_SOURCES = main.c +diff --git a/alliance/src/fvh/src/Makefile.am b/alliance/src/fvh/src/Makefile.am +index 29a3a31..008893b 100644 +--- a/alliance/src/fvh/src/Makefile.am ++++ b/alliance/src/fvh/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/bdd/src \ +@@ -14,7 +14,12 @@ libFvh_la_SOURCES = fbl_bcomp_y.y fbl_bcomp_l.l \ + fvhfbh2fsm.c fvhfbh2fsm.h fvh.h fvhparse.c fvhparse.h + + libFvh_la_LDFLAGS = -version-info @FVH_DLL_VERSION@ +-libFvh_la_LIBADD = -lFsm -lAbl -lBdd -lAut -lMut ++libFvh_la_LIBADD = ++libFvh_la_LIBADD += $(top_builddir)/fsm/src/libFsm.la ++libFvh_la_LIBADD += $(top_builddir)/abl/src/libAbl.la ++libFvh_la_LIBADD += $(top_builddir)/bdd/src/libBdd.la ++libFvh_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libFvh_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + + CLEANFILES = fbl_bcomp_y.c fbl_bcomp_y.h fbl_bcomp_l.c + +@@ -24,3 +29,5 @@ fbl_bcomp_y.c fbl_bcomp_y.h : $(srcdir)/fbl_bcomp_y.y + sed -e "s/yy/fbl_y_/g" -e "s/YY/FBL_Y_/g" y.tab.h > fbl_bcomp_y.h + fbl_bcomp_l.c : $(srcdir)/fbl_bcomp_l.l fbl_bcomp_y.h + $(LEX) -t $(srcdir)/fbl_bcomp_l.l | sed -e "s/yy/fbl_y_/g" -e "s/YY/FBL_Y_/g" > fbl_bcomp_l.c ++ ++CLEANFILES += y.tab.h y.tab.c +diff --git a/alliance/src/genlib/src/Makefile.am b/alliance/src/genlib/src/Makefile.am +index 5ed3463..c78135b 100644 +--- a/alliance/src/genlib/src/Makefile.am ++++ b/alliance/src/genlib/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src + AM_YFLAGS = + AM_LFLAGS = + lib_LTLIBRARIES = libMgn.la +@@ -26,8 +26,12 @@ libMgn_la_SOURCES = genlib.c \ + dpgen_Shifter.c + + libMgn_la_LDFLAGS = -version-info @MGN_DLL_VERSION@ +-libMgn_la_LIBADD = -lMlu -lMlo -lMpu -lMph -lMut +- ++libMgn_la_LIBADD = ++libMgn_la_LIBADD += $(top_builddir)/mbk/src/libMlu.la ++libMgn_la_LIBADD += $(top_builddir)/mbk/src/libMlo.la ++libMgn_la_LIBADD += $(top_builddir)/mbk/src/libMpu.la ++libMgn_la_LIBADD += $(top_builddir)/mbk/src/libMph.la ++libMgn_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + bin_SCRIPTS = genlib + CLEANFILES = genlib y.output dpgen_ROM_code.c dpgen_ROM_code.h + +diff --git a/alliance/src/genpat/src/Makefile.am b/alliance/src/genpat/src/Makefile.am +index 8a81622..9bb71f9 100644 +--- a/alliance/src/genpat/src/Makefile.am ++++ b/alliance/src/genpat/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/pat/src + + lib_LTLIBRARIES = libPgn.la +@@ -8,7 +8,9 @@ libPgn_la_SOURCES = AFFECT.c ARRAY.c CONV.c DECLAR.c DEF_GEN.c GETCPAT.c \ + libpat_l.c libpat_l.h + + libPgn_la_LDFLAGS = -version-info @PGN_DLL_VERSION@ +-libPgn_la_LIBADD = -lPat -lMut ++libPgn_la_LIBADD = ++libPgn_la_LIBADD += $(top_builddir)/pat/src/libPat.la ++libPgn_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + + bin_SCRIPTS = genpat + CLEANFILES = genpat +diff --git a/alliance/src/graal/src/Makefile.am b/alliance/src/graal/src/Makefile.am +index 28d295c..b827041 100644 +--- a/alliance/src/graal/src/Makefile.am ++++ b/alliance/src/graal/src/Makefile.am +@@ -1,8 +1,8 @@ + ## Process this file with automake to produce Makefile.in + + bin_PROGRAMS = graal +-AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ \ +- -I$(top_srcdir)/mbk/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/rds/src \ + -I$(top_srcdir)/druc/src \ + -DGRAAL_DEFAULT_TECHNO_NAME=\"etc/cmos.graal\" \ +@@ -48,11 +48,9 @@ ALL_X_LIBS = $(X_LDFLAGS) $(LIBXM) $(LIBXT) $(LIBXPM) \ + + + +-graal_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) \ +- -L$(top_builddir)/druc/src \ +- -L$(top_builddir)/mbk/src \ +- -L$(top_builddir)/rds/src \ +- -lVrd -lRds -lMpu -lMph -lMut ++graal_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) ++graal_LDADD += $(top_builddir)/druc/src/libVrd.la ++graal_LDADD += $(top_builddir)/mbk/src/libMut.la + + graal_SOURCES = \ + graal.c GMC_create.c GMC_create.h GMC_dialog.c GMC_dialog.h GMC.h GMC_menu.c GMC_menu.h \ +diff --git a/alliance/src/k2f/src/Makefile.am b/alliance/src/k2f/src/Makefile.am +index c36edea..76561d7 100644 +--- a/alliance/src/k2f/src/Makefile.am ++++ b/alliance/src/k2f/src/Makefile.am +@@ -2,7 +2,8 @@ + + bin_PROGRAMS = k2f + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/aut/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/bdd/src \ + -I$(top_srcdir)/fsm/src \ +@@ -10,16 +11,8 @@ AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/mbk/src + + k2f_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/fks/src/.libs \ +--L$(top_builddir)/fsm/src/.libs \ +--L$(top_builddir)/ftl/src/.libs \ +--L$(top_builddir)/fvh/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +- -lFtl -lFks -lFvh -lFsm \ +- -lBdd -lAbl -lAut -lMut ++ $(top_builddir)/ftl/src/libFtl.la $(top_builddir)/fks/src/libFks.la $(top_builddir)/fvh/src/libFvh.la $(top_builddir)/fsm/src/libFsm.la \ ++ $(top_builddir)/bdd/src/libBdd.la $(top_builddir)/abl/src/libAbl.la $(top_builddir)/aut/src/libAut.la $(top_builddir)/mbk/src/libMut.la + + + k2f_SOURCES = \ +diff --git a/alliance/src/l2p/src/Makefile.am b/alliance/src/l2p/src/Makefile.am +index 56ea85f..3cc9ead 100644 +--- a/alliance/src/l2p/src/Makefile.am ++++ b/alliance/src/l2p/src/Makefile.am +@@ -2,13 +2,12 @@ + + bin_PROGRAMS = l2p + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/mbk/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/rds/src + + l2p_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/rds/src/.libs \ +- -lMlu -lMpu -lMlo -lMph -lMut -lRds ++ $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMph.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/rds/src/libRds.la + + l2p_SOURCES = drive_ps.c rps_inc.h tmp_man.c \ + dict_color.ps l2p.c tmp_dict.c +diff --git a/alliance/src/log/src/Makefile.am b/alliance/src/log/src/Makefile.am +index dc7e4e1..2c85f8c 100644 +--- a/alliance/src/log/src/Makefile.am ++++ b/alliance/src/log/src/Makefile.am +@@ -1,7 +1,8 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src + lib_LTLIBRARIES = libLog.la + include_HEADERS = log.h + libLog_la_SOURCES = log_bdd0.c log.h log_thashbdd.c log_thashloc.c \ + log_bdd1.c log_prefbib.c log_thash.c + libLog_la_LDFLAGS = -version-info @LOG_DLL_VERSION@ +-libLog_la_LIBADD = -lMut ++libLog_la_LIBADD = $(top_builddir)/mbk/src/libMut.la ++ +diff --git a/alliance/src/loon/src/Makefile.am b/alliance/src/loon/src/Makefile.am +index a0a4f06..7ab7975 100644 +--- a/alliance/src/loon/src/Makefile.am ++++ b/alliance/src/loon/src/Makefile.am +@@ -2,23 +2,17 @@ + + bin_PROGRAMS = loon + +-AM_CFLAGS = -I$(top_srcdir)/abe/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ ++-I$(top_srcdir)/abe/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/abv/src \ + -I$(top_srcdir)/bdd/src \ +--I$(top_srcdir)/mbk/src \ +-@ALLIANCE_CFLAGS@ ++-I$(top_srcdir)/mbk/src + + loon_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abe/src \ +--L$(top_builddir)/abl/src \ +--L$(top_builddir)/abt/src \ +--L$(top_builddir)/abv/src \ +--L$(top_builddir)/aut/src \ +--L$(top_builddir)/bdd/src \ +--L$(top_builddir)/mbk/src \ +- -lAbv -lAbe -lAbt -lMlu -lMlo -lBdd -lAbl -lAut -lMut ++ $(top_builddir)/abv/src/libAbv.la $(top_builddir)/abe/src/libAbe.la $(top_builddir)/abt/src/libAbt.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/bdd/src/libBdd.la $(top_builddir)/abl/src/libAbl.la $(top_builddir)/aut/src/libAut.la $(top_builddir)/mbk/src/libMut.la + + loon_SOURCES = \ + lon_lax_param.c lon_lib_utils.c lon_optim_capa.h \ +diff --git a/alliance/src/lvx/src/Makefile.am b/alliance/src/lvx/src/Makefile.am +index 620999a..3bbdade 100644 +--- a/alliance/src/lvx/src/Makefile.am ++++ b/alliance/src/lvx/src/Makefile.am +@@ -1,10 +1,9 @@ + ## Process this file with automake to produce Makefile.in + bin_PROGRAMS = lvx + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src + +-lvx_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/mbk/src/.libs \ +- -lMlu -lMlo -lMut -lRcn ++lvx_LDADD = \ ++ $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/mbk/src/libRcn.la + + lvx_SOURCES = lvx.c +diff --git a/alliance/src/lynx/src/Makefile.am b/alliance/src/lynx/src/Makefile.am +index 6aa94ba..21b0152 100644 +--- a/alliance/src/lynx/src/Makefile.am ++++ b/alliance/src/lynx/src/Makefile.am +@@ -2,19 +2,16 @@ + + bin_PROGRAMS = cougar flatrds + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/rds/src + + cougar_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/rds/src/.libs \ +- -lRds -lMlu -lMpu -lMlo -lMph -lMut ++ $(top_builddir)/rds/src/libRds.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMph.la $(top_builddir)/mbk/src/libMut.la + + flatrds_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/rds/src/.libs \ +- -lRds -lMlu -lMpu -lMlo -lMph -lMut ++ $(top_builddir)/rds/src/libRds.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMph.la $(top_builddir)/mbk/src/libMut.la + + flatrds_SOURCES = flatrds.c + +diff --git a/alliance/src/mbk/src/Makefile.am b/alliance/src/mbk/src/Makefile.am +index 3830341..47820e0 100644 +--- a/alliance/src/mbk/src/Makefile.am ++++ b/alliance/src/mbk/src/Makefile.am +@@ -1,5 +1,5 @@ + AM_CFLAGS = -DTECHNO=\"symbolic_cmos\" +-YFLAGS = -d ++AM_YFLAGS = -d + + lib_LTLIBRARIES = libMut.la libMph.la libMpu.la libRcn.la libMlo.la libMlu.la + include_HEADERS = mlu.h mlo.h mpu.h mph.h mut.h rcn.h msl.h +@@ -49,22 +49,24 @@ CLEANFILES = mg2mbk_y.c mg2mbk_y.h mg2mbk_l.c \ + mvl_scomp_y.c mvl_scomp_y.h mvl_scomp_l.c + + mg2mbk_y.c mg2mbk_y.h : $(srcdir)/mg2mbk_y.y +- $(YACC) $(YFLAGS) $(srcdir)/mg2mbk_y.y && \ ++ $(YACC) $(AM_YFLAGS) $(srcdir)/mg2mbk_y.y && \ + sed -e "s/yy/mgn/g" -e "s/YY/MGN/g" y.tab.c > mg2mbk_y.c && \ + sed -e "s/yy/mgn/g" -e "s/YY/MGN/g" y.tab.h > mg2mbk_y.h + mg2mbk_l.c : $(srcdir)/mg2mbk_l.l mg2mbk_y.h + $(LEX) -t $(srcdir)/mg2mbk_l.l | sed -e "s/yy/mgn/g" -e "s/YY/MGN/g" > mg2mbk_l.c + + parser_y.c parser_y.h : $(srcdir)/parser_y.y +- $(YACC) $(YFLAGS) $(srcdir)/parser_y.y && \ ++ $(YACC) $(AM_YFLAGS) $(srcdir)/parser_y.y && \ + sed -e "s/yy/edif/g" -e "s/YY/EDIF/g" y.tab.c > parser_y.c && \ + sed -e "s/yy/edif/g" -e "s/YY/EDIF/g" y.tab.h > parser_y.h + parser_l.c : $(srcdir)/parser_l.l parser_y.h + $(LEX) -t $(srcdir)/parser_l.l | sed -e "s/yy/edif/g" -e "s/YY/EDIF/g" > parser_l.c + + mvl_scomp_y.c mvl_scomp_y.h : $(srcdir)/mvl_scomp_y.y +- $(YACC) $(YFLAGS) $(srcdir)/mvl_scomp_y.y && \ ++ $(YACC) $(AM_YFLAGS) $(srcdir)/mvl_scomp_y.y && \ + sed -e "s/yy/mvl_y_/g" -e "s/YY/MVL_Y_/g" y.tab.c > mvl_scomp_y.c && \ + sed -e "s/yy/mvl_y_/g" -e "s/YY/MVL_Y_/g" y.tab.h > mvl_scomp_y.h + mvl_scomp_l.c : $(srcdir)/mvl_scomp_l.l mvl_scomp_y.h + $(LEX) -t $(srcdir)/mvl_scomp_l.l | sed -e "s/yy/mvl_y_/g" -e "s/YY/MVL_Y_/g" > mvl_scomp_l.c ++ ++CLEANFILES += y.tab.c y.tab.h +diff --git a/alliance/src/mips_asm/src/Makefile.am b/alliance/src/mips_asm/src/Makefile.am +index f1bc628..6478ed8 100644 +--- a/alliance/src/mips_asm/src/Makefile.am ++++ b/alliance/src/mips_asm/src/Makefile.am +@@ -4,8 +4,8 @@ YACC = @YACC@ -d + + #INCLUDES = -I$(srcdir) + +-AM_CXXFLAGS = @ALLIANCE_CFLAGS@ +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/beh/src \ + -I$(top_srcdir)/log/src \ + -I$(top_srcdir)/mbk/src +@@ -13,12 +13,7 @@ AM_CFLAGS = @ALLIANCE_CFLAGS@ \ + bin_PROGRAMS = mips_asm + + mips_asm_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/beh/src/.libs \ +--L$(top_builddir)/log/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +- -lBeh -lMut -lLog ++ $(top_builddir)/beh/src/libBeh.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/log/src/libLog.la + + mips_asm_SOURCES = mips_defs.h mips_y.y mips_l.l mips_globals.c mips_lex.h mips_type.h mips_yacc.h mips_util.c + +diff --git a/alliance/src/mocha/src/Makefile.am b/alliance/src/mocha/src/Makefile.am +index bb3cd6a..89f011e 100644 +--- a/alliance/src/mocha/src/Makefile.am ++++ b/alliance/src/mocha/src/Makefile.am +@@ -2,7 +2,9 @@ + + bin_PROGRAMS = moka + +-AM_CFLAGS = -Wall \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/abe/src \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/abv/src \ +@@ -15,27 +17,24 @@ AM_CFLAGS = -Wall \ + -I$(top_srcdir)/ftl/src \ + -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/fvh/src \ +--I$(top_srcdir)/vex/src \ +-@ALLIANCE_CFLAGS@ ++-I$(top_srcdir)/vex/src + +-moka_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abe/src/.libs \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/abt/src/.libs \ +--L$(top_builddir)/abv/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/btr/src/.libs \ +--L$(top_builddir)/ctl/src/.libs \ +--L$(top_builddir)/ctp/src/.libs \ +--L$(top_builddir)/fks/src/.libs \ +--L$(top_builddir)/fsm/src/.libs \ +--L$(top_builddir)/ftl/src/.libs \ +--L$(top_builddir)/fvh/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +--L$(top_builddir)/vex/src/.libs \ +- -lFtl -lFks -lFvh -lFsm \ +- -lCtp -lCtl -lVex -lAbt -lAbv -lAbe -lBtr -lBdd -lAbl -lAut -lMut ++moka_LDADD = @ALLIANCE_LIBS@ ++moka_LDADD += $(top_builddir)/abe/src/libAbe.la ++moka_LDADD += $(top_builddir)/abl/src/libAbl.la ++moka_LDADD += $(top_builddir)/abt/src/libAbt.la ++moka_LDADD += $(top_builddir)/abv/src/libAbv.la ++moka_LDADD += $(top_builddir)/aut/src/libAut.la ++moka_LDADD += $(top_builddir)/bdd/src/libBdd.la ++moka_LDADD += $(top_builddir)/btr/src/libBtr.la ++moka_LDADD += $(top_builddir)/ctl/src/libCtl.la ++moka_LDADD += $(top_builddir)/ctp/src/libCtp.la ++moka_LDADD += $(top_builddir)/fks/src/libFks.la ++moka_LDADD += $(top_builddir)/fsm/src/libFsm.la ++moka_LDADD += $(top_builddir)/ftl/src/libFtl.la ++moka_LDADD += $(top_builddir)/fvh/src/libFvh.la ++moka_LDADD += $(top_builddir)/mbk/src/libMut.la ++moka_LDADD += $(top_builddir)/vex/src/libVex.la + + + moka_SOURCES = \ +diff --git a/alliance/src/nero/src/Makefile.am b/alliance/src/nero/src/Makefile.am +index f3a5abd..b24b5a3 100644 +--- a/alliance/src/nero/src/Makefile.am ++++ b/alliance/src/nero/src/Makefile.am +@@ -1,13 +1,8 @@ + ## Process this file with automake to produce Makefile.in + +-AM_CXXFLAGS = @ALLIANCE_CFLAGS@ \ +- -I$(top_srcdir)/abl/src \ +- -I$(top_srcdir)/aut/src \ +- -I$(top_srcdir)/beh/src \ +- -I$(top_srcdir)/genlib/src \ +- -I$(top_srcdir)/rds/src \ +- -I$(top_srcdir)/mbk/src +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ ++AM_CXXFLAGS = @ALLIANCE_CFLAGS@ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/beh/src \ +@@ -18,12 +13,9 @@ AM_CFLAGS = @ALLIANCE_CFLAGS@ \ + bin_PROGRAMS = nero pdv + #noinst_PROGRAMS = debug + +-nero_LDADD = -L$(libdir) @ALLIANCE_LIBS@ \ ++nero_LDADD = @ALLIANCE_LIBS@ \ + ./libU.a \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/rds/src/.libs \ +- -lMpu -lRds -lMlu -lMlo -lMph -lMut -lRcn -lAut ++ $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/rds/src/libRds.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMph.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/mbk/src/libRcn.la $(top_builddir)/aut/src/libAut.la + + noinst_LIBRARIES = libU.a + +@@ -51,9 +43,7 @@ libU_a_SOURCES = UConst.cpp \ + nero_SOURCES = nero.cpp + + pdv_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -lMpu -lMlu -lMlo -lMph -lMut -lRcn -lAut ++ $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMph.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/mbk/src/libRcn.la $(top_builddir)/aut/src/libAut.la + + pdv_SOURCES = pdv.c + +diff --git a/alliance/src/ocp/src/placer/Makefile.am b/alliance/src/ocp/src/placer/Makefile.am +index 49093f6..30437f0 100644 +--- a/alliance/src/ocp/src/placer/Makefile.am ++++ b/alliance/src/ocp/src/placer/Makefile.am +@@ -1,16 +1,14 @@ + ## Process this file with automake to produce Makefile.in + +-YACC = @YACC@ -d ++AM_YFLAGS = -d + +-INCLUDES = -I$(srcdir)/../common ++AM_CPPFLAGS = -I$(srcdir)/../common + +-AM_CXXFLAGS = @ALLIANCE_CFLAGS@ \ +- -I$(top_srcdir)/rds/src \ +- -I$(top_srcdir)/mbk/src \ +- -std=gnu++0x +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ +- -I$(top_srcdir)/rds/src \ +- -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS += -I$(top_srcdir)/rds/src ++AM_CPPFLAGS += -I$(top_srcdir)/mbk/src ++ ++# HACK ++AM_CXXFLAGS = -std=c++11 + + bin_PROGRAMS = ocp + +@@ -19,11 +17,14 @@ noinst_LIBRARIES = libOcp.a + libOcp_a_SOURCES = PElem.cpp PIns.cpp PNet.cpp \ + PCon.cpp + +-ocp_LDADD = @ALLIANCE_LIBS@ \ +- ../common/libPCommon.a \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/rds/src/.libs \ +- -lMpu -lRds -lMlu -lMlo -lMph -lMut -lRcn ++ocp_LDADD = ../common/libPCommon.a ++ocp_LDADD += $(top_builddir)/mbk/src/libMpu.la ++ocp_LDADD += $(top_builddir)/rds/src/libRds.la ++ocp_LDADD += $(top_builddir)/mbk/src/libMlu.la ++ocp_LDADD += $(top_builddir)/mbk/src/libMlo.la ++ocp_LDADD += $(top_builddir)/mbk/src/libMph.la ++ocp_LDADD += $(top_builddir)/mbk/src/libMut.la ++ocp_LDADD += $(top_builddir)/mbk/src/libRcn.la + + ocp_SOURCES = Ocp.cpp PBin.cpp PCon.cpp \ + PIns.cpp PMove.cpp PNet.cpp PONet.cpp \ +@@ -47,4 +48,4 @@ ocp_SOURCES = Ocp.cpp PBin.cpp PCon.cpp \ + + EXTRA_DIST = iocgram.h + +-CLEANFILES = iocgram.c iocgram.h ++CLEANFILES = iocgram.c iocgram.h iocscan.c +diff --git a/alliance/src/pat/src/Makefile.am b/alliance/src/pat/src/Makefile.am +index ac409be..d8875fb 100644 +--- a/alliance/src/pat/src/Makefile.am ++++ b/alliance/src/pat/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src + lib_LTLIBRARIES = libPat.la + include_HEADERS = pat.h ppt.h phl.h + libPat_la_SOURCES = pat_addpacom.c pat_addpaevt.c pat_addpagrp.c pat_addpaini.c \ +@@ -13,7 +13,9 @@ libPat_la_SOURCES = pat_addpacom.c pat_addpaevt.c pat_addpagrp.c pat_addpaini. + pat_type.h ppt.h \ + pat_debug.c pat_debug.h pat_getusage.c phl.h + libPat_la_LDFLAGS = -version-info @PAT_DLL_VERSION@ +-libPat_la_LIBADD = -lAut -lMut ++libPat_la_LIBADD = ++libPat_la_LIBADD += $(top_builddir)/mbk/src/libMut.la ++ + + EXTRADIST = pat_decl_y.c pat_decl_y.h pat_desc_y.h pat_desc_y.c \ + pat_decl_l.c +@@ -45,3 +47,4 @@ pat_desc_y.c pat_desc_y.h : $(srcdir)/pat_desc_y.y + pat_desc_l.c : $(srcdir)/pat_desc_l.l pat_desc_y.h + $(LEX) -t $(srcdir)/pat_desc_l.l | sed -e "s/yy/pat_desc_y_/g" -e "s/YY/PAT_DESC_Y_/g" > pat_desc_l.c + ++CLEANFILES += y.tab.c y.tab.h +diff --git a/alliance/src/pat2spi/src/Makefile.am b/alliance/src/pat2spi/src/Makefile.am +index 55e24ba..d6c3e37 100644 +--- a/alliance/src/pat2spi/src/Makefile.am ++++ b/alliance/src/pat2spi/src/Makefile.am +@@ -2,14 +2,12 @@ + + bin_PROGRAMS = pat2spi + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/aut/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/pat/src + + pat2spi_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/pat/src/.libs \ +- -lPat -lAut -lMut ++ $(top_builddir)/pat/src/libPat.la $(top_builddir)/aut/src/libAut.la $(top_builddir)/mbk/src/libMut.la + + pat2spi_SOURCES = pat2spi.c pat2spi.h +diff --git a/alliance/src/proof/src/Makefile.am b/alliance/src/proof/src/Makefile.am +index c6b6130..094988e 100644 +--- a/alliance/src/proof/src/Makefile.am ++++ b/alliance/src/proof/src/Makefile.am +@@ -2,21 +2,17 @@ + + bin_PROGRAMS = proof + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ -I$(top_srcdir)/beh/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/beh/src \ + -I$(top_srcdir)/bvl/src \ + -I$(top_srcdir)/log/src \ + -I$(top_srcdir)/mbk/src + +-proof_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/asimut/src/.libs \ +- -L$(top_builddir)/abl/src/.libs \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/beh/src/.libs \ +- -L$(top_builddir)/bhl/src/.libs \ +- -L$(top_builddir)/bvl/src/.libs \ +- -L$(top_builddir)/log/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -lBvl -lBhl -lBeh -lLog -lMut ++proof_LDADD = @ALLIANCE_LIBS@ ++proof_LDADD += $(top_builddir)/beh/src/libBeh.la ++proof_LDADD += $(top_builddir)/bvl/src/libBvl.la ++proof_LDADD += $(top_builddir)/log/src/libLog.la ++proof_LDADD += $(top_builddir)/mbk/src/libMut.la + + proof_SOURCES = proof_compile.c proof_main.c proof_util.c \ + proof_compile.h proof_util.h +diff --git a/alliance/src/rds/src/Makefile.am b/alliance/src/rds/src/Makefile.am +index 1773e3f..df695f1 100644 +--- a/alliance/src/rds/src/Makefile.am ++++ b/alliance/src/rds/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -DRTL_DEFAULT_TECHNO=\"etc/cmos.rds\" -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS = -DRTL_DEFAULT_TECHNO=\"etc/cmos.rds\" -I$(top_srcdir)/mbk/src + + lib_LTLIBRARIES = libRds.la + include_HEADERS = rds.h rfm.h rtl.h rwi.h rpr.h rut.h +@@ -24,4 +24,4 @@ libRds_la_SOURCES = rdsalloc.c rdsfree.c rdsadd.c rdsdel.c rdsview.c \ + gds_drive.h gds_parse.c gds_swap.h gds.h \ + gds_error.c gds_parse.h rgs.h gds_drive.c gds_error.h gds_swap.c + libRds_la_LDFLAGS = -version-info @RDS_DLL_VERSION@ +-libRds_la_LIBADD = -lMpu -lMut ++libRds_la_LIBADD = $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/ring/src/Makefile.am b/alliance/src/ring/src/Makefile.am +index 65e1653..ae13f98 100644 +--- a/alliance/src/ring/src/Makefile.am ++++ b/alliance/src/ring/src/Makefile.am +@@ -1,19 +1,23 @@ + ## Process this file with automake to produce Makefile.in + +-YACC = @YACC@ -d ++AM_YFLAGS = -d -p ring_yy ++AM_LFLAGS = -P ring_yy -o rinscan.c + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ +- -I$(top_srcdir)/mbk/src \ +- -I$(top_srcdir)/genlib/src ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = ++AM_CPPFLAGS += -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS += -I$(top_srcdir)/genlib/src + + bin_PROGRAMS = ring + +-ring_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/genlib/src \ +- -L$(top_builddir)/mbk/src \ +- -L$(top_builddir)/rds/src \ +- -lMgn -lMpu -lMlu -lMlo -lMph -lMut -lRcn -lRds +- ++ring_LDADD = @ALLIANCE_LIBS@ ++ring_LDADD += $(top_builddir)/genlib/src/libMgn.la ++ring_LDADD += $(top_builddir)/rds/src/libRds.la ++ring_LDADD += $(top_builddir)/mbk/src/libMpu.la ++ring_LDADD += $(top_builddir)/mbk/src/libMlu.la ++ring_LDADD += $(top_builddir)/mbk/src/libMlo.la ++ring_LDADD += $(top_builddir)/mbk/src/libMut.la ++ + ring_SOURCES = bigvia.c bigvia.h \ + compress.c compress.h \ + deport.c deport.h \ +@@ -34,6 +38,6 @@ ring_SOURCES = bigvia.c bigvia.h \ + struct.h \ + barre.c barre.h + +-EXTRA_DIST = ringram.h ++# EXTRA_DIST = ringram.h + + CLEANFILES = ringram.c ringram.h rinscan.c +diff --git a/alliance/src/rtd/src/Makefile.am b/alliance/src/rtd/src/Makefile.am +index 509c9c8..c208ef1 100644 +--- a/alliance/src/rtd/src/Makefile.am ++++ b/alliance/src/rtd/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/vex/src \ + -I$(top_srcdir)/rtn/src +@@ -7,4 +7,7 @@ include_HEADERS = rtd.h + libRtd_la_SOURCES = rtd.h rtd_drive.h rtd_error.h rtd_get.h rtd_parse.h \ + rtd_drive.c rtd_error.c rtd_get.c rtd_parse.c + libRtd_la_LDFLAGS = -version-info @RTD_DLL_VERSION@ +-libRtd_la_LIBADD = -lRtn -lVex -lMut ++libRtd_la_LIBADD = ++libRtd_la_LIBADD += $(top_builddir)/rtn/src/libRtn.la ++libRtd_la_LIBADD += $(top_builddir)/vex/src/libVex.la ++libRtd_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +\ No newline at end of file +diff --git a/alliance/src/rtn/src/Makefile.am b/alliance/src/rtn/src/Makefile.am +index 0121f97..16a5028 100644 +--- a/alliance/src/rtn/src/Makefile.am ++++ b/alliance/src/rtn/src/Makefile.am +@@ -1,8 +1,11 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/vex/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/vex/src + lib_LTLIBRARIES = libRtn.la + include_HEADERS = rtn.h + libRtn_la_SOURCES = rtnadd.h rtndel.c rtnerror.h rtnget.c rtnsearch.h \ + rtn.h rtnalloc.c rtndel.h rtnfree.c rtnget.h rtnview.c \ + rtnadd.c rtnalloc.h rtnerror.c rtnfree.h rtnsearch.c rtnview.h + libRtn_la_LDFLAGS = -version-info @RTN_DLL_VERSION@ +-libRtn_la_LIBADD = -lVex -lAut -lMut ++libRtn_la_LIBADD = ++libRtn_la_LIBADD += $(top_builddir)/vex/src/libVex.la ++libRtn_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libRtn_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/s2r/src/Makefile.am b/alliance/src/s2r/src/Makefile.am +index b193efd..06b3df8 100644 +--- a/alliance/src/s2r/src/Makefile.am ++++ b/alliance/src/s2r/src/Makefile.am +@@ -2,15 +2,16 @@ + + bin_PROGRAMS = s2r + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ +- -I$(top_srcdir)/rds/src \ +- -I$(top_srcdir)/genview/src/gcc-1.42 \ +- -I$(top_srcdir)/mbk/src ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = ++AM_CPPFLAGS += -I$(top_srcdir)/rds/src ++AM_CPPFLAGS += -I$(top_srcdir)/mbk/src + +-s2r_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/rds/src/.libs \ +- -lMpu -lRds -lMph -lMut ++s2r_LDADD = @ALLIANCE_LIBS@ ++s2r_LDADD += $(top_builddir)/mbk/src/libMpu.la ++s2r_LDADD += $(top_builddir)/rds/src/libRds.la ++s2r_LDADD += $(top_builddir)/mbk/src/libMph.la ++s2r_LDADD += $(top_builddir)/mbk/src/libMut.la + + s2r_SOURCES = generic.h hash.h maxima.h merge.h\ + postrat.h rdsacces.h statistics.c hash.c\ +diff --git a/alliance/src/scapin/src/Makefile.am b/alliance/src/scapin/src/Makefile.am +index 342d67c..a729da1 100644 +--- a/alliance/src/scapin/src/Makefile.am ++++ b/alliance/src/scapin/src/Makefile.am +@@ -2,15 +2,14 @@ + + bin_PROGRAMS = scapin + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/mbk/src \ + -DSCAPIN_DEFAULT_PARAM_NAME=\"etc/sxlib.scapin\" + +-scapin_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -lMlu -lMlo -lMut -lRcn -lAut ++scapin_LDADD = @ALLIANCE_LIBS@ ++scapin_LDADD += $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/mbk/src/libRcn.la $(top_builddir)/aut/src/libAut.la + + scapin_SOURCES = scan_insert.c scan_insert.h scan_main.c scan_main.h \ + scan_param.c scan_param.h scan_path.c scan_path.h +diff --git a/alliance/src/scl/src/Makefile.am b/alliance/src/scl/src/Makefile.am +index 77bf364..867c8d4 100644 +--- a/alliance/src/scl/src/Makefile.am ++++ b/alliance/src/scl/src/Makefile.am +@@ -1,6 +1,8 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src \ +- -I$(top_srcdir)/abl/src -I$(top_srcdir)/bdd/src \ +- -I$(top_srcdir)/abe/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS += -I$(top_srcdir)/aut/src ++AM_CPPFLAGS += -I$(top_srcdir)/abl/src ++AM_CPPFLAGS += -I$(top_srcdir)/bdd/src ++AM_CPPFLAGS += -I$(top_srcdir)/abe/src + lib_LTLIBRARIES = libScl.la + include_HEADERS = scl.h + libScl_la_SOURCES = scgmain.h schenv.c schget.h scpadd.h scpfree.c \ +@@ -11,4 +13,9 @@ libScl_la_SOURCES = scgmain.h schenv.c schget.h scpadd.h scpfree.c \ + scglofig.h schdel.c schfree.h scp.h scpdel.c \ + scgmain.c schdel.h schget.c scpadd.c scpdel.h + libScl_la_LDFLAGS = -version-info @SCL_DLL_VERSION@ +-libScl_la_LIBADD = -lAbl -lAut -lMut ++libScl_la_LIBADD = ++libScl_la_LIBADD += $(top_builddir)/abe/src/libAbe.la ++libScl_la_LIBADD += $(top_builddir)/bdd/src/libBdd.la ++libScl_la_LIBADD += $(top_builddir)/abl/src/libAbl.la ++libScl_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libScl_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/sea/src/Makefile.am b/alliance/src/sea/src/Makefile.am +index e1dcce1..2ba9e7f 100644 +--- a/alliance/src/sea/src/Makefile.am ++++ b/alliance/src/sea/src/Makefile.am +@@ -3,7 +3,8 @@ + AM_YFLAGS = -d -v -p DEF_grammar + AM_LFLAGS = -s -f -8 -pp -PDEF_grammar -olex.yy.c + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/mbk/src + +@@ -12,21 +13,15 @@ bin_SCRIPTS = sea seroute seplace a2lef + + a2def_LDADD = @ALLIANCE_LIBS@ \ + ./libUtil.a \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -lMpu -lMlu -lMlo -lMph -lMut -lRcn -lAut ++ $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMph.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/mbk/src/libRcn.la $(top_builddir)/aut/src/libAut.la + + def2a_LDADD = @ALLIANCE_LIBS@ \ + ./libUtil.a \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -lMpu -lMlu -lMlo -lMph -lMut -lRcn -lAut ++ $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMph.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/mbk/src/libRcn.la $(top_builddir)/aut/src/libAut.la + + sxlib2lef_LDADD = @ALLIANCE_LIBS@ \ + ./libUtil.a \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -lMpu -lMlu -lMlo -lMph -lMut -lRcn -lAut ++ $(top_builddir)/mbk/src/libMpu.la $(top_builddir)/mbk/src/libMlu.la $(top_builddir)/mbk/src/libMlo.la $(top_builddir)/mbk/src/libMph.la $(top_builddir)/mbk/src/libMut.la $(top_builddir)/mbk/src/libRcn.la $(top_builddir)/aut/src/libAut.la + + noinst_LIBRARIES = libUtil.a + +diff --git a/alliance/src/syf/src/Makefile.am b/alliance/src/syf/src/Makefile.am +index 293e333..f1a4de5 100644 +--- a/alliance/src/syf/src/Makefile.am ++++ b/alliance/src/syf/src/Makefile.am +@@ -2,27 +2,26 @@ + + bin_PROGRAMS = syf + +-AM_CFLAGS = \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++ ++AM_CPPFLAGS = \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/bdd/src \ + -I$(top_srcdir)/fsm/src \ + -I$(top_srcdir)/ftl/src \ + -I$(top_srcdir)/fvh/src \ +--I$(top_srcdir)/mbk/src \ +-@ALLIANCE_CFLAGS@ ++-I$(top_srcdir)/mbk/src + +-syf_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/fks/src/.libs \ +--L$(top_builddir)/fsm/src/.libs \ +--L$(top_builddir)/ftl/src/.libs \ +--L$(top_builddir)/fvh/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +- -lFtl -lFks -lFvh -lFsm \ +- -lBdd -lAbl -lAut -lMut ++syf_LDADD = @ALLIANCE_LIBS@ ++syf_LDADD += $(top_builddir)/abl/src/libAbl.la ++syf_LDADD += $(top_builddir)/aut/src/libAut.la ++syf_LDADD += $(top_builddir)/bdd/src/libBdd.la ++syf_LDADD += $(top_builddir)/fks/src/libFks.la ++syf_LDADD += $(top_builddir)/fsm/src/libFsm.la ++syf_LDADD += $(top_builddir)/ftl/src/libFtl.la ++syf_LDADD += $(top_builddir)/fvh/src/libFvh.la ++syf_LDADD += $(top_builddir)/mbk/src/libMut.la + + + syf_SOURCES = \ +diff --git a/alliance/src/vasy/src/Makefile.am b/alliance/src/vasy/src/Makefile.am +index 168d186..b89eca2 100644 +--- a/alliance/src/vasy/src/Makefile.am ++++ b/alliance/src/vasy/src/Makefile.am +@@ -2,29 +2,29 @@ + + bin_PROGRAMS = vasy + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ +--I$(top_srcdir)/abl/src \ +--I$(top_srcdir)/aut/src \ +--I$(top_srcdir)/bdd/src \ +--I$(top_srcdir)/mbk/src \ +--I$(top_srcdir)/rtd/src \ +--I$(top_srcdir)/rtn/src \ +--I$(top_srcdir)/vex/src \ +--I$(top_srcdir)/vbh/src \ +--I$(top_srcdir)/vpn/src ++AM_CFLAGS = @ALLIANCE_CFLAGS@ + +-vasy_LDADD = @ALLIANCE_LIBS@ \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +--L$(top_builddir)/rtd/src/.libs \ +--L$(top_builddir)/rtn/src/.libs \ +--L$(top_builddir)/vbh/src/.libs \ +--L$(top_builddir)/vex/src/.libs \ +--L$(top_builddir)/vpn/src/.libs \ +- -lRtd -lRtn -lVpn -lVbh \ +- -lVex -lBdd -lAbl -lAut -lMut ++AM_CPPFLAGS = ++AM_CPPFLAGS += -I$(top_srcdir)/abl/src ++AM_CPPFLAGS += -I$(top_srcdir)/aut/src ++AM_CPPFLAGS += -I$(top_srcdir)/bdd/src ++AM_CPPFLAGS += -I$(top_srcdir)/mbk/src ++AM_CPPFLAGS += -I$(top_srcdir)/rtd/src ++AM_CPPFLAGS += -I$(top_srcdir)/rtn/src ++AM_CPPFLAGS += -I$(top_srcdir)/vex/src ++AM_CPPFLAGS += -I$(top_srcdir)/vbh/src ++AM_CPPFLAGS += -I$(top_srcdir)/vpn/src ++ ++vasy_LDADD = @ALLIANCE_LIBS@ ++vasy_LDADD += $(top_builddir)/abl/src/libAbl.la ++vasy_LDADD += $(top_builddir)/aut/src/libAut.la ++vasy_LDADD += $(top_builddir)/bdd/src/libBdd.la ++vasy_LDADD += $(top_builddir)/mbk/src/libMut.la ++vasy_LDADD += $(top_builddir)/rtd/src/libRtd.la ++vasy_LDADD += $(top_builddir)/rtn/src/libRtn.la ++vasy_LDADD += $(top_builddir)/vbh/src/libVbh.la ++vasy_LDADD += $(top_builddir)/vex/src/libVex.la ++vasy_LDADD += $(top_builddir)/vpn/src/libVpn.la + + vasy_SOURCES = \ + vasy_analys.c vasy_drvvlog.h vasy_mulwait.c vasy_redwait.h \ +diff --git a/alliance/src/vbh/src/Makefile.am b/alliance/src/vbh/src/Makefile.am +index d017730..e3b8c97 100644 +--- a/alliance/src/vbh/src/Makefile.am ++++ b/alliance/src/vbh/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src \ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/vex/src \ + -I$(top_srcdir)/vpn/src +@@ -13,7 +13,10 @@ libVbh_la_SOURCES = vbh.h vbh_add.c vbh_crt.c vbh_dup.c vbh_fre.c vbh_simp + vtl.h vtlacces.c vtlacces.h vtlerror.c vtlerror.h \ + vpd.h vpd_drive.h vpd_error.h vpd_parse.h \ + vpd_drive.c vpd_error.c vpd_parse.c +-libVbh_la_LIBADD = -lVpn -lVex -lAut -lMut ++libVbh_la_LIBADD = $(top_builddir)/vpn/src/libVpn.la ++libVbh_la_LIBADD += $(top_builddir)/vex/src/libVex.la ++libVbh_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libVbh_la_LIBADD += $(top_builddir)/mbk/src/libMut.la + + CLEANFILES = vbl_bcomp_y.c vbl_bcomp_y.h vbl_bcomp_l.c + +@@ -21,3 +24,5 @@ vbl_bcomp_y.c vbl_bcomp_y.h : $(srcdir)/vbl_bcomp_y.y + $(YACC) -d $(YFLAGS) $(srcdir)/vbl_bcomp_y.y && sed -e "s/yy/vbl_y_/g" -e "s/YY/VBL_Y_/g" y.tab.c > vbl_bcomp_y.c && sed -e "s/yy/vbl_y_/g" -e "s/YY/VBL_Y_/g" y.tab.h > vbl_bcomp_y.h + vbl_bcomp_l.c : $(srcdir)/vbl_bcomp_l.l vbl_bcomp_y.h + $(LEX) -t $(srcdir)/vbl_bcomp_l.l | sed -e "s/yy/vbl_y_/g" -e "s/YY/VBL_Y_/g" > vbl_bcomp_l.c ++ ++CLEANFILES += y.tab.c y.tab.h +diff --git a/alliance/src/vex/src/Makefile.am b/alliance/src/vex/src/Makefile.am +index 167c80e..f148ffc 100644 +--- a/alliance/src/vex/src/Makefile.am ++++ b/alliance/src/vex/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src + lib_LTLIBRARIES = libVex.la + include_HEADERS = vex.h + libVex_la_SOURCES = vexcreate.h vexerror.c vexfree.h vexshift.c vexunflat.h \ +@@ -9,4 +9,6 @@ libVex_la_SOURCES = vexcreate.h vexerror.c vexfree.h vexshift.c vexunflat + vexalloc.h vexenv.c vexextend.h vexoptim.c vexslice.h \ + vexcreate.c vexenv.h vexfree.c vexoptim.h vexunflat.c + libVex_la_LDFLAGS = -version-info @VEX_DLL_VERSION@ +-libVex_la_LIBADD = -lAut -lMut ++libVex_la_LIBADD = ++libVex_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libVex_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/vpn/src/Makefile.am b/alliance/src/vpn/src/Makefile.am +index c5687e9..e68b1af 100644 +--- a/alliance/src/vpn/src/Makefile.am ++++ b/alliance/src/vpn/src/Makefile.am +@@ -1,4 +1,4 @@ +-AM_CFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/vex/src ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src -I$(top_srcdir)/aut/src -I$(top_srcdir)/vex/src + lib_LTLIBRARIES = libVpn.la + include_HEADERS = vpn.h + libVpn_la_SOURCES = vpnalloc.c vpnenv.h vpnget.c vpnsimp.h \ +@@ -7,4 +7,7 @@ libVpn_la_SOURCES = vpnalloc.c vpnenv.h vpnget.c vpnsimp.h \ + vpnadd.c vpndel.h vpnfree.c vpnsearch.h vpnview.c \ + vpnadd.h vpnenv.c vpnfree.h vpnsimp.c vpnview.h + libVpn_la_LDFLAGS = -version-info @VPN_DLL_VERSION@ +-libVpn_la_LIBADD = -lVex -lAut -lMut ++libVpn_la_LIBADD = ++libVpn_la_LIBADD += $(top_builddir)/vex/src/libVex.la ++libVpn_la_LIBADD += $(top_builddir)/aut/src/libAut.la ++libVpn_la_LIBADD += $(top_builddir)/mbk/src/libMut.la +diff --git a/alliance/src/x2y/src/Makefile.am b/alliance/src/x2y/src/Makefile.am +index 48f3ae0..ffb43c7 100644 +--- a/alliance/src/x2y/src/Makefile.am ++++ b/alliance/src/x2y/src/Makefile.am +@@ -1,12 +1,16 @@ + # $Id: Makefile.am,v 1.8 2005/01/19 15:13:57 hcl Exp $ + +-AM_CFLAGS = @ALLIANCE_CFLAGS@ \ +--I$(top_srcdir)/mbk/src ++AM_CFLAGS = @ALLIANCE_CFLAGS@ ++AM_CPPFLAGS = -I$(top_srcdir)/mbk/src + + bin_PROGRAMS = x2y + +-x2y_LDADD = @ALLIANCE_LIBS@ \ +- -L$(top_builddir)/mbk/src/.libs \ +- -lMpu -lMlu -lMlo -lMph -lMut -lRcn +- ++x2y_LDADD = @ALLIANCE_LIBS@ ++x2y_LDADD += $(top_builddir)/mbk/src/libMpu.la ++x2y_LDADD += $(top_builddir)/mbk/src/libMlu.la ++x2y_LDADD += $(top_builddir)/mbk/src/libMlo.la ++x2y_LDADD += $(top_builddir)/mbk/src/libMph.la ++x2y_LDADD += $(top_builddir)/mbk/src/libMut.la ++x2y_LDADD += $(top_builddir)/mbk/src/libRcn.la ++ + x2y_SOURCES = x2y.c +diff --git a/alliance/src/xfsm/src/Makefile.am b/alliance/src/xfsm/src/Makefile.am +index e702229..7040cb1 100644 +--- a/alliance/src/xfsm/src/Makefile.am ++++ b/alliance/src/xfsm/src/Makefile.am +@@ -1,8 +1,9 @@ + ## Process this file with automake to produce Makefile.in + + bin_PROGRAMS = xfsm +-AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ \ +- -DXFSM_DEFAULT_PARAM_NAME=\"${ALLIANCE_TOP}/etc/xfsm.par\" \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ ++ ++AM_CPPFLAGS = -DXFSM_DEFAULT_PARAM_NAME=\"${ALLIANCE_TOP}/etc/xfsm.par\" \ + -DXMS_FILE_NAME=\".xfsm.cfg\" \ + -I$(top_srcdir)/abl/src \ + -I$(top_srcdir)/aut/src \ +@@ -42,18 +43,16 @@ ALL_X_LIBS = $(X_LDFLAGS) $(LIBXM) $(LIBXT) \ + $(LIBXP) $(LIBXEXT) $(LIBX11) + + ++xfsm_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) ++xfsm_LDADD += $(top_builddir)/ftl/src/libFtl.la ++xfsm_LDADD += $(top_builddir)/fks/src/libFks.la ++xfsm_LDADD += $(top_builddir)/fvh/src/libFvh.la ++xfsm_LDADD += $(top_builddir)/fsm/src/libFsm.la ++xfsm_LDADD += $(top_builddir)/bdd/src/libBdd.la ++xfsm_LDADD += $(top_builddir)/abl/src/libAbl.la ++xfsm_LDADD += $(top_builddir)/aut/src/libAut.la ++xfsm_LDADD += $(top_builddir)/mbk/src/libMut.la + +-xfsm_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) \ +--L$(top_builddir)/abl/src/.libs \ +--L$(top_builddir)/aut/src/.libs \ +--L$(top_builddir)/bdd/src/.libs \ +--L$(top_builddir)/fks/src/.libs \ +--L$(top_builddir)/fsm/src/.libs \ +--L$(top_builddir)/ftl/src/.libs \ +--L$(top_builddir)/fvh/src/.libs \ +--L$(top_builddir)/mbk/src/.libs \ +- -lFtl -lFks -lFvh -lFsm \ +- -lBdd -lAbl -lAut -lMut + + xfsm_SOURCES = \ + LIP6bw.h XME_search.c XMS_panel.c XMV_panel.h XMX_panel.h \ +diff --git a/alliance/src/xgra/src/Makefile.am b/alliance/src/xgra/src/Makefile.am +index 5ebd988..a78c146 100644 +--- a/alliance/src/xgra/src/Makefile.am ++++ b/alliance/src/xgra/src/Makefile.am +@@ -2,14 +2,14 @@ + + bin_PROGRAMS = xgra + AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ \ ++ $(GLIB_CFLAGS) ++AM_CPPFLAGS = \ + -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/mbk/src \ + -DXGRA_DEFAULT_PARAM_NAME=\"${ALLIANCE_TOP}/etc/xgra.par\" \ + -DXMS_FILE_NAME=\".xgra.cfg\" \ +- $(GLIB_CFLAGS) \ + -DG_LOG_DOMAIN=\"xgra\" + +- + # ----------------------------------------------------------------------------- + # X Libraries. + # ----------------------------------------------------------------------------- +@@ -43,9 +43,7 @@ ALL_X_LIBS = $(X_LDFLAGS) $(LIBXM) $(LIBXT) \ + + + xgra_LDADD = @ALLIANCE_LIBS@ $(GLIB_CFLAGS) $(ALL_X_LIBS) \ +--L$(top_builddir)/aut/src \ +--L$(top_builddir)/mbk/src \ +--lAut -lMut ++$(top_builddir)/aut/src/libAut.la $(top_builddir)/mbk/src/libMut.la + + xgra_SOURCES = \ + LIP6bw.h XME_dialog.c XME_dialog.h XME_edit.c XME_edit.h XME.h XME_menu.c \ +diff --git a/alliance/src/xpat/src/Makefile.am b/alliance/src/xpat/src/Makefile.am +index 0ade0a1..9ab3be2 100644 +--- a/alliance/src/xpat/src/Makefile.am ++++ b/alliance/src/xpat/src/Makefile.am +@@ -1,10 +1,11 @@ + ## Process this file with automake to produce Makefile.in + + bin_PROGRAMS = xpat +-AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ \ +- -DXPAT_DEFAULT_PARAM_NAME=\"${ALLIANCE_TOP}/etc/xpat.par\" \ +- -DXMS_FILE_NAME=\".xpat.cfg\" \ +- -I$(top_srcdir)/aut/src \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ ++AM_CPPFLAGS = -DXPAT_DEFAULT_PARAM_NAME=\"${ALLIANCE_TOP}/etc/xpat.par\" \ ++ -DXMS_FILE_NAME=\".xpat.cfg\" ++ ++AM_CPPFLAGS += -I$(top_srcdir)/aut/src \ + -I$(top_srcdir)/mbk/src \ + -I$(top_srcdir)/pat/src + +@@ -40,11 +41,10 @@ ALL_X_LIBS = $(X_LDFLAGS) $(LIBXM) $(LIBXT) \ + + + +-xpat_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/pat/src/.libs \ +- -lPat -lAut -lMut ++xpat_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) ++xpat_LDADD += $(top_builddir)/pat/src/libPat.la ++xpat_LDADD += $(top_builddir)/aut/src/libAut.la ++xpat_LDADD += $(top_builddir)/mbk/src/libMut.la + + xpat_SOURCES = \ + LIP6bw.h XME_dialog.c XME_dialog.h XME_edit.c XME_edit.h \ +diff --git a/alliance/src/xsch/src/Makefile.am b/alliance/src/xsch/src/Makefile.am +index df964a2..677076a 100644 +--- a/alliance/src/xsch/src/Makefile.am ++++ b/alliance/src/xsch/src/Makefile.am +@@ -1,8 +1,8 @@ + ## Process this file with automake to produce Makefile.in + + bin_PROGRAMS = xsch +-AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ \ +- -DXSCH_DEFAULT_PARAM_NAME=\"${ALLIANCE_TOP}/etc/xsch.par\" \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ ++AM_CPPFLAGS = -DXSCH_DEFAULT_PARAM_NAME=\"${ALLIANCE_TOP}/etc/xsch.par\" \ + -DXMS_FILE_NAME=\".xsch.cfg\" \ + -I$(top_srcdir)/abe/src \ + -I$(top_srcdir)/abl/src \ +@@ -44,15 +44,16 @@ ALL_X_LIBS = $(X_LDFLAGS) $(LIBXM) $(LIBXT) \ + + + +-xsch_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) \ +- -L$(top_builddir)/abe/src/.libs \ +- -L$(top_builddir)/abl/src/.libs \ +- -L$(top_builddir)/abv/src/.libs \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/bdd/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/scl/src/.libs \ +- -lScl -lMlu -lMlo -lMut -lAbv -lAbe -lBdd -lAbl -lAut -lRcn ++xsch_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) ++xsch_LDADD += $(top_builddir)/abe/src/libAbe.la ++xsch_LDADD += $(top_builddir)/abl/src/libAbl.la ++xsch_LDADD += $(top_builddir)/abv/src/libAbv.la ++xsch_LDADD += $(top_builddir)/aut/src/libAut.la ++xsch_LDADD += $(top_builddir)/bdd/src/libBdd.la ++xsch_LDADD += $(top_builddir)/mbk/src/libMut.la ++xsch_LDADD += $(top_builddir)/scl/src/libScl.la ++xsch_LDADD += $(top_builddir)/mbk/src/libMlo.la ++xsch_LDADD += $(top_builddir)/mbk/src/libMlu.la + + xsch_SOURCES = \ + LIP6bw.h XME_dialog.c XME_dialog.h XME_edit.c XME_edit.h XME.h XME_menu.c XME_menu.h \ +diff --git a/alliance/src/xvpn/src/Makefile.am b/alliance/src/xvpn/src/Makefile.am +index fdb4ff6..1a88cbe 100644 +--- a/alliance/src/xvpn/src/Makefile.am ++++ b/alliance/src/xvpn/src/Makefile.am +@@ -1,7 +1,8 @@ + ## Process this file with automake to produce Makefile.in + + bin_PROGRAMS = xvpn +-AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ \ ++AM_CFLAGS = @ALLIANCE_CFLAGS@ @X_CFLAGS@ ++AM_CPPFLAGS = \ + -DXVPN_DEFAULT_PARAM_NAME=\"${ALLIANCE_TOP}/etc/xvpn.par\" \ + -DXMS_FILE_NAME=\".xvpn.cfg\" \ + -I$(top_srcdir)/aut/src \ +@@ -44,14 +45,13 @@ ALL_X_LIBS = $(X_LDFLAGS) $(LIBXM) $(LIBXT) \ + + + +-xvpn_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) \ +- -L$(top_builddir)/abl/src/.libs \ +- -L$(top_builddir)/aut/src/.libs \ +- -L$(top_builddir)/mbk/src/.libs \ +- -L$(top_builddir)/vbh/src/.libs \ +- -L$(top_builddir)/vex/src/.libs \ +- -L$(top_builddir)/vpn/src/.libs \ +- -lVpn -lVbh -lVex -lAbl -lAut -lMut ++xvpn_LDADD = @ALLIANCE_LIBS@ $(ALL_X_LIBS) ++xvpn_LDADD += $(top_builddir)/abl/src/libAbl.la ++xvpn_LDADD += $(top_builddir)/aut/src/libAut.la ++xvpn_LDADD += $(top_builddir)/mbk/src/libMut.la ++xvpn_LDADD += $(top_builddir)/vbh/src/libVbh.la ++xvpn_LDADD += $(top_builddir)/vex/src/libVex.la ++xvpn_LDADD += $(top_builddir)/vpn/src/libVpn.la + + xvpn_SOURCES = \ + LIP6bw.h XME_dialog.c XME_dialog.h XME_edit.c XME_edit.h XME.h XME_menu.c \ +-- +2.5.0 + diff --git a/0009-Misc.-doc-fixes.patch b/0009-Misc.-doc-fixes.patch new file mode 100644 index 0000000..02b75ff --- /dev/null +++ b/0009-Misc.-doc-fixes.patch @@ -0,0 +1,388 @@ +From 57060f1447e54d636271433309a6813752ec26dc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Sun, 28 Feb 2016 15:03:03 +0100 +Subject: [PATCH 09/10] Misc. doc fixes. + +--- + alliance/src/boog/doc/boog.1 | 2 +- + .../documentation/tutorials/place_and_route/tex/place_and_route.tex | 1 - + .../src/documentation/tutorials/simulation/src/addaccu_beh/addaccu.vbe | 0 + .../documentation/tutorials/simulation/src/addaccu_beh/addaccu4.vhdl | 0 + .../documentation/tutorials/simulation/src/addaccu_beh/addaccu_dly.vbe | 0 + .../documentation/tutorials/simulation/src/addaccu_beh/patterns.pat | 0 + .../tutorials/simulation/src/addaccu_beh/patterns_dly.pat | 0 + .../src/documentation/tutorials/simulation/src/addaccu_struct/accu.vbe | 0 + .../src/documentation/tutorials/simulation/src/addaccu_struct/accu.vst | 0 + .../documentation/tutorials/simulation/src/addaccu_struct/addaccu.vbe | 0 + .../documentation/tutorials/simulation/src/addaccu_struct/addaccu.vst | 0 + .../src/documentation/tutorials/simulation/src/addaccu_struct/alu.vbe | 0 + .../src/documentation/tutorials/simulation/src/addaccu_struct/alu.vst | 0 + .../src/documentation/tutorials/simulation/src/addaccu_struct/mux.vbe | 0 + .../src/documentation/tutorials/simulation/src/addaccu_struct/mux.vst | 0 + .../documentation/tutorials/simulation/src/addaccu_struct/pat_new.c | 0 + alliance/src/documentation/tutorials/simulation/tex/simulation.tex | 1 - + alliance/src/documentation/tutorials/start/Makefile | 2 +- + alliance/src/documentation/tutorials/start/start.tex | 2 +- + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_0.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_1.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_10.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_11.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_12.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_13.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_14.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_15.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_16.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_17.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_18.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_19.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_2.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_20.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_21.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_22.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_23.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_24.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_3.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_4.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_5.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_6.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_7.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_8.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_9.vbe | 0 + alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_ok.vbe | 0 + alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex | 1 - + alliance/src/fsm/man1/fsm.1 | 2 +- + alliance/src/mbk/man3/viewlofigcon.3 | 3 ++- + alliance/src/mbk/man3/viewphfig.3 | 3 ++- + alliance/src/mbk/man3/viewphvia.3 | 3 ++- + alliance/src/nero/doc/man1/nero.1 | 1 - + alliance/src/ring/doc/ring.1 | 2 +- + 52 files changed, 11 insertions(+), 12 deletions(-) + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu4.vhdl + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu_dly.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_beh/patterns.pat + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_beh/patterns_dly.pat + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/accu.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/accu.vst + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/addaccu.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/addaccu.vst + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/alu.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/alu.vst + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/mux.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/mux.vst + mode change 100755 => 100644 alliance/src/documentation/tutorials/simulation/src/addaccu_struct/pat_new.c + mode change 100755 => 100644 alliance/src/documentation/tutorials/start/Makefile + mode change 100755 => 100644 alliance/src/documentation/tutorials/start/start.tex + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_0.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_1.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_10.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_11.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_12.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_13.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_14.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_15.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_16.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_17.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_18.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_19.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_2.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_20.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_21.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_22.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_23.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_24.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_3.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_4.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_5.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_6.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_7.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_8.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_9.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_ok.vbe + mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex + +diff --git a/alliance/src/boog/doc/boog.1 b/alliance/src/boog/doc/boog.1 +index 052524c..44f6014 100644 +--- a/alliance/src/boog/doc/boog.1 ++++ b/alliance/src/boog/doc/boog.1 +@@ -136,7 +136,7 @@ Just another way to show explicitely the \f4VST\fP output file name. + Just another way to show explicitely the \f4LAX\fP parameter file name. + .TP 10 + \f4\-d debug_file\fP +-Generates a \f4VBE\f debug file. It comes from internal result algorithm. Users aren't concerned. ++Generates a \f4VBE\fP debug file. It comes from internal result algorithm. Users aren't concerned. + .br + + .SH ENVIRONMENT VARIABLES +diff --git a/alliance/src/documentation/tutorials/place_and_route/tex/place_and_route.tex b/alliance/src/documentation/tutorials/place_and_route/tex/place_and_route.tex +index 8d51631..0115a94 100644 +--- a/alliance/src/documentation/tutorials/place_and_route/tex/place_and_route.tex ++++ b/alliance/src/documentation/tutorials/place_and_route/tex/place_and_route.tex +@@ -85,7 +85,6 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + %\end{figure} + %---------------------------------- document --------------------------------- + \begin{document} +-\setlength{\footrulewidth}{0.6pt} + + \title{ + {\Huge ALLIANCE TUTORIAL \\} +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu.vbe b/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu4.vhdl b/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu4.vhdl +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu_dly.vbe b/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/addaccu_dly.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/patterns.pat b/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/patterns.pat +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/patterns_dly.pat b/alliance/src/documentation/tutorials/simulation/src/addaccu_beh/patterns_dly.pat +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/accu.vbe b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/accu.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/accu.vst b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/accu.vst +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/addaccu.vbe b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/addaccu.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/addaccu.vst b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/addaccu.vst +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/alu.vbe b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/alu.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/alu.vst b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/alu.vst +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/mux.vbe b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/mux.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/mux.vst b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/mux.vst +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/pat_new.c b/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/pat_new.c +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/simulation/tex/simulation.tex b/alliance/src/documentation/tutorials/simulation/tex/simulation.tex +index 7a7bc19..b7c6299 100644 +--- a/alliance/src/documentation/tutorials/simulation/tex/simulation.tex ++++ b/alliance/src/documentation/tutorials/simulation/tex/simulation.tex +@@ -91,7 +91,6 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + %---------------------------------- document --------------------------------- + + \begin{document} +-\setlength{\footrulewidth}{0.6pt} + + \title{ + {\Huge ALLIANCE TUTORIAL\\} +diff --git a/alliance/src/documentation/tutorials/start/Makefile b/alliance/src/documentation/tutorials/start/Makefile +old mode 100755 +new mode 100644 +index 2a99685..4649755 +--- a/alliance/src/documentation/tutorials/start/Makefile ++++ b/alliance/src/documentation/tutorials/start/Makefile +@@ -14,4 +14,4 @@ start.dvi : start.tex + latex start.tex + + clean : +- rm -f $(MYFILE).ps $(MYFILE).pdf *.log *.dvi *.aux ++ rm -f start.ps start.pdf *.log *.dvi *.aux +diff --git a/alliance/src/documentation/tutorials/start/start.tex b/alliance/src/documentation/tutorials/start/start.tex +old mode 100755 +new mode 100644 +index c88481b..7ee4a90 +--- a/alliance/src/documentation/tutorials/start/start.tex ++++ b/alliance/src/documentation/tutorials/start/start.tex +@@ -144,7 +144,7 @@ To see it, please enter the following command : + ~alp/addaccu %-) env | grep MBK + \end{phraseverbatim} + +-\begin{figure}[H]\center\leavevmode ++\begin{figure}[p]\center\leavevmode + \begin{framedverbatim} + ~alp/addaccu %-) env | grep MBK + MBK_OUT_PH=ap +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_0.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_0.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_1.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_1.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_10.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_10.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_11.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_11.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_12.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_12.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_13.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_13.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_14.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_14.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_15.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_15.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_16.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_16.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_17.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_17.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_18.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_18.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_19.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_19.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_2.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_2.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_20.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_20.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_21.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_21.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_22.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_22.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_23.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_23.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_24.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_24.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_3.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_3.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_4.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_4.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_5.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_5.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_6.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_6.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_7.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_7.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_8.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_8.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_9.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_9.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_ok.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_ok.vbe +old mode 100755 +new mode 100644 +diff --git a/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex b/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex +old mode 100755 +new mode 100644 +index bf2fdde..11cd8e9 +--- a/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex ++++ b/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex +@@ -85,7 +85,6 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + %---------------------------------- document --------------------------------- + \begin{document} +-\setlength{\footrulewidth}{0.6pt} + + \title{ + {\Huge ALLIANCE TUTORIAL\\} +diff --git a/alliance/src/fsm/man1/fsm.1 b/alliance/src/fsm/man1/fsm.1 +index a0f6142..ca58505 100644 +--- a/alliance/src/fsm/man1/fsm.1 ++++ b/alliance/src/fsm/man1/fsm.1 +@@ -40,7 +40,7 @@ Functions : + .TP 20 + .br + +-... ++\&... + + .TP 0 + libFsm101.a : +diff --git a/alliance/src/mbk/man3/viewlofigcon.3 b/alliance/src/mbk/man3/viewlofigcon.3 +index 413f80f..805ce0d 100644 +--- a/alliance/src/mbk/man3/viewlofigcon.3 ++++ b/alliance/src/mbk/man3/viewlofigcon.3 +@@ -10,10 +10,11 @@ viewlofigcon + .ti 0.2i + viewlofigcon + .XE2 \} +-.so man1/alc_origin.1 ++.TH VIEWLOFIGCON 3 "October 1, 1997" "ASIM/LIP6" "MBK LOGICAL FUNCTIONS" + .SH NAME + viewlofigcon \- display elements of a \fBlocon_list\fP attached to a + figure ++.so man1/alc_origin.1 + .SH SYNOPSYS + .nf + .if n \{\ +diff --git a/alliance/src/mbk/man3/viewphfig.3 b/alliance/src/mbk/man3/viewphfig.3 +index 1aa0842..374bb20 100644 +--- a/alliance/src/mbk/man3/viewphfig.3 ++++ b/alliance/src/mbk/man3/viewphfig.3 +@@ -10,9 +10,10 @@ viewphfig + .ti 0.2i + viewphfig + .XE0 \} +-.so man1/alc_origin.1 ++.TH VIEWPHSEG 3 "October 1, 1997" "ASIM/LIP6" "MBK PHYSICAL FUNCTIONS" + .SH NAME + viewphfig \- display elements of a \fBphfig_list\fP ++.so man1/alc_origin.1 + .SH SYNOPSYS + .nf + .if n \{\ +diff --git a/alliance/src/mbk/man3/viewphvia.3 b/alliance/src/mbk/man3/viewphvia.3 +index 1d58e48..209602a 100644 +--- a/alliance/src/mbk/man3/viewphvia.3 ++++ b/alliance/src/mbk/man3/viewphvia.3 +@@ -10,9 +10,10 @@ viewphvia + .ti 0.2i + viewphvia + .XE0 \} +-.so man1/alc_origin.1 ++.TH VIEWPHVIA 3 "October 1, 1997" "ASIM/LIP6" "MBK PHYSICAL FUNCTIONS" + .SH NAME + viewphvia \- display elements of a \fBphvia_list\fP ++.so man1/alc_origin.1 + .SH SYNOPSYS + .nf + .if n \{\ +diff --git a/alliance/src/nero/doc/man1/nero.1 b/alliance/src/nero/doc/man1/nero.1 +index e13b1ea..ed6f488 100644 +--- a/alliance/src/nero/doc/man1/nero.1 ++++ b/alliance/src/nero/doc/man1/nero.1 +@@ -1,4 +1,3 @@ +-.\\" auto-generated by docbook2man-spec $Revision: 1.4 $ + .TH "NERO" "1" "13 October 2002" "ASIM/LIP6" "Alliance - nero User's Manual" + .SH NAME + nero \- Negotiating Router +diff --git a/alliance/src/ring/doc/ring.1 b/alliance/src/ring/doc/ring.1 +index 054aa47..43a6be3 100644 +--- a/alliance/src/ring/doc/ring.1 ++++ b/alliance/src/ring/doc/ring.1 +@@ -110,7 +110,7 @@ piot_sp C + .br + pvssick_sp C + .br +-\.\.\.\. ++\&... + .br + pvdde_sp C + .br +-- +2.5.0 + diff --git a/0010-Fedora-profiles.patch b/0010-Fedora-profiles.patch new file mode 100644 index 0000000..d475ca8 --- /dev/null +++ b/0010-Fedora-profiles.patch @@ -0,0 +1,114 @@ +From 52c5cec07b86e606d5062da6e83ada94cf214c13 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Tue, 1 Mar 2016 15:27:11 +0100 +Subject: [PATCH 10/10] Fedora profiles. + +--- + alliance/src/distrib/etc/alc_env.csh.in | 32 ++----------------------------- + alliance/src/distrib/etc/alc_env.sh.in | 34 +++------------------------------ + 2 files changed, 5 insertions(+), 61 deletions(-) + +diff --git a/alliance/src/distrib/etc/alc_env.csh.in b/alliance/src/distrib/etc/alc_env.csh.in +index cea6941..4051fba 100644 +--- a/alliance/src/distrib/etc/alc_env.csh.in ++++ b/alliance/src/distrib/etc/alc_env.csh.in +@@ -21,13 +21,8 @@ + + # Where the Alliance CAD is installed + setenv ALLIANCE_TOP "@prefix@" +- set SYSCONF_TOP "${ALLIANCE_TOP}/etc" +- set CELLS_TOP "${ALLIANCE_TOP}/cells" +- if ( "${ALLIANCE_TOP}" == "/usr/lib/alliance" ) then +-# For installation in the FHS. +- set SYSCONF_TOP "/etc/alliance" +- set CELLS_TOP "/usr/share/alliance/cells" +- endif ++ set SYSCONF_TOP "@sysconfdir@/alliance" ++ set CELLS_TOP "@datadir@/alliance/cells" + + + # Alliance environment variables. +@@ -75,29 +70,6 @@ + setenv ELP_TECHNO_NAME "${SYSCONF_TOP}/prol.elp" + + +-# System PATH variables, only needed when not installed in the FHS. +- if ( "${ALLIANCE_TOP}" != "/usr/lib/alliance" ) then +- if ( $?PATH ) then +- setenv PATH "${PATH}:${ALLIANCE_TOP}/bin" +- else +- setenv PATH "${ALLIANCE_TOP}/bin" +- endif +- +- if ( "`uname -o`" != "GNU/Linux" ) then +- # Only needed on Solaris (included in /etc/ld.so.conf under Linux). +- if ( $?LD_LIBRARY_PATH ) then +- setenv LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:${ALLIANCE_TOP}/lib" +- else +- setenv LD_LIBRARY_PATH "${ALLIANCE_TOP}/lib" +- endif +- endif +- +- if ( $?MANPATH ) then +- setenv MANPATH "${MANPATH}:${ALLIANCE_TOP}/share/man" +- else +- setenv MANPATH ":${ALLIANCE_TOP}/share/man:`manpath`" +- endif +- endif + + # fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. + setenv MBK_SPI_MODEL "${SYSCONF_TOP}/spimodel.cfg" +diff --git a/alliance/src/distrib/etc/alc_env.sh.in b/alliance/src/distrib/etc/alc_env.sh.in +index a4115f2..246eec6 100644 +--- a/alliance/src/distrib/etc/alc_env.sh.in ++++ b/alliance/src/distrib/etc/alc_env.sh.in +@@ -20,14 +20,9 @@ + + + # Where the Alliance CAD is installed +- ALLIANCE_TOP=@prefix@; export ALLIANCE_TOP +- SYSCONF_TOP=$ALLIANCE_TOP/etc +- CELLS_TOP=$ALLIANCE_TOP/cells +- if [ "$ALLIANCE_TOP" = "/usr/lib/alliance" ]; then +- # FHS Installation. +- SYSCONF_TOP="/etc/alliance" +- CELLS_TOP="/usr/share/alliance/cells" +- fi ++ ALLIANCE_TOP="@prefix@"; export ALLIANCE_TOP ++ SYSCONF_TOP="@sysconfdir@/alliance" ++ CELLS_TOP="@datadir@/alliance/cells" + + # Alliance environment variables. + MBK_IN_LO=vst; export MBK_IN_LO +@@ -76,28 +71,5 @@ + ELP_TECHNO_NAME=$SYSCONF_TOP/prol.elp; export ELP_TECHNO_NAME + + +-# System PATH variables, only needed when not installed in the FHS. +- if [ "$ALLIANCE_TOP" != "/usr/lib/alliance" ]; then +- PATH=$PATH:$ALLIANCE_TOP/bin +- export PATH +- +- # Only needed on Solaris (included in /etc/ld.so.conf under Linux). +- #if [ "`uname -o`" != "GNU/Linux" ]; then +- if [ -z "${LD_LIBRARY_PATH}" ]; then +- LD_LIBRARY_PATH=$ALLIANCE_TOP/lib +- else +- LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ALLIANCE_TOP/lib +- fi +- export LD_LIBRARY_PATH +- #fi +- +- if [ -z "${MANPATH}" ]; then +- MANPATH=:$ALLIANCE_TOP/share/man:$(manpath) +- else +- MANPATH=$MANPATH:$ALLIANCE_TOP/share/man +- fi +- export MANPATH +- fi +- + # fixing *** ERROR *** : Variable MBK_SPI_MODEL not found. + MBK_SPI_MODEL=$SYSCONF_TOP/spimodel.cfg; export MBK_SPI_MODEL +-- +2.5.0 + diff --git a/alliance-5.0-20090901-bison.patch b/alliance-5.0-20090901-bison.patch deleted file mode 100644 index 62998be..0000000 --- a/alliance-5.0-20090901-bison.patch +++ /dev/null @@ -1,25 +0,0 @@ -From debian/patches/10-fix-parser-extern.patch -Fix duplicate extern error with newer bison - ---- a/ppt/src/Makefile.am -+++ b/ppt/src/Makefile.am -@@ -19,7 +19,7 @@ pat_decl_y.c pat_decl_y.h : $(srcdir)/pat_decl_y.y - $(YACC) -d $(YFLAGS) $(srcdir)/pat_decl_y.y \ - && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.c \ - | sed -e "s/int[ ]*pat_decl_y_char;/extern int pat_decl_y_char;/" \ -- | sed -e "s/PAT_DECL_Y_STYPE[ ]*pat_decl_y_lval;/extern PAT_DECL_Y_STYPE pat_decl_y_lval;/" \ -+ | sed -e "s/PAT_DECL_Y_STYPE[ ]*pat_decl_y_lval;/PAT_DECL_Y_STYPE pat_decl_y_lval;/" \ - | sed -e "s/int[ ]*pat_decl_y_nerrs;/extern int pat_decl_y_nerrs;/" \ - > pat_decl_y.c \ - && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.h > pat_decl_y.h ---- a/ppt/src/Makefile.in -+++ b/ppt/src/Makefile.in -@@ -701,7 +701,7 @@ pat_decl_y.c pat_decl_y.h : $(srcdir)/pat_decl_y.y - $(YACC) -d $(YFLAGS) $(srcdir)/pat_decl_y.y \ - && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.c \ - | sed -e "s/int[ ]*pat_decl_y_char;/extern int pat_decl_y_char;/" \ -- | sed -e "s/PAT_DECL_Y_STYPE[ ]*pat_decl_y_lval;/extern PAT_DECL_Y_STYPE pat_decl_y_lval;/" \ -+ | sed -e "s/PAT_DECL_Y_STYPE[ ]*pat_decl_y_lval;/PAT_DECL_Y_STYPE pat_decl_y_lval;/" \ - | sed -e "s/int[ ]*pat_decl_y_nerrs;/extern int pat_decl_y_nerrs;/" \ - > pat_decl_y.c \ - && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.h > pat_decl_y.h diff --git a/alliance-5.0-20090901-format-security.patch b/alliance-5.0-20090901-format-security.patch deleted file mode 100644 index de54d36..0000000 --- a/alliance-5.0-20090901-format-security.patch +++ /dev/null @@ -1,85 +0,0 @@ ---- a/rtd/src/rtd_drive.c -+++ b/rtd/src/rtd_drive.c -@@ -100,7 +100,7 @@ static void RtlWriteNameFile( Name ) - RtlExprLength = Length; - } - -- fprintf( RtlFile, Name ); -+ fprintf( RtlFile, "%s", Name ); - } - - /*------------------------------------------------------------\ ---- a/vpd/src/vpd_drive.c -+++ b/vpd/src/vpd_drive.c -@@ -100,7 +100,7 @@ static void VpnWriteNameFile( Name ) - VpnExprLength = Length; - } - -- fprintf( VpnFile, Name ); -+ fprintf( VpnFile, "%s", Name ); - } - - /*------------------------------------------------------------\ ---- a/boog/src/bog_normalize_message.c -+++ b/boog/src/bog_normalize_message.c -@@ -106,7 +106,7 @@ extern void display_error_in_abl(char* message, chain_list *abl) - } - - fprintf(stderr,"BEH: "); -- fprintf(stderr,message); -+ fprintf(stderr,"%s",message); - fprintf(stderr," in '"); - fflush(stderr); - display_abl(abl); ---- a/l2p/src/drive_ps.c -+++ b/l2p/src/drive_ps.c -@@ -83,22 +83,22 @@ char *msg; - break; - case E_OPEN : - fprintf (stderr, "Problem while opening file "); -- fprintf (stderr, msg); -+ fprintf (stderr, "%s", msg); - break; - case E_CLOSE : - fprintf (stderr, "Problem while closing file "); -- fprintf (stderr, msg); -+ fprintf (stderr, "%s", msg); - break; - case E_WRITE : - fprintf (stderr, "Problem while writing file "); -- fprintf (stderr, msg); -+ fprintf (stderr, "%s", msg); - break; - case E_READ : - fprintf (stderr, "Problem while reading file "); -- fprintf (stderr, msg); -+ fprintf (stderr, "%s", msg); - break; - case E_OUTBOX : -- fprintf (stderr, msg); -+ fprintf (stderr, "%s", msg); - break; - default : - fprintf (stderr, "Unknow internal error"); ---- a/loon/src/lon_normalize_message.c -+++ b/loon/src/lon_normalize_message.c -@@ -106,7 +106,7 @@ extern void display_error_in_abl(char* message, chain_list *abl) - } - - fprintf(stderr,"BEH: "); -- fprintf(stderr,message); -+ fprintf(stderr,"%s",message); - fprintf(stderr," in '"); - fflush(stderr); - display_abl(abl); ---- a/sea/src/util_LEFDEF.c -+++ b/sea/src/util_LEFDEF.c -@@ -213,7 +213,7 @@ extern char *MBK2DEF_name(asLEF, asMBK) - *pI = (char)0; pI += 1; - sprintf (asLEF, "%s(%s)", sTmp, pI); - } else { -- sprintf (asLEF, sTmp); -+ sprintf (asLEF, "%s", sTmp); - } - - return (asLEF); diff --git a/alliance.spec b/alliance.spec index fcd0801..a90dad3 100644 --- a/alliance.spec +++ b/alliance.spec @@ -1,23 +1,37 @@ +%global snapdate 20160220 +%global commit 10a7b7e755d633a83e3f213198b59a69751259f1 +%global shortcommit %(c=%{commit}; echo ${c:0:7}) + Name: alliance Version: 5.1.1 -Release: 3%{?dist} +Release: 4.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ Source: http://www-asim.lip6.fr/pub/alliance/distribution/latest/alliance-%{version}.tar.bz2 Source1: alliance.fedora -# Chitlesh's donated pictures to alliance -# included asfrom snapshot 20090901 - Source2: alliance-tutorials-go-all.sh Source3: alliance-tutorials-go-all-clean.sh Source4: alliance-examples-go-all.sh Source5: alliance-examples-go-all-clean.sh -# 2014-07-01: Notified upstream via e-mail to alliance-users@asim.lip6.fr -#Patch0: alliance-5.0-20090901-format-security.patch -# 2014-07-01: From debian: debian/patches/10-fix-parser-extern.patch -#Patch1: alliance-5.0-20090901-bison.patch + +# Update alliance-5.1.1 to commit %%{shortcommit} from +# https://www-soc.lip6.fr/git/alliance.git +Patch00: 0000-alliance-5.1.1-git%{shortcommit}.patch + +Patch11: 0001-Remove-stray-files.patch +Patch12: 0002-Update-autostuff.patch +Patch13: 0003-Consolidate-installation-dirs.patch +Patch14: 0004-Misc-installation-dirs-fixes.patch +Patch15: 0005-Use-inttypes-macros-to-print-int32_t.patch +Patch16: 0006-Use-ring_yy-instead-of-yy.patch +Patch17: 0007-Eliminate-CFLAGS.patch +Patch18: 0008-Rework-Makefile.ams.patch +Patch19: 0009-Misc.-doc-fixes.patch +Patch20: 0010-Fedora-profiles.patch + + BuildRequires: bison BuildRequires: byacc BuildRequires: desktop-file-utils @@ -34,12 +48,19 @@ BuildRequires: tex(picinpar.sty) BuildRequires: tex(subfigure.sty) BuildRequires: tex(wrapfig.sty) BuildRequires: transfig +BuildRequires: /usr/bin/convert +BuildRequires: autoconf automake libtool + %if 0%{?rhel} BuildRequires: openmotif-devel BuildRequires: pkgconfig %else +%if 0%{?fedora} >= 23 +BuildRequires: motif-devel +%else BuildRequires: lesstif-devel %endif +%endif Requires: xorg-x11-fonts-misc # RHBZ 442379 Requires(post): %{name}-libs%{?_isa} = %{version}-%{release} @@ -69,15 +90,22 @@ Alliance provides CAD tools covering most of all the digital design flow: Alliance is listed among Fedora Electronic Lab (FEL) packages. %package libs -Summary: Alliance VLSI CAD Sytem - multilibs +Summary: Alliance VLSI CAD System - Libraries Requires: %{name}%{?_isa} = %{version}-%{release} Requires: electronics-menu %description libs Architecture dependent files for the Alliance VLSI CAD Sytem. +%package devel +Summary: Alliance VLSI CAD System - Development libraries +Requires: %{name}-libs%{?_isa} = %{version}-%{release} + +%description devel +%{summary} + %package doc -Summary: Alliance VLSI CAD Sytem - Documentations +Summary: Alliance VLSI CAD System - Documentations BuildArch: noarch Requires: gnuplot BuildRequires: tetex-latex @@ -86,122 +114,103 @@ BuildRequires: tetex-latex Documentation and tutorials for the Alliance VLSI CAD Sytem. %prep -%setup -qn %{name}/src -#%patch0 -p1 -#%patch1 -p1 -rm -frv autom4te.cache +%setup -qn %{name} +%patch00 -p2 +%patch11 -p2 +%patch12 -p2 +%patch13 -p2 +%patch14 -p2 +%patch15 -p2 +%patch16 -p2 +%patch17 -p2 +%patch18 -p2 +%patch19 -p2 +%patch20 -p2 + +pushd src > /dev/null + +# Don't build attila +rm -r attila + +# Setup auto*stuff +./autostuff + +# The configure.ins confuse rpm +# rename them into configure.in~ +sed -i -e 's/configure.in/configure.in~/g' autostuff +for x in $(find */* -name configure.in); do +mv $x $x~ +done + +chmod +x configure cp -p %{SOURCE1} . -sed -i "s|ALLIANCE_TOP|%{prefix}|" distrib/*.desktop - -# removed useless copyrighted (by Cadence) lines from the examples -# and even in alliance-run -# https://www-asim.lip6.fr/wws/arc/alliance-users/2007-07/msg00006.html +sed -i "s|ALLIANCE_TOP/bin|%{_libdir}/alliance/bin|" distrib/*.desktop -# ------------------------------------------------------------------------------ -# Description : 2008 March : TexLive introduction to Rawhide -sed -i "s|tutorials||" documentation/Makefile.in -sed -i "s|documentation/tutorials/Makefile||" configure* -pushd documentation/tutorials - # clean unneccessary files - rm Makefile* - rm *.pdf - # build documentation - for folder in place_and_route/tex start simulation/tex synthesis/tex; do - pushd $folder - make - popd - # remove useless directories before %%doc - rm -rf $folder - done - # Add automated scripts to tutorials - install -pm 755 %{SOURCE2} go-all.sh - install -pm 755 %{SOURCE3} go-all-clean.sh - # Fedora Electronic Lab self test for alliance - #./go-all.sh 2>&1 | tee self-test-tutorials.log - # clean temporary files - ./go-all-clean.sh -popd # ------------------------------------------------------------------------------ -# fixing flex and bison update on rawhide -sed -i '30i\#include \"string.h\"' ocp/src/placer/Ocp.cpp ocp/src/placer/PPlacement.h -sed -i '18i\#include \"bvl_bcomp_y.h\"' bvl/src/bvl_bcomp_y.y - -# make sure the man pages are UTF-8... -for nonUTF8 in FAQ README LICENCE distrib/doc/alc_origin.1 alcban/man1/alcbanner.1 \ - loon/doc/loon.1 m2e/doc/man1/m2e.1 boog/doc/boog.1 ; do +## Convert to UTF-8 +for nonUTF8 in \ + FAQ \ + alcban/man1/alcbanner.1 \ + distrib/doc/alc_origin.1 \ + loon/doc/loon.1 \ + boog/doc/boog.1 \ + m2e/doc/man1/m2e.1 \ + documentation/overview/overview.tex \ + documentation/alliance-examples/tuner/build_tuner \ + documentation/alliance-examples/tuner/README \ + documentation/alliance-examples/tuner/tuner.vbe \ + documentation/alliance-examples/mipsR3000/sce/mips_dpt.c \ + documentation/alliance-examples/mipsR3000/asm/mips_defs.h \ +; do \ %{_bindir}/iconv -f ISO-8859-1 -t utf-8 $nonUTF8 > $nonUTF8.conv mv -f $nonUTF8.conv $nonUTF8 done pushd documentation/alliance-examples/ -# make sure the man pages are UTF-8... -for nonUTF8 in tuner/build_tuner mipsR3000/asm/mips_defs.h tuner/tuner.vbe \ - tuner/README mipsR3000/sce/mips_dpt.c ; do - %{_bindir}/iconv -f ISO-8859-1 -t utf-8 $nonUTF8 > $nonUTF8.conv - mv -f $nonUTF8.conv $nonUTF8 -done - #wrong-file-end-of-line-encoding sed -i 's/\r//' mipsR3000/asm/* popd find documentation/tutorials/ \ - -name *.vbe -o \ + \( -name *.vbe -o \ -name *.pat -o \ -name *.vhdl -o \ -name *.vst -o \ - -name *.c \ + -name *.c \) \ -exec chmod 0644 {} ';' +popd > /dev/null %build -export ALLIANCE_TOP=%{prefix} -%configure --enable-alc-shared \ - --disable-static \ - --includedir=%{prefix}/include \ - --libdir=%{prefix}/lib \ - --mandir=%{_datadir}/%{name}/man # RHBZ 252941 - -# disabling rpath -sed -i 's|^hardcode_libdir_flag_spec="\\${wl}--rpath \\${wl}\\$libdir"|hardcode_libdir_flag_spec=""|g' libtool -sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool - -# clean unused-direct-shlib-dependencies -sed -i -e 's! -shared ! -Wl,--as-needed\0!g' libtool +pushd src > /dev/null +%configure --enable-alc-shared \ + --disable-static \ + --prefix=%{_libdir}/%{name} \ + --bindir=%{_libdir}/%{name}/bin \ + --libdir=%{_libdir}/%{name}/lib \ + --includedir=%{_libdir}/%{name}/include \ + --docdir=%{_pkgdocdir} \ + --mandir=%{_mandir} # Is not parallel-build-safe make +popd %install +pushd src > /dev/null %make_install -# Set execution rights on the alc_env.* batchs and adjust ALLIANCE_TOP. -pushd %{buildroot}%{_sysconfdir}/profile.d - chmod 0644 alc_env.* - sed -i "s|@DATE@|`date`|" alc_env* - sed "s|ALLIANCE_TOP *= *\([^;]*\)|ALLIANCE_TOP=%{prefix}|" alc_env.sh - sed "s|setenv *ALLIANCE_TOP *\([^;]*\)|setenv ALLIANCE_TOP %{prefix}|" alc_env.csh -popd - - -# documentation -cp -pr %{buildroot}%{prefix}/doc/ . -cp -pr %{buildroot}%{prefix}/examples/alliance-examples/ . - -rm -rf %{buildroot}%{prefix}/doc/ -rm -rf %{buildroot}%{prefix}/examples/ - # Add automated scripts to examples -install -pm 755 %{SOURCE4} alliance-examples/go-all.sh -install -pm 755 %{SOURCE5} alliance-examples/go-all-clean.sh +#install -pm 755 %{SOURCE4} alliance-examples/go-all.sh +#install -pm 755 %{SOURCE5} alliance-examples/go-all-clean.sh -pushd alliance-examples/ - # FEL self test for alliance - #./go-all.sh 2>&1 | tee self-test-examples.log - # clean temporary files - ./go-all-clean.sh -popd +#pushd alliance-examples/ +# # FEL self test for alliance +# #./go-all.sh 2>&1 | tee self-test-examples.log +# # clean temporary files +# ./go-all-clean.sh +#popd find %{buildroot} -name '*.la' -delete -print @@ -216,83 +225,94 @@ for d in distrib/*.desktop; do desktop-file-install --dir %{buildroot}%{_datadir}/applications/ $d done -# Architecture independent files -mv %{buildroot}%{prefix}/cells %{buildroot}%{_datadir}/%{name}/ -mv %{buildroot}%{prefix}/etc %{buildroot}%{_datadir}/%{name}/ - # protecting hardcoded links -ln -sf ../../..%{_datadir}/%{name}/cells %{buildroot}%{prefix}/cells -ln -sf ../../..%{_datadir}/%{name}/etc %{buildroot}%{prefix}/etc -ln -sf ../../..%{_datadir}/%{name}/man %{buildroot}%{prefix}/man +#ln -sf ../../..%{_datadir}/%{name}/cells %{buildroot}%{_prefix}/cells +#ln -sf ../../..%{_datadir}/%{name}/etc %{buildroot}%{_prefix}/etc +#ln -sf ../../..%{_datadir}/%{name}/man %{buildroot}%{_prefix}/man + +# rename manpages to avoid conflicts +# RHBZ 252941 +pushd $RPM_BUILD_ROOT%{_mandir} > /dev/null +/usr/bin/rename .1 .1alc man1/* +/usr/bin/rename .3 .3alc man3/* +/usr/bin/rename .5 .5alc man5/* +# Reflect man page renamer to man page includes +sed -i -e 's,^\(.so man[13]/alc_.*.[13]\)$,\1alc,' man*/* +popd > /dev/null + +# Rename alliance subdir into html +mv %{buildroot}%{_pkgdocdir}/alliance %{buildroot}%{_pkgdocdir}/html +# Directly install files to go into 5%{_pkgdocdir} +install -m 644 README CHANGES FAQ alliance.fedora %{buildroot}%{_pkgdocdir} -# manpage-not-gzipped -find %{prefix}/man -type f -not -name '*.gz' -print | xargs gzip -9f %{__mkdir} -p %{buildroot}%{_sysconfdir}/ld.so.conf.d/ cat > %{buildroot}%{_sysconfdir}/ld.so.conf.d/%{name}.conf << EOF # Alliance VLSI design system -%{prefix}/lib +%{_libdir}/%{name}/lib EOF - -# removing tools for compiling and installing Alliance tools -# These are for the packager (i.e me) and not for user -rm -f %{buildroot}%{_sysconfdir}/%{name}/attila.conf -rm -f %{buildroot}%{prefix}/etc/attila.conf -rm -f %{buildroot}%{prefix}/bin/attila -rm -f %{buildroot}%{_datadir}/man/man1/attila* -rm -f doc/html/alliance/*attila.html -rm -f doc/pdf/attila.pdf - -# correcting minor documentation details -sed -i "s|/bin/zsh|/bin/sh|" doc/alliance-run/bench.zsh - %{_fixperms} %{buildroot}/* +popd > /dev/null + +%post libs +/sbin/ldconfig %post -/sbin/ldconfig source %{_sysconfdir}/profile.d/alc_env.sh touch --no-create %{_datadir}/icons/hicolor || : %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : +%postun libs +/sbin/ldconfig + %postun /sbin/ldconfig touch --no-create %{_datadir}/icons/hicolor || : %{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : -#These headers are useful for the _usage_ of the binaries -#without these headers some of the binaries will be broken by default - %files -%license LICENCE COPYING* -%doc CHANGES FAQ alliance.fedora -#%{prefix}/ -%{_datadir}/%{name}/ -%{_datadir}/icons/hicolor/48x48/apps/* +%{_pkgdocdir}/README +%{_pkgdocdir}/CHANGES +%{_pkgdocdir}/FAQ +%{_pkgdocdir}/alliance.fedora +%license src/LICENCE src/COPYING* -%files libs -%config(noreplace) %{_sysconfdir}/ld.so.conf.d/* +%{_datadir}/alliance +%{_datadir}/icons/hicolor/48x48/apps/* %{_datadir}/applications/*.desktop +%dir %{_libdir}/alliance +%{_libdir}/alliance/bin +%{_mandir}/man1/*.1* +%config(noreplace) %{_sysconfdir}/alliance %config(noreplace) %{_sysconfdir}/profile.d/alc_env.* +%files devel +%dir %{_libdir}/alliance +%{_libdir}/alliance/include +%dir %{_libdir}/alliance/lib +%{_libdir}/alliance/lib/*.so +%{_mandir}/man3/*.3* + +%files libs +%dir %{_libdir}/alliance +%dir %{_libdir}/alliance/lib +%{_libdir}/alliance/lib/lib*.so.* +%{_mandir}/man5/*.5* +%config(noreplace) %{_sysconfdir}/ld.so.conf.d/* + %files doc -%license LICENCE COPYING* -%doc doc/html/ -%doc doc/design-flow -%doc doc/pdf/*.pdf -%doc doc/overview/*.ps -%doc doc/overview/*.pdf -%doc documentation/tutorials/ -#Makefiles are present in alliance-examples/*. It is normal because -# * it gives the VLSI designer a template on how to create his own -# Makefile for alliance (VLSI designers normally don't know how to do so) -# * it is not part of the build, but part of the working environment of the user -%doc alliance-examples/ -%doc doc/alliance-run/ +%{_pkgdocdir} %changelog +* Tue Mar 01 2016 Ralf Corsépius - 5.1.1-4.20160220git10a7b7e +- Rework spec. +- Add upstream changes. +- Rework package configuration. +- Introduce *-devel. + * Wed Feb 03 2016 Fedora Release Engineering - 5.1.1-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild From da107466c079a06de285b45db2647f6498fe5d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Tue, 1 Mar 2016 19:35:19 +0100 Subject: [PATCH 47/85] Rework spec. - Add upstream changes. - Rework package configuration. - Introduce *-devel. --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index f7c59bd..e0a57f7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ -alliance-5.0-20090901.tar.gz /alliance-5.1.1.tar.bz2 From f714dbb85a3aee3fba0c8f2273cf3e2ffbc358bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Fri, 20 May 2016 06:46:01 +0200 Subject: [PATCH 48/85] Remove bashisms in /etc/profile/alc_env.csh (RHBZ#1337691). - Work around flex-2.6.0 compatibility issues triggering a FTBFS. --- ...e-setenv-instead-of-set-RHBZ-1337691.patch | 27 +++++++++++++++++++ ...-initialize-yylineno-with-flex-2.6.0.patch | 26 ++++++++++++++++++ alliance.spec | 12 ++++++++- 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 0011-Use-setenv-instead-of-set-RHBZ-1337691.patch create mode 100644 0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch diff --git a/0011-Use-setenv-instead-of-set-RHBZ-1337691.patch b/0011-Use-setenv-instead-of-set-RHBZ-1337691.patch new file mode 100644 index 0000000..fb1310a --- /dev/null +++ b/0011-Use-setenv-instead-of-set-RHBZ-1337691.patch @@ -0,0 +1,27 @@ +From 69c5281b9193149e3fa6d7fceac49de4eb57ab30 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Fri, 20 May 2016 05:16:44 +0200 +Subject: [PATCH 11/11] Use setenv instead of set (RHBZ#1337691) + +--- + alliance/src/distrib/etc/alc_env.csh.in | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/alliance/src/distrib/etc/alc_env.csh.in b/alliance/src/distrib/etc/alc_env.csh.in +index 4051fba..37c3b00 100644 +--- a/alliance/src/distrib/etc/alc_env.csh.in ++++ b/alliance/src/distrib/etc/alc_env.csh.in +@@ -21,8 +21,8 @@ + + # Where the Alliance CAD is installed + setenv ALLIANCE_TOP "@prefix@" +- set SYSCONF_TOP "@sysconfdir@/alliance" +- set CELLS_TOP "@datadir@/alliance/cells" ++ setenv SYSCONF_TOP "@sysconfdir@/alliance" ++ setenv CELLS_TOP "@datadir@/alliance/cells" + + + # Alliance environment variables. +-- +2.5.5 + diff --git a/0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch b/0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch new file mode 100644 index 0000000..d1660a8 --- /dev/null +++ b/0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch @@ -0,0 +1,26 @@ +From 685ad52e23f4a88e264cc47fdcb5b0c7d0596800 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Fri, 20 May 2016 06:11:20 +0200 +Subject: [PATCH 12/12] Don't initialize yylineno with flex >= 2.6.0 + +--- + alliance/src/sea/src/DEF_grammar_lex.l | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/alliance/src/sea/src/DEF_grammar_lex.l b/alliance/src/sea/src/DEF_grammar_lex.l +index 752e2f8..be369d7 100644 +--- a/alliance/src/sea/src/DEF_grammar_lex.l ++++ b/alliance/src/sea/src/DEF_grammar_lex.l +@@ -21,7 +21,8 @@ + #define yylineno DEF_grammarlineno + + +-#ifndef FLEX_BETA ++#if !(defined(YY_FLEX_MAJOR_VERSION) && (YY_FLEX_MAJOR_VERSION >= 2) \ ++ && defined(YY_FLEX_MINOR_VERSION) && (YY_FLEX_MINOR_VERSION >= 6)) + int yylineno = 1; + #endif + +-- +2.5.5 + diff --git a/alliance.spec b/alliance.spec index a90dad3..795bd02 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 4.%{snapdate}git%{shortcommit}%{?dist} +Release: 5.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -30,6 +30,10 @@ Patch17: 0007-Eliminate-CFLAGS.patch Patch18: 0008-Rework-Makefile.ams.patch Patch19: 0009-Misc.-doc-fixes.patch Patch20: 0010-Fedora-profiles.patch +# Bashisms in /etc/profile.d/alc_env.csh +Patch21: 0011-Use-setenv-instead-of-set-RHBZ-1337691.patch +# Flex compatibility issues +Patch22: 0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch BuildRequires: bison @@ -126,6 +130,8 @@ Documentation and tutorials for the Alliance VLSI CAD Sytem. %patch18 -p2 %patch19 -p2 %patch20 -p2 +%patch21 -p2 +%patch22 -p2 pushd src > /dev/null @@ -307,6 +313,10 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Fri May 20 2016 Ralf Corsépius - 5.1.1-5.20160220git10a7b7e +- Remove bashisms in /etc/profile/alc_env.csh (RHBZ#1337691). +- Work around flex-2.6.0 compatibility issues triggering a FTBFS. + * Tue Mar 01 2016 Ralf Corsépius - 5.1.1-4.20160220git10a7b7e - Rework spec. - Add upstream changes. From 9d8dbbed33700e8dff43e0109a8ff5b1db856f6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Fri, 20 May 2016 11:58:13 +0200 Subject: [PATCH 49/85] Upstream update. - Rebase patches. - Remove reference to FLEX_BETA. --- ...ch => 0000-alliance-5.1.1-gitd8c05cd.patch | 15399 +++++++++++++++- 0009-Misc.-doc-fixes.patch | 30 +- ...-initialize-yylineno-with-flex-2.6.0.patch | 26 - 0012-Remove-yylineno.patch | 28 + alliance.spec | 12 +- 5 files changed, 15438 insertions(+), 57 deletions(-) rename 0000-alliance-5.1.1-git10a7b7e.patch => 0000-alliance-5.1.1-gitd8c05cd.patch (67%) delete mode 100644 0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch create mode 100644 0012-Remove-yylineno.patch diff --git a/0000-alliance-5.1.1-git10a7b7e.patch b/0000-alliance-5.1.1-gitd8c05cd.patch similarity index 67% rename from 0000-alliance-5.1.1-git10a7b7e.patch rename to 0000-alliance-5.1.1-gitd8c05cd.patch index 78be246..c929c21 100644 --- a/0000-alliance-5.1.1-git10a7b7e.patch +++ b/0000-alliance-5.1.1-gitd8c05cd.patch @@ -1,5 +1,18 @@ +diff --git a/alliance/src/.asim b/alliance/src/.asim +index 19d050f..7508a04 100755 +--- a/alliance/src/.asim ++++ b/alliance/src/.asim +@@ -1,7 +1,7 @@ + #!/bin/sh + # + # This file is used to remove experimental tools from a complete +-# cvs checkout of the alliance cvs tree. It should be lauched ++# cvs checkout of the alliance cvs tree. It should be launched + # in the same directory where you did the `cvs co alliance' + # + # $Id: .asim,v 1.10 2003/11/27 15:17:44 xtof Exp $ diff --git a/alliance/src/README b/alliance/src/README -index d769dcd..c4d784c 100644 +index d769dcd..600d1ff 100644 --- a/alliance/src/README +++ b/alliance/src/README @@ -1,5 +1,5 @@ @@ -17,6 +30,1211 @@ index d769dcd..c4d784c 100644 # Downloading and installing binary distribution : # =================================================================== +@@ -37,7 +38,7 @@ Alliance naming scheme: + - sources: alliance-XXX-YYY.tar.gz + where: + XXX = Alliance version number. eg 5.0 +- YYY = Alliance release number, wich is the date of the build. eg 20020624 ++ YYY = Alliance release number, which is the date of the build. eg 20020624 + + - binaries: alliance-XXX-YYY-ZZZ.KKK + where: +@@ -143,7 +144,7 @@ This explains how to proceed from the Alliance CVS tree. + > cvs update -d -P + + 2/ Remove some directories from the Alliance tree. These directories +- contain tools that may be helpfull but are not maintained anymore, ++ contain tools that may be helpful but are not maintained anymore, + so they will likely not compile. + Assuming Alliance sources reside in "~fred/alliance", do: + > cd src +diff --git a/alliance/src/README.macosx b/alliance/src/README.macosx +index 3cdd547..1c26361 100644 +--- a/alliance/src/README.macosx ++++ b/alliance/src/README.macosx +@@ -19,7 +19,7 @@ This file discuss about installation of Alliance on Mac OS X machines. + + =================================================================== + +-Alliance has been succesfully build on Mac OS X.2 (Jaguar) and Mac OS X.3 (Panther) ++Alliance has been successfully build on Mac OS X.2 (Jaguar) and Mac OS X.3 (Panther) + This is what is needed to build ALLIANCE: + * get the developer tools. + ( install XCode, this will install gcc 3.3) +diff --git a/alliance/src/abl/man1/abl.1 b/alliance/src/abl/man1/abl.1 +index 19cbc3e..066bc42 100644 +--- a/alliance/src/abl/man1/abl.1 ++++ b/alliance/src/abl/man1/abl.1 +@@ -6,7 +6,7 @@ + \fBabl\fP \- Prefixed representation for boolean functions + .so man1/alc_origin.1 + .SH DESCRIPTION +-\fIlibablmmm.a\fP is a library that enables to represent a boolean function in a LISP-like form. An ABL is a prefixed internal representation for a boolean function having standard operators as OR,NOR,NAND,XOR,NOT and AND. An ABL is only made up of doublets. A doublet is composed of two fields wich are accessible by the functionnal \fI#define\fP \fICAR\fP and \fICDR\fP. A doublet is implemented with a MBK \fIchain_list\fP. ++\fIlibablmmm.a\fP is a library that enables to represent a boolean function in a LISP-like form. An ABL is a prefixed internal representation for a boolean function having standard operators as OR,NOR,NAND,XOR,NOT and AND. An ABL is only made up of doublets. A doublet is composed of two fields which are accessible by the functionnal \fI#define\fP \fICAR\fP and \fICDR\fP. A doublet is implemented with a MBK \fIchain_list\fP. + .br + \fIExpression\fP is the generic term for a boolean function represented by an ABL. An expression can be an atomic expression or an operator expression. The function \fBf = a\fP is represented by an atomic expression whereas \fBf = (or a b)\fP is represented by an operator expression. An atomic expression is made up of a single doublet having the \fINEXT\fP pointer equal to NULL and \fIDATA\fP pointer equal to the identifier pointer. A constant atomic expression is an atomic expression having the string "'0'" or "'1'" as identifier. + .br +diff --git a/alliance/src/abl/man3/addablhexpr.3 b/alliance/src/abl/man3/addablhexpr.3 +index fadc34a..0c46347 100644 +--- a/alliance/src/abl/man3/addablhexpr.3 ++++ b/alliance/src/abl/man3/addablhexpr.3 +@@ -5,7 +5,7 @@ + addablhexpr \- adds a new argument in head of an expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/addablqexpr.3 b/alliance/src/abl/man3/addablqexpr.3 +index e2a465d..5fbd3aa 100644 +--- a/alliance/src/abl/man3/addablqexpr.3 ++++ b/alliance/src/abl/man3/addablqexpr.3 +@@ -5,7 +5,7 @@ + addablqexpr \- adds a new argument in queue of an expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/createablatom.3 b/alliance/src/abl/man3/createablatom.3 +index 469f72e..0e90668 100644 +--- a/alliance/src/abl/man3/createablatom.3 ++++ b/alliance/src/abl/man3/createablatom.3 +@@ -4,7 +4,7 @@ + .SH NAME + createablatom \- creates an atomic expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/createablbinexpr.3 b/alliance/src/abl/man3/createablbinexpr.3 +index cc49a7e..b04f782 100644 +--- a/alliance/src/abl/man3/createablbinexpr.3 ++++ b/alliance/src/abl/man3/createablbinexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + createablbinexpr \- creates a binary operator expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/createablnotexpr.3 b/alliance/src/abl/man3/createablnotexpr.3 +index a56b901..a3ba03d 100644 +--- a/alliance/src/abl/man3/createablnotexpr.3 ++++ b/alliance/src/abl/man3/createablnotexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + createablnotexpr \- complements an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/createabloper.3 b/alliance/src/abl/man3/createabloper.3 +index f85b72a..dc9be6c 100644 +--- a/alliance/src/abl/man3/createabloper.3 ++++ b/alliance/src/abl/man3/createabloper.3 +@@ -4,7 +4,7 @@ + .SH NAME + createabloper \- creates the head of an operator expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/createablunaryexpr.3 b/alliance/src/abl/man3/createablunaryexpr.3 +index 27cc9d7..b173cb4 100644 +--- a/alliance/src/abl/man3/createablunaryexpr.3 ++++ b/alliance/src/abl/man3/createablunaryexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + createablunaryexpr \- creates an unary operator expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/createablxorbinexpr.3 b/alliance/src/abl/man3/createablxorbinexpr.3 +index 61096b3..644097a 100644 +--- a/alliance/src/abl/man3/createablxorbinexpr.3 ++++ b/alliance/src/abl/man3/createablxorbinexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + createablxorbinexpr \- creates an 'xor' or 'xnor' operator expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/delablexpr.3 b/alliance/src/abl/man3/delablexpr.3 +index 13d5591..4079573 100644 +--- a/alliance/src/abl/man3/delablexpr.3 ++++ b/alliance/src/abl/man3/delablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + delablexpr \- deletes an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/delablexprnum.3 b/alliance/src/abl/man3/delablexprnum.3 +index 5365283..86cbaf5 100644 +--- a/alliance/src/abl/man3/delablexprnum.3 ++++ b/alliance/src/abl/man3/delablexprnum.3 +@@ -4,7 +4,7 @@ + .SH NAME + delablexprnum \- deletes an operand in an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/devablxorexpr.3 b/alliance/src/abl/man3/devablxorexpr.3 +index abd99b4..e16ee6c 100644 +--- a/alliance/src/abl/man3/devablxorexpr.3 ++++ b/alliance/src/abl/man3/devablxorexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + devablxorexpr \- develops 'xor', 'nxor' in an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/devdupablxorexpr.3 b/alliance/src/abl/man3/devdupablxorexpr.3 +index e57cb55..b7704b1 100644 +--- a/alliance/src/abl/man3/devdupablxorexpr.3 ++++ b/alliance/src/abl/man3/devdupablxorexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + devdupablxorexpr \- duplicates and develops 'xor', 'nxor'. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/dupablexpr.3 b/alliance/src/abl/man3/dupablexpr.3 +index 8acd827..97b1fda 100644 +--- a/alliance/src/abl/man3/dupablexpr.3 ++++ b/alliance/src/abl/man3/dupablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + dupablexpr \- duplicates an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/flatablexpr.3 b/alliance/src/abl/man3/flatablexpr.3 +index 9517487..0b7da4d 100644 +--- a/alliance/src/abl/man3/flatablexpr.3 ++++ b/alliance/src/abl/man3/flatablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + flatablexpr \- merges the operators of an expression + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/freeablexpr.3 b/alliance/src/abl/man3/freeablexpr.3 +index 336dda4..3fb6241 100644 +--- a/alliance/src/abl/man3/freeablexpr.3 ++++ b/alliance/src/abl/man3/freeablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + freeablexpr \- frees an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/getablexprdepth.3 b/alliance/src/abl/man3/getablexprdepth.3 +index 4783796..b800456 100644 +--- a/alliance/src/abl/man3/getablexprdepth.3 ++++ b/alliance/src/abl/man3/getablexprdepth.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprdepth \- gives the depth of an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/getablexprlength.3 b/alliance/src/abl/man3/getablexprlength.3 +index 087d0b1..df95213 100644 +--- a/alliance/src/abl/man3/getablexprlength.3 ++++ b/alliance/src/abl/man3/getablexprlength.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprlength \- gives the length of an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/getablexprmax.3 b/alliance/src/abl/man3/getablexprmax.3 +index 5f34a62..e0402f0 100644 +--- a/alliance/src/abl/man3/getablexprmax.3 ++++ b/alliance/src/abl/man3/getablexprmax.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprmax \- applies a function to all operands. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/getablexprmin.3 b/alliance/src/abl/man3/getablexprmin.3 +index 6c6d4f2..2f27e16 100644 +--- a/alliance/src/abl/man3/getablexprmin.3 ++++ b/alliance/src/abl/man3/getablexprmin.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprmin \- applies a function to all operands. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/getablexprnum.3 b/alliance/src/abl/man3/getablexprnum.3 +index 0dd6dc2..1295414 100644 +--- a/alliance/src/abl/man3/getablexprnum.3 ++++ b/alliance/src/abl/man3/getablexprnum.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprnum \- gives a specified operand of an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/getablexprnumatom.3 b/alliance/src/abl/man3/getablexprnumatom.3 +index f86327e..14dc2a5 100644 +--- a/alliance/src/abl/man3/getablexprnumatom.3 ++++ b/alliance/src/abl/man3/getablexprnumatom.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprnumatom \- gives the number of atom in an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/getablexprnumbinoper.3 b/alliance/src/abl/man3/getablexprnumbinoper.3 +index cddd29f..1f84459 100644 +--- a/alliance/src/abl/man3/getablexprnumbinoper.3 ++++ b/alliance/src/abl/man3/getablexprnumbinoper.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprnumbinoper \- gives the number of binary operators in an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/getablexprnumocc.3 b/alliance/src/abl/man3/getablexprnumocc.3 +index 0f92d93..e5fb5d3 100644 +--- a/alliance/src/abl/man3/getablexprnumocc.3 ++++ b/alliance/src/abl/man3/getablexprnumocc.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprnumocc \- how many times a name appears in an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -24,10 +24,10 @@ Expression. + \fIName\fP + Name to find. + .SH DESCRIPTION +-\fBgetablexprnumocc\fP gives the number of occurents of \fIName\fP in \fIExpr\fP. ++\fBgetablexprnumocc\fP gives the number of occurrents of \fIName\fP in \fIExpr\fP. + .br + .SH RETURN VALUE +-\fBgetablexprnumocc\fP returns number of occurents of \fIName\fP in \fIExpr\fP. ++\fBgetablexprnumocc\fP returns number of occurrents of \fIName\fP in \fIExpr\fP. + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n + .nf +diff --git a/alliance/src/abl/man3/getablexprsupport.3 b/alliance/src/abl/man3/getablexprsupport.3 +index 70150b3..f610a07 100644 +--- a/alliance/src/abl/man3/getablexprsupport.3 ++++ b/alliance/src/abl/man3/getablexprsupport.3 +@@ -4,7 +4,7 @@ + .SH NAME + getablexprsupport \- gives the expression's support. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/isablbinaryoper.3 b/alliance/src/abl/man3/isablbinaryoper.3 +index a0bc12a..951b9e6 100644 +--- a/alliance/src/abl/man3/isablbinaryoper.3 ++++ b/alliance/src/abl/man3/isablbinaryoper.3 +@@ -4,7 +4,7 @@ + .SH NAME + isablbinaryoper \- tests if an operator is binary. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/isablequalexpr.3 b/alliance/src/abl/man3/isablequalexpr.3 +index 50cc37a..e9d97e1 100644 +--- a/alliance/src/abl/man3/isablequalexpr.3 ++++ b/alliance/src/abl/man3/isablequalexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + isablequalexpr \- tests if two expressions are strictly identicals. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/isablnameinexpr.3 b/alliance/src/abl/man3/isablnameinexpr.3 +index fa15843..d4b4bf6 100644 +--- a/alliance/src/abl/man3/isablnameinexpr.3 ++++ b/alliance/src/abl/man3/isablnameinexpr.3 +@@ -4,7 +4,7 @@ + .SH OPER + isablnameinexpr \- tests if a name appears in an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/isabloperinexpr.3 b/alliance/src/abl/man3/isabloperinexpr.3 +index f4c4143..847ddd2 100644 +--- a/alliance/src/abl/man3/isabloperinexpr.3 ++++ b/alliance/src/abl/man3/isabloperinexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + isabloperinexpr \- tests if an operator appears in an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/isablsimilarexpr.3 b/alliance/src/abl/man3/isablsimilarexpr.3 +index 5951cc5..d080ddd 100644 +--- a/alliance/src/abl/man3/isablsimilarexpr.3 ++++ b/alliance/src/abl/man3/isablsimilarexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + isablsimilarexpr \- tests if two expressions have the same morphology. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/isablunaryoper.3 b/alliance/src/abl/man3/isablunaryoper.3 +index 5e7ad23..ec011b0 100644 +--- a/alliance/src/abl/man3/isablunaryoper.3 ++++ b/alliance/src/abl/man3/isablunaryoper.3 +@@ -4,7 +4,7 @@ + .SH NAME + isablunaryoper \- tests if an operator is unary. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/mapablanyexpr.3 b/alliance/src/abl/man3/mapablanyexpr.3 +index ff43fd2..1f6efe1 100644 +--- a/alliance/src/abl/man3/mapablanyexpr.3 ++++ b/alliance/src/abl/man3/mapablanyexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + mapablanyexpr \- applies a function to all operands. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/mapableveryexpr.3 b/alliance/src/abl/man3/mapableveryexpr.3 +index 818cf1a..40e7098 100644 +--- a/alliance/src/abl/man3/mapableveryexpr.3 ++++ b/alliance/src/abl/man3/mapableveryexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + mapableveryexpr \- applies a function to all operands. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/mapablexpr.3 b/alliance/src/abl/man3/mapablexpr.3 +index 441b800..a5b5e8d 100644 +--- a/alliance/src/abl/man3/mapablexpr.3 ++++ b/alliance/src/abl/man3/mapablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + mapablexpr \- applies a function to all operands. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/mapabloperexpr.3 b/alliance/src/abl/man3/mapabloperexpr.3 +index 260e0da..e9cea53 100644 +--- a/alliance/src/abl/man3/mapabloperexpr.3 ++++ b/alliance/src/abl/man3/mapabloperexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + mapabloperexpr \- applies a function to all operands. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/polarablexpr.3 b/alliance/src/abl/man3/polarablexpr.3 +index f267fac..b74081e 100644 +--- a/alliance/src/abl/man3/polarablexpr.3 ++++ b/alliance/src/abl/man3/polarablexpr.3 +@@ -5,7 +5,7 @@ + polarablexpr \- moves inverters to the atomic level. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/polardupablexpr.3 b/alliance/src/abl/man3/polardupablexpr.3 +index 900aba1..26abeb7 100644 +--- a/alliance/src/abl/man3/polardupablexpr.3 ++++ b/alliance/src/abl/man3/polardupablexpr.3 +@@ -5,7 +5,7 @@ + polardupablexpr \- duplicates an expression and moves down the inverters. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/simpablexpr.3 b/alliance/src/abl/man3/simpablexpr.3 +index d61be30..c11c688 100644 +--- a/alliance/src/abl/man3/simpablexpr.3 ++++ b/alliance/src/abl/man3/simpablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + simpablexpr \- simplies an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/simpdupablexpr.3 b/alliance/src/abl/man3/simpdupablexpr.3 +index 23e8802..41743d3 100644 +--- a/alliance/src/abl/man3/simpdupablexpr.3 ++++ b/alliance/src/abl/man3/simpdupablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + simpdupablexpr \- duplicates and simplies an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/substablexpr.3 b/alliance/src/abl/man3/substablexpr.3 +index a302b60..f01b8e0 100644 +--- a/alliance/src/abl/man3/substablexpr.3 ++++ b/alliance/src/abl/man3/substablexpr.3 +@@ -5,7 +5,7 @@ + substablexpr \- substitutes a given atom by an expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/substdupablexpr.3 b/alliance/src/abl/man3/substdupablexpr.3 +index 95615ea..559c480 100644 +--- a/alliance/src/abl/man3/substdupablexpr.3 ++++ b/alliance/src/abl/man3/substdupablexpr.3 +@@ -5,7 +5,7 @@ + substdupablexpr \- substitutes a given atom by an expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/unflatablexpr.3 b/alliance/src/abl/man3/unflatablexpr.3 +index 61e6e2c..1b788b5 100644 +--- a/alliance/src/abl/man3/unflatablexpr.3 ++++ b/alliance/src/abl/man3/unflatablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + unflatablexpr \- unflats the operators of an expression + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/vhdlablname.3 b/alliance/src/abl/man3/vhdlablname.3 +index 2fc4714..562c182 100644 +--- a/alliance/src/abl/man3/vhdlablname.3 ++++ b/alliance/src/abl/man3/vhdlablname.3 +@@ -4,7 +4,7 @@ + .SH NAME + vhdlablname \- returns a compatible VHDL name. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/vhdlablvector.3 b/alliance/src/abl/man3/vhdlablvector.3 +index b48dd23..96b6ada 100644 +--- a/alliance/src/abl/man3/vhdlablvector.3 ++++ b/alliance/src/abl/man3/vhdlablvector.3 +@@ -4,7 +4,7 @@ + .SH NAME + vhdlablvector \- gives the index and the name of a vectorized name. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/viewablexpr.3 b/alliance/src/abl/man3/viewablexpr.3 +index 926f677..71cd96c 100644 +--- a/alliance/src/abl/man3/viewablexpr.3 ++++ b/alliance/src/abl/man3/viewablexpr.3 +@@ -4,7 +4,7 @@ + .SH NAME + viewablexpr \- displays an expression. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/viewablexprfile.3 b/alliance/src/abl/man3/viewablexprfile.3 +index b61775e..c5fc47c 100644 +--- a/alliance/src/abl/man3/viewablexprfile.3 ++++ b/alliance/src/abl/man3/viewablexprfile.3 +@@ -4,7 +4,7 @@ + .SH NAME + viewablexprfile \- displays an expression in a file. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abl/man3/viewablexprstr.3 b/alliance/src/abl/man3/viewablexprstr.3 +index 1ba40e1..56b4e44 100644 +--- a/alliance/src/abl/man3/viewablexprstr.3 ++++ b/alliance/src/abl/man3/viewablexprstr.3 +@@ -4,7 +4,7 @@ + .SH NAME + viewablexprstr \- displays an expression in a str. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/abt/src/bhl_depend.c b/alliance/src/abt/src/bhl_depend.c +index 28ea6c9..b6d6a52 100644 +--- a/alliance/src/abt/src/bhl_depend.c ++++ b/alliance/src/abt/src/bhl_depend.c +@@ -249,7 +249,7 @@ struct befig *pt_fig; + } + + /* ###------------------------------------------------------### */ +- /* process simple ouputs. */ ++ /* process simple outputs. */ + /* check that the signal does not already belong to the */ + /* dependency list before adding it to the list */ + /* ###------------------------------------------------------### */ +@@ -272,7 +272,7 @@ struct befig *pt_fig; + } + + /* ###------------------------------------------------------### */ +- /* process bussed ouputs. */ ++ /* process bussed outputs. */ + /* check that the signal does not already belong to the */ + /* dependency list before adding it to the list */ + /* ###------------------------------------------------------### */ +diff --git a/alliance/src/alcban/man1/alcbanner.1 b/alliance/src/alcban/man1/alcbanner.1 +index 20b6cb1..3b1bc33 100644 +--- a/alliance/src/alcban/man1/alcbanner.1 ++++ b/alliance/src/alcban/man1/alcbanner.1 +@@ -85,7 +85,7 @@ will display : + .SH DIAGNOSTICS + + The output is centered for a 80 columns screen, so it can be used on most +-display easilly, and not found at execution time. ++display easily, and not found at execution time. + + \f4alliancebanner: Error: Resulting size bigger than 80 columns not allowed\fR + .RS +diff --git a/alliance/src/asimut/man1/asimut.1 b/alliance/src/asimut/man1/asimut.1 +index b9c3073..9655ba1 100644 +--- a/alliance/src/asimut/man1/asimut.1 ++++ b/alliance/src/asimut/man1/asimut.1 +@@ -51,7 +51,7 @@ list of directories containing description and pattern files (using $PATH + syntax). The default path is the current directory (see mbk(1)). + .TP 20 + \fIMBK_WORK_LIB\fP +-specifies the current working directory. The working directory idicates the ++specifies the current working directory. The working directory indicates the + place where all output files are written. + .TP 20 + \fIMBK_CATAL_NAME\fP +@@ -75,7 +75,7 @@ The default file extension is \fBdly\fP. + .TP 20 + \fIVH_MAXERR\fP + maximum number of errors allowed during simulation phase. If the number of +-errors occured during simulation reaches VH_MAXERR, \fBasimut\fP stops ++errors occurred during simulation reaches VH_MAXERR, \fBasimut\fP stops + the simulation at the end of processing the current pattern. Patterns following + the current pattern remain unprocessed and are reproduced in the result file. + The default value of \fIVH_MAXERR\fP is 10. +@@ -126,7 +126,7 @@ be used as initialization file in a further session. If the \fI\-nores\fP + option is specified a pattern file is also produced. + .TP 20 + \fI\-dbg[sbpldc]\fP +-call the debugger (developper usage) ++call the debugger (developer usage) + .TP 20 + \fI\-defaultdelay (\-dd)\fP + only null delays (no after clause in the VHDL file) are changed if +@@ -166,7 +166,7 @@ for \fIn\fP is 0 which makes the whole pattern + file be loaded. + .TP 20 + \fI\-t\fP +-trace signals when making BDDs (developper usage). ++trace signals when making BDDs (developer usage). + .TP 20 + \fI\-transport\fP + use transport delay model (default is inertial). +diff --git a/alliance/src/asimut/src/c_fsyn_sr1k_1.c b/alliance/src/asimut/src/c_fsyn_sr1k_1.c +index 05c345a..27cb741 100644 +--- a/alliance/src/asimut/src/c_fsyn_sr1k_1.c ++++ b/alliance/src/asimut/src/c_fsyn_sr1k_1.c +@@ -108,7 +108,7 @@ struct lkdins *pt_lkdins; + { + /* ###------------------------------------------------------### */ + /* read the content of the ram and write the result into the */ +- /* projected value of ouput data */ ++ /* projected value of output data */ + /* ###------------------------------------------------------### */ + + if (oe == 1) +diff --git a/alliance/src/asimut/src/c_fsyn_sr1k_10.c b/alliance/src/asimut/src/c_fsyn_sr1k_10.c +index 094adf9..8f4e67d 100644 +--- a/alliance/src/asimut/src/c_fsyn_sr1k_10.c ++++ b/alliance/src/asimut/src/c_fsyn_sr1k_10.c +@@ -108,7 +108,7 @@ struct lkdins *pt_lkdins; + { + /* ###------------------------------------------------------### */ + /* read the content of the ram and write the result into the */ +- /* projected value of ouput data */ ++ /* projected value of output data */ + /* ###------------------------------------------------------### */ + + if (oe == 1) +diff --git a/alliance/src/asimut/src/c_fsyn_sr1k_24.c b/alliance/src/asimut/src/c_fsyn_sr1k_24.c +index 24b06f0..149a647 100644 +--- a/alliance/src/asimut/src/c_fsyn_sr1k_24.c ++++ b/alliance/src/asimut/src/c_fsyn_sr1k_24.c +@@ -108,7 +108,7 @@ struct lkdins *pt_lkdins; + { + /* ###------------------------------------------------------### */ + /* read the content of the ram and write the result into the */ +- /* projected value of ouput data */ ++ /* projected value of output data */ + /* ###------------------------------------------------------### */ + + if (oe == 1) +diff --git a/alliance/src/asimut/src/c_fsyn_sr1k_4.c b/alliance/src/asimut/src/c_fsyn_sr1k_4.c +index 97fa43c..1cd99c3 100644 +--- a/alliance/src/asimut/src/c_fsyn_sr1k_4.c ++++ b/alliance/src/asimut/src/c_fsyn_sr1k_4.c +@@ -108,7 +108,7 @@ struct lkdins *pt_lkdins; + { + /* ###------------------------------------------------------### */ + /* read the content of the ram and write the result into the */ +- /* projected value of ouput data */ ++ /* projected value of output data */ + /* ###------------------------------------------------------### */ + + if (oe == 1) +diff --git a/alliance/src/asimut/src/c_fsyn_sr1k_56.c b/alliance/src/asimut/src/c_fsyn_sr1k_56.c +index 04377fe..3a3ddd3 100644 +--- a/alliance/src/asimut/src/c_fsyn_sr1k_56.c ++++ b/alliance/src/asimut/src/c_fsyn_sr1k_56.c +@@ -118,7 +118,7 @@ struct lkdins *pt_lkdins; + { + /* ###------------------------------------------------------### */ + /* read the content of the ram and write the result into the */ +- /* projected value of ouput data */ ++ /* projected value of output data */ + /* ###------------------------------------------------------### */ + + dh_out = local->HI_RAM [adr]; +diff --git a/alliance/src/asimut/src/c_fsyn_sr4k_10.c b/alliance/src/asimut/src/c_fsyn_sr4k_10.c +index 66d37e1..83b1ee9 100644 +--- a/alliance/src/asimut/src/c_fsyn_sr4k_10.c ++++ b/alliance/src/asimut/src/c_fsyn_sr4k_10.c +@@ -108,7 +108,7 @@ struct lkdins *pt_lkdins; + { + /* ###------------------------------------------------------### */ + /* read the content of the ram and write the result into the */ +- /* projected value of ouput data */ ++ /* projected value of output data */ + /* ###------------------------------------------------------### */ + + if (oe == 1) +diff --git a/alliance/src/asimut/src/c_hada_repondeur.c b/alliance/src/asimut/src/c_hada_repondeur.c +index 30f8222..4bff23f 100644 +--- a/alliance/src/asimut/src/c_hada_repondeur.c ++++ b/alliance/src/asimut/src/c_hada_repondeur.c +@@ -142,7 +142,7 @@ struct lkdins *pt_lkdins; + + if ((full_old == 0) && (write == 1) && (nb_sorties != 0)) + { +- fprintf(stderr,"NEW OUPUT FIFO VALUE : %d\n", hadout); ++ fprintf(stderr,"NEW OUTPUT FIFO VALUE : %d\n", hadout); + fprintf(fecrire,"0x%x\t",hadout); + nb_sorties--; + if ( (nb_sorties%8) == 0 ) fprintf(fecrire,"\n"); +diff --git a/alliance/src/asimut/src/c_sr1k_8a.c b/alliance/src/asimut/src/c_sr1k_8a.c +index 6590254..230c58c 100644 +--- a/alliance/src/asimut/src/c_sr1k_8a.c ++++ b/alliance/src/asimut/src/c_sr1k_8a.c +@@ -94,7 +94,7 @@ struct lkdins *pt_lkdins; + } + + /* ###------------------------------------------------------### */ +- /* write the result into the projected value of ouput signals */ ++ /* write the result into the projected value of output signals */ + /* ###------------------------------------------------------### */ + + if ((e_n == 0) && (w_n == 1)) +diff --git a/alliance/src/asimut/src/c_sr1k_8b.c b/alliance/src/asimut/src/c_sr1k_8b.c +index 72017e3..6735b09 100644 +--- a/alliance/src/asimut/src/c_sr1k_8b.c ++++ b/alliance/src/asimut/src/c_sr1k_8b.c +@@ -255,7 +255,7 @@ struct lkdins *pt_lkdins; + } + + /* ###------------------------------------------------------### */ +- /* write the result into the projected value of ouput signals */ ++ /* write the result into the projected value of output signals */ + /* ###------------------------------------------------------### */ + + if ((e_n == 0) && (w_n == 1)) +diff --git a/alliance/src/asimut/src/c_sr8k_8a.c b/alliance/src/asimut/src/c_sr8k_8a.c +index dc58310..bf3cf9e 100644 +--- a/alliance/src/asimut/src/c_sr8k_8a.c ++++ b/alliance/src/asimut/src/c_sr8k_8a.c +@@ -94,7 +94,7 @@ struct lkdins *pt_lkdins; + } + + /* ###------------------------------------------------------### */ +- /* write the result into the projected value of ouput signals */ ++ /* write the result into the projected value of output signals */ + /* ###------------------------------------------------------### */ + + if ((e_n == 0) && (w_n == 1)) +diff --git a/alliance/src/asimut/src/sch_debug.c b/alliance/src/asimut/src/sch_debug.c +index f99016a..ae5c16a 100644 +--- a/alliance/src/asimut/src/sch_debug.c ++++ b/alliance/src/asimut/src/sch_debug.c +@@ -283,7 +283,7 @@ char **str ; /* recognized strings */ + /* function : splitline */ + /* description : read a line (the space must have been reserved by the */ + /* caller - *words) from the standard input and split it */ +-/* into seperate words. Return the number of words read. */ ++/* into separate words. Return the number of words read. */ + /* called func. : none */ + /* ###--------------------------------------------------------------### */ + +@@ -599,7 +599,7 @@ char *type; /* structure's type */ + { + /* ###------------------------------------------------------### */ + /* if the first word of the line has not been recognized, */ +- /* print an error message. Otherwise, proccess the command line */ ++ /* print an error message. Otherwise, process the command line */ + /* (generally it is a request for displaying a specific field). */ + /* */ + /* At this point : */ +diff --git a/alliance/src/asimut/src/vh_debug.c b/alliance/src/asimut/src/vh_debug.c +index 32ab290..82a70f1 100644 +--- a/alliance/src/asimut/src/vh_debug.c ++++ b/alliance/src/asimut/src/vh_debug.c +@@ -1319,7 +1319,7 @@ char **str ; /* recognized strings */ + /* function : splitline */ + /* description : read a line (the space must have been reserved by the */ + /* caller - *words) from the standard input and split it */ +-/* into seperate words. Return the number of words read. */ ++/* into separate words. Return the number of words read. */ + /* called func. : none */ + /* ###--------------------------------------------------------------### */ + +@@ -1711,7 +1711,7 @@ char *type; /* structure's type */ + { + /* ###------------------------------------------------------### */ + /* if the first word of the line has not been recognized, */ +- /* print an error message. Otherwise, proccess the command line */ ++ /* print an error message. Otherwise, process the command line */ + /* (generally it is a request for displaying a specific field). */ + /* */ + /* At this point : */ +diff --git a/alliance/src/asimut/src/vh_init.h b/alliance/src/asimut/src/vh_init.h +index 5de76e0..82c3fa9 100644 +--- a/alliance/src/asimut/src/vh_init.h ++++ b/alliance/src/asimut/src/vh_init.h +@@ -5,7 +5,7 @@ + /* date : Jan 11 2014 */ + /* version : v3.0 */ + /* authors : J.-P. CHAPUT , P. BAZARGAN */ +-/* content : contains defines, external variables and funtions */ ++/* content : contains defines, external variables and functions */ + /* used by init functions */ + /* ###--------------------------------------------------------------### */ + +diff --git a/alliance/src/asimut/src/vh_lspec.c b/alliance/src/asimut/src/vh_lspec.c +index 6b270ae..5d07196 100644 +--- a/alliance/src/asimut/src/vh_lspec.c ++++ b/alliance/src/asimut/src/vh_lspec.c +@@ -1341,10 +1341,10 @@ struct paseq *pt_paseq; + /* description : restore the mode of external ports of the description */ + /* when the declared mode is LINKAGE. */ + /* */ +-/* First, it restores (if necessary) the informations on */ ++/* First, it restores (if necessary) the information on */ + /* internal ports checking the consistency between the */ + /* model and the instance. Then, it propagates restored */ +-/* informations through the signals til the external */ ++/* information through the signals til the external */ + /* ports. In the final step it checks the consistency of */ + /* connexions on the signals */ + /* called funct : beh_initab , beh_chktab, beh_addtab, beh_fretab, */ +@@ -1800,7 +1800,7 @@ struct befig *head_befig; + + /* ###--------------------------------------------------------------### */ + /* function : vhl_getref */ +-/* description : get signal refernces for a distributed simulation */ ++/* description : get signal references for a distributed simulation */ + /* called func. : beh_chktab, */ + /* ###--------------------------------------------------------------### */ + +diff --git a/alliance/src/asimut/src/vh_lspec.h b/alliance/src/asimut/src/vh_lspec.h +index 12433f8..b6956db 100644 +--- a/alliance/src/asimut/src/vh_lspec.h ++++ b/alliance/src/asimut/src/vh_lspec.h +@@ -4,7 +4,7 @@ + /* date : Aug 20 1997 */ + /* version : v3.0 */ + /* authors : VUONG H.N., Pirouz BAZARGAN SABET */ +-/* content : contains defines, external variables and funtions used*/ ++/* content : contains defines, external variables and functions used*/ + /* by the linker */ + /* ###--------------------------------------------------------------### */ + +diff --git a/alliance/src/asimut/src/vh_simulad.c b/alliance/src/asimut/src/vh_simulad.c +index c3ade54..6be10b7 100644 +--- a/alliance/src/asimut/src/vh_simulad.c ++++ b/alliance/src/asimut/src/vh_simulad.c +@@ -268,7 +268,7 @@ char *argv[]; + arg_flg [i+1] = 1; + } + +- /* The spy option has been supressed (09 Sep 1999). */ ++ /* The spy option has been suppressed (09 Sep 1999). */ + /* Spied signals are now specified in the pattern file. */ + + /*--------------- +@@ -887,7 +887,7 @@ char *argv[]; + lst_papat = vhx_insertspypat (pt_paseq, lst_papat, pt_lkdspy, cur_date, labelsiz); + } + /* ###------------------------------------------------------### */ +- /* If a fatal error has been occured during the simulation */ ++ /* If a fatal error has been occurred during the simulation */ + /* (Assert Violation, Bus conflict), set the end flag of the */ + /* pattern sequence to avoid loading new patterns and break the */ + /* simulation cycle */ +diff --git a/alliance/src/asimut/src/vh_util.h b/alliance/src/asimut/src/vh_util.h +index 8bfe6b2..e1a265e 100644 +--- a/alliance/src/asimut/src/vh_util.h ++++ b/alliance/src/asimut/src/vh_util.h +@@ -4,7 +4,7 @@ + /* date : Nov 13 1995 */ + /* version : v3.0 */ + /* authors : VUONG H.N., L.A. TABUSSE, P. BAZARGAN */ +-/* content : contains defines, external variables and funtions used*/ ++/* content : contains defines, external variables and functions used*/ + /* by utility functions */ + /* ###--------------------------------------------------------------### */ + +diff --git a/alliance/src/asimut/src/vh_xcomm.c b/alliance/src/asimut/src/vh_xcomm.c +index 165f11b..11bcbd5 100644 +--- a/alliance/src/asimut/src/vh_xcomm.c ++++ b/alliance/src/asimut/src/vh_xcomm.c +@@ -1132,7 +1132,7 @@ struct papat *pt_papat; + + /* ###------------------------------------------------------### */ + /* if no user predicted event has been found and an event has */ +- /* been occured, add a new paevt structure to the pattern. Use */ ++ /* been occurred, add a new paevt structure to the pattern. Use */ + /* a wrong value (the previous value) as user defined value. */ + /* Remember that a user predicted '?*' is always an event. */ + /* ###------------------------------------------------------### */ +@@ -1168,7 +1168,7 @@ struct papat *pt_papat; + /* if there is an event related to the input-output, and if */ + /* the value predicted by the user and the simulated value do */ + /* not match print out an error message. In such a case add an */ +- /* event on the same input-ouput with a wrong predicted value */ ++ /* event on the same input-output with a wrong predicted value */ + /* to the next pattern (if it exists). */ + /* ###------------------------------------------------------### */ + +@@ -1224,7 +1224,7 @@ struct papat *pt_papat; + + /* ###------------------------------------------------------### */ + /* If an error occurs, and if no user event is scheduled in the */ +- /* next pattern, add an event on the same input-ouput with a */ ++ /* next pattern, add an event on the same input-output with a */ + /* wrong predicted value to the next pattern (if it exists). */ + /* ###------------------------------------------------------### */ + +@@ -1407,9 +1407,9 @@ unsigned int labelsiz; + } + + /* ###------------------------------------------------------### */ +- /* if an event has been occured, switch ON a spy_flag. */ ++ /* if an event has been occurred, switch ON a spy_flag. */ + /* and append the paiol IOLNBR to the label. */ +- /* if an event has been occured, add a new paevt structure. */ ++ /* if an event has been occurred, add a new paevt structure. */ + /* ###------------------------------------------------------### */ + + if (pt_paiol->VALUE != value) +@@ -1507,7 +1507,7 @@ unsigned int labelsiz; + } + + /* ###------------------------------------------------------### */ +- /* if an event has been occured, add a new paevt structure. */ ++ /* if an event has been occurred, add a new paevt structure. */ + /* ###------------------------------------------------------### */ + + if (pt_paiol->VALUE != value) +diff --git a/alliance/src/asimut/src/vh_xspec.c b/alliance/src/asimut/src/vh_xspec.c +index c252c68..e6bb510 100644 +--- a/alliance/src/asimut/src/vh_xspec.c ++++ b/alliance/src/asimut/src/vh_xspec.c +@@ -902,7 +902,7 @@ unsigned int cur_date; + VHX_SIGUPD = NULL; + + /* ###------------------------------------------------------### */ +- /* update bused signals' value (also handles errors occured */ ++ /* update bused signals' value (also handles errors occurred */ + /* when resolution functions are called) */ + /* ###------------------------------------------------------### */ + +@@ -971,7 +971,7 @@ unsigned int cur_date; + + /* ###------------------------------------------------------### */ + /* update internal bussed signals's value (also handles */ +- /* errors occured when resolution functions are called) */ ++ /* errors occurred when resolution functions are called) */ + /* ###------------------------------------------------------### */ + + cur_chain = VHX_BUXUPD; +@@ -1037,7 +1037,7 @@ unsigned int cur_date; + VHX_BUXUPD = NULL; + + /* ###------------------------------------------------------### */ +- /* updating registers (also handles errors occured when */ ++ /* updating registers (also handles errors occurred when */ + /* resolution functions are called) */ + /* ###------------------------------------------------------### */ + +diff --git a/alliance/src/attila/doc/attila/man_attila.html b/alliance/src/attila/doc/attila/man_attila.html +index ae006e6..46f34b0 100644 +--- a/alliance/src/attila/doc/attila/man_attila.html ++++ b/alliance/src/attila/doc/attila/man_attila.html +@@ -188,7 +188,7 @@ CLASS="LITERAL" + your ~/.rhosts to access them whithout ++> to access them without + passwords. You also can uses sshinstall is +- assumed. If you want to completly uninstall a tool and clean ++ assumed. If you want to completely uninstall a tool and clean + it's build directory you can pass + bip) and on one Solaris + computer (beny). As to connect on thoses + computer it will uses rsh so you must setup +- your ~/.rhosts to access them whithout ++ your ~/.rhosts to access them without + passwords. You also can uses ssh (but the + procedure to allow automatic login is more complicated). + +@@ -285,7 +285,7 @@ + as is to the subsequent call to + make. If no -m- + argument is given, then install is +- assumed. If you want to completly uninstall a tool and clean ++ assumed. If you want to completely uninstall a tool and clean + it's build directory you can pass + uninstall clean + +diff --git a/alliance/src/aut/man3/autallocblock.3 b/alliance/src/aut/man3/autallocblock.3 +index 4cf8454..9f6862c 100644 +--- a/alliance/src/aut/man3/autallocblock.3 ++++ b/alliance/src/aut/man3/autallocblock.3 +@@ -4,7 +4,7 @@ + .SH NAME + autallocblock \- memory allocator + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/aut/man3/autallocheap.3 b/alliance/src/aut/man3/autallocheap.3 +index c82bdcd..4dc8870 100644 +--- a/alliance/src/aut/man3/autallocheap.3 ++++ b/alliance/src/aut/man3/autallocheap.3 +@@ -4,7 +4,7 @@ + .SH NAME + autallocheap \- heap memory allocator + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/aut/man3/autfreeblock.3 b/alliance/src/aut/man3/autfreeblock.3 +index 225619c..ef8db67 100644 +--- a/alliance/src/aut/man3/autfreeblock.3 ++++ b/alliance/src/aut/man3/autfreeblock.3 +@@ -4,7 +4,7 @@ + .SH NAME + autfreeblock \- releases a memory block + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/aut/man3/autfreeheap.3 b/alliance/src/aut/man3/autfreeheap.3 +index 1d78528..e9f358e 100644 +--- a/alliance/src/aut/man3/autfreeheap.3 ++++ b/alliance/src/aut/man3/autfreeheap.3 +@@ -4,7 +4,7 @@ + .SH NAME + autfreeheap \- releases a memory block, and put it on the heap. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/aut/man3/autresizeblock.3 b/alliance/src/aut/man3/autresizeblock.3 +index 226b6e7..9b4d650 100644 +--- a/alliance/src/aut/man3/autresizeblock.3 ++++ b/alliance/src/aut/man3/autresizeblock.3 +@@ -4,7 +4,7 @@ + .SH NAME + autresizeblock \- resizes a memory block + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} diff --git a/alliance/src/autostuff b/alliance/src/autostuff index abbdfd6..53083eb 100755 --- a/alliance/src/autostuff @@ -55,6 +1273,1418 @@ index abbdfd6..53083eb 100755 echo "$version_line" >> configure.in version_name=`echo $version_line | sed 's,=.*,,'` echo "AC_SUBST($version_name)" >> configure.in +diff --git a/alliance/src/bdd/man1/bdd.1 b/alliance/src/bdd/man1/bdd.1 +index 3906a8d..f8cc113 100644 +--- a/alliance/src/bdd/man1/bdd.1 ++++ b/alliance/src/bdd/man1/bdd.1 +@@ -121,10 +121,10 @@ as a Multi Reduced Ordered Binary Decision Diagrams. + \- converts a \fBbdd\fP node to an \fBabl\fP. + .TP + \fBexistbddnodeassocon\fP +-\- computes an existantial quantification. ++\- computes an existential quantification. + .TP + \fBexistbddnodeassocoff\fP +-\- computes an existantial quantification. ++\- computes an existential quantification. + .TP + \fBgarbagebddsystem\fP + \- forces a \fBbdd\fP garbage collection. +diff --git a/alliance/src/bdd/man3/addbddassoc.3 b/alliance/src/bdd/man3/addbddassoc.3 +index 6c761fb..7c3c4bd 100644 +--- a/alliance/src/bdd/man3/addbddassoc.3 ++++ b/alliance/src/bdd/man3/addbddassoc.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddassoc \- creates a new association variables. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddcircuitabl.3 b/alliance/src/bdd/man3/addbddcircuitabl.3 +index fab0f9d..3b7657d 100644 +--- a/alliance/src/bdd/man3/addbddcircuitabl.3 ++++ b/alliance/src/bdd/man3/addbddcircuitabl.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddcircuitabl \- converts an \fBabl\fP expression to a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddcircuitin.3 b/alliance/src/bdd/man3/addbddcircuitin.3 +index 1fe8ce5..ff8fc85 100644 +--- a/alliance/src/bdd/man3/addbddcircuitin.3 ++++ b/alliance/src/bdd/man3/addbddcircuitin.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddcircuitin \- adds an input in a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddcircuitout.3 b/alliance/src/bdd/man3/addbddcircuitout.3 +index 50861b6..f31f6e6 100644 +--- a/alliance/src/bdd/man3/addbddcircuitout.3 ++++ b/alliance/src/bdd/man3/addbddcircuitout.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddcircuitout \- adds an output in a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddnode.3 b/alliance/src/bdd/man3/addbddnode.3 +index abc88a7..f59b7fe 100644 +--- a/alliance/src/bdd/man3/addbddnode.3 ++++ b/alliance/src/bdd/man3/addbddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddnode \- adds a new \fBbdd\fP node in the \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddnodeassoc.3 b/alliance/src/bdd/man3/addbddnodeassoc.3 +index 61c9399..810fe71 100644 +--- a/alliance/src/bdd/man3/addbddnodeassoc.3 ++++ b/alliance/src/bdd/man3/addbddnodeassoc.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddnodeassoc \- adds a \fBbdd\fP node in a variable association. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddnodelist.3 b/alliance/src/bdd/man3/addbddnodelist.3 +index c510795..b0fcf31 100644 +--- a/alliance/src/bdd/man3/addbddnodelist.3 ++++ b/alliance/src/bdd/man3/addbddnodelist.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddnodelist \- adds a node in a \fIchain_list\fP. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddvar.3 b/alliance/src/bdd/man3/addbddvar.3 +index 325b52c..6222cfb 100644 +--- a/alliance/src/bdd/man3/addbddvar.3 ++++ b/alliance/src/bdd/man3/addbddvar.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddvar \- adds a new variable in the \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddvarafter.3 b/alliance/src/bdd/man3/addbddvarafter.3 +index c3dfaba..2344db3 100644 +--- a/alliance/src/bdd/man3/addbddvarafter.3 ++++ b/alliance/src/bdd/man3/addbddvarafter.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddvarafter \- adds a new variable, after an existing one. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddvarbefore.3 b/alliance/src/bdd/man3/addbddvarbefore.3 +index 2a85f35..c6085a5 100644 +--- a/alliance/src/bdd/man3/addbddvarbefore.3 ++++ b/alliance/src/bdd/man3/addbddvarbefore.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddvarbefore \- adds a new variable, before an existing one. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddvarfirst.3 b/alliance/src/bdd/man3/addbddvarfirst.3 +index 80c09c3..0deb7db 100644 +--- a/alliance/src/bdd/man3/addbddvarfirst.3 ++++ b/alliance/src/bdd/man3/addbddvarfirst.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddvarfirst \- adds a new variable, before all others. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/addbddvarlast.3 b/alliance/src/bdd/man3/addbddvarlast.3 +index e8b4c98..ddaade7 100644 +--- a/alliance/src/bdd/man3/addbddvarlast.3 ++++ b/alliance/src/bdd/man3/addbddvarlast.3 +@@ -4,7 +4,7 @@ + .SH NAME + addbddvarlast \- adds a new variable, after all others. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/applybddnode.3 b/alliance/src/bdd/man3/applybddnode.3 +index 25250f2..8ef52cc 100644 +--- a/alliance/src/bdd/man3/applybddnode.3 ++++ b/alliance/src/bdd/man3/applybddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + applybddnode \- applies an operator on two \fBbdd\fP nodes. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/applybddnodeite.3 b/alliance/src/bdd/man3/applybddnodeite.3 +index 51de266..2558329 100644 +--- a/alliance/src/bdd/man3/applybddnodeite.3 ++++ b/alliance/src/bdd/man3/applybddnodeite.3 +@@ -5,7 +5,7 @@ + applybddnodeite \- computes the IF-THEN-ELSE logical operation. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/applybddnodelist.3 b/alliance/src/bdd/man3/applybddnodelist.3 +index 7dc2126..3d82dce 100644 +--- a/alliance/src/bdd/man3/applybddnodelist.3 ++++ b/alliance/src/bdd/man3/applybddnodelist.3 +@@ -4,7 +4,7 @@ + .SH NAME + applybddnodelist \- applies an opertor to a \fBbdd\fP nodes list. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/applybddnodenot.3 b/alliance/src/bdd/man3/applybddnodenot.3 +index f4e26a7..3f6b29f 100644 +--- a/alliance/src/bdd/man3/applybddnodenot.3 ++++ b/alliance/src/bdd/man3/applybddnodenot.3 +@@ -4,7 +4,7 @@ + .SH NAME + applybddnodenot \- complements a \fBbdd\fP. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/applybddnodeterm.3 b/alliance/src/bdd/man3/applybddnodeterm.3 +index c9bace5..fbdd83d 100644 +--- a/alliance/src/bdd/man3/applybddnodeterm.3 ++++ b/alliance/src/bdd/man3/applybddnodeterm.3 +@@ -4,7 +4,7 @@ + .SH NAME + applybddnodeterm \- applies an operator on two \fBbdd\fP nodes. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/clearbddsystemref.3 b/alliance/src/bdd/man3/clearbddsystemref.3 +index e8cca16..a257915 100644 +--- a/alliance/src/bdd/man3/clearbddsystemref.3 ++++ b/alliance/src/bdd/man3/clearbddsystemref.3 +@@ -4,7 +4,7 @@ + .SH NAME + clearbddsystemref \- clears the references for all \fBbdd\fP nodes. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/clearbddsystemrefext.3 b/alliance/src/bdd/man3/clearbddsystemrefext.3 +index 472812a..0ad6a34 100644 +--- a/alliance/src/bdd/man3/clearbddsystemrefext.3 ++++ b/alliance/src/bdd/man3/clearbddsystemrefext.3 +@@ -4,7 +4,7 @@ + .SH NAME + clearbddsystemrefext \- clears the external references for all \fBbdd\fP nodes. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/clearbddsystemrefint.3 b/alliance/src/bdd/man3/clearbddsystemrefint.3 +index 4346d56..851d4a9 100644 +--- a/alliance/src/bdd/man3/clearbddsystemrefint.3 ++++ b/alliance/src/bdd/man3/clearbddsystemrefint.3 +@@ -4,7 +4,7 @@ + .SH NAME + clearbddsystemrefint \- clears the internal references for all \fBbdd\fP nodes. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/cofactorbddnode.3 b/alliance/src/bdd/man3/cofactorbddnode.3 +index 7ee0c5b..a417210 100644 +--- a/alliance/src/bdd/man3/cofactorbddnode.3 ++++ b/alliance/src/bdd/man3/cofactorbddnode.3 +@@ -5,7 +5,7 @@ + cofactorbddnode \- computes the generalized cofactor. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/composebddnode.3 b/alliance/src/bdd/man3/composebddnode.3 +index f42eea0..3d296bd 100644 +--- a/alliance/src/bdd/man3/composebddnode.3 ++++ b/alliance/src/bdd/man3/composebddnode.3 +@@ -5,7 +5,7 @@ + composebddnode \- substitutes a variable by a \fBbdd\fP in another \fBbdd\fP. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/convertbddcircuitabl.3 b/alliance/src/bdd/man3/convertbddcircuitabl.3 +index e2f1e82..37fb813 100644 +--- a/alliance/src/bdd/man3/convertbddcircuitabl.3 ++++ b/alliance/src/bdd/man3/convertbddcircuitabl.3 +@@ -5,7 +5,7 @@ + convertbddcircuitabl \- converts a \fBbdd\fP node to an \fBabl\fP expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/convertbddcircuitsumabl.3 b/alliance/src/bdd/man3/convertbddcircuitsumabl.3 +index f3e9901..c69a5c6 100644 +--- a/alliance/src/bdd/man3/convertbddcircuitsumabl.3 ++++ b/alliance/src/bdd/man3/convertbddcircuitsumabl.3 +@@ -5,7 +5,7 @@ + convertbddcircuitsumabl \- converts a \fBbdd\fP node to an \fBabl\fP expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/convertbddindexabl.3 b/alliance/src/bdd/man3/convertbddindexabl.3 +index c964a84..3338ab5 100644 +--- a/alliance/src/bdd/man3/convertbddindexabl.3 ++++ b/alliance/src/bdd/man3/convertbddindexabl.3 +@@ -5,7 +5,7 @@ + convertbddindexabl \- converts a \fBbdd\fP index to an \fBabl\fP expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/convertbddmuxabl.3 b/alliance/src/bdd/man3/convertbddmuxabl.3 +index 5a5426d..32b6948 100644 +--- a/alliance/src/bdd/man3/convertbddmuxabl.3 ++++ b/alliance/src/bdd/man3/convertbddmuxabl.3 +@@ -5,7 +5,7 @@ + convertbddmuxabl \- converts two \fBbdd\fP nodes to an \fBabl\fP multiplexor expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/convertbddnodeabl.3 b/alliance/src/bdd/man3/convertbddnodeabl.3 +index c375cb9..068bc07 100644 +--- a/alliance/src/bdd/man3/convertbddnodeabl.3 ++++ b/alliance/src/bdd/man3/convertbddnodeabl.3 +@@ -5,7 +5,7 @@ + convertbddnodeabl \- converts a \fBbdd\fP node to an \fBabl\fP expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/convertbddnodesumabl.3 b/alliance/src/bdd/man3/convertbddnodesumabl.3 +index de9403f..7001370 100644 +--- a/alliance/src/bdd/man3/convertbddnodesumabl.3 ++++ b/alliance/src/bdd/man3/convertbddnodesumabl.3 +@@ -5,7 +5,7 @@ + convertbddnodesumabl \- converts a \fBbdd\fP node to an \fBabl\fP expression. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/createbddcircuit.3 b/alliance/src/bdd/man3/createbddcircuit.3 +index 6c7599d..623e23c 100644 +--- a/alliance/src/bdd/man3/createbddcircuit.3 ++++ b/alliance/src/bdd/man3/createbddcircuit.3 +@@ -4,7 +4,7 @@ + .SH NAME + createbddcircuit \- creates a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/createbddsystem.3 b/alliance/src/bdd/man3/createbddsystem.3 +index d13b71b..f577d43 100644 +--- a/alliance/src/bdd/man3/createbddsystem.3 ++++ b/alliance/src/bdd/man3/createbddsystem.3 +@@ -4,7 +4,7 @@ + .SH NAME + createbddsystem \- creates a \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/decbddrefext.3 b/alliance/src/bdd/man3/decbddrefext.3 +index f5dd396..faae159 100644 +--- a/alliance/src/bdd/man3/decbddrefext.3 ++++ b/alliance/src/bdd/man3/decbddrefext.3 +@@ -4,7 +4,7 @@ + .SH NAME + decbddrefext \- decrements the external reference of a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -33,7 +33,7 @@ of the \fBbdd\fP node \fIBddNode\fP. + "negative reference, index xxx error !" + .ft R + .RS +-The \fIBddNode\fP must have a postive number of external reference. ++The \fIBddNode\fP must have a positive number of external reference. + .RE + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n +diff --git a/alliance/src/bdd/man3/decbddrefint.3 b/alliance/src/bdd/man3/decbddrefint.3 +index 46e3eff..9dc446e 100644 +--- a/alliance/src/bdd/man3/decbddrefint.3 ++++ b/alliance/src/bdd/man3/decbddrefint.3 +@@ -4,7 +4,7 @@ + .SH NAME + decbddrefint \- decrements the internal reference of a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -33,7 +33,7 @@ of the \fBbdd\fP node \fIBddNode\fP. + "negative reference, index xxx error !" + .ft R + .RS +-The \fIBddNode\fP must have a postive number of internal reference. ++The \fIBddNode\fP must have a positive number of internal reference. + .RE + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n +diff --git a/alliance/src/bdd/man3/delbddassoc.3 b/alliance/src/bdd/man3/delbddassoc.3 +index 43abf93..c522321 100644 +--- a/alliance/src/bdd/man3/delbddassoc.3 ++++ b/alliance/src/bdd/man3/delbddassoc.3 +@@ -4,7 +4,7 @@ + .SH NAME + delbddassoc \- deletes a variable association. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/delbddcircuitout.3 b/alliance/src/bdd/man3/delbddcircuitout.3 +index a49a379..48ddfbf 100644 +--- a/alliance/src/bdd/man3/delbddcircuitout.3 ++++ b/alliance/src/bdd/man3/delbddcircuitout.3 +@@ -4,7 +4,7 @@ + .SH NAME + delbddcircuitout \- deletes an output in a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/delbddnode.3 b/alliance/src/bdd/man3/delbddnode.3 +index 4a64770..940904e 100644 +--- a/alliance/src/bdd/man3/delbddnode.3 ++++ b/alliance/src/bdd/man3/delbddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + delbddnode \- deletes an unused \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/delbddnodeassoc.3 b/alliance/src/bdd/man3/delbddnodeassoc.3 +index 668ac88..7007451 100644 +--- a/alliance/src/bdd/man3/delbddnodeassoc.3 ++++ b/alliance/src/bdd/man3/delbddnodeassoc.3 +@@ -4,7 +4,7 @@ + .SH NAME + delbddnodeassoc \- deletes a \fBbdd\fP node in a variable association. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/delbddnodelist.3 b/alliance/src/bdd/man3/delbddnodelist.3 +index 045fa23..ca75991 100644 +--- a/alliance/src/bdd/man3/delbddnodelist.3 ++++ b/alliance/src/bdd/man3/delbddnodelist.3 +@@ -4,7 +4,7 @@ + .SH NAME + delbddnodelist \- deletes a list of \fBbdd\fP nodes. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/destroybddassoc.3 b/alliance/src/bdd/man3/destroybddassoc.3 +index 395b013..7ac33c3 100644 +--- a/alliance/src/bdd/man3/destroybddassoc.3 ++++ b/alliance/src/bdd/man3/destroybddassoc.3 +@@ -4,7 +4,7 @@ + .SH NAME + destroybddassoc \- frees all the variable associations. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/destroybddcircuit.3 b/alliance/src/bdd/man3/destroybddcircuit.3 +index 1757ffd..5a949cf 100644 +--- a/alliance/src/bdd/man3/destroybddcircuit.3 ++++ b/alliance/src/bdd/man3/destroybddcircuit.3 +@@ -4,7 +4,7 @@ + .SH NAME + destroybddcircuit \- destroys a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/destroybddsystem.3 b/alliance/src/bdd/man3/destroybddsystem.3 +index 0c90898..3bae538 100644 +--- a/alliance/src/bdd/man3/destroybddsystem.3 ++++ b/alliance/src/bdd/man3/destroybddsystem.3 +@@ -4,7 +4,7 @@ + .SH NAME + destroybddsystem \- destroys a \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/existbddnodeassocoff.3 b/alliance/src/bdd/man3/existbddnodeassocoff.3 +index 8b3ce67..c9b5c25 100644 +--- a/alliance/src/bdd/man3/existbddnodeassocoff.3 ++++ b/alliance/src/bdd/man3/existbddnodeassocoff.3 +@@ -2,9 +2,9 @@ + .\" @(#)existbddnodeassocoff.2 2.7 96/07/02 ; Labo masi cao-vlsi; Author : Jacomme Ludovic + .TH EXISTBDDNODEASSOCOFF 3 "October 1, 1997" "ASIM/LIP6" "BDD FUNCTIONS" + .SH NAME +-existbddnodeassocoff \- computes an existantial quantification. ++existbddnodeassocoff \- computes an existential quantification. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/existbddnodeassocon.3 b/alliance/src/bdd/man3/existbddnodeassocon.3 +index 86c40f6..8e69f3e 100644 +--- a/alliance/src/bdd/man3/existbddnodeassocon.3 ++++ b/alliance/src/bdd/man3/existbddnodeassocon.3 +@@ -2,9 +2,9 @@ + .\" @(#)existbddnodeassocon.2 2.7 96/07/02 ; Labo masi cao-vlsi; Author : Jacomme Ludovic + .TH EXISTBDDNODEASSOCON 3 "October 1, 1997" "ASIM/LIP6" "BDD FUNCTIONS" + .SH NAME +-existbddnodeassocon \- computes an existantial quantification. ++existbddnodeassocon \- computes an existential quantification. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/garbagebddsystem.3 b/alliance/src/bdd/man3/garbagebddsystem.3 +index 8dc239e..8788342 100644 +--- a/alliance/src/bdd/man3/garbagebddsystem.3 ++++ b/alliance/src/bdd/man3/garbagebddsystem.3 +@@ -5,7 +5,7 @@ + garbagebddsystem \- Forces a \fBbdd\fP garbage collection. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/getbddnodenum.3 b/alliance/src/bdd/man3/getbddnodenum.3 +index 40d1074..51a4187 100644 +--- a/alliance/src/bdd/man3/getbddnodenum.3 ++++ b/alliance/src/bdd/man3/getbddnodenum.3 +@@ -4,7 +4,7 @@ + .SH NAME + getbddnodenum \- gets the number of nodes in a \fBbdd\fP. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/getbddnodesize.3 b/alliance/src/bdd/man3/getbddnodesize.3 +index c7257e0..cd278d2 100644 +--- a/alliance/src/bdd/man3/getbddnodesize.3 ++++ b/alliance/src/bdd/man3/getbddnodesize.3 +@@ -4,7 +4,7 @@ + .SH NAME + getbddnodesize \- gets the number of nodes in a \fBbdd\fP. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/getbddnodesupport.3 b/alliance/src/bdd/man3/getbddnodesupport.3 +index 485fa26..209ec40 100644 +--- a/alliance/src/bdd/man3/getbddnodesupport.3 ++++ b/alliance/src/bdd/man3/getbddnodesupport.3 +@@ -4,7 +4,7 @@ + .SH NAME + getbddnodesupport \- gives the variable support of a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/getbddvarbyindex.3 b/alliance/src/bdd/man3/getbddvarbyindex.3 +index c3d813e..191db3f 100644 +--- a/alliance/src/bdd/man3/getbddvarbyindex.3 ++++ b/alliance/src/bdd/man3/getbddvarbyindex.3 +@@ -4,7 +4,7 @@ + .SH NAME + getbddvarbyindex \- converts \fBbdd\fP index to a variable number. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/getbddvarindex.3 b/alliance/src/bdd/man3/getbddvarindex.3 +index f04089a..6013746 100644 +--- a/alliance/src/bdd/man3/getbddvarindex.3 ++++ b/alliance/src/bdd/man3/getbddvarindex.3 +@@ -4,7 +4,7 @@ + .SH NAME + getbddvarindex \- converts a variable number in a \fBbdd\fP index. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/getbddvarnode.3 b/alliance/src/bdd/man3/getbddvarnode.3 +index ada3177..5736166 100644 +--- a/alliance/src/bdd/man3/getbddvarnode.3 ++++ b/alliance/src/bdd/man3/getbddvarnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + getbddvarnode \- gives the \fBbdd\fP node of a variable. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/getbddvarnodebyindex.3 b/alliance/src/bdd/man3/getbddvarnodebyindex.3 +index 1d5c941..9e74aac 100644 +--- a/alliance/src/bdd/man3/getbddvarnodebyindex.3 ++++ b/alliance/src/bdd/man3/getbddvarnodebyindex.3 +@@ -4,7 +4,7 @@ + .SH NAME + getbddvarnode \- gives the \fBbdd\fP node of a variable. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/implybddnode.3 b/alliance/src/bdd/man3/implybddnode.3 +index 1686cb1..a247d36 100644 +--- a/alliance/src/bdd/man3/implybddnode.3 ++++ b/alliance/src/bdd/man3/implybddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + implybddnode \- computes a \fBbdd\fP that implies a conjonction of two \fBbdd\fP nodes. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/incbddrefext.3 b/alliance/src/bdd/man3/incbddrefext.3 +index e70d22b..87f56cb 100644 +--- a/alliance/src/bdd/man3/incbddrefext.3 ++++ b/alliance/src/bdd/man3/incbddrefext.3 +@@ -4,7 +4,7 @@ + .SH NAME + incbddrefext \- increments the external reference of a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/incbddrefint.3 b/alliance/src/bdd/man3/incbddrefint.3 +index a9c596d..0078a42 100644 +--- a/alliance/src/bdd/man3/incbddrefint.3 ++++ b/alliance/src/bdd/man3/incbddrefint.3 +@@ -4,7 +4,7 @@ + .SH NAME + incbddrefint \- increments the internal reference of a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/intersectbddnode.3 b/alliance/src/bdd/man3/intersectbddnode.3 +index a637348..8578bfb 100644 +--- a/alliance/src/bdd/man3/intersectbddnode.3 ++++ b/alliance/src/bdd/man3/intersectbddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + intersectbddnode \- tests for an intersection between two \fBbdd\fP nodes. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/isbddvarinsupport.3 b/alliance/src/bdd/man3/isbddvarinsupport.3 +index f0aac9e..ef2c356 100644 +--- a/alliance/src/bdd/man3/isbddvarinsupport.3 ++++ b/alliance/src/bdd/man3/isbddvarinsupport.3 +@@ -4,7 +4,7 @@ + .SH NAME + isbddvarinsupport \- tests if a variable appears in a \fBbdd\fP. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/markbddnode.3 b/alliance/src/bdd/man3/markbddnode.3 +index babc469..ec1894b 100644 +--- a/alliance/src/bdd/man3/markbddnode.3 ++++ b/alliance/src/bdd/man3/markbddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + markbddnode \- marks \fBbdd\fP node with a specified mask. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -35,7 +35,7 @@ This function does a OR with the field MARK of the \fBbdd\fP node \fIBddNode\fP, + and the bit mask \fIMark\fP. + .br + .SH RETURN VALUE +-\fBmarkbddnode\fP returns the number of the differents marked nodes. ++\fBmarkbddnode\fP returns the number of the different marked nodes. + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n + .nf +diff --git a/alliance/src/bdd/man3/relprodbddnodeassoc.3 b/alliance/src/bdd/man3/relprodbddnodeassoc.3 +index c923c57..fecadc8 100644 +--- a/alliance/src/bdd/man3/relprodbddnodeassoc.3 ++++ b/alliance/src/bdd/man3/relprodbddnodeassoc.3 +@@ -4,7 +4,7 @@ + .SH NAME + relprodbddnodeassoc \- computes a relational product. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/reorderbddsystemdynamic.3 b/alliance/src/bdd/man3/reorderbddsystemdynamic.3 +index f2631ca..94ed2da 100644 +--- a/alliance/src/bdd/man3/reorderbddsystemdynamic.3 ++++ b/alliance/src/bdd/man3/reorderbddsystemdynamic.3 +@@ -4,7 +4,7 @@ + .SH NAME + reorderbddsystemdynamic \- specifies the dynamic \fBbdd\fP reorder parameters. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/reorderbddsystemsimple.3 b/alliance/src/bdd/man3/reorderbddsystemsimple.3 +index 8501e43..2098295 100644 +--- a/alliance/src/bdd/man3/reorderbddsystemsimple.3 ++++ b/alliance/src/bdd/man3/reorderbddsystemsimple.3 +@@ -4,7 +4,7 @@ + .SH NAME + reorderbddsystemsimple \- reorders the \fBbdd\fP nodes of a \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/reorderbddsystemtop.3 b/alliance/src/bdd/man3/reorderbddsystemtop.3 +index 389b1ee..2e4fcd6 100644 +--- a/alliance/src/bdd/man3/reorderbddsystemtop.3 ++++ b/alliance/src/bdd/man3/reorderbddsystemtop.3 +@@ -4,7 +4,7 @@ + .SH NAME + reorderbddsystemtop \- reorders the \fBbdd\fP nodes of a \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/reorderbddsystemwindow.3 b/alliance/src/bdd/man3/reorderbddsystemwindow.3 +index 0accbe8..da8ffd9 100644 +--- a/alliance/src/bdd/man3/reorderbddsystemwindow.3 ++++ b/alliance/src/bdd/man3/reorderbddsystemwindow.3 +@@ -4,7 +4,7 @@ + .SH NAME + reorderbddsystemwindow \- reorders the \fBbdd\fP nodes of a \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/resetbddcircuit.3 b/alliance/src/bdd/man3/resetbddcircuit.3 +index f7a2340..2b1fa32 100644 +--- a/alliance/src/bdd/man3/resetbddcircuit.3 ++++ b/alliance/src/bdd/man3/resetbddcircuit.3 +@@ -4,7 +4,7 @@ + .SH NAME + resetbddcircuit \- resets a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/resetbddsystem.3 b/alliance/src/bdd/man3/resetbddsystem.3 +index 9f0a1da..6248a25 100644 +--- a/alliance/src/bdd/man3/resetbddsystem.3 ++++ b/alliance/src/bdd/man3/resetbddsystem.3 +@@ -4,7 +4,7 @@ + .SH NAME + resetbddsystem \- resets a \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/restrictbddnode.3 b/alliance/src/bdd/man3/restrictbddnode.3 +index 77fc0ab..e37c940 100644 +--- a/alliance/src/bdd/man3/restrictbddnode.3 ++++ b/alliance/src/bdd/man3/restrictbddnode.3 +@@ -5,7 +5,7 @@ + restrictbddnode \- substitutes a variable by a zero or one, in a \fBbdd\fP. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/satisfybddnode.3 b/alliance/src/bdd/man3/satisfybddnode.3 +index 2c8e0aa..b1e0bf4 100644 +--- a/alliance/src/bdd/man3/satisfybddnode.3 ++++ b/alliance/src/bdd/man3/satisfybddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + satisfybddnode \- finds a satisfying path for a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/searchbddcircuitin.3 b/alliance/src/bdd/man3/searchbddcircuitin.3 +index 185350e..4b15292 100644 +--- a/alliance/src/bdd/man3/searchbddcircuitin.3 ++++ b/alliance/src/bdd/man3/searchbddcircuitin.3 +@@ -2,9 +2,9 @@ + .\" @(#)searchbddcircuitin.2 2.7 96/07/02 ; Labo masi cao-vlsi; Author : Jacomme Ludovic + .TH SEARCHBDDCIRCUITIN 3 "October 1, 1997" "ASIM/LIP6" "BDD FUNCTIONS" + .SH NAME +-searchbddcircuitin \- searchs an input in a \fBbdd\fP circuit. ++searchbddcircuitin \- searches an input in a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -24,7 +24,7 @@ The \fBbdd\fP circuit. + \fIInputName\fP + The name of the input to look for. + .SH DESCRIPTION +-\fBsearchbddcircuitin\fP searchs the input \fIInputName\fP in the \fBbdd\fP ++\fBsearchbddcircuitin\fP searches the input \fIInputName\fP in the \fBbdd\fP + circuit \fIBddCircuit\fP. + If a null pointer is given, the default \fBbdd\fP circuit is used. + .br +diff --git a/alliance/src/bdd/man3/searchbddcircuitout.3 b/alliance/src/bdd/man3/searchbddcircuitout.3 +index de4379f..b5fd040 100644 +--- a/alliance/src/bdd/man3/searchbddcircuitout.3 ++++ b/alliance/src/bdd/man3/searchbddcircuitout.3 +@@ -2,9 +2,9 @@ + .\" @(#)searchbddcircuitout.2 2.7 96/07/02 ; Labo masi cao-vlsi; Author : Jacomme Ludovic + .TH SEARCHBDDCIRCUITOUT 3 "October 1, 1997" "ASIM/LIP6" "BDD FUNCTIONS" + .SH NAME +-searchbddcircuitout \- searchs an output in a \fBbdd\fP circuit. ++searchbddcircuitout \- searches an output in a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -24,7 +24,7 @@ The \fBbdd\fP circuit. + \fIOutputName\fP + The name of the output to look for. + .SH DESCRIPTION +-\fBsearchbddcircuitout\fP searchs the output \fIOutputName\fP in the \fBbdd\fP ++\fBsearchbddcircuitout\fP searches the output \fIOutputName\fP in the \fBbdd\fP + circuit \fIBddCircuit\fP. + If a null pointer is given, the default \fBbdd\fP circuit is used. + .br +diff --git a/alliance/src/bdd/man3/setbddrefext.3 b/alliance/src/bdd/man3/setbddrefext.3 +index d264ea8..52823d2 100644 +--- a/alliance/src/bdd/man3/setbddrefext.3 ++++ b/alliance/src/bdd/man3/setbddrefext.3 +@@ -5,7 +5,7 @@ + setbddrefext \- increments the external reference, + and decrements the internal reference of a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -35,7 +35,7 @@ internal reference. + "negative reference, index xxx error !" + .ft R + .RS +-The \fIBddNode\fP must have a postive number of internal reference. ++The \fIBddNode\fP must have a positive number of internal reference. + .RE + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n +diff --git a/alliance/src/bdd/man3/simpbddnodedcoff.3 b/alliance/src/bdd/man3/simpbddnodedcoff.3 +index 9489c80..7f4a677 100644 +--- a/alliance/src/bdd/man3/simpbddnodedcoff.3 ++++ b/alliance/src/bdd/man3/simpbddnodedcoff.3 +@@ -5,7 +5,7 @@ + simpbddnodedcoff \- simplifies a \fBbdd\fP with don't cares on its off-set part. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/simpbddnodedcon.3 b/alliance/src/bdd/man3/simpbddnodedcon.3 +index a743f87..5c09ddb 100644 +--- a/alliance/src/bdd/man3/simpbddnodedcon.3 ++++ b/alliance/src/bdd/man3/simpbddnodedcon.3 +@@ -5,7 +5,7 @@ + simpbddnodedcon \- simplifies a \fBbdd\fP with don't cares on its on-set part. + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/substbddnodeassoc.3 b/alliance/src/bdd/man3/substbddnodeassoc.3 +index 788316b..bc38a60 100644 +--- a/alliance/src/bdd/man3/substbddnodeassoc.3 ++++ b/alliance/src/bdd/man3/substbddnodeassoc.3 +@@ -4,7 +4,7 @@ + .SH NAME + substbddnodeassoc \- substitutes a set of variables with a set of \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/swapbddvar.3 b/alliance/src/bdd/man3/swapbddvar.3 +index b50d1be..f052c5f 100644 +--- a/alliance/src/bdd/man3/swapbddvar.3 ++++ b/alliance/src/bdd/man3/swapbddvar.3 +@@ -4,7 +4,7 @@ + .SH NAME + swapbddvar \- swaps two contiguous variables. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -27,7 +27,7 @@ The variable to swap. + \fBswapbddvar\fP swaps the variable number \fIVariable\fP with + the variable number \fIVariable\fP + 1, in the \fBbdd\fP system \fIBddSystem\fP. + If a null pointer is given, the default \fBbdd\fP system is used. +-This function is usefull for the \fBbdd\fP nodes reordering. ++This function is useful for the \fBbdd\fP nodes reordering. + .br + .SH RETURN VALUE + \fBswapbddvar\fP returns nothing. +diff --git a/alliance/src/bdd/man3/testbddcircuit.3 b/alliance/src/bdd/man3/testbddcircuit.3 +index c845f2c..fac540a 100644 +--- a/alliance/src/bdd/man3/testbddcircuit.3 ++++ b/alliance/src/bdd/man3/testbddcircuit.3 +@@ -4,7 +4,7 @@ + .SH NAME + testbddcircuit \- debugs a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/unmarkbddnode.3 b/alliance/src/bdd/man3/unmarkbddnode.3 +index 5ae405e..ba3efb0 100644 +--- a/alliance/src/bdd/man3/unmarkbddnode.3 ++++ b/alliance/src/bdd/man3/unmarkbddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + unmarkbddnode \- unmarks \fBbdd\fP node with a specified mask. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -35,7 +35,7 @@ This function does a AND with the field MARK of the \fBbdd\fP node \fIBddNode\fP + and the complemented bit mask \fIMark\fP. + .br + .SH RETURN VALUE +-\fBunmarkbddnode\fP returns the number of the differents unmarked nodes. ++\fBunmarkbddnode\fP returns the number of the different unmarked nodes. + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n + .nf +diff --git a/alliance/src/bdd/man3/unsetbddrefext.3 b/alliance/src/bdd/man3/unsetbddrefext.3 +index ca45555..b4d65d2 100644 +--- a/alliance/src/bdd/man3/unsetbddrefext.3 ++++ b/alliance/src/bdd/man3/unsetbddrefext.3 +@@ -5,7 +5,7 @@ + unsetbddrefext \- increments the internal reference, + and decrements the external reference of a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -35,7 +35,7 @@ external reference. + "negative reference, index xxx error !" + .ft R + .RS +-The \fIBddNode\fP must have a postive number of external reference. ++The \fIBddNode\fP must have a positive number of external reference. + .RE + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n +diff --git a/alliance/src/bdd/man3/viewbddcircuit.3 b/alliance/src/bdd/man3/viewbddcircuit.3 +index 8d7d7d2..9278721 100644 +--- a/alliance/src/bdd/man3/viewbddcircuit.3 ++++ b/alliance/src/bdd/man3/viewbddcircuit.3 +@@ -4,7 +4,7 @@ + .SH NAME + viewbddcircuit \- displays a \fBbdd\fP circuit. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -22,7 +22,7 @@ void viewbddcircuit( BddCircuit, ViewIndex ) + The \fBbdd\fP circuit to display. + .TP + \fIViewName\fP +-Flag to display more informations. ++Flag to display more information. + .SH DESCRIPTION + \fBviewbddcircuit\fP displays the \fBbdd\fP circuit \fIBddCircuit\fP. + If \fIViewName\fP is true, \fBviewbddcircuit\fP displays also the field \fINAME_IN\fP. +diff --git a/alliance/src/bdd/man3/viewbddnode.3 b/alliance/src/bdd/man3/viewbddnode.3 +index fdb51bb..c61c070 100644 +--- a/alliance/src/bdd/man3/viewbddnode.3 ++++ b/alliance/src/bdd/man3/viewbddnode.3 +@@ -4,7 +4,7 @@ + .SH NAME + viewbddnode \- displays a \fBbdd\fP node. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/bdd/man3/viewbddsystem.3 b/alliance/src/bdd/man3/viewbddsystem.3 +index 71e4e1e..0136d5c 100644 +--- a/alliance/src/bdd/man3/viewbddsystem.3 ++++ b/alliance/src/bdd/man3/viewbddsystem.3 +@@ -4,7 +4,7 @@ + .SH NAME + viewbddsystem \- displays a \fBbdd\fP system. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -22,7 +22,7 @@ void viewbddsystem( BddSystem, ViewIndex ) + The \fBbdd\fP system to display. + .TP + \fIViewIndex\fP +-Flag to display more informations. ++Flag to display more information. + .SH DESCRIPTION + \fBviewbddsystem\fP displays the \fBbdd\fP system \fIBddSystem\fP. + If \fIViewIndex\fP is true, \fBviewbddsystem\fP displays also +diff --git a/alliance/src/bdd/man3/viewbddsysteminfo.3 b/alliance/src/bdd/man3/viewbddsysteminfo.3 +index 609f74d..fae3c3f 100644 +--- a/alliance/src/bdd/man3/viewbddsysteminfo.3 ++++ b/alliance/src/bdd/man3/viewbddsysteminfo.3 +@@ -2,9 +2,9 @@ + .\" @(#)viewbddsysteminfo.2 2.7 96/07/02 ; Labo masi cao-vlsi; Author : Jacomme Ludovic + .TH VIEWBDDSYSTEMINFO 3 "October 1, 1997" "ASIM/LIP6" "BDD FUNCTIONS" + .SH NAME +-viewbddsysteminfo \- displays statistical informations. ++viewbddsysteminfo \- displays statistical information. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -20,7 +20,7 @@ void viewbddsysteminfo( BddSystem ) + \fIBddSystem\fP + The \fBbdd\fP system to examines. + .SH DESCRIPTION +-\fBviewbddsysteminfo\fP provides statistical informations ++\fBviewbddsysteminfo\fP provides statistical information + on the \fBbdd\fP system \fIBddSystem\fP, for example the + perfomance of the different caches. + If a null pointer is given, the default \fBbdd\fP system is used. +diff --git a/alliance/src/beh/man3/beh.3 b/alliance/src/beh/man3/beh.3 +index 304ff07..b65e19a 100644 +--- a/alliance/src/beh/man3/beh.3 ++++ b/alliance/src/beh/man3/beh.3 +@@ -74,7 +74,7 @@ To enable work, a static version of each library is always present for the + user. Libraries and header files are suffixed by a number (the library's + version). The programmer can prefer to work with an earlier version of a + library rather than the most recent one. However, it is recommended to adapt +-softwares to libraries as soon as possible in order to spotlight potential ++software to libraries as soon as possible in order to spotlight potential + compatibility problems before old libraries are removed. + + .PP +@@ -85,12 +85,12 @@ It can't be achieved an other way, so do use \fImakefile\fP. + + .PP + For each behavioural description format a parser and a driver have been +-developed . These are organized in as many seperate libraries as description ++developed . These are organized in as many separate libraries as description + format. So if a parser or driver changes it is not needed to recompile + \fBBEH\fP. Only a relink of the application is needed. + + .PP +-In terms of software organization, \fBBEH\fP is splitted into two libraries ++In terms of software organization, \fBBEH\fP is split into two libraries + for the basic functions, a header file for structures and variable declarations, + and , up to now, one parser\-driver library for VHDL format. + +diff --git a/alliance/src/beh/man3/beh_debug.3 b/alliance/src/beh/man3/beh_debug.3 +index 0c6f80a..9ad5d1d 100644 +--- a/alliance/src/beh/man3/beh_debug.3 ++++ b/alliance/src/beh/man3/beh_debug.3 +@@ -7,7 +7,7 @@ + .PP + \fBbeh_debug\fP \- BEH structures displayer\-debugger + +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + void beh_debug (pnt, type) +diff --git a/alliance/src/beh/man3/beh_depend.3 b/alliance/src/beh/man3/beh_depend.3 +index ccd328e..532a2ba 100644 +--- a/alliance/src/beh/man3/beh_depend.3 ++++ b/alliance/src/beh/man3/beh_depend.3 +@@ -7,7 +7,7 @@ + .PP + \fBbeh_depend\fP \- compute forward dependencies in a description + +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + void beh_depend (fig_pnt) +diff --git a/alliance/src/beh/man3/beh_error.3 b/alliance/src/beh/man3/beh_error.3 +index d6dba94..07590f0 100644 +--- a/alliance/src/beh/man3/beh_error.3 ++++ b/alliance/src/beh/man3/beh_error.3 +@@ -7,7 +7,7 @@ + .PP + \fBbeh_error\fP + +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + int beh_error (code, str) +diff --git a/alliance/src/beh/man3/beh_makbdd.3 b/alliance/src/beh/man3/beh_makbdd.3 +index 623e4d4..c7e3012 100644 +--- a/alliance/src/beh/man3/beh_makbdd.3 ++++ b/alliance/src/beh/man3/beh_makbdd.3 +@@ -7,7 +7,7 @@ + .PP + \fBbeh_makbdd\fP \- create a BDD for each expression in a description + +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + void beh_makbdd (fig_pnt) +diff --git a/alliance/src/beh/man3/beh_makgex.3 b/alliance/src/beh/man3/beh_makgex.3 +index d44b99c..87dced5 100644 +--- a/alliance/src/beh/man3/beh_makgex.3 ++++ b/alliance/src/beh/man3/beh_makgex.3 +@@ -7,7 +7,7 @@ + .PP + \fBbeh_makgex\fP \- create a GEX for each expression in a description + +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + void beh_makgex (fig_pnt) +diff --git a/alliance/src/beh/man3/beh_message.3 b/alliance/src/beh/man3/beh_message.3 +index 8cc0307..7298dd9 100644 +--- a/alliance/src/beh/man3/beh_message.3 ++++ b/alliance/src/beh/man3/beh_message.3 +@@ -7,7 +7,7 @@ + .PP + \fBbeh_message\fP + +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + void beh_message (code, str) +diff --git a/alliance/src/bhl/src/beh_debug.c b/alliance/src/bhl/src/beh_debug.c +index ff21533..43d91ef 100644 +--- a/alliance/src/bhl/src/beh_debug.c ++++ b/alliance/src/bhl/src/beh_debug.c +@@ -637,7 +637,7 @@ char **str; /* recognized strings */ + /* function : splitline */ + /* description : read a line (the space must have been reserved by the */ + /* caller - *words) from the standard input and split it */ +-/* into seperate words. Return the number of words read. */ ++/* into separate words. Return the number of words read. */ + /* called func. : none */ + /* ###--------------------------------------------------------------### */ + +diff --git a/alliance/src/bhl/src/beh_depend.c b/alliance/src/bhl/src/beh_depend.c +index 9ead907..fd896e6 100644 +--- a/alliance/src/bhl/src/beh_depend.c ++++ b/alliance/src/bhl/src/beh_depend.c +@@ -208,7 +208,7 @@ struct befig *pt_fig; + } + + /* ###------------------------------------------------------### */ +- /* process simple ouputs */ ++ /* process simple outputs */ + /* check that the signal does not already belong to the */ + /* dependency list before adding it to the list */ + /* ###------------------------------------------------------### */ +@@ -231,7 +231,7 @@ struct befig *pt_fig; + } + + /* ###------------------------------------------------------### */ +- /* process bussed ouputs. */ ++ /* process bussed outputs. */ + /* check that the signal does not already belong to the */ + /* dependency list before adding it to the list */ + /* ###------------------------------------------------------### */ +diff --git a/alliance/src/bhl/src/beh_makquad.c b/alliance/src/bhl/src/beh_makquad.c +index 49a0249..7a84676 100644 +--- a/alliance/src/bhl/src/beh_makquad.c ++++ b/alliance/src/bhl/src/beh_makquad.c +@@ -64,7 +64,7 @@ void beh_makquad ( struct befig *pt_befig ) + } + + /* ###------------------------------------------------------### */ +- /* bussed ouput ports */ ++ /* bussed output ports */ + /* ###------------------------------------------------------### */ + + pt_bebus = pt_befig->BEBUS; +diff --git a/alliance/src/boog/doc/boog.1 b/alliance/src/boog/doc/boog.1 +index 052524c..c9dcb73 100644 +--- a/alliance/src/boog/doc/boog.1 ++++ b/alliance/src/boog/doc/boog.1 +@@ -115,7 +115,7 @@ Here is the default lax file (see the user's manual for further information abou + \f4 Mapping with a standard cell library\fP + .br + Every cell appearing in the directory defined by the environment variable MBK_TARGET_LIB may be used by \f4boog\fP since they are described as a '.vbe' file. There are some restrictions about the type of the cell used. Every cell has to have only one output. +-The cell must be characterized. The timing and area informations required by \f4boog\fP are specified in the "generic" clause of the ".vbe" file. ++The cell must be characterized. The timing and area information required by \f4boog\fP are specified in the "generic" clause of the ".vbe" file. + .br + + .SH OPTION +@@ -130,10 +130,10 @@ Optimization mode. Can be defined in lax file, it's only a shortcut to define it + Generate a '.xsc' file. It is a color map for each signals contained in \fIoutput_file\fP network. This file is used by \f4xsch\fP to view the netlist. By choosing level 0 or 1 for xsch_mode, you can color respectively the critical path or all signals with delay graduation. + .TP 10 + \f4\-o output_file\fP +-Just another way to show explicitely the \f4VST\fP output file name. ++Just another way to show explicitly the \f4VST\fP output file name. + .TP 10 + \f4\-l lax_file\fP +-Just another way to show explicitely the \f4LAX\fP parameter file name. ++Just another way to show explicitly the \f4LAX\fP parameter file name. + .TP 10 + \f4\-d debug_file\fP + Generates a \f4VBE\f debug file. It comes from internal result algorithm. Users aren't concerned. +diff --git a/alliance/src/boog/doc/lax.5 b/alliance/src/boog/doc/lax.5 +index 9e56d88..1aa7e51 100644 +--- a/alliance/src/boog/doc/lax.5 ++++ b/alliance/src/boog/doc/lax.5 +@@ -113,7 +113,7 @@ ep_3; + + ## Set the list of auxiliary (intermediate) signals to keep + ## This can be used to decrease the memory consuption +-## when trying to reorder Bdds. Those signals wont ++## when trying to reorder Bdds. Those signals won't + ## be reordered. + #S{ + cs_ea; +diff --git a/alliance/src/boog/src/bog_lib_complete.c b/alliance/src/boog/src/bog_lib_complete.c +index 044f434..eca10df 100644 +--- a/alliance/src/boog/src/bog_lib_complete.c ++++ b/alliance/src/boog/src/bog_lib_complete.c +@@ -437,7 +437,7 @@ extern void control_lib() + case ABL_XOR: case ABL_NXOR: xor=add_dual(xor,cell); break; + case ABL_NOT: not=cell; break; + default: +- fprintf(stderr,"control_lib: unknow oper %ld\n", ++ fprintf(stderr,"control_lib: unknown oper %ld\n", + ABL_OPER(cell->ABL)); + exit(1); + } +diff --git a/alliance/src/boog/src/bog_lib_format.c b/alliance/src/boog/src/bog_lib_format.c +index abae542..e4a9ce3 100644 +--- a/alliance/src/boog/src/bog_lib_format.c ++++ b/alliance/src/boog/src/bog_lib_format.c +@@ -225,7 +225,7 @@ extern int format_cell(befig_list* befig) + if (befig->BEREG) { + /*only one register*/ + if (befig->BEREG->NEXT || befig->BEBUS || befig->BEBUX) return 0; +- /*one ouput*/ ++ /*one output*/ + if (!befig->BEOUT || befig->BEOUT->NEXT) return 0; + /* forbid logic on output */ + if (!ABL_ATOM(befig->BEOUT->ABL)) { +@@ -246,14 +246,14 @@ extern int format_cell(befig_list* befig) + if (befig->BEBUS) { + /*only one bus*/ + if (befig->BEBUS->NEXT || befig->BEREG || befig->BEBUX) return 0; +- /*one ouput: bebus*/ ++ /*one output: bebus*/ + if (befig->BEOUT) return 0; + } + + if (befig->BEBUX) { + /*only one internal bus*/ + if (befig->BEBUX->NEXT || befig->BEREG || befig->BEBUS) return 0; +- /*one ouput: beout*/ ++ /*one output: beout*/ + if (!befig->BEOUT || befig->BEOUT->NEXT) return 0; + /* forbid logic on output */ + if (!ABL_ATOM(befig->BEOUT->ABL)) { +@@ -281,7 +281,7 @@ extern int format_cell(befig_list* befig) + } + + if (befig->BEOUT) { +- /*one ouput: beout*/ ++ /*one output: beout*/ + if (befig->BEOUT->NEXT || befig->BEBUS) return 0; + } + diff --git a/alliance/src/boog/src/bog_lib_reader.c b/alliance/src/boog/src/bog_lib_reader.c index fca9bd2..da3603b 100644 --- a/alliance/src/boog/src/bog_lib_reader.c @@ -68,10 +2698,54 @@ index fca9bd2..da3603b 100644 /*patterns are equal -->comparison*/ if (cell->AREANAME=befig->NAME; + cell->DELAY=0; +- cell->MODE='P'; /*cell won't be developped in lofig result*/ ++ cell->MODE='P'; /*cell won't be developed in lofig result*/ + cell->AREA=getgenericarea(befig); + cell->ABL=NULL; + cell->BIABL=NULL; +diff --git a/alliance/src/boog/src/bog_main.c b/alliance/src/boog/src/bog_main.c +index f1e0cd3..5352fef 100644 +--- a/alliance/src/boog/src/bog_main.c ++++ b/alliance/src/boog/src/bog_main.c +@@ -423,7 +423,7 @@ extern int main (int argc, char* argv[]) + freeptype(loins_num); + } + +- /*colors and weight informations for xsch alliance displayer*/ ++ /*colors and weight information for xsch alliance displayer*/ + if (xsch_file) { + FILE* xsch_stream; + +@@ -447,7 +447,7 @@ extern int main (int argc, char* argv[]) + + /*for debugging extract a resulting vbe file to compare with source*/ + if (debug_file) { +- fprintf(stdout,"Formating debug file '%s.vbe'...\n",debug_file); ++ fprintf(stdout,"Formatting debug file '%s.vbe'...\n",debug_file); + put_back_STABLE(befig); /*put in condition register STABLE*/ + normalize_nameindex(befig); /*for bits of vectors*/ + sort_vector(befig); /*needed to be recognized by parser/driver */ diff --git a/alliance/src/boog/src/bog_map_pattern.c b/alliance/src/boog/src/bog_map_pattern.c -index 9ffed7c..831b64b 100644 +index 9ffed7c..cc36918 100644 --- a/alliance/src/boog/src/bog_map_pattern.c +++ b/alliance/src/boog/src/bog_map_pattern.c +@@ -384,7 +384,7 @@ extern int eval_pattern(chain_list* expr, chain_list* pattern, int negativ) + + + /******************************************************************************/ +-/* return the cell wich matches expr */ ++/* return the cell which matches expr */ + /*fulfill the ORDER field of cell with leaves of pattern matching */ + /******************************************************************************/ + extern cell_list* cell_pattern(chain_list* expr) @@ -413,7 +413,9 @@ extern cell_list* cell_pattern(chain_list* expr) /*improve speed*/ @@ -83,6 +2757,151 @@ index 9ffed7c..831b64b 100644 /*improve speed*/ if (!ABL_ATOM(expr) && ABL_OPER(expr)!=ABL_NOT/*match all*/) { if (ABL_ARITY(cell->ABL)!=ABL_ARITY(expr)) continue; +@@ -547,7 +549,7 @@ extern cell_list* cell_pattern(chain_list* expr) + + + /******************************************************************************/ +-/* return the cell tristate wich matches biabl */ ++/* return the cell tristate which matches biabl */ + /*fulfill the ORDER field of cell with leaves of pattern matching */ + /******************************************************************************/ + extern cell_list* cell_pattern_bus(biabl_list* biabl) +diff --git a/alliance/src/boog/src/bog_map_pattern.h b/alliance/src/boog/src/bog_map_pattern.h +index b7be3b9..169fb70 100644 +--- a/alliance/src/boog/src/bog_map_pattern.h ++++ b/alliance/src/boog/src/bog_map_pattern.h +@@ -51,19 +51,19 @@ + extern int eval_pattern __P ((chain_list* expr, chain_list* pattern, int negativ)); + + /******************************************************************************/ +-/* return the cell wich matches expr */ ++/* return the cell which matches expr */ + /*fulfill the ORDER field of cell with leaves of pattern matching */ + /******************************************************************************/ + extern cell_list* cell_pattern __P ((chain_list* expr)); + + /******************************************************************************/ +-/* return the cell tristate wich matches biabl */ ++/* return the cell tristate which matches biabl */ + /*fulfill the ORDER field of cell with leaves of pattern matching */ + /******************************************************************************/ + extern cell_list* cell_pattern_bus __P ((biabl_list* biabl)); + + /******************************************************************************/ +-/* return the cell register wich matches biabl */ ++/* return the cell register which matches biabl */ + /*fulfill the ORDER field of cell with leaves of pattern matching */ + /******************************************************************************/ + extern cell_list* cell_pattern_reg __P ((biabl_list* biabl)); +diff --git a/alliance/src/boog/src/bog_normalize_DC.c b/alliance/src/boog/src/bog_normalize_DC.c +index a84f045..00dc6bb 100644 +--- a/alliance/src/boog/src/bog_normalize_DC.c ++++ b/alliance/src/boog/src/bog_normalize_DC.c +@@ -74,7 +74,7 @@ static void find_d_z_abl(chain_list* abl, long value) + + + /****************************************************************************/ +-/* change 'z' and 'd' occurence in '0' or '1' in all expressions of befig */ ++/* change 'z' and 'd' occurrence in '0' or '1' in all expressions of befig */ + /****************************************************************************/ + extern void remove_DC(befig_list* befig) + { +diff --git a/alliance/src/boog/src/bog_normalize_DC.h b/alliance/src/boog/src/bog_normalize_DC.h +index 9111594..d1163ef 100644 +--- a/alliance/src/boog/src/bog_normalize_DC.h ++++ b/alliance/src/boog/src/bog_normalize_DC.h +@@ -43,7 +43,7 @@ + + + /****************************************************************************/ +-/* change 'z' and 'd' occurence in '0' or '1' in all expressions of befig */ ++/* change 'z' and 'd' occurrence in '0' or '1' in all expressions of befig */ + /****************************************************************************/ + extern void remove_DC __P ((befig_list* befig)); + +diff --git a/alliance/src/boog/src/bog_signal_nameindex.c b/alliance/src/boog/src/bog_signal_nameindex.c +index d8346b0..7605026 100644 +--- a/alliance/src/boog/src/bog_signal_nameindex.c ++++ b/alliance/src/boog/src/bog_signal_nameindex.c +@@ -94,7 +94,7 @@ extern int forbid_radical(char* name) + + + /***************************************************************************/ +-/* return name concatenated with an index and seperated by '_' */ ++/* return name concatenated with an index and separated by '_' */ + /* this index is : how many times I have sent this name to getnameindex() */ + /* unicity is guaranteed until you run Put_index_to_zero() below */ + /***************************************************************************/ +@@ -117,7 +117,7 @@ extern char* getnameindex(char* name) + return name; /*unchanged*/ + } + else { +- /*add an occurence*/ ++ /*add an occurrence*/ + elem->VALUE++; + memo_char=SEPAR; /*external value from MBK environment*/ + SEPAR='_'; +diff --git a/alliance/src/boog/src/bog_signal_nameindex.h b/alliance/src/boog/src/bog_signal_nameindex.h +index 2989da6..c86d2b1 100644 +--- a/alliance/src/boog/src/bog_signal_nameindex.h ++++ b/alliance/src/boog/src/bog_signal_nameindex.h +@@ -53,7 +53,7 @@ extern void free_nameindex __P (()); + extern int forbid_radical __P ((char* name)); + + /***************************************************************************/ +-/* return name concatenated with an index and seperated by '_' */ ++/* return name concatenated with an index and separated by '_' */ + /* this index is : how many times I have sent this name to getnameindex() */ + /* unicity is guaranteed until you run free_nameindex() below */ + /***************************************************************************/ +diff --git a/alliance/src/boom/man1/boom.1 b/alliance/src/boom/man1/boom.1 +index 87e2963..5f11192 100644 +--- a/alliance/src/boom/man1/boom.1 ++++ b/alliance/src/boom/man1/boom.1 +@@ -36,7 +36,7 @@ Each step of the optimization is displayed on the standard output. + .TP 10 + \f4\-T\fP + Trace mode on. +-Some debug informations are displayed on the standard output. ++Some debug information are displayed on the standard output. + .TP 10 + \f4\-O\fP + Reverses initial Bdd variables order. +@@ -88,7 +88,7 @@ Specifies the delay optimization percent + (default is 0% delay, 100% surface). + .TP 10 + \f4\-i num\fP +-Specifies the number of iterations for the choosen optimization algorithm ++Specifies the number of iterations for the chosen optimization algorithm + (for experts only). + .TP 10 + \f4\-a num\fP +diff --git a/alliance/src/boom/src/boom_aux.c b/alliance/src/boom/src/boom_aux.c +index d34d7bf..587bfcd 100644 +--- a/alliance/src/boom/src/boom_aux.c ++++ b/alliance/src/boom/src/boom_aux.c +@@ -465,7 +465,7 @@ void BoomBehDeleteUselessAux( BehFigure, InitialAux, RemoveBerin ) + + if ( IsBoomDebugLevel1() ) + { +- BoomPrintf( stdout, "Count Occurences\n" ); ++ BoomPrintf( stdout, "Count Occurrences\n" ); + } + + BoomBehScanAbl( BehFigure, BoomCountAuxOccurAbl, 0 ); +diff --git a/alliance/src/bvl/src/bvl_drive.c b/alliance/src/bvl/src/bvl_drive.c +index b94add8..3010093 100644 +--- a/alliance/src/bvl/src/bvl_drive.c ++++ b/alliance/src/bvl/src/bvl_drive.c +@@ -564,7 +564,7 @@ long trace_mode; + } + + /* ###------------------------------------------------------### */ +- /* print a concurrent signal assignment for each ouput port */ ++ /* print a concurrent signal assignment for each output port */ + /* ###------------------------------------------------------### */ + + pt_out = pt_fig->BEOUT; diff --git a/alliance/src/cells/src/Makefile.am b/alliance/src/cells/src/Makefile.am index 64e6972..b4c0f2a 100644 --- a/alliance/src/cells/src/Makefile.am @@ -29718,6 +32537,3567 @@ index 0000000..569407c + REPORT "power supply is missing on pvssick_sp" + SEVERITY WARNING; +END; +diff --git a/alliance/src/config.guess b/alliance/src/config.guess +index dd8fc2d..b79252d 100755 +--- a/alliance/src/config.guess ++++ b/alliance/src/config.guess +@@ -1,13 +1,12 @@ + #! /bin/sh + # Attempt to guess a canonical system name. +-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++# Copyright 1992-2013 Free Software Foundation, Inc. + +-timestamp='2003-06-17' ++timestamp='2013-06-10' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but +@@ -16,24 +15,22 @@ timestamp='2003-06-17' + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++# along with this program; if not, see . + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. +- +-# Originally written by Per Bothner . +-# Please send patches to . Submit a context +-# diff and a properly formatted ChangeLog entry. ++# the same distribution terms that you use for the rest of that ++# program. This Exception is an additional permission under section 7 ++# of the GNU General Public License, version 3 ("GPLv3"). ++# ++# Originally written by Per Bothner. + # +-# This script attempts to guess a canonical system name similar to +-# config.sub. If it succeeds, it prints the system name on stdout, and +-# exits with 0. Otherwise, it exits with 1. ++# You can get the latest version of this script from: ++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + # +-# The plan is that this can be called by configure scripts if you +-# don't specify an explicit build system type. ++# Please send patches with a ChangeLog entry to config-patches@gnu.org. ++ + + me=`echo "$0" | sed -e 's,.*/,,'` + +@@ -53,8 +50,7 @@ version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +-Free Software Foundation, Inc. ++Copyright 1992-2013 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." +@@ -66,11 +62,11 @@ Try \`$me --help' for more information." + while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) +- echo "$timestamp" ; exit 0 ;; ++ echo "$timestamp" ; exit ;; + --version | -v ) +- echo "$version" ; exit 0 ;; ++ echo "$version" ; exit ;; + --help | --h* | -h ) +- echo "$usage"; exit 0 ;; ++ echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. +@@ -104,7 +100,7 @@ set_cc_for_build=' + trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; + trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; + : ${TMPDIR=/tmp} ; +- { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || ++ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +@@ -123,7 +119,7 @@ case $CC_FOR_BUILD,$HOST_CC,$CC in + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +-esac ;' ++esac ; set_cc_for_build= ;' + + # This is needed to find uname on a Pyramid OSx when run in the BSD universe. + # (ghazi@noc.rutgers.edu 1994-08-24) +@@ -136,19 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown + UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown + UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +-## for Red Hat Linux +-if test -f /etc/redhat-release ; then +- VENDOR=redhat ; +-else +- VENDOR= ; +-fi ++case "${UNAME_SYSTEM}" in ++Linux|GNU|GNU/*) ++ # If the system lacks a compiler, then just pick glibc. ++ # We could probably try harder. ++ LIBC=gnu ++ ++ eval $set_cc_for_build ++ cat <<-EOF > $dummy.c ++ #include ++ #if defined(__UCLIBC__) ++ LIBC=uclibc ++ #elif defined(__dietlibc__) ++ LIBC=dietlibc ++ #else ++ LIBC=gnu ++ #endif ++ EOF ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ++ ;; ++esac + + # Note: order is significant - the case branches are not exclusive. + + case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or +- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, ++ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward +@@ -165,6 +175,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; ++ sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched +@@ -173,7 +184,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ +- | grep __ELF__ >/dev/null ++ | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? +@@ -183,7 +194,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + fi + ;; + *) +- os=netbsd ++ os=netbsd + ;; + esac + # The OS release +@@ -203,50 +214,36 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" +- exit 0 ;; +- amiga:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- arc:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- hp300:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mac68k:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- macppc:OpenBSD:*:*) +- echo powerpc-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mvme68k:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mvme88k:OpenBSD:*:*) +- echo m88k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- mvmeppc:OpenBSD:*:*) +- echo powerpc-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- pmax:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- sgi:OpenBSD:*:*) +- echo mipseb-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- sun3:OpenBSD:*:*) +- echo m68k-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; +- wgrisc:OpenBSD:*:*) +- echo mipsel-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; ++ *:Bitrig:*:*) ++ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` ++ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} ++ exit ;; + *:OpenBSD:*:*) +- echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} +- exit 0 ;; ++ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` ++ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} ++ exit ;; ++ *:ekkoBSD:*:*) ++ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} ++ exit ;; ++ *:SolidBSD:*:*) ++ echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} ++ exit ;; ++ macppc:MirBSD:*:*) ++ echo powerpc-unknown-mirbsd${UNAME_RELEASE} ++ exit ;; ++ *:MirBSD:*:*) ++ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} ++ exit ;; + alpha:OSF1:*:*) +- if test $UNAME_RELEASE = "V4.0"; then ++ case $UNAME_RELEASE in ++ *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` +- fi ++ ;; ++ *5.*) ++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ++ ;; ++ esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU +@@ -284,42 +281,52 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac ++ # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. +- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` +- exit 0 ;; +- Alpha*:OpenVMS:*:*) +- echo alpha-hp-vms +- exit 0 ;; ++ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` ++ # Reset EXIT trap before exiting to avoid spurious non-zero exit code. ++ exitcode=$? ++ trap '' 0 ++ exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix +- exit 0 ;; ++ exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 +- exit 0 ;; ++ exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 +- exit 0;; ++ exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos +- exit 0 ;; ++ exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos +- exit 0 ;; ++ exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition +- exit 0 ;; ++ exit ;; ++ *:z/VM:*:*) ++ echo s390-ibm-zvmoe ++ exit ;; ++ *:OS400:*:*) ++ echo powerpc-ibm-os400 ++ exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} +- exit 0;; ++ exit ;; ++ arm*:riscos:*:*|arm*:RISCOS:*:*) ++ echo arm-unknown-riscos ++ exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp +- exit 0;; ++ exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then +@@ -327,32 +334,51 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + else + echo pyramid-pyramid-bsd + fi +- exit 0 ;; ++ exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 +- exit 0 ;; ++ exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 +- exit 0 ;; +- DRS?6000:UNIX_SV:4.2*:7*) ++ exit ;; ++ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in +- sparc) echo sparc-icl-nx7 && exit 0 ;; ++ sparc) echo sparc-icl-nx7; exit ;; + esac ;; ++ s390x:SunOS:*:*) ++ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; ++ exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; +- i86pc:SunOS:5.*:*) +- echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; ++ exit ;; ++ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) ++ echo i386-pc-auroraux${UNAME_RELEASE} ++ exit ;; ++ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) ++ eval $set_cc_for_build ++ SUN_ARCH="i386" ++ # If there is a compiler, see if it is configured for 64-bit objects. ++ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. ++ # This test works for both compilers. ++ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then ++ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ ++ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_64BIT_ARCH >/dev/null ++ then ++ SUN_ARCH="x86_64" ++ fi ++ fi ++ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; ++ exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) +@@ -361,10 +387,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` +- exit 0 ;; ++ exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 +@@ -376,10 +402,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac +- exit 0 ;; ++ exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor +@@ -389,38 +415,41 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} +- exit 0 ;; ++ echo m68k-atari-mint${UNAME_RELEASE} ++ exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} +- exit 0 ;; ++ echo m68k-atari-mint${UNAME_RELEASE} ++ exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) +- echo m68k-milan-mint${UNAME_RELEASE} +- exit 0 ;; ++ echo m68k-milan-mint${UNAME_RELEASE} ++ exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) +- echo m68k-hades-mint${UNAME_RELEASE} +- exit 0 ;; ++ echo m68k-hades-mint${UNAME_RELEASE} ++ exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) +- echo m68k-unknown-mint${UNAME_RELEASE} +- exit 0 ;; ++ echo m68k-unknown-mint${UNAME_RELEASE} ++ exit ;; ++ m68k:machten:*:*) ++ echo m68k-apple-machten${UNAME_RELEASE} ++ exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 +- exit 0 ;; ++ exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +@@ -444,35 +473,36 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + exit (-1); + } + EOF +- $CC_FOR_BUILD -o $dummy $dummy.c \ +- && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ +- && exit 0 ++ $CC_FOR_BUILD -o $dummy $dummy.c && ++ dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && ++ SYSTEM_NAME=`$dummy $dummyarg` && ++ { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax +- exit 0 ;; ++ exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax +- exit 0 ;; ++ exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax +- exit 0 ;; ++ exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix +- exit 0 ;; ++ exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 +- exit 0 ;; ++ exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 +- exit 0 ;; ++ exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 +- exit 0 ;; ++ exit ;; + AViiON:dgux:*:*) +- # DG/UX returns AViiON for all architectures +- UNAME_PROCESSOR=`/usr/bin/uname -p` ++ # DG/UX returns AViiON for all architectures ++ UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ +@@ -485,29 +515,29 @@ EOF + else + echo i586-dg-dgux${UNAME_RELEASE} + fi +- exit 0 ;; ++ exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 +- exit 0 ;; ++ exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 +- exit 0 ;; ++ exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 +- exit 0 ;; ++ exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd +- exit 0 ;; ++ exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` +- exit 0 ;; ++ exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. +- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id +- exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' ++ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id ++ exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix +- exit 0 ;; ++ exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` +@@ -515,7 +545,7 @@ EOF + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} +- exit 0 ;; ++ exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build +@@ -530,15 +560,19 @@ EOF + exit(0); + } + EOF +- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 +- echo rs6000-ibm-aix3.2.5 ++ if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` ++ then ++ echo "$SYSTEM_NAME" ++ else ++ echo rs6000-ibm-aix3.2.5 ++ fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi +- exit 0 ;; +- *:AIX:*:[45]) ++ exit ;; ++ *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 +@@ -551,28 +585,28 @@ EOF + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} +- exit 0 ;; ++ exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix +- exit 0 ;; ++ exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 +- exit 0 ;; ++ exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to +- exit 0 ;; # report: romp-ibm BSD 4.3 ++ exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx +- exit 0 ;; ++ exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 +- exit 0 ;; ++ exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd +- exit 0 ;; ++ exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 +- exit 0 ;; ++ exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in +@@ -581,52 +615,52 @@ EOF + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` +- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` +- case "${sc_cpu_version}" in +- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 +- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 +- 532) # CPU_PA_RISC2_0 +- case "${sc_kernel_bits}" in +- 32) HP_ARCH="hppa2.0n" ;; +- 64) HP_ARCH="hppa2.0w" ;; ++ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` ++ case "${sc_cpu_version}" in ++ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 ++ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 ++ 532) # CPU_PA_RISC2_0 ++ case "${sc_kernel_bits}" in ++ 32) HP_ARCH="hppa2.0n" ;; ++ 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 +- esac ;; +- esac ++ esac ;; ++ esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ sed 's/^ //' << EOF >$dummy.c + +- #define _HPUX_SOURCE +- #include +- #include ++ #define _HPUX_SOURCE ++ #include ++ #include + +- int main () +- { +- #if defined(_SC_KERNEL_BITS) +- long bits = sysconf(_SC_KERNEL_BITS); +- #endif +- long cpu = sysconf (_SC_CPU_VERSION); ++ int main () ++ { ++ #if defined(_SC_KERNEL_BITS) ++ long bits = sysconf(_SC_KERNEL_BITS); ++ #endif ++ long cpu = sysconf (_SC_CPU_VERSION); + +- switch (cpu) +- { +- case CPU_PA_RISC1_0: puts ("hppa1.0"); break; +- case CPU_PA_RISC1_1: puts ("hppa1.1"); break; +- case CPU_PA_RISC2_0: +- #if defined(_SC_KERNEL_BITS) +- switch (bits) +- { +- case 64: puts ("hppa2.0w"); break; +- case 32: puts ("hppa2.0n"); break; +- default: puts ("hppa2.0"); break; +- } break; +- #else /* !defined(_SC_KERNEL_BITS) */ +- puts ("hppa2.0"); break; +- #endif +- default: puts ("hppa1.0"); break; +- } +- exit (0); +- } ++ switch (cpu) ++ { ++ case CPU_PA_RISC1_0: puts ("hppa1.0"); break; ++ case CPU_PA_RISC1_1: puts ("hppa1.1"); break; ++ case CPU_PA_RISC2_0: ++ #if defined(_SC_KERNEL_BITS) ++ switch (bits) ++ { ++ case 64: puts ("hppa2.0w"); break; ++ case 32: puts ("hppa2.0n"); break; ++ default: puts ("hppa2.0"); break; ++ } break; ++ #else /* !defined(_SC_KERNEL_BITS) */ ++ puts ("hppa2.0"); break; ++ #endif ++ default: puts ("hppa1.0"); break; ++ } ++ exit (0); ++ } + EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa +@@ -634,9 +668,19 @@ EOF + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then +- # avoid double evaluation of $set_cc_for_build +- test -n "$CC_FOR_BUILD" || eval $set_cc_for_build +- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null ++ eval $set_cc_for_build ++ ++ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating ++ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler ++ # generating 64-bit code. GNU and HP use different nomenclature: ++ # ++ # $ CC_FOR_BUILD=cc ./config.guess ++ # => hppa2.0w-hp-hpux11.23 ++ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess ++ # => hppa64-hp-hpux11.23 ++ ++ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | ++ grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else +@@ -644,11 +688,11 @@ EOF + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} +- exit 0 ;; ++ exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} +- exit 0 ;; ++ exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +@@ -676,318 +720,345 @@ EOF + exit (0); + } + EOF +- $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 ++ $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && ++ { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 +- exit 0 ;; ++ exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd +- exit 0 ;; ++ exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd +- exit 0 ;; ++ exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix +- exit 0 ;; ++ exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf +- exit 0 ;; ++ exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf +- exit 0 ;; ++ exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi +- exit 0 ;; ++ exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites +- exit 0 ;; ++ exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd +- exit 0 ;; ++ exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi +- exit 0 ;; ++ exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd +- exit 0 ;; ++ exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd +- exit 0 ;; ++ exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd +- exit 0 ;; ++ exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ exit ;; + *:UNICOS/mp:*:*) +- echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' +- exit 0 ;; ++ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` +- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` +- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +- exit 0 ;; ++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` ++ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" ++ exit ;; ++ 5000:UNIX_System_V:4.*:*) ++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` ++ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" ++ exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} +- exit 0 ;; +- *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) +- # Determine whether the default compiler uses glibc. +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c +- #include +- #if __GLIBC__ >= 2 +- LIBC=gnu +- #else +- LIBC= +- #endif +-EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` +- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} +- exit 0 ;; ++ exit ;; ++ *:FreeBSD:*:*) ++ UNAME_PROCESSOR=`/usr/bin/uname -p` ++ case ${UNAME_PROCESSOR} in ++ amd64) ++ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ *) ++ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ esac ++ exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin +- exit 0 ;; +- i*:MINGW*:*) ++ exit ;; ++ *:MINGW64*:*) ++ echo ${UNAME_MACHINE}-pc-mingw64 ++ exit ;; ++ *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 +- exit 0 ;; ++ exit ;; ++ i*:MSYS*:*) ++ echo ${UNAME_MACHINE}-pc-msys ++ exit ;; ++ i*:windows32*:*) ++ # uname -m includes "-pc" on this system. ++ echo ${UNAME_MACHINE}-mingw32 ++ exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 +- exit 0 ;; +- x86:Interix*:[34]*) +- echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' +- exit 0 ;; ++ exit ;; ++ *:Interix*:*) ++ case ${UNAME_MACHINE} in ++ x86) ++ echo i586-pc-interix${UNAME_RELEASE} ++ exit ;; ++ authenticamd | genuineintel | EM64T) ++ echo x86_64-unknown-interix${UNAME_RELEASE} ++ exit ;; ++ IA64) ++ echo ia64-unknown-interix${UNAME_RELEASE} ++ exit ;; ++ esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks +- exit 0 ;; ++ exit ;; ++ 8664:Windows_NT:*) ++ echo x86_64-pc-mks ++ exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix +- exit 0 ;; ++ exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin +- exit 0 ;; ++ exit ;; ++ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) ++ echo x86_64-unknown-cygwin ++ exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin +- exit 0 ;; ++ exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` +- exit 0 ;; ++ exit ;; + *:GNU:*:*) +- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` +- exit 0 ;; ++ # the GNU system ++ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` ++ exit ;; ++ *:GNU/*:*:*) ++ # other systems with GNU libc and userland ++ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} ++ exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix +- exit 0 ;; ++ exit ;; ++ aarch64:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ aarch64_be:Linux:*:*) ++ UNAME_MACHINE=aarch64_be ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ alpha:Linux:*:*) ++ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in ++ EV5) UNAME_MACHINE=alphaev5 ;; ++ EV56) UNAME_MACHINE=alphaev56 ;; ++ PCA56) UNAME_MACHINE=alphapca56 ;; ++ PCA57) UNAME_MACHINE=alphapca56 ;; ++ EV6) UNAME_MACHINE=alphaev6 ;; ++ EV67) UNAME_MACHINE=alphaev67 ;; ++ EV68*) UNAME_MACHINE=alphaev68 ;; ++ esac ++ objdump --private-headers /bin/sh | grep -q ld.so.1 ++ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ arc:Linux:*:* | arceb:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; + arm*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ eval $set_cc_for_build ++ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ ++ | grep -q __ARM_EABI__ ++ then ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ else ++ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ ++ | grep -q __ARM_PCS_VFP ++ then ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi ++ else ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf ++ fi ++ fi ++ exit ;; ++ avr32*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; + cris:Linux:*:*) +- echo cris-axis-linux-gnu +- exit 0 ;; ++ echo ${UNAME_MACHINE}-axis-linux-${LIBC} ++ exit ;; ++ crisv32:Linux:*:*) ++ echo ${UNAME_MACHINE}-axis-linux-${LIBC} ++ exit ;; ++ frv:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ hexagon:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ i*86:Linux:*:*) ++ echo ${UNAME_MACHINE}-pc-linux-${LIBC} ++ exit ;; + ia64:Linux:*:*) +- echo ${UNAME_MACHINE}-${VENDOR:-unknown}-linux-gnu +- exit 0 ;; ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ m32r*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; + m68*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; +- mips:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU +- #undef mips +- #undef mipsel ++ #undef ${UNAME_MACHINE} ++ #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) +- CPU=mipsel ++ CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) +- CPU=mips ++ CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif + EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` +- test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` ++ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; +- mips64:Linux:*:*) +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c +- #undef CPU +- #undef mips64 +- #undef mips64el +- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) +- CPU=mips64el +- #else +- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) +- CPU=mips64 +- #else +- CPU= +- #endif +- #endif +-EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` +- test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 +- ;; +- ppc:Linux:*:*) +- echo powerpc-${VENDOR:-unknown}-linux-gnu +- exit 0 ;; +- ppc64:Linux:*:*) +- echo powerpc64-${VENDOR:-unknown}-linux-gnu +- exit 0 ;; +- alpha:Linux:*:*) +- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in +- EV5) UNAME_MACHINE=alphaev5 ;; +- EV56) UNAME_MACHINE=alphaev56 ;; +- PCA56) UNAME_MACHINE=alphapca56 ;; +- PCA57) UNAME_MACHINE=alphapca56 ;; +- EV6) UNAME_MACHINE=alphaev6 ;; +- EV67) UNAME_MACHINE=alphaev67 ;; +- EV68*) UNAME_MACHINE=alphaev68 ;; +- esac +- objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null +- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi +- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} +- exit 0 ;; ++ or1k:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ or32:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ padre:Linux:*:*) ++ echo sparc-unknown-linux-${LIBC} ++ exit ;; ++ parisc64:Linux:*:* | hppa64:Linux:*:*) ++ echo hppa64-unknown-linux-${LIBC} ++ exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in +- PA7*) echo hppa1.1-unknown-linux-gnu ;; +- PA8*) echo hppa2.0-unknown-linux-gnu ;; +- *) echo hppa-unknown-linux-gnu ;; ++ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; ++ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; ++ *) echo hppa-unknown-linux-${LIBC} ;; + esac +- exit 0 ;; +- parisc64:Linux:*:* | hppa64:Linux:*:*) +- echo hppa64-unknown-linux-gnu +- exit 0 ;; ++ exit ;; ++ ppc64:Linux:*:*) ++ echo powerpc64-unknown-linux-${LIBC} ++ exit ;; ++ ppc:Linux:*:*) ++ echo powerpc-unknown-linux-${LIBC} ++ exit ;; ++ ppc64le:Linux:*:*) ++ echo powerpc64le-unknown-linux-${LIBC} ++ exit ;; ++ ppcle:Linux:*:*) ++ echo powerpcle-unknown-linux-${LIBC} ++ exit ;; + s390:Linux:*:* | s390x:Linux:*:*) +- echo ${UNAME_MACHINE}-${VENDOR:-ibm}-linux-gnu +- exit 0 ;; ++ echo ${UNAME_MACHINE}-ibm-linux-${LIBC} ++ exit ;; + sh64*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; + sh*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu +- exit 0 ;; ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ tile*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ vax:Linux:*:*) ++ echo ${UNAME_MACHINE}-dec-linux-${LIBC} ++ exit ;; + x86_64:Linux:*:*) +- echo x86_64-${VENDOR:-unknown}-linux-gnu +- exit 0 ;; +- i*86:Linux:*:*) +- # The BFD linker knows what the default object file format is, so +- # first see if it will tell us. cd to the root directory to prevent +- # problems with other programs or directories called `ld' in the path. +- # Set LC_ALL=C to ensure ld outputs messages in English. +- ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ +- | sed -ne '/supported targets:/!d +- s/[ ][ ]*/ /g +- s/.*supported targets: *// +- s/ .*// +- p'` +- case "$ld_supported_targets" in +- elf32-i386) +- TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" +- ;; +- a.out-i386-linux) +- echo "${UNAME_MACHINE}-pc-linux-gnuaout" +- exit 0 ;; +- coff-i386) +- echo "${UNAME_MACHINE}-pc-linux-gnucoff" +- exit 0 ;; +- "") +- # Either a pre-BFD a.out linker (linux-gnuoldld) or +- # one that does not give us useful --help. +- echo "${UNAME_MACHINE}-pc-linux-gnuoldld" +- exit 0 ;; +- esac +- # Determine whether the default compiler is a.out or elf +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c +- #include +- #ifdef __ELF__ +- # ifdef __GLIBC__ +- # if __GLIBC__ >= 2 +- LIBC=gnu +- # else +- LIBC=gnulibc1 +- # endif +- # else +- LIBC=gnulibc1 +- # endif +- #else +- #ifdef __INTEL_COMPILER +- LIBC=gnu +- #else +- LIBC=gnuaout +- #endif +- #endif +-EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` +- test x"${LIBC}" != x && echo "${UNAME_MACHINE}-${VENDOR:-pc}-linux-${LIBC}" && exit 0 +- test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 +- ;; ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ xtensa*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 +- exit 0 ;; ++ exit ;; + i*86:UNIX_SV:4.2MP:2.*) +- # Unixware is an offshoot of SVR4, but it has its own version +- # number series starting with 2... +- # I am not positive that other SVR4 systems won't match this, ++ # Unixware is an offshoot of SVR4, but it has its own version ++ # number series starting with 2... ++ # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. +- # Use sysv4.2uw... so that sysv4* matches it. ++ # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} +- exit 0 ;; ++ exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx +- exit 0 ;; ++ exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop +- exit 0 ;; ++ exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos +- exit 0 ;; +- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) ++ exit ;; ++ i*86:syllable:*:*) ++ echo ${UNAME_MACHINE}-pc-syllable ++ exit ;; ++ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp +- exit 0 ;; ++ exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then +@@ -995,15 +1066,16 @@ EOF + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi +- exit 0 ;; +- i*86:*:5:[78]*) ++ exit ;; ++ i*86:*:5:[678]*) ++ # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} +- exit 0 ;; ++ exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi +- exit 0 ;; ++ exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv +- exit 0 ;; ++ exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv +- exit 0 ;; ++ exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix +- exit 0 ;; +- M68*:*:R3V[567]*:*) +- test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; +- 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) ++ exit ;; ++ M68*:*:R3V[5678]*:*) ++ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; ++ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +- && echo i486-ncr-sysv4.3${OS_REL} && exit 0 ++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ +- && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; ++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) +- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +- && echo i486-ncr-sysv4 && exit 0 ;; ++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ ++ && { echo i486-ncr-sysv4; exit; } ;; ++ NCR*:*:4.2:* | MPRAS*:*:4.2:*) ++ OS_REL='.3' ++ test -r /etc/.relid \ ++ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` ++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ ++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } ++ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ ++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ++ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ ++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 +- exit 0 ;; ++ exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; +- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) ++ exit ;; ++ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 +- exit 0 ;; ++ exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 +- exit 0 ;; ++ exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` +@@ -1095,68 +1180,99 @@ EOF + else + echo ns32k-sni-sysv + fi +- exit 0 ;; +- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort +- # says +- echo i586-unisys-sysv4 +- exit 0 ;; ++ exit ;; ++ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort ++ # says ++ echo i586-unisys-sysv4 ++ exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 +- exit 0 ;; ++ exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 +- exit 0 ;; ++ exit ;; ++ i*86:VOS:*:*) ++ # From Paul.Green@stratus.com. ++ echo ${UNAME_MACHINE}-stratus-vos ++ exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos +- exit 0 ;; ++ exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 +- exit 0 ;; ++ exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then +- echo mips-nec-sysv${UNAME_RELEASE} ++ echo mips-nec-sysv${UNAME_RELEASE} + else +- echo mips-unknown-sysv${UNAME_RELEASE} ++ echo mips-unknown-sysv${UNAME_RELEASE} + fi +- exit 0 ;; ++ exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos +- exit 0 ;; ++ exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos +- exit 0 ;; ++ exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos +- exit 0 ;; ++ exit ;; ++ BePC:Haiku:*:*) # Haiku running on Intel PC compatible. ++ echo i586-pc-haiku ++ exit ;; ++ x86_64:Haiku:*:*) ++ echo x86_64-unknown-haiku ++ exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; ++ SX-7:SUPER-UX:*:*) ++ echo sx7-nec-superux${UNAME_RELEASE} ++ exit ;; ++ SX-8:SUPER-UX:*:*) ++ echo sx8-nec-superux${UNAME_RELEASE} ++ exit ;; ++ SX-8R:SUPER-UX:*:*) ++ echo sx8r-nec-superux${UNAME_RELEASE} ++ exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:Darwin:*:*) +- case `uname -p` in +- *86) UNAME_PROCESSOR=i686 ;; +- powerpc) UNAME_PROCESSOR=powerpc ;; +- esac ++ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown ++ eval $set_cc_for_build ++ if test "$UNAME_PROCESSOR" = unknown ; then ++ UNAME_PROCESSOR=powerpc ++ fi ++ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then ++ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ ++ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_64BIT_ARCH >/dev/null ++ then ++ case $UNAME_PROCESSOR in ++ i386) UNAME_PROCESSOR=x86_64 ;; ++ powerpc) UNAME_PROCESSOR=powerpc64 ;; ++ esac ++ fi ++ fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then +@@ -1164,22 +1280,28 @@ EOF + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:QNX:*:4*) + echo i386-pc-qnx +- exit 0 ;; +- NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) ++ exit ;; ++ NEO-?:NONSTOP_KERNEL:*:*) ++ echo neo-tandem-nsk${UNAME_RELEASE} ++ exit ;; ++ NSE-*:NONSTOP_KERNEL:*:*) ++ echo nse-tandem-nsk${UNAME_RELEASE} ++ exit ;; ++ NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux +- exit 0 ;; ++ exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv +- exit 0 ;; ++ exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} +- exit 0 ;; ++ exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 +@@ -1190,33 +1312,55 @@ EOF + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 +- exit 0 ;; ++ exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 +- exit 0 ;; ++ exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex +- exit 0 ;; ++ exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 +- exit 0 ;; ++ exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 +- exit 0 ;; ++ exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 +- exit 0 ;; ++ exit ;; + *:ITS:*:*) + echo pdp10-unknown-its +- exit 0 ;; ++ exit ;; + SEI:*:*:SEIUX) +- echo mips-sei-seiux${UNAME_RELEASE} +- exit 0 ;; ++ echo mips-sei-seiux${UNAME_RELEASE} ++ exit ;; ++ *:DragonFly:*:*) ++ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ++ exit ;; ++ *:*VMS:*:*) ++ UNAME_MACHINE=`(uname -p) 2>/dev/null` ++ case "${UNAME_MACHINE}" in ++ A*) echo alpha-dec-vms ; exit ;; ++ I*) echo ia64-dec-vms ; exit ;; ++ V*) echo vax-dec-vms ; exit ;; ++ esac ;; ++ *:XENIX:*:SysV) ++ echo i386-pc-xenix ++ exit ;; ++ i*86:skyos:*:*) ++ echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' ++ exit ;; ++ i*86:rdos:*:*) ++ echo ${UNAME_MACHINE}-pc-rdos ++ exit ;; ++ i*86:AROS:*:*) ++ echo ${UNAME_MACHINE}-pc-aros ++ exit ;; ++ x86_64:VMkernel:*:*) ++ echo ${UNAME_MACHINE}-unknown-esx ++ exit ;; + esac + +-#echo '(No uname command or uname output not recognized.)' 1>&2 +-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 +- + eval $set_cc_for_build + cat >$dummy.c < + printf ("m68k-sony-newsos%s\n", + #ifdef NEWSOS4 +- "4" ++ "4" + #else +- "" ++ "" + #endif +- ); exit (0); ++ ); exit (0); + #endif + #endif + + #if defined (__arm) && defined (__acorn) && defined (__unix) +- printf ("arm-acorn-riscix"); exit (0); ++ printf ("arm-acorn-riscix\n"); exit (0); + #endif + + #if defined (hp300) && !defined (hpux) +@@ -1332,11 +1476,12 @@ main () + } + EOF + +-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 ++$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && ++ { echo "$SYSTEM_NAME"; exit; } + + # Apollos put the system type in the environment. + +-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } ++test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + + # Convex versions that predate uname can use getsysinfo(1) + +@@ -1345,22 +1490,22 @@ then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd +- exit 0 ;; ++ exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi +- exit 0 ;; ++ exit ;; + c34*) + echo c34-convex-bsd +- exit 0 ;; ++ exit ;; + c38*) + echo c38-convex-bsd +- exit 0 ;; ++ exit ;; + c4*) + echo c4-convex-bsd +- exit 0 ;; ++ exit ;; + esac + fi + +@@ -1371,7 +1516,9 @@ This script, last modified $timestamp, has failed to recognize + the operating system you are using. It is advised that you + download the most up to date version of the config scripts from + +- ftp://ftp.gnu.org/pub/gnu/config/ ++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD ++and ++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + + If the version you run ($0) is already up to date, please + send the following data and any information you think might be +diff --git a/alliance/src/config.sub b/alliance/src/config.sub +index 91a5501..c765b34 100755 +--- a/alliance/src/config.sub ++++ b/alliance/src/config.sub +@@ -1,41 +1,40 @@ + #! /bin/sh + # Configuration validation subroutine script. +-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++# Copyright 1992-2013 Free Software Foundation, Inc. + +-timestamp='2003-06-18' ++timestamp='2013-04-24' + +-# This file is (in principle) common to ALL GNU software. +-# The presence of a machine in this file suggests that SOME GNU software +-# can handle that machine. It does not imply ALL GNU software can. +-# +-# This file is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# This file is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++# General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 +- ++# along with this program; if not, see . ++# + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. ++# the same distribution terms that you use for the rest of that ++# program. This Exception is an additional permission under section 7 ++# of the GNU General Public License, version 3 ("GPLv3"). + +-# Please send patches to . Submit a context +-# diff and a properly formatted ChangeLog entry. ++ ++# Please send patches with a ChangeLog entry to config-patches@gnu.org. + # + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. + # If it is invalid, we print an error message on stderr and exit with code 1. + # Otherwise, we print the canonical config type on stdout and succeed. + ++# You can get the latest version of this script from: ++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD ++ + # This file is supposed to be the same for all GNU packages + # and recognize all the CPU types, system types and aliases + # that are meaningful with *any* GNU software. +@@ -69,8 +68,7 @@ Report bugs and patches to ." + version="\ + GNU config.sub ($timestamp) + +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +-Free Software Foundation, Inc. ++Copyright 1992-2013 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." +@@ -82,11 +80,11 @@ Try \`$me --help' for more information." + while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) +- echo "$timestamp" ; exit 0 ;; ++ echo "$timestamp" ; exit ;; + --version | -v ) +- echo "$version" ; exit 0 ;; ++ echo "$version" ; exit ;; + --help | --h* | -h ) +- echo "$usage"; exit 0 ;; ++ echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. +@@ -98,7 +96,7 @@ while test $# -gt 0 ; do + *local*) + # First pass through any local machine types. + echo $1 +- exit 0;; ++ exit ;; + + * ) + break ;; +@@ -117,10 +115,18 @@ esac + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ ++ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ ++ knetbsd*-gnu* | netbsd*-gnu* | \ ++ kopensolaris*-gnu* | \ ++ storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; ++ android-linux) ++ os=-linux-android ++ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ++ ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] +@@ -143,10 +149,13 @@ case $os in + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple | -axis) ++ -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; ++ -bluegene*) ++ os=-cnk ++ ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 +@@ -161,13 +170,17 @@ case $os in + os=-chorusos + basic_machine=$1 + ;; +- -chorusrdb) +- os=-chorusrdb ++ -chorusrdb) ++ os=-chorusrdb + basic_machine=$1 +- ;; ++ ;; + -hiux*) + os=-hiuxwe2 + ;; ++ -sco6) ++ os=-sco5v6 ++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ++ ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +@@ -184,6 +197,10 @@ case $os in + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; ++ -sco5v6*) ++ # Don't forget version if it is 3.2v4 or newer. ++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ++ ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +@@ -201,6 +218,12 @@ case $os in + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; ++ -lynx*178) ++ os=-lynxos178 ++ ;; ++ -lynx*5) ++ os=-lynxos5 ++ ;; + -lynx*) + os=-lynxos + ;; +@@ -225,56 +248,106 @@ case $basic_machine in + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ ++ | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ +- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ ++ | am33_2.0 \ ++ | arc | arceb \ ++ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ ++ | avr | avr32 \ ++ | be32 | be64 \ ++ | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ +- | fr30 | frv \ ++ | epiphany \ ++ | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ ++ | hexagon \ + | i370 | i860 | i960 | ia64 \ +- | ip2k \ +- | m32r | m68000 | m68k | m88k | mcore \ ++ | ip2k | iq2000 \ ++ | le32 | le64 \ ++ | lm32 \ ++ | m32c | m32r | m32rle | m68000 | m68k | m88k \ ++ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ +- | mips64vr | mips64vrel \ ++ | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ ++ | mips64r5900 | mips64r5900el \ ++ | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ ++ | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ ++ | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ ++ | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ ++ | moxie \ ++ | mt \ + | msp430 \ ++ | nds32 | nds32le | nds32be \ ++ | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ +- | openrisc | or32 \ ++ | open8 \ ++ | or1k | or32 \ + | pdp10 | pdp11 | pj | pjl \ +- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ ++ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ +- | s390 | s390x \ +- | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ ++ | rl78 | rx \ ++ | score \ ++ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ +- | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ +- | strongarm \ +- | tahoe | thumb | tic4x | tic80 | tron \ +- | v850 | v850e \ ++ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ ++ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ ++ | spu \ ++ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ ++ | ubicom32 \ ++ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ +- | x86 | xscale | xstormy16 | xtensa \ +- | z8k) ++ | x86 | xc16x | xstormy16 | xtensa \ ++ | z8k | z80) + basic_machine=$basic_machine-unknown + ;; +- m6811 | m68hc11 | m6812 | m68hc12) +- # Motorola 68HC11/12. ++ c54x) ++ basic_machine=tic54x-unknown ++ ;; ++ c55x) ++ basic_machine=tic55x-unknown ++ ;; ++ c6x) ++ basic_machine=tic6x-unknown ++ ;; ++ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; ++ ms1) ++ basic_machine=mt-unknown ++ ;; ++ ++ strongarm | thumb | xscale) ++ basic_machine=arm-unknown ++ ;; ++ xgate) ++ basic_machine=$basic_machine-unknown ++ os=-none ++ ;; ++ xscaleeb) ++ basic_machine=armeb-unknown ++ ;; ++ ++ xscaleel) ++ basic_machine=armel-unknown ++ ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and +@@ -290,59 +363,82 @@ case $basic_machine in + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ ++ | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ +- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ ++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ +- | avr-* \ +- | bs2000-* \ +- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ +- | clipper-* | cydra-* \ ++ | avr-* | avr32-* \ ++ | be32-* | be64-* \ ++ | bfin-* | bs2000-* \ ++ | c[123]* | c30-* | [cjt]90-* | c4x-* \ ++ | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ +- | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ ++ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ ++ | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ +- | ip2k-* \ +- | m32r-* \ ++ | ip2k-* | iq2000-* \ ++ | le32-* | le64-* \ ++ | lm32-* \ ++ | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ +- | m88110-* | m88k-* | mcore-* \ ++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ ++ | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ +- | mips64vr-* | mips64vrel-* \ ++ | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ ++ | mips64r5900-* | mips64r5900el-* \ ++ | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ ++ | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ ++ | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ ++ | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ ++ | mmix-* \ ++ | mt-* \ + | msp430-* \ +- | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ ++ | nds32-* | nds32le-* | nds32be-* \ ++ | nios-* | nios2-* | nios2eb-* | nios2el-* \ ++ | none-* | np1-* | ns16k-* | ns32k-* \ ++ | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ +- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ ++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ +- | romp-* | rs6000-* \ +- | s390-* | s390x-* \ +- | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ ++ | rl78-* | romp-* | rs6000-* | rx-* \ ++ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ +- | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ +- | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ +- | tahoe-* | thumb-* \ ++ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ ++ | sparclite-* \ ++ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ ++ | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ ++ | tile*-* \ + | tron-* \ +- | v850-* | v850e-* | vax-* \ ++ | ubicom32-* \ ++ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ ++ | vax-* \ + | we32k-* \ +- | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ +- | xtensa-* \ ++ | x86-* | x86_64-* | xc16x-* | xps100-* \ ++ | xstormy16-* | xtensa*-* \ + | ymp-* \ +- | z8k-*) ++ | z8k-* | z80-*) ++ ;; ++ # Recognize the basic CPU types without company name, with glob match. ++ xtensa*) ++ basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. +@@ -360,6 +456,9 @@ case $basic_machine in + basic_machine=a29k-amd + os=-udi + ;; ++ abacus) ++ basic_machine=abacus-unknown ++ ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout +@@ -377,6 +476,9 @@ case $basic_machine in + amd64) + basic_machine=x86_64-pc + ;; ++ amd64-*) ++ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + amdahl) + basic_machine=580-amdahl + os=-sysv +@@ -400,6 +502,10 @@ case $basic_machine in + basic_machine=m68k-apollo + os=-bsd + ;; ++ aros) ++ basic_machine=i386-pc ++ os=-aros ++ ;; + aux) + basic_machine=m68k-apple + os=-aux +@@ -408,10 +514,35 @@ case $basic_machine in + basic_machine=ns32k-sequent + os=-dynix + ;; ++ blackfin) ++ basic_machine=bfin-unknown ++ os=-linux ++ ;; ++ blackfin-*) ++ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; ++ bluegene*) ++ basic_machine=powerpc-ibm ++ os=-cnk ++ ;; ++ c54x-*) ++ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ c55x-*) ++ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ c6x-*) ++ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; ++ cegcc) ++ basic_machine=arm-unknown ++ os=-cegcc ++ ;; + convex-c1) + basic_machine=c1-convex + os=-bsd +@@ -436,12 +567,27 @@ case $basic_machine in + basic_machine=j90-cray + os=-unicos + ;; ++ craynv) ++ basic_machine=craynv-cray ++ os=-unicosmp ++ ;; ++ cr16 | cr16-*) ++ basic_machine=cr16-unknown ++ os=-elf ++ ;; + crds | unos) + basic_machine=m68k-crds + ;; ++ crisv32 | crisv32-* | etraxfs*) ++ basic_machine=crisv32-axis ++ ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; ++ crx) ++ basic_machine=crx-unknown ++ os=-elf ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; +@@ -464,6 +610,14 @@ case $basic_machine in + basic_machine=m88k-motorola + os=-sysv3 + ;; ++ dicos) ++ basic_machine=i686-pc ++ os=-dicos ++ ;; ++ djgpp) ++ basic_machine=i586-pc ++ os=-msdosdjgpp ++ ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx +@@ -575,7 +729,6 @@ case $basic_machine in + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +-# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 +@@ -614,6 +767,14 @@ case $basic_machine in + basic_machine=m68k-isi + os=-sysv + ;; ++ m68knommu) ++ basic_machine=m68k-unknown ++ os=-linux ++ ;; ++ m68knommu-*) ++ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; + m88k-omron*) + basic_machine=m88k-omron + ;; +@@ -625,10 +786,21 @@ case $basic_machine in + basic_machine=ns32k-utek + os=-sysv + ;; ++ microblaze*) ++ basic_machine=microblaze-xilinx ++ ;; ++ mingw64) ++ basic_machine=x86_64-pc ++ os=-mingw64 ++ ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; ++ mingw32ce) ++ basic_machine=arm-unknown ++ os=-mingw32ce ++ ;; + miniframe) + basic_machine=m68000-convergent + ;; +@@ -642,10 +814,6 @@ case $basic_machine in + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; +- mmix*) +- basic_machine=mmix-knuth +- os=-mmixware +- ;; + monitor) + basic_machine=m68k-rom68k + os=-coff +@@ -658,10 +826,21 @@ case $basic_machine in + basic_machine=i386-pc + os=-msdos + ;; ++ ms1-*) ++ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ++ ;; ++ msys) ++ basic_machine=i386-pc ++ os=-msys ++ ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; ++ nacl) ++ basic_machine=le32-unknown ++ os=-nacl ++ ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 +@@ -726,9 +905,11 @@ case $basic_machine in + np1) + basic_machine=np1-gould + ;; +- nv1) +- basic_machine=nv1-cray +- os=-unicosmp ++ neo-tandem) ++ basic_machine=neo-tandem ++ ;; ++ nse-tandem) ++ basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem +@@ -737,9 +918,12 @@ case $basic_machine in + basic_machine=hppa1.1-oki + os=-proelf + ;; +- or32 | or32-*) ++ openrisc | openrisc-*) + basic_machine=or32-unknown +- os=-coff ++ ;; ++ os400) ++ basic_machine=powerpc-ibm ++ os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson +@@ -757,6 +941,14 @@ case $basic_machine in + basic_machine=i860-intel + os=-osf + ;; ++ parisc) ++ basic_machine=hppa-unknown ++ os=-linux ++ ;; ++ parisc-*) ++ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; + pbd) + basic_machine=sparc-tti + ;; +@@ -766,6 +958,12 @@ case $basic_machine in + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; ++ pc98) ++ basic_machine=i386-pc ++ ;; ++ pc98-*) ++ basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; +@@ -795,9 +993,10 @@ case $basic_machine in + ;; + power) basic_machine=power-ibm + ;; +- ppc) basic_machine=powerpc-unknown ++ ppc | ppcbe) basic_machine=powerpc-unknown + ;; +- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ppc-* | ppcbe-*) ++ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown +@@ -807,7 +1006,7 @@ case $basic_machine in + ;; + ppc64) basic_machine=powerpc64-unknown + ;; +- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown +@@ -822,6 +1021,14 @@ case $basic_machine in + basic_machine=i586-unknown + os=-pw32 + ;; ++ rdos | rdos64) ++ basic_machine=x86_64-pc ++ os=-rdos ++ ;; ++ rdos32) ++ basic_machine=i386-pc ++ os=-rdos ++ ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff +@@ -832,6 +1039,12 @@ case $basic_machine in + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; ++ s390 | s390-*) ++ basic_machine=s390-ibm ++ ;; ++ s390x | s390x-*) ++ basic_machine=s390x-ibm ++ ;; + sa29200) + basic_machine=a29k-amd + os=-udi +@@ -842,6 +1055,10 @@ case $basic_machine in + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; ++ sde) ++ basic_machine=mipsisa32-sde ++ os=-elf ++ ;; + sei) + basic_machine=mips-sei + os=-seiux +@@ -853,6 +1070,9 @@ case $basic_machine in + basic_machine=sh-hitachi + os=-hms + ;; ++ sh5el) ++ basic_machine=sh5le-unknown ++ ;; + sh64) + basic_machine=sh64-unknown + ;; +@@ -874,6 +1094,9 @@ case $basic_machine in + basic_machine=i860-stratus + os=-sysv4 + ;; ++ strongarm-* | thumb-*) ++ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + sun2) + basic_machine=m68000-sun + ;; +@@ -930,17 +1153,9 @@ case $basic_machine in + basic_machine=t90-cray + os=-unicos + ;; +- tic54x | c54x*) +- basic_machine=tic54x-unknown +- os=-coff +- ;; +- tic55x | c55x*) +- basic_machine=tic55x-unknown +- os=-coff +- ;; +- tic6x | c6x*) +- basic_machine=tic6x-unknown +- os=-coff ++ tile*) ++ basic_machine=$basic_machine-unknown ++ os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown +@@ -955,6 +1170,10 @@ case $basic_machine in + tower | tower-32) + basic_machine=m68k-ncr + ;; ++ tpf) ++ basic_machine=s390x-ibm ++ os=-tpf ++ ;; + udi29k) + basic_machine=a29k-amd + os=-udi +@@ -998,9 +1217,16 @@ case $basic_machine in + basic_machine=hppa1.1-winbond + os=-proelf + ;; ++ xbox) ++ basic_machine=i686-pc ++ os=-mingw32 ++ ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; ++ xscale-* | xscalee[bl]-*) ++ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ++ ;; + ymp) + basic_machine=ymp-cray + os=-unicos +@@ -1009,6 +1235,10 @@ case $basic_machine in + basic_machine=z8k-unknown + os=-sim + ;; ++ z80-*-coff) ++ basic_machine=z80-unknown ++ os=-sim ++ ;; + none) + basic_machine=none-none + os=-none +@@ -1028,6 +1258,9 @@ case $basic_machine in + romp) + basic_machine=romp-ibm + ;; ++ mmix) ++ basic_machine=mmix-knuth ++ ;; + rs6000) + basic_machine=rs6000-ibm + ;; +@@ -1044,13 +1277,10 @@ case $basic_machine in + we32k) + basic_machine=we32k-att + ;; +- sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) ++ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; +- sh64) +- basic_machine=sh64-unknown +- ;; +- sparc | sparcv8 | sparcv9 | sparcv9b) ++ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) +@@ -1094,9 +1324,12 @@ esac + if [ x"$os" != x"" ] + then + case $os in +- # First match some system type aliases +- # that might get confused with valid system types. ++ # First match some system type aliases ++ # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. ++ -auroraux) ++ os=-auroraux ++ ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; +@@ -1117,25 +1350,31 @@ case $os in + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ +- | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ +- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ ++ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ ++ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ ++ | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ +- | -aos* \ ++ | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ +- | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ +- | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ ++ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ ++ | -bitrig* | -openbsd* | -solidbsd* \ ++ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ ++ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ +- | -chorusos* | -chorusrdb* \ +- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -chorusos* | -chorusrdb* | -cegcc* \ ++ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ ++ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ ++ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ +- | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) ++ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ ++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) +@@ -1153,12 +1392,15 @@ case $os in + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ +- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ ++ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; ++ -linux-dietlibc) ++ os=-linux-dietlibc ++ ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; +@@ -1171,6 +1413,9 @@ case $os in + -opened*) + os=-openedition + ;; ++ -os400*) ++ os=-os400 ++ ;; + -wince*) + os=-wince + ;; +@@ -1192,6 +1437,9 @@ case $os in + -atheos*) + os=-atheos + ;; ++ -syllable*) ++ os=-syllable ++ ;; + -386bsd) + os=-bsd + ;; +@@ -1214,6 +1462,9 @@ case $os in + -sinix*) + os=-sysv4 + ;; ++ -tpf*) ++ os=-tpf ++ ;; + -triton*) + os=-sysv3 + ;; +@@ -1247,8 +1498,13 @@ case $os in + -aros*) + os=-aros + ;; +- -kaos*) +- os=-kaos ++ -zvmoe) ++ os=-zvmoe ++ ;; ++ -dicos*) ++ os=-dicos ++ ;; ++ -nacl*) + ;; + -none) + ;; +@@ -1272,6 +1528,12 @@ else + # system, and we'll never get to this point. + + case $basic_machine in ++ score-*) ++ os=-elf ++ ;; ++ spu-*) ++ os=-elf ++ ;; + *-acorn) + os=-riscix1.2 + ;; +@@ -1284,6 +1546,18 @@ case $basic_machine in + c4x-* | tic4x-*) + os=-coff + ;; ++ hexagon-*) ++ os=-elf ++ ;; ++ tic54x-*) ++ os=-coff ++ ;; ++ tic55x-*) ++ os=-coff ++ ;; ++ tic6x-*) ++ os=-coff ++ ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 +@@ -1302,19 +1576,22 @@ case $basic_machine in + ;; + m68000-sun) + os=-sunos3 +- # This also exists in the configure program, but was not the +- # default. +- # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; ++ mep-*) ++ os=-elf ++ ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; ++ or1k-*) ++ os=-elf ++ ;; + or32-*) + os=-coff + ;; +@@ -1327,9 +1604,15 @@ case $basic_machine in + *-be) + os=-beos + ;; ++ *-haiku) ++ os=-haiku ++ ;; + *-ibm) + os=-aix + ;; ++ *-knuth) ++ os=-mmixware ++ ;; + *-wec) + os=-proelf + ;; +@@ -1432,7 +1715,7 @@ case $basic_machine in + -sunos*) + vendor=sun + ;; +- -aix*) ++ -cnk*|-aix*) + vendor=ibm + ;; + -beos*) +@@ -1462,9 +1745,15 @@ case $basic_machine in + -mvs* | -opened*) + vendor=ibm + ;; ++ -os400*) ++ vendor=ibm ++ ;; + -ptx*) + vendor=sequent + ;; ++ -tpf*) ++ vendor=ibm ++ ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; +@@ -1489,7 +1778,7 @@ case $basic_machine in + esac + + echo $basic_machine$os +-exit 0 ++exit + + # Local variables: + # eval: (add-hook 'write-file-hooks 'time-stamp) +diff --git a/alliance/src/depcomp b/alliance/src/depcomp +index df8eea7..4ebd5b3 100755 +--- a/alliance/src/depcomp ++++ b/alliance/src/depcomp +@@ -1,10 +1,9 @@ + #! /bin/sh + # depcomp - compile a program generating dependencies as side-effects + +-scriptversion=2009-04-28.21; # UTC ++scriptversion=2013-05-30.07; # UTC + +-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free +-# Software Foundation, Inc. ++# Copyright (C) 1999-2013 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify + # it under the terms of the GNU General Public License as published by +@@ -28,9 +27,9 @@ scriptversion=2009-04-28.21; # UTC + + case $1 in + '') +- echo "$0: No command. Try \`$0 --help' for more information." 1>&2 +- exit 1; +- ;; ++ echo "$0: No command. Try '$0 --help' for more information." 1>&2 ++ exit 1; ++ ;; + -h | --h*) + cat <<\EOF + Usage: depcomp [--help] [--version] PROGRAM [ARGS] +@@ -40,11 +39,11 @@ as side-effects. + + Environment variables: + depmode Dependency tracking mode. +- source Source file read by `PROGRAMS ARGS'. +- object Object file output by `PROGRAMS ARGS'. ++ source Source file read by 'PROGRAMS ARGS'. ++ object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. +- tmpdepfile Temporary file to use when outputing dependencies. ++ tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + + Report bugs to . +@@ -57,6 +56,66 @@ EOF + ;; + esac + ++# Get the directory component of the given path, and save it in the ++# global variables '$dir'. Note that this directory component will ++# be either empty or ending with a '/' character. This is deliberate. ++set_dir_from () ++{ ++ case $1 in ++ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; ++ *) dir=;; ++ esac ++} ++ ++# Get the suffix-stripped basename of the given path, and save it the ++# global variable '$base'. ++set_base_from () ++{ ++ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` ++} ++ ++# If no dependency file was actually created by the compiler invocation, ++# we still have to create a dummy depfile, to avoid errors with the ++# Makefile "include basename.Plo" scheme. ++make_dummy_depfile () ++{ ++ echo "#dummy" > "$depfile" ++} ++ ++# Factor out some common post-processing of the generated depfile. ++# Requires the auxiliary global variable '$tmpdepfile' to be set. ++aix_post_process_depfile () ++{ ++ # If the compiler actually managed to produce a dependency file, ++ # post-process it. ++ if test -f "$tmpdepfile"; then ++ # Each line is of the form 'foo.o: dependency.h'. ++ # Do two passes, one to just change these to ++ # $object: dependency.h ++ # and one to simply output ++ # dependency.h: ++ # which is needed to avoid the deleted-header problem. ++ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" ++ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" ++ } > "$depfile" ++ rm -f "$tmpdepfile" ++ else ++ make_dummy_depfile ++ fi ++} ++ ++# A tabulation character. ++tab=' ' ++# A newline character. ++nl=' ++' ++# Character ranges might be problematic outside the C locale. ++# These definitions help. ++upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ ++lower=abcdefghijklmnopqrstuvwxyz ++digits=0123456789 ++alpha=${upper}${lower} ++ + if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +@@ -69,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + + rm -f "$tmpdepfile" + ++# Avoid interferences from the environment. ++gccflag= dashmflag= ++ + # Some modes work just like other modes, but use different flags. We + # parameterize here, but still list the modes in the big case below, + # to make depend.m4 easier to write. Note that we *cannot* use a case +@@ -80,18 +142,32 @@ if test "$depmode" = hp; then + fi + + if test "$depmode" = dashXmstdout; then +- # This is just like dashmstdout with a different argument. +- dashmflag=-xM +- depmode=dashmstdout ++ # This is just like dashmstdout with a different argument. ++ dashmflag=-xM ++ depmode=dashmstdout + fi + + cygpath_u="cygpath -u -f -" + if test "$depmode" = msvcmsys; then +- # This is just like msvisualcpp but w/o cygpath translation. +- # Just convert the backslash-escaped backslashes to single forward +- # slashes to satisfy depend.m4 +- cygpath_u="sed s,\\\\\\\\,/,g" +- depmode=msvisualcpp ++ # This is just like msvisualcpp but w/o cygpath translation. ++ # Just convert the backslash-escaped backslashes to single forward ++ # slashes to satisfy depend.m4 ++ cygpath_u='sed s,\\\\,/,g' ++ depmode=msvisualcpp ++fi ++ ++if test "$depmode" = msvc7msys; then ++ # This is just like msvc7 but w/o cygpath translation. ++ # Just convert the backslash-escaped backslashes to single forward ++ # slashes to satisfy depend.m4 ++ cygpath_u='sed s,\\\\,/,g' ++ depmode=msvc7 ++fi ++ ++if test "$depmode" = xlc; then ++ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. ++ gccflag=-qmakedep=gcc,-MF ++ depmode=gcc + fi + + case "$depmode" in +@@ -114,8 +190,7 @@ gcc3) + done + "$@" + stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi +@@ -123,13 +198,17 @@ gcc3) + ;; + + gcc) ++## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ++## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ++## (see the conditional assignment to $gccflag above). + ## There are various ways to get dependency output from gcc. Here's + ## why we pick this rather obscure method: + ## - Don't want to use -MD because we'd like the dependencies to end + ## up in a subdir. Having to rename by hand is ugly. + ## (We might end up doing this anyway to support other compilers.) + ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +-## -MM, not -M (despite what the docs say). ++## -MM, not -M (despite what the docs say). Also, it might not be ++## supported by the other compilers which use the 'gcc' depmode. + ## - Using -M directly means running the compiler twice (even worse + ## than renaming). + if test -z "$gccflag"; then +@@ -137,31 +216,31 @@ gcc) + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" +- alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +-## The second -e expression handles DOS-style file names with drive letters. ++ # The second -e expression handles DOS-style file names with drive ++ # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +-## This next piece of magic avoids the `deleted header file' problem. ++## This next piece of magic avoids the "deleted header file" problem. + ## The problem is that when a header file which appears in a .P file + ## is deleted, the dependency causes make to die (because there is + ## typically no way to rebuild the header). We avoid this by adding + ## dummy dependencies for each header file. Too bad gcc doesn't do + ## this for us directly. +- tr ' ' ' +-' < "$tmpdepfile" | +-## Some versions of gcc put a space before the `:'. On the theory ++## Some versions of gcc put a space before the ':'. On the theory + ## that the space means something, we add a space to the output as +-## well. ++## well. hp depmode also adds that space, but also prefixes the VPATH ++## to the object. Take care to not repeat it in the output. + ## Some versions of the HPUX 10.20 sed can't process this invocation + ## correctly. Breaking it into two sed invocations is a workaround. +- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" ++ tr ' ' "$nl" < "$tmpdepfile" \ ++ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ ++ | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +@@ -179,8 +258,7 @@ sgi) + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi +@@ -188,43 +266,41 @@ sgi) + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" +- + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; +- # the IRIX cc adds comments like `#:fec' to the end of the ++ # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. +- tr ' ' ' +-' < "$tmpdepfile" \ +- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ +- tr ' +-' ' ' >> "$depfile" ++ tr ' ' "$nl" < "$tmpdepfile" \ ++ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ ++ | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" +- + # The second pass generates a dummy entry for each header file. +- tr ' ' ' +-' < "$tmpdepfile" \ +- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ +- >> "$depfile" ++ tr ' ' "$nl" < "$tmpdepfile" \ ++ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ ++ >> "$depfile" + else +- # The sourcefile does not contain any dependencies, so just +- # store a dummy comment line, to avoid errors with the Makefile +- # "include basename.Plo" scheme. +- echo "#dummy" > "$depfile" ++ make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + ++xlc) ++ # This case exists only to let depend.m4 do its work. It works by ++ # looking at the text of this script. This case will never be run, ++ # since it is checked for above. ++ exit 1 ++ ;; ++ + aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the +- # current directory. Also, the AIX compiler puts `$object:' at the ++ # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. +- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` +- test "x$dir" = "x$object" && dir= +- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` ++ set_dir_from "$object" ++ set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u +@@ -237,9 +313,7 @@ aix) + "$@" -M + fi + stat=$? +- +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi +@@ -248,44 +322,100 @@ aix) + do + test -f "$tmpdepfile" && break + done +- if test -f "$tmpdepfile"; then +- # Each line is of the form `foo.o: dependent.h'. +- # Do two passes, one to just change these to +- # `$object: dependent.h' and one to simply `dependent.h:'. +- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" +- # That's a tab and a space in the []. +- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" +- else +- # The sourcefile does not contain any dependencies, so just +- # store a dummy comment line, to avoid errors with the Makefile +- # "include basename.Plo" scheme. +- echo "#dummy" > "$depfile" ++ aix_post_process_depfile ++ ;; ++ ++tcc) ++ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 ++ # FIXME: That version still under development at the moment of writing. ++ # Make that this statement remains true also for stable, released ++ # versions. ++ # It will wrap lines (doesn't matter whether long or short) with a ++ # trailing '\', as in: ++ # ++ # foo.o : \ ++ # foo.c \ ++ # foo.h \ ++ # ++ # It will put a trailing '\' even on the last line, and will use leading ++ # spaces rather than leading tabs (at least since its commit 0394caf7 ++ # "Emit spaces for -MD"). ++ "$@" -MD -MF "$tmpdepfile" ++ stat=$? ++ if test $stat -ne 0; then ++ rm -f "$tmpdepfile" ++ exit $stat + fi ++ rm -f "$depfile" ++ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. ++ # We have to change lines of the first kind to '$object: \'. ++ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" ++ # And for each line of the second kind, we have to emit a 'dep.h:' ++ # dummy dependency, to avoid the deleted-header problem. ++ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +-icc) +- # Intel's C compiler understands `-MD -MF file'. However on +- # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c +- # ICC 7.0 will fill foo.d with something like +- # foo.o: sub/foo.c +- # foo.o: sub/foo.h +- # which is wrong. We want: +- # sub/foo.o: sub/foo.c +- # sub/foo.o: sub/foo.h +- # sub/foo.c: +- # sub/foo.h: +- # ICC 7.1 will output ++## The order of this option in the case statement is important, since the ++## shell code in configure will try each of these formats in the order ++## listed in this file. A plain '-MD' option would be understood by many ++## compilers, so we must ensure this comes after the gcc and icc options. ++pgcc) ++ # Portland's C compiler understands '-MD'. ++ # Will always output deps to 'file.d' where file is the root name of the ++ # source file under compilation, even if file resides in a subdirectory. ++ # The object file name does not affect the name of the '.d' file. ++ # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h +- # and will wrap long lines using \ : ++ # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... ++ set_dir_from "$object" ++ # Use the source, not the object, to determine the base name, since ++ # that's sadly what pgcc will do too. ++ set_base_from "$source" ++ tmpdepfile=$base.d ++ ++ # For projects that build the same source file twice into different object ++ # files, the pgcc approach of using the *source* file root name can cause ++ # problems in parallel builds. Use a locking strategy to avoid stomping on ++ # the same $tmpdepfile. ++ lockdir=$base.d-lock ++ trap " ++ echo '$0: caught signal, cleaning up...' >&2 ++ rmdir '$lockdir' ++ exit 1 ++ " 1 2 13 15 ++ numtries=100 ++ i=$numtries ++ while test $i -gt 0; do ++ # mkdir is a portable test-and-set. ++ if mkdir "$lockdir" 2>/dev/null; then ++ # This process acquired the lock. ++ "$@" -MD ++ stat=$? ++ # Release the lock. ++ rmdir "$lockdir" ++ break ++ else ++ # If the lock is being held by a different process, wait ++ # until the winning process is done or we timeout. ++ while test -d "$lockdir" && test $i -gt 0; do ++ sleep 1 ++ i=`expr $i - 1` ++ done ++ fi ++ i=`expr $i - 1` ++ done ++ trap - 1 2 13 15 ++ if test $i -le 0; then ++ echo "$0: failed to acquire lock after $numtries attempts" >&2 ++ echo "$0: check lockdir '$lockdir'" >&2 ++ exit 1 ++ fi + +- "$@" -MD -MF "$tmpdepfile" +- stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi +@@ -297,8 +427,8 @@ icc) + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. +- sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | +- sed -e 's/$/ :/' >> "$depfile" ++ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ ++ | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +@@ -309,9 +439,8 @@ hp2) + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. +- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` +- test "x$dir" = "x$object" && dir= +- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` ++ set_dir_from "$object" ++ set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d +@@ -322,8 +451,7 @@ hp2) + "$@" +Maked + fi + stat=$? +- if test $stat -eq 0; then : +- else ++ if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi +@@ -333,77 +461,107 @@ hp2) + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then +- sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" +- # Add `dependent.h:' lines. ++ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" ++ # Add 'dependent.h:' lines. + sed -ne '2,${ +- s/^ *// +- s/ \\*$// +- s/$/:/ +- p +- }' "$tmpdepfile" >> "$depfile" ++ s/^ *// ++ s/ \\*$// ++ s/$/:/ ++ p ++ }' "$tmpdepfile" >> "$depfile" + else +- echo "#dummy" > "$depfile" ++ make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + + tru64) +- # The Tru64 compiler uses -MD to generate dependencies as a side +- # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. +- # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put +- # dependencies in `foo.d' instead, so we check for that too. +- # Subdirectories are respected. +- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` +- test "x$dir" = "x$object" && dir= +- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` +- +- if test "$libtool" = yes; then +- # With Tru64 cc, shared objects can also be used to make a +- # static library. This mechanism is used in libtool 1.4 series to +- # handle both shared and static libraries in a single compilation. +- # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. +- # +- # With libtool 1.5 this exception was removed, and libtool now +- # generates 2 separate objects for the 2 libraries. These two +- # compilations output dependencies in $dir.libs/$base.o.d and +- # in $dir$base.o.d. We have to check for both files, because +- # one of the two compilations can be disabled. We should prefer +- # $dir$base.o.d over $dir.libs/$base.o.d because the latter is +- # automatically cleaned when .libs/ is deleted, while ignoring +- # the former would cause a distcleancheck panic. +- tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 +- tmpdepfile2=$dir$base.o.d # libtool 1.5 +- tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 +- tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 +- "$@" -Wc,-MD +- else +- tmpdepfile1=$dir$base.o.d +- tmpdepfile2=$dir$base.d +- tmpdepfile3=$dir$base.d +- tmpdepfile4=$dir$base.d +- "$@" -MD +- fi +- +- stat=$? +- if test $stat -eq 0; then : +- else +- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" +- exit $stat +- fi +- +- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" +- do +- test -f "$tmpdepfile" && break +- done +- if test -f "$tmpdepfile"; then +- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" +- # That's a tab and a space in the []. +- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" +- else +- echo "#dummy" > "$depfile" +- fi +- rm -f "$tmpdepfile" +- ;; ++ # The Tru64 compiler uses -MD to generate dependencies as a side ++ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. ++ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put ++ # dependencies in 'foo.d' instead, so we check for that too. ++ # Subdirectories are respected. ++ set_dir_from "$object" ++ set_base_from "$object" ++ ++ if test "$libtool" = yes; then ++ # Libtool generates 2 separate objects for the 2 libraries. These ++ # two compilations output dependencies in $dir.libs/$base.o.d and ++ # in $dir$base.o.d. We have to check for both files, because ++ # one of the two compilations can be disabled. We should prefer ++ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is ++ # automatically cleaned when .libs/ is deleted, while ignoring ++ # the former would cause a distcleancheck panic. ++ tmpdepfile1=$dir$base.o.d # libtool 1.5 ++ tmpdepfile2=$dir.libs/$base.o.d # Likewise. ++ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 ++ "$@" -Wc,-MD ++ else ++ tmpdepfile1=$dir$base.d ++ tmpdepfile2=$dir$base.d ++ tmpdepfile3=$dir$base.d ++ "$@" -MD ++ fi ++ ++ stat=$? ++ if test $stat -ne 0; then ++ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" ++ exit $stat ++ fi ++ ++ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" ++ do ++ test -f "$tmpdepfile" && break ++ done ++ # Same post-processing that is required for AIX mode. ++ aix_post_process_depfile ++ ;; ++ ++msvc7) ++ if test "$libtool" = yes; then ++ showIncludes=-Wc,-showIncludes ++ else ++ showIncludes=-showIncludes ++ fi ++ "$@" $showIncludes > "$tmpdepfile" ++ stat=$? ++ grep -v '^Note: including file: ' "$tmpdepfile" ++ if test $stat -ne 0; then ++ rm -f "$tmpdepfile" ++ exit $stat ++ fi ++ rm -f "$depfile" ++ echo "$object : \\" > "$depfile" ++ # The first sed program below extracts the file names and escapes ++ # backslashes for cygpath. The second sed program outputs the file ++ # name when reading, but also accumulates all include files in the ++ # hold buffer in order to output them again at the end. This only ++ # works with sed implementations that can handle large buffers. ++ sed < "$tmpdepfile" -n ' ++/^Note: including file: *\(.*\)/ { ++ s//\1/ ++ s/\\/\\\\/g ++ p ++}' | $cygpath_u | sort -u | sed -n ' ++s/ /\\ /g ++s/\(.*\)/'"$tab"'\1 \\/p ++s/.\(.*\) \\/\1:/ ++H ++$ { ++ s/.*/'"$tab"'/ ++ G ++ p ++}' >> "$depfile" ++ echo >> "$depfile" # make sure the fragment doesn't end with a backslash ++ rm -f "$tmpdepfile" ++ ;; ++ ++msvc7msys) ++ # This case exists only to let depend.m4 do its work. It works by ++ # looking at the text of this script. This case will never be run, ++ # since it is checked for above. ++ exit 1 ++ ;; + + #nosideeffect) + # This comment above is used by automake to tell side-effect +@@ -422,7 +580,7 @@ dashmstdout) + shift + fi + +- # Remove `-o $object'. ++ # Remove '-o $object'. + IFS=" " + for arg + do +@@ -442,18 +600,18 @@ dashmstdout) + done + + test -z "$dashmflag" && dashmflag=-M +- # Require at least two characters before searching for `:' ++ # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: +- # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. ++ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | +- sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" ++ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" +- tr ' ' ' +-' < "$tmpdepfile" | \ +-## Some versions of the HPUX 10.20 sed can't process this invocation +-## correctly. Breaking it into two sed invocations is a workaround. +- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" ++ # Some versions of the HPUX 10.20 sed can't process this sed invocation ++ # correctly. Breaking it into two sed invocations is a workaround. ++ tr ' ' "$nl" < "$tmpdepfile" \ ++ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ ++ | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +@@ -503,12 +661,15 @@ makedepend) + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" +- cat < "$tmpdepfile" > "$depfile" +- sed '1,2d' "$tmpdepfile" | tr ' ' ' +-' | \ +-## Some versions of the HPUX 10.20 sed can't process this invocation +-## correctly. Breaking it into two sed invocations is a workaround. +- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" ++ # makedepend may prepend the VPATH from the source file name to the object. ++ # No need to regex-escape $object, excess matching of '.' is harmless. ++ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" ++ # Some versions of the HPUX 10.20 sed can't process the last invocation ++ # correctly. Breaking it into two sed invocations is a workaround. ++ sed '1,2d' "$tmpdepfile" \ ++ | tr ' ' "$nl" \ ++ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ ++ | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +@@ -525,7 +686,7 @@ cpp) + shift + fi + +- # Remove `-o $object'. ++ # Remove '-o $object'. + IFS=" " + for arg + do +@@ -544,10 +705,10 @@ cpp) + esac + done + +- "$@" -E | +- sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ +- -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | +- sed '$ s: \\$::' > "$tmpdepfile" ++ "$@" -E \ ++ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ ++ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ ++ | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" +@@ -579,23 +740,23 @@ msvisualcpp) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") +- set fnord "$@" +- shift +- shift +- ;; ++ set fnord "$@" ++ shift ++ shift ++ ;; + *) +- set fnord "$@" "$arg" +- shift +- shift +- ;; ++ set fnord "$@" "$arg" ++ shift ++ shift ++ ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" +- sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" +- echo " " >> "$depfile" ++ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" ++ echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; +diff --git a/alliance/src/distrib/alliance-fedora.spec b/alliance/src/distrib/alliance-fedora.spec +index 9b1afd1..dd79634 100644 +--- a/alliance/src/distrib/alliance-fedora.spec ++++ b/alliance/src/distrib/alliance-fedora.spec +@@ -109,7 +109,7 @@ sed -i "s|tutorials||" documentation/Makefile.am + sed -i "s|tutorials||" documentation/Makefile.in + sed -i "s|documentation/tutorials/Makefile||" configure* + pushd documentation/tutorials +- # clean unneccessary files ++ # clean unnecessary files + %{__rm} Makefile* + %{__rm} *.pdf + # build documentation +@@ -517,7 +517,7 @@ touch --no-create %{_datadir}/icons/hicolor || : + * Sun Oct 13 2002 Jean-Paul.Chaput + - autoconf m4 macros moved back in the Alliance source tree to avoid + re-declaration on our development computers (on which the macros +- are in teh source tree). ++ are in the source tree). + - Adopt the versioning scheme from czo. + - Try to switch to dynamic libraries. + diff --git a/alliance/src/distrib/etc/alc_env.csh.in b/alliance/src/distrib/etc/alc_env.csh.in index 18a1802..cea6941 100644 --- a/alliance/src/distrib/etc/alc_env.csh.in @@ -29768,6 +36148,81 @@ index ee283b7..a4115f2 100644 fi export MANPATH fi +diff --git a/alliance/src/documentation/alliance-examples/addaccu16/README b/alliance/src/documentation/alliance-examples/addaccu16/README +index 27b6104..c1cb452 100644 +--- a/alliance/src/documentation/alliance-examples/addaccu16/README ++++ b/alliance/src/documentation/alliance-examples/addaccu16/README +@@ -78,13 +78,13 @@ graal_addaccu : Launch the physical layout editor (GRAAL) and display the res + # + + addaccu_e.al : Run the hierarchical netlist extractor (COUGAR) and extracts the netlist with parasitic +- informations (physical parameters are taken in the techno-035.rds file). ++ information (physical parameters are taken in the techno-035.rds file). + This tool generates the extracted netlist addaccu_e.al + + xsch_addaccu_e : Run the schematic viewer (XSCH) on the hierarchical extracted netlist (addaccu_e.al). + + addaccu_et.al : Run the netlist extractor (COUGAR) and extracts the netlist at the transistor level +- with parasitics informations (addaccu_et.al). ++ with parasitics information (addaccu_et.al). + + xsch_addaccu_et : Run the schematic viewer (XSCH) on the extracted transistor netlist (addaccu_et.al). + +diff --git a/alliance/src/documentation/alliance-examples/adder4/README b/alliance/src/documentation/alliance-examples/adder4/README +index 09d9038..8c7a272 100644 +--- a/alliance/src/documentation/alliance-examples/adder4/README ++++ b/alliance/src/documentation/alliance-examples/adder4/README +@@ -10,7 +10,7 @@ This directory contains the VHDL description of an adder 4 bits and + the associated stimuli file, and also a configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +@@ -78,13 +78,13 @@ graal_adder4 : Launch the physical layout editor (GRAAL) and display the resu + # + + adder4_e.al : Run the hierarchical netlist extractor (COUGAR) and extracts the netlist with parasitic +- informations (physical parameters are taken in the techno-035.rds file). ++ information (physical parameters are taken in the techno-035.rds file). + This tool generates the extracted netlist adder4_e.al + + xsch_adder4_e : Run the schematic viewer (XSCH) on the hierarchical extracted netlist (adder4_e.al). + + adder4_et.al : Run the netlist extractor (COUGAR) and extracts the netlist at the transistor level +- with parasitics informations (adder4_et.al). ++ with parasitics information (adder4_et.al). + + xsch_adder4_et : Run the schematic viewer (XSCH) on the extracted transistor netlist (adder4_et.al). + +diff --git a/alliance/src/documentation/alliance-examples/divcas4/README b/alliance/src/documentation/alliance-examples/divcas4/README +index 4c0560a..6acb864 100644 +--- a/alliance/src/documentation/alliance-examples/divcas4/README ++++ b/alliance/src/documentation/alliance-examples/divcas4/README +@@ -10,7 +10,7 @@ This directory contains the VHDL description of an 4 bits divisor and + the associated stimuli file, and also a configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +diff --git a/alliance/src/documentation/alliance-examples/etc/alliance-env.mk b/alliance/src/documentation/alliance-examples/etc/alliance-env.mk +index 11ec3e4..69adf97 100644 +--- a/alliance/src/documentation/alliance-examples/etc/alliance-env.mk ++++ b/alliance/src/documentation/alliance-examples/etc/alliance-env.mk +@@ -3,7 +3,7 @@ + ALLIANCE_TOP ?= /usr/lib/alliance + RUN_IN_SOURCE_TREE ?= False + +-# Standart System binary access paths. ++# Standard System binary access paths. + STANDART_BIN = /usr/local/bin:/usr/bin:/bin + STANDART_PATH = PATH=$(STANDART_BIN); export PATH + diff --git a/alliance/src/documentation/alliance-examples/etc/techno-035.rds b/alliance/src/documentation/alliance-examples/etc/techno-035.rds index 8c78141..746fd27 100644 --- a/alliance/src/documentation/alliance-examples/etc/techno-035.rds @@ -29855,11 +36310,1813 @@ index 38bb0ce..2d890b8 100644 # TABLE CIF_LAYER : ##------------------------------------------------------------------- +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc000.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc000.u +index 098ecad..716c162 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc000.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc000.u +@@ -31,7 +31,7 @@ init: + nop + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc008.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc008.u +index cf4a59a..52c5ee2 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc008.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc008.u +@@ -30,7 +30,7 @@ init: + lw r2 , 0 (r1 ) ; EXCEPTION (segment) + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc009.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc009.u +index ef3da94..63ecf24 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc009.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc009.u +@@ -28,7 +28,7 @@ init: + nop + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc011.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc011.u +index d583aea..e2b608f 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc011.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc011.u +@@ -30,7 +30,7 @@ init: + lh r2 , 1 (r1 ) ; EXCEPTION (alignement) + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc014.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc014.u +index 34ba44a..0804beb 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc014.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc014.u +@@ -30,7 +30,7 @@ init: + nop + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc018.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc018.u +index 213545f..b1779b2 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc018.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc018.u +@@ -30,7 +30,7 @@ init: + nop + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc019.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc019.u +index 0c3c28f..e98f6f9 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc019.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc019.u +@@ -30,7 +30,7 @@ init: + nop + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc021.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc021.u +index fefc44b..ebecbf1 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc021.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc021.u +@@ -30,7 +30,7 @@ init: + nop + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc022.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc022.u +index 9718705..66bc50f 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc022.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc022.u +@@ -30,7 +30,7 @@ init: + nop + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc023.u b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc023.u +index a0b7304..a83cee2 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc023.u ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/exc023.u +@@ -29,7 +29,7 @@ init: + nop + + ; ###--------------------------------------------------------### +- ; # check that the load has faild and the content of the # ++ ; # check that the load has failed and the content of the # + ; # register has not been altered # + ; ###--------------------------------------------------------### + +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/asm/go-bench.sh b/alliance/src/documentation/alliance-examples/mipsR3000/asm/go-bench.sh +index b9724e6..ce5f254 100755 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/asm/go-bench.sh ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/asm/go-bench.sh +@@ -126,7 +126,7 @@ + grep -i "can't open file" $LOG_MSG + fi + +- grep "exception occured" $LOG_RES > /dev/null ++ grep "exception occurred" $LOG_RES > /dev/null + + if [ $? -eq 0 ] ; then + grep "exc" $1.u > /dev/null +@@ -135,7 +135,7 @@ + fi + fi + +- grep "exception occured" $LOG_MSG > /dev/null ++ grep "exception occurred" $LOG_MSG > /dev/null + + if [ $? -eq 0 ] ; then + grep "exc" $1.u > /dev/null +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/sce/mips_dec.vbe b/alliance/src/documentation/alliance-examples/mipsR3000/sce/mips_dec.vbe +index cf385fe..4dac5e0 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/sce/mips_dec.vbe ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/sce/mips_dec.vbe +@@ -222,11 +222,11 @@ begin + severity ERROR; + + assert (not (mips_dadr = X"BFC00000")) +- report "==== reset occured ====" ++ report "==== reset occurred ====" + severity WARNING; + + assert (not (mips_dadr = X"80000080")) +- report "==== exception occured ====" ++ report "==== exception occurred ====" + severity WARNING; + + end FUNCTIONAL; +diff --git a/alliance/src/documentation/alliance-examples/mipsR3000/sce/mips_seq.fsm b/alliance/src/documentation/alliance-examples/mipsR3000/sce/mips_seq.fsm +index ed7b55c..7a4f597 100644 +--- a/alliance/src/documentation/alliance-examples/mipsR3000/sce/mips_seq.fsm ++++ b/alliance/src/documentation/alliance-examples/mipsR3000/sce/mips_seq.fsm +@@ -37,7 +37,7 @@ entity mips_seq is + test : in BIT; -- test + itrqs : in BIT; -- it reqst + adrs : in BIT_VECTOR(1 downto 0); -- adr1 and adr2 +- exrqs : in BIT; -- exeption reqst ++ exrqs : in BIT; -- exception reqst + + ctlopx : out bit_vector(8 DOWNTO 0) ; -- ctlopx + ctlopy : out bit_vector(6 DOWNTO 0) ; -- ctlopy +diff --git a/alliance/src/documentation/alliance-examples/multi4b/README b/alliance/src/documentation/alliance-examples/multi4b/README +index e5eae9d..25e9d88 100644 +--- a/alliance/src/documentation/alliance-examples/multi4b/README ++++ b/alliance/src/documentation/alliance-examples/multi4b/README +@@ -10,7 +10,7 @@ This directory contains the VHDL description of an 4 bits multiplier and + the associated stimuli file, and also a configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +@@ -78,13 +78,13 @@ graal_multi4 : Launch the physical layout editor (GRAAL) and display the resu + # + + multi4_e.al : Run the hierarchical netlist extractor (COUGAR) and extracts the netlist with parasitic +- informations (physical parameters are taken in the techno-035.rds file). ++ information (physical parameters are taken in the techno-035.rds file). + This tool generates the extracted netlist multi4_e.al + + xsch_multi4_e : Run the schematic viewer (XSCH) on the hierarchical extracted netlist (multi4_e.al). + + multi4_et.al : Run the netlist extractor (COUGAR) and extracts the netlist at the transistor level +- with parasitics informations (multi4_et.al). ++ with parasitics information (multi4_et.al). + + xsch_multi4_et : Run the schematic viewer (XSCH) on the extracted transistor netlist (multi4_et.al). + +diff --git a/alliance/src/documentation/alliance-examples/multi8/README b/alliance/src/documentation/alliance-examples/multi8/README +index 7d2aabb..25c38e6 100644 +--- a/alliance/src/documentation/alliance-examples/multi8/README ++++ b/alliance/src/documentation/alliance-examples/multi8/README +@@ -11,7 +11,7 @@ This directory contains hierarchical VHDL descriptions of a synchronous 8 bits m + It contains also the associated stimuli file, and configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +diff --git a/alliance/src/documentation/alliance-examples/multi8b/README b/alliance/src/documentation/alliance-examples/multi8b/README +index d1b8786..a9d44fb 100644 +--- a/alliance/src/documentation/alliance-examples/multi8b/README ++++ b/alliance/src/documentation/alliance-examples/multi8b/README +@@ -10,7 +10,7 @@ This directory contains the VHDL description of combinatorial 8 bits + multiplier and the associated stimuli file, and also a configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +@@ -78,13 +78,13 @@ graal_multi8 : Launch the physical layout editor (GRAAL) and display the resu + # + + multi8_e.al : Run the hierarchical netlist extractor (COUGAR) and extracts the netlist with parasitic +- informations (physical parameters are taken in the techno-035.rds file). ++ information (physical parameters are taken in the techno-035.rds file). + This tool generates the extracted netlist multi8_e.al + + xsch_multi8_e : Run the schematic viewer (XSCH) on the hierarchical extracted netlist (multi8_e.al). + + multi8_et.al : Run the netlist extractor (COUGAR) and extracts the netlist at the transistor level +- with parasitics informations (multi8_et.al). ++ with parasitics information (multi8_et.al). + + xsch_multi8_et : Run the schematic viewer (XSCH) on the extracted transistor netlist (multi8_et.al). + +diff --git a/alliance/src/documentation/alliance-examples/pgcd/README b/alliance/src/documentation/alliance-examples/pgcd/README +index 311597d..23846cd 100644 +--- a/alliance/src/documentation/alliance-examples/pgcd/README ++++ b/alliance/src/documentation/alliance-examples/pgcd/README +@@ -11,7 +11,7 @@ greatest common divisor (with a finite state machine and a data part). + It contains also the associated stimuli file, and configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +diff --git a/alliance/src/documentation/alliance-examples/sqrt32/README b/alliance/src/documentation/alliance-examples/sqrt32/README +index 279ade3..5256b74 100644 +--- a/alliance/src/documentation/alliance-examples/sqrt32/README ++++ b/alliance/src/documentation/alliance-examples/sqrt32/README +@@ -10,7 +10,7 @@ This directory contains the VHDL description of combinatorial 32 bits + sqrt chip and the associated stimuli file, and also a configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +diff --git a/alliance/src/documentation/alliance-examples/sqrt8/README b/alliance/src/documentation/alliance-examples/sqrt8/README +index 83d4a4a..29c3926 100644 +--- a/alliance/src/documentation/alliance-examples/sqrt8/README ++++ b/alliance/src/documentation/alliance-examples/sqrt8/README +@@ -10,9 +10,9 @@ This directory contains the VHDL description of combinatorial 8 bits + sqrt chip and the associated stimuli file, and also a configuration file for IO + placement (used during the Place and Route step). + +-The Makefile set environement variables properly and run Alliance tools, ++The Makefile set environment variables properly and run Alliance tools, + following each step of the design flow from VHDL up to real layout in a + pseudo 0.35 techno. + +-The environement variable ALLIANCE_TOP has to be set. ++The environment variable ALLIANCE_TOP has to be set. + +diff --git a/alliance/src/documentation/alliance-examples/tuner/build_tuner b/alliance/src/documentation/alliance-examples/tuner/build_tuner +index 4e199db..53d6994 100755 +--- a/alliance/src/documentation/alliance-examples/tuner/build_tuner ++++ b/alliance/src/documentation/alliance-examples/tuner/build_tuner +@@ -71,7 +71,7 @@ loon -x 0 -m 0 tuner_x tuner_o + + #Vous pouvez lancer xsch pour voir l'allure de l'ensemble de portes + #Ce n'est pas trs utile, mais ca rassure ! +-#You may lauch xsch to see the way your netlist looks ++#You may launch xsch to see the way your netlist looks + #Not really usefully but sometime pretty. + xsch -l tuner_o + +diff --git a/alliance/src/documentation/alliance-run/README b/alliance/src/documentation/alliance-run/README +index d8b4cdd..c3263e0 100644 +--- a/alliance/src/documentation/alliance-run/README ++++ b/alliance/src/documentation/alliance-run/README +@@ -65,17 +65,17 @@ amd2901_core.c: + * Description of the amd2901 core in genlib format. + Has to be processed by genlib, to create + * amd2901_core.vst: +- * logical description of amd2901 core which instanciates ++ * logical description of amd2901 core which instantiates + amd2901_dpt.vst and amd2901_ctl.vst. + * amd2901_core.ap: +- * physical description of amd2901 core which instanciates ++ * physical description of amd2901 core which instantiates + amd2901_dpt.ap and expand the abutment box in order + to give enough room to place the control part. + amd2901_core.ioc: + * amd2901_core connectors placement description, used by ocp. + amd2901_chip.c: + * amd2901_chip description in genlib format. +- instanciates amd2901_core.vst and the pads from the padlib ++ instantiates amd2901_core.vst and the pads from the padlib + library. + amd2901_chip.rin: + * pads placement file, used by ring. +diff --git a/alliance/src/documentation/design-flow/flow.html b/alliance/src/documentation/design-flow/flow.html +index 43fe51f..ff8f59a 100755 +--- a/alliance/src/documentation/design-flow/flow.html ++++ b/alliance/src/documentation/design-flow/flow.html +@@ -69,7 +69,7 @@ +
    +
  • GENPAT is used to write + digital stimuli. It provides a C +- interface of a set of functions usefull to create stimuli. It ++ interface of a set of functions useful to create stimuli. It + loads a C file describing patterns and run the C compiler. + Finally it generates a stimuli file + (PAT file format). +@@ -273,7 +273,7 @@ + +
      +
    • GENLIB provides a C +- interface of a set of functions usefull to create ++ interface of a set of functions useful to create + a netlist of cells or a physical layout. For example given a cell library, + a simple C function call is enough to create an instance of a cell. + The result is a netlist (or a physical layout) built during the sequential +diff --git a/alliance/src/documentation/design-flow/intro.html b/alliance/src/documentation/design-flow/intro.html +index f9ce0e7..9872427 100755 +--- a/alliance/src/documentation/design-flow/intro.html ++++ b/alliance/src/documentation/design-flow/intro.html +@@ -12,9 +12,9 @@ +
      +
      +
      +-

      Alliance provides a software environement for the development of CAD tools:

      ++

      Alliance provides a software environment for the development of CAD tools:

      +
        +-
      • More than 60 librairies written in C langage. ++
      • More than 60 libraries written in C language. + Those libraries contain the definition of several data structures and methods + allowing to describe circuits from the RTL view up to the physical view. + Thoses data structures covered all the design flow and can be used +@@ -23,7 +23,7 @@ + format.
      • + +
      • More than 650 man pages describing the programming interface of +- those librairies
      • ++ those libraries +
      +
      + +@@ -61,7 +61,7 @@ using Alliance CAD tools + + +
      +-The Alliance CAD system is used in more than 80 Universities all arround the world ++The Alliance CAD system is used in more than 80 Universities all around the world + for teaching and research purposes. + +
      +diff --git a/alliance/src/documentation/design-flow/tools.html b/alliance/src/documentation/design-flow/tools.html +index 8221875..2da3c49 100644 +--- a/alliance/src/documentation/design-flow/tools.html ++++ b/alliance/src/documentation/design-flow/tools.html +@@ -203,7 +203,7 @@ +
    • + +
    • STRENGTH
      +- It has been sucessfully used for years at LIP6 laboratory. ++ It has been successfully used for years at LIP6 laboratory. +
    • + +
    • WEAKNESS
      +@@ -344,7 +344,7 @@ +
        +
      • DESCRIPTION:
        + GENLIB provides a C interface of a set +- of functions usefull to create a netlist of cells or a physical layout. ++ of functions useful to create a netlist of cells or a physical layout. + For example given a cell library, a simple C function call is enough to + create an instance of a cell. The result is a netlist (or a physical + layout) built during the sequential execution of the C source code. +@@ -374,7 +374,7 @@ +
          +
        • DESCRIPTION:
          + GENPAT is used to write digital +- stimuli. It provides a C interface of a set of functions usefull to ++ stimuli. It provides a C interface of a set of functions useful to + create stimuli. It loads a C file describing patterns and run the C + compiler. Finally it generates a stimuli file. + (PAT file format). +@@ -709,7 +709,7 @@ +
        • STRENGTH
          + SYF is a good FSM synthesizer. + It offers most common encoding algorithms and it verifies +- formally some very basic but usefull correctness properties. ++ formally some very basic but useful correctness properties. +
        • + +
        • WEAKNESS
          +diff --git a/alliance/src/documentation/overview/nmx2_y.ps b/alliance/src/documentation/overview/nmx2_y.ps +index a45fee2..8d31b91 100644 +--- a/alliance/src/documentation/overview/nmx2_y.ps ++++ b/alliance/src/documentation/overview/nmx2_y.ps +@@ -4,9 +4,9 @@ + %%Creator: Rps v1.03 with l2p -color -noheader -scale=2.936567 nmx2_y + %SCALE=2.936567 + % = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +-% This is the beginning of the l2p COLOR PostScript dictionnary. ++% This is the beginning of the l2p COLOR PostScript dictionary. + % (If you want to change colors or patterns, this is THE place to do it.) +-% (Remember that you can substitute another PostScript dictionnary.) ++% (Remember that you can substitute another PostScript dictionary.) + %%Pages: 1 1 + %%EndComments + %%BeginPreview: 256 64 1 64 +@@ -300,7 +300,7 @@ h neg 2 w { + %- - - END OF LAYER TRADUCTION - - - + %%EndSetup + +-% This is the end of the l2p COLOR PostScript dictionnary. ++% This is the end of the l2p COLOR PostScript dictionary. + % = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = + %%Page: 1 1 + 1.468284 setlinewidth +diff --git a/alliance/src/documentation/overview/overview.tex b/alliance/src/documentation/overview/overview.tex +index e2430d0..04e7918 100644 +--- a/alliance/src/documentation/overview/overview.tex ++++ b/alliance/src/documentation/overview/overview.tex +@@ -152,7 +152,7 @@ complete \textbf{Alliance} design framework. + Each \textbf{Alliance} tool therefore supports several standard \textbf{VLSI} + description formats : \textbf{SPICE}, \textbf{EDIF}, \textbf{VHDL}, \textbf{CIF}, + \textbf{GDS2}. +-In that respect, the tools ouputs are fully usable under the ++In that respect, the tools outputs are fully usable under the + \textbf{Compass} and \textbf{Cadence Opus} environnement, provided these + tools have the necessary configuration files. + The \textbf{Alliance} tools support a zero-default top-down design +diff --git a/alliance/src/documentation/tutorials/place_and_route/src/amd2901/Makefile b/alliance/src/documentation/tutorials/place_and_route/src/amd2901/Makefile +index a3b92aa..d697322 100644 +--- a/alliance/src/documentation/tutorials/place_and_route/src/amd2901/Makefile ++++ b/alliance/src/documentation/tutorials/place_and_route/src/amd2901/Makefile +@@ -8,11 +8,11 @@ + # \------------------------------------------------------------------/ + # + +-# Standart System binary access paths. ++# Standard System binary access paths. + STANDART_BIN = /usr/local/bin:/usr/bin:/bin + STANDART_PATH = PATH=$(STANDART_BIN); export PATH + +-# Standart Alliance binary access paths. ++# Standard Alliance binary access paths. + ALLIANCE_BIN = $(ALLIANCE_TOP)/bin + + # FitPath Alliance binary access paths. +diff --git a/alliance/src/documentation/tutorials/place_and_route/src/amd2901/amd2901_core.c b/alliance/src/documentation/tutorials/place_and_route/src/amd2901/amd2901_core.c +index 23aae48..ff37b6f 100644 +--- a/alliance/src/documentation/tutorials/place_and_route/src/amd2901/amd2901_core.c ++++ b/alliance/src/documentation/tutorials/place_and_route/src/amd2901/amd2901_core.c +@@ -53,7 +53,7 @@ main() + GENLIB_LOCON("vss", IN ,"vss"); + + +- /* **************** Data-Path Instanciation ***************** */ ++ /* **************** Data-Path Instantiation ***************** */ + + + GENLIB_LOINSE("amd2901_dpt", "amd2901_dpt", +@@ -112,7 +112,7 @@ main() + "vss => vss", 0); + + +- /* ***************** Control Instanciation ****************** */ ++ /* ***************** Control Instantiation ****************** */ + + + GENLIB_LOINSE("amd2901_ctl", "ctl", +diff --git a/alliance/src/documentation/tutorials/simulation/tex/simulation.tex b/alliance/src/documentation/tutorials/simulation/tex/simulation.tex +index 7a7bc19..2b99a40 100644 +--- a/alliance/src/documentation/tutorials/simulation/tex/simulation.tex ++++ b/alliance/src/documentation/tutorials/simulation/tex/simulation.tex +@@ -217,12 +217,12 @@ This directory contains two subdirectories and one Makefile : + + The {\bf ALLIANCE} tools used are : + \begin{itemize}\itemsep=-.8ex +-\item {\bf vasy} : {\bf VHDL} analyzer and convertor. ++\item {\bf vasy} : {\bf VHDL} analyzer and converter. + \item {\bf asimut} : {\bf VHDL} Compiler and Simulator. + \item{\bf genpat} : Procedural generator of stimuli. + \end{itemize} + +-You can obtain the detailed informations on an any ++You can obtain the detailed information on an any + {\bf ALLIANCE} tool by typing the command : + + \begin{commandline} +@@ -365,7 +365,7 @@ Alliance subset. + + The file addaccu4.vhdl is a description of the addaccu circuit, + using classical {\bf VHDL} subset (with process statements, +-IEEE 1164 VHDL types, aritmetic operators etc ...) ++IEEE 1164 VHDL types, arithmetic operators etc ...) + + You can convert this description to the {\bf .vbe} file format using + {\bf VASY}~: +@@ -492,7 +492,7 @@ first part of this Tutorial. The circuit will be describe in two + levels of hierarchy : + + \begin{itemize}\itemsep=-.8ex +-\item The first level will write the circuit like the instanciation of three blocks. ++\item The first level will write the circuit like the instantiation of three blocks. + \item The second level will write each of the three blocks in term + of elementary gates of the standard library. + \end{itemize} +@@ -522,7 +522,7 @@ vectors more consequent (a hundred clock-edges). + However, the writing of the stimuli file directly is a tiresome work. + The tool {\bf genpat} enables you to undertake this work in a + procedural way. The language {\bf genpat} is a subset of " C " functions. +-For more informations on genpat and the functions of the ++For more information on genpat and the functions of the + associated library do not hesitate to use the command: + + \begin{commandline} +@@ -581,7 +581,7 @@ Initially you must write the structural + description file of addaccu. This file will have the extension " + vst " which is the usual extension to indicate a { \bf VHDL } + structural file (Vhdl Structural view). This view will contain the +-instanciation of three independent blocks: ++instantiation of three independent blocks: + + \begin{description}\itemsep=-.8ex + \item[Block 1] : The 4 bits adder. +@@ -633,7 +633,7 @@ adder by their structural views by modifying the {\bf CATAL} file + (by removing the component name ). + + Each block (alu, accu, mux) must now be described like an +-interconnection of elementary gates. The gates which are to instanciate will ++interconnection of elementary gates. The gates which are to instantiate will + be chosen among those available in the library of standard cells { + \bf SXLIB }. For the functionality of the various cells and their + interface, the sxlib man is available. The behavioral +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amd2901/amd2901_core.c b/alliance/src/documentation/tutorials/synthesis/src/amd2901/amd2901_core.c +index b437b14..2487397 100644 +--- a/alliance/src/documentation/tutorials/synthesis/src/amd2901/amd2901_core.c ++++ b/alliance/src/documentation/tutorials/synthesis/src/amd2901/amd2901_core.c +@@ -52,7 +52,7 @@ main() + GENLIB_LOCON("vss", IN ,"vss"); + + +- /* **************** Data-Path Instanciation ***************** */ ++ /* **************** Data-Path Instantiation ***************** */ + + + GENLIB_LOINSE("amd2901_dpt", "dpt", +@@ -111,7 +111,7 @@ main() + "vss => vss", 0); + + +- /* ***************** Control Instanciation ****************** */ ++ /* ***************** Control Instantiation ****************** */ + + + GENLIB_LOINSE("amd2901_ctl", "ctl", +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amd2901/circuit.c b/alliance/src/documentation/tutorials/synthesis/src/amd2901/circuit.c +index 1901622..bd4943e 100644 +--- a/alliance/src/documentation/tutorials/synthesis/src/amd2901/circuit.c ++++ b/alliance/src/documentation/tutorials/synthesis/src/amd2901/circuit.c +@@ -13,7 +13,7 @@ GENLIB_LOCON("s",OUT,"s1"); + GENLIB_LOCON("vdd",IN,"vdd"); + GENLIB_LOCON("vss",IN,"vss"); + +-/* Instanciation of the logical doors */ ++/* Instantiation of the logical doors */ + GENLIB_LOINS("na2_x1","nand2","a1","c1","f1","vdd","vss",0); + GENLIB_LOINS("no2_x1","nor2","b1","e1","g1","vdd","vss",0); + GENLIB_LOINS("o2_x2","or2","d1","f1","h1","vdd","vss",0); +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amd2901/data_path.c b/alliance/src/documentation/tutorials/synthesis/src/amd2901/data_path.c +index 7e0522a..0153a87 100644 +--- a/alliance/src/documentation/tutorials/synthesis/src/amd2901/data_path.c ++++ b/alliance/src/documentation/tutorials/synthesis/src/amd2901/data_path.c +@@ -22,7 +22,7 @@ GENLIB_MACRO(DPGEN_NAND2, "model_nand2_4bits", F_PLACE, 4, 1); + GENLIB_MACRO(DPGEN_OR2, "model_or2_4bits", F_PLACE, 4); + GENLIB_MACRO(DPGEN_ADSB2F, "model_add2_4bits", F_PLACE, 4); + +-/* operators Instanciation */ ++/* operators Instantiation */ + + GENLIB_LOINS("model_nand2_4bits", "model_nand2_4bits", + "v", "v", "v", "v", +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_0.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_0.vbe +index 4c4e50e..3c26c07 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_0.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_0.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_1.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_1.vbe +index a3d6482..db861c4 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_1.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_1.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_10.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_10.vbe +index 1b837e9..f1b943a 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_10.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_10.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_11.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_11.vbe +index 449ab3d..bb4ff99 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_11.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_11.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_12.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_12.vbe +index a8c5397..0be89fa 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_12.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_12.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_13.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_13.vbe +index fc3372c..d39b84a 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_13.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_13.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_14.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_14.vbe +index e25d69a..ab47b34 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_14.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_14.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_15.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_15.vbe +index 78f6d3e..275ba98 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_15.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_15.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_16.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_16.vbe +index fc95e72..6af736f 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_16.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_16.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_17.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_17.vbe +index 8a37405..bb8cac0 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_17.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_17.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_18.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_18.vbe +index 52038f5..0e1acc2 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_18.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_18.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_19.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_19.vbe +index 5ba1aab..a85ba8f 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_19.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_19.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_2.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_2.vbe +index 1ee35c3..204762e 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_2.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_2.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_20.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_20.vbe +index 671c883..0a3aceb 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_20.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_20.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_21.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_21.vbe +index 1b9901b..845ee16 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_21.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_21.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_22.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_22.vbe +index 81d04d3..a431fbb 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_22.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_22.vbe +@@ -345,7 +345,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_23.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_23.vbe +index ffd7688..6db8993 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_23.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_23.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_24.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_24.vbe +index 46b09b0..823c98b 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_24.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_24.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_3.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_3.vbe +index 4a34962..0f9ab07 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_3.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_3.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_4.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_4.vbe +index 70c302f..7bcb9c4 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_4.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_4.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_5.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_5.vbe +index 64b6028..449501d 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_5.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_5.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_6.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_6.vbe +index 0c19eae..af7520c 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_6.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_6.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_7.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_7.vbe +index c594330..323347f 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_7.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_7.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_8.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_8.vbe +index c313e4b..4e15501 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_8.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_8.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_9.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_9.vbe +index f760a47..6531ba8 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_9.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_9.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_ok.vbe b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_ok.vbe +index 5ba1aab..a85ba8f 100755 +--- a/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_ok.vbe ++++ b/alliance/src/documentation/tutorials/synthesis/src/amdbug/amd_ok.vbe +@@ -344,7 +344,7 @@ BEGIN + END BLOCK; + -- + -- +--- Writing RAM adress b ++-- Writing RAM address b + -- + + -- b="0000" +diff --git a/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex b/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex +index bf2fdde..099caee 100755 +--- a/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex ++++ b/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex +@@ -623,7 +623,7 @@ cell. + %----------------------------------------------------- + The netlist must be validated. For that, you have { \bf ASIMUT }, + but also the tool { \bf PROOF } which proceeds to a formal comparison of two behavioral +- descriptions ({ \bf vbe }). The tool { \bf FLATBEH } is usefull to obtain a ++ descriptions ({ \bf vbe }). The tool { \bf FLATBEH } is useful to obtain a + new behavioral file starting from a { \it netlist } + (given a {\bf vbe} file for each leave cells of the hierarchy). + +diff --git a/alliance/src/dreal/src/GRD_error.c b/alliance/src/dreal/src/GRD_error.c +index 1a3a7d0..19d2107 100644 +--- a/alliance/src/dreal/src/GRD_error.c ++++ b/alliance/src/dreal/src/GRD_error.c +@@ -214,11 +214,13 @@ void DrealInitializeErrorMessage( Debug ) + sprintf( DrealAllFileName, "/tmp/%s_all_%d", PACKAGE, getpid() ); + + DrealStreamErr = freopen( DrealErrFileName, "w+", stderr); ++//DrealStreamErr = stderr; + DrealStreamAll = fopen ( DrealAllFileName, "w+" ); + + if ( DrealNormalMode ) + { + DrealStreamOut = freopen( DrealOutFileName, "w+", stdout); ++ //DrealStreamOut = stdout; + } + else + { +diff --git a/alliance/src/druc/man1/druc.1 b/alliance/src/druc/man1/druc.1 +index aa3628b..6e6179a 100644 +--- a/alliance/src/druc/man1/druc.1 ++++ b/alliance/src/druc/man1/druc.1 +@@ -21,9 +21,9 @@ druc \- Design Rule Checker + This tool replace the \fBVERSATIL\fP tool that is not anymore supported. + .br + This manual presents the layout rules for tle \fBALLIANCE\fP symbolic layout approach. +-The rules are described in a technology file defined by the environment variable \fB RDS_TECHNO_NAME\fP (see bellow). ++The rules are described in a technology file defined by the environment variable \fB RDS_TECHNO_NAME\fP (see below). + .br +-The root cell and all the instanciated cells (except the intanciated libraries cells) must be in the current directory. ++The root cell and all the instantiated cells (except the intanciated libraries cells) must be in the current directory. + .br + The default mode of \fBDRuC\fP is (currently) full flat: + it first flatten all the hierarchy in order to obtain a flat, rectangle level description. +@@ -464,7 +464,7 @@ This \fBgds\fP ro \fBcif\fp file contains only rectangles detected in violation. + .ti 8 + - MBK_CATA_LIB - defines the catalog directory. + .HP +-See the corresponding manual pages for further informations. ++See the corresponding manual pages for further information. + .SH EXAMPLE + druc register + .br +diff --git a/alliance/src/exp/doc/exp.1 b/alliance/src/exp/doc/exp.1 +index 5293208..125c30e 100644 +--- a/alliance/src/exp/doc/exp.1 ++++ b/alliance/src/exp/doc/exp.1 +@@ -6,8 +6,8 @@ + .\" Main useful commands + .\" -------------------- + .\" .TH Head and Foot of page +-.\" .SH at the line begining is a Section Header +-.\" .SS at the line begining is a Sub-Section Header ++.\" .SH at the line beginning is a Section Header ++.\" .SS at the line beginning is a Sub-Section Header + .\" .TP allows to present a list of items, the nextline is the title, + .\" the following lines is the corpus shifted of chars. + .\" if is omited, the default value is 7 +@@ -15,9 +15,9 @@ + .\" \fB is for Bold font \fP is to return to Previous font + .\" \fI is to underlined or to change to Italic font + .\" .B .I can be used for Bold or Italic, if place a the line beginning +-.\" .br at the line begining break the line, a blank line put a blank line ++.\" .br at the line beginning break the line, a blank line put a blank line + .\" .nf Begins a Non-Formatted zone where each line-break is put as-is +-.\" .fi Returns to Formatted mode .nf/.fi is usefull for example to draw tables ++.\" .fi Returns to Formatted mode .nf/.fi is useful for example to draw tables + .\" --------------------------------------------------------------------------- + + .SH EXP +@@ -227,7 +227,7 @@ The minimum (resp. maximum) value of its arguments. + .IP \(bu 3 + [min(3.0,12.1)] \fIprint\fP 3.000 + .IP \(bu 3 +-[min('RW_ALU.*')] \fIprint\fP min value of all variables begining by RW_ALU ++[min('RW_ALU.*')] \fIprint\fP min value of all variables beginning by RW_ALU + .RE + + .TP +@@ -301,7 +301,7 @@ one is empty. + WITDH = 2; + LENGTH = 25 ; + ] +-this message is unchanged but all expresions are computed ++this message is unchanged but all expressions are computed + length_div_2 = [LENGTH/2] + length_mul_2 = {LENGTH*2} + result = [max ('leng.*')] +@@ -311,7 +311,7 @@ this message is unchanged but all expresions are computed + .nf + # this is a test file + +-this message is unchanged but all expresions are computed ++this message is unchanged but all expressions are computed + length_div_2 = 12.500 + length_mul_2 = 50 + result = 12.500 +diff --git a/alliance/src/exp/src/ht.c b/alliance/src/exp/src/ht.c +index 8e647bd..3c610d6 100644 +--- a/alliance/src/exp/src/ht.c ++++ b/alliance/src/exp/src/ht.c +@@ -22,13 +22,13 @@ htelt_t *eltadd (htelt_t * list, char *key) + } + else if ((new_elt = malloc (sizeof (htelt_t))) == NULL) + { +- perror ("add elt in dictionnary"); ++ perror ("add elt in dictionary"); + exit (1); + } + if (key) + if ((new_elt->KEY = strdup (key)) == NULL) + { +- perror ("add elt in dictionnary"); ++ perror ("add elt in dictionary"); + exit (1); + } + new_elt->NEXT = list; +@@ -147,7 +147,7 @@ static long hash (ht_t * ht, char *key) + + if (ht == NULL) + { +- fprintf (stderr, "dictionnary not allocated\n"); ++ fprintf (stderr, "dictionary not allocated\n"); + exit (1); + } + if ((key == NULL) || (length == 0)) +diff --git a/alliance/src/fmi/man1/fmi.1 b/alliance/src/fmi/man1/fmi.1 +index df7670f..c66d870 100644 +--- a/alliance/src/fmi/man1/fmi.1 ++++ b/alliance/src/fmi/man1/fmi.1 +@@ -11,7 +11,7 @@ fmi + .SH DESCRIPTION + .br + Made to run on FSM descriptions, \fBfmi\fP supports the same subset of VHDL as syf +-(for further informations about this subset see SYF(1) and FSM(5)). ++(for further information about this subset see SYF(1) and FSM(5)). + \fBfmi\fP uses a Reduced Ordered Binary Decision Diagrams representation and + identifies equivalent states. + After this step, it drives a new FSM where all equivalent states are replaced +@@ -29,7 +29,7 @@ The default value is the current directory. + .br + .HP + .ti 7 +-\fIMBK_CATA_LIB\fP gives some auxiliary pathes for the FSM descriptions. ++\fIMBK_CATA_LIB\fP gives some auxiliary paths for the FSM descriptions. + The default value is the current directory. + .SH OPTIONS + .ti 7 +diff --git a/alliance/src/fsm/man5/fsm.5 b/alliance/src/fsm/man5/fsm.5 +index e5f40ad..6ac0a21 100644 +--- a/alliance/src/fsm/man5/fsm.5 ++++ b/alliance/src/fsm/man5/fsm.5 +@@ -36,7 +36,7 @@ For the scan-path, three more signals are required : + - scan_out: out bit + .RE + .br +-For a ROM implementation, the vdd and vss signals must be explicitely declared as : ++For a ROM implementation, the vdd and vss signals must be explicitly declared as : + .RS + .br + - rom_vdd : in bit +@@ -50,7 +50,7 @@ The '-P' option of \fBsyf\fP(1) allows scan-path implementation. + Pragmas : + .br + .RS +-A pragma is a comment that gives necessary informations to the synthesis and formal ++A pragma is a comment that gives necessary information to the synthesis and formal + proof tools. + .br + +@@ -99,7 +99,7 @@ The last ones for ROM implementation + Two different processes are used : The first process, called state process, + allows to describe state transition and outputs generation. + It is not controlled by the clock. +-The second process is controlled by the clock and descibes the state ++The second process is controlled by the clock and describes the state + register and stack registers modifications. + .br + State process sensitivity list contains inputs and CURRENT_STATE, it means +@@ -236,7 +236,7 @@ end auto; + .SH MULTI FSM EXAMPLE + .br + It is possible to describe in the same description two or more FSM +-communicating each others throw internal signals as shown bellow. ++communicating each others throw internal signals as shown below. + It is also possible to incorporate concurrent statements using VBE(5) + VHDL coding style. + .nf +diff --git a/alliance/src/fsp/man1/fsp.1 b/alliance/src/fsp/man1/fsp.1 +index f7dcf93..704370f 100644 +--- a/alliance/src/fsp/man1/fsp.1 ++++ b/alliance/src/fsp/man1/fsp.1 +@@ -11,7 +11,7 @@ fsp + .SH DESCRIPTION + .br + Made to run on FSM descriptions, \fBfsp\fP supports the same subset of VHDL as syf +-(for further informations about this subset see SYF(1) and FSM(5)). ++(for further information about this subset see SYF(1) and FSM(5)). + \fBfsp\fP uses a Reduced Ordered Binary Decision Diagrams representation and + computes the product of the two FSM descriptions. + After this step, it explores the resulting FSM product and proves formally the equivalence +@@ -27,7 +27,7 @@ The default value is the current directory. + .br + .HP + .ti 7 +-\fIMBK_CATA_LIB\fP gives some auxiliary pathes for the FSM descriptions. ++\fIMBK_CATA_LIB\fP gives some auxiliary paths for the FSM descriptions. + The default value is the current directory. + .SH OPTIONS + .ti 7 +diff --git a/alliance/src/genlib/doc/genlib/man_dpgen_nand2mask.html b/alliance/src/genlib/doc/genlib/man_dpgen_nand2mask.html +index 9ce9235..172823e 100644 +--- a/alliance/src/genlib/doc/genlib/man_dpgen_nand2mask.html ++++ b/alliance/src/genlib/doc/genlib/man_dpgen_nand2mask.html +@@ -191,7 +191,7 @@ CLASS="EMPHASIS" + CLASS="EMPHASIS" + >ANDed with the mask +- (suplied by constVal). +diff --git a/alliance/src/genlib/doc/genlib/man_dpgen_nor2mask.html b/alliance/src/genlib/doc/genlib/man_dpgen_nor2mask.html +index ed42ff8..925b9a9 100644 +--- a/alliance/src/genlib/doc/genlib/man_dpgen_nor2mask.html ++++ b/alliance/src/genlib/doc/genlib/man_dpgen_nor2mask.html +@@ -191,7 +191,7 @@ CLASS="EMPHASIS" + CLASS="EMPHASIS" + >ORed
          with the mask +- (suplied by constVal). +diff --git a/alliance/src/genlib/doc/genlib/man_dpgen_xnor2mask.html b/alliance/src/genlib/doc/genlib/man_dpgen_xnor2mask.html +index 5755ff4..a969082 100644 +--- a/alliance/src/genlib/doc/genlib/man_dpgen_xnor2mask.html ++++ b/alliance/src/genlib/doc/genlib/man_dpgen_xnor2mask.html +@@ -191,7 +191,7 @@ CLASS="EMPHASIS" + CLASS="EMPHASIS" + >XORed with the mask +- (suplied by constVal). +diff --git a/alliance/src/genlib/doc/genlib/man_genlib.html b/alliance/src/genlib/doc/genlib/man_genlib.html +index 1da471e..f593896 100644 +--- a/alliance/src/genlib/doc/genlib/man_genlib.html ++++ b/alliance/src/genlib/doc/genlib/man_genlib.html +@@ -331,7 +331,7 @@ CLASS="EMPHASIS" +

          The symbolic objects are segments (wires), vias (contacts), +- connectors (I/Os), references and instances. For more informations, ++ connectors (I/Os), references and instances. For more information, + see +

        + +- See the corresponding manual pages for further informations. ++ See the corresponding manual pages for further information. +

        In order to compile and execute a genlib source file. + The source file must have a .c extension, but the extension should +- not be mentionned on the command line. ++ not be mentioned on the command line. +

        The names used in genlib, as arguments to genlib functions, +@@ -1007,7 +1007,7 @@ CLASS="EMPHASIS" + > [--keep-log|-l] : do not erase the log file after a successfull ++> : do not erase the log file after a successful + completion (the log is keeped after a faulty run). +

      • if the &cmd; signal is set to &one;, the mask IS + applied, the output is the complemented + result of the input value ANDed with the mask +- (suplied by &constVal;). ++ (supplied by &constVal;). + + + +diff --git a/alliance/src/genlib/doc/man_dpgen_nor2mask.sgm b/alliance/src/genlib/doc/man_dpgen_nor2mask.sgm +index c2d2efd..14341a7 100644 +--- a/alliance/src/genlib/doc/man_dpgen_nor2mask.sgm ++++ b/alliance/src/genlib/doc/man_dpgen_nor2mask.sgm +@@ -45,7 +45,7 @@ + if the &cmd; signal is set to &one;, the mask IS + applied, the output is the complemented + result of the input value ORed with the mask +- (suplied by &constVal;). ++ (supplied by &constVal;). + + + +diff --git a/alliance/src/genlib/doc/man_dpgen_xnor2mask.sgm b/alliance/src/genlib/doc/man_dpgen_xnor2mask.sgm +index e88a5e0..c623dd2 100644 +--- a/alliance/src/genlib/doc/man_dpgen_xnor2mask.sgm ++++ b/alliance/src/genlib/doc/man_dpgen_xnor2mask.sgm +@@ -45,7 +45,7 @@ + if the &cmd; signal is set to &one;, the mask IS + applied, the output is the complemented + result of the input value XORed with the mask +- (suplied by &constVal;). ++ (supplied by &constVal;). + + + +diff --git a/alliance/src/genlib/doc/man_genlib.sgm b/alliance/src/genlib/doc/man_genlib.sgm +index 8399e9d..5a1e112 100644 +--- a/alliance/src/genlib/doc/man_genlib.sgm ++++ b/alliance/src/genlib/doc/man_genlib.sgm +@@ -145,7 +145,7 @@ + compaction). + + The symbolic objects are segments (wires), vias (contacts), +- connectors (I/Os), references and instances. For more informations, ++ connectors (I/Os), references and instances. For more information, + see + phseg + 1, +@@ -474,12 +474,12 @@ + + + --> +- See the corresponding manual pages for further informations. ++ See the corresponding manual pages for further information. + + In order to compile and execute a &genlib; file, one has to + call &genlib; with one argument, that is the &genlib; source file. + The source file must have a .c extension, but the extension should +- not be mentionned on the command line. ++ not be mentioned on the command line. + + The names used in genlib, as arguments to genlib functions, + should be alphanumerical, including the underscore. They also are not +@@ -534,7 +534,7 @@ + + + +- &arg-keep-log; : do not erase the log file after a successfull ++ &arg-keep-log; : do not erase the log file after a successful + completion (the log is keeped after a faulty run). + + +diff --git a/alliance/src/genlib/man1/genlib.1 b/alliance/src/genlib/man1/genlib.1 +index 7aa4156..5ba22e9 100644 +--- a/alliance/src/genlib/man1/genlib.1 ++++ b/alliance/src/genlib/man1/genlib.1 +@@ -84,7 +84,7 @@ procedural layout. In order to provide some process independance, + compaction). + .PP + The symbolic objects are segments (wires), vias (contacts), +-connectors (I/Os), references and instances. For more informations, ++connectors (I/Os), references and instances. For more information, + see + \fBphseg\fR(1), + \fBphvia\fR(1), +@@ -241,12 +241,12 @@ default value : \&. + \(bu + \fBMBK_CATAL_NAME\fR(1), + default value : CATAL +-See the corresponding manual pages for further informations. ++See the corresponding manual pages for further information. + .PP + In order to compile and execute a \fBgenlib\fR file, one has to + call \fBgenlib\fR with one argument, that is the \fBgenlib\fR source file. + The source file must have a .c extension, but the extension should +-not be mentionned on the command line. ++not be mentioned on the command line. + .PP + The names used in genlib, as arguments to genlib functions, + should be alphanumerical, including the underscore. They also are not +@@ -278,7 +278,7 @@ after execution. + \fBgenlib\fR run. + .TP 0.2i + \(bu +-[--keep-log|-l] : do not erase the log file after a successfull ++[--keep-log|-l] : do not erase the log file after a successful + completion (the log is keeped after a faulty run). + .TP 0.2i + \(bu +diff --git a/alliance/src/genlib/man3/DPGEN_NAND2MASK.3 b/alliance/src/genlib/man3/DPGEN_NAND2MASK.3 +index 354f295..04890c9 100644 +--- a/alliance/src/genlib/man3/DPGEN_NAND2MASK.3 ++++ b/alliance/src/genlib/man3/DPGEN_NAND2MASK.3 +@@ -27,7 +27,7 @@ applied, so the whole operator behave like an inverter. + if the cmd signal is set to \&'1', the mask IS + applied, the output is the \fBcomplemented\fR + result of the input value \fBANDed\fR with the mask +-(suplied by \fIconstVal\fR). ++(supplied by \fIconstVal\fR). + .PP + The constant \fIconstVal\fR is given to the macro-generator + call, therefore the value cannot be changed afterward : it's +diff --git a/alliance/src/genlib/man3/DPGEN_NOR2MASK.3 b/alliance/src/genlib/man3/DPGEN_NOR2MASK.3 +index 8c551d4..87155ef 100644 +--- a/alliance/src/genlib/man3/DPGEN_NOR2MASK.3 ++++ b/alliance/src/genlib/man3/DPGEN_NOR2MASK.3 +@@ -27,7 +27,7 @@ applied, so the whole operator behave like an inverter. + if the cmd signal is set to \&'1', the mask IS + applied, the output is the \fBcomplemented\fR + result of the input value \fBORed\fR with the mask +-(suplied by \fIconstVal\fR). ++(supplied by \fIconstVal\fR). + .PP + The constant \fIconstVal\fR is given to the macro-generator + call, therefore the value cannot be changed afterward : it's +diff --git a/alliance/src/genlib/man3/DPGEN_XNOR2MASK.3 b/alliance/src/genlib/man3/DPGEN_XNOR2MASK.3 +index 9c4e5e0..97081cd 100644 +--- a/alliance/src/genlib/man3/DPGEN_XNOR2MASK.3 ++++ b/alliance/src/genlib/man3/DPGEN_XNOR2MASK.3 +@@ -27,7 +27,7 @@ applied, so the whole operator behave like an inverter. + if the cmd signal is set to \&'1', the mask IS + applied, the output is the \fBcomplemented\fR + result of the input value \fBXORed\fR with the mask +-(suplied by \fIconstVal\fR). ++(supplied by \fIconstVal\fR). + .PP + The constant \fIconstVal\fR is given to the macro-generator + call, therefore the value cannot be changed afterward : it's +diff --git a/alliance/src/genlib/man3/GENLIB_BUS.3 b/alliance/src/genlib/man3/GENLIB_BUS.3 +index bd458a5..242082c 100644 +--- a/alliance/src/genlib/man3/GENLIB_BUS.3 ++++ b/alliance/src/genlib/man3/GENLIB_BUS.3 +@@ -9,7 +9,7 @@ GENLIB_BUS + .TH GENLIB_BUS.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_BUS \- Creates a bus name for netlist +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -43,7 +43,7 @@ They are: + \fBLOCON\fP(3) + .RE + The \fIfrom, to\fP arguments give the boundaries of the bus to be created, +-both of them beeing included in the set. The function allows increasing or ++both of them being included in the set. The function allows increasing or + decreasing order busses, as one could expect. + .br + This function has a constant equivalent, it means that if the \fIfrom, to\fP +diff --git a/alliance/src/genlib/man3/GENLIB_COPY_UP_ALL_CON.3 b/alliance/src/genlib/man3/GENLIB_COPY_UP_ALL_CON.3 +index 0782744..3c05646 100644 +--- a/alliance/src/genlib/man3/GENLIB_COPY_UP_ALL_CON.3 ++++ b/alliance/src/genlib/man3/GENLIB_COPY_UP_ALL_CON.3 +@@ -10,7 +10,7 @@ GENLIB_COPY_UP_ALL_CON + .SH NAME + GENLIB_COPY_UP_ALL_CON \- copy all physical connectors of an instance face in the + current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -32,7 +32,7 @@ Face of the instance + Name of the instance the connector belongs to + .TP + \fIconcatenate\fP +-Indicates wheter or not to concatenate instance connectors names with instance ++Indicates whether or not to concatenate instance connectors names with instance + name + .SH DESCRIPTION + \fBCOPY_UP_ALL_CON\fP copies all instance connectors of the face \fIface\fP of +diff --git a/alliance/src/genlib/man3/GENLIB_COPY_UP_ALL_REF.3 b/alliance/src/genlib/man3/GENLIB_COPY_UP_ALL_REF.3 +index 6dc5f22..f44bcdb 100644 +--- a/alliance/src/genlib/man3/GENLIB_COPY_UP_ALL_REF.3 ++++ b/alliance/src/genlib/man3/GENLIB_COPY_UP_ALL_REF.3 +@@ -10,7 +10,7 @@ GENLIB_COPY_UP_ALL_REF + .SH NAME + GENLIB_COPY_UP_ALL_REF \- copy a several physical reference from an instance + in the current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_COPY_UP_CON.3 b/alliance/src/genlib/man3/GENLIB_COPY_UP_CON.3 +index bd921e7..f7cecc2 100644 +--- a/alliance/src/genlib/man3/GENLIB_COPY_UP_CON.3 ++++ b/alliance/src/genlib/man3/GENLIB_COPY_UP_CON.3 +@@ -10,7 +10,7 @@ GENLIB_COPY_UP_CON + .SH NAME + GENLIB_COPY_UP_CON \- copy a physical connector from an instance in the + current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_COPY_UP_CON_FACE.3 b/alliance/src/genlib/man3/GENLIB_COPY_UP_CON_FACE.3 +index 4825199..2a43e84 100644 +--- a/alliance/src/genlib/man3/GENLIB_COPY_UP_CON_FACE.3 ++++ b/alliance/src/genlib/man3/GENLIB_COPY_UP_CON_FACE.3 +@@ -10,7 +10,7 @@ GENLIB_COPY_UP_CON_FACE + .SH NAME + GENLIB_COPY_UP_CON_FACE \- copy a physical connector from an instance in the + current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_COPY_UP_REF.3 b/alliance/src/genlib/man3/GENLIB_COPY_UP_REF.3 +index 019afa6..83fd684 100644 +--- a/alliance/src/genlib/man3/GENLIB_COPY_UP_REF.3 ++++ b/alliance/src/genlib/man3/GENLIB_COPY_UP_REF.3 +@@ -10,7 +10,7 @@ GENLIB_COPY_UP_REF + .SH NAME + GENLIB_COPY_UP_REF \- copy a physical reference from an instance in the current + figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_COPY_UP_SEG.3 b/alliance/src/genlib/man3/GENLIB_COPY_UP_SEG.3 +index 5379d87..eec17eb 100644 +--- a/alliance/src/genlib/man3/GENLIB_COPY_UP_SEG.3 ++++ b/alliance/src/genlib/man3/GENLIB_COPY_UP_SEG.3 +@@ -10,7 +10,7 @@ GENLIB_COPY_UP_SEG + .SH NAME + GENLIB_COPY_UP_SEG \- copy a physical segment from an instance in the current + figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_DEF_AB.3 b/alliance/src/genlib/man3/GENLIB_DEF_AB.3 +index d448f85..756680a 100644 +--- a/alliance/src/genlib/man3/GENLIB_DEF_AB.3 ++++ b/alliance/src/genlib/man3/GENLIB_DEF_AB.3 +@@ -9,7 +9,7 @@ GENLIB_DEF_AB + .TH GENLIB_DEF_AB.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_DEF_AB \- define a new \fIabutment box\fP to the current layout cell +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_DEF_LOFIG.3 b/alliance/src/genlib/man3/GENLIB_DEF_LOFIG.3 +index 3499343..6816a1e 100644 +--- a/alliance/src/genlib/man3/GENLIB_DEF_LOFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_DEF_LOFIG.3 +@@ -9,7 +9,7 @@ GENLIB_DEF_LOFIG + .TH GENLIB_DEF_LOFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_DEF_LOFIG \- open a netlist model as current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,7 +29,7 @@ Name of the cell which all futher calls to genlib logical functions will work on + \fBDEF_LOFIG\fP defines the current working structural figure by it's name, + the \fIcellname\fP argument. It can be use anywhere in the \fBgenlib\fP + program, but must appear at least once at the top of it, since it also +-initalize the user's preferences through environment variables. ++initialize the user's preferences through environment variables. + .br + If the figure called cellname doesn't exists in memory, it is created. + If it already exists in memory, it makes it the current working figure. +diff --git a/alliance/src/genlib/man3/GENLIB_DEF_PHFIG.3 b/alliance/src/genlib/man3/GENLIB_DEF_PHFIG.3 +index f5f9afb..915e093 100644 +--- a/alliance/src/genlib/man3/GENLIB_DEF_PHFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_DEF_PHFIG.3 +@@ -9,7 +9,7 @@ GENLIB_DEF_PHFIG + .TH GENLIB_DEF_PHFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_DEF_PHFIG \- open a layout model as current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,7 +29,7 @@ Name of the cell which all futher calls to genlib physical functions will work o + \fBDEF_PHFIG\fP defines the current physical working figure by it's name, + the \fIcellname\fP argument. It can be use anywhere in the \fBgenlib\fP + program, but must appear at least once at the top of it, since it also +-initalize the user's preferences through environment variables. ++initialize the user's preferences through environment variables. + .br + If the figure called cellname doesn't exists in memory, it is created. + If it already exists in memory, it makes it the current working figure. +diff --git a/alliance/src/genlib/man3/GENLIB_DEF_PHINS.3 b/alliance/src/genlib/man3/GENLIB_DEF_PHINS.3 +index 398e2e6..a7e7e30 100644 +--- a/alliance/src/genlib/man3/GENLIB_DEF_PHINS.3 ++++ b/alliance/src/genlib/man3/GENLIB_DEF_PHINS.3 +@@ -9,7 +9,7 @@ GENLIB_DEF_PHINS + .TH GENLIB_DEF_PHINS.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_DEF_PHINS \- define a new reference instance +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ Defines the instance called \fIinstancename\fP as the new "reference instance" + in the relative placement functions of genlib. It's regarding the \fBabutment + box\fP of the instance \fIinstancename\fP that the next instance is going to be + placed, if using the appropriate functions. Notice that the more recently +-placed instance becomes automaticaly the "reference instance", if ++placed instance becomes automatically the "reference instance", if + \fBDEF_PHINS\fP isn't called. + .SH ERRORS + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_DEF_PHSC.3 b/alliance/src/genlib/man3/GENLIB_DEF_PHSC.3 +index b5b18c3..608671e 100644 +--- a/alliance/src/genlib/man3/GENLIB_DEF_PHSC.3 ++++ b/alliance/src/genlib/man3/GENLIB_DEF_PHSC.3 +@@ -9,7 +9,7 @@ GENLIB_DEF_PHSC + .TH GENLIB_DEF_PHSC.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_DEF_PHSC \- load a netlist and open a layout model as current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -31,7 +31,7 @@ futher physical placement. + the \fIcellname\fP argument, for layout and netlist operations. + It can be use anywhere in the \fBgenlib\fP + program, but must appear at least once at the top of it, since it also +-initalize the user's preferences through environment variables. ++initialize the user's preferences through environment variables. + .br + \fBDEF_PHSC\fP looks for the netlist figure \fIcellname\fP in memory, and if + not found, on disk. If it fails, an error occurs and the process terminates. +diff --git a/alliance/src/genlib/man3/GENLIB_ELM.3 b/alliance/src/genlib/man3/GENLIB_ELM.3 +index 74d3e76..9f714cd 100644 +--- a/alliance/src/genlib/man3/GENLIB_ELM.3 ++++ b/alliance/src/genlib/man3/GENLIB_ELM.3 +@@ -9,7 +9,7 @@ GENLIB_ELM + .TH GENLIB_ELM.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_ELM \- Creates a single element bus name for netlist +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_FLATTEN_ALL_LOINS.3 b/alliance/src/genlib/man3/GENLIB_FLATTEN_ALL_LOINS.3 +index 3325247..2e9a87f 100644 +--- a/alliance/src/genlib/man3/GENLIB_FLATTEN_ALL_LOINS.3 ++++ b/alliance/src/genlib/man3/GENLIB_FLATTEN_ALL_LOINS.3 +@@ -9,7 +9,7 @@ GENLIB_FLATTEN_ALL_LOINS + .TH GENLIB_FLATTEN_ALL_LOINS.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_FLATTEN_ALL_LOINS \- flatten all instances in the current netlist figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -31,7 +31,7 @@ Indicate whether or not to look in the catalog file before flattening a cell + \fBFLATTEN_ALL_LOINS\fP inserts the contents of all the instances of the + current figure in the current figure. + All these instances are destroyed during the process, and therefore cannot be +-refered to later in the netlist description. ++referred to later in the netlist description. + .br + The \fIconcat\fP parameter may take two values: + .TP +diff --git a/alliance/src/genlib/man3/GENLIB_FLATTEN_ALL_PHINS.3 b/alliance/src/genlib/man3/GENLIB_FLATTEN_ALL_PHINS.3 +index 6329824..5b07968 100644 +--- a/alliance/src/genlib/man3/GENLIB_FLATTEN_ALL_PHINS.3 ++++ b/alliance/src/genlib/man3/GENLIB_FLATTEN_ALL_PHINS.3 +@@ -9,7 +9,7 @@ GENLIB_FLATTEN_ALL_PHINS + .TH GENLIB_FLATTEN_ALL_PHINS.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_FLATTEN_ALL_PHINS \- flatten all instances in the current layout figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -32,7 +32,7 @@ Indicate whether or not to look in the catalog file before flattening a cell + \fBFLATTEN_ALL_PHINS\fP inserts the contents of all the instances of the + current figure in the current figure. + All these instances are destroyed during the process, and therefore cannot be +-refered to later in the layout description. ++referred to later in the layout description. + .br + The \fIconcat\fP parameter may take two values: + .TP +diff --git a/alliance/src/genlib/man3/GENLIB_FLATTEN_LOFIG.3 b/alliance/src/genlib/man3/GENLIB_FLATTEN_LOFIG.3 +index 9d5bcd3..8c5a296 100644 +--- a/alliance/src/genlib/man3/GENLIB_FLATTEN_LOFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_FLATTEN_LOFIG.3 +@@ -9,7 +9,7 @@ GENLIB_FLATTEN_LOFIG + .TH GENLIB_FLATTEN_LOFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_FLATTEN_LOFIG \- flatten an instance in the current netlist figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_FLATTEN_PHFIG.3 b/alliance/src/genlib/man3/GENLIB_FLATTEN_PHFIG.3 +index 3b14cea..e143332 100644 +--- a/alliance/src/genlib/man3/GENLIB_FLATTEN_PHFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_FLATTEN_PHFIG.3 +@@ -9,7 +9,7 @@ GENLIB_FLATTEN_PHFIG + .TH GENLIB_FLATTEN_PHFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_FLATTEN_PHFIG \- flatten an instance in the current layout figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_GET_CON_X.3 b/alliance/src/genlib/man3/GENLIB_GET_CON_X.3 +index c48c9ea..e5703cb 100644 +--- a/alliance/src/genlib/man3/GENLIB_GET_CON_X.3 ++++ b/alliance/src/genlib/man3/GENLIB_GET_CON_X.3 +@@ -9,7 +9,7 @@ GENLIB_GET_CON_X + .TH GENLIB_GET_CON_X.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_GET_CON_X \- retrieve the x coordinate of an instance connector +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -37,7 +37,7 @@ the connector, \fIconname\fP, in the instance called \fIinsname\fP. + Then it computes its absolute coordinates in the figure, and gives back the + x coordinate. + .SH RETURN VALUE +-The function returns a long int beeing the x position of the connector ++The function returns a long int being the x position of the connector + in the current figure + .SH ERRORS + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_GET_CON_Y.3 b/alliance/src/genlib/man3/GENLIB_GET_CON_Y.3 +index 1920be5..c66d052 100644 +--- a/alliance/src/genlib/man3/GENLIB_GET_CON_Y.3 ++++ b/alliance/src/genlib/man3/GENLIB_GET_CON_Y.3 +@@ -9,7 +9,7 @@ GENLIB_GET_CON_Y + .TH GENLIB_GET_CON_Y.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_GET_CON_Y \- retrieve the x coordinate of an instance connector +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -37,7 +37,7 @@ the connector, \fIconname\fP, in the instance called \fIinsname\fP. + Then it computes its absolute coordinates in the figure, and gives back the + y coordinate. + .SH RETURN VALUE +-The function returns a long int beeing the y position of the connector ++The function returns a long int being the y position of the connector + in the current figure + .SH ERRORS + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_GET_INS_X.3 b/alliance/src/genlib/man3/GENLIB_GET_INS_X.3 +index 373f3b9..fee9832 100644 +--- a/alliance/src/genlib/man3/GENLIB_GET_INS_X.3 ++++ b/alliance/src/genlib/man3/GENLIB_GET_INS_X.3 +@@ -9,7 +9,7 @@ GENLIB_GET_INS_X + .TH GENLIB_GET_INS_X.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_GET_INS_X \- retrieve the x coordinate of an instance +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ the instance called \fIinsname\fP in the current figure. + Then it computes its absolute coordinates in the figure, and gives back its + x coordinate. + .SH RETURN VALUE +-The function returns a long int beeing the x position of the instance ++The function returns a long int being the x position of the instance + in the current figure + .SH ERRORS + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_GET_INS_Y.3 b/alliance/src/genlib/man3/GENLIB_GET_INS_Y.3 +index dbdb560..3a3cbe6 100644 +--- a/alliance/src/genlib/man3/GENLIB_GET_INS_Y.3 ++++ b/alliance/src/genlib/man3/GENLIB_GET_INS_Y.3 +@@ -9,7 +9,7 @@ GENLIB_GET_INS_Y + .TH GENLIB_GET_INS_Y.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_GET_INS_Y \- retrieve the y coordinate of an instance +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ the instance called \fIinsname\fP in the current figure. + Then it computes its absolute coordinates in the figure, and gives back its + y coordinate. + .SH RETURN VALUE +-The function returns a long int beeing the y position of the instance ++The function returns a long int being the y position of the instance + in the current figure + .SH ERRORS + .if n \{\ diff --git a/alliance/src/genlib/man3/GENLIB_GET_REF_X.3 b/alliance/src/genlib/man3/GENLIB_GET_REF_X.3 -index e274b98..e64064e 100644 +index e274b98..dfbc8ec 100644 --- a/alliance/src/genlib/man3/GENLIB_GET_REF_X.3 +++ b/alliance/src/genlib/man3/GENLIB_GET_REF_X.3 -@@ -27,7 +27,7 @@ Name of the instance in the which the reference is to be searched for +@@ -9,7 +9,7 @@ GENLIB_GET_REF_X + .TH GENLIB_GET_REF_X.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_GET_REF_X \- retrieve the x coordinate of an instance reference +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -27,11 +27,11 @@ Name of the instance in the which the reference is to be searched for .TP \fIrefname\fP Name of the reference @@ -29868,8 +38125,5066 @@ index e274b98..e64064e 100644 \fBGET_REF_X\fP looks for the reference, \fIrefname\fP, in the instance called \fIinsname\fP. .SH RETURN VALUE +-The function returns a long int beeing the x position of the reference ++The function returns a long int being the x position of the reference + in the current figure + .SH ERRORS + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_GET_REF_Y.3 b/alliance/src/genlib/man3/GENLIB_GET_REF_Y.3 +index bfd43d6..f0c7549 100644 +--- a/alliance/src/genlib/man3/GENLIB_GET_REF_Y.3 ++++ b/alliance/src/genlib/man3/GENLIB_GET_REF_Y.3 +@@ -9,7 +9,7 @@ GENLIB_GET_REF_Y + .TH GENLIB_GET_REF_Y.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_GET_REF_Y \- retrieve the y coordinate of an instance reference +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -33,7 +33,7 @@ the reference, \fIrefname\fP, in the instance called \fIinsname\fP. + Then it computes its absolute coordinates in the figure, and gives back the + y coordinate. + .SH RETURN VALUE +-The function returns a long int beeing the y position of the reference ++The function returns a long int being the y position of the reference + in the current figure + .SH ERRORS + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_HEIGHT.3 b/alliance/src/genlib/man3/GENLIB_HEIGHT.3 +index 3af692b..9d23978 100644 +--- a/alliance/src/genlib/man3/GENLIB_HEIGHT.3 ++++ b/alliance/src/genlib/man3/GENLIB_HEIGHT.3 +@@ -9,7 +9,7 @@ GENLIB_HEIGHT + .TH GENLIB_HEIGHT.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_HEIGHT \- compute the height of a model +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ Name of the cell which height is needed + disk. When found, the figure \fIabutment box\fP height is calculated, and + returned. + .SH RETURN VALUE +-\fIHEIGHT\fP returns a long int beeing the cell \fIabutment box\fP height. ++\fIHEIGHT\fP returns a long int being the cell \fIabutment box\fP height. + .SH EXAMPLE + .nf + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_LOAD_LOFIG.3 b/alliance/src/genlib/man3/GENLIB_LOAD_LOFIG.3 +index 8bcaec0..d318b9a 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOAD_LOFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOAD_LOFIG.3 +@@ -9,7 +9,7 @@ GENLIB_LOAD_LOFIG + .TH GENLIB_LOAD_LOFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LOAD_LOFIG \- loads a netlist form disk and opens it as current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_LOAD_PHFIG.3 b/alliance/src/genlib/man3/GENLIB_LOAD_PHFIG.3 +index a4f6872..0fbcfa4 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOAD_PHFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOAD_PHFIG.3 +@@ -9,7 +9,7 @@ GENLIB_LOAD_PHFIG + .TH GENLIB_LOAD_PHFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + \fBPHAD_PHFIG\fP \- loads a layout form disk and opens it as current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_LOCAP.3 b/alliance/src/genlib/man3/GENLIB_LOCAP.3 +index 9f67634..00281ad 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOCAP.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOCAP.3 +@@ -9,7 +9,7 @@ GENLIB_LOCAP + .TH GENLIB_LOCAP.3 "August 16, 2002" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LOCAP \- add a logical capacitor to the current netlist figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_LOCON.3 b/alliance/src/genlib/man3/GENLIB_LOCON.3 +index 8ce0561..f640aa6 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOCON.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOCON.3 +@@ -9,7 +9,7 @@ GENLIB_LOCON + .TH GENLIB_LOCON.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LOCON \- adds a logical connector to the current netlist figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -103,7 +103,7 @@ the busses are not equal. This is an obvious error, check it. + "Illegal addlocon. Connector connector already exist in figure figname" + .ft R + .RS +-A connector name must be unique in a given figure at a given hierachy level. ++A connector name must be unique in a given figure at a given hierarchy level. + .RE + .SH DIAGNOSTICS + Due to the \fBvti\fP file format, the direction of connectors is lost if +diff --git a/alliance/src/genlib/man3/GENLIB_LOINS.3 b/alliance/src/genlib/man3/GENLIB_LOINS.3 +index 5a3381d..d9f55a6 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOINS.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOINS.3 +@@ -9,7 +9,7 @@ GENLIB_LOINS + .TH GENLIB_LOINS.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LOINS \- add a logical instance to the current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -25,7 +25,7 @@ char \(**sig1, \(**sig2, ..., \(**sign; + .SH PARAMETERS + .TP 20 + \fImodel\fP +-Name of the model to be logically instanciated ++Name of the model to be logically instantiated + .TP + \fIinstance\fP + Name to be given to the new instance +@@ -37,7 +37,7 @@ List of signals to be linked to the implicit connector list of the instance + \fBLOINS\fP uses environment variables to + choose the file format and the path to the file. + .br +-\fBMBK_IN_LO\fP set up the input file format, the valid ones beeing : ++\fBMBK_IN_LO\fP set up the input file format, the valid ones being : + .RS + .br + \fBhns +@@ -92,7 +92,7 @@ A signal, described under a bus form, has an illegal syntax. + .ft R + .br + .RS +-An instance name must be unique in a given figure at a given hierachy level. ++An instance name must be unique in a given figure at a given hierarchy level. + .RE + .br + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_LOINSE.3 b/alliance/src/genlib/man3/GENLIB_LOINSE.3 +index 2803801..90e96c6 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOINSE.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOINSE.3 +@@ -9,7 +9,7 @@ GENLIB_LOINSE + .TH GENLIB_LOINSE.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LOINSE \- add a logical instance to the current figure, with explicit connections +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -25,7 +25,7 @@ char \(**couple1, \(**couple2, ..., \(**couplen; + .SH PARAMETERS + .TP 20 + \fImodel\fP +-Name of the model to be logically instanciated ++Name of the model to be logically instantiated + .TP + \fIinstance\fP + Name to be given to the new instance +@@ -37,7 +37,7 @@ Explicit list of connections between connectors and signals. + \fBLOINSE\fP uses environment variables to + choose the file format and the path to the file. + .br +-\fBMBK_IN_LO\fP set up the input file format, the valid ones beeing : ++\fBMBK_IN_LO\fP set up the input file format, the valid ones being : + .RS + .br + \fBhns +@@ -97,7 +97,7 @@ A signal, described under a bus form, has an illegal syntax. + .ft R + .br + .RS +-An instance name must be unique in a given figure at a given hierachy level. ++An instance name must be unique in a given figure at a given hierarchy level. + .RE + .br + .if n \{\ +diff --git a/alliance/src/genlib/man3/GENLIB_LORES.3 b/alliance/src/genlib/man3/GENLIB_LORES.3 +index 58d5c5f..459ac0c 100644 +--- a/alliance/src/genlib/man3/GENLIB_LORES.3 ++++ b/alliance/src/genlib/man3/GENLIB_LORES.3 +@@ -9,7 +9,7 @@ GENLIB_LORES + .TH GENLIB_LORES.3 "August 16, 2002" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LORES \- add a logical resistor to the current netlist figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_LOSELF.3 b/alliance/src/genlib/man3/GENLIB_LOSELF.3 +index b42cf82..fd9531a 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOSELF.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOSELF.3 +@@ -9,7 +9,7 @@ GENLIB_LOSELF + .TH GENLIB_LOSELF.3 "August 16, 2002" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LOSELF \- add a logical inductor to the current netlist figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_LOSIG.3 b/alliance/src/genlib/man3/GENLIB_LOSIG.3 +index 91ef2f9..875f7db 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOSIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOSIG.3 +@@ -10,7 +10,7 @@ GENLIB_LOSIG + .SH NAME + GENLIB_LOSIG \- declare an internal logical signal, or a vector of internal + logical signals +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,7 +28,7 @@ char \(**name; + Name of a signal to be declared + .SH DESCRIPTION + \fBLOSIG\fP creates the internal signal, or the set of internal signals +-coresponding to a vector description, represented by \fIname\fP. ++corresponding to a vector description, represented by \fIname\fP. + See \fBBUS(3)\fP and \fBELM(3)\fP for more details on vectors. + .br + The need for declaring signal is mostly felt when one wants to create a +diff --git a/alliance/src/genlib/man3/GENLIB_LOSIGMERGE.3 b/alliance/src/genlib/man3/GENLIB_LOSIGMERGE.3 +index d76e86c..e5a42d0 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOSIGMERGE.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOSIGMERGE.3 +@@ -9,7 +9,7 @@ GENLIB_LOSIGMERGE + .TH GENLIB_LOSIGMERGE.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LOSIGMERGE \- merge two logical signals +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_LOTRS.3 b/alliance/src/genlib/man3/GENLIB_LOTRS.3 +index d49685d..a680a06 100644 +--- a/alliance/src/genlib/man3/GENLIB_LOTRS.3 ++++ b/alliance/src/genlib/man3/GENLIB_LOTRS.3 +@@ -9,7 +9,7 @@ GENLIB_LOTRS + .TH GENLIB_LOTRS.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_LOTRS \- adds a logical transistor to the current netlist figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_OUTLINE.3 b/alliance/src/genlib/man3/GENLIB_OUTLINE.3 +index d005ef1..0d9ec0a 100644 +--- a/alliance/src/genlib/man3/GENLIB_OUTLINE.3 ++++ b/alliance/src/genlib/man3/GENLIB_OUTLINE.3 +@@ -9,7 +9,7 @@ GENLIB_OUTLINE + .TH GENLIB_OUTLINE.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_OUTLINE \- build an outline from the current layout cell +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_PHCON.3 b/alliance/src/genlib/man3/GENLIB_PHCON.3 +index 09e880c..56c6ffe 100644 +--- a/alliance/src/genlib/man3/GENLIB_PHCON.3 ++++ b/alliance/src/genlib/man3/GENLIB_PHCON.3 +@@ -9,7 +9,7 @@ GENLIB_PHCON + .TH GENLIB_PHCON.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_PHCON \- place a physical connector in the current figure at absolute coordinates +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -85,7 +85,7 @@ In order to be able to do so, an \fIindex\fP is computed for each connector + that has an already existing name, following a topological order. + Each time a connector is created, the \fIindex\fP is updated, regarding the + name of the connector. +-Since someone writting a tiler needs to know exactly what connector to access, ++Since someone writing a tiler needs to know exactly what connector to access, + the indexation algorithm must be known by the user. + .TP 20 + Connectors with a unique name: +@@ -98,7 +98,7 @@ If two connectors are on the same location, with the same name, then the + \fIlayer\fP decides which one is has the greater number, from lower level, + \fBNWELL\fP to upper level, \fBALU3\fP. + .LP +-The \fIorient\fP paramater may take the following values: ++The \fIorient\fP parameter may take the following values: + .TP 20 + \fBNORTH\fP + for a connector placed on the top of the cell. +diff --git a/alliance/src/genlib/man3/GENLIB_PHREF.3 b/alliance/src/genlib/man3/GENLIB_PHREF.3 +index 3b7b734..f4f3d6a 100644 +--- a/alliance/src/genlib/man3/GENLIB_PHREF.3 ++++ b/alliance/src/genlib/man3/GENLIB_PHREF.3 +@@ -10,7 +10,7 @@ GENLIB_PHREF + .SH NAME + GENLIB_PHREF \- place a physical reference in the current figure at absolute + coordinates +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_PHSEG.3 b/alliance/src/genlib/man3/GENLIB_PHSEG.3 +index 0260474..8120dfd 100644 +--- a/alliance/src/genlib/man3/GENLIB_PHSEG.3 ++++ b/alliance/src/genlib/man3/GENLIB_PHSEG.3 +@@ -9,7 +9,7 @@ GENLIB_PHSEG + .TH GENLIB_PHSEG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_PHSEG \- place a physical segment in the current figure at absolute coordinates +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_PHVIA.3 b/alliance/src/genlib/man3/GENLIB_PHVIA.3 +index 5c0c934..73fd7ea 100644 +--- a/alliance/src/genlib/man3/GENLIB_PHVIA.3 ++++ b/alliance/src/genlib/man3/GENLIB_PHVIA.3 +@@ -9,7 +9,7 @@ GENLIB_PHVIA + .TH GENLIB_PHVIA.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_PHVIA \- place a physical via in the current figure at absolute coordinates +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE.3 b/alliance/src/genlib/man3/GENLIB_PLACE.3 +index 134df9b..a4b1ff0 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE.3 +@@ -9,7 +9,7 @@ GENLIB_PLACE + .TH GENLIB_PLACE.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_PLACE \- place a physical instance in the current figure at absolute coordinates +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -26,20 +26,20 @@ long x,y; + .SH PARAMETERS + .TP 20 + \fImodelname\fP +-Name of the layout figure to be instanciated ++Name of the layout figure to be instantiated + .TP + \fIinsname\fP + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .TP + \fIx, y\fP + Coordinates of the lower left corner of the abutment box on the instance in + the current figure + .SH DESCRIPTION + \fBPLACE\fP add an instance in the current layout cell. The bottom left corner +-of the instance of the model \fImodelname\fP is placed, after beeing ++of the instance of the model \fImodelname\fP is placed, after being + symetrized and/or rotated, at \fI(x, y)\fP coordinates. + The placed instance becomes the new "reference instance", used in + the relative placement functions. +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE_BOTTOM.3 b/alliance/src/genlib/man3/GENLIB_PLACE_BOTTOM.3 +index 645b7f5..1af095b 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE_BOTTOM.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE_BOTTOM.3 +@@ -10,7 +10,7 @@ GENLIB_PLACE_BOTTOM + .SH NAME + GENLIB_PLACE_BOTTOM \- place a physical instance in the current figure under + the "reference instance" +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -26,18 +26,18 @@ char symetry; + .SH PARAMETERS + .TP 20 + \fImodelname\fP +-Name of the layout figure to be instanciated ++Name of the layout figure to be instantiated + .TP + \fIinsname\fP + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .SH DESCRIPTION + \fBPLACE_BOTTOM\fP add a instance of model \fImodelname\fP + in the current layout cell. + The bottom left corner +-of the abutment box of the instance is placed, after beeing symetrized ++of the abutment box of the instance is placed, after being symetrized + and/or rotated, + toward the bottom left corner of the abutment box of the + "reference instance". The newly +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE_CON_REF.3 b/alliance/src/genlib/man3/GENLIB_PLACE_CON_REF.3 +index 768eb65..cd50432 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE_CON_REF.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE_CON_REF.3 +@@ -10,7 +10,7 @@ GENLIB_PLACE_CON_REF + .SH NAME + GENLIB_PLACE_CON_REF \- put a connector on top of a reference belonging an + instance in the current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE_LEFT.3 b/alliance/src/genlib/man3/GENLIB_PLACE_LEFT.3 +index 823c053..dd4808f 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE_LEFT.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE_LEFT.3 +@@ -10,7 +10,7 @@ GENLIB_PLACE_LEFT + .SH NAME + GENLIB_PLACE_LEFT \- place a physical instance in the current figure at the left of the + "reference instance" +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -26,18 +26,18 @@ char symetry; + .SH PARAMETERS + .TP 20 + \fImodelname\fP +-Name of the layout figure to be instanciated ++Name of the layout figure to be instantiated + .TP + \fIinsname\fP + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .SH DESCRIPTION + \fBPLACE_LEFT\fP add an instance of model \fImodelname\fP + in the current layout cell. + The bottom right corner +-of the abutment box of the instance is placed, after beeing symetrized ++of the abutment box of the instance is placed, after being symetrized + and/or rotated, + toward the bottom left corner of the abutment box of the + "reference instance". The newly +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE_ON.3 b/alliance/src/genlib/man3/GENLIB_PLACE_ON.3 +index 05064ca..d51a126 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE_ON.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE_ON.3 +@@ -10,7 +10,7 @@ GENLIB_PLACE_ON + .SH NAME + GENLIB_PLACE_ON \- place a physical instance in the current figure matching + connectors +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -27,7 +27,7 @@ long index1, index2; + .SH PARAMETERS + .TP 20 + \fIfigname\fP +-Name of the layout figure to be instanciated ++Name of the layout figure to be instantiated + .TP + \fIins1\fP + Name to be given to the instance in the model +@@ -40,7 +40,7 @@ Index of the connector, or reference, \fIcon1\fP of the model to be used + for placement + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .TP + \fIins2\fP + Name of the instance to be used for relative placement +@@ -54,7 +54,7 @@ Index of the connector \fIcon2\fP of the instance to be used for relative + placement + .SH DESCRIPTION + \fBPLACE_ON\fP add an instance in the current layout cell. The bottom left corner +-of the instance of the model \fImodelname\fP is placed, after beeing ++of the instance of the model \fImodelname\fP is placed, after being + symetrized and/or rotated, at \fI(x, y)\fP coordinates. + The placed instance becomes the new "reference instance", used in + the relative placement functions. +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE_RIGHT.3 b/alliance/src/genlib/man3/GENLIB_PLACE_RIGHT.3 +index f49c294..dbc885e 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE_RIGHT.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE_RIGHT.3 +@@ -10,7 +10,7 @@ GENLIB_PLACE_RIGHT + .SH NAME + GENLIB_PLACE_RIGHT \- place a physical instance in the current figure at + the right of the "reference instance" +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -26,18 +26,18 @@ char symetry; + .SH PARAMETERS + .TP 20 + \fImodelname\fP +-Name of the layout figure to be instanciated ++Name of the layout figure to be instantiated + .TP + \fIinsname\fP + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .SH DESCRIPTION + \fBPLACE_RIGHT\fP add an instance of model \fImodelname\fP + in the current layout cell. + The bottom left corner +-of the abutment box of the instance is placed, after beeing symetrized ++of the abutment box of the instance is placed, after being symetrized + and/or rotated, + toward the bottom right corner of the abutment box of the + "reference instance". The newly +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE_SEG_REF.3 b/alliance/src/genlib/man3/GENLIB_PLACE_SEG_REF.3 +index 676f884..0fdc975 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE_SEG_REF.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE_SEG_REF.3 +@@ -10,7 +10,7 @@ GENLIB_PLACE_SEG_REF + .SH NAME + GENLIB_PLACE_SEG_REF \- put a segment on a reference belonging an + instance in the current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE_TOP.3 b/alliance/src/genlib/man3/GENLIB_PLACE_TOP.3 +index f489286..35f6993 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE_TOP.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE_TOP.3 +@@ -10,7 +10,7 @@ GENLIB_PLACE_TOP + .SH NAME + GENLIB_PLACE_TOP \- place a physical instance in the current figure on the top of the + "reference instance" +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -26,18 +26,18 @@ char symetry; + .SH PARAMETERS + .TP 20 + \fImodelname\fP +-Name of the layout figure to be instanciated ++Name of the layout figure to be instantiated + .TP + \fIinsname\fP + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .SH DESCRIPTION + \fBPLACE_TOP\fP add an instance of model \fImodelname\fP + in the current layout cell. + The bottom left corner +-of the abutment box of the instance is placed, after beeing symetrized ++of the abutment box of the instance is placed, after being symetrized + and/or rotated, + toward the top left corner of the abutment box of the + "reference instance". The newly +diff --git a/alliance/src/genlib/man3/GENLIB_PLACE_VIA_REF.3 b/alliance/src/genlib/man3/GENLIB_PLACE_VIA_REF.3 +index 3a69c3e..c252a14 100644 +--- a/alliance/src/genlib/man3/GENLIB_PLACE_VIA_REF.3 ++++ b/alliance/src/genlib/man3/GENLIB_PLACE_VIA_REF.3 +@@ -10,7 +10,7 @@ GENLIB_PLACE_VIA_REF + .SH NAME + GENLIB_PLACE_VIA_REF \- put a via on top of a reference belonging to an instance + in the current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -37,7 +37,7 @@ Type of via to be placed + \fBPLACE_VIA_REF\fP places a via of type \fIviatype\fP on top of the specified + reference, \fIrefname\fP, in the instance called \fIinsname\fP. + This function may be used to generate many cells from a single one, in order +-to "program" decoders for example, or in conjuction with \fBPLACE_SEG_REF\fP(3) ++to "program" decoders for example, or in conjunction with \fBPLACE_SEG_REF\fP(3) + or \fBPLACE_CON_REF\fP(3) to translate virtual connectors into fixed ones. + .br + The \fIviatype\fP argument may take the following legal values: +diff --git a/alliance/src/genlib/man3/GENLIB_REVERSE_PHCON.3 b/alliance/src/genlib/man3/GENLIB_REVERSE_PHCON.3 +index 3f281cd..23c3b1f 100644 +--- a/alliance/src/genlib/man3/GENLIB_REVERSE_PHCON.3 ++++ b/alliance/src/genlib/man3/GENLIB_REVERSE_PHCON.3 +@@ -9,7 +9,7 @@ GENLIB_REVERSE_PHCON + .TH GENLIB_REVERSE_PHCON.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_REVERSE_PHCON \- reverse the order of physical connectors on a bus. +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -33,7 +33,7 @@ virtual ones, done with \fBPHREF\fR(3), will be taken into account for + the reverse operation. + This function is mainly useful to implement the \fBmsb0\fR options of + the \fBAlliance\fR CAD system module generators, as the whole design can +-be done with the designer choosen bit ordering, and modified on user ++be done with the designer chosen bit ordering, and modified on user + demand only before saving. + .SH EXAMPLE + .nf +diff --git a/alliance/src/genlib/man3/GENLIB_SAVE_LOFIG.3 b/alliance/src/genlib/man3/GENLIB_SAVE_LOFIG.3 +index 9f085bf..3f87ad0 100644 +--- a/alliance/src/genlib/man3/GENLIB_SAVE_LOFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_SAVE_LOFIG.3 +@@ -9,7 +9,7 @@ GENLIB_SAVE_LOFIG + .TH GENLIB_SAVE_LOFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_SAVE_LOFIG \- save a netlist on disk +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -24,7 +24,7 @@ void GENLIB_SAVE_LOFIG(); + \fBSAVE_LOFIG\fP saves the current working figure previously definded by + a \fBDEF_LOFIG\fP call. \fBSAVE_LOFIG\fP uses environment variables to + choose the file format and the path to the file. +-\fBMBK_OUT_LO\fP set up the output file format, the valid ones beeing : ++\fBMBK_OUT_LO\fP set up the output file format, the valid ones being : + .RS + \fBhns + .br +diff --git a/alliance/src/genlib/man3/GENLIB_SAVE_PHFIG.3 b/alliance/src/genlib/man3/GENLIB_SAVE_PHFIG.3 +index 83efde9..93685fd 100644 +--- a/alliance/src/genlib/man3/GENLIB_SAVE_PHFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_SAVE_PHFIG.3 +@@ -9,7 +9,7 @@ GENLIB_SAVE_PHFIG + .TH GENLIB_SAVE_PHFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_SAVE_PHFIG \- save a layout on disk +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -25,7 +25,7 @@ void GENLIB_SAVE_PHFIG(); + a \fBDEF_PHFIG\fP call. \fBSAVE_PHFIG\fP uses environment variables to + choose the file format and the path to the file. + .br +-\fBMBK_OUT_PH\fP set up the output file format, the valid ones beeing : ++\fBMBK_OUT_PH\fP set up the output file format, the valid ones being : + .RS + \fBcp + .br +diff --git a/alliance/src/genlib/man3/GENLIB_SAVE_PHSC.3 b/alliance/src/genlib/man3/GENLIB_SAVE_PHSC.3 +index 4cdae33..4a6da40 100644 +--- a/alliance/src/genlib/man3/GENLIB_SAVE_PHSC.3 ++++ b/alliance/src/genlib/man3/GENLIB_SAVE_PHSC.3 +@@ -9,7 +9,7 @@ GENLIB_SAVE_PHSC + .TH GENLIB_SAVE_PHSC.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_SAVE_PHSC \- save a layout on disk +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_SC_BOTTOM.3 b/alliance/src/genlib/man3/GENLIB_SC_BOTTOM.3 +index c95d398..d8fdd3b 100644 +--- a/alliance/src/genlib/man3/GENLIB_SC_BOTTOM.3 ++++ b/alliance/src/genlib/man3/GENLIB_SC_BOTTOM.3 +@@ -10,7 +10,7 @@ GENLIB_SC_BOTTOM + .SH NAME + GENLIB_SC_BOTTOM \- place an instance in the current figure at the right of the + "reference instance" +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,10 +29,10 @@ char symetry; + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .SH DESCRIPTION + \fBSC_BOTTOM\fP add an instance in the current cell. The bottom left corner +-of the abutment box of the instance is placed, after beeing symetrized ++of the abutment box of the instance is placed, after being symetrized + and/or rotated, + toward the bottom left corner of the abutment box of the + "reference instance". The newly +diff --git a/alliance/src/genlib/man3/GENLIB_SC_LEFT.3 b/alliance/src/genlib/man3/GENLIB_SC_LEFT.3 +index 7e41829..a317781 100644 +--- a/alliance/src/genlib/man3/GENLIB_SC_LEFT.3 ++++ b/alliance/src/genlib/man3/GENLIB_SC_LEFT.3 +@@ -10,7 +10,7 @@ GENLIB_SC_LEFT + .SH NAME + GENLIB_SC_LEFT \- place an instance in the current figure at the right of the + "reference instance" +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,10 +29,10 @@ char symetry; + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .SH DESCRIPTION + \fBSC_LEFT\fP add an instance in the current cell. The bottom right corner +-of the abutment box of the instance is placed, after beeing symetrized ++of the abutment box of the instance is placed, after being symetrized + and/or rotated, + toward the bottom left corner of the abutment box of the + "reference instance". The newly +diff --git a/alliance/src/genlib/man3/GENLIB_SC_PLACE.3 b/alliance/src/genlib/man3/GENLIB_SC_PLACE.3 +index edf581c..20b9e29 100644 +--- a/alliance/src/genlib/man3/GENLIB_SC_PLACE.3 ++++ b/alliance/src/genlib/man3/GENLIB_SC_PLACE.3 +@@ -9,7 +9,7 @@ GENLIB_SC_PLACE + .TH GENLIB_SC_PLACE.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_SC_PLACE \- place an instance in the current figure at absolute coordinates +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,14 +29,14 @@ long x,y; + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .TP + \fIx, y\fP + Coordinates of the lower left corner of the abutment box of the model in + the current figure + .SH DESCRIPTION + \fISC_PLACE\fP add an instance in the current cell. The bottom left corner +-of the instance is placed, after beeing symetrized and/or rotated, ++of the instance is placed, after being symetrized and/or rotated, + at \fI(x, y)\fP + coordinates. The placement takes place only if the netlist is up to day, + because the model of the instance is seeked there, in order to ensure +diff --git a/alliance/src/genlib/man3/GENLIB_SC_RIGHT.3 b/alliance/src/genlib/man3/GENLIB_SC_RIGHT.3 +index ab1955c..a80cca9 100644 +--- a/alliance/src/genlib/man3/GENLIB_SC_RIGHT.3 ++++ b/alliance/src/genlib/man3/GENLIB_SC_RIGHT.3 +@@ -10,7 +10,7 @@ GENLIB_SC_RIGHT + .SH NAME + GENLIB_SC_RIGHT \- place an instance in the current figure at the right of the + "reference instance" +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,10 +29,10 @@ char symetry; + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .SH DESCRIPTION + \fBSC_RIGHT\fP add an instance in the current cell. The bottom left corner +-of the abutment box of the instance is placed, after beeing symetrized ++of the abutment box of the instance is placed, after being symetrized + and/or rotated, + toward the bottom right corner of the abutment box of the + "reference instance". The newly +diff --git a/alliance/src/genlib/man3/GENLIB_SC_TOP.3 b/alliance/src/genlib/man3/GENLIB_SC_TOP.3 +index 34bba8d..1851286 100644 +--- a/alliance/src/genlib/man3/GENLIB_SC_TOP.3 ++++ b/alliance/src/genlib/man3/GENLIB_SC_TOP.3 +@@ -10,7 +10,7 @@ GENLIB_SC_TOP + .SH NAME + GENLIB_SC_TOP \- place an instance in the current figure at the right of the + "reference instance" +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,10 +29,10 @@ char symetry; + Name to be given to the instance on the model + .TP + \fIsymetry\fP +-Geometrical operation to be performed on the instance before beeing placed ++Geometrical operation to be performed on the instance before being placed + .SH DESCRIPTION + \fBSC_TOP\fP add an instance in the current cell. The bottom left corner +-of the abutment box of the instance is placed, after beeing symetrized ++of the abutment box of the instance is placed, after being symetrized + and/or rotated, + toward the top left corner of the abutment box of the + "reference instance". The newly +diff --git a/alliance/src/genlib/man3/GENLIB_SET_LOCAP.3 b/alliance/src/genlib/man3/GENLIB_SET_LOCAP.3 +index 0e03657..4e91e52 100644 +--- a/alliance/src/genlib/man3/GENLIB_SET_LOCAP.3 ++++ b/alliance/src/genlib/man3/GENLIB_SET_LOCAP.3 +@@ -14,7 +14,7 @@ GENLIB_SET_LOCAP + .SH NAME + GENLIB_SET_LOCAP \- set the capacitance value of a logical capacitor, after its creation. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_SET_LORES.3 b/alliance/src/genlib/man3/GENLIB_SET_LORES.3 +index 933b8ad..4b5be00 100644 +--- a/alliance/src/genlib/man3/GENLIB_SET_LORES.3 ++++ b/alliance/src/genlib/man3/GENLIB_SET_LORES.3 +@@ -14,7 +14,7 @@ GENLIB_SET_LORES + .SH NAME + GENLIB_SET_LORES \- set the resistance value of a logical resistor, after its creation. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_SET_LOSELF.3 b/alliance/src/genlib/man3/GENLIB_SET_LOSELF.3 +index 57d037c..550fd1d 100644 +--- a/alliance/src/genlib/man3/GENLIB_SET_LOSELF.3 ++++ b/alliance/src/genlib/man3/GENLIB_SET_LOSELF.3 +@@ -14,7 +14,7 @@ GENLIB_SET_LOSELF + .SH NAME + GENLIB_SET_LOSELF \- set the inductance value of a logical inductor, after its creation. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/genlib/man3/GENLIB_UNFLATTEN_LOFIG.3 b/alliance/src/genlib/man3/GENLIB_UNFLATTEN_LOFIG.3 +index 5373a91..a860c4e 100644 +--- a/alliance/src/genlib/man3/GENLIB_UNFLATTEN_LOFIG.3 ++++ b/alliance/src/genlib/man3/GENLIB_UNFLATTEN_LOFIG.3 +@@ -9,7 +9,7 @@ GENLIB_UNFLATTEN_LOFIG + .TH GENLIB_UNFLATTEN_LOFIG.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + \fBUNFLATTEN_LOFIG\fP \- creates a hierarchy level from instances in the current logical figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,14 +29,14 @@ char \(**list_of_instances; + Name of the figure of the new hierarchy to be created + .TP + \fIinstancename\fP +-Name to be given at the instanciation of \fIfigurename\fP into the current ++Name to be given at the instantiation of \fIfigurename\fP into the current + structual figure + .TP + \fIlist_of_instances\fP + List of strings representing the instances to be inserted into the new figure + .SH DESCRIPTION + \fBUNFLATTEN_LOFIG\fP creates a new level of hierarchy, whose model name will +-be \fIfigurename\fP, and instanciate it under the name \fIinstancename\fP in ++be \fIfigurename\fP, and instantiate it under the name \fIinstancename\fP in + the current figure. + The instances whose name belong to the \fIlist_of_instances\fP parameters are + added in the new figure, and destroyed from the current figure. +diff --git a/alliance/src/genlib/man3/GENLIB_WIRE1.3 b/alliance/src/genlib/man3/GENLIB_WIRE1.3 +index 755c3cf..d0bbfe1 100644 +--- a/alliance/src/genlib/man3/GENLIB_WIRE1.3 ++++ b/alliance/src/genlib/man3/GENLIB_WIRE1.3 +@@ -9,7 +9,7 @@ GENLIB_WIRE1 + .TH GENLIB_WIRE1.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_WIRE1 \- place a physical segment in the current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -45,8 +45,8 @@ Name of a connector, or reference, used as last endpoint of the wire + .SH DESCRIPTION + \fBWIRE1\fP adds a segment made of the \fIlayer\fP level in the current + layout cell, the starting point +-beeing the connector, or reference, \fIcon1\fP of the instance \fIins1\fP, and +-the ending point beeing the connector, or reference, \fIcon2\fP of the instance ++being the connector, or reference, \fIcon1\fP of the instance \fIins1\fP, and ++the ending point being the connector, or reference, \fIcon2\fP of the instance + \fIins1\fP. The segment is drawn between the coordinates of \fIcon1\fP in + the current figure and the + coordinates of \fIcon2\fP in the current figure. +diff --git a/alliance/src/genlib/man3/GENLIB_WIRE2.3 b/alliance/src/genlib/man3/GENLIB_WIRE2.3 +index 68e7de7..d1d5a55 100644 +--- a/alliance/src/genlib/man3/GENLIB_WIRE2.3 ++++ b/alliance/src/genlib/man3/GENLIB_WIRE2.3 +@@ -9,7 +9,7 @@ GENLIB_WIRE2 + .TH GENLIB_WIRE2.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_WIRE2 \- place two physical segments in the current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -49,8 +49,8 @@ Coordinates of the segment's elbow in the current figure + .SH DESCRIPTION + \fBWIRE2\fP adds two segments made of the \fIlayer\fP level in the current + layout cell, the starting point +-beeing the connector, or reference, \fIcon1\fP of the instance \fIins1\fP, and +-the ending point beeing the connector, or reference, \fIcon2\fP of the instance ++being the connector, or reference, \fIcon1\fP of the instance \fIins1\fP, and ++the ending point being the connector, or reference, \fIcon2\fP of the instance + \fIins1\fP. The first segment is drawn between the coordinates of \fIcon1\fP in + the current figure and \fIx, y\fP, and the second one between \fIx, y\fP and the + coordinates of \fIcon2\fP in the current figure. +diff --git a/alliance/src/genlib/man3/GENLIB_WIRE3.3 b/alliance/src/genlib/man3/GENLIB_WIRE3.3 +index 554089c..e4c6cd7 100644 +--- a/alliance/src/genlib/man3/GENLIB_WIRE3.3 ++++ b/alliance/src/genlib/man3/GENLIB_WIRE3.3 +@@ -9,7 +9,7 @@ GENLIB_WIRE3 + .TH GENLIB_WIRE3.3 "October 1, 1997" "ASIM/LIP6" "PROCEDURAL GENERATION LANGUAGE" + .SH NAME + GENLIB_WIRE3 \- place three physical segments in the current figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -52,8 +52,8 @@ Coordinates of the segment's second elbow endpoint in the current figure + .SH DESCRIPTION + \fBWIRE3\fP adds three segments made of the \fIlayer\fP level in the current + layout cell, the starting point +-beeing the connector, or reference, \fIcon1\fP of the instance \fIins1\fP, and +-the ending point beeing the connector, or reference, \fIcon2\fP of the instance ++being the connector, or reference, \fIcon1\fP of the instance \fIins1\fP, and ++the ending point being the connector, or reference, \fIcon2\fP of the instance + \fIins1\fP. The first segment is drawn between the coordinates of \fIcon1\fP in + the current figure and \fIx1, y1\fP. The second one between \fIx1, y1\fP and + \fIx2, y2\fP, and the last, but not the least, between \fIx2, y2\fP and the +diff --git a/alliance/src/genlib/src/dpgen_Shifter.c b/alliance/src/genlib/src/dpgen_Shifter.c +index 968a772..6856c3c 100644 +--- a/alliance/src/genlib/src/dpgen_Shifter.c ++++ b/alliance/src/genlib/src/dpgen_Shifter.c +@@ -33,7 +33,7 @@ + buffer cells (inv_x4 etc ..) are too big and do not fit in the first column area. + + Revision 1.9 2004/03/04 14:21:56 fred +- Adding more powerfull cells for the signals controlling the shift. ++ Adding more powerful cells for the signals controlling the shift. + + Revision 1.8 2003/01/31 15:53:39 fred + COPY_UP_SEG now copies all segments of a given name. +@@ -375,7 +375,7 @@ extern void dpgen_Shifter(aFunction, aAL) + } + + /* I've done my best with genlib, but I need to realign overlapping +- * cells using some more powerfull tools, ... ++ * cells using some more powerful tools, ... + * This is done only for the last column, in order to keep the + * vertical alignement constraints. */ + if (aFunction == DPGEN_SHROT) { +diff --git a/alliance/src/genlib/src/genlib.c b/alliance/src/genlib/src/genlib.c +index 66f32ae..33b1281 100644 +--- a/alliance/src/genlib/src/genlib.c ++++ b/alliance/src/genlib/src/genlib.c +@@ -2437,7 +2437,7 @@ long x_ref, y_ref; /* return values, x_ref here for beauty */ + /******************************************************************************* + * set of functions to reverse the `logical' ordering of a set of connectors + * This quite weird function is required by the custom block generators +-* so to be able easilly to provide big and little endian bit ordering: ++* so to be able easily to provide big and little endian bit ordering: + * an option usually called -msb0 + *******************************************************************************/ + #define HARD_CONNECTOR 'H' +@@ -3017,7 +3017,7 @@ chain_list *ptchain = NULL; + mbkfree(signame); + } + +- /* Put sigs and cons in dictionnary */ ++ /* Put sigs and cons in dictionary */ + for (pcon = consiglist; pcon; pcon = pcon->NEXT) { + pcon->TYPE = (long)namealloc((char *)pcon->TYPE); + pcon->DATA = (void *)namealloc((char *)pcon->DATA); +@@ -3755,7 +3755,7 @@ chain_list *ilist = NULL; + }; + while ((iname = va_arg(instancelist, char *)) != NULL) + ilist = addchain(ilist, (void *)getloins(WORK_LOFIG, iname)); +- /* this new hierachy level needs to be saved */ ++ /* this new hierarchy level needs to be saved */ + savelofig(unflattenlofig(WORK_LOFIG, modelname, instancename, ilist)); + freechain(ilist); + va_end(instancelist); +diff --git a/alliance/src/genlib/src/genlib.sh b/alliance/src/genlib/src/genlib.sh +index 2b3ed93..0833bec 100755 +--- a/alliance/src/genlib/src/genlib.sh ++++ b/alliance/src/genlib/src/genlib.sh +@@ -41,7 +41,7 @@ + echo " [-k|--keep-exec] : Keep binary after execution." + echo " [-m|--keep-makefile] : Keep makefile after execution." + echo " [-n|--no-exec] : Do not execute the binary." +- echo " [-v|--verbose] : Issue more informations." ++ echo " [-v|--verbose] : Issue more information." + echo " [-e [args]] : [args] are passed to the binary." + echo "" + } +diff --git a/alliance/src/genpat/doc/man3/AFFECT.3 b/alliance/src/genpat/doc/man3/AFFECT.3 +index aa40f31..08b9567 100644 +--- a/alliance/src/genpat/doc/man3/AFFECT.3 ++++ b/alliance/src/genpat/doc/man3/AFFECT.3 +@@ -46,7 +46,7 @@ added before the value (example : "?0x45f*" instead of "0x45f*"). + "Affect" a value to a signal. This value will be apllied to the signal, at + the specified simulation date, until the end of the simulation or until a new + value is affected to the signal. Beware : Inputs have to be affected at the +-begining of the simulation (first pattern at 0 ps). By default, signals ++beginning of the simulation (first pattern at 0 ps). By default, signals + (except Inputs) are affected with a "full star" value at the first pattern. + + .PP +diff --git a/alliance/src/genpat/doc/man3/ARRAY.3 b/alliance/src/genpat/doc/man3/ARRAY.3 +index 363dd0f..32d6030 100644 +--- a/alliance/src/genpat/doc/man3/ARRAY.3 ++++ b/alliance/src/genpat/doc/man3/ARRAY.3 +@@ -7,7 +7,7 @@ + \fBARRAY\fP, GENPAT Package + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + ARRAY ("ident", "ident", ..., ":nb_space", "format", type, option, "ident_group", 0); +diff --git a/alliance/src/genpat/doc/man3/DECLAR.3 b/alliance/src/genpat/doc/man3/DECLAR.3 +index 9e45b5b..dbaacb4 100644 +--- a/alliance/src/genpat/doc/man3/DECLAR.3 ++++ b/alliance/src/genpat/doc/man3/DECLAR.3 +@@ -7,7 +7,7 @@ + \fBDECLAR\fP, GENPAT Package + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + DECLAR("ident",":nb_space","format",mode,size,option); +diff --git a/alliance/src/genpat/doc/man3/DEF_GENPAT.3 b/alliance/src/genpat/doc/man3/DEF_GENPAT.3 +index a6c59a3..346e4da 100644 +--- a/alliance/src/genpat/doc/man3/DEF_GENPAT.3 ++++ b/alliance/src/genpat/doc/man3/DEF_GENPAT.3 +@@ -7,7 +7,7 @@ + \fBDEF_GENPAT\fP, GENPAT Package + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + DEF_GENPAT ("ident"); +diff --git a/alliance/src/genpat/doc/man3/LABEL.3 b/alliance/src/genpat/doc/man3/LABEL.3 +index 7573a60..ac383b6 100644 +--- a/alliance/src/genpat/doc/man3/LABEL.3 ++++ b/alliance/src/genpat/doc/man3/LABEL.3 +@@ -7,7 +7,7 @@ + \fBLABEL\fP, GENPAT Package + + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + LABEL ("ident"); +diff --git a/alliance/src/genpat/doc/man3/SAVE.3 b/alliance/src/genpat/doc/man3/SAVE.3 +index 368fa2f..865c1c3 100644 +--- a/alliance/src/genpat/doc/man3/SAVE.3 ++++ b/alliance/src/genpat/doc/man3/SAVE.3 +@@ -6,7 +6,7 @@ + .PP + \fBSAVE\fP, GENPAT Package + +-.SH SYNOPSYS ++.SH SYNOPSIS + .PP + .nf + SAVE (); +diff --git a/alliance/src/genpat/src/genpat.sh b/alliance/src/genpat/src/genpat.sh +index a95883e..0e28114 100755 +--- a/alliance/src/genpat/src/genpat.sh ++++ b/alliance/src/genpat/src/genpat.sh +@@ -8,7 +8,7 @@ help() { + echo "Syntax: `basename $0` [-vk] source-file (without extension)" + echo " -v : verbose mode" + echo " -k : keeps the executable (whith debugging" +- echo " informations) along with the" ++ echo " information) along with the" + echo " compilation Makefile after completion" + exit 1 + } +diff --git a/alliance/src/graal/man1/graal.1 b/alliance/src/graal/man1/graal.1 +index 4fd193f..3b8b53e 100644 +--- a/alliance/src/graal/man1/graal.1 ++++ b/alliance/src/graal/man1/graal.1 +@@ -145,10 +145,10 @@ indicates the file format to be used for the leaf cells. + .B MBK_OUT_PH + indicates the file format to be used for the generated figures. + .TP +-.B GRAAL_TECHNO_NAME (optionnal) ++.B GRAAL_TECHNO_NAME (optional) + indicates the path to the techno name file used by Graal. + .TP +-.B RDS_TECHNO_NAME (optionnal) ++.B RDS_TECHNO_NAME (optional) + indicates the path to the RDS configuration file used by Graal. + + .SH SEE ALSO +diff --git a/alliance/src/l2p/man1/l2p.1 b/alliance/src/l2p/man1/l2p.1 +index eb3719a..9e9ca63 100644 +--- a/alliance/src/l2p/man1/l2p.1 ++++ b/alliance/src/l2p/man1/l2p.1 +@@ -49,8 +49,8 @@ used on any adequat \fBPostcript\fP printer. + .br + l2p will generate in the current directory, either a single file called + \fI.ps\fP, either several files suffixed by \fI-x.ps\fP, +-depending on wether you've asked for a monopage plot or for a drawing +-that will be splitted on several pages. ++depending on whether you've asked for a monopage plot or for a drawing ++that will be split on several pages. + If you do something like + \fIl2p -pages=2x1 cell\fP, it will generate two files called + \fIcell-1x1.ps\fP, and \fIcell-2x1.ps\fP. +@@ -66,7 +66,7 @@ The default value gives a black and white \fBPostCript\fP file. + specifies the drawing area in centh of inch. + By default, wide = 725 and height = 1068 for french A4 paper. If + the drawing size is bigger than the paper area, then the +-drawing will be splitted on several pages. ++drawing will be split on several pages. + .TP + \-fA3 + The drawing is done on A3 format paper. +@@ -78,14 +78,14 @@ The drawing is done on LETTER format paper. + The drawing is done on LEGAL format paper. + .TP + \-givebwdict +-give the Black & White internal PostScript dictionnary. ++give the Black & White internal PostScript dictionary. + See below. + .TP + \-givecolordict + This option must be unique on the command line. When + used as in 'l2p -givebwdict', l2p then gives on the + standard output its Black & White internal Postscript +-dictionnary. A PostScript dictionnary is a set of mac- ++dictionary. A PostScript dictionary is a set of mac- + ros that will be used during interpretation of your + PostScript file. The macros in the internal PostScript + dictionnaries of l2p allows you to control which layer +@@ -175,18 +175,18 @@ the file : 'head n1_y-1x1.ps' will show you a PostScript comment beginning + by '%SCALE=3.78435' for example. + .TP + \-usedict= +-The output Postcript file contains a Postcript dictionnary of macros. ++The output Postcript file contains a Postcript dictionary of macros. + .br + There are two standard dictionnaries used by l2p for black and white or color prints. +-This allows you to use a PostScript dictionnary different from the two ++This allows you to use a PostScript dictionary different from the two + internally encoded into l2p. By modifying one of the standard l2p +-dictionnary, you can choose which layer to output, how to fill the ++dictionary, you can choose which layer to output, how to fill the + rectangles (empty, hashed, filled), which color to choose, ... and + lots of other possibilities. The rest of the generated postscript file + is mainly orders of drawing rectangles. PostScript is a reverse polish +-notation langage, that is easy to read for simple programs. ++notation language, that is easy to read for simple programs. + .br +-If you use this functionnality, and think that your dictionnaries are ++If you use this functionality, and think that your dictionnaries are + worth it, please mail them to alliance\-users@asim.lip6.fr, in order to submit + them for inclusion in future version of l2p (Thanks). + +@@ -244,7 +244,7 @@ option that is not implemented yet. + The generated \fBPostScript\fP is Level 1 for black& white plots. + When you use color, it generates Level 1 with color extensions. + It may not run with strict Level 1 interpreters, although it runs here with +-our Apple Personnal LaserWriter, Sun Sparcprinters, and Canon CLC-300-PS. ++our Apple Personal LaserWriter, Sun Sparcprinters, and Canon CLC-300-PS. + It follows the Adobe Document Structuring Conventions 1, and as there + is a fake bitmap image inside each generated files, you can re-use them in your + word-processors, or publishing software, because the PostScript is EPSF-1.2 +diff --git a/alliance/src/l2p/src/dict_bw.ps b/alliance/src/l2p/src/dict_bw.ps +index c8a0eda..c561707 100644 +--- a/alliance/src/l2p/src/dict_bw.ps ++++ b/alliance/src/l2p/src/dict_bw.ps +@@ -1,7 +1,7 @@ + % = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +-% This is the beginning of the l2p BLACK & WHITE PostScript dictionnary. ++% This is the beginning of the l2p BLACK & WHITE PostScript dictionary. + % (If you want to change patterns, this is THE place to do it.) +-% (Remember that you can substitute another PostScript dictionnary.) ++% (Remember that you can substitute another PostScript dictionary.) + %%Pages: 1 1 + %%EndComments + %%BeginPreview: 256 64 1 64 +@@ -331,5 +331,5 @@ pas x w add h add { + %- - - END OF LAYER TRADUCTION - - - + %%EndSetup + +-% This is the end of the l2p BLACK & WHITE PostScript dictionnary. ++% This is the end of the l2p BLACK & WHITE PostScript dictionary. + % = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +diff --git a/alliance/src/l2p/src/dict_color.ps b/alliance/src/l2p/src/dict_color.ps +index d71494e..1917478 100644 +--- a/alliance/src/l2p/src/dict_color.ps ++++ b/alliance/src/l2p/src/dict_color.ps +@@ -1,7 +1,7 @@ + % = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +-% This is the beginning of the l2p COLOR PostScript dictionnary. ++% This is the beginning of the l2p COLOR PostScript dictionary. + % (If you want to change colors or patterns, this is THE place to do it.) +-% (Remember that you can substitute another PostScript dictionnary.) ++% (Remember that you can substitute another PostScript dictionary.) + %%Pages: 1 1 + %%EndComments + %%BeginPreview: 256 64 1 64 +@@ -363,5 +363,5 @@ pas x w add h add { + %- - - END OF LAYER TRADUCTION - - - + %%EndSetup + +-% This is the end of the l2p COLOR PostScript dictionnary. ++% This is the end of the l2p COLOR PostScript dictionary. + % = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +diff --git a/alliance/src/l2p/src/drive_ps.c b/alliance/src/l2p/src/drive_ps.c +index f9ddb7e..7cbbb5a 100644 +--- a/alliance/src/l2p/src/drive_ps.c ++++ b/alliance/src/l2p/src/drive_ps.c +@@ -37,7 +37,7 @@ + /* Modifie par : Gilles-Eric DESCAMPS le : 30/01/1994 */ + /* 1.03 introduces -landscape, automating centering of cell in drawing, */ + /* suppression of '-1x1' extension for monopages drawings, use of an */ +-/* external PostScript dictionnary, ability to give its own dictionnary, */ ++/* external PostScript dictionary, ability to give its own dictionary, */ + /* */ + /* Modifie par : Etienne LACOUME le : 02/03/1995 */ + /* 1.10 introduces a better quality in drawing,the capability to display */ +@@ -101,7 +101,7 @@ char *msg; + fprintf (stderr, "%s", msg); + break; + default : +- fprintf (stderr, "Unknow internal error"); ++ fprintf (stderr, "Unknown internal error"); + }; + fprintf (stderr,"\n"); + fflush (stderr); +diff --git a/alliance/src/l2p/src/tmp_dict.c b/alliance/src/l2p/src/tmp_dict.c +index 9bcf15a..4b0608a 100644 +--- a/alliance/src/l2p/src/tmp_dict.c ++++ b/alliance/src/l2p/src/tmp_dict.c +@@ -3,9 +3,9 @@ void rps_print_dict_bw (pg) + void *pg; + { + rps_put (pg,"% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\n"); +- rps_put (pg,"% This is the beginning of the l2p BLACK & WHITE PostScript dictionnary.\n"); ++ rps_put (pg,"% This is the beginning of the l2p BLACK & WHITE PostScript dictionary.\n"); + rps_put (pg,"% (If you want to change patterns, this is THE place to do it.)\n"); +- rps_put (pg,"% (Remember that you can substitute another PostScript dictionnary.)\n"); ++ rps_put (pg,"% (Remember that you can substitute another PostScript dictionary.)\n"); + rps_put (pg,"%%Pages: 1 1\n"); + rps_put (pg,"%%EndComments\n"); + rps_put (pg,"%%BeginPreview: 256 64 1 64\n"); +@@ -410,7 +410,7 @@ void *pg; + rps_put (pg,"%- - - END OF LAYER TRADUCTION - - -\n"); + rps_put (pg,"%%EndSetup\n"); + rps_put (pg,"\n"); +- rps_put (pg,"% This is the end of the l2p BLACK & WHITE PostScript dictionnary.\n"); ++ rps_put (pg,"% This is the end of the l2p BLACK & WHITE PostScript dictionary.\n"); + rps_put (pg,"% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\n"); + } + +@@ -418,9 +418,9 @@ void rps_print_dict_color (pg) + void *pg; + { + rps_put (pg,"% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\n"); +- rps_put (pg,"% This is the beginning of the l2p COLOR PostScript dictionnary.\n"); ++ rps_put (pg,"% This is the beginning of the l2p COLOR PostScript dictionary.\n"); + rps_put (pg,"% (If you want to change colors or patterns, this is THE place to do it.)\n"); +- rps_put (pg,"% (Remember that you can substitute another PostScript dictionnary.)\n"); ++ rps_put (pg,"% (Remember that you can substitute another PostScript dictionary.)\n"); + rps_put (pg,"%%Pages: 1 1\n"); + rps_put (pg,"%%EndComments\n"); + rps_put (pg,"%%BeginPreview: 256 64 1 64\n"); +@@ -846,6 +846,6 @@ void *pg; + rps_put (pg,"%- - - END OF LAYER TRADUCTION - - -\n"); + rps_put (pg,"%%EndSetup\n"); + rps_put (pg,"\n"); +- rps_put (pg,"% This is the end of the l2p COLOR PostScript dictionnary.\n"); ++ rps_put (pg,"% This is the end of the l2p COLOR PostScript dictionary.\n"); + rps_put (pg,"% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\n"); + } +diff --git a/alliance/src/l2p/src/tmp_man.c b/alliance/src/l2p/src/tmp_man.c +index 46bab05..610d075 100644 +--- a/alliance/src/l2p/src/tmp_man.c ++++ b/alliance/src/l2p/src/tmp_man.c +@@ -39,8 +39,8 @@ void rps_print_man () { + puts (" be then used on any adequat PPoossttccrriipptt printer."); + puts (" l2p will generate in the current directory, either a sin-"); + puts (" gle file called _<_c_e_l_l_n_a_m_e_>_._p_s, either several files suf-"); +- puts (" fixed by _-_<_x_>_x_<_y_>_._p_s, depending on wether you've asked for"); +- puts (" a monopage plot or for a drawing that will be splitted on"); ++ puts (" fixed by _-_<_x_>_x_<_y_>_._p_s, depending on whether you've asked for"); ++ puts (" a monopage plot or for a drawing that will be split on"); + puts (" several pages. If you do something like _l_2_p _-_p_a_g_e_s_=_2_x_1"); + puts (" _c_e_l_l, it will generate two files called _c_e_l_l_-_1_x_1_._p_s, and"); + puts (" _c_e_l_l_-_2_x_1_._p_s."); +@@ -58,7 +58,7 @@ void rps_print_man () { + puts (" specifies the drawing area in centh of inch. By"); + puts (" default, wide = 725 and height = 1068 for french A4"); + puts (" paper. If the drawing size is bigger than the paper"); +- puts (" area, then the drawing will be splitted on several"); ++ puts (" area, then the drawing will be split on several"); + puts (" pages."); + puts (""); + puts (""); +@@ -89,8 +89,8 @@ void rps_print_man () { + puts (" This option must be unique on the command line."); + puts (" When used as in 'l2p -givebwdict', l2p then"); + puts (" gives on the standard output its Black & White"); +- puts (" internal Postscript dictionnary. A PostScript"); +- puts (" dictionnary is a set of mac- ros that will be used"); ++ puts (" internal Postscript dictionary. A PostScript"); ++ puts (" dictionary is a set of mac- ros that will be used"); + puts (" during interpretation of your PostScript file."); + puts (" The macros in the internal PostScript dictionnaries"); + puts (" of l2p allows you to control which layer to out-"); +@@ -216,17 +216,17 @@ void rps_print_man () { + puts (" tionnary of macros."); + puts (" There are two standard dictionnaries used by l2p"); + puts (" for black and white or color prints. This allows"); +- puts (" you to use a PostScript dictionnary different from"); ++ puts (" you to use a PostScript dictionary different from"); + puts (" the two internally encoded into l2p. By modifying"); +- puts (" one of the standard l2p dictionnary, you can choose"); ++ puts (" one of the standard l2p dictionary, you can choose"); + puts (" which layer to output, how to fill the rectangles"); + puts (" (empty, hashed, filled), which color to choose, ..."); + puts (" and lots of other possibilities. The rest of the"); + puts (" generated postscript file is mainly orders of draw-"); + puts (" ing rectangles. PostScript is a reverse polish"); +- puts (" notation langage, that is easy to read for simple"); ++ puts (" notation language, that is easy to read for simple"); + puts (" programs."); +- puts (" If you use this functionnality, and think that your"); ++ puts (" If you use this functionality, and think that your"); + puts (" dictionnaries are worth it, please mail them to"); + puts (" alliance-users@asim.lip6.fr, in order to submit"); + puts (" them for inclusion in future version of l2p"); +diff --git a/alliance/src/log/man1/log.1 b/alliance/src/log/man1/log.1 +index eb4b57a..841f37a 100644 +--- a/alliance/src/log/man1/log.1 ++++ b/alliance/src/log/man1/log.1 +@@ -23,7 +23,7 @@ HEADER = -I/labo/include + .br + LIB = -L/labo/lib -lMut -ltsh -labl -lbdd + .br +-Each library can be called separatly. The "log.h" header file must be inserted in the files that use the functions or the structures defined in a library. ++Each library can be called separately. The "log.h" header file must be inserted in the files that use the functions or the structures defined in a library. + .br + .SH SEE ALSO + .BR mbk (1), +diff --git a/alliance/src/log/man3/ablToBddCct.3 b/alliance/src/log/man3/ablToBddCct.3 +index 99bcbac..153c0d2 100644 +--- a/alliance/src/log/man3/ablToBddCct.3 ++++ b/alliance/src/log/man3/ablToBddCct.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBablToBddCct\fP \- converts an ABL into a BDD within a circuit +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode ablToBddCct(pC,expr) +diff --git a/alliance/src/log/man3/addListBdd.3 b/alliance/src/log/man3/addListBdd.3 +index 5068fd2..7b3ac17 100644 +--- a/alliance/src/log/man3/addListBdd.3 ++++ b/alliance/src/log/man3/addListBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBaddListBdd\fP \- adds a BDD to a chained list of BDDs +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + chain_list *addListBdd(pt,pBdd) +diff --git a/alliance/src/log/man3/applyBdd.3 b/alliance/src/log/man3/applyBdd.3 +index 5d063d7..b55c8b3 100644 +--- a/alliance/src/log/man3/applyBdd.3 ++++ b/alliance/src/log/man3/applyBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBapplyBdd\fP \- applies an operator to a list of BDD. +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode applyBdd(oper,pt) +diff --git a/alliance/src/log/man3/applyBinBdd.3 b/alliance/src/log/man3/applyBinBdd.3 +index ac58473..14e6d78 100644 +--- a/alliance/src/log/man3/applyBinBdd.3 ++++ b/alliance/src/log/man3/applyBinBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBapplyBinBdd\fP \- applies an operator to two BDD. +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode applyBinBdd(oper,pBdd1,pBdd2) +diff --git a/alliance/src/log/man3/bddToAblCct.3 b/alliance/src/log/man3/bddToAblCct.3 +index 222cd66..89516fa 100644 +--- a/alliance/src/log/man3/bddToAblCct.3 ++++ b/alliance/src/log/man3/bddToAblCct.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBbddToAblCct\fP \- converts a BDD into an ABL within a circuit +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + chain_list *bddToAblCct(pC,pBdd) +diff --git a/alliance/src/log/man3/composeBdd.3 b/alliance/src/log/man3/composeBdd.3 +index 803e238..390c641 100644 +--- a/alliance/src/log/man3/composeBdd.3 ++++ b/alliance/src/log/man3/composeBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBcomposeBdd\fP \- substitutes an index by a BDD in another BDD +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode composeBdd(pBdd1,pBdd2,index) +@@ -15,7 +15,7 @@ short index; + .SH PARAMETERS + .TP 20 + \fIpBdd1\fP +-BDD in wich \fIindex\fP is substituted ++BDD in which \fIindex\fP is substituted + .TP 20 + \fIpBdd2\fP + BDD that replaces \fIindex\fP +diff --git a/alliance/src/log/man3/constraintBdd.3 b/alliance/src/log/man3/constraintBdd.3 +index 2208bdc..61fa125 100644 +--- a/alliance/src/log/man3/constraintBdd.3 ++++ b/alliance/src/log/man3/constraintBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBconstraintBdd\fP \- restricts a BDD to another BDD +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode constraintBdd(pBdd1,pBdd2) +diff --git a/alliance/src/log/man3/createNodeTermBdd.3 b/alliance/src/log/man3/createNodeTermBdd.3 +index 76a35aa..56b9f2e 100644 +--- a/alliance/src/log/man3/createNodeTermBdd.3 ++++ b/alliance/src/log/man3/createNodeTermBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBcreateNodeTermBdd\fP \- creates a terminal node of variable. +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode createNodeTermBdd(index) +diff --git a/alliance/src/log/man3/destroyBdd.3 b/alliance/src/log/man3/destroyBdd.3 +index 7837981..1afc822 100644 +--- a/alliance/src/log/man3/destroyBdd.3 ++++ b/alliance/src/log/man3/destroyBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBdestroyBdd\fP \- removes the BDDs system +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + void destroyBdd(level) +diff --git a/alliance/src/log/man3/displayBdd.3 b/alliance/src/log/man3/displayBdd.3 +index 264f314..2a3e062 100644 +--- a/alliance/src/log/man3/displayBdd.3 ++++ b/alliance/src/log/man3/displayBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBdisplayBdd\fP \- displays a BDD +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + void displayBdd(pBdd,level) +diff --git a/alliance/src/log/man3/gcNodeBdd.3 b/alliance/src/log/man3/gcNodeBdd.3 +index 418ed65..ce04e58 100644 +--- a/alliance/src/log/man3/gcNodeBdd.3 ++++ b/alliance/src/log/man3/gcNodeBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBgcNodeBdd\fP \- does a garbage collection +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + void gcNodeBdd(pt) +diff --git a/alliance/src/log/man3/initializeBdd.3 b/alliance/src/log/man3/initializeBdd.3 +index aed7b17..71fcade 100644 +--- a/alliance/src/log/man3/initializeBdd.3 ++++ b/alliance/src/log/man3/initializeBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBinitializeBdd\fP \- initializes the BDDs system +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + void initializeBdd(size) +diff --git a/alliance/src/log/man3/markAllBdd.3 b/alliance/src/log/man3/markAllBdd.3 +index 10ed21c..acec60e 100644 +--- a/alliance/src/log/man3/markAllBdd.3 ++++ b/alliance/src/log/man3/markAllBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBmarkAllBdd\fP \- marks all the nodes of the BDDs system +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + void markAllBdd(value) +diff --git a/alliance/src/log/man3/markBdd.3 b/alliance/src/log/man3/markBdd.3 +index fce9f81..efb372b 100644 +--- a/alliance/src/log/man3/markBdd.3 ++++ b/alliance/src/log/man3/markBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBmarkBdd\fP \- marks all nodes of a BDD +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + void markBdd(pBdd,value) +diff --git a/alliance/src/log/man3/notBdd.3 b/alliance/src/log/man3/notBdd.3 +index a402dff6..64ab50f 100644 +--- a/alliance/src/log/man3/notBdd.3 ++++ b/alliance/src/log/man3/notBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBnotBdd\fP \- complements a BDD +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode notBdd(pBdd) +diff --git a/alliance/src/log/man3/numberNodeAllBdd.3 b/alliance/src/log/man3/numberNodeAllBdd.3 +index 9e378f0..fd692ec 100644 +--- a/alliance/src/log/man3/numberNodeAllBdd.3 ++++ b/alliance/src/log/man3/numberNodeAllBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBnumberNodeAllBdd\fP \- count the number of nodes used in the BDD system +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + int numberNodeAllBdd() +diff --git a/alliance/src/log/man3/numberNodeBdd.3 b/alliance/src/log/man3/numberNodeBdd.3 +index 0c60d89..d2b2fda 100644 +--- a/alliance/src/log/man3/numberNodeBdd.3 ++++ b/alliance/src/log/man3/numberNodeBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBnumberNodeBdd\fP \- computes the number of nodes used in a BDD +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + int numberNodeBdd(pBdd) +@@ -13,7 +13,7 @@ pNode pBdd; + .SH PARAMETER + .TP 20 + \fIpBdd\fP +-BDD on wich the compute does ++BDD on which the compute does + .SH DESCRIPTION + \fBnumberNodeBdd()\fP computes the number of reduced nodes that are used in \fIpBdd\fP. + .SH EXAMPLE +diff --git a/alliance/src/log/man3/resetBdd.3 b/alliance/src/log/man3/resetBdd.3 +index 5f87566..6faf0a3 100644 +--- a/alliance/src/log/man3/resetBdd.3 ++++ b/alliance/src/log/man3/resetBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBresetBdd\fP \- resets the BDDs system +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + void resetBdd() +diff --git a/alliance/src/log/man3/simplifDcOneBdd.3 b/alliance/src/log/man3/simplifDcOneBdd.3 +index f20bcb5..4bb522a 100644 +--- a/alliance/src/log/man3/simplifDcOneBdd.3 ++++ b/alliance/src/log/man3/simplifDcOneBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBsimplifDcOneBdd\fP \- simplifies a BDD with don't cares on its on-set part +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode simplifDcOneBdd(pBdd1,pBdd2) +diff --git a/alliance/src/log/man3/simplifDcZeroBdd.3 b/alliance/src/log/man3/simplifDcZeroBdd.3 +index a1240d4..a4ed25c 100644 +--- a/alliance/src/log/man3/simplifDcZeroBdd.3 ++++ b/alliance/src/log/man3/simplifDcZeroBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBsimplifDcZeroBdd\fP \- simplifies a BDD with don't cares on its off-set part +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode simplifDcZeroBdd(pBdd1,pBdd2) +diff --git a/alliance/src/log/man3/supportChain_listBdd.3 b/alliance/src/log/man3/supportChain_listBdd.3 +index 3606db0..c2985be 100644 +--- a/alliance/src/log/man3/supportChain_listBdd.3 ++++ b/alliance/src/log/man3/supportChain_listBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBsupportChain_listBdd\fP \- returns a chained list of nodes that are used in a given BDD. +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + chain_list *supportChain_listBdd(pBdd) +@@ -15,7 +15,7 @@ pNode pBdd; + \fIpBdd\fP + BDD + .SH DESCRIPTION +-\fBsupportChain_listBdd()\fP creates a chained list in wich all the nodes of \fIpBdd\fP are represented. ++\fBsupportChain_listBdd()\fP creates a chained list in which all the nodes of \fIpBdd\fP are represented. + .SH EXAMPLE + .nf + #include "mutnnn.h" /* mbk utilities */ +diff --git a/alliance/src/log/man3/upVarBdd.3 b/alliance/src/log/man3/upVarBdd.3 +index 3f4640b..13a1d9e 100644 +--- a/alliance/src/log/man3/upVarBdd.3 ++++ b/alliance/src/log/man3/upVarBdd.3 +@@ -4,7 +4,7 @@ + .so man1/alc_origin.1 + .SH NAME + \fBupVarBdd\fP \- brings up an index in a BDD +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "logmmm.h" + pNode upVarBdd(pBdd,oldIndex,newIndex) +@@ -14,7 +14,7 @@ short oldIndex,newIndex; + .SH PARAMETERS + .TP 20 + \fIpBdd\fP +-BDD in wich \fIindex\fP is came up ++BDD in which \fIindex\fP is came up + .TP 20 + \fIoldIndex\fP + index to come up +diff --git a/alliance/src/loon/doc/loon.1 b/alliance/src/loon/doc/loon.1 +index 3ba4e3f..0b78ffc 100644 +--- a/alliance/src/loon/doc/loon.1 ++++ b/alliance/src/loon/doc/loon.1 +@@ -52,7 +52,7 @@ LooN \- Local optimizations of Nets. + gate netlist and also to optimize the delay. + The netlist can be hierarchical and is flattened if necessary. + \f4loon\fP runs in batch mode and a parameter file can be used +-(see man \f4lax\fP) to parametrize optimization by adding informations ++(see man \f4lax\fP) to parametrize optimization by adding information + on outputs (fanin), inputs (fanout, delay) and by setting general + parameters such as optimization level. + \f4loon\fP permits to compute delays of gates in the netlist and gives +@@ -95,7 +95,7 @@ Here is the default lax file (see the user's manual for further information abou + Help mode. Displays possible uses of \f4loon\fP. + .TP 10 + \f4\-o input_file\fP +-Overwrites the source file if no \fIoutput_file\fP is given. This can be usefull if you don't want several netlist files. ++Overwrites the source file if no \fIoutput_file\fP is given. This can be useful if you don't want several netlist files. + .TP 10 + \f4\-m optim_mode\fP + Optimization mode. Can be defined in lax file, it's only a shortcut to define it on command line. This mode number has an array defined between \fI0\fP and \fI4\fP. It indicates the way of optimization the user wants. If \fI0\fP is chosen, the circuit area will be improved. On the other hand, \fI4\fP will improve circuit delays. \fI2\fP is a medium value for optimization. +@@ -104,7 +104,7 @@ Optimization mode. Can be defined in lax file, it's only a shortcut to define it + Generate a '.xsc' file. It is a color map for each signals contained in \fIoutput_file\fP network. This file is used by \f4xsch\fP to view the netlist. By choosing level 0 or 1 for xsch_mode, you can color respectively the critical path or all signals with delay graduation. + .TP 10 + \f4\-l lax_file\fP +-Just another way to show explicitely the \f4LAX\fP parameter file name. ++Just another way to show explicitly the \f4LAX\fP parameter file name. + .br + + .SH ENVIRONMENT VARIABLES +diff --git a/alliance/src/loon/src/lon_lib_format.c b/alliance/src/loon/src/lon_lib_format.c +index 4b74006..f80275e 100644 +--- a/alliance/src/loon/src/lon_lib_format.c ++++ b/alliance/src/loon/src/lon_lib_format.c +@@ -228,7 +228,7 @@ extern int format_cell(befig_list* befig) + /*only one condition*/ + if (!befig->BEREG->BIABL || befig->BEREG->BIABL->NEXT) return 0; + #endif +- /*one ouput*/ ++ /*one output*/ + if (!befig->BEOUT || befig->BEOUT->NEXT) return 0; + /* forbid logic on output */ + if (!ABL_ATOM(befig->BEOUT->ABL)) { +@@ -251,7 +251,7 @@ extern int format_cell(befig_list* befig) + if (befig->BEBUS->NEXT || befig->BEREG || befig->BEBUX) return 0; + /*only one condition*/ + if (!befig->BEBUS->BIABL || befig->BEBUS->BIABL->NEXT) return 0; +- /*one ouput: bebus*/ ++ /*one output: bebus*/ + if (befig->BEOUT) return 0; + } + +@@ -260,7 +260,7 @@ extern int format_cell(befig_list* befig) + if (befig->BEBUX->NEXT || befig->BEREG || befig->BEBUS) return 0; + /*only one condition*/ + if (!befig->BEBUX->BIABL || befig->BEBUX->BIABL->NEXT) return 0; +- /*one ouput: beout*/ ++ /*one output: beout*/ + if (!befig->BEOUT || befig->BEOUT->NEXT) return 0; + /* forbid logic on output */ + if (!ABL_ATOM(befig->BEOUT->ABL)) { +@@ -287,7 +287,7 @@ extern int format_cell(befig_list* befig) + } + + if (befig->BEOUT) { +- /*one kind of ouput: beout*/ ++ /*one kind of output: beout*/ + if ( befig->BEBUS ) return 0; + } + +diff --git a/alliance/src/loon/src/lon_main.c b/alliance/src/loon/src/lon_main.c +index 572be04..08ebe5e 100644 +--- a/alliance/src/loon/src/lon_main.c ++++ b/alliance/src/loon/src/lon_main.c +@@ -459,7 +459,7 @@ extern int main (int argc, char* argv[]) + } + + +- /*colors and weight informations for xsch alliance displayer*/ ++ /*colors and weight information for xsch alliance displayer*/ + if (xsch_file) { + FILE* xsch_stream; + ptype_list* ptype; +diff --git a/alliance/src/loon/src/lon_optim_capa.c b/alliance/src/loon/src/lon_optim_capa.c +index e0ed104..7cdb6c8 100644 +--- a/alliance/src/loon/src/lon_optim_capa.c ++++ b/alliance/src/loon/src/lon_optim_capa.c +@@ -90,7 +90,7 @@ static ptype_list* sort_capa(ptype_list* capa) + + /***************************************************************************/ + /* try to improve timing by changing cell impedance */ +-/* return 1 if replace is successfull */ ++/* return 1 if replace is successful */ + /***************************************************************************/ + static int change_instance(loins_list* loins, losig_list* losig, lofig_list* lofig, int optim_level) + { +diff --git a/alliance/src/loon/src/lon_signal_name.c b/alliance/src/loon/src/lon_signal_name.c +index 6421824..6583c3e 100644 +--- a/alliance/src/loon/src/lon_signal_name.c ++++ b/alliance/src/loon/src/lon_signal_name.c +@@ -56,7 +56,7 @@ extern void free_nameindex() + + + /***************************************************************************/ +-/* return name concatenated with an index and seperated by '_' */ ++/* return name concatenated with an index and separated by '_' */ + /* this index is : how many times I have sent this name to getnameindex() */ + /* unicity is guaranteed until you run Put_index_to_zero() below */ + /***************************************************************************/ +@@ -79,7 +79,7 @@ extern char* getnameindex(char* name) + return name; /*unchanged*/ + } + else { +- /*add an occurence*/ ++ /*add an occurrence*/ + elem->VALUE++; + memo_char=SEPAR; /*external value from MBK environment*/ + SEPAR='_'; +diff --git a/alliance/src/loon/src/lon_signal_name.h b/alliance/src/loon/src/lon_signal_name.h +index ab790e5..524fc22 100644 +--- a/alliance/src/loon/src/lon_signal_name.h ++++ b/alliance/src/loon/src/lon_signal_name.h +@@ -52,7 +52,7 @@ extern void free_nameindex __P (()); + extern char* output_name __P ((char* name)); + + /***************************************************************************/ +-/* return name concatenated with an index and seperated by '_' */ ++/* return name concatenated with an index and separated by '_' */ + /* this index is : how many times I have sent this name to getnameindex() */ + /* unicity is guaranteed until you run Put_index_to_zero() below */ + /***************************************************************************/ +diff --git a/alliance/src/loon/src/lon_signal_netlist.c b/alliance/src/loon/src/lon_signal_netlist.c +index 3e59cbd..373eb34 100644 +--- a/alliance/src/loon/src/lon_signal_netlist.c ++++ b/alliance/src/loon/src/lon_signal_netlist.c +@@ -22,7 +22,7 @@ + */ + + /* +- * Tool : LooN - special netlist for timing dependancies ++ * Tool : LooN - special netlist for timing dependencies + * Date : 2000 + * Author : Francois Donnet + */ +@@ -139,7 +139,7 @@ extern double loins_max_T(loins_list* loins) + locon->NAME,loins->INSNAME); + autexit(1); + } +- /*eval delay on input dependancy*/ ++ /*eval delay on input dependency*/ + if (isvdd(locon->NAME) || isvss(locon->NAME)) continue; + if (locon->DIRECTION==OUT || locon->DIRECTION==TRISTATE) continue; + /*only clock accepted for flip-flop*/ +@@ -219,7 +219,7 @@ extern double loins_max_RC(loins_list* loins, char* output) + locon->NAME,loins->INSNAME); + autexit(1); + } +- /*eval delay on input dependancy*/ ++ /*eval delay on input dependency*/ + if (isvdd(locon->NAME) || isvss(locon->NAME)) continue; + if (locon->DIRECTION==OUT || locon->DIRECTION==TRISTATE) continue; + /*only clock accepted for flip-flop*/ +@@ -300,7 +300,7 @@ extern double loins_delay(loins_list* loins, char* output) + locon->NAME,loins->INSNAME); + autexit(1); + } +- /*eval delay on input dependancy*/ ++ /*eval delay on input dependency*/ + if (isvdd(locon->NAME) || isvss(locon->NAME)) continue; + if (locon->DIRECTION==OUT || locon->DIRECTION==TRISTATE) continue; + /*only clock accepted for flip-flop*/ +diff --git a/alliance/src/lvx/src/lvx.c b/alliance/src/lvx/src/lvx.c +index 32e49c6..5685bca 100644 +--- a/alliance/src/lvx/src/lvx.c ++++ b/alliance/src/lvx/src/lvx.c +@@ -46,7 +46,7 @@ + * + * Revision 1.4 2004/05/22 14:26:08 ludo + * Now, by default LVX does not check unassigned signals between the two input netlists. +- * (this feature is usefull/mandatory with the new VST driver that adds sometimes unused ++ * (this feature is useful/mandatory with the new VST driver that adds sometimes unused + * signals to have consitent VHDL vectors declaration) + * The command line option '-u' permits to behave like it was before and then check + * also unassigned signals. +@@ -456,7 +456,7 @@ unsigned char mark; + } + + prev_mark = ptnode->MARK; +- if (compar == -1) { /* two instances with same insname, but fignames differents */ ++ if (compar == -1) { /* two instances with same insname, but fignames different */ + if (prev_mark == mark) { /* the two instances are in the same figure */ + error_count ++; + printf ("\n\nInstance '%s' repeated with different fignames in netlist %i:", +@@ -792,7 +792,7 @@ ptype_list *ptype = NULL; + locon_list *locon; + unsigned char mark; + +-/* Searchs in the Tree of all connectors the node corresponding to the 'locon', ++/* Searches in the Tree of all connectors the node corresponding to the 'locon', + and returns the pointer to the locon in the opposite figure. 'mark' is the + mark of the figure for the given locon. + Returns NULL if not found. +diff --git a/alliance/src/mbk/man1/MBK_CATAL_NAME.1 b/alliance/src/mbk/man1/MBK_CATAL_NAME.1 +index 81995c2..31650c3 100644 +--- a/alliance/src/mbk/man1/MBK_CATAL_NAME.1 ++++ b/alliance/src/mbk/man1/MBK_CATAL_NAME.1 +@@ -9,7 +9,7 @@ MBK_CATAL_NAME + .TH MBK_CATAL_NAME 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_CATAL_NAME \- define the mbk catalog file +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man1/MBK_CATA_LIB.1 b/alliance/src/mbk/man1/MBK_CATA_LIB.1 +index 89610ed..59408f9 100644 +--- a/alliance/src/mbk/man1/MBK_CATA_LIB.1 ++++ b/alliance/src/mbk/man1/MBK_CATA_LIB.1 +@@ -9,7 +9,7 @@ MBK_CATA_LIB + .TH MBK_CATA_LIB 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_CATA_LIB \- define the mbk catalog directory +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -22,15 +22,15 @@ setenv MBK_CATA_LIB path1:path2:path3:...:...:pathn + .so man1/alc_origin.1 + .SH DESCRIPTION + \fBMBK_CATA_LIB\fP sets the directories that are to be searched thru for +-reading. When instanciating a cell for example, the first cell that is found ++reading. When instantiating a cell for example, the first cell that is found + with the given name is loaded in memory. + .br +-The seaching mecanism first look in ++The searching mechanism first look in + \fBMBK_WORK_LIB\fP(1), and then, in path1 thru pathn, in the order defined by the + user when typing the setenv command. + This directories are considered to be, from a mbk point of view, read only. + .br +-The pathi arguments must be actually accessible pathes on your host machine. ++The pathi arguments must be actually accessible paths on your host machine. + .SH ERRORS + .if n \{\ + .ft B \} +@@ -39,7 +39,7 @@ The pathi arguments must be actually accessible pathes on your host machine. + "mbk_fopen : can't open file 'unix_path/file.xx' thru directories : path1, ..., pathn" + .ft R + .RS +-This occurs when either the unix path is irrelevent, or when the file doesn't ++This occurs when either the unix path is irrelevant, or when the file doesn't + exist. This can also be a unix right problem if the file is not accessible for + reading, but this is seldom. + .SH EXAMPLE +diff --git a/alliance/src/mbk/man1/MBK_CK.1 b/alliance/src/mbk/man1/MBK_CK.1 +index 84cc1da..8b058ff 100644 +--- a/alliance/src/mbk/man1/MBK_CK.1 ++++ b/alliance/src/mbk/man1/MBK_CK.1 +@@ -9,7 +9,7 @@ MBK_CK + .TH MBK_CK 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_CK \- define the clock name pattern +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man1/MBK_IN_LO.1 b/alliance/src/mbk/man1/MBK_IN_LO.1 +index a6b7551..212be97 100644 +--- a/alliance/src/mbk/man1/MBK_IN_LO.1 ++++ b/alliance/src/mbk/man1/MBK_IN_LO.1 +@@ -9,7 +9,7 @@ MBK_IN_LO + .TH MBK_IN_LO 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_IN_LO \- define the logical input format of mbk and genlib +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -22,12 +22,12 @@ setenv MBK_IN_LO format + .so man1/alc_origin.1 + .SH DESCRIPTION + \fBMBK_IN_LO\fP sets the logical input format of the mbk database. The database +-will be filled with informations found in the given format file. ++will be filled with information found in the given format file. + .TP + valid formats are : + \- \fBal\fP, \fBalx\fP, that are alliance logical formats + .br +-\- \fBedi\fP, that is edif standart netlist format ++\- \fBedi\fP, that is edif standard netlist format + .br + \- \fBhns\fP, \fBfns\fP, \fBfne\fP, \fBfdn\fP, \fBhdn\fP, that are vti logical + formats +diff --git a/alliance/src/mbk/man1/MBK_IN_PH.1 b/alliance/src/mbk/man1/MBK_IN_PH.1 +index b374d6a..8567e1a 100644 +--- a/alliance/src/mbk/man1/MBK_IN_PH.1 ++++ b/alliance/src/mbk/man1/MBK_IN_PH.1 +@@ -9,7 +9,7 @@ MBK_IN_PH + .TH MBK_IN_PH 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_IN_PH \- define the physical input format of mbk and genlib +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -22,7 +22,7 @@ setenv MBK_IN_PH format + .so man1/alc_origin.1 + .SH DESCRIPTION + \fBMBK_IN_PH\fP sets the physical input format of the mbk data structure. +-The data structure will be filled with informations found in the given format ++The data structure will be filled with information found in the given format + file. + .TP + valid formats are : +diff --git a/alliance/src/mbk/man1/MBK_OUT_FILTER.1 b/alliance/src/mbk/man1/MBK_OUT_FILTER.1 +index 655dbf4..fcd531d 100644 +--- a/alliance/src/mbk/man1/MBK_OUT_FILTER.1 ++++ b/alliance/src/mbk/man1/MBK_OUT_FILTER.1 +@@ -8,7 +8,7 @@ MBK_OUT_FILTER \- define the input filter + .so man1/alc_origin.1 + + .SH DESCRIPTION +-\fBMBK_OUT_FILTER\fP sets the output filter for writting compressed Alliance ++\fBMBK_OUT_FILTER\fP sets the output filter for writing compressed Alliance + files. Filter is typically a string containing filename and options. This filter + must read non compressed data flow on it standard input and write compressed + data flow on it standard output. If a non compressed version of a file exist in +diff --git a/alliance/src/mbk/man1/MBK_OUT_LO.1 b/alliance/src/mbk/man1/MBK_OUT_LO.1 +index 4c414d5..56c18a6 100644 +--- a/alliance/src/mbk/man1/MBK_OUT_LO.1 ++++ b/alliance/src/mbk/man1/MBK_OUT_LO.1 +@@ -9,7 +9,7 @@ MBK_OUT_LO + .TH MBK_OUT_LO 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_OUT_LO \- define the logical output format of mbk and genlib +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man1/MBK_OUT_PH.1 b/alliance/src/mbk/man1/MBK_OUT_PH.1 +index b193ac3..cd32013 100644 +--- a/alliance/src/mbk/man1/MBK_OUT_PH.1 ++++ b/alliance/src/mbk/man1/MBK_OUT_PH.1 +@@ -9,7 +9,7 @@ MBK_OUT_PH + .TH MBK_OUT_PH 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_OUT_PH \- define the physical output format of mbk and genlib +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man1/MBK_SEPAR.1 b/alliance/src/mbk/man1/MBK_SEPAR.1 +index 0b4376f..9d5f60b 100644 +--- a/alliance/src/mbk/man1/MBK_SEPAR.1 ++++ b/alliance/src/mbk/man1/MBK_SEPAR.1 +@@ -9,7 +9,7 @@ MBK_SEPAR + .TH MBK_SEPAR 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_SEPAR \- define the separator character for hierarchy +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man1/MBK_VDD.1 b/alliance/src/mbk/man1/MBK_VDD.1 +index 2d02d64..20db8fb 100644 +--- a/alliance/src/mbk/man1/MBK_VDD.1 ++++ b/alliance/src/mbk/man1/MBK_VDD.1 +@@ -9,7 +9,7 @@ MBK_VDD + .TH MBK_VDD 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_VDD \- define the high level power name pattern +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man1/MBK_VSS.1 b/alliance/src/mbk/man1/MBK_VSS.1 +index 5a31ffc..7d08f71 100644 +--- a/alliance/src/mbk/man1/MBK_VSS.1 ++++ b/alliance/src/mbk/man1/MBK_VSS.1 +@@ -9,7 +9,7 @@ MBK_VSS + .TH MBK_VSS 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_VSS \- define the ground power name pattern +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man1/MBK_WORK_LIB.1 b/alliance/src/mbk/man1/MBK_WORK_LIB.1 +index 9da8b73..1a0b5d3 100644 +--- a/alliance/src/mbk/man1/MBK_WORK_LIB.1 ++++ b/alliance/src/mbk/man1/MBK_WORK_LIB.1 +@@ -9,7 +9,7 @@ MBK_WORK_LIB + .TH MBK_WORK_LIB 1 "October 1, 1997" "ASIM/LIP6" "MBK ENVIRONMENT VARIABLES" + .SH NAME + MBK_WORK_LIB \- define the mbk working directory +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -38,7 +38,7 @@ The unix path argument must be a actually accessible path on your host machine. + "mbk_fopen : can't open file 'unix_path/file.xx'" + .ft R + .RS +-This occurs when either the unix path is irrelevent, or when the file doesn't ++This occurs when either the unix path is irrelevant, or when the file doesn't + exist if it is open for reading, or when you don't have the right on the file + or directory while trying to write it. + .SH EXAMPLE +diff --git a/alliance/src/mbk/man3/addcapa.3 b/alliance/src/mbk/man3/addcapa.3 +index 9b02274..120fd51 100644 +--- a/alliance/src/mbk/man3/addcapa.3 ++++ b/alliance/src/mbk/man3/addcapa.3 +@@ -10,7 +10,7 @@ addcapa + .SH NAME + addcapa \- add a capacitance to a signal + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addchain.3 b/alliance/src/mbk/man3/addchain.3 +index 09543ff..d98ea03 100644 +--- a/alliance/src/mbk/man3/addchain.3 ++++ b/alliance/src/mbk/man3/addchain.3 +@@ -14,7 +14,7 @@ addchain + .SH NAME + addchain \- create a \fBchain\fP and add it to a list + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addht.3 b/alliance/src/mbk/man3/addht.3 +index 5ad0679..7b2b8b7 100644 +--- a/alliance/src/mbk/man3/addht.3 ++++ b/alliance/src/mbk/man3/addht.3 +@@ -15,7 +15,7 @@ addht + .SH NAME + addht \- create an hash table + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .if n \{\ + .ft B \} + .if t \{\ +diff --git a/alliance/src/mbk/man3/addhtitem.3 b/alliance/src/mbk/man3/addhtitem.3 +index 7d64bf7..21a752c 100644 +--- a/alliance/src/mbk/man3/addhtitem.3 ++++ b/alliance/src/mbk/man3/addhtitem.3 +@@ -15,7 +15,7 @@ addhtitem + .SH NAME + addhtitem \- adds a new item in a hash table. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .if n \{\ + .ft B \} + .if t \{\ +diff --git a/alliance/src/mbk/man3/addlocap.3 b/alliance/src/mbk/man3/addlocap.3 +index 25143f2..55e341c 100644 +--- a/alliance/src/mbk/man3/addlocap.3 ++++ b/alliance/src/mbk/man3/addlocap.3 +@@ -14,7 +14,7 @@ addlocap + .SH NAME + addlocap \- create a logical capacitor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addlocon.3 b/alliance/src/mbk/man3/addlocon.3 +index 4f78070..4686a91 100644 +--- a/alliance/src/mbk/man3/addlocon.3 ++++ b/alliance/src/mbk/man3/addlocon.3 +@@ -14,7 +14,7 @@ addlocon + .SH NAME + addlocon \- create a logical connector + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -53,7 +53,7 @@ fields of the \fIlocon\fP structure. The name should be unique at a given + hierarchical level since it's the connector identifier. + .br + The field \fITYPE\fP is set to \fBEXTERNAL\fP since a cell connector is +-beeing created. The instance connectors are builded up by the \fBaddloins\fP(3) ++being created. The instance connectors are builded up by the \fBaddloins\fP(3) + call. See \fBaddloins\fP(3) for details. + For a list of valid \fIdir\fP, see \fBlocon\fR(3). + .SH RETURN VALUE +@@ -67,7 +67,7 @@ For a list of valid \fIdir\fP, see \fBlocon\fR(3). + connector \fIname\fP already exists in figure \fIptfig\->NAME\fP" + .ft R + .RS +-The \fIname\fP beeing the logical connector idenfier, two connectors may not ++The \fIname\fP being the logical connector idenfier, two connectors may not + have the same name in a given figure. + .RE + .if n \{\ +diff --git a/alliance/src/mbk/man3/addlofig.3 b/alliance/src/mbk/man3/addlofig.3 +index aa4706cd..3c5a954 100644 +--- a/alliance/src/mbk/man3/addlofig.3 ++++ b/alliance/src/mbk/man3/addlofig.3 +@@ -14,7 +14,7 @@ addlofig + .SH NAME + addlofig \- create a new structural cell model + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addloins.3 b/alliance/src/mbk/man3/addloins.3 +index 2a4c3e8..c1eb11c 100644 +--- a/alliance/src/mbk/man3/addloins.3 ++++ b/alliance/src/mbk/man3/addloins.3 +@@ -14,7 +14,7 @@ addloins + .SH NAME + addloins \- create a logical instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -57,7 +57,7 @@ linked to each connector are the one given in the \fIsigchain\fP argument. See + .br + The matching is done in order, it means that the first connector is linked + to the first signal of the \fIsigchain\fP, and so on. Care must be taken when +-instanciating in order to warranty the validity of the netlist. ++instantiating in order to warranty the validity of the netlist. + For details on the structure, see \fBloins\fR(3). + .SH RETURN VALUE + \fBaddloins\fP returns a pointer to the newly created instance. +diff --git a/alliance/src/mbk/man3/addlomodel.3 b/alliance/src/mbk/man3/addlomodel.3 +index 70e00fe..caffc2f 100644 +--- a/alliance/src/mbk/man3/addlomodel.3 ++++ b/alliance/src/mbk/man3/addlomodel.3 +@@ -14,7 +14,7 @@ addlomodel + .SH NAME + addlomodel \- create a tempotary logical model and add it to a list + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addlores.3 b/alliance/src/mbk/man3/addlores.3 +index 16c3992..43f5f97 100644 +--- a/alliance/src/mbk/man3/addlores.3 ++++ b/alliance/src/mbk/man3/addlores.3 +@@ -14,7 +14,7 @@ addlores + .SH NAME + addlores \- create a logical resistor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addloself.3 b/alliance/src/mbk/man3/addloself.3 +index 51fc805..3979221 100644 +--- a/alliance/src/mbk/man3/addloself.3 ++++ b/alliance/src/mbk/man3/addloself.3 +@@ -14,7 +14,7 @@ addloself + .SH NAME + addloself \- create a logical inductor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addlosig.3 b/alliance/src/mbk/man3/addlosig.3 +index 71cc66e..b057a7b 100644 +--- a/alliance/src/mbk/man3/addlosig.3 ++++ b/alliance/src/mbk/man3/addlosig.3 +@@ -14,7 +14,7 @@ addlosig + .SH NAME + addlosig \- create a logical signal + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addlotrs.3 b/alliance/src/mbk/man3/addlotrs.3 +index 8608514..da38924 100644 +--- a/alliance/src/mbk/man3/addlotrs.3 ++++ b/alliance/src/mbk/man3/addlotrs.3 +@@ -14,7 +14,7 @@ addlotrs + .SH NAME + addlotrs \- create a logical transistor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addnum.3 b/alliance/src/mbk/man3/addnum.3 +index fe89d68..d28ffc5 100644 +--- a/alliance/src/mbk/man3/addnum.3 ++++ b/alliance/src/mbk/man3/addnum.3 +@@ -14,7 +14,7 @@ addnum + .SH NAME + addnum \- create a \fBnum\fP and add it to a list + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addphcon.3 b/alliance/src/mbk/man3/addphcon.3 +index 057f07b..8af59bd 100644 +--- a/alliance/src/mbk/man3/addphcon.3 ++++ b/alliance/src/mbk/man3/addphcon.3 +@@ -14,7 +14,7 @@ addphcon + .SH NAME + addphcon \- create a physical connector + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -79,7 +79,7 @@ For a list of valid \fIorient\fP and \fIlayer\fPs, see + .ft B \} + .if t \{\ + .ft CR \} +-"\(**\(**\(** mbk error \(**\(**\(** illegal addphcon unknow layer \fIlayer\fP in \fIconname\fP" ++"\(**\(**\(** mbk error \(**\(**\(** illegal addphcon unknown layer \fIlayer\fP in \fIconname\fP" + .ft R + .RS + The \fIlayer\fP parameter is out of range, and does not represent a legal +diff --git a/alliance/src/mbk/man3/addphfig.3 b/alliance/src/mbk/man3/addphfig.3 +index 1380597..edeceb4 100644 +--- a/alliance/src/mbk/man3/addphfig.3 ++++ b/alliance/src/mbk/man3/addphfig.3 +@@ -14,7 +14,7 @@ addphfig + .SH NAME + addphfig \- create a new physical cell model + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addphins.3 b/alliance/src/mbk/man3/addphins.3 +index 5e452f4..b8d2d1b 100644 +--- a/alliance/src/mbk/man3/addphins.3 ++++ b/alliance/src/mbk/man3/addphins.3 +@@ -14,7 +14,7 @@ addphins + .SH NAME + addphins \- create a physical instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -57,9 +57,9 @@ the \fIFIGNAME\fP, \fIINSNAME\fP, \fITRANSF\fP, \fIXINS\fP and \fIYINS\fP + fields of the \fIphins\fP structure. + .br + The \fBaddphins\fP function does not check in memory or on disk to see +-if the instanciated model exists, since no informations on it are needed. ++if the instantiated model exists, since no information on it are needed. + .br +-The coordinates are not transformation dependant. It means that the ++The coordinates are not transformation dependent. It means that the + transformation is performed before placing the instance at the given point. + For details on the structure, see \fBphins\fR(3). + .SH RETURN VALUE +@@ -74,8 +74,8 @@ For details on the structure, see \fBphins\fR(3). + .ft R + .RS + The instance has for model name of the figure on the which it is to be added. +-It's illegal and dangerous. This check is made at the actual hierachy level +-only, not recursivly on the structure, so it still may happend. ++It's illegal and dangerous. This check is made at the actual hierarchy level ++only, not recursivly on the structure, so it still may happened. + .RE + .LP + .if n \{\ +diff --git a/alliance/src/mbk/man3/addphref.3 b/alliance/src/mbk/man3/addphref.3 +index 616c242..c4f20f7 100644 +--- a/alliance/src/mbk/man3/addphref.3 ++++ b/alliance/src/mbk/man3/addphref.3 +@@ -14,7 +14,7 @@ addphref + .SH NAME + addphref \- create a physical reference + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addphseg.3 b/alliance/src/mbk/man3/addphseg.3 +index d404462..3a63a33 100644 +--- a/alliance/src/mbk/man3/addphseg.3 ++++ b/alliance/src/mbk/man3/addphseg.3 +@@ -14,7 +14,7 @@ addphseg + .SH NAME + addphseg \- create a physical segment + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addphvia.3 b/alliance/src/mbk/man3/addphvia.3 +index 54618b9..ba222c5 100644 +--- a/alliance/src/mbk/man3/addphvia.3 ++++ b/alliance/src/mbk/man3/addphvia.3 +@@ -14,7 +14,7 @@ addphvia + .SH NAME + addphvia \- create a physical via + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/addptype.3 b/alliance/src/mbk/man3/addptype.3 +index 93a745d..67fb81b 100644 +--- a/alliance/src/mbk/man3/addptype.3 ++++ b/alliance/src/mbk/man3/addptype.3 +@@ -14,7 +14,7 @@ addptype + .SH NAME + addptype \- create a \fBptype\fP and add it to a \fBptype_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -48,7 +48,7 @@ The \fItype\fP argument indicates the pointer type, at the C type meaning, + for its owner. + .br + The \fItype\fPs allow to access the pointers with adequat cast, and for example +-to share informations in the \fIUSER\fP fields of mbk structures. ++to share information in the \fIUSER\fP fields of mbk structures. + .br + The \fIptdata\fP points to any kind of list or may itself be a value, if proper + cast is performed at compilation time, and fills the \fIDATA\fP field of the +diff --git a/alliance/src/mbk/man3/alliancebanner.3 b/alliance/src/mbk/man3/alliancebanner.3 +index 98129d5..d48fa8f 100644 +--- a/alliance/src/mbk/man3/alliancebanner.3 ++++ b/alliance/src/mbk/man3/alliancebanner.3 +@@ -8,7 +8,7 @@ + .SH NAME + alliancebanner \- display the standardized Alliance banner + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .ft 4 + #include "mut.h" +@@ -34,9 +34,9 @@ Copyright dates. + \f4av\fP + Alliance version. + .SH DESCRIPTION +-\fBalliancebanner\fP ouputs on \f4stdout\fR a standardized banner with ++\fBalliancebanner\fP outputs on \f4stdout\fR a standardized banner with + the name of the tool in large letters, and a cartouche containing some +-informations about the Alliance CAD system. ++information about the Alliance CAD system. + This function is to be used by all the Alliance tools, and expect a + display 80 columns wide. + .SH EXAMPLE +diff --git a/alliance/src/mbk/man3/append.3 b/alliance/src/mbk/man3/append.3 +index 26182e4..a06a681 100644 +--- a/alliance/src/mbk/man3/append.3 ++++ b/alliance/src/mbk/man3/append.3 +@@ -14,7 +14,7 @@ append + .SH NAME + append \- append a \fBchain_list\fP to an other \fBchain_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/bigvia.3 b/alliance/src/mbk/man3/bigvia.3 +index 0328c34..f9bdc1a 100644 +--- a/alliance/src/mbk/man3/bigvia.3 ++++ b/alliance/src/mbk/man3/bigvia.3 +@@ -14,7 +14,7 @@ bigvia + .SH NAME + bigvia \- draws a non minimal via as a bunch of vias + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/chain.3 b/alliance/src/mbk/man3/chain.3 +index 1d49cc5..2e3a781 100644 +--- a/alliance/src/mbk/man3/chain.3 ++++ b/alliance/src/mbk/man3/chain.3 +@@ -15,7 +15,7 @@ chain + chain \- mbk lisp-like service structure + .SH DESCRIPTION + The \fBchain\fP is used for any purpose, when a list of pointer is required. +-The use of this structure is strongly recommanded, when such a need occurs. ++The use of this structure is strongly recommended, when such a need occurs. + .LP + The declarations needed to work on \fBchain\fP are available in the header file + \fI"/labo/include/mut315.h"\fP, where '\fI315\fP' is the actual mbk version. +diff --git a/alliance/src/mbk/man3/checkloconorder.3 b/alliance/src/mbk/man3/checkloconorder.3 +index a57cd42..25ac04a 100644 +--- a/alliance/src/mbk/man3/checkloconorder.3 ++++ b/alliance/src/mbk/man3/checkloconorder.3 +@@ -14,7 +14,7 @@ checkloconorder + .SH NAME + checkloconorder \- checks the consistency of a list of logical connectors + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/concatname.3 b/alliance/src/mbk/man3/concatname.3 +index 363fff5..9a7e731 100644 +--- a/alliance/src/mbk/man3/concatname.3 ++++ b/alliance/src/mbk/man3/concatname.3 +@@ -14,7 +14,7 @@ concatname + .SH NAME + concatname \- concatenate two names with user separator + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -35,7 +35,7 @@ Pointer to a string + .SH DESCRIPTION + The \fBconcatname\fP function adds the separator defined by \fBMBK_SEPAR\fP(1), + and then the string \fIt\fP at the end of string \fIs\fP. This is not like a +-\fBstrcat\fP(3) of the standard library, because \fIs\fP is not beeing modified. ++\fBstrcat\fP(3) of the standard library, because \fIs\fP is not being modified. + The string returned has already been put in the names dictionary by + a call to \fBnamealloc\fP(3). + .SH RETURN VALUE +diff --git a/alliance/src/mbk/man3/defab.3 b/alliance/src/mbk/man3/defab.3 +index e94d3dc..fae357a 100644 +--- a/alliance/src/mbk/man3/defab.3 ++++ b/alliance/src/mbk/man3/defab.3 +@@ -10,7 +10,7 @@ defab + .SH NAME + defab \- defines the \fIabutment box\fP of a \fBphfig\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delchain.3 b/alliance/src/mbk/man3/delchain.3 +index 320c2df..6ab5b74 100644 +--- a/alliance/src/mbk/man3/delchain.3 ++++ b/alliance/src/mbk/man3/delchain.3 +@@ -14,7 +14,7 @@ delchain + .SH NAME + delchain \- delete an element of a \fBchain_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delht.3 b/alliance/src/mbk/man3/delht.3 +index bc5594d..460dbfb 100644 +--- a/alliance/src/mbk/man3/delht.3 ++++ b/alliance/src/mbk/man3/delht.3 +@@ -15,7 +15,7 @@ delht + .SH NAME + delht \- removes an hash table + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + #include "mut.h" + void delht(table) +diff --git a/alliance/src/mbk/man3/delhtitem.3 b/alliance/src/mbk/man3/delhtitem.3 +index 5b27512..2183369 100644 +--- a/alliance/src/mbk/man3/delhtitem.3 ++++ b/alliance/src/mbk/man3/delhtitem.3 +@@ -15,7 +15,7 @@ delhtitem + .SH NAME + delhtitem \- removes an item in an hash table + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .if n \{\ + .ft B \} + .if t \{\ +diff --git a/alliance/src/mbk/man3/dellocap.3 b/alliance/src/mbk/man3/dellocap.3 +index 42e765b..fcd42b2 100644 +--- a/alliance/src/mbk/man3/dellocap.3 ++++ b/alliance/src/mbk/man3/dellocap.3 +@@ -14,7 +14,7 @@ dellocap + .SH NAME + dellocap \- delete a logical capacitor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -38,7 +38,7 @@ Pointer to the capacitor to be deleted. + \fBdellocap\fP delete the capacitor pointed to by \fIptcap\fP in the figure + pointed to by \fIptfig\fP. + The list consistency is maintainded, and the space freed. The capacitor +-connectors are also freed, since if the capacitor disapear, ++connectors are also freed, since if the capacitor disappear, + no more connections can occur on it. + .SH RETURN VALUE + \fBdellocap\fP returns \fB1\fP if the capacitor has been deleted, \fB0\fP +diff --git a/alliance/src/mbk/man3/dellocon.3 b/alliance/src/mbk/man3/dellocon.3 +index fb9a829..805d639 100644 +--- a/alliance/src/mbk/man3/dellocon.3 ++++ b/alliance/src/mbk/man3/dellocon.3 +@@ -14,7 +14,7 @@ dellocon + .SH NAME + dellocon \- delete a logical connector + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/dellofig.3 b/alliance/src/mbk/man3/dellofig.3 +index fc294b4..6662614 100644 +--- a/alliance/src/mbk/man3/dellofig.3 ++++ b/alliance/src/mbk/man3/dellofig.3 +@@ -14,7 +14,7 @@ dellofig + .SH NAME + dellofig \- delete and free a logical figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delloins.3 b/alliance/src/mbk/man3/delloins.3 +index 25f003a..961af57 100644 +--- a/alliance/src/mbk/man3/delloins.3 ++++ b/alliance/src/mbk/man3/delloins.3 +@@ -14,7 +14,7 @@ delloins + .SH NAME + delloins \- delete a logical instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -38,7 +38,7 @@ Name of the instance to be deleted. + pointed to by \fIptfig\fP. This instance is warrantied to be unique, because + its name is an identifier at the given hierarchical level. + The list consistency is maintainded, and the space freed. The instance +-connectors are also freed, since if the instance disapear, no more connections ++connectors are also freed, since if the instance disappear, no more connections + can occur on it. + .SH RETURN VALUE + \fBdelloins\fP returns \fB1\fP if the instance has been deleted, \fB0\fP +diff --git a/alliance/src/mbk/man3/dellores.3 b/alliance/src/mbk/man3/dellores.3 +index 53a8f07..fa5ef36 100644 +--- a/alliance/src/mbk/man3/dellores.3 ++++ b/alliance/src/mbk/man3/dellores.3 +@@ -14,7 +14,7 @@ dellores + .SH NAME + dellores \- delete a logical resistor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -38,7 +38,7 @@ Pointer to the resistor to be deleted. + \fBdellores\fP delete the resistor pointed to by \fIptres\fP in the figure + pointed to by \fIptfig\fP. + The list consistency is maintainded, and the space freed. The resistor +-connectors are also freed, since if the resistor disapear, ++connectors are also freed, since if the resistor disappear, + no more connections can occur on it. + .SH RETURN VALUE + \fBdellores\fP returns \fB1\fP if the resistor has been deleted, \fB0\fP +diff --git a/alliance/src/mbk/man3/delloself.3 b/alliance/src/mbk/man3/delloself.3 +index a6deddb..e4d702e 100644 +--- a/alliance/src/mbk/man3/delloself.3 ++++ b/alliance/src/mbk/man3/delloself.3 +@@ -14,7 +14,7 @@ delloself + .SH NAME + delloself \- delete a logical inductor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -38,7 +38,7 @@ Pointer to the inductor to be deleted. + \fBdelloself\fP delete the inductor pointed to by \fIptself\fP in the figure + pointed to by \fIptfig\fP. + The list consistency is maintainded, and the space freed. The inductor +-connectors are also freed, since if the inductor disapear, ++connectors are also freed, since if the inductor disappear, + no more connections can occur on it. + .SH RETURN VALUE + \fBdelloself\fP returns \fB1\fP if the inductor has been deleted, \fB0\fP +diff --git a/alliance/src/mbk/man3/dellosig.3 b/alliance/src/mbk/man3/dellosig.3 +index 4296a01..2f7c836 100644 +--- a/alliance/src/mbk/man3/dellosig.3 ++++ b/alliance/src/mbk/man3/dellosig.3 +@@ -14,7 +14,7 @@ dellosig + .SH NAME + dellosig \- delete a logical signal + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/dellotrs.3 b/alliance/src/mbk/man3/dellotrs.3 +index 78a8ff1..21cfb0f 100644 +--- a/alliance/src/mbk/man3/dellotrs.3 ++++ b/alliance/src/mbk/man3/dellotrs.3 +@@ -14,7 +14,7 @@ dellotrs + .SH NAME + dellotrs \- delete a logical transistor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -37,7 +37,7 @@ Pointer to the transistor to be deleted. + \fBdellotrs\fP delete the transistor pointed to by \fIpttrs\fP in the figure + pointed to by \fIptfig\fP. + The list consistency is maintainded, and the space freed. The transistor +-connectors are also freed, since if the transistor disapear, ++connectors are also freed, since if the transistor disappear, + no more connections can occur on it. + .SH RETURN VALUE + \fBdellotrs\fP returns \fB1\fP if the transistor has been deleted, \fB0\fP +diff --git a/alliance/src/mbk/man3/delnum.3 b/alliance/src/mbk/man3/delnum.3 +index 958870c..a944179 100644 +--- a/alliance/src/mbk/man3/delnum.3 ++++ b/alliance/src/mbk/man3/delnum.3 +@@ -14,7 +14,7 @@ delnum + .SH NAME + delnum \- delete an element of a \fBnum_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delphcon.3 b/alliance/src/mbk/man3/delphcon.3 +index c241950..2d73169 100644 +--- a/alliance/src/mbk/man3/delphcon.3 ++++ b/alliance/src/mbk/man3/delphcon.3 +@@ -14,7 +14,7 @@ delphcon + .SH NAME + delphcon \- delete a physical connector + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delphfig.3 b/alliance/src/mbk/man3/delphfig.3 +index c3a582e..1d44a43 100644 +--- a/alliance/src/mbk/man3/delphfig.3 ++++ b/alliance/src/mbk/man3/delphfig.3 +@@ -14,7 +14,7 @@ delphfig + .SH NAME + delphfig \- delete and free a physical figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delphins.3 b/alliance/src/mbk/man3/delphins.3 +index e96c98d..e6fe912 100644 +--- a/alliance/src/mbk/man3/delphins.3 ++++ b/alliance/src/mbk/man3/delphins.3 +@@ -14,7 +14,7 @@ delphins + .SH NAME + delphins \- delete a physical instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delphref.3 b/alliance/src/mbk/man3/delphref.3 +index 4dbd575..9641d7c 100644 +--- a/alliance/src/mbk/man3/delphref.3 ++++ b/alliance/src/mbk/man3/delphref.3 +@@ -14,7 +14,7 @@ delphref + .SH NAME + delphref \- delete a physical reference + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delphseg.3 b/alliance/src/mbk/man3/delphseg.3 +index a09bffb..77a32e9 100644 +--- a/alliance/src/mbk/man3/delphseg.3 ++++ b/alliance/src/mbk/man3/delphseg.3 +@@ -14,7 +14,7 @@ delphseg + .SH NAME + delphseg \- delete a physical segment + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delphvia.3 b/alliance/src/mbk/man3/delphvia.3 +index 6192ea7..ab6cfe8 100644 +--- a/alliance/src/mbk/man3/delphvia.3 ++++ b/alliance/src/mbk/man3/delphvia.3 +@@ -14,7 +14,7 @@ delphvia + .SH NAME + delphvia \- delete a physical via + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/delptype.3 b/alliance/src/mbk/man3/delptype.3 +index 6ffb4e0..84dcbf9 100644 +--- a/alliance/src/mbk/man3/delptype.3 ++++ b/alliance/src/mbk/man3/delptype.3 +@@ -14,7 +14,7 @@ delptype + .SH NAME + delptype \- delete an element of a \fBptype_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/downstr.3 b/alliance/src/mbk/man3/downstr.3 +index ed643e6..883c67e 100644 +--- a/alliance/src/mbk/man3/downstr.3 ++++ b/alliance/src/mbk/man3/downstr.3 +@@ -14,7 +14,7 @@ downstr + .SH NAME + downstr \- convert a string to lower case + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/filepath.3 b/alliance/src/mbk/man3/filepath.3 +index fff02c0..1c88009 100644 +--- a/alliance/src/mbk/man3/filepath.3 ++++ b/alliance/src/mbk/man3/filepath.3 +@@ -14,7 +14,7 @@ filepath + .SH NAME + filepath \- return the whole search path of a file + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -46,7 +46,7 @@ The file to be searched is called \fIname.extension\fP, if extension is not + \fB""\fP, then the file name will be \fIname.\fP\ . + .br + .SH RETURN VALUE +-\fBfilepath\fP returns \fBNULL\fP on failure, ie the file is not in the pathes, ++\fBfilepath\fP returns \fBNULL\fP on failure, ie the file is not in the paths, + or the absolute path on success. + The value returned, when not \fBNULL\fP, is stored in a \fBstatic\fP buffer, + so this values is to use at return time or copied into a user buffer. +diff --git a/alliance/src/mbk/man3/flattenlofig.3 b/alliance/src/mbk/man3/flattenlofig.3 +index 8980386..93b9fc6 100644 +--- a/alliance/src/mbk/man3/flattenlofig.3 ++++ b/alliance/src/mbk/man3/flattenlofig.3 +@@ -14,7 +14,7 @@ flattenlofig + .SH NAME + flattenlofig \- flatten a instance in a logical figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -43,7 +43,7 @@ pointed to by \fIptfig\fP. Flattening means incorporating the + contents of the instance in the figure and removing it from its instance list. + .br + the \fIconcat\fP argument can take either the value \fBYES\fP in which case the +-name of the objects comming from the instance are named ++name of the objects coming from the instance are named + \fIinsname'X'objectname\fP, where \fI'X'\fP is the caracter set int the + \fBMBK_SEPAR\fP(1) environment variable, or the value \fBNO\fP, and then the + object name remains inchanged. This is quite dangerous since name unicity is +diff --git a/alliance/src/mbk/man3/flattenphfig.3 b/alliance/src/mbk/man3/flattenphfig.3 +index e3372b3..596af4c 100644 +--- a/alliance/src/mbk/man3/flattenphfig.3 ++++ b/alliance/src/mbk/man3/flattenphfig.3 +@@ -14,7 +14,7 @@ flattenphfig + .SH NAME + flatenphfig \- flatten a instance in a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -43,7 +43,7 @@ pointed to by \fIptfig\fP. Flattening means incorporating the + contents of the instance in the figure and removing it from its instance list. + .br + the \fIconcat\fP argument can take either the value \fBYES\fP in which case the +-name of the object comming from the instance are named ++name of the object coming from the instance are named + \fIinsname'X'objectname\fP, where \fI'X'\fP is the caracter set int the + \fBMBK_SEPAR\fP(1) environment variable, or the value \fBNO\fP, and then the + object name remains inchanged. This is quite dangerous since name unicity is +diff --git a/alliance/src/mbk/man3/freechain.3 b/alliance/src/mbk/man3/freechain.3 +index 4d83c39..75b5b6a 100644 +--- a/alliance/src/mbk/man3/freechain.3 ++++ b/alliance/src/mbk/man3/freechain.3 +@@ -14,7 +14,7 @@ freechain + .SH NAME + freechain \- free a \fBchain_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/freelomodel.3 b/alliance/src/mbk/man3/freelomodel.3 +index 6c82966..c5fd436 100644 +--- a/alliance/src/mbk/man3/freelomodel.3 ++++ b/alliance/src/mbk/man3/freelomodel.3 +@@ -14,7 +14,7 @@ freelomodel + .SH NAME + freelomodel \- free a \fBlofig_list\fP for temporary models + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/freenum.3 b/alliance/src/mbk/man3/freenum.3 +index 73c9d59..dfa21de 100644 +--- a/alliance/src/mbk/man3/freenum.3 ++++ b/alliance/src/mbk/man3/freenum.3 +@@ -14,7 +14,7 @@ freenum + .SH NAME + freenum \- free a \fBnum_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/freeptype.3 b/alliance/src/mbk/man3/freeptype.3 +index 992f4aa..28e2367 100644 +--- a/alliance/src/mbk/man3/freeptype.3 ++++ b/alliance/src/mbk/man3/freeptype.3 +@@ -14,7 +14,7 @@ freeptype + .SH NAME + freeptype \- free a \fBptype_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/gethtitem.3 b/alliance/src/mbk/man3/gethtitem.3 +index 730c472..f1650a8 100644 +--- a/alliance/src/mbk/man3/gethtitem.3 ++++ b/alliance/src/mbk/man3/gethtitem.3 +@@ -15,7 +15,7 @@ gethtitem + .SH NAME + gethtitem \- searches an item in a hash table + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .if n \{\ + .ft B \} + .if t \{\ +diff --git a/alliance/src/mbk/man3/getlocap.3 b/alliance/src/mbk/man3/getlocap.3 +index 2a2d56a..20c1a14 100644 +--- a/alliance/src/mbk/man3/getlocap.3 ++++ b/alliance/src/mbk/man3/getlocap.3 +@@ -14,7 +14,7 @@ getlocap + .SH NAME + getlocap \- retrieve a logical capacitor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getlocon.3 b/alliance/src/mbk/man3/getlocon.3 +index 1e8c551..5f3bb9a 100644 +--- a/alliance/src/mbk/man3/getlocon.3 ++++ b/alliance/src/mbk/man3/getlocon.3 +@@ -14,7 +14,7 @@ getlocon + .SH NAME + getlocon \- retrieve a logical connector + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getlofig.3 b/alliance/src/mbk/man3/getlofig.3 +index d0f3ca9..2e37a27 100644 +--- a/alliance/src/mbk/man3/getlofig.3 ++++ b/alliance/src/mbk/man3/getlofig.3 +@@ -14,7 +14,7 @@ getlofig + .SH NAME + getlofig \- give back a pointer to a \fIlofig\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -40,7 +40,7 @@ warranty that the expected information is present in memory. + If \fImode\fP is \fB'A'\fP then the figure has all its lists filled, else + the figure may either be complete or interface only. + .br +-This function allows to completly mask disk access for applications ++This function allows to completely mask disk access for applications + programs. If the figure is in memory, with the specified \fImode\fP, + then the function returns the appropriate pointer. Else, the function performs + a call to the \fBloadlofig(3)\fP and returns a pointer to the loaded +diff --git a/alliance/src/mbk/man3/getloins.3 b/alliance/src/mbk/man3/getloins.3 +index 0b8f485..28ea058 100644 +--- a/alliance/src/mbk/man3/getloins.3 ++++ b/alliance/src/mbk/man3/getloins.3 +@@ -14,7 +14,7 @@ getloins + .SH NAME + getloins \- retrieve a logical instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getlomodel.3 b/alliance/src/mbk/man3/getlomodel.3 +index b861d4e..74e069d 100644 +--- a/alliance/src/mbk/man3/getlomodel.3 ++++ b/alliance/src/mbk/man3/getlomodel.3 +@@ -14,7 +14,7 @@ getlomodel + .SH NAME + getlomodel \- retrieve a model from a \fBlofig_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getlores.3 b/alliance/src/mbk/man3/getlores.3 +index 54fa6bf..cb5389d 100644 +--- a/alliance/src/mbk/man3/getlores.3 ++++ b/alliance/src/mbk/man3/getlores.3 +@@ -14,7 +14,7 @@ getlores + .SH NAME + getlores \- retrieve a logical resistor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getloself.3 b/alliance/src/mbk/man3/getloself.3 +index afb4508..d915074 100644 +--- a/alliance/src/mbk/man3/getloself.3 ++++ b/alliance/src/mbk/man3/getloself.3 +@@ -14,7 +14,7 @@ getloself + .SH NAME + getloself \- retrieve a logical inductor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getlosig.3 b/alliance/src/mbk/man3/getlosig.3 +index 84be2b4..d8692ee 100644 +--- a/alliance/src/mbk/man3/getlosig.3 ++++ b/alliance/src/mbk/man3/getlosig.3 +@@ -14,7 +14,7 @@ getlosig + .SH NAME + getlosig \- retrieve a logical signal + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getlotrs.3 b/alliance/src/mbk/man3/getlotrs.3 +index 674a624..047352a 100644 +--- a/alliance/src/mbk/man3/getlotrs.3 ++++ b/alliance/src/mbk/man3/getlotrs.3 +@@ -14,7 +14,7 @@ getlotrs + .SH NAME + getlotrs \- retrieve a logical transistor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getphcon.3 b/alliance/src/mbk/man3/getphcon.3 +index b6758da..9d15023 100644 +--- a/alliance/src/mbk/man3/getphcon.3 ++++ b/alliance/src/mbk/man3/getphcon.3 +@@ -14,7 +14,7 @@ getphcon + .SH NAME + getphcon \- retrieve a physical connector + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getphfig.3 b/alliance/src/mbk/man3/getphfig.3 +index dbabc93..580e810 100644 +--- a/alliance/src/mbk/man3/getphfig.3 ++++ b/alliance/src/mbk/man3/getphfig.3 +@@ -14,7 +14,7 @@ getphfig + .SH NAME + getphfig \- give back a pointer to a \fIphfig\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -39,7 +39,7 @@ warranty that the expected information is present in memory. + If \fImode\fP is \fB'A'\fP then the figure has all its lists filled, else + the figure may either be complete or interface only. + .br +-This function allows to completly mask disk access for applications ++This function allows to completely mask disk access for applications + programs. If the figure is in memory, with the specified \fImode\fP, + then the function returns the appropriate pointer. Else, the function performs + a call to the \fBloadphfig\fP(3) and returns a pointer to the loaded +diff --git a/alliance/src/mbk/man3/getphins.3 b/alliance/src/mbk/man3/getphins.3 +index 4daafaf..daf9edc 100644 +--- a/alliance/src/mbk/man3/getphins.3 ++++ b/alliance/src/mbk/man3/getphins.3 +@@ -14,7 +14,7 @@ getphins + .SH NAME + getphins \- retrieve a physical instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getphref.3 b/alliance/src/mbk/man3/getphref.3 +index 33320bf..593748a 100644 +--- a/alliance/src/mbk/man3/getphref.3 ++++ b/alliance/src/mbk/man3/getphref.3 +@@ -14,7 +14,7 @@ getphref + .SH NAME + getphref \- retrieve a physical reference + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getptype.3 b/alliance/src/mbk/man3/getptype.3 +index db2b7a3..f9f314e 100644 +--- a/alliance/src/mbk/man3/getptype.3 ++++ b/alliance/src/mbk/man3/getptype.3 +@@ -14,7 +14,7 @@ getptype + .SH NAME + getptype \- retrieve a \fBptype\fP from a \fBptype_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/getsigname.3 b/alliance/src/mbk/man3/getsigname.3 +index 6817bf0..e203806 100644 +--- a/alliance/src/mbk/man3/getsigname.3 ++++ b/alliance/src/mbk/man3/getsigname.3 +@@ -10,7 +10,7 @@ getsigname + .SH NAME + getsigname \- choose a signal name in alias list + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -33,7 +33,7 @@ structure, and contains zero or more names corresponding to the signal. + Since the signal may result from a flatten, instance names may be concatenated + to the actual signal name. + .SH RETURN VALUE +-\fBgetsigname\fP returns the higher hierachy level name, if ++\fBgetsigname\fP returns the higher hierarchy level name, if + \fIptsig\->NAMECHAIN\fP is not \fBNULL\fP, else a name constructed with + the signal \fBINDEX\fP is returned. + .SH EXAMPLE +diff --git a/alliance/src/mbk/man3/givelosig.3 b/alliance/src/mbk/man3/givelosig.3 +index 6a3b07c..09b5c4c 100644 +--- a/alliance/src/mbk/man3/givelosig.3 ++++ b/alliance/src/mbk/man3/givelosig.3 +@@ -14,7 +14,7 @@ givelosig + .SH NAME + givelosig \- give a logical signal + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/guessextdir.3 b/alliance/src/mbk/man3/guessextdir.3 +index 40528e9..3b321a5 100644 +--- a/alliance/src/mbk/man3/guessextdir.3 ++++ b/alliance/src/mbk/man3/guessextdir.3 +@@ -15,7 +15,7 @@ guessextdir + .SH NAME + guessextdir \- guess external connectors directions from internal connectors directions + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/incatalog.3 b/alliance/src/mbk/man3/incatalog.3 +index 2f4d635..1fb8c70 100644 +--- a/alliance/src/mbk/man3/incatalog.3 ++++ b/alliance/src/mbk/man3/incatalog.3 +@@ -14,7 +14,7 @@ incatalog + .SH NAME + incatalog \- test if cell belongs to the catalog file + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,10 +30,10 @@ char \(**figname; + \fIfigname\fP + Name of the cell to be checked + .SH DESCRIPTION +-\fBincatalog\fP checks a cell represented by its \fIfigname\fP beeing ++\fBincatalog\fP checks a cell represented by its \fIfigname\fP being + present in the catalog file with the \fB'C'\fP attribut. + .br +-This means that when flattening, the hierachy destruction stops when ++This means that when flattening, the hierarchy destruction stops when + encountering a cell belonging to the catalog. + This is meant for both logical and physical views, of course. + .br +diff --git a/alliance/src/mbk/man3/incatalogdelete.3 b/alliance/src/mbk/man3/incatalogdelete.3 +index 2e41b1f..50de296 100644 +--- a/alliance/src/mbk/man3/incatalogdelete.3 ++++ b/alliance/src/mbk/man3/incatalogdelete.3 +@@ -14,7 +14,7 @@ incatalogdelete + .SH NAME + incatalogdelete \- test if cell belongs to the catalog file + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ char \(**figname; + \fIfigname\fP + Name of the cell to be checked + .SH DESCRIPTION +-\fBincatalogdelete\fP checks a cell represented by its \fIfigname\fP beeing ++\fBincatalogdelete\fP checks a cell represented by its \fIfigname\fP being + present in the catalog file with the \fB'D'\fP attribut. + This means that the cell is to be deleted from the catalog. + \fBincatalogdelete\fP returns \fB0\fP if the cell does not belong to the +diff --git a/alliance/src/mbk/man3/incatalogfeed.3 b/alliance/src/mbk/man3/incatalogfeed.3 +index 5e202c4..c2f5373 100644 +--- a/alliance/src/mbk/man3/incatalogfeed.3 ++++ b/alliance/src/mbk/man3/incatalogfeed.3 +@@ -14,7 +14,7 @@ incatalogfeed + .SH NAME + incatalogfeed \- test if cell belongs to the catalog file + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,10 +30,10 @@ char \(**figname; + \fIfigname\fP + Name of the cell to be checked + .SH DESCRIPTION +-\fBincatalogfeed\fP checks a cell represented by its \fIfigname\fP beeing ++\fBincatalogfeed\fP checks a cell represented by its \fIfigname\fP being + present in the catalog file with the \fI'F'\fP attribut. + This means that the cell is a feed through, and does not have a logical +-equivalent representation while beeing physicaly used. ++equivalent representation while being physicaly used. + .br + This information is mostly needed by routers, since \fI"logical feed through"\fP + has no design meaning. +diff --git a/alliance/src/mbk/man3/incataloggds.3 b/alliance/src/mbk/man3/incataloggds.3 +index 2928c65..1df58a9 100644 +--- a/alliance/src/mbk/man3/incataloggds.3 ++++ b/alliance/src/mbk/man3/incataloggds.3 +@@ -14,7 +14,7 @@ incataloggds + .SH NAME + incataloggds \- test if cell belongs to the catalog file + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ char \(**figname; + \fIfigname\fP + Name of the cell to be checked + .SH DESCRIPTION +-\fBincataloggds\fP checks a cell represented by its \fIfigname\fP beeing ++\fBincataloggds\fP checks a cell represented by its \fIfigname\fP being + present in the catalog file with the \fB'G'\fP attribut. + This means that the cell is a phantom of a gds cell. + .br +diff --git a/alliance/src/mbk/man3/instanceface.3 b/alliance/src/mbk/man3/instanceface.3 +index 7f75ec0..c246ccb 100644 +--- a/alliance/src/mbk/man3/instanceface.3 ++++ b/alliance/src/mbk/man3/instanceface.3 +@@ -14,7 +14,7 @@ instanceface + .SH NAME + instanceface \- returns the face of a connector in a placed instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -31,7 +31,7 @@ char modelface, symmetry; + Face of a connector in its figure. + .TP 20 + \fIsymmetry\fP +-Geometrical operation applied to the instanciation of the figure. ++Geometrical operation applied to the instantiation of the figure. + .SH DESCRIPTION + \fBinstanceface\fP determines the orientation of a connector in an instance of + its model. +diff --git a/alliance/src/mbk/man3/instr.3 b/alliance/src/mbk/man3/instr.3 +index 8c2a6db..babfc7e 100644 +--- a/alliance/src/mbk/man3/instr.3 ++++ b/alliance/src/mbk/man3/instr.3 +@@ -12,10 +12,10 @@ instr + .XE4 \} + .TH INSTR 3 "October 1, 1997" "ASIM/LIP6" "MBK UTILITY FUNCTIONS" + .SH NAME +-instr \- find an occurence of a string in a string, starting at a ++instr \- find an occurrence of a string in a string, starting at a + specified character. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -37,15 +37,15 @@ Pointer to the string to be found, the pattern + \fIfrom\fP + Character to be searched backwards before searching for the pattern + .SH DESCRIPTION +-\fBinstr\fP searches the first occurence of the string \fIfind\fP in the string +-\fIs\fP, starting its search at the last occurence of the \fIfrom\fP character ++\fBinstr\fP searches the first occurrence of the string \fIfind\fP in the string ++\fIs\fP, starting its search at the last occurrence of the \fIfrom\fP character + in the string \fIs\fP. + .LP + If either \fIs\fP or \fIfind\fP is \fBNULL\fP, the function returns \fBNULL\fP. +-If \fIfrom\fP is \fB(char)0\fP, the pattern is searched from the begining of ++If \fIfrom\fP is \fB(char)0\fP, the pattern is searched from the beginning of + \fIs\fP. + .br +-This quite exotic behaviour is useful to search the occurence of a name in a ++This quite exotic behaviour is useful to search the occurrence of a name in a + string resulting from a flatten, when only a terminal object name is to be + taken into account. + .SH RETURN VALUES +diff --git a/alliance/src/mbk/man3/isck.3 b/alliance/src/mbk/man3/isck.3 +index 78ec21d..8dd3253 100644 +--- a/alliance/src/mbk/man3/isck.3 ++++ b/alliance/src/mbk/man3/isck.3 +@@ -14,7 +14,7 @@ isck + .SH NAME + isck \-tells if a name is the pattern defined by the user + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/isvdd.3 b/alliance/src/mbk/man3/isvdd.3 +index 7128b4b..8cfa1a4 100644 +--- a/alliance/src/mbk/man3/isvdd.3 ++++ b/alliance/src/mbk/man3/isvdd.3 +@@ -14,7 +14,7 @@ isvdd + .SH NAME + isvdd \-tells if a name contains the pattern defined by the user + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ char \(**s; + \fIs\fP + Pointer to the string to be check as power high + .SH DESCRIPTION +-\fBisvdd\fP searches an occurence of the string defined by the \fBMBK_VDD\fP(1) ++\fBisvdd\fP searches an occurrence of the string defined by the \fBMBK_VDD\fP(1) + environment variable in the string \fIs\fP. + If this string is not set by the user, its default value is "vdd". + .SH RETURN VALUE +diff --git a/alliance/src/mbk/man3/isvss.3 b/alliance/src/mbk/man3/isvss.3 +index e00197f..37871bb 100644 +--- a/alliance/src/mbk/man3/isvss.3 ++++ b/alliance/src/mbk/man3/isvss.3 +@@ -14,7 +14,7 @@ isvss + .SH NAME + isvss \-tells if a name contains the pattern defined by the user + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ char \(**s; + \fIs\fP + Pointer to the string to be check as power high + .SH DESCRIPTION +-\fBisvss\fP searches an occurence of the string defined by the \fBMBK_VSS\fP(1) ++\fBisvss\fP searches an occurrence of the string defined by the \fBMBK_VSS\fP(1) + environment variable in the string \fIs\fP. + If this string is not set by the user, its default value is "vss". + .SH RETURN VALUE +diff --git a/alliance/src/mbk/man3/loadlofig.3 b/alliance/src/mbk/man3/loadlofig.3 +index 780a2cc..7cd7529 100644 +--- a/alliance/src/mbk/man3/loadlofig.3 ++++ b/alliance/src/mbk/man3/loadlofig.3 +@@ -14,7 +14,7 @@ loadlofig + .SH NAME + loadlofig \- load a new logical cell model from disk + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -45,7 +45,7 @@ connectors and extrernal signals are loaded in memory, or \fB'C'\fP, that + loads the "complement" of an already partially loaded cell in order to + keep the same pointer when accessing the same file. + .br +-The \fBloadlofig\fP(3) function in fact performs a call to a parser, choosen ++The \fBloadlofig\fP(3) function in fact performs a call to a parser, chosen + by the \fBMBK_IN_LO\fP(1) environment variable. The directories searched for the + file are first the one sets by \fBMBK_WORK_LIB\fP(1) and then, in the described + order, the ones set by \fBMBK_CATA_LIB\fP(1). +diff --git a/alliance/src/mbk/man3/loadphfig.3 b/alliance/src/mbk/man3/loadphfig.3 +index b4b882d..f37d265 100644 +--- a/alliance/src/mbk/man3/loadphfig.3 ++++ b/alliance/src/mbk/man3/loadphfig.3 +@@ -14,7 +14,7 @@ loadphfig + .SH NAME + loadphfig \- load a new physical cell model from disk + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -46,8 +46,8 @@ finishes to fill an already loaded figure in \fB'P'\fP mode, in order to have + it all in memory. This last mode allows to keep the same \fIptfig\fP pointer + when reaccessing the same file. + .br +-The \fBloadphfig\fP function in fact performs a call to a parser, choosen +-by the \fBMBK_IN_PH\fP(1) environment variable. The directories seached for the ++The \fBloadphfig\fP function in fact performs a call to a parser, chosen ++by the \fBMBK_IN_PH\fP(1) environment variable. The directories searched for the + file are first the one set by \fBMBK_WORK_LIB\fP(1) and then, in the described + order, the ones set by \fBMBK_CATA_LIB\fP(1). + See \fBMBK_IN_PH\fP(1), \fBMBK_WORK_LIB\fP(1), \fBMBK_CATA_LIB\fP(1) and +diff --git a/alliance/src/mbk/man3/locap.3 b/alliance/src/mbk/man3/locap.3 +index 482bd56..bc08696 100644 +--- a/alliance/src/mbk/man3/locap.3 ++++ b/alliance/src/mbk/man3/locap.3 +@@ -77,8 +77,8 @@ capacitor type is technological dependent and is not available for any technolog + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, + that is a general purpose +-pointer used to share informations on the capacitor. +-This field is used with the \fBLOCAP_INFO\fP(3) ptype to store physical informations. ++pointer used to share information on the capacitor. ++This field is used with the \fBLOCAP_INFO\fP(3) ptype to store physical information. + .SH SEE ALSO + .BR mbk (1), + .BR addlocap (3), +diff --git a/alliance/src/mbk/man3/locon.3 b/alliance/src/mbk/man3/locon.3 +index 1ed7f0e..bf63018 100644 +--- a/alliance/src/mbk/man3/locon.3 ++++ b/alliance/src/mbk/man3/locon.3 +@@ -95,14 +95,14 @@ for figure connectors + \fBINTERNAL\fP + for instance connectors + .LP +-The \fITYPE\fP is needed to appropriatly cast the \fIROOT\fP field, and must ++The \fITYPE\fP is needed to appropriately cast the \fIROOT\fP field, and must + be approriatly filled by the parsers. A misuse of it may cause strange + behaviours. + .RE + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP for details, that is a general purpose +-pointer used to share informations on the connector. ++pointer used to share information on the connector. + .SH SEE ALSO + .BR mbk(1), + .BR mbk(3), +diff --git a/alliance/src/mbk/man3/lofig.3 b/alliance/src/mbk/man3/lofig.3 +index 3741d75..0834027 100644 +--- a/alliance/src/mbk/man3/lofig.3 ++++ b/alliance/src/mbk/man3/lofig.3 +@@ -105,11 +105,11 @@ All other lists are empty. + .TP + \fIMODELCHAIN\fP + Pointer to a chain list, see \fBchain\fP(3) for details, of names. These are +-the names of the models that are at least instanciated once in the figure. ++the names of the models that are at least instantiated once in the figure. + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, that is a general +-purpose pointer used to share informations on the model. ++purpose pointer used to share information on the model. + .SH SEE ALSO + .BR mbk (1), + .BR addlofig (3), +diff --git a/alliance/src/mbk/man3/lofigchain.3 b/alliance/src/mbk/man3/lofigchain.3 +index d431e8a..ceb6be8 100644 +--- a/alliance/src/mbk/man3/lofigchain.3 ++++ b/alliance/src/mbk/man3/lofigchain.3 +@@ -14,7 +14,7 @@ lofigchain + .SH NAME + lofigchain \- creates a netlist in terms of connectors on signals + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -43,7 +43,7 @@ The information resulting of a call to \fBlofigchain\fP is present in the + \fIUSER\fP field of all signals of the figure, accessible through + \fIptfig\->LOSIG\fP. The \fIUSER\fP field has a \fBptype\fP typed + \fILOFIGCHAIN\fP, that points on a \fBchain_list\fP whose \fIDATA\fP points on +-each \fBlocon\fP beeing connected to the given signal. ++each \fBlocon\fP being connected to the given signal. + .SH ERROR + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/log.3 b/alliance/src/mbk/man3/log.3 +index 815590d..5534dcf 100644 +--- a/alliance/src/mbk/man3/log.3 ++++ b/alliance/src/mbk/man3/log.3 +@@ -21,7 +21,7 @@ HEADER = -I/labo/include + .br + LIB = -L/labo/lib -lMutnnn -ltshmmm -lablmmm -lbddmmm + .br +-Each library can be called separatly. The "logmmm.h" header file must be inserted in the files that use the functions or the structures defined in a library. ++Each library can be called separately. The "logmmm.h" header file must be inserted in the files that use the functions or the structures defined in a library. + .br + .SH SEE ALSO + .BR mbk (1), +diff --git a/alliance/src/mbk/man3/loins.3 b/alliance/src/mbk/man3/loins.3 +index 9c1aa47..fb28bd2 100644 +--- a/alliance/src/mbk/man3/loins.3 ++++ b/alliance/src/mbk/man3/loins.3 +@@ -48,17 +48,17 @@ level, so it should unique. When working on both layout and netlist views of + a cell, instance names should be the same on each representation. + .TP + \fIFIGNAME\fP +-Name of the model of the instanciated cell. ++Name of the model of the instantiated cell. + .TP + \fILOCON\fP + Pointer to the head of the list of connectors of the instance. Consistency + between the connectors of the instance and the connectors of its model on disk +-is not ensured by the parsers, because a model local to the file beeing parsed ++is not ensured by the parsers, because a model local to the file being parsed + is used, not the possible model on disk. See \fBlocon\fP(3) for details. + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, that is a general purpose +-pointer used to share informations on the instance. ++pointer used to share information on the instance. + .SH SEE ALSO + .BR mbk (1), + .BR addloins (3), +diff --git a/alliance/src/mbk/man3/lores.3 b/alliance/src/mbk/man3/lores.3 +index 2b9bddb..ee8664a 100644 +--- a/alliance/src/mbk/man3/lores.3 ++++ b/alliance/src/mbk/man3/lores.3 +@@ -73,8 +73,8 @@ Metal resistor. + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, + that is a general purpose +-pointer used to share informations on the resistor. +-This field is used with the \fBLORES_INFO\fP(3) ptype to store physical informations. ++pointer used to share information on the resistor. ++This field is used with the \fBLORES_INFO\fP(3) ptype to store physical information. + .SH SEE ALSO + .BR mbk (1), + .BR addlores (3), +diff --git a/alliance/src/mbk/man3/loself.3 b/alliance/src/mbk/man3/loself.3 +index 52104e6..1540821 100644 +--- a/alliance/src/mbk/man3/loself.3 ++++ b/alliance/src/mbk/man3/loself.3 +@@ -72,7 +72,7 @@ Metal inductor. + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, + that is a general purpose +-pointer used to share informations on the inductor. ++pointer used to share information on the inductor. + .SH SEE ALSO + .BR mbk (1), + .BR addloself (3), +diff --git a/alliance/src/mbk/man3/losig.3 b/alliance/src/mbk/man3/losig.3 +index 6e0d14b..3950757 100644 +--- a/alliance/src/mbk/man3/losig.3 ++++ b/alliance/src/mbk/man3/losig.3 +@@ -43,7 +43,7 @@ typedef struct losig { + Pointer to the next \fBlosig\fP of the list. + .TP + \fIINDEX\fP +-Long integer beeing the signal identifier. It represents the net ++Long integer being the signal identifier. It represents the net + number at a given hierachical level, and must be unique. + .TP + \fINAMECHAIN\fP +@@ -65,7 +65,7 @@ attached to it. See \fBlocon\fP(3) for detail. + .TP 20 + \fBEXTERNAL\fP + The signal is connected at least to one external +-connector, a connector of the figure beeing described. ++connector, a connector of the figure being described. + .TP + \fBINTERNAL\fP + The signal is connected only to instances or +@@ -77,7 +77,7 @@ results may appear if the consistency with connectors is violated. + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, that is a general +-purpose pointer used to share informations on the signal. ++purpose pointer used to share information on the signal. + .TP + Remark : + the netlist view is given in terms of connectors pointing to signals, +diff --git a/alliance/src/mbk/man3/lotrs.3 b/alliance/src/mbk/man3/lotrs.3 +index e48ad33..5a951fa 100644 +--- a/alliance/src/mbk/man3/lotrs.3 ++++ b/alliance/src/mbk/man3/lotrs.3 +@@ -71,12 +71,12 @@ of course unique. See \fBlocon\fP(3) for details. + Transistor instance name + .TP + \fIX, Y\fP +-Coordinates of the transistor in a layout. These informations have sens only if ++Coordinates of the transistor in a layout. These information have sens only if + the transistor netlist is the result of a layout extraction. They are + otherwise set to zero. + These coordinates are given in micron times the scale factor \fBSCALE_X\fP, + since the extracted view is technology +-dependant. ++dependent. + .TP + \fIWIDTH, LENGTH\fP + Respectivly width and length of the transistor grid. +@@ -117,7 +117,7 @@ Low Leakage P type MOS transistor + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, + that is a general purpose +-pointer used to share informations on the transistor. ++pointer used to share information on the transistor. + .TP + Remark : + In integrated techniques, NMOS transistor bulk for digital circuits is always set to ground, and +diff --git a/alliance/src/mbk/man3/mbkalloc.3 b/alliance/src/mbk/man3/mbkalloc.3 +index 85a6c57..eced9aa 100644 +--- a/alliance/src/mbk/man3/mbkalloc.3 ++++ b/alliance/src/mbk/man3/mbkalloc.3 +@@ -14,7 +14,7 @@ mbkalloc + .SH NAME + mbkalloc \- mbk memory allocator + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/mbkenv.3 b/alliance/src/mbk/man3/mbkenv.3 +index b2df87c..499664d 100644 +--- a/alliance/src/mbk/man3/mbkenv.3 ++++ b/alliance/src/mbk/man3/mbkenv.3 +@@ -14,7 +14,7 @@ mbkenv + .SH NAME + mbkenv \- set user preferences + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -32,12 +32,12 @@ are used. + .TP 30 + \fBMBK_WORK_LIB\fP + internally \fBchar \(**WORK_LIB\fP, sets the working directory for reading and +-writting, result of a \fBsavephfig\fP for example. Its value is \fB"."\fP by ++writing, result of a \fBsavephfig\fP for example. Its value is \fB"."\fP by + default. + .TP + \fBMBK_CATA_LIB\fP + internally \fBchar \(**\(**CATA_LIB\fP, sets the working directories for reading only. +-This is a set of pathes, like the unix \fBPATH\fP variable. ++This is a set of paths, like the unix \fBPATH\fP variable. + It is used in \fBloadlofig\fP for example. Its value is \fB"."\fP by default. + .TP + \fBMBK_CATAL_NAME\fP +diff --git a/alliance/src/mbk/man3/mbkfopen.3 b/alliance/src/mbk/man3/mbkfopen.3 +index 6b25128..3e3c156 100644 +--- a/alliance/src/mbk/man3/mbkfopen.3 ++++ b/alliance/src/mbk/man3/mbkfopen.3 +@@ -12,9 +12,9 @@ mbkfopen + .XE4 \} + .TH MBKFOPEN 3 "October 1, 1997" "ASIM/LIP6" "MBK UTILITY FUNCTIONS" + .SH NAME +-mbkfopen \- open a file with several search pathes ++mbkfopen \- open a file with several search paths + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -36,7 +36,7 @@ Extension to the file name + \fImodel\fP + File opening mode + .SH DESCRIPTION +-\fBmbkfopen\fP opens a file, searching it through the pathes given in the ++\fBmbkfopen\fP opens a file, searching it through the paths given in the + environment variables \fBMBK_CATA_LIB\fP(1) and \fBMBK_WORK_LIB\fP(1). + Its main issue is to enable simple file access for any program that works + with mbk path environment variables. +@@ -51,19 +51,19 @@ The legal values for \fImode\fP are + opens for reading + .TP + \fBWRITE_TEXT\fP +-discards and opens for writting ++discards and opens for writing + .br + since disk access should be a straight forward operation knowing mbk's needs. + .LP + The search algorithm depends on the value of \fImode\fP. +-If \fImode\fP is \fBWRITE_TEXT\fP, then the file is open for writting in ++If \fImode\fP is \fBWRITE_TEXT\fP, then the file is open for writing in + \fBMBK_WORK_LIB\fP(1). If \fImode\fP is \fBREAD_TEXT\fP then the file is first + searched through \fBMBK_WORK_LIB\fP(1), and if not found, through each directory + specified in \fBMBK_CATA_LIB\fP(1), in the order of declaration under unix. + No internal hash table is generated, in order to let the user choose its + directory priority. + As soon as the file is found, it is opened. +-There is no check for redundant files in the specified pathes, since it is ++There is no check for redundant files in the specified paths, since it is + neither illegal nor bad to have many files with the same names. + .SH RETURN VALUE + \fBmbkfopen\fP returns a pointer to the opened file. +diff --git a/alliance/src/mbk/man3/mbkfree.3 b/alliance/src/mbk/man3/mbkfree.3 +index 652b820..79c02a9 100644 +--- a/alliance/src/mbk/man3/mbkfree.3 ++++ b/alliance/src/mbk/man3/mbkfree.3 +@@ -14,7 +14,7 @@ mbkfree + .SH NAME + mbkfree \- mbk memory allocator + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/mbkps.3 b/alliance/src/mbk/man3/mbkps.3 +index ba2eb30..4414036 100644 +--- a/alliance/src/mbk/man3/mbkps.3 ++++ b/alliance/src/mbk/man3/mbkps.3 +@@ -14,7 +14,7 @@ mbkps + .SH NAME + mbkps \- mbk process state + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -25,7 +25,7 @@ void mbkps() + .ft R + .fi + .SH DESCRIPTION +-\fBmbkps\fP does some functions calls and gathers informations about ++\fBmbkps\fP does some functions calls and gathers information about + time and memory spend during a program run. + encouraged. + .SH EXAMPLE +diff --git a/alliance/src/mbk/man3/mbkrealloc.3 b/alliance/src/mbk/man3/mbkrealloc.3 +index 0bc6dcb..44c488c 100644 +--- a/alliance/src/mbk/man3/mbkrealloc.3 ++++ b/alliance/src/mbk/man3/mbkrealloc.3 +@@ -14,7 +14,7 @@ mbkrealloc + .SH NAME + mbkrealloc \- mbk memory reallocator + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/mbksetautoackchld.3 b/alliance/src/mbk/man3/mbksetautoackchld.3 +index db3b5a7..390145d 100644 +--- a/alliance/src/mbk/man3/mbksetautoackchld.3 ++++ b/alliance/src/mbk/man3/mbksetautoackchld.3 +@@ -14,7 +14,7 @@ mbkalloc + .SH NAME + mbksetautoackchld \- Tells Alliance to automatically handle terminaison of child process. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/mbkunlink.3 b/alliance/src/mbk/man3/mbkunlink.3 +index 0da1c8f..bc85c35 100644 +--- a/alliance/src/mbk/man3/mbkunlink.3 ++++ b/alliance/src/mbk/man3/mbkunlink.3 +@@ -14,7 +14,7 @@ mbkunlink + .SH NAME + mbkunlink \- delete a file in the \fBWORK_LIB\P. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/mbkwaitpid.3 b/alliance/src/mbk/man3/mbkwaitpid.3 +index 013d638..7b0ee9f 100644 +--- a/alliance/src/mbk/man3/mbkwaitpid.3 ++++ b/alliance/src/mbk/man3/mbkwaitpid.3 +@@ -14,7 +14,7 @@ mbkalloc + .SH NAME + mbkwaitpid \- wait for the end of a particular child process. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -34,7 +34,7 @@ Process number to wait. + .TP + \fImode\fP + If mode is set to 1, this function return only when the child process is +-terminated. Otherwise, function return immediatly. ++terminated. Otherwise, function return immediately. + .TP + \fIstatus\fP + If not NULL, the exit status of terminated child process. +diff --git a/alliance/src/mbk/man3/mlodebug.3 b/alliance/src/mbk/man3/mlodebug.3 +index 0693b8a..27971da 100644 +--- a/alliance/src/mbk/man3/mlodebug.3 ++++ b/alliance/src/mbk/man3/mlodebug.3 +@@ -14,7 +14,7 @@ mlodebug + .SH NAME + mlodebug \- logical data structure contents debug function + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/mphdebug.3 b/alliance/src/mbk/man3/mphdebug.3 +index cbeec35..7fe59d6 100644 +--- a/alliance/src/mbk/man3/mphdebug.3 ++++ b/alliance/src/mbk/man3/mphdebug.3 +@@ -14,7 +14,7 @@ mphdebug + .SH NAME + mphdebug \- physical data structure contents debug function + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/namealloc.3 b/alliance/src/mbk/man3/namealloc.3 +index b668d85..8cf30dc 100644 +--- a/alliance/src/mbk/man3/namealloc.3 ++++ b/alliance/src/mbk/man3/namealloc.3 +@@ -14,7 +14,7 @@ namealloc + .SH NAME + namealloc \- hash table for strings + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,17 +30,17 @@ char \(**inputname; + \fIinputname\fP + Pointer to a string of characters + .SH DESCRIPTION +-The \fBnamealloc\fP function creates a dictionnary of names in mbk. ++The \fBnamealloc\fP function creates a dictionary of names in mbk. + It warranties equality on characters string if the pointers to these + strings are equal, at \fBstrcmp\fP(3) meaning. This means also that there + is a single memory address for a given string. + .br + The case of the letters do not matter. All names are changed to lower case +-before beeing introduced in the symbol table. This is needed because most ++before being introduced in the symbol table. This is needed because most + of the file format do not check case. + .br + \fBnamealloc\fP is used by all mbk utility function using names, so its use +-should be needed only when directly filling or modifing the structure, or when ++should be needed only when directly filling or modifying the structure, or when + having to compare an external string to mbk internal ones. This should speed + up string comparisons. + .br +diff --git a/alliance/src/mbk/man3/namefind.3 b/alliance/src/mbk/man3/namefind.3 +index f4219b5..fe59916 100644 +--- a/alliance/src/mbk/man3/namefind.3 ++++ b/alliance/src/mbk/man3/namefind.3 +@@ -14,7 +14,7 @@ namefind + .SH NAME + namefind \- hash table for strings + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,16 +30,16 @@ char \(**inputname; + \fIinputname\fP + Pointer to a string of characters + .SH DESCRIPTION +-The \fBnamefind\fP function search the mbk dictionnary of names. +-If the string has already been inserted in the dictionnary, then a pointer ++The \fBnamefind\fP function search the mbk dictionary of names. ++If the string has already been inserted in the dictionary, then a pointer + to this string is return, else \fBnamefind\fP returns NULL. + .br + The case of the letters do not matter. All names are changed to lower case +-before beeing searched in the symbol table. This is needed because most ++before being searched in the symbol table. This is needed because most + of the file format do not check case. + .br + \fBnamefind\fP is used by all mbk utility function using names, so its use +-should be needed only when directly filling or modifing the structure, or when ++should be needed only when directly filling or modifying the structure, or when + having to compare an external string to mbk internal ones. This should speed + up string comparisons. + .br +diff --git a/alliance/src/mbk/man3/nameindex.3 b/alliance/src/mbk/man3/nameindex.3 +index d11dc39..f3e5f6c 100644 +--- a/alliance/src/mbk/man3/nameindex.3 ++++ b/alliance/src/mbk/man3/nameindex.3 +@@ -14,7 +14,7 @@ nameindex + .SH NAME + nameindex \- concatenate a name and index with user separator + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -37,7 +37,7 @@ Long integer + The \fBnameindex\fP function adds the separator defined by \fBMBK_SEPAR\fP(1), + and then the string version of \fIi\fP at the end of string \fIs\fP. + This is not like a \fBstrcat\fP(3) of the standard library, because \fIs\fP is +-not beeing modified. ++not being modified. + .br + The string returned has already been put in the names dictionary by + a call to \fBnamealloc\fP(3). +diff --git a/alliance/src/mbk/man3/naturalstrcmp.3 b/alliance/src/mbk/man3/naturalstrcmp.3 +index f413b2f..5a12f16 100644 +--- a/alliance/src/mbk/man3/naturalstrcmp.3 ++++ b/alliance/src/mbk/man3/naturalstrcmp.3 +@@ -15,7 +15,7 @@ naturalstrcmp + naturalstrcmp \- compare string in alphabetical order for letters + and numerical for digits. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/phcon.3 b/alliance/src/mbk/man3/phcon.3 +index f3efa7a..bef65bc 100644 +--- a/alliance/src/mbk/man3/phcon.3 ++++ b/alliance/src/mbk/man3/phcon.3 +@@ -134,11 +134,11 @@ third metal through route + .TP + \fIWIDTH\fP + Width of the connector. The physical extension, concerning the width, of a +-connector is paralell to its face. ++connector is parallel to its face. + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP for details, that is a general purpose +-pointer used to share informations on the connector. ++pointer used to share information on the connector. + .SH SEE ALSO + .BR mbk (1), + .BR addphcon (3), +diff --git a/alliance/src/mbk/man3/phfig.3 b/alliance/src/mbk/man3/phfig.3 +index 49838a4..fd7d3e9 100644 +--- a/alliance/src/mbk/man3/phfig.3 ++++ b/alliance/src/mbk/man3/phfig.3 +@@ -82,7 +82,7 @@ See \fBphref\fP(3) for details. + \fIXAB1, YAB1, XAB2, YAB2\fP + Coordinates of the bottom left corner of the \fIabutment box\fP of the + figure. The \fIabutment box\fP of a model represents the external visibility of +-a figure and is what reference is made to when instanciating the model. ++a figure and is what reference is made to when instantiating the model. + One should well distinguish the \fIabutment box\fP from the \fIbounding box\fP, + which is the smallest rectangle that includes all cell descriptors. + The size and position of the \fIabutment box\fP is a designer concern, and +@@ -105,12 +105,12 @@ means connectors and the \fIabutment box\fP. All other lists are empty. + .TP + \fIMODELCHAIN\fP + Pointer to a chain list, see \fBchain\fP(3) for details, of names. These are the +-names of the models that are at least instanciated once in the figure. ++names of the models that are at least instantiated once in the figure. + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, + that is a general purpose +-pointer used to share informations on the model. ++pointer used to share information on the model. + .TP + Remark : + mbk's physical view of a cell is releted to it's logical view by means +diff --git a/alliance/src/mbk/man3/phins.3 b/alliance/src/mbk/man3/phins.3 +index 34d60c9..b3459ae 100644 +--- a/alliance/src/mbk/man3/phins.3 ++++ b/alliance/src/mbk/man3/phins.3 +@@ -45,7 +45,7 @@ Pointer to the next instance in the list. + .TP + \fIFIGNAME\fP + Model of the instance. This gives the name of the figure that is currently +-beeing instanciated. The model may not be present in memory. ++being instantiated. The model may not be present in memory. + .TP + \fINAME\fP + Name of the instance. The instance is identified by its name, so it should be +@@ -87,7 +87,7 @@ x becomes -x then rotates 90 degrees clockwise + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, that is a general +-purpose pointer used to share informations on the instance. ++purpose pointer used to share information on the instance. + .TP + Remark : + the \fBphins\fP structure does not contain any information about +diff --git a/alliance/src/mbk/man3/phref.3 b/alliance/src/mbk/man3/phref.3 +index 33d1912..f753a67 100644 +--- a/alliance/src/mbk/man3/phref.3 ++++ b/alliance/src/mbk/man3/phref.3 +@@ -59,15 +59,15 @@ for all other uses + .RE + .TP + \fINAME\fP +-Name of the reference. The refence is identified by its name, so it should be ++Name of the reference. The reference is identified by its name, so it should be + unique at a given hierarchical level. + .TP + \fIXREF, YREF\fP +-Coordinates of the point beeing referenced. ++Coordinates of the point being referenced. + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, that is a general +-purpose pointer used to share informations on the reference. ++purpose pointer used to share information on the reference. + .SH SEE ALSO + .BR mbk (1), + .BR addphref (3), +diff --git a/alliance/src/mbk/man3/phseg.3 b/alliance/src/mbk/man3/phseg.3 +index 99e9969..5d876e2 100644 +--- a/alliance/src/mbk/man3/phseg.3 ++++ b/alliance/src/mbk/man3/phseg.3 +@@ -127,7 +127,7 @@ to its direction. + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP for details, that is a general purpose +-pointer used to share informations on the segment. ++pointer used to share information on the segment. + .SH SEE ALSO + .BR mbk (1), + .BR addphseg (3), +diff --git a/alliance/src/mbk/man3/phvia.3 b/alliance/src/mbk/man3/phvia.3 +index 1c03063..b370ba0 100644 +--- a/alliance/src/mbk/man3/phvia.3 ++++ b/alliance/src/mbk/man3/phvia.3 +@@ -79,7 +79,7 @@ L shaped P transistor corner filling + .TP + \fIUSER\fP + Pointer to a ptype list, see \fBptype\fP(3) for details, that is a general +-purpose pointer used to share informations on the via. ++purpose pointer used to share information on the via. + .SH SEE ALSO + .BR mbk (1), + .BR addphvia (3), +diff --git a/alliance/src/mbk/man3/ptype.3 b/alliance/src/mbk/man3/ptype.3 +index c2b0bd9..400e06a 100644 +--- a/alliance/src/mbk/man3/ptype.3 ++++ b/alliance/src/mbk/man3/ptype.3 +@@ -15,7 +15,7 @@ ptype + ptype \- mbk list of typed pointers + .SH DESCRIPTION + The \fBptype\fP is used to save typed pointers in a list. +-The use of this structure is strongly recommanded, when such a need occurs. ++The use of this structure is strongly recommended, when such a need occurs. + It is the case in the \fIUSER\fP field of all mbk layout and netlist objects, + where data specific to different proccessing may be accessed through this + unique field. It is the charge of the user to give its pointers a type that +diff --git a/alliance/src/mbk/man3/restorealldir.3 b/alliance/src/mbk/man3/restorealldir.3 +index c8dbca9..07bc1cb 100644 +--- a/alliance/src/mbk/man3/restorealldir.3 ++++ b/alliance/src/mbk/man3/restorealldir.3 +@@ -15,7 +15,7 @@ restorealldir + .SH NAME + restorealldir \- restore all instances' connectors directions + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/restoredirvbe.3 b/alliance/src/mbk/man3/restoredirvbe.3 +index 41ca09e..ac10e22 100644 +--- a/alliance/src/mbk/man3/restoredirvbe.3 ++++ b/alliance/src/mbk/man3/restoredirvbe.3 +@@ -15,7 +15,7 @@ restoredirvbe + .SH NAME + restoredirvbe \- restore connectors directions from behavioral view + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/reverse.3 b/alliance/src/mbk/man3/reverse.3 +index 48fcd9a..cd7a437 100644 +--- a/alliance/src/mbk/man3/reverse.3 ++++ b/alliance/src/mbk/man3/reverse.3 +@@ -14,7 +14,7 @@ reverse + .SH NAME + reverse \- reverse a list of \fBchain\fPed elements + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/rflattenlofig.3 b/alliance/src/mbk/man3/rflattenlofig.3 +index ece6603..8df66f7 100644 +--- a/alliance/src/mbk/man3/rflattenlofig.3 ++++ b/alliance/src/mbk/man3/rflattenlofig.3 +@@ -14,7 +14,7 @@ rflattenlofig + .SH NAME + rflattenlofig \- recursivly flatten a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -42,7 +42,7 @@ End level choice + pointed to by \fIptfig\fP. + .br + The \fIconcat\fP argument can take either the value \fBYES\fP in which case the +-name of the objects comming from instances are named ++name of the objects coming from instances are named + \fIinsname'X'objectname\fP, where \fI'X'\fP is the caracter set int the + \fBMBK_SEPAR\fP(1) environment variable, or the value \fBNO\fP, and then the + object name remains inchanged. This is quite dangerous since name unicity is +@@ -52,7 +52,7 @@ no more warrantied, and may cause the flatten to fail. See \fBMBK_SEPAR\fP(1), + The \fIcatal\fP argument may be set to \fBNO\fP, in which case flattening stops + at the transistor level, all hierachies and instances have desapeard, only + terminal elements remains. If set to \fBYES\fP, flattening stops when it +-encounters an instance model beeing present in the catalog file, set by ++encounters an instance model being present in the catalog file, set by + the \fBMBK_CATAL_NAME\fP(1) environment variable. + See \fBMBK_CATAL_NAME\fP(1) and \fBincatalog\fP(3) for details. + .SH ERRORS +diff --git a/alliance/src/mbk/man3/rflattenphfig.3 b/alliance/src/mbk/man3/rflattenphfig.3 +index 1e6a3f3..691954f 100644 +--- a/alliance/src/mbk/man3/rflattenphfig.3 ++++ b/alliance/src/mbk/man3/rflattenphfig.3 +@@ -14,7 +14,7 @@ rflattenphfig + .SH NAME + rflattenphfig \- recursivly flatten a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -42,7 +42,7 @@ End level choice + pointed to by \fIptfig\fP. + .br + The \fIconcat\fP argument can take either the value \fBYES\fP in which case the +-name of the objects comming from instances are named ++name of the objects coming from instances are named + \fIinsname'X'objectname\fP, where \fI'X'\fP is the caracter set int the + \fBMBK_SEPAR\fP(1) environment variable, or the value \fBNO\fP, and then the + object name remains inchanged. This is quite dangerous since name unicity is +@@ -52,7 +52,7 @@ no more warrantied, and may cause the flatten to fail. See \fBMBK_SEPAR\fP(1), + The \fIcatal\fP argument may be set to \fBNO\fP, in which case flattening stops + at the transistor level, all hierachies and instances have desapeard, only + terminal elements remains. If set to \fBYES\fP, flattening stops when it +-encounters an instance model beeing present in the catalog file, set by ++encounters an instance model being present in the catalog file, set by + the \fBMBK_CATAL_NAME\fP(1) environment variable. See \fBMBK_CATAL_NAME\fP(1) and + \fBincatalog\fP(3) for details. + .SH ERRORS +diff --git a/alliance/src/mbk/man3/savelofig.3 b/alliance/src/mbk/man3/savelofig.3 +index 3352168..b84e36c 100644 +--- a/alliance/src/mbk/man3/savelofig.3 ++++ b/alliance/src/mbk/man3/savelofig.3 +@@ -14,7 +14,7 @@ savelofig + .SH NAME + savelofig \- save a logical figure on disk + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -34,7 +34,7 @@ Pointer to the \fIlofig\fP to be written on disk + \fIptfig\fP. All the figure lists are ran through, and the appropriate objects + written, independently of the figure \fImode\fP. + .br +-The \fBsavelofig\fP function in fact performs a call to a driver, choosen ++The \fBsavelofig\fP function in fact performs a call to a driver, chosen + by the \fBMBK_OUT_LO\fP(1) environment variable. The directory in which the file + is to be written is the one set by \fBMBK_WORK_LIB\fP(1). + See \fBMBK_OUT_LO\fP(1), \fBMBK_WORK_LIB\fP(1) and +@@ -59,7 +59,7 @@ format. + .RS + Either the directory or the file are write protected, so it's not possible to + open \fIfigname.ext\fP, where \fIext\fP is the file format extension, for +-writting. ++writing. + .RE + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n +diff --git a/alliance/src/mbk/man3/savephfig.3 b/alliance/src/mbk/man3/savephfig.3 +index a435523..52795b8 100644 +--- a/alliance/src/mbk/man3/savephfig.3 ++++ b/alliance/src/mbk/man3/savephfig.3 +@@ -14,7 +14,7 @@ savephfig + .SH NAME + savephfig \- save a physical figure on disk + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -34,7 +34,7 @@ Pointer to the \fIphfig\fP to write on disk + \fIptfig\fP. All the figure lists are ran through, and the appropriate objects + written, independently of the figure \fImode\fP. + .br +-The \fBsavephfig\fP function in fact performs a call to a driver, choosen ++The \fBsavephfig\fP function in fact performs a call to a driver, chosen + by the \fIMBK_OUT_PH\fP(1) environment variable. The directory in which the file + is to be written is the one set by \fBMBK_WORK_LIB\fP(1). + See \fBMBK_OUT_PH\fP(1), \fBMBK_WORK_LIB\fP(1) and +@@ -59,7 +59,7 @@ format. + .RS + Either the directory or the file are write protected, so it's not possible to + open \fIfigname.ext\fP, where \fIext\fP is the file format extension, for +-writting. ++writing. + .RE + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n +diff --git a/alliance/src/mbk/man3/sethtitem.3 b/alliance/src/mbk/man3/sethtitem.3 +index 8b6dd1e..6388783 100644 +--- a/alliance/src/mbk/man3/sethtitem.3 ++++ b/alliance/src/mbk/man3/sethtitem.3 +@@ -15,7 +15,7 @@ sethtitem + .SH NAME + sethtitem \- test and set an item in an hash table. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .if n \{\ + .ft B \} + .if t \{\ +@@ -38,7 +38,7 @@ Key used by the hash coding function to set an item + whether it existed or not, and returns an appropriate value. + This is kind of a \fItest and set\fP operator. + .SH RETURN VALUE +-If the key exists, the funtion return 1, ++If the key exists, the function return 1, + if it doesn't, the item is stored and the function returns 0. + .SH EXAMPLE + .ta 3n 6n 9n 12n 15n 18n 21n +diff --git a/alliance/src/mbk/man3/setlocap.3 b/alliance/src/mbk/man3/setlocap.3 +index 39ab770..4e0dd94 100644 +--- a/alliance/src/mbk/man3/setlocap.3 ++++ b/alliance/src/mbk/man3/setlocap.3 +@@ -14,7 +14,7 @@ setlocap + .SH NAME + setlocap \- set the capacitance value of a logical capacitor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/setlores.3 b/alliance/src/mbk/man3/setlores.3 +index 4fa64d6..4404693 100644 +--- a/alliance/src/mbk/man3/setlores.3 ++++ b/alliance/src/mbk/man3/setlores.3 +@@ -14,7 +14,7 @@ setlores + .SH NAME + setlores \- set the resistance value of a logical resistor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/setloself.3 b/alliance/src/mbk/man3/setloself.3 +index 82994c6..b6d3559 100644 +--- a/alliance/src/mbk/man3/setloself.3 ++++ b/alliance/src/mbk/man3/setloself.3 +@@ -14,7 +14,7 @@ setloself + .SH NAME + setloself \- set the inductance value of a logical inductor + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/sortlocon.3 b/alliance/src/mbk/man3/sortlocon.3 +index a945479..5eda95e 100644 +--- a/alliance/src/mbk/man3/sortlocon.3 ++++ b/alliance/src/mbk/man3/sortlocon.3 +@@ -14,7 +14,7 @@ sortlocon + .SH NAME + sortlocon \- sort the logical connectors of a figure by name + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -35,7 +35,7 @@ by \fI\(**connectors\fP. + The connectors are sorted by names, using a numerical comparison function + that ensures \fBx_12 > x_2\fP. + .br +-The standart \fBqsort\fP(3) function library is called for sorting. ++The standard \fBqsort\fP(3) function library is called for sorting. + Therefore, a table the number of connectors wide is created. + This is not very memory consuming since the number of connectors in a circuit + interface is quite small, nor very time consuming since this algorithm runs +diff --git a/alliance/src/mbk/man3/sortlosig.3 b/alliance/src/mbk/man3/sortlosig.3 +index f9981fa..37fd6ef 100644 +--- a/alliance/src/mbk/man3/sortlosig.3 ++++ b/alliance/src/mbk/man3/sortlosig.3 +@@ -14,7 +14,7 @@ sortlosig + .SH NAME + sortlosig \- sort the logical signals of a figure by name + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -35,7 +35,7 @@ The signals are sorted by names, but since names are not the signals + identifier, the \fBgetsigname\fP(3) routine is called to retrieve a + signal name. + .br +-The standart \fBqsort\fP(3) function library is called for sorting. ++The standard \fBqsort\fP(3) function library is called for sorting. + Therefore, a table the number of signal wide is created, requiring + a lot of memory with big circuits. + Also, even if \fBqsort\fP(3) runs in n log n time, \fBgetsigname\fP(3) +diff --git a/alliance/src/mbk/man3/unflattenlofig.3 b/alliance/src/mbk/man3/unflattenlofig.3 +index 57fbf2c..57c2c0a 100644 +--- a/alliance/src/mbk/man3/unflattenlofig.3 ++++ b/alliance/src/mbk/man3/unflattenlofig.3 +@@ -14,7 +14,7 @@ unflattenlofig + .SH NAME + unflattenlofig \- creates a hierarchy level from instances of a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -50,7 +50,7 @@ All the terminals of the new figure are called using the name of the + corresponding signal if it exists, or with the name of a connector + connected to this signal. + The new name is suffixed with a number, obtained with an internal counter, +-in order to ensure that names are differents. ++in order to ensure that names are different. + .SH ERRORS + No errors can directly result from a call to \fBunflattenlofig\fP, but since it + uses many other mbk functions, it may be a good error starting point. +diff --git a/alliance/src/mbk/man3/upstr.3 b/alliance/src/mbk/man3/upstr.3 +index ab935ef..2514530 100644 +--- a/alliance/src/mbk/man3/upstr.3 ++++ b/alliance/src/mbk/man3/upstr.3 +@@ -14,7 +14,7 @@ upstr + .SH NAME + upstr \- convert a string to upper case + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man3/viewht.3 b/alliance/src/mbk/man3/viewht.3 +index 177a832..e075491 100644 +--- a/alliance/src/mbk/man3/viewht.3 ++++ b/alliance/src/mbk/man3/viewht.3 +@@ -15,7 +15,7 @@ viewht + .SH NAME + viewht \- displays a hash table contents + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .if n \{\ + .ft B \} + .if t \{\ +diff --git a/alliance/src/mbk/man3/viewlo.3 b/alliance/src/mbk/man3/viewlo.3 +index 0db34ea..178c182 100644 +--- a/alliance/src/mbk/man3/viewlo.3 ++++ b/alliance/src/mbk/man3/viewlo.3 +@@ -14,7 +14,7 @@ viewlo + .SH NAME + viewlo \- scan all \fBlofig_list\fPs and display their elements + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -27,7 +27,7 @@ void viewlo(); + .SH DESCRIPTION + \fBviewlo\fP scans all the elements of the entire \fBlofig_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +-All the figures are treated, the first one beeing pointed to by ++All the figures are treated, the first one being pointed to by + \fBHEAD_LOFIG\fP, the global variable that points to the head of all + \fBlofig\fPs. + .br +diff --git a/alliance/src/mbk/man3/viewlocap.3 b/alliance/src/mbk/man3/viewlocap.3 +index a6ef312..2f378f4 100644 +--- a/alliance/src/mbk/man3/viewlocap.3 ++++ b/alliance/src/mbk/man3/viewlocap.3 +@@ -16,7 +16,7 @@ viewlocap + .SH NAME + viewlocap \- display elements of a \fBlocap_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -31,7 +31,7 @@ locap_list \(**ptcap ; + .SH PARAMETER + .TP 20 + \fIptcap\fP +-Pointer to the \fBlocap\fP to be scaned ++Pointer to the \fBlocap\fP to be scanned + .SH DESCRIPTION + \fBviewlocap\fP scans all the primary elements of the \fBlocap_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +diff --git a/alliance/src/mbk/man3/viewlofig.3 b/alliance/src/mbk/man3/viewlofig.3 +index f2eace9..5ea307c 100644 +--- a/alliance/src/mbk/man3/viewlofig.3 ++++ b/alliance/src/mbk/man3/viewlofig.3 +@@ -14,7 +14,7 @@ viewlofig + .SH NAME + viewlofig \- display elements of a \fBlofig_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,11 +28,11 @@ lofig_list \(**ptfig; + .SH PARAMETER + .TP 20 + \fIptfig\fP +-Pointer to the \fBlofig\fP to be scaned ++Pointer to the \fBlofig\fP to be scanned + .SH DESCRIPTION + \fBviewlofig\fP scans all the primary elements of the \fBlofig_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +-The \fILOINS\fP, \fILOCON\fP, \fILOSIG\fP and \fILOTRS\fP are scaned, and ++The \fILOINS\fP, \fILOCON\fP, \fILOSIG\fP and \fILOTRS\fP are scanned, and + their contents displayed. + .br + Its use is mostly for debugging purposes, and educational ones, since the +diff --git a/alliance/src/mbk/man3/viewlofigcon.3 b/alliance/src/mbk/man3/viewlofigcon.3 +index 413f80f..cabb1c0 100644 +--- a/alliance/src/mbk/man3/viewlofigcon.3 ++++ b/alliance/src/mbk/man3/viewlofigcon.3 +@@ -14,7 +14,7 @@ viewlofigcon + .SH NAME + viewlofigcon \- display elements of a \fBlocon_list\fP attached to a + figure +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,7 +28,7 @@ locon_list \(**ptcon; + .SH PARAMETER + .TP 20 + \fIptcon\fP +-Pointer to the \fBlocon\fP to be scaned ++Pointer to the \fBlocon\fP to be scanned + .SH DESCRIPTION + \fBviewlofigcon\fP scans all the primary elements of the \fBlocon_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +diff --git a/alliance/src/mbk/man3/viewloins.3 b/alliance/src/mbk/man3/viewloins.3 +index 821c8e0..dec3b79 100644 +--- a/alliance/src/mbk/man3/viewloins.3 ++++ b/alliance/src/mbk/man3/viewloins.3 +@@ -14,7 +14,7 @@ viewloins + .SH NAME + viewloins \- display elements of a \fBloins_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,12 +28,12 @@ loins_list \(**pt; + .SH PARAMETER + .TP 20 + \fIpt\fP +-Pointer to the \fBloins\fP to be scaned ++Pointer to the \fBloins\fP to be scanned + .SH DESCRIPTION + \fBviewloins\fP scans all the primary elements of the \fBloins_list\fP + pointed to by \fIpt\fP, and displays a textual output of the data strcuture + contents. +-The \fILOCON\fP field is scaned, and its contents displayed. ++The \fILOCON\fP field is scanned, and its contents displayed. + .br + Its use is mostly for debugging purposes, and educational ones, since the + output is quite verbose, even if very easy to understand. +diff --git a/alliance/src/mbk/man3/viewloinscon.3 b/alliance/src/mbk/man3/viewloinscon.3 +index 2df82a5..7d1c082 100644 +--- a/alliance/src/mbk/man3/viewloinscon.3 ++++ b/alliance/src/mbk/man3/viewloinscon.3 +@@ -15,7 +15,7 @@ viewloinscon + \fBviewloinscon\fP \- display elements of a \fBlocon_list\fP attached to an + instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -29,7 +29,7 @@ locon_list \(**ptcon; + .SH PARAMETER + .TP 20 + \fIptcon\fP +-Pointer to the \fBlocon\fP to be scaned ++Pointer to the \fBlocon\fP to be scanned + .SH DESCRIPTION + \fBviewloinscon\fP scans all the primary elements of the \fBlocon_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +diff --git a/alliance/src/mbk/man3/viewlores.3 b/alliance/src/mbk/man3/viewlores.3 +index 5043a5a..d050168 100644 +--- a/alliance/src/mbk/man3/viewlores.3 ++++ b/alliance/src/mbk/man3/viewlores.3 +@@ -16,7 +16,7 @@ viewlores + .SH NAME + viewlores \- display elements of a \fBlores_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -31,7 +31,7 @@ lores_list \(**ptres ; + .SH PARAMETER + .TP 20 + \fIptres\fP +-Pointer to the \fBlores\fP to be scaned ++Pointer to the \fBlores\fP to be scanned + .SH DESCRIPTION + \fBviewlores\fP scans all the primary elements of the \fBlores_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +diff --git a/alliance/src/mbk/man3/viewloself.3 b/alliance/src/mbk/man3/viewloself.3 +index f9d0b09..9b4ccbd 100644 +--- a/alliance/src/mbk/man3/viewloself.3 ++++ b/alliance/src/mbk/man3/viewloself.3 +@@ -16,7 +16,7 @@ viewloself + .SH NAME + viewloself \- display elements of a \fBloself_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -31,7 +31,7 @@ loself_list \(**ptself ; + .SH PARAMETER + .TP 20 + \fIptself\fP +-Pointer to the \fBloself\fP to be scaned ++Pointer to the \fBloself\fP to be scanned + .SH DESCRIPTION + \fBviewloself\fP scans all the primary elements of the \fBloself_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +diff --git a/alliance/src/mbk/man3/viewlosig.3 b/alliance/src/mbk/man3/viewlosig.3 +index 4297440..421d2f6 100644 +--- a/alliance/src/mbk/man3/viewlosig.3 ++++ b/alliance/src/mbk/man3/viewlosig.3 +@@ -14,7 +14,7 @@ viewlosig + .SH NAME + viewlosig \- display elements of a \fBlosig_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,7 +28,7 @@ losig_list \(**ptsig; + .SH PARAMETER + .TP 20 + \fIptsig\fP +-Pointer to the \fBlosig\fP to be scaned ++Pointer to the \fBlosig\fP to be scanned + .SH DESCRIPTION + \fBviewlosig\fP scans all the primary elements of the \fBlosig_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +diff --git a/alliance/src/mbk/man3/viewlotrs.3 b/alliance/src/mbk/man3/viewlotrs.3 +index 28a77dd..358aae5 100644 +--- a/alliance/src/mbk/man3/viewlotrs.3 ++++ b/alliance/src/mbk/man3/viewlotrs.3 +@@ -16,7 +16,7 @@ viewlotrs + .SH NAME + viewlotrs \- display elements of a \fBlotrs_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ lotrs_list \(**pttrs; + .SH PARAMETER + .TP 20 + \fIpttrs\fP +-Pointer to the \fBlotrs\fP to be scaned ++Pointer to the \fBlotrs\fP to be scanned + .SH DESCRIPTION + \fBviewlotrs\fP scans all the primary elements of the \fBlotrs_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +diff --git a/alliance/src/mbk/man3/viewph.3 b/alliance/src/mbk/man3/viewph.3 +index 4b0943c..10ac415 100644 +--- a/alliance/src/mbk/man3/viewph.3 ++++ b/alliance/src/mbk/man3/viewph.3 +@@ -14,7 +14,7 @@ viewph + .SH NAME + viewph \- display all the \fBphfig_list\fPs and their elements + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -27,7 +27,7 @@ void viewph(); + .SH DESCRIPTION + \fBviewph\fP scans all the elements of the entire \fBphfig_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. +-All the figures are treated, the first one beeing pointed to by ++All the figures are treated, the first one being pointed to by + \fBHEAD_PHFIG\fP, the global variable that points to the head of all + \fBphfig\fPs. + .br +diff --git a/alliance/src/mbk/man3/viewphcon.3 b/alliance/src/mbk/man3/viewphcon.3 +index 7a1f5ba..64a30e4 100644 +--- a/alliance/src/mbk/man3/viewphcon.3 ++++ b/alliance/src/mbk/man3/viewphcon.3 +@@ -14,7 +14,7 @@ viewphcon + .SH NAME + viewphcon \- display elements of a \fBphcon_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,7 +28,7 @@ phcon_list \(**pt; + .SH PARAMETER + .TP 20 + \fIpt\fP +-Pointer to the \fBphcon\fP to be scaned ++Pointer to the \fBphcon\fP to be scanned + .SH DESCRIPTION + \fBviewphcon\fP scans all the primary elements of the \fBphcon_list\fP + pointed to by \fIpt\fP, and displays a textual output of the data strcuture +diff --git a/alliance/src/mbk/man3/viewphfig.3 b/alliance/src/mbk/man3/viewphfig.3 +index 1aa0842..cade2bf 100644 +--- a/alliance/src/mbk/man3/viewphfig.3 ++++ b/alliance/src/mbk/man3/viewphfig.3 +@@ -13,7 +13,7 @@ viewphfig + .so man1/alc_origin.1 + .SH NAME + viewphfig \- display elements of a \fBphfig_list\fP +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -27,12 +27,12 @@ phfig_list \(**ptfig; + .SH PARAMETER + .TP 20 + \fIptfig\fP +-Pointer to the \fBphfig\fP to be scaned ++Pointer to the \fBphfig\fP to be scanned + .SH DESCRIPTION + \fBviewphfig\fP scans all the primary elements of the \fBphfig_list\fP + loaded in ram, and displays a textual output of the data strcuture contents. + The \fIPHINS\fP, \fIPHCON\fP, \fIPHSEG\fP, \fIPHVIA\fP and \fIPHREF\fP are +-scaned, and their contents displayed. ++scanned, and their contents displayed. + .br + Its use is mostly for debugging purposes, and educational ones, since the + output is quite verbose, if very easy to understand. +diff --git a/alliance/src/mbk/man3/viewphins.3 b/alliance/src/mbk/man3/viewphins.3 +index 79a3ce5..cda90c9 100644 +--- a/alliance/src/mbk/man3/viewphins.3 ++++ b/alliance/src/mbk/man3/viewphins.3 +@@ -14,7 +14,7 @@ viewphins + .SH NAME + viewphins \- display elements of a \fBphins_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,7 +28,7 @@ phins_list \(**pt; + .SH PARAMETER + .TP 20 + \fIpt\fP +-Pointer to the \fBphins\fP to be scaned ++Pointer to the \fBphins\fP to be scanned + .SH DESCRIPTION + \fBviewphins\fP scans all the primary elements of the \fBphins_list\fP + pointed to by \fIpt\fP, and displays a textual output of the data strcuture +diff --git a/alliance/src/mbk/man3/viewphref.3 b/alliance/src/mbk/man3/viewphref.3 +index 78ba7f3..9314946 100644 +--- a/alliance/src/mbk/man3/viewphref.3 ++++ b/alliance/src/mbk/man3/viewphref.3 +@@ -14,7 +14,7 @@ viewphref + .SH NAME + viewphref \- display elements of a \fBphref_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,7 +28,7 @@ phref_list \(**pt; + .SH PARAMETER + .TP 20 + \fIpt\fP +-Pointer to the \fBphref\fP to be scaned ++Pointer to the \fBphref\fP to be scanned + .SH DESCRIPTION + \fBviewphref\fP scans all the primary elements of the \fBphref_list\fP + pointed to by \fIpt\fP, and displays a textual output of the data strcuture +diff --git a/alliance/src/mbk/man3/viewphseg.3 b/alliance/src/mbk/man3/viewphseg.3 +index f9e2060..9381002 100644 +--- a/alliance/src/mbk/man3/viewphseg.3 ++++ b/alliance/src/mbk/man3/viewphseg.3 +@@ -14,7 +14,7 @@ viewphseg + .SH NAME + viewphseg \- display elements of a \fBphseg_list\fP + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,7 +28,7 @@ phseg_list \(**pt; + .SH PARAMETER + .TP 20 + \fIpt\fP +-Pointer to the \fBphseg\fP to be scaned ++Pointer to the \fBphseg\fP to be scanned + .SH DESCRIPTION + \fBviewphseg\fP scans all the primary elements of the \fBphseg_list\fP + pointed to by \fIpt\fP, and displays a textual output of the data strcuture +diff --git a/alliance/src/mbk/man3/viewphvia.3 b/alliance/src/mbk/man3/viewphvia.3 +index 1d58e48..fb7050c 100644 +--- a/alliance/src/mbk/man3/viewphvia.3 ++++ b/alliance/src/mbk/man3/viewphvia.3 +@@ -13,7 +13,7 @@ viewphvia + .so man1/alc_origin.1 + .SH NAME + viewphvia \- display elements of a \fBphvia_list\fP +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -27,7 +27,7 @@ phvia_list \(**pt; + .SH PARAMETER + .TP 20 + \fIpt\fP +-Pointer to the \fBphvia\fP to be scaned ++Pointer to the \fBphvia\fP to be scanned + .SH DESCRIPTION + \fBviewphvia\fP scans all the primary elements of the \fBphvia_list\fP + pointed to by \fIpt\fP, and displays a textual output of the data strcuture +diff --git a/alliance/src/mbk/man3/xyflat.3 b/alliance/src/mbk/man3/xyflat.3 +index a985e66..9dcd7ad 100644 +--- a/alliance/src/mbk/man3/xyflat.3 ++++ b/alliance/src/mbk/man3/xyflat.3 +@@ -10,7 +10,7 @@ xyflat + .SH NAME + xyflat \- compute hierarchical coordinates + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/mbk/man5/ap.5 b/alliance/src/mbk/man5/ap.5 +index 7457df3..59a5d0a 100644 +--- a/alliance/src/mbk/man5/ap.5 ++++ b/alliance/src/mbk/man5/ap.5 +@@ -25,7 +25,7 @@ header ::= 'H ' name ',' file_type ',' abindex ',' nb_desc + /* abindex : index of the abutment box */ + /* nb_desc : number of descriptors */ + /* date : saving file date */ +- /* index_beg : index of the begining of the linkage */ ++ /* index_beg : index of the beginning of the linkage */ + /* link_mode : indication on the linkage */ + /* (update or not) */ + /* bounding_box : coordinates and size of the */ +@@ -121,7 +121,7 @@ x ::= number + y ::= number + + d ::= number +- /* lenght */ ++ /* length */ + + w ::= number + /* width */ +diff --git a/alliance/src/mbk/man5/prol.5 b/alliance/src/mbk/man5/prol.5 +index 9b905ba..1624c2e 100644 +--- a/alliance/src/mbk/man5/prol.5 ++++ b/alliance/src/mbk/man5/prol.5 +@@ -6,7 +6,7 @@ + .so man1/alc_origin.1 + .SH DESCRIPTION + This file describes the rules used by the \fBmbk\fP(1) to \fBrds\fP translator. +-In the following file, symbolic layout objects are refered as \fBmbk\fP(1) ++In the following file, symbolic layout objects are referred as \fBmbk\fP(1) + objects, \fBmbk\fP(1) being the internal data structure that supports + symbolic representation. + On the other hand, \fBrds\fP is a data structure describing mainly rectangles, +@@ -16,7 +16,7 @@ Some syntaxic remarques on the way to write the file follow. + The case of identifiers is not significant, so NDIF is equivalent to NdiF. + Comments are allowed anywhere in the file, using the \fIsharp\fP (#) as start of + comment, and \fInewline\fP as end of comment. +-A line begining with a \fIsharp\fP will be ignored, and a line containing a ++A line beginning with a \fIsharp\fP will be ignored, and a line containing a + \fIsharp\fP will be read up to the character preeceding it. + A \fInewline\fP can be escaped using the \fIbackslash\fP (\) followed by + the \fInewline\fP. +@@ -34,7 +34,7 @@ Then, a set of tables is needed, to describe how to translate a symbolic + object, belonging to the \fBmbk\fP(1) world, and a set of layout rectangles, + in \fBrds\fP. + .br +-Each table has a special meaning, and its parametrization exend beeing not ++Each table has a special meaning, and its parametrization exend being not + full, some borders are to be evocated. + Several type of table exists indeed. + Some are needed for object translation, others for post treatment +@@ -279,7 +279,7 @@ PHYSICAL_GRID\fR. + .ft B \} + TABLE MBK_TO_RDS_SEGMENT\fR + .br +-This table contains all the informations needed to translate a symbolic ++This table contains all the information needed to translate a symbolic + segment of a given layer onto one, two or three real rectangles of + specified layers. + An example of this table is given below, with values needed for a +@@ -356,7 +356,7 @@ These parameters are meant regarding the symbolic segment. + .ft B \} + TABLE MBK_TO_RDS_CONNECTOR\fR + .br +-This table contains all the informations needed to translate a symbolic ++This table contains all the information needed to translate a symbolic + connector of a given layer onto one \fIsingle\fP real rectangle. + .br + An example of this table is given below, with values needed for a +@@ -407,7 +407,7 @@ designing. + .ft B \} + TABLE MBK_TO_RDS_VIA\fR + .br +-This table contains all the informations needed to translate a symbolic ++This table contains all the information needed to translate a symbolic + via of a given layer onto one to four real rectangles of user + specified layers. + An example of this table is given below, with values needed for a +@@ -465,7 +465,7 @@ TABLE S2R_OVERSIZE_DENOTCH\fR + .br + This table contains the oversize value needed to erase notches. + All the rectangles of the same \fBrds\fP layer are oversized by this value +-and then merged alltogether and undersized by the same value. ++and then merged altogether and undersized by the same value. + An example of this table is given below. + .PP + .ie t \{\ +@@ -593,7 +593,7 @@ Precicely if a layer is only to be be translated, or translated + and then post-processed. + Translated means translate and fit from symbolic to real, and + postreated that it should also be merged with its neighbours. +-For example, it's not necesary to merge cut layers such as RDS_CONT. ++For example, it's not necessary to merge cut layers such as RDS_CONT. + .PP + .ie t \{\ + .ft CR \} +diff --git a/alliance/src/mbk/man5/spi.5 b/alliance/src/mbk/man5/spi.5 +index e015b39..ab9e49f 100644 +--- a/alliance/src/mbk/man5/spi.5 ++++ b/alliance/src/mbk/man5/spi.5 +@@ -127,7 +127,7 @@ If this variable is set, an RCN view is not created for a net containing only on + + .B MBK_SPI_NO_AFF_UNK + +-Default behaviour of Spice parser is to display an error message when an unknown element is read in the input file. Setting this variable prevent this display. Usefull when file contain command for Spice simulator. ++Default behaviour of Spice parser is to display an error message when an unknown element is read in the input file. Setting this variable prevent this display. Useful when file contain command for Spice simulator. + + .B MBK_SPI_NAMEDNODES + +diff --git a/alliance/src/mbk/man5/vbe.5 b/alliance/src/mbk/man5/vbe.5 +index 4bcf04e..fa6134b 100644 +--- a/alliance/src/mbk/man5/vbe.5 ++++ b/alliance/src/mbk/man5/vbe.5 +@@ -45,7 +45,7 @@ is to be defined for \fBevery\fP value that the select expression can take). + + .PP + The above constraint may be felt as a hard restriction when designing +-distributed controled hardware (precharged line, distributed multiplexer, ++distributed controlled hardware (precharged line, distributed multiplexer, + etc ...). To hurdle this, VHDL uses a special feature: guarded-resolved signals. + + .PP +diff --git a/alliance/src/mbk/man5/vhdl.5 b/alliance/src/mbk/man5/vhdl.5 +index c7b39e2..4754deb 100644 +--- a/alliance/src/mbk/man5/vhdl.5 ++++ b/alliance/src/mbk/man5/vhdl.5 +@@ -30,7 +30,7 @@ be simulated with any full-VHDL commercial compiler-simulator. + Here follows the main restrictions of the ALLIANCE subset. + + .PP +-The VHDL description of a circuit is made of two seperate parts: the external ++The VHDL description of a circuit is made of two separate parts: the external + view and the internal view. + + .PP +diff --git a/alliance/src/mbk/man5/vst.5 b/alliance/src/mbk/man5/vst.5 +index 48dd1cf..e5c882c 100644 +--- a/alliance/src/mbk/man5/vst.5 ++++ b/alliance/src/mbk/man5/vst.5 +@@ -27,7 +27,7 @@ entity specification. This means that local ports are to be declared with the + same name, type and kind and in the same order. + + .PP +-A structural description is a set of component instanciation statements. ++A structural description is a set of component instantiation statements. + Instances' ports are connected to each other trough signals in a port map + specification. Both explicit and implicit port map specifications are supported + by the ALLIANCE VHDL subset. +diff --git a/alliance/src/mbk/src/alc_driv_p.c b/alliance/src/mbk/src/alc_driv_p.c +index 2a300e0..cb8a478 100644 +--- a/alliance/src/mbk/src/alc_driv_p.c ++++ b/alliance/src/mbk/src/alc_driv_p.c +@@ -245,7 +245,7 @@ char *word; + case EOPEN : + fprintf( stderr, "can\'t open file : %s .\n", word); break; + case EREF : +- fprintf( stderr, " inconsistant reference :%s.\n", word); break; ++ fprintf( stderr, " inconsistent reference :%s.\n", word); break; + case ECLOSE : + fprintf( stderr, "can\'t close file : %s.\n", word); break; + default : fprintf( stderr, "unknown error"); diff --git a/alliance/src/mbk/src/alc_pars_p.c b/alliance/src/mbk/src/alc_pars_p.c -index f65c6cb..a5212b7 100644 +index f65c6cb..b3065e7 100644 --- a/alliance/src/mbk/src/alc_pars_p.c +++ b/alliance/src/mbk/src/alc_pars_p.c @@ -63,28 +63,28 @@ @@ -29923,12 +43238,36 @@ index f65c6cb..a5212b7 100644 #define mc_nexttoken(p_head,p_next,error_code) \ +@@ -1072,12 +1072,12 @@ static void alc_printwarn(warn_code) + case EOPGEO : + fprintf( stderr, "invalid geometric operation"); break; + case EORIENT : +- fprintf( stderr, "unknow orientation"); break; ++ fprintf( stderr, "unknown orientation"); break; + case ENAMETRS : + fprintf( stderr, "invalid transistor"); break; + case ETYPEVIA : + fprintf( stderr, "invalid via"); break; +- default : fprintf( stderr, "unknow warning"); ++ default : fprintf( stderr, "unknown warning"); + } + fprintf( stderr, "\n( line %ld parsing %s )\n", + parser.curr_line, +@@ -1108,7 +1108,7 @@ static void alc_printerror(error_code) + case ETYPESEG : + fprintf( stderr, "segment neither H nor V"); break; + case ETRANSORIENT: +- fprintf( stderr, "Unknow transistor orientation"); break; ++ fprintf( stderr, "Unknown transistor orientation"); break; + case EHEADER : + fprintf( stderr, "unexpected header"); break; + case ENBFIELDS : @@ -1125,10 +1125,10 @@ static void alc_printerror(error_code) fprintf( stderr, "ptfig not allocated"); break; case ECOMPONENT : fprintf( stderr, "invalid component"); break; - default : fprintf( stderr, "unknow error"); -+ default : fprintf( stderr, "unknow error code %ld", error_code ); ++ default : fprintf( stderr, "unknown error code %ld", error_code ); } fprintf( stderr, "\n( line %ld parsing %s )\n",parser.curr_line, - parser.file_name ); EXIT( 1); @@ -29936,8 +43275,83 @@ index f65c6cb..a5212b7 100644 } +@@ -1158,7 +1158,7 @@ static void alc_polar(ptfig) + + /* Transformation des segments PTIE et NTIE en PDIF et NDIF. + On memorise dans les listes LP_PDIF et LP_NDIF non seule- +- ment les TIE mais aussi les NDIF et PDIF. ++ meant les TIE mais aussi les NDIF et PDIF. + ( en cas d'erreur de conception ) + On en profite pour lister les segments NWELL. */ + for( pseg=ptfig->PHSEG; pseg!=(phseg_list*)NULL; +diff --git a/alliance/src/mbk/src/mbk_lo_util.c b/alliance/src/mbk/src/mbk_lo_util.c +index cfed169..8335e0e 100644 +--- a/alliance/src/mbk/src/mbk_lo_util.c ++++ b/alliance/src/mbk/src/mbk_lo_util.c +@@ -1675,7 +1675,7 @@ losig_list *ptsig; + Since the interface of the resulting figure is not supposed to be + used by humans, let's make simple names. + Hey Hey, this was true a while ago, but as always, now we want +- humans to predict the ouput of the function. Fun, ain'it? */ ++ humans to predict the output of the function. Fun, ain'it? */ + /* !Franck + sprintf(loconname, "%s_%lu", loconname, newtermcount++); + */ +@@ -2416,7 +2416,7 @@ key[VHD_scon2DFN] = vhd_hash ("scon2"); + } + + /* ###------------------------------------------------------### */ +- /* _exit and _stop commands are allways available */ ++ /* _exit and _stop commands are always available */ + /* ###------------------------------------------------------### */ + + tab[VHD__XTDFN] = avail; +diff --git a/alliance/src/mbk/src/mbk_ph_util.c b/alliance/src/mbk/src/mbk_ph_util.c +index db74bac..2ce2328 100644 +--- a/alliance/src/mbk/src/mbk_ph_util.c ++++ b/alliance/src/mbk/src/mbk_ph_util.c +@@ -22,7 +22,7 @@ + */ + + /* +- * Purpose : utilites functions for physical view ++ * Purpose : utilities functions for physical view + * Date : 06/03/92 + * Author : Frederic Petrot + * Modified by Czo 1997,98 +@@ -835,7 +835,7 @@ char *stru_name; + } + + /* ###------------------------------------------------------### */ +- /* _exit and _stop commands are allways available */ ++ /* _exit and _stop commands are always available */ + /* ###------------------------------------------------------### */ + + tab[VHD__XTDFN] = avail; +diff --git a/alliance/src/mbk/src/mbk_sys.c b/alliance/src/mbk/src/mbk_sys.c +index 390b80d..5a327eb 100644 +--- a/alliance/src/mbk/src/mbk_sys.c ++++ b/alliance/src/mbk/src/mbk_sys.c +@@ -22,7 +22,7 @@ + */ + + /* +- * Purpose : system dependant functions ++ * Purpose : system dependent functions + * Date : 06/03/92 + * Author : Frederic Petrot + * Modified by Czo 1997,98 +@@ -107,7 +107,7 @@ char *value; + + /* file opening : + defines the strategy used for searching and opening file in the +- mbk environement. */ ++ mbk environment. */ + FILE* mbkfopen(const char *name, const char *extension, const char *mode) + { + FILE *ptf; diff --git a/alliance/src/mbk/src/mbk_util.c b/alliance/src/mbk/src/mbk_util.c -index 88ccfde..cc04f5b 100644 +index 88ccfde..b8ac028 100644 --- a/alliance/src/mbk/src/mbk_util.c +++ b/alliance/src/mbk/src/mbk_util.c @@ -90,6 +90,15 @@ long MBK_TRACK_SPACING_ALU5 = 8; @@ -30000,6 +43414,37 @@ index 88ccfde..cc04f5b 100644 srand((unsigned int) MBK_RAND_SEED); str = mbkgetenv("MBK_IN_LO"); +@@ -1084,7 +1130,7 @@ int i = 0; + chain_list *files = (chain_list *)NULL; + /* Tables for quick cell search : + The catalog file is read only once, and sorted for speed. +- The later calls to loadcatalog only return the approriate table. */ ++ The later calls to loadcatalog only return the appropriate table. */ + static chain_list *cells[4]; + static char **tabs[4]; + static int sizes[4]; +@@ -1212,7 +1258,7 @@ int argc = 0; + if(str != NULL) { + s = (char *)mbkalloc((unsigned int)(strlen(str) + 1) * sizeof(char)); + (void)strcpy(s, str); +- str = s; /* let's not modify the environement values */ ++ str = s; /* let's not modify the environment values */ + stc = str; /* for counting purposes */ + while (1) { + if ((c = strchr(stc, ':')) == NULL) +diff --git a/alliance/src/mbk/src/mlo.h b/alliance/src/mbk/src/mlo.h +index 3cf731e..a01143b 100644 +--- a/alliance/src/mbk/src/mlo.h ++++ b/alliance/src/mbk/src/mlo.h +@@ -155,7 +155,7 @@ losig_list; + /************************* Analogical specific structures ***************************/ + /************************************************************************************/ + +-/********************** Complementary transitor informations ************************/ ++/********************** Complementary transitor information ************************/ + + /* The structure is put in the USER field of the transistor */ + /* with the LOTRS_INFO ptype */ diff --git a/alliance/src/mbk/src/mut.h b/alliance/src/mbk/src/mut.h index 9e87261..11c2914 100644 --- a/alliance/src/mbk/src/mut.h @@ -30022,6 +43467,250 @@ index 9e87261..11c2914 100644 extern char PARSER_INFO[]; /* version number, and so on */ extern char *VDD; /* user name for power high */ extern char *VSS; /* user name for power ground */ +diff --git a/alliance/src/mbk/src/mvl_parse.c b/alliance/src/mbk/src/mvl_parse.c +index cfdaa97..e5c77a9 100644 +--- a/alliance/src/mbk/src/mvl_parse.c ++++ b/alliance/src/mbk/src/mvl_parse.c +@@ -125,7 +125,7 @@ char mode ; + EXIT(1); + } + /* ---------------------------------------------------------------- */ +- /* Now, with the new figure, we duplicate the new informations */ ++ /* Now, with the new figure, we duplicate the new information */ + /* to fill the old one. */ + /* ---------------------------------------------------------------- */ + pt_lofig = mvl_fill(pt_lofig_tmp, MVL_LOFPNT); +diff --git a/alliance/src/mbk/src/parse_vti_l.c b/alliance/src/mbk/src/parse_vti_l.c +index ad4cdcb..f60138f 100644 +--- a/alliance/src/mbk/src/parse_vti_l.c ++++ b/alliance/src/mbk/src/parse_vti_l.c +@@ -48,7 +48,7 @@ + * * gcc4 compatible : no cast like (Foo*)bar=foo; use bar=(Bar*)foo; + * + * * ALLIANCE_CFLAGS not added anymore to CFLAGS or CXXFLAGS +-* by alliance.m4 -> must be added explicitely in each ++* by alliance.m4 -> must be added explicitly in each + * Makefile.am + * + * * remove configure.in (generated by autostuff) +@@ -515,7 +515,7 @@ losig_list *sigct1,*sigct2; + } + freelomodel(model); + +- /* successfull exit */ ++ /* successful exit */ + return 0; + } + case 'G' : /* G INT name ; */ +@@ -703,7 +703,7 @@ losig_list *sigct1,*sigct2; + t1 = strtok(line + 2, " \n\t\"@"); + t2 = strtok((char *)NULL, " \n\t\"@"); + (void)strcpy(s, t2); +- t3 = strtok((char *)NULL, " \n\t\"@"); /* the seperator | */ ++ t3 = strtok((char *)NULL, " \n\t\"@"); /* the separator | */ + + if (*t3 != '|') + hns_error((int)SYNTAX_ERROR, fname, (long)i, (char *)NULL, 0L); +diff --git a/alliance/src/mbk/src/time.c b/alliance/src/mbk/src/time.c +index 731ea00..403bc19 100644 +--- a/alliance/src/mbk/src/time.c ++++ b/alliance/src/mbk/src/time.c +@@ -31,7 +31,7 @@ + * * gcc4 compatible : no cast like (Foo*)bar=foo; use bar=(Bar*)foo; + * + * * ALLIANCE_CFLAGS not added anymore to CFLAGS or CXXFLAGS +- * by alliance.m4 -> must be added explicitely in each ++ * by alliance.m4 -> must be added explicitly in each + * Makefile.am + * + * * remove configure.in (generated by autostuff) +diff --git a/alliance/src/mbk/src/vel_drive.c b/alliance/src/mbk/src/vel_drive.c +index 8b26f57..e0e86fd 100644 +--- a/alliance/src/mbk/src/vel_drive.c ++++ b/alliance/src/mbk/src/vel_drive.c +@@ -25,7 +25,7 @@ + * generics. + * + * Revision 1.5 2002/12/10 11:39:05 fred +- * Adding correct generation of uncomplete vectors. ++ * Adding correct generation of incomplete vectors. + * + * Revision 1.4 2002/12/06 09:56:05 fred + * Erasing a forgotten debug dump ! +@@ -449,7 +449,7 @@ int length, j; + } + + /* +- * Components instanciation ++ * Components instantiation + */ + f->LOINS=(loins_list *)reverse((chain_list *)f->LOINS); + for (i=f->LOINS; i; i=i->NEXT) { +@@ -621,7 +621,7 @@ int sigi = 0; + + /* Ensure that connector and internal signal names are not + * identical, and correct this prior to build the velofig. +- * This nice check is in O(nc * ns), because I dont feel like ++ * This nice check is in O(nc * ns), because I don't feel like + * building hash tables and all that stuff to speed up things. + * I may have to if this is really awful */ + +diff --git a/alliance/src/mbk/src/vel_o.c b/alliance/src/mbk/src/vel_o.c +index 1694784..9982783 100644 +--- a/alliance/src/mbk/src/vel_o.c ++++ b/alliance/src/mbk/src/vel_o.c +@@ -14,7 +14,7 @@ + * * gcc4 compatible : no cast like (Foo*)bar=foo; use bar=(Bar*)foo; + * + * * ALLIANCE_CFLAGS not added anymore to CFLAGS or CXXFLAGS +- * by alliance.m4 -> must be added explicitely in each ++ * by alliance.m4 -> must be added explicitly in each + * Makefile.am + * + * * remove configure.in (generated by autostuff) +diff --git a/alliance/src/nero/doc/man1/nero.1 b/alliance/src/nero/doc/man1/nero.1 +index e13b1ea..e3c76c9 100644 +--- a/alliance/src/nero/doc/man1/nero.1 ++++ b/alliance/src/nero/doc/man1/nero.1 +@@ -19,7 +19,7 @@ contains nets which half perimeter is greater than 800 lambdas. + Global routing is used on big designs. + .PP + In nero, "global routing" means that +-the longuests nets are completly routed in a first step with only ++the longuests nets are completely routed in a first step with only + routing layers numbers 3 & 4. Then the smaller nets are routed with all + avalaibles layers. This implies that when global routing is + used, the number of routing layers is forced to at least 4. +@@ -31,7 +31,7 @@ nero mandatory arguments\ : + .TP 0.2i + \(bu + \fInetlist\fR\ : the name of +-the design, whithout any extention. Please note that unless a ++the design, without any extention. Please note that unless a + \fB-p\fR \fIplacement\fR option + is given, the file holding the placement is expected to have the + same name as the netlist file (short of the extention). +diff --git a/alliance/src/nero/doc/nero/man_nero.html b/alliance/src/nero/doc/nero/man_nero.html +index 51907d7..788c7bb 100644 +--- a/alliance/src/nero/doc/nero/man_nero.html ++++ b/alliance/src/nero/doc/nero/man_nero.html +@@ -131,7 +131,7 @@ CLASS="EMPHASIS" + CLASS="LITERAL" + >nero, "global routing" means that +- the longuests nets are completly routed in a first step with only ++ the longuests nets are completely routed in a first step with only + routing layers numbers 3 & 4. Then the smaller nets are routed with all + avalaibles layers. This implies that when global routing is + used, the number of routing layers is forced to at least 4. +@@ -161,7 +161,7 @@ CLASS="LITERAL" + CLASS="FILENAME" + >netlist: the name of +- the design, whithout any extention. Please note that unless a ++ the design, without any extention. Please note that unless a + -pLOINS; pLoins != NULL; pLoins = pLoins->NEXT) { + instances[pLoins->INSNAME] = pLoins; + } +@@ -523,13 +523,13 @@ void CLofig::rflatten (char concat, char catal) + cmess2 << " o Flattening netlist...\n"; + rflattenlofig (fig, concat, catal); + +- // Rebuild the instances dictionnary (map). ++ // Rebuild the instances dictionary (map). + instances.clear (); + for (pLoins = fig->LOINS; pLoins != NULL; pLoins = pLoins->NEXT) { + instances[pLoins->INSNAME] = pLoins; + } + +- // Build the signal dictionnary. ++ // Build the signal dictionary. + // Load all name aliases. + for (pLosig = fig->LOSIG; pLosig != NULL; pLosig = pLosig->NEXT) { + //signals[getsigname(pLosig)] = pLosig; +@@ -597,7 +597,7 @@ CPhfig::CPhfig (string &name) + cmess1 << " o Loading layout \"" << name << "\"...\n"; + fig = getphfig ((char *)name.c_str (), 'A'); + +- // Build the instances dictionnary (map). ++ // Build the instances dictionary (map). + for (pPhins = fig->PHINS; pPhins != NULL; pPhins = pPhins->NEXT) { + instances[pPhins->INSNAME] = pPhins; + } +@@ -628,7 +628,7 @@ void CPhfig::rflatten (char concat, char catal) + cmess2 << " o Flattening layout...\n"; + rflattenphfig (fig, concat, catal); + +- // Rebuild the instances dictionnary (map). ++ // Rebuild the instances dictionary (map). + instances.clear (); + for (pPhins = fig->PHINS; pPhins != NULL; pPhins = pPhins->NEXT) { + instances[pPhins->INSNAME] = pPhins; +diff --git a/alliance/src/nero/src/MMBK.h b/alliance/src/nero/src/MMBK.h +index 76b0491..24cb5fe 100644 +--- a/alliance/src/nero/src/MMBK.h ++++ b/alliance/src/nero/src/MMBK.h +@@ -109,7 +109,7 @@ namespace MBK { + public: CRect rect; // Rectangle (MBK coordinates). + public: CRect grid; // Rectangle (routing grid units). + +- // Contructor. ++ // Constructor. + public: CXRect (CDRGrid* agrid); + + // Predicate. +diff --git a/alliance/src/nero/src/MPower.cpp b/alliance/src/nero/src/MPower.cpp +index 9c5451b..13abdcc 100644 +--- a/alliance/src/nero/src/MPower.cpp ++++ b/alliance/src/nero/src/MPower.cpp +@@ -139,7 +139,7 @@ CPowers::CPowers ( CFig *fig + cerr << " " << layer2a (layer) << " \"" << seg->NAME + <<"\" segment at (" + << UNSCALE (seg->X1) << "," +- << UNSCALE (seg->Y1) << ") doesn't have the rigth witdth :" ++ << UNSCALE (seg->Y1) << ") doesn't have the right witdth :" + << UNSCALE (seg->WIDTH) << " instead of " + << UNSCALE (width) << ".\n"; + cerr << " (instance \"" << ins->INSNAME << "\" of model \"" diff --git a/alliance/src/nero/src/UDefs.h b/alliance/src/nero/src/UDefs.h index f756e26..042e705 100644 --- a/alliance/src/nero/src/UDefs.h @@ -30035,8 +43724,48 @@ index f756e26..042e705 100644 +diff --git a/alliance/src/nero/src/UGrid.cpp b/alliance/src/nero/src/UGrid.cpp +index 7d21f53..862a8c2 100644 +--- a/alliance/src/nero/src/UGrid.cpp ++++ b/alliance/src/nero/src/UGrid.cpp +@@ -198,7 +198,7 @@ void CDRGrid::iterator::valid (bool validindex) + throw (e_matrix_iterator) + { + if (_drgrid == NULL) { +- throw e_matrix_iterator ("Attempt to use an unitialized grid iterator."); ++ throw e_matrix_iterator ("Attempt to use an uninitialized grid iterator."); + } + + if ( (validindex) && (_index == INT_MAX) ) +diff --git a/alliance/src/nero/src/UInter.cpp b/alliance/src/nero/src/UInter.cpp +index 19130e8..6812946 100644 +--- a/alliance/src/nero/src/UInter.cpp ++++ b/alliance/src/nero/src/UInter.cpp +@@ -166,11 +166,11 @@ void LInter::add (long lbound, long rbound) + mergeInter = itInter; + break; + +- // "itInter" is completly inside "element". ++ // "itInter" is completely inside "element". + // - If "element" has not been merged yet (mergeInter == endInter), + // resize "itInter" to fit element. "element" merged. + // - "element" is already merged : delete "itInter". +- // Immediatly process the next element. ++ // Immediately process the next element. + case C_INTER_IN: + if (mergeInter == endInter) { + itInter->first = element.first; +@@ -185,7 +185,7 @@ void LInter::add (long lbound, long rbound) + // The lower bound of "itInter" is inside "element" : + // - If "element" has not been merged yet (mergeInter == endInter), + // Update the lower bound of "itInter". "element" merged. +- // - "element" is aleady merged : we have to update the upper ++ // - "element" is already merged : we have to update the upper + // bounds of "mergeInter" & "element" as it's used as the + // reference element for the next comparisons. Then delete + // "itInter". diff --git a/alliance/src/nero/src/UOpts.cpp b/alliance/src/nero/src/UOpts.cpp -index 8fb4fd8..a369fd6 100644 +index 8fb4fd8..7423941 100644 --- a/alliance/src/nero/src/UOpts.cpp +++ b/alliance/src/nero/src/UOpts.cpp @@ -16,12 +16,10 @@ @@ -30053,6 +43782,15 @@ index 8fb4fd8..a369fd6 100644 // +----------------------------------------------------------------+ // | Methods Definitions | // +----------------------------------------------------------------+ +@@ -95,7 +93,7 @@ void COpts::add ( string key_short + } + + +- // Add to the option list & dictionnary. ++ // Add to the option list & dictionary. + tList.push_back (new COpt (arg, val)); + key_index = tList.size() - 1; + @@ -119,7 +117,7 @@ void COpts::getopts (int argc, char *argv[]) throw (except_done) extern char *optarg; int key; @@ -30074,8 +43812,57 @@ index 8fb4fd8..a369fd6 100644 if (key == -1) break; +@@ -146,7 +144,7 @@ void COpts::getopts (int argc, char *argv[]) throw (except_done) + key_index = (*this)(key_string); + tList[key_index]->parsed = true; + +- // Get any optionnal argument. ++ // Get any optional argument. + if (tList[key_index]->has_arg) { + tList[key_index]->value = optarg; + } +diff --git a/alliance/src/nero/src/debug.cpp b/alliance/src/nero/src/debug.cpp +index 0945750..b306464 100644 +--- a/alliance/src/nero/src/debug.cpp ++++ b/alliance/src/nero/src/debug.cpp +@@ -366,7 +366,7 @@ void CDRGrid::iterator::valid (bool validindex) + throw (e_matrix_iterator) + { + if (_drgrid == NULL) { +- throw e_matrix_iterator ("Attempt to use an unitialized grid iterator."); ++ throw e_matrix_iterator ("Attempt to use an uninitialized grid iterator."); + } + + if ( (validindex) && (_index == INT_MAX) ) +@@ -843,7 +843,7 @@ __CNode__ &TMatrix<__CNode__>::add (int index) + + // Overridables. + public: virtual const char* what () const { +- return ((char*)"Unkown terminal."); ++ return ((char*)"Unknown terminal."); + } + }; + +@@ -961,7 +961,7 @@ void CMatrixPri::findfree (int index) + + for (i = cx - radius; i < cx + radius + 1; i++) { + for (j = cy - radius; j < cy + radius + 1; j++) { +- // Proccess only nodes of the ring. ++ // Process only nodes of the ring. + // if ( (i > cx - radius) || (i < cx + radius) ) continue; + // if ( (j > cy - radius) || (j < cy + radius) ) continue; + +@@ -1050,7 +1050,7 @@ void CMatrixPri::load (CNet &net, bool global, int expand=0) + // That is, in the first step of the algorithm we fill both queue + // at the same time. + // In the case of the map of a global signal (i.e. using z=3&4 for +- // the time beeing, set to one the map points above the terminal ++ // the time being, set to one the map points above the terminal + // in z=1&2, as they will not be set by the _bb loop. + + for (id = 0; id < net.size; id++) { diff --git a/alliance/src/nero/src/nero.cpp b/alliance/src/nero/src/nero.cpp -index d59566d..7a70240 100644 +index d59566d..025240e 100644 --- a/alliance/src/nero/src/nero.cpp +++ b/alliance/src/nero/src/nero.cpp @@ -17,6 +17,11 @@ @@ -30090,6 +43877,15 @@ index d59566d..7a70240 100644 +@@ -209,7 +214,7 @@ int main (int argc, char *argv[]) + cout << "File: " << fileNetSet << endl; + FILE* file = fopen ( fileNetSet.c_str(), "r" ); + if ( file ) { +- cout << "File Sucessfully opened." << endl; ++ cout << "File Successfully opened." << endl; + netSet = new set(); + char buffer[2048]; + while ( !feof(file) ) { diff --git a/alliance/src/ocp/src/placer/PCon.cpp b/alliance/src/ocp/src/placer/PCon.cpp index e236e98..d69a635 100644 --- a/alliance/src/ocp/src/placer/PCon.cpp @@ -30124,6 +43920,76 @@ index db95f60..3279e05 100644 /* This file is part of the Alliance Project. Copyright (C) Laboratoire LIP6 - Departement ASIM +diff --git a/alliance/src/pat/doc/pat.5 b/alliance/src/pat/doc/pat.5 +index 40d5365..d3bae2a 100644 +--- a/alliance/src/pat/doc/pat.5 ++++ b/alliance/src/pat/doc/pat.5 +@@ -172,7 +172,7 @@ legal values for inputs are: + For each output the user can predict a value. This bring the simulator to make + a comparison between this value and the one calculated during the simulation. + Predicting a \'*\' (star) as an output value disables the comparison. Values +-must be preceeded by a \'?\' (question mark). The \'?\' can be omitted when ++must be preceded by a \'?\' (question mark). The \'?\' can be omitted when + using a \'*\'. Depending on the format, legal values for outputs are : + + .TP 10 +diff --git a/alliance/src/pat/src/pat_debug.c b/alliance/src/pat/src/pat_debug.c +index 499c959..dc631f0 100644 +--- a/alliance/src/pat/src/pat_debug.c ++++ b/alliance/src/pat/src/pat_debug.c +@@ -436,7 +436,7 @@ char **str ; /* recognized strings */ + /* function : splitline */ + /* description : read a line (the space must have been reserved by the */ + /* caller - *words) from the standard input and split it */ +-/* into seperate words. Return the number of words read. */ ++/* into separate words. Return the number of words read. */ + /* called func. : none */ + /* ###--------------------------------------------------------------### */ + +diff --git a/alliance/src/pat/src/pat_desc_y.y b/alliance/src/pat/src/pat_desc_y.y +index 403fc6f..14720db 100644 +--- a/alliance/src/pat/src/pat_desc_y.y ++++ b/alliance/src/pat/src/pat_desc_y.y +@@ -1164,7 +1164,7 @@ unlabeled_pattern + else + { + /* ###----------------------------------------------### */ +- /* begining a new array or a new single bit */ ++ /* beginning a new array or a new single bit */ + /* ###----------------------------------------------### */ + + if (c == '?') +@@ -1178,7 +1178,7 @@ unlabeled_pattern + cmpfl = 'F'; + + /* ###----------------------------------------------### */ +- /* if begining a new array */ ++ /* if beginning a new array */ + /* ###----------------------------------------------### */ + + if ((ptgrp != NULL) && (idx == ptgrp->FINDEX)) +@@ -1235,7 +1235,7 @@ unlabeled_pattern + else + { + /* ###----------------------------------------------### */ +- /* Begining a new single bit */ ++ /* Beginning a new single bit */ + /* ###----------------------------------------------### */ + + islegal (idx, c, cmpfl, 0); +diff --git a/alliance/src/pat/src/pat_lodpaseq.c b/alliance/src/pat/src/pat_lodpaseq.c +index 77073e2..62be954 100644 +--- a/alliance/src/pat/src/pat_lodpaseq.c ++++ b/alliance/src/pat/src/pat_lodpaseq.c +@@ -104,7 +104,7 @@ unsigned char mode ; /* compiler mode */ + { + /* ###------------------------------------------------------### */ + /* parse the openned file. Close the file when the end is */ +- /* reached or if an error has occured. */ ++ /* reached or if an error has occurred. */ + /* ###------------------------------------------------------### */ + + ptseq = pat_prspat (fp, name, ptseq, maxpat, mode); diff --git a/alliance/src/rds/etc/Makefile.am b/alliance/src/rds/etc/Makefile.am index ab78e4e..d5cca76 100644 --- a/alliance/src/rds/etc/Makefile.am @@ -30187,7 +44053,7 @@ index d1a6bed..b597366 100644 diff --git a/alliance/src/rds/etc/scn6m_deep_09.rds b/alliance/src/rds/etc/scn6m_deep_09.rds new file mode 100644 -index 0000000..86b2ac8 +index 0000000..29faf58 --- /dev/null +++ b/alliance/src/rds/etc/scn6m_deep_09.rds @@ -0,0 +1,2134 @@ @@ -31094,7 +44960,7 @@ index 0000000..86b2ac8 + +# Two RDS_TALU8 rectangles are written, one with no name and +# one with the cell name. When merged, the name is lost. -+# It is prefered to have a single rectangle with no name rather ++# It is preferred to have a single rectangle with no name rather +# than two, one of which is named. + RDS_TALU8 TREAT NULL + @@ -32325,6 +46191,939 @@ index 0000000..86b2ac8 +5050 50.5 AB Overlap of REF < 0.18um (2 lambda) +END_DRC_COMMENT +END_DRC_RULES +diff --git a/alliance/src/rds/man3/addrdsfig.3 b/alliance/src/rds/man3/addrdsfig.3 +index e3b167f..90d1d68 100644 +--- a/alliance/src/rds/man3/addrdsfig.3 ++++ b/alliance/src/rds/man3/addrdsfig.3 +@@ -14,7 +14,7 @@ addrdsfig + .SH NAME + addrdsfig \- adds a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/addrdsfigrec.3 b/alliance/src/rds/man3/addrdsfigrec.3 +index a57fb97..fd9bdbd 100644 +--- a/alliance/src/rds/man3/addrdsfigrec.3 ++++ b/alliance/src/rds/man3/addrdsfigrec.3 +@@ -14,7 +14,7 @@ addrdsfigrec + .SH NAME + addrdsfigrec \- adds a rectangle to a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/addrdsins.3 b/alliance/src/rds/man3/addrdsins.3 +index eefb9e6..5fe8696 100644 +--- a/alliance/src/rds/man3/addrdsins.3 ++++ b/alliance/src/rds/man3/addrdsins.3 +@@ -14,7 +14,7 @@ addrdsins + .SH NAME + addrdsins \- adds an instance to a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/addrdsinsrec.3 b/alliance/src/rds/man3/addrdsinsrec.3 +index 4f3a286..c3123f6 100644 +--- a/alliance/src/rds/man3/addrdsinsrec.3 ++++ b/alliance/src/rds/man3/addrdsinsrec.3 +@@ -14,7 +14,7 @@ addrdsinsrec + .SH NAME + addrdsinsrec \- adds a rectangle to an instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/addrdsrecwindow.3 b/alliance/src/rds/man3/addrdsrecwindow.3 +index a88322b..d8b7062 100644 +--- a/alliance/src/rds/man3/addrdsrecwindow.3 ++++ b/alliance/src/rds/man3/addrdsrecwindow.3 +@@ -14,7 +14,7 @@ addrdsrecwindow + .SH NAME + addrdsrecwindow \- adds a rectangle in the windowing of rds structure. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -34,7 +34,7 @@ The rectangle to add to the windowing. + \fIRdsWindow\fP + The head of the windowing which has to contain the rectangle. + .SH DESCRIPTION +-The \fIaddrdsrecwindow\fP function inserts a rdsrec_list rectangle structure in the windowing of the rds structure. The rectangle is added in one or many windows of the table (it depends on his dimensions). The field \'USER\' of the rectangle is used to point to the list of windows which contains the rectangle. So, the field \'USER\' has to be saved in an added structure to the rdsrec_list structure if librfm functions are used because somes use the field \'USER\' to link rectangles (see librds about field \'USER\'). ++The \fIaddrdsrecwindow\fP function inserts a rdsrec_list rectangle structure in the windowing of the rds structure. The rectangle is added in one or many windows of the table (it depends on his dimensions). The field \'USER\' of the rectangle is used to point to the list of windows which contains the rectangle. So, the field \'USER\' has to be saved in an added structure to the rdsrec_list structure if librfm functions are used because some use the field \'USER\' to link rectangles (see librds about field \'USER\'). + .TP + \fINote\fP + If the rectangle is contained in only one window, then the field \'USER\' points to a "rdswin_list" window structure. +diff --git a/alliance/src/rds/man3/allocrdsfig.3 b/alliance/src/rds/man3/allocrdsfig.3 +index afb5a7b..2771411 100644 +--- a/alliance/src/rds/man3/allocrdsfig.3 ++++ b/alliance/src/rds/man3/allocrdsfig.3 +@@ -14,7 +14,7 @@ allocrdsfig + .SH NAME + allocrdsfig \- allocs memory for a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/allocrdsins.3 b/alliance/src/rds/man3/allocrdsins.3 +index 84fdffd..227fc41 100644 +--- a/alliance/src/rds/man3/allocrdsins.3 ++++ b/alliance/src/rds/man3/allocrdsins.3 +@@ -14,7 +14,7 @@ allocrdsins + .SH NAME + allocrdsins \- allocates memory for an instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/allocrdsrec.3 b/alliance/src/rds/man3/allocrdsrec.3 +index 8332ddb..9f3401c 100644 +--- a/alliance/src/rds/man3/allocrdsrec.3 ++++ b/alliance/src/rds/man3/allocrdsrec.3 +@@ -14,7 +14,7 @@ allocrdsrec + .SH NAME + allocrdsrec \- allocates memory for a rectangle + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/allocrdsrecwin.3 b/alliance/src/rds/man3/allocrdsrecwin.3 +index 3f612fd..3b01fb8 100644 +--- a/alliance/src/rds/man3/allocrdsrecwin.3 ++++ b/alliance/src/rds/man3/allocrdsrecwin.3 +@@ -14,7 +14,7 @@ allocrdsrecwin + .SH NAME + allocrdsrecwin \- allocates a structure used to know windows which contains a rectangle. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/allocrdswin.3 b/alliance/src/rds/man3/allocrdswin.3 +index c0a2ded..c9aa1a8 100644 +--- a/alliance/src/rds/man3/allocrdswin.3 ++++ b/alliance/src/rds/man3/allocrdswin.3 +@@ -14,7 +14,7 @@ allocrdswin + .SH NAME + allocrdswin \- allocates window's table + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/allocrdswindow.3 b/alliance/src/rds/man3/allocrdswindow.3 +index 1392d82..a4face0 100644 +--- a/alliance/src/rds/man3/allocrdswindow.3 ++++ b/alliance/src/rds/man3/allocrdswindow.3 +@@ -14,7 +14,7 @@ allocrdswindow + .SH NAME + allocrdswindow \- allocates a window structure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/allocrdswinrec.3 b/alliance/src/rds/man3/allocrdswinrec.3 +index 52f1478..427f207 100644 +--- a/alliance/src/rds/man3/allocrdswinrec.3 ++++ b/alliance/src/rds/man3/allocrdswinrec.3 +@@ -14,7 +14,7 @@ allocrdswinrec + .SH NAME + allocrdswinrec \- allocates a structure used to create a list of tables of rectangles. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/buildrdswindow.3 b/alliance/src/rds/man3/buildrdswindow.3 +index e4d88bd..f1f89ca 100644 +--- a/alliance/src/rds/man3/buildrdswindow.3 ++++ b/alliance/src/rds/man3/buildrdswindow.3 +@@ -14,7 +14,7 @@ buildrdswindow + .SH NAME + buildrdswindow \- builds windowing of a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/conmbkrds.3 b/alliance/src/rds/man3/conmbkrds.3 +index f44e272..583964b 100644 +--- a/alliance/src/rds/man3/conmbkrds.3 ++++ b/alliance/src/rds/man3/conmbkrds.3 +@@ -14,7 +14,7 @@ conmbkrds + .SH NAME + conmbkrds \- converts MBK connector to RDS rectangle + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/delrdsfig.3 b/alliance/src/rds/man3/delrdsfig.3 +index 4e347bf..cc78b53 100644 +--- a/alliance/src/rds/man3/delrdsfig.3 ++++ b/alliance/src/rds/man3/delrdsfig.3 +@@ -14,7 +14,7 @@ delrdsfig + .SH NAME + delrdsfig \- deletes a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/delrdsfigrec.3 b/alliance/src/rds/man3/delrdsfigrec.3 +index 1a87e76..9ea7eaf 100644 +--- a/alliance/src/rds/man3/delrdsfigrec.3 ++++ b/alliance/src/rds/man3/delrdsfigrec.3 +@@ -14,7 +14,7 @@ delrdsfigrec + .SH NAME + delrdsfigrec \- deletes a rectangle of a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/delrdsins.3 b/alliance/src/rds/man3/delrdsins.3 +index d1cf75b..6855558 100644 +--- a/alliance/src/rds/man3/delrdsins.3 ++++ b/alliance/src/rds/man3/delrdsins.3 +@@ -14,7 +14,7 @@ delrdsins + .SH NAME + delrdsins \- deletes an instance of a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/delrdsinsrec.3 b/alliance/src/rds/man3/delrdsinsrec.3 +index 577b255..c1dbd9f 100644 +--- a/alliance/src/rds/man3/delrdsinsrec.3 ++++ b/alliance/src/rds/man3/delrdsinsrec.3 +@@ -14,7 +14,7 @@ delrdsinsrec + .SH NAME + delrdsinsrec \- deletes a rectangle of an instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/delrdsrecwindow.3 b/alliance/src/rds/man3/delrdsrecwindow.3 +index b3cee3f..a95e5e1 100644 +--- a/alliance/src/rds/man3/delrdsrecwindow.3 ++++ b/alliance/src/rds/man3/delrdsrecwindow.3 +@@ -14,7 +14,7 @@ delrdsrecwindow + .SH NAME + delrdsrecwindow \- deletes a rectangle from the windowing of rds structure. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/destroyrdswindow.3 b/alliance/src/rds/man3/destroyrdswindow.3 +index bf55ddc..d929197 100644 +--- a/alliance/src/rds/man3/destroyrdswindow.3 ++++ b/alliance/src/rds/man3/destroyrdswindow.3 +@@ -14,7 +14,7 @@ destroyrdswindow + .SH NAME + destroyrdswindow \- destroys windowing of a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/figmbkrds.3 b/alliance/src/rds/man3/figmbkrds.3 +index 5e6816b..5584cf8 100644 +--- a/alliance/src/rds/man3/figmbkrds.3 ++++ b/alliance/src/rds/man3/figmbkrds.3 +@@ -14,7 +14,7 @@ figmbkrds + .SH NAME + figmbkrds \- converts MBK figure to RDS figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/freerdsfig.3 b/alliance/src/rds/man3/freerdsfig.3 +index 95a9cb3..daae379 100644 +--- a/alliance/src/rds/man3/freerdsfig.3 ++++ b/alliance/src/rds/man3/freerdsfig.3 +@@ -14,7 +14,7 @@ freerdsfig + .SH NAME + freerdsfig \- frees memory associated to a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/freerdsins.3 b/alliance/src/rds/man3/freerdsins.3 +index fe76b17..bff70d6 100644 +--- a/alliance/src/rds/man3/freerdsins.3 ++++ b/alliance/src/rds/man3/freerdsins.3 +@@ -14,7 +14,7 @@ freerdsins + .SH NAME + freerdsins \- frees memory associated to an instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/freerdsrec.3 b/alliance/src/rds/man3/freerdsrec.3 +index 149a013..b83bdc7 100644 +--- a/alliance/src/rds/man3/freerdsrec.3 ++++ b/alliance/src/rds/man3/freerdsrec.3 +@@ -14,7 +14,7 @@ freerdsrec + .SH NAME + freerdsrec \- free memory associated to a rectangle + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/getrdsmodellist.3 b/alliance/src/rds/man3/getrdsmodellist.3 +index 5df38e3..637e71c 100644 +--- a/alliance/src/rds/man3/getrdsmodellist.3 ++++ b/alliance/src/rds/man3/getrdsmodellist.3 +@@ -14,7 +14,7 @@ getrdsmodellist + .SH NAME + getrdsmodellist \- gets model list of the instances of a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/insconmbkrds.3 b/alliance/src/rds/man3/insconmbkrds.3 +index 3fa648a..d842245 100644 +--- a/alliance/src/rds/man3/insconmbkrds.3 ++++ b/alliance/src/rds/man3/insconmbkrds.3 +@@ -14,7 +14,7 @@ insconmbkrds + .SH NAME + insconmbkrds \- adds in RDS instance all the connectors of MBK instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/insmbkrds.3 b/alliance/src/rds/man3/insmbkrds.3 +index d86de5c..138b26f 100644 +--- a/alliance/src/rds/man3/insmbkrds.3 ++++ b/alliance/src/rds/man3/insmbkrds.3 +@@ -14,7 +14,7 @@ insmbkrds + .SH NAME + insmbkrds \- converts MBK figure to RDS figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -55,7 +55,7 @@ Flag used for the segment conversion. If the parameter Lynx is set to 0 then thi + s is the normal conversion mode. If the parameter Lynx is set to 1 then the rds + structure generated permits to extract equipotentials rectangles. + .SH DESCRIPTION +-The \fIinsmbkrds\fP function creates in the RDS figure the RDS instance issue to the convertion of the MBK instance to RDS format. If the parameter \'Mode\' is set to \'A\' then all the instance is loaded, else if parameter \'Mode\' is set to \'P\' then connectors and abutment box and through routes are loaded (for more information, see getphfig and loadphfig MBK functions). ++The \fIinsmbkrds\fP function creates in the RDS figure the RDS instance issue to the conversion of the MBK instance to RDS format. If the parameter \'Mode\' is set to \'A\' then all the instance is loaded, else if parameter \'Mode\' is set to \'P\' then connectors and abutment box and through routes are loaded (for more information, see getphfig and loadphfig MBK functions). + .SH RETURN VALUE + A pointer to the newly created instance is returned. + .SH ERRORS +diff --git a/alliance/src/rds/man3/insrefmbkrds.3 b/alliance/src/rds/man3/insrefmbkrds.3 +index 90f28cb..73e2a2c 100644 +--- a/alliance/src/rds/man3/insrefmbkrds.3 ++++ b/alliance/src/rds/man3/insrefmbkrds.3 +@@ -14,7 +14,7 @@ insrefmbkrds + .SH NAME + insrefmbkrds \- adds in RDS instance all the references of MBK instance. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/inssegmbkrds.3 b/alliance/src/rds/man3/inssegmbkrds.3 +index 4a03c96..8eec53d 100644 +--- a/alliance/src/rds/man3/inssegmbkrds.3 ++++ b/alliance/src/rds/man3/inssegmbkrds.3 +@@ -14,7 +14,7 @@ inssegmbkrds + .SH NAME + inssegmbkrds \- adds in RDS instance all the segments of MBK instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/instanceface.3 b/alliance/src/rds/man3/instanceface.3 +index 8416f56..e8d3ecb 100644 +--- a/alliance/src/rds/man3/instanceface.3 ++++ b/alliance/src/rds/man3/instanceface.3 +@@ -14,7 +14,7 @@ instanceface + .SH NAME + instanceface \- returns the face of a connector in a placed instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -31,7 +31,7 @@ char modelface, symmetry; + Face of a connector in its figure. + .TP 20 + \fIsymmetry\fP +-Geometrical operation applied to the instanciation of the figure. ++Geometrical operation applied to the instantiation of the figure. + .SH DESCRIPTION + \fBinstanceface\fP determines the orientation of a connector in an instance of + its model. +diff --git a/alliance/src/rds/man3/insviambkrds.3 b/alliance/src/rds/man3/insviambkrds.3 +index e368f7a..2b9b002 100644 +--- a/alliance/src/rds/man3/insviambkrds.3 ++++ b/alliance/src/rds/man3/insviambkrds.3 +@@ -14,7 +14,7 @@ insviambkrds + .SH NAME + insviambkrds \- adds to RDS instance all the contacts from MBK instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/loadrdsfig.3 b/alliance/src/rds/man3/loadrdsfig.3 +index a5c5c96..beb2a67 100644 +--- a/alliance/src/rds/man3/loadrdsfig.3 ++++ b/alliance/src/rds/man3/loadrdsfig.3 +@@ -14,7 +14,7 @@ loadrdsfig + .SH NAME + loadrdsfig \- give back a pointer to a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/loadrdsparam.3 b/alliance/src/rds/man3/loadrdsparam.3 +index 06c52a9..68305c6 100644 +--- a/alliance/src/rds/man3/loadrdsparam.3 ++++ b/alliance/src/rds/man3/loadrdsparam.3 +@@ -14,7 +14,7 @@ loadrdsparam + .SH NAME + loadrdsparam \- load parameters from symbolic to real conversion. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -28,7 +28,7 @@ none + .SH DESCRIPTION + The \fIloadrdsparam\fP function loads parameters contained in a file with extention ".rds" which is the translation file from symbolic to real. Some of these files are contained in the path "/labo/etc".See them for more information. + .br +-When programming, this function must be called before using the functions of the RFM library ( MBK to RDS convertion functions). ++When programming, this function must be called before using the functions of the RFM library ( MBK to RDS conversion functions). + .br + The name of the file "nnn.rds" is set with the environment variable of unix system "RDS_TECHNO_NAME". For more information about it, see the RTL library. + Before calling the loadrdsparam function, environment variables must be set by using the function \fIrdsenv\fP. +diff --git a/alliance/src/rds/man3/modelmbkrds.3 b/alliance/src/rds/man3/modelmbkrds.3 +index c11752a..2cb4e5a 100644 +--- a/alliance/src/rds/man3/modelmbkrds.3 ++++ b/alliance/src/rds/man3/modelmbkrds.3 +@@ -14,7 +14,7 @@ modelmbkrds + .SH NAME + modelmbkrds \- gets all models of instances contained in a figure. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/rdsalloc.3 b/alliance/src/rds/man3/rdsalloc.3 +index a95faba..216674d 100644 +--- a/alliance/src/rds/man3/rdsalloc.3 ++++ b/alliance/src/rds/man3/rdsalloc.3 +@@ -14,7 +14,7 @@ rdsalloc + .SH NAME + rdsalloc \- memory allocation function + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -37,7 +37,7 @@ takes the values RDS_ALLOC_BLOCK or RDS_ALLOC_HEAP (two defined constants). + The \fIrdsalloc\fP function can do memory allocation by block or by heap. If the user wants to allocate by block, he sets the parameter Heap to the constant RDS_ALLOC_BLOCK else, he wants to allocate by heap so the parameter Heap is set to RDS_ALLOC_HEAP. + If rdsalloc is used with the constant RDS_ALLOC_BLOCK then rdsalloc is used as standard language C function malloc(). + If the user allocates by heap then : +-At the first allocation of the block of \fIsize\fP the parameter \'Size\', a heap of size multiple of the block Size is allocated. When another allocation of the same size is done then if the the heap isn't full then a pointer (of \fIsize\fP=\'Size\') is returned else a new heap is allocated and a pointer returned. Like this, the user does really one allocation (he has many pointers) to minimize fragmentation. Heap allocation is usefull if the user has to allocate many pointers of the same size (ex: rdsrec_list structure). ++At the first allocation of the block of \fIsize\fP the parameter \'Size\', a heap of size multiple of the block Size is allocated. When another allocation of the same size is done then if the the heap isn't full then a pointer (of \fIsize\fP=\'Size\') is returned else a new heap is allocated and a pointer returned. Like this, the user does really one allocation (he has many pointers) to minimize fragmentation. Heap allocation is useful if the user has to allocate many pointers of the same size (ex: rdsrec_list structure). + .TP + Note: Memory place allocated is set to NULL. + .SH RETURN VALUE +diff --git a/alliance/src/rds/man3/rdsenv.3 b/alliance/src/rds/man3/rdsenv.3 +index 031d003..4c37a8b 100644 +--- a/alliance/src/rds/man3/rdsenv.3 ++++ b/alliance/src/rds/man3/rdsenv.3 +@@ -14,7 +14,7 @@ rdsenv + .SH NAME + rdsenv \- set user preference + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/rdsfree.3 b/alliance/src/rds/man3/rdsfree.3 +index 60bb900..3fba18e 100644 +--- a/alliance/src/rds/man3/rdsfree.3 ++++ b/alliance/src/rds/man3/rdsfree.3 +@@ -14,7 +14,7 @@ rdsfree + .SH NAME + rdsfree \- free memory place + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/refmbkrds.3 b/alliance/src/rds/man3/refmbkrds.3 +index 5f1e71e..f1e505c 100644 +--- a/alliance/src/rds/man3/refmbkrds.3 ++++ b/alliance/src/rds/man3/refmbkrds.3 +@@ -14,7 +14,7 @@ refmbkrds + .SH NAME + refmbkrds \- adds to RDS figure a references from a MBK figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/roundrdsrec.3 b/alliance/src/rds/man3/roundrdsrec.3 +index bdc0518..b9dda64 100644 +--- a/alliance/src/rds/man3/roundrdsrec.3 ++++ b/alliance/src/rds/man3/roundrdsrec.3 +@@ -14,7 +14,7 @@ roundrdsrec + .SH NAME + roundrdsrec \- adjusts a rectangle to lambda grid step + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/saverdsfig.3 b/alliance/src/rds/man3/saverdsfig.3 +index 02c59ed..bebe6f4 100644 +--- a/alliance/src/rds/man3/saverdsfig.3 ++++ b/alliance/src/rds/man3/saverdsfig.3 +@@ -14,7 +14,7 @@ saverdsfig + .SH NAME + saverdsfig \- save a physical figure on disk. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ saverdsfig \- save a physical figure on disk. + \fIFigure\fP + Pointer to the RDS Figure to save. + .SH DESCRIPTION +-The \fIsaverdsfig\fP function writes on disk the contents of the figure pointer to by rdsfig_list. The savephfig function in fact performs a call to a driver, choosen by the RDS_OUT environment variable. ++The \fIsaverdsfig\fP function writes on disk the contents of the figure pointer to by rdsfig_list. The savephfig function in fact performs a call to a driver, chosen by the RDS_OUT environment variable. + .SH RETURN VALUE + none + .SH ERRORS +diff --git a/alliance/src/rds/man3/searchrdsfig.3 b/alliance/src/rds/man3/searchrdsfig.3 +index 4e93a88..7929459 100644 +--- a/alliance/src/rds/man3/searchrdsfig.3 ++++ b/alliance/src/rds/man3/searchrdsfig.3 +@@ -12,9 +12,9 @@ searchrdsfig + .XE0 \} + .TH SEARCHRDSFIG 3 "October 1, 1997" "ASIM/LIP6" "RDS PHYSICAL FUNCTIONS" + .SH NAME +-searchrdsfig \- searchs by name a figure in the list of figures ++searchrdsfig \- searches by name a figure in the list of figures + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +@@ -30,7 +30,7 @@ searchrdsfig \- searchs by name a figure in the list of figures + \fIName\fP + Name of the figure to search. + .SH DESCRIPTION +-The \fIsearchrdsfig\fP function searchs a figure by its name in the list of figures in memory. ++The \fIsearchrdsfig\fP function searches a figure by its name in the list of figures in memory. + .SH RETURN VALUE + Pointer to the figure searched. If the figure is not found then pointer NULL is returned. + .SH ERRORS +diff --git a/alliance/src/rds/man3/segmbkrds.3 b/alliance/src/rds/man3/segmbkrds.3 +index 01dab99..eabe191 100644 +--- a/alliance/src/rds/man3/segmbkrds.3 ++++ b/alliance/src/rds/man3/segmbkrds.3 +@@ -14,7 +14,7 @@ segmbkrds + .SH NAME + segmbkrds \- adds to RDS figure a segment from a MBK figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viambkrds.3 b/alliance/src/rds/man3/viambkrds.3 +index 99bd9aa..a7a1b38 100644 +--- a/alliance/src/rds/man3/viambkrds.3 ++++ b/alliance/src/rds/man3/viambkrds.3 +@@ -14,7 +14,7 @@ viambkrds + .SH NAME + viambkrds \- adds to RDS figure a contact from a MBK figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrdsfig.3 b/alliance/src/rds/man3/viewrdsfig.3 +index 8ec7b6f..9f2250d 100644 +--- a/alliance/src/rds/man3/viewrdsfig.3 ++++ b/alliance/src/rds/man3/viewrdsfig.3 +@@ -14,7 +14,7 @@ viewrdsfig + .SH NAME + viewrdsfig \- view caracteristics of a figure + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrdsins.3 b/alliance/src/rds/man3/viewrdsins.3 +index f461254..fc30553 100644 +--- a/alliance/src/rds/man3/viewrdsins.3 ++++ b/alliance/src/rds/man3/viewrdsins.3 +@@ -14,7 +14,7 @@ viewrdsins + .SH NAME + viewrdsins \- Displays caracteristics of an instance + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrdsparam.3 b/alliance/src/rds/man3/viewrdsparam.3 +index 1d42b8a..a2797b6 100644 +--- a/alliance/src/rds/man3/viewrdsparam.3 ++++ b/alliance/src/rds/man3/viewrdsparam.3 +@@ -14,7 +14,7 @@ viewrdsparam + .SH NAME + viewrdsparam \- displays tables in memory filled by loadrdsparam function. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrdsrec.3 b/alliance/src/rds/man3/viewrdsrec.3 +index 5577d5a..ed82bc0 100644 +--- a/alliance/src/rds/man3/viewrdsrec.3 ++++ b/alliance/src/rds/man3/viewrdsrec.3 +@@ -14,7 +14,7 @@ viewrdsrec + .SH NAME + viewrdsrec \- Displays caracteristics of a rectangle + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrdswindow.3 b/alliance/src/rds/man3/viewrdswindow.3 +index 10db503..e4f7ea3 100644 +--- a/alliance/src/rds/man3/viewrdswindow.3 ++++ b/alliance/src/rds/man3/viewrdswindow.3 +@@ -14,7 +14,7 @@ viewrdswindow + .SH NAME + viewrdswindow \- displays caracteristics of the windowing. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrfmcon.3 b/alliance/src/rds/man3/viewrfmcon.3 +index 64969bb..de70abe 100644 +--- a/alliance/src/rds/man3/viewrfmcon.3 ++++ b/alliance/src/rds/man3/viewrfmcon.3 +@@ -14,7 +14,7 @@ viewrfmcon + .SH NAME + viewrfmcon \- displays connector caracteristics in MBK and RDS format. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrfmfig.3 b/alliance/src/rds/man3/viewrfmfig.3 +index bcdf192..00cdb2d 100644 +--- a/alliance/src/rds/man3/viewrfmfig.3 ++++ b/alliance/src/rds/man3/viewrfmfig.3 +@@ -14,7 +14,7 @@ viewrfmfig + .SH NAME + viewrfmfig \- displays figure caracteristics in MBK and RDS format. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrfmins.3 b/alliance/src/rds/man3/viewrfmins.3 +index 7575c5f..537aadb 100644 +--- a/alliance/src/rds/man3/viewrfmins.3 ++++ b/alliance/src/rds/man3/viewrfmins.3 +@@ -14,7 +14,7 @@ viewrfmins + .SH NAME + viewrfmins \- displays instance caracteristics in MBK and RDS format. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrfmrec.3 b/alliance/src/rds/man3/viewrfmrec.3 +index 4dde858..cd897d7 100644 +--- a/alliance/src/rds/man3/viewrfmrec.3 ++++ b/alliance/src/rds/man3/viewrfmrec.3 +@@ -14,7 +14,7 @@ viewrfmrec + .SH NAME + viewrfmrec \- displays rectangle caracteristics in RDS format. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrfmref.3 b/alliance/src/rds/man3/viewrfmref.3 +index 0e8322e..5346c6d 100644 +--- a/alliance/src/rds/man3/viewrfmref.3 ++++ b/alliance/src/rds/man3/viewrfmref.3 +@@ -14,7 +14,7 @@ viewrfmref + .SH NAME + viewrfmref \- displays reference caracteristics in MBK and RDS format. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrfmseg.3 b/alliance/src/rds/man3/viewrfmseg.3 +index fc77bce..f39e586 100644 +--- a/alliance/src/rds/man3/viewrfmseg.3 ++++ b/alliance/src/rds/man3/viewrfmseg.3 +@@ -14,7 +14,7 @@ viewrfmseg + .SH NAME + viewrfmseg \- displays segment caracteristics in MBK and RDS format. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/man3/viewrfmvia.3 b/alliance/src/rds/man3/viewrfmvia.3 +index 29bb49d..f8f390b 100644 +--- a/alliance/src/rds/man3/viewrfmvia.3 ++++ b/alliance/src/rds/man3/viewrfmvia.3 +@@ -14,7 +14,7 @@ viewrfmvia + .SH NAME + viewrfmvia \- displays contact caracteristics in MBK and RDS format. + .so man1/alc_origin.1 +-.SH SYNOPSYS ++.SH SYNOPSIS + .nf + .if n \{\ + .ft B \} +diff --git a/alliance/src/rds/src/cif_drive.c b/alliance/src/rds/src/cif_drive.c +index 49cac86..5990608 100644 +--- a/alliance/src/rds/src/cif_drive.c ++++ b/alliance/src/rds/src/cif_drive.c +@@ -518,7 +518,7 @@ + /* why CIF_DS_A, CIF_DS_B ? + the simple of driving CIF would be to take both as 1, and have on + each coordinate a (x * CIF_UNIT)/rds_unit). +- The interest here is to shorten the lenght of the numbers in the ++ The interest here is to shorten the length of the numbers in the + CIF output, and to be able to express a precision better that a + centh of a micron. + CIF_DS_A and CIF_DS_B are defined as follow : +diff --git a/alliance/src/rds/src/gds_drive.c b/alliance/src/rds/src/gds_drive.c +index b7106c1..db5a70b 100644 +--- a/alliance/src/rds/src/gds_drive.c ++++ b/alliance/src/rds/src/gds_drive.c +@@ -490,18 +490,22 @@ FILE *fp; + } + + entete(XY, sizeof(coord_t)); ++ coord_t xy; ++ xy.X = inst->X; ++ xy.Y = inst->Y; ++ + if (islittle()) { +- long X = swapl(inst->X); +- long Y = swapl(inst->Y); ++ xy.X = swapi(xy.X); ++ xy.Y = swapi(xy.Y); + +- numb = fwrite((char *)&X, sizeof(long), 1, fp); ++ numb = fwrite((char *)&xy.X, sizeof(int32_t), 1, fp); + controle(1); +- numb = fwrite((char *)&Y, sizeof(long), 1, fp); ++ numb = fwrite((char *)&xy.Y, sizeof(int32_t), 1, fp); + controle(1); + } else { +- numb = fwrite((char *)&inst->X, sizeof(long), 1, fp); ++ numb = fwrite((char *)&xy.X, sizeof(int32_t), 1, fp); + controle(1); +- numb = fwrite((char *)&inst->Y, sizeof(long), 1, fp); ++ numb = fwrite((char *)&xy.Y, sizeof(int32_t), 1, fp); + controle(1); + } + +@@ -582,7 +586,20 @@ date_type *date; + if (modele->LAYERTAB[i]) { + rect = modele->LAYERTAB[i]; + while (rect) { +- if (pv_sauve_rectangle(rect, fp, i) < 0) return -1; ++ if (rect->DX == 0) ++ fprintf( stderr ++ , "*** GDS driver warning ***\n" ++ "In %s, rectangle with null width @(%il,%il) %i\n" ++ , modele->NAME, rect->X/RDS_LAMBDA, rect->Y/RDS_LAMBDA, i ); ++ if (rect->DY == 0) ++ fprintf( stderr ++ , "** GDS driver warning ***\n" ++ "In %s, rectangle with null height @(%il,%il) %i\n" ++ , modele->NAME, rect->X/RDS_LAMBDA, rect->Y/RDS_LAMBDA, i ); ++ ++ if ((rect->DX != 0) && (rect->DY != 0)) { ++ if (pv_sauve_rectangle(rect, fp, i) < 0) return -1; ++ } + rect = rect->NEXT; + } + } +diff --git a/alliance/src/rds/src/gds_error.h b/alliance/src/rds/src/gds_error.h +index 1a4bfe5..1d9c40b 100644 +--- a/alliance/src/rds/src/gds_error.h ++++ b/alliance/src/rds/src/gds_error.h +@@ -51,7 +51,7 @@ + /* (GDS2, CIF...), dans la version avec laquelle on travaille, ce code etait envisage */ + /* mais pas encore implemente. */ + #define ELAYERUNDEF 103 /* There is no layer of this index in the technology. */ +-#define ENOTHER 255 /* Any other (wierd !) error. */ ++#define ENOTHER 255 /* Any other (weird !) error. */ + + /********* + * +diff --git a/alliance/src/rds/src/gds_parse.c b/alliance/src/rds/src/gds_parse.c +index dfa2239..7505c08 100644 +--- a/alliance/src/rds/src/gds_parse.c ++++ b/alliance/src/rds/src/gds_parse.c +@@ -832,7 +832,7 @@ char gds_real[sizeof(mag_type)]; + short ref_x_axis, abs_mag, abs_ang; + ushort strans; + double mag, angle; +-long x, y; ++int32_t x, y; + char sym; + char poubelle[TRASHSIZE]; + int FLAG = 0; +@@ -846,14 +846,14 @@ int FLAG = 0; + } + switch (infobuf.gdscode) { + case XY : +- lecture1(&x, sizeof(long)); ++ lecture1(&x, sizeof(int32_t)); + if (islittle()) + x = swapl(x); +- x = (long)(pv_scale * (double)x); +- lecture1(&y, sizeof(long)); ++ x = (int32_t)(pv_scale * (double)x); ++ lecture1(&y, sizeof(int32_t)); + if (islittle()) + y = swapl(y); +- y = (long)(pv_scale * (double)y); ++ y = (int32_t)(pv_scale * (double)y); + break; + case STRANS : + lecture1(&strans, sizeof(ushort)); +@@ -988,8 +988,8 @@ FILE *fp; + coord_tab[0].X = swapl(coord_tab[0].X); + coord_tab[0].Y = swapl(coord_tab[0].Y); + } +- coord_tab[0].X = (long)(pv_scale * (double)coord_tab[0].X); +- coord_tab[0].Y = (long)(pv_scale * (double)coord_tab[0].Y); ++ coord_tab[0].X = (int32_t)(pv_scale * (double)coord_tab[0].X); ++ coord_tab[0].Y = (int32_t)(pv_scale * (double)coord_tab[0].Y); + XYFLAG = 1; + break; + case TEXTTYPE : +@@ -1036,17 +1036,16 @@ rdsfig_list *Figure; + char *Name; + char Mode; + { +-register int retour; +-hinfo_type infobuf; +-FILE *fp; +-int flag = 0; +-int error = FALSE; +-char poubelle[TRASHSIZE]; +-char gds_real[sizeof(unit_type)]; +-char nom_modele[33]; +-node_list *ScanNode; +-rdsrec_list *Rec; +- ++ register int retour; ++ hinfo_type infobuf; ++ FILE *fp; ++ int flag = 0; ++ int error = FALSE; ++ char poubelle[TRASHSIZE]; ++ char gds_real[sizeof(unit_type)]; ++ char nom_modele[33]; ++ node_list *ScanNode; ++ rdsrec_list *Rec; + + Figure->MODE = 'L'; + diff --git a/alliance/src/rds/src/rfmacces.c b/alliance/src/rds/src/rfmacces.c index 1c87652..74879af 100644 --- a/alliance/src/rds/src/rfmacces.c @@ -32409,6 +47208,148 @@ index 03f35e3..dfb548e 100644 # define RPR_SEPARATORS_STRING " \t\n" # define RPR_COMMENT_CHAR '#' +diff --git a/alliance/src/rds/src/rutpoly.c b/alliance/src/rds/src/rutpoly.c +index c0f11f1..e376cc7 100644 +--- a/alliance/src/rds/src/rutpoly.c ++++ b/alliance/src/rds/src/rutpoly.c +@@ -44,10 +44,10 @@ + * + ***/ + static void quicksort(tab, deb, fin) +-long tab[]; ++int32_t tab[]; + unsigned deb, fin; + { +-register long m, aux; ++register int32_t m, aux; + register unsigned i, j; + + i = deb; +@@ -95,7 +95,7 @@ register unsigned i, j; + * + ***/ + static int simplification(tab, tab_lg) +-long tab[]; ++int32_t tab[]; + unsigned tab_lg; + { + register int i, j; /* i indice de lecture, j celui d'ecriture */ +@@ -312,7 +312,7 @@ unsigned coord_numb; + { + rdsrec_list *Rec; + register unsigned int i, j; +- register long x, y, dx, dy; ++ register int32_t x, y, dx, dy; + + for (i = 0; i < coord_numb; i += 2) { + j = i + 1; +@@ -366,7 +366,7 @@ unsigned coord_numb; + static coord_t *do_diagonale(rect_tab, nb_rect, xtab, ytab) + rect_t rect_tab[]; + type_l nb_rect; +-long xtab[], ytab[]; ++int32_t xtab[], ytab[]; + { + register int i, j; + register coord_t *tab; +@@ -483,10 +483,10 @@ unsigned *new_coord_numb; + { + register int i, h, v; /* compteurs a tout faire */ + +- long x1, y1, x2, y2; /* auxiliaires (de coordonnees) en tout genre */ ++ int32_t x1, y1, x2, y2; /* auxiliaires (de coordonnees) en tout genre */ + +- long *tab; /* pseudo-tableau auxiliaire */ +- long *xtab, *ytab; /* pseudo-tableaux des differentes coordonnees*/ ++ int32_t *tab; /* pseudo-tableau auxiliaire */ ++ int32_t *xtab, *ytab; /* pseudo-tableaux des differentes coordonnees*/ + type_i nb_x, nb_y; /* tailles des 2 tableaux et egalement nombres d'abcisses et d'ordonnees significatives. */ + type_c * col, *lig; /* pseudo-tableaux contenant respectivement les nombres d'aretes par ligne, par colonne. */ + type_l * index_h, *index_v; /* pseudo-tableaux permettant d'indexer les tableaux contenant les positions des aretes. */ +@@ -503,6 +503,7 @@ unsigned *new_coord_numb; + /* */ + /* On regarde d'abord si le polygone a decouper n'est pas deja un rectangle, auquel cas le probleme est vite resolu. */ + /* */ ++ + if (coord_numb == 5) { + nct = (coord_t * )malloc(2 * sizeof(coord_t)); + *new_coord_tab = nct; +@@ -518,10 +519,10 @@ unsigned *new_coord_numb; + nct[1].X = coord_tab[2].X; + nct[1].Y = coord_tab[2].Y; + } else { +- nct[0].X = (long)floor(((double)coord_tab[0].X * scale) + .5); +- nct[0].Y = (long)floor(((double)coord_tab[0].Y * scale) + .5); +- nct[1].X = (long)floor(((double)coord_tab[2].X * scale) + .5); +- nct[1].Y = (long)floor(((double)coord_tab[2].Y * scale) + .5); ++ nct[0].X = (int32_t)floor(((double)coord_tab[0].X * scale) + .5); ++ nct[0].Y = (int32_t)floor(((double)coord_tab[0].Y * scale) + .5); ++ nct[1].X = (int32_t)floor(((double)coord_tab[2].X * scale) + .5); ++ nct[1].Y = (int32_t)floor(((double)coord_tab[2].Y * scale) + .5); + } + } + +@@ -538,16 +539,16 @@ unsigned *new_coord_numb; + } + bool = 1; /* On vient d'allouer une nouvelle zone pour coordonnees*/ + for (i = 0; i < coord_numb; i++) { /* On recopie les valeurs du tableau passe en parametre */ +- coordonnees[i].X = (long)floor(((double)coord_tab[i].X * scale) + .5); /* en les mettant a l'echelle de la base RDS. */ +- coordonnees[i].Y = (long)floor(((double)coord_tab[i].Y * scale) + .5); ++ coordonnees[i].X = (int32_t)floor(((double)coord_tab[i].X * scale) + .5); /* en les mettant a l'echelle de la base RDS. */ ++ coordonnees[i].Y = (int32_t)floor(((double)coord_tab[i].Y * scale) + .5); + } + } + + /* */ + /* On extrait de la liste des coordonnees toutes les valeurs significatives */ + /* */ +- tab = (long *)malloc(coord_numb * sizeof(long)); /* on alloue un tableau auxiliaire pour y stocker */ +- if (tab == (long *)NULL) { /* temporairement les abcisses et les ordonnees. */ ++ tab = (int32_t *)malloc(coord_numb * sizeof(int32_t)); /* on alloue un tableau auxiliaire pour y stocker */ ++ if (tab == (int32_t *)NULL) { /* temporairement les abcisses et les ordonnees. */ + ruterror( RDS_NOT_ENOUGH_MEMORY, "p2d(tab)"); + if (bool) + free((char *)coordonnees); +@@ -559,8 +560,8 @@ unsigned *new_coord_numb; + + quicksort(tab, 0, coord_numb - 1); /* On les trie */ + nb_x = simplification(tab, coord_numb); /* On ne garde que les valeurs significatives */ +- xtab = (long *)malloc(nb_x * sizeof(long)); /* On alloue un pseudo-tableau pour y ranger les valeurs definitives */ +- if (xtab == (long *)NULL) { ++ xtab = (int32_t *)malloc(nb_x * sizeof(int32_t)); /* On alloue un pseudo-tableau pour y ranger les valeurs definitives */ ++ if (xtab == (int32_t *)NULL) { + ruterror( RDS_NOT_ENOUGH_MEMORY, "p2d(xtab)"); + if (bool) + free((char *)coordonnees); /* traine pas d'imprecision : si la techno employee n'est pas assez */ +@@ -568,7 +569,7 @@ unsigned *new_coord_numb; + EXIT(1); + } + /* On recopie ces valeurs definitives dans le nouveau tableau */ +- (void)memcpy((char *)xtab, (char *)tab, (size_t)nb_x * sizeof(long)); ++ (void)memcpy((char *)xtab, (char *)tab, (size_t)nb_x * sizeof(int32_t)); + + + for (i = 0; i < coord_numb; i++) /* Puis on s'occupe des ordonnees de la meme facon */ +@@ -576,8 +577,8 @@ unsigned *new_coord_numb; + + quicksort(tab, 0, coord_numb - 1); + nb_y = simplification(tab, coord_numb); +- ytab = (long *)malloc(nb_y * sizeof(long)); +- if (ytab == (long *)NULL) { ++ ytab = (int32_t *)malloc(nb_y * sizeof(int32_t)); ++ if (ytab == (int32_t *)NULL) { + ruterror( RDS_NOT_ENOUGH_MEMORY, "p2d(ytab)"); + if (bool) + free((char *)coordonnees); +@@ -586,7 +587,7 @@ unsigned *new_coord_numb; + EXIT(1); + } + /* On recopie ces valeurs definitives dans le nouveau tableau */ +- (void)memcpy((char *)ytab, (char *)tab, (int)nb_y * sizeof(long)); ++ (void)memcpy((char *)ytab, (char *)tab, (int)nb_y * sizeof(int32_t)); + + free((char * )tab); + diff --git a/alliance/src/ring/src/Makefile.am b/alliance/src/ring/src/Makefile.am index e630fc7..65e1653 100644 --- a/alliance/src/ring/src/Makefile.am @@ -32504,9 +47445,36 @@ index 8b46130..0d54a94 100644 /*#define PISTE_DEP_ALIMPLOT 10 Nombre de piste a considerer pour une deport alim plot */ /* code des ringerreurs traitees par ringerreur(code) */ diff --git a/alliance/src/s2r/doc/s2r.1 b/alliance/src/s2r/doc/s2r.1 -index 8cc9e3c..18fe38d 100644 +index 8cc9e3c..3287b7a 100644 --- a/alliance/src/s2r/doc/s2r.1 +++ b/alliance/src/s2r/doc/s2r.1 +@@ -28,7 +28,7 @@ the abutment box lower left corner at coordinate (0,0) + The name of cells to be replaced are written in the catalog file with the + G attribute, see \fBcatal\fP(5) for details on that file. + See also \fBring\fP(1) for more on pads. +-Ouput can be generated in either cif or gds formats, to fit the manufacturer ++Output can be generated in either cif or gds formats, to fit the manufacturer + requirements. + .br + .LP +@@ -60,7 +60,7 @@ See \fBMBK_IN_PH\fP(1) for details. + .TP + MBK_CATA_LIB + Sets the directories that are to be searched thru for reading files. +-The seaching mecanism first look in MBK_WORK_LIB(1) ++The searching mechanism first look in MBK_WORK_LIB(1) + MBK_WORK_LIB + defines the path where the generated file is saved. + Make sure the write permissions are set up correctly, otherwise no save +@@ -125,7 +125,7 @@ verbose mode on. + .RS + You should first have a correct execution environment : + .br +-It is recommanded to put it in the ``.cshrc'' file if in c shell, as in the ++It is recommended to put it in the ``.cshrc'' file if in c shell, as in the + example below. + .RE + .br @@ -141,7 +141,7 @@ example below. setenv RDS_TECHNO_NAME /labo/etc/prol15.rds setenv RDS_IN gds @@ -32516,3 +47484,410 @@ index 8cc9e3c..18fe38d 100644 .fi .ft R .RS +diff --git a/alliance/src/s2r/src/main.c b/alliance/src/s2r/src/main.c +index 8e2d8e0..5dd8c42 100644 +--- a/alliance/src/s2r/src/main.c ++++ b/alliance/src/s2r/src/main.c +@@ -64,7 +64,7 @@ void Usage (Name) + fprintf (stderr, "\t\t to translate to real layout\n"); + fprintf (stderr, "\tresult\t: result filename of real layout circuit\n"); + fprintf (stderr, "\t\t source name is used, if result is absent\n\n"); +- fprintf (stderr, "\toptionnal options (any order, any occurence) :\n"); ++ fprintf (stderr, "\toptionnal options (any order, any occurrence) :\n"); + fprintf (stderr, "\t-1\t: only (1) level is translated, all otherwise.\n"); + fprintf (stderr, "\t-c\t: deletes top-level (c)onnectors, keeps all others\n"); + fprintf (stderr, "\t-C\t: keeps top-level (c)onnectors, deletes all others\n"); +@@ -196,7 +196,7 @@ int main (argc, argv) + } + + /*\ +- * setting environement ++ * setting environment + * MBK_CATAL_NAME : file where file name to be replaced are put + * MBK_CATA_LIB : where cells, catal file and techno file are + * MBK_WORK_LIB : where result file is written or where techno file is +diff --git a/alliance/src/s2r/src/merge.c b/alliance/src/s2r/src/merge.c +index 1aa2a0c..ec50e17 100644 +--- a/alliance/src/s2r/src/merge.c ++++ b/alliance/src/s2r/src/merge.c +@@ -62,7 +62,7 @@ static char *name_transfert (desc1, desc2) + return desc2->NAME; + /*\ + * some segments in different chanels made by scr(1) bloc has +- * different name but are linked together throught cells, s2r ++ * different name but are linked together through cells, s2r + * merged then, but can't say it's a error! + * + * if (desc1->u_rec.name != desc2->u_rec.name) +diff --git a/alliance/src/s2r/src/rdsacces.h b/alliance/src/s2r/src/rdsacces.h +index 7f28c9c..d5a0d7c 100644 +--- a/alliance/src/s2r/src/rdsacces.h ++++ b/alliance/src/s2r/src/rdsacces.h +@@ -64,7 +64,7 @@ typedef rdsrec_list *rds_rectanglep_typ; + /***************************************************************************** + * Instances : + * The coordinates and symetry semantics are the gds & cif 's one, that's +- * completly different from mbk's ++ * completely different from mbk's + *****************************************************************************/ + + /* Models */ +diff --git a/alliance/src/s2r/src/rdsx2y.c b/alliance/src/s2r/src/rdsx2y.c +index 9b632e1..e8c0ff5 100644 +--- a/alliance/src/s2r/src/rdsx2y.c ++++ b/alliance/src/s2r/src/rdsx2y.c +@@ -76,7 +76,7 @@ main (argc, argv) + getarg (argc, argv, &model_name); + + /*\ +- * setting environement ++ * setting environment + * MBK_CATAL_NAME : file where file name to be replaced are put + * MBK_CATA_LIB : where cells, catal file and techno file are + * MBK_WORK_LIB : where result file is written or where techno file is +diff --git a/alliance/src/s2r/src/statistics.c b/alliance/src/s2r/src/statistics.c +index b23c288..be86274 100644 +--- a/alliance/src/s2r/src/statistics.c ++++ b/alliance/src/s2r/src/statistics.c +@@ -54,7 +54,7 @@ extern long mbkalloc_stat; /* memory allocated by mbk */ + void print_statistics (scotch_on_flag) + int scotch_on_flag; + { +- printf ("\to memory allocation informations\n"); ++ printf ("\to memory allocation information\n"); + printf ("\t--> required rectangles = %ld ", STAT_RECT_REQRD); + printf (" really allocated = %ld\n", STAT_RECT_ALLOC); + if (scotch_on_flag) +diff --git a/alliance/src/scapin/src/scan_insert.c b/alliance/src/scapin/src/scan_insert.c +index e812be4..b80e061 100644 +--- a/alliance/src/scapin/src/scan_insert.c ++++ b/alliance/src/scapin/src/scan_insert.c +@@ -341,7 +341,7 @@ void ScanInsertScanPath( LoFigure, ScanParam, PathParam, + } + + /* +-** Create all usefull hash tables (Instance/Reg/Reg Mux etc) ++** Create all useful hash tables (Instance/Reg/Reg Mux etc) + */ + RegHashTable = createauthtable( 100 ); + +diff --git a/alliance/src/sea/src/sea.sh b/alliance/src/sea/src/sea.sh +index 57c2f84..334c5e1 100644 +--- a/alliance/src/sea/src/sea.sh ++++ b/alliance/src/sea/src/sea.sh +@@ -387,7 +387,7 @@ + ALLIANCE_TOP="/users/cao/jpc/alliance/Solaris" + + echo "WARNING:" +- echo "WARNING: You are using the developement version." ++ echo "WARNING: You are using the development version." + echo "WARNING: Resetting \$ALLIANCE_TOP to \"$ALLIANCE_TOP\"." + echo "WARNING:" + echo "" +diff --git a/alliance/src/sea/src/util_MBK.c b/alliance/src/sea/src/util_MBK.c +index 7526d87..6402d16 100644 +--- a/alliance/src/sea/src/util_MBK.c ++++ b/alliance/src/sea/src/util_MBK.c +@@ -1151,7 +1151,7 @@ extern void splitPowerNet(apLoFig, asPower) + + if (powerType == C_POWER_UNKNOWN) { + eprinth((char*)NULL); +- eprintf("\n Only \"vdd\" and \"vss\" can be splitted (%s).\n", asPower); ++ eprintf("\n Only \"vdd\" and \"vss\" can be split (%s).\n", asPower); + EXIT (1); + } + +@@ -1160,7 +1160,7 @@ extern void splitPowerNet(apLoFig, asPower) + pSigPower = addlosig(apLoFig, NEWSIGINDEX, pChain, INTERNAL); + + +- /* Find the power net to be splitted. */ ++ /* Find the power net to be split. */ + for(pSig = apLoFig->LOSIG; pSig != (losig_list*)NULL; pSig = pSig->NEXT) + if (cmpSigName(pSig, sPOW)) break; + +@@ -1383,7 +1383,7 @@ extern loins_list *addloins_noSig(apFig, asIns, apModel) + pInsCon->NAME = pCon->NAME; + pInsCon->DIRECTION = pCon->DIRECTION; + pInsCon->TYPE = 'I'; +- /* We do not known the signals for the time beeing. */ ++ /* We do not known the signals for the time being. */ + pInsCon->SIG = NULL; + pInsCon->ROOT = (void *)pIns; + pInsCon->USER = NULL; +diff --git a/alliance/src/syf/src/syf_env.c b/alliance/src/syf/src/syf_env.c +index d7976d4..68c01a8 100644 +--- a/alliance/src/syf/src/syf_env.c ++++ b/alliance/src/syf/src/syf_env.c +@@ -155,7 +155,7 @@ void SyfEnv( Trace ) + + if ( Trace ) + { +- fprintf( stdout, "\t\t--> Bdd environement\n\n" ); ++ fprintf( stdout, "\t\t--> Bdd environment\n\n" ); + fprintf( stdout, "\t\t\tSYF_BDD_VAR_NODE : %ld\n", SYF_BDD_VAR_NODE ); + fprintf( stdout, "\t\t\tSYF_BDD_MAX_NODE : %ld\n", SYF_BDD_MAX_NODE ); + fprintf( stdout, "\t\t\tSYF_BDD_OPER_NODE : %ld\n", SYF_BDD_OPER_NODE ); +@@ -163,7 +163,7 @@ void SyfEnv( Trace ) + fprintf( stdout, "\t\t\tSYF_BDD_REORDER_RATIO : %ld\n", SYF_BDD_REORDER_RATIO ); + fprintf( stdout, "\t\t\tSYF_BDD_REORDER_FUNC : %c\n", ReorderFunc ); + +- fprintf( stdout, "\n\t\t--> Mustang and Jedi environement\n\n" ); ++ fprintf( stdout, "\n\t\t--> Mustang and Jedi environment\n\n" ); + fprintf( stdout, "\t\t\tSYF_MUSTANG_JEDI_ATOM : %d\n", SYF_MUSTANG_JEDI_ATOM ); + fprintf( stdout, "\n" ); + } +diff --git a/alliance/src/vasy/man1/vasy.1 b/alliance/src/vasy/man1/vasy.1 +index bfba804..8b644f3 100644 +--- a/alliance/src/vasy/man1/vasy.1 ++++ b/alliance/src/vasy/man1/vasy.1 +@@ -72,7 +72,7 @@ The leaves cells are defined by a file called CATAL (see catal(5) for details). + Authorizes to overwrite existing files. + .TP 10 + \f4\-p\fP +-Adds power supply connectors (vdd and vss). Usefull option to enter in Alliance. ++Adds power supply connectors (vdd and vss). Useful option to enter in Alliance. + .TP 10 + \f4\-C num\fP + When the size of the adder is greater or equal to \fBnum\fP a Carry Look Ahead +diff --git a/alliance/src/vasy/man5/vasy.5 b/alliance/src/vasy/man5/vasy.5 +index 4b1a380..a0a9998 100644 +--- a/alliance/src/vasy/man5/vasy.5 ++++ b/alliance/src/vasy/man5/vasy.5 +@@ -41,13 +41,13 @@ variable assignment are supported. + .PP + \fBTYPE\fP + .br +-All types usefull for synthesis are accepted (IEEE-1164 and IEEE-1076.3), and ++All types useful for synthesis are accepted (IEEE-1164 and IEEE-1076.3), and + all types defined in the VHDL Alliance subset (see vbe(5) for more details). + + .PP + \fBOPERATORS\fP + .br +-All operators usefull for synthesis are accepted, such as arithmetic, logical and relationnal operators (IEEE-1164 and IEEE-1076.3), and those defined in the VHDL Alliance subset ++All operators useful for synthesis are accepted, such as arithmetic, logical and relationnal operators (IEEE-1164 and IEEE-1076.3), and those defined in the VHDL Alliance subset + (see vbe(5) for more details). + + .PP +diff --git a/alliance/src/vasy/src/vasy_drvalc.c b/alliance/src/vasy/src/vasy_drvalc.c +index 8def963..eb2abb6 100644 +--- a/alliance/src/vasy/src/vasy_drvalc.c ++++ b/alliance/src/vasy/src/vasy_drvalc.c +@@ -1596,7 +1596,7 @@ static void VasyDriveAllianceTreatDeclar( RtlFigure ) + else + { + #if 1 /** Francois Donnet: 16/01/2003: do not initialize by default +- *** because someone else could do it in an upper hierachy. ++ *** because someone else could do it in an upper hierarchy. + *** It's better not to correct description and to let user + *** with it's own error than to build some... + **/ +@@ -2842,7 +2842,7 @@ void VasyDriveAllianceRtlFig( RtlFigure, FileName ) + } + else + { +- VasyPrintf( stdout, "ERROR unable to open file %s.vbe for writting\n", ++ VasyPrintf( stdout, "ERROR unable to open file %s.vbe for writing\n", + RtlFigureVbe->NAME ); + autexit( 1 ); + } +@@ -2873,7 +2873,7 @@ void VasyDriveAllianceRtlFig( RtlFigure, FileName ) + + if ( VasyLaxFile == (FILE *)0 ) + { +- VasyPrintf( stdout, "ERROR unable to open file %s.lax for writting\n", ++ VasyPrintf( stdout, "ERROR unable to open file %s.lax for writing\n", + RtlFigureVbe->NAME ); + autexit( 1 ); + } +@@ -2912,7 +2912,7 @@ void VasyDriveAllianceRtlFig( RtlFigure, FileName ) + + if ( VasyBoomFile == (FILE *)0 ) + { +- VasyPrintf( stdout, "ERROR unable to open file %s.boom for writting\n", ++ VasyPrintf( stdout, "ERROR unable to open file %s.boom for writing\n", + RtlFigureVbe->NAME ); + autexit( 1 ); + } +@@ -2965,7 +2965,7 @@ void VasyDriveAllianceRtlFig( RtlFigure, FileName ) + } + else + { +- VasyPrintf( stdout, "ERROR unable to open file %s.vst for writting\n", ++ VasyPrintf( stdout, "ERROR unable to open file %s.vst for writing\n", + RtlFigureVst->NAME ); + autexit( 1 ); + } +diff --git a/alliance/src/vasy/src/vasy_onewait.c b/alliance/src/vasy/src/vasy_onewait.c +index 387f1bf..dfd5b92 100644 +--- a/alliance/src/vasy/src/vasy_onewait.c ++++ b/alliance/src/vasy/src/vasy_onewait.c +@@ -1000,7 +1000,7 @@ static void VasyOneWaitAssignVpnSymbol( VpnFigure, VpnProc , VpnTrans, + + freechain( SupportBdd ); + /* +-** Search all asynchronous informations ++** Search all asynchronous information + */ + BddNode = applybddnode( (bddsystem *)0, ABL_AND, BddCAsync, BddFAsync ); + decbddrefext( BddNode ); +@@ -1028,7 +1028,7 @@ static void VasyOneWaitAssignVpnSymbol( VpnFigure, VpnProc , VpnTrans, + + BddDataAsync = BddNode; + /* +-** Verify the correctness of asynchronous informations ++** Verify the correctness of asynchronous information + */ + BddNode = applybddnode( (bddsystem *)0, ABL_AND, BddCWriteAsync, BddDataAsync ); + decbddrefext( BddNode ); +@@ -1069,7 +1069,7 @@ static void VasyOneWaitAssignVpnSymbol( VpnFigure, VpnProc , VpnTrans, + BddDataAsync = incbddrefext( BddData ); + } + /* +-** Add asynchronous informations to symbol ++** Add asynchronous information to symbol + */ + { + if ( BddCSetAsync != BddSystem->ZERO ) +@@ -1149,7 +1149,7 @@ static void VasyOneWaitAssignVpnSymbol( VpnFigure, VpnProc , VpnTrans, + decbddrefext( BddCWriteAsync ); + decbddrefext( BddDataAsync ); + /* +-** Search all synchronous informations ++** Search all synchronous information + */ + if ( EventSymbol != (vpnsym *)0 ) + { +@@ -1246,7 +1246,7 @@ static void VasyOneWaitAssignVpnSymbol( VpnFigure, VpnProc , VpnTrans, + + freechain( SupportBdd ); + /* +-** Search all synchronous informations ++** Search all synchronous information + */ + BddNode = applybddnode( (bddsystem *)0, ABL_AND, BddCSync, BddFSync ); + decbddrefext( BddNode ); +@@ -1305,7 +1305,7 @@ static void VasyOneWaitAssignVpnSymbol( VpnFigure, VpnProc , VpnTrans, + BddDataSync = incbddrefext( BddFSync ); + } + /* +-** Verify the correctness of synchronous informations ++** Verify the correctness of synchronous information + */ + BddNode = applybddnode( (bddsystem *)0, ABL_AND, BddCWriteSync, BddDataSync ); + decbddrefext( BddNode ); +@@ -1319,7 +1319,7 @@ static void VasyOneWaitAssignVpnSymbol( VpnFigure, VpnProc , VpnTrans, + VasyPrintf( stdout, "Illegal synchronous conditions %s\n", AsgSymbol->NAME ); + } + /* +-** Add synchronous informations to symbol ++** Add synchronous information to symbol + */ + if ( BddCEdge != BddSystem->ZERO ) + { +diff --git a/alliance/src/vasy/src/vasy_redinst.c b/alliance/src/vasy/src/vasy_redinst.c +index 8e7619b..3d5a283 100644 +--- a/alliance/src/vasy/src/vasy_redinst.c ++++ b/alliance/src/vasy/src/vasy_redinst.c +@@ -538,7 +538,7 @@ static void VasyRedInstLateralVpnAct( BeginPlace ) + AsgSymbol = getvpnsymdecl( AsgDeclar, AsgIndex ); + Element = searchauth2elem( VasyHash2BitVecAsg, (char*)VpnTrans2, (char*)AsgSymbol ); + /* +-** Assign to symbol V appears in transistion VpnTrans2 ! ++** Assign to symbol V appears in transition VpnTrans2 ! + */ + if ( Element != (auth2elem *)0 ) + { +@@ -844,7 +844,7 @@ static int VasyRedInstLateral( BeginPlace, EndPlace, KeepGuard ) + VasyHash2BitVecAsg = createauth2table( 100 ); + } + /* +-** Make only disjunct assigment for all ASGi in Ti ++** Make only disjunct assignment for all ASGi in Ti + */ + VasyRedInstLateralVpnAct( BeginPlace ); + /* +@@ -1905,7 +1905,7 @@ void VasyRedInstVpnProc( VpnFigure, VpnProc ) + } + + /* +-** Only one assigment to each symbols for all actions ++** Only one assignment to each symbols for all actions + */ + for ( ScanTrans = VpnProc->TRANS; + ScanTrans != (vpntrans_list *)0; +diff --git a/alliance/src/vasy/src/vasy_simul.c b/alliance/src/vasy/src/vasy_simul.c +index 5fe47b5..9dc1b37 100644 +--- a/alliance/src/vasy/src/vasy_simul.c ++++ b/alliance/src/vasy/src/vasy_simul.c +@@ -1472,7 +1472,7 @@ static vexexpr *VasySimulateGetVpnActAtom( VpnFigure, VpnAction ) + + if ( ! IsVexNodeOper( VexExpr ) ) + { +- VasyErrorLine( VASY_ERROR_IN_SIMULATION, VpnAction->LINE, "bad assigment" ); ++ VasyErrorLine( VASY_ERROR_IN_SIMULATION, VpnAction->LINE, "bad assignment" ); + } + + Oper = GetVexOperValue( VexExpr ); +@@ -1481,7 +1481,7 @@ static vexexpr *VasySimulateGetVpnActAtom( VpnFigure, VpnAction ) + ( Oper != VEX_DOWNTO ) && + ( Oper != VEX_TO ) ) + { +- VasyErrorLine( VASY_ERROR_IN_SIMULATION, VpnAction->LINE, "bad assigment" ); ++ VasyErrorLine( VASY_ERROR_IN_SIMULATION, VpnAction->LINE, "bad assignment" ); + } + + VasyFigure = VpnFigure; +diff --git a/alliance/src/vasy/src/vasy_support.c b/alliance/src/vasy/src/vasy_support.c +index d80ea4c..b3002b4 100644 +--- a/alliance/src/vasy/src/vasy_support.c ++++ b/alliance/src/vasy/src/vasy_support.c +@@ -1773,7 +1773,7 @@ void VasySupportVpnTrans( VpnFigure, VpnProc, VpnTrans, CheckVar ) + } + } + /* +-** Verify that no previous signal or variable assigment use this variable ! ++** Verify that no previous signal or variable assignment use this variable ! + */ + for ( VpnAction2 = VpnTrans->ACT; + VpnAction2 != (vpnact_list *)0; +diff --git a/alliance/src/vbh/src/vhdl.yac b/alliance/src/vbh/src/vhdl.yac +index e76aa73..7c70c2d 100644 +--- a/alliance/src/vbh/src/vhdl.yac ++++ b/alliance/src/vbh/src/vhdl.yac +@@ -1294,7 +1294,7 @@ element_declaration + ; + + /* +-** identifier_list is used consistantly in definitions of new Identifiers, ++** identifier_list is used consistently in definitions of new Identifiers, + ** with one exception--IMPORT_DIRECTIVE. The IMPORT_DIRECTIVE expects to + ** find all Identifiers declared at the local scope and it is an error if + ** they are not. In all other cases, it is an error to have two Identifiers +diff --git a/alliance/src/xpat/man1/xpat.1 b/alliance/src/xpat/man1/xpat.1 +index da44a8b..d8f8e8f 100644 +--- a/alliance/src/xpat/man1/xpat.1 ++++ b/alliance/src/xpat/man1/xpat.1 +@@ -79,7 +79,7 @@ Switch to a private color map. + .B MBK_WORK_LIB + indicates the path to the read directory for the session. + .TP +-.B XPAT_PARAM_NAME (optionnal) ++.B XPAT_PARAM_NAME (optional) + indicates the path to the parameter file used by Xpat. + .TP + +diff --git a/alliance/src/xsch/man1/xsch.1 b/alliance/src/xsch/man1/xsch.1 +index d355519..0724036 100644 +--- a/alliance/src/xsch/man1/xsch.1 ++++ b/alliance/src/xsch/man1/xsch.1 +@@ -123,7 +123,7 @@ indicates the path to the read directory for the session. + .B MBK_IN_LO + indicates the file format to be used. + .TP +-.B XSCH_PARAM_NAME (optionnal) ++.B XSCH_PARAM_NAME (optional) + indicates the path to the parameter file used by Xsch. + .TP + diff --git a/0009-Misc.-doc-fixes.patch b/0009-Misc.-doc-fixes.patch index 02b75ff..1234541 100644 --- a/0009-Misc.-doc-fixes.patch +++ b/0009-Misc.-doc-fixes.patch @@ -1,7 +1,7 @@ -From 57060f1447e54d636271433309a6813752ec26dc Mon Sep 17 00:00:00 2001 +From d8bd23ccfd34a60eb8d58593ceb190e4f68b1e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Sun, 28 Feb 2016 15:03:03 +0100 -Subject: [PATCH 09/10] Misc. doc fixes. +Subject: [PATCH 09/12] Misc. doc fixes. --- alliance/src/boog/doc/boog.1 | 2 +- @@ -102,11 +102,11 @@ Subject: [PATCH 09/10] Misc. doc fixes. mode change 100755 => 100644 alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex diff --git a/alliance/src/boog/doc/boog.1 b/alliance/src/boog/doc/boog.1 -index 052524c..44f6014 100644 +index c9dcb73..6e87374 100644 --- a/alliance/src/boog/doc/boog.1 +++ b/alliance/src/boog/doc/boog.1 -@@ -136,7 +136,7 @@ Just another way to show explicitely the \f4VST\fP output file name. - Just another way to show explicitely the \f4LAX\fP parameter file name. +@@ -136,7 +136,7 @@ Just another way to show explicitly the \f4VST\fP output file name. + Just another way to show explicitly the \f4LAX\fP parameter file name. .TP 10 \f4\-d debug_file\fP -Generates a \f4VBE\f debug file. It comes from internal result algorithm. Users aren't concerned. @@ -169,7 +169,7 @@ diff --git a/alliance/src/documentation/tutorials/simulation/src/addaccu_struct/ old mode 100755 new mode 100644 diff --git a/alliance/src/documentation/tutorials/simulation/tex/simulation.tex b/alliance/src/documentation/tutorials/simulation/tex/simulation.tex -index 7a7bc19..b7c6299 100644 +index 2b99a40..0b0d105 100644 --- a/alliance/src/documentation/tutorials/simulation/tex/simulation.tex +++ b/alliance/src/documentation/tutorials/simulation/tex/simulation.tex @@ -91,7 +91,6 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx @@ -288,7 +288,7 @@ new mode 100644 diff --git a/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex b/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex old mode 100755 new mode 100644 -index bf2fdde..11cd8e9 +index 099caee..d8bd15c --- a/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex +++ b/alliance/src/documentation/tutorials/synthesis/tex/synthesis.tex @@ -85,7 +85,6 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx @@ -313,7 +313,7 @@ index a0f6142..ca58505 100644 .TP 0 libFsm101.a : diff --git a/alliance/src/mbk/man3/viewlofigcon.3 b/alliance/src/mbk/man3/viewlofigcon.3 -index 413f80f..805ce0d 100644 +index cabb1c0..8bc798b 100644 --- a/alliance/src/mbk/man3/viewlofigcon.3 +++ b/alliance/src/mbk/man3/viewlofigcon.3 @@ -10,10 +10,11 @@ viewlofigcon @@ -326,11 +326,11 @@ index 413f80f..805ce0d 100644 viewlofigcon \- display elements of a \fBlocon_list\fP attached to a figure +.so man1/alc_origin.1 - .SH SYNOPSYS + .SH SYNOPSIS .nf .if n \{\ diff --git a/alliance/src/mbk/man3/viewphfig.3 b/alliance/src/mbk/man3/viewphfig.3 -index 1aa0842..374bb20 100644 +index cade2bf..1aaec24 100644 --- a/alliance/src/mbk/man3/viewphfig.3 +++ b/alliance/src/mbk/man3/viewphfig.3 @@ -10,9 +10,10 @@ viewphfig @@ -342,11 +342,11 @@ index 1aa0842..374bb20 100644 .SH NAME viewphfig \- display elements of a \fBphfig_list\fP +.so man1/alc_origin.1 - .SH SYNOPSYS + .SH SYNOPSIS .nf .if n \{\ diff --git a/alliance/src/mbk/man3/viewphvia.3 b/alliance/src/mbk/man3/viewphvia.3 -index 1d58e48..209602a 100644 +index fb7050c..b82f05c 100644 --- a/alliance/src/mbk/man3/viewphvia.3 +++ b/alliance/src/mbk/man3/viewphvia.3 @@ -10,9 +10,10 @@ viewphvia @@ -358,11 +358,11 @@ index 1d58e48..209602a 100644 .SH NAME viewphvia \- display elements of a \fBphvia_list\fP +.so man1/alc_origin.1 - .SH SYNOPSYS + .SH SYNOPSIS .nf .if n \{\ diff --git a/alliance/src/nero/doc/man1/nero.1 b/alliance/src/nero/doc/man1/nero.1 -index e13b1ea..ed6f488 100644 +index e3c76c9..46e396d 100644 --- a/alliance/src/nero/doc/man1/nero.1 +++ b/alliance/src/nero/doc/man1/nero.1 @@ -1,4 +1,3 @@ @@ -384,5 +384,5 @@ index 054aa47..43a6be3 100644 pvdde_sp C .br -- -2.5.0 +2.5.5 diff --git a/0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch b/0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch deleted file mode 100644 index d1660a8..0000000 --- a/0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 685ad52e23f4a88e264cc47fdcb5b0c7d0596800 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= -Date: Fri, 20 May 2016 06:11:20 +0200 -Subject: [PATCH 12/12] Don't initialize yylineno with flex >= 2.6.0 - ---- - alliance/src/sea/src/DEF_grammar_lex.l | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/alliance/src/sea/src/DEF_grammar_lex.l b/alliance/src/sea/src/DEF_grammar_lex.l -index 752e2f8..be369d7 100644 ---- a/alliance/src/sea/src/DEF_grammar_lex.l -+++ b/alliance/src/sea/src/DEF_grammar_lex.l -@@ -21,7 +21,8 @@ - #define yylineno DEF_grammarlineno - - --#ifndef FLEX_BETA -+#if !(defined(YY_FLEX_MAJOR_VERSION) && (YY_FLEX_MAJOR_VERSION >= 2) \ -+ && defined(YY_FLEX_MINOR_VERSION) && (YY_FLEX_MINOR_VERSION >= 6)) - int yylineno = 1; - #endif - --- -2.5.5 - diff --git a/0012-Remove-yylineno.patch b/0012-Remove-yylineno.patch new file mode 100644 index 0000000..cf32bdf --- /dev/null +++ b/0012-Remove-yylineno.patch @@ -0,0 +1,28 @@ +From ac0697c6f79155677668a3f096da3403f72b9ded Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Fri, 20 May 2016 06:11:20 +0200 +Subject: [PATCH 12/12] Remove yylineno. + +--- + alliance/src/sea/src/DEF_grammar_lex.l | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/alliance/src/sea/src/DEF_grammar_lex.l b/alliance/src/sea/src/DEF_grammar_lex.l +index 752e2f8..ca527ab 100644 +--- a/alliance/src/sea/src/DEF_grammar_lex.l ++++ b/alliance/src/sea/src/DEF_grammar_lex.l +@@ -21,11 +21,6 @@ + #define yylineno DEF_grammarlineno + + +-#ifndef FLEX_BETA +- int yylineno = 1; +-#endif +- +- + static int yywrap(void); + static int string(void); + static int history(void); +-- +2.5.5 + diff --git a/alliance.spec b/alliance.spec index 795bd02..a4e547e 100644 --- a/alliance.spec +++ b/alliance.spec @@ -1,10 +1,10 @@ -%global snapdate 20160220 -%global commit 10a7b7e755d633a83e3f213198b59a69751259f1 +%global snapdate 20160506 +%global commit d8c05cd022a15586e946da6e5d19d861a489ff5e %global shortcommit %(c=%{commit}; echo ${c:0:7}) Name: alliance Version: 5.1.1 -Release: 5.%{snapdate}git%{shortcommit}%{?dist} +Release: 6.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -33,7 +33,7 @@ Patch20: 0010-Fedora-profiles.patch # Bashisms in /etc/profile.d/alc_env.csh Patch21: 0011-Use-setenv-instead-of-set-RHBZ-1337691.patch # Flex compatibility issues -Patch22: 0012-Don-t-initialize-yylineno-with-flex-2.6.0.patch +Patch22: 0012-Remove-yylineno.patch BuildRequires: bison @@ -313,6 +313,10 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Fri May 20 2016 Ralf Corsépius - 5.1.1-6.20160506gitd8c05cd +- Upstream update. +- Remove reference to FLEX_BETA. + * Fri May 20 2016 Ralf Corsépius - 5.1.1-5.20160220git10a7b7e - Remove bashisms in /etc/profile/alc_env.csh (RHBZ#1337691). - Work around flex-2.6.0 compatibility issues triggering a FTBFS. From ac3f8c1fe92e1ef05de72b4c5ca62afd79d630e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Fri, 20 May 2016 12:03:17 +0200 Subject: [PATCH 50/85] Upstream update. - Rebase patches. - Remove reference to FLEX_BETA. --- alliance.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/alliance.spec b/alliance.spec index a4e547e..b4cbb29 100644 --- a/alliance.spec +++ b/alliance.spec @@ -315,6 +315,7 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog * Fri May 20 2016 Ralf Corsépius - 5.1.1-6.20160506gitd8c05cd - Upstream update. +- Rebase patches. - Remove reference to FLEX_BETA. * Fri May 20 2016 Ralf Corsépius - 5.1.1-5.20160220git10a7b7e From 7c1c0b917c897f04acdbdeb2a97f703167080237 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 10 Feb 2017 05:52:58 +0000 Subject: [PATCH 51/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index b4cbb29..510b628 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 6.%{snapdate}git%{shortcommit}%{?dist} +Release: 7.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -313,6 +313,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Fri Feb 10 2017 Fedora Release Engineering - 5.1.1-7.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + * Fri May 20 2016 Ralf Corsépius - 5.1.1-6.20160506gitd8c05cd - Upstream update. - Rebase patches. From 294b902fba2a2f154e2b700733b8ee8abfd6a0a3 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Mon, 15 May 2017 20:05:18 +0000 Subject: [PATCH 52/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_27_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 510b628..34ca424 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 7.%{snapdate}git%{shortcommit}%{?dist} +Release: 8.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -313,6 +313,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Mon May 15 2017 Fedora Release Engineering - 5.1.1-8.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_27_Mass_Rebuild + * Fri Feb 10 2017 Fedora Release Engineering - 5.1.1-7.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild From 7076e584f05d6e0065db8b35489779c5c4ce1b39 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 26 Jul 2017 02:45:58 +0000 Subject: [PATCH 53/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 34ca424..4940729 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 8.%{snapdate}git%{shortcommit}%{?dist} +Release: 9.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -313,6 +313,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Wed Jul 26 2017 Fedora Release Engineering - 5.1.1-9.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + * Mon May 15 2017 Fedora Release Engineering - 5.1.1-8.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_27_Mass_Rebuild From 72eba89e03b65e6aa715ec400148c4af661ddd8b Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 2 Aug 2017 17:30:34 +0000 Subject: [PATCH 54/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 4940729..ad7c885 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 9.%{snapdate}git%{shortcommit}%{?dist} +Release: 10.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -313,6 +313,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Wed Aug 02 2017 Fedora Release Engineering - 5.1.1-10.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + * Wed Jul 26 2017 Fedora Release Engineering - 5.1.1-9.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild From b392d0bf0f2f773f0b7d2e1672fd0ad0d8502e52 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sun, 7 Jan 2018 19:06:29 +0100 Subject: [PATCH 55/85] Remove obsolete scriptlets Signed-off-by: Igor Gnatenko --- alliance.spec | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/alliance.spec b/alliance.spec index ad7c885..c16f86c 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 10.%{snapdate}git%{shortcommit}%{?dist} +Release: 11.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -261,22 +261,12 @@ EOF %{_fixperms} %{buildroot}/* popd > /dev/null -%post libs -/sbin/ldconfig - %post source %{_sysconfdir}/profile.d/alc_env.sh -touch --no-create %{_datadir}/icons/hicolor || : -%{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : -%postun libs -/sbin/ldconfig - -%postun -/sbin/ldconfig -touch --no-create %{_datadir}/icons/hicolor || : -%{_bindir}/gtk-update-icon-cache --quiet %{_datadir}/icons/hicolor || : +%post libs -p /sbin/ldconfig +%postun libs -p /sbin/ldconfig %files %{_pkgdocdir}/README @@ -313,6 +303,9 @@ touch --no-create %{_datadir}/icons/hicolor || : %changelog +* Sun Jan 07 2018 Igor Gnatenko - 5.1.1-11.20160506gitd8c05cd +- Remove obsolete scriptlets + * Wed Aug 02 2017 Fedora Release Engineering - 5.1.1-10.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild From 6887cb09ab2000f0e768728d0735750ed4ba376a Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 7 Feb 2018 02:07:38 +0000 Subject: [PATCH 56/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index c16f86c..857846a 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 11.%{snapdate}git%{shortcommit}%{?dist} +Release: 12.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -303,6 +303,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Feb 07 2018 Fedora Release Engineering - 5.1.1-12.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + * Sun Jan 07 2018 Igor Gnatenko - 5.1.1-11.20160506gitd8c05cd - Remove obsolete scriptlets From 02eae5fa7752cb83550bdffba2eb959426d3cdc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Thu, 15 Mar 2018 18:02:30 +0100 Subject: [PATCH 57/85] BR: /usr/bin/dvipdf instead of ghostscript (F28FTBFS). --- alliance.spec | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/alliance.spec b/alliance.spec index 857846a..d4b451d 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 12.%{snapdate}git%{shortcommit}%{?dist} +Release: 13.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -40,7 +40,6 @@ BuildRequires: bison BuildRequires: byacc BuildRequires: desktop-file-utils BuildRequires: flex -BuildRequires: ghostscript BuildRequires: libstdc++-devel BuildRequires: libXp-devel BuildRequires: libXpm-devel @@ -53,6 +52,7 @@ BuildRequires: tex(subfigure.sty) BuildRequires: tex(wrapfig.sty) BuildRequires: transfig BuildRequires: /usr/bin/convert +BuildRequires: /usr/bin/dvipdf BuildRequires: autoconf automake libtool %if 0%{?rhel} @@ -303,6 +303,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Thu Mar 15 2018 Ralf Corsépius - 5.1.1-13.20160506gitd8c05cd +- BR: /usr/bin/dvipdf instead of ghostscript (F28FTBFS). + * Wed Feb 07 2018 Fedora Release Engineering - 5.1.1-12.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild From df3271f32c0360b4156e57fa92aae9c26da24d46 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 12 Jul 2018 20:08:39 +0000 Subject: [PATCH 58/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index d4b451d..b3c2abe 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 13.%{snapdate}git%{shortcommit}%{?dist} +Release: 14.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -303,6 +303,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Thu Jul 12 2018 Fedora Release Engineering - 5.1.1-14.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + * Thu Mar 15 2018 Ralf Corsépius - 5.1.1-13.20160506gitd8c05cd - BR: /usr/bin/dvipdf instead of ghostscript (F28FTBFS). From 4a5e180ee18dfbbe3f6f04757daf6fd3169bed5c Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Thu, 19 Jul 2018 20:56:43 +0200 Subject: [PATCH 59/85] add BuildRequires: gcc-c++ Reference: https://fedoraproject.org/wiki/Changes/Remove_GCC_from_BuildRoot --- alliance.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/alliance.spec b/alliance.spec index b3c2abe..aa556d4 100644 --- a/alliance.spec +++ b/alliance.spec @@ -36,6 +36,7 @@ Patch21: 0011-Use-setenv-instead-of-set-RHBZ-1337691.patch Patch22: 0012-Remove-yylineno.patch +BuildRequires: gcc-c++ BuildRequires: bison BuildRequires: byacc BuildRequires: desktop-file-utils From 716cf49d1f0807fa1a6dc413c1af7a06b3c0b988 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 31 Jan 2019 13:11:51 +0000 Subject: [PATCH 60/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index aa556d4..3cb80a9 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 14.%{snapdate}git%{shortcommit}%{?dist} +Release: 15.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -304,6 +304,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Thu Jan 31 2019 Fedora Release Engineering - 5.1.1-15.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + * Thu Jul 12 2018 Fedora Release Engineering - 5.1.1-14.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild From a38d90c794150cec10bb0e2b81d21d71daf1fa09 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 24 Jul 2019 17:46:33 +0000 Subject: [PATCH 61/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 3cb80a9..701d837 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 15.%{snapdate}git%{shortcommit}%{?dist} +Release: 16.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -304,6 +304,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Jul 24 2019 Fedora Release Engineering - 5.1.1-16.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + * Thu Jan 31 2019 Fedora Release Engineering - 5.1.1-15.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild From c321e71f7fc096aaad28b703a92a1de669833540 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Tue, 28 Jan 2020 11:26:09 +0000 Subject: [PATCH 62/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 701d837..d456a64 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 16.%{snapdate}git%{shortcommit}%{?dist} +Release: 17.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -304,6 +304,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Tue Jan 28 2020 Fedora Release Engineering - 5.1.1-17.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + * Wed Jul 24 2019 Fedora Release Engineering - 5.1.1-16.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild From 895e53cc02b2ff219d5514c034d2c5255b97b565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Sat, 22 Feb 2020 12:24:11 +0100 Subject: [PATCH 63/85] Drop lesstif. Spec file cleanup. Add 0013-GCC-10-fixes.patch (F32FTBFS, RHBZ#1799147). --- 0013-GCC-10-fixes.patch | 78 +++++++++++++++++++++++++++++++++++++++++ alliance.spec | 57 ++++++++++++++++-------------- 2 files changed, 109 insertions(+), 26 deletions(-) create mode 100644 0013-GCC-10-fixes.patch diff --git a/0013-GCC-10-fixes.patch b/0013-GCC-10-fixes.patch new file mode 100644 index 0000000..0a33546 --- /dev/null +++ b/0013-GCC-10-fixes.patch @@ -0,0 +1,78 @@ +From 87faa08f9a1d3f55e3430a68acb0f898adc75a2d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= +Date: Fri, 7 Feb 2020 08:51:41 +0100 +Subject: [PATCH 13/13] GCC-10 fixes + +--- + alliance/src/elp/src/elp.c | 1 - + alliance/src/elp/src/elp.h | 3 ++- + alliance/src/elp/src/elp_y.y | 1 - + alliance/src/nero/src/MDRGrid.cpp | 1 + + alliance/src/pat/src/Makefile.am | 1 + + 5 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/alliance/src/elp/src/elp.c b/alliance/src/elp/src/elp.c +index d279e6cfc..e516f1ee6 100644 +--- a/alliance/src/elp/src/elp.c ++++ b/alliance/src/elp/src/elp.c +@@ -33,7 +33,6 @@ double elpVoltage[elpVOLTNUM] ; + double elpCapa[elpTRANSNUM][elpCAPANUM] ; + double elpGeneral[elpGENERALNUM] = {0.0,0.0,1000.0} ; + char elpLang = elpDEFLANG ; +-int elpyylineno ; + + /*****************************************************************************/ + /* function elpenv() */ +diff --git a/alliance/src/elp/src/elp.h b/alliance/src/elp/src/elp.h +index b1d4930f1..b1f284aed 100644 +--- a/alliance/src/elp/src/elp.h ++++ b/alliance/src/elp/src/elp.h +@@ -106,7 +106,8 @@ extern double elpGeneral[elpGENERALNUM] ; + #define elpACM 0 /* methode de calcul des capacites dynamiques */ + #define elpTEMP 1 /* temperature de simulation et d'analyse */ + #define elpSLOPE 2 /* front sur les connecteurs d'entree */ +- ++extern int yylineno ; ++extern int elpyylineno ; + + /* les fonctions externes */ + extern int elpenv() ; +diff --git a/alliance/src/elp/src/elp_y.y b/alliance/src/elp/src/elp_y.y +index 904ce7f02..fb5db214a 100644 +--- a/alliance/src/elp/src/elp_y.y ++++ b/alliance/src/elp/src/elp_y.y +@@ -100,7 +100,6 @@ elpvar : + ; + %% + +-extern int yylineno ; + extern char yytext[] ; + + void yyerror() +diff --git a/alliance/src/nero/src/MDRGrid.cpp b/alliance/src/nero/src/MDRGrid.cpp +index b7e9fb9f3..f8095ab3b 100644 +--- a/alliance/src/nero/src/MDRGrid.cpp ++++ b/alliance/src/nero/src/MDRGrid.cpp +@@ -17,6 +17,7 @@ + + + # include "MDefs.h" ++template class TMatrix; + + + +diff --git a/alliance/src/pat/src/Makefile.am b/alliance/src/pat/src/Makefile.am +index d8875fb83..f93af2822 100644 +--- a/alliance/src/pat/src/Makefile.am ++++ b/alliance/src/pat/src/Makefile.am +@@ -28,6 +28,7 @@ pat_decl_y.c pat_decl_y.h : $(srcdir)/pat_decl_y.y + && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.c \ + | sed -e "s/int[ ]*pat_decl_y_char;/extern int pat_decl_y_char;/" \ + | sed -e "s/int[ ]*pat_decl_y_nerrs;/extern int pat_decl_y_nerrs;/" \ ++ | sed -e "s/^PAT_DECL_Y_STYPE pat_decl_y_lval;//" \ + > pat_decl_y.c \ + && sed -e "s/yy/pat_decl_y_/g" -e "s/YY/PAT_DECL_Y_/g" y.tab.h > pat_decl_y.h + +-- +2.24.1 + diff --git a/alliance.spec b/alliance.spec index d456a64..b7f18b0 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 17.%{snapdate}git%{shortcommit}%{?dist} +Release: 18.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -20,20 +20,22 @@ Source5: alliance-examples-go-all-clean.sh # https://www-soc.lip6.fr/git/alliance.git Patch00: 0000-alliance-5.1.1-git%{shortcommit}.patch -Patch11: 0001-Remove-stray-files.patch -Patch12: 0002-Update-autostuff.patch -Patch13: 0003-Consolidate-installation-dirs.patch -Patch14: 0004-Misc-installation-dirs-fixes.patch -Patch15: 0005-Use-inttypes-macros-to-print-int32_t.patch -Patch16: 0006-Use-ring_yy-instead-of-yy.patch -Patch17: 0007-Eliminate-CFLAGS.patch -Patch18: 0008-Rework-Makefile.ams.patch -Patch19: 0009-Misc.-doc-fixes.patch -Patch20: 0010-Fedora-profiles.patch +Patch01: 0001-Remove-stray-files.patch +Patch02: 0002-Update-autostuff.patch +Patch03: 0003-Consolidate-installation-dirs.patch +Patch04: 0004-Misc-installation-dirs-fixes.patch +Patch05: 0005-Use-inttypes-macros-to-print-int32_t.patch +Patch06: 0006-Use-ring_yy-instead-of-yy.patch +Patch07: 0007-Eliminate-CFLAGS.patch +Patch08: 0008-Rework-Makefile.ams.patch +Patch09: 0009-Misc.-doc-fixes.patch +Patch10: 0010-Fedora-profiles.patch # Bashisms in /etc/profile.d/alc_env.csh -Patch21: 0011-Use-setenv-instead-of-set-RHBZ-1337691.patch +Patch11: 0011-Use-setenv-instead-of-set-RHBZ-1337691.patch # Flex compatibility issues -Patch22: 0012-Remove-yylineno.patch +Patch12: 0012-Remove-yylineno.patch +# GCC-10 incompatibilities +Patch13: 0013-GCC-10-fixes.patch BuildRequires: gcc-c++ @@ -60,11 +62,7 @@ BuildRequires: autoconf automake libtool BuildRequires: openmotif-devel BuildRequires: pkgconfig %else -%if 0%{?fedora} >= 23 BuildRequires: motif-devel -%else -BuildRequires: lesstif-devel -%endif %endif Requires: xorg-x11-fonts-misc # RHBZ 442379 @@ -121,18 +119,20 @@ Documentation and tutorials for the Alliance VLSI CAD Sytem. %prep %setup -qn %{name} %patch00 -p2 + +%patch01 -p2 +%patch02 -p2 +%patch03 -p2 +%patch04 -p2 +%patch05 -p2 +%patch06 -p2 +%patch07 -p2 +%patch08 -p2 +%patch09 -p2 +%patch10 -p2 %patch11 -p2 %patch12 -p2 %patch13 -p2 -%patch14 -p2 -%patch15 -p2 -%patch16 -p2 -%patch17 -p2 -%patch18 -p2 -%patch19 -p2 -%patch20 -p2 -%patch21 -p2 -%patch22 -p2 pushd src > /dev/null @@ -304,6 +304,11 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Sat Feb 22 2020 Ralf Corsépius - 5.1.1-18.20160506gitd8c05cd +- Drop lesstif. +- Spec file cleanup. +- Add 0013-GCC-10-fixes.patch (F32FTBFS, RHBZ#1799147). + * Tue Jan 28 2020 Fedora Release Engineering - 5.1.1-17.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild From f9a8398ec087c883c776e0e13e5109ce43fd99c6 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Mon, 27 Jul 2020 11:56:22 +0000 Subject: [PATCH 64/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index b7f18b0..b145e1a 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 18.%{snapdate}git%{shortcommit}%{?dist} +Release: 19.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -304,6 +304,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Mon Jul 27 2020 Fedora Release Engineering - 5.1.1-19.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + * Sat Feb 22 2020 Ralf Corsépius - 5.1.1-18.20160506gitd8c05cd - Drop lesstif. - Spec file cleanup. From f3cba3483e3807b9e42a0003a5eae54c6334939d Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 27 Jul 2020 15:46:05 -0600 Subject: [PATCH 65/85] Force C++14 as the code is not ready for C++17 --- alliance.spec | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index b145e1a..34134c3 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 19.%{snapdate}git%{shortcommit}%{?dist} +Release: 20.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -190,6 +190,7 @@ find documentation/tutorials/ \ popd > /dev/null %build +export CXXFLAGS="-std=c++14 $RPM_OPT_FLAGS" pushd src > /dev/null %configure --enable-alc-shared \ --disable-static \ @@ -304,6 +305,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Mon Jul 27 2020 Jeff Law - 5.1.1-20.20160506gitd8c05cd +- Force C++14 as the code is not ready for C++17 + * Mon Jul 27 2020 Fedora Release Engineering - 5.1.1-19.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild From 94811ee7066b03e212fa056f5d9836ad238653d7 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 31 Jul 2020 23:54:58 +0000 Subject: [PATCH 66/85] - Second attempt - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 34134c3..555e570 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 20.%{snapdate}git%{shortcommit}%{?dist} +Release: 21.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -305,6 +305,10 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Fri Jul 31 2020 Fedora Release Engineering - 5.1.1-21.20160506gitd8c05cd +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + * Mon Jul 27 2020 Jeff Law - 5.1.1-20.20160506gitd8c05cd - Force C++14 as the code is not ready for C++17 From f2007edb4de2390feaf315795a591ada181e3127 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Wed, 30 Sep 2020 17:26:50 -0400 Subject: [PATCH 67/85] Remove unused BuildRequires: libXp-devel --- alliance.spec | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/alliance.spec b/alliance.spec index 555e570..3aee1a1 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 21.%{snapdate}git%{shortcommit}%{?dist} +Release: 22.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -44,7 +44,6 @@ BuildRequires: byacc BuildRequires: desktop-file-utils BuildRequires: flex BuildRequires: libstdc++-devel -BuildRequires: libXp-devel BuildRequires: libXpm-devel BuildRequires: libXt-devel BuildRequires: m4 @@ -305,6 +304,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Sep 30 2020 Adam Jackson - 5.1.1-22.20160506gitd8c05cd +- Remove unused BuildRequires: libXp-devel + * Fri Jul 31 2020 Fedora Release Engineering - 5.1.1-21.20160506gitd8c05cd - Second attempt - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild From 5d260e11e82f290fc20fcdef38005e8a3a2a3d84 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Wed, 16 Dec 2020 23:23:49 +0000 Subject: [PATCH 68/85] Add BuildRequires: make https://fedoraproject.org/wiki/Changes/Remove_make_from_BuildRoot --- alliance.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/alliance.spec b/alliance.spec index 3aee1a1..9d7265b 100644 --- a/alliance.spec +++ b/alliance.spec @@ -111,6 +111,7 @@ Summary: Alliance VLSI CAD System - Documentations BuildArch: noarch Requires: gnuplot BuildRequires: tetex-latex +BuildRequires: make %description doc Documentation and tutorials for the Alliance VLSI CAD Sytem. From 248d295263afeb93bd97a657be82e4aadd643c53 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Mon, 25 Jan 2021 23:59:35 +0000 Subject: [PATCH 69/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 9d7265b..dfb0684 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 22.%{snapdate}git%{shortcommit}%{?dist} +Release: 23.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -305,6 +305,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Mon Jan 25 2021 Fedora Release Engineering - 5.1.1-23.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + * Wed Sep 30 2020 Adam Jackson - 5.1.1-22.20160506gitd8c05cd - Remove unused BuildRequires: libXp-devel From 02d147cfcea8d3a25dffaa09b4e67df2312996d3 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 21 Jul 2021 12:31:46 +0000 Subject: [PATCH 70/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild Signed-off-by: Fedora Release Engineering From 2a0c7773f1385537f861a2e287a5688a6d5479e1 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 21 Jul 2021 17:27:09 +0000 Subject: [PATCH 71/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index dfb0684..28fb944 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 23.%{snapdate}git%{shortcommit}%{?dist} +Release: 24.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -305,6 +305,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Jul 21 2021 Fedora Release Engineering - 5.1.1-24.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + * Mon Jan 25 2021 Fedora Release Engineering - 5.1.1-23.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild From 3c5a162d1b53dd33541b3f208ea1bf367289ad63 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 19 Jan 2022 21:08:07 +0000 Subject: [PATCH 72/85] - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 28fb944..4cd070c 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 24.%{snapdate}git%{shortcommit}%{?dist} +Release: 25.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -305,6 +305,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Jan 19 2022 Fedora Release Engineering - 5.1.1-25.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + * Wed Jul 21 2021 Fedora Release Engineering - 5.1.1-24.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild From eb1f08acab49612aa3b92a011fda57962980bcc7 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 20 Jul 2022 20:39:44 +0000 Subject: [PATCH 73/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 4cd070c..ee41139 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 25.%{snapdate}git%{shortcommit}%{?dist} +Release: 26.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPLv2 URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -305,6 +305,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Jul 20 2022 Fedora Release Engineering - 5.1.1-26.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + * Wed Jan 19 2022 Fedora Release Engineering - 5.1.1-25.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild From 598d14032d7ec9ba2e09f8ced5af58047991f7bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20Cors=C3=A9pius?= Date: Mon, 5 Dec 2022 17:08:49 +0100 Subject: [PATCH 74/85] Convert license to SPDX. --- alliance.spec | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/alliance.spec b/alliance.spec index ee41139..e7d1ad5 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,9 +4,9 @@ Name: alliance Version: 5.1.1 -Release: 26.%{snapdate}git%{shortcommit}%{?dist} +Release: 27.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System -License: GPLv2 +License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ Source: http://www-asim.lip6.fr/pub/alliance/distribution/latest/alliance-%{version}.tar.bz2 Source1: alliance.fedora @@ -111,7 +111,7 @@ Summary: Alliance VLSI CAD System - Documentations BuildArch: noarch Requires: gnuplot BuildRequires: tetex-latex -BuildRequires: make +BuildRequires: make %description doc Documentation and tutorials for the Alliance VLSI CAD Sytem. @@ -305,6 +305,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Mon Dec 05 2022 Ralf Corsépius - 5.1.1-27.20160506gitd8c05cd +- Convert license to SPDX. + * Wed Jul 20 2022 Fedora Release Engineering - 5.1.1-26.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild From feac4a6ea18e18da8e844b5b0d1b4f47f49ba6df Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 18 Jan 2023 21:36:26 +0000 Subject: [PATCH 75/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index e7d1ad5..f0d4a9b 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 27.%{snapdate}git%{shortcommit}%{?dist} +Release: 28.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -305,6 +305,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Jan 18 2023 Fedora Release Engineering - 5.1.1-28.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + * Mon Dec 05 2022 Ralf Corsépius - 5.1.1-27.20160506gitd8c05cd - Convert license to SPDX. From 2738aa1df0b54bbf81386241c9be5fd7cf063097 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Sat, 15 Apr 2023 21:43:39 +0200 Subject: [PATCH 76/85] Build in C89 mode (#2187002) Related to: --- alliance.spec | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index f0d4a9b..076b7b5 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 28.%{snapdate}git%{shortcommit}%{?dist} +Release: 29.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -190,6 +190,9 @@ find documentation/tutorials/ \ popd > /dev/null %build +# The C parts use implicit ints, implicit function declarations, +# and old-style function declarations heavily. +export CFLAGS="%build_cflags -std=gnu89" export CXXFLAGS="-std=c++14 $RPM_OPT_FLAGS" pushd src > /dev/null %configure --enable-alc-shared \ @@ -305,6 +308,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Sat Apr 15 2023 Florian Weimer - 5.1.1-29.20160506gitd8c05cd +- Build in C89 mode (#2187002) + * Wed Jan 18 2023 Fedora Release Engineering - 5.1.1-28.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild From ecfa8c57ea73c607097a2425ab46fe7541aec980 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 19 Jul 2023 13:08:22 +0000 Subject: [PATCH 77/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 076b7b5..4e3e29b 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 29.%{snapdate}git%{shortcommit}%{?dist} +Release: 30.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -308,6 +308,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Jul 19 2023 Fedora Release Engineering - 5.1.1-30.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + * Sat Apr 15 2023 Florian Weimer - 5.1.1-29.20160506gitd8c05cd - Build in C89 mode (#2187002) From a0ed8353c433b869c95ad73aa3ab745c5ce6381c Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Wed, 16 Aug 2023 13:27:57 +0200 Subject: [PATCH 78/85] Set build_type_safety_c to 0 (#2187002) --- alliance.spec | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 4e3e29b..4449d8b 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 30.%{snapdate}git%{shortcommit}%{?dist} +Release: 31.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -192,6 +192,7 @@ popd > /dev/null %build # The C parts use implicit ints, implicit function declarations, # and old-style function declarations heavily. +%global build_type_safety_c 0 export CFLAGS="%build_cflags -std=gnu89" export CXXFLAGS="-std=c++14 $RPM_OPT_FLAGS" pushd src > /dev/null @@ -308,6 +309,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Aug 16 2023 Florian Weimer - 5.1.1-31.20160506gitd8c05cd +- Set build_type_safety_c to 0 (#2187002) + * Wed Jul 19 2023 Fedora Release Engineering - 5.1.1-30.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild From 6543e438618199885a1eb1cf476731b24b3119d0 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 19 Jan 2024 12:43:13 +0000 Subject: [PATCH 79/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 4449d8b..d2aa434 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 31.%{snapdate}git%{shortcommit}%{?dist} +Release: 32.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -309,6 +309,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Fri Jan 19 2024 Fedora Release Engineering - 5.1.1-32.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Wed Aug 16 2023 Florian Weimer - 5.1.1-31.20160506gitd8c05cd - Set build_type_safety_c to 0 (#2187002) From b96e104d201e11b198a0406924e527738b31f436 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Mon, 22 Jan 2024 22:55:00 +0000 Subject: [PATCH 80/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index d2aa434..3e5336d 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 32.%{snapdate}git%{shortcommit}%{?dist} +Release: 33.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -309,6 +309,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Mon Jan 22 2024 Fedora Release Engineering - 5.1.1-33.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Fri Jan 19 2024 Fedora Release Engineering - 5.1.1-32.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From 1af86afdc729752466579587c34a4a5669892ec2 Mon Sep 17 00:00:00 2001 From: Software Management Team Date: Thu, 30 May 2024 12:46:46 +0200 Subject: [PATCH 81/85] Eliminate use of obsolete %patchN syntax (#2283636) --- alliance.spec | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/alliance.spec b/alliance.spec index 3e5336d..22feedc 100644 --- a/alliance.spec +++ b/alliance.spec @@ -118,21 +118,21 @@ Documentation and tutorials for the Alliance VLSI CAD Sytem. %prep %setup -qn %{name} -%patch00 -p2 +%patch -P00 -p2 -%patch01 -p2 -%patch02 -p2 -%patch03 -p2 -%patch04 -p2 -%patch05 -p2 -%patch06 -p2 -%patch07 -p2 -%patch08 -p2 -%patch09 -p2 -%patch10 -p2 -%patch11 -p2 -%patch12 -p2 -%patch13 -p2 +%patch -P01 -p2 +%patch -P02 -p2 +%patch -P03 -p2 +%patch -P04 -p2 +%patch -P05 -p2 +%patch -P06 -p2 +%patch -P07 -p2 +%patch -P08 -p2 +%patch -P09 -p2 +%patch -P10 -p2 +%patch -P11 -p2 +%patch -P12 -p2 +%patch -P13 -p2 pushd src > /dev/null From 34e7b61681b212ba0418b25cf6c7f331d15dc714 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 17 Jul 2024 16:51:30 +0000 Subject: [PATCH 82/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 22feedc..c712db2 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 33.%{snapdate}git%{shortcommit}%{?dist} +Release: 34.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -309,6 +309,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Jul 17 2024 Fedora Release Engineering - 5.1.1-34.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + * Mon Jan 22 2024 Fedora Release Engineering - 5.1.1-33.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From c965877a9d740c0105bd08fb8f6ff847e4c92763 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Thu, 16 Jan 2025 10:52:48 +0000 Subject: [PATCH 83/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index c712db2..d6084b8 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 34.%{snapdate}git%{shortcommit}%{?dist} +Release: 35.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -309,6 +309,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Thu Jan 16 2025 Fedora Release Engineering - 5.1.1-35.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + * Wed Jul 17 2024 Fedora Release Engineering - 5.1.1-34.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild From cd257fc1bb30f1b50609aaa759b07153b0ccadf1 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 23 Jul 2025 16:54:18 +0000 Subject: [PATCH 84/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index d6084b8..2db2fd1 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 35.%{snapdate}git%{shortcommit}%{?dist} +Release: 36.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -309,6 +309,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Wed Jul 23 2025 Fedora Release Engineering - 5.1.1-36.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + * Thu Jan 16 2025 Fedora Release Engineering - 5.1.1-35.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild From afbdc7395fc47190d2bffc2c645d7277ba19f4ab Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 16 Jan 2026 03:35:50 +0000 Subject: [PATCH 85/85] Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild --- alliance.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/alliance.spec b/alliance.spec index 2db2fd1..ad65a1a 100644 --- a/alliance.spec +++ b/alliance.spec @@ -4,7 +4,7 @@ Name: alliance Version: 5.1.1 -Release: 36.%{snapdate}git%{shortcommit}%{?dist} +Release: 37.%{snapdate}git%{shortcommit}%{?dist} Summary: VLSI EDA System License: GPL-2.0-only URL: https://soc-extras.lip6.fr/en/alliance-abstract-en/ @@ -309,6 +309,9 @@ source %{_sysconfdir}/profile.d/alc_env.sh %changelog +* Fri Jan 16 2026 Fedora Release Engineering - 5.1.1-37.20160506gitd8c05cd +- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild + * Wed Jul 23 2025 Fedora Release Engineering - 5.1.1-36.20160506gitd8c05cd - Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild